From 594e10d4ef513ce301a6a26bf114b3d311f58dc2 Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Fri, 13 Feb 2026 16:10:04 +0100 Subject: [PATCH 001/334] [chore] improve API specification for meetings - triggered by removing API spec validation warning --- .../examples/meeting_simple_response.yml | 44 ++++++++++++ ...nse.yml => membership_simple_response.yml} | 0 ...=> membership_update_additional_roles.yml} | 0 .../components/schemas/meeting_model.yml | 68 +++++++++---------- docs/api/apiv3/openapi-spec.yml | 6 +- docs/api/apiv3/paths/meeting.yml | 49 +++---------- docs/api/apiv3/paths/membership.yml | 6 +- docs/api/apiv3/paths/membership_form.yml | 2 +- docs/api/apiv3/paths/memberships.yml | 2 +- 9 files changed, 93 insertions(+), 84 deletions(-) create mode 100644 docs/api/apiv3/components/examples/meeting_simple_response.yml rename docs/api/apiv3/components/examples/{membership-simple-response.yml => membership_simple_response.yml} (100%) rename docs/api/apiv3/components/examples/{membership-update-additional-roles.yml => membership_update_additional_roles.yml} (100%) diff --git a/docs/api/apiv3/components/examples/meeting_simple_response.yml b/docs/api/apiv3/components/examples/meeting_simple_response.yml new file mode 100644 index 00000000000..6fc3db4cdbc --- /dev/null +++ b/docs/api/apiv3/components/examples/meeting_simple_response.yml @@ -0,0 +1,44 @@ +description: |- + A simple meeting response. +value: + _type: "Meeting" + id: 1 + title: "Meeting No 42" + location: "Death Star - Level 1337 L13/42" + lockVersion: 13 + startTime: "2026-02-16T10:00:00.000Z" + endTime: "2026-02-16T11:00:00.000Z" + duration: 1.0 + createdAt: "2026-02-13T14:47:12.315Z" + updatedAt: "2026-02-13T14:47:12.315Z" + _links: + attachments: + href: "/api/v3/meetings/1/attachments" + addAttachment: + href: "/api/v3/meetings/1/attachments" + method: "post" + self: + href: "/api/v3/meetings/1" + title: "Meeting No 42" + author: + href: "/api/v3/users/4" + title: "Darth Vader" + project: + href: "/api/v3/projects/10" + title: "Death Star" + _embedded: + attachments: + _type: Collection + total: 2 + count: 2 + _embedded: AttachmentCollection resource shortened for brevity + author: + _type: User + name: Darth Vader + id: 4 + _abbreviated: Principal resource shortened for brevity + project: + _type: Project + name: Death Star + id: 10 + _abbreviated: Project resource shortened for brevity diff --git a/docs/api/apiv3/components/examples/membership-simple-response.yml b/docs/api/apiv3/components/examples/membership_simple_response.yml similarity index 100% rename from docs/api/apiv3/components/examples/membership-simple-response.yml rename to docs/api/apiv3/components/examples/membership_simple_response.yml diff --git a/docs/api/apiv3/components/examples/membership-update-additional-roles.yml b/docs/api/apiv3/components/examples/membership_update_additional_roles.yml similarity index 100% rename from docs/api/apiv3/components/examples/membership-update-additional-roles.yml rename to docs/api/apiv3/components/examples/membership_update_additional_roles.yml diff --git a/docs/api/apiv3/components/schemas/meeting_model.yml b/docs/api/apiv3/components/schemas/meeting_model.yml index a35a8bb67b5..8a1aa99318f 100644 --- a/docs/api/apiv3/components/schemas/meeting_model.yml +++ b/docs/api/apiv3/components/schemas/meeting_model.yml @@ -1,17 +1,45 @@ -# Schema: Meeting_PageModel +# Schema: MeetingModel --- type: object required: - title properties: + _type: + type: string + enum: + - Meeting id: type: integer description: Identifier of this meeting - readOnly: true - exclusiveMinimum: 0 + minimum: 1 title: type: string description: The meeting's title + location: + type: string + description: The meeting's location + lockVersion: + type: integer + description: The version of the item as used for optimistic locking + startTime: + type: string + format: date-time + description: The start time of the meeting + endTime: + type: string + format: date-time + description: The end time of the meeting + duration: + type: number + description: The duration of the meeting in hours. The difference between `startTime` and `endTime` + createdAt: + type: string + format: date-time + description: Timestamp of the creation datetime of the meeting + updatedAt: + type: string + format: date-time + description: Timestamp of the last modification datetime of the meeting _links: type: object properties: @@ -22,7 +50,6 @@ properties: This meeting **Resource**: Meeting - readOnly: true author: allOf: - "$ref": "./link.yml" @@ -30,7 +57,6 @@ properties: The user having created the meeting **Resource**: User - readOnly: true project: allOf: - "$ref": "./link.yml" @@ -54,35 +80,3 @@ properties: # Conditions **Permission**: edit meeting - readOnly: true -example: - _type: Meeting - id: 72 - lockVersion: 5 - title: A meeting - startTime: '2014-05-21T08:00:00.000Z' - endTime: '2014-05-21T10:00:00.000Z' - duration: 120 - createdAt: '2014-05-21T08:51:20.396Z' - updatedAt: '2014-05-21T09:14:02.776Z' - _embedded: - project: - _type: Project... - id: 12 - author: - _type: User... - id: 2 - _links: - addAttachment: - href: "/api/v3/meetings/72/attachments" - method: post - attachments: - href: "/api/v3/meetings/72/attachments" - project: - href: "/api/v3/projects/12" - title: some project - author: - href: "/api/v3/users/2" - title: Peggie Feeney - self: - href: "/api/v3/meetings/72" diff --git a/docs/api/apiv3/openapi-spec.yml b/docs/api/apiv3/openapi-spec.yml index 77cf963c0b2..0a3da00159b 100644 --- a/docs/api/apiv3/openapi-spec.yml +++ b/docs/api/apiv3/openapi-spec.yml @@ -569,6 +569,8 @@ components: $ref: "./components/examples/hierarchy_item_collection_response.yml" HierarchyItemResponse: $ref: "./components/examples/hierarchy_item_response.yml" + MeetingSimpleResponse: + $ref: "./components/examples/meeting_simple_response.yml" MembershipCreateRequestCustomMessage: $ref: "./components/examples/membership-create-request-custom-message.yml" MembershipCreateRequestGlobalRole: @@ -582,9 +584,9 @@ components: MembershipSimpleCollectionResponse: $ref: "./components/examples/membership-simple-collection-response.yml" MembershipSimpleResponse: - $ref: "./components/examples/membership-simple-response.yml" + $ref: "./components/examples/membership_simple_response.yml" MembershipUpdateAdditionalRoles: - $ref: "./components/examples/membership-update-additional-roles.yml" + $ref: "./components/examples/membership_update_additional_roles.yml" MentionedNotification: $ref: "./components/examples/mentioned_notification.yml" NotificationCollection: diff --git a/docs/api/apiv3/paths/meeting.yml b/docs/api/apiv3/paths/meeting.yml index fc052659abc..e0ec3ef46f9 100644 --- a/docs/api/apiv3/paths/meeting.yml +++ b/docs/api/apiv3/paths/meeting.yml @@ -1,9 +1,14 @@ # /api/v3/meetings/{id} --- get: + summary: Get a meeting + operationId: get_meeting + tags: + - Meetings + description: Retrieve an individual meeting as identified by the id parameter parameters: - description: Meeting identifier - example: '1' + example: 1 in: path name: id required: true @@ -11,44 +16,14 @@ get: type: integer responses: '200': + description: OK content: application/hal+json: examples: response: - value: - _embedded: - project: - _type: Project... - id: 12 - author: - _type: User... - id: 2 - _links: - addAttachment: - href: "/api/v3/meetings/72/attachments" - method: post - attachments: - href: "/api/v3/meetings/72/attachments" - project: - href: "/api/v3/projects/12" - title: some project - author: - href: "/api/v3/users/2" - title: Peggie Feeney - self: - href: "/api/v3/meetings/72" - _type: Meeting - id: 72 - lockVersion: 5 - title: A meeting - startTime: '2014-05-21T08:00:00.000Z' - duration: 120 - createdAt: '2014-05-21T08:51:20.396Z' - updatedAt: '2014-05-21T09:14:02.776Z' + $ref: "../components/examples/meeting_simple_response.yml" schema: - "$ref": "../components/schemas/meeting_model.yml" - description: OK - headers: { } + $ref: "../components/schemas/meeting_model.yml" '404': content: application/hal+json: @@ -64,9 +39,3 @@ get: Returned if the meeting does not exist or the client does not have sufficient permissions to see it. **Required permission:** view meetings in the page's project - headers: { } - tags: - - Meetings - description: Retrieve an individual meeting as identified by the id parameter - operationId: View_Meeting - summary: View Meeting Page diff --git a/docs/api/apiv3/paths/membership.yml b/docs/api/apiv3/paths/membership.yml index eff60e35dd0..ffc8c2a9dc1 100644 --- a/docs/api/apiv3/paths/membership.yml +++ b/docs/api/apiv3/paths/membership.yml @@ -75,7 +75,7 @@ get: $ref: '../components/schemas/membership_read_model.yml' examples: 'simple membership': - $ref: '../components/examples/membership-simple-response.yml' + $ref: '../components/examples/membership_simple_response.yml' '404': content: application/hal+json: @@ -121,7 +121,7 @@ patch: $ref: '../components/schemas/membership_write_model.yml' examples: 'add roles': - $ref: '../components/examples/membership-update-additional-roles.yml' + $ref: '../components/examples/membership_update_additional_roles.yml' responses: '200': description: OK @@ -131,7 +131,7 @@ patch: $ref: '../components/schemas/membership_read_model.yml' examples: 'simple membership': - $ref: '../components/examples/membership-simple-response.yml' + $ref: '../components/examples/membership_simple_response.yml' '400': $ref: '../components/responses/invalid_request_body.yml' '403': diff --git a/docs/api/apiv3/paths/membership_form.yml b/docs/api/apiv3/paths/membership_form.yml index eb9914e3652..0e242091969 100644 --- a/docs/api/apiv3/paths/membership_form.yml +++ b/docs/api/apiv3/paths/membership_form.yml @@ -35,7 +35,7 @@ post: $ref: '../components/schemas/membership_read_model.yml' examples: 'simple membership': - $ref: '../components/examples/membership-simple-response.yml' + $ref: '../components/examples/membership_simple_response.yml' '400': $ref: '../components/responses/invalid_request_body.yml' '403': diff --git a/docs/api/apiv3/paths/memberships.yml b/docs/api/apiv3/paths/memberships.yml index 4fa8a207c20..e1aa67e29d2 100644 --- a/docs/api/apiv3/paths/memberships.yml +++ b/docs/api/apiv3/paths/memberships.yml @@ -124,7 +124,7 @@ post: $ref: '../components/schemas/membership_read_model.yml' examples: 'simple membership': - $ref: '../components/examples/membership-simple-response.yml' + $ref: '../components/examples/membership_simple_response.yml' '400': $ref: '../components/responses/invalid_request_body.yml' '403': From 1ac5e14827fba81cbb3d2adacfa48c84bc03f6bc Mon Sep 17 00:00:00 2001 From: ulferts Date: Sat, 14 Feb 2026 00:37:29 +0100 Subject: [PATCH 002/334] bump carrierwave to 2.2.6 --- Gemfile | 2 +- Gemfile.lock | 29 ++++++--- config/initializers/carrierwave.rb | 6 ++ .../patches/carrierwave_fog_file.rb | 44 ------------- .../patches/carrierwave_sanitized_file.rb | 61 ------------------- nix/gemset.nix | 14 ++--- .../carrierwave_sanitized_file_spec.rb | 59 ------------------ spec/support/shared/with_direct_uploads.rb | 21 ++++--- 8 files changed, 47 insertions(+), 189 deletions(-) delete mode 100644 lib/open_project/patches/carrierwave_fog_file.rb delete mode 100644 lib/open_project/patches/carrierwave_sanitized_file.rb delete mode 100644 spec/lib/open_project/patches/carrierwave_sanitized_file_spec.rb diff --git a/Gemfile b/Gemfile index 14aec14508e..d01e2b83b57 100644 --- a/Gemfile +++ b/Gemfile @@ -194,7 +194,7 @@ gem "rack-timeout", "~> 0.7.0", require: "rack/timeout/base" gem "nokogiri", "~> 1.19.0" -gem "carrierwave", "~> 1.3.4" +gem "carrierwave", "~> 2.2.6" gem "carrierwave_direct", "~> 2.1.0" gem "fog-aws" diff --git a/Gemfile.lock b/Gemfile.lock index 54235568b40..5acdbbddc5c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -408,11 +408,14 @@ GEM capybara-screenshot (1.0.26) capybara (>= 1.0, < 4) launchy - carrierwave (1.3.4) - activemodel (>= 4.0.0) - activesupport (>= 4.0.0) - mime-types (>= 1.16) - ssrf_filter (~> 1.0, < 1.1.0) + carrierwave (2.2.6) + activemodel (>= 5.0.0) + activesupport (>= 5.0.0) + addressable (~> 2.6) + image_processing (~> 1.1) + marcel (~> 1.0.0) + mini_mime (>= 0.1.3) + ssrf_filter (~> 1.0) carrierwave_direct (2.1.0) carrierwave (>= 1.0.0) fog-aws @@ -719,6 +722,9 @@ GEM ostruct ice_cube (0.17.0) ice_nine (0.11.2) + image_processing (1.14.0) + mini_magick (>= 4.9.5, < 6) + ruby-vips (>= 2.0.17, < 3) inline_svg (1.10.0) activesupport (>= 3.0) nokogiri (>= 1.6) @@ -803,7 +809,7 @@ GEM net-imap net-pop net-smtp - marcel (1.1.0) + marcel (1.0.4) markly (0.15.2) matrix (0.4.3) mcp (0.4.0) @@ -1366,6 +1372,9 @@ GEM ruby-saml (1.18.1) nokogiri (>= 1.13.10) rexml + ruby-vips (2.3.0) + ffi (~> 1.12) + logger ruby2_keywords (0.0.5) rubytree (2.2.0) json (~> 2.0, > 2.9) @@ -1570,7 +1579,7 @@ DEPENDENCIES capybara (~> 3.40.0) capybara-screenshot (~> 1.0.17) capybara_accessible_selectors! - carrierwave (~> 1.3.4) + carrierwave (~> 2.2.6) carrierwave_direct (~> 2.1.0) climate_control closure_tree (~> 9.5.0) @@ -1824,7 +1833,7 @@ CHECKSUMS capybara (3.40.0) sha256=42dba720578ea1ca65fd7a41d163dd368502c191804558f6e0f71b391054aeef capybara-screenshot (1.0.26) sha256=816b9370a07752097c82a05f568aaf5d3b7f45c3db5d3aab2014071e1b3c0c77 capybara_accessible_selectors (0.15.0) - carrierwave (1.3.4) sha256=81772dabd1830edbd7f4526d2ae2c79f974f1d48900c3f03f7ecb7c657463a21 + carrierwave (2.2.6) sha256=cd9b6108fc7544e97e7fbcc561bd319a09f23c96816fdd0df8f2f45ffdc0dac3 carrierwave_direct (2.1.0) sha256=b0d5c19c1d17a05940e488cff644a3b2946422d6d494b2174b48f6a90c5dddbf cbor (0.5.10.1) sha256=79cdf79f18dcd9ee97e0b849c6d573e5a2e3ddc1954d180f384d6ed2612b6df0 cgi (0.5.1) sha256=e93fcafc69b8a934fe1e6146121fa35430efa8b4a4047c4893764067036f18e9 @@ -1955,6 +1964,7 @@ CHECKSUMS icalendar (2.12.1) sha256=ecff56c550aed551f29ad1faad0da54bf62362dfaf22a428bd7ad782938fe764 ice_cube (0.17.0) sha256=32deb45dda4b4acc53505c2f581f6d32b5afc04d29b9004769944a0df5a5fcbe ice_nine (0.11.2) sha256=5d506a7d2723d5592dc121b9928e4931742730131f22a1a37649df1c1e2e63db + image_processing (1.14.0) sha256=754cc169c9c262980889bec6bfd325ed1dafad34f85242b5a07b60af004742fb inline_svg (1.10.0) sha256=5b652934236fd9f8adc61f3fd6e208b7ca3282698b19f28659971da84bf9a10f interception (0.5) sha256=a53818d636752a8df90d8c1bb2f7b6e13a7b828543cb02b50fbde98b849d7907 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc @@ -1982,7 +1992,7 @@ CHECKSUMS loofah (2.25.0) sha256=df5ed7ac3bac6a4ec802df3877ee5cc86d027299f8952e6243b3dac446b060e6 lookbook (2.3.14) sha256=c11a693bde9915b553c4463440ad5e750829f90bff08abdb6b8610373864cd7c mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941 - marcel (1.1.0) sha256=fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee + marcel (1.0.4) sha256=0d5649feb64b8f19f3d3468b96c680bae9746335d02194270287868a661516a4 markly (0.15.2) sha256=65dae965d4dd4ecd997fba43b93acc0fe7dadfec6f07a748640c7a9299a8551e matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b mcp (0.4.0) sha256=4d1dd2b99fbd81a5fdc808d258c38a4f57dd69751ee1e5f62b3ab40e31625a36 @@ -2216,6 +2226,7 @@ CHECKSUMS ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby-rc4 (0.1.5) sha256=00cc40a39d20b53f5459e7ea006a92cf584e9bc275e2a6f7aa1515510e896c03 ruby-saml (1.18.1) sha256=1b0e7a44aef150b4197955f5e015d593672e242cfdc5d06aa7554ec2350b9107 + ruby-vips (2.3.0) sha256=e685ec02c13969912debbd98019e50492e12989282da5f37d05f5471442f5374 ruby2_keywords (0.0.5) sha256=ffd13740c573b7301cf7a2e61fc857b2a8e3d3aff32545d6f8300d8bae10e3ef rubytree (2.2.0) sha256=e312dc1ed814153583b57d9662e6caac1fd60830886a571b48bb06daef906eb6 rubyzip (2.4.1) sha256=8577c88edc1fde8935eb91064c5cb1aef9ad5494b940cf19c775ee833e075615 diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index 78862f69417..e6e4b85f366 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -56,6 +56,12 @@ module CarrierWave end end +# CW 2.0 changed the default cache_storage from :file to nil. +# Restore :file to keep Attachment.clean_cached_files! working. +CarrierWave.configure do |config| + config.cache_storage = :file +end + unless OpenProject::Configuration.fog_credentials.empty? CarrierWave::Configuration.configure_fog! end diff --git a/lib/open_project/patches/carrierwave_fog_file.rb b/lib/open_project/patches/carrierwave_fog_file.rb deleted file mode 100644 index c1aca617364..00000000000 --- a/lib/open_project/patches/carrierwave_fog_file.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -require "carrierwave/storage/fog" - -## -# Code copied straight from the CarrierWave source. -# All we did is add `options[:expire_at]`. -# -# @todo Upgrade to CarrierWave 2.0.2 to make this patch obsolete. - -module OpenProject::Patches::FogFile - extend ActiveSupport::Concern - - included do - def authenticated_url(options = {}) # rubocop:disable Metrics/AbcSize - if ["AWS", "Google", "Rackspace", "OpenStack"].include?(@uploader.fog_credentials[:provider]) - # avoid a get by using local references - local_directory = connection.directories.new(key: @uploader.fog_directory) - local_file = local_directory.files.new(key: path) - expire_at = options[:expire_at] || (::Fog::Time.now + @uploader.fog_authenticated_url_expiration) - case @uploader.fog_credentials[:provider] - when "AWS", "Google" - # Older versions of fog-google do not support options as a parameter - if url_options_supported?(local_file) - local_file.url(expire_at, options) - else - warn "Options hash not supported in #{local_file.class}. You may need to upgrade your Fog provider." - local_file.url(expire_at) - end - when "Rackspace" - connection.get_object_https_url(@uploader.fog_directory, path, expire_at, options) - when "OpenStack" - connection.get_object_https_url(@uploader.fog_directory, path, expire_at) - else - local_file.url(expire_at) - end - end - end - end -end - -OpenProject::Patches.patch_gem_version "carrierwave", "1.3.4" do - CarrierWave::Storage::Fog::File.include OpenProject::Patches::FogFile -end diff --git a/lib/open_project/patches/carrierwave_sanitized_file.rb b/lib/open_project/patches/carrierwave_sanitized_file.rb deleted file mode 100644 index 33d8fa02316..00000000000 --- a/lib/open_project/patches/carrierwave_sanitized_file.rb +++ /dev/null @@ -1,61 +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 "carrierwave" - -## -# Adapt carrierwave to match fixes for CVE-2023-49090. -# https://github.com/carrierwaveuploader/carrierwave/security/advisories/GHSA-vfmv-jfc5-pjjw -module OpenProject::Patches::CarrierwaveSanitizedFile - extend ActiveSupport::Concern - - included do - def content_type - return @content_type if @content_type - - if @file.respond_to?(:content_type) and @file.content_type - Marcel::MimeType.for(declared_type: @file.content_type.to_s.chomp) - elsif path - @content_type = Attachment.content_type_for(path) - end - end - - # create the directory if it doesn't exist - # Overwritten to avoid ruby 2.7 deprecations - def mkdir!(path, directory_permissions) - options = {} - options[:mode] = directory_permissions if directory_permissions - FileUtils.mkdir_p(File.dirname(path), **options) - end - end -end - -OpenProject::Patches.patch_gem_version "carrierwave", "1.3.4" do - CarrierWave::SanitizedFile.include OpenProject::Patches::CarrierwaveSanitizedFile -end diff --git a/nix/gemset.nix b/nix/gemset.nix index db77431ee4e..9b80c3d84d8 100644 --- a/nix/gemset.nix +++ b/nix/gemset.nix @@ -527,15 +527,15 @@ version = "1.0.25"; }; carrierwave = { - dependencies = ["activemodel" "activesupport" "mime-types" "ssrf_filter"]; + dependencies = ["activemodel" "activesupport" "addressable" "image_processing" "marcel" "mini_mime" "ssrf_filter"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "055i3ybjv9n9hqaazxn3d9ibqhlwh93d4hdlwbpjjfy8qbrz6hiw"; + sha256 = "dy6364hzm3ijfzxgwdi3ny66sc24gyqj1wvsx60zj7xzmy3qsyh1"; type = "gem"; }; - version = "1.3.2"; + version = "2.2.6"; }; carrierwave_direct = { dependencies = ["carrierwave" "fog-aws"]; @@ -1695,10 +1695,10 @@ platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1vhp6lifwvqs2b0a276lj61n86c1l7d1xiswjj2w23f54gl51mpk"; + sha256 = "dhmj4zvnbs3kirgs6s2d933hsds9pim6hf88rk807l1m8km2n091"; type = "gem"; }; - version = "1.0.0"; + version = "1.0.4"; }; messagebird-rest = { groups = ["default" "opf_plugins"]; @@ -3314,10 +3314,10 @@ platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "03f49f54837e407d43ee93ec733a8a94dc1bcf8185647ac61606e63aaedaa0db"; + sha256 = "632vjyxwh673082knymg3j82ml22f2fxw5z2m31h2816q3cm6mw1"; type = "gem"; }; - version = "1.0.8"; + version = "1.3.0"; }; stackprof = { groups = ["development" "test"]; diff --git a/spec/lib/open_project/patches/carrierwave_sanitized_file_spec.rb b/spec/lib/open_project/patches/carrierwave_sanitized_file_spec.rb deleted file mode 100644 index 14e6fb5d0b7..00000000000 --- a/spec/lib/open_project/patches/carrierwave_sanitized_file_spec.rb +++ /dev/null @@ -1,59 +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" - -# Adapt the carrierwave sanitized file tests to the content type detector -RSpec.describe OpenProject::Patches::CarrierwaveSanitizedFile do - let(:file) { FileHelpers.mock_uploaded_file(name: "original-filename.txt") } - - it "uses the first one when multiple mime types are given using a semicolon" do - allow(file).to receive(:content_type).and_return("image/png; text/html") - - sanitized_file = CarrierWave::SanitizedFile.new(file) - - expect(sanitized_file.content_type).to eq("image/png") - end - - it "uses the first one when multiple mime types are given using a comma" do - allow(file).to receive(:content_type).and_return("image/png, text/html") - - sanitized_file = CarrierWave::SanitizedFile.new(file) - - expect(sanitized_file.content_type).to eq("image/png") - end - - it "drops content type parameters" do - allow(file).to receive(:content_type).and_return("text/html; charset=utf-8") - - sanitized_file = CarrierWave::SanitizedFile.new(file) - - expect(sanitized_file.content_type).to eq("text/html") - end -end diff --git a/spec/support/shared/with_direct_uploads.rb b/spec/support/shared/with_direct_uploads.rb index 302dd0b5677..144da94d473 100644 --- a/spec/support/shared/with_direct_uploads.rb +++ b/spec/support/shared/with_direct_uploads.rb @@ -172,14 +172,19 @@ RSpec.configure do |config| WithDirectUploads.new(self).before example - class FogAttachment < Attachment - # Remounting the uploader overrides the original file setter taking care of setting, - # among other things, the content type. So we have to restore that original - # method this way. - # We do this in a new, separate class, as to not interfere with any other specs. - alias_method :set_file, :file= - mount_uploader :file, FogFileUploader - alias_method :file=, :set_file + # Only define FogAttachment once. In CW 2.x, mount_uploader uses prepend, + # so re-opening the class and re-mounting would stack prepend modules and + # cause infinite recursion with the alias_method trick below. + unless defined?(FogAttachment) + class FogAttachment < Attachment + # Remounting the uploader overrides the original file setter taking care of setting, + # among other things, the content type. So we have to restore that original + # method this way. + # We do this in a new, separate class, as to not interfere with any other specs. + alias_method :set_file, :file= + mount_uploader :file, FogFileUploader + alias_method :file=, :set_file + end end end From e737e3bf65d7c7cdfcaafa51c4665d29c00b1e4b Mon Sep 17 00:00:00 2001 From: ulferts Date: Sat, 14 Feb 2026 11:07:35 +0100 Subject: [PATCH 003/334] adapt custom_style to carrierwave bump --- app/models/custom_style.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/models/custom_style.rb b/app/models/custom_style.rb index 58f4111f9fa..b135658c8e7 100644 --- a/app/models/custom_style.rb +++ b/app/models/custom_style.rb @@ -71,12 +71,10 @@ class CustomStyle < ApplicationRecord end define_method :"remove_#{name}" do - attachment = send(name) - attachment&.remove! + _mounter(name).remove! + write_uploader(name, nil) - if new_record? - send(:"#{name}=", nil) - else + unless new_record? update_columns(name => nil, updated_at: Time.zone.now) end end From 44b654cecd506e53510453cfe1c0667f5ad229a6 Mon Sep 17 00:00:00 2001 From: ulferts Date: Mon, 16 Feb 2026 17:41:44 +0100 Subject: [PATCH 004/334] simplify CustomStyle#remove_xyz implementation --- app/controllers/custom_styles_controller.rb | 4 ++-- app/models/custom_style.rb | 10 +++------- app/seeders/env_data/custom_design_seeder.rb | 2 +- spec/features/custom_styles/tabs_navigation_spec.rb | 2 +- spec/models/custom_style_spec.rb | 13 ++++++++++--- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/app/controllers/custom_styles_controller.rb b/app/controllers/custom_styles_controller.rb index e35c1880fd0..301fbca287f 100644 --- a/app/controllers/custom_styles_controller.rb +++ b/app/controllers/custom_styles_controller.rb @@ -249,7 +249,7 @@ class CustomStylesController < ApplicationController def file_download(path_method) @custom_style = CustomStyle.current - if @custom_style && @custom_style.send(path_method) + if @custom_style&.send(path_method) expires_in 1.year, public: true, must_revalidate: false send_file(@custom_style.send(path_method)) else @@ -263,7 +263,7 @@ class CustomStylesController < ApplicationController return render_404 end - @custom_style.send(remove_method) + @custom_style.send("#{remove_method}!") redirect_to custom_style_path, status: :see_other end end diff --git a/app/models/custom_style.rb b/app/models/custom_style.rb index b135658c8e7..ac23d2c8bff 100644 --- a/app/models/custom_style.rb +++ b/app/models/custom_style.rb @@ -70,13 +70,9 @@ class CustomStyle < ApplicationRecord end end - define_method :"remove_#{name}" do - _mounter(name).remove! - write_uploader(name, nil) - - unless new_record? - update_columns(name => nil, updated_at: Time.zone.now) - end + define_method :"remove_#{name}!" do + super() + save! end end end diff --git a/app/seeders/env_data/custom_design_seeder.rb b/app/seeders/env_data/custom_design_seeder.rb index 82bd3fa0720..d0d41302b6c 100644 --- a/app/seeders/env_data/custom_design_seeder.rb +++ b/app/seeders/env_data/custom_design_seeder.rb @@ -54,7 +54,7 @@ module EnvData data = Setting.seed_design[key.to_s] if data.blank? - custom_style.public_send(:"remove_#{key}") + custom_style.public_send(:"remove_#{key}!") elsif data.match?(/^https?:\/\//) seed_remote_url(custom_style, key, data) else diff --git a/spec/features/custom_styles/tabs_navigation_spec.rb b/spec/features/custom_styles/tabs_navigation_spec.rb index 2ab45898a2e..d2304dd356c 100644 --- a/spec/features/custom_styles/tabs_navigation_spec.rb +++ b/spec/features/custom_styles/tabs_navigation_spec.rb @@ -84,7 +84,7 @@ RSpec.describe "Tabs navigation and content switching on the admin/design page" expect(page).to have_current_path custom_style_path(tab: "branding") # remove the logo and redirect to the branding tab - custom_style.send :remove_logo + custom_style.send :remove_logo! expect(File.exist?(file_path)).to be false expect(page).to have_current_path custom_style_path(tab: "branding") end diff --git a/spec/models/custom_style_spec.rb b/spec/models/custom_style_spec.rb index 2101b05d698..b484d0be4f6 100644 --- a/spec/models/custom_style_spec.rb +++ b/spec/models/custom_style_spec.rb @@ -35,17 +35,24 @@ RSpec.describe CustomStyle do let!(:file_path) { custom_style.send(image).file.path } - before do - custom_style.send :"remove_#{image}" - end + subject { custom_style.send :"remove_#{image}!" } it "deletes the file" do + subject + expect(File.exist?(file_path)).to be false end it "clears the file mount column" do + subject + expect(custom_style.reload.send(image).file).to be_nil end + + it "updates the model" do + expect { subject } + .to change(custom_style, :updated_at) + end end describe "#remove_favicon" do From db22057e5c7847a226ee972b8e9dc9311cf5254b Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Tue, 17 Feb 2026 10:43:09 +0100 Subject: [PATCH 005/334] [chore] added spec for meeting collection endpoint --- .../meeting_collection_simple_response.yml | 30 +++++++++++++++++++ .../schemas/meeting_collection_model.yml | 17 +++++++++++ .../components/schemas/meeting_model.yml | 3 +- docs/api/apiv3/openapi-spec.yml | 2 ++ docs/api/apiv3/paths/meetings.yml | 19 ++++++++++++ 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 docs/api/apiv3/components/examples/meeting_collection_simple_response.yml create mode 100644 docs/api/apiv3/components/schemas/meeting_collection_model.yml create mode 100644 docs/api/apiv3/paths/meetings.yml diff --git a/docs/api/apiv3/components/examples/meeting_collection_simple_response.yml b/docs/api/apiv3/components/examples/meeting_collection_simple_response.yml new file mode 100644 index 00000000000..80ca599d18b --- /dev/null +++ b/docs/api/apiv3/components/examples/meeting_collection_simple_response.yml @@ -0,0 +1,30 @@ +description: |- + A simple response of a meeting collection. +value: + _type: "Collection" + total: 5 + count: 5 + pageSize: 20 + offset: 1 + _embedded: + elements: + - _type: "Meeting" + id: 6 + title: "Weekly" + startTime: "2026-02-17T20:54:35.523Z" + endTime: "2026-02-17T21:54:35.523Z" + _abbreviated: Meeting resources shortened for brevity + - _type: "Meeting" + id: 5 + title: "Weekly" + startTime: "2026-02-10T20:54:35.523Z" + endTime: "2026-02-10T21:54:35.523Z" + _links: + self: + href: "/api/v3/meetings?filters=%5B%5D&offset=1&pageSize=20" + jumpTo: + href: "/api/v3/meetings?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" + templated: true + changeSize: + href: "/api/v3/meetings?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" + templated: true diff --git a/docs/api/apiv3/components/schemas/meeting_collection_model.yml b/docs/api/apiv3/components/schemas/meeting_collection_model.yml new file mode 100644 index 00000000000..e5298fff3c6 --- /dev/null +++ b/docs/api/apiv3/components/schemas/meeting_collection_model.yml @@ -0,0 +1,17 @@ +# Schema: MeetingCollectionModel +--- +allOf: + - $ref: './paginated_collection_model.yml' + - type: object + required: + - _embedded + properties: + _embedded: + type: object + required: + - elements + properties: + elements: + type: array + items: + $ref: './meeting_model.yml' diff --git a/docs/api/apiv3/components/schemas/meeting_model.yml b/docs/api/apiv3/components/schemas/meeting_model.yml index feb711cdde4..f6bbcc97580 100644 --- a/docs/api/apiv3/components/schemas/meeting_model.yml +++ b/docs/api/apiv3/components/schemas/meeting_model.yml @@ -2,6 +2,7 @@ --- type: object required: + - _type - id - lockVersion - title @@ -38,7 +39,7 @@ properties: description: The scheduled meeting start time. duration: type: number - description: The meeting duration in minutes. + description: The meeting duration in hours. createdAt: type: string format: date-time diff --git a/docs/api/apiv3/openapi-spec.yml b/docs/api/apiv3/openapi-spec.yml index 0876582b1bc..b2d447b7254 100644 --- a/docs/api/apiv3/openapi-spec.yml +++ b/docs/api/apiv3/openapi-spec.yml @@ -589,6 +589,8 @@ components: $ref: "./components/examples/hierarchy_item_collection_response.yml" HierarchyItemResponse: $ref: "./components/examples/hierarchy_item_response.yml" + MeetingCollectionSimpleResponse: + $ref: "./components/examples/meeting_collection_simple_response.yml" MeetingSimpleResponse: $ref: "./components/examples/meeting_simple_response.yml" MembershipCreateRequestCustomMessage: diff --git a/docs/api/apiv3/paths/meetings.yml b/docs/api/apiv3/paths/meetings.yml new file mode 100644 index 00000000000..8550f7ebabe --- /dev/null +++ b/docs/api/apiv3/paths/meetings.yml @@ -0,0 +1,19 @@ +# /api/v3/meetings +--- +get: + summary: List all visible meetings + operationId: list_meetings + tags: + - Meetings + description: |- + Retrieve a paginated collection of meetings visible to the authenticated user. + responses: + '200': + description: OK + content: + application/hal+json: + examples: + response: + $ref: "../components/examples/meeting_collection_simple_response.yml" + schema: + $ref: "../components/schemas/meeting_collection_model.yml" From 5f851a88809e5d89e100eeb82fef68d6c1fd3628 Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Tue, 17 Feb 2026 11:04:05 +0100 Subject: [PATCH 006/334] [chore] fix some warnings related to meetings spec --- .../meeting_collection_simple_response.yml | 30 ++++++++-------- .../examples/meeting_simple_response.yml | 36 +++++++++---------- .../schemas/meeting_collection_model.yml | 13 +++++++ .../components/schemas/meeting_model.yml | 21 ++++++++--- docs/api/apiv3/openapi-spec.yml | 4 +++ docs/api/apiv3/paths/meeting_attachments.yml | 4 +-- 6 files changed, 68 insertions(+), 40 deletions(-) diff --git a/docs/api/apiv3/components/examples/meeting_collection_simple_response.yml b/docs/api/apiv3/components/examples/meeting_collection_simple_response.yml index 80ca599d18b..ff956f7e64c 100644 --- a/docs/api/apiv3/components/examples/meeting_collection_simple_response.yml +++ b/docs/api/apiv3/components/examples/meeting_collection_simple_response.yml @@ -1,30 +1,30 @@ description: |- A simple response of a meeting collection. value: - _type: "Collection" - total: 5 - count: 5 + _type: 'Collection' + total: 2 + count: 2 pageSize: 20 offset: 1 _embedded: + _abbreviated: Embedded resources shortened for brevity elements: - - _type: "Meeting" + - _type: 'Meeting' id: 6 - title: "Weekly" - startTime: "2026-02-17T20:54:35.523Z" - endTime: "2026-02-17T21:54:35.523Z" - _abbreviated: Meeting resources shortened for brevity - - _type: "Meeting" + title: 'Weekly' + startTime: '2026-02-17T20:54:35.523Z' + endTime: '2026-02-17T21:54:35.523Z' + - _type: 'Meeting' id: 5 - title: "Weekly" - startTime: "2026-02-10T20:54:35.523Z" - endTime: "2026-02-10T21:54:35.523Z" + title: 'Weekly' + startTime: '2026-02-10T20:54:35.523Z' + endTime: '2026-02-10T21:54:35.523Z' _links: self: - href: "/api/v3/meetings?filters=%5B%5D&offset=1&pageSize=20" + href: '/api/v3/meetings?filters=%5B%5D&offset=1&pageSize=20' jumpTo: - href: "/api/v3/meetings?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" + href: '/api/v3/meetings?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20' templated: true changeSize: - href: "/api/v3/meetings?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" + href: '/api/v3/meetings?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D' templated: true diff --git a/docs/api/apiv3/components/examples/meeting_simple_response.yml b/docs/api/apiv3/components/examples/meeting_simple_response.yml index 6fc3db4cdbc..337071c803e 100644 --- a/docs/api/apiv3/components/examples/meeting_simple_response.yml +++ b/docs/api/apiv3/components/examples/meeting_simple_response.yml @@ -1,44 +1,42 @@ description: |- A simple meeting response. value: - _type: "Meeting" + _type: 'Meeting' id: 1 - title: "Meeting No 42" - location: "Death Star - Level 1337 L13/42" + title: 'Meeting No 42' + location: 'Death Star - Level 1337 L13/42' lockVersion: 13 - startTime: "2026-02-16T10:00:00.000Z" - endTime: "2026-02-16T11:00:00.000Z" + startTime: '2026-02-16T10:00:00.000Z' + endTime: '2026-02-16T11:00:00.000Z' duration: 1.0 - createdAt: "2026-02-13T14:47:12.315Z" - updatedAt: "2026-02-13T14:47:12.315Z" + createdAt: '2026-02-13T14:47:12.315Z' + updatedAt: '2026-02-13T14:47:12.315Z' _links: attachments: - href: "/api/v3/meetings/1/attachments" + href: '/api/v3/meetings/1/attachments' addAttachment: - href: "/api/v3/meetings/1/attachments" - method: "post" + href: '/api/v3/meetings/1/attachments' + method: 'post' self: - href: "/api/v3/meetings/1" - title: "Meeting No 42" + href: '/api/v3/meetings/1' + title: 'Meeting No 42' author: - href: "/api/v3/users/4" - title: "Darth Vader" + href: '/api/v3/users/4' + title: 'Darth Vader' project: - href: "/api/v3/projects/10" - title: "Death Star" + href: '/api/v3/projects/10' + title: 'Death Star' _embedded: + _abbreviated: Embedded resources shortened for brevity attachments: _type: Collection total: 2 count: 2 - _embedded: AttachmentCollection resource shortened for brevity author: _type: User name: Darth Vader id: 4 - _abbreviated: Principal resource shortened for brevity project: _type: Project name: Death Star id: 10 - _abbreviated: Project resource shortened for brevity diff --git a/docs/api/apiv3/components/schemas/meeting_collection_model.yml b/docs/api/apiv3/components/schemas/meeting_collection_model.yml index e5298fff3c6..ab2ec48781a 100644 --- a/docs/api/apiv3/components/schemas/meeting_collection_model.yml +++ b/docs/api/apiv3/components/schemas/meeting_collection_model.yml @@ -5,6 +5,7 @@ allOf: - type: object required: - _embedded + - _links properties: _embedded: type: object @@ -15,3 +16,15 @@ allOf: type: array items: $ref: './meeting_model.yml' + _links: + type: object + required: + - self + properties: + self: + allOf: + - $ref: './link.yml' + - description: |- + The link to this meeting collection resource + + **Resource**: MeetingCollection diff --git a/docs/api/apiv3/components/schemas/meeting_model.yml b/docs/api/apiv3/components/schemas/meeting_model.yml index f6bbcc97580..24605a0a6e2 100644 --- a/docs/api/apiv3/components/schemas/meeting_model.yml +++ b/docs/api/apiv3/components/schemas/meeting_model.yml @@ -48,26 +48,39 @@ properties: type: string format: date-time description: Time of the most recent change to the meeting. + _embedded: + type: object + required: + - attachments + - author + - project + properties: + attachments: + $ref: './attachments_model.yml' + author: + $ref: './user_model.yml' + project: + $ref: './project_model.yml' _links: type: object properties: self: allOf: - - "$ref": "./link.yml" + - $ref: './link.yml' - description: |- This meeting **Resource**: Meeting author: allOf: - - "$ref": "./link.yml" + - $ref: './link.yml' - description: |- The user having created the meeting **Resource**: User project: allOf: - - "$ref": "./link.yml" + - $ref: './link.yml' - description: |- The project the meeting is in @@ -81,7 +94,7 @@ properties: **Resource**: AttachmentCollection addAttachment: allOf: - - "$ref": "./link.yml" + - $ref: './link.yml' - description: |- Attach a file to the meeting diff --git a/docs/api/apiv3/openapi-spec.yml b/docs/api/apiv3/openapi-spec.yml index b2d447b7254..4e2ff787bbc 100644 --- a/docs/api/apiv3/openapi-spec.yml +++ b/docs/api/apiv3/openapi-spec.yml @@ -266,6 +266,8 @@ paths: "$ref": "./paths/help_texts.yml" "/api/v3/help_texts/{id}": "$ref": "./paths/help_text.yml" + "/api/v3/meetings": + "$ref": "./paths/meetings.yml" "/api/v3/meetings/{id}": "$ref": "./paths/meeting.yml" "/api/v3/meetings/{id}/attachments": @@ -829,6 +831,8 @@ components: "$ref": "./components/schemas/list_of_news_model.yml" List_workspaces_by_versionModel: "$ref": "./components/schemas/list_workspaces_by_version_model.yml" + MeetingCollectionModel: + "$ref": "./components/schemas/meeting_collection_model.yml" MeetingModel: "$ref": "./components/schemas/meeting_model.yml" MarkdownModel: diff --git a/docs/api/apiv3/paths/meeting_attachments.yml b/docs/api/apiv3/paths/meeting_attachments.yml index 200d9f58528..cdceb3c141a 100644 --- a/docs/api/apiv3/paths/meeting_attachments.yml +++ b/docs/api/apiv3/paths/meeting_attachments.yml @@ -3,7 +3,7 @@ get: parameters: - description: ID of the meeting whose attachments will be listed - example: '1' + example: 1 in: path name: id required: true @@ -84,7 +84,7 @@ get: post: parameters: - description: ID of the meeting to receive the attachment - example: '1' + example: 1 in: path name: id required: true From c5716008b928868d1c3b5efe93ce63b369458044 Mon Sep 17 00:00:00 2001 From: Klaus Zanders Date: Fri, 12 Dec 2025 13:14:59 +0100 Subject: [PATCH 007/334] Update Bundler to v4 --- Gemfile.lock | 4 ++-- docs/development/development-environment/linux/README.md | 2 +- docs/development/development-environment/macos/README.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 54235568b40..78af4d8cb53 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2296,7 +2296,7 @@ CHECKSUMS zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b RUBY VERSION - ruby 3.4.7p58 + ruby 3.4.7p58 BUNDLED WITH - 2.7.2 + 4.0.1 diff --git a/docs/development/development-environment/linux/README.md b/docs/development/development-environment/linux/README.md index 6c222b0c829..35a950c3803 100644 --- a/docs/development/development-environment/linux/README.md +++ b/docs/development/development-environment/linux/README.md @@ -184,7 +184,7 @@ ruby --version ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +PRISM [arm64-darwin25] bundler --version -Bundler version 2.7.2 +Bundler version 4.0.1 node --version v22.21.0 diff --git a/docs/development/development-environment/macos/README.md b/docs/development/development-environment/macos/README.md index e1f2e45519c..80718b23c41 100644 --- a/docs/development/development-environment/macos/README.md +++ b/docs/development/development-environment/macos/README.md @@ -137,7 +137,7 @@ $ ruby --version ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +PRISM [arm64-darwin25]4] $ bundler --version -Bundler version 2.7.2 +Bundler version 4.0.1 node --version v22.21.0 From 4e9698f5cd3addf0df783ebaa7d98af679daad2f Mon Sep 17 00:00:00 2001 From: Klaus Zanders Date: Tue, 6 Jan 2026 10:09:59 +0100 Subject: [PATCH 008/334] Update Ruby to 4.0.0 --- .ruby-version | 2 +- Gemfile.lock | 4 ++-- docker/dev/backend/Dockerfile | 2 +- docker/prod/Dockerfile | 2 +- .../development-environment/linux/README.md | 12 ++++++------ .../development-environment/macos/README.md | 10 +++++----- .../installation/manual/README.md | 8 ++++---- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.ruby-version b/.ruby-version index 2aa51319921..fcdb2e109f6 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.4.7 +4.0.0 diff --git a/Gemfile.lock b/Gemfile.lock index 78af4d8cb53..d86a77603d3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2296,7 +2296,7 @@ CHECKSUMS zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b RUBY VERSION - ruby 3.4.7p58 + ruby 4.0.0 BUNDLED WITH - 4.0.1 + 4.0.3 diff --git a/docker/dev/backend/Dockerfile b/docker/dev/backend/Dockerfile index bc86675ea45..b1339adbbd3 100644 --- a/docker/dev/backend/Dockerfile +++ b/docker/dev/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4.7-trixie AS develop +FROM ruby:4.0.0-trixie AS develop LABEL org.opencontainers.image.authors="operations@openproject.com" ARG DEV_UID=1000 diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 34b7bf2f2d8..ca950d1b63a 100755 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -1,4 +1,4 @@ -ARG RUBY_VERSION="3.4.7" +ARG RUBY_VERSION="4.0.0" ARG DEBIAN_BASE="trixie" # Add SBOM scan context for intermediate steps ARG BUILDKIT_SBOM_SCAN_CONTEXT=true diff --git a/docs/development/development-environment/linux/README.md b/docs/development/development-environment/linux/README.md index 35a950c3803..e3e042326ba 100644 --- a/docs/development/development-environment/linux/README.md +++ b/docs/development/development-environment/linux/README.md @@ -40,10 +40,10 @@ sudo apt-get install git curl build-essential zlib1g-dev libyaml-dev libssl-dev Use [rbenv](https://github.com/rbenv/rbenv) and [ruby-build](https://github.com/rbenv/ruby-build#readme) to install Ruby. You can check available ruby versions with `rbenv install --list`. -At the time of this writing, the latest stable version is `3.4.7`, which we also require. +At the time of this writing, the latest stable version is `4.0.0`, which we also require. We suggest you install the version we require in [.ruby-version](https://github.com/opf/openproject/blob/dev/.ruby-version). -Read the first line e.g. `3.4.7` and install that version. +Read the first line e.g. `4.0.0` and install that version. #### Install rbenv and ruby-build @@ -80,18 +80,18 @@ With both installed, we can now install ruby. You can check available ruby versions with `rbenv install --list`. We suggest you install the version we require in [.ruby-version](https://github.com/opf/openproject/blob/dev/.ruby-version). -Read the first line e.g. `3.4.7` and install that version. +Read the first line e.g. `4.0.0` and install that version. ```shell # Install the required version as read from the .ruby-version file -rbenv install 3.4.7 +rbenv install 4.0.0 ``` This might take a while depending on whether ruby is built from source. After it is complete, you need to tell rbenv to globally activate this version ```shell -rbenv global 3.4.7 +rbenv global 4.0.0 rbenv rehash ``` @@ -181,7 +181,7 @@ You should now have an active ruby and node installation. Verify that it works w ```shell ruby --version -ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +PRISM [arm64-darwin25] +ruby 4.0.0 (2025-12-25 revision 553f1675f3) +PRISM [arm64-darwin25] bundler --version Bundler version 4.0.1 diff --git a/docs/development/development-environment/macos/README.md b/docs/development/development-environment/macos/README.md index 80718b23c41..5c80e57bb31 100644 --- a/docs/development/development-environment/macos/README.md +++ b/docs/development/development-environment/macos/README.md @@ -28,7 +28,7 @@ their homepage. Use [rbenv](https://github.com/rbenv/rbenv) and [ruby-build](https://github.com/rbenv/ruby-build#readme) to install Ruby. We always require the latest ruby versions, and you can check which version is required by [checking the Gemfile](https://github.com/opf/openproject/blob/dev/Gemfile#L31) for the `ruby "~> X.Y"` statement. At -the time of writing, this version is "3.4.7" +the time of writing, this version is "4.0.0" #### Install rbenv and ruby-build @@ -48,18 +48,18 @@ With both installed, we can now install the actual ruby version. You can check available ruby versions with `rbenv install --list`. We suggest you install the version we require in [.ruby-version](https://github.com/opf/openproject/blob/dev/.ruby-version). -Read the first line e.g. `3.4.7` and install that version. +Read the first line e.g. `4.0.0` and install that version. ```shell # Install the required version as read from the .ruby-version file -rbenv install 3.4.7 +rbenv install 4.0.0 ``` This might take a while depending on whether ruby is built from source. After it is complete, you need to tell rbenv to globally activate this version ```shell -rbenv global 3.4.7 +rbenv global 4.0.0 ``` You also need to install [bundler](https://github.com/bundler/bundler/), the ruby gem bundler. @@ -134,7 +134,7 @@ You should now have an active ruby and node installation. Verify that it works w ```shell $ ruby --version -ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +PRISM [arm64-darwin25]4] +ruby 4.0.0 (2025-12-25 revision 553f1675f3) +PRISM [arm64-darwin25] $ bundler --version Bundler version 4.0.1 diff --git a/docs/installation-and-operations/installation/manual/README.md b/docs/installation-and-operations/installation/manual/README.md index 0e16df33786..7379d621a69 100644 --- a/docs/installation-and-operations/installation/manual/README.md +++ b/docs/installation-and-operations/installation/manual/README.md @@ -106,19 +106,19 @@ Please be aware that the actual installation of a specific Ruby version takes so ``` We suggest you install the version we require in [.ruby-version](https://github.com/opf/openproject/blob/dev/.ruby-version). -Read the first line e.g. `3.4.7` and install that version. +Read the first line e.g. `4.0.0` and install that version. ```shell -[openproject@host] rbenv install 3.4.7 +[openproject@host] rbenv install 4.0.0 [openproject@host] rbenv rehash -[openproject@host] rbenv global 3.4.7 +[openproject@host] rbenv global 4.0.0 ``` To check our Ruby installation we run `ruby --version`. It should output something very similar to: ```text -ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +PRISM [arm64-darwin25] +ruby 4.0.0 (2025-12-25 revision 553f1675f3) +PRISM [arm64-darwin25] ``` ## Installation of Node From 1f98f39e228f6dbd3db22f5941ae2a2397c2ef88 Mon Sep 17 00:00:00 2001 From: Klaus Zanders Date: Wed, 14 Jan 2026 16:29:02 +0100 Subject: [PATCH 009/334] Update Ruby to 4.0.1 --- .ruby-version | 2 +- Gemfile.lock | 2 +- docker/dev/backend/Dockerfile | 2 +- docker/prod/Dockerfile | 2 +- .../development-environment/linux/README.md | 14 +++++++------- .../development-environment/macos/README.md | 12 ++++++------ .../installation/manual/README.md | 8 ++++---- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.ruby-version b/.ruby-version index fcdb2e109f6..1454f6ed4b7 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -4.0.0 +4.0.1 diff --git a/Gemfile.lock b/Gemfile.lock index d86a77603d3..cc98d92832b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2296,7 +2296,7 @@ CHECKSUMS zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b RUBY VERSION - ruby 4.0.0 + ruby 4.0.1 BUNDLED WITH 4.0.3 diff --git a/docker/dev/backend/Dockerfile b/docker/dev/backend/Dockerfile index b1339adbbd3..e2a04a60889 100644 --- a/docker/dev/backend/Dockerfile +++ b/docker/dev/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:4.0.0-trixie AS develop +FROM ruby:4.0.1-trixie AS develop LABEL org.opencontainers.image.authors="operations@openproject.com" ARG DEV_UID=1000 diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index ca950d1b63a..ef28a83f002 100755 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -1,4 +1,4 @@ -ARG RUBY_VERSION="4.0.0" +ARG RUBY_VERSION="4.0.1" ARG DEBIAN_BASE="trixie" # Add SBOM scan context for intermediate steps ARG BUILDKIT_SBOM_SCAN_CONTEXT=true diff --git a/docs/development/development-environment/linux/README.md b/docs/development/development-environment/linux/README.md index e3e042326ba..223026715eb 100644 --- a/docs/development/development-environment/linux/README.md +++ b/docs/development/development-environment/linux/README.md @@ -40,10 +40,10 @@ sudo apt-get install git curl build-essential zlib1g-dev libyaml-dev libssl-dev Use [rbenv](https://github.com/rbenv/rbenv) and [ruby-build](https://github.com/rbenv/ruby-build#readme) to install Ruby. You can check available ruby versions with `rbenv install --list`. -At the time of this writing, the latest stable version is `4.0.0`, which we also require. +At the time of this writing, the latest stable version is `4.0.1`, which we also require. We suggest you install the version we require in [.ruby-version](https://github.com/opf/openproject/blob/dev/.ruby-version). -Read the first line e.g. `4.0.0` and install that version. +Read the first line e.g. `4.0.1` and install that version. #### Install rbenv and ruby-build @@ -80,18 +80,18 @@ With both installed, we can now install ruby. You can check available ruby versions with `rbenv install --list`. We suggest you install the version we require in [.ruby-version](https://github.com/opf/openproject/blob/dev/.ruby-version). -Read the first line e.g. `4.0.0` and install that version. +Read the first line e.g. `4.0.1` and install that version. ```shell # Install the required version as read from the .ruby-version file -rbenv install 4.0.0 +rbenv install 4.0.1 ``` This might take a while depending on whether ruby is built from source. After it is complete, you need to tell rbenv to globally activate this version ```shell -rbenv global 4.0.0 +rbenv global 4.0.1 rbenv rehash ``` @@ -181,10 +181,10 @@ You should now have an active ruby and node installation. Verify that it works w ```shell ruby --version -ruby 4.0.0 (2025-12-25 revision 553f1675f3) +PRISM [arm64-darwin25] +ruby 4.0.1 (2026-01-13 revision e04267a14b) +PRISM [arm64-darwin25] bundler --version -Bundler version 4.0.1 +4.0.3 node --version v22.21.0 diff --git a/docs/development/development-environment/macos/README.md b/docs/development/development-environment/macos/README.md index 5c80e57bb31..ba6694a3e7e 100644 --- a/docs/development/development-environment/macos/README.md +++ b/docs/development/development-environment/macos/README.md @@ -28,7 +28,7 @@ their homepage. Use [rbenv](https://github.com/rbenv/rbenv) and [ruby-build](https://github.com/rbenv/ruby-build#readme) to install Ruby. We always require the latest ruby versions, and you can check which version is required by [checking the Gemfile](https://github.com/opf/openproject/blob/dev/Gemfile#L31) for the `ruby "~> X.Y"` statement. At -the time of writing, this version is "4.0.0" +the time of writing, this version is "4.0.1" #### Install rbenv and ruby-build @@ -48,18 +48,18 @@ With both installed, we can now install the actual ruby version. You can check available ruby versions with `rbenv install --list`. We suggest you install the version we require in [.ruby-version](https://github.com/opf/openproject/blob/dev/.ruby-version). -Read the first line e.g. `4.0.0` and install that version. +Read the first line e.g. `4.0.1` and install that version. ```shell # Install the required version as read from the .ruby-version file -rbenv install 4.0.0 +rbenv install 4.0.1 ``` This might take a while depending on whether ruby is built from source. After it is complete, you need to tell rbenv to globally activate this version ```shell -rbenv global 4.0.0 +rbenv global 4.0.1 ``` You also need to install [bundler](https://github.com/bundler/bundler/), the ruby gem bundler. @@ -134,10 +134,10 @@ You should now have an active ruby and node installation. Verify that it works w ```shell $ ruby --version -ruby 4.0.0 (2025-12-25 revision 553f1675f3) +PRISM [arm64-darwin25] +ruby 4.0.1 (2026-01-13 revision e04267a14b) +PRISM [arm64-darwin25] $ bundler --version -Bundler version 4.0.1 +4.0.3 node --version v22.21.0 diff --git a/docs/installation-and-operations/installation/manual/README.md b/docs/installation-and-operations/installation/manual/README.md index 7379d621a69..2092086ffbf 100644 --- a/docs/installation-and-operations/installation/manual/README.md +++ b/docs/installation-and-operations/installation/manual/README.md @@ -106,19 +106,19 @@ Please be aware that the actual installation of a specific Ruby version takes so ``` We suggest you install the version we require in [.ruby-version](https://github.com/opf/openproject/blob/dev/.ruby-version). -Read the first line e.g. `4.0.0` and install that version. +Read the first line e.g. `4.0.1` and install that version. ```shell -[openproject@host] rbenv install 4.0.0 +[openproject@host] rbenv install 4.0.1 [openproject@host] rbenv rehash -[openproject@host] rbenv global 4.0.0 +[openproject@host] rbenv global 4.0.1 ``` To check our Ruby installation we run `ruby --version`. It should output something very similar to: ```text -ruby 4.0.0 (2025-12-25 revision 553f1675f3) +PRISM [arm64-darwin25] +ruby 4.0.1 (2026-01-13 revision e04267a14b) +PRISM [arm64-darwin25] ``` ## Installation of Node From c5a6b1b578e67312226ce7200649d64db141f1be Mon Sep 17 00:00:00 2001 From: Klaus Zanders Date: Mon, 16 Feb 2026 16:43:01 +0100 Subject: [PATCH 010/334] Update bundler --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index cc98d92832b..d7e6a8a64a4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2299,4 +2299,4 @@ RUBY VERSION ruby 4.0.1 BUNDLED WITH - 4.0.3 + 4.0.6 From 1d13433d276e225678d1e369670687e3b2100edc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Feb 2026 10:19:30 +0000 Subject: [PATCH 011/334] Bump actions/checkout from 5 to 6 Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/hocuspocus-test.yml | 2 +- .github/workflows/sync-internal-fork.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/hocuspocus-test.yml b/.github/workflows/hocuspocus-test.yml index 0839e51f825..17af080cb10 100644 --- a/.github/workflows/hocuspocus-test.yml +++ b/.github/workflows/hocuspocus-test.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/sync-internal-fork.yml b/.github/workflows/sync-internal-fork.yml index a3e21021e18..2d91bd10284 100644 --- a/.github/workflows/sync-internal-fork.yml +++ b/.github/workflows/sync-internal-fork.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} From 8febb9b82e9e234d0ef0627659253691e691d27c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:11:44 +0000 Subject: [PATCH 012/334] Bump hono from 4.12.0 to 4.12.2 in /frontend Bumps [hono](https://github.com/honojs/hono) from 4.12.0 to 4.12.2. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.12.0...v4.12.2) --- updated-dependencies: - dependency-name: hono dependency-version: 4.12.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b53c4c46c6d..568c856c92f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15679,9 +15679,9 @@ } }, "node_modules/hono": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.0.tgz", - "integrity": "sha512-NekXntS5M94pUfiVZ8oXXK/kkri+5WpX2/Ik+LVsl+uvw+soj4roXIsPqO+XsWrAw20mOzaXOZf3Q7PfB9A/IA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.2.tgz", + "integrity": "sha512-gJnaDHXKDayjt8ue0n8Gs0A007yKXj4Xzb8+cNjZeYsSzzwKc0Lr+OZgYwVfB0pHfUs17EPoLvrOsEaJ9mj+Tg==", "engines": { "node": ">=16.9.0" } @@ -35824,9 +35824,9 @@ } }, "hono": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.0.tgz", - "integrity": "sha512-NekXntS5M94pUfiVZ8oXXK/kkri+5WpX2/Ik+LVsl+uvw+soj4roXIsPqO+XsWrAw20mOzaXOZf3Q7PfB9A/IA==" + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.2.tgz", + "integrity": "sha512-gJnaDHXKDayjt8ue0n8Gs0A007yKXj4Xzb8+cNjZeYsSzzwKc0Lr+OZgYwVfB0pHfUs17EPoLvrOsEaJ9mj+Tg==" }, "hosted-git-info": { "version": "9.0.2", From e9126b94f7a03925fbd71ac028276ecc3bf9aad8 Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Thu, 26 Feb 2026 08:33:18 +0100 Subject: [PATCH 013/334] Bumped version to 17.3.0 [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 e57217e3845..338b47873cb 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -32,7 +32,7 @@ require "open3" module OpenProject module VERSION # :nodoc: MAJOR = 17 - MINOR = 2 + MINOR = 3 PATCH = 0 class << self From 61e155cd9f0a77015c07de48abd176560fe07c4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 08:06:32 +0000 Subject: [PATCH 014/334] Bump rollup from 4.55.1 to 4.59.0 in /frontend Bumps [rollup](https://github.com/rollup/rollup) from 4.55.1 to 4.59.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.55.1...v4.59.0) --- updated-dependencies: - dependency-name: rollup dependency-version: 4.59.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 438 +++++++++++++++++-------------------- 1 file changed, 206 insertions(+), 232 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b53c4c46c6d..676f730b0f2 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7989,350 +7989,325 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", - "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", - "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", - "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", - "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", - "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", - "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", - "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", - "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", - "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", - "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", - "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", - "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", - "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", - "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", - "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", - "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", - "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", - "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", - "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", - "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", - "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", - "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", - "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", - "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", - "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -22010,11 +21985,10 @@ } }, "node_modules/rollup": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.8" }, @@ -22026,31 +22000,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.1", - "@rollup/rollup-android-arm64": "4.55.1", - "@rollup/rollup-darwin-arm64": "4.55.1", - "@rollup/rollup-darwin-x64": "4.55.1", - "@rollup/rollup-freebsd-arm64": "4.55.1", - "@rollup/rollup-freebsd-x64": "4.55.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", - "@rollup/rollup-linux-arm-musleabihf": "4.55.1", - "@rollup/rollup-linux-arm64-gnu": "4.55.1", - "@rollup/rollup-linux-arm64-musl": "4.55.1", - "@rollup/rollup-linux-loong64-gnu": "4.55.1", - "@rollup/rollup-linux-loong64-musl": "4.55.1", - "@rollup/rollup-linux-ppc64-gnu": "4.55.1", - "@rollup/rollup-linux-ppc64-musl": "4.55.1", - "@rollup/rollup-linux-riscv64-gnu": "4.55.1", - "@rollup/rollup-linux-riscv64-musl": "4.55.1", - "@rollup/rollup-linux-s390x-gnu": "4.55.1", - "@rollup/rollup-linux-x64-gnu": "4.55.1", - "@rollup/rollup-linux-x64-musl": "4.55.1", - "@rollup/rollup-openbsd-x64": "4.55.1", - "@rollup/rollup-openharmony-arm64": "4.55.1", - "@rollup/rollup-win32-arm64-msvc": "4.55.1", - "@rollup/rollup-win32-ia32-msvc": "4.55.1", - "@rollup/rollup-win32-x64-gnu": "4.55.1", - "@rollup/rollup-win32-x64-msvc": "4.55.1", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, @@ -30554,177 +30528,177 @@ "dev": true }, "@rollup/rollup-android-arm-eabi": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", - "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "dev": true, "optional": true }, "@rollup/rollup-android-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", - "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "dev": true, "optional": true }, "@rollup/rollup-darwin-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", - "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "dev": true, "optional": true }, "@rollup/rollup-darwin-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", - "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "dev": true, "optional": true }, "@rollup/rollup-freebsd-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", - "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "dev": true, "optional": true }, "@rollup/rollup-freebsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", - "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", - "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", - "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", - "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", - "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "dev": true, "optional": true }, "@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", - "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "dev": true, "optional": true }, "@rollup/rollup-linux-loong64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", - "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "dev": true, "optional": true }, "@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", - "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "dev": true, "optional": true }, "@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", - "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", - "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", - "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "dev": true, "optional": true }, "@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", - "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", - "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", - "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "dev": true, "optional": true }, "@rollup/rollup-openbsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", - "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "dev": true, "optional": true }, "@rollup/rollup-openharmony-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", - "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "dev": true, "optional": true }, "@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", - "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "dev": true, "optional": true }, "@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", - "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", - "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", - "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "dev": true, "optional": true }, @@ -40115,36 +40089,36 @@ } }, "rollup": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "requires": { - "@rollup/rollup-android-arm-eabi": "4.55.1", - "@rollup/rollup-android-arm64": "4.55.1", - "@rollup/rollup-darwin-arm64": "4.55.1", - "@rollup/rollup-darwin-x64": "4.55.1", - "@rollup/rollup-freebsd-arm64": "4.55.1", - "@rollup/rollup-freebsd-x64": "4.55.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", - "@rollup/rollup-linux-arm-musleabihf": "4.55.1", - "@rollup/rollup-linux-arm64-gnu": "4.55.1", - "@rollup/rollup-linux-arm64-musl": "4.55.1", - "@rollup/rollup-linux-loong64-gnu": "4.55.1", - "@rollup/rollup-linux-loong64-musl": "4.55.1", - "@rollup/rollup-linux-ppc64-gnu": "4.55.1", - "@rollup/rollup-linux-ppc64-musl": "4.55.1", - "@rollup/rollup-linux-riscv64-gnu": "4.55.1", - "@rollup/rollup-linux-riscv64-musl": "4.55.1", - "@rollup/rollup-linux-s390x-gnu": "4.55.1", - "@rollup/rollup-linux-x64-gnu": "4.55.1", - "@rollup/rollup-linux-x64-musl": "4.55.1", - "@rollup/rollup-openbsd-x64": "4.55.1", - "@rollup/rollup-openharmony-arm64": "4.55.1", - "@rollup/rollup-win32-arm64-msvc": "4.55.1", - "@rollup/rollup-win32-ia32-msvc": "4.55.1", - "@rollup/rollup-win32-x64-gnu": "4.55.1", - "@rollup/rollup-win32-x64-msvc": "4.55.1", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "@types/estree": "1.0.8", "fsevents": "~2.3.2" } From 84cfe69237a5815c753f8262e191b8be40fa2e44 Mon Sep 17 00:00:00 2001 From: Birthe Lindenthal Date: Thu, 26 Feb 2026 12:05:25 +0100 Subject: [PATCH 015/334] Update CONTRIBUTING.md Updating info about CLA --- CONTRIBUTING.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b0484f3ae6f..cb9ad130e7a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -139,6 +139,7 @@ version 1.0.0, available at ## Contributors license agreement -Contributors have to sign a CLA before contributing to OpenProject. -The [CLA can be found here](https://www.openproject.org/legal/contributor-license-agreement/) -and has to be filled out and sent to info@openproject.org. +If you want to contribute to OpenProject, please make sure to accept our Contributor License Agreement (CLA). The CLA documents the rights granted by contributors to OpenProject. +The [CLA can be found here](https://www.openproject.org/legal/contributor-license-agreement/). + +A GitHub action will enforce the CLA has been read and accepted by every new contributor. You will only be asked once, the document is short, and signing is easy. From 23063cc90939a1f6c303462706a0f786e6da5e3e Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:46:57 +0100 Subject: [PATCH 016/334] bump appsignal --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 19d78e3422d..30c62b88fa8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -332,7 +332,7 @@ GEM android_key_attestation (0.3.0) anyway_config (2.8.0) ruby-next-core (~> 1.0) - appsignal (4.8.2) + appsignal (4.8.3) logger rack (>= 2.0.0) ast (2.4.3) @@ -1807,7 +1807,7 @@ CHECKSUMS airbrake-ruby (6.2.2) sha256=293e34fb36e763e1b6d67ab584cce7c5b6fe9eea1a70c26d8c13c0f5d7de2fbc android_key_attestation (0.3.0) sha256=467eb01a99d2bb48ef9cf24cc13712669d7056cba5a52d009554ff037560570b anyway_config (2.8.0) sha256=f6797a7231f81202dcd3d0c07284e836e45713e761d320180348b13a5c7c9306 - appsignal (4.8.2) sha256=88cf3229a451a6501da55e221367991788f5621d319823b471f271e07cc92ca5 + appsignal (4.8.3) sha256=aa0ea5ffd39fe7530c56a6eb6efda60825ab061ef31376126cae93b009844dd7 ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 attr_required (1.0.2) sha256=f0ebfc56b35e874f4d0ae799066dbc1f81efefe2364ca3803dc9ea6a4de6cb99 auto_strip_attributes (2.6.0) sha256=a7e2e0cf744de2bcd947fd68014220702bcc88c81274c1cd9ce6f7316aae39b0 From 77e1613e597a07f6446540dc39def6a88eb9417b Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:47:09 +0100 Subject: [PATCH 017/334] bump aws-partitions --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 30c62b88fa8..c90f24f255f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -342,7 +342,7 @@ GEM awesome_nested_set (3.9.0) activerecord (>= 4.0.0, < 8.2) aws-eventstream (1.4.0) - aws-partitions (1.1213.0) + aws-partitions (1.1220.0) aws-sdk-core (3.242.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -1813,7 +1813,7 @@ CHECKSUMS auto_strip_attributes (2.6.0) sha256=a7e2e0cf744de2bcd947fd68014220702bcc88c81274c1cd9ce6f7316aae39b0 awesome_nested_set (3.9.0) sha256=3ce99e816550f97f4de118e621630070aacf24928b920fe4a68846578a8daaed aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b - aws-partitions (1.1213.0) sha256=5ec132d91d44ef2702125b8f71f0e4fc2cd7de040e02c5d0aefb87219fd2e05e + aws-partitions (1.1220.0) sha256=1567da9ae45cba28e1d31f5e996928b2eb92ad01700000846d6d90043be8670f aws-sdk-core (3.242.0) sha256=c17b3003acc78d80c1a8437b285a1cfc5e4d7749ce7821cf3071e847535a29a0 aws-sdk-kms (1.121.0) sha256=d563c1cfb4b5754efbc671216c8eca875338748adad0f42518c28dfa0a2d01e0 aws-sdk-s3 (1.213.0) sha256=af596ccf544582406db610e95cc9099276eaf03142f57a2f30f76940e598e50d From a8e146fe6cdfd6713a8f8462fc689b384248497d Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:47:20 +0100 Subject: [PATCH 018/334] bump aws-sdk-kms --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c90f24f255f..e05c0554edf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -351,7 +351,7 @@ GEM bigdecimal jmespath (~> 1, >= 1.6.1) logger - aws-sdk-kms (1.121.0) + aws-sdk-kms (1.122.0) aws-sdk-core (~> 3, >= 3.241.4) aws-sigv4 (~> 1.5) aws-sdk-s3 (1.213.0) @@ -1815,7 +1815,7 @@ CHECKSUMS aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b aws-partitions (1.1220.0) sha256=1567da9ae45cba28e1d31f5e996928b2eb92ad01700000846d6d90043be8670f aws-sdk-core (3.242.0) sha256=c17b3003acc78d80c1a8437b285a1cfc5e4d7749ce7821cf3071e847535a29a0 - aws-sdk-kms (1.121.0) sha256=d563c1cfb4b5754efbc671216c8eca875338748adad0f42518c28dfa0a2d01e0 + aws-sdk-kms (1.122.0) sha256=47ce3f51b26bd7d76f1270cfdfca17b40073ecd3219c8c9400788712abfb4eb8 aws-sdk-s3 (1.213.0) sha256=af596ccf544582406db610e95cc9099276eaf03142f57a2f30f76940e598e50d aws-sdk-sns (1.112.0) sha256=aff1b1b5bbcb4229599221c558a41790c1cd1a1fed47ac3d27d27512ad24b254 aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00 From f2cb7de7baa2fbdba923be431bb4b5d24dfdea70 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:47:39 +0100 Subject: [PATCH 019/334] bump capybara-screenshot --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e05c0554edf..51d739849b0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -405,7 +405,7 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - capybara-screenshot (1.0.26) + capybara-screenshot (1.0.27) capybara (>= 1.0, < 4) launchy carrierwave (2.2.6) @@ -1835,7 +1835,7 @@ CHECKSUMS builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f byebug (13.0.0) sha256=d2263efe751941ca520fa29744b71972d39cbc41839496706f5d9b22e92ae05d capybara (3.40.0) sha256=42dba720578ea1ca65fd7a41d163dd368502c191804558f6e0f71b391054aeef - capybara-screenshot (1.0.26) sha256=816b9370a07752097c82a05f568aaf5d3b7f45c3db5d3aab2014071e1b3c0c77 + capybara-screenshot (1.0.27) sha256=afa1896cc23df77be1774e8d3b3ce3953bf060aeaa04ff87607b5daf689174f2 capybara_accessible_selectors (0.15.0) carrierwave (2.2.6) sha256=cd9b6108fc7544e97e7fbcc561bd319a09f23c96816fdd0df8f2f45ffdc0dac3 carrierwave_direct (2.1.0) sha256=b0d5c19c1d17a05940e488cff644a3b2946422d6d494b2174b48f6a90c5dddbf From 2cdb7675b6b8af50531eb85dbae78f459dd52e5c Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:48:16 +0100 Subject: [PATCH 020/334] bump counter_culture & mime-types-data & ssrf_filter --- Gemfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 51d739849b0..e5c2821b847 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -447,7 +447,7 @@ GEM cose (1.3.1) cbor (~> 0.5.9) openssl-signature_algorithm (~> 1.0) - counter_culture (3.12.1) + counter_culture (3.12.2) activerecord (>= 4.2) activesupport (>= 4.2) crack (1.0.1) @@ -823,7 +823,7 @@ GEM mime-types (3.7.0) logger mime-types-data (~> 3.2025, >= 3.2025.0507) - mime-types-data (3.2026.0203) + mime-types-data (3.2026.0224) mini_magick (5.3.1) logger mini_mime (1.1.5) @@ -1424,7 +1424,7 @@ GEM actionpack (>= 6.1) activesupport (>= 6.1) sprockets (>= 3.0.0) - ssrf_filter (1.0.8) + ssrf_filter (1.3.0) stackprof (0.2.28) statesman (13.1.0) store_attribute (2.1.1) @@ -1860,7 +1860,7 @@ CHECKSUMS cookiejar (0.3.4) sha256=11b16acfc4baf7a0f463c21a6212005e04e25f5554d4d9f24d97f3492dfda0df cose (1.3.1) sha256=d5d4dbcd6b035d513edc4e1ab9bc10e9ce13b4011c96e3d1b8fe5e6413fd6de5 costs (1.0.0) - counter_culture (3.12.1) sha256=8a880092321941732bfa639c449a133ff08c5197c29e853371cc03c486e43980 + counter_culture (3.12.2) sha256=26358dbb15e2f1f7e60f2c11976e37517a74ffd34eb5ef8d7269862b9ff8aadd crack (1.0.1) sha256=ff4a10390cd31d66440b7524eb1841874db86201d5b70032028553130b6d4c7e crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d css_parser (1.21.1) sha256=6cfd3ffc0a97333b39d2b1b49c95397b05e0e3b684d68f77ec471ba4ec2ef7c7 @@ -2005,7 +2005,7 @@ CHECKSUMS meta-tags (2.22.3) sha256=41ead5437140869717cbdd659cc6f1caa3e498b3e74b03ed63503b5b38ed504f method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5 mime-types (3.7.0) sha256=dcebf61c246f08e15a4de34e386ebe8233791e868564a470c3fe77c00eed5e56 - mime-types-data (3.2026.0203) sha256=54353d693af028847391c28361c07d4b8b689cad78c3e1cc272fb1205c6d2a2f + mime-types-data (3.2026.0224) sha256=bea02e0168b37f6935696c4fcfeb3374a0a62e82e6187af5f3f3b709bf67e5fd mini_magick (5.3.1) sha256=29395dfd76badcabb6403ee5aff6f681e867074f8f28ce08d78661e9e4a351c4 mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef minitest (6.0.2) sha256=db6e57956f6ecc6134683b4c87467d6dd792323c7f0eea7b93f66bd284adbc3d @@ -2252,7 +2252,7 @@ CHECKSUMS spring-commands-rubocop (0.4.0) sha256=3e677a2c8a27ae8a986f04bfb69e66d5d55b017541e8be93bf0dc48a7f5690c1 sprockets (3.7.5) sha256=72c20f256548f8a37fe7db41d96be86c3262fddaf4ebe9d69ec8317394fed383 sprockets-rails (3.5.2) sha256=a9e88e6ce9f8c912d349aa5401509165ec42326baf9e942a85de4b76dbc4119e - ssrf_filter (1.0.8) sha256=03f49f54837e407d43ee93ec733a8a94dc1bcf8185647ac61606e63aaedaa0db + ssrf_filter (1.3.0) sha256=66882d7de7d09c019098d6d7372412950ae184ebbc7c51478002058307aba6f2 stackprof (0.2.28) sha256=4ec2ace02f386012b40ca20ef80c030ad711831f59511da12e83b34efb0f9a04 statesman (13.1.0) sha256=3ecb78466dfd2682e433f335a7722aa0e5b8c6853d72d83e460151b8af17a84e store_attribute (2.1.1) sha256=de53611c01d3fb4c91e0d7af4208861bd18d017c4cee682ed0473d0e4496f5b8 From e6ffb5daabf81186427b12f8d3eddd531a4da9ae Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:48:27 +0100 Subject: [PATCH 021/334] bump css_parser --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e5c2821b847..29971dc6bc9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -454,7 +454,7 @@ GEM bigdecimal rexml crass (1.0.6) - css_parser (1.21.1) + css_parser (2.0.0) addressable csv (3.3.5) cuprite (0.17) @@ -1863,7 +1863,7 @@ CHECKSUMS counter_culture (3.12.2) sha256=26358dbb15e2f1f7e60f2c11976e37517a74ffd34eb5ef8d7269862b9ff8aadd crack (1.0.1) sha256=ff4a10390cd31d66440b7524eb1841874db86201d5b70032028553130b6d4c7e crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d - css_parser (1.21.1) sha256=6cfd3ffc0a97333b39d2b1b49c95397b05e0e3b684d68f77ec471ba4ec2ef7c7 + css_parser (2.0.0) sha256=af5c759a127b125b635006a6c6c2e05b96a1ebdeec21b3c415fd5f09ec714a0a csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f cuprite (0.17) sha256=b140d5dc70d08b97ad54bcf45cd95d0bd430e291e9dffe76fff851fddd57c12b daemons (1.4.1) sha256=8fc76d76faec669feb5e455d72f35bd4c46dc6735e28c420afb822fac1fa9a1d From 1ce7a315dc4e90e4404c168345ff343e96e6fe52 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:48:39 +0100 Subject: [PATCH 022/334] bump dalli --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 29971dc6bc9..21058eef9f4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -461,7 +461,7 @@ GEM capybara (~> 3.0) ferrum (~> 0.17.0) daemons (1.4.1) - dalli (5.0.0) + dalli (5.0.2) logger date (3.5.1) date_validator (0.12.0) @@ -1867,7 +1867,7 @@ CHECKSUMS csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f cuprite (0.17) sha256=b140d5dc70d08b97ad54bcf45cd95d0bd430e291e9dffe76fff851fddd57c12b daemons (1.4.1) sha256=8fc76d76faec669feb5e455d72f35bd4c46dc6735e28c420afb822fac1fa9a1d - dalli (5.0.0) sha256=7d5ae821da3ef98cad68e77f09ae0e563244dc0f3995f5c8999c5a379fa3d468 + dalli (5.0.2) sha256=818469227b9acdd9da3fc65ec5ae75d4020115545879e5e8f95634085e9a8749 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 date_validator (0.12.0) sha256=68c9834da240347b9c17441c553a183572508617ebfbe8c020020f3192ce3058 deckar01-task_list (2.3.4) sha256=66abdc7e009ea759732bb53867e1ea42de550e2aa03ac30a015cbf42a04c1667 From 5b2fa52c33a3588901e49825b20a019b6d21d85c Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:50:40 +0100 Subject: [PATCH 023/334] bump openssl --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 21058eef9f4..9aad05a5ec1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -901,7 +901,7 @@ GEM view_component (>= 3.1, < 5.0) openproject-token (8.7.0) activemodel - openssl (4.0.0) + openssl (4.0.1) openssl-signature_algorithm (1.3.0) openssl (> 2.0) opentelemetry-api (1.7.0) @@ -2064,7 +2064,7 @@ CHECKSUMS openproject-two_factor_authentication (1.0.0) openproject-webhooks (1.0.0) openproject-xls_export (1.0.0) - openssl (4.0.0) sha256=185711ed93d4e9c9a9db6efea7edb202dfe04f7d3692fbab988e3d84e498ee91 + openssl (4.0.1) sha256=e27974136b7b02894a1bce46c5397ee889afafe704a839446b54dc81cb9c5f7d openssl-signature_algorithm (1.3.0) sha256=a3b40b5e8276162d4a6e50c7c97cdaf1446f9b2c3946a6fa2c14628e0c957e80 opentelemetry-api (1.7.0) sha256=ccfd264ea6f2db5bf4185e3c07a1297977b44a944e2ce65457c4fe63a697214f opentelemetry-common (0.23.0) sha256=da721190479d57bae0ad2207468f47f3e2c3b9a91024b5bc32c9d280183eb32c From 406e967696bd61a2fc66d51728dd334ea2863048 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:50:51 +0100 Subject: [PATCH 024/334] bump opentelemetry-instrumentation-dalli --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9aad05a5ec1..59cd13b891c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -990,7 +990,7 @@ GEM opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-concurrent_ruby (0.24.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-dalli (0.29.0) + opentelemetry-instrumentation-dalli (0.29.1) opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-delayed_job (0.25.1) opentelemetry-instrumentation-base (~> 0.25) @@ -2087,7 +2087,7 @@ CHECKSUMS opentelemetry-instrumentation-base (0.25.0) sha256=642a3a7f08354e6e969423327a4fa67ed2cca7ac6fe5ee09e55b17d1c576da27 opentelemetry-instrumentation-bunny (0.24.0) sha256=1ec484e48a5f42a1d0c33e8e6bc7e9e78dd80f3ed9d63520b8a22ba564aa2585 opentelemetry-instrumentation-concurrent_ruby (0.24.0) sha256=229bd8b72000c59de693609bb637b8a9114992f5e0ab03730d7fd7ef91f7d1d2 - opentelemetry-instrumentation-dalli (0.29.0) sha256=a2686650545609e8d7e281c9fd1aef529ab578ef2dcf9a6258737e4ba214bc2f + opentelemetry-instrumentation-dalli (0.29.1) sha256=fd5957fc1289b4c2155b2ffddbcd3268fe29869a56a588eb6d71d4f93424da91 opentelemetry-instrumentation-delayed_job (0.25.1) sha256=47f35b10d2bfd9ac7c2bbbe10dea095a2e25db2a84f5351860ead969d180c3ec opentelemetry-instrumentation-ethon (0.27.0) sha256=bfd2e34a5f34c7114727b0e0c9d441a1c6c7a4cceb8374d90ae9332f009f3968 opentelemetry-instrumentation-excon (0.27.0) sha256=3d7e6e160f0328e1136646aabb23efefdb125854637d5bd57b849720f783b5bb From f4915ae5eca716460cad4dac780b0957adec366a Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:51:02 +0100 Subject: [PATCH 025/334] bump opentelemetry-instrumentation-grape --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 59cd13b891c..702c5352d0f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1000,7 +1000,7 @@ GEM opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-faraday (0.31.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-grape (0.5.0) + opentelemetry-instrumentation-grape (0.5.1) opentelemetry-instrumentation-rack (~> 0.29) opentelemetry-instrumentation-graphql (0.31.2) opentelemetry-instrumentation-base (~> 0.25) @@ -2092,7 +2092,7 @@ CHECKSUMS opentelemetry-instrumentation-ethon (0.27.0) sha256=bfd2e34a5f34c7114727b0e0c9d441a1c6c7a4cceb8374d90ae9332f009f3968 opentelemetry-instrumentation-excon (0.27.0) sha256=3d7e6e160f0328e1136646aabb23efefdb125854637d5bd57b849720f783b5bb opentelemetry-instrumentation-faraday (0.31.0) sha256=1c00dc96d4c18890a34a20eef27eae536bf6558965e03e254bb7b84a4f09840b - opentelemetry-instrumentation-grape (0.5.0) sha256=b9fcbe13b015b663577b8bde5b419c297da2588d0a022f4ce40f9ffc49df7624 + opentelemetry-instrumentation-grape (0.5.1) sha256=a623608ef10e96c413f4d50b840082bf1ab9700126185d89ddbc8a29b49ec0ef opentelemetry-instrumentation-graphql (0.31.2) sha256=a4455f225427f8f9058247c8c0b351b8932567913c35ef049f7958801d401b1f opentelemetry-instrumentation-grpc (0.4.1) sha256=5ffa2bb1d5ec69bcd1fe23e1d8c1a563a00351ce052fe9d76885cc43f21ebc87 opentelemetry-instrumentation-gruf (0.5.0) sha256=ee21be36e312e71b847c9a87168225625890121140a364b68d3668e0df58dacd From 994cea45a5efe171aa1b9001f61ff02b61f4e611 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:51:13 +0100 Subject: [PATCH 026/334] bump pagy --- Gemfile.lock | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 702c5352d0f..d7d4bba2bcb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1082,8 +1082,9 @@ GEM ostruct (0.6.3) ox (2.14.23) bigdecimal (>= 3.0) - pagy (43.2.9) + pagy (43.3.1) json + uri yaml paper_trail (17.0.0) activerecord (>= 7.1) @@ -2126,7 +2127,7 @@ CHECKSUMS ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 overviews (1.0.0) ox (2.14.23) sha256=4a9aedb4d6c78c5ebac1d7287dc7cc6808e14a8831d7adb727438f6a1b461b66 - pagy (43.2.9) sha256=6a167c8da72388883e8f4c8e29dc8f5577f9f934d8d0b704cb2f39d2cebd276e + pagy (43.3.1) sha256=78e6c3e5125463b817cbe48eb5ed7b552af062c7db90bef4810d1f442ec61744 paper_trail (17.0.0) sha256=1c2842061d3874ca7015908e821e2aa14f9b982af2acb2a7974713bf79021c85 parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130 parallel_tests (4.10.1) sha256=df05458c691462b210f7a41fc2651d4e4e8a881e8190e6d1e122c92c07735d70 From c0713bf4788468f9ff93a60bae53369363c1952c Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:51:33 +0100 Subject: [PATCH 027/334] bump parser --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d7d4bba2bcb..9da5ad748f8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1092,7 +1092,7 @@ GEM parallel (1.27.0) parallel_tests (4.10.1) parallel - parser (3.3.10.1) + parser (3.3.10.2) ast (~> 2.4.1) racc pdf-core (0.9.0) @@ -2131,7 +2131,7 @@ CHECKSUMS paper_trail (17.0.0) sha256=1c2842061d3874ca7015908e821e2aa14f9b982af2acb2a7974713bf79021c85 parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130 parallel_tests (4.10.1) sha256=df05458c691462b210f7a41fc2651d4e4e8a881e8190e6d1e122c92c07735d70 - parser (3.3.10.1) sha256=06f6a725d2cd91e5e7f2b7c32ba143631e1f7c8ae2fb918fc4cebec187e6a688 + parser (3.3.10.2) sha256=6f60c84aa4bdcedb6d1a2434b738fe8a8136807b6adc8f7f53b97da9bc4e9357 pdf-core (0.9.0) sha256=4f368b2f12b57ec979872d4bf4bd1a67e8648e0c81ab89801431d2fc89f4e0bb pdf-inspector (1.3.0) sha256=fc107579d6f29b636e2da3d6743479b2624d9e390bf2d84beef8fd4ebe1a05bd pdf-reader (2.15.1) sha256=18c6a986a84a3117fa49f4279fc2de51f5d2399b71833df5d2bccd595c7068ce From a8bd63a57f599bfece4a3e12078ec10df60276d9 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:52:54 +0100 Subject: [PATCH 028/334] bump rubocop --- Gemfile.lock | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9da5ad748f8..86d5764fe21 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1322,10 +1322,11 @@ GEM rspec-support (3.13.7) rspec-wait (1.0.2) rspec (>= 3.4) - rubocop (1.84.2) + rubocop (1.85.0) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) + mcp (~> 0.6) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) @@ -2215,7 +2216,7 @@ CHECKSUMS rspec-retry (0.6.2) sha256=6101ba23a38809811ae3484acde4ab481c54d846ac66d5037ccb40131a60d858 rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c rspec-wait (1.0.2) sha256=865f921239325d3d26fc10ded4bdd485d8b58bcaaad1a28dd85ed15266b5a912 - rubocop (1.84.2) sha256=5692cea54168f3dc8cb79a6fe95c5424b7ea893c707ad7a4307b0585e88dbf5f + rubocop (1.85.0) sha256=317407feb681a07d54f64d2f9e1d6b6af1ce7678e51cd658e3ad8bd66da48c01 rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb From e85926503319d1dc35a902438db87e2306f2a9e2 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:53:07 +0100 Subject: [PATCH 029/334] bump ruby-prof --- Gemfile.lock | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 86d5764fe21..5ea182b0ccc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1368,8 +1368,9 @@ GEM iso8601 ruby-next-core (1.2.0) ruby-ole (1.2.13.1) - ruby-prof (1.7.2) + ruby-prof (2.0.2) base64 + ostruct ruby-progressbar (1.13.0) ruby-rc4 (0.1.5) ruby-saml (1.18.1) @@ -2228,7 +2229,7 @@ CHECKSUMS ruby-duration (3.2.3) sha256=eb3d13b1df85067a015a8fb2ed8f1eec842a3b721e47c9b6fd74d2f356069784 ruby-next-core (1.2.0) sha256=f6a7d00bb5186cecbb02f7f1845a0f3a2c9788d35b6ccff5c9be3f0d46799b86 ruby-ole (1.2.13.1) sha256=578d10dd2a797a2b35a1286c6fb2c9525f67c24791346fc8015d39f0ffa3cb72 - ruby-prof (1.7.2) sha256=270424fcac37e611f2d15a55226c4628e234f8434e1d7c25ca8a2155b9fc4340 + ruby-prof (2.0.2) sha256=c489dbf8b029d3107ff4b74db6c01939f71427f985f6bb449e1170ed24073d0e ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby-rc4 (0.1.5) sha256=00cc40a39d20b53f5459e7ea006a92cf584e9bc275e2a6f7aa1515510e896c03 ruby-saml (1.18.1) sha256=1b0e7a44aef150b4197955f5e015d593672e242cfdc5d06aa7554ec2350b9107 From 42c318b0e6be47a2b014ec1cd820b422994b534d Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:53:30 +0100 Subject: [PATCH 030/334] bump selenium-webdriver --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5ea182b0ccc..2c2dc483ff1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1393,7 +1393,7 @@ GEM securerandom (0.4.1) selenium-devtools (0.143.0) selenium-webdriver (~> 4.2) - selenium-webdriver (4.40.0) + selenium-webdriver (4.41.0) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) @@ -2242,7 +2242,7 @@ CHECKSUMS scimitar (2.14.0) sha256=93b29132ebd50d78e61d56c8a17406b1c01857448f2d075560fd6c7660ac9aa9 securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1 selenium-devtools (0.143.0) sha256=23e8b364e1074a93a56ea0365ff739022a23a72e9033ad69832400c884417dc4 - selenium-webdriver (4.40.0) sha256=16ef7aa9853c1d4b9d52eac45aafa916e3934c5c83cb4facb03f250adfd15e5b + selenium-webdriver (4.41.0) sha256=cdc1173cd55cf186022cea83156cc2d0bec06d337e039b02ad25d94e41bedd22 semantic (1.6.1) sha256=3cdbb48f59198ebb782a3fdfb87b559e0822a311610db153bae22777a7d0c163 shoulda-context (2.0.0) sha256=7adf45342cd800f507d2a053658cb1cce2884b616b26004d39684b912ea32c34 shoulda-matchers (7.0.1) sha256=b4bfd8744c10e0a36c8ac1a687f921ee7e25ed529e50488d61b79a8688749c77 From b83caa5dfb7340730a27de4c61958cd375f0ce1a Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:55:43 +0100 Subject: [PATCH 031/334] bump closure_tree --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 587fe7fd80a..e8fcbef4d24 100644 --- a/Gemfile +++ b/Gemfile @@ -69,7 +69,7 @@ gem "scimitar", "~> 2.13" gem "acts_as_list", "~> 1.2.6" gem "acts_as_tree", "~> 2.9.0" gem "awesome_nested_set", "~> 3.9.0" -gem "closure_tree", "~> 9.5.0" +gem "closure_tree", "~> 9.6.0" gem "rubytree", "~> 2.2.0" gem "addressable", "~> 2.8.0" diff --git a/Gemfile.lock b/Gemfile.lock index 2c2dc483ff1..afd53d4db9a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -424,7 +424,7 @@ GEM childprocess (5.1.0) logger (~> 1.5) climate_control (1.2.0) - closure_tree (9.5.0) + closure_tree (9.6.0) activerecord (>= 7.2.0) with_advisory_lock (>= 7.5.0) zeitwerk (~> 2.7) @@ -1587,7 +1587,7 @@ DEPENDENCIES carrierwave (~> 2.2.6) carrierwave_direct (~> 2.1.0) climate_control - closure_tree (~> 9.5.0) + closure_tree (~> 9.6.0) colored2 commonmarker (~> 2.6.0) compare-xml (~> 0.66) @@ -1846,7 +1846,7 @@ CHECKSUMS cgi (0.5.1) sha256=e93fcafc69b8a934fe1e6146121fa35430efa8b4a4047c4893764067036f18e9 childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec climate_control (1.2.0) sha256=36b21896193fa8c8536fa1cd843a07cf8ddbd03aaba43665e26c53ec1bd70aa5 - closure_tree (9.5.0) sha256=1ae7d32f1a03ac13dee152bd1185a0f509c26dca7f2e5a234867576de5a96b5b + closure_tree (9.6.0) sha256=75aac8f058597b0d96f2052f1419c912e8f4e92425e56273db122913cdae5d1e coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b coercible (1.0.0) sha256=5081ad24352cc8435ce5472bc2faa30260c7ea7f2102cc6a9f167c4d9bffaadc color_conversion (0.1.2) sha256=99bea5fa412e1527a11389975aa6ad445ff8528ebae202c11d08c45ea2b94c96 From 2cba27c585c2a8cf9651b6c5d7d2d3a69e523eaf Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 26 Feb 2026 15:57:24 +0100 Subject: [PATCH 032/334] bump retriable --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index e8fcbef4d24..3d4029b0ae3 100644 --- a/Gemfile +++ b/Gemfile @@ -276,7 +276,7 @@ group :test do gem "rspec-rails", "~> 8.0.3", group: :development # Retry failures within the same environment - gem "retriable", "~> 3.1.1" + gem "retriable", "~> 3.2.1" gem "rspec-retry", "~> 0.6.1" # Accessibility tests diff --git a/Gemfile.lock b/Gemfile.lock index afd53d4db9a..2fe448d9173 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1290,7 +1290,7 @@ GEM responders (3.2.0) actionpack (>= 7.0) railties (>= 7.0) - retriable (3.1.2) + retriable (3.2.1) rexml (3.4.4) rinku (2.0.6) roar (1.2.0) @@ -1720,7 +1720,7 @@ DEPENDENCIES redis (~> 5.4.0) request_store (~> 1.7.0) responders (~> 3.2) - retriable (~> 3.1.1) + retriable (~> 3.2.1) rinku (~> 2.0.4) roar (~> 1.2.0) rouge (~> 4.7.0) @@ -2203,7 +2203,7 @@ CHECKSUMS representable (3.2.0) sha256=cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace request_store (1.7.0) sha256=e1b75d5346a315f452242a68c937ef8e48b215b9453a77a6c0acdca2934c88cb responders (3.2.0) sha256=89c2d6ac0ae16f6458a11524cae4a8efdceba1a3baea164d28ee9046bd3df55a - retriable (3.1.2) sha256=0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0 + retriable (3.2.1) sha256=26e87a33391fae4c382d4750f1e135e4dda7e5aa32b6b71f1992265981f9b991 rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 rinku (2.0.6) sha256=8b60670e3143f3db2b37efa262971ce3619ec23092045498ef9f077d82828d7d roar (1.2.0) sha256=8db4d1ca79c57a5fb746c16c0d5661d7c3e0de3d9553dc016a88d2dba2929d08 From f7aa623066fd087bb1c3606226eecf0530fd5ebd Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Fri, 27 Feb 2026 03:51:41 +0000 Subject: [PATCH 033/334] update locales from crowdin [ci skip] --- config/locales/crowdin/af.yml | 5 +- config/locales/crowdin/ar.yml | 5 +- config/locales/crowdin/az.yml | 5 +- config/locales/crowdin/be.yml | 5 +- config/locales/crowdin/bg.yml | 5 +- config/locales/crowdin/ca.yml | 5 +- config/locales/crowdin/ckb-IR.yml | 5 +- config/locales/crowdin/cs.yml | 99 ++++++++++--------- config/locales/crowdin/da.yml | 5 +- config/locales/crowdin/de.yml | 5 +- config/locales/crowdin/el.yml | 5 +- config/locales/crowdin/eo.yml | 5 +- config/locales/crowdin/es.yml | 5 +- config/locales/crowdin/et.yml | 5 +- config/locales/crowdin/eu.yml | 5 +- config/locales/crowdin/fa.yml | 5 +- config/locales/crowdin/fi.yml | 5 +- config/locales/crowdin/fil.yml | 5 +- config/locales/crowdin/fr.yml | 5 +- config/locales/crowdin/he.yml | 5 +- config/locales/crowdin/hi.yml | 5 +- config/locales/crowdin/hr.yml | 5 +- config/locales/crowdin/hu.yml | 5 +- config/locales/crowdin/id.yml | 5 +- config/locales/crowdin/it.yml | 5 +- config/locales/crowdin/ja.yml | 5 +- config/locales/crowdin/ka.yml | 5 +- config/locales/crowdin/kk.yml | 5 +- config/locales/crowdin/ko.yml | 5 +- config/locales/crowdin/lt.yml | 5 +- config/locales/crowdin/lv.yml | 5 +- config/locales/crowdin/mn.yml | 5 +- config/locales/crowdin/ms.yml | 5 +- config/locales/crowdin/ne.yml | 5 +- config/locales/crowdin/nl.yml | 5 +- config/locales/crowdin/no.yml | 5 +- config/locales/crowdin/pl.yml | 5 +- config/locales/crowdin/pt-BR.yml | 5 +- config/locales/crowdin/pt-PT.yml | 5 +- config/locales/crowdin/ro.yml | 5 +- config/locales/crowdin/ru.yml | 5 +- config/locales/crowdin/rw.yml | 5 +- config/locales/crowdin/si.yml | 5 +- config/locales/crowdin/sk.yml | 5 +- config/locales/crowdin/sl.yml | 5 +- config/locales/crowdin/sr.yml | 5 +- config/locales/crowdin/sv.yml | 5 +- config/locales/crowdin/th.yml | 5 +- config/locales/crowdin/tr.yml | 5 +- config/locales/crowdin/uk.yml | 5 +- config/locales/crowdin/uz.yml | 5 +- config/locales/crowdin/vi.yml | 5 +- config/locales/crowdin/zh-CN.yml | 5 +- config/locales/crowdin/zh-TW.yml | 5 +- .../backlogs/config/locales/crowdin/cs.yml | 2 +- .../backlogs/config/locales/crowdin/de.yml | 2 +- modules/meeting/config/locales/crowdin/ru.yml | 4 +- .../config/locales/crowdin/cs.yml | 2 +- 58 files changed, 214 insertions(+), 160 deletions(-) diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index 5008bf3c349..99f63a4b687 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -83,8 +83,9 @@ af: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ af: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index ec1cd1a7988..4a1f63ed3c4 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -83,8 +83,9 @@ ar: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "استبدال رمز الدعم الحالي الخاص بك" order: "Order Enterprise on-premises edition" @@ -3421,7 +3422,7 @@ ar: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index 37cf8c0e874..ace8cc403a4 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -83,8 +83,9 @@ az: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ az: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index 063579c328a..79002bb0cd5 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -83,8 +83,9 @@ be: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Загрузіць Enterprise edition токен." replace_token: "Replace your current support token" order: "Заказаць Enterprise on-premises edition" @@ -3309,7 +3310,7 @@ be: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index 0c7ddec25c8..64501d7c247 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -83,8 +83,9 @@ bg: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ bg: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index 483795c635e..f73c3b8e579 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -83,8 +83,9 @@ ca: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Carrega un token de suport de l'edició Enterprise" replace_token: "Substitueix el teu token de suport actual" order: "Ordena l'edició Enterpise on-premises" @@ -3194,7 +3195,7 @@ ca: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index 8822125dc1e..49b5f5a4152 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -83,8 +83,9 @@ ckb-IR: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ ckb-IR: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 4bc8e345e21..0948647ceeb 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -83,8 +83,9 @@ cs: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Nahrát podpůrný token Enterprise Edition" replace_token: "Nahradit aktuální podpůrný token" order: "Objednat Enterprise Edici" @@ -667,7 +668,7 @@ cs: edit: synchronized_groups: "Synchronized groups" index: - description: By grouping users together, you can add them as members to the same projects or assign the same global roles to them. + 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. @@ -696,10 +697,10 @@ cs: many: "%{count} sub-items" other: "%{count} sub-items" lists: - active: "Active portfolios" - my: "My portfolios" - favorited: "Favorite portfolios" - archived: "Archived portfolios" + active: "Aktivní portfolia" + my: "Moje portfolia" + favorited: "Oblíbená portfolia" + archived: "Archivovaná portfolia" projects: copy: #Contains custom strings for options when copying a project that cannot be found elsewhere. @@ -948,8 +949,8 @@ cs: dialog: token/api: dialog_title: "Vytvořit nový API token" - attention_text: "Treat API tokens like passwords. Anyone with this token will have access to information from this instance, share it only with trusted users." - dialog_body: "This token will allow third-party applications to communicate with your instance. To differentiate the new API token, please give it a name." + attention_text: "Zacházejte s tokeny API jako s hesly. Kdokoli s tímto tokenem bude mít přístup k informacím z této instance, sdílejte je tedy pouze s důvěryhodnými uživateli." + dialog_body: "Tento token umožní aplikacím třetích stran komunikovat s vaší instancí. Chcete-li nový token API odlišit, pojmenujte jej." create_button: "Vytvořit" name_label: "Název tokenu" created_dialog: @@ -983,8 +984,8 @@ cs: matrix_checkbox_label: "Assign %{permission} permission to %{role} role" matrix_check_all_label: "Assign all %{module} permissions to all roles" matrix_uncheck_all_label: "Unassign all %{module} permissions from all roles" - matrix_check_uncheck_all_in_row_label_html: "Toggle %{permission} permission for all roles" - matrix_check_uncheck_all_in_col_label_html: "Toggle all %{module} permissions for %{role} role" + matrix_check_uncheck_all_in_row_label_html: "Přepnout %{permission} oprávnění pro všechny role" + matrix_check_uncheck_all_in_col_label_html: "Přepnout všechna %{module} oprávnění pro %{role} roli" users: autologins: prompt: "Zůstaňte přihlášeni po %{num_days}" @@ -1000,7 +1001,7 @@ cs: browser_session: "(Browser session)" current: "Current (this device)" title: "Správa relací" - instructions: "You are logged in to your account through the following devices. Revoke sessions that you do not recognise or from devices you do not control." + instructions: "Ke svému účtu jste přihlášeni na následujících zařízeních. Deaktivujte relace, které neznáte nebo které pocházejí ze zařízení, která neovládáte." may_not_delete_current: "Aktuální relaci nelze odstranit." deletion_warning: "Are you sure you want to revoke this session? You will be logged out on this device." groups: @@ -1128,7 +1129,7 @@ cs: themes: dark: "Tmavé" light: "Světlý" - sync_with_os: "Automatic (match OS color mode)" + sync_with_os: "Automaticky (podle barevného režimu OS)" types: index: no_results_title_text: V současné době neexistují žádné typy. @@ -1188,7 +1189,7 @@ cs: matrix_checkbox_label: "Allow transition from %{old_status} to %{new_status}" matrix_check_all_label: "Allow all transitions" matrix_uncheck_all_label: "Disallow all transitions" - matrix_check_uncheck_all_in_row_label_html: "Toggle transitions from %{old_status} to all new statuses" + matrix_check_uncheck_all_in_row_label_html: "Přepnout přechody z %{old_status} na všechny nové stavy" matrix_check_uncheck_all_in_col_label_html: "Toggle transitions from all old statuses to %{new_status}" work_flows: index: @@ -1645,9 +1646,9 @@ cs: identity_url: "Adresa URL identity" user_preference: header_look_and_feel: "Vzhled a chování" - header_alerts: "Alerts" + header_alerts: "Upozornění" button_update_look_and_feel: "Aktualizovat vzhled a chování" - button_update_alerts: "Update alerts" + button_update_alerts: "Upravit upozornění" button_update_user_information: "Update profile" comments_sorting: "Display work package activity sorted by" disable_keyboard_shortcuts: "Disable keyboard shortcuts" @@ -1655,17 +1656,17 @@ cs: You can choose to disable default keyboard shortcuts if you use a screen reader or want to avoid accidentally triggering an action with a shortcut. dismissed_enterprise_banners: "Hidden enterprise banners" impaired: "Režim usnadnění" - auto_hide_popups: "Automatically hide success banners" - auto_hide_popups_caption: "When enabled, the green success banners will automatically disappear after 5 seconds." + auto_hide_popups: "Automaticky skrýt oznámení úspěchu" + auto_hide_popups_caption: "Pokud je tato funkce povolena, zelená oznámení úspěchu po 5 sekundách automaticky zmizí." warn_on_leaving_unsaved: "Upozornit mě při opuštění pracovního balíčku s neuloženými změnami" - increase_theme_contrast: "Increase theme contrast" - increase_contrast: "Increase contrast" - increase_contrast_caption: "Enables high-contrast mode for the chosen colour mode." - force_light_theme_contrast: "Force high-contrast when in Light mode" - force_dark_theme_contrast: "Force high-contrast when in Dark mode" - force_light_theme_contrast_caption: "Uses the high-contrast version of Light mode when automatic color mode is selected." - force_dark_theme_contrast_caption: "Uses the high-contrast version of Dark mode when automatic color mode is selected." - theme: "Color mode" + increase_theme_contrast: "Zvýšit kontrast motivu" + increase_contrast: "Zvýšit kontrast" + increase_contrast_caption: "Aktivuje režim vysokého kontrastu pro vybraný barevný režim." + force_light_theme_contrast: "Vynutit vysoký kontrast ve světlém režimu" + force_dark_theme_contrast: "Vynutit vysoký kontrast v tmavém režimu" + force_light_theme_contrast_caption: "Během automatického barevného módu použít vysoce kontrastní verzi světlého režimu." + force_dark_theme_contrast_caption: "Během automatického barevného módu použít vysoce kontrastní verzi tmavého režimu." + theme: "Barevný režim" time_zone: "Časové pásmo" mode_guideline: "Some modes will overwrite custom theme colors for accessibility and legibility. Please select Light mode for full custom theme support." daily_reminders: "Denní připomenutí" @@ -2807,14 +2808,14 @@ cs: title: "Doplňky Enterprise Edice" plan_title: "Enterprise %{plan} add-on" plan_name: "%{plan} enterprise plan" - plan_text_html: "Available starting with the %{plan_name}." + 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. hide_banner: "Hide this banner" homescreen_description: > - Enterprise plans extend the Community edition of OpenProject with additional [Enterprise add-ons](enterprise_url) and professional support, ideal for organizations running OpenProject in a mission-critical environment. - homescreen_subline: By upgrading, you will also be supporting an open source project. + 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í. + homescreen_subline: Upgradováním také podpoříte projekt s otevřeným zdrojovým kódem. baseline_comparison: description: Zvýraznit změny provedené v tomto seznamu od té doby v minulosti. benefits: @@ -2869,7 +2870,7 @@ cs: 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" - description: "Automate user management in OpenProject by seamlessly integrating external identity services like Microsoft Entra or Keycloak through our SCIM Server API. Available starting with the Enterprise corporate plan." + 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)" description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." @@ -2888,7 +2889,7 @@ cs: title: "Write internal comments only a small group can see" description: " " portfolio_management: - description: Align your projects to your strategic goals by organizing them into portfolios and programs. + description: Uspořádáním projektů do portfolií a programů je sladíte se svými strategickými cíli. teaser: title: one: "One day left of %{trial_plan} trial token" @@ -3271,10 +3272,10 @@ cs: mails_and_notifications: "E-maily a oznámení" mcp_configurations: "Model Context Protocol (MCP)" quick_add: - label: "Add…" + label: "Přidat…" my_account: access_tokens: - description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." + description: "Poskytovatelské tokeny vydává OpenProject a umožňuje tím přístup ostatním aplikacím. Klientské tokeny jsou vydávány jinými aplikacemi a umožňují OpenProjectu přistup k nim." no_results: title: "Žádné přístupové tokeny k zobrazení" description: "Všechny byly zakázány. Znovu povoleny mohou být v nabídce administrace." @@ -3288,13 +3289,13 @@ cs: client: title: "Client tokens" provider: - title: "Provider tokens" + title: "Poskytovatelské tokeny" token/api: blank_description: "There is no API token yet. You can create one using the button below." blank_title: "No API token" title: "API" table_title: "API tokens" - text_hint: "OAuth tokeny umožňují aplikacím třetích stran spojení s touto instancí OpenProjekt." + text_hint: "OAuth tokeny umožňují aplikacím třetích stran spojení s touto instancí OpenProject." static_token_name: "API token" disabled_text: "API tokeny nejsou administrátorem povoleny. Pro použití této funkce kontaktujte svého správce." add_button: "API token" @@ -3309,7 +3310,7 @@ cs: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." @@ -3317,9 +3318,9 @@ cs: blank_description: "There are no OAuth client tokens yet." blank_title: "No OAuth client tokens" failed: "An error occurred and the token couldn't be removed. Please try again later." - integration_type: "Integration type" + integration_type: "Typ integrace" table_title: "OAuth client tokens" - text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + text_hint: "Klientské tokeny OAuth umožňují této instanci OpenProject připojit se k externím aplikacím, jako jsou například úložiště souborů." title: "OAuth" remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." removed: "OAuth client token successfully removed" @@ -3652,7 +3653,7 @@ cs: label_language: "Jazyk" label_languages: "Jazyky" label_external_links: "External links" - label_locale: "Language and region" + label_locale: "Jazyk a region" label_jump_to_a_project: "Přejít na projekt..." label_jira_import: "Jira Import" label_keyword_plural: "Klíčová slova" @@ -3804,7 +3805,7 @@ cs: label_planning: "Plánování" label_please_login: "Přihlaste se prosím" label_plugins: "Pluginy" - label_portfolio_plural: "Portfolios" + label_portfolio_plural: "Portfolia" label_modules_and_plugins: "Moduly a pluginy" label_precedes: "předchází" label_preferences: "Nastavení" @@ -4355,8 +4356,8 @@ cs: permission_add_work_packages: "Přidat pracovní balíčky" permission_add_messages: "Odesílat zprávy" permission_add_project: "Vytvořit projekty" - permission_add_portfolios: "Create portfolios" - permission_add_programs: "Create programs" + permission_add_portfolios: "Vytvořit portfolia" + permission_add_programs: "Vytvořit programy" permission_add_work_package_attachments: "Přidat přílohy" permission_add_work_package_attachments_explanation: "Umožňuje přidávat přílohy bez oprávnění upravovat pracovní balíčky" permission_add_internal_comments: "Write internal comments" @@ -4437,7 +4438,7 @@ cs: permission_share_work_packages: "Sdílet pracovní balíčky" permission_manage_types: "Vyberte typy" permission_manage_own_reminders: "Vytvořit vlastní připomenutí" - permission_view_all_principals: "View all users and groups" + permission_view_all_principals: "Zobrazit všechny uživatele a skupiny" permission_view_all_principals_explanation: > Allows users to see all users and groups in the system, even if they are not members of any joined projects or groups. permission_view_project: "Zobrazit projekty" @@ -4470,20 +4471,20 @@ cs: permission_edit_project_query: "Upravit dotaz projektu" placeholders: default: "-" - templated_hint: Automatically generated through type %{type} + templated_hint: Automaticky generováno pomocí typu %{type} portfolio: count: - zero: "0 portfolios" + zero: "0 portfolií" one: "1 portfolio" - other: "%{count} portfolios" + other: "%{count} portfolií" program: count: - zero: "0 programs" + zero: "0 programů" one: "1 program" other: "%{count} programs" project: archive: - title: "Archive project" + title: "Archivovat projekt" are_you_sure: "Opravdu chcete archivovat projekt '%{name}'?" archived: "Archivováno" count: @@ -4678,7 +4679,7 @@ cs: For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximální velikost stránky API" setting_apiv3_max_page_size_instructions: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + Nastavte maximální velikost stránky, kterou bude vracet API. Nebude možné provádět API požadavky, které vracejí více hodnot na jedné stránce. setting_apiv3_max_page_size_warning: > Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentace" @@ -4686,7 +4687,7 @@ cs: setting_apiv3_docs_enabled_instructions_html: > Pokud je stránka dokumentace povolena, můžete získat interaktivní pohled na dokumentaci APIv3 pod %{link}. setting_apiv3_docs_enabled_instructions_warning: > - Please be aware that enabling the API docs on a production system may expose sensitive information or result in accidental loss of data when not being careful. We recommend to only enable this setting for development purposes. + Upozorňujeme, že povolení dokumentace API v produkčním systému může vést k odhalení citlivých informací nebo ke ztrátě dat, pokud nebudete opatrní. Doporučujeme toto nastavení povolit pouze pro účely vývoje. setting_attachment_whitelist: "Seznam povolených povolených příloh" setting_email_delivery_method: "Způsob zasílání emailu" setting_emails_salutation: "Oslovujte uživatele v e-mailech s" diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index ed9f3f821fb..2de07160ad7 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -83,8 +83,9 @@ da: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Erstat din nuværende support-token" order: "Order Enterprise on-premises edition" @@ -3195,7 +3196,7 @@ da: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 698c75f9723..f55129169d8 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -83,8 +83,9 @@ de: confirmation: "Sind Sie sicher, dass Sie diesen Enterprise-Edition Support-Token löschen möchten?" create_dialog: title: "Enterprise-Token hinzufügen" - type_token_text: "Enterprise-Token Text" + type_token_text: "Your Enterprise token text" token_placeholder: "Enterprise-Token Text hier einfügen" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Enterprise edition Support Token hochladen" replace_token: "Aktuellen Enterprise edition Support Token ersetzen" order: "Enterprise on-premises bestellen" @@ -3189,7 +3190,7 @@ de: active_tokens: "Aktive Token" blank_description: "Für Sie ist kein Zugriff auf Anwendungen von Drittanbietern konfiguriert und aktiv." blank_title: "Kein OAuth-Anwendungs-Token" - last_used_at: "Zuletzt verwendet am" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth-Anwendungs-Tokens" text_hint: "OAuth-Tokens erlauben es Drittanbieter-Anwendungen, sich mit dieser OpenProject Instanz zu verbinden." diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index d4ac91ecd91..fb67f25df61 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -83,8 +83,9 @@ el: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Αντικαταστήστε το τρέχον token υποστήριξης" order: "Order Enterprise on-premises edition" @@ -3193,7 +3194,7 @@ el: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index 0ce0e25dae7..6779dfda1f5 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -83,8 +83,9 @@ eo: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Anstataŭigu vian nunan subtenĵetonon" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ eo: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index b0a69f27d87..08dffd4f406 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -83,8 +83,9 @@ es: confirmation: "¿Seguro que desea eliminar este token de soporte de la edición Enterprise?" create_dialog: title: "Añadir token de Enterprise" - type_token_text: "Escribir texto del token de soporte" + type_token_text: "Your Enterprise token text" token_placeholder: "Pegue su token de soporte de la edición Enterprise aquí" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Cargue el token de soporte de Enterprise" replace_token: "Reemplace su token de soporte actual" order: "Solicitar Enterprise On-Premises" @@ -3194,7 +3195,7 @@ es: active_tokens: "Tokens activos" blank_description: "No hay ningún acceso a aplicaciones de terceros configurado y activo para usted." blank_title: "No hay token de aplicación OAuth" - last_used_at: "Utilizado por última vez el" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "Tokens de aplicación OAuth" text_hint: "Los tokens de aplicación OAuth permiten a las aplicaciones de terceros conectarse con esta instancia de OpenProject." diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index e1e05ece850..7f2a3ed8abf 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -83,8 +83,9 @@ et: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ et: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index 484e4a8dfb6..73d3fd29a00 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -83,8 +83,9 @@ eu: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ eu: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index fe480754ca2..b7eba19dd71 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -83,8 +83,9 @@ fa: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ fa: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index 77bfbc01ea0..b4a1ee11817 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -83,8 +83,9 @@ fi: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Korvata nykyisen tukea poletti" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ fi: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index dd370fd29da..f94b86ec54d 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -83,8 +83,9 @@ fil: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Palitan ang iyong kasulukuyang support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ fil: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 4765dc6c4d3..a9b2bad06b9 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -83,8 +83,9 @@ fr: confirmation: "Voulez-vous vraiment supprimer le jeton d'assistance de cette édition Enterprise ?" create_dialog: title: "Ajouter un jeton Enterprise" - type_token_text: "Saisissez le texte du jeton d'assistance" + type_token_text: "Your Enterprise token text" token_placeholder: "Collez votre jeton d'assistance pour l'édition Enterprise ici" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Charger un jeton de support pour la version Entreprise" replace_token: "Remplacer votre licence actuelle" order: "Commander l'édition Entreprise auto-hébergée" @@ -3195,7 +3196,7 @@ fr: active_tokens: "Jetons actifs" blank_description: "Aucun accès à une application tierce n'est configuré et actif pour vous." blank_title: "Pas de jeton d'application OAuth" - last_used_at: "Dernière utilisation à" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "Jetons d'application OAuth" text_hint: "Les jetons d'application OAuth permettent aux applications tierces de se connecter à cette instance d'OpenProject." diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index 3e6ce848aed..978ba417f87 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -83,8 +83,9 @@ he: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3309,7 +3310,7 @@ he: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index 25a8278e106..17db2f25d80 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -83,8 +83,9 @@ hi: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3195,7 +3196,7 @@ hi: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index ef943306c2a..91e626480a9 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -83,8 +83,9 @@ hr: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3253,7 +3254,7 @@ hr: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index 10524fa85f0..9ac96368459 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -83,8 +83,9 @@ hu: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Töltse fel a Vállalati Verzió támogatási tokenjét" replace_token: "A jelenlegi támogatási token lecserélése" order: "On-premises vállalati verzió megrendelése" @@ -3196,7 +3197,7 @@ hu: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 83072405743..b89c76dc52e 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -83,8 +83,9 @@ id: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Unggah sebuah token bantuan Edisi Enterprise" replace_token: "Gantilah token bantuan yang sedang digunakan" order: "Pesan Enterprise edisi di tempat" @@ -3137,7 +3138,7 @@ id: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index 263218e55f5..baef3ff2334 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -83,8 +83,9 @@ it: confirmation: "Vuoi davvero eliminare questo token di assistenza dell'Enterprise Edition?" create_dialog: title: "Aggiungi token Enterprise" - type_token_text: "Digita il testo del token di assistenza" + type_token_text: "Your Enterprise token text" token_placeholder: "Incolla il tuo token di assistenza per Enterprise edition qui" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Carica un token di assistenza per Enterprise edition" replace_token: "Sostituisci il token di assistenza attuale" order: "Ordina l'edizione Enterprise on-premises" @@ -3194,7 +3195,7 @@ it: active_tokens: "Token attivi" blank_description: "Non è configurato e attivo alcun accesso ad applicazioni di terze parti per te." blank_title: "Nessun token di applicazione OAuth" - last_used_at: "Ultimo utilizzo:" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "Token di applicazione OAuth" text_hint: "I token di applicazione OAuth consentono alle applicazioni di terze parti di connettersi con questa istanza OpenProject." diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index a5701d63353..ddd28dfdd8f 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -83,8 +83,9 @@ ja: confirmation: "このエンタープライズ版のサポートトークンを削除してもよろしいですか?" create_dialog: title: "エンタープライズトークンを追加" - type_token_text: "サポートトークンテキストを入力" + type_token_text: "Your Enterprise token text" token_placeholder: "ここにエンタープライズ・トークンを貼り付け" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "エンタープライズ版サポートのトークンをアップロードする。" replace_token: "現在のサポート トークンを置き換え" order: "オンプレミス版 Enterprise Edition を購入" @@ -3140,7 +3141,7 @@ ja: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index b35fe550e3b..288540d8c4b 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -83,8 +83,9 @@ ka: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ ka: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index 8fa479afa7f..eab6e7cd4ca 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -83,8 +83,9 @@ kk: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ kk: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 7a6138996d7..66c22a00ef4 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -83,8 +83,9 @@ ko: confirmation: "이 Enterprise Edition 지원 토큰을 삭제하시겠습니까?" create_dialog: title: "Enterprise 토큰 추가" - type_token_text: "지원 토큰 텍스트 입력" + type_token_text: "Your Enterprise token text" token_placeholder: "여기에 Enterprise Edition 지원 토큰을 붙여넣으세요" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Enterprise edition 지원 토큰을 업로드하세요." replace_token: "당신의 현재 지원 토큰을 바꾸세요." order: "Enterprise on-premises edition 주문하기" @@ -3141,7 +3142,7 @@ ko: active_tokens: "활성 토큰" blank_description: "타사 애플리케이션 액세스가 구성 및 활성화되어 있지 않습니다." blank_title: "OAuth 애플리케이션 토큰 없음" - last_used_at: "마지막 사용" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth 애플리케이션 토큰" text_hint: "OAuth 애플리케이션 토큰을 통해 타사 애플리케이션이 이 OpenProject 인스턴스와 연결할 수 있습니다." diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index a01d6ecfc08..62bfc7d70be 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -83,8 +83,9 @@ lt: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Įkelti Enterprise paramos raktą" replace_token: "Pakeisti savo esamą paramos raktą" order: "Užsisakykite Enterprise versiją pas save" @@ -3306,7 +3307,7 @@ lt: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index 47cc44a632e..95aaf4dabf0 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -83,8 +83,9 @@ lv: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3253,7 +3254,7 @@ lv: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index 53623ea7606..f70d94d9e9d 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -83,8 +83,9 @@ mn: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ mn: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 8296109015f..8a5dd90ea60 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -83,8 +83,9 @@ ms: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Muat naik token sokongan edisi Enterprise" replace_token: "Ganti token sokongan semasa anda" order: "Pesan edisi di premis Enterprise" @@ -3139,7 +3140,7 @@ ms: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index 470d4ff79fb..f5b3e178a82 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -83,8 +83,9 @@ ne: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ ne: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index 511c60b7262..3fd970fdde6 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -83,8 +83,9 @@ nl: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Uw huidige ondersteuningstoken vervangen" order: "Order Enterprise on-premises edition" @@ -3193,7 +3194,7 @@ nl: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index a8b35f450c7..44712db1b40 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -83,8 +83,9 @@ confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Last opp en Enterprise edition supportnøkkel" replace_token: "Erstatt din nåværende supporttoken" order: "Oppgradere til Enterprise on-premises-utgave" @@ -3196,7 +3197,7 @@ active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 548604fe298..67d344d76ab 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -83,8 +83,9 @@ pl: confirmation: "Czy na pewno chcesz usunąć ten token wsparcia wersji Enterprise?" create_dialog: title: "Dodaj token Enterprise" - type_token_text: "Wpisz tekst tokenu wsparcia" + type_token_text: "Your Enterprise token text" token_placeholder: "Wklej swój token wsparcia wersji Enterprise tutaj" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Wyślij swój token wsparcia wersji Enterprise" replace_token: "Wymień swój obecny token wsparcia" order: "Zamów wersję Enterprise On-Premises" @@ -3305,7 +3306,7 @@ pl: active_tokens: "Aktywne tokeny" blank_description: "Nie masz skonfigurowanego i aktywnego dostępu do aplikacji innych firm." blank_title: "Brak tokenu aplikacji OAuth" - last_used_at: "Ostatnie użycie" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "Tokeny aplikacji OAuth" text_hint: "Tokeny aplikacji OAuth pozwalają aplikacjom innych firm na łączenie się z tym wystąpieniem OpenProject." diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 9efb1eb45a9..c43e7284959 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -83,8 +83,9 @@ pt-BR: confirmation: "Tem certeza de que deseja excluir este token de suporte da edição Enterprise?" create_dialog: title: "Adicionar token Enterprise" - type_token_text: "Digitar texto do token de suporte" + type_token_text: "Your Enterprise token text" token_placeholder: "Colar seu token de suporte da edição Enterprise" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Carregar um token de suporte da edição Enterprise " replace_token: "Substitua seu token atual de suporte" order: "Solicitar edição Enterprise local" @@ -3194,7 +3195,7 @@ pt-BR: active_tokens: "Tokens ativos" blank_description: "Não há nenhum acesso ativo de aplicativos de terceiros configurado para sua conta." blank_title: "Sem token de aplicativo OAuth" - last_used_at: "Último uso em" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "Tokens de aplicativo OAuth" text_hint: "Tokens de aplicativo OAuth permitem que aplicativos de terceiros se conectem a esta instância do OpenProject." diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index de478f1af12..2ac005c3687 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -83,8 +83,9 @@ pt-PT: confirmation: "Tem a certeza de que quer eliminar este token de apoio da edição Enterprise?" create_dialog: title: "Adicionar token Enterprise" - type_token_text: "Digite o texto do token de apoio" + type_token_text: "Your Enterprise token text" token_placeholder: "Cole aqui o seu token de apoio da edição Enterprise" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Carregar um token de suporte da edição Enterprise" replace_token: "Substituir o seu token de suporte atual" order: "Encomendar a edição Enterprise on-premises" @@ -3194,7 +3195,7 @@ pt-PT: active_tokens: "Tokens ativos" blank_description: "Não existe um acesso a aplicações de terceiros configurado e ativo para si." blank_title: "Nenhum token de aplicação OAuth" - last_used_at: "Data de última utilização" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "Tokens de aplicação OAuth" text_hint: "Os tokens de aplicação OAuth permitem que aplicações de terceiros se liguem a esta instância do OpenProject." diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index 8e15ef7a082..be83c108537 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -83,8 +83,9 @@ ro: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Încărcacă un token de suport pentru ediția Enterprise" replace_token: "Înlocuiți tokenul de suport actual" order: "Comandă ediția Enterprise on-premise" @@ -3253,7 +3254,7 @@ ro: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index dc9608a7859..584135cdf40 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -83,8 +83,9 @@ ru: confirmation: "Вы уверены, что хотите удалить этот токен поддержки корпоративной версии?" create_dialog: title: "Добавить корпоративный токен" - type_token_text: "Введите текст токена поддержки" + type_token_text: "Your Enterprise token text" token_placeholder: "Вставьте ваш токен поддержки корпоративной версии здесь" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Загрузить токен поддержки корпоративной версии" replace_token: "Замените ваш текущий маркер поддержки" order: "Закажите корпоративную версию" @@ -3307,7 +3308,7 @@ ru: active_tokens: "Активные токены" blank_description: "Для Вас не будет настроен и активен доступ к сторонним приложениям." blank_title: "Нет токена приложения OAuth" - last_used_at: "Последний раз использовался в" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "Токены приложения OAuth" text_hint: "Токены приложений OAuth позволяют сторонним приложениям подключаться к данному экземпляру OpenProject." diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index d0b6bcfd28f..b77984ac9cc 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -83,8 +83,9 @@ rw: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ rw: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index c41955d2761..90901aad9f3 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -83,8 +83,9 @@ si: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "ඔබගේ වර්තමාන ආධාරක ටෝකනය ප්රතිස්ථාපනය කරන්න" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ si: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index f581c585f27..9cdebf34ec4 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -83,8 +83,9 @@ sk: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Nahraďte aktuálny token podpory" order: "Order Enterprise on-premises edition" @@ -3309,7 +3310,7 @@ sk: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 7f14604575c..4abbb9ef5df 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -83,8 +83,9 @@ sl: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Zamenjajte svoj trenutni podporni žeton" order: "Order Enterprise on-premises edition" @@ -3308,7 +3309,7 @@ sl: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index cbc9f509c02..ab1c872c6cc 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -83,8 +83,9 @@ sr: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3253,7 +3254,7 @@ sr: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index d3db4944847..63b310afc06 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -83,8 +83,9 @@ sv: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Ladda upp en supporttoken för Enterprise-utgåvan" replace_token: "Ersätta din nuvarande support-nyckel" order: "Beställ Enterprise on-premise-utgåva" @@ -3197,7 +3198,7 @@ sv: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index f92c193127c..bee2e4107d8 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -83,8 +83,9 @@ th: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3141,7 +3142,7 @@ th: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index c0646fc894f..497bafc807f 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -83,8 +83,9 @@ tr: confirmation: "Bu Enterprise sürümü destek belirtecini silmek istediğinizden emin misiniz?" create_dialog: title: "Kurumsal belirteç ekleme" - type_token_text: "Tür desteği anahtar metni" + type_token_text: "Your Enterprise token text" token_placeholder: "Enterprise sürümü destek anahtarınızı buraya yapıştırın" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Bir Enterprise sürümü destek belirteci yükleyin" replace_token: "Geçerli destek anahtarını değiştirin" order: "Kurumsal on-premises sürümü sipariş edin" @@ -3197,7 +3198,7 @@ tr: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index 2256af169ae..5360e19eb67 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -83,8 +83,9 @@ uk: confirmation: "Справді видалити цей маркер підтримки версії Enterprise?" create_dialog: title: "Додати маркер Enterprise" - type_token_text: "Введіть текст маркера підтримки" + type_token_text: "Your Enterprise token text" token_placeholder: "Вставте тут свій маркер підтримки версії Enterprise" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Додати маркер підтримки версії Enterprise" replace_token: "Замініть поточний маркер підтримки" order: "Замовте локальну версію Enterprise" @@ -3303,7 +3304,7 @@ uk: active_tokens: "Активні маркери" blank_description: "Для вас не налаштовано й не активовано доступ до сторонніх додатків." blank_title: "Немає маркера додатка OAuth" - last_used_at: "Востаннє використано о" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "Маркери додатків OAuth" text_hint: "Маркери додатків OAuth дають змогу стороннім додаткам обмінюватися даними із цим екземпляром OpenProject." diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index aaa10a6c359..aeb71161bef 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -83,8 +83,9 @@ uz: confirmation: "Are you sure you want to delete this Enterprise edition support token?" create_dialog: title: "Add Enterprise token" - type_token_text: "Type support token text" + 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)." add_token: "Upload an Enterprise edition support token" replace_token: "Replace your current support token" order: "Order Enterprise on-premises edition" @@ -3197,7 +3198,7 @@ uz: active_tokens: "Active tokens" blank_description: "There is no third-party application access configured and active for you." blank_title: "No OAuth application token" - last_used_at: "Last used at" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth application tokens" text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index cc94b335652..83f91e38516 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -83,8 +83,9 @@ vi: confirmation: "Bạn có chắc chắn muốn xóa mã thông báo hỗ trợ phiên bản Doanh nghiệp này không?" create_dialog: title: "Thêm mã thông báo doanh nghiệp" - type_token_text: "Nhập văn bản mã thông báo hỗ trợ" + type_token_text: "Your Enterprise token text" token_placeholder: "Dán mã thông báo hỗ trợ phiên bản Enterprise của bạn vào đây" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "Tải lên mã thông báo hỗ trợ phiên bản Enterprise" replace_token: "Thay thế support token hiện tại của bạn" order: "Đặt mua phiên bản tại chỗ của Enterprise" @@ -3139,7 +3140,7 @@ vi: active_tokens: "Mã thông báo hoạt động" blank_description: "Không có quyền truy cập ứng dụng của bên thứ ba nào được định cấu hình và hoạt động cho bạn." blank_title: "Không có mã thông báo ứng dụng OAuth" - last_used_at: "Được sử dụng lần cuối vào lúc" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "Mã thông báo ứng dụng OAuth" text_hint: "Mã thông báo ứng dụng OAuth cho phép ứng dụng của bên thứ ba kết nối với phiên bản OpenProject này." diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index d9ec2cd7812..5ecafe19314 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -83,8 +83,9 @@ zh-CN: confirmation: "确定要删除此企业版支持令牌吗?" create_dialog: title: "添加企业令牌" - type_token_text: "输入支持令牌文本" + type_token_text: "Your Enterprise token text" token_placeholder: "在此处粘贴您的企业版支持令牌" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "上传企业版支持令牌" replace_token: "替换您当前的支持令牌" order: "订购本地部署的 Enterprise edition" @@ -3137,7 +3138,7 @@ zh-CN: active_tokens: "有效令牌" blank_description: "没有为您配置和激活第三方应用程序访问权限。" blank_title: "没有 OAuth 应用程序令牌" - last_used_at: "最近使用时间" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth 应用程序令牌" text_hint: "OAuth 应用程序令牌允许第三方应用程序与此 OpenProject 实例关联。" diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 214bb62ac17..662cf98e277 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -83,8 +83,9 @@ zh-TW: confirmation: "您確定要刪除這個企業版支援令牌嗎?" create_dialog: title: "新增企業版令牌" - type_token_text: "輸入企業版令牌密碼" + type_token_text: "Your Enterprise token text" token_placeholder: "在此貼上您的企業版所需的令牌" + token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "上傳企業版所需令牌(Token)" replace_token: "替換當前令牌(Token)" order: "升級至地端企業版" @@ -3137,7 +3138,7 @@ zh-TW: active_tokens: "有效令牌" blank_description: "沒有為您設定和啟用第三方應用程式存取。" blank_title: "沒有 OAuth 應用程式令牌" - last_used_at: "最後使用於" + last_refreshed_at: "Last refreshed at" title: "OAuth" table_title: "OAuth 應用程式令牌" text_hint: "OAuth 應用程式令牌允許第三方應用程式與此 OpenProject 範例連線。" diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml index f31f03d363c..f5a7fbc7a36 100644 --- a/modules/backlogs/config/locales/crowdin/cs.yml +++ b/modules/backlogs/config/locales/crowdin/cs.yml @@ -26,7 +26,7 @@ cs: activerecord: attributes: sprint: - duration: "Sprint duration" + duration: "Doba trvání sprintu" work_package: position: "Pozice" story_points: "Body příběhu" diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 91d3fd5672c..7c514e3008f 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -80,7 +80,7 @@ de: label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" - other: "%{count} stories in backlog" + other: "%{count} Geschichten im Backlog" backlog_menu_component: label_actions: "Backlog actions" action_menu: diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index c656ca15357..ac9edfa6e5e 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -585,13 +585,13 @@ ru: label_backlog_clear: "Очистить бэклог" label_backlog_clear_button: "Очистить все" text_backlog_clear_error: "При попытке очистить бэклог произошла одна или несколько ошибок." - label_agenda_backlog: "Накопившееся отставание в повестке дня" + label_agenda_backlog: "Бэклог повестки" text_agenda_backlog: > Этот список невыполненных работ уникален для данного разового собрания. Вы можете перетаскивать элементы, чтобы добавлять или удалять их из повестки дня собрания. label_agenda_backlog_clear_title: "Очистить бэклог по повестке дня?" text_agenda_backlog_clear_description: > Вы уверены, что хотите удалить все пункты повестки дня? Это действие необратимо. - label_series_backlog: "Бэклог серий" + label_series_backlog: "Бэклог повестки серии совещаний" text_series_backlog: > Общий бэклог для всех совещаний серии. Вы можете добавлять и удалять элементы в конкретное совещание при помощи перетаскивания. label_series_backlog_clear_title: "Очистить бэклог серии?" diff --git a/modules/two_factor_authentication/config/locales/crowdin/cs.yml b/modules/two_factor_authentication/config/locales/crowdin/cs.yml index 465f1393495..ac213809b6a 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/cs.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/cs.yml @@ -138,7 +138,7 @@ cs: text_cannot_scan: | Pokud nemůžete naskenovat kód, můžete zadat položku ručně pomocí následujících údajů: description: | - Use a one-time code generated by an authenticator like Authy or Google Authenticator. + Použijte jednorázový kód vygenerovaný autentizační aplikací jako je Authy nebo Google Authenticator. sms: title: "Mobilní zařízení" redacted_identifier: "Mobilní zařízení (%{redacted_number})" From 7a5605230a73a1f6f6295ed5ef0698b092b7e422 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 05:33:50 +0000 Subject: [PATCH 034/334] Bump carrierwave_direct from 2.1.0 to 3.0.0 Bumps [carrierwave_direct](https://github.com/dwilkie/carrierwave_direct) from 2.1.0 to 3.0.0. - [Changelog](https://github.com/dwilkie/carrierwave_direct/blob/master/Changelog.md) - [Commits](https://github.com/dwilkie/carrierwave_direct/commits) --- updated-dependencies: - dependency-name: carrierwave_direct dependency-version: 3.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 3d4029b0ae3..06c25a53308 100644 --- a/Gemfile +++ b/Gemfile @@ -200,7 +200,7 @@ gem "rack-timeout", "~> 0.7.0", require: "rack/timeout/base" gem "nokogiri", "~> 1.19.1" gem "carrierwave", "~> 2.2.6" -gem "carrierwave_direct", "~> 2.1.0" +gem "carrierwave_direct", "~> 3.0.0" gem "fog-aws" gem "aws-sdk-core", "~> 3.241" diff --git a/Gemfile.lock b/Gemfile.lock index 2fe448d9173..b152ef4fe90 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -416,8 +416,8 @@ GEM marcel (~> 1.0.0) mini_mime (>= 0.1.3) ssrf_filter (~> 1.0) - carrierwave_direct (2.1.0) - carrierwave (>= 1.0.0) + carrierwave_direct (3.0.0) + carrierwave (>= 2.2.0) fog-aws cbor (0.5.10.1) cgi (0.5.1) @@ -1585,7 +1585,7 @@ DEPENDENCIES capybara-screenshot (~> 1.0.17) capybara_accessible_selectors! carrierwave (~> 2.2.6) - carrierwave_direct (~> 2.1.0) + carrierwave_direct (~> 3.0.0) climate_control closure_tree (~> 9.6.0) colored2 @@ -1841,7 +1841,7 @@ CHECKSUMS capybara-screenshot (1.0.27) sha256=afa1896cc23df77be1774e8d3b3ce3953bf060aeaa04ff87607b5daf689174f2 capybara_accessible_selectors (0.15.0) carrierwave (2.2.6) sha256=cd9b6108fc7544e97e7fbcc561bd319a09f23c96816fdd0df8f2f45ffdc0dac3 - carrierwave_direct (2.1.0) sha256=b0d5c19c1d17a05940e488cff644a3b2946422d6d494b2174b48f6a90c5dddbf + carrierwave_direct (3.0.0) sha256=da4105ec7beea2687817b95ad95181be3d657248ec1cb5a0e5c35a45b176fc2f cbor (0.5.10.1) sha256=79cdf79f18dcd9ee97e0b849c6d573e5a2e3ddc1954d180f384d6ed2612b6df0 cgi (0.5.1) sha256=e93fcafc69b8a934fe1e6146121fa35430efa8b4a4047c4893764067036f18e9 childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec From 9561246fb1ded79e93139cdc089f7bf6ebd93f07 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 11 Feb 2026 14:36:41 +0100 Subject: [PATCH 035/334] [#71252] First draft for a new sprint model --- .../new_sprint_dialog_component.html.erb | 72 +++++++++++++++++++ .../backlogs/new_sprint_dialog_component.rb | 47 ++++++++++++ .../new_sprint_form_component.html.erb | 55 ++++++++++++++ .../backlogs/new_sprint_form_component.rb | 59 +++++++++++++++ .../app/controllers/rb_sprints_controller.rb | 11 +++ .../app/forms/backlogs/sprints/dates_form.rb | 63 ++++++++++++++++ .../forms/backlogs/sprints/details_form.rb | 52 ++++++++++++++ .../views/rb_master_backlogs/index.html.erb | 31 +++++--- modules/backlogs/config/routes.rb | 11 +++ .../lib/open_project/backlogs/engine.rb | 7 ++ 10 files changed, 398 insertions(+), 10 deletions(-) create mode 100644 modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb create mode 100644 modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb create mode 100644 modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb create mode 100644 modules/backlogs/app/components/backlogs/new_sprint_form_component.rb create mode 100644 modules/backlogs/app/forms/backlogs/sprints/dates_form.rb create mode 100644 modules/backlogs/app/forms/backlogs/sprints/details_form.rb diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb new file mode 100644 index 00000000000..9315fa2c03f --- /dev/null +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb @@ -0,0 +1,72 @@ +<%#-- 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( + title: "New sprint", + size: :large, + id: Backlogs::NewSprintDialogComponent::DIALOG_ID)) do |d| + d.with_header(variant: :large) + + d.with_body do + render( + Backlogs::NewSprintFormComponent.new( + sprint: @sprint + ) + ) + end + + d.with_footer do + component_collection do |buttons| + buttons.with_component( + Primer::Beta::Button.new( + data: { + "close-dialog-id": Backlogs::NewSprintDialogComponent::DIALOG_ID + } + ) + ) do + t("button_cancel") + end + + buttons.with_component( + Primer::Beta::Button.new( + scheme: :primary, + form: Backlogs::NewSprintDialogComponent::FORM_ID, + data: { turbo: true }, + type: :submit + ) + ) do + t("button_save") + end + end + end + end +%> + diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb new file mode 100644 index 00000000000..60a7388f75c --- /dev/null +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb @@ -0,0 +1,47 @@ +# 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 + class NewSprintDialogComponent < ApplicationComponent + DIALOG_ID = "new-sprint-dialog" + FORM_ID = "new-sprint-dialog-form" + FOOTER_ID = "new-sprint-dialog-footer" + + include ApplicationHelper + include OpTurbo::Streamable + include OpPrimer::ComponentHelpers + + def initialize(sprint:) + super + + @sprint = sprint + end + end +end diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb new file mode 100644 index 00000000000..90a89eb520b --- /dev/null +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb @@ -0,0 +1,55 @@ +<%#-- 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. + +++#%> + +<%= + component_wrapper do + primer_form_with( + id: Backlogs::NewSprintFormComponent::FORM_ID, + model: @sprint, + method: :post, + # url: project_work_package_meeting_agenda_items_path(@work_package.project, @work_package), + url: "", + data: data_attributes + ) do |f| + flex_layout(mb: 3) do |flex| + flex.with_row do + if @base_errors&.any? + render(Primer::Alpha::Banner.new(mb: 3, icon: :stop, scheme: :danger)) { @base_errors.join("\n") } + end + end + flex.with_row(mb: 3) do + render Backlogs::Sprints::DetailsForm.new(f) + end + flex.with_row(mb: 3) do + render Backlogs::Sprints::DatesForm.new(f) + end + end + end + end +%> diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb b/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb new file mode 100644 index 00000000000..a7d9bdb4574 --- /dev/null +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.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 Backlogs + class NewSprintFormComponent < ApplicationComponent + include ApplicationHelper + include OpTurbo::Streamable + include OpPrimer::ComponentHelpers + + FORM_ID = NewSprintDialogComponent::FORM_ID + + def initialize(sprint:, base_errors: nil) + super + + @sprint = sprint + @base_errors = base_errors + end + + private + + def data_attributes + { + # controller: "refresh-on-form-changes", + # "refresh-on-form-changes-target": "form", + # "refresh-on-form-changes-turbo-stream-url-value": refresh_form_project_work_package_meeting_agenda_items_path( + # @work_package.project, + # @work_package + # ) + } + end + end +end diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index 60abfe686dc..2a99712e8b2 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -31,6 +31,17 @@ class RbSprintsController < RbApplicationController include OpTurbo::ComponentStream + skip_before_action :load_sprint_and_project, only: %i[new_dialog] + + def new_dialog + @project = Project.visible.find(params[:project_id]) + + # TODO: check sprint permissions + @sprint = Agile::Sprint.new(project: @project) + + respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint) + end + def edit_name update_header_component_via_turbo_stream(state: :edit) respond_with_turbo_streams diff --git a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb new file mode 100644 index 00000000000..99aaf999f8f --- /dev/null +++ b/modules/backlogs/app/forms/backlogs/sprints/dates_form.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. +#++ + +module Backlogs + module Sprints + class DatesForm < ApplicationForm + form do |f| + f.group(layout: :horizontal) do |dates| + dates.single_date_picker( + name: :start_date, + label: attribute_name(:start_date), + placeholder: attribute_name(:start_date), + input_width: :small + ) + dates.single_date_picker( + name: :finish_date, + label: attribute_name(:finish_date), + placeholder: attribute_name(:finish_date), + input_width: :small + ) + dates.text_field( + name: :duration, + label: attribute_name(:duration), + type: :number, + input_width: :xsmall, + inset: true, + disabled: true, + trailing_visual: { + text: { text: I18n.t(:label_day_plural) } + } + ) + end + end + end + end +end diff --git a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb new file mode 100644 index 00000000000..5dfff62cb77 --- /dev/null +++ b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb @@ -0,0 +1,52 @@ +# 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 + module Sprints + class DetailsForm < ApplicationForm + form do |f| + f.text_field( + label: attribute_name(:name), + name: :name, + required: true, + input_width: :large + ) + + f.text_area( + label: attribute_name(:goal), + name: :goal, + required: false, + input_width: :large, + rows: 3 + ) + end + end + end +end diff --git a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb index ee5f07a80e8..9ed580f46bd 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb @@ -45,16 +45,27 @@ See COPYRIGHT and LICENSE files for more details. %> <%= render(Primer::OpenProject::SubHeader.new) do |subheader| - subheader.with_action_button( - scheme: :primary, - leading_icon: :plus, - label: I18n.t(:label_version_new), - tag: :a, - href: url_for({ controller: "/versions", action: "new", project_id: @project }) - ) do - t("activerecord.models.version") - end - end %> + subheader.with_action_button( + scheme: :primary, + leading_icon: :plus, + label: I18n.t(:label_version_new), + tag: :a, + href: url_for({ controller: "/versions", action: "new", project_id: @project }) + ) do + t("activerecord.models.version") + end + + subheader.with_action_button( + scheme: :primary, + leading_icon: :plus, + label: I18n.t(:label_sprint_new), + tag: :a, + href: new_dialog_project_sprints_path(@project), + data: { controller: "async-dialog" } + ) do + t("activerecord.models.sprint") + end + end %> <% end %> <% content_for :content_body do %> diff --git a/modules/backlogs/config/routes.rb b/modules/backlogs/config/routes.rb index ee9d1aba906..89ca06568c4 100644 --- a/modules/backlogs/config/routes.rb +++ b/modules/backlogs/config/routes.rb @@ -27,6 +27,17 @@ #++ Rails.application.routes.draw do + # Routes for the new Agile::Sprint + # Scoped under projects for permissions: + resources :projects, only: [] do + resources :sprints, controller: :rb_sprints, only: %i[] do + collection do + get :new_dialog + end + end + end + + # Legacy routes scope "", as: "backlogs" do scope "projects/:project_id", as: "project" do resources :backlogs, controller: :rb_master_backlogs, only: :index do diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index 18210c6e1e0..8fcb2e1a055 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -103,6 +103,13 @@ module OpenProject::Backlogs }, permissible_on: :project, require: :member + + permission :create_sprints, + { + rb_sprints: %i[new_dialog] + }, + permissible_on: :project, + require: :member end menu :project_menu, From 4a3bbb66bf54eb68b9372fcc89ca6a4881648d7c Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 16 Feb 2026 08:49:09 +0100 Subject: [PATCH 036/334] [#71252] Use date field for date picker within modal --- modules/backlogs/app/forms/backlogs/sprints/dates_form.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb index 99aaf999f8f..839858804d4 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb @@ -33,16 +33,20 @@ module Backlogs class DatesForm < ApplicationForm form do |f| f.group(layout: :horizontal) do |dates| - dates.single_date_picker( + dates.text_field( name: :start_date, + type: :date, label: attribute_name(:start_date), placeholder: attribute_name(:start_date), + required: true, input_width: :small ) - dates.single_date_picker( + dates.text_field( name: :finish_date, + type: :date, label: attribute_name(:finish_date), placeholder: attribute_name(:finish_date), + required: true, input_width: :small ) dates.text_field( From 665cd549cb46bce758ecbf7976c1cc76db072387 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 16 Feb 2026 17:35:46 +0100 Subject: [PATCH 037/334] [#71252] Draft for create action and service --- .../new_sprint_form_component.html.erb | 4 +- .../app/contracts/sprints/base_contract.rb | 41 +++++++++++++++ .../app/contracts/sprints/create_contract.rb | 45 +++++++++++++++++ .../app/controllers/rb_sprints_controller.rb | 41 ++++++++++++++- .../forms/backlogs/sprints/details_form.rb | 14 +++--- .../app/services/sprints/create_service.rb | 35 +++++++++++++ .../sprints/set_attributes_service.rb | 50 +++++++++++++++++++ modules/backlogs/config/routes.rb | 1 + .../lib/open_project/backlogs/engine.rb | 2 +- 9 files changed, 222 insertions(+), 11 deletions(-) create mode 100644 modules/backlogs/app/contracts/sprints/base_contract.rb create mode 100644 modules/backlogs/app/contracts/sprints/create_contract.rb create mode 100644 modules/backlogs/app/services/sprints/create_service.rb create mode 100644 modules/backlogs/app/services/sprints/set_attributes_service.rb diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb index 90a89eb520b..0cbed599a51 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb @@ -32,9 +32,9 @@ See COPYRIGHT and LICENSE files for more details. primer_form_with( id: Backlogs::NewSprintFormComponent::FORM_ID, model: @sprint, + scope: :sprint, method: :post, - # url: project_work_package_meeting_agenda_items_path(@work_package.project, @work_package), - url: "", + url: project_sprints_path(@sprint.project_id), data: data_attributes ) do |f| flex_layout(mb: 3) do |flex| diff --git a/modules/backlogs/app/contracts/sprints/base_contract.rb b/modules/backlogs/app/contracts/sprints/base_contract.rb new file mode 100644 index 00000000000..769358aeeb1 --- /dev/null +++ b/modules/backlogs/app/contracts/sprints/base_contract.rb @@ -0,0 +1,41 @@ +# 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 Sprints + class BaseContract < ::ModelContract + def self.model + Agile::Sprint + end + + attribute :name + attribute :project_id + attribute :start_date + attribute :finish_date + end +end diff --git a/modules/backlogs/app/contracts/sprints/create_contract.rb b/modules/backlogs/app/contracts/sprints/create_contract.rb new file mode 100644 index 00000000000..c80ecedac04 --- /dev/null +++ b/modules/backlogs/app/contracts/sprints/create_contract.rb @@ -0,0 +1,45 @@ +# 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 Sprints + class CreateContract < BaseContract + validate :user_allowed_to_create + + private + + def user_allowed_to_create + return if model.project.nil? + + unless user.allowed_in_project?(:create_sprints, model.project) + errors.add :base, :error_unauthorized + end + end + end +end diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index 2a99712e8b2..b7ddc7930ca 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -31,7 +31,7 @@ class RbSprintsController < RbApplicationController include OpTurbo::ComponentStream - skip_before_action :load_sprint_and_project, only: %i[new_dialog] + skip_before_action :load_sprint_and_project, only: %i[new_dialog create] def new_dialog @project = Project.visible.find(params[:project_id]) @@ -42,6 +42,31 @@ class RbSprintsController < RbApplicationController respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint) end + def create + # @project = Project.visible.find(params[:project_id]) + # @sprint = Agile::Sprint.new(project: @project) + # puts "FOOO ==============================" + # pp permitted + # pp @sprint + # pp @sprint.valid? + # pp @sprint.errors + + # TODO: check sprint permissions + call = Sprints::CreateService + .new(user: current_user) + .call(attributes: agile_sprint_params.merge(project_id: params[:project_id])) + + sprint = call.result + + if call.success? + flash[:notice] = I18n.t(:notice_successful_create) + else + update_new_sprint_form_component_via_turbo_stream(sprint:, base_errors: call.errors[:base]) + end + + respond_with_turbo_streams + end + def edit_name update_header_component_via_turbo_stream(state: :edit) respond_with_turbo_streams @@ -88,6 +113,16 @@ class RbSprintsController < RbApplicationController ) end + def update_new_sprint_form_component_via_turbo_stream(sprint:, base_errors: nil) + update_via_turbo_stream( + component: Backlogs::NewSprintFormComponent.new( + sprint:, + base_errors: + ), + status: :bad_request + ) + end + # Overrides load_sprint_and_project to load the sprint from :id instead of :sprint_id def load_sprint_and_project @sprint = Sprint.visible.find(params[:id]) @@ -99,4 +134,8 @@ class RbSprintsController < RbApplicationController def sprint_params params.expect(sprint: %i[name start_date effective_date]) end + + def agile_sprint_params + params.expect(sprint: %i[name start_date finish_date]) + end end diff --git a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb index 5dfff62cb77..4c1bd23a2e0 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb @@ -39,13 +39,13 @@ module Backlogs input_width: :large ) - f.text_area( - label: attribute_name(:goal), - name: :goal, - required: false, - input_width: :large, - rows: 3 - ) + # f.text_area( + # label: attribute_name(:goal), + # name: :goal, + # required: false, + # input_width: :large, + # rows: 3 + # ) end end end diff --git a/modules/backlogs/app/services/sprints/create_service.rb b/modules/backlogs/app/services/sprints/create_service.rb new file mode 100644 index 00000000000..69022047b22 --- /dev/null +++ b/modules/backlogs/app/services/sprints/create_service.rb @@ -0,0 +1,35 @@ +# 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. +#++ + +class Sprints::CreateService < ::BaseServices::Create + def instance_class + Agile::Sprint + end +end diff --git a/modules/backlogs/app/services/sprints/set_attributes_service.rb b/modules/backlogs/app/services/sprints/set_attributes_service.rb new file mode 100644 index 00000000000..d63cc33cc4e --- /dev/null +++ b/modules/backlogs/app/services/sprints/set_attributes_service.rb @@ -0,0 +1,50 @@ +# 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 Sprints + class SetAttributesService < ::BaseServices::SetAttributes + def set_default_attributes(_params) + model.change_by_system do + model.name ||= determine_sequence_name_from_previous_sprint + + model.status ||= "in_planning" + model.sharing ||= "none" + end + end + + private + + def determine_sequence_name_from_previous_sprint + # TODO: create name if applicable + # TODO 2: is this the right spot? It should be generated earlier so that it's prepopulated in the form. + "Sprint name" + end + end +end diff --git a/modules/backlogs/config/routes.rb b/modules/backlogs/config/routes.rb index 89ca06568c4..98fabce3db2 100644 --- a/modules/backlogs/config/routes.rb +++ b/modules/backlogs/config/routes.rb @@ -33,6 +33,7 @@ Rails.application.routes.draw do resources :sprints, controller: :rb_sprints, only: %i[] do collection do get :new_dialog + post :create end end end diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index 8fcb2e1a055..3c0ebcceee2 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -106,7 +106,7 @@ module OpenProject::Backlogs permission :create_sprints, { - rb_sprints: %i[new_dialog] + rb_sprints: %i[new_dialog create] }, permissible_on: :project, require: :member From c17cf475e109ffcb4f79db00ec9633cde0c44e56 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Tue, 17 Feb 2026 11:30:44 +0100 Subject: [PATCH 038/334] [#71252] Generate sprint name from predecessor --- .../app/controllers/rb_sprints_controller.rb | 17 +++++------------ .../forms/backlogs/sprints/details_form.rb | 1 + modules/backlogs/app/models/agile/sprint.rb | 19 +++++++++++++++++++ .../sprints/set_attributes_service.rb | 10 ---------- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index b7ddc7930ca..c83d981d169 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -35,23 +35,16 @@ class RbSprintsController < RbApplicationController def new_dialog @project = Project.visible.find(params[:project_id]) - - # TODO: check sprint permissions @sprint = Agile::Sprint.new(project: @project) + if (generated_name = @sprint.sprint_name_from_predecessor).present? + @sprint.name = generated_name + end + respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint) end def create - # @project = Project.visible.find(params[:project_id]) - # @sprint = Agile::Sprint.new(project: @project) - # puts "FOOO ==============================" - # pp permitted - # pp @sprint - # pp @sprint.valid? - # pp @sprint.errors - - # TODO: check sprint permissions call = Sprints::CreateService .new(user: current_user) .call(attributes: agile_sprint_params.merge(project_id: params[:project_id])) @@ -59,7 +52,7 @@ class RbSprintsController < RbApplicationController sprint = call.result if call.success? - flash[:notice] = I18n.t(:notice_successful_create) + render_success_flash_message_via_turbo_stream(message: I18n.t(:notice_successful_update)) else update_new_sprint_form_component_via_turbo_stream(sprint:, base_errors: call.errors[:base]) end diff --git a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb index 4c1bd23a2e0..ea9f2ae3e73 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb @@ -36,6 +36,7 @@ module Backlogs label: attribute_name(:name), name: :name, required: true, + autofocus: true, input_width: :large ) diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index d236ca0bc74..ece6fad20ff 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -69,6 +69,25 @@ module Agile # TODO: validate sharing is set to an allowed value, e.g. only admins may share systemwide (#71374, #71253) # TODO: implement sharing logic once it has been defined (#71374) + def sprint_name_from_predecessor + return name unless new_record? + + predecessor = project.sprints.last + + if predecessor.nil? + # There is no predecessor, so we return a default name for the first sprint. + "#{I18n.t('activerecord.models.sprint')} 1" + elsif (match = predecessor.name.match(/(.*)\s(\d+)\z/)) + # If the predecessor's name ends with a number, increment that number for the new sprint's name. + # E.g., if the previous sprint was called "Be ambitious 42", the next one will be "Be ambitious 43". + "#{match[1]} #{match[2].to_i + 1}" + else + # The predecessor's name doesn't end with a number. The user has chosen a custom name. Do not assume + # how the next sprint should be called. Return an empty string and let the user choose. + "" + end + end + private # TODO: consider moving this validation to the database level to ensure data integrity. diff --git a/modules/backlogs/app/services/sprints/set_attributes_service.rb b/modules/backlogs/app/services/sprints/set_attributes_service.rb index d63cc33cc4e..38bf8802c76 100644 --- a/modules/backlogs/app/services/sprints/set_attributes_service.rb +++ b/modules/backlogs/app/services/sprints/set_attributes_service.rb @@ -32,19 +32,9 @@ module Sprints class SetAttributesService < ::BaseServices::SetAttributes def set_default_attributes(_params) model.change_by_system do - model.name ||= determine_sequence_name_from_previous_sprint - model.status ||= "in_planning" model.sharing ||= "none" end end - - private - - def determine_sequence_name_from_previous_sprint - # TODO: create name if applicable - # TODO 2: is this the right spot? It should be generated earlier so that it's prepopulated in the form. - "Sprint name" - end end end From af2f501347f40577e8df3b8db1fd0696b94469ab Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 18 Feb 2026 13:27:35 +0100 Subject: [PATCH 039/334] [#71252] Calculate duration when setting sprint dates --- .../backlogs/new_sprint_form_component.rb | 9 +++------ .../app/controllers/rb_sprints_controller.rb | 19 ++++++++++++++++++- .../app/forms/backlogs/sprints/dates_form.rb | 10 ++++++++-- modules/backlogs/app/models/agile/sprint.rb | 10 ++++++++++ modules/backlogs/config/routes.rb | 1 + .../lib/open_project/backlogs/engine.rb | 2 +- 6 files changed, 41 insertions(+), 10 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb b/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb index a7d9bdb4574..c4171ad193a 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb @@ -47,12 +47,9 @@ module Backlogs def data_attributes { - # controller: "refresh-on-form-changes", - # "refresh-on-form-changes-target": "form", - # "refresh-on-form-changes-turbo-stream-url-value": refresh_form_project_work_package_meeting_agenda_items_path( - # @work_package.project, - # @work_package - # ) + controller: "refresh-on-form-changes", + "refresh-on-form-changes-target": "form", + "refresh-on-form-changes-turbo-stream-url-value": refresh_form_project_sprints_path(@sprint.project_id) } end end diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index c83d981d169..7c49f38a9f9 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -31,7 +31,7 @@ class RbSprintsController < RbApplicationController include OpTurbo::ComponentStream - skip_before_action :load_sprint_and_project, only: %i[new_dialog create] + skip_before_action :load_sprint_and_project, only: %i[new_dialog create refresh_form] def new_dialog @project = Project.visible.find(params[:project_id]) @@ -44,6 +44,23 @@ class RbSprintsController < RbApplicationController respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint) end + def refresh_form + @project = Project.visible.find(params[:project_id]) + @sprint = Agile::Sprint.new(project: @project) + + call = Sprints::SetAttributesService.new( + user: current_user, + model: @sprint, + contract_class: EmptyContract + ).call(attributes: agile_sprint_params.merge(project_id: params[:project_id])) + + sprint = call.result + + update_via_turbo_stream(component: Backlogs::NewSprintFormComponent.new(sprint:)) + + respond_with_turbo_streams + end + def create call = Sprints::CreateService .new(user: current_user) diff --git a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb index 839858804d4..7b85c66d109 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb @@ -39,7 +39,10 @@ module Backlogs label: attribute_name(:start_date), placeholder: attribute_name(:start_date), required: true, - input_width: :small + input_width: :small, + data: { + action: "change->refresh-on-form-changes#triggerTurboStream" + } ) dates.text_field( name: :finish_date, @@ -47,7 +50,10 @@ module Backlogs label: attribute_name(:finish_date), placeholder: attribute_name(:finish_date), required: true, - input_width: :small + input_width: :small, + data: { + action: "change->refresh-on-form-changes#triggerTurboStream" + } ) dates.text_field( name: :duration, diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index ece6fad20ff..91cd57cc227 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -88,6 +88,16 @@ module Agile end end + def date_range_set? + start_date? && finish_date? + end + + def duration + return nil unless date_range_set? + + Day.working.from_range(from: start_date, to: finish_date).count + end + private # TODO: consider moving this validation to the database level to ensure data integrity. diff --git a/modules/backlogs/config/routes.rb b/modules/backlogs/config/routes.rb index 98fabce3db2..bc6aab34b71 100644 --- a/modules/backlogs/config/routes.rb +++ b/modules/backlogs/config/routes.rb @@ -33,6 +33,7 @@ Rails.application.routes.draw do resources :sprints, controller: :rb_sprints, only: %i[] do collection do get :new_dialog + get :refresh_form post :create end end diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index 3c0ebcceee2..38f8ff5c6f8 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -106,7 +106,7 @@ module OpenProject::Backlogs permission :create_sprints, { - rb_sprints: %i[new_dialog create] + rb_sprints: %i[new_dialog create refresh_form] }, permissible_on: :project, require: :member From 034f9a0c961eaf2fa2f609afa3896a1953a5ff12 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 18 Feb 2026 15:39:14 +0100 Subject: [PATCH 040/334] [#71252] Only show + Sprint button with active feature flag --- .../views/rb_master_backlogs/index.html.erb | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb index 9ed580f46bd..f69f50cec95 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb @@ -44,28 +44,32 @@ See COPYRIGHT and LICENSE files for more details. end %> - <%= render(Primer::OpenProject::SubHeader.new) do |subheader| - subheader.with_action_button( - scheme: :primary, - leading_icon: :plus, - label: I18n.t(:label_version_new), - tag: :a, - href: url_for({ controller: "/versions", action: "new", project_id: @project }) - ) do - t("activerecord.models.version") - end + <%= + render(Primer::OpenProject::SubHeader.new) do |subheader| + subheader.with_action_button( + scheme: :primary, + leading_icon: :plus, + label: I18n.t(:label_version_new), + tag: :a, + href: url_for({ controller: "/versions", action: "new", project_id: @project }) + ) do + t("activerecord.models.version") + end - subheader.with_action_button( - scheme: :primary, - leading_icon: :plus, - label: I18n.t(:label_sprint_new), - tag: :a, - href: new_dialog_project_sprints_path(@project), - data: { controller: "async-dialog" } - ) do - t("activerecord.models.sprint") + if OpenProject::FeatureDecisions.scrum_projects_active? + subheader.with_action_button( + scheme: :primary, + leading_icon: :plus, + label: I18n.t(:label_sprint_new), + tag: :a, + href: new_dialog_project_sprints_path(@project), + data: { controller: "async-dialog" } + ) do + t("activerecord.models.sprint") + end + end end - end %> + %> <% end %> <% content_for :content_body do %> From f6b20bb0ec38aabdfecc0f94892edcc6065f6f16 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 18 Feb 2026 15:39:37 +0100 Subject: [PATCH 041/334] [#71252] Use "n days" pluralization for sprint duration --- modules/backlogs/app/forms/backlogs/sprints/dates_form.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb index 7b85c66d109..ded1cecf321 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb @@ -60,10 +60,9 @@ module Backlogs label: attribute_name(:duration), type: :number, input_width: :xsmall, - inset: true, disabled: true, trailing_visual: { - text: { text: I18n.t(:label_day_plural) } + text: { text: I18n.t("datetime.units.day", count: model.duration) } } ) end From 35c904701980556682aeadd16c76eb631c346237 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 18 Feb 2026 16:08:24 +0100 Subject: [PATCH 042/334] [#71252] Ensure "days" is always visible --- frontend/src/assets/sass/backlogs/_index.sass | 1 + .../app/forms/backlogs/sprints/dates_form.rb | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/frontend/src/assets/sass/backlogs/_index.sass b/frontend/src/assets/sass/backlogs/_index.sass index 0f2b73435f4..9f8d5d82e69 100644 --- a/frontend/src/assets/sass/backlogs/_index.sass +++ b/frontend/src/assets/sass/backlogs/_index.sass @@ -43,5 +43,6 @@ @import jqplot @import statistics @import master_backlog +@import sprints @import taskboard @import dialogues diff --git a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb index ded1cecf321..a2a3cfaac43 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb @@ -58,15 +58,20 @@ module Backlogs dates.text_field( name: :duration, label: attribute_name(:duration), - type: :number, input_width: :xsmall, - disabled: true, - trailing_visual: { - text: { text: I18n.t("datetime.units.day", count: model.duration) } - } + readonly: true, + value: display_duration ) end end + + def display_duration + if model.duration.present? + "#{model.duration} #{I18n.t('datetime.units.day', count: model.duration)}" + else + "" + end + end end end end From 07b48aec9f56f4b37e5a3ba61bab6d1c8de866b1 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 19 Feb 2026 10:06:29 +0100 Subject: [PATCH 043/334] [#71252] New sprint form: styling --- frontend/src/assets/sass/backlogs/_index.sass | 1 - frontend/src/global_styles/openproject.sass | 1 + modules/backlogs/app/components/_index.sass | 29 +++++++++++++ .../new_sprint_form_component.html.erb | 5 ++- .../backlogs/new_sprint_form_component.sass | 41 +++++++++++++++++++ .../forms/backlogs/sprints/details_form.rb | 4 +- .../views/rb_master_backlogs/index.html.erb | 5 ++- 7 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 modules/backlogs/app/components/_index.sass create mode 100644 modules/backlogs/app/components/backlogs/new_sprint_form_component.sass diff --git a/frontend/src/assets/sass/backlogs/_index.sass b/frontend/src/assets/sass/backlogs/_index.sass index 9f8d5d82e69..0f2b73435f4 100644 --- a/frontend/src/assets/sass/backlogs/_index.sass +++ b/frontend/src/assets/sass/backlogs/_index.sass @@ -43,6 +43,5 @@ @import jqplot @import statistics @import master_backlog -@import sprints @import taskboard @import dialogues diff --git a/frontend/src/global_styles/openproject.sass b/frontend/src/global_styles/openproject.sass index d8164407754..826e78810c4 100644 --- a/frontend/src/global_styles/openproject.sass +++ b/frontend/src/global_styles/openproject.sass @@ -20,6 +20,7 @@ // Module specific Styles @import "../../../modules/auth_saml/app/components/_index.sass" +@import "../../../modules/backlogs/app/components/_index.sass" @import "../../../modules/costs/app/components/_index.sass" @import "../../../modules/documents/app/assets/stylesheets/_index.sass" @import "../../../modules/documents/app/components/_index.sass" diff --git a/modules/backlogs/app/components/_index.sass b/modules/backlogs/app/components/_index.sass new file mode 100644 index 00000000000..893f0feddef --- /dev/null +++ b/modules/backlogs/app/components/_index.sass @@ -0,0 +1,29 @@ +//-- 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 "./backlogs/new_sprint_form_component.sass" diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb index 0cbed599a51..ba36f5af29f 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb @@ -34,10 +34,11 @@ See COPYRIGHT and LICENSE files for more details. model: @sprint, scope: :sprint, method: :post, + class: "op-sprints--form", url: project_sprints_path(@sprint.project_id), data: data_attributes ) do |f| - flex_layout(mb: 3) do |flex| + flex_layout(mb: 2) do |flex| flex.with_row do if @base_errors&.any? render(Primer::Alpha::Banner.new(mb: 3, icon: :stop, scheme: :danger)) { @base_errors.join("\n") } @@ -46,7 +47,7 @@ See COPYRIGHT and LICENSE files for more details. flex.with_row(mb: 3) do render Backlogs::Sprints::DetailsForm.new(f) end - flex.with_row(mb: 3) do + flex.with_row(classes: "op-sprints--form-dates") do render Backlogs::Sprints::DatesForm.new(f) end end diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.sass b/modules/backlogs/app/components/backlogs/new_sprint_form_component.sass new file mode 100644 index 00000000000..41705b1f87d --- /dev/null +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.sass @@ -0,0 +1,41 @@ +//-- 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. +//++ + +.op-sprints--form + &-dates + // date section + .FormControl-horizontalGroup + column-gap: 1rem + + // all date fields: start, finish and duration + & > .FormControl + flex: 2 + + // special styles for the duration + &:last-child + flex: 1 diff --git a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb index ea9f2ae3e73..9830e375582 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb @@ -37,14 +37,14 @@ module Backlogs name: :name, required: true, autofocus: true, - input_width: :large + w: :full ) # f.text_area( # label: attribute_name(:goal), # name: :goal, # required: false, - # input_width: :large, + # w: :full, # rows: 3 # ) end diff --git a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb index f69f50cec95..6ceaf1df99f 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb @@ -63,7 +63,10 @@ See COPYRIGHT and LICENSE files for more details. label: I18n.t(:label_sprint_new), tag: :a, href: new_dialog_project_sprints_path(@project), - data: { controller: "async-dialog" } + data: { + controller: "async-dialog", + test_selector: "op-sprints--new-sprint-button" + } ) do t("activerecord.models.sprint") end From c6688682dffa823a9e0d55903c25e650a7407760 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 19 Feb 2026 15:13:35 +0100 Subject: [PATCH 044/334] [#71252] Sprint creation feature specs --- .../spec/features/sprints/create_spec.rb | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 modules/backlogs/spec/features/sprints/create_spec.rb diff --git a/modules/backlogs/spec/features/sprints/create_spec.rb b/modules/backlogs/spec/features/sprints/create_spec.rb new file mode 100644 index 00000000000..8233e8875be --- /dev/null +++ b/modules/backlogs/spec/features/sprints/create_spec.rb @@ -0,0 +1,170 @@ +# 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_relative "../../support/pages/backlogs" + +RSpec.describe "Create", :js do + let(:user) { create(:admin) } + let(:project) { create(:project) } + let(:backlogs_page) { Pages::Backlogs.new(project) } + + let(:story_type) do + create(:type_feature) + end + let(:story_type2) do + type = create(:type) + + project.types << type + + type + end + let(:inactive_story_type) do + create(:type) + end + + let(:task_type) do + type = create(:type_task) + project.types << type + + type + end + + before do + login_as(user) + + # Legacy backlogs module requires type configuration + allow(Setting) + .to receive(:plugin_openproject_backlogs) + .and_return("story_types" => [story_type.id.to_s, + story_type2.id.to_s, + inactive_story_type.id.to_s], + "task_type" => task_type.id.to_s) + + backlogs_page.visit! + end + + context "with the feature flag active", with_flag: { scrum_projects: true } do + before do + new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") + new_sprint_button.click + end + + let(:start_date) { Date.new(2025, 10, 5) } + let(:start_date_fmt) { start_date.strftime("%Y-%m-%d") } + let(:finish_date) { Date.new(2025, 10, 20) } + let(:finish_date_fmt) { finish_date.strftime("%Y-%m-%d") } + + it "allows creating a new sprint" do + within_dialog "New sprint" do + page.fill_in "Sprint name", with: "My first sprint" + page.fill_in "Start date", with: start_date_fmt + page.fill_in "Finish date", with: finish_date_fmt + + click_on "Save" + end + + sprint = project.reload.sprints.last + expect(sprint).to be_present + expect(sprint.name).to eq "My first sprint" + expect(sprint.start_date).to eq start_date + expect(sprint.finish_date).to eq finish_date + end + + it "previews the sprint duration when changing the dates" do + within_dialog "New sprint" do + expect(page).to have_field "Duration", with: "", readonly: true + + page.fill_in "Start date", with: start_date_fmt + page.fill_in "Finish date", with: finish_date_fmt + + expect(page).to have_field "Duration", with: "16 days", readonly: true + end + end + + describe "validations" do + let(:too_early_finish_date) { start_date - 1.day } + + it "validates required fields are present" do + within_dialog "New sprint" do + page.fill_in "Sprint name", with: "" + + click_on "Save" + + expect(page).to have_field "Sprint name", validation_error: "can't be blank" + expect(page).to have_field "Start date", validation_error: "can't be blank" + expect(page).to have_field "Finish date", validation_error: "can't be blank" + end + end + + it "validates finish date is not before start date" do + within_dialog "New sprint" do + page.fill_in "Start date", with: start_date_fmt + page.fill_in "Finish date", with: too_early_finish_date.strftime("%Y-%m-%d") + + click_on "Save" + + expect(page).to have_field("Finish date", + validation_error: "must be greater than or equal to #{start_date_fmt}") + end + end + end + + describe "proposed sprint names" do + it "prefilled with 'Sprint 1' if there are no previous sprints" do + within_dialog "New sprint" do + expect(page).to have_field "Sprint name *", with: "Sprint 1", required: true, focused: true + end + end + + context "with a previous sprint" do + before do + create(:agile_sprint, name: "Be ambitious 42", project:) + + backlogs_page.visit! + new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") + new_sprint_button.click + end + + it "offers the next sprint name with a number increment" do + within_dialog "New sprint" do + expect(page).to have_field "Sprint name *", with: "Be ambitious 43" + end + end + end + end + end + + context "with the feature flag inactive" do + it "is missing the 'new sprint' button" do + expect(page).not_to have_test_selector("op-sprints--new-sprint-button") + end + end +end From d237f81e93a6137876b1febc8f78f226d44a2611 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 19 Feb 2026 17:05:18 +0100 Subject: [PATCH 045/334] [#71252] Sprint name generator specs --- .../backlogs/spec/models/agile/sprint_spec.rb | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/agile/sprint_spec.rb index ed1fc3b5628..56b981386ad 100644 --- a/modules/backlogs/spec/models/agile/sprint_spec.rb +++ b/modules/backlogs/spec/models/agile/sprint_spec.rb @@ -127,4 +127,101 @@ RSpec.describe Agile::Sprint do expect(WorkPackage.find(work_package_id).sprint_id).to be_nil end end + + describe "#sprint_name_from_predecessor" do + context "when sprint is not a new record" do + let(:existing_sprint) { create(:agile_sprint, project:, name: "Existing Sprint") } + + it "returns the current name" do + expect(existing_sprint.sprint_name_from_predecessor).to eq("Existing Sprint") + end + end + + context "when sprint is a new record" do + context "when there is no predecessor sprint" do + it "returns a default name for the first sprint" do + expected_name = "#{I18n.t('activerecord.models.sprint')} 1" + expect(sprint.sprint_name_from_predecessor).to eq(expected_name) + end + end + + context "when there is a predecessor sprint with a name ending in a number" do + it "increments the number for single-digit numbers" do + create(:agile_sprint, project:, name: "Sprint 1") + expect(sprint.sprint_name_from_predecessor).to eq("Sprint 2") + end + + it "increments the number for multi-digit numbers" do + create(:agile_sprint, project:, name: "Sprint 42") + expect(sprint.sprint_name_from_predecessor).to eq("Sprint 43") + end + + it "increments the number for custom names ending in numbers" do + create(:agile_sprint, project:, name: "Be ambitious 42") + expect(sprint.sprint_name_from_predecessor).to eq("Be ambitious 43") + end + + it "handles names with multiple spaces before the number" do + create(:agile_sprint, project:, name: "Release 99") + expect(sprint.sprint_name_from_predecessor).to eq("Release 100") + end + + it "increments from 9 to 10" do + create(:agile_sprint, project:, name: "Sprint 9") + expect(sprint.sprint_name_from_predecessor).to eq("Sprint 10") + end + + it "increments from 99 to 100" do + create(:agile_sprint, project:, name: "Sprint 99") + expect(sprint.sprint_name_from_predecessor).to eq("Sprint 100") + end + end + + context "when there is a predecessor sprint with a custom name not ending in a number" do + it "returns an empty string" do + create(:agile_sprint, project:, name: "Custom Sprint Name") + expect(sprint.sprint_name_from_predecessor).to eq("") + end + + it "returns an empty string for names with numbers in the middle" do + create(:agile_sprint, project:, name: "Sprint 2023 Planning") + expect(sprint.sprint_name_from_predecessor).to eq("") + end + + it "returns an empty string for names ending with non-numeric characters" do + create(:agile_sprint, project:, name: "Sprint Alpha") + expect(sprint.sprint_name_from_predecessor).to eq("") + end + end + + context "when there are multiple predecessor sprints" do + it "uses the most recent sprint" do + create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago) + create(:agile_sprint, project:, name: "Sprint 2", created_at: 1.day.ago) + expect(sprint.sprint_name_from_predecessor).to eq("Sprint 3") + end + + it "handles mixed naming patterns by using the most recent" do + create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago) + create(:agile_sprint, project:, name: "Custom Name", created_at: 1.day.ago) + expect(sprint.sprint_name_from_predecessor).to eq("") + end + end + + context "when there are sprints in other projects" do + let(:other_project) { create(:project) } + + it "ignores sprints from other projects" do + create(:agile_sprint, project: other_project, name: "Other Sprint 5") + expect(sprint.sprint_name_from_predecessor).to eq("#{I18n.t('activerecord.models.sprint')} 1") + end + + it "only considers sprints from the same project" do + create(:agile_sprint, project: other_project, name: "Other Sprint 5") + create(:agile_sprint, project:, name: "Sprint 3") + expect(sprint.sprint_name_from_predecessor).to eq("Sprint 4") + end + end + end + end end From 1a382e5c7865b5b0e2cecdba9dc383d18f45901c Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 20 Feb 2026 10:48:34 +0100 Subject: [PATCH 046/334] [#71252] Refactor --- .../backlogs/new_sprint_dialog_component.html.erb | 7 ++++--- .../components/backlogs/new_sprint_dialog_component.rb | 8 ++++---- modules/backlogs/app/contracts/sprints/base_contract.rb | 1 + modules/backlogs/app/forms/backlogs/sprints/dates_form.rb | 2 +- modules/backlogs/app/models/agile/sprint.rb | 4 ++-- modules/backlogs/app/services/sprints/create_service.rb | 2 +- modules/backlogs/spec/features/sprints/create_spec.rb | 3 +++ 7 files changed, 16 insertions(+), 11 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb index 9315fa2c03f..41c0c5b7cb0 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb @@ -30,9 +30,11 @@ See COPYRIGHT and LICENSE files for more details. <%= render( Primer::Alpha::Dialog.new( - title: "New sprint", + title: t(:label_sprint_new), size: :large, - id: Backlogs::NewSprintDialogComponent::DIALOG_ID)) do |d| + id: Backlogs::NewSprintDialogComponent::DIALOG_ID + ) + ) do |d| d.with_header(variant: :large) d.with_body do @@ -69,4 +71,3 @@ See COPYRIGHT and LICENSE files for more details. end end %> - diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb index 60a7388f75c..22ef0baffed 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb @@ -30,14 +30,14 @@ module Backlogs class NewSprintDialogComponent < ApplicationComponent - DIALOG_ID = "new-sprint-dialog" - FORM_ID = "new-sprint-dialog-form" - FOOTER_ID = "new-sprint-dialog-footer" - include ApplicationHelper include OpTurbo::Streamable include OpPrimer::ComponentHelpers + DIALOG_ID = "new-sprint-dialog" + FORM_ID = "new-sprint-dialog-form" + FOOTER_ID = "new-sprint-dialog-footer" + def initialize(sprint:) super diff --git a/modules/backlogs/app/contracts/sprints/base_contract.rb b/modules/backlogs/app/contracts/sprints/base_contract.rb index 769358aeeb1..cf014093c71 100644 --- a/modules/backlogs/app/contracts/sprints/base_contract.rb +++ b/modules/backlogs/app/contracts/sprints/base_contract.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + #-- copyright # OpenProject is an open source project management software. # Copyright (C) the OpenProject GmbH diff --git a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb index a2a3cfaac43..8104e6929f3 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/dates_form.rb @@ -67,7 +67,7 @@ module Backlogs def display_duration if model.duration.present? - "#{model.duration} #{I18n.t('datetime.units.day', count: model.duration)}" + [model.duration, I18n.t("datetime.units.day", count: model.duration)].join(" ") else "" end diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 91cd57cc227..087196871e7 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -76,11 +76,11 @@ module Agile if predecessor.nil? # There is no predecessor, so we return a default name for the first sprint. - "#{I18n.t('activerecord.models.sprint')} 1" + [I18n.t("activerecord.models.sprint"), 1].join(" ") elsif (match = predecessor.name.match(/(.*)\s(\d+)\z/)) # If the predecessor's name ends with a number, increment that number for the new sprint's name. # E.g., if the previous sprint was called "Be ambitious 42", the next one will be "Be ambitious 43". - "#{match[1]} #{match[2].to_i + 1}" + [match[1], match[2].to_i + 1].join(" ") else # The predecessor's name doesn't end with a number. The user has chosen a custom name. Do not assume # how the next sprint should be called. Return an empty string and let the user choose. diff --git a/modules/backlogs/app/services/sprints/create_service.rb b/modules/backlogs/app/services/sprints/create_service.rb index 69022047b22..0feb2e40ad2 100644 --- a/modules/backlogs/app/services/sprints/create_service.rb +++ b/modules/backlogs/app/services/sprints/create_service.rb @@ -28,7 +28,7 @@ # See COPYRIGHT and LICENSE files for more details. #++ -class Sprints::CreateService < ::BaseServices::Create +class Sprints::CreateService < BaseServices::Create def instance_class Agile::Sprint end diff --git a/modules/backlogs/spec/features/sprints/create_spec.rb b/modules/backlogs/spec/features/sprints/create_spec.rb index 8233e8875be..a5979cf7467 100644 --- a/modules/backlogs/spec/features/sprints/create_spec.rb +++ b/modules/backlogs/spec/features/sprints/create_spec.rb @@ -129,6 +129,9 @@ RSpec.describe "Create", :js do page.fill_in "Start date", with: start_date_fmt page.fill_in "Finish date", with: too_early_finish_date.strftime("%Y-%m-%d") + # Shows duration as zero if finish date is before start date: + expect(page).to have_field "Duration", with: "0 days", readonly: true + click_on "Save" expect(page).to have_field("Finish date", From 6914071a08ca536379309373ce761becc9733b13 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 20 Feb 2026 10:52:51 +0100 Subject: [PATCH 047/334] [#71252] SprintsController checks feature flag --- modules/backlogs/app/controllers/rb_sprints_controller.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index 7c49f38a9f9..ca8f76ca3c5 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -32,6 +32,7 @@ class RbSprintsController < RbApplicationController include OpTurbo::ComponentStream skip_before_action :load_sprint_and_project, only: %i[new_dialog create refresh_form] + before_action :not_authorized_on_feature_flag_inactive, only: %i[new_dialog create refresh_form] def new_dialog @project = Project.visible.find(params[:project_id]) @@ -148,4 +149,8 @@ class RbSprintsController < RbApplicationController def agile_sprint_params params.expect(sprint: %i[name start_date finish_date]) end + + def not_authorized_on_feature_flag_inactive + render_403 unless OpenProject::FeatureDecisions.scrum_projects_active? + end end From adceb06964a1c21f210a0e026fdb0ee94dc25943 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 20 Feb 2026 14:57:23 +0100 Subject: [PATCH 048/334] [#71252] Only show '+ Sprint' button if permitted --- .../rb_master_backlogs_controller.rb | 5 + .../views/rb_master_backlogs/index.html.erb | 2 +- .../spec/features/sprints/create_spec.rb | 160 ++++++++++-------- 3 files changed, 93 insertions(+), 74 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb index dd6838e553b..75c41659bdf 100644 --- a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb +++ b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb @@ -34,6 +34,7 @@ class RbMasterBacklogsController < RbApplicationController menu_item :backlogs before_action :load_backlogs, only: :index + helper_method :allow_sprint_creation? def index if turbo_frame_request? @@ -60,4 +61,8 @@ class RbMasterBacklogsController < RbApplicationController @owner_backlogs = Backlog.owner_backlogs(@project) @sprint_backlogs = Backlog.sprint_backlogs(@project) end + + def allow_sprint_creation? + OpenProject::FeatureDecisions.scrum_projects_active? && User.current.allowed_in_project?(:create_sprints, @project) + end end diff --git a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb index 6ceaf1df99f..7b404c945a9 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb @@ -56,7 +56,7 @@ See COPYRIGHT and LICENSE files for more details. t("activerecord.models.version") end - if OpenProject::FeatureDecisions.scrum_projects_active? + if allow_sprint_creation? subheader.with_action_button( scheme: :primary, leading_icon: :plus, diff --git a/modules/backlogs/spec/features/sprints/create_spec.rb b/modules/backlogs/spec/features/sprints/create_spec.rb index a5979cf7467..f37171dd5de 100644 --- a/modules/backlogs/spec/features/sprints/create_spec.rb +++ b/modules/backlogs/spec/features/sprints/create_spec.rb @@ -32,8 +32,12 @@ require "spec_helper" require_relative "../../support/pages/backlogs" RSpec.describe "Create", :js do - let(:user) { create(:admin) } let(:project) { create(:project) } + let(:all_permissions) { %i[view_master_backlog view_work_packages create_sprints] } + let(:permissions) { all_permissions } + let(:user) do + create(:user, member_with_permissions: { project => permissions }) + end let(:backlogs_page) { Pages::Backlogs.new(project) } let(:story_type) do @@ -72,95 +76,105 @@ RSpec.describe "Create", :js do end context "with the feature flag active", with_flag: { scrum_projects: true } do - before do - new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") - new_sprint_button.click - end - - let(:start_date) { Date.new(2025, 10, 5) } - let(:start_date_fmt) { start_date.strftime("%Y-%m-%d") } - let(:finish_date) { Date.new(2025, 10, 20) } - let(:finish_date_fmt) { finish_date.strftime("%Y-%m-%d") } - - it "allows creating a new sprint" do - within_dialog "New sprint" do - page.fill_in "Sprint name", with: "My first sprint" - page.fill_in "Start date", with: start_date_fmt - page.fill_in "Finish date", with: finish_date_fmt - - click_on "Save" + context "with the 'create_sprints' permissions" do + before do + new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") + new_sprint_button&.click end - sprint = project.reload.sprints.last - expect(sprint).to be_present - expect(sprint.name).to eq "My first sprint" - expect(sprint.start_date).to eq start_date - expect(sprint.finish_date).to eq finish_date - end + let(:start_date) { Date.new(2025, 10, 5) } + let(:start_date_fmt) { start_date.strftime("%Y-%m-%d") } + let(:finish_date) { Date.new(2025, 10, 20) } + let(:finish_date_fmt) { finish_date.strftime("%Y-%m-%d") } - it "previews the sprint duration when changing the dates" do - within_dialog "New sprint" do - expect(page).to have_field "Duration", with: "", readonly: true - - page.fill_in "Start date", with: start_date_fmt - page.fill_in "Finish date", with: finish_date_fmt - - expect(page).to have_field "Duration", with: "16 days", readonly: true - end - end - - describe "validations" do - let(:too_early_finish_date) { start_date - 1.day } - - it "validates required fields are present" do - within_dialog "New sprint" do - page.fill_in "Sprint name", with: "" - - click_on "Save" - - expect(page).to have_field "Sprint name", validation_error: "can't be blank" - expect(page).to have_field "Start date", validation_error: "can't be blank" - expect(page).to have_field "Finish date", validation_error: "can't be blank" - end - end - - it "validates finish date is not before start date" do + it "allows creating a new sprint" do within_dialog "New sprint" do + page.fill_in "Sprint name", with: "My first sprint" page.fill_in "Start date", with: start_date_fmt - page.fill_in "Finish date", with: too_early_finish_date.strftime("%Y-%m-%d") - - # Shows duration as zero if finish date is before start date: - expect(page).to have_field "Duration", with: "0 days", readonly: true + page.fill_in "Finish date", with: finish_date_fmt click_on "Save" - - expect(page).to have_field("Finish date", - validation_error: "must be greater than or equal to #{start_date_fmt}") end - end - end - describe "proposed sprint names" do - it "prefilled with 'Sprint 1' if there are no previous sprints" do + sprint = project.reload.sprints.last + expect(sprint).to be_present + expect(sprint.name).to eq "My first sprint" + expect(sprint.start_date).to eq start_date + expect(sprint.finish_date).to eq finish_date + end + + it "previews the sprint duration when changing the dates" do within_dialog "New sprint" do - expect(page).to have_field "Sprint name *", with: "Sprint 1", required: true, focused: true + expect(page).to have_field "Duration", with: "", readonly: true + + page.fill_in "Start date", with: start_date_fmt + page.fill_in "Finish date", with: finish_date_fmt + + expect(page).to have_field "Duration", with: "16 days", readonly: true end end - context "with a previous sprint" do - before do - create(:agile_sprint, name: "Be ambitious 42", project:) + describe "validations" do + let(:too_early_finish_date) { start_date - 1.day } - backlogs_page.visit! - new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") - new_sprint_button.click - end - - it "offers the next sprint name with a number increment" do + it "validates required fields are present" do within_dialog "New sprint" do - expect(page).to have_field "Sprint name *", with: "Be ambitious 43" + page.fill_in "Sprint name", with: "" + + click_on "Save" + + expect(page).to have_field "Sprint name", validation_error: "can't be blank" + expect(page).to have_field "Start date", validation_error: "can't be blank" + expect(page).to have_field "Finish date", validation_error: "can't be blank" end end + + it "validates finish date is not before start date" do + within_dialog "New sprint" do + page.fill_in "Start date", with: start_date_fmt + page.fill_in "Finish date", with: too_early_finish_date.strftime("%Y-%m-%d") + + # Shows duration as zero if finish date is before start date: + expect(page).to have_field "Duration", with: "0 days", readonly: true + + click_on "Save" + + expect(page).to have_field("Finish date", + validation_error: "must be greater than or equal to #{start_date_fmt}") + end + end + end + + describe "proposed sprint names" do + it "prefilled with 'Sprint 1' if there are no previous sprints" do + within_dialog "New sprint" do + expect(page).to have_field "Sprint name *", with: "Sprint 1", required: true, focused: true + end + end + + context "with a previous sprint" do + before do + create(:agile_sprint, name: "Be ambitious 42", project:) + + backlogs_page.visit! + new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") + new_sprint_button.click + end + + it "offers the next sprint name with a number increment" do + within_dialog "New sprint" do + expect(page).to have_field "Sprint name *", with: "Be ambitious 43" + end + end + end + end + end + + context "without the necessary permissions" do + let(:permissions) { all_permissions - [:create_sprints] } + + it "is missing the 'new sprint' button" do + expect(page).not_to have_test_selector("op-sprints--new-sprint-button") end end end From 86075124f3fd68eb1e75df554e3ceeaeaed626e6 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 20 Feb 2026 15:38:54 +0100 Subject: [PATCH 049/334] [#71252] Sprint controller specs --- .../controllers/rb_sprints_controller_spec.rb | 313 +++++++++++++----- 1 file changed, 226 insertions(+), 87 deletions(-) diff --git a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb index 5513fdaff5e..73c94446f27 100644 --- a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb @@ -31,119 +31,258 @@ require "rails_helper" RSpec.describe RbSprintsController do - shared_let(:type_feature) { create(:type_feature) } - shared_let(:type_task) { create(:type_task) } - shared_let(:user) { create(:admin) } - current_user { user } + describe "new actions" do + shared_let(:type_feature) { create(:type_feature) } + shared_let(:type_task) { create(:type_task) } - let(:visible_projects_scope) { instance_double(ActiveRecord::Relation) } - let(:visible_sprints_scope) { instance_double(ActiveRecord::Relation) } - - before do - allow(Setting) - .to receive(:plugin_openproject_backlogs) - .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id }) - - allow(Project) - .to receive(:visible) - .and_return(visible_projects_scope) - - allow(visible_projects_scope) - .to receive(:find) - .with(project.identifier) - .and_return(project) - - allow(Sprint) - .to receive(:visible) - .and_return(visible_sprints_scope) - - allow(visible_sprints_scope) - .to receive(:find) - .with(sprint.id.to_s) - .and_return(sprint) - end - - describe "GET #edit_name" do - let(:project) { build_stubbed(:project) } - let(:sprint) { build_stubbed(:sprint) } - - it "responds with success", :aggregate_failures do - get :edit_name, params: { project_id: project.identifier, id: sprint.id }, format: :turbo_stream - - expect(response).to be_successful - expect(response).to have_http_status :ok - expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}" - expect(assigns(:project)).to eq(project) - expect(assigns(:sprint)).to eq(sprint) - expect(assigns(:backlog)).to be_a(Backlog) + let(:all_permissions) { %i[view_master_backlog view_work_packages create_sprints] } + let(:permissions) { all_permissions } + let(:user) do + create(:user, member_with_permissions: { project => permissions }) end - end + let(:project) { create(:project) } - describe "GET #show_name" do - let(:project) { build_stubbed(:project) } - let(:sprint) { build_stubbed(:sprint) } - - it "responds with success", :aggregate_failures do - get :show_name, params: { project_id: project.identifier, id: sprint.id }, format: :turbo_stream - - expect(response).to be_successful - expect(response).to have_http_status :ok - expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}" - expect(assigns(:project)).to eq(project) - expect(assigns(:sprint)).to eq(sprint) - expect(assigns(:backlog)).to be_a(Backlog) - end - end - - describe "PATCH #update" do - let(:project) { build_stubbed(:project) } - let(:sprint) { build_stubbed(:sprint) } + current_user { user } before do - update_service = instance_double(Versions::UpdateService, call: service_result) - - allow(Versions::UpdateService) - .to receive(:new) - .with(user:, model: sprint) - .and_return(update_service) + # Necessary to get the controller running due to check_if_plugin_is_configured + allow(Setting) + .to receive(:plugin_openproject_backlogs) + .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id }) end - context "when service call succeeds" do - let(:service_result) { ServiceResult.success(result: sprint) } + describe "GET #new_dialog" do + context "with the feature flag inactive" do + it "responds with forbidden" do + get :new_dialog, params: { project_id: project.id }, format: :turbo_stream + + expect(response).not_to be_successful + expect(response).to have_http_status :forbidden + end + end + + context "with the feature flag active", with_flag: { scrum_projects: true } do + it "responds with success", :aggregate_failures do + get :new_dialog, params: { project_id: project.id }, format: :turbo_stream + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response).to have_turbo_stream action: "dialog", target: "backlogs-new-sprint-dialog-component" + expect(assigns(:project)).to eq(project) + expect(assigns(:sprint)).to be_a(Agile::Sprint).and be_new_record + end + + context "without the 'create_sprints' permission" do + let(:permissions) { all_permissions - [:create_sprints] } + + it "responds with forbidden", :aggregate_failures do + get :new_dialog, params: { project_id: project.id }, format: :turbo_stream + + expect(response).not_to be_successful + expect(response).to have_http_status :forbidden + end + end + end + end + + describe "POST #create" do + context "with the feature flag inactive" do + it "responds with forbidden" do + post :create, params: { project_id: project.id }, format: :turbo_stream + + expect(response).not_to be_successful + expect(response).to have_http_status :forbidden + end + end + + context "with the feature flag active", with_flag: { scrum_projects: true } do + let(:params) do + { + project_id: project.id, + sprint: { name: "My Sprint", start_date: "2025-10-05", finish_date: "2025-10-15" } + } + end + + it "responds with success and creates a sprint", :aggregate_failures do + post :create, format: :turbo_stream, params: params + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response).to have_turbo_stream action: "flash" + # See feature spec for detailed expectations on the created sprint and rendered components + expect(project.reload.sprints.last.name).to eq("My Sprint") + end + + context "without the 'create_sprints' permission" do + let(:permissions) { all_permissions - [:create_sprints] } + + it "responds with forbidden", :aggregate_failures do + post :create, format: :turbo_stream, params: params + + expect(response).not_to be_successful + expect(response).to have_http_status :forbidden + end + end + end + end + + describe "GET #refresh_form" do + context "with the feature flag inactive" do + it "responds with forbidden" do + get :refresh_form, params: { project_id: project.id }, format: :turbo_stream + + expect(response).not_to be_successful + expect(response).to have_http_status :forbidden + end + end + + context "with the feature flag active", with_flag: { scrum_projects: true } do + let(:params) do + { + project_id: project.id, + sprint: { name: "My Sprint", start_date: "2025-10-05", finish_date: "2025-10-15" } + } + end + + it "responds with success", :aggregate_failures do + get :refresh_form, format: :turbo_stream, params: params + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response).to have_turbo_stream action: "update", target: "backlogs-new-sprint-form-component" + end + + context "without the 'create_sprints' permission" do + let(:permissions) { all_permissions - [:create_sprints] } + + it "responds with forbidden", :aggregate_failures do + get :refresh_form, format: :turbo_stream, params: params + + expect(response).not_to be_successful + expect(response).to have_http_status :forbidden + end + end + end + end + end + + describe "legacy actions" do + shared_let(:type_feature) { create(:type_feature) } + shared_let(:type_task) { create(:type_task) } + shared_let(:user) { create(:admin) } + current_user { user } + + let(:visible_projects_scope) { instance_double(ActiveRecord::Relation) } + let(:visible_sprints_scope) { instance_double(ActiveRecord::Relation) } + + before do + allow(Setting) + .to receive(:plugin_openproject_backlogs) + .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id }) + + allow(Project) + .to receive(:visible) + .and_return(visible_projects_scope) + + allow(visible_projects_scope) + .to receive(:find) + .with(project.identifier) + .and_return(project) + + allow(Sprint) + .to receive(:visible) + .and_return(visible_sprints_scope) + + allow(visible_sprints_scope) + .to receive(:find) + .with(sprint.id.to_s) + .and_return(sprint) + end + + describe "GET #edit_name" do + let(:project) { build_stubbed(:project) } + let(:sprint) { build_stubbed(:sprint) } it "responds with success", :aggregate_failures do - patch :update, params: { project_id: project.identifier, id: sprint.id, sprint: { name: "Updated Sprint" } }, - format: :turbo_stream + get :edit_name, params: { project_id: project.identifier, id: sprint.id }, format: :turbo_stream expect(response).to be_successful expect(response).to have_http_status :ok expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}" - expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" expect(assigns(:project)).to eq(project) expect(assigns(:sprint)).to eq(sprint) expect(assigns(:backlog)).to be_a(Backlog) end end - context "when service call fails" do - let(:service_result) { ServiceResult.failure(result: sprint) } + describe "GET #show_name" do + let(:project) { build_stubbed(:project) } + let(:sprint) { build_stubbed(:sprint) } - before do - project.name = "" - end + it "responds with success", :aggregate_failures do + get :show_name, params: { project_id: project.identifier, id: sprint.id }, format: :turbo_stream - it "responds with 422", :aggregate_failures do - patch :update, params: { project_id: project.identifier, id: sprint.id, sprint: { name: "" } }, - format: :turbo_stream - - expect(response).not_to be_successful - expect(response).to have_http_status :unprocessable_entity + expect(response).to be_successful + expect(response).to have_http_status :ok expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}" - expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" expect(assigns(:project)).to eq(project) expect(assigns(:sprint)).to eq(sprint) expect(assigns(:backlog)).to be_a(Backlog) end end + + describe "PATCH #update" do + let(:project) { build_stubbed(:project) } + let(:sprint) { build_stubbed(:sprint) } + + before do + update_service = instance_double(Versions::UpdateService, call: service_result) + + allow(Versions::UpdateService) + .to receive(:new) + .with(user:, model: sprint) + .and_return(update_service) + end + + context "when service call succeeds" do + let(:service_result) { ServiceResult.success(result: sprint) } + + it "responds with success", :aggregate_failures do + patch :update, + params: { project_id: project.identifier, id: sprint.id, sprint: { name: "Updated Sprint" } }, + format: :turbo_stream + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}" + expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" + expect(assigns(:project)).to eq(project) + expect(assigns(:sprint)).to eq(sprint) + expect(assigns(:backlog)).to be_a(Backlog) + end + end + + context "when service call fails" do + let(:service_result) { ServiceResult.failure(result: sprint) } + + before do + project.name = "" + end + + it "responds with 422", :aggregate_failures do + patch :update, + params: { project_id: project.identifier, id: sprint.id, sprint: { name: "" } }, + format: :turbo_stream + + expect(response).not_to be_successful + expect(response).to have_http_status :unprocessable_entity + expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}" + expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" + expect(assigns(:project)).to eq(project) + expect(assigns(:sprint)).to eq(sprint) + expect(assigns(:backlog)).to be_a(Backlog) + end + end + end end end From 6add476bf455606d37c97a5176750bcd993d1b52 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 23 Feb 2026 09:30:30 +0100 Subject: [PATCH 050/334] [#71252] Sprint services spec --- .../services/sprints/create_service_spec.rb | 39 +++++ .../sprints/set_attributes_service_spec.rb | 161 ++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 modules/backlogs/spec/services/sprints/create_service_spec.rb create mode 100644 modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb diff --git a/modules/backlogs/spec/services/sprints/create_service_spec.rb b/modules/backlogs/spec/services/sprints/create_service_spec.rb new file mode 100644 index 00000000000..0971ecf565d --- /dev/null +++ b/modules/backlogs/spec/services/sprints/create_service_spec.rb @@ -0,0 +1,39 @@ +# 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 "services/base_services/behaves_like_create_service" + +RSpec.describe Sprints::CreateService, type: :model do + it_behaves_like "BaseServices create service" do + let(:model_class) { Agile::Sprint } + let(:factory) { :agile_sprint } + end +end diff --git a/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb new file mode 100644 index 00000000000..74dbb3c33ad --- /dev/null +++ b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb @@ -0,0 +1,161 @@ +# 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 Sprints::SetAttributesService, type: :model do + let(:user) { build_stubbed(:user) } + let(:contract_class) do + contract = class_double(Sprints::CreateContract) + + allow(contract) + .to receive(:new) + .with(sprint, user, options: {}) + .and_return(contract_instance) + + contract + end + let(:contract_instance) do + instance_double(ModelContract, validate: contract_valid, errors: contract_errors) + end + let(:contract_valid) { true } + let(:contract_errors) do + instance_double(ActiveModel::Errors) + end + let(:sprint_valid) { true } + let(:instance) do + described_class.new(user:, + model: sprint, + contract_class:, + contract_options: {}) + end + let(:sprint) { build_stubbed(:agile_sprint) } + let(:params) { {} } + + subject(:service_call) { instance.call(params) } + + describe "call" do + before do + allow(sprint) + .to receive(:valid?) + .and_return(sprint_valid) + + allow(sprint).to receive(:save) + end + + context "when contract validates and sprint is valid" do + it "is successful" do + expect(service_call).to be_success + end + + it "sets the attributes on the sprint" do + service_call + + expect(sprint.changed_attributes).to be_empty + end + + it "does not persist the sprint" do + expect(sprint).not_to have_received(:save) + + service_call + end + end + + context "when contract does not validate" do + let(:contract_valid) { false } + + it "is not successful" do + expect(service_call).not_to be_success + end + end + + context "with params" do + let(:params) do + { + name: "New Sprint Name", + start_date: Time.zone.today, + finish_date: Time.zone.today + 21.days, + status: "active" + } + end + + before do + allow(contract_instance) + .to receive(:validate) + .and_return(true) + end + + it "passes the params to the sprint" do + service_call + + expect(sprint.name).to eq("New Sprint Name") + expect(sprint.start_date).to eq(Time.zone.today) + expect(sprint.finish_date).to eq(Time.zone.today + 21.days) + expect(sprint.status).to eq("active") + end + end + + describe "default attributes" do + let(:sprint) { Agile::Sprint.new } + + it "sets default status to in_planning" do + service_call + + expect(sprint.status).to eq("in_planning") + end + + it "sets default sharing to none" do + service_call + + expect(sprint.sharing).to eq("none") + end + + context "when status is already set" do + let(:sprint) { Agile::Sprint.new(status: "active") } + + it "does not override the existing status" do + service_call + + expect(sprint.status).to eq("active") + end + end + + context "when sharing is already set" do + let(:sprint) { Agile::Sprint.new(sharing: "descendants") } + + it "does not override the existing sharing" do + service_call + + expect(sprint.sharing).to eq("descendants") + end + end + end + end +end From 6f14fb07391fd20d20536585a0e9b173452218cc Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 23 Feb 2026 09:31:14 +0100 Subject: [PATCH 051/334] [#71252] Translation for permission --- config/locales/en.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/en.yml b/config/locales/en.yml index 5f1ce25358f..4bf94be6708 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -4416,6 +4416,7 @@ en: permission_add_internal_comments: "Write internal comments" permission_archive_project: "Archive project" permission_create_user: "Create users" + permission_create_sprints: "Create sprints" permission_manage_user: "Edit users" permission_manage_placeholder_user: "Create, edit, and delete placeholder users" permission_add_subprojects: "Create subprojects" From 7d50820e043f83644450f89adc3428dae6dc220b Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 23 Feb 2026 09:37:27 +0100 Subject: [PATCH 052/334] [#71252] Fix create sprint modal on mobile --- .../backlogs/new_sprint_form_component.sass | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.sass b/modules/backlogs/app/components/backlogs/new_sprint_form_component.sass index 41705b1f87d..577a342dd30 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_form_component.sass +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.sass @@ -28,14 +28,15 @@ .op-sprints--form &-dates - // date section - .FormControl-horizontalGroup - column-gap: 1rem + // Date section + .FormControl-horizontalGroup + flex-wrap: wrap // Wrap around (on smaller screens) + column-gap: 1rem - // all date fields: start, finish and duration - & > .FormControl - flex: 2 + // All date fields: start, finish and duration + & > .FormControl + flex: 2 - // special styles for the duration - &:last-child - flex: 1 + // Special styles for the duration: make it narrower + &:last-child + flex: 1 From f3d5186c94d4a222e6b54a4b74f837bb41fc2da1 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 23 Feb 2026 09:45:17 +0100 Subject: [PATCH 053/334] [#71252] CreateContract spec --- .../contracts/sprints/create_contract_spec.rb | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 modules/backlogs/spec/contracts/sprints/create_contract_spec.rb diff --git a/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb b/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb new file mode 100644 index 00000000000..4f8759ae2f3 --- /dev/null +++ b/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb @@ -0,0 +1,142 @@ +# 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 Sprints::CreateContract do + let(:project) { build_stubbed(:project) } + let(:user) { build_stubbed(:user) } + let(:sprint) do + Agile::Sprint.new(name: sprint_name, + project:, + start_date: sprint_start_date, + finish_date: sprint_finish_date, + status: sprint_status, + sharing: sprint_sharing) + end + let(:sprint_name) { "Sprint 1" } + let(:sprint_start_date) { Time.zone.today } + let(:sprint_finish_date) { Time.zone.today + 14.days } + let(:sprint_status) { "in_planning" } + let(:sprint_sharing) { "none" } + let(:permissions) { [:create_sprints] } + + subject(:contract) { described_class.new(sprint, user) } + + before do + mock_permissions_for(user) do |mock| + mock.allow_in_project(*permissions, project:) if project + end + end + + def expect_valid(valid, symbols = {}) + expect(contract.validate).to eq(valid) + + symbols.each do |key, arr| + expect(contract.errors.symbols_for(key)).to match_array arr + end + end + + shared_examples "is valid" do + it "is valid" do + expect_valid(true) + end + end + + describe "validation" do + context "with valid attributes and permissions" do + it_behaves_like "is valid" + end + + context "when project is nil" do + let(:project) { nil } + + it "is invalid (model validation)" do + expect_valid(false, project: %i[blank]) + end + end + + context "when user does not have create_sprints permission" do + let(:permissions) { [:view_work_packages] } + + it "is invalid" do + expect_valid(false, base: %i[error_unauthorized]) + end + end + + context "when user has no permissions in project" do + let(:permissions) { [] } + + it "is invalid" do + expect_valid(false, base: %i[error_unauthorized]) + end + end + + context "when name is blank" do + let(:sprint_name) { "" } + + it "is invalid (model validation)" do + expect_valid(false, name: %i[blank]) + end + end + + context "when start_date is blank" do + let(:sprint_start_date) { nil } + + it "is invalid (model validation)" do + expect_valid(false, start_date: %i[blank]) + end + end + + context "when finish_date is blank" do + let(:sprint_finish_date) { nil } + + it "is invalid (model validation)" do + expect_valid(false, finish_date: %i[blank blank]) + end + end + + context "when finish_date is before start_date" do + let(:sprint_start_date) { Time.zone.today } + let(:sprint_finish_date) { Time.zone.today - 1.day } + + it "is invalid (model validation)" do + expect_valid(false, finish_date: %i[greater_than_or_equal_to]) + end + end + + context "when user is admin without project permission" do + let(:user) { build_stubbed(:admin) } + let(:permissions) { [] } + + it_behaves_like "is valid" + end + end +end From 0e636a1e48903cd9a7bebb1af1035b8f4f4776d4 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Tue, 24 Feb 2026 17:46:36 +0100 Subject: [PATCH 054/334] [#71252] Move model localization to module --- modules/backlogs/config/locales/en.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index c36d4b44210..a09dee0d840 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -34,6 +34,12 @@ en: activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: From 8effe6fb52e352e7ff666d186167a00c429c78a7 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Tue, 24 Feb 2026 18:41:46 +0100 Subject: [PATCH 055/334] [#71252] fix regex --- modules/backlogs/app/models/agile/sprint.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 087196871e7..c65b8c5230b 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -77,7 +77,7 @@ module Agile if predecessor.nil? # There is no predecessor, so we return a default name for the first sprint. [I18n.t("activerecord.models.sprint"), 1].join(" ") - elsif (match = predecessor.name.match(/(.*)\s(\d+)\z/)) + elsif (match = predecessor.name.match(/\A(.*)\s(\d+)\z/)) # If the predecessor's name ends with a number, increment that number for the new sprint's name. # E.g., if the previous sprint was called "Be ambitious 42", the next one will be "Be ambitious 43". [match[1], match[2].to_i + 1].join(" ") From 49893e7640d25503b2bb13750a9c2d9c4a941189 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Tue, 24 Feb 2026 18:42:06 +0100 Subject: [PATCH 056/334] [#71252] move helper method to helper --- .../app/controllers/rb_master_backlogs_controller.rb | 5 ----- modules/backlogs/app/helpers/rb_common_helper.rb | 4 ++++ modules/backlogs/app/views/rb_master_backlogs/index.html.erb | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb index 75c41659bdf..dd6838e553b 100644 --- a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb +++ b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb @@ -34,7 +34,6 @@ class RbMasterBacklogsController < RbApplicationController menu_item :backlogs before_action :load_backlogs, only: :index - helper_method :allow_sprint_creation? def index if turbo_frame_request? @@ -61,8 +60,4 @@ class RbMasterBacklogsController < RbApplicationController @owner_backlogs = Backlog.owner_backlogs(@project) @sprint_backlogs = Backlog.sprint_backlogs(@project) end - - def allow_sprint_creation? - OpenProject::FeatureDecisions.scrum_projects_active? && User.current.allowed_in_project?(:create_sprints, @project) - end end diff --git a/modules/backlogs/app/helpers/rb_common_helper.rb b/modules/backlogs/app/helpers/rb_common_helper.rb index b28a5891b70..0d34f47fd53 100644 --- a/modules/backlogs/app/helpers/rb_common_helper.rb +++ b/modules/backlogs/app/helpers/rb_common_helper.rb @@ -132,6 +132,10 @@ module RbCommonHelper item.remaining_hours.blank? || item.remaining_hours == 0 ? "" : item.remaining_hours end + def allow_sprint_creation?(project) + OpenProject::FeatureDecisions.scrum_projects_active? && User.current.allowed_in_project?(:create_sprints, project) + end + private def work_package_status_for_id(id) diff --git a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb index 7b404c945a9..af1c64b4c55 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb @@ -56,7 +56,7 @@ See COPYRIGHT and LICENSE files for more details. t("activerecord.models.version") end - if allow_sprint_creation? + if allow_sprint_creation?(@project) subheader.with_action_button( scheme: :primary, leading_icon: :plus, From 025d0b4b93d8057f67e02b31003cb6fdad56487b Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Tue, 24 Feb 2026 18:42:19 +0100 Subject: [PATCH 057/334] [#71252] refresh form on name change --- .../app/forms/backlogs/sprints/details_form.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb index 9830e375582..9de0dcea099 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb @@ -37,7 +37,10 @@ module Backlogs name: :name, required: true, autofocus: true, - w: :full + w: :full, + data: { + action: "change->refresh-on-form-changes#triggerTurboStream" + } ) # f.text_area( @@ -45,7 +48,10 @@ module Backlogs # name: :goal, # required: false, # w: :full, - # rows: 3 + # rows: 3, + # data: { + # action: "change->refresh-on-form-changes#triggerTurboStream" + # } # ) end end From 086c2392294cee5be5969363576203e59cdd6390 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Tue, 24 Feb 2026 22:25:41 +0100 Subject: [PATCH 058/334] [#71252] Use shared model contract for spec --- .../contracts/sprints/create_contract_spec.rb | 49 +++++-------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb b/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb index 4f8759ae2f3..35828129040 100644 --- a/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb +++ b/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb @@ -29,8 +29,11 @@ #++ require "spec_helper" +require "contracts/shared/model_contract_shared_context" RSpec.describe Sprints::CreateContract do + include_context "ModelContract shared context" + let(:project) { build_stubbed(:project) } let(:user) { build_stubbed(:user) } let(:sprint) do @@ -56,87 +59,59 @@ RSpec.describe Sprints::CreateContract do end end - def expect_valid(valid, symbols = {}) - expect(contract.validate).to eq(valid) - - symbols.each do |key, arr| - expect(contract.errors.symbols_for(key)).to match_array arr - end - end - - shared_examples "is valid" do - it "is valid" do - expect_valid(true) - end - end - describe "validation" do context "with valid attributes and permissions" do - it_behaves_like "is valid" + it_behaves_like "contract is valid" end context "when project is nil" do let(:project) { nil } - it "is invalid (model validation)" do - expect_valid(false, project: %i[blank]) - end + it_behaves_like "contract is invalid", project: :blank end context "when user does not have create_sprints permission" do let(:permissions) { [:view_work_packages] } - it "is invalid" do - expect_valid(false, base: %i[error_unauthorized]) - end + it_behaves_like "contract is invalid", base: :error_unauthorized end context "when user has no permissions in project" do let(:permissions) { [] } - it "is invalid" do - expect_valid(false, base: %i[error_unauthorized]) - end + it_behaves_like "contract is invalid", base: :error_unauthorized end context "when name is blank" do let(:sprint_name) { "" } - it "is invalid (model validation)" do - expect_valid(false, name: %i[blank]) - end + it_behaves_like "contract is invalid", name: :blank end context "when start_date is blank" do let(:sprint_start_date) { nil } - it "is invalid (model validation)" do - expect_valid(false, start_date: %i[blank]) - end + it_behaves_like "contract is invalid", start_date: :blank end context "when finish_date is blank" do let(:sprint_finish_date) { nil } - it "is invalid (model validation)" do - expect_valid(false, finish_date: %i[blank blank]) - end + it_behaves_like "contract is invalid", finish_date: %i[blank blank] end context "when finish_date is before start_date" do let(:sprint_start_date) { Time.zone.today } let(:sprint_finish_date) { Time.zone.today - 1.day } - it "is invalid (model validation)" do - expect_valid(false, finish_date: %i[greater_than_or_equal_to]) - end + it_behaves_like "contract is invalid", finish_date: %i[greater_than_or_equal_to] end context "when user is admin without project permission" do let(:user) { build_stubbed(:admin) } let(:permissions) { [] } - it_behaves_like "is valid" + it_behaves_like "contract is valid" end end end From 1729f420c89b69ee4833b31d65624a47475de215 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 25 Feb 2026 16:30:42 +0100 Subject: [PATCH 059/334] [#71252] Move sprint name generation to SetAttributeService --- .../app/controllers/rb_sprints_controller.rb | 59 +++++---- modules/backlogs/app/models/agile/sprint.rb | 18 --- .../sprints/set_attributes_service.rb | 38 ++++++ .../controllers/rb_sprints_controller_spec.rb | 1 - .../backlogs/spec/models/agile/sprint_spec.rb | 97 -------------- .../sprints/set_attributes_service_spec.rb | 118 +++++++++++++++++- 6 files changed, 186 insertions(+), 145 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index ca8f76ca3c5..037da9e8791 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -31,33 +31,32 @@ class RbSprintsController < RbApplicationController include OpTurbo::ComponentStream - skip_before_action :load_sprint_and_project, only: %i[new_dialog create refresh_form] - before_action :not_authorized_on_feature_flag_inactive, only: %i[new_dialog create refresh_form] + NEW_SPRINT_ACTIONS = %i[new_dialog create refresh_form].freeze + + skip_before_action :load_sprint_and_project, only: NEW_SPRINT_ACTIONS + + before_action :not_authorized_on_feature_flag_inactive, + :load_project, + only: NEW_SPRINT_ACTIONS def new_dialog - @project = Project.visible.find(params[:project_id]) - @sprint = Agile::Sprint.new(project: @project) + call = Sprints::SetAttributesService.new( + user: current_user, + model: Agile::Sprint.new, + contract_class: EmptyContract + ).call(attributes: converted_agile_sprint_params) - if (generated_name = @sprint.sprint_name_from_predecessor).present? - @sprint.name = generated_name - end - - respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint) + respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: call.result) end def refresh_form - @project = Project.visible.find(params[:project_id]) - @sprint = Agile::Sprint.new(project: @project) - call = Sprints::SetAttributesService.new( user: current_user, - model: @sprint, - contract_class: EmptyContract - ).call(attributes: agile_sprint_params.merge(project_id: params[:project_id])) + model: Agile::Sprint.new, + contract_class: Sprints::CreateContract + ).call(attributes: converted_agile_sprint_params) - sprint = call.result - - update_via_turbo_stream(component: Backlogs::NewSprintFormComponent.new(sprint:)) + update_via_turbo_stream(component: Backlogs::NewSprintFormComponent.new(sprint: call.result)) respond_with_turbo_streams end @@ -65,14 +64,12 @@ class RbSprintsController < RbApplicationController def create call = Sprints::CreateService .new(user: current_user) - .call(attributes: agile_sprint_params.merge(project_id: params[:project_id])) - - sprint = call.result + .call(attributes: converted_agile_sprint_params) if call.success? - render_success_flash_message_via_turbo_stream(message: I18n.t(:notice_successful_update)) + render_success_flash_message_via_turbo_stream(message: I18n.t(:notice_successful_create)) else - update_new_sprint_form_component_via_turbo_stream(sprint:, base_errors: call.errors[:base]) + update_new_sprint_form_component_via_turbo_stream(sprint: call.result, base_errors: call.errors[:base]) end respond_with_turbo_streams @@ -137,8 +134,10 @@ class RbSprintsController < RbApplicationController # Overrides load_sprint_and_project to load the sprint from :id instead of :sprint_id def load_sprint_and_project @sprint = Sprint.visible.find(params[:id]) - @project = @sprint.project - # This overrides sprint's project if we set another project, say a subproject + load_project + end + + def load_project @project = Project.visible.find(params[:project_id]) end @@ -147,7 +146,15 @@ class RbSprintsController < RbApplicationController end def agile_sprint_params - params.expect(sprint: %i[name start_date finish_date]) + params.permit(sprint: %i[name start_date finish_date]) + end + + def converted_agile_sprint_params + # Do some preprocessing to make the params easier to use + converted_sprint_params = agile_sprint_params[:sprint].to_h + converted_sprint_params[:project] = @project + + converted_sprint_params end def not_authorized_on_feature_flag_inactive diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index c65b8c5230b..4a84d9dc04b 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -69,24 +69,6 @@ module Agile # TODO: validate sharing is set to an allowed value, e.g. only admins may share systemwide (#71374, #71253) # TODO: implement sharing logic once it has been defined (#71374) - def sprint_name_from_predecessor - return name unless new_record? - - predecessor = project.sprints.last - - if predecessor.nil? - # There is no predecessor, so we return a default name for the first sprint. - [I18n.t("activerecord.models.sprint"), 1].join(" ") - elsif (match = predecessor.name.match(/\A(.*)\s(\d+)\z/)) - # If the predecessor's name ends with a number, increment that number for the new sprint's name. - # E.g., if the previous sprint was called "Be ambitious 42", the next one will be "Be ambitious 43". - [match[1], match[2].to_i + 1].join(" ") - else - # The predecessor's name doesn't end with a number. The user has chosen a custom name. Do not assume - # how the next sprint should be called. Return an empty string and let the user choose. - "" - end - end def date_range_set? start_date? && finish_date? diff --git a/modules/backlogs/app/services/sprints/set_attributes_service.rb b/modules/backlogs/app/services/sprints/set_attributes_service.rb index 38bf8802c76..df5774a7af4 100644 --- a/modules/backlogs/app/services/sprints/set_attributes_service.rb +++ b/modules/backlogs/app/services/sprints/set_attributes_service.rb @@ -30,11 +30,49 @@ module Sprints class SetAttributesService < ::BaseServices::SetAttributes + def sprint_name_from_predecessor + return model.name unless model.new_record? + + predecessor = model.project.sprints.last + next_name_in_succession(predecessor) + end + + private + def set_default_attributes(_params) + set_sprint_name + set_status_and_sharing + end + + def set_sprint_name + model.change_by_system do + model.name ||= sprint_name_from_predecessor + end + end + + def set_status_and_sharing model.change_by_system do model.status ||= "in_planning" model.sharing ||= "none" end end + + def next_name_in_succession(predecessor) + if predecessor.nil? + default_sprint_name + elsif (match = predecessor.name.match(/\A(.*)\s(\d+)\z/)) + # If the predecessor's name ends with a number, increment that number for the new sprint's name. + # E.g., if the previous sprint was called "Be ambitious 42", the next one will be "Be ambitious 43". + [match[1], match[2].to_i + 1].join(" ") + else + # The predecessor's name doesn't end with a number. The user has chosen a custom name. Do not assume + # how the next sprint should be called. Return an empty string and let the user choose. + "" + end + end + + def default_sprint_name + [I18n.t("activerecord.models.sprint"), 1].join(" ") + end end end diff --git a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb index 73c94446f27..c737fc8afbb 100644 --- a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb @@ -69,7 +69,6 @@ RSpec.describe RbSprintsController do expect(response).to have_http_status :ok expect(response).to have_turbo_stream action: "dialog", target: "backlogs-new-sprint-dialog-component" expect(assigns(:project)).to eq(project) - expect(assigns(:sprint)).to be_a(Agile::Sprint).and be_new_record end context "without the 'create_sprints' permission" do diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/agile/sprint_spec.rb index 56b981386ad..ed1fc3b5628 100644 --- a/modules/backlogs/spec/models/agile/sprint_spec.rb +++ b/modules/backlogs/spec/models/agile/sprint_spec.rb @@ -127,101 +127,4 @@ RSpec.describe Agile::Sprint do expect(WorkPackage.find(work_package_id).sprint_id).to be_nil end end - - describe "#sprint_name_from_predecessor" do - context "when sprint is not a new record" do - let(:existing_sprint) { create(:agile_sprint, project:, name: "Existing Sprint") } - - it "returns the current name" do - expect(existing_sprint.sprint_name_from_predecessor).to eq("Existing Sprint") - end - end - - context "when sprint is a new record" do - context "when there is no predecessor sprint" do - it "returns a default name for the first sprint" do - expected_name = "#{I18n.t('activerecord.models.sprint')} 1" - expect(sprint.sprint_name_from_predecessor).to eq(expected_name) - end - end - - context "when there is a predecessor sprint with a name ending in a number" do - it "increments the number for single-digit numbers" do - create(:agile_sprint, project:, name: "Sprint 1") - expect(sprint.sprint_name_from_predecessor).to eq("Sprint 2") - end - - it "increments the number for multi-digit numbers" do - create(:agile_sprint, project:, name: "Sprint 42") - expect(sprint.sprint_name_from_predecessor).to eq("Sprint 43") - end - - it "increments the number for custom names ending in numbers" do - create(:agile_sprint, project:, name: "Be ambitious 42") - expect(sprint.sprint_name_from_predecessor).to eq("Be ambitious 43") - end - - it "handles names with multiple spaces before the number" do - create(:agile_sprint, project:, name: "Release 99") - expect(sprint.sprint_name_from_predecessor).to eq("Release 100") - end - - it "increments from 9 to 10" do - create(:agile_sprint, project:, name: "Sprint 9") - expect(sprint.sprint_name_from_predecessor).to eq("Sprint 10") - end - - it "increments from 99 to 100" do - create(:agile_sprint, project:, name: "Sprint 99") - expect(sprint.sprint_name_from_predecessor).to eq("Sprint 100") - end - end - - context "when there is a predecessor sprint with a custom name not ending in a number" do - it "returns an empty string" do - create(:agile_sprint, project:, name: "Custom Sprint Name") - expect(sprint.sprint_name_from_predecessor).to eq("") - end - - it "returns an empty string for names with numbers in the middle" do - create(:agile_sprint, project:, name: "Sprint 2023 Planning") - expect(sprint.sprint_name_from_predecessor).to eq("") - end - - it "returns an empty string for names ending with non-numeric characters" do - create(:agile_sprint, project:, name: "Sprint Alpha") - expect(sprint.sprint_name_from_predecessor).to eq("") - end - end - - context "when there are multiple predecessor sprints" do - it "uses the most recent sprint" do - create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago) - create(:agile_sprint, project:, name: "Sprint 2", created_at: 1.day.ago) - expect(sprint.sprint_name_from_predecessor).to eq("Sprint 3") - end - - it "handles mixed naming patterns by using the most recent" do - create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago) - create(:agile_sprint, project:, name: "Custom Name", created_at: 1.day.ago) - expect(sprint.sprint_name_from_predecessor).to eq("") - end - end - - context "when there are sprints in other projects" do - let(:other_project) { create(:project) } - - it "ignores sprints from other projects" do - create(:agile_sprint, project: other_project, name: "Other Sprint 5") - expect(sprint.sprint_name_from_predecessor).to eq("#{I18n.t('activerecord.models.sprint')} 1") - end - - it "only considers sprints from the same project" do - create(:agile_sprint, project: other_project, name: "Other Sprint 5") - create(:agile_sprint, project:, name: "Sprint 3") - expect(sprint.sprint_name_from_predecessor).to eq("Sprint 4") - end - end - end - end end diff --git a/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb index 74dbb3c33ad..480d04230f6 100644 --- a/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb +++ b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb @@ -56,8 +56,9 @@ RSpec.describe Sprints::SetAttributesService, type: :model do contract_class:, contract_options: {}) end - let(:sprint) { build_stubbed(:agile_sprint) } - let(:params) { {} } + let(:project) { create(:project) } + let(:sprint) { Agile::Sprint.new } + let(:params) { { project: } } subject(:service_call) { instance.call(params) } @@ -78,7 +79,13 @@ RSpec.describe Sprints::SetAttributesService, type: :model do it "sets the attributes on the sprint" do service_call - expect(sprint.changed_attributes).to be_empty + # Default attributes set include: + # * the project, since passed as argument + # * a generated sprint sequence name if applicable, see `sprint_name_from_predecessor` specs. + expect(sprint.changed_attributes).to include("project_id", "name") + + expect(sprint.project_id).to eq(project.id) + expect(sprint.name).to eq("Sprint 1") end it "does not persist the sprint" do @@ -158,4 +165,109 @@ RSpec.describe Sprints::SetAttributesService, type: :model do end end end + + describe "#sprint_name_from_predecessor" do + context "when sprint is not a new record" do + let(:existing_sprint) { create(:agile_sprint, project:, name: "Existing Sprint") } + let(:instance) do + described_class.new(user:, + model: existing_sprint, + contract_class:, + contract_options: {}) + end + + it "returns the current name" do + expect(instance.sprint_name_from_predecessor).to eq("Existing Sprint") + end + end + + context "when sprint is a new record" do + let(:sprint) { Agile::Sprint.new(project:) } + + context "when there is no predecessor sprint" do + it "returns a default name for the first sprint" do + expected_name = "#{I18n.t('activerecord.models.sprint')} 1" + expect(instance.sprint_name_from_predecessor).to eq(expected_name) + end + end + + context "when there is a predecessor sprint with a name ending in a number" do + it "increments the number for single-digit numbers" do + create(:agile_sprint, project:, name: "Sprint 1") + expect(instance.sprint_name_from_predecessor).to eq("Sprint 2") + end + + it "increments the number for multi-digit numbers" do + create(:agile_sprint, project:, name: "Sprint 42") + expect(instance.sprint_name_from_predecessor).to eq("Sprint 43") + end + + it "increments the number for custom names ending in numbers" do + create(:agile_sprint, project:, name: "Be ambitious 42") + expect(instance.sprint_name_from_predecessor).to eq("Be ambitious 43") + end + + it "handles names with multiple spaces before the number" do + create(:agile_sprint, project:, name: "Release 99") + expect(instance.sprint_name_from_predecessor).to eq("Release 100") + end + + it "increments from 9 to 10" do + create(:agile_sprint, project:, name: "Sprint 9") + expect(instance.sprint_name_from_predecessor).to eq("Sprint 10") + end + + it "increments from 99 to 100" do + create(:agile_sprint, project:, name: "Sprint 99") + expect(instance.sprint_name_from_predecessor).to eq("Sprint 100") + end + end + + context "when there is a predecessor sprint with a custom name not ending in a number" do + it "returns an empty string" do + create(:agile_sprint, project:, name: "Custom Sprint Name") + expect(instance.sprint_name_from_predecessor).to eq("") + end + + it "returns an empty string for names with numbers in the middle" do + create(:agile_sprint, project:, name: "Sprint 2023 Planning") + expect(instance.sprint_name_from_predecessor).to eq("") + end + + it "returns an empty string for names ending with non-numeric characters" do + create(:agile_sprint, project:, name: "Sprint Alpha") + expect(instance.sprint_name_from_predecessor).to eq("") + end + end + + context "when there are multiple predecessor sprints" do + it "uses the most recent sprint" do + create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago) + create(:agile_sprint, project:, name: "Sprint 2", created_at: 1.day.ago) + expect(instance.sprint_name_from_predecessor).to eq("Sprint 3") + end + + it "handles mixed naming patterns by using the most recent" do + create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago) + create(:agile_sprint, project:, name: "Custom Name", created_at: 1.day.ago) + expect(instance.sprint_name_from_predecessor).to eq("") + end + end + + context "when there are sprints in other projects" do + let(:other_project) { create(:project) } + + it "ignores sprints from other projects" do + create(:agile_sprint, project: other_project, name: "Other Sprint 5") + expect(instance.sprint_name_from_predecessor).to eq("#{I18n.t('activerecord.models.sprint')} 1") + end + + it "only considers sprints from the same project" do + create(:agile_sprint, project: other_project, name: "Other Sprint 5") + create(:agile_sprint, project:, name: "Sprint 3") + expect(instance.sprint_name_from_predecessor).to eq("Sprint 4") + end + end + end + end end From 4175f9c96bdf1430ae5cc6f834e083c3503f3992 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 25 Feb 2026 16:36:57 +0100 Subject: [PATCH 060/334] [#71252] Fix dialog nitpicks --- .../backlogs/new_sprint_dialog_component.html.erb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb index 41c0c5b7cb0..9bbdcc78b2d 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb @@ -32,17 +32,13 @@ See COPYRIGHT and LICENSE files for more details. Primer::Alpha::Dialog.new( title: t(:label_sprint_new), size: :large, - id: Backlogs::NewSprintDialogComponent::DIALOG_ID + id: DIALOG_ID ) ) do |d| d.with_header(variant: :large) d.with_body do - render( - Backlogs::NewSprintFormComponent.new( - sprint: @sprint - ) - ) + render(Backlogs::NewSprintFormComponent.new(sprint: @sprint)) end d.with_footer do @@ -50,7 +46,7 @@ See COPYRIGHT and LICENSE files for more details. buttons.with_component( Primer::Beta::Button.new( data: { - "close-dialog-id": Backlogs::NewSprintDialogComponent::DIALOG_ID + "close-dialog-id": DIALOG_ID } ) ) do @@ -60,7 +56,7 @@ See COPYRIGHT and LICENSE files for more details. buttons.with_component( Primer::Beta::Button.new( scheme: :primary, - form: Backlogs::NewSprintDialogComponent::FORM_ID, + form: FORM_ID, data: { turbo: true }, type: :submit ) From 5693cf488d5df726faee9d68eebc92dc8c89f984 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 26 Feb 2026 12:28:16 +0100 Subject: [PATCH 061/334] [#71252] Move all localisations to module --- modules/backlogs/config/locales/en.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index a09dee0d840..62d8d39bd0e 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -59,6 +59,9 @@ en: sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" + attributes: task_type: "Task type" @@ -149,8 +152,10 @@ en: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" From 5ad2ffaa4a1ddcea5f7537729558625fd2e85b8c Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 26 Feb 2026 12:52:23 +0100 Subject: [PATCH 062/334] [#71252] Remove `change_by_system` wrapper --- .../app/services/sprints/set_attributes_service.rb | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/modules/backlogs/app/services/sprints/set_attributes_service.rb b/modules/backlogs/app/services/sprints/set_attributes_service.rb index df5774a7af4..5c1360e3911 100644 --- a/modules/backlogs/app/services/sprints/set_attributes_service.rb +++ b/modules/backlogs/app/services/sprints/set_attributes_service.rb @@ -45,16 +45,12 @@ module Sprints end def set_sprint_name - model.change_by_system do - model.name ||= sprint_name_from_predecessor - end + model.name ||= sprint_name_from_predecessor end def set_status_and_sharing - model.change_by_system do - model.status ||= "in_planning" - model.sharing ||= "none" - end + model.status ||= "in_planning" + model.sharing ||= "none" end def next_name_in_succession(predecessor) From 6271771cf9723e7d07ad8e1f1c9512aafdc60aca Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 26 Feb 2026 12:53:11 +0100 Subject: [PATCH 063/334] [#71252] rm empty line --- modules/backlogs/app/models/agile/sprint.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 4a84d9dc04b..5d6f892389a 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -69,7 +69,6 @@ module Agile # TODO: validate sharing is set to an allowed value, e.g. only admins may share systemwide (#71374, #71253) # TODO: implement sharing logic once it has been defined (#71374) - def date_range_set? start_date? && finish_date? end From 1f3e2abbfa7f290c9dfd37899068090d3bea9c06 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 26 Feb 2026 15:01:31 +0100 Subject: [PATCH 064/334] [#71252] Make sprint_name_from_predecessor private --- .../sprints/set_attributes_service.rb | 4 +- .../sprints/set_attributes_service_spec.rb | 80 ++++++++++++------- 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/modules/backlogs/app/services/sprints/set_attributes_service.rb b/modules/backlogs/app/services/sprints/set_attributes_service.rb index 5c1360e3911..22625e0b759 100644 --- a/modules/backlogs/app/services/sprints/set_attributes_service.rb +++ b/modules/backlogs/app/services/sprints/set_attributes_service.rb @@ -30,6 +30,8 @@ module Sprints class SetAttributesService < ::BaseServices::SetAttributes + private + def sprint_name_from_predecessor return model.name unless model.new_record? @@ -37,8 +39,6 @@ module Sprints next_name_in_succession(predecessor) end - private - def set_default_attributes(_params) set_sprint_name set_status_and_sharing diff --git a/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb index 480d04230f6..f08152ad0e8 100644 --- a/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb +++ b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb @@ -166,18 +166,14 @@ RSpec.describe Sprints::SetAttributesService, type: :model do end end - describe "#sprint_name_from_predecessor" do + describe "assigning a name" do context "when sprint is not a new record" do - let(:existing_sprint) { create(:agile_sprint, project:, name: "Existing Sprint") } - let(:instance) do - described_class.new(user:, - model: existing_sprint, - contract_class:, - contract_options: {}) - end + let(:sprint) { create(:agile_sprint, project:, name: "Existing Sprint") } - it "returns the current name" do - expect(instance.sprint_name_from_predecessor).to eq("Existing Sprint") + it "assigns the current name" do + service_call + + expect(sprint.name).to eq("Existing Sprint") end end @@ -185,58 +181,78 @@ RSpec.describe Sprints::SetAttributesService, type: :model do let(:sprint) { Agile::Sprint.new(project:) } context "when there is no predecessor sprint" do - it "returns a default name for the first sprint" do + it "assigns a default name for the first sprint" do + service_call + expected_name = "#{I18n.t('activerecord.models.sprint')} 1" - expect(instance.sprint_name_from_predecessor).to eq(expected_name) + expect(sprint.name).to eq(expected_name) end end context "when there is a predecessor sprint with a name ending in a number" do it "increments the number for single-digit numbers" do create(:agile_sprint, project:, name: "Sprint 1") - expect(instance.sprint_name_from_predecessor).to eq("Sprint 2") + + service_call + expect(sprint.name).to eq("Sprint 2") end it "increments the number for multi-digit numbers" do create(:agile_sprint, project:, name: "Sprint 42") - expect(instance.sprint_name_from_predecessor).to eq("Sprint 43") + + service_call + expect(sprint.name).to eq("Sprint 43") end it "increments the number for custom names ending in numbers" do create(:agile_sprint, project:, name: "Be ambitious 42") - expect(instance.sprint_name_from_predecessor).to eq("Be ambitious 43") + + service_call + expect(sprint.name).to eq("Be ambitious 43") end it "handles names with multiple spaces before the number" do create(:agile_sprint, project:, name: "Release 99") - expect(instance.sprint_name_from_predecessor).to eq("Release 100") + + service_call + expect(sprint.name).to eq("Release 100") end it "increments from 9 to 10" do create(:agile_sprint, project:, name: "Sprint 9") - expect(instance.sprint_name_from_predecessor).to eq("Sprint 10") + + service_call + expect(sprint.name).to eq("Sprint 10") end it "increments from 99 to 100" do create(:agile_sprint, project:, name: "Sprint 99") - expect(instance.sprint_name_from_predecessor).to eq("Sprint 100") + + service_call + expect(sprint.name).to eq("Sprint 100") end end context "when there is a predecessor sprint with a custom name not ending in a number" do - it "returns an empty string" do + it "assigns an empty string" do create(:agile_sprint, project:, name: "Custom Sprint Name") - expect(instance.sprint_name_from_predecessor).to eq("") + + service_call + expect(sprint.name).to eq("") end - it "returns an empty string for names with numbers in the middle" do + it "assigns an empty string for names with numbers in the middle" do create(:agile_sprint, project:, name: "Sprint 2023 Planning") - expect(instance.sprint_name_from_predecessor).to eq("") + + service_call + expect(sprint.name).to eq("") end - it "returns an empty string for names ending with non-numeric characters" do + it "assigns an empty string for names ending with non-numeric characters" do create(:agile_sprint, project:, name: "Sprint Alpha") - expect(instance.sprint_name_from_predecessor).to eq("") + + service_call + expect(sprint.name).to eq("") end end @@ -244,13 +260,17 @@ RSpec.describe Sprints::SetAttributesService, type: :model do it "uses the most recent sprint" do create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago) create(:agile_sprint, project:, name: "Sprint 2", created_at: 1.day.ago) - expect(instance.sprint_name_from_predecessor).to eq("Sprint 3") + + service_call + expect(sprint.name).to eq("Sprint 3") end it "handles mixed naming patterns by using the most recent" do create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago) create(:agile_sprint, project:, name: "Custom Name", created_at: 1.day.ago) - expect(instance.sprint_name_from_predecessor).to eq("") + + service_call + expect(sprint.name).to eq("") end end @@ -259,13 +279,17 @@ RSpec.describe Sprints::SetAttributesService, type: :model do it "ignores sprints from other projects" do create(:agile_sprint, project: other_project, name: "Other Sprint 5") - expect(instance.sprint_name_from_predecessor).to eq("#{I18n.t('activerecord.models.sprint')} 1") + + service_call + expect(sprint.name).to eq("#{I18n.t('activerecord.models.sprint')} 1") end it "only considers sprints from the same project" do create(:agile_sprint, project: other_project, name: "Other Sprint 5") create(:agile_sprint, project:, name: "Sprint 3") - expect(instance.sprint_name_from_predecessor).to eq("Sprint 4") + + service_call + expect(sprint.name).to eq("Sprint 4") end end end From 4aa1bdd8a032c34988174d85b175c32e3054f962 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 26 Feb 2026 16:08:35 +0100 Subject: [PATCH 065/334] [#71252] Form does not validate on the fly --- .../backlogs/app/controllers/rb_sprints_controller.rb | 2 +- .../app/forms/backlogs/sprints/details_form.rb | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index 037da9e8791..bd44fcf3f0d 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -53,7 +53,7 @@ class RbSprintsController < RbApplicationController call = Sprints::SetAttributesService.new( user: current_user, model: Agile::Sprint.new, - contract_class: Sprints::CreateContract + contract_class: EmptyContract ).call(attributes: converted_agile_sprint_params) update_via_turbo_stream(component: Backlogs::NewSprintFormComponent.new(sprint: call.result)) diff --git a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb index 9de0dcea099..9830e375582 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb @@ -37,10 +37,7 @@ module Backlogs name: :name, required: true, autofocus: true, - w: :full, - data: { - action: "change->refresh-on-form-changes#triggerTurboStream" - } + w: :full ) # f.text_area( @@ -48,10 +45,7 @@ module Backlogs # name: :goal, # required: false, # w: :full, - # rows: 3, - # data: { - # action: "change->refresh-on-form-changes#triggerTurboStream" - # } + # rows: 3 # ) end end From d477f0bb14f45e363fba6286c742c7abaaadd807 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 27 Feb 2026 11:34:49 +0100 Subject: [PATCH 066/334] [#71252] View improvements --- .../backlogs/new_sprint_dialog_component.html.erb | 2 +- .../components/backlogs/new_sprint_form_component.html.erb | 4 ++-- .../backlogs/app/views/rb_master_backlogs/index.html.erb | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb index 9bbdcc78b2d..eea4a971f6a 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb @@ -46,7 +46,7 @@ See COPYRIGHT and LICENSE files for more details. buttons.with_component( Primer::Beta::Button.new( data: { - "close-dialog-id": DIALOG_ID + close_dialog_id: DIALOG_ID } ) ) do diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb index ba36f5af29f..ed00e46ae9a 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb @@ -39,8 +39,8 @@ See COPYRIGHT and LICENSE files for more details. data: data_attributes ) do |f| flex_layout(mb: 2) do |flex| - flex.with_row do - if @base_errors&.any? + if @base_errors&.any? + flex.with_row do render(Primer::Alpha::Banner.new(mb: 3, icon: :stop, scheme: :danger)) { @base_errors.join("\n") } end end diff --git a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb index af1c64b4c55..6ca380e917a 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb @@ -51,9 +51,9 @@ See COPYRIGHT and LICENSE files for more details. leading_icon: :plus, label: I18n.t(:label_version_new), tag: :a, - href: url_for({ controller: "/versions", action: "new", project_id: @project }) + href: new_project_version_path(@project) ) do - t("activerecord.models.version") + Version.human_model_name end if allow_sprint_creation?(@project) @@ -68,7 +68,7 @@ See COPYRIGHT and LICENSE files for more details. test_selector: "op-sprints--new-sprint-button" } ) do - t("activerecord.models.sprint") + Agile::Sprint.human_model_name end end end From 1f1b513710b5698593a919160af383bd5fe0e9e4 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 27 Feb 2026 11:46:55 +0100 Subject: [PATCH 067/334] [#71252] Show action menu with + Sprint and + Version --- .../views/rb_master_backlogs/index.html.erb | 45 ++++++++++++------- .../spec/features/sprints/create_spec.rb | 4 ++ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb index 6ca380e917a..307ee717ba4 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb @@ -46,29 +46,40 @@ See COPYRIGHT and LICENSE files for more details. <%= render(Primer::OpenProject::SubHeader.new) do |subheader| - subheader.with_action_button( - scheme: :primary, - leading_icon: :plus, - label: I18n.t(:label_version_new), - tag: :a, - href: new_project_version_path(@project) - ) do - Version.human_model_name - end - if allow_sprint_creation?(@project) + # Scrum sprints are available, show an action menu to create Sprints and Versions + subheader.with_action_menu( + leading_icon: :plus, + trailing_icon: :"triangle-down", + label: t(:button_create), + button_arguments: { scheme: :primary } + ) do |menu| + menu.with_item( + label: Version.human_model_name, + href: new_project_version_path(@project) + ) + + menu.with_item( + label: Agile::Sprint.human_model_name, + href: new_dialog_project_sprints_path(@project), + content_arguments: { + data: { + controller: "async-dialog", + test_selector: "op-sprints--new-sprint-button" + } + } + ) + end + else + # No scrum sprints, we only show a "+ Version" button subheader.with_action_button( scheme: :primary, leading_icon: :plus, - label: I18n.t(:label_sprint_new), + label: I18n.t(:label_version_new), tag: :a, - href: new_dialog_project_sprints_path(@project), - data: { - controller: "async-dialog", - test_selector: "op-sprints--new-sprint-button" - } + href: new_project_version_path(@project) ) do - Agile::Sprint.human_model_name + Version.human_model_name end end end diff --git a/modules/backlogs/spec/features/sprints/create_spec.rb b/modules/backlogs/spec/features/sprints/create_spec.rb index f37171dd5de..0c3c5dff03f 100644 --- a/modules/backlogs/spec/features/sprints/create_spec.rb +++ b/modules/backlogs/spec/features/sprints/create_spec.rb @@ -78,6 +78,7 @@ RSpec.describe "Create", :js do context "with the feature flag active", with_flag: { scrum_projects: true } do context "with the 'create_sprints' permissions" do before do + click_on "Create" new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") new_sprint_button&.click end @@ -157,6 +158,7 @@ RSpec.describe "Create", :js do create(:agile_sprint, name: "Be ambitious 42", project:) backlogs_page.visit! + click_on "Create" new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") new_sprint_button.click end @@ -174,6 +176,7 @@ RSpec.describe "Create", :js do let(:permissions) { all_permissions - [:create_sprints] } it "is missing the 'new sprint' button" do + expect(page).to have_no_button "Create" expect(page).not_to have_test_selector("op-sprints--new-sprint-button") end end @@ -181,6 +184,7 @@ RSpec.describe "Create", :js do context "with the feature flag inactive" do it "is missing the 'new sprint' button" do + expect(page).to have_no_button "Create" expect(page).not_to have_test_selector("op-sprints--new-sprint-button") end end From a978ae1d1f3811ea03eec7420365b2da5bbfac5b Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 27 Feb 2026 12:23:23 +0100 Subject: [PATCH 068/334] [#71252] Remove unneeded ApplicationHelper include --- .../app/components/backlogs/new_sprint_dialog_component.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb index 22ef0baffed..e8e8d1456db 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb @@ -30,7 +30,6 @@ module Backlogs class NewSprintDialogComponent < ApplicationComponent - include ApplicationHelper include OpTurbo::Streamable include OpPrimer::ComponentHelpers From aeb5de61940bc4bcf0ffddd870097b3ad6aaa052 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 27 Feb 2026 14:03:03 +0100 Subject: [PATCH 069/334] [#71252] Remove duplicate localizations Introduced by accident during conflict resolution --- config/locales/en.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 4bf94be6708..08ef5609d7c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1455,9 +1455,6 @@ en: activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: @@ -4416,7 +4413,6 @@ en: permission_add_internal_comments: "Write internal comments" permission_archive_project: "Archive project" permission_create_user: "Create users" - permission_create_sprints: "Create sprints" permission_manage_user: "Edit users" permission_manage_placeholder_user: "Create, edit, and delete placeholder users" permission_add_subprojects: "Create subprojects" From 5559b74b628f80ba63907262dc1401960e841782 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 27 Feb 2026 15:35:52 +0100 Subject: [PATCH 070/334] [#71252] Use "Create" in creation modal --- .../backlogs/new_sprint_dialog_component.html.erb | 2 +- modules/backlogs/spec/features/sprints/create_spec.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb index eea4a971f6a..e98032f0613 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb @@ -61,7 +61,7 @@ See COPYRIGHT and LICENSE files for more details. type: :submit ) ) do - t("button_save") + t("button_create") end end end diff --git a/modules/backlogs/spec/features/sprints/create_spec.rb b/modules/backlogs/spec/features/sprints/create_spec.rb index 0c3c5dff03f..7c4c800aac2 100644 --- a/modules/backlogs/spec/features/sprints/create_spec.rb +++ b/modules/backlogs/spec/features/sprints/create_spec.rb @@ -94,7 +94,7 @@ RSpec.describe "Create", :js do page.fill_in "Start date", with: start_date_fmt page.fill_in "Finish date", with: finish_date_fmt - click_on "Save" + click_on "Create" end sprint = project.reload.sprints.last @@ -122,7 +122,7 @@ RSpec.describe "Create", :js do within_dialog "New sprint" do page.fill_in "Sprint name", with: "" - click_on "Save" + click_on "Create" expect(page).to have_field "Sprint name", validation_error: "can't be blank" expect(page).to have_field "Start date", validation_error: "can't be blank" @@ -138,7 +138,7 @@ RSpec.describe "Create", :js do # Shows duration as zero if finish date is before start date: expect(page).to have_field "Duration", with: "0 days", readonly: true - click_on "Save" + click_on "Create" expect(page).to have_field("Finish date", validation_error: "must be greater than or equal to #{start_date_fmt}") From 9d5aba63aab3a219902e289e216b43f552fc16bd Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 27 Feb 2026 15:36:06 +0100 Subject: [PATCH 071/334] [#71252] Only compare the dates if both are present --- modules/backlogs/app/models/agile/sprint.rb | 5 +++-- modules/backlogs/spec/models/agile/sprint_spec.rb | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 5d6f892389a..47cb2bddd7e 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -60,9 +60,10 @@ module Agile validates :name, presence: true validates :project, presence: true validates :start_date, presence: true + validates :finish_date, presence: true validates :finish_date, - presence: true, - comparison: { greater_than_or_equal_to: :start_date } + comparison: { greater_than_or_equal_to: :start_date }, + if: :start_date? validate :validate_only_one_active_sprint_per_project diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/agile/sprint_spec.rb index ed1fc3b5628..8aef9d36833 100644 --- a/modules/backlogs/spec/models/agile/sprint_spec.rb +++ b/modules/backlogs/spec/models/agile/sprint_spec.rb @@ -54,6 +54,21 @@ RSpec.describe Agile::Sprint do expect(sprint.errors[:finish_date]).to include(/must be greater than or equal to/) end + it "does not validate finish_date comparison when start_date is nil" do + sprint.start_date = nil + sprint.finish_date = Time.zone.today + expect(sprint).not_to be_valid + expect(sprint.errors[:start_date]).to be_present + expect(sprint.errors[:finish_date]).not_to include(/must be greater than or equal to/) + end + + it "still validates finish_date presence even when start_date is nil" do + sprint.start_date = nil + sprint.finish_date = nil + expect(sprint).not_to be_valid + expect(sprint.errors[:finish_date]).to be_present + end + context "with active sprint validation" do it "allows one active sprint per project" do sprint.status = "active" From ee937e2d4ab8dc2c08cbf10251a380f21b13c37a Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 27 Feb 2026 16:54:35 +0200 Subject: [PATCH 072/334] Add stub Agile::Sprints.for_project finder method --- modules/backlogs/app/models/agile/sprint.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index d236ca0bc74..ab1edeba643 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -38,6 +38,8 @@ module Agile belongs_to :project has_many :work_packages, dependent: :nullify + scope :for_project, ->(project) { where(project:) } + enum :status, { in_planning: "in_planning", From 70e1e0401a5043a01834dda07f0113ae9e928683 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 27 Feb 2026 17:16:50 +0100 Subject: [PATCH 073/334] replace outdated call on member --- modules/grids/app/components/grids/widgets/members.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grids/app/components/grids/widgets/members.rb b/modules/grids/app/components/grids/widgets/members.rb index 7d5d07acc7b..8366b4ae2ed 100644 --- a/modules/grids/app/components/grids/widgets/members.rb +++ b/modules/grids/app/components/grids/widgets/members.rb @@ -49,7 +49,7 @@ module Grids .map do |role| members_query = members_for_role(role.id) total_count = members_query.count - members = members_query.limit(limit).to_a.map(&:user) + members = members_query.limit(limit).to_a.map(&:principal) { role:, From 7f235fcc4d1f18db274cd386ae0d7de7da47e660 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Sat, 28 Feb 2026 03:39:53 +0000 Subject: [PATCH 074/334] update locales from crowdin [ci skip] --- config/locales/crowdin/af.yml | 3 - config/locales/crowdin/ar.yml | 3 - config/locales/crowdin/az.yml | 3 - config/locales/crowdin/be.yml | 3 - config/locales/crowdin/bg.yml | 3 - config/locales/crowdin/ca.yml | 3 - config/locales/crowdin/ckb-IR.yml | 3 - config/locales/crowdin/cs.yml | 53 +++-- config/locales/crowdin/da.yml | 3 - config/locales/crowdin/de.yml | 31 ++- config/locales/crowdin/el.yml | 3 - config/locales/crowdin/eo.yml | 3 - config/locales/crowdin/es.yml | 5 +- 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 | 3 - config/locales/crowdin/hi.yml | 3 - config/locales/crowdin/hr.yml | 3 - config/locales/crowdin/hu.yml | 3 - config/locales/crowdin/id.yml | 3 - config/locales/crowdin/it.yml | 3 - config/locales/crowdin/ja.yml | 110 +++++----- config/locales/crowdin/js-ca.yml | 2 +- config/locales/crowdin/js-de.yml | 8 +- config/locales/crowdin/js-ja.yml | 82 +++---- config/locales/crowdin/js-no.yml | 2 +- config/locales/crowdin/js-ro.yml | 2 +- config/locales/crowdin/js-ru.yml | 2 +- config/locales/crowdin/js-vi.yml | 2 +- config/locales/crowdin/ka.yml | 3 - config/locales/crowdin/kk.yml | 3 - config/locales/crowdin/ko.yml | 3 - config/locales/crowdin/lt.yml | 3 - config/locales/crowdin/lv.yml | 3 - config/locales/crowdin/mn.yml | 3 - config/locales/crowdin/ms.yml | 3 - config/locales/crowdin/ne.yml | 3 - config/locales/crowdin/nl.yml | 3 - config/locales/crowdin/no.yml | 3 - config/locales/crowdin/pl.yml | 3 - config/locales/crowdin/pt-BR.yml | 3 - config/locales/crowdin/pt-PT.yml | 3 - config/locales/crowdin/ro.yml | 7 +- config/locales/crowdin/ru.yml | 3 - config/locales/crowdin/rw.yml | 3 - config/locales/crowdin/si.yml | 3 - config/locales/crowdin/sk.yml | 3 - config/locales/crowdin/sl.yml | 7 +- config/locales/crowdin/sr.yml | 3 - config/locales/crowdin/sv.yml | 3 - config/locales/crowdin/th.yml | 3 - config/locales/crowdin/tr.yml | 3 - config/locales/crowdin/uk.yml | 5 +- config/locales/crowdin/uz.yml | 3 - config/locales/crowdin/vi.yml | 7 +- config/locales/crowdin/zh-CN.seeders.yml | 4 +- config/locales/crowdin/zh-CN.yml | 15 +- config/locales/crowdin/zh-TW.yml | 13 +- .../backlogs/config/locales/crowdin/af.yml | 10 + .../backlogs/config/locales/crowdin/ar.yml | 10 + .../backlogs/config/locales/crowdin/az.yml | 10 + .../backlogs/config/locales/crowdin/be.yml | 10 + .../backlogs/config/locales/crowdin/bg.yml | 10 + .../backlogs/config/locales/crowdin/ca.yml | 10 + .../config/locales/crowdin/ckb-IR.yml | 10 + .../backlogs/config/locales/crowdin/cs.yml | 10 + .../backlogs/config/locales/crowdin/da.yml | 10 + .../backlogs/config/locales/crowdin/de.yml | 10 + .../backlogs/config/locales/crowdin/el.yml | 10 + .../backlogs/config/locales/crowdin/eo.yml | 10 + .../backlogs/config/locales/crowdin/es.yml | 10 + .../backlogs/config/locales/crowdin/et.yml | 10 + .../backlogs/config/locales/crowdin/eu.yml | 10 + .../backlogs/config/locales/crowdin/fa.yml | 10 + .../backlogs/config/locales/crowdin/fi.yml | 10 + .../backlogs/config/locales/crowdin/fil.yml | 10 + .../backlogs/config/locales/crowdin/fr.yml | 16 +- .../backlogs/config/locales/crowdin/he.yml | 10 + .../backlogs/config/locales/crowdin/hi.yml | 10 + .../backlogs/config/locales/crowdin/hr.yml | 10 + .../backlogs/config/locales/crowdin/hu.yml | 10 + .../backlogs/config/locales/crowdin/id.yml | 10 + .../backlogs/config/locales/crowdin/it.yml | 10 + .../backlogs/config/locales/crowdin/ja.yml | 10 + .../backlogs/config/locales/crowdin/ka.yml | 10 + .../backlogs/config/locales/crowdin/kk.yml | 10 + .../backlogs/config/locales/crowdin/ko.yml | 10 + .../backlogs/config/locales/crowdin/lt.yml | 10 + .../backlogs/config/locales/crowdin/lv.yml | 10 + .../backlogs/config/locales/crowdin/mn.yml | 10 + .../backlogs/config/locales/crowdin/ms.yml | 10 + .../backlogs/config/locales/crowdin/ne.yml | 10 + .../backlogs/config/locales/crowdin/nl.yml | 10 + .../backlogs/config/locales/crowdin/no.yml | 10 + .../backlogs/config/locales/crowdin/pl.yml | 10 + .../backlogs/config/locales/crowdin/pt-BR.yml | 10 + .../backlogs/config/locales/crowdin/pt-PT.yml | 10 + .../backlogs/config/locales/crowdin/ro.yml | 12 +- .../backlogs/config/locales/crowdin/ru.yml | 10 + .../backlogs/config/locales/crowdin/rw.yml | 10 + .../backlogs/config/locales/crowdin/si.yml | 10 + .../backlogs/config/locales/crowdin/sk.yml | 10 + .../backlogs/config/locales/crowdin/sl.yml | 10 + .../backlogs/config/locales/crowdin/sr.yml | 10 + .../backlogs/config/locales/crowdin/sv.yml | 10 + .../backlogs/config/locales/crowdin/th.yml | 10 + .../backlogs/config/locales/crowdin/tr.yml | 10 + .../backlogs/config/locales/crowdin/uk.yml | 10 + .../backlogs/config/locales/crowdin/uz.yml | 10 + .../backlogs/config/locales/crowdin/vi.yml | 10 + .../backlogs/config/locales/crowdin/zh-CN.yml | 10 + .../backlogs/config/locales/crowdin/zh-TW.yml | 12 +- modules/bim/config/locales/crowdin/fr.yml | 2 +- modules/budgets/config/locales/crowdin/cs.yml | 2 +- modules/costs/config/locales/crowdin/ja.yml | 2 +- .../config/locales/crowdin/rw.yml | 27 ++- .../config/locales/crowdin/uz.yml | 27 ++- .../config/locales/crowdin/zh-CN.yml | 2 +- .../config/locales/crowdin/zh-TW.yml | 2 +- modules/meeting/config/locales/crowdin/cs.yml | 2 +- modules/meeting/config/locales/crowdin/ja.yml | 10 +- .../reporting/config/locales/crowdin/ro.yml | 2 +- .../reporting/config/locales/crowdin/vi.yml | 2 +- .../config/locales/crowdin/zh-TW.yml | 4 +- .../storages/config/locales/crowdin/ja.yml | 204 +++++++++--------- .../storages/config/locales/crowdin/js-ja.yml | 18 +- .../config/locales/crowdin/js-fr.yml | 2 +- .../config/locales/crowdin/ro.yml | 2 +- .../config/locales/crowdin/ru.yml | 2 +- .../config/locales/crowdin/uk.yml | 2 +- .../config/locales/crowdin/zh-CN.yml | 2 +- 135 files changed, 876 insertions(+), 479 deletions(-) diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index 99f63a4b687..071032168c9 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -1356,9 +1356,6 @@ af: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index 4a1f63ed3c4..1522fa90daf 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -1416,9 +1416,6 @@ ar: dependencies: "الاعتماديات" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index ace8cc403a4..006e13aa6dc 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -1356,9 +1356,6 @@ az: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index 79002bb0cd5..43a6875cd71 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -1386,9 +1386,6 @@ be: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index 64501d7c247..bd9ffe635d4 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -1356,9 +1356,6 @@ bg: dependencies: "Зависимости" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index f73c3b8e579..df8baf78a16 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -1353,9 +1353,6 @@ ca: dependencies: "Dependències" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index 49b5f5a4152..b08834eb23d 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -1356,9 +1356,6 @@ ckb-IR: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index d820407f09e..c484a8cf674 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -1386,9 +1386,6 @@ cs: dependencies: "Závislosti" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: @@ -1505,7 +1502,7 @@ cs: enabled_modules: "Povolené moduly" identifier: "Identifikátor" latest_activity_at: "Poslední aktivita" - parent: "Nadřazený projekt" + parent: "Podprojekt" project_creation_wizard_enabled: "Project initiation request" public_value: title: "Viditelnost" @@ -1877,7 +1874,7 @@ cs: message: cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." notifications: - at_least_one_channel: "Pro odesílání notifikací musí být specifikován alespoň jeden kanál" + at_least_one_channel: "Alespoň jeden kanál pro odesílání oznámení musí být specifikován." attributes: read_ian: read_on_creation: "nelze nastavit na pravdivé při vytváření oznámení " @@ -2178,11 +2175,11 @@ cs: member: "Člen" news: "Novinky" notification: - one: "Notifikace" - few: "Notifikací" - many: "Notifikací" - other: "Notifikace" - placeholder_user: "Placeholder uživatel" + one: "Oznámení" + few: "Oznámení" + many: "Oznámení" + other: "Oznámení" + placeholder_user: "placeholder uživatel" project: one: "Projekt" few: "Projekty" @@ -3268,7 +3265,7 @@ cs: ai: "Artificial Intelligence (AI)" aggregation: "Agregace" api_and_webhooks: "API & Webhooky" - mail_notification: "E-mailové notifikace" + mail_notification: "E-mailová upozornění" mails_and_notifications: "E-maily a oznámení" mcp_configurations: "Model Context Protocol (MCP)" quick_add: @@ -3354,7 +3351,7 @@ cs: by_project: "Nepřečteno dle projektu" by_reason: "Důvod" inbox: "Doručená pošta" - send_notifications: "Pro tuto akci odeslat notifikaci" + send_notifications: "Odeslat oznámení pro tuto akci" work_packages: subject: created: "Pracovní balíček byl vytvořen." @@ -3799,9 +3796,9 @@ cs: label_permissions: "Práva" label_permissions_report: "Přehled oprávnění" label_personalize_page: "Přizpůsobit tuto stránku" - label_placeholder_user: "Placeholder uživatel" + label_placeholder_user: "placeholder uživatel" label_placeholder_user_new: "" - label_placeholder_user_plural: "Placeholder uživatelé" + label_placeholder_user_plural: "placeholder uživatelé" label_planning: "Plánování" label_please_login: "Přihlaste se prosím" label_plugins: "Pluginy" @@ -3825,7 +3822,7 @@ cs: label_project_attribute_plural: "Atributy projektu" label_project_attribute_manage_link: "Správa atributů produktu" label_project_count: "Celkový počet projektů" - label_project_copy_notifications: "Během kopírování projektu odeslat notifikace e-mailem" + 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_latest: "Nejnovější projekty" label_project_default_type: "Povolit prázdný typ" @@ -3990,7 +3987,7 @@ cs: label_version_new: "Nová verze" label_version_edit: "Upravit verzi" label_version_plural: "Verze" - label_version_sharing_descendants: "S podprojekty" + label_version_sharing_descendants: "S Podprojekty" label_version_sharing_hierarchy: "S hierarchií projektu" label_version_sharing_none: "Není sdíleno" label_version_sharing_system: "Se všemi projekty" @@ -4098,28 +4095,28 @@ cs: digests: including_mention_singular: "včetně zmínky" including_mention_plural: "včetně %{number_mentioned} zmínění" - unread_notification_singular: "1 nepřečtená notifikace" - unread_notification_plural: "%{number_unread} nepřečtených notifikací" + unread_notification_singular: "1 nepřečtené oznámení" + unread_notification_plural: "%{number_unread} nepřečtených oznámení" you_have: "Máte" logo_alt_text: "Logo" mention: subject: "%{user_name} vás zmínil v #%{id} - %{subject}" notification: - center: "Centrum notifikací" + center: "Centrum oznámení" see_in_center: "Zobrazit komentář v oznamovacím centru" settings: "Změnit nastavení e-mailu" salutation: "Ahoj %{user}!" salutation_full_name: "Jméno a příjmení" work_packages: created_at: "Vytvořeno v %{timestamp} uživatelem %{user} " - login_to_see_all: "Přihlaste se pro zobrazení všech notifikací." + login_to_see_all: "Přihlaste se pro zobrazení všech oznámení." mentioned: "Byli jste zmíněni v komentáři" mentioned_by: "%{user} vás zmínil v komentáři OpenProject" more_to_see: - one: "Existuje ještě 1 pracovní balíček s notifikací." - few: "Existuje ještě %{count} pracovních balíčků s notifikacema." - many: "Existuje ještě %{count} pracovních balíčků s notifikacema." - other: "Existuje ještě %{count} pracovních balíčků s notifikacema." + one: "Máte ještě 1 pracovní balíček s notifikací." + few: "Existuje ještě %{count} pracovních balíčků s oznámeními." + many: "Máte ještě %{count} pracovních balíčků s notifikacemi." + other: "Existuje ještě %{count} pracovních balíčků s oznámeními." open_in_browser: "Otevřít v prohlížeči" reason: watched: "Sledováno" @@ -4128,7 +4125,7 @@ cs: mentioned: "Zmíněné" shared: "Sdílené" subscribed: "vše" - prefix: "Obdrženo z důvodu nastavení notifikací: %{reason}" + prefix: "Obdrženo z důvodu nastavení oznámení: %{reason}" date_alert_start_date: "Upozornění na datum" date_alert_due_date: "Upozornění na datum" reminder: "Připomínka" @@ -4428,7 +4425,7 @@ cs: permission_move_work_packages: "Přesun pracovních balíčků" permission_protect_wiki_pages: "Ochrana stránky wiki" permission_rename_wiki_pages: "Přejmenovat stránky wiki" - permission_save_queries: "Uložit zobrazení" + permission_save_queries: "Uložit pohled" permission_search_project: "Hledat projekt" permission_select_custom_fields: "Vybrat vlastní pole" permission_select_project_custom_fields: "Vyberte atributy projektu" @@ -4915,7 +4912,7 @@ cs: enable_subscriptions_text_html: Umožňuje uživatelům s nezbytnými oprávněními přihlásit se do OpenProject kalendářů a získat přístup k informacím o pracovním balíčku prostřednictvím externího klienta kalendáře. Poznámka: Před povolením si prosím přečtěte podrobnosti o odběru. language_name_being_default: "%{language_name} (výchozí)" notifications: - events_explanation: "Určuje, pro kterou událost je odeslán e-mail. Pracovní balíčky jsou z tohoto seznamu vyloučeny, protože notifikace pro ně mohou být nastavena speciálně pro každého uživatele." + events_explanation: "Určuje, pro kterou událost je odeslán e-mail. Pracovní balíčky jsou z tohoto seznamu vyloučeny, protože oznámení pro ně mohou být nastavena speciálně pro každého uživatele." delay_minutes_explanation: "Odesílání e-mailu může být pozdrženo, aby bylo uživatelům s nakonfigurovaným v oznámení aplikace před odesláním pošty potvrzeno oznámení. Uživatelé, kteří si přečtou oznámení v aplikaci, nedostanou e-mail pro již přečtené oznámení." other: "Ostatní" passwords: "Hesla" @@ -5096,7 +5093,7 @@ cs: text_destroy_with_associated: "Existují další objekty, které jsou přiřazeny k pracovním balíčkům a které mají být odstraněny. Tyto objekty jsou následující typy:" text_destroy_what_to_do: "Co chcete udělat?" text_diff_truncated: "... Toto rozlišení bylo zkráceno, protože přesahuje maximální velikost, kterou lze zobrazit." - text_email_delivery_not_configured: "Doručení e-mailu není nakonfigurováno a notifikace jsou zakázány.\nNakonfigurujte váš SMTP server pro jejich povolení." + text_email_delivery_not_configured: "Doručení e-mailu není nakonfigurováno a oznámení jsou zakázána.\nNakonfigurujte váš SMTP server pro jejich povolení." text_enumeration_category_reassign_to: "Přiřadit je k této hodnotě:" text_enumeration_destroy_question: "%{count} objektů je přiřazeno k této hodnotě." text_file_repository_writable: "Do adresáře příloh lze zapisovat" diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index 2de07160ad7..ec9183286fa 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -1354,9 +1354,6 @@ da: dependencies: "Aflæggere" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index d56e6007498..6a95c7903f1 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -86,11 +86,11 @@ de: type_token_text: "Your Enterprise token text" token_placeholder: "Enterprise-Token Text hier einfügen" token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." - add_token: "Enterprise-Edition Support Token hochladen" + add_token: "Enterprise edition Support Token hochladen" replace_token: "Aktuellen Enterprise edition Support Token ersetzen" order: "Enterprise on-premises bestellen" - paste: "Enterprise-Edition Support Token hier einfügen" - required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise-Edition Support-Token verfügbar." + paste: "Enterprise edition Support Token hier einfügen" + required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise edition Support-Token verfügbar." enterprise_link: "Klicken Sie hier für weitere Informationen." start_trial: "Kostenlose Testversion starten" book_now: "Jetzt buchen" @@ -1114,10 +1114,10 @@ de: tab: "Titel konfigurieren" manually_editable_subjects: label: "Manuell bearbeitbare Titel" - caption: "Nutzer:innen können die Titel der Arbeitspakete ohne Einschränkungen manuell eingeben und bearbeiten." + caption: "Benutzer können die Titel der Arbeitspakete ohne Einschränkungen manuell eingeben und bearbeiten." automatically_generated_subjects: label: "Automatisch generierte Titel" - caption: "Definieren Sie ein Schema aus referenzierten Attributen und Freitext für die automatische Generierung von Arbeitspakettiteln. Nutzer:innen können diese nicht manuell editieren." + caption: "Definieren Sie ein Schema aus referenzierten Attributen und Freitext für die automatische Generierung von Arbeitspakettiteln. Nutzer können diese nicht manuell editieren." token: label_with_context: "%{attribute_context}: %{attribute_label}" context: @@ -1171,7 +1171,7 @@ de: manual_with_children: "Hat Unteraufgaben aber ihre Startdaten werden ignoriert." title: automatic_mobile: "Automatisch geplant." - automatic_with_children: "Unteraufgaben bestimmen Termine." + automatic_with_children: "Die Termine sind durch untergeordnete Arbeitspakete bestimmt." automatic_with_predecessor: "Der Anfangstermin wird von einem Vorgänger festgelegt." manual_mobile: "Manuell geplant." manually_scheduled: "Manuell geplant – Daten unabhängig von Beziehungen." @@ -1273,7 +1273,7 @@ de: label_child_plural: "Unteraufgaben" new_child: "Neue Unteraufgabe" new_child_description: "Erstellt ein zugehöriges Arbeitspaket als Unteraufgabe des aktuellen (übergeordneten) Arbeitspakets" - child: "Unteraufgabe" + child: "Kind" child_description: "Macht das zugehörige Arbeitspaket zu einer Unteraufgabe des aktuellen (übergeordneten) Arbeitspakets" parent: "Übergeordnetes Arbeitspaket" parent_description: "Wandelt das verknüpfte in ein übergeordnetes Arbeitspaket dieses Arbeitspakets um" @@ -1348,9 +1348,6 @@ de: dependencies: "Abhängigkeiten" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "Enddatum" jira_import: projects: "Projects" announcements: @@ -1522,7 +1519,7 @@ de: column_names: "Spalten" relations_to_type_column: "Beziehungen zu %{type}" relations_of_type_column: "Beziehungen der Art: %{type}" - child_work_packages: "Unteraufgaben" + child_work_packages: "Kinder" group_by: "Gruppiere Ergebnisse nach" sort_by: "Ergebnisse sortieren nach" filters: "Filter" @@ -2022,7 +2019,7 @@ de: status_transition_invalid: "ist ungültig, da kein valider Übergang vom alten zum neuen Status für die aktuelle Rolle des Nutzers existiert." status_invalid_in_type: "ist ungültig, da der aktuelle Status nicht in diesem Typ vorhanden ist." type: - cannot_be_milestone_due_to_children: "kann kein Meilenstein werden, da dieses Arbeitspaket Unteraufgaben besitzt." + cannot_be_milestone_due_to_children: "kann kein Meilenstein werden, da dieses Arbeitspaket Unterelemente besitzt." priority_id: only_active_priorities_allowed: "muss aktiv sein." category: @@ -2833,7 +2830,7 @@ de: error_custom_option_not_found: "Option ist nicht vorhanden." error_enterprise_plan_needed: "Sie benötigen den Enterprise-Plan %{plan}, um diese Aktion durchzuführen." error_enterprise_activation_user_limit: "Ihr Konto konnte nicht aktiviert werden (Nutzerlimit erreicht). Bitte kontaktieren Sie Ihren Administrator um Zugriff zu erhalten." - error_enterprise_token_invalid_domain: "Die Enterprise-Edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected})." + error_enterprise_token_invalid_domain: "Die Enterprise edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected})." error_failed_to_delete_entry: "Fehler beim Löschen dieses Eintrags." error_in_dependent: "Fehler beim Versuch, abhängiges Objekt zu ändern: %{dependent_class} #%{related_id} - %{related_subject}: %{error}" error_in_new_dependent: "Fehler beim Versuch, abhängiges Objekt zu erstellen: %{dependent_class} - %{related_subject}: %{error}" @@ -3118,7 +3115,7 @@ de: dates: working: "%{date} ist jetzt ein Arbeitstag" non_working: "%{date} ist jetzt ein arbeitsfreier Tag" - progress_mode_changed_to_status_based: Fortschrittberechnung wurde auf Status-bezogen gesetzt + progress_mode_changed_to_status_based: Fortschrittberechnung wurde auf Status-basiert gesetzt status_excluded_from_totals_set_to_false_message: jetzt in den Gesamtwerten der Hierarchie enthalten status_excluded_from_totals_set_to_true_message: jetzt von den Hierarchie-Gesamtwerten ausgeschlossen status_percent_complete_changed: "% abgeschlossen von %{old_value}% auf %{new_value} % geändert" @@ -3442,7 +3439,7 @@ de: label_enumerations: "Aufzählungen" label_enterprise: "Enterprise" label_enterprise_active_users: "%{current}/%{limit} gebuchte aktive Nutzer" - label_enterprise_edition: "Enterprise Edition" + label_enterprise_edition: "Enterprise edition" label_enterprise_support: "Enterprise Support" label_environment: "Umgebung" label_estimates_and_progress: "Schätzungen und Fortschritt" @@ -4502,7 +4499,7 @@ de: update_timeout: "Speichere die Informationen bzgl. des genutzten Festplattenspeichers eines Projektarchivs für N Minuten.\nErhöhen Sie diesen Wert zur Verbesserung der Performance, da die Erfassung des genutzten Festplattenspeichers Ressourcen-intensiv ist." oauth_application_details: "Der Client Geheimcode wird nach dem Schließen dieses Fensters nicht mehr zugänglich sein. Bitte kopieren Sie diese Werte in die Nextcloud OpenProject Integrationseinstellungen:" oauth_application_details_link_text: "Zu den Einstellungen gehen" - setup_documentation_details: "Wenn Sie Hilfe bei der Konfiguration eines neuen Dateispeichers benötigen, konsultieren Sie bitte die Dokumentation: " + setup_documentation_details: "Wenn Sie Hilfe bei der Konfiguration eines neuen Datei-Speichers benötigen, konsultieren Sie bitte die Dokumentation: " setup_documentation_details_link_text: "Dateispeicher einrichten" show_warning_details: "Um diesen Dateispeicher nutzen zu können, müssen Sie das Modul und den spezifischen Speicher in den Projekteinstellungen jedes gewünschten Projekts aktivieren." subversion: @@ -5143,7 +5140,7 @@ de: warning_user_limit_reached_admin: > Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte aktualisieren Sie Ihr Abonnement um sicherzustellen, dass externe Benutzer auf diese Instanz zugreifen können. warning_user_limit_reached_instructions: > - Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise Edition Plan upzugraden und weitere Nutzer hinzuzufügen. + Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise edition Plan upzugraden und weitere Nutzer hinzuzufügen. warning_protocol_mismatch_html: > warning_bar: diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index fb67f25df61..57b070bba04 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -1352,9 +1352,6 @@ el: dependencies: "Εξαρτήσεις" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index 6779dfda1f5..07ef791bd6a 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -1356,9 +1356,6 @@ eo: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index f3650ca2464..6c0d246fb59 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -1179,7 +1179,7 @@ es: automatic_with_children: "Fechas determinadas por paquetes de trabajo secundarios." automatic_with_predecessor: "La fecha de inicio la fija un predecesor." manual_mobile: "Programado manualmente." - manually_scheduled: "Programado manualmente. No afectadas por relaciones." + manually_scheduled: "Programado manualmente. Fechas no afectadas por relaciones." blankslate: title: "Sin predecesores" description: "Para activar la programación automática, este paquete de trabajo debe tener al menos un predecesor. Entonces se programará automáticamente para que comience después del predecesor más cercano." @@ -1353,9 +1353,6 @@ es: dependencies: "Dependencias" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index 7f2a3ed8abf..a009c655182 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -1356,9 +1356,6 @@ et: dependencies: "Sõltuvused" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index 73d3fd29a00..f15c9a5d5b3 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -1356,9 +1356,6 @@ eu: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index b7eba19dd71..5c5b3a80da2 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -1356,9 +1356,6 @@ fa: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index b4a1ee11817..f72ba124822 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -1356,9 +1356,6 @@ fi: dependencies: "Riippuvuudet" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index f94b86ec54d..f2a89d6a70f 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -1356,9 +1356,6 @@ fil: dependencies: "Dependencia" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index a9b2bad06b9..e7f122f64d0 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -1354,9 +1354,6 @@ fr: dependencies: "Dépendances" activerecord: attributes: - agile/sprint: - sharing: "Partage" - finish_date: "Échéance" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index 978ba417f87..5e4e1041c14 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -1386,9 +1386,6 @@ he: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index 17db2f25d80..f7027f23832 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -1354,9 +1354,6 @@ hi: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index 91e626480a9..ec646cc69a3 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -1371,9 +1371,6 @@ hr: dependencies: "Ovisnosti" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index 9ac96368459..df761bda298 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -1355,9 +1355,6 @@ hu: dependencies: "Szükséges összetevők" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index b89c76dc52e..032c60ed143 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -1337,9 +1337,6 @@ id: dependencies: "Dependensi" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index baef3ff2334..3fffa58ab8e 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -1353,9 +1353,6 @@ it: dependencies: "Dipendenze" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index 3acbde43e90..58de6db40fe 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -108,7 +108,7 @@ ja: jemalloc_allocator: Jemalloc メモリアロケータ journal_aggregation: explanation: - text: "ユーザーの個々のアクション(例えば、ワークパッケージを2回更新する)は、それらの年齢差が指定されたタイムスパン未満である場合、単一のアクションに集約されます。これらはアプリケーション内で1つのアクションとして表示されます。これはまた、送信されるメールの数を減らし、 %{webhook_link} の遅延にも影響します。" + text: "ユーザーの個々のアクション (例:ワークパッケージを2回更新する)は、指定された時間範囲よりも時間差が小さい場合、単一のアクションに集約されます。 これらはアプリケーション内で単一のアクションとして表示されます。 これにより、送信されるメールの数が減少し、 %{webhook_link} の遅延にも影響します。" link: "webhook" import: title: "Import" @@ -307,13 +307,13 @@ ja: success: "MCP configuration was updated successfully." scim_clients: authentication_methods: - sso: "IDプロバイダーからのJWT" - oauth2_client: "OAuth 2.0クライアント認証情報" + sso: "アイデンティティプロバイダからのJWT" + oauth2_client: "OAuth 2.0 クライアント資格情報" oauth2_token: "静的アクセストークン" created_client_credentials_dialog_component: - title: "クライアント認証情報の作成" - heading: "クライアント認証情報が生成されました" - one_time_hint: "クライアント・シークレットが表示されるのはこの時だけです。必ずコピーしてください。" + title: "クライアントの資格情報が作成されました" + heading: "クライアントの資格情報が生成されました" + one_time_hint: "クライアントのシークレットが表示される唯一の時間です。今すぐコピーしてください。" created_token_dialog_component: title: "トークンを作成しました" heading: "トークンが生成されました" @@ -326,21 +326,21 @@ ja: edit: label_delete_scim_client: "SCIM クライアントを削除" form: - auth_provider_description: "これは、SCIM プロバイダによって追加されたユーザが OpenProject で認証するために使用するサービスです。" - authentication_method_description_html: "これは SCIM クライアントが OpenProject で認証する方法です。OAuth トークンにscim_v2スコープが含まれていることを確認してください。" - description: "これらの設定オプションの詳細については、[SCIMクライアントの設定に関する文書](docs_url)を参照してください。" + auth_provider_description: "これは、SCIMプロバイダが追加したユーザーがOpenProjectでの認証に使用するサービスです。" + authentication_method_description_html: "これは SCIM クライアントが OpenProject で認証する方法です。OAuth トークンに scim_v2 スコープが含まれていることを確認してください。" + description: "設定オプションの詳細については、[SCIM クライアントの設定に関するドキュメント](docs_url)を参照してください。" jwt_sub_description: "例えば、Keycloakの場合、これはSCIMクライアントに関連付けられたサービスアカウントのUUIDです。あなたのユースケースにあった Subject claim を見つける方法については [ドキュメント](docs_url) を参照してください。" - name_description: "このクライアントが設定された理由を他の管理者が理解しやすい名前を選んでください。" + name_description: "他の管理者がこのクライアントが設定された理由を理解するのに役立つ名前を選択してください。" index: - description: "ここで設定された SCIM クライアントは、OpenProject SCIM サーバ API と対話し、ユーザアカウントやグループのプロビジョニング、更新、デプロビジョニングを行うことができます。" - label_create_button: "SCIMクライアントの追加" + description: "ここで設定されたSCIMクライアントは、OpenProjectのSCIMサーバー APIと相互作用して、ユーザーアカウントとグループのプロビジョニング、更新、およびデプロビジョニングを行うことができます。" + label_create_button: "SCIMクライアントを追加" new: title: "新しいSCIMクライアント" revoke_static_token_dialog_component: confirm_button: "取り消す" - title: "静的トークンの失効" - heading: "このトークンを本当に取り消しますか?" - description: "このトークンを使っている SCIM クライアントは、OpenProject の SCIM サーバ API にアクセスできなくなります。" + title: "静的トークンを取り消す" + heading: "このトークンを取り消してもよろしいですか?" + description: "このトークンを使用する SCIM クライアントは、OpenProject の SCIM サーバ API にアクセスできなくなります。" table_component: blank_slate: title: "SCIMクライアントがまだ設定されていません" @@ -883,26 +883,26 @@ ja: other: "また、 %{shared_work_packages_link} はこのユーザーと共有されています。" remove_project_membership_or_work_package_shares_too: "直接のメンバーとしてのユーザーだけを削除したい(および共有を維持したい)、またはワークパッケージの共有も削除しますか?" will_remove_all_user_access_priveleges: "このメンバーを削除すると、プロジェクトへのユーザーのすべてのアクセス権が削除されます。ユーザーはまだサイトの一部として存在します。" - will_remove_all_group_access_priveleges: "このメンバを削除すると、プロジェクトに対するグループのすべてのアクセス権が削除されます。グループはサイトの一部としてまだ存在します。" - cannot_delete_inherited_membership: "このプロジェクトのメンバーであるグループに所属しているため、このメンバーを削除することはできません。" - cannot_delete_inherited_membership_note_admin_html: "%{administration_settings_link}で、プロジェクトのメンバーとしてグループを削除することも、特定のメンバーをグループから削除することもできます。" - cannot_delete_inherited_membership_note_non_admin: "プロジェクトのメンバーとしてグループを削除するか、管理者に連絡してこの特定のメンバーをグループから削除することができます。" + will_remove_all_group_access_priveleges: "このメンバーを削除すると、グループのすべてのアクセス権がプロジェクトに削除されます。グループはサイトの一部として存在します。" + cannot_delete_inherited_membership: "このメンバーはこのプロジェクトのメンバーであるグループに属しているため、削除できません。" + cannot_delete_inherited_membership_note_admin_html: "プロジェクトのメンバーとしてグループを削除するか、 %{administration_settings_link} のグループからこの特定のメンバーを削除することができます。" + cannot_delete_inherited_membership_note_non_admin: "プロジェクトのメンバーとしてグループを削除するか、管理者に問い合わせてグループから特定のメンバーを削除することができます。" delete_work_package_shares_dialog: - title: "ワーク・パッケージ・シェアの破棄" + title: "ワークパッケージの共有の取り消し" shared_with_this_user_html: other: "%{all_shared_work_packages_link} はこのユーザーと共有されています。" shared_with_this_group_html: other: "%{all_shared_work_packages_link} はこのグループと共有されています。" shared_with_permission_html: other: "%{shared_work_packages_link} のみが %{shared_role_name} 権限と共有されています。" - revoke_all_or_with_role: "すべての共有ワークパッケージ、または %{shared_role_name} 権限を持つワークパッケージのみへのアクセス権を剥奪しますか?" - will_not_affect_inherited_shares: "(これは、そのグループと共有しているワークパッケージには影響しません)。" - cannot_remove_inherited: "グループで共有されたワークパッケージの共有は削除できません。" - cannot_remove_inherited_with_role: "ロール %{shared_role_name} で共有されるワークパッケージは、グループを介して共有され、削除することはできません。" - cannot_remove_inherited_note_admin_html: "%{administration_settings_link}、グループへの共有を取り消すか、グループからこの特定のメンバーを削除することができます。" - cannot_remove_inherited_note_non_admin: "グループへの共有を取り消すか、管理者に連絡して特定のメンバーをグループから削除することができます。" - will_revoke_directly_granted_access: "このアクションは、グループと共有されているワークパッケージ以外の、すべてのワークパッケージへのアクセス権を剥奪する。" - will_revoke_access_to_all: "このアクションは、すべてのアクセス権を剥奪する。" + revoke_all_or_with_role: "共有されたワークパッケージ、または %{shared_role_name} 権限を持つワークパッケージのみへのアクセスを取り消しますか?" + will_not_affect_inherited_shares: "(これはグループと共有されているワークパッケージには影響しません)。" + cannot_remove_inherited: "グループ間で共有されるワークパッケージは削除できません。" + cannot_remove_inherited_with_role: "ワークパッケージとロール %{shared_role_name} が共有されているため、削除できません。" + cannot_remove_inherited_note_admin_html: "あなたは、グループへの共有を取り消すか、 %{administration_settings_link} のグループからこの特定のメンバーを削除することができます。" + cannot_remove_inherited_note_non_admin: "共有をグループに取り消すか、管理者に問い合わせてグループから特定のメンバーを削除することができます。" + will_revoke_directly_granted_access: "このアクションは、すべてのユーザーへのアクセスを取り消しますが、グループと共有されているワークパッケージです。" + will_revoke_access_to_all: "このアクションは、すべてのユーザーへのアクセスを取り消します。" my: access_token: dialog: @@ -926,7 +926,7 @@ ja: no_results_title_text: "現在、有効なアクセス トークンはありません。" notice_api_token_revoked: "APIトークンが削除されました。新しいトークンを作成するには、APIセクションの作成ボタンを使用してください。" notice_rss_token_revoked: "RSSトークンが削除されました。新しいトークンを作成するには、RSSセクションのリンクを使用してください。" - notice_ical_token_revoked: 'プロジェクト "%{project_name}" のカレンダー "%{calendar_name}" の iCalendar トークン "%{token_name}" が失効しました。このトークンを持つiCalendar URLは無効になりました。' + notice_ical_token_revoked: 'プロジェクト "%{token_name}" のカレンダー "%{calendar_name}" の iCalendar トークン "%{project_name}" が取り消されました。 このトークンのiCalendar URLは無効です。' password_confirmation_dialog: confirmation_required: "You need to enter your account password to confirm this change." title: "Confirm your password to continue" @@ -947,7 +947,7 @@ ja: matrix_check_uncheck_all_in_col_label_html: "Toggle all %{module} permissions for %{role} role" users: autologins: - prompt: "ログインしたまま %{num_days}" + prompt: "%{num_days} のログインを維持" sessions: session_name: "%{browser_name} %{browser_version} の %{os_name}" browser: "ブラウザ" @@ -961,17 +961,17 @@ ja: current: "Current (this device)" title: "セッション管理" instructions: "You are logged in to your account through the following devices. Revoke sessions that you do not recognise or from devices you do not control." - may_not_delete_current: "現在のセッションを削除することはできません。" + may_not_delete_current: "現在のセッションは削除できません。" deletion_warning: "Are you sure you want to revoke this session? You will be logged out on this device." groups: member_in_these_groups: "このユーザーは現在以下のグループのメンバーです:" no_results_title_text: このユーザーは現在どのグループのメンバーでもありません。 - summary_with_more: '%{names} と %{count_link}のメンバー。' - more: "%{count} もっと見る" - summary: '%{names}のメンバー。' + summary_with_more: '%{names} と %{count_link} のメンバー。' + more: "%{count} 以上" + summary: '%{names} のメンバー .' memberships: no_results_title_text: このユーザは現在プロジェクトのメンバーではありません。 - open_profile: "プロフィール" + open_profile: "プロファイルを開く" invite_user_modal: invite: "招待" title: @@ -1028,7 +1028,7 @@ ja: placeholder_users: right_to_manage_members_missing: > プレースホルダーユーザを削除する権限がありません。 プレースホルダー ユーザーがメンバーであるすべてのプロジェクトのメンバーを管理する権利はありません。 - delete_tooltip: "プレースホルダー・ユーザーの削除" + delete_tooltip: "プレースホルダー ユーザーを削除" deletion_info: heading: "プレースホルダー ユーザー %{name} を削除" data_consequences: > @@ -1046,11 +1046,11 @@ ja: reactions: action_title: "リアクト" add_reaction: "リアクションを追加" - react_with: "%{reaction} と リアクト" - and_user: "および %{user}" + react_with: "%{reaction} で反応する" + and_user: "と %{user}" and_others: other: と %{count} その他 - reaction_by: "%{reaction} によって" + reaction_by: "%{reaction} による" reportings: index: no_results_title_text: 現在、ステータス報告はありません。 @@ -1061,19 +1061,20 @@ ja: このステータスの色を割り当てたり変更する場合にクリックします。 ステータスボタンに表示され、テーブル内のワークパッケージを強調表示するために使用できます。 status_default_text: |- - 新しいワークパッケージは、デフォルトでこのタイプに設定される。読み取り専用にはできない。 + 新しいワークパッケージはデフォルトでこのタイプに設定されています。読み取り専用にすることはできません。 status_excluded_from_totals_text: |- - このステータスを持つワークパッケージを、階層内の「作業」、「 - 残作業」、「完了率」の合計から除外するには、このオプションをオンにします。 + このオプションをオンにすると、このステータスのワークパッケージを合計作業量、 + 残作業量、および階層構造で完了させることができます。 status_percent_complete_text: |- ステータスベースの進捗計算モードでは、このステータスが選択されると、作業 パッケージの「完了%」が自動的にこの値に設定される。 ワークベースモードでは無視される。 status_readonly_html: | - このステータスを持つワークパッケージを読み取り専用としてマークするには、このオプションをチェックする。 - ステータス以外の属性は変更できません。 + ワークパッケージを読み取り専用としてマークするには、このオプションをオンにしてください。 + ステータスを除いて変更することはできません。 +
- 注意: 継承された値 (子やリレーションなど) は適用されます。 + メモ: 継承された値 (例えば、子や関連) が適用されます。 index: no_results_title_text: 現在、ワークパッケージのステータスはありません。 no_results_content_text: 新しいステータスを追加 @@ -1083,7 +1084,7 @@ ja: is_readonly: "読み取り専用" excluded_from_totals: "合計から除外" themes: - dark: "暗い" + dark: "ダーク" light: "ライト" sync_with_os: "自動(OSのテーマ設定に追従)" types: @@ -1201,15 +1202,15 @@ ja: could_not_be_saved: "次のワークパッケージを保存できませんでした:" none_could_be_saved: "%{total} ワークパッケージのどれも更新できませんでした。" x_out_of_y_could_be_saved: "%{failing} の %{total} ワークパッケージのうち、 %{success} を更新できませんでした。" - selected_because_descendants: "%{selected} のワークパッケージが選択されたが、合計 %{total} のワークパッケージが影響を受け、その中には子孫も含まれる。" - descendant: "選択された子孫" + selected_because_descendants: "%{selected} ワークパッケージが選択されている間、合計で %{total} ワークパッケージが子孫を含む影響を受けます。" + descendant: "選択された子孫です" move: no_common_statuses_exists: "選択されたすべてのワークパッケージに利用できるステータスはありません。 それらの状態は変更できません。" unsupported_for_multiple_projects: "複数のプロジェクトからのワークパッケージの一括移動 / コピーはサポートされていません" current_type_not_available_in_target_project: > - ワークパッケージの現在のタイプがターゲットプロジェクトで有効になっていません。変更しない場合は、ターゲットプロジェクトでタイプを有効にしてください。そうでない場合は、リストからターゲットプロジェクトで使用可能なタイプを選択してください。 + ターゲット プロジェクトで現在のワークパッケージのタイプが有効になっていません。 変更を行わないようにしたい場合は、対象プロジェクトのタイプを有効にしてください。 それ以外の場合は、リストからターゲット プロジェクトで使用可能なタイプを選択します。 bulk_current_type_not_available_in_target_project: > - ワークパッケージの現在のタイプがターゲットプロジェクトで有効になっていません。変更しない場合は、ターゲットプロジェクトでタイプを有効にしてください。そうでない場合は、リストからターゲットプロジェクトで使用可能なタイプを選択してください。 + 現在のタイプのワークパッケージはターゲット プロジェクトで有効になっていません。 変更を行わないようにしたい場合は、対象プロジェクトのタイプを有効にしてください。 それ以外の場合は、リストからターゲット プロジェクトで使用可能なタイプを選択します。 sharing: missing_workflow_warning: title: "ワークパッケージの共有のためのワークフローがありません" @@ -1233,9 +1234,9 @@ ja: no_results_title_text: 現在、有効なバージョンはありません。 work_package_relations_tab: index: - action_bar_title: "他のワークパッケージとのリレーションを追加して、それらの間にリンクを作成する。" - no_results_title_text: 現在、利用可能な関係はない。 - blankslate_heading: "関係なし" + action_bar_title: "他のワークパッケージにリレーションを追加して、その間にリンクを作成します。" + no_results_title_text: 現在利用可能なリレーションはありません。 + blankslate_heading: "リレーションなし" blankslate_description: "このワークパッケージにはまだリレーションがありません。" label_add_child_button: "子要素" label_add_x: "%{x} を追加" @@ -1339,9 +1340,6 @@ ja: dependencies: "依存関係" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/js-ca.yml b/config/locales/crowdin/js-ca.yml index b4773fd1995..1ad220d568b 100644 --- a/config/locales/crowdin/js-ca.yml +++ b/config/locales/crowdin/js-ca.yml @@ -104,7 +104,7 @@ ca: button_save: "Desa" button_settings: "Configuració" button_uncheck_all: "Desmarca-ho tot" - button_update: "Actualitzar" + button_update: "Actualitza" button_export-atom: "Descarregar Atom" button_generate_pdf: "Generate PDF" button_create: "Crear" diff --git a/config/locales/crowdin/js-de.yml b/config/locales/crowdin/js-de.yml index 902f1884686..d37cb74b060 100644 --- a/config/locales/crowdin/js-de.yml +++ b/config/locales/crowdin/js-de.yml @@ -138,7 +138,7 @@ de: description_available_columns: "Verfügbare Spalten" description_current_position: "Sie sind hier: " description_select_work_package: "Arbeitspaket #%{id} auswählen" - description_subwork_package: "Unteraufgabe von Arbeitspaket #%{id}" + description_subwork_package: "Kind von Arbeitspaket #%{id}" editor: revisions: "Lokale Änderungen anzeigen" no_revisions: "Keine lokalen Änderungen gefunden" @@ -455,7 +455,7 @@ de: label_total_progress: "%{percent}% Gesamtfortschritt" label_total_amount: "Gesamt: %{amount}" label_updated_on: "aktualisiert am" - label_value_derived_from_children: "(aggregierter Wert von Unteraufgaben)" + label_value_derived_from_children: "(aggregierter Wert von Kindelementen)" label_children_derived_duration: "Aggregierte Dauer der Unteraufgaben" label_warning: "Warnung" label_work_package: "Arbeitspaket" @@ -864,7 +864,7 @@ de: title: "Neues Arbeitspaket" header: "Neu: %{type}" header_no_type: "Neues Arbeitspaket (Typ noch nicht gesetzt)" - header_with_parent: "Neu: %{type} (Unteraufgabe von %{parent_type} #%{id})" + header_with_parent: "Neu: %{type} (Kind von %{parent_type} #%{id})" button: "Erstellen" duplicate: title: "Arbeitspaket duplizieren" @@ -1061,7 +1061,7 @@ de: single_text: "Sind Sie sicher, dass Sie das Arbeitspaket löschen möchten?" bulk_text: "Sind Sie sicher, dass Sie die folgenden %{label} löschen möchten?" has_children: "Dieses Arbeitspaket hat %{childUnits}:" - confirm_deletion_children: "Ich bestätige, dass alle Unteraufgaben der hier aufgeführten Arbeitspakete rekursiv entfernt werden." + confirm_deletion_children: "Ich bestätige, dass alle untergordneten Elemente der hier aufgeführten Arbeitspakete rekursiv entfernt werden." deletes_children: "Alle Unteraufgaben und deren Nachkommen werden auch rekursiv gelöscht." destroy_time_entry: title: "Löschen der Zeitbuchung bestätigen" diff --git a/config/locales/crowdin/js-ja.yml b/config/locales/crowdin/js-ja.yml index f4cba405f83..7121902ba95 100644 --- a/config/locales/crowdin/js-ja.yml +++ b/config/locales/crowdin/js-ja.yml @@ -32,12 +32,12 @@ ja: draggable_hint: | 埋め込み画像または添付ファイルをエディタにドラッグします。 ドラッグしつづけると閉じているエディタ領域が開きます。 - quarantined_hint: "ウイルスが発見されたように、ファイルは隔離されています。ダウンロードできません。" + quarantined_hint: "ウイルスが発見されたため,ファイルは隔離されています。ダウンロードできません。" autocomplete_ng_select: - add_tag: "アイテムを追加" + add_tag: "項目を追加" clear_all: "すべてクリア" loading: "読み込み中..." - not_found: "アイテムが見つかりません" + not_found: "見つかりませんでした" type_to_search: "検索キーワードを入力" autocomplete_select: placeholder: @@ -67,7 +67,7 @@ ja: button_back_to_list_view: "リスト表示に戻る" button_cancel: "キャンセル" button_close: "閉じる" - button_change_project: "別のプロジェクトに移動" + button_change_project: "他のプロジェクトに移る" button_check_all: "全てを選択" button_configure-form: "フォームを設定" button_confirm: "確認" @@ -75,7 +75,7 @@ ja: button_copy: "コピー" button_copy_to_clipboard: "クリップボードにコピー" button_copy_link_to_clipboard: "クリップボードにリンクをコピー" - button_copy_to_other_project: "別のプロジェクトで複製" + button_copy_to_other_project: "別のプロジェクトで複製する" button_custom-fields: "カスタムフィールド" button_delete: "削除" button_delete_watcher: "ウォッチャーを削除" @@ -97,7 +97,7 @@ ja: button_open_fullscreen: "全画面表示を開く" button_show_cards: "カードビュー表示" button_show_list: "リストビュー表示" - button_show_table: "テーブルビューを表示" + button_show_table: "テーブル表示" button_show_gantt: "ガントビューを表示" button_show_fullscreen: "全画面表示" button_more_actions: "その他の操作" @@ -107,7 +107,7 @@ ja: button_uncheck_all: "全てを選択解除" button_update: "更新" button_export-atom: "Atomをダウンロード" - button_generate_pdf: "PDFを生成" + button_generate_pdf: "PDF作成" button_create: "作成" card: add_new: "新規カード追加" @@ -141,8 +141,8 @@ ja: description_select_work_package: "ワークパッケージを選択 #%{id}" description_subwork_package: "ワークパッケージの子 #%{id}" editor: - revisions: "ローカルの変更を表示" - no_revisions: "ローカルの変更は見つかりませんでした" + revisions: "ローカルの修正を表示" + no_revisions: "ローカルでの修正は見つからず" preview: "プレビューモードの切り替え" source_code: "Markdown ソースモードの切り替え" error_saving_failed: "次のエラーで文書を保存するのに失敗しました: %{error}" @@ -155,7 +155,7 @@ ja: attribute_reference: macro_help_tooltip: "このテキストセグメントはマクロによって動的にレンダリングされています。" not_found: "要求されたリソースが見つかりませんでした" - nested_macro: "このマクロは %{model} %{id} を再帰的に参照しています。" + nested_macro: "このマクロは %{model} %{id}を再帰的に参照している。" invalid_attribute: "選択した属性 '%{name}' は存在しません。" child_pages: button: "子ページへのリンク" @@ -211,10 +211,10 @@ ja: calendar: empty_state_header: "休業日" empty_state_description: '休業日が定義されていません。「休業日を追加」ボタンをクリックして日付を追加してください。' - new_date: "(新規)" + new_date: "(新)" add_non_working_day: "休業日を追加" - already_added_error: "この日付の非作業日はすでに存在します。それぞれの日付に1つの非作業日が作成されます。" - change_button: "保存してスケジュールを変更" + already_added_error: "この日付の非営業日はすでに存在します。一意の日付に対して作成できる非営業日は1つだけです。" + change_button: "保存して再スケジュール" change_title: "営業日を変更する" removed_title: "以下の日を非稼働日リストから削除します:" change_description: "営業日とみなす曜日を変更すると、このサイト内のすべてのプロジェクトのすべてのワークパッケージの開始日と終了日に影響を与える可能性があります。" @@ -296,14 +296,14 @@ ja: ical_sharing_modal: title: "カレンダーを購読する" inital_setup_error_message: "データ取得中にエラーが発生しました。" - description: "URL(iCalendar)を使って外部クライアントでこのカレンダーを購読し、そこから最新のワークパッケージ情報を見ることができます。" - warning: "このURLを他のユーザーと共有しないでください。このリンクがあれば、誰でもアカウントやパスワードなしでワークパッケージの詳細を見ることができます。" - token_name_label: "どこで使うのですか?" + description: "URL(iCalendar)を使用して、外部クライアントでこのカレンダーを購読し、そこから最新のワークパッケージ情報を表示することができます。" + warning: "このURLを他のユーザーと共有しないでください。このリンクを持つ誰でもアカウントやパスワードなしでワークパッケージの詳細を表示することができます。" + token_name_label: "どこで使うのですか??" token_name_placeholder: '名前を入力してください。例:"電話"' token_name_description_text: 'If you subscribe to this calendar from multiple devices, this name will help you distinguish between them in your access tokens list.' copy_url_label: "URLをコピー" - ical_generation_error_text: "カレンダー URL の生成中にエラーが発生しました。" - success_message: 'URL "%{name}" は正常にクリップボードにコピーされました。サブスクリプションを完了するためにカレンダークライアントに貼り付けてください。' + ical_generation_error_text: "カレンダーのURL生成時にエラーが発生しました。" + success_message: 'URL "%{name}" がクリップボードにコピーされました。カレンダークライアントに貼り付けて購読を完了してください。' label_activate: "有効にする" label_assignee: "担当者" label_assignee_alt_text: "This work package is assigned to %{name}" @@ -316,7 +316,7 @@ ja: label_add_row_before: "前に行を追加" label_add_selected_columns: "選択した列を追加" label_added_by: "追加した人" - label_added_time_by: '%{author} が %{age} に追加しました' + label_added_time_by: '追加 %{author} %{age}' label_ago: "○日前" label_all: "全て" label_all_projects: "すべてのプロジェクト" @@ -429,7 +429,7 @@ ja: label_repository_plural: "リポジトリ" label_resize_project_menu: "Resize project menu" label_save_as: "名前をつけて保存" - label_search_columns: "列を検索" + label_search_columns: "列を検索する" label_select_watcher: "ウォッチャーを選択..." label_selected_filter_list: "選択されたフィルタ" label_show_attributes: "すべての属性を表示" @@ -467,8 +467,8 @@ ja: label_watch_work_package: "ワークパッケージをウォッチ" label_watcher_added_successfully: "ウォッチャーが正常に追加されました !" label_watcher_deleted_successfully: "ウォッチャーが正常に削除されました !" - label_work_package_details_you_are_here: "あなたは %{tab} %{type} %{subject} のタブにいます。" - label_work_package_context_menu: "ワークパッケージのコンテキスト メニュー" + label_work_package_details_you_are_here: "あなたは %{type} %{subject}の %{tab} タブを表示しています。" + label_work_package_context_menu: "ワークパッケージのコンテキストメニュー" label_unwatch: "ウォッチしない" label_unwatch_work_package: "ワークパッケージのウォッチを削除" label_uploaded_by: "アップロードした人" @@ -499,7 +499,7 @@ ja: label_version_plural: "バージョン" label_view_has_changed: "このビューには未保存の変更があります。 クリックすると保存します。" help_texts: - show_modal: "ヘルプテキストを表示" + show_modal: "ヘルプテキストを表示する" onboarding: buttons: skip: "スキップ" @@ -507,7 +507,7 @@ ja: got_it: "了承" steps: help_menu: "ヘルプ(?)メニューは、その他のヘルプリソースを提供します。ここでは、ユーザーガイド、役立つハウツービデオなどを見つけることができます。
OpenProjectでの作業をお楽しみください!" - members: "新しい メンバー をプロジェクトに招待します。" + members: "新しいメンバーをプロジェクトに招待する。" quick_add_button: "ヘッダーナビゲーションにあるプラス(+)アイコンをクリックして、新規プロジェクトを作成したり、同僚を招待したりできます。" sidebar_arrow: "プロジェクトのメインメニューに戻るには、左上の矢印を使います。" welcome: "3分間のイントロダクションツアーで、最も重要な機能を学びましょう。
最後までステップを完了することをお勧めします。ツアーはいつでも再開できます。" @@ -614,33 +614,33 @@ ja: work_package_commented: "すべての新着コメント" work_package_created: "新しいワークパッケージ" work_package_processed: "すべてのステータス変更" - work_package_prioritized: "すべての優先度の変更" - work_package_scheduled: "すべての日付の変更" + work_package_prioritized: "すべての優先順位の変更" + work_package_scheduled: "すべての日付変更" global: immediately: title: "参加" - description: "自分が関与しているワークパッケージのすべてのアクティビティに関する通知(アサイニー、アカウンタブル、ウォッチャー)。" + description: "自分が関与しているワークパッケージのすべてのアクティビティに関する通知(担当、責任、ウォッチャー)。" delayed: title: "不参加" - description: "すべてのプロジェクトでのアクティビティの追加通知。" + description: "全プロジェクトにおける活動の追加通知。" date_alerts: title: "日付アラート" - description: "あなたが関与している(アサイニー、アカウンタブル、ウォッチャー)オープンワークパッケージの重要な日付が近づくと自動通知。" + description: "あなたが関与している(担当、責任、ウォッチャー)オープンワークパッケージの重要な日付が近づくと自動通知。" overdue: 期限を過ぎた場合 project_specific: title: "プロジェクト固有の通知設定" - description: "これらのプロジェクト固有の設定は、上記のデフォルト設定を上書きする。" + description: "これらのプロジェクト固有の設定は、上記のデフォルト設定を上書きします。" add: "プロジェクトの設定を追加する" - already_selected: "このプロジェクトは既に選択されています" + already_selected: "このプロジェクトはすでに選ばれている" remove: "プロジェクトの設定を削除する" pagination: no_other_page: "このページだけです。" - pages_skipped: "ページがスキップされました。" + pages_skipped: "ページスキップ。" page_navigation: "ページネーション・ナビゲーション" per_page_navigation: 'ページ毎のアイテム選択' pages: page_number: ページ %{number} - show_per_page: ページあたり %{number} を表示 + show_per_page: ページごとに %{number} placeholders: default: "-" subject: "ここにタイトルを入力します" @@ -650,7 +650,7 @@ ja: project: autocompleter: label: "プロジェクト名の入力補完" - click_to_switch_to_project: "プロジェクト: %{projectname}" + click_to_switch_to_project: "プロジェクト: %{projectname}" context: "プロジェクトのコンテキスト" not_available: "プロジェクトなし" required_outside_context: > @@ -658,30 +658,30 @@ ja: reminders: settings: daily: - add_time: "時間を追加" + add_time: "時間を追加する" enable: "毎日のEメールリマインダーを有効にする" explanation: "このリマインダーは、未読の通知に対してのみ、指定した時間帯にのみ届きます。 %{no_time_zone}" no_time_zone: "アカウントにタイムゾーンを設定するまでは、時間はUTCで解釈されます。" time_label: "時間 %{counter}:" - title: "未読の通知を毎日メールで通知する" + title: "未読通知メールのリマインダーを毎日送信する" workdays: title: "これらの日にリマインダーメールを受け取る" immediate: title: "電子メールのリマインダーを送信" mentioned: "@mentionするとすぐに" - personal_reminder: "個人的なリマインダーを受け取ったら直ちに" + personal_reminder: "個人的なリマインダーを受け取ったとき" alerts: title: "その他の項目(ワークパッケージではないもの)に対する電子メールアラート" explanation: > 本日の通知はワークパッケージに限定されています。これらのイベントが通知に含まれるようになるまで、Eメールアラートを受信し続けることを選択できます: news_added: "ニュースが追加されました。" news_commented: "ニュースへのコメント" - document_added: "追加された書類" + document_added: "ドキュメントの追加" forum_messages: "新しいフォーラムメッセージ" wiki_page_added: "Wikiページが追加されました。" wiki_page_updated: "Wikiページが更新されました。" - membership_added: "メンバーシップが追加されました" - membership_updated: "メンバーシップ更新" + membership_added: "メンバーシップの追加" + membership_updated: "メンバーシップの更新" title: "電子メールによるリマインダー" pause: label: "毎日のEメールリマインダーを一時停止する" @@ -1172,7 +1172,7 @@ ja: toggle_title: "ベースライン" clear: "クリア" apply: "適用" - header_description: "過去のいずれかの時点からこのリストに加えられた変更を強調する。" + header_description: "過去の選択した時点からこのリストに加えられた変更をハイライト" show_changes_since: "以降の変更を表示する" help_description: "ベースラインの基準タイムゾーン。" time_description: "現地時間: %{datetime}" diff --git a/config/locales/crowdin/js-no.yml b/config/locales/crowdin/js-no.yml index 37d78447d18..1594fc635ae 100644 --- a/config/locales/crowdin/js-no.yml +++ b/config/locales/crowdin/js-no.yml @@ -104,7 +104,7 @@ button_save: "Lagre" button_settings: "Innstillinger" button_uncheck_all: "Avmerk alle" - button_update: "Oppdater" + button_update: "Oppdatèr" button_export-atom: "Last ned Atom" button_generate_pdf: "Generate PDF" button_create: "Opprett" diff --git a/config/locales/crowdin/js-ro.yml b/config/locales/crowdin/js-ro.yml index 16b185d9890..7b76eb3d468 100644 --- a/config/locales/crowdin/js-ro.yml +++ b/config/locales/crowdin/js-ro.yml @@ -104,7 +104,7 @@ ro: button_save: "Salvează" button_settings: "Setări" button_uncheck_all: "Deselectează tot" - button_update: "Actualizează" + button_update: "Actualizare" button_export-atom: "Descarcă Atom" button_generate_pdf: "Generează PDF" button_create: "Creează" diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index 9a21927c4a5..66046d33eda 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -104,7 +104,7 @@ ru: button_save: "Сохранить" button_settings: "Настройки" button_uncheck_all: "Снять все отметки" - button_update: "Обновить" + button_update: "Обновление" button_export-atom: "Скачать Atom" button_generate_pdf: "Создать PDF" button_create: "Создать" diff --git a/config/locales/crowdin/js-vi.yml b/config/locales/crowdin/js-vi.yml index 8be53ce498e..fd2da032e6c 100644 --- a/config/locales/crowdin/js-vi.yml +++ b/config/locales/crowdin/js-vi.yml @@ -104,7 +104,7 @@ vi: button_save: "lưu lại" button_settings: "cài đặt" button_uncheck_all: "Bỏ chọn tất cả" - button_update: "cập nhật" + button_update: "Cập Nhật" button_export-atom: "Tải xuống nguyên tử" button_generate_pdf: "Tạo PDF" button_create: "Tạo mới" diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index 288540d8c4b..49e410a8bcf 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -1356,9 +1356,6 @@ ka: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index eab6e7cd4ca..a950ed22f50 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -1356,9 +1356,6 @@ kk: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 66c22a00ef4..b513d9e907f 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -1341,9 +1341,6 @@ ko: dependencies: "종속성" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index 62bfc7d70be..98cce203c54 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -1383,9 +1383,6 @@ lt: dependencies: "Priklausomybės" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index 95aaf4dabf0..87ef715d0f3 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -1371,9 +1371,6 @@ lv: dependencies: "Saistītie projekti" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index f70d94d9e9d..ea277d839a5 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -1356,9 +1356,6 @@ mn: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 8a5dd90ea60..2d77602e345 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -1339,9 +1339,6 @@ ms: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index f5b3e178a82..cd63cb7410a 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -1356,9 +1356,6 @@ ne: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index 3fd970fdde6..85857faccfb 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -1352,9 +1352,6 @@ nl: dependencies: "Afhankelijkheden" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index 44712db1b40..769b890fe45 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -1355,9 +1355,6 @@ dependencies: "Avhengigheter" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 67d344d76ab..a31b23bec2c 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -1382,9 +1382,6 @@ pl: dependencies: "Zależności" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index c43e7284959..22830366107 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -1353,9 +1353,6 @@ pt-BR: dependencies: "Dependências" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index 2ac005c3687..f56a8688ef4 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -1353,9 +1353,6 @@ pt-PT: dependencies: "Dependências" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index cc66c9a646e..0cef99f1041 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -1371,9 +1371,6 @@ ro: dependencies: "Dependenţe" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: @@ -3492,7 +3489,7 @@ ro: label_duplicated_by: "dublat de" label_duplicate: "duplicat" label_duplicates: "dublează" - label_edit: "Editează" + label_edit: "Editare" label_edit_x: "Editare: %{x}" label_view_x: "View: %{x}" label_enable_multi_select: "Comutare selecție multiplă" @@ -3550,7 +3547,7 @@ ro: label_global_roles: "Roluri globale" label_git_path: "Calea catre directorul .git" label_greater_or_equal: ">=" - label_group_by: "Grupează după" + label_group_by: "Grupare după" label_group_new: "Grupare nouă" label_group: "Grup" label_group_named: "Grup %{name}" diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 584135cdf40..55ea66d07c5 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -1384,9 +1384,6 @@ ru: dependencies: "Связи" activerecord: attributes: - agile/sprint: - sharing: "Совместное использование" - finish_date: "Дата окончания" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index b77984ac9cc..46514f36468 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -1356,9 +1356,6 @@ rw: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index 90901aad9f3..f0120b27fc5 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -1356,9 +1356,6 @@ si: dependencies: "පරායත්තතා" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index 9cdebf34ec4..611df241eb7 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -1386,9 +1386,6 @@ sk: dependencies: "Závislosti" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 6d29966e804..94e8d7c860b 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -1385,9 +1385,6 @@ sl: dependencies: "Odvisnosti" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: @@ -2629,8 +2626,8 @@ sl: - "avgust" - "september" - "oktober" - - "november" - - "december" + - "November" + - "December" order: - :leto - :mesec diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index ab1c872c6cc..ef79b84aaf1 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -1371,9 +1371,6 @@ sr: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index 63b310afc06..bc664e57150 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -1356,9 +1356,6 @@ sv: dependencies: "Beroenden" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index bee2e4107d8..9293599892f 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -1341,9 +1341,6 @@ th: dependencies: "ส่วนที่อ้างอิง" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 497bafc807f..9796d650487 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -1356,9 +1356,6 @@ tr: dependencies: "Bağımlılıklar" activerecord: attributes: - agile/sprint: - sharing: "Paylaşım" - finish_date: "Bitiş tarihi" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index 4ac29d7f295..4249f7dedd5 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -1380,9 +1380,6 @@ uk: dependencies: "Залежності" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: @@ -3627,7 +3624,7 @@ uk: label_index_by_title: "Індекс за назвою" label_information: "Інформація" label_information_plural: "Інформація" - label_installation_guides: "Інструкції із встановлення" + label_installation_guides: "Інструкції зі встановлення" label_integer: "Ціле число" label_interface: "Інтерфейс" label_internal: "Власне" diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index aeb71161bef..0ec9dba34bc 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -1356,9 +1356,6 @@ uz: dependencies: "Dependencies" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index 620186871e9..07a492636ef 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -1339,9 +1339,6 @@ vi: dependencies: "phụ thuộc" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: @@ -2206,7 +2203,7 @@ vi: body: "cơ thể" blocks_ids: "ID của các work package bị chặn" category: "thể loại" - comment: "bình luận" + comment: "Nhận xét" comments: "bình luận" content: "Nội dung" color: "màu sắc" @@ -3799,7 +3796,7 @@ vi: label_used_by: "Được dùng bởi" label_used_by_types: "Được sử dụng bởi các loại" label_used_in_projects: "Được sử dụng trong các dự án" - label_user: "người dùng" + label_user: "Người dùng" label_user_and_permission: "Người dùng và quyền" label_user_named: "Người dùng %{name}" label_user_activity: "%{value} hoạt động" diff --git a/config/locales/crowdin/zh-CN.seeders.yml b/config/locales/crowdin/zh-CN.seeders.yml index 1ee133e5684..336ac4fa27d 100644 --- a/config/locales/crowdin/zh-CN.seeders.yml +++ b/config/locales/crowdin/zh-CN.seeders.yml @@ -97,7 +97,7 @@ zh-CN: demo-project: name: 演示项目 status_explanation: 所有任务都按计划进行。相关人员均知晓各自任务。系统已完全建立。 - description: 这是对此演示 Scrum 项目目标的简短摘要。 + description: 这是对此演示项目目标的简短摘要。 news: item_0: title: 欢迎来到您的演示项目 @@ -216,7 +216,7 @@ zh-CN: scrum-project: name: Scrum 项目 status_explanation: 所有任务都按计划进行。相关人员均知晓各自任务。系统已完全建立。 - description: 这是对此演示 Scrum 项目目标的简短摘要。 + description: 这是对此演示Scrum项目目标的简短摘要。 news: item_0: title: 欢迎来到您的 Scrum 演示项目 diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index 53d32287167..92b4fb8f4fc 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -88,7 +88,7 @@ zh-CN: token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." add_token: "上传企业版支持令牌" replace_token: "替换您当前的支持令牌" - order: "订购本地部署版的 Enterprise edition" + order: "订购本地部署的 Enterprise edition" paste: "粘贴您企业版的支持令牌" required_for_feature: "此功能仅限具激活的企业版支持令牌的订阅者使用。" enterprise_link: "如需了解详细信息,请单击此处。" @@ -1337,9 +1337,6 @@ zh-CN: dependencies: "依赖项" activerecord: attributes: - agile/sprint: - sharing: "Sharing" - finish_date: "End date" jira_import: projects: "Projects" announcements: @@ -1419,7 +1416,7 @@ zh-CN: page: "页" row_count: "行数" column_count: "列数" - widgets: "微件" + widgets: "小部件" journal: notes: "备注" cause_type: "Cause 类型" @@ -3717,7 +3714,7 @@ zh-CN: label_revision_id: "修订版本 %{value}" label_revision_plural: "修订" label_roadmap: "路线图" - label_roadmap_edit: "编辑路线图%{name}" + label_roadmap_edit: "编辑路线图 %{name}" label_roadmap_due_in: "%{value} 到期" label_roadmap_no_work_packages: "该版本没有工作包。" label_roadmap_overdue: "%{value} 超时" @@ -4440,7 +4437,7 @@ zh-CN: managed: "在 OpenProject 中创建新的存储库" storage: not_available: "磁盘存储开销不可用于此存储库。" - update_timeout: "在 N 分钟内保留存储库最后所需的磁盘空间信息。由于计算存储库所需的磁盘空间可能增加系统开销,增加该值可以减少性能影响。" + update_timeout: "在 N 分钟内保留存储库最后所需磁盘空间的信息。由于计算存储库所需的磁盘空间可能增加系统开销,增加该值可以减少性能影响。" oauth_application_details: "关闭此窗口后,将无法再次访问客户端密钥值。请将这些值复制到 Nextcloud OpenProject 集成设置中:" oauth_application_details_link_text: "转到设置页面" setup_documentation_details: "如果您在配置新文件存储方面需要帮助,请查看文档:" @@ -4654,7 +4651,7 @@ zh-CN: setting_session_ttl_hint: "当设置的值低于5时,其作用类似于禁用。" setting_session_ttl_enabled: "会话过期" setting_start_of_week: "一周起始日" - setting_sys_api_enabled: "启用存储库管理网页服务" + setting_sys_api_enabled: "启用版本库管理 web 服务" setting_sys_api_description: "存储库管理网页服务提供了集成的,用户授权的存储库访问。" setting_time_format: "时间" setting_total_percent_complete_mode: "计算 完成% 层次结构总数" @@ -5081,7 +5078,7 @@ zh-CN: warning_user_limit_reached_admin: > 添加额外的用户将超出当前限制。请升级您的计划,以确保外部用户能够访问此实例。 warning_user_limit_reached_instructions: > - 您已达到用户限制(%{current}/%{max} 活跃用户)。请联系 sales@openproject.com 升级您的企业版计划以添加额外用户。 + 您达到了用户限制(%{current}/%{max}活跃用户)。 请联系sales@openproject.com以升级您的Enterprise edition计划并添加其他用户。 warning_protocol_mismatch_html: > warning_bar: diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 3e35069986a..63d70632137 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -1337,9 +1337,6 @@ zh-TW: dependencies: "依賴套件" activerecord: attributes: - agile/sprint: - sharing: "分享" - finish_date: "結束日期" jira_import: projects: "Projects" announcements: @@ -3418,7 +3415,7 @@ zh-TW: label_filter_add: "新增條件" label_filter_by: "篩選條件:" label_filter_any_name_attribute: "名稱屬性" - label_filter_plural: "篩選條件" + label_filter_plural: "篩選器" label_filters_toggle: "顯示/隱藏篩選條件" label_float: "浮點數" label_folder: "資料夾" @@ -3433,8 +3430,8 @@ zh-TW: label_global_modules: "全域模組" label_global_roles: "全域角色" label_git_path: ".git 目錄的路徑" - label_greater_or_equal: "之前" - label_group_by: "分類" + label_greater_or_equal: ">=" + label_group_by: "分組依據" label_group_new: "新增群組" label_group: "群組" label_group_named: "群組名稱 %{name}" @@ -3446,7 +3443,7 @@ zh-TW: label_hierarchy: "階層" label_hierarchy_leaf: "頁面結構頁" label_home: "Home" - label_subject_or_id: "名稱或 id" + label_subject_or_id: "主旨或 id" label_calendar_subscriptions: "訂閱行事曆" label_identifier: "識別碼" label_in: "在" @@ -3497,7 +3494,7 @@ zh-TW: label_latest_revision_plural: "最新版本" label_ldap_authentication: "LDAP 認證" label_learn_more: "了解更多" - label_less_or_equal: "之後" + label_less_or_equal: "<=" label_less_than_ago: "幾天內" label_link_url: "連結(URL)" label_list: "清單" diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml index 20d24018589..5550ad12c3c 100644 --- a/modules/backlogs/config/locales/crowdin/af.yml +++ b/modules/backlogs/config/locales/crowdin/af.yml @@ -25,6 +25,12 @@ af: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ af: task_version_must_be_the_same_as_story_version: "moet dieselfde wees as die ouer storie se weergawe" sprint: cannot_end_before_it_starts: "sprint kan nie uinding voor dit begin het nie" + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ af: label_points_burn_down: "Af" label_points_burn_up: "Op" label_sprint_impediments: "Sprint belemmerings" + label_sprint_new: "New sprint" label_task_board: "Taak bord" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Kyk na meester-agterstand" permission_view_taskboards: "Kyk na taakborde" permission_select_done_statuses: "Kies gedoen statusse" diff --git a/modules/backlogs/config/locales/crowdin/ar.yml b/modules/backlogs/config/locales/crowdin/ar.yml index a00c06b69cd..73d1e23752d 100644 --- a/modules/backlogs/config/locales/crowdin/ar.yml +++ b/modules/backlogs/config/locales/crowdin/ar.yml @@ -25,6 +25,12 @@ ar: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ ar: task_version_must_be_the_same_as_story_version: "يجب أن يكون نفس نسخة القصة الأصلية." sprint: cannot_end_before_it_starts: "لا يمكن أن ينتهي السباق قبل أن يبدأ." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -129,7 +137,9 @@ ar: label_points_burn_down: "الأسفل" label_points_burn_up: "الأعلى" label_sprint_impediments: "عوائق السباق" + label_sprint_new: "New sprint" label_task_board: "لوحة المهمة" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "عرض العمل الرئيسي المتراكم غير المنجز" permission_view_taskboards: "شاهد لوحات المهمات" permission_select_done_statuses: "حدد حالات الاتمام" diff --git a/modules/backlogs/config/locales/crowdin/az.yml b/modules/backlogs/config/locales/crowdin/az.yml index 309b5b19a3f..6b6a4456686 100644 --- a/modules/backlogs/config/locales/crowdin/az.yml +++ b/modules/backlogs/config/locales/crowdin/az.yml @@ -25,6 +25,12 @@ az: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ az: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ az: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/be.yml b/modules/backlogs/config/locales/crowdin/be.yml index 12c334f48a8..5f0f3bb647a 100644 --- a/modules/backlogs/config/locales/crowdin/be.yml +++ b/modules/backlogs/config/locales/crowdin/be.yml @@ -25,6 +25,12 @@ be: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ be: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -125,7 +133,9 @@ be: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/bg.yml b/modules/backlogs/config/locales/crowdin/bg.yml index e16dce07c86..73729918717 100644 --- a/modules/backlogs/config/locales/crowdin/bg.yml +++ b/modules/backlogs/config/locales/crowdin/bg.yml @@ -25,6 +25,12 @@ bg: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ bg: task_version_must_be_the_same_as_story_version: "трябва да бъде същата като версията на родителската история." sprint: cannot_end_before_it_starts: "Спринтът не може да приключи, преди да започне." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ bg: label_points_burn_down: "Надолу" label_points_burn_up: "Нагоре" label_sprint_impediments: "Пречки за спринт" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Изберете готови състояния" diff --git a/modules/backlogs/config/locales/crowdin/ca.yml b/modules/backlogs/config/locales/crowdin/ca.yml index 4d52aad8369..8700f622e56 100644 --- a/modules/backlogs/config/locales/crowdin/ca.yml +++ b/modules/backlogs/config/locales/crowdin/ca.yml @@ -25,6 +25,12 @@ ca: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ ca: task_version_must_be_the_same_as_story_version: "ha de ser la mateixa que la versió de la història pare." sprint: cannot_end_before_it_starts: "El sprint no pot acabar abans de que comenci." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ ca: label_points_burn_down: "A baix" label_points_burn_up: "Amunt" label_sprint_impediments: "Impediments de sprint" + label_sprint_new: "New sprint" label_task_board: "Tauler de tasques" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Visualitza el backlog mestre" permission_view_taskboards: "Visualitza els taulers de tasques" permission_select_done_statuses: "Selecciona els estats acabats" diff --git a/modules/backlogs/config/locales/crowdin/ckb-IR.yml b/modules/backlogs/config/locales/crowdin/ckb-IR.yml index 3bc24142a22..e11abb71b52 100644 --- a/modules/backlogs/config/locales/crowdin/ckb-IR.yml +++ b/modules/backlogs/config/locales/crowdin/ckb-IR.yml @@ -25,6 +25,12 @@ ckb-IR: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ ckb-IR: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ ckb-IR: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml index f5a7fbc7a36..4842cfada30 100644 --- a/modules/backlogs/config/locales/crowdin/cs.yml +++ b/modules/backlogs/config/locales/crowdin/cs.yml @@ -25,6 +25,12 @@ cs: description: "Tento modul přidává funkce umožňující agilním týmům pracovat s OpenProject v Scrum projektech." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Doba trvání sprintu" work_package: @@ -42,6 +48,8 @@ cs: task_version_must_be_the_same_as_story_version: "musí být stejná jako verze nadřazeného příběhu." sprint: cannot_end_before_it_starts: "Sprint nemůže končit dříve, než začne." + models: + sprint: "Sprint" attributes: task_type: "Typ úlohy" backlogs: @@ -125,7 +133,9 @@ cs: label_points_burn_down: "Dolů" label_points_burn_up: "Nahoru" label_sprint_impediments: "Běh impedimenty" + label_sprint_new: "New sprint" label_task_board: "Tabule úkolů" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Zobrazit hlavní nevyřízené položky" permission_view_taskboards: "Zobrazit tabuly úkolů" permission_select_done_statuses: "Vybrat stavy dokončených" diff --git a/modules/backlogs/config/locales/crowdin/da.yml b/modules/backlogs/config/locales/crowdin/da.yml index b903386f5d8..876426e8a23 100644 --- a/modules/backlogs/config/locales/crowdin/da.yml +++ b/modules/backlogs/config/locales/crowdin/da.yml @@ -25,6 +25,12 @@ da: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ da: task_version_must_be_the_same_as_story_version: "skal være identisk med hovedhistorieversionen." sprint: cannot_end_before_it_starts: "Sprint kan ikke afsluttes før det starter." + models: + sprint: "Sprint" attributes: task_type: "Opgavetype" backlogs: @@ -121,7 +129,9 @@ da: label_points_burn_down: "Ned" label_points_burn_up: "Op" label_sprint_impediments: "Sprint-hindringer" + label_sprint_new: "New sprint" label_task_board: "Opgaveoversigt" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Se hoved-backlog" permission_view_taskboards: "Vis opgaveoversigter" permission_select_done_statuses: "Vælg udført-statusser" diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 7c514e3008f..3dbbe05ff5f 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -25,6 +25,12 @@ de: description: "Dieses Modul fügt Funktionen hinzu, die es agilen Teams ermöglichen, mit OpenProject in Scrum-Projekten zu arbeiten." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprintdauer" work_package: @@ -42,6 +48,8 @@ de: task_version_must_be_the_same_as_story_version: "muss der Version der übergeordneten Story entsprechen." sprint: cannot_end_before_it_starts: "Sprint kann nicht enden, bevor er begonnen hat." + models: + sprint: "Sprint" attributes: task_type: "Aufgaben-Typ" backlogs: @@ -121,7 +129,9 @@ de: label_points_burn_down: "Runter" label_points_burn_up: "Hoch" label_sprint_impediments: "Sprint Hindernisse" + label_sprint_new: "New sprint" label_task_board: "Taskboard" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Master Backlog ansehen" permission_view_taskboards: "Taskboard ansehen" permission_select_done_statuses: "Abgeschlossene Status auswählen" diff --git a/modules/backlogs/config/locales/crowdin/el.yml b/modules/backlogs/config/locales/crowdin/el.yml index 53021e93381..b0a947fa2fd 100644 --- a/modules/backlogs/config/locales/crowdin/el.yml +++ b/modules/backlogs/config/locales/crowdin/el.yml @@ -25,6 +25,12 @@ el: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ el: task_version_must_be_the_same_as_story_version: "πρέπει να είναι το ίδιο με την έκδοση ιστορίας του γονέα." sprint: cannot_end_before_it_starts: "Το sprint δεν μπορεί να λήξει πριν αρχίσει." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ el: label_points_burn_down: "Κάτω" label_points_burn_up: "Πάνω" label_sprint_impediments: "Εμπόδια Sprint" + label_sprint_new: "New sprint" label_task_board: "Πίνακας εργασιών" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Εμφάνιση του κύριου backlog" permission_view_taskboards: "Εμφάνιση πινάκων εργασίας" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/eo.yml b/modules/backlogs/config/locales/crowdin/eo.yml index 9823ba39aec..9a9cf5aba13 100644 --- a/modules/backlogs/config/locales/crowdin/eo.yml +++ b/modules/backlogs/config/locales/crowdin/eo.yml @@ -25,6 +25,12 @@ eo: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ eo: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ eo: label_points_burn_down: "Malsupren" label_points_burn_up: "Supren" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index 6c924301122..3a32fe3819a 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -25,6 +25,12 @@ es: description: "Este módulo añade funciones que permiten a los equipos Agile trabajar con OpenProject en proyectos Scrum." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ es: task_version_must_be_the_same_as_story_version: "debe coincidir con la versión de la historia principal." sprint: cannot_end_before_it_starts: "El sprint no puede terminar antes del inicio." + models: + sprint: "Sprint" attributes: task_type: "Tipo de tarea" backlogs: @@ -121,7 +129,9 @@ es: label_points_burn_down: "Abajo" label_points_burn_up: "Arriba" label_sprint_impediments: "Impedimentos de sprint" + label_sprint_new: "New sprint" label_task_board: "Tablero de tareas" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Ver backlog maestro" permission_view_taskboards: "Ver tablero de tareas" permission_select_done_statuses: "Seleccionar estados de finalización" diff --git a/modules/backlogs/config/locales/crowdin/et.yml b/modules/backlogs/config/locales/crowdin/et.yml index 70ca6ef2f2f..9ba1d996afa 100644 --- a/modules/backlogs/config/locales/crowdin/et.yml +++ b/modules/backlogs/config/locales/crowdin/et.yml @@ -25,6 +25,12 @@ et: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ et: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ et: label_points_burn_down: "Alla" label_points_burn_up: "Üles" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Vali valmis staatused" diff --git a/modules/backlogs/config/locales/crowdin/eu.yml b/modules/backlogs/config/locales/crowdin/eu.yml index aee74542e1a..f296d667350 100644 --- a/modules/backlogs/config/locales/crowdin/eu.yml +++ b/modules/backlogs/config/locales/crowdin/eu.yml @@ -25,6 +25,12 @@ eu: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ eu: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ eu: label_points_burn_down: "Behera" label_points_burn_up: "Gora" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/fa.yml b/modules/backlogs/config/locales/crowdin/fa.yml index f6111ae7bb9..76bf8948212 100644 --- a/modules/backlogs/config/locales/crowdin/fa.yml +++ b/modules/backlogs/config/locales/crowdin/fa.yml @@ -25,6 +25,12 @@ fa: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "مدت زمان اسپرینت" work_package: @@ -42,6 +48,8 @@ fa: task_version_must_be_the_same_as_story_version: "باید از همان نگارش داستان زادآوران باشد." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "نوع وظیفه" backlogs: @@ -121,7 +129,9 @@ fa: label_points_burn_down: "پایین" label_points_burn_up: "بالا" label_sprint_impediments: " موانع تاخت" + label_sprint_new: "New sprint" label_task_board: "تابلوی وظیفه" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "نمایش بک لاگ اصلی" permission_view_taskboards: "مشاهده تابلو وظایف" permission_select_done_statuses: "انتخاب وضعیت های انجام شده" diff --git a/modules/backlogs/config/locales/crowdin/fi.yml b/modules/backlogs/config/locales/crowdin/fi.yml index b2b927ccdc8..6468251e66c 100644 --- a/modules/backlogs/config/locales/crowdin/fi.yml +++ b/modules/backlogs/config/locales/crowdin/fi.yml @@ -25,6 +25,12 @@ fi: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ fi: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprintti ei voi päättyä, ennen kuin se alkaa." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ fi: label_points_burn_down: "Alas" label_points_burn_up: "Ylös" label_sprint_impediments: "Sprintin esteet" + label_sprint_new: "New sprint" label_task_board: "Tehtävätaulu" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Näytä pääasiallinen työjono" permission_view_taskboards: "Näytä työtaulut" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/fil.yml b/modules/backlogs/config/locales/crowdin/fil.yml index 6f0109336b2..9546b29fc39 100644 --- a/modules/backlogs/config/locales/crowdin/fil.yml +++ b/modules/backlogs/config/locales/crowdin/fil.yml @@ -25,6 +25,12 @@ fil: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ fil: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ fil: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index 6d8b15c0bdf..a5ba766e5a3 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -25,6 +25,12 @@ fr: description: "Ce module ajoute des fonctionnalités permettant aux équipes agiles de travailler avec OpenProject dans le cadre de projets Scrum." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Partage" sprint: duration: "Durée du sprint" work_package: @@ -42,6 +48,8 @@ fr: task_version_must_be_the_same_as_story_version: "doit être identique à la version de l'histoire parente." sprint: cannot_end_before_it_starts: "Un sprint ne peut pas se terminer avant d'avoir débuté." + models: + sprint: "Sprint" attributes: task_type: "Type de tâche" backlogs: @@ -65,7 +73,7 @@ fr: story: "Histoire" story_points: one: "%{count} point d'histoire" - other: "%{count} points de l'histoire" + other: "%{count} story points" task: "Tâche" task_color: "Couleur des tâches" unassigned: "Non assigné" @@ -104,9 +112,9 @@ fr: backlogs_wiki_template: "Modèle pour page wiki de sprint" backlogs_empty_title: "Aucune version n'est encore définie" backlogs_empty_action_text: "Pour commencer à utiliser les backlogs, veuillez d'abord créer une version" - backlogs_not_configured_title: "Les carnets de commandes ne sont pas configurés" + backlogs_not_configured_title: "Les backlogs ne sont pas configurés" backlogs_not_configured_description: "Les types d'histoires et de tâches doivent être définis avant d'utiliser ce module." - backlogs_not_configured_action_text: "Configurer les carnets de commandes" + backlogs_not_configured_action_text: "Configurer les backlogs" burndown: story_points: "Story points" story_points_ideal: "Points d'histoire (idéal)" @@ -121,7 +129,9 @@ fr: label_points_burn_down: "Vers le bas" label_points_burn_up: "Vers le haut" label_sprint_impediments: "Obstacles de sprint" + label_sprint_new: "New sprint" label_task_board: "Tableau des tâches" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Afficher le backlog principal" permission_view_taskboards: "Voir les tableaux des tâches" permission_select_done_statuses: "Sélectionner les statuts terminés" diff --git a/modules/backlogs/config/locales/crowdin/he.yml b/modules/backlogs/config/locales/crowdin/he.yml index a3d2729ba67..c9592ac31b3 100644 --- a/modules/backlogs/config/locales/crowdin/he.yml +++ b/modules/backlogs/config/locales/crowdin/he.yml @@ -25,6 +25,12 @@ he: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ he: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -125,7 +133,9 @@ he: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/hi.yml b/modules/backlogs/config/locales/crowdin/hi.yml index c1624aaae8f..9858e23e4cc 100644 --- a/modules/backlogs/config/locales/crowdin/hi.yml +++ b/modules/backlogs/config/locales/crowdin/hi.yml @@ -25,6 +25,12 @@ hi: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ hi: task_version_must_be_the_same_as_story_version: "मूल कहानी के संस्करण के समान होना चाहिए।" sprint: cannot_end_before_it_starts: "स्प्रिंट शुरू होने से पहले खत्म नहीं हो सकता।" + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ hi: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/hr.yml b/modules/backlogs/config/locales/crowdin/hr.yml index 4a46ad8f6c5..290bc722d71 100644 --- a/modules/backlogs/config/locales/crowdin/hr.yml +++ b/modules/backlogs/config/locales/crowdin/hr.yml @@ -25,6 +25,12 @@ hr: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ hr: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Period razvoja ne može završiti prije nego li je započeo." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -123,7 +131,9 @@ hr: label_points_burn_down: "Dolje" label_points_burn_up: "Gore" label_sprint_impediments: "Prepreke perioda razvoja" + label_sprint_new: "New sprint" label_task_board: "Upravitelj zadatcima" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Pogledaj glavni backlog" permission_view_taskboards: "Pogledaj upravitelj zadatcima" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/hu.yml b/modules/backlogs/config/locales/crowdin/hu.yml index 7aab8818879..df057cf59d2 100644 --- a/modules/backlogs/config/locales/crowdin/hu.yml +++ b/modules/backlogs/config/locales/crowdin/hu.yml @@ -25,6 +25,12 @@ hu: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ hu: task_version_must_be_the_same_as_story_version: "a szülő story verziójával megegyezőnek kell lennie." sprint: cannot_end_before_it_starts: "Sprint nem érhet véget, mielőtt elindul." + models: + sprint: "Sprint" attributes: task_type: "Feladat típusa" backlogs: @@ -121,7 +129,9 @@ hu: label_points_burn_down: "Le" label_points_burn_up: "Fel" label_sprint_impediments: "Sprint akadályai" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Elkészültek kiválasztása" diff --git a/modules/backlogs/config/locales/crowdin/id.yml b/modules/backlogs/config/locales/crowdin/id.yml index 39f4116d3c8..6ccaf291c33 100644 --- a/modules/backlogs/config/locales/crowdin/id.yml +++ b/modules/backlogs/config/locales/crowdin/id.yml @@ -25,6 +25,12 @@ id: description: "Modul ini menambahkan fitur yang memungkinkan tim yang gesit bekerja dengan OpenProject dalam proyek Scrum." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ id: task_version_must_be_the_same_as_story_version: "harus sama seperti versi kisah orang tua." sprint: cannot_end_before_it_starts: "Sprint tidak bisa berakhir sebelum mulai." + models: + sprint: "Sprint" attributes: task_type: "Jenis tugas" backlogs: @@ -119,7 +127,9 @@ id: label_points_burn_down: "Menurun" label_points_burn_up: "Naik" label_sprint_impediments: "Hanbatan kekuatan" + label_sprint_new: "New sprint" label_task_board: "Papan tugas" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Lihat backlog master" permission_view_taskboards: "Lihat papan tugas" permission_select_done_statuses: "Pilih status selesai" diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml index f5040895dfe..89208deceb1 100644 --- a/modules/backlogs/config/locales/crowdin/it.yml +++ b/modules/backlogs/config/locales/crowdin/it.yml @@ -25,6 +25,12 @@ it: description: "Questo modulo aggiunge funzionalità che consentono ai team agili di lavorare con i progetti OpenProject in Scrum." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ it: task_version_must_be_the_same_as_story_version: "deve essere uguale alla versione della storia del genitore." sprint: cannot_end_before_it_starts: "Uno sprint non può terminare prima che venga avviato." + models: + sprint: "Sprint" attributes: task_type: "Tipo di attività" backlogs: @@ -121,7 +129,9 @@ it: label_points_burn_down: "Verso il basso" label_points_burn_up: "Verso l'alto" label_sprint_impediments: "Impedimenti allo sprint" + label_sprint_new: "New sprint" label_task_board: "Pannello delle attività" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Visualizza il master backlog" permission_view_taskboards: "Visualizza i pannelli delle attività" permission_select_done_statuses: "Seleziona gli stati terminati" diff --git a/modules/backlogs/config/locales/crowdin/ja.yml b/modules/backlogs/config/locales/crowdin/ja.yml index 5af9e30d172..69b0f68c7d3 100644 --- a/modules/backlogs/config/locales/crowdin/ja.yml +++ b/modules/backlogs/config/locales/crowdin/ja.yml @@ -25,6 +25,12 @@ ja: description: "このモジュールには、アジャイルチームがスクラムプロジェクトでOpenProjectを使用できるようにする機能が追加されています。" activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ ja: task_version_must_be_the_same_as_story_version: "親ストーリーのバージョンと同じでなければなりません。" sprint: cannot_end_before_it_starts: "スプリントは開始する前に終了できません。" + models: + sprint: "Sprint" attributes: task_type: "タスクのタイプ" backlogs: @@ -119,7 +127,9 @@ ja: label_points_burn_down: "ダウン" label_points_burn_up: "アップ" label_sprint_impediments: "スプリント障害事項" + label_sprint_new: "New sprint" label_task_board: "かんばん" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "マスター バックログの表示" permission_view_taskboards: "かんばんの表示" permission_select_done_statuses: "完了ステータスを選択" diff --git a/modules/backlogs/config/locales/crowdin/ka.yml b/modules/backlogs/config/locales/crowdin/ka.yml index 9939b839c08..5de4afa6621 100644 --- a/modules/backlogs/config/locales/crowdin/ka.yml +++ b/modules/backlogs/config/locales/crowdin/ka.yml @@ -25,6 +25,12 @@ ka: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ ka: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ ka: label_points_burn_down: "ქვემოთ" label_points_burn_up: "ზემოთ" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "ამოცანების დაფა" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "აირჩიეთ დასრულების სტატუსები" diff --git a/modules/backlogs/config/locales/crowdin/kk.yml b/modules/backlogs/config/locales/crowdin/kk.yml index 584b33393b7..2534ded0db5 100644 --- a/modules/backlogs/config/locales/crowdin/kk.yml +++ b/modules/backlogs/config/locales/crowdin/kk.yml @@ -25,6 +25,12 @@ kk: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ kk: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ kk: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index 4bc4ff2c2c2..15bcd31cb10 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -25,6 +25,12 @@ ko: description: "이 모듈은 애자일 팀이 Scrum 프로젝트에서 OpenProject로 작업할 수 있도록 하는 기능을 추가합니다." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ ko: task_version_must_be_the_same_as_story_version: "은(는) 부모 스토리의 버전과 동일해야 합니다." sprint: cannot_end_before_it_starts: "스프린트는 시작되기 전에 끝날 수 없습니다." + models: + sprint: "Sprint" attributes: task_type: "작업 유형" backlogs: @@ -119,7 +127,9 @@ ko: label_points_burn_down: "아래" label_points_burn_up: "위" label_sprint_impediments: "스프린트 제한" + label_sprint_new: "New sprint" label_task_board: "작업 보드" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "마스터 백로그 보기" permission_view_taskboards: "작업 보드 보기" permission_select_done_statuses: "완료 상태 선택" diff --git a/modules/backlogs/config/locales/crowdin/lt.yml b/modules/backlogs/config/locales/crowdin/lt.yml index 47f4923d387..ca6f344c315 100644 --- a/modules/backlogs/config/locales/crowdin/lt.yml +++ b/modules/backlogs/config/locales/crowdin/lt.yml @@ -25,6 +25,12 @@ lt: description: "Šis modulis prideda funkcionalumą, leidžianti agile komandoms dirbti su OpenProject Scrum projektuose." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ lt: task_version_must_be_the_same_as_story_version: "turi būti tokia pati kaip ir tėvinės istorijos versija." sprint: cannot_end_before_it_starts: "Sprintas negali baigtis prieš prasidėdamas." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -125,7 +133,9 @@ lt: label_points_burn_down: "Žemyn" label_points_burn_up: "Aukštyn" label_sprint_impediments: "Sprinto trukdžiai" + label_sprint_new: "New sprint" label_task_board: "Užduočių lenta" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Peržiūrėti pagrindinį darbų sąrašą" permission_view_taskboards: "Peržiūrėti užduočių lentas" permission_select_done_statuses: "Parinkite atliktas būsenas" diff --git a/modules/backlogs/config/locales/crowdin/lv.yml b/modules/backlogs/config/locales/crowdin/lv.yml index 2adefaeaf7a..2dc96d9ce02 100644 --- a/modules/backlogs/config/locales/crowdin/lv.yml +++ b/modules/backlogs/config/locales/crowdin/lv.yml @@ -25,6 +25,12 @@ lv: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ lv: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprints nevar beigties, pirms tas ir sācies." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -123,7 +131,9 @@ lv: label_points_burn_down: "Lejup" label_points_burn_up: "Augšup" label_sprint_impediments: "Sprinta šķēršļi" + label_sprint_new: "New sprint" label_task_board: "Pieteikumu tāfele" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Skatīt visus nepabeigtos darbus" permission_view_taskboards: "Apskatīt uzdevumu dēļus" permission_select_done_statuses: "Izvēlieties pabeigtības statusu" diff --git a/modules/backlogs/config/locales/crowdin/mn.yml b/modules/backlogs/config/locales/crowdin/mn.yml index 3bc7baea066..0a227c8768c 100644 --- a/modules/backlogs/config/locales/crowdin/mn.yml +++ b/modules/backlogs/config/locales/crowdin/mn.yml @@ -25,6 +25,12 @@ mn: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ mn: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ mn: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/ms.yml b/modules/backlogs/config/locales/crowdin/ms.yml index d3ea60be5c1..7184f7a83da 100644 --- a/modules/backlogs/config/locales/crowdin/ms.yml +++ b/modules/backlogs/config/locales/crowdin/ms.yml @@ -25,6 +25,12 @@ ms: description: "Modul ini menambahkan fitur-fitur yang membolehkan kumpulan-kumpulan yang tangkas untuk bekerja menggunakan OpenProject di projek Scrum." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ ms: task_version_must_be_the_same_as_story_version: "perlu sama dengan versi cerita induk." sprint: cannot_end_before_it_starts: "Pecutan tidak boleh berakhir lebih awal sebelum ia bermula." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -119,7 +127,9 @@ ms: label_points_burn_down: "Bawah" label_points_burn_up: "Atas" label_sprint_impediments: "Halangan Pecutan" + label_sprint_new: "New sprint" label_task_board: "Papan tugasan" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Paparkan tunggakan utama" permission_view_taskboards: "Lihat papan tugasan" permission_select_done_statuses: "Pilih status selesai" diff --git a/modules/backlogs/config/locales/crowdin/ne.yml b/modules/backlogs/config/locales/crowdin/ne.yml index 5b907ae6b84..03e8a107cbf 100644 --- a/modules/backlogs/config/locales/crowdin/ne.yml +++ b/modules/backlogs/config/locales/crowdin/ne.yml @@ -25,6 +25,12 @@ ne: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ ne: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ ne: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml index 50c125516ba..da20d3b0288 100644 --- a/modules/backlogs/config/locales/crowdin/nl.yml +++ b/modules/backlogs/config/locales/crowdin/nl.yml @@ -25,6 +25,12 @@ nl: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ nl: task_version_must_be_the_same_as_story_version: "moet hetzelfde zijn als de bovenliggende verhaalversie." sprint: cannot_end_before_it_starts: "De sprint kan niet eindigen voordat het start." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ nl: label_points_burn_down: "Omlaag" label_points_burn_up: "Omhoog" label_sprint_impediments: "Sprint Obstakels" + label_sprint_new: "New sprint" label_task_board: "Taakbord" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Toon Máster Backlog" permission_view_taskboards: "Bekijk taakborden" permission_select_done_statuses: "Selecteer voltooide statussen" diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index d463b97f8e9..8eb7b2b3d85 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -25,6 +25,12 @@ description: "Denne modulen legger til funksjoner som setter dynamiske team i stand til å arbeide med OpenProject i Scrum prosjekter." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ task_version_must_be_the_same_as_story_version: "må være det samme som den overordnete historiens versjon." sprint: cannot_end_before_it_starts: "Sprinten kan ikke avsluttes før den starter." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ label_points_burn_down: "Ned" label_points_burn_up: "Opp" label_sprint_impediments: "Hindring i etappe" + label_sprint_new: "New sprint" label_task_board: "Oppgavetavle" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Vis master forsinkelse" permission_view_taskboards: "Vis oppgavetavler" permission_select_done_statuses: "Velg ferdige statuser" diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index b113203ab32..d7f2ee7a9ee 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -25,6 +25,12 @@ pl: description: "Moduł ten dodaje funkcje umożliwiające zwinnym zespołom pracę z OpenProject w projektach Scrum." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ pl: task_version_must_be_the_same_as_story_version: "musi być taka sama jak wersja story nadrzędnej." sprint: cannot_end_before_it_starts: "Sprint nie może się skończyć przed swoim rozpoczęciem." + models: + sprint: "Sprint" attributes: task_type: "Typ zadania" backlogs: @@ -125,7 +133,9 @@ pl: label_points_burn_down: "W dół" label_points_burn_up: "W górę" label_sprint_impediments: "Przeszkody sprintu" + label_sprint_new: "New sprint" label_task_board: "Panel zadań" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Wyświetl master backlog" permission_view_taskboards: "Wyświetl panel zadań" permission_select_done_statuses: "Wybierz wykonane statusy" diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index 0bb6ae34367..1e4757b0a4e 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -25,6 +25,12 @@ pt-BR: description: "Este módulo acrescenta recursos que permitem que as equipes ágeis trabalhem com o OpenProject em projetos Scrum." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ pt-BR: task_version_must_be_the_same_as_story_version: "deve ser igual à versão da história dos pais." sprint: cannot_end_before_it_starts: "A sprint não pode terminar antes de começar." + models: + sprint: "Sprint" attributes: task_type: "Tipo de tarefa" backlogs: @@ -121,7 +129,9 @@ pt-BR: label_points_burn_down: "Abaixo" label_points_burn_up: "Acima" label_sprint_impediments: "Impedimentos da Sprint" + label_sprint_new: "New sprint" label_task_board: "Quadro de tarefas" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Visualizar backlog principal" permission_view_taskboards: "Visualizar quadro de tarefas" permission_select_done_statuses: "Selecione situações concluídas" diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml index 2fb81ed7f7b..24ba05e13f3 100644 --- a/modules/backlogs/config/locales/crowdin/pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml @@ -25,6 +25,12 @@ pt-PT: description: "Este módulo acrescenta funcionalidades que permitem às equipas Agile trabalhar com o OpenProject em projetos Scrum." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ pt-PT: task_version_must_be_the_same_as_story_version: "tem ser o mesmo que a versão da história do pai." sprint: cannot_end_before_it_starts: "Sprint não pode terminar antes de começar." + models: + sprint: "Sprint" attributes: task_type: "Tipo de tarefa" backlogs: @@ -121,7 +129,9 @@ pt-PT: label_points_burn_down: "Abaixo" label_points_burn_up: "Acima" label_sprint_impediments: "Impedimentos de Sprint" + label_sprint_new: "New sprint" label_task_board: "Quadro de tarefas" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Ver o backlog principal" permission_view_taskboards: "Ver quadros de tarefas" permission_select_done_statuses: "Selecione os estados concluídos" diff --git a/modules/backlogs/config/locales/crowdin/ro.yml b/modules/backlogs/config/locales/crowdin/ro.yml index 1a32c9370b0..0bfe585f065 100644 --- a/modules/backlogs/config/locales/crowdin/ro.yml +++ b/modules/backlogs/config/locales/crowdin/ro.yml @@ -25,12 +25,18 @@ ro: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: position: "Poziție" story_points: "Puncte" - backlogs_work_package_type: "Tipul de restante" + backlogs_work_package_type: "Tip restanță" errors: models: work_package: @@ -42,6 +48,8 @@ ro: task_version_must_be_the_same_as_story_version: "trebuie să fie aceeași cu versiunea cerinței părinte." sprint: cannot_end_before_it_starts: "Sprint nu se poate termina înainte de a începe." + models: + sprint: "Sprint" attributes: task_type: "Tip de sarcină" backlogs: @@ -123,7 +131,9 @@ ro: label_points_burn_down: "Jos" label_points_burn_up: "Sus" label_sprint_impediments: "Impedimentele Sprint" + label_sprint_new: "New sprint" label_task_board: "Tablă de sarcini" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Vizualizare master backlog" permission_view_taskboards: "Vizualizați tablourile de sarcini" permission_select_done_statuses: "Selectează stările realizate" diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index 87b53de1666..8c71c5d36f9 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -25,6 +25,12 @@ ru: description: "Этот модуль добавляет функции, позволяющие agile-командам работать с OpenProject в Scrum проектах." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Совместное использование" sprint: duration: "Продолжительность спринта" work_package: @@ -42,6 +48,8 @@ ru: task_version_must_be_the_same_as_story_version: "должен совпадать с версией родительской истории." sprint: cannot_end_before_it_starts: "Спринт не может заканчиваться до того, как начнется." + models: + sprint: "Sprint" attributes: task_type: "Тип задачи" backlogs: @@ -125,7 +133,9 @@ ru: label_points_burn_down: "Вниз" label_points_burn_up: "Вверх" label_sprint_impediments: "Препятствия спринта" + label_sprint_new: "New sprint" label_task_board: "Панель задач" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Просмотреть главную невыполненную работу" permission_view_taskboards: "Просмотреть панели задач" permission_select_done_statuses: "Выберите завершенные статусы" diff --git a/modules/backlogs/config/locales/crowdin/rw.yml b/modules/backlogs/config/locales/crowdin/rw.yml index 83a8442ce8f..c7567d63aa0 100644 --- a/modules/backlogs/config/locales/crowdin/rw.yml +++ b/modules/backlogs/config/locales/crowdin/rw.yml @@ -25,6 +25,12 @@ rw: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ rw: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ rw: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/si.yml b/modules/backlogs/config/locales/crowdin/si.yml index f2789c8f7b8..11961f4bfa2 100644 --- a/modules/backlogs/config/locales/crowdin/si.yml +++ b/modules/backlogs/config/locales/crowdin/si.yml @@ -25,6 +25,12 @@ si: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ si: task_version_must_be_the_same_as_story_version: "මව් කතාවේ අනුවාදයට සමාන විය යුතුය." sprint: cannot_end_before_it_starts: "ස්ප්රින්ට් ආරම්භ වීමට පෙර අවසන් කළ නොහැක." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ si: label_points_burn_down: "පහළට" label_points_burn_up: "ඉහළට" label_sprint_impediments: "ස්ප්රින්ට් බාධාවන්" + label_sprint_new: "New sprint" label_task_board: "කාර්ය මණ්ඩලය" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "ස්වාමියා බැක්ලොග් දැක්ම" permission_view_taskboards: "දැක්ම කාර්ය මණ්ඩල" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/sk.yml b/modules/backlogs/config/locales/crowdin/sk.yml index 2e9db70d37f..65389beb0cd 100644 --- a/modules/backlogs/config/locales/crowdin/sk.yml +++ b/modules/backlogs/config/locales/crowdin/sk.yml @@ -25,6 +25,12 @@ sk: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Trvanie šprintu" work_package: @@ -42,6 +48,8 @@ sk: task_version_must_be_the_same_as_story_version: "musí byť rovnaká ako verzia nadradeného článku." sprint: cannot_end_before_it_starts: "Šprint nemôže byť ukončený ešte pred jeho spustením." + models: + sprint: "Sprint" attributes: task_type: "Typ úlohy" backlogs: @@ -125,7 +133,9 @@ sk: label_points_burn_down: "Nadol" label_points_burn_up: "Nahor" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "Zobrazenie tabúľ úloh" permission_select_done_statuses: "Výber stavov hotovo" diff --git a/modules/backlogs/config/locales/crowdin/sl.yml b/modules/backlogs/config/locales/crowdin/sl.yml index 75de0f0bad3..baf7c1842a0 100644 --- a/modules/backlogs/config/locales/crowdin/sl.yml +++ b/modules/backlogs/config/locales/crowdin/sl.yml @@ -25,6 +25,12 @@ sl: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ sl: task_version_must_be_the_same_as_story_version: "mora biti enako različici nadrejene zgodbe." sprint: cannot_end_before_it_starts: "Tek se ne mora končati preden se začne" + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -125,7 +133,9 @@ sl: label_points_burn_down: "Navzdol" label_points_burn_up: "Navzgor" label_sprint_impediments: "Motnje sprinta" + label_sprint_new: "New sprint" label_task_board: "Tabla opravil" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "glavni zaostanek prejšnje poizvedbe" permission_view_taskboards: "Prikaz delovne table" permission_select_done_statuses: "Označi statuse narejeno" diff --git a/modules/backlogs/config/locales/crowdin/sr.yml b/modules/backlogs/config/locales/crowdin/sr.yml index 58043dd441a..673e152be27 100644 --- a/modules/backlogs/config/locales/crowdin/sr.yml +++ b/modules/backlogs/config/locales/crowdin/sr.yml @@ -25,6 +25,12 @@ sr: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ sr: task_version_must_be_the_same_as_story_version: "mora biti ista kao verzija priče roditelja." sprint: cannot_end_before_it_starts: "Sprint se ne može završiti pre nego što počne." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -123,7 +131,9 @@ sr: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/sv.yml b/modules/backlogs/config/locales/crowdin/sv.yml index 399d2b9b27f..609234acea5 100644 --- a/modules/backlogs/config/locales/crowdin/sv.yml +++ b/modules/backlogs/config/locales/crowdin/sv.yml @@ -25,6 +25,12 @@ sv: description: "Modulen lägger till funktioner som gör det möjligt för agila team att arbeta med OpenProject i Scrum-projekt." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ sv: task_version_must_be_the_same_as_story_version: "måste vara samma som föräldraberättelsens version." sprint: cannot_end_before_it_starts: "En sprint kan inte avslutas innan den startar." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ sv: label_points_burn_down: "Ner" label_points_burn_up: "Upp" label_sprint_impediments: "Sprint hinder" + label_sprint_new: "New sprint" label_task_board: "Aktivitetstavla" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Visa master backlog" permission_view_taskboards: "Visa aktivitetstavlor" permission_select_done_statuses: "Välj klar status" diff --git a/modules/backlogs/config/locales/crowdin/th.yml b/modules/backlogs/config/locales/crowdin/th.yml index a29b57b0a7b..172a0c7e91f 100644 --- a/modules/backlogs/config/locales/crowdin/th.yml +++ b/modules/backlogs/config/locales/crowdin/th.yml @@ -25,6 +25,12 @@ th: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ th: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -119,7 +127,9 @@ th: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/tr.yml b/modules/backlogs/config/locales/crowdin/tr.yml index ebd436c906f..031e30ca442 100644 --- a/modules/backlogs/config/locales/crowdin/tr.yml +++ b/modules/backlogs/config/locales/crowdin/tr.yml @@ -25,6 +25,12 @@ tr: description: "Bu modül, çevik ekiplerin Scrum projelerinde OpenProject ile çalışmasını sağlayan özellikler ekler." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Paylaşım" sprint: duration: "Sprint süresi" work_package: @@ -42,6 +48,8 @@ tr: task_version_must_be_the_same_as_story_version: "ana hikaye sürümüyle aynı olmalıdır." sprint: cannot_end_before_it_starts: "Sprint başlamadan önce bitemez." + models: + sprint: "Sprint" attributes: task_type: "Görev türü" backlogs: @@ -121,7 +129,9 @@ tr: label_points_burn_down: "Aşağı" label_points_burn_up: "Yukarı" label_sprint_impediments: "Sprint Engelleri" + label_sprint_new: "New sprint" label_task_board: "Görev panosu" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Ana bekleme günlüğünü görüntüleme" permission_view_taskboards: "Görev tahtalarını görüntüleme" permission_select_done_statuses: "Tamamlanan durumları seçiniz" diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml index 9384bd25a78..fe72e7db59e 100644 --- a/modules/backlogs/config/locales/crowdin/uk.yml +++ b/modules/backlogs/config/locales/crowdin/uk.yml @@ -25,6 +25,12 @@ uk: description: "Цей модуль додає функції, завдяки яким agile-команди можуть працювати над проєктами Scrum в OpenProject." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ uk: task_version_must_be_the_same_as_story_version: "має збігатись із версією батьківської історії." sprint: cannot_end_before_it_starts: "Спринт не може закінчитися, перш ніж він почне працювати." + models: + sprint: "Sprint" attributes: task_type: "Тип завдання" backlogs: @@ -125,7 +133,9 @@ uk: label_points_burn_down: "Вниз" label_points_burn_up: "Вгору" label_sprint_impediments: "Перешкоди спринту" + label_sprint_new: "New sprint" label_task_board: "Дошка завдань" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Перегляд головного backlog-у" permission_view_taskboards: "Перегляд панелі завдань" permission_select_done_statuses: "Виберіть завершені статуси" diff --git a/modules/backlogs/config/locales/crowdin/uz.yml b/modules/backlogs/config/locales/crowdin/uz.yml index 1d784af9e97..9133d6a5ce5 100644 --- a/modules/backlogs/config/locales/crowdin/uz.yml +++ b/modules/backlogs/config/locales/crowdin/uz.yml @@ -25,6 +25,12 @@ uz: description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ uz: task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." + models: + sprint: "Sprint" attributes: task_type: "Task type" backlogs: @@ -121,7 +129,9 @@ uz: label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_impediments: "Sprint Impediments" + label_sprint_new: "New sprint" label_task_board: "Task board" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "View master backlog" permission_view_taskboards: "View taskboards" permission_select_done_statuses: "Select done statuses" diff --git a/modules/backlogs/config/locales/crowdin/vi.yml b/modules/backlogs/config/locales/crowdin/vi.yml index 4c8ca2e4f8f..dd99a3b5eba 100644 --- a/modules/backlogs/config/locales/crowdin/vi.yml +++ b/modules/backlogs/config/locales/crowdin/vi.yml @@ -25,6 +25,12 @@ vi: description: "Mô-đun này bổ sung các tính năng cho phép các nhóm linh hoạt làm việc với OpenProject trong các dự án Scrum." activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ vi: task_version_must_be_the_same_as_story_version: "phải giống với phiên bản của bảng cha." sprint: cannot_end_before_it_starts: "Sprint không thể kết thúc trước khi nó bắt đầu." + models: + sprint: "Sprint" attributes: task_type: "Loại nhiệm vụ" backlogs: @@ -119,7 +127,9 @@ vi: label_points_burn_down: "Xuống" label_points_burn_up: "lên" label_sprint_impediments: "Trở ngại nước rút" + label_sprint_new: "New sprint" label_task_board: "Bảng nhiệm vụ" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "Xem tồn đọng chính" permission_view_taskboards: "Xem bảng tác vụ" permission_select_done_statuses: "Chọn trạng thái hoàn thành" diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index ed193584a6c..00890091940 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -25,6 +25,12 @@ zh-CN: description: "该模块为敏捷团队在敏捷项目中使用 OpenProject 添加了功能。" activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "Sharing" sprint: duration: "Sprint duration" work_package: @@ -42,6 +48,8 @@ zh-CN: task_version_must_be_the_same_as_story_version: "必须与父级故事的版本相同。" sprint: cannot_end_before_it_starts: "比赛不可以在开始前结束。" + models: + sprint: "Sprint" attributes: task_type: "任务类型" backlogs: @@ -119,7 +127,9 @@ zh-CN: label_points_burn_down: "减少" label_points_burn_up: "增加" label_sprint_impediments: "冲刺 (sprint) 障碍" + label_sprint_new: "New sprint" label_task_board: "任务板" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "查看主待办清单" permission_view_taskboards: "查看任务板" permission_select_done_statuses: "选择完成状态" diff --git a/modules/backlogs/config/locales/crowdin/zh-TW.yml b/modules/backlogs/config/locales/crowdin/zh-TW.yml index 6058a1249a7..8a23d03e832 100644 --- a/modules/backlogs/config/locales/crowdin/zh-TW.yml +++ b/modules/backlogs/config/locales/crowdin/zh-TW.yml @@ -21,10 +21,16 @@ #++ zh-TW: plugin_openproject_backlogs: - name: "OpenProject待辦事項" + name: "OpenProject代辦事項" description: "此模組新增了讓敏捷團隊能夠在 Scrum 專案中使用 OpenProject 的功能。" activerecord: attributes: + agile/sprint: + duration: "Duration" + finish_date: "Finish date" + goal: "Sprint goal" + name: "Sprint name" + sharing: "分享" sprint: duration: "衝刺時間" work_package: @@ -42,6 +48,8 @@ zh-TW: task_version_must_be_the_same_as_story_version: "必須與上層「使用者需求」(User Story)的版本相同。" sprint: cannot_end_before_it_starts: "進度不可以在開始前結束" + models: + sprint: "Sprint" attributes: task_type: "任務類型" backlogs: @@ -119,7 +127,9 @@ zh-TW: label_points_burn_down: "減少" label_points_burn_up: "增加" label_sprint_impediments: "進度阻礙" + label_sprint_new: "New sprint" label_task_board: "任務看板" + permission_create_sprints: "Create sprints" permission_view_master_backlog: "檢視主待辦事項" permission_view_taskboards: "檢視任務看板" permission_select_done_statuses: "選擇完成狀態" diff --git a/modules/bim/config/locales/crowdin/fr.yml b/modules/bim/config/locales/crowdin/fr.yml index 717608ff597..288904f98e5 100644 --- a/modules/bim/config/locales/crowdin/fr.yml +++ b/modules/bim/config/locales/crowdin/fr.yml @@ -59,7 +59,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: diff --git a/modules/budgets/config/locales/crowdin/cs.yml b/modules/budgets/config/locales/crowdin/cs.yml index 785b12b77b0..48ca8608dae 100644 --- a/modules/budgets/config/locales/crowdin/cs.yml +++ b/modules/budgets/config/locales/crowdin/cs.yml @@ -27,7 +27,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/ja.yml b/modules/costs/config/locales/crowdin/ja.yml index d73696e9f49..a91de9375c0 100644 --- a/modules/costs/config/locales/crowdin/ja.yml +++ b/modules/costs/config/locales/crowdin/ja.yml @@ -205,7 +205,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: "報告された時間とコストを削除する" diff --git a/modules/gitlab_integration/config/locales/crowdin/rw.yml b/modules/gitlab_integration/config/locales/crowdin/rw.yml index 4b58a358650..a5ae5154287 100644 --- a/modules/gitlab_integration/config/locales/crowdin/rw.yml +++ b/modules/gitlab_integration/config/locales/crowdin/rw.yml @@ -60,17 +60,23 @@ rw: merge_request_reopened_comment: > **MR Reopened:** Merge request %{mr_number} [%{mr_title}](%{mr_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}). note_commit_referenced_comment: > - **Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}): %{commit_note} + **Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}): + %{commit_note} note_mr_referenced_comment: > - **Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note} + **Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): + %{mr_note} note_mr_commented_comment: > - **Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note} + **Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): + %{mr_note} note_issue_referenced_comment: > - **Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note} + **Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): + %{issue_note} note_issue_commented_comment: > - **Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note} + **Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): + %{issue_note} note_snippet_referenced_comment: > - **Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}): %{snippet_note} + **Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}): + %{snippet_note} issue_opened_referenced_comment: > **Issue Opened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been opened by [%{gitlab_user}](%{gitlab_user_url}). issue_closed_referenced_comment: > @@ -78,8 +84,11 @@ rw: issue_reopened_referenced_comment: > **Issue Reopened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}). push_single_commit_comment: > - **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note} + **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: + %{commit_note} push_single_commit_comment_with_ref: > - **Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note} + **Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: + %{commit_note} push_multiple_commits_comment: > - **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note} + **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: + %{commit_note} diff --git a/modules/gitlab_integration/config/locales/crowdin/uz.yml b/modules/gitlab_integration/config/locales/crowdin/uz.yml index 8159949474f..26da96002b9 100644 --- a/modules/gitlab_integration/config/locales/crowdin/uz.yml +++ b/modules/gitlab_integration/config/locales/crowdin/uz.yml @@ -60,17 +60,23 @@ uz: merge_request_reopened_comment: > **MR Reopened:** Merge request %{mr_number} [%{mr_title}](%{mr_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}). note_commit_referenced_comment: > - **Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}): %{commit_note} + **Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}): + %{commit_note} note_mr_referenced_comment: > - **Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note} + **Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): + %{mr_note} note_mr_commented_comment: > - **Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note} + **Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): + %{mr_note} note_issue_referenced_comment: > - **Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note} + **Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): + %{issue_note} note_issue_commented_comment: > - **Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note} + **Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): + %{issue_note} note_snippet_referenced_comment: > - **Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}): %{snippet_note} + **Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}): + %{snippet_note} issue_opened_referenced_comment: > **Issue Opened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been opened by [%{gitlab_user}](%{gitlab_user_url}). issue_closed_referenced_comment: > @@ -78,8 +84,11 @@ uz: issue_reopened_referenced_comment: > **Issue Reopened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}). push_single_commit_comment: > - **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note} + **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: + %{commit_note} push_single_commit_comment_with_ref: > - **Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note} + **Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: + %{commit_note} push_multiple_commits_comment: > - **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note} + **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: + %{commit_note} diff --git a/modules/ldap_groups/config/locales/crowdin/zh-CN.yml b/modules/ldap_groups/config/locales/crowdin/zh-CN.yml index cec35d2ee7b..de9f185509c 100644 --- a/modules/ldap_groups/config/locales/crowdin/zh-CN.yml +++ b/modules/ldap_groups/config/locales/crowdin/zh-CN.yml @@ -6,7 +6,7 @@ zh-CN: description: '与 OpenProject 组同步 LDAP 组以管理用户,更改他们的权限以便不同组的用户管理。' plugin_openproject_ldap_groups: name: "OpenProject LDAP 组" - description: "LDAP组成员同步。" + description: "LDAP 组成员同步。" activerecord: attributes: ldap_groups/synchronized_group: diff --git a/modules/ldap_groups/config/locales/crowdin/zh-TW.yml b/modules/ldap_groups/config/locales/crowdin/zh-TW.yml index 1a4720ebcaf..15ce71c0dc6 100644 --- a/modules/ldap_groups/config/locales/crowdin/zh-TW.yml +++ b/modules/ldap_groups/config/locales/crowdin/zh-TW.yml @@ -15,7 +15,7 @@ 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: "群組名字屬性" diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index fd40df41e70..d06d16f4f2f 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -508,7 +508,7 @@ cs: notice_meeting_updated: "Tato stránka byla aktualizována někým jiným. Pro zobrazení změn znovu načtena." permission_create_meetings: "Vytvořit schůzku\n" 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" diff --git a/modules/meeting/config/locales/crowdin/ja.yml b/modules/meeting/config/locales/crowdin/ja.yml index 2e127a479b6..cf508ab71d3 100644 --- a/modules/meeting/config/locales/crowdin/ja.yml +++ b/modules/meeting/config/locales/crowdin/ja.yml @@ -244,7 +244,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: "スケジュールされた日時" participant_added: header: "Meeting '%{title}' - Participant added" header_series: "Meeting series '%{title}' - Participant added" @@ -289,7 +289,7 @@ ja: title: "会議のキャンセル" heading: "この会議をキャンセルしますか?" confirmation_message_html: > - テンプレートにない会議情報は失われます。 続行しますか? + テンプレートにない会議情報は失われます。 続けますか? confirm_button: "発生をキャンセル" blankslate: title: "表示する会議がありません" @@ -481,7 +481,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: "このページは他の誰かによって更新されました。変更を表示するには再読み込みしてください。" @@ -569,7 +569,7 @@ ja: このバックログは、このワンタイム会議に固有のものです.アイテムをドラッグして追加または会議の議題から削除することができます. label_agenda_backlog_clear_title: "議題のバックログをクリアしますか?" text_agenda_backlog_clear_description: > - 現在アジェンダバックログにあるすべての項目を削除してもよろしいですか?このアクションは元に戻せません。 + 議題のバックログ内のすべての項目を削除してもよろしいですか?この操作は取り消せません。 label_series_backlog: "シリーズバックログ" text_series_backlog: > バックログはこのシリーズのすべての出現と共有されます。 項目をドラッグして、特定の会議から項目を追加または削除できます。 @@ -601,7 +601,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/reporting/config/locales/crowdin/ro.yml b/modules/reporting/config/locales/crowdin/ro.yml index c113cc4a5d4..ddd90658fff 100644 --- a/modules/reporting/config/locales/crowdin/ro.yml +++ b/modules/reporting/config/locales/crowdin/ro.yml @@ -70,7 +70,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 0b864f3df4a..43bd0a017d5 100644 --- a/modules/reporting/config/locales/crowdin/vi.yml +++ b/modules/reporting/config/locales/crowdin/vi.yml @@ -73,7 +73,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 6a0980310d3..014919fb7f9 100644 --- a/modules/reporting/config/locales/crowdin/zh-TW.yml +++ b/modules/reporting/config/locales/crowdin/zh-TW.yml @@ -53,7 +53,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: "產生報告中..." @@ -70,7 +70,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/storages/config/locales/crowdin/ja.yml b/modules/storages/config/locales/crowdin/ja.yml index 86bc0b213bc..4708d197140 100644 --- a/modules/storages/config/locales/crowdin/ja.yml +++ b/modules/storages/config/locales/crowdin/ja.yml @@ -18,7 +18,7 @@ ja: token_exchange_scope: ストレージスコープ storages/project_storage: project_folder: プロジェクトフォルダ - project_folder_mode: プロジェクトフォルダーモード + project_folder_mode: プロジェクトフォルダモード storage: ストレージ storage_url: ストレージURL storages/sharepoint_storage: @@ -29,53 +29,53 @@ ja: storages/storage: authentication_method: 認証方法 creator: 作成者 - drive: ドライブID + drive: ドライブ ID host: ホスト name: 名称 password: アプリケーションのパスワード - provider_type: プロバイダー・タイプ - tenant: ディレクトリ(テナント)ID + provider_type: プロバイダーの種類 + 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: '自動的に管理されたプロジェクトフォルダ: ファイルの読み込み' @@ -86,16 +86,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: @@ -110,7 +110,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: '管理プロジェクトフォルダの名前を変更します:' sharepoint_sync_service: @@ -121,16 +121,16 @@ ja: rename_project_folder: '管理プロジェクトフォルダの名前を変更します:' errors: messages: - error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください + error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください。 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: @@ -151,31 +151,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. @@ -303,41 +303,41 @@ 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 failures: - other: "%{count} チェック失敗" + other: "%{count} チェックに失敗しました" success: すべてのチェックに合格 warnings: other: "%{count} は警告を返しました" connection_validation: client_id_invalid: 設定されたOAuth 2クライアントIDが無効です。設定を確認してください。 client_secret_invalid: 設定されたOAuth 2クライアントシークレットが無効です。設定を確認してください。 - nc_dependency_missing: 'ファイルストレージに必要な依存関係がありません。次の依存関係を追加してください: %{dependency}。' + nc_dependency_missing: 'ファイルストレージに必要な依存関係がありません。次の依存関係を追加してください: %{dependency}。' nc_dependency_version_mismatch: '%{dependency} アプリのバージョンがサポートされていません。Nextcloudサーバーをアップデートしてください。' nc_host_not_found: 設定されたホストURLにNextcloudサーバーが見つかりません。設定を確認してください。 nc_oauth_request_not_found: 現在接続しているユーザーを取得するエンドポイントが見つかりませんでした。詳細については、サーバーのログを確認してください。 nc_oauth_request_unauthorized: 現在のユーザーにはリモートファイルストレージにアクセスする権限がありません。サーバーのログを確認してください。 - nc_oauth_token_missing: OpenProjectでは、ユーザーがNextcloudアカウントをリンクしていないため、ユーザーレベルのNextcloudとの通信をテストできません。 + nc_oauth_token_missing: OpenProject は、Nextcloudアカウントへのリンクがまだないため、Nextcloudとのユーザーレベルの通信をテストできません。 nc_team_folder_not_found: The team folder could not be found. nc_unexpected_content: Unexpected content found in the managed team folder. nc_userless_access_denied: 設定されているアプリのパスワードが無効です。 not_configured: 接続を検証できませんでした。先に設定を完了してください。 - od_client_cant_delete_folder: クライアントがフォルダの削除に失敗しています。お使いのストレージのセットアップドキュメントを確認してください。 - od_client_write_permission_missing: クライアントの書き込み権限が不足しているようです。お使いのストレージのセットアップドキュメントを確認してください。 - od_drive_id_invalid: 設定されたドライブIDが無効のようです。設定を確認してください。 - od_drive_id_not_found: 設定されたドライブIDが見つかりません。設定を確認してください。 - od_oauth_request_not_found: 現在接続しているユーザーを取得するエンドポイントが見つかりませんでした。詳細については、サーバーのログを確認してください。 - od_oauth_request_unauthorized: 現在のユーザーにはリモートファイルストレージにアクセスする権限がありません。サーバーのログを確認してください。 - od_oauth_token_missing: OpenProjectは、ユーザーがまだMicrosoftアカウントをリンクしていないため、OneDriveとのユーザーレベルの通信をテストできません。 - od_tenant_id_wrong: 設定されたディレクトリ(テナント)IDが無効です。設定を確認してください。 + od_client_cant_delete_folder: クライアントがフォルダを削除できません。ストレージのセットアップドキュメントを確認してください。 + od_client_write_permission_missing: クライアントは書き込み権限がありません。ストレージの設定ドキュメントを確認してください。 + od_drive_id_invalid: 設定されたドライブ ID が無効です。設定を確認してください。 + od_drive_id_not_found: 設定されたドライブ ID が見つかりません。設定を確認してください。 + od_oauth_request_not_found: 現在接続されているユーザーを取得するエンドポイントが見つかりませんでした。詳細についてはサーバーログを確認してください。 + od_oauth_request_unauthorized: 現在のユーザーはリモートファイルストレージにアクセスする権限がありません。詳細についてはサーバーログを確認してください。 + od_oauth_token_missing: OpenProject は、ユーザーが Microsoft アカウントをまだリンクしていないため、OneDrive とのユーザー レベルの通信をテストできません。 + od_tenant_id_wrong: 設定されたディレクトリ (テナント) IDは無効です。設定を確認してください。 od_test_folder_exists: テストに必要なフォルダ %{folder_name} はすでに存在します。削除して再度お試しください。 od_unexpected_content: ドライブに予期しないコンテンツが見つかりました。 - offline_access_scope_missing: OpenID Connectプロバイダがoffline_accessスコープを要求するように設定することをお勧めします。統合はまだ機能するかもしれませんが、リフレッシュトークンの有効期限が切れていないことを確認してください。 + offline_access_scope_missing: offline_access スコープを要求するために OpenID Connect プロバイダを設定することをお勧めします。 統合はまだ動作するかもしれませんが、更新トークンが期限切れでないことを確認してください。 oidc_cant_refresh_token: ストレージへのアクセスを確認中にエラーが発生しました。詳細についてはサーバーログを確認してください。 - oidc_non_oidc_user: 現在のユーザーはプロビジョニングされていますが、OpenID Connect (OIDC) Identity Providerによってプロビジョニングされていません。OIDCプロビジョニングされたユーザーでチェックを再実行してください。 - oidc_non_provisioned_user: 現在のユーザはOpenID Connect Identity Providerから提供されていません。提供されたユーザーでチェックを再実行してください。 + oidc_non_oidc_user: 現在のユーザは、プロビジョニング中にOpenID Connect(OIDC)アイデンティティプロバイダによってプロビジョニングされていませんでした。OIDCプロビジョニングされたユーザでチェックを再実行してください。 + oidc_non_provisioned_user: 現在のユーザーはOpenID Connectアイデンティティプロバイダーによって提供されていません。指定されたユーザーとチェックを再実行してください。 oidc_provider_cant_exchange: OpenID Connectプロバイダはトークン交換をサポートしていないようですが、トークン交換はストレージ用に設定されています。 oidc_token_acquisition_failed: OpenID Connectのセットアップでは、必要なオーディエンスが提供されておらず、トークン交換機能も提供されていません。詳しくはドキュメントをご覧ください。 oidc_token_exchange_failed: OpenID Connect ProviderのToken Exchange設定に問題があるようです。設定を確認し、再度お試しください。 @@ -352,7 +352,7 @@ ja: sp_oauth_token_missing: OpenProject は、ユーザーがまだ SharePoint アカウントをリンクしていないため、ユーザーレベルの SharePoint との通信をテストできません。 sp_tenant_id_missing: 構成されたディレクトリ(テナント)IDがSharePointにありません。設定を確認してください。 sp_unexpected_content: Unexpected content found in the SharePoint Document Library. - unknown_error: 接続を検証できませんでした。不明なエラーが発生しました。詳細については、サーバーのログを確認してください。 + unknown_error: 接続を検証できませんでした。不明なエラーが発生しました。詳細についてはサーバーログを確認してください。 label_error: エラー label_failed: 失敗しました label_healthy: 健康的 @@ -360,55 +360,55 @@ ja: label_pending: 保留中 label_skipped: スキップ label_warning: 注意 - no_report: 報告書なし - no_report_description: 今すぐチェックを実行し、このファイル・ストレージの完全な健全性ステータスをレポートする。 + no_report: 利用可能なレポートがありません + no_report_description: 今すぐこのファイルストレージの完全な健康状態レポートを確認します。 open_report: 完全な健康報告を開く project_folders: subtitle: 自動的に管理されるプロジェクトフォルダ - since: '%{datetime}より' + since: '%{datetime} 以降' summary: - failure: いくつかのチェックに失敗し、システムが期待通りに機能しない。 - success: すべての接続とシステムは期待通りに機能している。 - warning: いくつかのチェックは警告を返した。これは予期せぬ動作につながる可能性がある。 - title: 健康状態報告 + failure: いくつかのチェックに失敗し、システムが期待どおりに動作しません。 + success: すべての接続とシステムは期待どおりに動作しています。 + warning: いくつかのチェックが警告を返しました。これは予期しない動作につながる可能性があります。 + 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: 詳しくは、 %{provider_name} ファイルストレージ統合の設定に関するドキュメントをお読みください。 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: クライアントシークレットの値は、このウィンドウを閉じた後は二度とアクセスできなくなります。これらの値を %{oauth_application_details_link}にコピーしてください。 - oauth_application_details_link_text: NextcloudのOpenProject統合設定 + oauth_application_details_link_text: Nextcloud OpenProjectインテグレーション設定 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}、目的のアプリケーションからこれらの値をコピーします。' @@ -480,13 +480,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: ファイルストレージセットアップの状態の状態 @@ -505,8 +505,8 @@ ja: subtitle_short: OpenProjectにプロジェクトごとにフォルダを自動的に作成させます。 title: 自動的に管理されるプロジェクトフォルダ project_settings: - edit: このプロジェクトのファイル・ストレージを編集する - members_connection_status: メンバーの接続状況 + edit: このプロジェクトのファイルストレージを編集 + members_connection_status: 会員の接続状況 new: このプロジェクトにファイルストレージを追加する project_storage_members: subtitle: 全プロジェクトメンバーのストレージ %{storage_name_link} の接続状態を確認する。 @@ -517,14 +517,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 @@ -534,18 +534,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 04cb36084f5..35563523140 100644 --- a/modules/storages/config/locales/crowdin/js-ja.yml +++ b/modules/storages/config/locales/crowdin/js-ja.yml @@ -3,14 +3,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: authentication_error: "%{storageType} へのリクエストを認証できませんでした。これはエラーです。" connection_error: > %{storageType} の設定が一部機能していません。 %{storageType} 管理者にお問い合わせください。 - live_data_error: "ファイルの詳細の取得に失敗しました" + live_data_error: "ファイル詳細の取得エラー" live_data_error_description: > 一部の %{storageType} データを取得できませんでした。このページを再読み込みするか、 %{storageType} 管理者にお問い合わせください。 no_file_links: "このワークパッケージにファイルをリンクするには、 %{storageType}を使用してください。" @@ -33,7 +33,7 @@ ja: suggest_logout: ログアウトしてログインし直すと、この問題が解決するかどうか試してみてください。 suggest_relink: 以下のログインボタンからアカウントを再リンクすると、この問題が解決するかどうか試してみてください。 files: - already_existing_header: "このファイルはすでに存在する" + already_existing_header: "このファイルは既に存在します" already_existing_body: > このファイルをアップロードしようとしている場所に、"%{fileName}"という名前のファイルがすでに存在します。どうしますか? directory_not_writeable: "このフォルダにファイルを追加する権限がありません。" @@ -41,7 +41,7 @@ ja: dragging_folder: "%{storageType} へのアップロードはフォルダをサポートしていません。" empty_folder: "このフォルダは空です。" empty_folder_location_hint: "下のボタンをクリックして、この場所にファイルをアップロードしてください。" - file_not_selectable_location: "場所を選択する過程でファイルを選択することはできない。" + file_not_selectable_location: "ファイルを選択することは、場所を選択する過程ではできません。" project_folder_no_access: > プロジェクトフォルダにアクセスできません。管理者に連絡してアクセス権を取得するか、別の場所にファイルをアップロードしてください。 managed_project_folder_not_available: > @@ -79,9 +79,9 @@ ja: ファイル (%{fileName}) の容量がストレージ・クォータの許容量を超えています。管理者に連絡して、このクォータを変更してください。 detail: nextcloud: > - 最新版のNextcloudアプリ「OpenProject Integration」がインストールされていることを確認し、管理者にお問い合わせください。 + Nextcloudアプリ「OpenProject統合」の最新バージョンがインストールされていることを確認し、詳細については管理者にお問い合わせください。 link_uploaded_file_error: > - 最近アップロードされたファイル '%{fileName}' をワークパッケージ %{workPackageId}にリンクするエラーが発生しました。 + 最近アップロードされたファイル '%{fileName}' をワークパッケージ %{workPackageId} にリンクしてエラーが発生しました。 tooltip: not_logged_in: "このファイルにアクセスするには、ストレージにログインしてください。" view_not_allowed: "このファイルを閲覧する権限がありません。" diff --git a/modules/team_planner/config/locales/crowdin/js-fr.yml b/modules/team_planner/config/locales/crowdin/js-fr.yml index 4d8a0c78286..c96442a127a 100644 --- a/modules/team_planner/config/locales/crowdin/js-fr.yml +++ b/modules/team_planner/config/locales/crowdin/js-fr.yml @@ -19,7 +19,7 @@ fr: today: 'Aujourd''hui' drag_here_to_remove: 'Faites glisser ici pour supprimer le responsable et les dates de début et de fin.' cannot_drag_here: 'Impossible de déplacer le lot de travail en raison de restrictions d''autorisation ou d''édition.' - cannot_drag_to_non_working_day: 'Ce lot de travaux ne peut pas démarrer/terminer sur un jour non ouvré.' + cannot_drag_to_non_working_day: 'Ce lot de travail ne peut pas démarrer/terminer sur un jour non ouvré.' quick_add: empty_state: 'Utilisez le champ de recherche pour trouver des lots de travaux et faites-les glisser vers le planificateur pour l''assigner à quelqu''un et définir des dates de début et de fin.' search_placeholder: 'Rechercher...' diff --git a/modules/two_factor_authentication/config/locales/crowdin/ro.yml b/modules/two_factor_authentication/config/locales/crowdin/ro.yml index 6c8ef8748d3..7feb54c4620 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/ro.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/ro.yml @@ -178,7 +178,7 @@ ro: label_expiration_hint: "%{date} sau la deconectare" label_actions: "Acțiuni" label_confirmed: "Confirmat" - button_continue: "Continuă" + button_continue: "Continuaţi" button_make_default: "Marcați ca implicit" label_unverified_phone: "Telefonul mobil nu a fost încă verificat" notice_phone_number_format: "Te rog să introduci numărul în următorul format: +XX XXXXXXXX." diff --git a/modules/two_factor_authentication/config/locales/crowdin/ru.yml b/modules/two_factor_authentication/config/locales/crowdin/ru.yml index 80fa7dc0e25..bdba7c151d8 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/ru.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/ru.yml @@ -178,7 +178,7 @@ ru: label_expiration_hint: "%{date} или при выходе из системы" label_actions: "Действия" label_confirmed: "Подтвержден" - button_continue: "Продолжить" + button_continue: "Далее" button_make_default: "Задать по умолчанию" label_unverified_phone: "Сотовый телефон еще не подтвержден" notice_phone_number_format: "Введите номер в следующем формате: +XX XXXXXXXX." diff --git a/modules/two_factor_authentication/config/locales/crowdin/uk.yml b/modules/two_factor_authentication/config/locales/crowdin/uk.yml index 944c3bc181d..8649db79efe 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/uk.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/uk.yml @@ -119,7 +119,7 @@ uk: failed_to_delete: "Не вдалося видалити пристрій 2FA." is_default_cannot_delete: "Пристрій позначено як типовий і його не можна видалити через активну політику безпеки. Перед видаленням позначте інший пристрій як стандартний." not_existing: "Для вашого облікового запису не зареєстровано жодного пристрою 2FA." - 2fa_from_input: Введіть код, отриманий на пристрій %{device_name}, щоб підтвердити свою особу. + 2fa_from_input: Введіть код, що надійшов на пристрій %{device_name}, щоб підтвердити свою особу. 2fa_from_webauthn: Укажіть пристрій WebAuthn %{device_name}. Якщо це USB-пристрій, переконайтеся, що його підключено, і торкніться його. Потім натисніть кнопку входу. webauthn: title: "WebAuthn" diff --git a/modules/xls_export/config/locales/crowdin/zh-CN.yml b/modules/xls_export/config/locales/crowdin/zh-CN.yml index 59230e603ec..31c8d3cdd71 100644 --- a/modules/xls_export/config/locales/crowdin/zh-CN.yml +++ b/modules/xls_export/config/locales/crowdin/zh-CN.yml @@ -13,4 +13,4 @@ zh-CN: xls_with_relations: "带关系的 XLS" xls_export: child_of: 此项的子项 - parent_of: 此项的父级 + parent_of: 此项的父项 From cbe71dc5bec8dc62babb33fc00178258c06d9ef1 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Mon, 2 Mar 2026 03:49:32 +0000 Subject: [PATCH 075/334] update locales from crowdin [ci skip] --- modules/backlogs/config/locales/crowdin/fr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index a5ba766e5a3..509c5c533ab 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -72,7 +72,7 @@ fr: show_burndown_chart: "Graphique d'avancement" story: "Histoire" story_points: - one: "%{count} point d'histoire" + one: "%{count} story point " other: "%{count} story points" task: "Tâche" task_color: "Couleur des tâches" From dc3949b686c7946adb493bf65aeff0060025a7fc Mon Sep 17 00:00:00 2001 From: Klaus Zanders Date: Mon, 2 Mar 2026 10:29:02 +0100 Subject: [PATCH 076/334] Remove deprecated `on_booted` and use `after_booted` --- config/puma.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/puma.rb b/config/puma.rb index 91b7e7b442c..45237d89362 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -129,8 +129,7 @@ if Rails.env.development? end if siginfo_supported - # Using on_booted is needed to override puma adding handler to show thread statuses - on_booted do + after_booted do Signal.trap("INFO") do system "open", Rails.application.root_url end From 71842de32d9715e51824f7f2553438c7cd291c48 Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Mon, 2 Mar 2026 15:53:32 +0100 Subject: [PATCH 077/334] [fix] make project visible for representer test - when rendering a meeting with any user, the project must be visible, the representer test now reflects that --- .../spec/lib/api/v3/meetings/meeting_representer_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/meeting/spec/lib/api/v3/meetings/meeting_representer_spec.rb b/modules/meeting/spec/lib/api/v3/meetings/meeting_representer_spec.rb index ca26ba5b527..9e2d8b4052b 100644 --- a/modules/meeting/spec/lib/api/v3/meetings/meeting_representer_spec.rb +++ b/modules/meeting/spec/lib/api/v3/meetings/meeting_representer_spec.rb @@ -33,7 +33,7 @@ require "spec_helper" RSpec.describe API::V3::Meetings::MeetingRepresenter do include API::V3::Utilities::PathHelper - let(:workspace) { build_stubbed(:project) } + let(:workspace) { build_stubbed(:project, public: true) } let(:current_user) do build_stubbed(:user) end From 4cfe3ddb4105fdb8aaeab300c5846424799a823b Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Mon, 2 Mar 2026 16:41:52 +0100 Subject: [PATCH 078/334] [fix] make embedded project optional for the meetings resource - revert spec to original form with invisible project --- docs/api/apiv3/components/schemas/meeting_model.yml | 1 - .../spec/lib/api/v3/meetings/meeting_representer_spec.rb | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/api/apiv3/components/schemas/meeting_model.yml b/docs/api/apiv3/components/schemas/meeting_model.yml index 24605a0a6e2..0b518a1d20e 100644 --- a/docs/api/apiv3/components/schemas/meeting_model.yml +++ b/docs/api/apiv3/components/schemas/meeting_model.yml @@ -53,7 +53,6 @@ properties: required: - attachments - author - - project properties: attachments: $ref: './attachments_model.yml' diff --git a/modules/meeting/spec/lib/api/v3/meetings/meeting_representer_spec.rb b/modules/meeting/spec/lib/api/v3/meetings/meeting_representer_spec.rb index 9e2d8b4052b..ca26ba5b527 100644 --- a/modules/meeting/spec/lib/api/v3/meetings/meeting_representer_spec.rb +++ b/modules/meeting/spec/lib/api/v3/meetings/meeting_representer_spec.rb @@ -33,7 +33,7 @@ require "spec_helper" RSpec.describe API::V3::Meetings::MeetingRepresenter do include API::V3::Utilities::PathHelper - let(:workspace) { build_stubbed(:project, public: true) } + let(:workspace) { build_stubbed(:project) } let(:current_user) do build_stubbed(:user) end From 9e216690d2a4e40af5a843910c83901d25b660c8 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Mon, 2 Mar 2026 08:49:20 +0100 Subject: [PATCH 079/334] Validate schemes for CopyToClipboardComponent When trying to use this component, I wanted to use the input scheme that I copied from elsewhere in the code. At first I was surprised that the lookbook didn't yet contain a playground, where I could try this style out. After adding it, I was surprised that it didn't look like an input at all and learned that this scheme does not even exist... But it was already used multiple times :O --- .../op_primer/copy_to_clipboard_component.rb | 13 ++++++++++++- .../copy_to_clipboard_component_preview.rb | 6 ++++++ .../side_panel/information_component.html.erb | 2 +- .../side_panel/information_component.html.erb | 6 +++--- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/components/op_primer/copy_to_clipboard_component.rb b/app/components/op_primer/copy_to_clipboard_component.rb index fde52372f4c..18e0153b5f2 100644 --- a/app/components/op_primer/copy_to_clipboard_component.rb +++ b/app/components/op_primer/copy_to_clipboard_component.rb @@ -32,14 +32,25 @@ module OpPrimer class CopyToClipboardComponent < ApplicationComponent include OpPrimer::ComponentHelpers + SCHEME_OPTIONS = %i[value link].freeze + alias_method :value, :model def initialize(value = nil, scheme: :value, **system_arguments) super(value) - @scheme = scheme + @scheme = validate_scheme!(scheme) @system_arguments = system_arguments @id = SecureRandom.hex(8) end + + private + + def validate_scheme!(scheme) + scheme = scheme.to_sym + raise ArgumentError, "scheme must be one of #{SCHEME_OPTIONS}" unless SCHEME_OPTIONS.include?(scheme) + + scheme + end end end diff --git a/lookbook/previews/op_primer/copy_to_clipboard_component_preview.rb b/lookbook/previews/op_primer/copy_to_clipboard_component_preview.rb index f37618269db..e4766bff810 100644 --- a/lookbook/previews/op_primer/copy_to_clipboard_component_preview.rb +++ b/lookbook/previews/op_primer/copy_to_clipboard_component_preview.rb @@ -36,6 +36,12 @@ module OpPrimer render(OpPrimer::CopyToClipboardComponent.new(value)) end + # @param url text + # @param scheme [Symbol] select [value, link] + def playground(url: "https://example.org", scheme: :value) + render(OpPrimer::CopyToClipboardComponent.new(url, scheme:)) + end + # @param url text def as_link(url: "http://example.org") render(OpPrimer::CopyToClipboardComponent.new(url, scheme: :link)) diff --git a/modules/auth_saml/app/components/saml/providers/side_panel/information_component.html.erb b/modules/auth_saml/app/components/saml/providers/side_panel/information_component.html.erb index 758bde48119..260bede0a4c 100644 --- a/modules/auth_saml/app/components/saml/providers/side_panel/information_component.html.erb +++ b/modules/auth_saml/app/components/saml/providers/side_panel/information_component.html.erb @@ -9,7 +9,7 @@ end collection.with_component( - OpPrimer::CopyToClipboardComponent.new(provider.sp_entity_id, scheme: :input) + OpPrimer::CopyToClipboardComponent.new(provider.sp_entity_id, scheme: :value) ) collection.with_component(Primer::Beta::Heading.new(tag: :h5, mt: 4, mb: 1)) do diff --git a/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb b/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb index 0246817d18b..c22de3556b2 100644 --- a/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb +++ b/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb @@ -9,7 +9,7 @@ end collection.with_component( - OpPrimer::CopyToClipboardComponent.new(provider.slug, scheme: :input) + OpPrimer::CopyToClipboardComponent.new(provider.slug, scheme: :value) ) collection.with_component(Primer::Beta::Heading.new(tag: :h5, mt: 4, mb: 1)) do @@ -17,7 +17,7 @@ end collection.with_component( - OpPrimer::CopyToClipboardComponent.new(provider.callback_url, scheme: :input) + OpPrimer::CopyToClipboardComponent.new(provider.callback_url, scheme: :value) ) collection.with_component(Primer::Beta::Heading.new(tag: :h5, mt: 4, mb: 1)) do @@ -25,7 +25,7 @@ end collection.with_component( - OpPrimer::CopyToClipboardComponent.new(provider.backchannel_logout_url, scheme: :input) + OpPrimer::CopyToClipboardComponent.new(provider.backchannel_logout_url, scheme: :value) ) end end From 6a80b8064b86e3223a7adc92f29c1d92602d55d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 05:34:31 +0000 Subject: [PATCH 080/334] Bump httpx from 1.6.3 to 1.7.2 Bumps [httpx](https://gitlab.com/os85/httpx) from 1.6.3 to 1.7.2. - [Commits](https://gitlab.com/os85/httpx/compare/v1.6.3...v1.7.2) --- updated-dependencies: - dependency-name: httpx dependency-version: 1.7.2 dependency-type: direct:production 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 bfc8f848d51..94902d4952b 100644 --- a/Gemfile +++ b/Gemfile @@ -255,7 +255,7 @@ gem "turbo-rails", "~> 2.0.20" # There is a problem with version 1.4.0. Do not update until you're sure there is no infinite hang # happenning in failing tests when WebMock or VCR stub cannot be found. -gem "httpx", "~> 1.6.3" +gem "httpx", "~> 1.7.2" # Brings actual deep-freezing to most ruby objects gem "ice_nine" diff --git a/Gemfile.lock b/Gemfile.lock index 3e29814bb05..51a9efb415d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -696,7 +696,7 @@ GEM htmlentities (4.3.4) http-2 (1.1.2) http_parser.rb (0.8.1) - httpx (1.6.3) + httpx (1.7.2) http-2 (>= 1.0.0) i18n (1.14.8) concurrent-ruby (~> 1.0) @@ -1628,7 +1628,7 @@ DEPENDENCIES grids! html-pipeline (~> 2.14.0) htmldiff - httpx (~> 1.6.3) + httpx (~> 1.7.2) i18n-js (~> 4.2.4) i18n-tasks (~> 1.1.0) ice_cube (~> 0.17.0) @@ -1964,7 +1964,7 @@ CHECKSUMS htmlentities (4.3.4) sha256=125a73c6c9f2d1b62100b7c3c401e3624441b663762afa7fe428476435a673da http-2 (1.1.2) sha256=8c1cb40203fc60b521c491509fee96c7b08092975eb30036465992433715ed40 http_parser.rb (0.8.1) sha256=9ae8df145b39aa5398b2f90090d651c67bd8e2ebfe4507c966579f641e11097a - httpx (1.6.3) sha256=1b4a11b9572b78839f649ad6ebbe09b5f467cc458e0ee408bddc902b273a2e8a + httpx (1.7.2) sha256=10cdcd5b03794de743bec87e8cdba2ca93e2124084b6cdb1ad01b00c192a51f7 i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5 i18n-js (4.2.4) sha256=61390d372f8fa68c495c5907d577657e8cc3a7031f4945db1e91f935e1391355 i18n-tasks (1.1.2) sha256=4dcfba49e52a623f30661cb316cb80d84fbba5cb8c6d88ef5e02545fffa3637a From d4e841cfceb83e9ea313605badeeb198fc59d1a5 Mon Sep 17 00:00:00 2001 From: Marcello Rocha Date: Mon, 2 Mar 2026 18:25:57 +0100 Subject: [PATCH 081/334] Update HTTPX configs and plugin loading according to the new docs for Client Credentials, Bearer and Basic auth --- lib/open_project.rb | 8 +- .../authentication_strategies/basic_auth.rb | 2 +- .../oauth_client_credentials.rb | 19 +- .../bearer_token_spec.rb | 4 +- .../oauth_client_credentials_spec.rb | 14 +- .../auth/nextcloud/refresh_token.yml | 451 ++++++++++++++++++ 6 files changed, 472 insertions(+), 26 deletions(-) create mode 100644 modules/storages/spec/support/fixtures/vcr_cassettes/auth/nextcloud/refresh_token.yml diff --git a/lib/open_project.rb b/lib/open_project.rb index 90ae8e60c3f..42ce89430e3 100644 --- a/lib/open_project.rb +++ b/lib/open_project.rb @@ -59,11 +59,10 @@ module OpenProject private_class_method def self.httpx_session session = HTTPX - .plugin(:oauth) - .plugin(:persistent) - .plugin(:basic_auth) - .plugin(:webdav) .with(headers: { "User-Agent" => "OpenProject #{OpenProject::VERSION.to_semver} HTTPX Client" }) + .plugin(:auth) + .plugin(:persistent) + .plugin(:webdav) .with( timeout: { connect_timeout: OpenProject::Configuration.httpx_connect_timeout, @@ -74,6 +73,7 @@ module OpenProject keep_alive_timeout: OpenProject::Configuration.httpx_keep_alive_timeout } ) + OpenProject::Appsignal.enabled? ? session.plugin(HttpxAppsignal) : session end end diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/basic_auth.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/basic_auth.rb index cea3bb61c9a..7a47f8684bd 100644 --- a/modules/storages/app/common/storages/adapters/authentication_strategies/basic_auth.rb +++ b/modules/storages/app/common/storages/adapters/authentication_strategies/basic_auth.rb @@ -40,7 +40,7 @@ module Storages return build_failure(storage) if username.blank? || password.blank? - yield OpenProject.httpx.basic_auth(username, password).with(http_options) + yield OpenProject.httpx.plugin(:basic_auth).basic_auth(username, password).with(http_options) end private diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb index ac771777fdd..8e2aeadf814 100644 --- a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb +++ b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb @@ -61,6 +61,10 @@ module Storages end operation_result + rescue HTTPX::HTTPError => e + Failure(Results::Error.new(code: :unauthorized, payload: e.response, source: self.class)) + rescue HTTPX::TimeoutError => e + Failure(Results::Error.new(code: :timeout, payload: e.to_s, source: self.class)) end private @@ -73,7 +77,7 @@ module Storages end def write_cache(key, httpx_session) - access_token = httpx_session.instance_variable_get(:@options).oauth_session.access_token + access_token = httpx_session.send(:oauth_session).access_token Rails.cache.write(key, access_token, expires_in: 50.minutes) end @@ -88,20 +92,11 @@ module Storages end def http_with_current_token(access_token:, http_options:) - opts = http_options.deep_merge({ headers: { "Authorization" => "Bearer #{access_token}" } }) - Success(OpenProject.httpx.with(opts)) + Success(OpenProject.httpx.bearer_auth(access_token).with(http_options)) end def http_with_new_token(config:, http_options:) - http = OpenProject.httpx - .oauth_auth(**config.to_h, token_endpoint_auth_method: "client_secret_post") - .with_access_token - .with(http_options) - Success(http) - rescue HTTPX::HTTPError => e - Failure(Results::Error.new(code: :unauthorized, payload: e.response, source: self.class)) - rescue HTTPX::TimeoutError => e - Failure(Results::Error.new(code: :timeout, payload: e.to_s, source: self.class)) + Success(OpenProject.httpx.plugin(:oauth).with(**http_options, oauth_options: config.to_h)) end end end diff --git a/modules/storages/spec/common/storages/adapters/authentication_strategies/bearer_token_spec.rb b/modules/storages/spec/common/storages/adapters/authentication_strategies/bearer_token_spec.rb index 5dbea598a83..0bf710ebe5c 100644 --- a/modules/storages/spec/common/storages/adapters/authentication_strategies/bearer_token_spec.rb +++ b/modules/storages/spec/common/storages/adapters/authentication_strategies/bearer_token_spec.rb @@ -38,13 +38,13 @@ module Storages let(:storage) { create(:nextcloud_storage) } let(:access_token) { "my_access_token" } - it "must yield with passed access token without" do + it "must yield with the passed access token" do strategy = Input::Strategy.build(key: :bearer_token, token: access_token) was_yielded = false Authentication[strategy].call(storage:) do |http| was_yielded = true - expect(http.instance_variable_get(:@options).headers["authorization"]).to eq("Bearer #{access_token}") + expect(http.instance_variable_get(:@options).auth_header_value).to eq(access_token) end expect(was_yielded).to be_truthy diff --git a/modules/storages/spec/common/storages/adapters/authentication_strategies/oauth_client_credentials_spec.rb b/modules/storages/spec/common/storages/adapters/authentication_strategies/oauth_client_credentials_spec.rb index 0ac4624a754..42d78317082 100644 --- a/modules/storages/spec/common/storages/adapters/authentication_strategies/oauth_client_credentials_spec.rb +++ b/modules/storages/spec/common/storages/adapters/authentication_strategies/oauth_client_credentials_spec.rb @@ -43,7 +43,7 @@ module Storages context "with valid oauth credentials", vcr: "auth/one_drive/client_credentials" do it "return success" do - result = Authentication[strategy_data].call(storage:, http_options: {}) { |http| make_request(http) } + result = Authentication[strategy_data].call(storage:) { make_request(it) } expect(result).to be_success expect(result.value!).to eq("EXPECTED_RESULT") @@ -51,9 +51,7 @@ module Storages it "caches the token if use_cache is true" do strategy_data = Input::Strategy.build(key: :oauth_client_credentials, use_cache: true) - Authentication[strategy_data].call(storage:, http_options: {}) do |http| - make_request(http) - end + Authentication[strategy_data].call(storage:) { make_request(it) } cache_key = described_class::TOKEN_CACHE_KEY % storage.id expect(Rails.cache.read(cache_key)).not_to be_nil @@ -62,7 +60,7 @@ module Storages context "with invalid client secret", vcr: "auth/one_drive/client_credentials_invalid_client_secret" do it "must return unauthorized" do - result = Authentication[strategy_data].call(storage:) { |http| make_request(http) } + result = Authentication[strategy_data].call(storage:) { make_request(it) } expect(result).to be_failure error = result.failure @@ -73,7 +71,7 @@ module Storages context "with invalid client id", vcr: "auth/one_drive/client_credentials_invalid_client_id" do it "must return unauthorized" do - result = Authentication[strategy_data].call(storage:) { |http| make_request(http) } + result = Authentication[strategy_data].call(storage:) { make_request(it) } expect(result).to be_failure error = result.failure @@ -84,7 +82,9 @@ module Storages private - def make_request(http) = handle_response(http.get(request_url)) + def make_request(http) + handle_response(http.get(request_url)) + end def handle_response(response) case response diff --git a/modules/storages/spec/support/fixtures/vcr_cassettes/auth/nextcloud/refresh_token.yml b/modules/storages/spec/support/fixtures/vcr_cassettes/auth/nextcloud/refresh_token.yml new file mode 100644 index 00000000000..12f2c24ea33 --- /dev/null +++ b/modules/storages/spec/support/fixtures/vcr_cassettes/auth/nextcloud/refresh_token.yml @@ -0,0 +1,451 @@ +--- +http_interactions: +- request: + method: get + uri: https://nextcloud.local/ocs/v1.php/cloud/user + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - OpenProject 17.2.0 HTTPX Client + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate + Authorization: + - Bearer + response: + status: + code: 401 + message: Unauthorized + headers: + Cache-Control: + - no-cache, no-store, must-revalidate + Content-Security-Policy: + - default-src 'none';base-uri 'none';manifest-src 'self';frame-ancestors 'none' + Content-Type: + - application/xml; charset=utf-8 + Date: + - Mon, 02 Mar 2026 16:08:46 GMT + Feature-Policy: + - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone + 'none';payment 'none' + Referrer-Policy: + - no-referrer + Server: + - Apache/2.4.66 (Debian) + Set-Cookie: + - ocijlj3fsmm9=5b65855c97c459db69c61861f926501f; path=/; secure; HttpOnly; SameSite=Lax, + oc_sessionPassphrase=eeaqxrN0jZy61LxpAwJ7W1RwdhNnTJ4eE53GnTsym79KnC%2Fd%2Bs7VxPDGJ8sdlqgXt84b5inOVqF2cOYkCPIXrzCHtSBkF852ekuoKW9e0oBoEgxmnsccJbD5uSRwv9h%2B; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=5b65855c97c459db69c61861f926501f; + path=/; secure; HttpOnly; SameSite=Lax, __Host-nc_sameSiteCookielax=true; + path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=lax, + __Host-nc_sameSiteCookiestrict=true; path=/; httponly;secure; expires=Fri, + 31-Dec-2100 23:59:59 GMT; SameSite=strict, ocijlj3fsmm9=5b65855c97c459db69c61861f926501f; + path=/; secure; HttpOnly; SameSite=Lax, nc_username=deleted; expires=Thu, + 01 Jan 1970 00:00:01 GMT; Max-Age=0; secure; HttpOnly, nc_token=deleted; expires=Thu, + 01 Jan 1970 00:00:01 GMT; Max-Age=0; secure; HttpOnly, nc_session_id=deleted; + expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; secure; HttpOnly, nc_username=deleted; + expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; path=/; secure; HttpOnly, + nc_token=deleted; expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; path=/; + secure; HttpOnly, nc_session_id=deleted; expires=Thu, 01 Jan 1970 00:00:01 + GMT; Max-Age=0; path=/; secure; HttpOnly + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + - none + X-Powered-By: + - PHP/8.4.18 + X-Request-Id: + - mpcjYVvLLOeYrNKfHGA4 + X-Robots-Tag: + - noindex, nofollow + Content-Length: + - '230' + body: + encoding: UTF-8 + string: | + + + + failure + 997 + Current user is not logged in + + + + + + recorded_at: Mon, 02 Mar 2026 16:08:46 GMT +- request: + method: post + uri: https://nextcloud.local/index.php/apps/oauth2/api/v1/token + body: + encoding: ASCII-8BIT + string: grant_type=refresh_token&scope=&refresh_token= + headers: + User-Agent: + - OpenProject 17.2.0 HTTPX Client + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate + Authorization: + - Basic + Content-Type: + - application/x-www-form-urlencoded + Content-Length: + - '174' + response: + status: + code: 200 + message: OK + headers: + Cache-Control: + - no-cache, no-store, must-revalidate + Content-Encoding: + - gzip + Content-Security-Policy: + - default-src 'none';base-uri 'none';manifest-src 'self';frame-ancestors 'none' + Content-Type: + - application/json; charset=utf-8 + Date: + - Mon, 02 Mar 2026 16:08:46 GMT + Feature-Policy: + - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone + 'none';payment 'none' + Referrer-Policy: + - no-referrer + Server: + - Apache/2.4.66 (Debian) + Set-Cookie: + - ocijlj3fsmm9=b3b43751df79bb2be113552e0da3c8ef; path=/; secure; HttpOnly; SameSite=Lax, + oc_sessionPassphrase=jjRcONBYop3Z1ttvqVG8PoNd928I2MOEQ5wvxPYxmsvSM07Ow5FKvhg1JnCFLwnYSlfMCU5FaEQ35ZGSwULlYqJ8Fndsqn5nk48zjTTdXiedpPMlZDU%2F%2FkWaYG%2BChSAK; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=b3b43751df79bb2be113552e0da3c8ef; + path=/; secure; HttpOnly; SameSite=Lax, __Host-nc_sameSiteCookielax=true; + path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=lax, + __Host-nc_sameSiteCookiestrict=true; path=/; httponly;secure; expires=Fri, + 31-Dec-2100 23:59:59 GMT; SameSite=strict, ocijlj3fsmm9=b3b43751df79bb2be113552e0da3c8ef; + path=/; secure; HttpOnly; SameSite=Lax + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + - none + X-Powered-By: + - PHP/8.4.18 + X-Request-Id: + - JewgU7FS0QDRXDmGLnWf + X-Robots-Tag: + - noindex, nofollow + Content-Length: + - '270' + body: + encoding: UTF-8 + string: '{"access_token":"","token_type":"Bearer","expires_in":3600,"refresh_token":"","user_id":"admin"}' + recorded_at: Mon, 02 Mar 2026 16:08:46 GMT +- request: + method: get + uri: https://nextcloud.local/ocs/v1.php/cloud/user + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - OpenProject 17.2.0 HTTPX Client + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate + Authorization: + - Bearer + response: + status: + code: 200 + message: OK + headers: + Cache-Control: + - no-cache, no-store, must-revalidate + Content-Encoding: + - gzip + Content-Security-Policy: + - default-src 'none';base-uri 'none';manifest-src 'self';frame-ancestors 'none' + Content-Type: + - application/xml; charset=utf-8 + Date: + - Mon, 02 Mar 2026 16:08:46 GMT + Feature-Policy: + - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone + 'none';payment 'none' + Referrer-Policy: + - no-referrer + Server: + - Apache/2.4.66 (Debian) + Set-Cookie: + - ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; path=/; secure; HttpOnly; SameSite=Lax, + oc_sessionPassphrase=BzSroJ7oX15ip9xi5Y8Na48QPwG3mu7fpYl%2B2wlSxOFqh%2BUEIwflqvkgtdvr7LpA5zGPXrat0VvAckP95BkTm7ZcK8JJZEwKYK7shleHPn1ZaIzThTiJWuLuuRjnmxp%2F; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, __Host-nc_sameSiteCookielax=true; + path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=lax, + __Host-nc_sameSiteCookiestrict=true; path=/; httponly;secure; expires=Fri, + 31-Dec-2100 23:59:59 GMT; SameSite=strict, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, nc_username=deleted; expires=Thu, + 01 Jan 1970 00:00:01 GMT; Max-Age=0; secure; HttpOnly, nc_token=deleted; expires=Thu, + 01 Jan 1970 00:00:01 GMT; Max-Age=0; secure; HttpOnly, nc_session_id=deleted; + expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; secure; HttpOnly, nc_username=deleted; + expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; path=/; secure; HttpOnly, + nc_token=deleted; expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; path=/; + secure; HttpOnly, nc_session_id=deleted; expires=Thu, 01 Jan 1970 00:00:01 + GMT; Max-Age=0; path=/; secure; HttpOnly, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + - none + X-Powered-By: + - PHP/8.4.18 + X-Request-Id: + - 9KY3Gces4KNzsrkeOsWU + X-Robots-Tag: + - noindex, nofollow + X-User-Id: + - admin + Content-Length: + - '691' + body: + encoding: UTF-8 + string: | + + + + ok + 100 + OK + + + + + 1 + /var/www/html/data/admin + admin + 1772444624 + 1772467726 + 1772467726000 + Database + + + -3 + 60872728 + -3 + 0 + -3 + + + v2-federated + + v2-federated + + + admin + admin + v2-federated + + v2-local +
+ v2-local + + v2-local + + v2-local + + v2-local + + v2-local + + v2-local + + v2-local + + v2-local + + v2-local + 1 + v2-local + + v2-federated + + admin + + en + + Europe/Busingen + + + 1 + 1 + +
+
+ recorded_at: Mon, 02 Mar 2026 16:08:46 GMT +- request: + method: get + uri: https://nextcloud.local/ocs/v1.php/cloud/user + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - OpenProject 17.2.0 HTTPX Client + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate + Authorization: + - Bearer + response: + status: + code: 200 + message: OK + headers: + Cache-Control: + - no-cache, no-store, must-revalidate + Content-Encoding: + - gzip + Content-Security-Policy: + - default-src 'none';base-uri 'none';manifest-src 'self';frame-ancestors 'none' + Content-Type: + - application/xml; charset=utf-8 + Date: + - Mon, 02 Mar 2026 16:08:46 GMT + Feature-Policy: + - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone + 'none';payment 'none' + Referrer-Policy: + - no-referrer + Server: + - Apache/2.4.66 (Debian) + Set-Cookie: + - ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; path=/; secure; HttpOnly; SameSite=Lax, + oc_sessionPassphrase=BzSroJ7oX15ip9xi5Y8Na48QPwG3mu7fpYl%2B2wlSxOFqh%2BUEIwflqvkgtdvr7LpA5zGPXrat0VvAckP95BkTm7ZcK8JJZEwKYK7shleHPn1ZaIzThTiJWuLuuRjnmxp%2F; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, __Host-nc_sameSiteCookielax=true; + path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=lax, + __Host-nc_sameSiteCookiestrict=true; path=/; httponly;secure; expires=Fri, + 31-Dec-2100 23:59:59 GMT; SameSite=strict, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, nc_username=deleted; expires=Thu, + 01 Jan 1970 00:00:01 GMT; Max-Age=0; secure; HttpOnly, nc_token=deleted; expires=Thu, + 01 Jan 1970 00:00:01 GMT; Max-Age=0; secure; HttpOnly, nc_session_id=deleted; + expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; secure; HttpOnly, nc_username=deleted; + expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; path=/; secure; HttpOnly, + nc_token=deleted; expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; path=/; + secure; HttpOnly, nc_session_id=deleted; expires=Thu, 01 Jan 1970 00:00:01 + GMT; Max-Age=0; path=/; secure; HttpOnly, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax, ocijlj3fsmm9=8c15d45120403fd0c95c1c8d23c250b1; + path=/; secure; HttpOnly; SameSite=Lax + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + - none + X-Powered-By: + - PHP/8.4.18 + X-Request-Id: + - 9KY3Gces4KNzsrkeOsWU + X-Robots-Tag: + - noindex, nofollow + X-User-Id: + - admin + Content-Length: + - '691' + body: + encoding: UTF-8 + string: | + + + + ok + 100 + OK + + + + + 1 + /var/www/html/data/admin + admin + 1772444624 + 1772467726 + 1772467726000 + Database + + + -3 + 60872728 + -3 + 0 + -3 + + + v2-federated + + v2-federated + + + admin + admin + v2-federated + + v2-local +
+ v2-local + + v2-local + + v2-local + + v2-local + + v2-local + + v2-local + + v2-local + + v2-local + + v2-local + 1 + v2-local + + v2-federated + + admin + + en + + Europe/Busingen + + + 1 + 1 + +
+
+ recorded_at: Mon, 02 Mar 2026 16:08:46 GMT +recorded_with: VCR 6.4.0 From 954d1423955aa25b4837f0245d10137489ef6306 Mon Sep 17 00:00:00 2001 From: Marcello Rocha Date: Mon, 2 Mar 2026 18:37:41 +0100 Subject: [PATCH 082/334] Disable persistent connections as it is starting an infinite loop. Needs more investigation --- lib/open_project.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/open_project.rb b/lib/open_project.rb index 42ce89430e3..149308044e4 100644 --- a/lib/open_project.rb +++ b/lib/open_project.rb @@ -61,7 +61,6 @@ module OpenProject session = HTTPX .with(headers: { "User-Agent" => "OpenProject #{OpenProject::VERSION.to_semver} HTTPX Client" }) .plugin(:auth) - .plugin(:persistent) .plugin(:webdav) .with( timeout: { From 0543ecf49571baf70fcfec98a244d37619e8f602 Mon Sep 17 00:00:00 2001 From: Marcello Rocha Date: Mon, 2 Mar 2026 18:38:43 +0100 Subject: [PATCH 083/334] Disable AbcSize check for OAuthClientCredentialStrategy#call --- .../authentication_strategies/oauth_client_credentials.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb index 8e2aeadf814..4e5d56056a0 100644 --- a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb +++ b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb @@ -39,7 +39,7 @@ module Storages @use_cache = use_cache end - def call(storage:, http_options: {}) + def call(storage:, http_options: {}) # rubocop:disable Metrics/AbcSize config = validate_configuration(storage).value_or { return Failure(it) } token_cache_key = TOKEN_CACHE_KEY % storage.id From e3049b26587478b4d48e706ced78bef091be2ff5 Mon Sep 17 00:00:00 2001 From: Marcello Rocha Date: Mon, 2 Mar 2026 18:47:40 +0100 Subject: [PATCH 084/334] Update calls to httpx loading the necessary auth plugin --- .../app/workers/cron/check_deploy_status_job.rb | 4 ++-- .../app/services/openid_connect/user_tokens/token_request.rb | 2 +- .../validator/nextcloud_application_credentials_validator.rb | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/github_integration/app/workers/cron/check_deploy_status_job.rb b/modules/github_integration/app/workers/cron/check_deploy_status_job.rb index 6a27e3e5bd6..f8ea9bae7a0 100644 --- a/modules/github_integration/app/workers/cron/check_deploy_status_job.rb +++ b/modules/github_integration/app/workers/cron/check_deploy_status_job.rb @@ -157,7 +157,7 @@ module Cron end def introspection_request(host, api_token) - OpenProject.httpx.basic_auth("apikey", api_token).get("https://#{host}/api/v3") + OpenProject.httpx.plugin(:basic_auth).basic_auth("apikey", api_token).get("https://#{host}/api/v3") end ## @@ -188,7 +188,7 @@ module Cron ahead_by = data["ahead_by"].presence behind_by = data["behind_by"].presence - status == "behind" && ahead_by == 0 && (behind_by.present? && behind_by > 0) + status == "behind" && ahead_by == 0 && behind_by.present? && behind_by > 0 end def compare_commits(sha_a, sha_b) diff --git a/modules/openid_connect/app/services/openid_connect/user_tokens/token_request.rb b/modules/openid_connect/app/services/openid_connect/user_tokens/token_request.rb index f774185c546..3d43de64ec9 100644 --- a/modules/openid_connect/app/services/openid_connect/user_tokens/token_request.rb +++ b/modules/openid_connect/app/services/openid_connect/user_tokens/token_request.rb @@ -78,7 +78,7 @@ module OpenIDConnect # Client ID and Client Secret must be form-encoded. Otherwise characters such as colon (:) # would not be allowed in the Client ID, since HTTP Basic Auth does not support it # as per https://datatracker.ietf.org/doc/html/rfc7617#section-2 - OpenProject.httpx.basic_auth(CGI.escape(provider.client_id), CGI.escape(provider.client_secret)) + OpenProject.httpx.plugin(:basic_auth).basic_auth(CGI.escape(provider.client_id), CGI.escape(provider.client_secret)) end end end diff --git a/modules/storages/app/validator/nextcloud_application_credentials_validator.rb b/modules/storages/app/validator/nextcloud_application_credentials_validator.rb index 794a10937b6..8aa7e1e5ed9 100644 --- a/modules/storages/app/validator/nextcloud_application_credentials_validator.rb +++ b/modules/storages/app/validator/nextcloud_application_credentials_validator.rb @@ -40,6 +40,7 @@ class NextcloudApplicationCredentialsValidator response = OpenProject .httpx + .plugin(:basic_auth) .basic_auth(contract.username, contract.password) .head(Storages::UrlBuilder.url(contract.model.uri, "remote.php/dav")) case response From 8acc2114718320aae1b29d31129b24ff1ae62329 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Mon, 2 Mar 2026 19:32:23 +0100 Subject: [PATCH 085/334] fix fetching of merge base in create merge release workflow Apparently shallow-exclude is misbehaving (confirmed by local tests) and fetching just one level of parents after it is sometimes not enough. Switch to 10 tries to fetch 10 more levels of parents. --- .github/workflows/create-merge-release-into-dev-pr.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create-merge-release-into-dev-pr.yml b/.github/workflows/create-merge-release-into-dev-pr.yml index c2bd973bf78..853e71493be 100644 --- a/.github/workflows/create-merge-release-into-dev-pr.yml +++ b/.github/workflows/create-merge-release-into-dev-pr.yml @@ -57,8 +57,14 @@ jobs: - name: Resolve bug in git https://stackoverflow.com/a/63879454/96823 run: git repack -d - - name: Get one commit more to connect the history of dev and release branches - run: git fetch --deepen 1 origin "$BASE_BRANCH" "$RELEASE_BRANCH" + - name: Get more commits to connect the history of dev and release branches + run: | + for i in $(seq 1 10); do + git fetch --deepen 10 origin "$BASE_BRANCH" "$RELEASE_BRANCH" + git merge-base --all HEAD origin/"$RELEASE_BRANCH" && exit 0 + done + echo "Failed to fetch merge base" >&2 + exit 1 - name: Create branch without checkout just to have shorter automatic commit message run: git branch "$RELEASE_BRANCH" origin/"$RELEASE_BRANCH" From 452f4544f47fac5682dd86189754eb3e619ed24c Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 3 Mar 2026 03:51:49 +0000 Subject: [PATCH 086/334] update locales from crowdin [ci skip] --- config/locales/crowdin/de.yml | 326 +++++++++--------- config/locales/crowdin/fr.yml | 302 ++++++++-------- config/locales/crowdin/ru.yml | 4 +- .../backlogs/config/locales/crowdin/de.yml | 50 +-- .../backlogs/config/locales/crowdin/fr.yml | 12 +- .../backlogs/config/locales/crowdin/ru.yml | 14 +- modules/budgets/config/locales/crowdin/de.yml | 28 +- .../budgets/config/locales/crowdin/js-de.yml | 4 +- modules/costs/config/locales/crowdin/de.yml | 10 +- .../costs/config/locales/crowdin/js-de.yml | 2 +- .../documents/config/locales/crowdin/de.yml | 6 +- .../grids/config/locales/crowdin/js-de.yml | 2 +- modules/meeting/config/locales/crowdin/af.yml | 4 +- modules/meeting/config/locales/crowdin/ar.yml | 4 +- modules/meeting/config/locales/crowdin/az.yml | 4 +- modules/meeting/config/locales/crowdin/be.yml | 4 +- modules/meeting/config/locales/crowdin/bg.yml | 4 +- modules/meeting/config/locales/crowdin/ca.yml | 4 +- .../meeting/config/locales/crowdin/ckb-IR.yml | 4 +- modules/meeting/config/locales/crowdin/cs.yml | 4 +- modules/meeting/config/locales/crowdin/da.yml | 4 +- modules/meeting/config/locales/crowdin/de.yml | 4 +- modules/meeting/config/locales/crowdin/el.yml | 4 +- modules/meeting/config/locales/crowdin/eo.yml | 4 +- modules/meeting/config/locales/crowdin/es.yml | 4 +- modules/meeting/config/locales/crowdin/et.yml | 4 +- modules/meeting/config/locales/crowdin/eu.yml | 4 +- modules/meeting/config/locales/crowdin/fa.yml | 4 +- modules/meeting/config/locales/crowdin/fi.yml | 4 +- .../meeting/config/locales/crowdin/fil.yml | 4 +- modules/meeting/config/locales/crowdin/fr.yml | 4 +- modules/meeting/config/locales/crowdin/he.yml | 4 +- modules/meeting/config/locales/crowdin/hi.yml | 4 +- modules/meeting/config/locales/crowdin/hr.yml | 4 +- modules/meeting/config/locales/crowdin/hu.yml | 4 +- modules/meeting/config/locales/crowdin/id.yml | 4 +- modules/meeting/config/locales/crowdin/it.yml | 4 +- modules/meeting/config/locales/crowdin/ja.yml | 4 +- modules/meeting/config/locales/crowdin/ka.yml | 4 +- modules/meeting/config/locales/crowdin/kk.yml | 4 +- modules/meeting/config/locales/crowdin/ko.yml | 4 +- modules/meeting/config/locales/crowdin/lt.yml | 4 +- modules/meeting/config/locales/crowdin/lv.yml | 4 +- modules/meeting/config/locales/crowdin/mn.yml | 4 +- modules/meeting/config/locales/crowdin/ms.yml | 4 +- modules/meeting/config/locales/crowdin/ne.yml | 4 +- modules/meeting/config/locales/crowdin/nl.yml | 4 +- modules/meeting/config/locales/crowdin/no.yml | 4 +- modules/meeting/config/locales/crowdin/pl.yml | 4 +- .../meeting/config/locales/crowdin/pt-BR.yml | 4 +- .../meeting/config/locales/crowdin/pt-PT.yml | 4 +- modules/meeting/config/locales/crowdin/ro.yml | 4 +- modules/meeting/config/locales/crowdin/ru.yml | 28 +- modules/meeting/config/locales/crowdin/rw.yml | 4 +- modules/meeting/config/locales/crowdin/si.yml | 4 +- modules/meeting/config/locales/crowdin/sk.yml | 4 +- modules/meeting/config/locales/crowdin/sl.yml | 4 +- modules/meeting/config/locales/crowdin/sr.yml | 4 +- modules/meeting/config/locales/crowdin/sv.yml | 4 +- modules/meeting/config/locales/crowdin/th.yml | 4 +- modules/meeting/config/locales/crowdin/tr.yml | 4 +- modules/meeting/config/locales/crowdin/uk.yml | 4 +- modules/meeting/config/locales/crowdin/uz.yml | 4 +- modules/meeting/config/locales/crowdin/vi.yml | 4 +- .../meeting/config/locales/crowdin/zh-CN.yml | 4 +- .../meeting/config/locales/crowdin/zh-TW.yml | 4 +- 66 files changed, 500 insertions(+), 500 deletions(-) diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index cf730809e95..8ea2c5688b4 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -83,9 +83,9 @@ de: confirmation: "Sind Sie sicher, dass Sie diesen Enterprise-Edition Support-Token löschen möchten?" create_dialog: title: "Enterprise-Token hinzufügen" - type_token_text: "Your Enterprise token text" + type_token_text: "Ihr Enterprise-Token-Text" token_placeholder: "Enterprise-Token Text hier einfügen" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "Weitere Informationen über die Aktivierung der Enterprise Edition finden Sie in unserer [Dokumentation](docs_url)." add_token: "Enterprise edition Support Token hochladen" replace_token: "Aktuellen Enterprise edition Support Token ersetzen" order: "Enterprise on-premises bestellen" @@ -114,176 +114,176 @@ de: title: "Import" jira: title: "Jira Import" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + description: "Verwenden Sie dieses Tool, um Daten aus Ihrer Jira-Instanz zu importieren. Sie können mehrere Jira-Hosts konfigurieren und auswählen, was bei jedem Importlauf importiert werden soll." errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "Jira-Hosts mit laufenden Importen können nicht gelöscht werden" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + 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." configuration: - title: "Jira configuration" - new: "New configuration" + title: "Jira-Konfiguration" + new: "Neue Konfiguration" banner: - title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + title: "Begrenzter Import" + description: "Dieses Importtool befindet sich derzeit in der Betaphase und kann nur grundlegende Daten importieren: Projekte, Probleme (Name, Titel, Beschreibung), Benutzer (Name, E-Mail, Projektmitgliedschaft), Status und Typen. Es kann keine benutzerdefinierten Workflows, benutzerdefinierten Felder, Anhänge, Problembeziehungen oder Berechtigungen importieren. Wir unterstützen derzeit nur die Jira Server/Data Center Versionen 10.x und 11.x. Cloud-Instanzen werden derzeit nicht unterstützt." form: fields: name: "Name" - url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + url: "Jira Server/Datencenter URL" + personal_access_token: "Persönlicher Zugangs-Token" + button_add: "Konfiguration hinzufügen" + button_save: "Konfiguration speichern" + button_test: "Konfiguration testen" + button_delete_token: "Token löschen" + delete_token_confirm: "Sind Sie sicher, dass Sie das Token löschen möchten? Dies wird die Verbindung zu Jira deaktivieren." + label_testing: "Teste Konfiguration..." + token_deleted: "Token wurde erfolgreich gelöscht." test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + success: "Erfolgreich verbunden mit %{server} (Version %{version})" + failed: "Verbindung fehlgeschlagen: Serverinformationen können nicht abgerufen werden" + error: "Beim Testen der Verbindung ist ein unerwarteter Fehler aufgetreten" + connection_error: "Verbindungsfehler: %{message}" + parse_error: "Die Antwort des Servers konnte nicht gelesen werden. Der Server ist möglicherweise keine gültige Jira-Instanz." + api_error: "Jira API hat den Fehlerstatus %{status} zurückgegeben. Bitte überprüfen Sie die URL Ihrer Jira-Instanz und Ihr API-Token." + token_error: "Ungültiger API-Token. Bitte überprüfen Sie Ihre Zugangsdaten in der Konfiguration." + missing_credentials: "Bitte geben Sie sowohl URL als auch Persönliches Zugangs-Token an, um die Verbindung zu testen" + invalid_url: "Bitte eine gültige URL eingeben" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "Verbindung zum Jira-Server fehlgeschlagen: %{message}" + connection_timeout: "Die Verbindung zum Jira-Server wurde unterbrochen: %{message}" + parse_error: "Die Jira API-Antwort konnte nicht gelesen werden: %{message}" + api_error: "Jira API hat den Fehlerstatus %{status} zurückgegeben" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" - label_ago: "%{amount} ago" + projects: "Projekte" + last_change: "Letzte Änderung" + added: "Hinzugefügt" + label_ago: "Vor %{amount}" run: - title: "Import run" - history: "History" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + title: "Importlauf" + history: "Historie" + remove_error: "Ein Jira-Import kann nicht entfernt werden während er läuft" + import_blocked_error: "Ein anderer Jira-Importlauf wird gerade durchgeführt oder wartet auf die Überprüfung. Bitte schließen Sie ihn ab oder machen Sie ihn rückgängig, bevor Sie einen neuen Import starten." blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "Noch keine Importläufe eingerichtet" + description: "Erstellen Sie einen Importlauf, um den Import von Informationen aus dieser Jira-Instanz zu starten" index: - description: "You can import different sets of data with each import run. It is possible to undo an import run immediately after but not afterwards." - button_import_run: "Import run" - button_edit_configuration: "Edit configuration" + description: "Sie können bei jedem Importlauf verschiedene Datensätze importieren. Es ist möglich, einen Importlauf unmittelbar danach rückgängig zu machen, aber nicht nach dem Finalisieren." + button_import_run: "Importlauf" + button_edit_configuration: "Konfiguration bearbeiten" status: initial: "Start" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" - configuring: "Select scope" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" - imported: "Review mode" - reverting: "Reverting" - revert_error: "Error during revert" - reverted: "Reverted" - completed: "Completed" + instance_meta_fetching: "Abrufen von Metadaten" + instance_meta_error: "Fehler beim Abrufen von Metadaten" + instance_meta_done: "Metadaten abgerufen" + configuring: "Umfang auswählen" + projects_meta_fetching: "Abrufen von Projektdaten" + projects_meta_error: "Fehler beim Abrufen von Projektdaten" + projects_meta_done: "Daten erfasst" + importing: "In Durchführung" + import_error: "Fehler beim Importieren" + imported: "Überprüfungsmodus" + reverting: "Rückgängig machen" + revert_error: "Fehler beim Revertieren" + reverted: "Rückgängig gemacht" + completed: "Abgeschlossen" wizard: - button_retry: "Retry" + button_retry: "Erneut versuchen" parts: projects: - one: "1 project" - other: "%{count} projects" + one: "1 Projekt" + other: "%{count} Projekte" issues: - one: "1 issue" - other: "%{count} issues" + one: "1 Ticket" + other: "%{count} Tickets" work_packages: - one: "1 work package" - other: "%{count} work packages" + one: "1 Arbeitspaket" + other: "%{count} Arbeitspakete" types: - one: "1 type" - other: "%{count} types" + one: "1 Typ" + other: "%{count} Typen" statuses: - one: "1 status" - other: "%{count} statuses" + one: "1 Status" + other: "%{count} Statusse" users: - one: "1 user" - other: "%{count} users" + one: "1 Konto" + other: "%{count} Konten" groups: fetch: - title: "Get base data" + title: "Basisdaten abrufen" groups_and_users: - title: "Groups and Users" + title: "Gruppen und Benutzer" configuration: - title: "Configure import" + title: "Import konfigurieren" confirming: - title: "Confirm and import" + title: "Bestätigen und importieren" review: - title: "Review import" + title: "Import überprüfen" sections: fetch_data: - title: "Fetch instance meta data" - caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" - label_progress: "Fetching data from Jira..." + title: "Metadaten der Instanz abrufen" + caption_done: "Abgeschlossen" + description: "Klicken Sie auf die Schaltfläche unten, um den Host abzufragen und zu sehen, welche Daten für den Import zur Verfügung stehen." + button_fetch: "Verfügbare Daten vom Host prüfen" + label_progress: "Abrufen von Daten aus Jira..." groups_and_users: - title: "Groups and Users" + title: "Gruppen und Benutzer" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." - label_available_data: "Available data" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" - button_continue: "Continue" - 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..." - label_importing: "Currently importing" + title: "Umfang des Imports" + caption: "Wählen Sie, was Sie in OpenProject importieren möchten" + caption_done: "Abgeschlossen" + label_info: "Bitte beachten Sie, dass dieses Import-Tool in der Beta ist und nicht alle Arten von Daten importieren kann. Hier ist eine Zusammenfassung dessen, was die Host-URL für den Import bietet und was dieses Tool gerade importieren kann." + description: "Wählen Sie aus, welche Daten Sie aus den verfügbaren Daten vom Host importieren möchten." + label_available_data: "Verfügbare Daten" + label_not_available_data: "Nicht verfügbar für den Import" + button_select_projects: "Projekte zum Importieren auswählen" + button_continue: "Fortfahren" + label_import: "Wählen Sie die Projekte aus, die Sie importieren möchten." + button_select: "Projekte auswählen" + label_selected_data: "Ausgewählte Daten für den Import" + label_progress: "Abrufen von Daten aus Jira..." + label_importing: "Wird gerade importiert" elements: - relations: "Relations between issues" - workflows: "Custom workflows" - users: "Users" + relations: "Beziehungen zwischen Tickets" + workflows: "Selbstdefinierte Workflows" + users: "Accounts" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "Berechtigungen, Rollen" confirm_import: - title: "Import data" - caption: "Review your import settings and start the import" - caption_done: "Completed" - label_available_data: "Available data to import" - 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" + title: "Daten importieren" + caption: "Überprüfen Sie Ihre Importeinstellungen und starten Sie den Import" + caption_done: "Abgeschlossen" + label_available_data: "Verfügbare Daten zum Importieren" + button_start: "Import starten" + description: "Sie sind dabei, einen Import mit den folgenden Einstellungen zu starten." + label_progress: "Import läuft..." + label_import_data: "Wird gerade importiert" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." - label_results: "Imported" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: "The imported data is currently in review mode. Click \"Finalize import\" to make the import permanent or \"Revert import\" to undo all changes made in this import run." - label_finalizing_progress: "Finalizing import..." - label_finalized: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + title: "Importlauf-Ergebnisse" + caption: "Importlauf überprüfen oder Import rückgängig machen" + info: "Import erfolgreich ausgeführt." + label_results: "Importiert" + label_revert: "Import rückgängig machen" + button_revert: "Import rückgängig machen" + button_done: "Import abschließen" + preview_description: "Die importierten Daten befinden sich derzeit im Überprüfungsmodus. Klicken Sie auf \"Import abschließen\", um den Import dauerhaft zu machen, oder auf \"Import rückgängig machen\", um alle in diesem Importlauf vorgenommenen Änderungen rückgängig zu machen." + label_finalizing_progress: "Import wird abgeschlossen..." + label_finalized: "Import abgeschlossen." + label_revert_progress: "Import wird rückgängig gemacht..." + label_reverted: "Import rückgängig gemacht." select_dialog: - filter_projects: "Filter by text" + filter_projects: "Nach Text filtern" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." - confirm: "I understand that this reversion will delete data permanently" + title: "Diesen Import dauerhaft rückgängig machen?" + description: "Dadurch werden alle importierten Objekte (einschließlich ganzer Projekte) gelöscht, auch wenn es nach dem Import in OpenProject Nutzeraktivitäten in diesen Projekten gab." + confirm: "Mir ist bewusst, dass diese Rückgängigmachung die Daten dauerhaft löscht" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + title: "Diesen Import abschließen?" + description: "Sobald dieser Import abgeschlossen ist, kann er nicht mehr rückgängig gemacht werden. Alle importierten Daten werden dann dauerhaft importiert." + confirm: "Ich verstehe, dass diese Aktion nicht rückgängig gemacht werden kann" + confirm_button: "Verstanden" select_projects: - title: "Select projects" + title: "Projekte auswählen" mcp_configurations: index: description: "Das Model Context Protocol ermöglicht es KI-Agenten, ihren Nutzern Tools und Ressourcen bereitzustellen, die diese OpenProject-Instanz zur Verfügung stellt." @@ -298,16 +298,16 @@ de: server_form: description_caption: "Wie der MCP-Server gegenüber anderen Anwendungen beschrieben wird, die sich damit verbinden." title_caption: "Ein kurzer Titel, der Anwendungen angezeigt wird, die sich mit dem MCP-Server verbinden." - tool_response_format: "Tool response format" - tool_response_format_content_only_label: "Content only" + tool_response_format: "Antwortformat des Tools" + tool_response_format_content_only_label: "Nur Inhalt" tool_response_format_content_only_caption: > - Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. - tool_response_format_full_label: "Full" + Wählen Sie diese Option, wenn MCP-Clients, die sich mit dieser Instanz verbinden, keine strukturierten Inhalte unterstützen. Die Antworten des Tools enthalten dann nur den reinen Textinhalt und lassen die strukturierte Inhalte aus. + tool_response_format_full_label: "Vollständig" tool_response_format_full_caption: > - The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance. - tool_response_format_structured_only_label: "Structured content only" + Die kompatibelste Option. Die Antworten des Tools enthalten sowohl reguläre als auch strukturierte Inhalte, so dass MCP-Clients wählen können, welches Format sie lesen möchten. Dies kann die Anzahl der Token erhöhen, die das Sprachmodell verarbeiten muss, was die Kosten erhöhen und die Leistung verringern kann. + tool_response_format_structured_only_label: "Nur strukturierte Inhalte" tool_response_format_structured_only_caption: > - Choose this if you are certain that MCP clients connecting to this instance support structured content. Tool responses will only include structured content and leave out its text representation. + Wählen Sie diese Option, wenn Sie sicher sind, dass MCP-Clients, die sich mit dieser Instanz verbinden, strukturierte Inhalte unterstützen. Die Antworten des Tools enthalten dann nur strukturierte Inhalte und nicht deren Textdarstellung. update: failure: "Die MCP-Konfiguration konnte nicht aktualisiert werden." success: "Die MCP-Konfiguration wurde erfolgreich aktualisiert." @@ -543,7 +543,7 @@ de: contained_in_type: "In Typ enthalten" confirm_destroy_option: "Löschen eines Werts entfernt alle bereits gesetzten Werte (z.B. bei Arbeitspaketen). Sind Sie sicher, dass Sie den Wert löschen möchten?" reorder_alphabetical: "Alphabetisch umsortieren" - reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?" + reorder_confirmation: "Warnung: Die aktuelle Reihenfolge der verfügbaren Werte sowie alle nicht gespeicherten Werte gehen verloren. Sind Sie sicher, dass Sie fortfahren möchten?" placeholder_version_select: "Zunächst muss ein Arbeitspaket oder ein Projekt ausgewählt werden" calculated_field_not_editable: "Nicht editierbares Attribut. Dieser Wert wird automatisch berechnet." no_role_assigment: "Keine Rollenzuweisung" @@ -571,13 +571,13 @@ de: formula: project: "Fügen Sie numerische Werte hinzu oder geben Sie / ein, um nach einem Attribut oder einem mathematischen Operator zu suchen." regexp: - all: "eg. ^[A-Z0-9]+$" - project: "eg. ^[A-Z0-9]+$" + all: "z. B. ^[A-Z0-9]+$" + project: "z. B. ^[A-Z0-9]+$" min_max: - all: "0 means no restriction" - project: "0 means no restriction" + all: "0 heißt keine Beschränkung" + project: "0 heißt keine Beschränkung" has_comment: - project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." + project: "Ermöglicht es dem Benutzer, zusätzlich einen Kommentar zum Projektattribut hinzuzufügen, wenn der Wert in der Projektübersicht ausgewählt wird." tab: no_results_title_text: Zur Zeit existieren keine benutzerdefinierten Felder. no_results_content_text: Neues benutzerdefiniertes Feld anlegen @@ -1349,7 +1349,7 @@ de: activerecord: attributes: jira_import: - projects: "Projects" + projects: "Projekte" announcements: show_until: "Anzeigen bis" attachment: @@ -1395,7 +1395,7 @@ de: regexp: "Regulärer Ausdruck" searchable: "Durchsuchbar" admin_only: "Nur für Administratoren" - has_comment: "Add a comment text field" + has_comment: "Ein Kommentarfeld hinzufügen" custom_value: value: "Wert" design_color: @@ -1724,7 +1724,7 @@ de: not_available: "ist aufgrund einer Systemkonfiguration nicht verfügbar." not_deletable: "kann nicht entfernt werden." not_current_user: "ist nicht der aktuelle Benutzer." - only_one_active_sprint_allowed: "only one active sprint is allowed per project." + only_one_active_sprint_allowed: "pro Projekt ist nur ein aktiver Sprint erlaubt." not_found: "nicht gefunden." not_a_date: "ist kein gültiges Datum." not_a_datetime: "ist kein gültiges Datum." @@ -1832,7 +1832,7 @@ de: meeting: error_conflict: "Das Speichern ist nicht möglich, da die Besprechung in der Zwischenzeit von einem anderen Benutzer aktualisiert wurde. Bitte laden Sie die Seite neu." message: - cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." + cannot_move_message_to_forum_of_different_project: "Eine Nachricht kann nicht in ein Forum eines anderen Projekts verschoben werden." notifications: at_least_one_channel: "Mindestens ein Kanal zum Senden von Benachrichtigungen muss angegeben werden." attributes: @@ -2089,7 +2089,7 @@ de: in_use: "Dieser Token-Name ist bereits in Verwendung, bitte wählen Sie einen anderen" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "Bitte geben Sie ein gültiges Protokoll an (http oder https)" template: body: "Bitte überprüfen Sie die folgenden Felder:" header: @@ -2108,7 +2108,7 @@ de: comment: "Kommentar" custom_action: "Benutzerdefinierte Aktion" custom_field: "Benutzerdefiniertes Feld" - customized: "Customized" + customized: "Benutzerdefiniert" "doorkeeper/application": "OAuth-Anwendung" enterprise_token: one: "Enterprise-Token" @@ -3087,7 +3087,7 @@ de: caused_changes: dates_changed: "Datum geändert" default_attribute_written: "Nur-Lese-Attribute wurde geschrieben" - import: "Imported" + import: "Importiert" progress_mode_changed_to_status_based: "Fortschrittsberechnung aktualisiert" status_changed: "Status '%{status_name}'" system_update: "OpenProject-Systemaktualisierung:" @@ -3096,14 +3096,14 @@ de: total_percent_complete_mode_changed_to_simple_average: "Die Berechnung der Gesamtwerte für % abgeschlossen basiert jetzt auf dem einfachen Durchschnitt der % abgeschlossen-Werte." cause_descriptions: import: - header: "changes by %{author}" - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" + header: "Änderungen durch %{author}" + field_changed: "%{field} geändert von %{old_value} zu %{new_value}" + field_set: "%{field} auf %{value} gesetzt" + field_removed: "%{field} entfernt" field_updated: "%{field}" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" - set_with_diff: "%{field} set (%{link})" + deleted_with_diff: "%{field} gelöscht (%{link})" + changed_with_diff: "%{field} geändert (%{link})" + set_with_diff: "%{field} gesetzt (%{link})" work_package_predecessor_changed_times: durch Änderungen am Vorgänger %{link} work_package_parent_changed_times: durch Änderungen am übergeordneten Arbeitspaket %{link} work_package_children_changed_times: durch Änderungen an Unteraufgabe %{link} @@ -3190,7 +3190,7 @@ de: active_tokens: "Aktive Token" blank_description: "Für Sie ist kein Zugriff auf Anwendungen von Drittanbietern konfiguriert und aktiv." blank_title: "Kein OAuth-Anwendungs-Token" - last_refreshed_at: "Last refreshed at" + last_refreshed_at: "Zuletzt aktualisiert um" title: "OAuth" table_title: "OAuth-Anwendungs-Tokens" text_hint: "OAuth-Tokens erlauben es Drittanbieter-Anwendungen, sich mit dieser OpenProject Instanz zu verbinden." @@ -3430,7 +3430,7 @@ de: label_duplicates: "Duplikat von" label_edit: "Bearbeiten" label_edit_x: "Bearbeiten: %{x}" - label_view_x: "View: %{x}" + label_view_x: "Ansicht: %{x}" label_enable_multi_select: "Mehrfachauswahl umschalten" label_enabled_project_custom_fields: "Aktivierte benutzerdefinierte Felder" label_enabled_project_modules: "Aktivierte Module" @@ -3558,7 +3558,7 @@ de: label_lock_user: "Benutzer sperren" label_logged_as: "Angemeldet als" label_login: "Anmelden" - label_custom_comment: "%{name} comment" + label_custom_comment: "%{name} Kommentar" label_custom_logo: "Benutzerdefiniertes Logo Desktop" label_custom_logo_mobile: "Benutzerdefiniertes Logo Mobilgerät" label_custom_export_logo: "Selbstdefiniertes Logo für PDF-Export" @@ -4348,7 +4348,7 @@ de: permission_edit_project_query: "Projektabfrage bearbeiten" placeholders: default: "-" - templated_hint: Automatically generated through type %{type} + templated_hint: Automatisch durch den Typ %{type} erzeugt portfolio: count: zero: "Keine Portfolios" @@ -4582,7 +4582,7 @@ de: setting_activity_days_default: "Anzahl Tage pro Seite der Projekt-Aktivität" setting_api_tokens_enabled: "API-Tokens aktivieren" setting_api_tokens_enabled_caption: > - Decide whether users can create personal API tokens in their account settings. These tokens can be used to access the different APIs of OpenProject, such as APIv3 and MCP. + Entscheiden Sie, ob Benutzer in ihren Kontoeinstellungen persönliche API-Tokens erstellen können. Diese Token können für den Zugriff auf die verschiedenen APIs von OpenProject, wie APIv3 und MCP, verwendet werden. setting_app_subtitle: "Applikations-Untertitel" setting_app_title: "Applikations-Titel" setting_attachment_max_size: "Max. Dateigröße" @@ -5123,7 +5123,7 @@ de: reset_failed_logins: "Fehlgeschlagene Logins zurücksetzen" status_user_and_brute_force: "%{user} und %{brute_force}" status_change: "Status geändert" - text_change_disabled_for_provider_login: "The name and email is set by your login provider and can thus not be changed." + text_change_disabled_for_provider_login: "Der Login-Anbieter legt den Namen und die E-Mail-Adresse fest. Daher können sie nicht geändert werden." unlock: "Entsperren" unlock_and_reset_failed_logins: "Entsperren und fehlgeschlagene Logins zurücksetzen" error_cannot_delete_user: "Benutzer kann nicht gelöscht werden" diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 58b934872d6..d4c7ad14558 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -83,9 +83,9 @@ fr: confirmation: "Voulez-vous vraiment supprimer le jeton d'assistance de cette édition Enterprise ?" create_dialog: title: "Ajouter un jeton Enterprise" - type_token_text: "Your Enterprise token text" + type_token_text: "Texte de votre jeton d'entreprise" token_placeholder: "Collez votre jeton d'assistance pour l'édition Enterprise ici" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "Pour en savoir plus sur l'activation de l'édition Enterprise, consultez notre [documentation](docs_url)." add_token: "Charger un jeton de support pour la version Entreprise" replace_token: "Remplacer votre licence actuelle" order: "Commander l'édition Entreprise auto-hébergée" @@ -111,179 +111,179 @@ fr: text: "Les actions individuelles d'un utilisateur (par ex. mis à jour un lot de travaux deux fois) sont agrégés en une seule action si leur différence d'âge est inférieure à la période spécifiée. Elles seront affichées en une seule action dans l'application. Cela retardera également les notifications du même temps réduisant donc le nombre d'e-mails envoyés et affectera également le délai %{webhook_link}." link: "webhook" import: - title: "Import" + title: "Importation" jira: - title: "Jira Import" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + title: "Importation de Jira" + description: "Utilisez cet outil pour importer des données depuis votre instance Jira. Vous pouvez configurer plusieurs hôtes Jira et choisir les données à importer à chaque cycle d'importation." errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "Impossible de supprimer un hôte Jira avec des importations existantes" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + title: "Aucun hôte Jira n'est encore configuré" + description: "Configurez un hôte Jira pour commencer à importer des éléments de Jira vers cette instance d'OpenProject." configuration: - title: "Jira configuration" - new: "New configuration" + title: "Configuration de Jira" + new: "Nouvelle configuration" banner: - title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + title: "Importation limitée" + description: "Cet outil d'importation est actuellement en version bêta et ne peut importer que des données de base : projets, problèmes (nom, titre, description), utilisateurs (nom, courriel, appartenance à un projet), statuts et types. Il ne peut pas importer les flux de travail personnalisés, les champs personnalisés, les pièces jointes, les relations entre les problèmes ou les autorisations. Nous ne prenons actuellement en charge que les versions 10.x et 11.x de Jira Server/Data Center. Les instances en nuage ne sont pas prises en charge pour le moment." form: fields: - name: "Name" - url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + name: "Nom" + url: "URL du serveur/centre de données Jira" + personal_access_token: "Jeton d'accès personnel" + button_add: "Ajouter la configuration" + button_save: "Enregistrer la configuration" + button_test: "Tester la configuration" + button_delete_token: "Supprimer le jeton d'accès" + delete_token_confirm: "Êtes-vous sûr de vouloir supprimer le jeton ? Cela désactivera la connexion à Jira." + label_testing: "Test de la configuration..." + token_deleted: "Le jeton a été supprimé avec succès." test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + success: "Connexion réussie à %{server} (version %{version})" + failed: "Échec de la connexion : Impossible de récupérer les informations sur le serveur" + error: "Une erreur inattendue s'est produite lors du test de la connexion" + connection_error: "Erreur de connexion : %{message}" + parse_error: "Impossible d'analyser la réponse du serveur Jira. Le serveur n'est peut-être pas une instance Jira valide." + api_error: "L'API Jira a renvoyé le statut d'erreur %{status}. Veuillez vérifier l'URL de votre instance Jira et le jeton API." + token_error: "Jeton API invalide. Veuillez vérifier vos informations d'identification dans la configuration." + missing_credentials: "Veuillez fournir l'URL et le jeton d'accès personnel pour tester la connexion" + invalid_url: "Veuillez fournir une URL valide" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "Échec de la connexion au serveur Jira : %{message}" + connection_timeout: "La connexion au serveur Jira a expiré : %{message}" + parse_error: "Échec de l'analyse de la réponse de l'API Jira : %{message}" + api_error: "L'API Jira a renvoyé le statut d'erreur %{status}" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" - label_ago: "%{amount} ago" + projects: "Projets" + last_change: "Dernière modification" + added: "Ajouté" + label_ago: "%{amount} il y a" run: - title: "Import run" - history: "History" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + title: "Importation" + history: "Historique" + remove_error: "Une importation Jira ne peut pas être supprimée lorsqu'elle est en cours d'exécution" + import_blocked_error: "Une autre importation Jira est actuellement en cours ou en attente de révision. Veuillez la terminer ou la corriger avant de commencer une nouvelle importation." blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "Aucun cycle d'importation n'a encore été mis en place" + description: "Créez une exécution d'importation pour commencer à importer des informations à partir de cette instance Jira" index: - description: "You can import different sets of data with each import run. It is possible to undo an import run immediately after but not afterwards." - button_import_run: "Import run" - button_edit_configuration: "Edit configuration" + description: "Vous pouvez importer différents ensembles de données à chaque cycle d'importation. Il est possible d'annuler une importation immédiatement après, mais pas après." + button_import_run: "Importation" + button_edit_configuration: "Editer la configuration" status: - initial: "Start" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" - configuring: "Select scope" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" - imported: "Review mode" - reverting: "Reverting" - revert_error: "Error during revert" - reverted: "Reverted" - completed: "Completed" + initial: "Début" + instance_meta_fetching: "Récupération des métadonnées" + instance_meta_error: "Erreur dans l'extraction des métadonnées" + instance_meta_done: "Métadonnées recherchées" + configuring: "Sélectionnez le champ d'application" + projects_meta_fetching: "Récupérer les données d'un projet" + projects_meta_error: "Erreur dans l'extraction des données du projet" + projects_meta_done: "Données recueillies" + importing: "En cours" + import_error: "Erreur lors de l'importation" + imported: "Mode révision" + reverting: "Retour à l'état initial" + revert_error: "Erreur lors de l'inversion" + reverted: "Restauré" + completed: "Terminé" wizard: - button_retry: "Retry" + button_retry: "Réessayer" parts: projects: - one: "1 project" - other: "%{count} projects" + one: "1 projet" + other: "%{count} projets" issues: - one: "1 issue" - other: "%{count} issues" + one: "1 problème" + other: "%{count} problèmes" work_packages: - one: "1 work package" - other: "%{count} work packages" + one: "1 lot de travaux" + other: "%{count} lots de travaux" types: one: "1 type" other: "%{count} types" statuses: - one: "1 status" - other: "%{count} statuses" + one: "1 statut" + other: "%{count} statuts" users: - one: "1 user" - other: "%{count} users" + one: "1 utilisateur" + other: "%{count} utilisateurs" groups: fetch: - title: "Get base data" + title: "Obtenir les données de base" groups_and_users: - title: "Groups and Users" + title: "Groupes et utilisateurs" configuration: - title: "Configure import" + title: "Configurer l'importation" confirming: - title: "Confirm and import" + title: "Confirmer et importer" review: - title: "Review import" + title: "Examiner l'importation" sections: fetch_data: - title: "Fetch instance meta data" - caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" - label_progress: "Fetching data from Jira..." + title: "Récupérer les métadonnées de l'instance" + caption_done: "Terminé" + description: "Cliquez sur le bouton ci-dessous pour interroger l'hôte et voir quelles données sont disponibles pour l'importation." + button_fetch: "Vérifier les données disponibles auprès de l'hôte" + label_progress: "Récupérer les données de Jira..." groups_and_users: - title: "Groups and Users" + title: "Groupes et utilisateurs" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." - label_available_data: "Available data" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" - button_continue: "Continue" - 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..." - label_importing: "Currently importing" + title: "Champ d'application de l'importation" + caption: "Choisissez ce que vous voulez importer dans OpenProject" + caption_done: "Terminé" + label_info: "Veuillez noter que cet outil d'importation est en version bêta et qu'il ne peut pas importer tous les types de données. Voici un résumé de ce que l'URL de l'hôte offre à l'importation et de ce que cet outil est capable d'importer pour le moment." + description: "Sélectionnez les données que vous souhaitez importer parmi les données disponibles extraites de l'hôte." + label_available_data: "Données disponibles" + label_not_available_data: "Non disponible à l'importation" + button_select_projects: "Sélectionnez les projets à importer" + button_continue: "Continuer" + label_import: "Sélectionnez les projets que vous souhaitez importer." + button_select: "Sélectionner des projets" + label_selected_data: "Données sélectionnées pour l'importation" + label_progress: "Récupérer les données de Jira..." + label_importing: "Importation en cours" elements: - relations: "Relations between issues" - workflows: "Custom workflows" - users: "Users" + relations: "Relations entre les questions" + workflows: "Flux de travail personnalisés" + users: "Utilisateurs" sprints: "Sprints" - schemes: "Schemas" - permissions: "Permissions, roles" + schemes: "Schémas" + permissions: "Permissions, rôles" confirm_import: - title: "Import data" - caption: "Review your import settings and start the import" - caption_done: "Completed" - label_available_data: "Available data to import" - 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" + title: "Importer les données" + caption: "Vérifiez vos paramètres d'importation et démarrez l'importation" + caption_done: "Terminé" + label_available_data: "Données disponibles à importer" + button_start: "Lancer l'importation" + description: "Vous êtes sur le point de lancer un cycle d'importation avec les paramètres suivants." + label_progress: "Import en cours..." + label_import_data: "Importation en cours" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." - label_results: "Imported" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: "The imported data is currently in review mode. Click \"Finalize import\" to make the import permanent or \"Revert import\" to undo all changes made in this import run." - label_finalizing_progress: "Finalizing import..." - label_finalized: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + title: "Importer les résultats de l'exécution" + caption: "Vérifier l'exécution de l'importation ou annuler l'importation" + info: "L'importation a été effectuée avec succès." + label_results: "Importé" + label_revert: "Annuler l'importation" + button_revert: "Annuler l'importation" + button_done: "Finaliser l'importation" + preview_description: "Les données importées sont actuellement en mode révision. Cliquez sur \"Finaliser l'importation\" pour rendre l'importation permanente ou sur \"Revenir à l'importation\" pour annuler toutes les modifications apportées lors de cette importation." + label_finalizing_progress: "Finalisation de l'importation..." + label_finalized: "Importation finalisée." + label_revert_progress: "Importation réversible..." + label_reverted: "Importation annulée." select_dialog: - filter_projects: "Filter by text" + filter_projects: "Filtrer par texte" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." - confirm: "I understand that this reversion will delete data permanently" + title: "Réinitialiser définitivement cette importation ?" + description: "Cela supprimera tous les objets importés (y compris des projets entiers), même s'il y a eu une activité de l'utilisateur dans ces projets après l'importation dans OpenProject." + confirm: "Je comprends que cette réversion effacera les données de façon permanente" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + title: "Finaliser cette importation ?" + description: "Une fois finalisée, cette importation ne peut plus être annulée. Toutes les données importées le seront définitivement." + confirm: "Je comprends que cette action ne peut être annulée" + confirm_button: "Compris" select_projects: - title: "Select projects" + title: "Sélectionner des projets" mcp_configurations: index: description: "Le protocole de contexte de modèle permet aux agents d'intelligence artificielle de fournir à leurs utilisateurs les outils et les ressources exposés par cette instance d'OpenProject." @@ -580,7 +580,7 @@ fr: all: "0 signifie aucune restriction" project: "0 pour aucune restriction" has_comment: - project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." + project: "Permet à l'utilisateur d'ajouter un commentaire relatif à l'attribut du projet lorsqu'il sélectionne la valeur dans la vue d'ensemble du projet." tab: no_results_title_text: Il n'y a actuellement aucun champ personnalisé. no_results_content_text: Créer un nouveau champ personnalisé @@ -1355,7 +1355,7 @@ fr: activerecord: attributes: jira_import: - projects: "Projects" + projects: "Projets" announcements: show_until: "Afficher jusqu'à" attachment: @@ -1401,7 +1401,7 @@ fr: regexp: "Expression régulière" searchable: "Recherchable" admin_only: "Administrateurs uniquement" - has_comment: "Add a comment text field" + has_comment: "Ajouter un champ de texte pour les commentaires" custom_value: value: "Valeur" design_color: @@ -2095,7 +2095,7 @@ fr: in_use: "Ce nom de jeton est déjà utilisé. Veuillez en choisir un autre" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "Veuillez indiquer un protocole valide (http ou https)" template: body: "Veuillez vérifier les champs suivants :" header: @@ -2114,7 +2114,7 @@ fr: comment: "Commentaire" custom_action: "Action personnalisée" custom_field: "Champ personnalisé" - customized: "Customized" + customized: "Personnalisé" "doorkeeper/application": "Application OAuth" enterprise_token: one: "Jeton Enterprise" @@ -2672,7 +2672,7 @@ fr: gantt_pdf_export: Exportation PDF de diagramme de Gantt ldap_groups: Synchronisation des utilisateurs LDAP et des groupes mcp_server: Serveur MCP - meeting_templates: Reusable meeting templates + meeting_templates: Modèles de réunion réutilisables nextcloud_sso: Authentification unique pour le stockage Nextcloud one_drive_sharepoint_file_storage: Stockage de fichiers OneDrive/SharePoint placeholder_users: Utilisateurs fictifs @@ -2752,7 +2752,7 @@ fr: mcp_server: description: "Intégrez des agents d'intelligence artificielle à votre instance OpenProject grâce à MCP." meeting_templates: - description: "Define meeting templates with a set agenda structure and save time by reusing them when creating new meetings." + description: "Définissez des modèles de réunion avec une structure d'ordre du jour définie et gagnez du temps en les réutilisant lors de la création de nouvelles réunions." nextcloud_sso: title: "Authentification unique pour le stockage Nextcloud" description: "Activez l'authentification transparente et sécurisée pour votre stockage Nextcloud avec l'authentification unique. Simplifiez la gestion des accès et augmentez la commodité des utilisateurs." @@ -3093,7 +3093,7 @@ fr: caused_changes: dates_changed: "Dates modifiées" default_attribute_written: "Attributs en lecture seule écrits" - import: "Imported" + import: "Importé" progress_mode_changed_to_status_based: "Mise à jour du calcul de la progression" status_changed: "Statut « %{status_name} »" system_update: "Mise à jour du système OpenProject :" @@ -3102,13 +3102,13 @@ fr: total_percent_complete_mode_changed_to_simple_average: "Le calcul des totaux de % d'achèvement est désormais basé sur une simple moyenne des seules valeurs de % d'achèvement." cause_descriptions: import: - header: "changes by %{author}" - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" + header: "changements par %{author}" + field_changed: "%{field} a changé de %{old_value} à %{new_value}" + field_set: "%{field} sur %{value}" + field_removed: "%{field} supprimée" field_updated: "%{field}" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" + deleted_with_diff: "%{field} supprimé (%{link})" + changed_with_diff: "%{field} modifié (%{link})" set_with_diff: "%{field} set (%{link})" work_package_predecessor_changed_times: par changement vers le prédécesseur %{link} work_package_parent_changed_times: par changement vers le parent %{link} @@ -3196,7 +3196,7 @@ fr: active_tokens: "Jetons actifs" blank_description: "Aucun accès à une application tierce n'est configuré et actif pour vous." blank_title: "Pas de jeton d'application OAuth" - last_refreshed_at: "Last refreshed at" + last_refreshed_at: "Dernière mise à jour le" title: "OAuth" table_title: "Jetons d'application OAuth" text_hint: "Les jetons d'application OAuth permettent aux applications tierces de se connecter à cette instance d'OpenProject." @@ -3436,7 +3436,7 @@ fr: label_duplicates: "Doublons" label_edit: "Éditer" label_edit_x: "Modifier : %{x}" - label_view_x: "View: %{x}" + label_view_x: "Voir : %{x}" label_enable_multi_select: "Basculer multisélection" label_enabled_project_custom_fields: "Champs personnalisés activés" label_enabled_project_modules: "Modules activés" @@ -3541,7 +3541,7 @@ fr: label_external_links: "Liens externes" label_locale: "Langue et région" label_jump_to_a_project: "Aller à un projet…" - label_jira_import: "Jira Import" + label_jira_import: "Importation de Jira" label_keyword_plural: "Mots clés" label_language_based: "Basé sur le langage de l'utilisateur" label_last_activity: "Dernière activité" @@ -3564,7 +3564,7 @@ fr: label_lock_user: "Verrouiller l’utilisateur" label_logged_as: "Connecté en tant que" label_login: "Connexion" - label_custom_comment: "%{name} comment" + label_custom_comment: "%{name} commentaire" label_custom_logo: "Logo personnalisé pour ordinateur" label_custom_logo_mobile: "Logo personnalisé pour mobile" label_custom_export_logo: "Logo d'exportation personnalisé" diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 04b3a03190c..5ec2aee2a93 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -111,9 +111,9 @@ ru: text: "Личные действия пользователя (например, обновление пакета работ дважды) агрегируются в одно действие, если их разница во времени не больше указанной. Они будут отображаться как одно действие внутри приложения. Это также задерживает уведомление на такое же количество времени, уменьшая количество отправляемых писем и также повлияет на %{webhook_link} задержки." link: "вебхук" import: - title: "Import" + title: "Импорт" jira: - title: "Jira Import" + title: "Импорт из Jira" description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." errors: cannot_delete_with_imports: "Cannot delete Jira host with existing imports" diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 3dbbe05ff5f..1cbcd16a6df 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -26,10 +26,10 @@ de: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" + duration: "Dauer" + finish_date: "Endtermin" + goal: "Sprint-Ziel" + name: "Sprint-Name" sharing: "Sharing" sprint: duration: "Sprintdauer" @@ -72,8 +72,8 @@ de: show_burndown_chart: "Burndown-Chart" story: "Story" story_points: - one: "%{count} story point" - other: "%{count} story points" + one: "%{count} Story-Point" + other: "%{count} Story-Points" task: "Aufgabe" task_color: "Farbe für Aufgaben" unassigned: "Nicht zugewiesen" @@ -82,27 +82,27 @@ de: button_update_backlogs: "Backlog-Modul aktualisieren" backlog_component: blankslate_title: "%{name} ist leer" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_description: "Noch keine Arbeitspakete geplant. Ziehen Sie Arbeitspakete hierher, um sie hinzuzufügen." backlog_header_component: label_toggle_backlog: "%{name} ein-/ausklappen" label_story_count: - zero: "No stories in backlog" - one: "%{count} story in backlog" + zero: "Keine Arbeitspakete im Backlog" + one: "%{count} Arbeitspakete im Backlog" other: "%{count} Geschichten im Backlog" backlog_menu_component: - label_actions: "Backlog actions" + label_actions: "Backlog-Aktionen" action_menu: edit_sprint: "Sprint bearbeiten" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + new_story: "Neues Arbeitspaket" + stories_tasks: "Stories/Aufgaben" + task_board: "Aufgaben-Board" + burndown_chart: "Burndown-Diagramm" wiki: "Wiki" properties: "Eigenschaften" story_component: label_drag_story: "%{name} verschieben" story_menu_component: - label_actions: "Story actions" + label_actions: "Weitere Aktionen" backlogs_points_burn_direction: "Burnup/-down Punkte" backlogs_product_backlog: "Produkt-Backlog" backlogs_story: "Story" @@ -111,13 +111,13 @@ de: backlogs_task_type: "Aufgaben-Typ" backlogs_wiki_template: "Vorlage für das Sprint-Wiki" backlogs_empty_title: "Es sind noch keine Versionen definiert" - backlogs_empty_action_text: "To start using backlogs, please create a version first" - backlogs_not_configured_title: "Backlogs not configured" - backlogs_not_configured_description: "Story and task types need to be set before using this module." - backlogs_not_configured_action_text: "Configure Backlogs" + backlogs_empty_action_text: "Um mit der Verwendung von Backlogs zu beginnen, erstellen Sie bitte zunächst eine Version" + backlogs_not_configured_title: "Backlogs nicht konfiguriert" + backlogs_not_configured_description: "Die Story- und Aufgabentypen müssen vor der Verwendung dieses Moduls festgelegt werden." + backlogs_not_configured_action_text: "Backlogs konfigurieren" burndown: - story_points: "Story points" - story_points_ideal: "Story points (ideal)" + story_points: "Story-Points" + story_points_ideal: "Story-Points (ideal)" errors: attributes: task_type: @@ -129,9 +129,9 @@ de: label_points_burn_down: "Runter" label_points_burn_up: "Hoch" label_sprint_impediments: "Sprint Hindernisse" - label_sprint_new: "New sprint" + label_sprint_new: "Neuer Sprint" label_task_board: "Taskboard" - permission_create_sprints: "Create sprints" + permission_create_sprints: "Sprints erstellen" permission_view_master_backlog: "Master Backlog ansehen" permission_view_taskboards: "Taskboard ansehen" permission_select_done_statuses: "Abgeschlossene Status auswählen" @@ -139,8 +139,8 @@ de: project_module_backlogs: "Backlogs" rb_burndown_charts: show: - blankslate_title: "No burndown data available" - blankslate_description: "Set start and end date for the sprint to generate a burndown chart." + 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." remaining_hours: "verbleibender Aufwand" version_settings_display_label: "Spalte im Backlog" version_settings_display_option_left: "links" diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index 509c5c533ab..925f033745c 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -26,10 +26,10 @@ fr: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" + duration: "Durée" + finish_date: "Date de fin" + goal: "Objectif du sprint" + name: "Nom du sprint" sharing: "Partage" sprint: duration: "Durée du sprint" @@ -129,9 +129,9 @@ fr: label_points_burn_down: "Vers le bas" label_points_burn_up: "Vers le haut" label_sprint_impediments: "Obstacles de sprint" - label_sprint_new: "New sprint" + label_sprint_new: "Nouveau sprint" label_task_board: "Tableau des tâches" - permission_create_sprints: "Create sprints" + permission_create_sprints: "Créer des sprints" permission_view_master_backlog: "Afficher le backlog principal" permission_view_taskboards: "Voir les tableaux des tâches" permission_select_done_statuses: "Sélectionner les statuts terminés" diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index 8c71c5d36f9..1a56c6973d1 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -26,10 +26,10 @@ ru: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" + duration: "Продолжительность" + finish_date: "Дата окончания" + goal: "Цель спринта" + name: "Название спринта" sharing: "Совместное использование" sprint: duration: "Продолжительность спринта" @@ -49,7 +49,7 @@ ru: sprint: cannot_end_before_it_starts: "Спринт не может заканчиваться до того, как начнется." models: - sprint: "Sprint" + sprint: "Спринт" attributes: task_type: "Тип задачи" backlogs: @@ -133,9 +133,9 @@ ru: label_points_burn_down: "Вниз" label_points_burn_up: "Вверх" label_sprint_impediments: "Препятствия спринта" - label_sprint_new: "New sprint" + label_sprint_new: "Новый спринт" label_task_board: "Панель задач" - permission_create_sprints: "Create sprints" + permission_create_sprints: "Создание спринтов" permission_view_master_backlog: "Просмотреть главную невыполненную работу" permission_view_taskboards: "Просмотреть панели задач" permission_select_done_statuses: "Выберите завершенные статусы" diff --git a/modules/budgets/config/locales/crowdin/de.yml b/modules/budgets/config/locales/crowdin/de.yml index 8b0e9b060c9..2b85b5a1fde 100644 --- a/modules/budgets/config/locales/crowdin/de.yml +++ b/modules/budgets/config/locales/crowdin/de.yml @@ -59,23 +59,23 @@ de: budgets: widgets: budget_totals: - title: "Budget totals" - remaining_budget: "Remaining budget" - spent_budget: "Spent budget" - total_actual_costs: "Total actual costs" - total_planned_budget: "Total planned budget" + title: "Budgetsumme" + remaining_budget: "Verbleibendes Budget" + spent_budget: "Verwendetes Budget" + total_actual_costs: "Gesamte tatsächlichen Kosten" + total_planned_budget: "Gesamtes geplantes Budget" budget_by_cost_type: - title: "Budget by cost type" + title: "Budget nach Kostenart" blankslate: - heading: "Start project controlling" - description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + heading: "Projektcontrolling starten" + description: "Erhalten Sie einen Überblick über Ihre Budgets und Kosten, um den Status Ihres Projekts effizient zu verfolgen" caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." - other: "Data aggregated from %{count} budgets included in %{portfolios}, %{subprograms} and %{subprojects}." + zero: "Keine Budgetdaten." + one: "Daten aus %{count} Budget, welches in folgenden Arbeitsbereichen enthalten ist: %{portfolios}, %{subprograms} und %{subprojects}." + other: "Daten aus %{count} Budgets, welches in folgenden Arbeitsbereichen enthalten sind: %{portfolios}, %{subprograms} und %{subprojects}." caption_simple: - one: "Data aggregated from %{count} budget." - other: "Data aggregated from %{count} budgets." + one: "Daten aggregiert aus %{count} Budget." + other: "Daten aggregiert aus %{count} Budgets." portfolio: zero: "keine Portfolios" one: "1 Portfolio" @@ -88,7 +88,7 @@ de: zero: "keine Unterprojekte" one: "1 Unterprojekt" other: "%{count} Unterprojekte" - view_details: "View budget details" + view_details: "Budgetdetails anzeigen" events: budget: "Budget bearbeitet" help_click_to_edit: "Hier Klicken zum bearbeiten." diff --git a/modules/budgets/config/locales/crowdin/js-de.yml b/modules/budgets/config/locales/crowdin/js-de.yml index 0995198a6a7..2bf1182d5c3 100644 --- a/modules/budgets/config/locales/crowdin/js-de.yml +++ b/modules/budgets/config/locales/crowdin/js-de.yml @@ -25,8 +25,8 @@ de: widgets: budget_by_cost_type: blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" + title: "Keine Budgetdaten" + description: "Fügen Sie diesem Projekt die geplanten Material- und Arbeitskosten hinzu, um mit der Überwachung des Budgets zu beginnen" work_packages: properties: costObject: "Budget" diff --git a/modules/costs/config/locales/crowdin/de.yml b/modules/costs/config/locales/crowdin/de.yml index 8df441a0bc2..71f97d5c690 100644 --- a/modules/costs/config/locales/crowdin/de.yml +++ b/modules/costs/config/locales/crowdin/de.yml @@ -229,12 +229,12 @@ de: costs: widgets: actual_costs: - title: "Actual costs by month" + title: "Tatsächliche Kosten pro Monat" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" - action: "Log time" - view_details: "View actual costs details" + heading: "Erfassen Sie Ihre Zeit und Kosten" + description: "Verschaffen Sie sich einen Überblick über Ihre Kosten und die erfasste Zeit, um den Fortschritt Ihres Projekts zu überwachen." + action: "Zeit buchen" + view_details: "Details zu den tatsächlichen Kosten anzeigen" ee: features: time_entry_time_restrictions: Genaue Zeiterfassung erforderlich machen diff --git a/modules/costs/config/locales/crowdin/js-de.yml b/modules/costs/config/locales/crowdin/js-de.yml index 8e6e3c4002d..70176ed3b22 100644 --- a/modules/costs/config/locales/crowdin/js-de.yml +++ b/modules/costs/config/locales/crowdin/js-de.yml @@ -26,7 +26,7 @@ de: actual_costs: blankslate: title: "Keine Daten für das aktuelle Jahr" - description: "Log spent time and costs for work packages to start tracking actual costs" + description: "Buchen Sie Zeiten und Kosten um die tatsächlichen Aufwände zu verfolgen" text_are_you_sure: "Sind Sie sicher?" myTimeTracking: noSpecificTime: "Keine bestimmte Zeit" diff --git a/modules/documents/config/locales/crowdin/de.yml b/modules/documents/config/locales/crowdin/de.yml index 0a813bec137..48f7fa69967 100644 --- a/modules/documents/config/locales/crowdin/de.yml +++ b/modules/documents/config/locales/crowdin/de.yml @@ -24,7 +24,7 @@ de: name: "OpenProject Dokumente" description: "Ein OpenProject Plugin, um das Erstellen von Dokumenten in Projekten zu ermöglichen." attributes: - collaborative_editing_hocuspocus_url: "Hocuspocus server URL" + collaborative_editing_hocuspocus_url: "Hokuspokus-Server-URL" activerecord: errors: models: @@ -122,8 +122,8 @@ de: some_unwritable: Einige Werte werden über Umgebungsvariablen konfiguriert und können hier nicht bearbeitet werden. hocuspocus_server_url: label: "Hokuspokus-Server-URL" - caption: "The WebSocket address of a working Hocuspocus server." - invalid_scheme: "Must use a WebSocket protocol (ws:// or wss://)." + caption: "Die WebSocket-Adresse eines funktionierenden Hocuspocus-Servers." + invalid_scheme: "Muss ein WebSocket-Protokoll (ws:// oder wss://) verwenden." hocuspocus_server_secret: label: "Client-Secret" caption: "Fügen Sie das vom Hocuspocus-Server bereitgestellte Secret ein." diff --git a/modules/grids/config/locales/crowdin/js-de.yml b/modules/grids/config/locales/crowdin/js-de.yml index a64d53f6db8..464207ac38d 100644 --- a/modules/grids/config/locales/crowdin/js-de.yml +++ b/modules/grids/config/locales/crowdin/js-de.yml @@ -2,7 +2,7 @@ de: js: grid: add_widget: 'Widget hinzufügen' - widget_menu_label: 'Show menu options for %{widgetName} widget' + widget_menu_label: 'Menüoptionen für das Widget %{widgetName} anzeigen' remove: 'Widget entfernen' configure: 'Widget konfigurieren' widgets: diff --git a/modules/meeting/config/locales/crowdin/af.yml b/modules/meeting/config/locales/crowdin/af.yml index 37d02ad1c6e..73c81ba665f 100644 --- a/modules/meeting/config/locales/crowdin/af.yml +++ b/modules/meeting/config/locales/crowdin/af.yml @@ -612,8 +612,8 @@ af: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ar.yml b/modules/meeting/config/locales/crowdin/ar.yml index 0dd3f765308..a5be635bc4c 100644 --- a/modules/meeting/config/locales/crowdin/ar.yml +++ b/modules/meeting/config/locales/crowdin/ar.yml @@ -640,8 +640,8 @@ ar: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/az.yml b/modules/meeting/config/locales/crowdin/az.yml index aa91fd51091..625bfe21174 100644 --- a/modules/meeting/config/locales/crowdin/az.yml +++ b/modules/meeting/config/locales/crowdin/az.yml @@ -612,8 +612,8 @@ az: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/be.yml b/modules/meeting/config/locales/crowdin/be.yml index 14c5baff942..3ef8fdca9d5 100644 --- a/modules/meeting/config/locales/crowdin/be.yml +++ b/modules/meeting/config/locales/crowdin/be.yml @@ -626,8 +626,8 @@ be: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/bg.yml b/modules/meeting/config/locales/crowdin/bg.yml index da322856098..40e900a45ec 100644 --- a/modules/meeting/config/locales/crowdin/bg.yml +++ b/modules/meeting/config/locales/crowdin/bg.yml @@ -612,8 +612,8 @@ bg: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ca.yml b/modules/meeting/config/locales/crowdin/ca.yml index 9ef63cd5ade..3a2048577d5 100644 --- a/modules/meeting/config/locales/crowdin/ca.yml +++ b/modules/meeting/config/locales/crowdin/ca.yml @@ -612,8 +612,8 @@ ca: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ckb-IR.yml b/modules/meeting/config/locales/crowdin/ckb-IR.yml index a792629bb9f..82a4700edd3 100644 --- a/modules/meeting/config/locales/crowdin/ckb-IR.yml +++ b/modules/meeting/config/locales/crowdin/ckb-IR.yml @@ -612,8 +612,8 @@ ckb-IR: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index d06d16f4f2f..3420c4913d0 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -626,8 +626,8 @@ cs: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/da.yml b/modules/meeting/config/locales/crowdin/da.yml index a02e03c4668..ad970b4f181 100644 --- a/modules/meeting/config/locales/crowdin/da.yml +++ b/modules/meeting/config/locales/crowdin/da.yml @@ -612,8 +612,8 @@ da: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index d85927f983f..a65e00d18a4 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -612,8 +612,8 @@ de: text_meeting_closed_dropdown_description: "Diese Besprechung ist geschlossen. Sie können keine Tagesordnungspunkte mehr hinzufügen/entfernen." text_meeting_draft_banner: "Dieses Meeting ist derzeit ein Entwurf. Diese Besprechung sendet keine Kalenderaktualisierungen oder Einladungen, selbst wenn Sie Besprechungsdetails ändern oder Teilnehmer hinzufügen/entfernen." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Diese Besprechung öffnen und Einladungen verschicken?" text_exit_draft_mode_dialog_subtitle: "Sie können nicht mehr zum Entwurfsmodus zurückkehren, sobald Sie die Besprechung eröffnen." text_exit_draft_mode_dialog_template_title: "Das erste Vorkommen dieser Terminserie öffnen?" diff --git a/modules/meeting/config/locales/crowdin/el.yml b/modules/meeting/config/locales/crowdin/el.yml index d15def16097..bdc82fb90cc 100644 --- a/modules/meeting/config/locales/crowdin/el.yml +++ b/modules/meeting/config/locales/crowdin/el.yml @@ -612,8 +612,8 @@ el: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/eo.yml b/modules/meeting/config/locales/crowdin/eo.yml index 7255cb343dd..6014ac200ca 100644 --- a/modules/meeting/config/locales/crowdin/eo.yml +++ b/modules/meeting/config/locales/crowdin/eo.yml @@ -612,8 +612,8 @@ eo: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml index 00325fe1e17..7beca91e01b 100644 --- a/modules/meeting/config/locales/crowdin/es.yml +++ b/modules/meeting/config/locales/crowdin/es.yml @@ -612,8 +612,8 @@ es: text_meeting_closed_dropdown_description: "Esta reunión está cerrada. Ya no puede modificar los puntos del orden del día ni los resultados." text_meeting_draft_banner: "Estás en modo Borrador. Esta reunión no enviará actualizaciones ni invitaciones de calendario, incluso si cambias los detalles de la reunión o añades/eliminas participantes." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "¿Abrir esta reunión y enviar invitaciones?" text_exit_draft_mode_dialog_subtitle: "Una vez programada una reunión, no puedes volver al modo Borrador." text_exit_draft_mode_dialog_template_title: "¿Abrir la primera repetición de esta serie de reuniones?" diff --git a/modules/meeting/config/locales/crowdin/et.yml b/modules/meeting/config/locales/crowdin/et.yml index aa7b72eca9c..4abace527dd 100644 --- a/modules/meeting/config/locales/crowdin/et.yml +++ b/modules/meeting/config/locales/crowdin/et.yml @@ -612,8 +612,8 @@ et: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/eu.yml b/modules/meeting/config/locales/crowdin/eu.yml index c76935de7db..5b03636da21 100644 --- a/modules/meeting/config/locales/crowdin/eu.yml +++ b/modules/meeting/config/locales/crowdin/eu.yml @@ -612,8 +612,8 @@ eu: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/fa.yml b/modules/meeting/config/locales/crowdin/fa.yml index 4417db3e544..6bbe1eebba3 100644 --- a/modules/meeting/config/locales/crowdin/fa.yml +++ b/modules/meeting/config/locales/crowdin/fa.yml @@ -612,8 +612,8 @@ fa: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/fi.yml b/modules/meeting/config/locales/crowdin/fi.yml index 08b829522a8..04bf03e0067 100644 --- a/modules/meeting/config/locales/crowdin/fi.yml +++ b/modules/meeting/config/locales/crowdin/fi.yml @@ -612,8 +612,8 @@ fi: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/fil.yml b/modules/meeting/config/locales/crowdin/fil.yml index 585e5aad842..a95839c0f43 100644 --- a/modules/meeting/config/locales/crowdin/fil.yml +++ b/modules/meeting/config/locales/crowdin/fil.yml @@ -612,8 +612,8 @@ fil: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index b04a8e522e0..5c0472a5102 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -612,8 +612,8 @@ fr: text_meeting_closed_dropdown_description: "Cette réunion est terminée. Vous ne pouvez plus modifier les points de l'ordre du jour ou les résultats." text_meeting_draft_banner: "Vous êtes actuellement en mode brouillon. Cette réunion n'enverra pas de mises à jour de calendrier ni d'invitations, même si vous modifiez les détails de la réunion ou si vous ajoutez/supprimez des participants." text_onetime_meeting_template_banner: "Vous êtes en train de modifier un modèle de réunion. Vous pouvez utiliser ce modèle pour créer des réunions ponctuelles avec un ordre du jour prédéfini. Les modifications n'affecteront pas les réunions déjà créées." - text_onetime_meeting_template_empty_heading: "Votre modèle de réunion est vide" - text_onetime_meeting_template_description: "Vous pouvez ajouter des points de l'ordre du jour, des participants et des pièces jointes à ce modèle." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Ouvrez cette réunion et envoyez des invitations ?" text_exit_draft_mode_dialog_subtitle: "Vous ne pouvez pas revenir au mode brouillon une fois que vous avez planifié une réunion." text_exit_draft_mode_dialog_template_title: "Ouvrez la première occurrence de cette série de réunions ?" diff --git a/modules/meeting/config/locales/crowdin/he.yml b/modules/meeting/config/locales/crowdin/he.yml index a3e95a24b71..27212c1c64b 100644 --- a/modules/meeting/config/locales/crowdin/he.yml +++ b/modules/meeting/config/locales/crowdin/he.yml @@ -626,8 +626,8 @@ he: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/hi.yml b/modules/meeting/config/locales/crowdin/hi.yml index c5ce01bbb70..cc91f666bba 100644 --- a/modules/meeting/config/locales/crowdin/hi.yml +++ b/modules/meeting/config/locales/crowdin/hi.yml @@ -612,8 +612,8 @@ hi: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/hr.yml b/modules/meeting/config/locales/crowdin/hr.yml index 6808bd82efa..c238623014c 100644 --- a/modules/meeting/config/locales/crowdin/hr.yml +++ b/modules/meeting/config/locales/crowdin/hr.yml @@ -619,8 +619,8 @@ hr: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/hu.yml b/modules/meeting/config/locales/crowdin/hu.yml index b60274c9397..ccadd388eca 100644 --- a/modules/meeting/config/locales/crowdin/hu.yml +++ b/modules/meeting/config/locales/crowdin/hu.yml @@ -612,8 +612,8 @@ hu: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/id.yml b/modules/meeting/config/locales/crowdin/id.yml index 70c8b50eb78..1f5d85bc19a 100644 --- a/modules/meeting/config/locales/crowdin/id.yml +++ b/modules/meeting/config/locales/crowdin/id.yml @@ -605,8 +605,8 @@ id: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "Saat ini, Anda berada dalam mode draf. Rapat ini tidak akan mengirimkan pembaruan kalender atau undangan, bahkan jika Anda mengubah detail rapat atau menambahkan/menghapus peserta." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Buka rapat ini dan kirim undangan?" text_exit_draft_mode_dialog_subtitle: "Anda tidak dapat kembali ke mode draf setellah Anda menjadwalkan rapat." text_exit_draft_mode_dialog_template_title: "Buka acara yang pertama dalam seri rapat ini?" diff --git a/modules/meeting/config/locales/crowdin/it.yml b/modules/meeting/config/locales/crowdin/it.yml index 1f132fcd611..7ecc9bb9f13 100644 --- a/modules/meeting/config/locales/crowdin/it.yml +++ b/modules/meeting/config/locales/crowdin/it.yml @@ -612,8 +612,8 @@ it: text_meeting_closed_dropdown_description: "Questa riunione è chiusa. Non puoi più modificare i punti all'ordine del giorno." text_meeting_draft_banner: "Al momento sei in modalità bozza. Questa riunione non invierà alcun aggiornamento del calendario né inviti, anche in caso di modifica dei dettagli della riunione o di aggiunta o rimozione di partecipanti." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Aprire questa riunione e inviare gli inviti?" text_exit_draft_mode_dialog_subtitle: "Non può tornare alla modalità bozza una volta programmata una riunione." text_exit_draft_mode_dialog_template_title: "Aprire la prima occorrenza di questa serie di riunioni?" diff --git a/modules/meeting/config/locales/crowdin/ja.yml b/modules/meeting/config/locales/crowdin/ja.yml index cf508ab71d3..cecd9d8e308 100644 --- a/modules/meeting/config/locales/crowdin/ja.yml +++ b/modules/meeting/config/locales/crowdin/ja.yml @@ -605,8 +605,8 @@ ja: 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "この会議を開いて招待を送信しますか?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ka.yml b/modules/meeting/config/locales/crowdin/ka.yml index 2efc4cdf9c5..875d2b9ef07 100644 --- a/modules/meeting/config/locales/crowdin/ka.yml +++ b/modules/meeting/config/locales/crowdin/ka.yml @@ -612,8 +612,8 @@ ka: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/kk.yml b/modules/meeting/config/locales/crowdin/kk.yml index 2a621f920f6..9f09eb1c78c 100644 --- a/modules/meeting/config/locales/crowdin/kk.yml +++ b/modules/meeting/config/locales/crowdin/kk.yml @@ -612,8 +612,8 @@ kk: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ko.yml b/modules/meeting/config/locales/crowdin/ko.yml index 8a9352355c2..ae42f59194e 100644 --- a/modules/meeting/config/locales/crowdin/ko.yml +++ b/modules/meeting/config/locales/crowdin/ko.yml @@ -605,8 +605,8 @@ ko: 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "이 미팅을 열고 초대장을 보내시겠습니까?" text_exit_draft_mode_dialog_subtitle: "미팅을 예약한 후에는 초안 모드로 돌아갈 수 없습니다." text_exit_draft_mode_dialog_template_title: "이 미팅 시리즈의 첫 번째 항목을 열어보시겠습니까?" diff --git a/modules/meeting/config/locales/crowdin/lt.yml b/modules/meeting/config/locales/crowdin/lt.yml index dbc68a9267e..c8bee77b075 100644 --- a/modules/meeting/config/locales/crowdin/lt.yml +++ b/modules/meeting/config/locales/crowdin/lt.yml @@ -626,8 +626,8 @@ lt: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/lv.yml b/modules/meeting/config/locales/crowdin/lv.yml index 5fbe4e3b3c9..1616f604b57 100644 --- a/modules/meeting/config/locales/crowdin/lv.yml +++ b/modules/meeting/config/locales/crowdin/lv.yml @@ -619,8 +619,8 @@ lv: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/mn.yml b/modules/meeting/config/locales/crowdin/mn.yml index 7d40a116f67..a6a1a5236bf 100644 --- a/modules/meeting/config/locales/crowdin/mn.yml +++ b/modules/meeting/config/locales/crowdin/mn.yml @@ -612,8 +612,8 @@ mn: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ms.yml b/modules/meeting/config/locales/crowdin/ms.yml index 7e718524ab4..93ab3914285 100644 --- a/modules/meeting/config/locales/crowdin/ms.yml +++ b/modules/meeting/config/locales/crowdin/ms.yml @@ -605,8 +605,8 @@ ms: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ne.yml b/modules/meeting/config/locales/crowdin/ne.yml index d086140dee7..9f87ad11114 100644 --- a/modules/meeting/config/locales/crowdin/ne.yml +++ b/modules/meeting/config/locales/crowdin/ne.yml @@ -612,8 +612,8 @@ ne: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/nl.yml b/modules/meeting/config/locales/crowdin/nl.yml index 3e9ee2a2133..8244a3e290c 100644 --- a/modules/meeting/config/locales/crowdin/nl.yml +++ b/modules/meeting/config/locales/crowdin/nl.yml @@ -612,8 +612,8 @@ nl: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/no.yml b/modules/meeting/config/locales/crowdin/no.yml index d1d844f21d9..43d9628a657 100644 --- a/modules/meeting/config/locales/crowdin/no.yml +++ b/modules/meeting/config/locales/crowdin/no.yml @@ -612,8 +612,8 @@ text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/pl.yml b/modules/meeting/config/locales/crowdin/pl.yml index 56a3c1c0cd9..ee56f083535 100644 --- a/modules/meeting/config/locales/crowdin/pl.yml +++ b/modules/meeting/config/locales/crowdin/pl.yml @@ -626,8 +626,8 @@ pl: text_meeting_closed_dropdown_description: "To spotkanie jest zamknięte. Nie można już modyfikować pozycji planu spotkania ani wyników." text_meeting_draft_banner: "Jesteś teraz w trybie wersji roboczej. To spotkanie nie wyśle żadnych aktualizacji kalendarza ani zaproszeń, nawet jeśli zmienisz szczegóły spotkania lub dodasz/usuniesz uczestników." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Otworzyć to spotkanie i wysłać zaproszenia?" text_exit_draft_mode_dialog_subtitle: "Po zaplanowaniu spotkania nie można powrócić do trybu wersji roboczej." text_exit_draft_mode_dialog_template_title: "Otworzyć pierwsze wystąpienie z tej serii spotkań?" diff --git a/modules/meeting/config/locales/crowdin/pt-BR.yml b/modules/meeting/config/locales/crowdin/pt-BR.yml index fe8478ef851..d7d1686aa31 100644 --- a/modules/meeting/config/locales/crowdin/pt-BR.yml +++ b/modules/meeting/config/locales/crowdin/pt-BR.yml @@ -612,8 +612,8 @@ pt-BR: text_meeting_closed_dropdown_description: "Esta reunião está encerrada. Já não é possível modificar os pontos da ordem de trabalhos ou os resultados." text_meeting_draft_banner: "Você está no modo rascunho. Esta reunião não enviará nenhuma atualização de calendário ou convite, mesmo que você altere os detalhes da reunião ou adicione/remoca participantes." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Abrir esta reunião e enviar convites?" text_exit_draft_mode_dialog_subtitle: "Você não pode retornar ao modo rascunho após você agendar a reunião." text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?" diff --git a/modules/meeting/config/locales/crowdin/pt-PT.yml b/modules/meeting/config/locales/crowdin/pt-PT.yml index 02f5468c954..8215ffdc035 100644 --- a/modules/meeting/config/locales/crowdin/pt-PT.yml +++ b/modules/meeting/config/locales/crowdin/pt-PT.yml @@ -612,8 +612,8 @@ pt-PT: text_meeting_closed_dropdown_description: "Esta reunião está encerrada. Já não é possível modificar os pontos da ordem de trabalhos ou os resultados." text_meeting_draft_banner: "Está no modo de rascunho. Esta reunião não enviará atualizações de calendário ou convites, mesmo que altere os detalhes da reunião ou adicione/remova participantes." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Abrir esta reunião e enviar convites?" text_exit_draft_mode_dialog_subtitle: "Não pode regressar ao modo de rascunho após agendar uma reunião." text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?" diff --git a/modules/meeting/config/locales/crowdin/ro.yml b/modules/meeting/config/locales/crowdin/ro.yml index 36217f5af22..01ca73393d3 100644 --- a/modules/meeting/config/locales/crowdin/ro.yml +++ b/modules/meeting/config/locales/crowdin/ro.yml @@ -619,8 +619,8 @@ ro: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index ac9edfa6e5e..a3df551cf31 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -122,13 +122,13 @@ ru: error_notification_with_errors: "Не удалось отправить уведомление. Следующие получатели не могут быть уведомлены: %{recipients}" label_meeting: "Совещание" label_meeting_plural: "Совещания" - label_meeting_templates: "Templates" - label_meeting_template: "Template" - label_meeting_template_new: "New template" - label_meeting_template_create: "Create template" - label_meeting_template_delete: "Delete template" - label_meeting_template_edit: "Edit template" - label_meeting_create_from_template: "Create meeting from template" + label_meeting_templates: "Шаблоны" + label_meeting_template: "Шаблон" + label_meeting_template_new: "Новый шаблон" + label_meeting_template_create: "Создать шаблон" + label_meeting_template_delete: "Удалить шаблон" + label_meeting_template_edit: "Редактировать шаблон" + label_meeting_create_from_template: "Создать встречу из шаблона" label_meeting_new: "Новое совещание" caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Новое однократное совещание" @@ -298,8 +298,8 @@ ru: confirmation_message_html: > Это действие не обратимо. Пожалуйста, действуйте с осторожностью. template: - title: "Delete template" - heading: "Delete this template?" + title: "Удалить шаблон" + heading: "Удалить этот шаблон?" occurrence: title: "Отменить это событие" heading: "Отменить это событие?" @@ -503,7 +503,7 @@ ru: end_series_dialog: title: "Завершить серию совещаний" notice_successful_notification: "Обновление календаря отправлено всем участникам по электронной почте" - notice_meeting_template_created: "Template successfully created" + notice_meeting_template_created: "Шаблон успешно создан" notice_timezone_missing: Не установлен часовой пояс и применена %{zone}. Чтобы выбрать часовой пояс, пожалуйста, нажмите сюда. notice_meeting_updated: "Эта страница была обновлена кем-то другим. Перезагрузите страницу, чтобы просмотреть изменения." permission_create_meetings: "Создание совещания" @@ -518,8 +518,8 @@ ru: text_duration_in_hours: "Длительность в часах" text_in_hours: "в часах" text_meeting_agenda_for_meeting: 'Повестка дня встречи «%{meeting}»' - text_meeting_template_blank_slate_heading: "There are no templates to display" - text_meeting_template_blank_slate: "You can create a new template for one-time meetings" + text_meeting_template_blank_slate_heading: "Нет шаблонов для отображения" + text_meeting_template_blank_slate: "Вы можете создать новый шаблон для одноразовых встреч" text_meeting_series_end_early_heading: "Удалить будущие события?" text_meeting_series_end_early: "Завершение серии удалит любые будущие открытые или запланированные события совещания" text_meeting_closing_are_you_sure: "Вы уверены, что хотите закрыть повестку дня собрания?" @@ -626,8 +626,8 @@ ru: 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Открыть это совещание и разослать приглашения?" text_exit_draft_mode_dialog_subtitle: "Вы не можете вернуться в режим черновика после того, как запланировали совещание." text_exit_draft_mode_dialog_template_title: "Открыть первое совещание из этой серии?" diff --git a/modules/meeting/config/locales/crowdin/rw.yml b/modules/meeting/config/locales/crowdin/rw.yml index a052d210e4d..7950404c9c2 100644 --- a/modules/meeting/config/locales/crowdin/rw.yml +++ b/modules/meeting/config/locales/crowdin/rw.yml @@ -612,8 +612,8 @@ rw: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/si.yml b/modules/meeting/config/locales/crowdin/si.yml index c3a20286a91..a0730a1d772 100644 --- a/modules/meeting/config/locales/crowdin/si.yml +++ b/modules/meeting/config/locales/crowdin/si.yml @@ -612,8 +612,8 @@ si: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/sk.yml b/modules/meeting/config/locales/crowdin/sk.yml index 0099b207b19..4c5a7ba0576 100644 --- a/modules/meeting/config/locales/crowdin/sk.yml +++ b/modules/meeting/config/locales/crowdin/sk.yml @@ -626,8 +626,8 @@ sk: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/sl.yml b/modules/meeting/config/locales/crowdin/sl.yml index a26338b80c7..2f5e8c65f2a 100644 --- a/modules/meeting/config/locales/crowdin/sl.yml +++ b/modules/meeting/config/locales/crowdin/sl.yml @@ -626,8 +626,8 @@ sl: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/sr.yml b/modules/meeting/config/locales/crowdin/sr.yml index 571c9d929f3..eb77c19cedf 100644 --- a/modules/meeting/config/locales/crowdin/sr.yml +++ b/modules/meeting/config/locales/crowdin/sr.yml @@ -619,8 +619,8 @@ sr: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/sv.yml b/modules/meeting/config/locales/crowdin/sv.yml index d57feb9f9ff..3581dd14f11 100644 --- a/modules/meeting/config/locales/crowdin/sv.yml +++ b/modules/meeting/config/locales/crowdin/sv.yml @@ -612,8 +612,8 @@ sv: text_meeting_closed_dropdown_description: "Det här mötet är stängt. Du kan inte ändra agendapunkter eller resultat längre." text_meeting_draft_banner: "Du befinner dig för närvarande i utkastläge. Det här mötet kommer inte att skicka ut några kalenderuppdateringar eller inbjudningar, även om du ändrar mötesdetaljer eller lägger till/tar bort deltagare." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Öppna detta möte och skicka inbjudningar?" text_exit_draft_mode_dialog_subtitle: "Du kan inte gå tillbaka till utkastet när du schemalägger ett möte." text_exit_draft_mode_dialog_template_title: "Öppna den första förekomsten av denna mötesserie?" diff --git a/modules/meeting/config/locales/crowdin/th.yml b/modules/meeting/config/locales/crowdin/th.yml index 46962101485..604c0bd717d 100644 --- a/modules/meeting/config/locales/crowdin/th.yml +++ b/modules/meeting/config/locales/crowdin/th.yml @@ -605,8 +605,8 @@ th: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/tr.yml b/modules/meeting/config/locales/crowdin/tr.yml index 07b6c8b277b..246ac3f00c8 100644 --- a/modules/meeting/config/locales/crowdin/tr.yml +++ b/modules/meeting/config/locales/crowdin/tr.yml @@ -612,8 +612,8 @@ tr: text_meeting_closed_dropdown_description: "Bu toplantı kapalı. Gündem maddelerini ya da sonuçları artık düzenleyemezsiniz." text_meeting_draft_banner: "Şu anda taslak modundasınız. Toplantı ayrıntılarını değiştirseniz veya katılımcı ekleyip çıkarsanız bile bu toplantı herhangi bir takvim güncellemesi veya davet göndermeyecektir." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Bu toplantıyı açıp davetiye gönderelim mi?" text_exit_draft_mode_dialog_subtitle: "Bir toplantı planladıktan sonra taslak moduna geri dönemezsiniz." text_exit_draft_mode_dialog_template_title: "Bu toplantı serisinin ilkini açar mısınız?" diff --git a/modules/meeting/config/locales/crowdin/uk.yml b/modules/meeting/config/locales/crowdin/uk.yml index 35cead4401c..775ca627fd9 100644 --- a/modules/meeting/config/locales/crowdin/uk.yml +++ b/modules/meeting/config/locales/crowdin/uk.yml @@ -626,8 +626,8 @@ uk: 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Відкрити цю нараду й надіслати запрошення?" text_exit_draft_mode_dialog_subtitle: "Запланувавши нараду, не можна повернутися в режим чернетки." text_exit_draft_mode_dialog_template_title: "Відкрити першу нараду цієї серії?" diff --git a/modules/meeting/config/locales/crowdin/uz.yml b/modules/meeting/config/locales/crowdin/uz.yml index 96d23784fc1..662e4a4ff30 100644 --- a/modules/meeting/config/locales/crowdin/uz.yml +++ b/modules/meeting/config/locales/crowdin/uz.yml @@ -612,8 +612,8 @@ uz: text_meeting_closed_dropdown_description: "This meeting is closed. You cannot modify agenda items or outcomes anymore." text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/vi.yml b/modules/meeting/config/locales/crowdin/vi.yml index 32967296f72..4e630618beb 100644 --- a/modules/meeting/config/locales/crowdin/vi.yml +++ b/modules/meeting/config/locales/crowdin/vi.yml @@ -605,8 +605,8 @@ vi: text_meeting_closed_dropdown_description: "Cuộc họp này đã kết thúc. Bạn không thể sửa đổi các mục hoặc kết quả của chương trình nghị sự nữa." text_meeting_draft_banner: "Bạn hiện đang ở chế độ nháp. Cuộc họp này sẽ không gửi bất kỳ cập nhật lịch hoặc lời mời nào, ngay cả khi bạn thay đổi chi tiết cuộc họp hoặc thêm/xóa người tham gia." 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Mở cuộc họp này và gửi lời mời?" text_exit_draft_mode_dialog_subtitle: "Bạn không thể quay lại chế độ nháp sau khi lên lịch cuộc họp." text_exit_draft_mode_dialog_template_title: "Mở lần xuất hiện đầu tiên của chuỗi cuộc họp này?" diff --git a/modules/meeting/config/locales/crowdin/zh-CN.yml b/modules/meeting/config/locales/crowdin/zh-CN.yml index 216357e7fde..e550bc23d32 100644 --- a/modules/meeting/config/locales/crowdin/zh-CN.yml +++ b/modules/meeting/config/locales/crowdin/zh-CN.yml @@ -605,8 +605,8 @@ zh-CN: 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "是否打开此会议并发送邀请?" text_exit_draft_mode_dialog_subtitle: "会议安排完成后,您将无法返回到草稿模式。" text_exit_draft_mode_dialog_template_title: "是否打开此会议系列的第一个会议?" diff --git a/modules/meeting/config/locales/crowdin/zh-TW.yml b/modules/meeting/config/locales/crowdin/zh-TW.yml index 354846abb56..5f179fd8a13 100644 --- a/modules/meeting/config/locales/crowdin/zh-TW.yml +++ b/modules/meeting/config/locales/crowdin/zh-TW.yml @@ -605,8 +605,8 @@ zh-TW: 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." - text_onetime_meeting_template_empty_heading: "Your meeting template is empty" - text_onetime_meeting_template_description: "You can add agenda items, participants, and attachments to this template." + text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "開啟此會議並發送邀請函?" text_exit_draft_mode_dialog_subtitle: "一旦排定會議,就無法返回草稿模式。" text_exit_draft_mode_dialog_template_title: "要開啟此會議系列的第一場會議嗎?" From 91b5f0ba4d5424a639722a3d878044dce1987364 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 05:35:28 +0000 Subject: [PATCH 087/334] Bump @types/react in /frontend in the react group Bumps the react group in /frontend with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react). Updates `@types/react` from 19.2.10 to 19.2.13 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-version: 19.2.13 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: react ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 14 +++++++------- frontend/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3b086e932ea..2456fb5345e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -155,7 +155,7 @@ "@types/mousetrap": "^1.6.3", "@types/pako": "^2.0.4", "@types/rails__request.js": "^0.0.1", - "@types/react": "^19.2.10", + "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@types/resize-observer-browser": "^0.1.4", "@types/urijs": "^1.19.26", @@ -9377,9 +9377,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "19.2.10", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", - "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==", + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "dev": true, "dependencies": { "csstype": "^3.2.2" @@ -31449,9 +31449,9 @@ "dev": true }, "@types/react": { - "version": "19.2.10", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", - "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==", + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "dev": true, "requires": { "csstype": "^3.2.2" diff --git a/frontend/package.json b/frontend/package.json index 2b7b3af5b94..822deefdfeb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -31,7 +31,7 @@ "@types/mousetrap": "^1.6.3", "@types/pako": "^2.0.4", "@types/rails__request.js": "^0.0.1", - "@types/react": "^19.2.10", + "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@types/resize-observer-browser": "^0.1.4", "@types/urijs": "^1.19.26", From 23f51de71dcc935de2c35a42a578be3f301bb31c Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Tue, 3 Mar 2026 09:06:18 +0100 Subject: [PATCH 088/334] Add dfriquet to CLA allow list [skip ci] --- .github/workflows/cla.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index b1920ad916c..70eca33f120 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -53,6 +53,7 @@ jobs: corinnaguenther, crohr, dependabot[bot], + dfriquet, dombesz, dominic-braeunlein, dsteiner, From ec75b84054898a1af279d0917e84ef502ff29262 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 05:53:30 -0300 Subject: [PATCH 089/334] Bump the angular group across 1 directory with 14 updates (#22159) Bumps the angular group with 14 updates in the /frontend directory: | Package | From | To | | --- | --- | --- | | [@angular/animations](https://github.com/angular/angular/tree/HEAD/packages/animations) | `21.1.5` | `21.1.6` | | [@angular/cdk](https://github.com/angular/components) | `21.1.5` | `21.1.6` | | [@angular/cli](https://github.com/angular/angular-cli) | `21.1.4` | `21.1.5` | | [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `21.1.5` | `21.1.6` | | [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `21.1.5` | `21.1.6` | | [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `21.1.5` | `21.1.6` | | [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `21.1.5` | `21.1.6` | | [@angular/elements](https://github.com/angular/angular/tree/HEAD/packages/elements) | `21.1.5` | `21.1.6` | | [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `21.1.5` | `21.1.6` | | [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `21.1.5` | `21.1.6` | | [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `21.1.5` | `21.1.6` | | [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `21.1.5` | `21.1.6` | | [@angular-devkit/build-angular](https://github.com/angular/angular-cli) | `21.1.4` | `21.1.5` | | [@angular/language-service](https://github.com/angular/angular/tree/HEAD/packages/language-service) | `21.1.5` | `21.1.6` | Updates `@angular/animations` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/animations) Updates `@angular/cdk` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/components/releases) - [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/components/compare/v21.1.5...v21.1.6) Updates `@angular/cli` from 21.1.4 to 21.1.5 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/v21.1.4...v21.1.5) Updates `@angular/common` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/common) Updates `@angular/compiler` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/compiler) Updates `@angular/compiler-cli` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/compiler-cli) Updates `@angular/core` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/core) Updates `@angular/elements` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/elements) Updates `@angular/forms` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/forms) Updates `@angular/platform-browser` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/platform-browser) Updates `@angular/platform-browser-dynamic` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/platform-browser-dynamic) Updates `@angular/router` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/router) Updates `@angular-devkit/build-angular` from 21.1.4 to 21.1.5 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/v21.1.4...v21.1.5) Updates `@angular/language-service` from 21.1.5 to 21.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.1.6/packages/language-service) --- updated-dependencies: - dependency-name: "@angular/animations" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/cdk" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/cli" dependency-version: 21.1.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/common" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/compiler" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/compiler-cli" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/core" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/elements" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/forms" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/platform-browser" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/platform-browser-dynamic" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/router" dependency-version: 21.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular-devkit/build-angular" dependency-version: 21.1.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/language-service" dependency-version: 21.1.6 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: angular ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 664 ++++++++++++++++++++++--------------- frontend/package.json | 28 +- 2 files changed, 414 insertions(+), 278 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3b086e932ea..049ebb5c81b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,18 +9,18 @@ "version": "0.1.0", "license": "GPLv3", "dependencies": { - "@angular/animations": "^21.1.5", - "@angular/cdk": "^21.1.5", - "@angular/cli": "^21.1.4", - "@angular/common": "^21.1.5", - "@angular/compiler": "^21.1.5", - "@angular/compiler-cli": "^21.1.5", - "@angular/core": "^21.1.5", - "@angular/elements": "^21.1.5", - "@angular/forms": "^21.1.5", - "@angular/platform-browser": "^21.1.5", - "@angular/platform-browser-dynamic": "^21.1.5", - "@angular/router": "^21.1.5", + "@angular/animations": "^21.1.6", + "@angular/cdk": "^21.1.6", + "@angular/cli": "^21.1.5", + "@angular/common": "^21.1.6", + "@angular/compiler": "^21.1.6", + "@angular/compiler-cli": "^21.1.6", + "@angular/core": "^21.1.6", + "@angular/elements": "^21.1.6", + "@angular/forms": "^21.1.6", + "@angular/platform-browser": "^21.1.6", + "@angular/platform-browser-dynamic": "^21.1.6", + "@angular/router": "^21.1.6", "@appsignal/javascript": "^1.6.1", "@appsignal/plugin-breadcrumbs-console": "^1.1.37", "@appsignal/plugin-breadcrumbs-network": "^1.1.24", @@ -130,13 +130,13 @@ }, "devDependencies": { "@angular-builders/custom-esbuild": "^21.0.3", - "@angular-devkit/build-angular": "^21.1.4", + "@angular-devkit/build-angular": "^21.1.5", "@angular-eslint/builder": "20.7.0", "@angular-eslint/eslint-plugin": "20.7.0", "@angular-eslint/eslint-plugin-template": "20.7.0", "@angular-eslint/schematics": "20.7.0", "@angular-eslint/template-parser": "20.7.0", - "@angular/language-service": "21.1.5", + "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", "@html-eslint/eslint-plugin": "^0.54.2", "@html-eslint/parser": "^0.54.0", @@ -648,16 +648,16 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.1.4.tgz", - "integrity": "sha512-2HPCo6vEu5EIwxxFYhnmdfbktRBoOVQD3q7lG9PMQPf/jRCnyIZ70qSbXbAV96IMDLFl8mLRfY4scoaFMIYGMw==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.1.5.tgz", + "integrity": "sha512-B2jOBAiVl+hA3PLwpxfrbW/gA7SDu9Uv+hQwHYrdwL2XXDVwaQ+c3z9BS3yJDQTkb/TrAJ0sfa2zVLC4b/rHzg==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2101.4", - "@angular-devkit/build-webpack": "0.2101.4", - "@angular-devkit/core": "21.1.4", - "@angular/build": "21.1.4", + "@angular-devkit/architect": "0.2101.5", + "@angular-devkit/build-webpack": "0.2101.5", + "@angular-devkit/core": "21.1.5", + "@angular/build": "21.1.5", "@babel/core": "7.28.5", "@babel/generator": "7.28.5", "@babel/helper-annotate-as-pure": "7.27.3", @@ -668,7 +668,7 @@ "@babel/preset-env": "7.28.5", "@babel/runtime": "7.28.4", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "21.1.4", + "@ngtools/webpack": "21.1.5", "ansi-colors": "4.1.3", "autoprefixer": "10.4.23", "babel-loader": "10.0.0", @@ -723,7 +723,7 @@ "@angular/platform-browser": "^21.0.0", "@angular/platform-server": "^21.0.0", "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.1.4", + "@angular/ssr": "^21.1.5", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^30.2.0", @@ -780,12 +780,12 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.2101.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz", - "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==", + "version": "0.2101.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.5.tgz", + "integrity": "sha512-eTo6wWzUW5AyBBLTbaUTpBHhGbZhzteErtNGklWkhjicCr/soNH+2mVtvg8bqA8sNreYffK1VXKFsq5NyMh5qg==", "dev": true, "dependencies": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "rxjs": "7.8.2" }, "bin": { @@ -798,12 +798,12 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz", - "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.5.tgz", + "integrity": "sha512-KUKbllHvHefkAbTBjWNpRPyrpBqecW+6HBBAR+XNbKBuFTHkG+gxtuwMXNsvO5KECKwQphvQt5h3g05Xtaf0LQ==", "dev": true, "dependencies": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.3", @@ -833,6 +833,22 @@ "node": ">=14.17.0" } }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", @@ -1046,12 +1062,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.2101.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2101.4.tgz", - "integrity": "sha512-lPjPxeEzUha4bnlGzD3KFFf3yxcQjOfV9wwZIa4XLsqjCZsUk95TzHQH7i64OCTw9uKTEQkJBAuO6v2WXHxopw==", + "version": "0.2101.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2101.5.tgz", + "integrity": "sha512-G3mvUXiSU3DL1QKngq/yXT94Wr+IdqtOM/1VC3NmsV9KX3OSfwfc560dmhY1efqc9gBA5qL+7kLlgV7Kx/Su3A==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.2101.4", + "@angular-devkit/architect": "0.2101.5", "rxjs": "7.8.2" }, "engines": { @@ -1065,12 +1081,12 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.2101.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz", - "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==", + "version": "0.2101.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.5.tgz", + "integrity": "sha512-eTo6wWzUW5AyBBLTbaUTpBHhGbZhzteErtNGklWkhjicCr/soNH+2mVtvg8bqA8sNreYffK1VXKFsq5NyMh5qg==", "dev": true, "dependencies": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "rxjs": "7.8.2" }, "bin": { @@ -1083,12 +1099,12 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz", - "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.5.tgz", + "integrity": "sha512-KUKbllHvHefkAbTBjWNpRPyrpBqecW+6HBBAR+XNbKBuFTHkG+gxtuwMXNsvO5KECKwQphvQt5h3g05Xtaf0LQ==", "dev": true, "dependencies": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.3", @@ -1109,6 +1125,22 @@ } } }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@angular-devkit/build-webpack/node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", @@ -1373,9 +1405,9 @@ "license": "MIT" }, "node_modules/@angular/animations": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.5.tgz", - "integrity": "sha512-gsqHX8lCYV8cgVtHs0iLwrX8SVlmcjUF44l/xCc/jBC/TeKWRl2e6Jqrn1Wcd0NDlGiNsm+mYNyqMyy5/I7kjw==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.6.tgz", + "integrity": "sha512-Ft8B0tHBRyd7ORpbaa2S0yRqHSdsyMH6oot7ODAA3kv03k4GTwp74U6Y/NyV4JoZ+lr28+EV4YMv3mAqJwIy/g==", "dependencies": { "tslib": "^2.3.0" }, @@ -1383,17 +1415,17 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.1.5" + "@angular/core": "21.1.6" } }, "node_modules/@angular/build": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.1.4.tgz", - "integrity": "sha512-7CAAQPWFMMqod40ox5MOVB/CnoBXFDehyQhs0hls6lu7bOy/M0EDy0v6bERkyNGRz1mihWWBiCV8XzEinrlq1A==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.1.5.tgz", + "integrity": "sha512-v2eDinWKlSKuk5pyMMY8j5TMFW8HA9B1l13TrDDpxsRGAAzekg7TFNyuh1x9Y6Rq4Vn+8/8pCjMUPZigzWbMhQ==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2101.4", + "@angular-devkit/architect": "0.2101.5", "@babel/core": "7.28.5", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", @@ -1436,7 +1468,7 @@ "@angular/platform-browser": "^21.0.0", "@angular/platform-server": "^21.0.0", "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.1.4", + "@angular/ssr": "^21.1.5", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^21.0.0", @@ -1486,12 +1518,12 @@ } }, "node_modules/@angular/build/node_modules/@angular-devkit/architect": { - "version": "0.2101.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz", - "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==", + "version": "0.2101.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.5.tgz", + "integrity": "sha512-eTo6wWzUW5AyBBLTbaUTpBHhGbZhzteErtNGklWkhjicCr/soNH+2mVtvg8bqA8sNreYffK1VXKFsq5NyMh5qg==", "dev": true, "dependencies": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "rxjs": "7.8.2" }, "bin": { @@ -1504,12 +1536,12 @@ } }, "node_modules/@angular/build/node_modules/@angular-devkit/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz", - "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.5.tgz", + "integrity": "sha512-KUKbllHvHefkAbTBjWNpRPyrpBqecW+6HBBAR+XNbKBuFTHkG+gxtuwMXNsvO5KECKwQphvQt5h3g05Xtaf0LQ==", "dev": true, "dependencies": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.3", @@ -1530,6 +1562,22 @@ } } }, + "node_modules/@angular/build/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@angular/build/node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", @@ -1587,9 +1635,9 @@ } }, "node_modules/@angular/cdk": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.1.5.tgz", - "integrity": "sha512-AlQPgqe3LLwXCyrDwYSX3m/WKnl2ppCMW7Gb+7bJpIcpMdWYEpSOSQF318jXGYIysKg43YbdJ1tWhJWY/cbn3w==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.1.6.tgz", + "integrity": "sha512-a6isY8eWxfRO99KPs8GLMQRDE06diNbPmD9tcYi+EWxjPFOZ88QJmMN8a0yja+LDQaG2kRbNBLjYUEro3qCpTQ==", "dependencies": { "parse5": "^8.0.0", "tslib": "^2.3.0" @@ -1626,17 +1674,17 @@ } }, "node_modules/@angular/cli": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.1.4.tgz", - "integrity": "sha512-XsMHgxTvHGiXXrhYZz3zMZYhYU0gHdpoHKGiEKXwcx+S1KoYbIssyg6oF2Kq49ZaE0OYCTKjnvgDce6ZqdkJ/A==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.1.5.tgz", + "integrity": "sha512-ljqvAzSk8FKMaYW/aZhR+SXjudbQViYYkMlJvJUClGpokjDM9KfJWPX+QZfr2J+piW5yaaHmFaIMddO9QxkUDQ==", "dependencies": { - "@angular-devkit/architect": "0.2101.4", - "@angular-devkit/core": "21.1.4", - "@angular-devkit/schematics": "21.1.4", + "@angular-devkit/architect": "0.2101.5", + "@angular-devkit/core": "21.1.5", + "@angular-devkit/schematics": "21.1.5", "@inquirer/prompts": "7.10.1", "@listr2/prompt-adapter-inquirer": "3.0.5", "@modelcontextprotocol/sdk": "1.26.0", - "@schematics/angular": "21.1.4", + "@schematics/angular": "21.1.5", "@yarnpkg/lockfile": "1.1.0", "algoliasearch": "5.46.2", "ini": "6.0.0", @@ -1660,11 +1708,11 @@ } }, "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { - "version": "0.2101.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz", - "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==", + "version": "0.2101.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.5.tgz", + "integrity": "sha512-eTo6wWzUW5AyBBLTbaUTpBHhGbZhzteErtNGklWkhjicCr/soNH+2mVtvg8bqA8sNreYffK1VXKFsq5NyMh5qg==", "dependencies": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "rxjs": "7.8.2" }, "bin": { @@ -1677,11 +1725,11 @@ } }, "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz", - "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.5.tgz", + "integrity": "sha512-KUKbllHvHefkAbTBjWNpRPyrpBqecW+6HBBAR+XNbKBuFTHkG+gxtuwMXNsvO5KECKwQphvQt5h3g05Xtaf0LQ==", "dependencies": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.3", @@ -1703,11 +1751,11 @@ } }, "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.4.tgz", - "integrity": "sha512-Nqq0ioCUxrbEX+L4KOarETcZZJNnJ1mAJ0ubO4VM91qnn8RBBM9SnQ91590TfC34Szk/wh+3+Uj6KUvTJNuegQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.5.tgz", + "integrity": "sha512-CGmoorQL5+mVCJEHwHWOrhSd1hFxB3h66i9wUDizJAEQUM3mSml5SiglHArpWY/G4GmFwi6XVe+Jm3U8J/mcFg==", "dependencies": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "jsonc-parser": "3.3.1", "magic-string": "0.30.21", "ora": "9.0.0", @@ -1719,6 +1767,21 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular/cli/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@angular/cli/node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", @@ -1948,9 +2011,9 @@ } }, "node_modules/@angular/common": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.5.tgz", - "integrity": "sha512-olO2F0b+H8YBfsuQFEwo9Hjf+B714xGcttDW37+4jnY2IRS2uYeMu2RGIpY7ps+0uZ017c4iK3CCgSPBgmbTcA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.6.tgz", + "integrity": "sha512-qEfwyJhebl2tHwFhKHE/ZzsCLMWnQ0u/UDS23KUA4tTWaOKH8Usu7DS1B3KnUravII8R6ZpYn86L+B903v9WxA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1958,14 +2021,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.1.5", + "@angular/core": "21.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.5.tgz", - "integrity": "sha512-yRUdWlL+AWcTL4d7zD0jkNqsjvxXpWEihvOfD2gc65DO0+E80DsWIpHq9A8yWeLukbfLcmBGI2QbfW9+SXAlvg==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.6.tgz", + "integrity": "sha512-8RFdfbWTyx+OiRkiK2LsYPuhv8b65S3x/4+98kZRCrzP6YNjq/qsuqpfMUIKwnjok78FfhGyEx4I5LOV3Vkabw==", "dependencies": { "tslib": "^2.3.0" }, @@ -1974,9 +2037,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.5.tgz", - "integrity": "sha512-i2r2bQuWdjjFGTd2TA7FtCWNx5yJ3BMoyTGUC9lzSfmxWAfcH/NWR+6OdaEVwv6Zap3IXYYxs8S+REkx954EwA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.6.tgz", + "integrity": "sha512-0JU2cBDMSB4hU4KwDS2ThrkGh+Njf8Yfm11CKR0NWbHGwW1xHa7whlcpUzX/USqL+FNGXQ75R0fOcZrT86YvrA==", "dependencies": { "@babel/core": "7.28.5", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -1995,7 +2058,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.1.5", + "@angular/compiler": "21.1.6", "typescript": ">=5.9 <6.0" }, "peerDependenciesMeta": { @@ -2152,9 +2215,9 @@ } }, "node_modules/@angular/core": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.5.tgz", - "integrity": "sha512-m61YHiyE+SIvS8UXcFLjYCucv6ShJJCwz9xxEk7ysYW9wOtHdfIf9tgyOsucZDAvrvpSyQLRj5jGBCGm1VIvXA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.6.tgz", + "integrity": "sha512-c+n9Ynq1Ar+4SOaL10C/arqBje0dUFFUaDyErXp3jPXU/L29fsFTlmKM2EWunM1RhJckYonJ/xtH0gwwrH6W9Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -2162,7 +2225,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.1.5", + "@angular/compiler": "21.1.6", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, @@ -2176,9 +2239,9 @@ } }, "node_modules/@angular/elements": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.1.5.tgz", - "integrity": "sha512-SoXNNLEBn9w3NP5vZJiMQfdiJ1FLY0VuDP5VvscPVqebh/nfpDw7jOu8Pb2S9wTANsfmlFX4QK1ehl3nJVY/Fw==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.1.6.tgz", + "integrity": "sha512-LvF0kgh1XxLlXyw5CS5C787HYFAIGVHAg9HNgGZKINeu16Og7KCnsVszAyWiVn1t3trcLARcScYgrOcuwBYzIg==", "dependencies": { "tslib": "^2.3.0" }, @@ -2186,14 +2249,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.1.5", + "@angular/core": "21.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/forms": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.5.tgz", - "integrity": "sha512-Z8Vcgz5KYlCobRxLjyGGUBv0mA4nusuiD36GqYRn3sR780TLDcPFVwTCwVEWLdwID64oiHXG+x9jjU/Z3HzR6A==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.6.tgz", + "integrity": "sha512-Bw3nVDWihGUGyys7oq2zdJ2MjvJvU1x1WaExYmp3rKU3S7rQXGq6IxY8bopTtHirTANrY2KUEnJ2IlK+xVg9OA==", "dependencies": { "@standard-schema/spec": "^1.0.0", "tslib": "^2.3.0" @@ -2202,25 +2265,25 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.1.5", - "@angular/core": "21.1.5", - "@angular/platform-browser": "21.1.5", + "@angular/common": "21.1.6", + "@angular/core": "21.1.6", + "@angular/platform-browser": "21.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.5.tgz", - "integrity": "sha512-/MiXx/peMBjMHEX6Gm7C6ZHOlcgEzkWeBlI7WWnIEDU9vU6F3nU4kauBYdLr/EpXhHpdpOtL4eknPhAfdvVrJA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.6.tgz", + "integrity": "sha512-I2gYI9cKP/B/rUz8WVaWNpuULSdq4W+ZUm6YQyUXdGEh3dDEssK1xLucPBfUT7RAr6h7+w5/RS+zKWC1q9g24w==", "dev": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@angular/platform-browser": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.5.tgz", - "integrity": "sha512-rAN0cu05Pg7HHe9JMRd3g5JyyVCeFW8QiB/jG6klUrOTF4QzyCbmwlm7MX0uTx3CWAZraWCGbdahUkLyYtuqFA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.6.tgz", + "integrity": "sha512-im6aNcgYdIYIVW2262ATkC39WUmhc+KVNVKwKtO5jlOsq9TWmxT1/esncEAlokMe5os6eeb/Ga4D6Ghj0gj4Ig==", "dependencies": { "tslib": "^2.3.0" }, @@ -2228,9 +2291,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "21.1.5", - "@angular/common": "21.1.5", - "@angular/core": "21.1.5" + "@angular/animations": "21.1.6", + "@angular/common": "21.1.6", + "@angular/core": "21.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -2239,9 +2302,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.5.tgz", - "integrity": "sha512-Pd8nPbJSIONnze1WS9wLBAtaFw4TYIH+ZGjKHS9G1E9l09tDWtHWyB7dY82Sc//Nc8iR4V7dcsbUmFjOJHThww==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.6.tgz", + "integrity": "sha512-lVtHkhK/jnrGdX+4S8ItfMO+5buHAU9NMHeDq+QqalnXznMaC7Qd4BPLcRWW4QAI177zG0NE1Bet5cjO75N9+w==", "dependencies": { "tslib": "^2.3.0" }, @@ -2249,16 +2312,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.1.5", - "@angular/compiler": "21.1.5", - "@angular/core": "21.1.5", - "@angular/platform-browser": "21.1.5" + "@angular/common": "21.1.6", + "@angular/compiler": "21.1.6", + "@angular/core": "21.1.6", + "@angular/platform-browser": "21.1.6" } }, "node_modules/@angular/router": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.5.tgz", - "integrity": "sha512-OjFn6Nw51CU712CMbl2U9TxlCkzOmjMLYPAfnV4+RdG7o+/eOS2nV0oapJ88RNCw7Yl04PA1amc3ql3agDFd4A==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.6.tgz", + "integrity": "sha512-JJn0gfeRks2czbeLmtxxjIlmKtOmjYi3yAaoAwiwpbfVHPLJeJ32axLJREAU0dBkThF8YD+r18uEJ9UrvkqrtA==", "dependencies": { "tslib": "^2.3.0" }, @@ -2266,9 +2329,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.1.5", - "@angular/core": "21.1.5", - "@angular/platform-browser": "21.1.5", + "@angular/common": "21.1.6", + "@angular/core": "21.1.6", + "@angular/platform-browser": "21.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -7046,9 +7109,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.1.4.tgz", - "integrity": "sha512-CgKnMofIVGTwNPqFNZmkmr2aLOFUG/AKm8lauXU+juwSaY7Z28eguFd+J42uVUOnasLxINQY9y7kr9f6deTrcg==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.1.5.tgz", + "integrity": "sha512-5nG9v/nEzsaKxgw5NurM6tPKPw0OYsCM3DL4ZI8+TidT55hYbsroTnyBcHBouJ1qlZlQXNtlsjsjBmBDtF7JZA==", "dev": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -8320,12 +8383,12 @@ "dev": true }, "node_modules/@schematics/angular": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.4.tgz", - "integrity": "sha512-I1zdSNzdbrVCWpeE2NsZQmIoa9m0nlw4INgdGIkqUH6FgwvoGKC0RoOxKAmm6HHVJ48FE/sPI13dwAeK89ow5A==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.5.tgz", + "integrity": "sha512-AndJ17ePYUoqJqiIF9VaXbGAFfOqDcHuAxhwozsQlWDzwgQSOUC/WWeG9hKVCgMD6tE02Sxr2ova9DiBKsLQNg==", "dependencies": { - "@angular-devkit/core": "21.1.4", - "@angular-devkit/schematics": "21.1.4", + "@angular-devkit/core": "21.1.5", + "@angular-devkit/schematics": "21.1.5", "jsonc-parser": "3.3.1" }, "engines": { @@ -8335,11 +8398,11 @@ } }, "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz", - "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.5.tgz", + "integrity": "sha512-KUKbllHvHefkAbTBjWNpRPyrpBqecW+6HBBAR+XNbKBuFTHkG+gxtuwMXNsvO5KECKwQphvQt5h3g05Xtaf0LQ==", "dependencies": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.3", @@ -8361,11 +8424,11 @@ } }, "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.4.tgz", - "integrity": "sha512-Nqq0ioCUxrbEX+L4KOarETcZZJNnJ1mAJ0ubO4VM91qnn8RBBM9SnQ91590TfC34Szk/wh+3+Uj6KUvTJNuegQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.5.tgz", + "integrity": "sha512-CGmoorQL5+mVCJEHwHWOrhSd1hFxB3h66i9wUDizJAEQUM3mSml5SiglHArpWY/G4GmFwi6XVe+Jm3U8J/mcFg==", "dependencies": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "jsonc-parser": "3.3.1", "magic-string": "0.30.21", "ora": "9.0.0", @@ -8377,6 +8440,21 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@schematics/angular/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@schematics/angular/node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", @@ -8498,11 +8576,11 @@ } }, "node_modules/@schematics/angular/node_modules/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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -26108,16 +26186,16 @@ } }, "@angular-devkit/build-angular": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.1.4.tgz", - "integrity": "sha512-2HPCo6vEu5EIwxxFYhnmdfbktRBoOVQD3q7lG9PMQPf/jRCnyIZ70qSbXbAV96IMDLFl8mLRfY4scoaFMIYGMw==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.1.5.tgz", + "integrity": "sha512-B2jOBAiVl+hA3PLwpxfrbW/gA7SDu9Uv+hQwHYrdwL2XXDVwaQ+c3z9BS3yJDQTkb/TrAJ0sfa2zVLC4b/rHzg==", "dev": true, "requires": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2101.4", - "@angular-devkit/build-webpack": "0.2101.4", - "@angular-devkit/core": "21.1.4", - "@angular/build": "21.1.4", + "@angular-devkit/architect": "0.2101.5", + "@angular-devkit/build-webpack": "0.2101.5", + "@angular-devkit/core": "21.1.5", + "@angular/build": "21.1.5", "@babel/core": "7.28.5", "@babel/generator": "7.28.5", "@babel/helper-annotate-as-pure": "7.27.3", @@ -26128,7 +26206,7 @@ "@babel/preset-env": "7.28.5", "@babel/runtime": "7.28.4", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "21.1.4", + "@ngtools/webpack": "21.1.5", "ansi-colors": "4.1.3", "autoprefixer": "10.4.23", "babel-loader": "10.0.0", @@ -26171,22 +26249,22 @@ }, "dependencies": { "@angular-devkit/architect": { - "version": "0.2101.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz", - "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==", + "version": "0.2101.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.5.tgz", + "integrity": "sha512-eTo6wWzUW5AyBBLTbaUTpBHhGbZhzteErtNGklWkhjicCr/soNH+2mVtvg8bqA8sNreYffK1VXKFsq5NyMh5qg==", "dev": true, "requires": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "rxjs": "7.8.2" } }, "@angular-devkit/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz", - "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.5.tgz", + "integrity": "sha512-KUKbllHvHefkAbTBjWNpRPyrpBqecW+6HBBAR+XNbKBuFTHkG+gxtuwMXNsvO5KECKwQphvQt5h3g05Xtaf0LQ==", "dev": true, "requires": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.3", @@ -26200,6 +26278,18 @@ "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true }, + "ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "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", @@ -26328,32 +26418,32 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.2101.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2101.4.tgz", - "integrity": "sha512-lPjPxeEzUha4bnlGzD3KFFf3yxcQjOfV9wwZIa4XLsqjCZsUk95TzHQH7i64OCTw9uKTEQkJBAuO6v2WXHxopw==", + "version": "0.2101.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2101.5.tgz", + "integrity": "sha512-G3mvUXiSU3DL1QKngq/yXT94Wr+IdqtOM/1VC3NmsV9KX3OSfwfc560dmhY1efqc9gBA5qL+7kLlgV7Kx/Su3A==", "dev": true, "requires": { - "@angular-devkit/architect": "0.2101.4", + "@angular-devkit/architect": "0.2101.5", "rxjs": "7.8.2" }, "dependencies": { "@angular-devkit/architect": { - "version": "0.2101.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz", - "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==", + "version": "0.2101.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.5.tgz", + "integrity": "sha512-eTo6wWzUW5AyBBLTbaUTpBHhGbZhzteErtNGklWkhjicCr/soNH+2mVtvg8bqA8sNreYffK1VXKFsq5NyMh5qg==", "dev": true, "requires": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "rxjs": "7.8.2" } }, "@angular-devkit/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz", - "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.5.tgz", + "integrity": "sha512-KUKbllHvHefkAbTBjWNpRPyrpBqecW+6HBBAR+XNbKBuFTHkG+gxtuwMXNsvO5KECKwQphvQt5h3g05Xtaf0LQ==", "dev": true, "requires": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.3", @@ -26361,6 +26451,18 @@ "source-map": "0.7.6" } }, + "ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "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", @@ -26546,21 +26648,21 @@ } }, "@angular/animations": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.5.tgz", - "integrity": "sha512-gsqHX8lCYV8cgVtHs0iLwrX8SVlmcjUF44l/xCc/jBC/TeKWRl2e6Jqrn1Wcd0NDlGiNsm+mYNyqMyy5/I7kjw==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.6.tgz", + "integrity": "sha512-Ft8B0tHBRyd7ORpbaa2S0yRqHSdsyMH6oot7ODAA3kv03k4GTwp74U6Y/NyV4JoZ+lr28+EV4YMv3mAqJwIy/g==", "requires": { "tslib": "^2.3.0" } }, "@angular/build": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.1.4.tgz", - "integrity": "sha512-7CAAQPWFMMqod40ox5MOVB/CnoBXFDehyQhs0hls6lu7bOy/M0EDy0v6bERkyNGRz1mihWWBiCV8XzEinrlq1A==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.1.5.tgz", + "integrity": "sha512-v2eDinWKlSKuk5pyMMY8j5TMFW8HA9B1l13TrDDpxsRGAAzekg7TFNyuh1x9Y6Rq4Vn+8/8pCjMUPZigzWbMhQ==", "dev": true, "requires": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2101.4", + "@angular-devkit/architect": "0.2101.5", "@babel/core": "7.28.5", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", @@ -26590,22 +26692,22 @@ }, "dependencies": { "@angular-devkit/architect": { - "version": "0.2101.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz", - "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==", + "version": "0.2101.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.5.tgz", + "integrity": "sha512-eTo6wWzUW5AyBBLTbaUTpBHhGbZhzteErtNGklWkhjicCr/soNH+2mVtvg8bqA8sNreYffK1VXKFsq5NyMh5qg==", "dev": true, "requires": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "rxjs": "7.8.2" } }, "@angular-devkit/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz", - "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.5.tgz", + "integrity": "sha512-KUKbllHvHefkAbTBjWNpRPyrpBqecW+6HBBAR+XNbKBuFTHkG+gxtuwMXNsvO5KECKwQphvQt5h3g05Xtaf0LQ==", "dev": true, "requires": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.3", @@ -26613,6 +26715,18 @@ "source-map": "0.7.6" } }, + "ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "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", @@ -26653,9 +26767,9 @@ } }, "@angular/cdk": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.1.5.tgz", - "integrity": "sha512-AlQPgqe3LLwXCyrDwYSX3m/WKnl2ppCMW7Gb+7bJpIcpMdWYEpSOSQF318jXGYIysKg43YbdJ1tWhJWY/cbn3w==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.1.6.tgz", + "integrity": "sha512-a6isY8eWxfRO99KPs8GLMQRDE06diNbPmD9tcYi+EWxjPFOZ88QJmMN8a0yja+LDQaG2kRbNBLjYUEro3qCpTQ==", "requires": { "parse5": "^8.0.0", "tslib": "^2.3.0" @@ -26677,17 +26791,17 @@ } }, "@angular/cli": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.1.4.tgz", - "integrity": "sha512-XsMHgxTvHGiXXrhYZz3zMZYhYU0gHdpoHKGiEKXwcx+S1KoYbIssyg6oF2Kq49ZaE0OYCTKjnvgDce6ZqdkJ/A==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.1.5.tgz", + "integrity": "sha512-ljqvAzSk8FKMaYW/aZhR+SXjudbQViYYkMlJvJUClGpokjDM9KfJWPX+QZfr2J+piW5yaaHmFaIMddO9QxkUDQ==", "requires": { - "@angular-devkit/architect": "0.2101.4", - "@angular-devkit/core": "21.1.4", - "@angular-devkit/schematics": "21.1.4", + "@angular-devkit/architect": "0.2101.5", + "@angular-devkit/core": "21.1.5", + "@angular-devkit/schematics": "21.1.5", "@inquirer/prompts": "7.10.1", "@listr2/prompt-adapter-inquirer": "3.0.5", "@modelcontextprotocol/sdk": "1.26.0", - "@schematics/angular": "21.1.4", + "@schematics/angular": "21.1.5", "@yarnpkg/lockfile": "1.1.0", "algoliasearch": "5.46.2", "ini": "6.0.0", @@ -26703,20 +26817,20 @@ }, "dependencies": { "@angular-devkit/architect": { - "version": "0.2101.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz", - "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==", + "version": "0.2101.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.5.tgz", + "integrity": "sha512-eTo6wWzUW5AyBBLTbaUTpBHhGbZhzteErtNGklWkhjicCr/soNH+2mVtvg8bqA8sNreYffK1VXKFsq5NyMh5qg==", "requires": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "rxjs": "7.8.2" } }, "@angular-devkit/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz", - "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.5.tgz", + "integrity": "sha512-KUKbllHvHefkAbTBjWNpRPyrpBqecW+6HBBAR+XNbKBuFTHkG+gxtuwMXNsvO5KECKwQphvQt5h3g05Xtaf0LQ==", "requires": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.3", @@ -26725,17 +26839,28 @@ } }, "@angular-devkit/schematics": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.4.tgz", - "integrity": "sha512-Nqq0ioCUxrbEX+L4KOarETcZZJNnJ1mAJ0ubO4VM91qnn8RBBM9SnQ91590TfC34Szk/wh+3+Uj6KUvTJNuegQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.5.tgz", + "integrity": "sha512-CGmoorQL5+mVCJEHwHWOrhSd1hFxB3h66i9wUDizJAEQUM3mSml5SiglHArpWY/G4GmFwi6XVe+Jm3U8J/mcFg==", "requires": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "jsonc-parser": "3.3.1", "magic-string": "0.30.21", "ora": "9.0.0", "rxjs": "7.8.2" } }, + "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", @@ -26877,25 +27002,25 @@ } }, "@angular/common": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.5.tgz", - "integrity": "sha512-olO2F0b+H8YBfsuQFEwo9Hjf+B714xGcttDW37+4jnY2IRS2uYeMu2RGIpY7ps+0uZ017c4iK3CCgSPBgmbTcA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.6.tgz", + "integrity": "sha512-qEfwyJhebl2tHwFhKHE/ZzsCLMWnQ0u/UDS23KUA4tTWaOKH8Usu7DS1B3KnUravII8R6ZpYn86L+B903v9WxA==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.5.tgz", - "integrity": "sha512-yRUdWlL+AWcTL4d7zD0jkNqsjvxXpWEihvOfD2gc65DO0+E80DsWIpHq9A8yWeLukbfLcmBGI2QbfW9+SXAlvg==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.6.tgz", + "integrity": "sha512-8RFdfbWTyx+OiRkiK2LsYPuhv8b65S3x/4+98kZRCrzP6YNjq/qsuqpfMUIKwnjok78FfhGyEx4I5LOV3Vkabw==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.5.tgz", - "integrity": "sha512-i2r2bQuWdjjFGTd2TA7FtCWNx5yJ3BMoyTGUC9lzSfmxWAfcH/NWR+6OdaEVwv6Zap3IXYYxs8S+REkx954EwA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.6.tgz", + "integrity": "sha512-0JU2cBDMSB4hU4KwDS2ThrkGh+Njf8Yfm11CKR0NWbHGwW1xHa7whlcpUzX/USqL+FNGXQ75R0fOcZrT86YvrA==", "requires": { "@babel/core": "7.28.5", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -26994,56 +27119,56 @@ } }, "@angular/core": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.5.tgz", - "integrity": "sha512-m61YHiyE+SIvS8UXcFLjYCucv6ShJJCwz9xxEk7ysYW9wOtHdfIf9tgyOsucZDAvrvpSyQLRj5jGBCGm1VIvXA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.6.tgz", + "integrity": "sha512-c+n9Ynq1Ar+4SOaL10C/arqBje0dUFFUaDyErXp3jPXU/L29fsFTlmKM2EWunM1RhJckYonJ/xtH0gwwrH6W9Q==", "requires": { "tslib": "^2.3.0" } }, "@angular/elements": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.1.5.tgz", - "integrity": "sha512-SoXNNLEBn9w3NP5vZJiMQfdiJ1FLY0VuDP5VvscPVqebh/nfpDw7jOu8Pb2S9wTANsfmlFX4QK1ehl3nJVY/Fw==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.1.6.tgz", + "integrity": "sha512-LvF0kgh1XxLlXyw5CS5C787HYFAIGVHAg9HNgGZKINeu16Og7KCnsVszAyWiVn1t3trcLARcScYgrOcuwBYzIg==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.5.tgz", - "integrity": "sha512-Z8Vcgz5KYlCobRxLjyGGUBv0mA4nusuiD36GqYRn3sR780TLDcPFVwTCwVEWLdwID64oiHXG+x9jjU/Z3HzR6A==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.6.tgz", + "integrity": "sha512-Bw3nVDWihGUGyys7oq2zdJ2MjvJvU1x1WaExYmp3rKU3S7rQXGq6IxY8bopTtHirTANrY2KUEnJ2IlK+xVg9OA==", "requires": { "@standard-schema/spec": "^1.0.0", "tslib": "^2.3.0" } }, "@angular/language-service": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.5.tgz", - "integrity": "sha512-/MiXx/peMBjMHEX6Gm7C6ZHOlcgEzkWeBlI7WWnIEDU9vU6F3nU4kauBYdLr/EpXhHpdpOtL4eknPhAfdvVrJA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.6.tgz", + "integrity": "sha512-I2gYI9cKP/B/rUz8WVaWNpuULSdq4W+ZUm6YQyUXdGEh3dDEssK1xLucPBfUT7RAr6h7+w5/RS+zKWC1q9g24w==", "dev": true }, "@angular/platform-browser": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.5.tgz", - "integrity": "sha512-rAN0cu05Pg7HHe9JMRd3g5JyyVCeFW8QiB/jG6klUrOTF4QzyCbmwlm7MX0uTx3CWAZraWCGbdahUkLyYtuqFA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.6.tgz", + "integrity": "sha512-im6aNcgYdIYIVW2262ATkC39WUmhc+KVNVKwKtO5jlOsq9TWmxT1/esncEAlokMe5os6eeb/Ga4D6Ghj0gj4Ig==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.5.tgz", - "integrity": "sha512-Pd8nPbJSIONnze1WS9wLBAtaFw4TYIH+ZGjKHS9G1E9l09tDWtHWyB7dY82Sc//Nc8iR4V7dcsbUmFjOJHThww==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.6.tgz", + "integrity": "sha512-lVtHkhK/jnrGdX+4S8ItfMO+5buHAU9NMHeDq+QqalnXznMaC7Qd4BPLcRWW4QAI177zG0NE1Bet5cjO75N9+w==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "21.1.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.5.tgz", - "integrity": "sha512-OjFn6Nw51CU712CMbl2U9TxlCkzOmjMLYPAfnV4+RdG7o+/eOS2nV0oapJ88RNCw7Yl04PA1amc3ql3agDFd4A==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.6.tgz", + "integrity": "sha512-JJn0gfeRks2czbeLmtxxjIlmKtOmjYi3yAaoAwiwpbfVHPLJeJ32axLJREAU0dBkThF8YD+r18uEJ9UrvkqrtA==", "requires": { "tslib": "^2.3.0" } @@ -30015,9 +30140,9 @@ } }, "@ngtools/webpack": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.1.4.tgz", - "integrity": "sha512-CgKnMofIVGTwNPqFNZmkmr2aLOFUG/AKm8lauXU+juwSaY7Z28eguFd+J42uVUOnasLxINQY9y7kr9f6deTrcg==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.1.5.tgz", + "integrity": "sha512-5nG9v/nEzsaKxgw5NurM6tPKPw0OYsCM3DL4ZI8+TidT55hYbsroTnyBcHBouJ1qlZlQXNtlsjsjBmBDtF7JZA==", "dev": true }, "@npmcli/agent": { @@ -30709,21 +30834,21 @@ "dev": true }, "@schematics/angular": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.4.tgz", - "integrity": "sha512-I1zdSNzdbrVCWpeE2NsZQmIoa9m0nlw4INgdGIkqUH6FgwvoGKC0RoOxKAmm6HHVJ48FE/sPI13dwAeK89ow5A==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.5.tgz", + "integrity": "sha512-AndJ17ePYUoqJqiIF9VaXbGAFfOqDcHuAxhwozsQlWDzwgQSOUC/WWeG9hKVCgMD6tE02Sxr2ova9DiBKsLQNg==", "requires": { - "@angular-devkit/core": "21.1.4", - "@angular-devkit/schematics": "21.1.4", + "@angular-devkit/core": "21.1.5", + "@angular-devkit/schematics": "21.1.5", "jsonc-parser": "3.3.1" }, "dependencies": { "@angular-devkit/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz", - "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.5.tgz", + "integrity": "sha512-KUKbllHvHefkAbTBjWNpRPyrpBqecW+6HBBAR+XNbKBuFTHkG+gxtuwMXNsvO5KECKwQphvQt5h3g05Xtaf0LQ==", "requires": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.3", @@ -30732,17 +30857,28 @@ } }, "@angular-devkit/schematics": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.4.tgz", - "integrity": "sha512-Nqq0ioCUxrbEX+L4KOarETcZZJNnJ1mAJ0ubO4VM91qnn8RBBM9SnQ91590TfC34Szk/wh+3+Uj6KUvTJNuegQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.5.tgz", + "integrity": "sha512-CGmoorQL5+mVCJEHwHWOrhSd1hFxB3h66i9wUDizJAEQUM3mSml5SiglHArpWY/G4GmFwi6XVe+Jm3U8J/mcFg==", "requires": { - "@angular-devkit/core": "21.1.4", + "@angular-devkit/core": "21.1.5", "jsonc-parser": "3.3.1", "magic-string": "0.30.21", "ora": "9.0.0", "rxjs": "7.8.2" } }, + "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", @@ -30814,11 +30950,11 @@ } }, "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==", + "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.0.1" + "ansi-regex": "^6.2.2" } } } diff --git a/frontend/package.json b/frontend/package.json index 2b7b3af5b94..4965ebf445b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,13 +6,13 @@ "private": true, "devDependencies": { "@angular-builders/custom-esbuild": "^21.0.3", - "@angular-devkit/build-angular": "^21.1.4", + "@angular-devkit/build-angular": "^21.1.5", "@angular-eslint/builder": "20.7.0", "@angular-eslint/eslint-plugin": "20.7.0", "@angular-eslint/eslint-plugin-template": "20.7.0", "@angular-eslint/schematics": "20.7.0", "@angular-eslint/template-parser": "20.7.0", - "@angular/language-service": "21.1.5", + "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", "@html-eslint/eslint-plugin": "^0.54.2", "@html-eslint/parser": "^0.54.0", @@ -64,18 +64,18 @@ "wscat": "^6.1.0" }, "dependencies": { - "@angular/animations": "^21.1.5", - "@angular/cdk": "^21.1.5", - "@angular/cli": "^21.1.4", - "@angular/common": "^21.1.5", - "@angular/compiler": "^21.1.5", - "@angular/compiler-cli": "^21.1.5", - "@angular/core": "^21.1.5", - "@angular/elements": "^21.1.5", - "@angular/forms": "^21.1.5", - "@angular/platform-browser": "^21.1.5", - "@angular/platform-browser-dynamic": "^21.1.5", - "@angular/router": "^21.1.5", + "@angular/animations": "^21.1.6", + "@angular/cdk": "^21.1.6", + "@angular/cli": "^21.1.5", + "@angular/common": "^21.1.6", + "@angular/compiler": "^21.1.6", + "@angular/compiler-cli": "^21.1.6", + "@angular/core": "^21.1.6", + "@angular/elements": "^21.1.6", + "@angular/forms": "^21.1.6", + "@angular/platform-browser": "^21.1.6", + "@angular/platform-browser-dynamic": "^21.1.6", + "@angular/router": "^21.1.6", "@appsignal/javascript": "^1.6.1", "@appsignal/plugin-breadcrumbs-console": "^1.1.37", "@appsignal/plugin-breadcrumbs-network": "^1.1.24", From bbf981921997ec53d1cb4d61aae60729fd573cda Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 3 Mar 2026 15:20:50 +0200 Subject: [PATCH 090/334] Add Anna to the AllowList --- .github/workflows/cla.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 70eca33f120..1d08e2c6a6b 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -41,6 +41,7 @@ jobs: NobodysNightmare, RobinWagner, akabiru, + anna-mohn, as-op, astock2, ba1ash, From 6e6073cc133584d59395d5d670b4f2615d67525d Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 3 Mar 2026 15:25:47 +0200 Subject: [PATCH 091/334] Fix indentation rubocop issue --- .../app/services/recurring_meetings/update_service.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/meeting/app/services/recurring_meetings/update_service.rb b/modules/meeting/app/services/recurring_meetings/update_service.rb index ea2dd48f60e..9f8db456784 100644 --- a/modules/meeting/app/services/recurring_meetings/update_service.rb +++ b/modules/meeting/app/services/recurring_meetings/update_service.rb @@ -162,10 +162,10 @@ module RecurringMeetings return if new_title == @old_title recurring_meeting - .scheduled_instances(upcoming: true) - .instantiated - .each do |scheduled| - scheduled.meeting.update_column(:title, new_title) + .scheduled_instances(upcoming: true) + .instantiated + .each do |scheduled| + scheduled.meeting.update_column(:title, new_title) end end From 9352da7a9ad756f13f02fd80cffc7a666384ee8b Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:44:51 +0200 Subject: [PATCH 092/334] [#71253] Migrate and rework Sprint permissions https://community.openproject.org/work_packages/71253 --- ...0212145213_migrate_backlogs_permissions.rb | 43 ++++++ .../backlogs/backlog_menu_component.html.erb | 8 +- modules/backlogs/app/seeders/common.yml | 8 +- .../views/rb_master_backlogs/_list.html.erb | 2 +- .../lib/open_project/backlogs/engine.rb | 62 ++++---- .../backlogs/backlog_menu_component_spec.rb | 34 ++--- .../features/backlogs/context_menu_spec.rb | 7 +- .../features/backlogs/create_story_spec.rb | 2 +- .../features/backlogs_in_backlog_view_spec.rb | 5 +- .../spec/features/empty_backlogs_spec.rb | 2 +- .../spec/features/impediments_spec.rb | 2 +- .../spec/features/resolved_status_spec.rb | 2 +- .../spec/features/stories_in_backlog_spec.rb | 3 +- .../spec/features/tasks_on_taskboard_spec.rb | 2 +- .../rb_master_backlogs/index.html.erb_spec.rb | 2 +- .../migrate_backlogs_permissions_spec.rb | 142 ++++++++++++++++++ 16 files changed, 252 insertions(+), 74 deletions(-) create mode 100644 db/migrate/20260212145213_migrate_backlogs_permissions.rb create mode 100644 spec/migrations/migrate_backlogs_permissions_spec.rb diff --git a/db/migrate/20260212145213_migrate_backlogs_permissions.rb b/db/migrate/20260212145213_migrate_backlogs_permissions.rb new file mode 100644 index 00000000000..70f71f3fb44 --- /dev/null +++ b/db/migrate/20260212145213_migrate_backlogs_permissions.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require Rails.root.join("db/migrate/migration_utils/permission_renamer") +require Rails.root.join("db/migrate/migration_utils/permission_adder") + +class MigrateBacklogsPermissions < ActiveRecord::Migration[8.1] + def up + ::Migration::MigrationUtils::PermissionRenamer.rename("view_master_backlog", "view_sprints") + + ::Migration::MigrationUtils::PermissionAdder.add(:view_taskboards, :view_sprints) + RolePermission.delete_by(permission: "view_taskboards") + + ::Migration::MigrationUtils::PermissionAdder.add(:manage_versions, :create_sprints) + ::Migration::MigrationUtils::PermissionAdder.add(:select_done_statuses, :create_sprints) + ::Migration::MigrationUtils::PermissionAdder.add(:update_sprints, :create_sprints) + + RolePermission.delete_by(permission: %w(update_sprints select_done_statuses)) + + ::Migration::MigrationUtils::PermissionAdder.add(:assign_versions, :manage_sprint_items) + ::Migration::MigrationUtils::PermissionAdder.add(:add_work_packages, :manage_sprint_items) + ::Migration::MigrationUtils::PermissionAdder.add(:edit_work_packages, :manage_sprint_items) + + RolePermission.delete_by(permission: %w(assign_versions)) + end + + def down + ::Migration::MigrationUtils::PermissionAdder.add(:view_sprints, :view_taskboards, force: true) + ::Migration::MigrationUtils::PermissionRenamer.rename("view_sprints", "view_master_backlog") + + # Note: Some roles might receive extra permissions on the way down because, + # we need to add back all the roles that have been merged on the way up. + ::Migration::MigrationUtils::PermissionAdder.add(:create_sprints, :manage_versions) + ::Migration::MigrationUtils::PermissionAdder.add(:create_sprints, :select_done_statuses, force: true) + ::Migration::MigrationUtils::PermissionAdder.add(:create_sprints, :update_sprints, force: true) + + ::Migration::MigrationUtils::PermissionAdder.add(:manage_sprint_items, :assign_versions) + ::Migration::MigrationUtils::PermissionAdder.add(:manage_sprint_items, :add_work_packages) + ::Migration::MigrationUtils::PermissionAdder.add(:manage_sprint_items, :edit_work_packages) + + # Remove new permissions that were added during up + RolePermission.delete_by(permission: %w(create_sprints manage_sprint_items)) + end +end diff --git a/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb b/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb index 78f56b0dba4..480e7132a1c 100644 --- a/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb @@ -36,7 +36,7 @@ See COPYRIGHT and LICENSE files for more details. tooltip_direction: :se ) - if user_allowed?(:update_sprints) + if user_allowed?(:create_sprints) menu.with_item( label: t(".action_menu.edit_sprint"), href: edit_name_backlogs_project_sprint_path(project, sprint), @@ -46,7 +46,7 @@ See COPYRIGHT and LICENSE files for more details. end end - if user_allowed?(:add_work_packages) + if user_allowed?(:manage_sprint_items) menu.with_item( label: t(".action_menu.new_story"), href: new_project_work_packages_dialog_path( @@ -60,7 +60,7 @@ See COPYRIGHT and LICENSE files for more details. end end - if user_allowed?(:update_sprints) || user_allowed?(:add_work_packages) + if user_allowed?(:create_sprints) || user_allowed?(:manage_sprint_items) menu.with_divider end @@ -73,7 +73,7 @@ See COPYRIGHT and LICENSE files for more details. end if backlog.sprint_backlog? - if user_allowed?(:view_taskboards) + if user_allowed?(:view_sprints) menu.with_item( label: t(".action_menu.task_board"), tag: :a, diff --git a/modules/backlogs/app/seeders/common.yml b/modules/backlogs/app/seeders/common.yml index 1a0213b5753..77d7e5d7b78 100644 --- a/modules/backlogs/app/seeders/common.yml +++ b/modules/backlogs/app/seeders/common.yml @@ -30,9 +30,9 @@ modules_permissions: backlogs: - role: :default_role_member add: - - :view_master_backlog - - :view_taskboards + - :view_sprints + - :create_sprints + - :manage_sprint_items - role: :default_role_reader add: - - :view_master_backlog - - :view_taskboards + - :view_sprints diff --git a/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb b/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb index 4295b3a50ac..636b3d4b36f 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb @@ -5,7 +5,7 @@ blankslate.with_visual_icon(icon: :versions) blankslate.with_heading(tag: :h2).with_content(t(:backlogs_empty_title)) - if current_user.allowed_in_project?(:manage_versions, @project) + if current_user.allowed_in_project?(:create_sprints, @project) blankslate.with_description_content(t(:backlogs_empty_action_text)) end end diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index 38f8ff5c6f8..cb1ac8ba9b2 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -59,57 +59,49 @@ module OpenProject::Backlogs end OpenProject::AccessControl.permission(:edit_work_packages).tap do |edit| - edit.controller_actions << "rb_stories/move" - edit.controller_actions << "rb_stories/reorder" edit.controller_actions << "rb_tasks/update" edit.controller_actions << "rb_impediments/update" end end project_module :backlogs, dependencies: :work_package_tracking do - # Master backlog permissions - permission :view_master_backlog, + permission :view_sprints, { rb_master_backlogs: %i[index details], rb_sprints: %i[index show show_name], rb_wikis: :show, rb_stories: %i[index show], rb_queries: :show, - rb_burndown_charts: :show }, - permissible_on: :project - - permission :view_taskboards, - { rb_taskboards: :show, - rb_sprints: :show, - rb_stories: :show, + rb_burndown_charts: :show, + rb_taskboards: :show, rb_tasks: %i[index show], - rb_impediments: %i[index show], - rb_wikis: :show, - rb_burndown_charts: :show }, + rb_impediments: %i[index show] }, permissible_on: :project - permission :select_done_statuses, - { - "projects/settings/backlogs": %i[show update rebuild_positions] - }, - permissible_on: :project, - require: :member - - # Sprint permissions - # :show_sprints and :list_sprints are implicit in :view_master_backlog permission - permission :update_sprints, - { - rb_sprints: %i[edit_name update], - rb_wikis: %i[edit update] - }, - permissible_on: :project, - require: :member - permission :create_sprints, - { - rb_sprints: %i[new_dialog create refresh_form] - }, + { rb_sprints: %i[new_dialog refresh_form create edit_name update], + rb_wikis: %i[edit update], + "projects/settings/backlogs": %i[show update rebuild_positions] }, permissible_on: :project, - require: :member + require: :member, + dependencies: :view_sprints + + permission :start_complete_sprint, + {}, + permissible_on: :project, + require: :member, + dependencies: :view_sprints + + permission :manage_sprint_items, + { rb_stories: %i[move reorder] }, + permissible_on: :project, + require: :member, + dependencies: %i[view_sprints add_work_packages edit_work_packages] + + permission :share_sprint, + {}, + permissible_on: :project, + require: :member, + dependencies: %i[create_sprints] end menu :project_menu, diff --git a/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb b/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb index a5273fbf06d..88152549445 100644 --- a/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb @@ -59,8 +59,8 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end describe "permission-based items" do - context "with :update_sprints permission" do - let(:permissions) { %i[view_master_backlog update_sprints] } + context "with :create_sprints permission" do + let(:permissions) { %i[view_sprints create_sprints] } it "shows Edit item with pencil icon" do render_component @@ -71,8 +71,8 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end end - context "without :update_sprints permission" do - let(:permissions) { [:view_master_backlog] } + context "without :create_sprints permission" do + let(:permissions) { [:view_sprints] } it "does not show Edit item" do render_component @@ -81,8 +81,8 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end end - context "with :add_work_packages permission" do - let(:permissions) { %i[view_master_backlog add_work_packages] } + context "with :manage_sprint_items permission" do + let(:permissions) { %i[view_sprints manage_sprint_items] } it "shows Add new story item with compose icon" do render_component @@ -92,8 +92,8 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end end - context "without :add_work_packages permission" do - let(:permissions) { [:view_master_backlog] } + context "without :manage_sprint_items permission" do + let(:permissions) { [:view_sprints] } it "does not show Add new story item" do render_component @@ -103,7 +103,7 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end context "with :manage_versions permission" do - let(:permissions) { %i[view_master_backlog manage_versions] } + let(:permissions) { %i[view_sprints manage_versions] } it "shows Properties item with gear icon" do render_component @@ -114,7 +114,7 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end context "without :manage_versions permission" do - let(:permissions) { [:view_master_backlog] } + let(:permissions) { [:view_sprints] } it "does not show Properties item" do render_component @@ -123,8 +123,8 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end end - context "with :view_taskboards permission" do - let(:permissions) { %i[view_master_backlog view_taskboards] } + context "with :view_sprints permission" do + let(:permissions) { %i[view_sprints] } it "shows Task board item" do render_component @@ -133,8 +133,8 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end end - context "without :view_taskboards permission" do - let(:permissions) { [:view_master_backlog] } + context "without :view_sprints permission" do + let(:permissions) { [] } it "does not show Task board item" do render_component @@ -145,7 +145,7 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end describe "always-visible items" do - let(:permissions) { [:view_master_backlog] } + let(:permissions) { [:view_sprints] } it "shows Stories/Tasks link" do render_component @@ -182,7 +182,7 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do describe "module-based items" do context "when wiki module is enabled" do - let(:permissions) { [:view_master_backlog] } + let(:permissions) { [:view_sprints] } let(:project) { create(:project, types: [type_feature, type_task], enabled_module_names: %w[backlogs wiki]) } it "shows Wiki item" do @@ -194,7 +194,7 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end context "when wiki module is disabled" do - let(:permissions) { [:view_master_backlog] } + let(:permissions) { [:view_sprints] } let(:project) { create(:project, types: [type_feature, type_task], enabled_module_names: %w[backlogs]) } it "does not show Wiki item" do diff --git a/modules/backlogs/spec/features/backlogs/context_menu_spec.rb b/modules/backlogs/spec/features/backlogs/context_menu_spec.rb index 540699b5aea..95ff8578475 100644 --- a/modules/backlogs/spec/features/backlogs/context_menu_spec.rb +++ b/modules/backlogs/spec/features/backlogs/context_menu_spec.rb @@ -38,8 +38,7 @@ RSpec.describe "Backlogs context menu", :js do shared_let(:user) do create(:user, member_with_permissions: { project => %i[add_work_packages - view_master_backlog - view_taskboards + view_sprints view_work_packages] }) end shared_let(:sprint) do @@ -146,9 +145,9 @@ RSpec.describe "Backlogs context menu", :js do end end - context "when the user does not have view_taskboards permission" do + context "when the user does not have view_sprints permission" do before do - RolePermission.where(permission: "view_taskboards").delete_all + RolePermission.where(permission: "view_sprints").delete_all end it 'does not display the "Task board" menu entry' do diff --git a/modules/backlogs/spec/features/backlogs/create_story_spec.rb b/modules/backlogs/spec/features/backlogs/create_story_spec.rb index 8563a3dd03b..598ace64f58 100644 --- a/modules/backlogs/spec/features/backlogs/create_story_spec.rb +++ b/modules/backlogs/spec/features/backlogs/create_story_spec.rb @@ -54,7 +54,7 @@ RSpec.describe "Backlogs", :js do let(:user) do create(:user, member_with_permissions: { project => %i(add_work_packages - view_master_backlog + view_sprints view_work_packages assign_versions) }) end diff --git a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb index 0cd6e4093eb..f5e1cc5aeb5 100644 --- a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb +++ b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb @@ -52,13 +52,14 @@ RSpec.describe "Backlogs in backlog view", :js do create(:project_role, permissions: %i( view_project - view_master_backlog + view_sprints + create_sprints + manage_sprint_items add_work_packages view_work_packages edit_work_packages manage_subtasks manage_versions - update_sprints assign_versions )) end diff --git a/modules/backlogs/spec/features/empty_backlogs_spec.rb b/modules/backlogs/spec/features/empty_backlogs_spec.rb index b558b1914ac..9e4ba698e67 100644 --- a/modules/backlogs/spec/features/empty_backlogs_spec.rb +++ b/modules/backlogs/spec/features/empty_backlogs_spec.rb @@ -57,7 +57,7 @@ RSpec.describe "Empty backlogs project", end context "as regular member" do - let(:role) { create(:project_role, permissions: %i(view_master_backlog)) } + let(:role) { create(:project_role, permissions: %i(view_sprints)) } let(:current_user) { create(:user, member_with_roles: { project => role }) } it "shows a blankslate without description" do diff --git a/modules/backlogs/spec/features/impediments_spec.rb b/modules/backlogs/spec/features/impediments_spec.rb index 814071a1a3a..cbdd37965a3 100644 --- a/modules/backlogs/spec/features/impediments_spec.rb +++ b/modules/backlogs/spec/features/impediments_spec.rb @@ -54,7 +54,7 @@ RSpec.describe "Impediments on taskboard", :js, end let(:role) do create(:project_role, - permissions: %i(view_taskboards + permissions: %i(view_sprints add_work_packages view_work_packages edit_work_packages diff --git a/modules/backlogs/spec/features/resolved_status_spec.rb b/modules/backlogs/spec/features/resolved_status_spec.rb index 3e094570a96..3470bfca8c4 100644 --- a/modules/backlogs/spec/features/resolved_status_spec.rb +++ b/modules/backlogs/spec/features/resolved_status_spec.rb @@ -37,7 +37,7 @@ RSpec.describe "Resolved status" do let!(:status) { create(:status, is_default: true) } let(:role) do create(:project_role, - permissions: %i[select_done_statuses]) + permissions: %i[create_sprints view_sprints]) end let!(:current_user) do create(:user, diff --git a/modules/backlogs/spec/features/stories_in_backlog_spec.rb b/modules/backlogs/spec/features/stories_in_backlog_spec.rb index c60aed2028b..99300af4722 100644 --- a/modules/backlogs/spec/features/stories_in_backlog_spec.rb +++ b/modules/backlogs/spec/features/stories_in_backlog_spec.rb @@ -52,7 +52,8 @@ RSpec.describe "Stories in backlog", :js, :settings_reset do end let(:role) do create(:project_role, - permissions: %i(view_master_backlog + permissions: %i(view_sprints + manage_sprint_items add_work_packages view_work_packages edit_work_packages diff --git a/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb b/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb index 42af6abe007..0b2c63f38aa 100644 --- a/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb +++ b/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb @@ -51,7 +51,7 @@ RSpec.describe "Tasks on taskboard", :js, end let(:role) do create(:project_role, - permissions: %i(view_taskboards + permissions: %i(view_sprints add_work_packages view_work_packages edit_work_packages diff --git a/modules/backlogs/spec/views/rb_master_backlogs/index.html.erb_spec.rb b/modules/backlogs/spec/views/rb_master_backlogs/index.html.erb_spec.rb index 251ffd4eb36..ae8002731e9 100644 --- a/modules/backlogs/spec/views/rb_master_backlogs/index.html.erb_spec.rb +++ b/modules/backlogs/spec/views/rb_master_backlogs/index.html.erb_spec.rb @@ -32,7 +32,7 @@ RSpec.describe "rb_master_backlogs/index" do let(:user) { create(:user) } let(:role_allowed) do create(:project_role, - permissions: %i[view_master_backlog view_taskboards]) + permissions: %i[view_sprints]) end let(:statuses) do [create(:status, is_default: true), diff --git a/spec/migrations/migrate_backlogs_permissions_spec.rb b/spec/migrations/migrate_backlogs_permissions_spec.rb new file mode 100644 index 00000000000..2c00da7f7ae --- /dev/null +++ b/spec/migrations/migrate_backlogs_permissions_spec.rb @@ -0,0 +1,142 @@ +# 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 Rails.root.join("db/migrate/20260212145213_migrate_backlogs_permissions") + +RSpec.describe MigrateBacklogsPermissions, type: :model do + subject(:migrate) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:up) } } + + let!(:empty_role) { create(:project_role) } + # Using add_public_permissions: false to keep permission sets minimal. + let!(:backlog_viewer_role) do + create(:project_role, permissions: %i[view_master_backlog], add_public_permissions: false) + end + let!(:taskboard_viewer_role) do + create(:project_role, permissions: %i[view_taskboards], add_public_permissions: false) + end + let(:member_role_permissions) do + %i[view_master_backlog view_taskboards add_work_packages + edit_work_packages assign_versions].to_set + end + let(:migrated_member_role_permissions) do + %i[add_work_packages edit_work_packages view_sprints manage_sprint_items].to_set + end + let!(:member_role) do + create(:project_role, permissions: member_role_permissions, add_public_permissions: false) + end + let(:manager_role_permissions) do + %i[view_master_backlog view_taskboards manage_versions select_done_statuses + update_sprints assign_versions add_work_packages edit_work_packages].to_set + end + let(:migrated_manager_role_permissions) do + %i[manage_versions add_work_packages edit_work_packages + view_sprints create_sprints manage_sprint_items].to_set + end + let!(:manager_role) do + create(:project_role, permissions: manager_role_permissions, add_public_permissions: false) + end + + describe "migrating up" do + it "does not add any permissions to a role without backlogs permissions" do + expect { migrate }.not_to change { empty_role.reload.permissions } + end + + it "migrates manager_role permissions correctly" do + expect { migrate } + .to change { manager_role.reload.permissions.to_set } + .from(manager_role_permissions) + .to(migrated_manager_role_permissions) + end + + it "migrates backlog_viewer_role permissions correctly" do + expect { migrate } + .to change { backlog_viewer_role.reload.permissions } + .from(%i[view_master_backlog]) + .to(%i[view_sprints]) + end + + it "migrates taskboard_viewer_role permissions correctly" do + expect { migrate } + .to change { taskboard_viewer_role.reload.permissions } + .from(%i[view_taskboards]) + .to(%i[view_sprints]) + end + + it "migrates member_role permissions correctly" do + expect { migrate } + .to change { member_role.reload.permissions.to_set } + .from(member_role_permissions) + .to(migrated_member_role_permissions) + end + + it "does not duplicate view_sprints when role had both view_master_backlog and view_taskboards" do + migrate + expect(manager_role.reload.role_permissions.where(permission: "view_sprints").count).to eq(1) + end + + it "does not duplicate create_sprints when role has multiple source permissions" do + migrate + expect(manager_role.reload.role_permissions.where(permission: "create_sprints").count).to eq(1) + end + + it "does not duplicate manage_sprint_items when role has multiple source permissions" do + migrate + expect(manager_role.reload.role_permissions.where(permission: "manage_sprint_items").count).to eq(1) + end + end + + describe "migrating down" do + subject(:rollback) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:down) } } + + before { migrate } + + it "reverts backlog_viewer_role permissions" do + expect { rollback } + .to change { backlog_viewer_role.reload.permissions.to_set } + .from(%i[view_sprints].to_set) + .to(%i[view_taskboards view_master_backlog].to_set) + end + + it "reverts manager_role permissions" do + expect { rollback } + .to change { manager_role.reload.permissions.to_set } + .from(migrated_manager_role_permissions) + .to(manager_role_permissions) + end + + it "reverts member_role permissions" do + expect { rollback } + .to change { member_role.reload.permissions.to_set } + .from(migrated_member_role_permissions) + .to(member_role_permissions) + end + end +end From 9bfacab64f17e0b27399f6f842ebecf915a5dca9 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 16 Feb 2026 12:04:31 +0200 Subject: [PATCH 093/334] Allow members to manage sprint items in seed data --- modules/backlogs/app/seeders/common.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/backlogs/app/seeders/common.yml b/modules/backlogs/app/seeders/common.yml index 77d7e5d7b78..f3146e87aec 100644 --- a/modules/backlogs/app/seeders/common.yml +++ b/modules/backlogs/app/seeders/common.yml @@ -31,7 +31,6 @@ modules_permissions: - role: :default_role_member add: - :view_sprints - - :create_sprints - :manage_sprint_items - role: :default_role_reader add: From cf2683907c095e2581dbd0005eb882bfaa235311 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 16 Feb 2026 12:04:49 +0200 Subject: [PATCH 094/334] Fix specs --- .../backlogs/backlog_menu_component.html.erb | 2 +- .../backlogs/backlog_menu_component_spec.rb | 42 ++++++++----------- .../features/backlogs/context_menu_spec.rb | 7 ++-- .../features/backlogs/create_story_spec.rb | 2 +- .../features/backlogs_in_backlog_view_spec.rb | 21 +++++----- 5 files changed, 33 insertions(+), 41 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb b/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb index 480e7132a1c..4b5de9a4225 100644 --- a/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb @@ -103,7 +103,7 @@ See COPYRIGHT and LICENSE files for more details. end end - if user_allowed?(:manage_versions) + if user_allowed?(:create_sprints) menu.with_item( label: t(".action_menu.properties"), tag: :a, diff --git a/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb b/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb index 88152549445..0ca336c7cf0 100644 --- a/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb @@ -59,28 +59,6 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end describe "permission-based items" do - context "with :create_sprints permission" do - let(:permissions) { %i[view_sprints create_sprints] } - - it "shows Edit item with pencil icon" do - render_component - - expect(page).to have_css("action-menu") - expect(page).to have_text(I18n.t("backlogs.backlog_menu_component.action_menu.edit_sprint")) - expect(page).to have_octicon(:pencil) - end - end - - context "without :create_sprints permission" do - let(:permissions) { [:view_sprints] } - - it "does not show Edit item" do - render_component - - expect(page).to have_no_text(I18n.t("backlogs.backlog_menu_component.action_menu.edit_sprint")) - end - end - context "with :manage_sprint_items permission" do let(:permissions) { %i[view_sprints manage_sprint_items] } @@ -102,8 +80,8 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do end end - context "with :manage_versions permission" do - let(:permissions) { %i[view_sprints manage_versions] } + context "with :create_sprints permission" do + let(:permissions) { %i[view_sprints create_sprints] } it "shows Properties item with gear icon" do render_component @@ -111,9 +89,17 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.properties")) expect(page).to have_octicon(:gear) end + + it "shows Edit item with pencil icon" do + render_component + + expect(page).to have_css("action-menu") + expect(page).to have_text(I18n.t("backlogs.backlog_menu_component.action_menu.edit_sprint")) + expect(page).to have_octicon(:pencil) + end end - context "without :manage_versions permission" do + context "without :create_sprints permission" do let(:permissions) { [:view_sprints] } it "does not show Properties item" do @@ -121,6 +107,12 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do expect(page).to have_no_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.properties")) end + + it "does not show Edit item" do + render_component + + expect(page).to have_no_text(I18n.t("backlogs.backlog_menu_component.action_menu.edit_sprint")) + end end context "with :view_sprints permission" do diff --git a/modules/backlogs/spec/features/backlogs/context_menu_spec.rb b/modules/backlogs/spec/features/backlogs/context_menu_spec.rb index 95ff8578475..9953affe9f1 100644 --- a/modules/backlogs/spec/features/backlogs/context_menu_spec.rb +++ b/modules/backlogs/spec/features/backlogs/context_menu_spec.rb @@ -39,7 +39,8 @@ RSpec.describe "Backlogs context menu", :js do create(:user, member_with_permissions: { project => %i[add_work_packages view_sprints - view_work_packages] }) + view_work_packages + manage_sprint_items] }) end shared_let(:sprint) do create(:version, @@ -133,9 +134,9 @@ RSpec.describe "Backlogs context menu", :js do end end - context "when the user does not have add_work_packages permission" do + context "when the user does not have manage_sprint_items permission" do before do - RolePermission.where(permission: "add_work_packages").delete_all + RolePermission.where(permission: "manage_sprint_items").delete_all end it 'does not display the "New story" menu entry' do diff --git a/modules/backlogs/spec/features/backlogs/create_story_spec.rb b/modules/backlogs/spec/features/backlogs/create_story_spec.rb index 598ace64f58..37e3d888493 100644 --- a/modules/backlogs/spec/features/backlogs/create_story_spec.rb +++ b/modules/backlogs/spec/features/backlogs/create_story_spec.rb @@ -56,7 +56,7 @@ RSpec.describe "Backlogs", :js do member_with_permissions: { project => %i(add_work_packages view_sprints view_work_packages - assign_versions) }) + manage_sprint_items) }) end let(:project) { create(:project) } diff --git a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb index f5e1cc5aeb5..ab4ab850032 100644 --- a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb +++ b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb @@ -51,17 +51,16 @@ RSpec.describe "Backlogs in backlog view", :js do let(:role) do create(:project_role, permissions: %i( - view_project - view_sprints - create_sprints - manage_sprint_items - add_work_packages - view_work_packages - edit_work_packages - manage_subtasks - manage_versions - assign_versions - )) + view_project + view_sprints + create_sprints + manage_sprint_items + add_work_packages + view_work_packages + edit_work_packages + manage_subtasks + manage_versions + )) end let!(:current_user) do create(:user, From 16c1fecf753f99667e2d5e25b7a56fc699934187 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 16 Feb 2026 12:05:11 +0200 Subject: [PATCH 095/334] Update translations --- modules/backlogs/config/locales/en.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index 62d8d39bd0e..03ef58d6840 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -155,11 +155,11 @@ en: label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" From d4cc266b2b8fad92af8000a38789181fb31498cf Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 16 Feb 2026 12:42:58 +0200 Subject: [PATCH 096/334] Fix rootseeder specs --- spec/seeders/root_seeder_standard_edition_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/seeders/root_seeder_standard_edition_spec.rb b/spec/seeders/root_seeder_standard_edition_spec.rb index 326491fc278..c0ab9890c87 100644 --- a/spec/seeders/root_seeder_standard_edition_spec.rb +++ b/spec/seeders/root_seeder_standard_edition_spec.rb @@ -131,7 +131,7 @@ RSpec.describe RootSeeder, member_role = root_seeder.seed_data.find_reference(:default_role_member) expect(member_role.permissions).to include( :view_work_packages, # from common basic data - :view_taskboards, # from backlogs module + :view_sprints, # from backlogs module :show_board_views, # from board module :view_documents, # from documents module :view_budgets, # from costs module From 395219b12412b16c62a691fce4c8dfbd56781a71 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 16 Feb 2026 14:06:56 +0200 Subject: [PATCH 097/334] Fix indentation --- .../features/backlogs_in_backlog_view_spec.rb | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb index ab4ab850032..a7edc67079e 100644 --- a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb +++ b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb @@ -51,16 +51,16 @@ RSpec.describe "Backlogs in backlog view", :js do let(:role) do create(:project_role, permissions: %i( - view_project - view_sprints - create_sprints - manage_sprint_items - add_work_packages - view_work_packages - edit_work_packages - manage_subtasks - manage_versions - )) + view_project + view_sprints + create_sprints + manage_sprint_items + add_work_packages + view_work_packages + edit_work_packages + manage_subtasks + manage_versions + )) end let!(:current_user) do create(:user, From cb43563f36b51919d010dc135c2f9c0cc596c419 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 16 Feb 2026 21:11:27 +0200 Subject: [PATCH 098/334] Add task board specs, make view_sprint dependent on view_work_packages as Version.visible requires it. --- .../lib/open_project/backlogs/engine.rb | 3 +- .../rb_taskboards_controller_spec.rb | 88 +++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 modules/backlogs/spec/controllers/rb_taskboards_controller_spec.rb diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index cb1ac8ba9b2..ba19030ab0a 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -75,7 +75,8 @@ module OpenProject::Backlogs rb_taskboards: :show, rb_tasks: %i[index show], rb_impediments: %i[index show] }, - permissible_on: :project + permissible_on: :project, + dependencies: :view_work_packages permission :create_sprints, { rb_sprints: %i[new_dialog refresh_form create edit_name update], diff --git a/modules/backlogs/spec/controllers/rb_taskboards_controller_spec.rb b/modules/backlogs/spec/controllers/rb_taskboards_controller_spec.rb new file mode 100644 index 00000000000..b474ea826a8 --- /dev/null +++ b/modules/backlogs/spec/controllers/rb_taskboards_controller_spec.rb @@ -0,0 +1,88 @@ +# 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 RbTaskboardsController do + shared_let(:type_feature) { create(:type_feature) } + shared_let(:type_task) { create(:type_task) } + shared_let(:user) { create(:admin) } + current_user { user } + + let(:permissions) { [] } + let(:project) { create(:project, member_with_permissions: { user => permissions }) } + let(:status) { create(:status, name: "status 1", is_default: true) } + let(:sprint) { create(:sprint, project:) } + let(:story) { create(:story, status:, version: sprint, project:) } + + before do + allow(Setting) + .to receive(:plugin_openproject_backlogs) + .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id }) + end + + describe "GET show" do + before do + get :show, params: { project_id: project.identifier, sprint_id: sprint.id } + end + + it "performs that request" do + expect(response).to be_successful + expect(response).to render_template :show + end + + context "as a member with view_sprints permission" do + let(:user) { create(:user) } + let(:permissions) { %i[view_sprints view_work_packages] } + + it "grants access" do + expect(response).to be_successful + expect(response).to render_template :show + end + end + + context "as a member without view_sprints permission" do + let(:user) { create(:user) } + let(:permissions) { [:view_project] } + + it "denies access" do + expect(response).to have_http_status(:not_found) + end + end + + context "as a non-member" do + current_user { create(:user) } + + it "denies access" do + expect(response).to have_http_status(:not_found) + end + end + end +end From 0ba34ea38a1910ad92fef428748de2048b86dc13 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 16 Feb 2026 21:17:46 +0200 Subject: [PATCH 099/334] Remove taskboard link spec, as the sprint page is also being guarded by the view_sprints permission Since view_master_backlog and view_taskboards has been fused to view_sprints, it is not possible to test the presence of Task board link, because the same permission prevents the user accessing the backlog where the link is supposed to be displayed. --- .../backlogs/backlog_menu_component.html.erb | 14 ++++++-------- .../backlogs/backlog_menu_component_spec.rb | 10 ---------- .../spec/features/backlogs/context_menu_spec.rb | 12 ------------ 3 files changed, 6 insertions(+), 30 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb b/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb index 4b5de9a4225..2da68aa8f90 100644 --- a/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb @@ -73,14 +73,12 @@ See COPYRIGHT and LICENSE files for more details. end if backlog.sprint_backlog? - if user_allowed?(:view_sprints) - menu.with_item( - label: t(".action_menu.task_board"), - tag: :a, - href: backlogs_project_sprint_taskboard_path(project, sprint) - ) do |item| - item.with_leading_visual_icon(icon: :"op-view-cards") - end + menu.with_item( + label: t(".action_menu.task_board"), + tag: :a, + href: backlogs_project_sprint_taskboard_path(project, sprint) + ) do |item| + item.with_leading_visual_icon(icon: :"op-view-cards") end menu.with_item( diff --git a/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb b/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb index 0ca336c7cf0..0ef06982772 100644 --- a/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb @@ -124,16 +124,6 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.task_board")) end end - - context "without :view_sprints permission" do - let(:permissions) { [] } - - it "does not show Task board item" do - render_component - - expect(page).to have_no_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.task_board")) - end - end end describe "always-visible items" do diff --git a/modules/backlogs/spec/features/backlogs/context_menu_spec.rb b/modules/backlogs/spec/features/backlogs/context_menu_spec.rb index 9953affe9f1..5800e48d2ca 100644 --- a/modules/backlogs/spec/features/backlogs/context_menu_spec.rb +++ b/modules/backlogs/spec/features/backlogs/context_menu_spec.rb @@ -146,18 +146,6 @@ RSpec.describe "Backlogs context menu", :js do end end - context "when the user does not have view_sprints permission" do - before do - RolePermission.where(permission: "view_sprints").delete_all - end - - it 'does not display the "Task board" menu entry' do - within_backlog_context_menu do |menu| - expect(menu).to have_no_selector :menuitem, "Task board" - end - end - end - context "when the wiki module is not enabled" do before do project.enabled_module_names -= ["wiki"] From 60e747be2b24c6f117d84394f237119d74ad3847 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 16 Feb 2026 22:59:44 +0200 Subject: [PATCH 100/334] Apply manage_sprint_items permissions on the work packages model and update specs. - Do not remove the assign_versions permission anymore, it still has purpose in the context of updating work packages. - Update backlog related specs. --- app/contracts/work_packages/base_contract.rb | 3 +- .../work_packages/update_contract.rb | 4 +- ...0212145213_migrate_backlogs_permissions.rb | 7 +- .../migration_utils/permission_renamer.rb | 8 ++ .../work_packages/work_package_representer.rb | 3 +- .../lib/open_project/backlogs/engine.rb | 6 +- .../spec/features/impediments_spec.rb | 2 +- .../spec/features/stories_in_backlog_spec.rb | 3 +- .../spec/features/tasks_on_taskboard_spec.rb | 2 +- .../open_project/backlogs/permissions_spec.rb | 89 +++++++++++++++++++ .../impediments/create_services_spec.rb | 2 +- .../services/stories/create_service_spec.rb | 2 +- .../work_packages/update_contract_spec.rb | 16 +++- .../edit_on_assign_version_permission_spec.rb | 18 +++- .../work_package_representer_spec.rb | 14 +++ .../migrate_backlogs_permissions_spec.rb | 48 +++++----- 16 files changed, 185 insertions(+), 42 deletions(-) create mode 100644 modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb diff --git a/app/contracts/work_packages/base_contract.rb b/app/contracts/work_packages/base_contract.rb index b26b1d1c309..21c973d7a51 100644 --- a/app/contracts/work_packages/base_contract.rb +++ b/app/contracts/work_packages/base_contract.rb @@ -46,8 +46,9 @@ module WorkPackages attribute :type_id attribute :priority_id attribute :category_id + # TODO: manage_sprint_items can be removed once the sprint_id is in place. attribute :version_id, - permission: :assign_versions do + permission: %i(assign_versions manage_sprint_items) do validate_version_is_assignable end diff --git a/app/contracts/work_packages/update_contract.rb b/app/contracts/work_packages/update_contract.rb index 5e9a8777548..562bf9eba87 100644 --- a/app/contracts/work_packages/update_contract.rb +++ b/app/contracts/work_packages/update_contract.rb @@ -33,7 +33,8 @@ module WorkPackages include UnchangedProject attribute :lock_version, - permission: %i[edit_work_packages change_work_package_status assign_versions manage_subtasks move_work_packages] do + permission: %i[edit_work_packages change_work_package_status assign_versions manage_sprint_items manage_subtasks + move_work_packages] do if model.lock_version.nil? || model.lock_version_changed? errors.add :base, :error_conflict end @@ -60,6 +61,7 @@ module WorkPackages with_unchanged_project_id do next if allowed_in_work_package?(:edit_work_packages) || allowed_in_project?(:assign_versions) || + allowed_in_project?(:manage_sprint_items) || allowed_in_project?(:change_work_package_status) || allowed_in_project?(:manage_subtasks) || allowed_in_project?(:move_work_packages) diff --git a/db/migrate/20260212145213_migrate_backlogs_permissions.rb b/db/migrate/20260212145213_migrate_backlogs_permissions.rb index 70f71f3fb44..0f269a8d3f1 100644 --- a/db/migrate/20260212145213_migrate_backlogs_permissions.rb +++ b/db/migrate/20260212145213_migrate_backlogs_permissions.rb @@ -5,8 +5,11 @@ require Rails.root.join("db/migrate/migration_utils/permission_adder") class MigrateBacklogsPermissions < ActiveRecord::Migration[8.1] def up - ::Migration::MigrationUtils::PermissionRenamer.rename("view_master_backlog", "view_sprints") + ::Migration::MigrationUtils::PermissionRenamer.rename(:view_master_backlog, :view_sprints) + # TODO: This could also use the PermissionRenamer.rename, but since that method is using an + # SQL update query, we can potentially end up having duplicate permissions defined, + # if a user has both view_master_backlog and view_taskboards. ::Migration::MigrationUtils::PermissionAdder.add(:view_taskboards, :view_sprints) RolePermission.delete_by(permission: "view_taskboards") @@ -19,8 +22,6 @@ class MigrateBacklogsPermissions < ActiveRecord::Migration[8.1] ::Migration::MigrationUtils::PermissionAdder.add(:assign_versions, :manage_sprint_items) ::Migration::MigrationUtils::PermissionAdder.add(:add_work_packages, :manage_sprint_items) ::Migration::MigrationUtils::PermissionAdder.add(:edit_work_packages, :manage_sprint_items) - - RolePermission.delete_by(permission: %w(assign_versions)) end def down diff --git a/db/migrate/migration_utils/permission_renamer.rb b/db/migrate/migration_utils/permission_renamer.rb index 39642d2f1ee..be69ca41a60 100644 --- a/db/migrate/migration_utils/permission_renamer.rb +++ b/db/migrate/migration_utils/permission_renamer.rb @@ -32,6 +32,14 @@ module Migration module MigrationUtils class PermissionRenamer class << self + # TODO: Rewrite this method to consider already existing permissions, in order to avoid + # duplicates. It can be rewritten to use the PermissionAdder, which already avoids adding + # duplicates: + # def rename(from, to, force: false) + # ::Migration::MigrationUtils::PermissionAdder.add(from, to, force:) + # RolePermission.delete_by(permission: from) + # end + def rename(from, to) ActiveRecord::Base.connection.execute <<-SQL.squish UPDATE #{role_permissions_table} diff --git a/lib/api/v3/work_packages/work_package_representer.rb b/lib/api/v3/work_packages/work_package_representer.rb index 4a5f03e5307..4043e338c45 100644 --- a/lib/api/v3/work_packages/work_package_representer.rb +++ b/lib/api/v3/work_packages/work_package_representer.rb @@ -657,7 +657,8 @@ module API @current_user_update_allowed = current_user.allowed_in_work_package?(:edit_work_packages, represented) || current_user.allowed_in_project?(:change_work_package_status, represented.project) || - current_user.allowed_in_project?(:assign_versions, represented.project) + current_user.allowed_in_project?(:assign_versions, represented.project) || + current_user.allowed_in_project?(:manage_sprint_items, represented.project) end def view_time_entries_allowed? diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index ba19030ab0a..51a47bb2371 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -90,7 +90,8 @@ module OpenProject::Backlogs {}, permissible_on: :project, require: :member, - dependencies: :view_sprints + dependencies: :view_sprints, + visible: -> { OpenProject::FeatureDecisions.scrum_projects_active? } permission :manage_sprint_items, { rb_stories: %i[move reorder] }, @@ -102,7 +103,8 @@ module OpenProject::Backlogs {}, permissible_on: :project, require: :member, - dependencies: %i[create_sprints] + dependencies: %i[create_sprints], + visible: -> { OpenProject::FeatureDecisions.scrum_projects_active? } end menu :project_menu, diff --git a/modules/backlogs/spec/features/impediments_spec.rb b/modules/backlogs/spec/features/impediments_spec.rb index cbdd37965a3..725bacfd8bb 100644 --- a/modules/backlogs/spec/features/impediments_spec.rb +++ b/modules/backlogs/spec/features/impediments_spec.rb @@ -59,7 +59,7 @@ RSpec.describe "Impediments on taskboard", :js, view_work_packages edit_work_packages manage_subtasks - assign_versions + manage_sprint_items work_package_assigned)) end let!(:current_user) do diff --git a/modules/backlogs/spec/features/stories_in_backlog_spec.rb b/modules/backlogs/spec/features/stories_in_backlog_spec.rb index 99300af4722..c16c986e5d0 100644 --- a/modules/backlogs/spec/features/stories_in_backlog_spec.rb +++ b/modules/backlogs/spec/features/stories_in_backlog_spec.rb @@ -57,8 +57,7 @@ RSpec.describe "Stories in backlog", :js, :settings_reset do add_work_packages view_work_packages edit_work_packages - manage_subtasks - assign_versions)) + manage_subtasks)) end let!(:current_user) do create(:user, diff --git a/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb b/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb index 0b2c63f38aa..f9539baf4c2 100644 --- a/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb +++ b/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb @@ -56,7 +56,7 @@ RSpec.describe "Tasks on taskboard", :js, view_work_packages edit_work_packages manage_subtasks - assign_versions + manage_sprint_items work_package_assigned)) end let!(:current_user) do diff --git a/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb b/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb new file mode 100644 index 00000000000..254ed769535 --- /dev/null +++ b/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb @@ -0,0 +1,89 @@ +# 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 OpenProject::AccessControl, "Backlogs module permissions" do # rubocop:disable RSpec/SpecFilePathFormat + describe "view_sprints" do + subject { described_class.permission(:view_sprints) } + + it "depends on view_work_packages" do + expect(subject.dependencies).to contain_exactly(:view_work_packages) + end + end + + describe "create_sprints" do + subject { described_class.permission(:create_sprints) } + + it "depends on view_sprints" do + expect(subject.dependencies).to contain_exactly(:view_sprints) + end + end + + describe "manage_sprint_items" do + subject { described_class.permission(:manage_sprint_items) } + + it "depends on view_sprints, add_work_packages, and edit_work_packages" do + expect(subject.dependencies).to contain_exactly(:view_sprints, :add_work_packages, :edit_work_packages) + end + end + + describe "start_complete_sprint" do + subject { described_class.permission(:start_complete_sprint) } + + it "depends on view_sprints" do + expect(subject.dependencies).to contain_exactly(:view_sprints) + end + + context "when scrum_projects feature flag is active", with_flag: { scrum_projects: true } do + it { is_expected.to be_visible } + end + + context "when scrum_projects feature flag is inactive", with_flag: { scrum_projects: false } do + it { is_expected.to be_hidden } + end + end + + describe "share_sprint" do + subject { described_class.permission(:share_sprint) } + + it "depends on create_sprints" do + expect(subject.dependencies).to contain_exactly(:create_sprints) + end + + context "when scrum_projects feature flag is active", with_flag: { scrum_projects: true } do + it { is_expected.to be_visible } + end + + context "when scrum_projects feature flag is inactive", with_flag: { scrum_projects: false } do + it { is_expected.to be_hidden } + end + end +end diff --git a/modules/backlogs/spec/services/impediments/create_services_spec.rb b/modules/backlogs/spec/services/impediments/create_services_spec.rb index 21012fa323a..da7317501a4 100644 --- a/modules/backlogs/spec/services/impediments/create_services_spec.rb +++ b/modules/backlogs/spec/services/impediments/create_services_spec.rb @@ -33,7 +33,7 @@ RSpec.describe Impediments::CreateService do let(:impediment_subject) { "Impediment A" } let(:user) { create(:user) } - let(:role) { create(:project_role, permissions: %i(add_work_packages assign_versions work_package_assigned)) } + let(:role) { create(:project_role, permissions: %i(add_work_packages manage_sprint_items work_package_assigned)) } let(:type_feature) { create(:type_feature) } let(:type_task) { create(:type_task) } let(:priority) { create(:priority, is_default: true) } diff --git a/modules/backlogs/spec/services/stories/create_service_spec.rb b/modules/backlogs/spec/services/stories/create_service_spec.rb index 0ee06ac9d8f..87483c4a055 100644 --- a/modules/backlogs/spec/services/stories/create_service_spec.rb +++ b/modules/backlogs/spec/services/stories/create_service_spec.rb @@ -35,7 +35,7 @@ RSpec.describe Stories::CreateService, type: :model do let(:type_feature) { create(:type_feature) } let(:user) do - create(:user, member_with_permissions: { project => %i(add_work_packages manage_subtasks assign_versions) }) + create(:user, member_with_permissions: { project => %i(add_work_packages manage_subtasks manage_sprint_items) }) end let(:instance) do diff --git a/spec/contracts/work_packages/update_contract_spec.rb b/spec/contracts/work_packages/update_contract_spec.rb index bab6d8a4784..8d888aca538 100644 --- a/spec/contracts/work_packages/update_contract_spec.rb +++ b/spec/contracts/work_packages/update_contract_spec.rb @@ -384,9 +384,21 @@ RSpec.describe WorkPackages::UpdateContract do context "for a user having only the assign_versions permission" do let(:permissions) { %i[assign_versions] } - it "includes all attributes except version_id" do + it "includes version_id only" do expect(subject) - .to include("version_id", "version") + .to include("version_id", "version", "lock_version_id", "lock_version") + + expect(subject) + .not_to include("subject", "start_date", "description") + end + end + + context "for a user having only the manage_sprint_items permission" do + let(:permissions) { %i[manage_sprint_items] } + + it "includes version_id only" do + expect(subject) + .to include("version_id", "version", "lock_version_id", "lock_version") expect(subject) .not_to include("subject", "start_date", "description") diff --git a/spec/features/work_packages/edit_on_assign_version_permission_spec.rb b/spec/features/work_packages/edit_on_assign_version_permission_spec.rb index bf1f68515ce..ab0d2e05907 100644 --- a/spec/features/work_packages/edit_on_assign_version_permission_spec.rb +++ b/spec/features/work_packages/edit_on_assign_version_permission_spec.rb @@ -10,7 +10,7 @@ RSpec.describe "edit work package", :js do lastname: "Guy", member_with_permissions: { project => permissions }) end - let(:permissions) { %i[view_work_packages assign_versions] } + let(:permissions) { %i[view_work_packages manage_sprint_items assign_versions] } let(:cf_all) do create(:work_package_custom_field, is_for_all: true, field_format: "text") @@ -43,7 +43,21 @@ RSpec.describe "edit work package", :js do context "as a user having only the assign_versions permission" do it "can only change the version" do - wp_page.update_attributes version: version.name + wp_page.fill_in_attributes version: version.name + + wp_page.expect_toast(message: "Successful update") + wp_page.expect_attributes version: version.name + + subject_field = wp_page.work_package_field("subject") + subject_field.expect_read_only + end + end + + context "as a user having only the manage_sprint_items permission" do + let(:permissions) { %i[view_work_packages manage_sprint_items] } + + it "can only change the version" do + wp_page.fill_in_attributes version: version.name wp_page.expect_toast(message: "Successful update") wp_page.expect_attributes version: version.name diff --git a/spec/lib/api/v3/work_packages/work_package_representer_spec.rb b/spec/lib/api/v3/work_packages/work_package_representer_spec.rb index 5de3c09d359..e8abbfe723d 100644 --- a/spec/lib/api/v3/work_packages/work_package_representer_spec.rb +++ b/spec/lib/api/v3/work_packages/work_package_representer_spec.rb @@ -490,6 +490,20 @@ RSpec.describe API::V3::WorkPackages::WorkPackageRepresenter do end end + context "when user lacks edit permission but has manage_sprint_items" do + let(:permissions) { all_permissions - [:edit_work_packages] + [:manage_sprint_items] } + + it_behaves_like "has an untitled link" do + let(:link) { "update" } + let(:href) { api_v3_paths.work_package_form(work_package.id) } + end + + it_behaves_like "has an untitled link" do + let(:link) { "updateImmediately" } + let(:href) { api_v3_paths.work_package(work_package.id) } + end + end + context "when user lacks edit permission but has change_work_package_status" do let(:permissions) { all_permissions - [:edit_work_packages] + [:change_work_package_status] } diff --git a/spec/migrations/migrate_backlogs_permissions_spec.rb b/spec/migrations/migrate_backlogs_permissions_spec.rb index 2c00da7f7ae..8ef75a3766a 100644 --- a/spec/migrations/migrate_backlogs_permissions_spec.rb +++ b/spec/migrations/migrate_backlogs_permissions_spec.rb @@ -44,21 +44,21 @@ RSpec.describe MigrateBacklogsPermissions, type: :model do end let(:member_role_permissions) do %i[view_master_backlog view_taskboards add_work_packages - edit_work_packages assign_versions].to_set + edit_work_packages assign_versions] end let(:migrated_member_role_permissions) do - %i[add_work_packages edit_work_packages view_sprints manage_sprint_items].to_set + %i[add_work_packages edit_work_packages assign_versions view_sprints manage_sprint_items] end let!(:member_role) do create(:project_role, permissions: member_role_permissions, add_public_permissions: false) end let(:manager_role_permissions) do %i[view_master_backlog view_taskboards manage_versions select_done_statuses - update_sprints assign_versions add_work_packages edit_work_packages].to_set + update_sprints assign_versions add_work_packages edit_work_packages] end let(:migrated_manager_role_permissions) do - %i[manage_versions add_work_packages edit_work_packages - view_sprints create_sprints manage_sprint_items].to_set + %i[manage_versions add_work_packages edit_work_packages assign_versions + view_sprints create_sprints manage_sprint_items] end let!(:manager_role) do create(:project_role, permissions: manager_role_permissions, add_public_permissions: false) @@ -71,30 +71,30 @@ RSpec.describe MigrateBacklogsPermissions, type: :model do it "migrates manager_role permissions correctly" do expect { migrate } - .to change { manager_role.reload.permissions.to_set } - .from(manager_role_permissions) - .to(migrated_manager_role_permissions) + .to change { manager_role.reload.permissions } + .from(match_array(manager_role_permissions)) + .to(match_array(migrated_manager_role_permissions)) end it "migrates backlog_viewer_role permissions correctly" do expect { migrate } .to change { backlog_viewer_role.reload.permissions } - .from(%i[view_master_backlog]) - .to(%i[view_sprints]) + .from(match_array(%i[view_master_backlog])) + .to(match_array(%i[view_sprints])) end it "migrates taskboard_viewer_role permissions correctly" do expect { migrate } .to change { taskboard_viewer_role.reload.permissions } - .from(%i[view_taskboards]) - .to(%i[view_sprints]) + .from(match_array(%i[view_taskboards])) + .to(match_array(%i[view_sprints])) end it "migrates member_role permissions correctly" do expect { migrate } - .to change { member_role.reload.permissions.to_set } - .from(member_role_permissions) - .to(migrated_member_role_permissions) + .to change { member_role.reload.permissions } + .from(match_array(member_role_permissions)) + .to(match_array(migrated_member_role_permissions)) end it "does not duplicate view_sprints when role had both view_master_backlog and view_taskboards" do @@ -120,23 +120,23 @@ RSpec.describe MigrateBacklogsPermissions, type: :model do it "reverts backlog_viewer_role permissions" do expect { rollback } - .to change { backlog_viewer_role.reload.permissions.to_set } - .from(%i[view_sprints].to_set) - .to(%i[view_taskboards view_master_backlog].to_set) + .to change { backlog_viewer_role.reload.permissions } + .from(match_array(%i[view_sprints])) + .to(match_array(%i[view_taskboards view_master_backlog])) end it "reverts manager_role permissions" do expect { rollback } - .to change { manager_role.reload.permissions.to_set } - .from(migrated_manager_role_permissions) - .to(manager_role_permissions) + .to change { manager_role.reload.permissions } + .from(match_array(migrated_manager_role_permissions)) + .to(match_array(manager_role_permissions)) end it "reverts member_role permissions" do expect { rollback } - .to change { member_role.reload.permissions.to_set } - .from(migrated_member_role_permissions) - .to(member_role_permissions) + .to change { member_role.reload.permissions } + .from(match_array(migrated_member_role_permissions)) + .to(match_array(member_role_permissions)) end end end From 1278bfe31b8aeb4670fe8b3d0310b27f1a7e8f08 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 3 Mar 2026 12:54:35 +0200 Subject: [PATCH 101/334] Update share_sprint permission dependencies. Co-authored-by: Tobias Dillmann --- modules/backlogs/lib/open_project/backlogs/engine.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index 51a47bb2371..ef6fe72da58 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -103,7 +103,7 @@ module OpenProject::Backlogs {}, permissible_on: :project, require: :member, - dependencies: %i[create_sprints], + dependencies: :create_sprints, visible: -> { OpenProject::FeatureDecisions.scrum_projects_active? } end From fe71aef6d9177e2d9ce8694f4e8c5cf34f3b19ab Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 3 Mar 2026 12:57:22 +0200 Subject: [PATCH 102/334] Use view_sprint permissions instead of view_master_master_backlog in the specs. --- modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb | 2 +- modules/backlogs/spec/features/sprints/create_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb index c737fc8afbb..cf28fac7e7a 100644 --- a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb @@ -35,7 +35,7 @@ RSpec.describe RbSprintsController do shared_let(:type_feature) { create(:type_feature) } shared_let(:type_task) { create(:type_task) } - let(:all_permissions) { %i[view_master_backlog view_work_packages create_sprints] } + let(:all_permissions) { %i[view_sprints view_work_packages create_sprints] } let(:permissions) { all_permissions } let(:user) do create(:user, member_with_permissions: { project => permissions }) diff --git a/modules/backlogs/spec/features/sprints/create_spec.rb b/modules/backlogs/spec/features/sprints/create_spec.rb index 7c4c800aac2..3b060defa45 100644 --- a/modules/backlogs/spec/features/sprints/create_spec.rb +++ b/modules/backlogs/spec/features/sprints/create_spec.rb @@ -33,7 +33,7 @@ require_relative "../../support/pages/backlogs" RSpec.describe "Create", :js do let(:project) { create(:project) } - let(:all_permissions) { %i[view_master_backlog view_work_packages create_sprints] } + let(:all_permissions) { %i[view_sprints view_work_packages create_sprints] } let(:permissions) { all_permissions } let(:user) do create(:user, member_with_permissions: { project => permissions }) From 0ad584217ad3724e04df91e1650287b20d6fcfc5 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 3 Mar 2026 16:38:15 +0200 Subject: [PATCH 103/334] [#72773] Rework Permission Renamer https://community.openproject.org/work_packages/72773 --- ...0212145213_migrate_backlogs_permissions.rb | 15 +-- .../migration_utils/permission_renamer.rb | 31 ++---- ...nage_overview_to_manage_dashboards_spec.rb | 67 +++++++++++++ .../rename_comment_permissions_spec.rb | 95 +++++++++++++++++++ 4 files changed, 173 insertions(+), 35 deletions(-) create mode 100644 modules/overviews/spec/migrations/rename_manage_overview_to_manage_dashboards_spec.rb create mode 100644 spec/migrations/rename_comment_permissions_spec.rb diff --git a/db/migrate/20260212145213_migrate_backlogs_permissions.rb b/db/migrate/20260212145213_migrate_backlogs_permissions.rb index 0f269a8d3f1..79f6634ab88 100644 --- a/db/migrate/20260212145213_migrate_backlogs_permissions.rb +++ b/db/migrate/20260212145213_migrate_backlogs_permissions.rb @@ -6,18 +6,11 @@ require Rails.root.join("db/migrate/migration_utils/permission_adder") class MigrateBacklogsPermissions < ActiveRecord::Migration[8.1] def up ::Migration::MigrationUtils::PermissionRenamer.rename(:view_master_backlog, :view_sprints) - - # TODO: This could also use the PermissionRenamer.rename, but since that method is using an - # SQL update query, we can potentially end up having duplicate permissions defined, - # if a user has both view_master_backlog and view_taskboards. - ::Migration::MigrationUtils::PermissionAdder.add(:view_taskboards, :view_sprints) - RolePermission.delete_by(permission: "view_taskboards") + ::Migration::MigrationUtils::PermissionRenamer.rename(:view_taskboards, :view_sprints) ::Migration::MigrationUtils::PermissionAdder.add(:manage_versions, :create_sprints) - ::Migration::MigrationUtils::PermissionAdder.add(:select_done_statuses, :create_sprints) - ::Migration::MigrationUtils::PermissionAdder.add(:update_sprints, :create_sprints) - - RolePermission.delete_by(permission: %w(update_sprints select_done_statuses)) + ::Migration::MigrationUtils::PermissionRenamer.rename(:select_done_statuses, :create_sprints) + ::Migration::MigrationUtils::PermissionRenamer.rename(:update_sprints, :create_sprints) ::Migration::MigrationUtils::PermissionAdder.add(:assign_versions, :manage_sprint_items) ::Migration::MigrationUtils::PermissionAdder.add(:add_work_packages, :manage_sprint_items) @@ -26,7 +19,7 @@ class MigrateBacklogsPermissions < ActiveRecord::Migration[8.1] def down ::Migration::MigrationUtils::PermissionAdder.add(:view_sprints, :view_taskboards, force: true) - ::Migration::MigrationUtils::PermissionRenamer.rename("view_sprints", "view_master_backlog") + ::Migration::MigrationUtils::PermissionRenamer.rename(:view_sprints, :view_master_backlog, force: true) # Note: Some roles might receive extra permissions on the way down because, # we need to add back all the roles that have been merged on the way up. diff --git a/db/migrate/migration_utils/permission_renamer.rb b/db/migrate/migration_utils/permission_renamer.rb index be69ca41a60..4547eb4f385 100644 --- a/db/migrate/migration_utils/permission_renamer.rb +++ b/db/migrate/migration_utils/permission_renamer.rb @@ -28,34 +28,17 @@ # See COPYRIGHT and LICENSE files for more details. #++ +require Rails.root.join("db/migrate/migration_utils/permission_adder") + module Migration module MigrationUtils class PermissionRenamer class << self - # TODO: Rewrite this method to consider already existing permissions, in order to avoid - # duplicates. It can be rewritten to use the PermissionAdder, which already avoids adding - # duplicates: - # def rename(from, to, force: false) - # ::Migration::MigrationUtils::PermissionAdder.add(from, to, force:) - # RolePermission.delete_by(permission: from) - # end - - def rename(from, to) - ActiveRecord::Base.connection.execute <<-SQL.squish - UPDATE #{role_permissions_table} - SET permission = #{quote_value(to)} - WHERE permission = #{quote_value(from)} - SQL - end - - private - - def role_permissions_table - @role_permissions_table ||= ActiveRecord::Base.connection.quote_table_name("role_permissions") - end - - def quote_value(value) - ActiveRecord::Base.connection.quote(value) + # The `force: true` argument is the default because usually when a rename + # happens, the `from`` permission is no longer defined. + def rename(from, to, force: true) + ::Migration::MigrationUtils::PermissionAdder.add(from, to, force:) + RolePermission.delete_by(permission: from) end end end diff --git a/modules/overviews/spec/migrations/rename_manage_overview_to_manage_dashboards_spec.rb b/modules/overviews/spec/migrations/rename_manage_overview_to_manage_dashboards_spec.rb new file mode 100644 index 00000000000..2aff50081ef --- /dev/null +++ b/modules/overviews/spec/migrations/rename_manage_overview_to_manage_dashboards_spec.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. +#++ + +require "spec_helper" +require Rails.root.join("modules/overviews/db/migrate/20250910085916_rename_manage_overview_to_manage_dashboards") + +RSpec.describe RenameManageOverviewToManageDashboards, type: :model do + subject(:migrate) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:up) } } + + let!(:empty_role) { create(:project_role) } + let!(:role_with_permission) do + create(:project_role, permissions: %i[manage_overview], add_public_permissions: false) + end + + describe "migrating up" do + it "does not add permissions to a role without manage_overview" do + expect { migrate }.not_to change { empty_role.reload.permissions } + end + + it "renames manage_overview to manage_dashboards" do + expect { migrate } + .to change { role_with_permission.reload.permissions } + .from(match_array(%i[manage_overview])) + .to(match_array(%i[manage_dashboards])) + end + end + + describe "migrating down" do + subject(:rollback) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:down) } } + + before { migrate } + + it "reverts manage_dashboards to manage_overview" do + expect { rollback } + .to change { role_with_permission.reload.permissions } + .from(match_array(%i[manage_dashboards])) + .to(match_array(%i[manage_overview])) + end + end +end diff --git a/spec/migrations/rename_comment_permissions_spec.rb b/spec/migrations/rename_comment_permissions_spec.rb new file mode 100644 index 00000000000..e64fcb36094 --- /dev/null +++ b/spec/migrations/rename_comment_permissions_spec.rb @@ -0,0 +1,95 @@ +# 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 Rails.root.join("db/migrate/20250422072119_rename_comment_permissions") + +RSpec.describe RenameCommentPermissions, type: :model do + subject(:migrate) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:up) } } + + let(:old_permissions) do + %i[add_work_package_notes edit_own_work_package_notes edit_work_package_notes + view_comments_with_restricted_visibility add_comments_with_restricted_visibility + edit_own_comments_with_restricted_visibility edit_others_comments_with_restricted_visibility] + end + let(:new_permissions) do + %i[add_work_package_comments edit_own_work_package_comments edit_work_package_comments + view_internal_comments add_internal_comments + edit_own_internal_comments edit_others_internal_comments] + end + + let!(:empty_role) { create(:project_role) } + let!(:role_with_all) do + create(:project_role, permissions: old_permissions, add_public_permissions: false) + end + let!(:role_with_notes_only) do + create(:project_role, permissions: %i[add_work_package_notes edit_own_work_package_notes], add_public_permissions: false) + end + + describe "migrating up" do + it "does not add permissions to a role without comment permissions" do + expect { migrate }.not_to change { empty_role.reload.permissions } + end + + it "renames all comment permissions" do + expect { migrate } + .to change { role_with_all.reload.permissions } + .from(match_array(old_permissions)) + .to(match_array(new_permissions)) + end + + it "renames only the matching permissions" do + expect { migrate } + .to change { role_with_notes_only.reload.permissions } + .from(match_array(%i[add_work_package_notes edit_own_work_package_notes])) + .to(match_array(%i[add_work_package_comments edit_own_work_package_comments])) + end + end + + describe "migrating down" do + subject(:rollback) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:down) } } + + before { migrate } + + it "reverts all comment permissions" do + expect { rollback } + .to change { role_with_all.reload.permissions } + .from(match_array(new_permissions)) + .to(match_array(old_permissions)) + end + + it "reverts only the matching permissions" do + expect { rollback } + .to change { role_with_notes_only.reload.permissions } + .from(match_array(%i[add_work_package_comments edit_own_work_package_comments])) + .to(match_array(%i[add_work_package_notes edit_own_work_package_notes])) + end + end +end From 73b9fb2c6ebfe64244a16c4eb9f4fbfa155b2ce1 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 3 Mar 2026 15:34:54 +0000 Subject: [PATCH 104/334] update locales from crowdin [ci skip] --- config/locales/crowdin/af.yml | 37 +++++++++++++++-------------- config/locales/crowdin/ar.yml | 37 +++++++++++++++-------------- config/locales/crowdin/az.yml | 37 +++++++++++++++-------------- config/locales/crowdin/be.yml | 37 +++++++++++++++-------------- config/locales/crowdin/bg.yml | 37 +++++++++++++++-------------- config/locales/crowdin/ca.yml | 37 +++++++++++++++-------------- config/locales/crowdin/ckb-IR.yml | 37 +++++++++++++++-------------- config/locales/crowdin/cs.yml | 37 +++++++++++++++-------------- config/locales/crowdin/da.yml | 37 +++++++++++++++-------------- config/locales/crowdin/de.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/el.yml | 37 +++++++++++++++-------------- config/locales/crowdin/eo.yml | 37 +++++++++++++++-------------- config/locales/crowdin/es.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/et.yml | 37 +++++++++++++++-------------- config/locales/crowdin/eu.yml | 37 +++++++++++++++-------------- config/locales/crowdin/fa.yml | 37 +++++++++++++++-------------- config/locales/crowdin/fi.yml | 37 +++++++++++++++-------------- config/locales/crowdin/fil.yml | 37 +++++++++++++++-------------- config/locales/crowdin/fr.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/he.yml | 37 +++++++++++++++-------------- config/locales/crowdin/hi.yml | 37 +++++++++++++++-------------- config/locales/crowdin/hr.yml | 37 +++++++++++++++-------------- config/locales/crowdin/hu.yml | 37 +++++++++++++++-------------- config/locales/crowdin/id.yml | 37 +++++++++++++++-------------- config/locales/crowdin/it.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/ja.yml | 37 +++++++++++++++-------------- config/locales/crowdin/ka.yml | 37 +++++++++++++++-------------- config/locales/crowdin/kk.yml | 37 +++++++++++++++-------------- config/locales/crowdin/ko.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/lt.yml | 37 +++++++++++++++-------------- config/locales/crowdin/lv.yml | 37 +++++++++++++++-------------- config/locales/crowdin/mn.yml | 37 +++++++++++++++-------------- config/locales/crowdin/ms.yml | 37 +++++++++++++++-------------- config/locales/crowdin/ne.yml | 37 +++++++++++++++-------------- config/locales/crowdin/nl.yml | 37 +++++++++++++++-------------- config/locales/crowdin/no.yml | 37 +++++++++++++++-------------- config/locales/crowdin/pl.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/pt-BR.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/pt-PT.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/ro.yml | 37 +++++++++++++++-------------- config/locales/crowdin/ru.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/rw.yml | 37 +++++++++++++++-------------- config/locales/crowdin/si.yml | 37 +++++++++++++++-------------- config/locales/crowdin/sk.yml | 37 +++++++++++++++-------------- config/locales/crowdin/sl.yml | 37 +++++++++++++++-------------- config/locales/crowdin/sr.yml | 37 +++++++++++++++-------------- config/locales/crowdin/sv.yml | 37 +++++++++++++++-------------- config/locales/crowdin/th.yml | 37 +++++++++++++++-------------- config/locales/crowdin/tr.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/uk.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/uz.yml | 37 +++++++++++++++-------------- config/locales/crowdin/vi.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/zh-CN.yml | 39 ++++++++++++++++--------------- config/locales/crowdin/zh-TW.yml | 39 ++++++++++++++++--------------- 54 files changed, 1040 insertions(+), 986 deletions(-) diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index bfa127a5d38..582c0757500 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -125,7 +125,7 @@ af: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ af: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ af: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ af: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ af: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ af: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ af: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ af: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index 7c9588c7e45..82e00d9f1ab 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -125,7 +125,7 @@ ar: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ ar: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ ar: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -246,8 +246,8 @@ ar: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -255,8 +255,8 @@ ar: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -268,11 +268,11 @@ ar: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3289,17 +3289,18 @@ ar: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3332,7 +3333,7 @@ ar: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index dffcca0cbac..3914e2af7a2 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -125,7 +125,7 @@ az: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ az: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ az: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ az: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ az: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ az: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ az: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ az: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index a629e6da106..94289951cd1 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -125,7 +125,7 @@ be: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ be: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ be: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -234,8 +234,8 @@ be: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -243,8 +243,8 @@ be: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -256,11 +256,11 @@ be: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3177,17 +3177,18 @@ be: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3220,7 +3221,7 @@ be: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index d3140c04d40..61c1e57abbf 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -125,7 +125,7 @@ bg: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ bg: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ bg: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ bg: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ bg: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ bg: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ bg: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ bg: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index c35a76ca13f..75aa7068bab 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -125,7 +125,7 @@ ca: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ ca: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ ca: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ ca: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ ca: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ ca: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3062,17 +3062,18 @@ ca: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Actualitza a l'edició Enterprise" postgres_migration: "Migrant la teva instal·lació a PostgreSQL" @@ -3105,7 +3106,7 @@ ca: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index 529b23713b5..0951105eb0e 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -125,7 +125,7 @@ ckb-IR: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ ckb-IR: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ ckb-IR: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ ckb-IR: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ ckb-IR: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ ckb-IR: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ ckb-IR: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ ckb-IR: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 347cc44925c..8113475c71b 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -125,7 +125,7 @@ cs: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ cs: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ cs: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -234,8 +234,8 @@ cs: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -243,8 +243,8 @@ cs: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -256,11 +256,11 @@ cs: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3177,17 +3177,18 @@ cs: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgradovat na Enterprise Edici" postgres_migration: "Migrujte vaši instalaci na PostgreSQL" @@ -3220,7 +3221,7 @@ cs: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index b99c84ef163..5946c69c850 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -125,7 +125,7 @@ da: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ da: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ da: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ da: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ da: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ da: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3063,17 +3063,18 @@ da: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3106,7 +3107,7 @@ da: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 8ea2c5688b4..75ad1663830 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -125,7 +125,7 @@ de: new: "Neue Konfiguration" banner: title: "Begrenzter Import" - description: "Dieses Importtool befindet sich derzeit in der Betaphase und kann nur grundlegende Daten importieren: Projekte, Probleme (Name, Titel, Beschreibung), Benutzer (Name, E-Mail, Projektmitgliedschaft), Status und Typen. Es kann keine benutzerdefinierten Workflows, benutzerdefinierten Felder, Anhänge, Problembeziehungen oder Berechtigungen importieren. Wir unterstützen derzeit nur die Jira Server/Data Center Versionen 10.x und 11.x. Cloud-Instanzen werden derzeit nicht unterstützt." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ de: failed: "Verbindung fehlgeschlagen: Serverinformationen können nicht abgerufen werden" error: "Beim Testen der Verbindung ist ein unerwarteter Fehler aufgetreten" connection_error: "Verbindungsfehler: %{message}" - parse_error: "Die Antwort des Servers konnte nicht gelesen werden. Der Server ist möglicherweise keine gültige Jira-Instanz." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API hat den Fehlerstatus %{status} zurückgegeben. Bitte überprüfen Sie die URL Ihrer Jira-Instanz und Ihr API-Token." token_error: "Ungültiger API-Token. Bitte überprüfen Sie Ihre Zugangsdaten in der Konfiguration." missing_credentials: "Bitte geben Sie sowohl URL als auch Persönliches Zugangs-Token an, um die Verbindung zu testen" @@ -167,7 +167,7 @@ de: title: "Noch keine Importläufe eingerichtet" description: "Erstellen Sie einen Importlauf, um den Import von Informationen aus dieser Jira-Instanz zu starten" index: - description: "Sie können bei jedem Importlauf verschiedene Datensätze importieren. Es ist möglich, einen Importlauf unmittelbar danach rückgängig zu machen, aber nicht nach dem Finalisieren." + 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: "Importlauf" button_edit_configuration: "Konfiguration bearbeiten" status: @@ -222,8 +222,8 @@ de: fetch_data: title: "Metadaten der Instanz abrufen" caption_done: "Abgeschlossen" - description: "Klicken Sie auf die Schaltfläche unten, um den Host abzufragen und zu sehen, welche Daten für den Import zur Verfügung stehen." - button_fetch: "Verfügbare Daten vom Host prüfen" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Abrufen von Daten aus Jira..." groups_and_users: title: "Gruppen und Benutzer" @@ -231,8 +231,8 @@ de: title: "Umfang des Imports" caption: "Wählen Sie, was Sie in OpenProject importieren möchten" caption_done: "Abgeschlossen" - label_info: "Bitte beachten Sie, dass dieses Import-Tool in der Beta ist und nicht alle Arten von Daten importieren kann. Hier ist eine Zusammenfassung dessen, was die Host-URL für den Import bietet und was dieses Tool gerade importieren kann." - description: "Wählen Sie aus, welche Daten Sie aus den verfügbaren Daten vom Host importieren möchten." + 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 URL 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_available_data: "Verfügbare Daten" label_not_available_data: "Nicht verfügbar für den Import" button_select_projects: "Projekte zum Importieren auswählen" @@ -244,11 +244,11 @@ de: label_importing: "Wird gerade importiert" elements: relations: "Beziehungen zwischen Tickets" - workflows: "Selbstdefinierte Workflows" + workflows: "Project-level workflows" users: "Accounts" sprints: "Sprints" schemes: "Schemas" - permissions: "Berechtigungen, Rollen" + permissions: "User, group and project permissions" confirm_import: title: "Daten importieren" caption: "Überprüfen Sie Ihre Importeinstellungen und starten Sie den Import" @@ -3057,17 +3057,18 @@ de: learn_about: "Erfahren Sie mehr über die neuen Funktionen" missing: "Es gibt noch keine hervorgehobenen Funktionen." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - Dieses Release enthält verschiedene neue Funktionen und Verbesserungen, wie z. B: + The release contains various new features and improvements, such as: new_features_list: - line_0: Automatisierte Projektinitiierung (Enterprise Add-on). - line_1: "Besprechungen: Fügen Sie neue oder bestehende Arbeitspakete als Ergebnisse hinzu." - line_2: "Besprechungen: iCal-Antworten in OpenProject anzeigen." - line_3: "Wiederkehrende Besprechungen: Kopieren Sie Tagesordnungspunkte zur nächsten Besprechung." - line_4: "Freigabe für die Community-Edition: Hervorhebung von Attributen." - line_5: Warnung vor dem Öffnen externer Links in von Benutzern erstellten Texten (Enterprise Add-on). - line_6: Verbesserte Leistung und Benutzerfreundlichkeit, einschließlich des Aktivität-Tabs und des Dokumenten-Moduls. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Auf Enterprise Edition upgraden" postgres_migration: "Migration Ihrer Installation zu PostgreSQL" @@ -3100,7 +3101,7 @@ de: field_changed: "%{field} geändert von %{old_value} zu %{new_value}" field_set: "%{field} auf %{value} gesetzt" field_removed: "%{field} entfernt" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} gelöscht (%{link})" changed_with_diff: "%{field} geändert (%{link})" set_with_diff: "%{field} gesetzt (%{link})" diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index 55f311f74a2..ae61962e06d 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -125,7 +125,7 @@ el: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ el: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ el: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ el: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ el: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ el: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3061,17 +3061,18 @@ el: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Μεταφορά της εγκατάστασης σας σε PostgreSQL" @@ -3104,7 +3105,7 @@ el: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index 63051541839..cba56102c10 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -125,7 +125,7 @@ eo: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ eo: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ eo: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ eo: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ eo: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ eo: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ eo: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Transmetanta vian instalon al PostgreSQL" @@ -3108,7 +3109,7 @@ eo: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 34083d25cbd..b647e2b250e 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -125,7 +125,7 @@ es: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ es: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ es: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ es: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ es: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ es: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3062,17 +3062,18 @@ es: learn_about: "Más información sobre todas las nuevas funciones" missing: "Aún no hay funciones destacadas." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - El lanzamiento incluye varias funciones nuevas y mejoras, tales como: + The release contains various new features and improvements, such as: new_features_list: - line_0: Inicio automatizado de proyectos (extensión Enterprise). - line_1: "Reuniones: añada paquetes de trabajo nuevos o existentes como resultados." - line_2: "Reuniones: muestre las respuestas de iCal en OpenProject." - line_3: "Reuniones periódicas: duplique los puntos del orden del día para el siguiente evento." - line_4: "Lanzamiento para la versión Community: resaltado de atributos." - line_5: Advertencia antes de abrir enlaces externos en el contenido que ha proporcionado un usuario (extensión Enterprise). - line_6: Mejora del rendimiento y de la experiencia de usuario, incluida la pestaña Actividad y el módulo Documentos. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Actualizar a Enterprise" postgres_migration: "Migrando su instalación a PostgreSQL" @@ -3105,7 +3106,7 @@ es: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index 8e630c12e2e..968b1b9fc02 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -125,7 +125,7 @@ et: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ et: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ et: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ et: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ et: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ et: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ et: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ et: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index b43d073909c..eeeff47ee7b 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -125,7 +125,7 @@ eu: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ eu: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ eu: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ eu: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ eu: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ eu: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ eu: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ eu: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index 9a04e17d814..facad11ba04 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -125,7 +125,7 @@ fa: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ fa: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ fa: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ fa: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ fa: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ fa: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ fa: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ fa: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index b7f4a6588d6..49da623df15 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -125,7 +125,7 @@ fi: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ fi: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ fi: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ fi: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ fi: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ fi: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ fi: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ fi: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index 60c8a2352ea..a2894cd3e1d 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -125,7 +125,7 @@ fil: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ fil: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ fil: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ fil: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ fil: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ fil: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ fil: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ fil: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index d4c7ad14558..145e6601ef9 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -125,7 +125,7 @@ fr: new: "Nouvelle configuration" banner: title: "Importation limitée" - description: "Cet outil d'importation est actuellement en version bêta et ne peut importer que des données de base : projets, problèmes (nom, titre, description), utilisateurs (nom, courriel, appartenance à un projet), statuts et types. Il ne peut pas importer les flux de travail personnalisés, les champs personnalisés, les pièces jointes, les relations entre les problèmes ou les autorisations. Nous ne prenons actuellement en charge que les versions 10.x et 11.x de Jira Server/Data Center. Les instances en nuage ne sont pas prises en charge pour le moment." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Nom" @@ -143,7 +143,7 @@ fr: failed: "Échec de la connexion : Impossible de récupérer les informations sur le serveur" error: "Une erreur inattendue s'est produite lors du test de la connexion" connection_error: "Erreur de connexion : %{message}" - parse_error: "Impossible d'analyser la réponse du serveur Jira. Le serveur n'est peut-être pas une instance Jira valide." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "L'API Jira a renvoyé le statut d'erreur %{status}. Veuillez vérifier l'URL de votre instance Jira et le jeton API." token_error: "Jeton API invalide. Veuillez vérifier vos informations d'identification dans la configuration." missing_credentials: "Veuillez fournir l'URL et le jeton d'accès personnel pour tester la connexion" @@ -167,7 +167,7 @@ fr: title: "Aucun cycle d'importation n'a encore été mis en place" description: "Créez une exécution d'importation pour commencer à importer des informations à partir de cette instance Jira" index: - description: "Vous pouvez importer différents ensembles de données à chaque cycle d'importation. Il est possible d'annuler une importation immédiatement après, mais pas après." + 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: "Importation" button_edit_configuration: "Editer la configuration" status: @@ -222,8 +222,8 @@ fr: fetch_data: title: "Récupérer les métadonnées de l'instance" caption_done: "Terminé" - description: "Cliquez sur le bouton ci-dessous pour interroger l'hôte et voir quelles données sont disponibles pour l'importation." - button_fetch: "Vérifier les données disponibles auprès de l'hôte" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Récupérer les données de Jira..." groups_and_users: title: "Groupes et utilisateurs" @@ -231,8 +231,8 @@ fr: title: "Champ d'application de l'importation" caption: "Choisissez ce que vous voulez importer dans OpenProject" caption_done: "Terminé" - label_info: "Veuillez noter que cet outil d'importation est en version bêta et qu'il ne peut pas importer tous les types de données. Voici un résumé de ce que l'URL de l'hôte offre à l'importation et de ce que cet outil est capable d'importer pour le moment." - description: "Sélectionnez les données que vous souhaitez importer parmi les données disponibles extraites de l'hôte." + 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 URL 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_available_data: "Données disponibles" label_not_available_data: "Non disponible à l'importation" button_select_projects: "Sélectionnez les projets à importer" @@ -244,11 +244,11 @@ fr: label_importing: "Importation en cours" elements: relations: "Relations entre les questions" - workflows: "Flux de travail personnalisés" + workflows: "Project-level workflows" users: "Utilisateurs" sprints: "Sprints" schemes: "Schémas" - permissions: "Permissions, rôles" + permissions: "User, group and project permissions" confirm_import: title: "Importer les données" caption: "Vérifiez vos paramètres d'importation et démarrez l'importation" @@ -3063,17 +3063,18 @@ fr: learn_about: "En savoir plus sur les nouvelles fonctionnalités" missing: "Il n'y a pas encore de fonctionnalités mises en évidence." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - Cette version contient plusieurs nouvelles fonctionnalités et améliorations, telles que: + The release contains various new features and improvements, such as: new_features_list: - line_0: Lancement automatisé de projets (module complémentaire Enterprise). - line_1: "Réunions : ajoutez des work packages nouveaux ou existants en tant que résultats." - line_2: "Réunions : afficher les réponses iCal dans OpenProject." - line_3: "Réunions récurrentes : dupliquez les points de l'ordre du jour lors de la prochaine réunion." - line_4: "Mise à disposition de la Communauté : Mise en évidence des attributs." - line_5: Avertissement avant l'ouverture de liens externes dans le contenu fourni par l'utilisateur (module complémentaire Enterprise). - line_6: Amélioration des performances et de l'expérience utilisateur, y compris l'onglet Activité et le module Documents. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Passer à la version Enterprise" postgres_migration: "Migration de votre installation vers PostgreSQL" @@ -3106,7 +3107,7 @@ fr: field_changed: "%{field} a changé de %{old_value} à %{new_value}" field_set: "%{field} sur %{value}" field_removed: "%{field} supprimée" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} supprimé (%{link})" changed_with_diff: "%{field} modifié (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index 5aaa5fae781..a907d3aa527 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -125,7 +125,7 @@ he: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ he: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ he: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -234,8 +234,8 @@ he: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -243,8 +243,8 @@ he: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -256,11 +256,11 @@ he: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3177,17 +3177,18 @@ he: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3220,7 +3221,7 @@ he: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index 3b7c8ae909a..aec5e238fa0 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -125,7 +125,7 @@ hi: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ hi: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ hi: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ hi: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ hi: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ hi: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3063,17 +3063,18 @@ hi: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3106,7 +3107,7 @@ hi: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index 1a54a221185..79750fde69f 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -125,7 +125,7 @@ hr: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ hr: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ hr: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -228,8 +228,8 @@ hr: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -237,8 +237,8 @@ hr: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -250,11 +250,11 @@ hr: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3121,17 +3121,18 @@ hr: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3164,7 +3165,7 @@ hr: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index 8820307158d..511ecc92edf 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -125,7 +125,7 @@ hu: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ hu: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ hu: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ hu: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ hu: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ hu: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3064,17 +3064,18 @@ hu: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Váltás Vállalati Verzióra" postgres_migration: "A rendszer költöztetése PostreSQL-re" @@ -3107,7 +3108,7 @@ hu: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 838bd97a80d..c6f9ecd206c 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -125,7 +125,7 @@ id: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ id: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ id: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -216,8 +216,8 @@ id: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -225,8 +225,8 @@ id: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -238,11 +238,11 @@ id: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3005,17 +3005,18 @@ id: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrasi instalasi anda ke PostgreSQL" @@ -3048,7 +3049,7 @@ id: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index 835e8730d4c..9b3d34a6157 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -125,7 +125,7 @@ it: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ it: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ it: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ it: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ it: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ it: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3062,17 +3062,18 @@ it: learn_about: "Scopri di più su tutte le nuove funzionalità" missing: "Non ci sono ancora caratteristiche evidenziate." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - Questa versione contiene diverse nuove funzionalità e miglioramenti, come ad esempio: + The release contains various new features and improvements, such as: new_features_list: - line_0: Avvio automatico del progetto (componente aggiuntivo Enterprise). - line_1: "Riunioni: aggiungi macro-attività nuove o esistenti come risultati." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Riunioni ricorrenti: duplica i punti dell'ordine del giorno della prossima ricorrenza." - line_4: "Rilascio alla community: evidenziazione degli attributi." - line_5: Avviso prima dell'apertura di link esterni nei contenuti forniti dall'utente (componente aggiuntivo Enterprise). - line_6: Prestazioni ed esperienza utente migliorate, compresa la scheda Attività e il modulo Documenti. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Aggiorna ad Enterprise edition" postgres_migration: "Migrazione dell'installazione su PostgreSQL" @@ -3105,7 +3106,7 @@ it: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index 202b789a9c8..d4f90ec2826 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -125,7 +125,7 @@ ja: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ ja: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ ja: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -216,8 +216,8 @@ ja: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -225,8 +225,8 @@ ja: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -238,11 +238,11 @@ ja: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3008,17 +3008,18 @@ ja: learn_about: "すべての新機能の詳細" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "エンタープライズ版にアップグレード" postgres_migration: "PostgreSQL にインストールを移行しています" @@ -3051,7 +3052,7 @@ ja: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index 53281d44b9c..b66569a8148 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -125,7 +125,7 @@ ka: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ ka: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ ka: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ ka: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ ka: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ ka: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ ka: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ ka: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index 97540de87da..95d71244696 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -125,7 +125,7 @@ kk: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ kk: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ kk: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ kk: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ kk: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ kk: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ kk: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ kk: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index b7809bc74b4..c75c614500d 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -125,7 +125,7 @@ ko: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ ko: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ ko: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -216,8 +216,8 @@ ko: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -225,8 +225,8 @@ ko: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -238,11 +238,11 @@ ko: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3009,17 +3009,18 @@ ko: learn_about: "새로운 모든 기능에 대해 자세히 알아보기" missing: "아직 강조 표시된 기능이 없습니다." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - 이 릴리스에는 다음과 같은 다양한 새로운 기능과 개선 사항이 포함되어 있습니다. + The release contains various new features and improvements, such as: new_features_list: - line_0: 자동화된 프로젝트 시작(Enterprise 추가 기능). - line_1: "미팅: 새 작업 패키지 또는 기존 작업 패키지를 결과로 추가합니다." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "반복 미팅: 의제 항목을 다음 항목에 복제합니다." - line_4: "커뮤니티에 릴리스: 특성이 강조 표시됩니다." - line_5: 사용자 제공 콘텐츠에서 외부 링크를 열기 전에 표시되는 경고입니다(Enterprise 추가 기능). - line_6: 활동 탭 및 문서 모듈을 비롯한 성능 및 사용자 환경이 개선되었습니다. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Enterprise Edition으로 업그레이드" postgres_migration: "설치를 PostgreSQL로 마이그레이션" @@ -3052,7 +3053,7 @@ ko: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index 1bfd899112b..672330fb3af 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -125,7 +125,7 @@ lt: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ lt: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ lt: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -234,8 +234,8 @@ lt: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -243,8 +243,8 @@ lt: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -256,11 +256,11 @@ lt: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3174,17 +3174,18 @@ lt: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Pagerinti į Enterprise versiją" postgres_migration: "Migruojame jūsų instaliaciją į PostgreSQL" @@ -3217,7 +3218,7 @@ lt: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index 502a085c510..f8a96cc8062 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -125,7 +125,7 @@ lv: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ lv: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ lv: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -228,8 +228,8 @@ lv: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -237,8 +237,8 @@ lv: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -250,11 +250,11 @@ lv: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3121,17 +3121,18 @@ lv: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3164,7 +3165,7 @@ lv: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index e7d5b81561b..fe601cb26a8 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -125,7 +125,7 @@ mn: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ mn: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ mn: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ mn: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ mn: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ mn: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ mn: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ mn: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 8e7117d2905..3cdb9c6007c 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -125,7 +125,7 @@ ms: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ ms: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ ms: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -216,8 +216,8 @@ ms: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -225,8 +225,8 @@ ms: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -238,11 +238,11 @@ ms: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3007,17 +3007,18 @@ ms: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Naik taraf ke edisi Enterprise" postgres_migration: "Mengalihkan pemasangan anda ke PostgreSQL" @@ -3050,7 +3051,7 @@ ms: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index 7c6a27d7199..433761a685b 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -125,7 +125,7 @@ ne: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ ne: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ ne: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ ne: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ ne: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ ne: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ ne: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ ne: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index c5e9d40c7ae..5d45bc2d612 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -125,7 +125,7 @@ nl: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ nl: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ nl: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ nl: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ nl: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ nl: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3061,17 +3061,18 @@ nl: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade naar Enterprise-editie" postgres_migration: "Uw installatie overzetten naar PostgreSQL" @@ -3104,7 +3105,7 @@ nl: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index 363b0b6fc93..7717e94b644 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -125,7 +125,7 @@ new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3064,17 +3064,18 @@ learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Oppgrader til Enterprise utgaven" postgres_migration: "Overføre installasjonen til PostgreSQL" @@ -3107,7 +3108,7 @@ field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index d671059e8d1..e3e7b01d31f 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -125,7 +125,7 @@ pl: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ pl: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ pl: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -234,8 +234,8 @@ pl: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -243,8 +243,8 @@ pl: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -256,11 +256,11 @@ pl: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3173,17 +3173,18 @@ pl: learn_about: "Dowiedz się więcej o wszystkich nowych funkcjach" missing: "Nie ma jeszcze wyróżnionych funkcji." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - Wydanie zawiera różne nowe funkcje i ulepszenia, takie jak: + The release contains various new features and improvements, such as: new_features_list: - line_0: Zautomatyzowane inicjowanie projektów (dodatek wersji Enterprise). - line_1: "Spotkania: dodawaj nowe lub istniejące pakiety robocze jako wyniki." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Spotkania cykliczne: duplikuj punkty planu spotkania w następnym wystąpieniu." - line_4: "Udostępnianie społeczności: wyróżnianie atrybutów." - line_5: Ostrzeżenie przed otwarciem linków zewnętrznych w treści dostarczonej przez użytkownika (dodatek wersji Enterprise). - line_6: Ulepszona wydajność i wrażenia użytkownika, w tym karta Aktywność i moduł Dokumenty. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Aktualizuj do wersji Enterprise" postgres_migration: "Migrowanie instalacji do PostgreSQL" @@ -3216,7 +3217,7 @@ pl: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 57d110d4d44..c28cb046d8b 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -125,7 +125,7 @@ pt-BR: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ pt-BR: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ pt-BR: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ pt-BR: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ pt-BR: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ pt-BR: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3062,17 +3062,18 @@ pt-BR: learn_about: "Saiba mais sobre todos os novos recursos" missing: "Ainda não há recursos destacados." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - A versão traz diversos novos recursos e melhorias, como: + The release contains various new features and improvements, such as: new_features_list: - line_0: Início de projeto automatizado (complementos Enterprise). - line_1: "Reuniões: adicionar pacotes de trabalho novos ou existentes como resultados." - line_2: "Reuniões: exibir respostas do iCal no OpenProject." - line_3: "Reuniões recorrentes: duplicar itens da pauta para a próxima ocorrência." - line_4: "Versão para a comunidade: Realce de atributos." - line_5: Aviso antes de abrir links externos em conteúdo fornecido pelo usuário (complementos Enterprise). - line_6: Desempenho e experiência do usuário aprimorados, incluindo a aba Atividade e o módulo Documentos. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Atualizar para a edição Enterprise" postgres_migration: "Migrando sua instalação para PostgreSQL" @@ -3105,7 +3106,7 @@ pt-BR: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index f3096a63fe6..ea514a08b08 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -125,7 +125,7 @@ pt-PT: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ pt-PT: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ pt-PT: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ pt-PT: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ pt-PT: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ pt-PT: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3062,17 +3062,18 @@ pt-PT: learn_about: "Mais informações sobre todas as novas funcionalidades" missing: "Ainda não há nenhum recurso destacado." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - A versão contém várias novas funcionalidades e melhorias, tais como: + The release contains various new features and improvements, such as: new_features_list: - line_0: Iniciação automatizada de projetos (complemento Enterprise). - line_1: "Reuniões: adicione pacotes de trabalho novos ou existentes como resultados." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Reuniões recorrentes: duplicar os pontos da agenda para a próxima ocorrência." - line_4: "Disponibilizar para a Comunidade: Destaque dos atributos." - line_5: Aviso antes de abrir ligações externas em conteúdos fornecidos pelo utilizador (complemento Enterprise). - line_6: Melhoria do desempenho e da experiência do utilizador, incluindo o separador Atividade e o módulo Documentos. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Aprimorar para a edição Enterprise" postgres_migration: "A migrar a sua instalação para PostgreSQL" @@ -3105,7 +3106,7 @@ pt-PT: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index 89094716117..63edb69773b 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -125,7 +125,7 @@ ro: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ ro: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ ro: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -228,8 +228,8 @@ ro: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -237,8 +237,8 @@ ro: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -250,11 +250,11 @@ ro: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3121,17 +3121,18 @@ ro: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Actualizează la ediția Enterprise" postgres_migration: "Migrarea instalației dvs. către PostgreSQL" @@ -3164,7 +3165,7 @@ ro: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 5ec2aee2a93..6b09a5cb277 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -125,7 +125,7 @@ ru: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ ru: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ ru: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -234,8 +234,8 @@ ru: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -243,8 +243,8 @@ ru: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -256,11 +256,11 @@ ru: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3175,17 +3175,18 @@ ru: learn_about: "Узнайте больше о всех новых функциях" missing: "Нет выделенных функций." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - Релиз содержит различные новые функции и улучшения, такие как: + The release contains various new features and improvements, such as: new_features_list: - line_0: Автоматическая инициация проекта. - line_1: "Совещания: добавление новых или существующих пакетов работ в качестве итогов совещания." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Повторяющиеся совещания: продублируйте пункты повестки дня на следующее совещание." - line_4: "Выпуск для сообщества: Выделение атрибутов." - line_5: Предупреждение перед открытием внешних ссылок в содержании, предоставленном пользователем (Enterprise add-on). - line_6: Улучшена производительность и пользовательский опыт, включая вкладку "Деятельность" и модуль "Документы". + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Обновить до корпоративной версии" postgres_migration: "Перенос вашей установки в PostgreSQL" @@ -3218,7 +3219,7 @@ ru: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index 30eef2ff52b..7431746f73c 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -125,7 +125,7 @@ rw: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ rw: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ rw: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ rw: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ rw: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ rw: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ rw: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ rw: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index 73f1bf4083f..ef1fc18795c 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -125,7 +125,7 @@ si: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ si: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ si: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ si: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ si: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ si: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ si: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "ඔබගේ ස්ථාපනය PostgreSQL වෙත සංක්රමණය කිරීම" @@ -3108,7 +3109,7 @@ si: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index 44d7003208d..91f78b136e7 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -125,7 +125,7 @@ sk: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ sk: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ sk: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -234,8 +234,8 @@ sk: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -243,8 +243,8 @@ sk: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -256,11 +256,11 @@ sk: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3177,17 +3177,18 @@ sk: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3220,7 +3221,7 @@ sk: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 2c7326d61bd..dae22505e81 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -125,7 +125,7 @@ sl: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ sl: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ sl: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -234,8 +234,8 @@ sl: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -243,8 +243,8 @@ sl: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -256,11 +256,11 @@ sl: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3176,17 +3176,18 @@ sl: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Selitev namestitve na PostgreSQL" @@ -3219,7 +3220,7 @@ sl: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index fbac394d096..e504be445f4 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -125,7 +125,7 @@ sr: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ sr: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ sr: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -228,8 +228,8 @@ sr: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -237,8 +237,8 @@ sr: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -250,11 +250,11 @@ sr: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3121,17 +3121,18 @@ sr: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3164,7 +3165,7 @@ sr: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index 786ad085b9f..c732e229ce9 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -125,7 +125,7 @@ sv: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ sv: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ sv: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ sv: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ sv: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ sv: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ sv: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Uppgradera till Enterprise utgåvan" postgres_migration: "Migrera din installation till PostgreSQL" @@ -3108,7 +3109,7 @@ sv: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index c23f55e3399..7a7a982b96c 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -125,7 +125,7 @@ th: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ th: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ th: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -216,8 +216,8 @@ th: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -225,8 +225,8 @@ th: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -238,11 +238,11 @@ th: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3009,17 +3009,18 @@ th: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3052,7 +3053,7 @@ th: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 9dce7e3ffb1..bda1bd8d367 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -125,7 +125,7 @@ tr: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ tr: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ tr: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ tr: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ tr: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ tr: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ tr: learn_about: "Tüm yeni özellikler hakkında daha fazla bilgi edinin" missing: "Henüz vurgulanan bir özellik yok." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - Sürüm, aşağıdakiler gibi çeşitli yeni özellikler ve iyileştirmeler içeriyor: + The release contains various new features and improvements, such as: new_features_list: - line_0: Otomatik proje başlatma (Kurumsal eklenti). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Toplantılar: OpenProject'te iCal yanıtlarını gösterin." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Enterprise sürümüne yükseltin" postgres_migration: "Kurulumunuzu PostgreSQL'e taşıyın" @@ -3108,7 +3109,7 @@ tr: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index ba226987f68..8d42fb4fcc1 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -125,7 +125,7 @@ uk: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ uk: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ uk: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -234,8 +234,8 @@ uk: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -243,8 +243,8 @@ uk: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -256,11 +256,11 @@ uk: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3171,17 +3171,18 @@ uk: learn_about: "Дізнайтеся більше про всі нові функції" missing: "Ще немає виділених функцій." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - Цей випуск містить різноманітні нові функції та покращення, такі як: + The release contains various new features and improvements, such as: new_features_list: - line_0: Автоматизований запуск проєктів (надбудова Enterprise). - line_1: "Наради: додавайте нові або наявні пакети робіт як підсумки." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Повторювані наради: копіюйте пункти порядку денного в наступну нараду." - line_4: "Випуск Community: виділення атрибутів." - line_5: Попередження перед відкриттям зовнішніх посилань у контенті, створеному користувачем (надбудова Enterprise). - line_6: Покращення продуктивності й взаємодії з користувачем, зокрема на вкладці «Дії» і в модулі «Документи». + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Оновлення до версії Enterprise" postgres_migration: "Міграція інсталяції в PostgreSQL" @@ -3214,7 +3215,7 @@ uk: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index f156aa2cfbe..d505db85c3e 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -125,7 +125,7 @@ uz: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ uz: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ uz: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -222,8 +222,8 @@ uz: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -231,8 +231,8 @@ uz: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -244,11 +244,11 @@ uz: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3065,17 +3065,18 @@ uz: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Automated project initiation (Enterprise add-on). - line_1: "Meetings: add new or existing work packages as outcomes." - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "Recurring meetings: duplicate agenda items to the next occurrence." - line_4: "Release to Community: Attribute highlighting." - line_5: Warning before opening external links in user-provided content (Enterprise add-on). - line_6: Improved performance and user experience, including the Activity tab and Documents module. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3108,7 +3109,7 @@ uz: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index e3cffa5a3c6..13547edd9ca 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -125,7 +125,7 @@ vi: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ vi: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ vi: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -216,8 +216,8 @@ vi: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -225,8 +225,8 @@ vi: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -238,11 +238,11 @@ vi: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3007,17 +3007,18 @@ vi: learn_about: "Tìm hiểu thêm về tất cả các tính năng mới" missing: "Chưa có tính năng nổi bật nào." #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - Bản phát hành này bao gồm nhiều tính năng mới và cải tiến, chẳng hạn như: + The release contains various new features and improvements, such as: new_features_list: - line_0: Khởi tạo dự án tự động (Phần mở rộng doanh nghiệp). - line_1: "Họp: Thêm các gói công việc mới hoặc hiện có làm kết quả." - line_2: "Họp: Hiển thị phản hồi iCal trong OpenProject." - line_3: "Cuộc họp định kỳ: Sao chép các mục trong chương trình nghị sự sang lần họp tiếp theo." - line_4: "Phát hành cho cộng đồng: Tính năng làm nổi bật thuộc tính." - line_5: Cảnh báo trước khi mở các liên kết bên ngoài trong nội dung do người dùng cung cấp (Phần mở rộng doanh nghiệp). - line_6: Cải thiện hiệu suất và trải nghiệm người dùng, bao gồm tab Hoạt động và mô-đun Tài liệu. + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Nâng cấp lên phiên bản Enterprise" postgres_migration: "Di chuyển cài đặt của bạn sang PostgreSQL" @@ -3050,7 +3051,7 @@ vi: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index 8bd412ce757..4198b96e867 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -125,7 +125,7 @@ zh-CN: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ zh-CN: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ zh-CN: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -216,8 +216,8 @@ zh-CN: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -225,8 +225,8 @@ zh-CN: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -238,11 +238,11 @@ zh-CN: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3005,17 +3005,18 @@ zh-CN: learn_about: "详细了解所有新功能" missing: "目前还没有高亮显示的功能。" #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - 此版本包含多项新功能和改进,例如: + The release contains various new features and improvements, such as: new_features_list: - line_0: 自动化项目启动(企业版附加组件)。 - line_1: "会议:添加新工作包或现有工作包作为成果。" - line_2: "Meetings: show iCal responses in OpenProject." - line_3: "定期会议:将议程条目复制到下一事件。" - line_4: "发布到社区:特性高亮显示。" - line_5: 在打开用户提供内容中的外部链接前发出警告(企业版附加组件)。 - line_6: 提升了性能和用户体验,包括“活动”选项卡和“文档”模块。 + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "升级到企业版" postgres_migration: "将您的安装迁移到 PostgreSQL" @@ -3048,7 +3049,7 @@ zh-CN: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 33899bebba3..7543e05754f 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -125,7 +125,7 @@ zh-TW: new: "New configuration" banner: title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description), users (name, email, project membership), statuses, and types. It cannot import custom workflows, custom fields, attachments, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: name: "Name" @@ -143,7 +143,7 @@ zh-TW: failed: "Connection failed: Unable to retrieve server information" error: "An unexpected error occurred while testing the connection" connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from Jira server. The server may not be a valid Jira instance." + parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" @@ -167,7 +167,7 @@ zh-TW: title: "No import runs set up yet" 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 but not afterwards." + 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" status: @@ -216,8 +216,8 @@ zh-TW: fetch_data: title: "Fetch instance meta data" caption_done: "Completed" - description: "Click the button below to query the host to see what data is available to import." - button_fetch: "Check available data from host" + description: "Check what data is available for import in the host Jira instance." + button_fetch: "Check available data" label_progress: "Fetching data from Jira..." groups_and_users: title: "Groups and Users" @@ -225,8 +225,8 @@ zh-TW: title: "Import scope" caption: "Choose what you want to import into OpenProject" caption_done: "Completed" - 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 URL offers for import and what this tools is able to import right now." - description: "Select what data you want to import from the available data fetched from the host." + 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 URL 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_available_data: "Available data" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" @@ -238,11 +238,11 @@ zh-TW: label_importing: "Currently importing" elements: relations: "Relations between issues" - workflows: "Custom workflows" + workflows: "Project-level workflows" users: "Users" sprints: "Sprints" schemes: "Schemas" - permissions: "Permissions, roles" + permissions: "User, group and project permissions" confirm_import: title: "Import data" caption: "Review your import settings and start the import" @@ -3005,17 +3005,18 @@ zh-TW: learn_about: "進一步瞭解所有新功能" missing: "目前還沒有突出顯示的功能。" #We need to include the version to invalidate outdated translations in other locales - "17_1": + "17_2": new_features_title: > - 該版本包含多種新功能和改進,例如: + The release contains various new features and improvements, such as: new_features_list: - line_0: 自動化專案啟動(企業附加元件)。 - line_1: "會議:添加新的或現有的工作套件作為成果。" - line_2: "會議:在 OpenProject 中顯示 iCal 回應。" - line_3: "重複性會議:將議程項目重複至下次會議。" - line_4: "發佈到社群:高亮顯示屬性。" - line_5: 在使用者提供的內容中開啟外部連結前警告(企業附加元件)。 - line_6: 改善效能和使用者體驗,包括「活動」標籤和「文件」模組。 + line_0: AI workflows with a secure MCP server (Professional plan and higher) + line_1: Improved project home page with new widget for budgets and improved accessibility + line_2: "Meetings: Meeting templates (Basic plan and higher)" + line_3: Better transparency with project attribute comments. + line_4: PDF export enhancements + line_5: Increased security for external links (Premium plan and higher) + line_6: UI/UX improvements in the Backlogs module + line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "升級到企業版" postgres_migration: "將您的安裝遷移到 PostgreSQL" @@ -3048,7 +3049,7 @@ zh-TW: field_changed: "%{field} changed from %{old_value} to %{new_value}" field_set: "%{field} set to %{value}" field_removed: "%{field} removed" - field_updated: "%{field}" + field_updated: "%{field} updated" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" set_with_diff: "%{field} set (%{link})" From 97d8cd91fb28e7ba5c67be0d3f445e54e5532863 Mon Sep 17 00:00:00 2001 From: Marcello Rocha Date: Tue, 3 Mar 2026 17:15:27 +0100 Subject: [PATCH 105/334] Update tests and code for OAuthUserToken strategy --- .../oauth_configuration.rb | 1 + .../oauth_user_token.rb | 68 +++++++++---------- .../nextcloud/queries/download_link_query.rb | 22 +++--- .../oauth_user_token_spec.rb | 66 ++---------------- .../contracts/storage_contract_spec.rb | 3 +- .../queries/download_link_query_spec.rb | 2 +- .../storages/shared_contract_examples.rb | 6 +- 7 files changed, 52 insertions(+), 116 deletions(-) diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_configuration.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_configuration.rb index 3eb74f53a28..cddf79f3077 100644 --- a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_configuration.rb +++ b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_configuration.rb @@ -49,6 +49,7 @@ module Storages def to_h { issuer:, client_id:, client_secret:, scope: } end + alias_method :to_hash, :to_h end end end diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb index 650f4951fc6..5f1d3c0bb14 100644 --- a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb +++ b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb @@ -39,22 +39,15 @@ module Storages @error_data = Results::Error.new(source: self.class, code: :error) end - # rubocop:disable Metrics/AbcSize def call(storage:, http_options: {}, &) oauth_client = validate_oauth_client(storage).value_or { return Failure(it) } token = current_token(oauth_client).value_or { return Failure(it) } - original_response = yield(httpx_with_auth(token.access_token, http_options)) - - case original_response - in Failure(code: :unauthorized) - updated_token = refresh_token!(storage.oauth_configuration.to_httpx_oauth_config.to_h, - http_options, - token).value_or { return Failure(it) } - yield(httpx_with_auth(updated_token.access_token, http_options)) - else - original_response - end + perform_request( + httpx_oauth_session(storage.oauth_configuration.to_httpx_oauth_config, token, http_options), + token, + & + ) rescue ActiveRecord::StaleObjectError => e raise e if @retried @@ -62,14 +55,33 @@ module Storages @retried = true retry end - # rubocop:enable Metrics/AbcSize private - def httpx_with_auth(access_token, http_options) - OpenProject - .httpx - .with(http_options.deep_merge(headers: { "Authorization" => "Bearer #{access_token}" })) + def perform_request(session, token, &) + response = yield(session) + + response.bind { update_token(session, token) } + + response + rescue HTTPX::TimeoutError => e + handle_timeout(token, e) + rescue HTTPX::Error => e + handle_http_error(token, e) + end + + def update_token(session, token) + oauth_session = session.send(:oauth_session) + token.update!(access_token: oauth_session.access_token, refresh_token: oauth_session.refresh_token) + end + + def httpx_oauth_session(oauth_config, token, http_options) + OpenProject.httpx + .plugin(:retries) + .plugin(:oauth) + .with(**http_options, + oauth_options: { **oauth_config, + access_token: token.access_token, refresh_token: token.refresh_token }) end def validate_oauth_client(storage) @@ -78,33 +90,15 @@ module Storages Failure(@error_data.with(code: :missing_oauth_client, payload: storage)) end - def refresh_token!(oauth_config, http_options, token) - oauth_session = OpenProject - .httpx - .oauth_auth(**oauth_config, - refresh_token: token.refresh_token, - token_endpoint_auth_method: "client_secret_post") - .with(http_options) - .with_access_token - .instance_variable_get(:@options) - .oauth_session - token.update!(access_token: oauth_session.access_token, refresh_token: oauth_session.refresh_token) - Success(token) - rescue HTTPX::HTTPError => e - handle_http_error(token, e) - rescue HTTPX::TimeoutError => e - handle_timeout(token, e) - end - def handle_timeout(token, exception) Rails.logger.error("Timeout while refreshing OAuth token. - Payload: #{exception.message}") - token.destroy + token.destroy! Failure(@error_data.with(error: :timeout_on_refresh, payload: exception)) end def handle_http_error(token, error) Rails.logger.error("Error while refreshing OAuth token - Payload: #{error.response}") - token.destroy + token.destroy! Failure(@error_data.with(code: :unauthorized, payload: error.response)) end diff --git a/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb b/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb index 5c5d34ad56b..41427e3201e 100644 --- a/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb +++ b/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb @@ -35,11 +35,9 @@ module Storages module Queries class DownloadLinkQuery < Base def call(auth_strategy:, input_data:) - Authentication[auth_strategy].call(storage: @storage, http_options:) do |http| - fetch_origin_name(input_data, auth_strategy).bind do |origin_name| - fetch_download_token(auth_strategy, input_data.file_id).fmap do |token| - URI(download_link(token, origin_name)) - end + fetch_origin_name(input_data, auth_strategy).bind do |origin_name| + fetch_download_token(auth_strategy, input_data.file_id).fmap do |token| + URI(download_link(token, origin_name)) end end end @@ -55,7 +53,7 @@ module Storages case response in { status: 200..299 } - if response.body.blank? + if response.body.to_s.empty? Failure(error.with(code: :unauthorized)) else build_download_link(response, error) @@ -70,14 +68,12 @@ module Storages end def fetch_origin_name(input_data, auth_strategy) - FileInfoQuery.call(storage: @storage, auth_strategy:, input_data:) - .bind do |file_info| - file_name = file_info.name - return Success(file_name) if file_name.present? + FileInfoQuery.call(storage: @storage, auth_strategy:, input_data:).bind do |file_info| + file_name = file_info.name + return Success(file_name) if file_name.present? - error = Results::Error.new(source: self.class, payload: file_info) - Failure(error.with(code: :not_found)) - end + Failure(Results::Error.new(source: self.class, payload: file_info, code: :not_found)) + end end def fetch_download_token(auth_strategy, file_id) diff --git a/modules/storages/spec/common/storages/adapters/authentication_strategies/oauth_user_token_spec.rb b/modules/storages/spec/common/storages/adapters/authentication_strategies/oauth_user_token_spec.rb index 0742fa87b32..68ac775cfaa 100644 --- a/modules/storages/spec/common/storages/adapters/authentication_strategies/oauth_user_token_spec.rb +++ b/modules/storages/spec/common/storages/adapters/authentication_strategies/oauth_user_token_spec.rb @@ -98,7 +98,7 @@ module Storages allow(Rails.logger).to receive(:error) allow(strategy).to receive(:current_token).and_return(Success(token)) - allow(token).to receive(:destroy).and_raise(ActiveRecord::StaleObjectError).twice + allow(token).to receive(:destroy!).and_raise(ActiveRecord::StaleObjectError).twice expect do strategy.call(storage:, http_options:) { |http| make_request(http) } @@ -109,68 +109,16 @@ module Storages end context "with invalid oauth access token" do - it "must refresh token and return success" do - storage - token = OAuthClientToken.last - user_request_stub_1 = stub_request(:get, "https://nextcloud.local/ocs/v1.php/cloud/user") - .with( - headers: { - "Accept" => "*/*", - "Accept-Encoding" => "gzip, deflate", - "Authorization" => "Bearer #{token.access_token}", - "User-Agent" => /OpenProject \d+\.\d+\.\d+ HTTPX Client/ - } - ) - .to_return(status: 401, body: <<~XML, headers: {}) - - - - failure - 997 - Current user is not logged in - - - - - - XML - user_request_stub_2 = stub_request(:get, "https://nextcloud.local/ocs/v1.php/cloud/user") - .with( - headers: { - "Accept" => "*/*", - "Accept-Encoding" => "gzip, deflate", - "Authorization" => "Bearer NEW_ACCESS_TOKEN", - "User-Agent" => /OpenProject \d+\.\d+\.\d+ HTTPX Client/ - } - ) - .to_return(status: 200, body: <<~JSON, headers: { "Content-Type" => "application/json; charset=utf-8" }) - {"ocs":{"meta":{"status":"ok","statuscode":100,"message":"OK","totalitems":"","itemsperpage":""},"data":{"enabled":true,"storageLocation":"/var/www/html/data/admin","id":"admin","lastLogin":1709888213000,"backend":"Database","subadmin":[],"quota":{"free":962269761536,"used":1137306515,"total":963407068051,"relative":0.12,"quota":-3},"manager":"","avatarScope":"v2-federated","email":null,"emailScope":"v2-federated","additional_mail":[],"additional_mailScope":[],"displayname":"admin","display-name":"admin","displaynameScope":"v2-federated","phone":"","phoneScope":"v2-local","address":"","addressScope":"v2-local","website":"","websiteScope":"v2-local","twitter":"","twitterScope":"v2-local","fediverse":"","fediverseScope":"v2-local","organisation":"","organisationScope":"v2-local","role":"","roleScope":"v2-local","headline":"","headlineScope":"v2-local","biography":"","biographyScope":"v2-local","profile_enabled":"1","profile_enabledScope":"v2-local","groups":["admin"],"language":"en","locale":"","notify_email":null,"backendCapabilities":{"setDisplayName":true,"setPassword":true}}}} - JSON - token_request_stub = stub_request(:post, "https://nextcloud.local/index.php/apps/oauth2/api/v1/token") - .with( - body: { "client_id" => token.oauth_client.client_id, - "client_secret" => token.oauth_client.client_secret, - "grant_type" => "refresh_token", - "refresh_token" => token.refresh_token, - "scope" => "" }, - headers: { - "Accept" => "*/*", - "Accept-Encoding" => "gzip, deflate", - "Content-Type" => "application/x-www-form-urlencoded", - "User-Agent" => /OpenProject \d+\.\d+\.\d+ HTTPX Client/ - } - ) - .to_return(status: 200, body: <<~JSON, headers: { "Content-Type" => "application/json; charset=utf-8" }) - {"access_token":"NEW_ACCESS_TOKEN","token_type":"Bearer","expires_in":3600,"refresh_token":"NEW_REFRESH_TOKEN","user_id":"admin"} - JSON - result = Authentication[strategy_data].call(storage:) { |http| make_request(http) } + it "must refresh token and return success", vcr: "auth/nextcloud/refresh_token" do + token = OAuthClientToken.where(oauth_client_id: storage.oauth_client.id).last + original_access_token = token&.access_token + token&.update!(access_token: "NOT_A_VALID_TOKEN") - expect(user_request_stub_1).to have_been_made.once - expect(user_request_stub_2).to have_been_made.once - expect(token_request_stub).to have_been_made.once + result = Authentication[strategy_data].call(storage:) { |http| make_request(http) } expect(result).to be_success expect(result.value!).to eq("EXPECTED_RESULT") + expect(original_access_token).not_to eq(token&.reload&.access_token) end end diff --git a/modules/storages/spec/common/storages/adapters/providers/nextcloud/contracts/storage_contract_spec.rb b/modules/storages/spec/common/storages/adapters/providers/nextcloud/contracts/storage_contract_spec.rb index ae89c97cdf5..6a9cb9398bd 100644 --- a/modules/storages/spec/common/storages/adapters/providers/nextcloud/contracts/storage_contract_spec.rb +++ b/modules/storages/spec/common/storages/adapters/providers/nextcloud/contracts/storage_contract_spec.rb @@ -95,8 +95,7 @@ module Storages "Please verify that the connection is functioning properly." expect(subject.errors.to_hash).to eq({ password: [message] }) - # twice due to HTTPX retry plugin being enabled. - expect(credentials_request).to have_been_made.twice + expect(credentials_request).to have_been_made end end diff --git a/modules/storages/spec/common/storages/adapters/providers/nextcloud/queries/download_link_query_spec.rb b/modules/storages/spec/common/storages/adapters/providers/nextcloud/queries/download_link_query_spec.rb index ed9da57e56e..a7b7f2ecd28 100644 --- a/modules/storages/spec/common/storages/adapters/providers/nextcloud/queries/download_link_query_spec.rb +++ b/modules/storages/spec/common/storages/adapters/providers/nextcloud/queries/download_link_query_spec.rb @@ -81,7 +81,7 @@ module Storages end end - context "with outbound request returning 200 and an empty body" do + context "with outbound request returning 200 and an empty body", skip: "Pending investigation on NC behaviour" do it "refreshes the token and returns success", vcr: "nextcloud/download_link_query_unauthorized" do download_link = subject.call(auth_strategy:, input_data:) expect(download_link).to be_success 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 b4479c92e5a..b6a08f63096 100644 --- a/modules/storages/spec/contracts/storages/storages/shared_contract_examples.rb +++ b/modules/storages/spec/contracts/storages/storages/shared_contract_examples.rb @@ -192,8 +192,7 @@ RSpec.shared_examples_for "nextcloud storage contract", :storage_server_helpers, it "retries failed request once" do contract.validate - # twice due to HTTPX retry plugin being enabled. - expect(stub_server_capabilities).to have_been_made.twice + expect(stub_server_capabilities).to have_been_made end end @@ -204,8 +203,7 @@ RSpec.shared_examples_for "nextcloud storage contract", :storage_server_helpers, it "retries failed request once" do contract.validate - # twice due to HTTPX retry plugin being enabled. - expect(stub_config_check).to have_been_made.twice + expect(stub_config_check).to have_been_made end end end From 73b215c7b2becff3c6d25d840c6c7bd0588ee0c6 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 3 Mar 2026 16:41:44 +0000 Subject: [PATCH 106/334] update locales from crowdin [ci skip] --- config/locales/crowdin/de.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 1b849652ef4..bf5289c8ba3 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -125,7 +125,7 @@ de: new: "Neue Konfiguration" banner: title: "Begrenzter Import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "Dieses Importtool befindet sich derzeit in der Betaphase und kann nur grundlegende Daten importieren: Projekte, Tickets (Name, Titel, Beschreibung, Anhänge), Nutzer (Name, E-Mail, Projektmitgliedschaft), Status und Typen. Es kann keine Workflows, benutzerdefinierten Felder, Ticketbeziehungen oder Berechtigungen importieren. Wir unterstützen derzeit nur die Jira Server/Data Center Versionen 10.x und 11.x. Cloud-Instanzen werden derzeit nicht unterstützt." form: fields: name: "Name" @@ -143,7 +143,7 @@ de: failed: "Verbindung fehlgeschlagen: Serverinformationen können nicht abgerufen werden" error: "Beim Testen der Verbindung ist ein unerwarteter Fehler aufgetreten" connection_error: "Verbindungsfehler: %{message}" - parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." + parse_error: "Die Antwort des Servers konnte nicht gelesen werden. Der Server ist möglicherweise keine gültige Jira-Instanz." api_error: "Jira API hat den Fehlerstatus %{status} zurückgegeben. Bitte überprüfen Sie die URL Ihrer Jira-Instanz und Ihr API-Token." token_error: "Ungültiger API-Token. Bitte überprüfen Sie Ihre Zugangsdaten in der Konfiguration." missing_credentials: "Bitte geben Sie sowohl URL als auch Persönliches Zugangs-Token an, um die Verbindung zu testen" @@ -167,7 +167,7 @@ de: title: "Noch keine Importläufe eingerichtet" description: "Erstellen Sie einen Importlauf, um den Import von Informationen aus dieser Jira-Instanz zu starten" 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." + description: "Sie können bei jedem Importlauf verschiedene Datensätze importieren. Es ist möglich, einen Importlauf unmittelbar danach rückgängig zu machen, aber nicht nach dem Abschluss-Schritt." button_import_run: "Importlauf" button_edit_configuration: "Konfiguration bearbeiten" status: @@ -222,8 +222,8 @@ de: fetch_data: title: "Metadaten der Instanz abrufen" caption_done: "Abgeschlossen" - description: "Check what data is available for import in the host Jira instance." - button_fetch: "Check available data" + description: "Prüfen Sie, welche Daten in der Host-Jira-Instanz zum Import verfügbar sind." + button_fetch: "Verfügbare Daten prüfen" label_progress: "Abrufen von Daten aus Jira..." groups_and_users: title: "Gruppen und Benutzer" @@ -231,8 +231,8 @@ de: title: "Umfang des Imports" caption: "Wählen Sie, was Sie in OpenProject importieren möchten" caption_done: "Abgeschlossen" - 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 URL 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_info: "Bitte beachten Sie, dass dieses Import-Tool in der Beta ist und nicht alle Arten von Daten importieren kann. Hier ist eine Zusammenfassung dessen, was der Host Jira Instanz URL für den Import bietet und was dieses Tool gerade importieren kann." + description: "Wählen Sie aus den verfügbaren Daten, die Sie aus der Host-Jira-Instanz abrufen, die Daten aus, die Sie importieren möchten." label_available_data: "Verfügbare Daten" label_not_available_data: "Nicht verfügbar für den Import" button_select_projects: "Projekte zum Importieren auswählen" @@ -244,11 +244,11 @@ de: label_importing: "Wird gerade importiert" elements: relations: "Beziehungen zwischen Tickets" - workflows: "Project-level workflows" + workflows: "Workflows auf Projektebene" users: "Accounts" sprints: "Sprints" schemes: "Schemas" - permissions: "User, group and project permissions" + permissions: "Benutzer-, Gruppen- und Projektberechtigungen" confirm_import: title: "Daten importieren" caption: "Überprüfen Sie Ihre Importeinstellungen und starten Sie den Import" @@ -3105,7 +3105,7 @@ de: field_changed: "%{field} geändert von %{old_value} zu %{new_value}" field_set: "%{field} auf %{value} gesetzt" field_removed: "%{field} entfernt" - field_updated: "%{field} updated" + field_updated: "%{field} aktualisiert" deleted_with_diff: "%{field} gelöscht (%{link})" changed_with_diff: "%{field} geändert (%{link})" set_with_diff: "%{field} gesetzt (%{link})" From 080a02eb25b1ea614b8c83aa2103c961419cc8cf Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 3 Mar 2026 18:34:38 +0100 Subject: [PATCH 107/334] clarify cost admin settings form --- .../app/views/admin/costs_settings/show.html.erb | 15 +++++++++++++-- modules/costs/config/locales/en.yml | 5 ++++- ...0303172517_suffix_or_prefix_currency_format.rb | 12 ++++++++++++ modules/costs/lib/costs/engine.rb | 2 +- 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 modules/costs/db/migrate/20260303172517_suffix_or_prefix_currency_format.rb diff --git a/modules/costs/app/views/admin/costs_settings/show.html.erb b/modules/costs/app/views/admin/costs_settings/show.html.erb index dab2f65b85f..bce17b94489 100644 --- a/modules/costs/app/views/admin/costs_settings/show.html.erb +++ b/modules/costs/app/views/admin/costs_settings/show.html.erb @@ -42,8 +42,19 @@ See COPYRIGHT and LICENSE files for more details. subhead.with_description { I18n.t(:description_costs_settings) } end end - form.text_field(name: :costs_currency, input_width: :small) - form.text_field(name: :costs_currency_format, input_width: :small) + form.text_field( + name: :costs_currency, + input_width: :xsmall, + caption: I18n.t(:setting_costs_currency_caption) + ) + form.select_list( + name: :costs_currency_format, + values: [ + [I18n.t(:setting_costs_currency_format_prefix), "%u %n"], + [I18n.t(:setting_costs_currency_format_suffix), "%n %u"] + ], + input_width: :small + ) form.submit end diff --git a/modules/costs/config/locales/en.yml b/modules/costs/config/locales/en.yml index eee2eed4809..b1d3e79f54e 100644 --- a/modules/costs/config/locales/en.yml +++ b/modules/costs/config/locales/en.yml @@ -224,7 +224,10 @@ en: setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/db/migrate/20260303172517_suffix_or_prefix_currency_format.rb b/modules/costs/db/migrate/20260303172517_suffix_or_prefix_currency_format.rb new file mode 100644 index 00000000000..ee9ac1560b6 --- /dev/null +++ b/modules/costs/db/migrate/20260303172517_suffix_or_prefix_currency_format.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class SuffixOrPrefixCurrencyFormat < ActiveRecord::Migration[8.1] + def up + execute <<~SQL.squish + UPDATE settings + SET value = '%n %u' + WHERE name = 'costs_currency_format' + AND value NOT IN ('%u %n', '%n %u'); + SQL + end +end diff --git a/modules/costs/lib/costs/engine.rb b/modules/costs/lib/costs/engine.rb index 698b425fba4..1fe57a590fd 100644 --- a/modules/costs/lib/costs/engine.rb +++ b/modules/costs/lib/costs/engine.rb @@ -167,7 +167,7 @@ module Costs initializer "costs.settings" do ::Settings::Definition.add "costs_currency", default: "€", format: :string - ::Settings::Definition.add "costs_currency_format", default: "%n %u", format: :string + ::Settings::Definition.add "costs_currency_format", default: "%n %u", format: :string, allowed: ["%u %n", "%n %u"] ::Settings::Definition.add "allow_tracking_start_and_end_times", default: false, format: :boolean ::Settings::Definition.add "enforce_tracking_start_and_end_times", default: false, format: :boolean end From 5d5d6bba5b147a7d52237f54b7b844f8d81fd61a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 21:17:28 +0000 Subject: [PATCH 108/334] Bump dawidd6/action-send-mail from 7 to 11 Bumps [dawidd6/action-send-mail](https://github.com/dawidd6/action-send-mail) from 7 to 11. - [Release notes](https://github.com/dawidd6/action-send-mail/releases) - [Commits](https://github.com/dawidd6/action-send-mail/compare/v7...v11) --- updated-dependencies: - dependency-name: dawidd6/action-send-mail dependency-version: '11' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/email-notification.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/email-notification.yml b/.github/workflows/email-notification.yml index dda751a5c28..0f2d3cb0b9c 100644 --- a/.github/workflows/email-notification.yml +++ b/.github/workflows/email-notification.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Send mail - uses: dawidd6/action-send-mail@v7 + uses: dawidd6/action-send-mail@v11 with: subject: ${{ inputs.subject }} body: ${{ inputs.body }} From d4e84c63fe4e4d4cb2482faff9d3b6ee0ce7d8ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 21:18:04 +0000 Subject: [PATCH 109/334] Bump actions/download-artifact from 7 to 8 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7 to 8. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v7...v8) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 6fb968d0a98..613f433487a 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -173,7 +173,7 @@ jobs: run: | cp ./docker/prod/Dockerfile ./Dockerfile - name: Download precompiled public assets - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: name: public-assets-${{ inputs.tag }}-${{ github.sha }} path: public/ @@ -313,7 +313,7 @@ jobs: overwrite: true name: "merged-digests-${{ inputs.tag }}-${{ matrix.target }}-${{ github.run_number }}-${{ github.run_attempt }}" - name: Download digests - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: name: "merged-digests-${{ inputs.tag }}-${{ matrix.target }}-${{ github.run_number }}-${{ github.run_attempt }}" path: /tmp/digests From ce64f516603bccd712abde4e652a61256ad5ac10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 21:18:52 +0000 Subject: [PATCH 110/334] Bump actions/upload-artifact from 6 to 7 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docker.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 6fb968d0a98..c60156cc2c0 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -113,7 +113,7 @@ jobs: ./docker/prod/setup/precompile-assets.sh # public/assets will be saved as artifact, so temporarily copying config file there as well cp config/frontend_assets.manifest.json public/assets/frontend_assets.manifest.json - - uses: actions/upload-artifact@v6 + - uses: actions/upload-artifact@v7 with: path: public/ name: public-assets-${{ inputs.tag }}-${{ github.sha }} @@ -291,7 +291,7 @@ jobs: digest="${{ steps.push.outputs.digest }}" touch "/tmp/digests/${digest#sha256:}" - name: Upload digest - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: digests-${{ inputs.tag }}-${{ matrix.target }}--${{ matrix.digest }} path: /tmp/digests/* @@ -307,7 +307,7 @@ jobs: - build steps: - name: Merge digests - uses: actions/upload-artifact/merge@v6 + uses: actions/upload-artifact/merge@v7 with: pattern: "digests-${{ inputs.tag }}-${{ matrix.target }}--*" overwrite: true From 99ae49ab425b74cbe394705b4a91fc081012b834 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 05:07:29 +0000 Subject: [PATCH 111/334] Bump grape from 2.4.0 to 3.0.0 Bumps [grape](https://github.com/ruby-grape/grape) from 2.4.0 to 3.0.0. - [Changelog](https://github.com/ruby-grape/grape/blob/master/CHANGELOG.md) - [Commits](https://github.com/ruby-grape/grape/compare/v2.4.0...v3.0.0) --- updated-dependencies: - dependency-name: grape dependency-version: 3.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index bfc8f848d51..2119330189f 100644 --- a/Gemfile +++ b/Gemfile @@ -388,7 +388,7 @@ end gem "bootsnap", "~> 1.23.0", require: false # API gems -gem "grape", "~> 2.4.0" +gem "grape", "~> 3.0.0" gem "grape_logging", "~> 3.0.0" gem "roar", "~> 1.2.0" diff --git a/Gemfile.lock b/Gemfile.lock index 3e29814bb05..accb5397ad2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -671,8 +671,9 @@ GEM multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) - grape (2.4.0) - activesupport (>= 6.1) + grape (3.0.0) + activesupport (>= 7.0) + dry-configurable dry-types (>= 1.1) mustermann-grape (~> 1.1.0) rack (>= 2) @@ -827,6 +828,7 @@ GEM mini_magick (5.3.1) logger mini_mime (1.1.5) + mini_portile2 (2.8.9) minitest (6.0.2) drb (~> 2.0) prism (~> 1.5) @@ -1623,7 +1625,7 @@ DEPENDENCIES good_job (~> 4.12.0) google-apis-gmail_v1 googleauth - grape (~> 2.4.0) + grape (~> 3.0.0) grape_logging (~> 3.0.0) grids! html-pipeline (~> 2.14.0) @@ -1949,7 +1951,7 @@ CHECKSUMS google-protobuf (4.33.5-x86_64-linux-musl) sha256=d14feec9118f44cfdc3ee4a1d1baa4e6dd77fa418967ccf22ecbe76b8c1bacbf googleapis-common-protos-types (1.22.0) sha256=f97492b77bd6da0018c860d5004f512fe7cd165554d7019a8f4df6a56fbfc4c7 googleauth (1.16.1) sha256=36776bce9d55d8c1a0c6638c939b000dcee5954ca5b728f06ec4c2df4a46709c - grape (2.4.0) sha256=3d59673e80f11d49ba86270b78344e5348dc057b318c2bbc1c01f3532f9b6aec + grape (3.0.0) sha256=bdaa333ffe535322043f1baa9d26dcbd5d6e0e27cc7402f649dc48cf18a6de57 grape_logging (3.0.0) sha256=7b62d984ce96df15d120508668debe307e6a59ac1c511f1d9b5f3b4bea793e13 gravatar_image_tag (1.2.0) sha256=eb5630fea846b711e713b934a0178fb9785f02f4eb9ced8d6faa4d537c40fdcf grids (1.0.0) @@ -2011,6 +2013,7 @@ CHECKSUMS mime-types-data (3.2026.0224) sha256=bea02e0168b37f6935696c4fcfeb3374a0a62e82e6187af5f3f3b709bf67e5fd mini_magick (5.3.1) sha256=29395dfd76badcabb6403ee5aff6f681e867074f8f28ce08d78661e9e4a351c4 mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef + mini_portile2 (2.8.9) sha256=0cd7c7f824e010c072e33f68bc02d85a00aeb6fce05bb4819c03dfd3c140c289 minitest (6.0.2) sha256=db6e57956f6ecc6134683b4c87467d6dd792323c7f0eea7b93f66bd284adbc3d msgpack (1.8.0) sha256=e64ce0212000d016809f5048b48eb3a65ffb169db22238fb4b72472fecb2d732 multi_json (1.19.1) sha256=7aefeff8f2c854bf739931a238e4aea64592845e0c0395c8a7d2eea7fdd631b7 From 4bb5d3a857dea1e003d8d1df37607f1676af0f95 Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 18 Nov 2025 11:28:30 +0100 Subject: [PATCH 112/334] adapt patch for grape 3.0 --- lib/api/open_project_api.rb | 24 -------- lib/open_project/patches/grape_dsl_routing.rb | 61 +++++++++++++++++++ 2 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 lib/open_project/patches/grape_dsl_routing.rb diff --git a/lib/api/open_project_api.rb b/lib/api/open_project_api.rb index 5123a3bb730..3f84f7ed400 100644 --- a/lib/api/open_project_api.rb +++ b/lib/api/open_project_api.rb @@ -40,27 +40,3 @@ module API end end end - -Grape::DSL::Routing::ClassMethods.module_eval do - # Be reload safe. otherwise, an infinite loop occurs on reload. - unless instance_methods.include?(:orig_namespace) - alias :orig_namespace :namespace - end - - def namespace(space = nil, options = {}, &) - orig_namespace(space, options) do - instance_eval(&) - apply_patches(space) - end - end - - def apply_patches(path) - (patches[path] || []).each do |patch| - instance_eval(&patch) - end - end - - def patches - Constants::APIPatchRegistry.patches_for(base) - end -end diff --git a/lib/open_project/patches/grape_dsl_routing.rb b/lib/open_project/patches/grape_dsl_routing.rb new file mode 100644 index 00000000000..77fc3f1425b --- /dev/null +++ b/lib/open_project/patches/grape_dsl_routing.rb @@ -0,0 +1,61 @@ +# 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::Patches::GrapeDslRouting + extend ActiveSupport::Concern + + included do + # Be reload safe. otherwise, an infinite loop occurs on reload. + unless instance_methods.include?(:orig_namespace) + alias :orig_namespace :namespace + end + + def namespace(space = nil, options = {}, &) + orig_namespace(space, options) do + instance_eval(&) + apply_patches(space) + end + end + + def apply_patches(path) + (patches[path] || []).each do |patch| + instance_eval(&patch) + end + end + + def patches + Constants::APIPatchRegistry.patches_for(base) + end + end +end + +OpenProject::Patches.patch_gem_version "grape", "3.0.0" do + Grape::DSL::Routing.include OpenProject::Patches::GrapeDslRouting +end From 29d78aaa769de89e6fa8cbae85540571f063768f Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 3 Mar 2026 22:24:45 +0100 Subject: [PATCH 113/334] bump grape --- Gemfile | 2 +- Gemfile.lock | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index 2119330189f..278e22d85fd 100644 --- a/Gemfile +++ b/Gemfile @@ -388,7 +388,7 @@ end gem "bootsnap", "~> 1.23.0", require: false # API gems -gem "grape", "~> 3.0.0" +gem "grape", "~> 3.1.1" gem "grape_logging", "~> 3.0.0" gem "roar", "~> 1.2.0" diff --git a/Gemfile.lock b/Gemfile.lock index accb5397ad2..a1083091951 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -671,8 +671,8 @@ GEM multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) - grape (3.0.0) - activesupport (>= 7.0) + grape (3.1.1) + activesupport (>= 7.1) dry-configurable dry-types (>= 1.1) mustermann-grape (~> 1.1.0) @@ -828,7 +828,6 @@ GEM mini_magick (5.3.1) logger mini_mime (1.1.5) - mini_portile2 (2.8.9) minitest (6.0.2) drb (~> 2.0) prism (~> 1.5) @@ -1625,7 +1624,7 @@ DEPENDENCIES good_job (~> 4.12.0) google-apis-gmail_v1 googleauth - grape (~> 3.0.0) + grape (~> 3.1.1) grape_logging (~> 3.0.0) grids! html-pipeline (~> 2.14.0) @@ -1951,7 +1950,7 @@ CHECKSUMS google-protobuf (4.33.5-x86_64-linux-musl) sha256=d14feec9118f44cfdc3ee4a1d1baa4e6dd77fa418967ccf22ecbe76b8c1bacbf googleapis-common-protos-types (1.22.0) sha256=f97492b77bd6da0018c860d5004f512fe7cd165554d7019a8f4df6a56fbfc4c7 googleauth (1.16.1) sha256=36776bce9d55d8c1a0c6638c939b000dcee5954ca5b728f06ec4c2df4a46709c - grape (3.0.0) sha256=bdaa333ffe535322043f1baa9d26dcbd5d6e0e27cc7402f649dc48cf18a6de57 + grape (3.1.1) sha256=774f16782d917a90e69de0499dfaab571e5ad967569ac066a2b0b918af12de69 grape_logging (3.0.0) sha256=7b62d984ce96df15d120508668debe307e6a59ac1c511f1d9b5f3b4bea793e13 gravatar_image_tag (1.2.0) sha256=eb5630fea846b711e713b934a0178fb9785f02f4eb9ced8d6faa4d537c40fdcf grids (1.0.0) @@ -2013,7 +2012,6 @@ CHECKSUMS mime-types-data (3.2026.0224) sha256=bea02e0168b37f6935696c4fcfeb3374a0a62e82e6187af5f3f3b709bf67e5fd mini_magick (5.3.1) sha256=29395dfd76badcabb6403ee5aff6f681e867074f8f28ce08d78661e9e4a351c4 mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef - mini_portile2 (2.8.9) sha256=0cd7c7f824e010c072e33f68bc02d85a00aeb6fce05bb4819c03dfd3c140c289 minitest (6.0.2) sha256=db6e57956f6ecc6134683b4c87467d6dd792323c7f0eea7b93f66bd284adbc3d msgpack (1.8.0) sha256=e64ce0212000d016809f5048b48eb3a65ffb169db22238fb4b72472fecb2d732 multi_json (1.19.1) sha256=7aefeff8f2c854bf739931a238e4aea64592845e0c0395c8a7d2eea7fdd631b7 From dec3d6f35bc5a1f622c0259ea2f3286846fb2e87 Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 3 Mar 2026 22:43:40 +0100 Subject: [PATCH 114/334] adapt grape patch --- lib/open_project/patches/grape_dsl_routing.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/open_project/patches/grape_dsl_routing.rb b/lib/open_project/patches/grape_dsl_routing.rb index 77fc3f1425b..8aaf0402a7f 100644 --- a/lib/open_project/patches/grape_dsl_routing.rb +++ b/lib/open_project/patches/grape_dsl_routing.rb @@ -33,12 +33,12 @@ module OpenProject::Patches::GrapeDslRouting included do # Be reload safe. otherwise, an infinite loop occurs on reload. - unless instance_methods.include?(:orig_namespace) + unless method_defined?(:orig_namespace) alias :orig_namespace :namespace end - def namespace(space = nil, options = {}, &) - orig_namespace(space, options) do + def namespace(space = nil, **, &) + orig_namespace(space, **) do instance_eval(&) apply_patches(space) end @@ -51,11 +51,11 @@ module OpenProject::Patches::GrapeDslRouting end def patches - Constants::APIPatchRegistry.patches_for(base) + Constants::APIPatchRegistry.patches_for(self) end end end -OpenProject::Patches.patch_gem_version "grape", "3.0.0" do +OpenProject::Patches.patch_gem_version "grape", "3.1.1" do Grape::DSL::Routing.include OpenProject::Patches::GrapeDslRouting end From 171614d38cc625122609bcb120bf4eed1ab0203e Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Wed, 4 Mar 2026 03:54:02 +0000 Subject: [PATCH 115/334] update locales from crowdin [ci skip] --- config/locales/crowdin/de.yml | 2 +- modules/backlogs/config/locales/crowdin/af.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/ar.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/az.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/be.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/bg.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/ca.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/ckb-IR.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/cs.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/da.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/de.yml | 10 +++++----- modules/backlogs/config/locales/crowdin/el.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/eo.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/es.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/et.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/eu.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/fa.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/fi.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/fil.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/fr.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/he.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/hi.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/hr.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/hu.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/id.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/it.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/ja.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/ka.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/kk.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/ko.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/lt.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/lv.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/mn.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/ms.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/ne.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/nl.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/no.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/pl.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/pt-BR.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/pt-PT.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/ro.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/ru.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/rw.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/si.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/sk.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/sl.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/sr.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/sv.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/th.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/tr.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/uk.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/uz.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/vi.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/zh-CN.yml | 8 ++++---- modules/backlogs/config/locales/crowdin/zh-TW.yml | 8 ++++---- 55 files changed, 218 insertions(+), 218 deletions(-) diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index bf5289c8ba3..ea6ec87d00f 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -596,7 +596,7 @@ de: confirmation_live_message_unchecked: "Die Schaltfläche zum Fortfahren ist inaktiv. Sie müssen das Kontrollkästchen ankreuzen, um fortzufahren." mcp_configurations: server_url_component: - caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." + caption: "Die URL, unter der der OpenProject MCP-Server erreichbar sein wird. Erforderlich für die Einrichtung von MCP-Clients." label: "Server URL" op_dry_validation: or: "oder" diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml index 5550ad12c3c..d8da316ba21 100644 --- a/modules/backlogs/config/locales/crowdin/af.yml +++ b/modules/backlogs/config/locales/crowdin/af.yml @@ -131,11 +131,11 @@ af: label_sprint_impediments: "Sprint belemmerings" label_sprint_new: "New sprint" label_task_board: "Taak bord" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Kyk na meester-agterstand" - permission_view_taskboards: "Kyk na taakborde" - permission_select_done_statuses: "Kies gedoen statusse" - permission_update_sprints: "Opdateer sprinte" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Agterstandes" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ar.yml b/modules/backlogs/config/locales/crowdin/ar.yml index 73d1e23752d..66d7a9c4be7 100644 --- a/modules/backlogs/config/locales/crowdin/ar.yml +++ b/modules/backlogs/config/locales/crowdin/ar.yml @@ -139,11 +139,11 @@ ar: label_sprint_impediments: "عوائق السباق" label_sprint_new: "New sprint" label_task_board: "لوحة المهمة" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "عرض العمل الرئيسي المتراكم غير المنجز" - permission_view_taskboards: "شاهد لوحات المهمات" - permission_select_done_statuses: "حدد حالات الاتمام" - permission_update_sprints: "قم بتحديث السباقات" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "الأعمال المتراكمة غير المنجزة" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/az.yml b/modules/backlogs/config/locales/crowdin/az.yml index 6b6a4456686..270dce5d8fb 100644 --- a/modules/backlogs/config/locales/crowdin/az.yml +++ b/modules/backlogs/config/locales/crowdin/az.yml @@ -131,11 +131,11 @@ az: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/be.yml b/modules/backlogs/config/locales/crowdin/be.yml index 5f0f3bb647a..8e132c6898b 100644 --- a/modules/backlogs/config/locales/crowdin/be.yml +++ b/modules/backlogs/config/locales/crowdin/be.yml @@ -135,11 +135,11 @@ be: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/bg.yml b/modules/backlogs/config/locales/crowdin/bg.yml index 73729918717..c3d4638764a 100644 --- a/modules/backlogs/config/locales/crowdin/bg.yml +++ b/modules/backlogs/config/locales/crowdin/bg.yml @@ -131,11 +131,11 @@ bg: label_sprint_impediments: "Пречки за спринт" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Изберете готови състояния" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Назад" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ca.yml b/modules/backlogs/config/locales/crowdin/ca.yml index 8700f622e56..61396d82516 100644 --- a/modules/backlogs/config/locales/crowdin/ca.yml +++ b/modules/backlogs/config/locales/crowdin/ca.yml @@ -131,11 +131,11 @@ ca: label_sprint_impediments: "Impediments de sprint" label_sprint_new: "New sprint" label_task_board: "Tauler de tasques" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Visualitza el backlog mestre" - permission_view_taskboards: "Visualitza els taulers de tasques" - permission_select_done_statuses: "Selecciona els estats acabats" - permission_update_sprints: "Actualitza els sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ckb-IR.yml b/modules/backlogs/config/locales/crowdin/ckb-IR.yml index e11abb71b52..d2d018e4fbb 100644 --- a/modules/backlogs/config/locales/crowdin/ckb-IR.yml +++ b/modules/backlogs/config/locales/crowdin/ckb-IR.yml @@ -131,11 +131,11 @@ ckb-IR: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml index 4842cfada30..70a57691619 100644 --- a/modules/backlogs/config/locales/crowdin/cs.yml +++ b/modules/backlogs/config/locales/crowdin/cs.yml @@ -135,11 +135,11 @@ cs: label_sprint_impediments: "Běh impedimenty" label_sprint_new: "New sprint" label_task_board: "Tabule úkolů" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Zobrazit hlavní nevyřízené položky" - permission_view_taskboards: "Zobrazit tabuly úkolů" - permission_select_done_statuses: "Vybrat stavy dokončených" - permission_update_sprints: "Aktualizovat běhy" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Nevyřízené položky" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/da.yml b/modules/backlogs/config/locales/crowdin/da.yml index 876426e8a23..d39b5bc31bc 100644 --- a/modules/backlogs/config/locales/crowdin/da.yml +++ b/modules/backlogs/config/locales/crowdin/da.yml @@ -131,11 +131,11 @@ da: label_sprint_impediments: "Sprint-hindringer" label_sprint_new: "New sprint" label_task_board: "Opgaveoversigt" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Se hoved-backlog" - permission_view_taskboards: "Vis opgaveoversigter" - permission_select_done_statuses: "Vælg udført-statusser" - permission_update_sprints: "Opdatere sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 1cbcd16a6df..5da863b7fc8 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -30,7 +30,7 @@ de: finish_date: "Endtermin" goal: "Sprint-Ziel" name: "Sprint-Name" - sharing: "Sharing" + sharing: "Teilen" sprint: duration: "Sprintdauer" work_package: @@ -131,11 +131,11 @@ de: label_sprint_impediments: "Sprint Hindernisse" label_sprint_new: "Neuer Sprint" label_task_board: "Taskboard" + permission_view_sprints: "View sprints" permission_create_sprints: "Sprints erstellen" - permission_view_master_backlog: "Master Backlog ansehen" - permission_view_taskboards: "Taskboard ansehen" - permission_select_done_statuses: "Abgeschlossene Status auswählen" - permission_update_sprints: "Sprints bearbeiten" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/el.yml b/modules/backlogs/config/locales/crowdin/el.yml index b0a947fa2fd..63c6e1b25e4 100644 --- a/modules/backlogs/config/locales/crowdin/el.yml +++ b/modules/backlogs/config/locales/crowdin/el.yml @@ -131,11 +131,11 @@ el: label_sprint_impediments: "Εμπόδια Sprint" label_sprint_new: "New sprint" label_task_board: "Πίνακας εργασιών" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Εμφάνιση του κύριου backlog" - permission_view_taskboards: "Εμφάνιση πινάκων εργασίας" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Ενημέρωση των sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/eo.yml b/modules/backlogs/config/locales/crowdin/eo.yml index 9a9cf5aba13..0599d6bd42c 100644 --- a/modules/backlogs/config/locales/crowdin/eo.yml +++ b/modules/backlogs/config/locales/crowdin/eo.yml @@ -131,11 +131,11 @@ eo: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index 3a32fe3819a..6e02bc331a7 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -131,11 +131,11 @@ es: label_sprint_impediments: "Impedimentos de sprint" label_sprint_new: "New sprint" label_task_board: "Tablero de tareas" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Ver backlog maestro" - permission_view_taskboards: "Ver tablero de tareas" - permission_select_done_statuses: "Seleccionar estados de finalización" - permission_update_sprints: "Actualizar sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/et.yml b/modules/backlogs/config/locales/crowdin/et.yml index 9ba1d996afa..b758ef183ad 100644 --- a/modules/backlogs/config/locales/crowdin/et.yml +++ b/modules/backlogs/config/locales/crowdin/et.yml @@ -131,11 +131,11 @@ et: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Vali valmis staatused" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/eu.yml b/modules/backlogs/config/locales/crowdin/eu.yml index f296d667350..817d5ef8d8f 100644 --- a/modules/backlogs/config/locales/crowdin/eu.yml +++ b/modules/backlogs/config/locales/crowdin/eu.yml @@ -131,11 +131,11 @@ eu: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/fa.yml b/modules/backlogs/config/locales/crowdin/fa.yml index 76bf8948212..a9d74a009fa 100644 --- a/modules/backlogs/config/locales/crowdin/fa.yml +++ b/modules/backlogs/config/locales/crowdin/fa.yml @@ -131,11 +131,11 @@ fa: label_sprint_impediments: " موانع تاخت" label_sprint_new: "New sprint" label_task_board: "تابلوی وظیفه" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "نمایش بک لاگ اصلی" - permission_view_taskboards: "مشاهده تابلو وظایف" - permission_select_done_statuses: "انتخاب وضعیت های انجام شده" - permission_update_sprints: "بروزرسانی دوره‌ها" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "وظایف" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/fi.yml b/modules/backlogs/config/locales/crowdin/fi.yml index 6468251e66c..6933c27113c 100644 --- a/modules/backlogs/config/locales/crowdin/fi.yml +++ b/modules/backlogs/config/locales/crowdin/fi.yml @@ -131,11 +131,11 @@ fi: label_sprint_impediments: "Sprintin esteet" label_sprint_new: "New sprint" label_task_board: "Tehtävätaulu" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Näytä pääasiallinen työjono" - permission_view_taskboards: "Näytä työtaulut" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Päivitä sprinttejä" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Työjonot" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/fil.yml b/modules/backlogs/config/locales/crowdin/fil.yml index 9546b29fc39..13e748d4e23 100644 --- a/modules/backlogs/config/locales/crowdin/fil.yml +++ b/modules/backlogs/config/locales/crowdin/fil.yml @@ -131,11 +131,11 @@ fil: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index 925f033745c..8aa086df42c 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -131,11 +131,11 @@ fr: label_sprint_impediments: "Obstacles de sprint" label_sprint_new: "Nouveau sprint" label_task_board: "Tableau des tâches" + permission_view_sprints: "View sprints" permission_create_sprints: "Créer des sprints" - permission_view_master_backlog: "Afficher le backlog principal" - permission_view_taskboards: "Voir les tableaux des tâches" - permission_select_done_statuses: "Sélectionner les statuts terminés" - permission_update_sprints: "Éditer les sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/he.yml b/modules/backlogs/config/locales/crowdin/he.yml index c9592ac31b3..45e3711813c 100644 --- a/modules/backlogs/config/locales/crowdin/he.yml +++ b/modules/backlogs/config/locales/crowdin/he.yml @@ -135,11 +135,11 @@ he: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/hi.yml b/modules/backlogs/config/locales/crowdin/hi.yml index 9858e23e4cc..3d9002f92e7 100644 --- a/modules/backlogs/config/locales/crowdin/hi.yml +++ b/modules/backlogs/config/locales/crowdin/hi.yml @@ -131,11 +131,11 @@ hi: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/hr.yml b/modules/backlogs/config/locales/crowdin/hr.yml index 290bc722d71..2a0fc06d152 100644 --- a/modules/backlogs/config/locales/crowdin/hr.yml +++ b/modules/backlogs/config/locales/crowdin/hr.yml @@ -133,11 +133,11 @@ hr: label_sprint_impediments: "Prepreke perioda razvoja" label_sprint_new: "New sprint" label_task_board: "Upravitelj zadatcima" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Pogledaj glavni backlog" - permission_view_taskboards: "Pogledaj upravitelj zadatcima" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Ažuriraj periode razvoja" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/hu.yml b/modules/backlogs/config/locales/crowdin/hu.yml index df057cf59d2..0f2b3d92eb0 100644 --- a/modules/backlogs/config/locales/crowdin/hu.yml +++ b/modules/backlogs/config/locales/crowdin/hu.yml @@ -131,11 +131,11 @@ hu: label_sprint_impediments: "Sprint akadályai" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Elkészültek kiválasztása" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/id.yml b/modules/backlogs/config/locales/crowdin/id.yml index 6ccaf291c33..ffc09eb1198 100644 --- a/modules/backlogs/config/locales/crowdin/id.yml +++ b/modules/backlogs/config/locales/crowdin/id.yml @@ -129,11 +129,11 @@ id: label_sprint_impediments: "Hanbatan kekuatan" label_sprint_new: "New sprint" label_task_board: "Papan tugas" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Lihat backlog master" - permission_view_taskboards: "Lihat papan tugas" - permission_select_done_statuses: "Pilih status selesai" - permission_update_sprints: "Perbarui sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml index 89208deceb1..c8d2735c844 100644 --- a/modules/backlogs/config/locales/crowdin/it.yml +++ b/modules/backlogs/config/locales/crowdin/it.yml @@ -131,11 +131,11 @@ it: label_sprint_impediments: "Impedimenti allo sprint" label_sprint_new: "New sprint" label_task_board: "Pannello delle attività" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Visualizza il master backlog" - permission_view_taskboards: "Visualizza i pannelli delle attività" - permission_select_done_statuses: "Seleziona gli stati terminati" - permission_update_sprints: "Aggiorna gli sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlog" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ja.yml b/modules/backlogs/config/locales/crowdin/ja.yml index 69b0f68c7d3..a2d450f2098 100644 --- a/modules/backlogs/config/locales/crowdin/ja.yml +++ b/modules/backlogs/config/locales/crowdin/ja.yml @@ -129,11 +129,11 @@ ja: label_sprint_impediments: "スプリント障害事項" label_sprint_new: "New sprint" label_task_board: "かんばん" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "マスター バックログの表示" - permission_view_taskboards: "かんばんの表示" - permission_select_done_statuses: "完了ステータスを選択" - permission_update_sprints: "スプリントの更新" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "バックログ" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ka.yml b/modules/backlogs/config/locales/crowdin/ka.yml index 5de4afa6621..9a2ddfabdb5 100644 --- a/modules/backlogs/config/locales/crowdin/ka.yml +++ b/modules/backlogs/config/locales/crowdin/ka.yml @@ -131,11 +131,11 @@ ka: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "ამოცანების დაფა" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "აირჩიეთ დასრულების სტატუსები" - permission_update_sprints: "სპრინტების განახლება" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "შეუსრულებელი ამოცანები" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/kk.yml b/modules/backlogs/config/locales/crowdin/kk.yml index 2534ded0db5..48d2e84dc76 100644 --- a/modules/backlogs/config/locales/crowdin/kk.yml +++ b/modules/backlogs/config/locales/crowdin/kk.yml @@ -131,11 +131,11 @@ kk: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index 15bcd31cb10..82e87b2afae 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -129,11 +129,11 @@ ko: label_sprint_impediments: "스프린트 제한" label_sprint_new: "New sprint" label_task_board: "작업 보드" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "마스터 백로그 보기" - permission_view_taskboards: "작업 보드 보기" - permission_select_done_statuses: "완료 상태 선택" - permission_update_sprints: "스프린트 업데이트" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "백로그" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/lt.yml b/modules/backlogs/config/locales/crowdin/lt.yml index ca6f344c315..3a309a4e2eb 100644 --- a/modules/backlogs/config/locales/crowdin/lt.yml +++ b/modules/backlogs/config/locales/crowdin/lt.yml @@ -135,11 +135,11 @@ lt: label_sprint_impediments: "Sprinto trukdžiai" label_sprint_new: "New sprint" label_task_board: "Užduočių lenta" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Peržiūrėti pagrindinį darbų sąrašą" - permission_view_taskboards: "Peržiūrėti užduočių lentas" - permission_select_done_statuses: "Parinkite atliktas būsenas" - permission_update_sprints: "Atnaujinti sprintus" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Darbų sąrašai" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/lv.yml b/modules/backlogs/config/locales/crowdin/lv.yml index 2dc96d9ce02..a67fe2215bd 100644 --- a/modules/backlogs/config/locales/crowdin/lv.yml +++ b/modules/backlogs/config/locales/crowdin/lv.yml @@ -133,11 +133,11 @@ lv: label_sprint_impediments: "Sprinta šķēršļi" label_sprint_new: "New sprint" label_task_board: "Pieteikumu tāfele" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Skatīt visus nepabeigtos darbus" - permission_view_taskboards: "Apskatīt uzdevumu dēļus" - permission_select_done_statuses: "Izvēlieties pabeigtības statusu" - permission_update_sprints: "Atjaunināt sprintus" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Darbu krātuve" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/mn.yml b/modules/backlogs/config/locales/crowdin/mn.yml index 0a227c8768c..c6bcdd3183e 100644 --- a/modules/backlogs/config/locales/crowdin/mn.yml +++ b/modules/backlogs/config/locales/crowdin/mn.yml @@ -131,11 +131,11 @@ mn: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ms.yml b/modules/backlogs/config/locales/crowdin/ms.yml index 7184f7a83da..c02e0260b8f 100644 --- a/modules/backlogs/config/locales/crowdin/ms.yml +++ b/modules/backlogs/config/locales/crowdin/ms.yml @@ -129,11 +129,11 @@ ms: label_sprint_impediments: "Halangan Pecutan" label_sprint_new: "New sprint" label_task_board: "Papan tugasan" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Paparkan tunggakan utama" - permission_view_taskboards: "Lihat papan tugasan" - permission_select_done_statuses: "Pilih status selesai" - permission_update_sprints: "Kemas kini pecutan" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Tunggakan" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ne.yml b/modules/backlogs/config/locales/crowdin/ne.yml index 03e8a107cbf..7e058e096ab 100644 --- a/modules/backlogs/config/locales/crowdin/ne.yml +++ b/modules/backlogs/config/locales/crowdin/ne.yml @@ -131,11 +131,11 @@ ne: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml index da20d3b0288..b42c7287ce2 100644 --- a/modules/backlogs/config/locales/crowdin/nl.yml +++ b/modules/backlogs/config/locales/crowdin/nl.yml @@ -131,11 +131,11 @@ nl: label_sprint_impediments: "Sprint Obstakels" label_sprint_new: "New sprint" label_task_board: "Taakbord" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Toon Máster Backlog" - permission_view_taskboards: "Bekijk taakborden" - permission_select_done_statuses: "Selecteer voltooide statussen" - permission_update_sprints: "Sprints bijwerken" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index 8eb7b2b3d85..3ad358ece55 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -131,11 +131,11 @@ label_sprint_impediments: "Hindring i etappe" label_sprint_new: "New sprint" label_task_board: "Oppgavetavle" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Vis master forsinkelse" - permission_view_taskboards: "Vis oppgavetavler" - permission_select_done_statuses: "Velg ferdige statuser" - permission_update_sprints: "Oppdater etapper" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Forsinkelser" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index d7f2ee7a9ee..5170eab8967 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -135,11 +135,11 @@ pl: label_sprint_impediments: "Przeszkody sprintu" label_sprint_new: "New sprint" label_task_board: "Panel zadań" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Wyświetl master backlog" - permission_view_taskboards: "Wyświetl panel zadań" - permission_select_done_statuses: "Wybierz wykonane statusy" - permission_update_sprints: "Aktualizuj sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogi" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index 1e4757b0a4e..651194a4984 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -131,11 +131,11 @@ pt-BR: label_sprint_impediments: "Impedimentos da Sprint" label_sprint_new: "New sprint" label_task_board: "Quadro de tarefas" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Visualizar backlog principal" - permission_view_taskboards: "Visualizar quadro de tarefas" - permission_select_done_statuses: "Selecione situações concluídas" - permission_update_sprints: "Editar sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml index 24ba05e13f3..110b226be99 100644 --- a/modules/backlogs/config/locales/crowdin/pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml @@ -131,11 +131,11 @@ pt-PT: label_sprint_impediments: "Impedimentos de Sprint" label_sprint_new: "New sprint" label_task_board: "Quadro de tarefas" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Ver o backlog principal" - permission_view_taskboards: "Ver quadros de tarefas" - permission_select_done_statuses: "Selecione os estados concluídos" - permission_update_sprints: "Atualizar sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ro.yml b/modules/backlogs/config/locales/crowdin/ro.yml index 0bfe585f065..c531362de36 100644 --- a/modules/backlogs/config/locales/crowdin/ro.yml +++ b/modules/backlogs/config/locales/crowdin/ro.yml @@ -133,11 +133,11 @@ ro: label_sprint_impediments: "Impedimentele Sprint" label_sprint_new: "New sprint" label_task_board: "Tablă de sarcini" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Vizualizare master backlog" - permission_view_taskboards: "Vizualizați tablourile de sarcini" - permission_select_done_statuses: "Selectează stările realizate" - permission_update_sprints: "Sprinturi" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Restanțe" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index 1a56c6973d1..c60150308fe 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -135,11 +135,11 @@ ru: label_sprint_impediments: "Препятствия спринта" label_sprint_new: "Новый спринт" label_task_board: "Панель задач" + permission_view_sprints: "View sprints" permission_create_sprints: "Создание спринтов" - permission_view_master_backlog: "Просмотреть главную невыполненную работу" - permission_view_taskboards: "Просмотреть панели задач" - permission_select_done_statuses: "Выберите завершенные статусы" - permission_update_sprints: "Обновить спринты" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Бэклоги" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/rw.yml b/modules/backlogs/config/locales/crowdin/rw.yml index c7567d63aa0..1925bfac9bf 100644 --- a/modules/backlogs/config/locales/crowdin/rw.yml +++ b/modules/backlogs/config/locales/crowdin/rw.yml @@ -131,11 +131,11 @@ rw: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/si.yml b/modules/backlogs/config/locales/crowdin/si.yml index 11961f4bfa2..5c869db9137 100644 --- a/modules/backlogs/config/locales/crowdin/si.yml +++ b/modules/backlogs/config/locales/crowdin/si.yml @@ -131,11 +131,11 @@ si: label_sprint_impediments: "ස්ප්රින්ට් බාධාවන්" label_sprint_new: "New sprint" label_task_board: "කාර්ය මණ්ඩලය" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "ස්වාමියා බැක්ලොග් දැක්ම" - permission_view_taskboards: "දැක්ම කාර්ය මණ්ඩල" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "ස්ප්රින්ට් යාවත්කාලීන" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "බැක්ලොග්ස්" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/sk.yml b/modules/backlogs/config/locales/crowdin/sk.yml index 65389beb0cd..cb7351169f1 100644 --- a/modules/backlogs/config/locales/crowdin/sk.yml +++ b/modules/backlogs/config/locales/crowdin/sk.yml @@ -135,11 +135,11 @@ sk: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "Zobrazenie tabúľ úloh" - permission_select_done_statuses: "Výber stavov hotovo" - permission_update_sprints: "Aktualizácia šprinty" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/sl.yml b/modules/backlogs/config/locales/crowdin/sl.yml index baf7c1842a0..8817f143646 100644 --- a/modules/backlogs/config/locales/crowdin/sl.yml +++ b/modules/backlogs/config/locales/crowdin/sl.yml @@ -135,11 +135,11 @@ sl: label_sprint_impediments: "Motnje sprinta" label_sprint_new: "New sprint" label_task_board: "Tabla opravil" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "glavni zaostanek prejšnje poizvedbe" - permission_view_taskboards: "Prikaz delovne table" - permission_select_done_statuses: "Označi statuse narejeno" - permission_update_sprints: "Posodobi šprinte" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Zaostanki" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/sr.yml b/modules/backlogs/config/locales/crowdin/sr.yml index 673e152be27..23726199b5c 100644 --- a/modules/backlogs/config/locales/crowdin/sr.yml +++ b/modules/backlogs/config/locales/crowdin/sr.yml @@ -133,11 +133,11 @@ sr: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/sv.yml b/modules/backlogs/config/locales/crowdin/sv.yml index 609234acea5..6daea5b38d2 100644 --- a/modules/backlogs/config/locales/crowdin/sv.yml +++ b/modules/backlogs/config/locales/crowdin/sv.yml @@ -131,11 +131,11 @@ sv: label_sprint_impediments: "Sprint hinder" label_sprint_new: "New sprint" label_task_board: "Aktivitetstavla" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Visa master backlog" - permission_view_taskboards: "Visa aktivitetstavlor" - permission_select_done_statuses: "Välj klar status" - permission_update_sprints: "Uppdatera sprinter" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backloggar" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/th.yml b/modules/backlogs/config/locales/crowdin/th.yml index 172a0c7e91f..646b1e09493 100644 --- a/modules/backlogs/config/locales/crowdin/th.yml +++ b/modules/backlogs/config/locales/crowdin/th.yml @@ -129,11 +129,11 @@ th: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/tr.yml b/modules/backlogs/config/locales/crowdin/tr.yml index 031e30ca442..e2f5a59861f 100644 --- a/modules/backlogs/config/locales/crowdin/tr.yml +++ b/modules/backlogs/config/locales/crowdin/tr.yml @@ -131,11 +131,11 @@ tr: label_sprint_impediments: "Sprint Engelleri" label_sprint_new: "New sprint" label_task_board: "Görev panosu" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Ana bekleme günlüğünü görüntüleme" - permission_view_taskboards: "Görev tahtalarını görüntüleme" - permission_select_done_statuses: "Tamamlanan durumları seçiniz" - permission_update_sprints: "Süratleri güncelle" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "İş listesi" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml index fe72e7db59e..df4f5f2883f 100644 --- a/modules/backlogs/config/locales/crowdin/uk.yml +++ b/modules/backlogs/config/locales/crowdin/uk.yml @@ -135,11 +135,11 @@ uk: label_sprint_impediments: "Перешкоди спринту" label_sprint_new: "New sprint" label_task_board: "Дошка завдань" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Перегляд головного backlog-у" - permission_view_taskboards: "Перегляд панелі завдань" - permission_select_done_statuses: "Виберіть завершені статуси" - permission_update_sprints: "Оновлення спринту" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Невиконані завдання" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/uz.yml b/modules/backlogs/config/locales/crowdin/uz.yml index 9133d6a5ce5..618cb4ab3ac 100644 --- a/modules/backlogs/config/locales/crowdin/uz.yml +++ b/modules/backlogs/config/locales/crowdin/uz.yml @@ -131,11 +131,11 @@ uz: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/vi.yml b/modules/backlogs/config/locales/crowdin/vi.yml index dd99a3b5eba..6e8f878fdb7 100644 --- a/modules/backlogs/config/locales/crowdin/vi.yml +++ b/modules/backlogs/config/locales/crowdin/vi.yml @@ -129,11 +129,11 @@ vi: label_sprint_impediments: "Trở ngại nước rút" label_sprint_new: "New sprint" label_task_board: "Bảng nhiệm vụ" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "Xem tồn đọng chính" - permission_view_taskboards: "Xem bảng tác vụ" - permission_select_done_statuses: "Chọn trạng thái hoàn thành" - permission_update_sprints: "Cập nhật các lần chạy nước rút" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "tồn đọng" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index 00890091940..25a17221901 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -129,11 +129,11 @@ zh-CN: label_sprint_impediments: "冲刺 (sprint) 障碍" label_sprint_new: "New sprint" label_task_board: "任务板" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "查看主待办清单" - permission_view_taskboards: "查看任务板" - permission_select_done_statuses: "选择完成状态" - permission_update_sprints: "更新迭代" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "待办清单" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/zh-TW.yml b/modules/backlogs/config/locales/crowdin/zh-TW.yml index 8a23d03e832..2a07a6d5d5e 100644 --- a/modules/backlogs/config/locales/crowdin/zh-TW.yml +++ b/modules/backlogs/config/locales/crowdin/zh-TW.yml @@ -129,11 +129,11 @@ zh-TW: label_sprint_impediments: "進度阻礙" label_sprint_new: "New sprint" label_task_board: "任務看板" + permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_view_master_backlog: "檢視主待辦事項" - permission_view_taskboards: "檢視任務看板" - permission_select_done_statuses: "選擇完成狀態" - permission_update_sprints: "更新進度" + permission_start_complete_sprint: "Start/complete sprint" + permission_manage_sprint_items: "Manage sprint items" + permission_share_sprint: "Share sprint" project_module_backlogs: "待辦事項" rb_burndown_charts: show: From 8fc154d62b3b43733ab3c5b44c586c074a637e19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 08:23:51 +0000 Subject: [PATCH 116/334] Bump good_job from 4.12.1 to 4.13.2 Bumps [good_job](https://github.com/bensheldon/good_job) from 4.12.1 to 4.13.2. - [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.12.1...v4.13.2) --- updated-dependencies: - dependency-name: good_job dependency-version: 4.13.2 dependency-type: direct:production 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 bfc8f848d51..32e05769e63 100644 --- a/Gemfile +++ b/Gemfile @@ -127,7 +127,7 @@ gem "multi_json", "~> 1.19.0" gem "oj", "~> 3.16.12" gem "daemons" -gem "good_job", "~> 4.12.0" # update should be done manually in sync with saas-openproject version. +gem "good_job", "~> 4.13.2" # 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 3e29814bb05..511ece4d497 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -619,7 +619,7 @@ GEM glob (0.4.0) globalid (1.3.0) activesupport (>= 6.1) - good_job (4.12.1) + good_job (4.13.2) activejob (>= 6.1.0) activerecord (>= 6.1.0) concurrent-ruby (>= 1.3.1) @@ -1620,7 +1620,7 @@ DEPENDENCIES friendly_id (~> 5.6.0) fuubar (~> 2.5.0) globalid (~> 1.3) - good_job (~> 4.12.0) + good_job (~> 4.13.2) google-apis-gmail_v1 googleauth grape (~> 2.4.0) @@ -1935,7 +1935,7 @@ CHECKSUMS fuubar (2.5.1) sha256=b272a7804b282661c7fab583a3764f92543cb482c365ae39c685cd218fdd4880 glob (0.4.0) sha256=893dc9e2d24abe13dda907ce0cda576f680ff382f2a6cf9e543f98ecbe29238c globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11 - good_job (4.12.1) sha256=a8a981baf2ac9c40a85412d92ce2bf7a5e6d35d9dadb0900db57780583eafebb + good_job (4.13.2) sha256=c10eb032d8096c5132861b7935d529cf66c63e18ce00b1a26b6e69cb7775b8d1 google-apis-core (1.0.2) sha256=ba4579aaadc902d6cc7bc8db88f566ab00f5e31ea87ab41e9f9a032c470f2629 google-apis-gmail_v1 (0.47.0) sha256=3064434b6da55b85e2828ce4bb0f4d04e8cfd187a4ab262ceb1dcb01f98e49ef google-cloud-env (2.3.1) sha256=0faac01eb27be78c2591d64433663b1a114f8f7af55a4f819755426cac9178e7 From d39e2731170b9f0c2272feb4f1659eb3c22268e7 Mon Sep 17 00:00:00 2001 From: Marcello Rocha Date: Wed, 4 Mar 2026 10:54:00 +0100 Subject: [PATCH 117/334] Updates ClientCredentials after feedback. --- .../oauth_client_credentials.rb | 23 ++++++------------- .../oauth_user_token.rb | 8 +++---- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb index 4e5d56056a0..647216d53db 100644 --- a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb +++ b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb @@ -45,15 +45,15 @@ module Storages token_cache_key = TOKEN_CACHE_KEY % storage.id access_token = @use_cache ? Rails.cache.read(token_cache_key) : nil - http = build_http_session(access_token, config, http_options).value_or { return Failure(it) } + session = build_http_session(access_token, config, http_options).value_or { Failure(it) } - operation_result = yield http + operation_result = yield session return operation_result unless @use_cache case operation_result in Success if @use_cache && access_token.blank? - write_cache(token_cache_key, http) + write_cache(token_cache_key, session) in Failure(code: :forbidden) clear_cache(token_cache_key) else @@ -62,6 +62,8 @@ module Storages operation_result rescue HTTPX::HTTPError => e + error("Error while refreshing OAuth token - Payload: #{e.response}") + Failure(Results::Error.new(code: :unauthorized, payload: e.response, source: self.class)) rescue HTTPX::TimeoutError => e Failure(Results::Error.new(code: :timeout, payload: e.to_s, source: self.class)) @@ -84,19 +86,8 @@ module Storages def clear_cache(key) = Rails.cache.delete(key) def build_http_session(access_token, config, http_options) - if access_token.present? - http_with_current_token(access_token:, http_options:) - else - http_with_new_token(config:, http_options:) - end - end - - def http_with_current_token(access_token:, http_options:) - Success(OpenProject.httpx.bearer_auth(access_token).with(http_options)) - end - - def http_with_new_token(config:, http_options:) - Success(OpenProject.httpx.plugin(:oauth).with(**http_options, oauth_options: config.to_h)) + Success(OpenProject.httpx.plugin(:oauth) + .with(**http_options, oauth_options: { **config, access_token: access_token })) end end end diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb index 5f1d3c0bb14..036841b5fe7 100644 --- a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb +++ b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb @@ -91,15 +91,15 @@ module Storages end def handle_timeout(token, exception) - Rails.logger.error("Timeout while refreshing OAuth token. - Payload: #{exception.message}") + error("Timeout while refreshing OAuth token. - Payload: #{exception.message}") token.destroy! Failure(@error_data.with(error: :timeout_on_refresh, payload: exception)) end - def handle_http_error(token, error) - Rails.logger.error("Error while refreshing OAuth token - Payload: #{error.response}") + def handle_http_error(token, exception) + error("Error while refreshing OAuth token - Payload: #{exception.response}") token.destroy! - Failure(@error_data.with(code: :unauthorized, payload: error.response)) + Failure(@error_data.with(code: :unauthorized, payload: exception.response)) end def current_token(client) From 77e772bebcc2fd8e263c0eadd3396ee3959265be Mon Sep 17 00:00:00 2001 From: Marcello Rocha Date: Wed, 4 Mar 2026 10:58:20 +0100 Subject: [PATCH 118/334] Ensure that Bearer is being used in the header --- .../adapters/authentication_strategies/bearer_token_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/storages/spec/common/storages/adapters/authentication_strategies/bearer_token_spec.rb b/modules/storages/spec/common/storages/adapters/authentication_strategies/bearer_token_spec.rb index 0bf710ebe5c..b7abbebd15c 100644 --- a/modules/storages/spec/common/storages/adapters/authentication_strategies/bearer_token_spec.rb +++ b/modules/storages/spec/common/storages/adapters/authentication_strategies/bearer_token_spec.rb @@ -44,6 +44,7 @@ module Storages Authentication[strategy].call(storage:) do |http| was_yielded = true + expect(http.instance_variable_get(:@options).auth_header_type).to eq("Bearer") expect(http.instance_variable_get(:@options).auth_header_value).to eq(access_token) end From fa3be6be6956bfef3dddc519aac6f006ab68c34e Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Wed, 4 Mar 2026 11:37:45 +0100 Subject: [PATCH 119/334] Use existing class instead of custom solution --- frontend/src/global_styles/openproject.sass | 1 - modules/backlogs/app/components/_index.sass | 29 ------------- .../new_sprint_form_component.html.erb | 2 +- .../backlogs/new_sprint_form_component.sass | 42 ------------------- 4 files changed, 1 insertion(+), 73 deletions(-) delete mode 100644 modules/backlogs/app/components/_index.sass delete mode 100644 modules/backlogs/app/components/backlogs/new_sprint_form_component.sass diff --git a/frontend/src/global_styles/openproject.sass b/frontend/src/global_styles/openproject.sass index 826e78810c4..d8164407754 100644 --- a/frontend/src/global_styles/openproject.sass +++ b/frontend/src/global_styles/openproject.sass @@ -20,7 +20,6 @@ // Module specific Styles @import "../../../modules/auth_saml/app/components/_index.sass" -@import "../../../modules/backlogs/app/components/_index.sass" @import "../../../modules/costs/app/components/_index.sass" @import "../../../modules/documents/app/assets/stylesheets/_index.sass" @import "../../../modules/documents/app/components/_index.sass" diff --git a/modules/backlogs/app/components/_index.sass b/modules/backlogs/app/components/_index.sass deleted file mode 100644 index 893f0feddef..00000000000 --- a/modules/backlogs/app/components/_index.sass +++ /dev/null @@ -1,29 +0,0 @@ -//-- 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 "./backlogs/new_sprint_form_component.sass" diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb index ed00e46ae9a..4d07f79aeef 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb @@ -47,7 +47,7 @@ See COPYRIGHT and LICENSE files for more details. flex.with_row(mb: 3) do render Backlogs::Sprints::DetailsForm.new(f) end - flex.with_row(classes: "op-sprints--form-dates") do + flex.with_row(classes: "FormControl-horizontalGroup--sm-vertical") do render Backlogs::Sprints::DatesForm.new(f) end end diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.sass b/modules/backlogs/app/components/backlogs/new_sprint_form_component.sass deleted file mode 100644 index 577a342dd30..00000000000 --- a/modules/backlogs/app/components/backlogs/new_sprint_form_component.sass +++ /dev/null @@ -1,42 +0,0 @@ -//-- 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. -//++ - -.op-sprints--form - &-dates - // Date section - .FormControl-horizontalGroup - flex-wrap: wrap // Wrap around (on smaller screens) - column-gap: 1rem - - // All date fields: start, finish and duration - & > .FormControl - flex: 2 - - // Special styles for the duration: make it narrower - &:last-child - flex: 1 From 713e4431222d4facd7826c9003025c912c2dc203 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 14:30:43 +0000 Subject: [PATCH 120/334] Bump minimatch from 3.1.3 to 3.1.5 in /frontend Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.1.3 to 3.1.5. - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v3.1.3...v3.1.5) --- updated-dependencies: - dependency-name: minimatch dependency-version: 3.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 310 +++++++++++++------------------------ 1 file changed, 110 insertions(+), 200 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f41e9b1f1ba..4b7a052d544 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9104,9 +9104,9 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", - "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dependencies": { "brace-expansion": "^5.0.2" }, @@ -9758,25 +9758,13 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/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, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { @@ -9818,12 +9806,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -10102,25 +10090,13 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/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, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { @@ -10153,12 +10129,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -10207,25 +10183,13 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/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, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { @@ -10246,12 +10210,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -10394,25 +10358,13 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/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, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/debug": { @@ -10445,12 +10397,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -14812,9 +14764,9 @@ } }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", - "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -15255,9 +15207,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", - "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dependencies": { "brace-expansion": "^5.0.2" }, @@ -16158,9 +16110,9 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", - "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dependencies": { "brace-expansion": "^5.0.2" }, @@ -19328,9 +19280,9 @@ "dev": true }, "node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -24356,25 +24308,13 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/typescript-eslint/node_modules/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, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/typescript-eslint/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "balanced-match": "^1.0.0" } }, "node_modules/typescript-eslint/node_modules/debug": { @@ -24416,12 +24356,12 @@ } }, "node_modules/typescript-eslint/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -31253,9 +31193,9 @@ } }, "minimatch": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", - "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "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" } @@ -31809,19 +31749,13 @@ "eslint-visitor-keys": "^4.2.1" } }, - "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.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { - "balanced-match": "^4.0.2" + "balanced-match": "^1.0.0" } }, "debug": { @@ -31846,12 +31780,12 @@ "dev": true }, "minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "requires": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" } } } @@ -32003,19 +31937,13 @@ "eslint-visitor-keys": "^4.2.1" } }, - "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.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { - "balanced-match": "^4.0.2" + "balanced-match": "^1.0.0" } }, "debug": { @@ -32034,12 +31962,12 @@ "dev": true }, "minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "requires": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" } } } @@ -32067,19 +31995,13 @@ "ts-api-utils": "^2.4.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.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { - "balanced-match": "^4.0.2" + "balanced-match": "^1.0.0" } }, "debug": { @@ -32092,12 +32014,12 @@ } }, "minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "requires": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" } } } @@ -32174,19 +32096,13 @@ "eslint-visitor-keys": "^4.2.1" } }, - "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.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { - "balanced-match": "^4.0.2" + "balanced-match": "^1.0.0" } }, "debug": { @@ -32205,12 +32121,12 @@ "dev": true }, "minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "requires": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" } } } @@ -35315,9 +35231,9 @@ } }, "minimatch": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", - "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", + "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" @@ -35590,9 +35506,9 @@ "integrity": "sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==" }, "minimatch": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", - "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "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" } @@ -36231,9 +36147,9 @@ } }, "minimatch": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", - "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "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" } @@ -38351,9 +38267,9 @@ "dev": true }, "minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "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" @@ -41796,19 +41712,13 @@ "eslint-visitor-keys": "^4.2.1" } }, - "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.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { - "balanced-match": "^4.0.2" + "balanced-match": "^1.0.0" } }, "debug": { @@ -41833,12 +41743,12 @@ "dev": true }, "minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "requires": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" } } } From 7c8239d8ba4aaffda2192dc1db3cb692abfb70fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 15:40:35 +0000 Subject: [PATCH 121/334] Bump rollup from 4.53.3 to 4.59.0 in /extensions/op-blocknote-hocuspocus Bumps [rollup](https://github.com/rollup/rollup) from 4.53.3 to 4.59.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.53.3...v4.59.0) --- updated-dependencies: - dependency-name: rollup dependency-version: 4.59.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../op-blocknote-hocuspocus/package-lock.json | 266 ++++++++++-------- 1 file changed, 155 insertions(+), 111 deletions(-) diff --git a/extensions/op-blocknote-hocuspocus/package-lock.json b/extensions/op-blocknote-hocuspocus/package-lock.json index a5e1eb211ae..1eec89c933e 100644 --- a/extensions/op-blocknote-hocuspocus/package-lock.json +++ b/extensions/op-blocknote-hocuspocus/package-lock.json @@ -263,7 +263,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -286,7 +285,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -947,7 +945,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" @@ -1297,9 +1294,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -1311,9 +1308,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -1325,9 +1322,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -1339,9 +1336,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -1353,9 +1350,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -1367,9 +1364,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -1381,9 +1378,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -1395,9 +1392,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -1409,9 +1406,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -1423,9 +1420,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -1437,9 +1434,23 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], @@ -1451,9 +1462,23 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -1465,9 +1490,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], @@ -1479,9 +1504,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -1493,9 +1518,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -1507,9 +1532,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], @@ -1521,9 +1546,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -1534,10 +1559,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], @@ -1549,9 +1588,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -1563,9 +1602,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -1577,9 +1616,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], @@ -1591,9 +1630,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -1609,7 +1648,6 @@ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.13.0.tgz", "integrity": "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==", "license": "MIT", - "peer": true, "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" @@ -1682,7 +1720,6 @@ "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.13.0.tgz", "integrity": "sha512-iUelgiTMgPVMpY5ZqASUpk8mC8HuR9FWKaDzK27w9oWip9tuB54Z8mePTxNcQaSPb6ErzEaC8x8egrRt7OsdGQ==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -1880,7 +1917,6 @@ "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.13.0.tgz", "integrity": "sha512-WKR4ucALq+lwx0WJZW17CspeTpXorbIOpvKv5mulZica6QxqfMhn8n1IXCkDws/mCoLRx4Drk5d377tIjFNsvQ==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-changeset": "^2.3.0", "prosemirror-collab": "^1.3.1", @@ -2026,7 +2062,6 @@ "integrity": "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -2122,7 +2157,6 @@ "integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.48.1", "@typescript-eslint/types": "8.48.1", @@ -2457,7 +2491,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2739,6 +2772,7 @@ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -2870,7 +2904,8 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/data-urls": { "version": "5.0.0", @@ -2950,7 +2985,8 @@ "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==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/devlop": { "version": "1.1.0", @@ -3126,7 +3162,6 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3468,6 +3503,7 @@ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -3961,7 +3997,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.28.4" }, @@ -5688,7 +5723,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz", "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", "license": "MIT", - "peer": true, "dependencies": { "orderedmap": "^2.0.0" } @@ -5718,7 +5752,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-transform": "^1.0.0", @@ -5767,7 +5800,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.3.tgz", "integrity": "sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", @@ -5856,6 +5888,7 @@ "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.4.tgz", "integrity": "sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -5866,6 +5899,7 @@ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", "license": "MIT", + "peer": true, "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", @@ -5891,6 +5925,7 @@ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", "license": "MIT", + "peer": true, "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" @@ -5913,6 +5948,7 @@ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", "license": "MIT", + "peer": true, "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" @@ -5935,6 +5971,7 @@ "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", @@ -6125,9 +6162,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { @@ -6141,28 +6178,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, @@ -6200,7 +6240,8 @@ "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==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/semver": { "version": "7.7.3", @@ -7082,6 +7123,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=16" }, @@ -7267,6 +7309,7 @@ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.0.0" }, @@ -7288,6 +7331,7 @@ "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz", "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -7302,6 +7346,7 @@ "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -7316,6 +7361,7 @@ "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz", "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", "license": "MIT", + "peer": true, "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" }, @@ -7333,6 +7379,7 @@ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", "license": "MIT", + "peer": true, "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" @@ -7416,7 +7463,6 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -7796,7 +7842,6 @@ "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==", "license": "MIT", - "peer": true, "dependencies": { "lib0": "^0.2.85" }, @@ -7856,7 +7901,6 @@ "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz", "integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==", "license": "MIT", - "peer": true, "dependencies": { "lib0": "^0.2.99" }, From 5e36fee6ede158433c04a11c2060607fcd551012 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 15:42:04 +0000 Subject: [PATCH 122/334] Bump minimatch in /extensions/op-blocknote-hocuspocus Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.1.2 to 3.1.5. - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.5) --- updated-dependencies: - dependency-name: minimatch dependency-version: 3.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../op-blocknote-hocuspocus/package-lock.json | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/extensions/op-blocknote-hocuspocus/package-lock.json b/extensions/op-blocknote-hocuspocus/package-lock.json index a5e1eb211ae..23b44b702f5 100644 --- a/extensions/op-blocknote-hocuspocus/package-lock.json +++ b/extensions/op-blocknote-hocuspocus/package-lock.json @@ -263,7 +263,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -286,7 +285,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -947,7 +945,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" @@ -1609,7 +1606,6 @@ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.13.0.tgz", "integrity": "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==", "license": "MIT", - "peer": true, "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" @@ -1682,7 +1678,6 @@ "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.13.0.tgz", "integrity": "sha512-iUelgiTMgPVMpY5ZqASUpk8mC8HuR9FWKaDzK27w9oWip9tuB54Z8mePTxNcQaSPb6ErzEaC8x8egrRt7OsdGQ==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -1880,7 +1875,6 @@ "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.13.0.tgz", "integrity": "sha512-WKR4ucALq+lwx0WJZW17CspeTpXorbIOpvKv5mulZica6QxqfMhn8n1IXCkDws/mCoLRx4Drk5d377tIjFNsvQ==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-changeset": "^2.3.0", "prosemirror-collab": "^1.3.1", @@ -2026,7 +2020,6 @@ "integrity": "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -2122,7 +2115,6 @@ "integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.48.1", "@typescript-eslint/types": "8.48.1", @@ -2277,13 +2269,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -2457,7 +2449,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2739,6 +2730,7 @@ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -2870,7 +2862,8 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/data-urls": { "version": "5.0.0", @@ -2950,7 +2943,8 @@ "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==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/devlop": { "version": "1.1.0", @@ -3126,7 +3120,6 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3468,6 +3461,7 @@ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -3961,7 +3955,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.28.4" }, @@ -5150,9 +5143,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -5688,7 +5681,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz", "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", "license": "MIT", - "peer": true, "dependencies": { "orderedmap": "^2.0.0" } @@ -5718,7 +5710,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-transform": "^1.0.0", @@ -5767,7 +5758,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.3.tgz", "integrity": "sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", @@ -5856,6 +5846,7 @@ "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.4.tgz", "integrity": "sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -5866,6 +5857,7 @@ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", "license": "MIT", + "peer": true, "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", @@ -5891,6 +5883,7 @@ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", "license": "MIT", + "peer": true, "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" @@ -5913,6 +5906,7 @@ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", "license": "MIT", + "peer": true, "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" @@ -5935,6 +5929,7 @@ "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", @@ -6200,7 +6195,8 @@ "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==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/semver": { "version": "7.7.3", @@ -7082,6 +7078,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=16" }, @@ -7267,6 +7264,7 @@ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.0.0" }, @@ -7288,6 +7286,7 @@ "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz", "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -7302,6 +7301,7 @@ "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -7316,6 +7316,7 @@ "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz", "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", "license": "MIT", + "peer": true, "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" }, @@ -7333,6 +7334,7 @@ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", "license": "MIT", + "peer": true, "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" @@ -7416,7 +7418,6 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -7796,7 +7797,6 @@ "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==", "license": "MIT", - "peer": true, "dependencies": { "lib0": "^0.2.85" }, @@ -7856,7 +7856,6 @@ "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz", "integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==", "license": "MIT", - "peer": true, "dependencies": { "lib0": "^0.2.99" }, From 6970b3a4e4806d0e878da9961dbff38c00f556a9 Mon Sep 17 00:00:00 2001 From: Wieland Lindenthal Date: Wed, 4 Mar 2026 17:00:33 +0100 Subject: [PATCH 123/334] Update cla.yml - adding thykel --- .github/workflows/cla.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 1d08e2c6a6b..72974c3b5f1 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -82,8 +82,8 @@ jobs: vspielau, wielinde, yanzubrytskyi, - ehassan01 - + ehassan01, + thykel # the followings are the optional inputs - If the optional inputs are not given, then default values will be taken remote-organization-name: opf remote-repository-name: legal From 25e7632aea1fa4687a8e4a83c3584e56b29cceaf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 18:51:09 -0300 Subject: [PATCH 124/334] Bump hono from 4.12.2 to 4.12.5 in /frontend (#22197) Bumps [hono](https://github.com/honojs/hono) from 4.12.2 to 4.12.5. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.12.2...v4.12.5) --- updated-dependencies: - dependency-name: hono dependency-version: 4.12.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4b7a052d544..36225e4855c 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15684,9 +15684,9 @@ } }, "node_modules/hono": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.2.tgz", - "integrity": "sha512-gJnaDHXKDayjt8ue0n8Gs0A007yKXj4Xzb8+cNjZeYsSzzwKc0Lr+OZgYwVfB0pHfUs17EPoLvrOsEaJ9mj+Tg==", + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.5.tgz", + "integrity": "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==", "engines": { "node": ">=16.9.0" } @@ -35850,9 +35850,9 @@ } }, "hono": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.2.tgz", - "integrity": "sha512-gJnaDHXKDayjt8ue0n8Gs0A007yKXj4Xzb8+cNjZeYsSzzwKc0Lr+OZgYwVfB0pHfUs17EPoLvrOsEaJ9mj+Tg==" + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.5.tgz", + "integrity": "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==" }, "hosted-git-info": { "version": "9.0.2", From 8d6abf425925752223c32f6f61190f986e977d59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 18:51:21 -0300 Subject: [PATCH 125/334] Bump @hono/node-server from 1.19.9 to 1.19.10 in /frontend (#22198) Bumps [@hono/node-server](https://github.com/honojs/node-server) from 1.19.9 to 1.19.10. - [Release notes](https://github.com/honojs/node-server/releases) - [Commits](https://github.com/honojs/node-server/compare/v1.19.9...v1.19.10) --- updated-dependencies: - dependency-name: "@hono/node-server" dependency-version: 1.19.10 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 36225e4855c..e1a1292ff47 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5219,9 +5219,9 @@ } }, "node_modules/@hono/node-server": { - "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "version": "1.19.10", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.10.tgz", + "integrity": "sha512-hZ7nOssGqRgyV3FVVQdfi+U4q02uB23bpnYpdvNXkYTRRyWx84b7yf1ans+dnJ/7h41sGL3CeQTfO+ZGxuO+Iw==", "engines": { "node": ">=18.14.1" }, @@ -28953,9 +28953,9 @@ } }, "@hono/node-server": { - "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==" + "version": "1.19.10", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.10.tgz", + "integrity": "sha512-hZ7nOssGqRgyV3FVVQdfi+U4q02uB23bpnYpdvNXkYTRRyWx84b7yf1ans+dnJ/7h41sGL3CeQTfO+ZGxuO+Iw==" }, "@hotwired/stimulus": { "version": "3.2.2", From 0aa6d91b5fe929ffc0da4b45bb3df534a9308c30 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Thu, 5 Mar 2026 03:53:45 +0000 Subject: [PATCH 126/334] 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 | 4 -- 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 | 49 +++++++++---------- 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/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 - .../backlogs/config/locales/crowdin/fr.yml | 8 +-- modules/budgets/config/locales/crowdin/fr.yml | 2 +- modules/costs/config/locales/crowdin/af.yml | 5 +- modules/costs/config/locales/crowdin/ar.yml | 5 +- modules/costs/config/locales/crowdin/az.yml | 5 +- modules/costs/config/locales/crowdin/be.yml | 5 +- modules/costs/config/locales/crowdin/bg.yml | 5 +- modules/costs/config/locales/crowdin/ca.yml | 5 +- .../costs/config/locales/crowdin/ckb-IR.yml | 5 +- modules/costs/config/locales/crowdin/cs.yml | 5 +- modules/costs/config/locales/crowdin/da.yml | 5 +- modules/costs/config/locales/crowdin/de.yml | 5 +- modules/costs/config/locales/crowdin/el.yml | 5 +- modules/costs/config/locales/crowdin/eo.yml | 5 +- modules/costs/config/locales/crowdin/es.yml | 5 +- modules/costs/config/locales/crowdin/et.yml | 5 +- modules/costs/config/locales/crowdin/eu.yml | 5 +- modules/costs/config/locales/crowdin/fa.yml | 5 +- modules/costs/config/locales/crowdin/fi.yml | 5 +- modules/costs/config/locales/crowdin/fil.yml | 5 +- modules/costs/config/locales/crowdin/fr.yml | 5 +- modules/costs/config/locales/crowdin/he.yml | 5 +- modules/costs/config/locales/crowdin/hi.yml | 5 +- modules/costs/config/locales/crowdin/hr.yml | 5 +- modules/costs/config/locales/crowdin/hu.yml | 5 +- modules/costs/config/locales/crowdin/id.yml | 5 +- modules/costs/config/locales/crowdin/it.yml | 5 +- modules/costs/config/locales/crowdin/ja.yml | 5 +- modules/costs/config/locales/crowdin/ka.yml | 5 +- modules/costs/config/locales/crowdin/kk.yml | 5 +- modules/costs/config/locales/crowdin/ko.yml | 5 +- modules/costs/config/locales/crowdin/lt.yml | 5 +- modules/costs/config/locales/crowdin/lv.yml | 5 +- modules/costs/config/locales/crowdin/mn.yml | 5 +- modules/costs/config/locales/crowdin/ms.yml | 5 +- modules/costs/config/locales/crowdin/ne.yml | 5 +- modules/costs/config/locales/crowdin/nl.yml | 5 +- modules/costs/config/locales/crowdin/no.yml | 5 +- modules/costs/config/locales/crowdin/pl.yml | 5 +- .../costs/config/locales/crowdin/pt-BR.yml | 5 +- .../costs/config/locales/crowdin/pt-PT.yml | 5 +- modules/costs/config/locales/crowdin/ro.yml | 5 +- modules/costs/config/locales/crowdin/ru.yml | 5 +- modules/costs/config/locales/crowdin/rw.yml | 5 +- modules/costs/config/locales/crowdin/si.yml | 5 +- modules/costs/config/locales/crowdin/sk.yml | 5 +- modules/costs/config/locales/crowdin/sl.yml | 5 +- modules/costs/config/locales/crowdin/sr.yml | 5 +- modules/costs/config/locales/crowdin/sv.yml | 5 +- modules/costs/config/locales/crowdin/th.yml | 5 +- modules/costs/config/locales/crowdin/tr.yml | 5 +- modules/costs/config/locales/crowdin/uk.yml | 5 +- modules/costs/config/locales/crowdin/uz.yml | 5 +- modules/costs/config/locales/crowdin/vi.yml | 5 +- .../costs/config/locales/crowdin/zh-CN.yml | 5 +- .../costs/config/locales/crowdin/zh-TW.yml | 5 +- modules/meeting/config/locales/crowdin/fr.yml | 4 +- 111 files changed, 247 insertions(+), 142 deletions(-) diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index 2adc3a68d38..7ccbef34248 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -241,7 +241,6 @@ af: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index f7841121856..61ced4fb0c6 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -265,7 +265,6 @@ ar: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index a09334d3ea6..d0d5b088994 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -241,7 +241,6 @@ az: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index b1d09ff09d8..38d8575634a 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -253,7 +253,6 @@ be: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index 03416e83f69..c761cc1db52 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -241,7 +241,6 @@ bg: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index 317fb2e8ff5..5838421d249 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -241,7 +241,6 @@ ca: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index a0ed8a6505a..c6e5a350a1c 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -241,7 +241,6 @@ ckb-IR: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 539c66f738a..d7295f4bbd7 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -253,7 +253,6 @@ cs: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index 3042025ed12..871eb31cc74 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -241,7 +241,6 @@ da: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 071d6f0bc09..1bc4fc836f9 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -241,7 +241,6 @@ de: button_select: "Projekte auswählen" label_selected_data: "Ausgewählte Daten für den Import" label_progress: "Abrufen von Daten aus Jira..." - label_importing: "Wird gerade importiert" elements: relations: "Beziehungen zwischen Tickets" workflows: "Workflows auf Projektebene" @@ -1352,9 +1351,6 @@ de: dependencies: "Abhängigkeiten" activerecord: attributes: - agile/sprint: - sharing: "Teilen" - finish_date: "Enddatum" jira_import: projects: "Projekte" announcements: diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index 2a5d2239583..1f8e51e5a22 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -241,7 +241,6 @@ el: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index 19a8b2a7e13..4faac0c758d 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -241,7 +241,6 @@ eo: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index ee3ebb18725..d0d5ff10265 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -241,7 +241,6 @@ es: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index b212f949363..2b4a8637d19 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -241,7 +241,6 @@ et: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index 9177356c5fc..4d0ff235f77 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -241,7 +241,6 @@ eu: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index 52877baea72..118822b7967 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -241,7 +241,6 @@ fa: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index ef46b8e4f6e..1cb8b3ce033 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -241,7 +241,6 @@ fi: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index 51bb15b47ee..4f1449cf189 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -241,7 +241,6 @@ fil: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index c02c4cdabad..cd9e66b6926 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -125,7 +125,7 @@ fr: new: "Nouvelle configuration" banner: title: "Importation limitée" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "Cet outil d'importation est actuellement en version bêta et ne peut importer que des données de base : projets, tickets (nom, titre, description, pièces jointes), utilisateurs (nom, email, appartenance à un projet), statuts et types. Il ne peut pas importer les flux de travail, les champs personnalisés, les relations entre les tickets, ou les autorisations. Nous ne prenons actuellement en charge que les versions 10.x et 11.x de Jira Server/Data Center. Les instances cloud ne sont pas prises en charge pour le moment." form: fields: name: "Nom" @@ -143,7 +143,7 @@ fr: failed: "Échec de la connexion : Impossible de récupérer les informations sur le serveur" error: "Une erreur inattendue s'est produite lors du test de la connexion" connection_error: "Erreur de connexion : %{message}" - parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." + parse_error: "Impossible d'analyser la réponse du serveur. Le serveur n'est peut-être pas une instance Jira valide." api_error: "L'API Jira a renvoyé le statut d'erreur %{status}. Veuillez vérifier l'URL de votre instance Jira et le jeton API." token_error: "Jeton API invalide. Veuillez vérifier vos informations d'identification dans la configuration." missing_credentials: "Veuillez fournir l'URL et le jeton d'accès personnel pour tester la connexion" @@ -167,7 +167,7 @@ fr: title: "Aucun cycle d'importation n'a encore été mis en place" description: "Créez une exécution d'importation pour commencer à importer des informations à partir de cette instance Jira" 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." + description: "Vous pouvez importer différents ensembles de données à chaque cycle d'importation. Il est possible d'annuler une importation immédiatement après en mode révision, mais pas après la finalisation." button_import_run: "Importation" button_edit_configuration: "Editer la configuration" status: @@ -222,8 +222,8 @@ fr: fetch_data: title: "Récupérer les métadonnées de l'instance" caption_done: "Terminé" - description: "Check what data is available for import in the host Jira instance." - button_fetch: "Check available data" + description: "Vérifiez quelles données sont disponibles pour l'importation dans l'instance Jira hôte." + button_fetch: "Vérifier les données disponibles" label_progress: "Récupérer les données de Jira..." groups_and_users: title: "Groupes et utilisateurs" @@ -231,8 +231,8 @@ fr: title: "Champ d'application de l'importation" caption: "Choisissez ce que vous voulez importer dans OpenProject" caption_done: "Terminé" - 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 URL 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_info: "Veuillez noter que cet outil d'importation est en version bêta et qu'il ne peut pas importer tous les types de données. Voici un résumé de ce que l'URL de l'instance Jira hôte offre à l'importation et de ce que cet outil est capable d'importer pour le moment." + description: "Sélectionnez les données que vous souhaitez importer parmi les données disponibles extraites de l'instance Jira hôte." label_available_data: "Données disponibles" label_not_available_data: "Non disponible à l'importation" button_select_projects: "Sélectionnez les projets à importer" @@ -241,14 +241,13 @@ fr: button_select: "Sélectionner des projets" label_selected_data: "Données sélectionnées pour l'importation" label_progress: "Récupérer les données de Jira..." - label_importing: "Importation en cours" elements: relations: "Relations entre les questions" - workflows: "Project-level workflows" + workflows: "Workflows au niveau du projet" users: "Utilisateurs" sprints: "Sprints" schemes: "Schémas" - permissions: "User, group and project permissions" + permissions: "Autorisations d'utilisateur, de groupe et de projet" confirm_import: title: "Importer les données" caption: "Vérifiez vos paramètres d'importation et démarrez l'importation" @@ -286,7 +285,7 @@ fr: title: "Sélectionner des projets" 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." + description: "Le protocole de contexte de modèle permet aux agents d'IA de fournir à leurs utilisateurs les outils et les ressources exposés par cette instance d'OpenProject. Cette fonctionnalité est encore en version bêta." resources_heading: "Ressources" resources_description: "OpenProject met en œuvre les ressources suivantes. Chacune d'entre elles peut être activée, renommée et décrite comme vous le souhaitez. Pour plus d'informations, veuillez vous référer à la [documentation sur les ressources MCP](docs_url)." resources_submit: "Mettre à jour les ressources" @@ -599,8 +598,8 @@ fr: confirmation_live_message_unchecked: "Le bouton pour continuer est maintenant inactif. Vous devez cocher la case pour continuer." mcp_configurations: server_url_component: - caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." - label: "Server URL" + caption: "L'URL à laquelle le serveur MCP OpenProject sera joignable. Requis pour la configuration des clients MCP." + label: "URL du serveur" op_dry_validation: or: "ou" errors: @@ -2675,7 +2674,7 @@ fr: edit_attribute_groups: Modifier les groupes d'attributs gantt_pdf_export: Exportation PDF de diagramme de Gantt ldap_groups: Synchronisation des utilisateurs LDAP et des groupes - mcp_server: Model Context Protocol (MCP) + mcp_server: Protocole de contexte de modèle (MCP) meeting_templates: Modèles de réunion réutilisables nextcloud_sso: Authentification unique pour le stockage Nextcloud one_drive_sharepoint_file_storage: Stockage de fichiers OneDrive/SharePoint @@ -2754,7 +2753,7 @@ fr: title: "Actions personnalisées" description: "Les actions personnalisées sont des raccourcis en un clic vers un ensemble d'actions prédéfinies que vous pouvez rendre disponibles sur certains lots de travaux en fonction de l'état, du rôle, du type ou du projet." mcp_server: - description: "Bring OpenProject into your AI workflows with a secure MCP server." + description: "Introduisez OpenProject dans vos workflows AI avec un serveur MCP sécurisé." meeting_templates: description: "Définissez des modèles de réunion avec une structure d'ordre du jour définie et gagnez du temps en les réutilisant lors de la création de nouvelles réunions." nextcloud_sso: @@ -3069,16 +3068,16 @@ fr: #We need to include the version to invalidate outdated translations in other locales "17_2": new_features_title: > - The release contains various new features and improvements, such as: + Cette version contient plusieurs nouvelles fonctionnalités et améliorations, telles que: new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved accessibility - line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments. - line_4: PDF export enhancements - line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module - line_7: Harmonized custom field forms + line_0: Workflows AI avec un serveur MCP sécurisé (plan Professionnel et supérieurs) + line_1: Amélioration de la page d'accueil du projet avec un nouveau widget pour les budgets et amélioration de l'accessibilité + line_2: "Réunions : Modèles de réunion (plan de base et supérieurs)" + line_3: Meilleure transparence des commentaires sur les attributs des projets. + line_4: Amélioration de l'exportation PDF + line_5: Sécurité accrue pour les liens externes (à partir du plan Premium) + line_6: Améliorations UI/UX dans le module Backlogs + line_7: Formulaires de champs personnalisés harmonisés links: upgrade_enterprise_edition: "Passer à la version Enterprise" postgres_migration: "Migration de votre installation vers PostgreSQL" @@ -3111,7 +3110,7 @@ fr: field_changed: "%{field} a changé de %{old_value} à %{new_value}" field_set: "%{field} sur %{value}" field_removed: "%{field} supprimée" - field_updated: "%{field} updated" + field_updated: "%{field} mis à jour" deleted_with_diff: "%{field} supprimé (%{link})" changed_with_diff: "%{field} modifié (%{link})" set_with_diff: "%{field} set (%{link})" diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index 90d34e7468d..8b18df33db8 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -253,7 +253,6 @@ he: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index 5f15ce91b20..cb858eecf33 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -241,7 +241,6 @@ hi: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index a1d4027a6ee..df42d2b4e7d 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -247,7 +247,6 @@ hr: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index 50040d62725..12799439dd7 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -241,7 +241,6 @@ hu: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index ae735249ebe..c4d8d53d275 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -235,7 +235,6 @@ id: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index 66b45b7039c..6ba1b8bbbfa 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -241,7 +241,6 @@ it: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index cd70d393a34..58db82ddfbd 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -235,7 +235,6 @@ ja: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index 304f9d1b2d9..dd9758a2bd0 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -241,7 +241,6 @@ ka: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index 1203199d94b..3a01728da83 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -241,7 +241,6 @@ kk: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index b0eb2741480..12525169399 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -235,7 +235,6 @@ ko: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index 2c62d7c5f8c..2d80e580911 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -253,7 +253,6 @@ lt: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index 5829a81c4bb..55126f92f32 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -247,7 +247,6 @@ lv: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index a8134f52e44..8fdd0056f03 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -241,7 +241,6 @@ mn: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index e3cb301e415..83e6c25c29f 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -235,7 +235,6 @@ ms: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index fee01a916b6..1d9e767bf82 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -241,7 +241,6 @@ ne: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index ab221c1750a..00867c59d02 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -241,7 +241,6 @@ nl: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index a17d38f8aba..7655a9594a9 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -241,7 +241,6 @@ button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index e29dbd2645b..665e67fb3b7 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -253,7 +253,6 @@ pl: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 23810d86862..eba4f2a1501 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -241,7 +241,6 @@ pt-BR: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index 8b5600691d6..200a2b9dde5 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -241,7 +241,6 @@ pt-PT: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index 3074a16eec2..eab24c034a1 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -247,7 +247,6 @@ ro: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 8e6811bfa05..e8e04595c39 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -253,7 +253,6 @@ ru: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index a5381c7bf45..6f3116a30a8 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -241,7 +241,6 @@ rw: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index 0546cfe6c0e..df6b92ffe84 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -241,7 +241,6 @@ si: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index 64118339756..c94d2135ead 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -253,7 +253,6 @@ sk: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 662a244a560..5083dd5da1b 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -253,7 +253,6 @@ sl: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index 1f59b268a82..ec3c9794a01 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -247,7 +247,6 @@ sr: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index aaefc73d1de..bea53f46ee4 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -241,7 +241,6 @@ sv: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index 27a4fd79e29..e857057ed26 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -235,7 +235,6 @@ th: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 8237b4eb0bb..1f7ecb1b631 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -241,7 +241,6 @@ tr: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index 0556a5862ad..08481a42fae 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -253,7 +253,6 @@ uk: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index 183f17681fb..28ef382665a 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -241,7 +241,6 @@ uz: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index b2a575c0970..88bb03572ad 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -235,7 +235,6 @@ vi: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index 4d75a021d01..fbcf29c6402 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -235,7 +235,6 @@ zh-CN: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 31ce81f62a9..3b58c4c7b6a 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -235,7 +235,6 @@ zh-TW: button_select: "Select projects" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." - label_importing: "Currently importing" elements: relations: "Relations between issues" workflows: "Project-level workflows" diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index 8aa086df42c..0b4aba28eac 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -131,11 +131,11 @@ fr: label_sprint_impediments: "Obstacles de sprint" label_sprint_new: "Nouveau sprint" label_task_board: "Tableau des tâches" - permission_view_sprints: "View sprints" + permission_view_sprints: "Voir les sprints" permission_create_sprints: "Créer des sprints" - permission_start_complete_sprint: "Start/complete sprint" - permission_manage_sprint_items: "Manage sprint items" - permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Démarrer/Clore le sprint" + permission_manage_sprint_items: "Gérer les éléments du sprint" + permission_share_sprint: "Partager le sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/budgets/config/locales/crowdin/fr.yml b/modules/budgets/config/locales/crowdin/fr.yml index e20e93bc14d..3830c04a659 100644 --- a/modules/budgets/config/locales/crowdin/fr.yml +++ b/modules/budgets/config/locales/crowdin/fr.yml @@ -44,7 +44,7 @@ fr: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "is not a member of the budget's project" + not_a_member_of_budget_project: "n'est pas membre du projet du budget" models: budget: "Budget" material_budget_item: "Unité" diff --git a/modules/costs/config/locales/crowdin/af.yml b/modules/costs/config/locales/crowdin/af.yml index 3e8e70b9bde..46406c55faf 100644 --- a/modules/costs/config/locales/crowdin/af.yml +++ b/modules/costs/config/locales/crowdin/af.yml @@ -205,7 +205,10 @@ af: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/ar.yml b/modules/costs/config/locales/crowdin/ar.yml index 3e020a367b7..9cfac461839 100644 --- a/modules/costs/config/locales/crowdin/ar.yml +++ b/modules/costs/config/locales/crowdin/ar.yml @@ -221,7 +221,10 @@ ar: project_module_costs: "الوقت والتكاليف" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "العملة" - setting_costs_currency_format: "شكل العملة" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/az.yml b/modules/costs/config/locales/crowdin/az.yml index 75f798afc7c..f3ccf8d97a1 100644 --- a/modules/costs/config/locales/crowdin/az.yml +++ b/modules/costs/config/locales/crowdin/az.yml @@ -205,7 +205,10 @@ az: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/be.yml b/modules/costs/config/locales/crowdin/be.yml index 870f56e8e99..766011812ba 100644 --- a/modules/costs/config/locales/crowdin/be.yml +++ b/modules/costs/config/locales/crowdin/be.yml @@ -213,7 +213,10 @@ be: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/bg.yml b/modules/costs/config/locales/crowdin/bg.yml index 12e9c7cbc1e..288cb21f8c2 100644 --- a/modules/costs/config/locales/crowdin/bg.yml +++ b/modules/costs/config/locales/crowdin/bg.yml @@ -205,7 +205,10 @@ bg: project_module_costs: "Време и разходи" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Валута" - setting_costs_currency_format: "Формат на валутата" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/ca.yml b/modules/costs/config/locales/crowdin/ca.yml index 224df58e6fe..118617f97c7 100644 --- a/modules/costs/config/locales/crowdin/ca.yml +++ b/modules/costs/config/locales/crowdin/ca.yml @@ -205,7 +205,10 @@ ca: project_module_costs: "Temps i costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Divisa" - setting_costs_currency_format: "Format de divisa" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/ckb-IR.yml b/modules/costs/config/locales/crowdin/ckb-IR.yml index b3fa21ca344..382123a5090 100644 --- a/modules/costs/config/locales/crowdin/ckb-IR.yml +++ b/modules/costs/config/locales/crowdin/ckb-IR.yml @@ -205,7 +205,10 @@ ckb-IR: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/cs.yml b/modules/costs/config/locales/crowdin/cs.yml index 9e5af224b92..71525707546 100644 --- a/modules/costs/config/locales/crowdin/cs.yml +++ b/modules/costs/config/locales/crowdin/cs.yml @@ -213,7 +213,10 @@ cs: project_module_costs: "Čas a náklady" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Měna" - setting_costs_currency_format: "Formát měny" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/da.yml b/modules/costs/config/locales/crowdin/da.yml index 10c5b5de5ac..b0e0ebddd3e 100644 --- a/modules/costs/config/locales/crowdin/da.yml +++ b/modules/costs/config/locales/crowdin/da.yml @@ -205,7 +205,10 @@ da: project_module_costs: "Tid og omkostninger" setting_allow_tracking_start_and_end_times: "Tillad start- og sluttider" setting_costs_currency: "Valuta" - setting_costs_currency_format: "Valutaformat" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Kræv start- og sluttider" setting_enforce_without_allow: "Det er ikke muligt at kræve start- og sluttider uden at tillade dem" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/de.yml b/modules/costs/config/locales/crowdin/de.yml index 71f97d5c690..971a7f3b0c8 100644 --- a/modules/costs/config/locales/crowdin/de.yml +++ b/modules/costs/config/locales/crowdin/de.yml @@ -205,7 +205,10 @@ de: project_module_costs: "Zeit und Kosten" setting_allow_tracking_start_and_end_times: "Start- und Endzeiten erlaubt" setting_costs_currency: "Währung" - setting_costs_currency_format: "Format der Währung" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Start- und Endzeiten erforderlich" 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." diff --git a/modules/costs/config/locales/crowdin/el.yml b/modules/costs/config/locales/crowdin/el.yml index 5499115149f..088dca3f74a 100644 --- a/modules/costs/config/locales/crowdin/el.yml +++ b/modules/costs/config/locales/crowdin/el.yml @@ -205,7 +205,10 @@ el: project_module_costs: "Χρόνος και κόστος" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Νόμισμα" - setting_costs_currency_format: "Μορφοποίηση του νομίσματος" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/eo.yml b/modules/costs/config/locales/crowdin/eo.yml index a9bea978dd1..4c1ef5cd344 100644 --- a/modules/costs/config/locales/crowdin/eo.yml +++ b/modules/costs/config/locales/crowdin/eo.yml @@ -205,7 +205,10 @@ eo: project_module_costs: "Tempo kaj kostoj" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Valuto" - setting_costs_currency_format: "Formato de valuto" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/es.yml b/modules/costs/config/locales/crowdin/es.yml index 209d228d0b4..9e2be7e345b 100644 --- a/modules/costs/config/locales/crowdin/es.yml +++ b/modules/costs/config/locales/crowdin/es.yml @@ -205,7 +205,10 @@ es: project_module_costs: "Tiempo y costos" setting_allow_tracking_start_and_end_times: "Permitir horas de inicio y finalización" setting_costs_currency: "Moneda" - setting_costs_currency_format: "Formato de moneda" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Requerir horas de inicio y finalización" setting_enforce_without_allow: "No es posible requerir horas de inicio y finalización sin permitirlas antes" setting_allow_tracking_start_and_end_times_caption: "Habilita la introducción de las horas de inicio y finalización cuando se registra tiempo." diff --git a/modules/costs/config/locales/crowdin/et.yml b/modules/costs/config/locales/crowdin/et.yml index c53c44c698f..bdbbe0aac81 100644 --- a/modules/costs/config/locales/crowdin/et.yml +++ b/modules/costs/config/locales/crowdin/et.yml @@ -205,7 +205,10 @@ et: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Valuuta" - setting_costs_currency_format: "Valuuta vorming" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/eu.yml b/modules/costs/config/locales/crowdin/eu.yml index 50834db50d4..c0de77fb91b 100644 --- a/modules/costs/config/locales/crowdin/eu.yml +++ b/modules/costs/config/locales/crowdin/eu.yml @@ -205,7 +205,10 @@ eu: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/fa.yml b/modules/costs/config/locales/crowdin/fa.yml index 71201a0569c..d0295c5e58e 100644 --- a/modules/costs/config/locales/crowdin/fa.yml +++ b/modules/costs/config/locales/crowdin/fa.yml @@ -205,7 +205,10 @@ fa: project_module_costs: "زمان و هزینه‌ها" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "واحد پول" - setting_costs_currency_format: "فرمت واحد پول" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "درخواست زمان های شروع و پایان" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/fi.yml b/modules/costs/config/locales/crowdin/fi.yml index b4a806418ca..be2b4dddbaf 100644 --- a/modules/costs/config/locales/crowdin/fi.yml +++ b/modules/costs/config/locales/crowdin/fi.yml @@ -205,7 +205,10 @@ fi: project_module_costs: "Työaika ja kustannukset" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Valuutta" - setting_costs_currency_format: "Valuuttamuotoilu" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/fil.yml b/modules/costs/config/locales/crowdin/fil.yml index 3c0177a047b..96b527c3272 100644 --- a/modules/costs/config/locales/crowdin/fil.yml +++ b/modules/costs/config/locales/crowdin/fil.yml @@ -205,7 +205,10 @@ fil: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/fr.yml b/modules/costs/config/locales/crowdin/fr.yml index 42fd773736e..bfbbc1564c9 100644 --- a/modules/costs/config/locales/crowdin/fr.yml +++ b/modules/costs/config/locales/crowdin/fr.yml @@ -205,7 +205,10 @@ fr: project_module_costs: "Temps et coûts" setting_allow_tracking_start_and_end_times: "Autoriser les heures de début et de fin" setting_costs_currency: "Devise" - setting_costs_currency_format: "Format de devise" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Exiger les heures de début et de fin" setting_enforce_without_allow: "Il est nécessaire d'autoriser les heures de début et de fin pour pouvoir les exiger" setting_allow_tracking_start_and_end_times_caption: "Active la saisie des heures de début et de fin lors de la journalisation." diff --git a/modules/costs/config/locales/crowdin/he.yml b/modules/costs/config/locales/crowdin/he.yml index 673f8d46a1a..a4e76dbaecc 100644 --- a/modules/costs/config/locales/crowdin/he.yml +++ b/modules/costs/config/locales/crowdin/he.yml @@ -213,7 +213,10 @@ he: project_module_costs: "עלויות" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/hi.yml b/modules/costs/config/locales/crowdin/hi.yml index 3e21b7aa93f..c9533473b77 100644 --- a/modules/costs/config/locales/crowdin/hi.yml +++ b/modules/costs/config/locales/crowdin/hi.yml @@ -205,7 +205,10 @@ hi: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/hr.yml b/modules/costs/config/locales/crowdin/hr.yml index 5fed32ed145..9229a9dd352 100644 --- a/modules/costs/config/locales/crowdin/hr.yml +++ b/modules/costs/config/locales/crowdin/hr.yml @@ -209,7 +209,10 @@ hr: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Valuta" - setting_costs_currency_format: "Oblik valute" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/hu.yml b/modules/costs/config/locales/crowdin/hu.yml index 6d685f13831..d75273bc92c 100644 --- a/modules/costs/config/locales/crowdin/hu.yml +++ b/modules/costs/config/locales/crowdin/hu.yml @@ -205,7 +205,10 @@ hu: project_module_costs: "Idő és költség" setting_allow_tracking_start_and_end_times: "Engedélyezze a kezdési és befejezési időpontokat" setting_costs_currency: "Pénznem" - setting_costs_currency_format: "Pénznem formátuma" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Kezdési és befejezési idő megadása kötelező" setting_enforce_without_allow: "A kezdési és befejezési idő megkövetelése nem lehetséges anélkül, hogy engedélyeznénk azok megadását" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/id.yml b/modules/costs/config/locales/crowdin/id.yml index 27e0b1dd057..3e7cb6a5ecb 100644 --- a/modules/costs/config/locales/crowdin/id.yml +++ b/modules/costs/config/locales/crowdin/id.yml @@ -201,7 +201,10 @@ id: project_module_costs: "Waktu dan biaya" setting_allow_tracking_start_and_end_times: "Izinkan waktu mulai dan waktu selesai" setting_costs_currency: "Mata Uang" - setting_costs_currency_format: "Format mata uang" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Butuh waktu mulai dan selesai" setting_enforce_without_allow: "Membutuhkan waktu mulai dan selesai tidak mungkin dilakukan tanpa mengizinkannya" setting_allow_tracking_start_and_end_times_caption: "Memungkinkan untuk memasukkan waktu mulai dan selesai saat mencatat waktu." diff --git a/modules/costs/config/locales/crowdin/it.yml b/modules/costs/config/locales/crowdin/it.yml index fc6342f3ae0..a779459192a 100644 --- a/modules/costs/config/locales/crowdin/it.yml +++ b/modules/costs/config/locales/crowdin/it.yml @@ -205,7 +205,10 @@ it: project_module_costs: "Tempi e costi" setting_allow_tracking_start_and_end_times: "Consenti orari di inizio e fine" setting_costs_currency: "Valuta" - setting_costs_currency_format: "Formato della valuta" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Richiede orari di inizio e di fine" setting_enforce_without_allow: "Non è possibile richiedere orari di inizio e fine senza consentirli" setting_allow_tracking_start_and_end_times_caption: "Consente di inserire gli orari di inizio e di fine durante la registrazione dell'orario." diff --git a/modules/costs/config/locales/crowdin/ja.yml b/modules/costs/config/locales/crowdin/ja.yml index a91de9375c0..bef0e0fb11f 100644 --- a/modules/costs/config/locales/crowdin/ja.yml +++ b/modules/costs/config/locales/crowdin/ja.yml @@ -201,7 +201,10 @@ ja: project_module_costs: "時間とコスト" setting_allow_tracking_start_and_end_times: "開始時間と終了時間を許可する" setting_costs_currency: "通貨" - setting_costs_currency_format: "通貨の形式" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "開始/終了時間を必須とする" setting_enforce_without_allow: "開始時間と終了時間を要求することは許可されていないとできません" setting_allow_tracking_start_and_end_times_caption: "時間を記録する際に、開始時間と終了時間を入力できるようにする。" diff --git a/modules/costs/config/locales/crowdin/ka.yml b/modules/costs/config/locales/crowdin/ka.yml index d1435853821..967d33c11de 100644 --- a/modules/costs/config/locales/crowdin/ka.yml +++ b/modules/costs/config/locales/crowdin/ka.yml @@ -205,7 +205,10 @@ ka: project_module_costs: "დრო და ღირებულებები" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "ფული" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/kk.yml b/modules/costs/config/locales/crowdin/kk.yml index a308fd6a333..ad92a19f83a 100644 --- a/modules/costs/config/locales/crowdin/kk.yml +++ b/modules/costs/config/locales/crowdin/kk.yml @@ -205,7 +205,10 @@ kk: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/ko.yml b/modules/costs/config/locales/crowdin/ko.yml index d58626c61ce..c83604b6f8c 100644 --- a/modules/costs/config/locales/crowdin/ko.yml +++ b/modules/costs/config/locales/crowdin/ko.yml @@ -201,7 +201,10 @@ ko: project_module_costs: "시간 및 비용" setting_allow_tracking_start_and_end_times: "시작 및 완료 시간 허용" setting_costs_currency: "통화" - setting_costs_currency_format: "통화 형식" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "시작 및 완료 시간 필요" setting_enforce_without_allow: "이 옵션을 허용하지 않으면 시작 및 완료 시간 요구가 가능하지 않습니다" setting_allow_tracking_start_and_end_times_caption: "시간을 기록할 때 시작 및 완료 시간 입력을 활성화합니다." diff --git a/modules/costs/config/locales/crowdin/lt.yml b/modules/costs/config/locales/crowdin/lt.yml index a4fbd98d35a..2c27d1b6ffe 100644 --- a/modules/costs/config/locales/crowdin/lt.yml +++ b/modules/costs/config/locales/crowdin/lt.yml @@ -213,7 +213,10 @@ lt: project_module_costs: "Laikas ir išlaidos" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Valiuta" - setting_costs_currency_format: "Valiutos formatas" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/lv.yml b/modules/costs/config/locales/crowdin/lv.yml index ef614740836..b4df1765ba9 100644 --- a/modules/costs/config/locales/crowdin/lv.yml +++ b/modules/costs/config/locales/crowdin/lv.yml @@ -209,7 +209,10 @@ lv: project_module_costs: "Laiks un izmaksas" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Valūta" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/mn.yml b/modules/costs/config/locales/crowdin/mn.yml index a298f5ad517..87d5bed61dc 100644 --- a/modules/costs/config/locales/crowdin/mn.yml +++ b/modules/costs/config/locales/crowdin/mn.yml @@ -205,7 +205,10 @@ mn: project_module_costs: "Цаг хугацаа ба зардал" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/ms.yml b/modules/costs/config/locales/crowdin/ms.yml index 294ab8ad393..a4e86a8d7a6 100644 --- a/modules/costs/config/locales/crowdin/ms.yml +++ b/modules/costs/config/locales/crowdin/ms.yml @@ -201,7 +201,10 @@ ms: project_module_costs: "Masa dan kos" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Mata Wang" - setting_costs_currency_format: "Format mata wang" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/ne.yml b/modules/costs/config/locales/crowdin/ne.yml index 409f7237c0a..91422b119bf 100644 --- a/modules/costs/config/locales/crowdin/ne.yml +++ b/modules/costs/config/locales/crowdin/ne.yml @@ -205,7 +205,10 @@ ne: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/nl.yml b/modules/costs/config/locales/crowdin/nl.yml index 4496bc86ec7..b98b4324430 100644 --- a/modules/costs/config/locales/crowdin/nl.yml +++ b/modules/costs/config/locales/crowdin/nl.yml @@ -205,7 +205,10 @@ nl: project_module_costs: "Tijd en kosten" setting_allow_tracking_start_and_end_times: "Begin- en eindtijden toestaan" setting_costs_currency: "Valuta" - setting_costs_currency_format: "Formaat van valuta" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Begin- en eindtijden vereisen" setting_enforce_without_allow: "Het is niet mogelijk om begin- en eindtijden te vereisen zonder ze toe te staan" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/no.yml b/modules/costs/config/locales/crowdin/no.yml index efce762ce31..72be8803b39 100644 --- a/modules/costs/config/locales/crowdin/no.yml +++ b/modules/costs/config/locales/crowdin/no.yml @@ -205,7 +205,10 @@ project_module_costs: "Tid og kostnader" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Valuta" - setting_costs_currency_format: "Formatet på valuta" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/pl.yml b/modules/costs/config/locales/crowdin/pl.yml index 1cfdf73bbef..3541f44b48d 100644 --- a/modules/costs/config/locales/crowdin/pl.yml +++ b/modules/costs/config/locales/crowdin/pl.yml @@ -213,7 +213,10 @@ pl: project_module_costs: "Czas i koszty" setting_allow_tracking_start_and_end_times: "Zezwól na czasy rozpoczęcia i zakończenia" setting_costs_currency: "Waluta" - setting_costs_currency_format: "Format waluty" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Wymagaj czasów rozpoczęcia i zakończenia" setting_enforce_without_allow: "Nie można wymagać czasów rozpoczęcia i zakończenia bez zezwolenia na nie" setting_allow_tracking_start_and_end_times_caption: "Umożliwia wprowadzenie czasów rozpoczęcia i zakończenia w razie rejestrowania czasu." diff --git a/modules/costs/config/locales/crowdin/pt-BR.yml b/modules/costs/config/locales/crowdin/pt-BR.yml index bae68241c25..d95c3306fa5 100644 --- a/modules/costs/config/locales/crowdin/pt-BR.yml +++ b/modules/costs/config/locales/crowdin/pt-BR.yml @@ -205,7 +205,10 @@ pt-BR: project_module_costs: "Tempo e custos" setting_allow_tracking_start_and_end_times: "Permitir horários de início e de término" setting_costs_currency: "Moeda" - setting_costs_currency_format: "Formato de moeda" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Exigir horários de início e término" setting_enforce_without_allow: "Exigir os horários de início e término não é possível sem habilitá-los" setting_allow_tracking_start_and_end_times_caption: "Ativa a inserção de horários de início e término ao registrar o tempo." diff --git a/modules/costs/config/locales/crowdin/pt-PT.yml b/modules/costs/config/locales/crowdin/pt-PT.yml index d6e95bdbae0..c1cb5ec2ea9 100644 --- a/modules/costs/config/locales/crowdin/pt-PT.yml +++ b/modules/costs/config/locales/crowdin/pt-PT.yml @@ -205,7 +205,10 @@ pt-PT: project_module_costs: "Tempo e custos" setting_allow_tracking_start_and_end_times: "Permitir horário de início e término" setting_costs_currency: "Moeda" - setting_costs_currency_format: "Formato de moeda" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Exigir hora de início e término" setting_enforce_without_allow: "Não é possível exigir horas de início e de fim sem as autorizar" setting_allow_tracking_start_and_end_times_caption: "Permite introduzir as horas de início e de término ao registar o tempo." diff --git a/modules/costs/config/locales/crowdin/ro.yml b/modules/costs/config/locales/crowdin/ro.yml index 6cb5af25655..0199141aa48 100644 --- a/modules/costs/config/locales/crowdin/ro.yml +++ b/modules/costs/config/locales/crowdin/ro.yml @@ -209,7 +209,10 @@ ro: project_module_costs: "Timp și costuri" setting_allow_tracking_start_and_end_times: "Permite orele de început și de sfârșit" setting_costs_currency: "Monedă" - setting_costs_currency_format: "Format monedă" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Cere orele de început și de sfârșit" setting_enforce_without_allow: "Solicitarea orelor de început și de sfârșit nu este posibilă fără a le permite" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/ru.yml b/modules/costs/config/locales/crowdin/ru.yml index c54f741649b..32d95e3e5d9 100644 --- a/modules/costs/config/locales/crowdin/ru.yml +++ b/modules/costs/config/locales/crowdin/ru.yml @@ -213,7 +213,10 @@ ru: project_module_costs: "Время и затраты" setting_allow_tracking_start_and_end_times: "Разрешить время начала и окончания" setting_costs_currency: "Валюта" - setting_costs_currency_format: "Формат валюты" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Требуется время начала и окончания" setting_enforce_without_allow: "Требование точного времени невозможно без соответствующего разрешения" setting_allow_tracking_start_and_end_times_caption: "Включает время начала и окончания учета." diff --git a/modules/costs/config/locales/crowdin/rw.yml b/modules/costs/config/locales/crowdin/rw.yml index 80cbbd55c09..a0aeb41bffe 100644 --- a/modules/costs/config/locales/crowdin/rw.yml +++ b/modules/costs/config/locales/crowdin/rw.yml @@ -205,7 +205,10 @@ rw: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/si.yml b/modules/costs/config/locales/crowdin/si.yml index 4bff4dd37ec..7761ed4a758 100644 --- a/modules/costs/config/locales/crowdin/si.yml +++ b/modules/costs/config/locales/crowdin/si.yml @@ -205,7 +205,10 @@ si: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/sk.yml b/modules/costs/config/locales/crowdin/sk.yml index 400e5e7b4cc..2257327b9ac 100644 --- a/modules/costs/config/locales/crowdin/sk.yml +++ b/modules/costs/config/locales/crowdin/sk.yml @@ -213,7 +213,10 @@ sk: project_module_costs: "Čas a náklady" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Mena" - setting_costs_currency_format: "Formát meny" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/sl.yml b/modules/costs/config/locales/crowdin/sl.yml index a26856c847f..765b02bd909 100644 --- a/modules/costs/config/locales/crowdin/sl.yml +++ b/modules/costs/config/locales/crowdin/sl.yml @@ -213,7 +213,10 @@ sl: project_module_costs: "Čas in stroški" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Valuta" - setting_costs_currency_format: "Oblika valute" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/sr.yml b/modules/costs/config/locales/crowdin/sr.yml index a918c6e86c8..a499909600e 100644 --- a/modules/costs/config/locales/crowdin/sr.yml +++ b/modules/costs/config/locales/crowdin/sr.yml @@ -209,7 +209,10 @@ sr: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/sv.yml b/modules/costs/config/locales/crowdin/sv.yml index 8a39f79a2db..0b7970b1337 100644 --- a/modules/costs/config/locales/crowdin/sv.yml +++ b/modules/costs/config/locales/crowdin/sv.yml @@ -205,7 +205,10 @@ sv: project_module_costs: "Tid och kostnader" setting_allow_tracking_start_and_end_times: "Tillåt start- och sluttider" setting_costs_currency: "Valuta" - setting_costs_currency_format: "Formatet för valuta" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Kräv start- och sluttider" setting_enforce_without_allow: "Det är inte möjligt att begära start- och sluttider utan att låta dem" setting_allow_tracking_start_and_end_times_caption: "Gör det möjligt att ange start- och sluttider vid tidsloggning." diff --git a/modules/costs/config/locales/crowdin/th.yml b/modules/costs/config/locales/crowdin/th.yml index 3a27c6ccbe6..49881e45b85 100644 --- a/modules/costs/config/locales/crowdin/th.yml +++ b/modules/costs/config/locales/crowdin/th.yml @@ -201,7 +201,10 @@ th: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/tr.yml b/modules/costs/config/locales/crowdin/tr.yml index c590539e5aa..2b6b58cd60b 100644 --- a/modules/costs/config/locales/crowdin/tr.yml +++ b/modules/costs/config/locales/crowdin/tr.yml @@ -205,7 +205,10 @@ tr: project_module_costs: "Zaman ve maliyetler" setting_allow_tracking_start_and_end_times: "Başlangıç ve bitiş saatlerine izin verin" setting_costs_currency: "Para birimi" - setting_costs_currency_format: "Para biriminin biçimi" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Başlangıç ve bitiş saatleri gerektir" setting_enforce_without_allow: "Başlangıç ve bitiş saatlerini zorunlu tutmak, bunlara izin vermeden mümkün değildir" setting_allow_tracking_start_and_end_times_caption: "Zaman kaydı yaparken başlangıç ve bitiş zamanlarının girilmesini sağlar." diff --git a/modules/costs/config/locales/crowdin/uk.yml b/modules/costs/config/locales/crowdin/uk.yml index 9a64317662d..2dd461277d7 100644 --- a/modules/costs/config/locales/crowdin/uk.yml +++ b/modules/costs/config/locales/crowdin/uk.yml @@ -213,7 +213,10 @@ uk: project_module_costs: "Час і витрати" setting_allow_tracking_start_and_end_times: "Дозволити час початку й закінчення" setting_costs_currency: "Валюта" - setting_costs_currency_format: "Формат валюти" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Вимагати час початку й закінчення" setting_enforce_without_allow: "Вимога часу початку й закінчення неможлива без відповідного налаштування" setting_allow_tracking_start_and_end_times_caption: "Дає змогу вводити час початку й закінчення в журнал обліку часу." diff --git a/modules/costs/config/locales/crowdin/uz.yml b/modules/costs/config/locales/crowdin/uz.yml index 6e98edd8534..8b998aab5f2 100644 --- a/modules/costs/config/locales/crowdin/uz.yml +++ b/modules/costs/config/locales/crowdin/uz.yml @@ -205,7 +205,10 @@ uz: project_module_costs: "Time and costs" setting_allow_tracking_start_and_end_times: "Allow start and finish times" setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Require start and finish times" setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them" setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time." diff --git a/modules/costs/config/locales/crowdin/vi.yml b/modules/costs/config/locales/crowdin/vi.yml index 03bbc31c4de..076c09745e3 100644 --- a/modules/costs/config/locales/crowdin/vi.yml +++ b/modules/costs/config/locales/crowdin/vi.yml @@ -201,7 +201,10 @@ vi: project_module_costs: "Thời gian và chi phí" setting_allow_tracking_start_and_end_times: "Cho phép thời gian bắt đầu và kết thúc" setting_costs_currency: "tiền tệ" - setting_costs_currency_format: "Định dạng tiền tệ" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Yêu cầu thời gian bắt đầu và kết thúc" setting_enforce_without_allow: "Không thể yêu cầu thời gian bắt đầu và kết thúc nếu không cho phép chúng" setting_allow_tracking_start_and_end_times_caption: "Cho phép nhập thời gian bắt đầu và kết thúc khi ghi thời gian." diff --git a/modules/costs/config/locales/crowdin/zh-CN.yml b/modules/costs/config/locales/crowdin/zh-CN.yml index 87fc215643a..4a883e6a83a 100644 --- a/modules/costs/config/locales/crowdin/zh-CN.yml +++ b/modules/costs/config/locales/crowdin/zh-CN.yml @@ -201,7 +201,10 @@ zh-CN: project_module_costs: "工时和成本" setting_allow_tracking_start_and_end_times: "允许开始和完成时间" setting_costs_currency: "货币" - setting_costs_currency_format: "货币格式" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "需要开始和完成时间" setting_enforce_without_allow: "如果不允许,则无法要求开始和结束时间" setting_allow_tracking_start_and_end_times_caption: "启用在记录时间时输入开始和结束时间。" diff --git a/modules/costs/config/locales/crowdin/zh-TW.yml b/modules/costs/config/locales/crowdin/zh-TW.yml index b3b223bda81..35cbc319ba6 100644 --- a/modules/costs/config/locales/crowdin/zh-TW.yml +++ b/modules/costs/config/locales/crowdin/zh-TW.yml @@ -201,7 +201,10 @@ zh-TW: project_module_costs: "時間與費用" setting_allow_tracking_start_and_end_times: "允許起迄時間" setting_costs_currency: "貨幣" - setting_costs_currency_format: " 貨幣格式" + setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." + setting_costs_currency_format: "Currency format" + setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" + setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" setting_enforce_tracking_start_and_end_times: "需要起迄時間" setting_enforce_without_allow: "在不允許的情況下,要求開始和結束時間是不可能的" setting_allow_tracking_start_and_end_times_caption: "啟用記錄工時時輸入開始與結束時間的功能。" diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index 5c0472a5102..4eb86c80af8 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -612,8 +612,8 @@ fr: text_meeting_closed_dropdown_description: "Cette réunion est terminée. Vous ne pouvez plus modifier les points de l'ordre du jour ou les résultats." text_meeting_draft_banner: "Vous êtes actuellement en mode brouillon. Cette réunion n'enverra pas de mises à jour de calendrier ni d'invitations, même si vous modifiez les détails de la réunion ou si vous ajoutez/supprimez des participants." text_onetime_meeting_template_banner: "Vous êtes en train de modifier un modèle de réunion. Vous pouvez utiliser ce modèle pour créer des réunions ponctuelles avec un ordre du jour prédéfini. Les modifications n'affecteront pas les réunions déjà créées." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_heading: "Ce modèle de réunion est vide" + text_onetime_meeting_template_description: "Ajouter des éléments à l'ordre du jour et des pièces jointes à ce modèle. Ils seront inclus dans chaque réunion basée sur ce modèle." text_exit_draft_mode_dialog_title: "Ouvrez cette réunion et envoyez des invitations ?" text_exit_draft_mode_dialog_subtitle: "Vous ne pouvez pas revenir au mode brouillon une fois que vous avez planifié une réunion." text_exit_draft_mode_dialog_template_title: "Ouvrez la première occurrence de cette série de réunions ?" From 9a5f7c9cbf8def8bea2bcee73617aab093f53848 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 05:33:37 +0000 Subject: [PATCH 127/334] Bump the html-eslint group in /frontend with 2 updates Bumps the html-eslint group in /frontend with 2 updates: [@html-eslint/eslint-plugin](https://github.com/yeonjuan/html-eslint) and [@html-eslint/parser](https://github.com/yeonjuan/html-eslint). Updates `@html-eslint/eslint-plugin` from 0.54.2 to 0.55.0 - [Release notes](https://github.com/yeonjuan/html-eslint/releases) - [Commits](https://github.com/yeonjuan/html-eslint/compare/v0.54.2...v0.55.0) Updates `@html-eslint/parser` from 0.54.0 to 0.55.0 - [Release notes](https://github.com/yeonjuan/html-eslint/releases) - [Commits](https://github.com/yeonjuan/html-eslint/compare/v0.54.0...v0.55.0) --- updated-dependencies: - dependency-name: "@html-eslint/eslint-plugin" dependency-version: 0.55.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: html-eslint - dependency-name: "@html-eslint/parser" dependency-version: 0.55.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: html-eslint ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 188 +++++++++++++++++++++++++++---------- frontend/package.json | 4 +- 2 files changed, 142 insertions(+), 50 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 99d59e8be1b..345800ab020 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -138,8 +138,8 @@ "@angular-eslint/template-parser": "20.7.0", "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", - "@html-eslint/eslint-plugin": "^0.54.2", - "@html-eslint/parser": "^0.54.0", + "@html-eslint/eslint-plugin": "^0.55.0", + "@html-eslint/parser": "^0.55.0", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@stylistic/eslint-plugin": "^5.7.1", "@types/codemirror": "5.60.5", @@ -5252,16 +5252,17 @@ } }, "node_modules/@html-eslint/eslint-plugin": { - "version": "0.54.2", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.54.2.tgz", - "integrity": "sha512-C6jhJqVGTS9AW3Z84Ni/Cs6h3XcRHUXi1YkRaAYI08MeNj6ZWIXhwKBEJgEGK2YxzOcM1TpZEvHL4d5z7aC7Eg==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.55.0.tgz", + "integrity": "sha512-mNmw8Eedu1x6ZjstfniqDp4dA70EXzJIfyzxe7X5Olgaih9w4t1CsnH5XJwsWEYMvOheiv71pDsQne+C4EfgDg==", "dev": true, "dependencies": { "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/parser": "^0.54.0", - "@html-eslint/template-parser": "^0.54.0", - "@html-eslint/template-syntax-parser": "^0.54.0", - "@html-eslint/types": "^0.54.0" + "@html-eslint/parser": "^0.55.0", + "@html-eslint/template-parser": "^0.55.0", + "@html-eslint/template-syntax-parser": "^0.55.0", + "@html-eslint/types": "^0.55.0", + "html-standard": "^0.0.11" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5271,41 +5272,41 @@ } }, "node_modules/@html-eslint/parser": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.54.0.tgz", - "integrity": "sha512-ia3I/6jf87679pUrhIDKSgddKbw9GLkvO86fYt7tJQHHRQu+zySErIxuI2b941oeovzOq10dTpC5Hp41qbvPgg==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.55.0.tgz", + "integrity": "sha512-Pa83FiD56am3NG3mn+L9xDrL4y0HTAcEyWZxETRbIbcfzac5kwUzzWyMl5fSEMbmdSbpB9so0di9OijTXqkEfg==", "dev": true, "dependencies": { "@eslint/css-tree": "^3.6.8", - "@html-eslint/template-syntax-parser": "^0.54.0", - "@html-eslint/types": "^0.54.0", + "@html-eslint/template-syntax-parser": "^0.55.0", + "@html-eslint/types": "^0.55.0", "css-tree": "^3.1.0", "es-html-parser": "0.3.1" } }, "node_modules/@html-eslint/template-parser": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.54.0.tgz", - "integrity": "sha512-gSjgmGwRQehNxZ3XdRUhUoXDFzYc/LYoKA7JwExjdvklGnSh5WkH/CLOlphkDh9jJsC1O/E0I04bVGrzy3idKQ==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.55.0.tgz", + "integrity": "sha512-vxRYwgAxpdLyhS+5lAiYKbQ+ueRS2v2Go8TxatEc6xCasJ9h3snJ8zoe4dj0N3NYxRfW2Vo1FmUoDFkrW7ynhA==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.54.0", + "@html-eslint/types": "^0.55.0", "es-html-parser": "0.3.1" } }, "node_modules/@html-eslint/template-syntax-parser": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.54.0.tgz", - "integrity": "sha512-7mDM4AWqz42FHwnOt8Lu5xqovaZHlEuBrmwNrMg6VwC9TPaLVyh4j3zNzNnM6tjftaXZzverJup39zGB8mvXjg==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.55.0.tgz", + "integrity": "sha512-IRle7gxcTZsqQDwWDoWNLVBgX0z9m+PddmK+gYMZTNwrxcwvQEUj3wchhyBhUt4/7ZSvmIttJYQrfG+HbhhE+w==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.54.0" + "@html-eslint/types": "^0.55.0" } }, "node_modules/@html-eslint/types": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.54.0.tgz", - "integrity": "sha512-bfJolxay0POMYaFWTCH1MBitEaxIEKZOoROGOLZiRBaPvQrzhwYQktuyt5X1PcHqUB4HwEtYgSdpjYGT4JbrvA==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.55.0.tgz", + "integrity": "sha512-jJCy/mazjjVvErlTnRozLThi+T0fHayi6kGYThUzWDVWBGdQTIrrZqbvYSQYnA1i0zAWc+mDa3KyQENjcF3Bdw==", "dev": true, "dependencies": { "@types/css-tree": "^2.3.11", @@ -10492,6 +10493,12 @@ "vite": "^6.0.0 || ^7.0.0" } }, + "node_modules/@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 + }, "node_modules/@w11k/ngx-componentdestroyed": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@w11k/ngx-componentdestroyed/-/ngx-componentdestroyed-5.0.2.tgz", @@ -15769,6 +15776,15 @@ "node": ">=0.10.0" } }, + "node_modules/html-standard": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/html-standard/-/html-standard-0.0.11.tgz", + "integrity": "sha512-X5QWANKpR6WNWWqC8Gdhj9QuovKPL0XsPoPMx4XXjpbbOEsUDuARJ9S9bVGn27hrtJM8UlfEghdHkuSu3W8GIg==", + "dev": true, + "dependencies": { + "vscode-css-languageservice": "^6.3.9" + } + }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", @@ -24973,6 +24989,36 @@ "node": ">=0.10.0" } }, + "node_modules/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, + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/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 + }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", @@ -28977,54 +29023,55 @@ } }, "@html-eslint/eslint-plugin": { - "version": "0.54.2", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.54.2.tgz", - "integrity": "sha512-C6jhJqVGTS9AW3Z84Ni/Cs6h3XcRHUXi1YkRaAYI08MeNj6ZWIXhwKBEJgEGK2YxzOcM1TpZEvHL4d5z7aC7Eg==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.55.0.tgz", + "integrity": "sha512-mNmw8Eedu1x6ZjstfniqDp4dA70EXzJIfyzxe7X5Olgaih9w4t1CsnH5XJwsWEYMvOheiv71pDsQne+C4EfgDg==", "dev": true, "requires": { "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/parser": "^0.54.0", - "@html-eslint/template-parser": "^0.54.0", - "@html-eslint/template-syntax-parser": "^0.54.0", - "@html-eslint/types": "^0.54.0" + "@html-eslint/parser": "^0.55.0", + "@html-eslint/template-parser": "^0.55.0", + "@html-eslint/template-syntax-parser": "^0.55.0", + "@html-eslint/types": "^0.55.0", + "html-standard": "^0.0.11" } }, "@html-eslint/parser": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.54.0.tgz", - "integrity": "sha512-ia3I/6jf87679pUrhIDKSgddKbw9GLkvO86fYt7tJQHHRQu+zySErIxuI2b941oeovzOq10dTpC5Hp41qbvPgg==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.55.0.tgz", + "integrity": "sha512-Pa83FiD56am3NG3mn+L9xDrL4y0HTAcEyWZxETRbIbcfzac5kwUzzWyMl5fSEMbmdSbpB9so0di9OijTXqkEfg==", "dev": true, "requires": { "@eslint/css-tree": "^3.6.8", - "@html-eslint/template-syntax-parser": "^0.54.0", - "@html-eslint/types": "^0.54.0", + "@html-eslint/template-syntax-parser": "^0.55.0", + "@html-eslint/types": "^0.55.0", "css-tree": "^3.1.0", "es-html-parser": "0.3.1" } }, "@html-eslint/template-parser": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.54.0.tgz", - "integrity": "sha512-gSjgmGwRQehNxZ3XdRUhUoXDFzYc/LYoKA7JwExjdvklGnSh5WkH/CLOlphkDh9jJsC1O/E0I04bVGrzy3idKQ==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.55.0.tgz", + "integrity": "sha512-vxRYwgAxpdLyhS+5lAiYKbQ+ueRS2v2Go8TxatEc6xCasJ9h3snJ8zoe4dj0N3NYxRfW2Vo1FmUoDFkrW7ynhA==", "dev": true, "requires": { - "@html-eslint/types": "^0.54.0", + "@html-eslint/types": "^0.55.0", "es-html-parser": "0.3.1" } }, "@html-eslint/template-syntax-parser": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.54.0.tgz", - "integrity": "sha512-7mDM4AWqz42FHwnOt8Lu5xqovaZHlEuBrmwNrMg6VwC9TPaLVyh4j3zNzNnM6tjftaXZzverJup39zGB8mvXjg==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.55.0.tgz", + "integrity": "sha512-IRle7gxcTZsqQDwWDoWNLVBgX0z9m+PddmK+gYMZTNwrxcwvQEUj3wchhyBhUt4/7ZSvmIttJYQrfG+HbhhE+w==", "dev": true, "requires": { - "@html-eslint/types": "^0.54.0" + "@html-eslint/types": "^0.55.0" } }, "@html-eslint/types": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.54.0.tgz", - "integrity": "sha512-bfJolxay0POMYaFWTCH1MBitEaxIEKZOoROGOLZiRBaPvQrzhwYQktuyt5X1PcHqUB4HwEtYgSdpjYGT4JbrvA==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.55.0.tgz", + "integrity": "sha512-jJCy/mazjjVvErlTnRozLThi+T0fHayi6kGYThUzWDVWBGdQTIrrZqbvYSQYnA1i0zAWc+mDa3KyQENjcF3Bdw==", "dev": true, "requires": { "@types/css-tree": "^2.3.11", @@ -32178,6 +32225,12 @@ "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", "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", @@ -35925,6 +35978,15 @@ } } }, + "html-standard": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/html-standard/-/html-standard-0.0.11.tgz", + "integrity": "sha512-X5QWANKpR6WNWWqC8Gdhj9QuovKPL0XsPoPMx4XXjpbbOEsUDuARJ9S9bVGn27hrtJM8UlfEghdHkuSu3W8GIg==", + "dev": true, + "requires": { + "vscode-css-languageservice": "^6.3.9" + } + }, "html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", @@ -42085,6 +42147,36 @@ "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "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", diff --git a/frontend/package.json b/frontend/package.json index 87b5571ab20..c2fd2da0f94 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,8 +14,8 @@ "@angular-eslint/template-parser": "20.7.0", "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", - "@html-eslint/eslint-plugin": "^0.54.2", - "@html-eslint/parser": "^0.54.0", + "@html-eslint/eslint-plugin": "^0.55.0", + "@html-eslint/parser": "^0.55.0", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@stylistic/eslint-plugin": "^5.7.1", "@types/codemirror": "5.60.5", From 2296a443a2c2814370e11b328269c6bc8c47e3db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 05:36:42 +0000 Subject: [PATCH 128/334] Bump addressable from 2.8.8 to 2.8.9 Bumps [addressable](https://github.com/sporkmonger/addressable) from 2.8.8 to 2.8.9. - [Changelog](https://github.com/sporkmonger/addressable/blob/main/CHANGELOG.md) - [Commits](https://github.com/sporkmonger/addressable/compare/addressable-2.8.8...addressable-2.8.9) --- updated-dependencies: - dependency-name: addressable dependency-version: 2.8.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 34559dcbc41..03ff4545b6d 100644 --- a/Gemfile +++ b/Gemfile @@ -72,7 +72,7 @@ gem "awesome_nested_set", "~> 3.9.0" gem "closure_tree", "~> 9.6.0" gem "rubytree", "~> 2.2.0" -gem "addressable", "~> 2.8.0" +gem "addressable", "~> 2.8.9" # Remove whitespace from model input gem "auto_strip_attributes", "~> 2.5" diff --git a/Gemfile.lock b/Gemfile.lock index 5a5f7dca92a..46cfcd9b41d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -321,7 +321,7 @@ GEM activesupport (>= 6.1) acts_as_tree (2.9.1) activerecord (>= 3.0.0) - addressable (2.8.8) + addressable (2.8.9) public_suffix (>= 2.0.2, < 8.0) aes_key_wrap (1.1.0) afm (1.0.0) @@ -1175,7 +1175,7 @@ GEM psych (5.3.1) date stringio - public_suffix (7.0.2) + public_suffix (7.0.5) puffing-billy (4.0.3) addressable (~> 2.5) cgi @@ -1568,7 +1568,7 @@ DEPENDENCIES activerecord-session_store (~> 2.2.0) acts_as_list (~> 1.2.6) acts_as_tree (~> 2.9.0) - addressable (~> 2.8.0) + addressable (~> 2.8.9) airbrake (~> 13.0.0) appsignal (~> 4.7) auto_strip_attributes (~> 2.5) @@ -1804,7 +1804,7 @@ CHECKSUMS activesupport (8.1.2) sha256=88842578ccd0d40f658289b0e8c842acfe9af751afee2e0744a7873f50b6fdae acts_as_list (1.2.6) sha256=8345380900b7bee620c07ad00991ccee59af3d8c9e8574f426e321da2865fdc8 acts_as_tree (2.9.1) sha256=b869eb10a8de38616b64ffcf9e882d3d99c8e06909c4057078a76c3b89a9a2f3 - addressable (2.8.8) sha256=7c13b8f9536cf6364c03b9d417c19986019e28f7c00ac8132da4eb0fe393b057 + addressable (2.8.9) sha256=cc154fcbe689711808a43601dee7b980238ce54368d23e127421753e46895485 aes_key_wrap (1.1.0) sha256=b935f4756b37375895db45669e79dfcdc0f7901e12d4e08974d5540c8e0776a5 afm (1.0.0) sha256=5bd4d6f6241e7014ef090985ec6f4c3e9745f6de0828ddd58bc1efdd138f4545 airbrake (13.0.5) sha256=901f5074c25d5ef77ed87f5bde7a28400a7324f5d7013a8a12d07e0099cc31b6 @@ -2163,7 +2163,7 @@ CHECKSUMS pry-rails (0.3.11) sha256=a69e28e24a34d75d1f60bcf241192a54253f8f7ef8a62cba1e75750a9653593d pry-rescue (1.6.0) sha256=985bfd506d9866b587fd86790cf8445266a41b7f92c627fc5b21ec7d92aba6db psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974 - public_suffix (7.0.2) sha256=9114090c8e4e7135c1fd0e7acfea33afaab38101884320c65aaa0ffb8e26a857 + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 puffing-billy (4.0.3) sha256=376fe2e2cc3ff9d48814a15153db80970cf0539ba026ac5108c971c2e160883c puma (7.2.0) sha256=bf8ef4ab514a4e6d4554cb4326b2004eba5036ae05cf765cfe51aba9706a72a8 puma-plugin-statsd (2.7.0) sha256=04f243a7233f4d06ec0e26f1a3522bce18a5910ae711763fabff22681bdad08b From d49d8f8dd281145502a2ec866b6c267ea9c03b36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 05:39:19 +0000 Subject: [PATCH 129/334] Bump good_job from 4.13.2 to 4.13.3 Bumps [good_job](https://github.com/bensheldon/good_job) from 4.13.2 to 4.13.3. - [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.13.2...v4.13.3) --- updated-dependencies: - dependency-name: good_job dependency-version: 4.13.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 34559dcbc41..04403c27ef0 100644 --- a/Gemfile +++ b/Gemfile @@ -127,7 +127,7 @@ gem "multi_json", "~> 1.19.0" gem "oj", "~> 3.16.12" gem "daemons" -gem "good_job", "~> 4.13.2" # update should be done manually in sync with saas-openproject version. +gem "good_job", "~> 4.13.3" # 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 5a5f7dca92a..b4dc65e9d34 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -619,7 +619,7 @@ GEM glob (0.4.0) globalid (1.3.0) activesupport (>= 6.1) - good_job (4.13.2) + good_job (4.13.3) activejob (>= 6.1.0) activerecord (>= 6.1.0) concurrent-ruby (>= 1.3.1) @@ -1621,7 +1621,7 @@ DEPENDENCIES friendly_id (~> 5.6.0) fuubar (~> 2.5.0) globalid (~> 1.3) - good_job (~> 4.13.2) + good_job (~> 4.13.3) google-apis-gmail_v1 googleauth grape (~> 3.1.1) @@ -1936,7 +1936,7 @@ CHECKSUMS fuubar (2.5.1) sha256=b272a7804b282661c7fab583a3764f92543cb482c365ae39c685cd218fdd4880 glob (0.4.0) sha256=893dc9e2d24abe13dda907ce0cda576f680ff382f2a6cf9e543f98ecbe29238c globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11 - good_job (4.13.2) sha256=c10eb032d8096c5132861b7935d529cf66c63e18ce00b1a26b6e69cb7775b8d1 + good_job (4.13.3) sha256=37478710dddd2630ed055f2159111ce6f7f14482d8ccb412142ee04674151e2e google-apis-core (1.0.2) sha256=ba4579aaadc902d6cc7bc8db88f566ab00f5e31ea87ab41e9f9a032c470f2629 google-apis-gmail_v1 (0.47.0) sha256=3064434b6da55b85e2828ce4bb0f4d04e8cfd187a4ab262ceb1dcb01f98e49ef google-cloud-env (2.3.1) sha256=0faac01eb27be78c2591d64433663b1a114f8f7af55a4f819755426cac9178e7 From 4fb1f385f9ff478c340415c12d797df5f7462369 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Wed, 4 Mar 2026 20:38:03 +0200 Subject: [PATCH 130/334] [#72801] Sharing permission dependencies are not migrated https://community.openproject.org/work_packages/72801 - Complete missing dependencies for view_sprints, create_sprints, manage_sprint_items - When migrating backlog permissions down, do not restore permissions where the source permission cannot be determined. - When migrating up, do not add manage_sprint_items to roles with add or edit work package permission - Remove unnecessary dependencies of the manage_sprint_items --- ...0212145213_migrate_backlogs_permissions.rb | 32 ++-- ...0304160505_fix_sprint_role_dependencies.rb | 39 +++++ .../lib/open_project/backlogs/engine.rb | 2 +- .../open_project/backlogs/permissions_spec.rb | 2 +- .../fix_sprint_role_dependencies_spec.rb | 143 ++++++++++++++++ .../migrate_backlogs_permissions_spec.rb | 156 ++++++++---------- 6 files changed, 272 insertions(+), 102 deletions(-) create mode 100644 db/migrate/20260304160505_fix_sprint_role_dependencies.rb create mode 100644 spec/migrations/fix_sprint_role_dependencies_spec.rb diff --git a/db/migrate/20260212145213_migrate_backlogs_permissions.rb b/db/migrate/20260212145213_migrate_backlogs_permissions.rb index 79f6634ab88..aa5c3a42afe 100644 --- a/db/migrate/20260212145213_migrate_backlogs_permissions.rb +++ b/db/migrate/20260212145213_migrate_backlogs_permissions.rb @@ -13,25 +13,25 @@ class MigrateBacklogsPermissions < ActiveRecord::Migration[8.1] ::Migration::MigrationUtils::PermissionRenamer.rename(:update_sprints, :create_sprints) ::Migration::MigrationUtils::PermissionAdder.add(:assign_versions, :manage_sprint_items) - ::Migration::MigrationUtils::PermissionAdder.add(:add_work_packages, :manage_sprint_items) - ::Migration::MigrationUtils::PermissionAdder.add(:edit_work_packages, :manage_sprint_items) end def down - ::Migration::MigrationUtils::PermissionAdder.add(:view_sprints, :view_taskboards, force: true) - ::Migration::MigrationUtils::PermissionRenamer.rename(:view_sprints, :view_master_backlog, force: true) + # Note: Ideally the `:view_taskboards`, `:view_master_backlog`, `:manage_versions`, + # `:select_done_statuses`, `:update_sprints` permissions should be restored too, + # but unfortunately we cannot know which one lead to the user gaining `:view_sprints` + # or `:create_sprints` permissions. + # There are 2 possible solutions for this issue: + # 1. Grant both the `:view_taskboards`, `:view_master_backlog` where `:view_sprints` was granted. + # Respectively, grant `:manage_versions`, `:select_done_statuses`, `:update_sprints` permissions + # where `:create_sprints` was granted. Unfortunately this leads to users gaining permissions + # they didn't possibly had before the migration. + # 2. Grant none of the undecisible permissions, which leads to users losing permissions they had + # before the migration. + # + # The conservative approach here is to pick #2, because it avoids accidentally leaking permissions + # to users. - # Note: Some roles might receive extra permissions on the way down because, - # we need to add back all the roles that have been merged on the way up. - ::Migration::MigrationUtils::PermissionAdder.add(:create_sprints, :manage_versions) - ::Migration::MigrationUtils::PermissionAdder.add(:create_sprints, :select_done_statuses, force: true) - ::Migration::MigrationUtils::PermissionAdder.add(:create_sprints, :update_sprints, force: true) - - ::Migration::MigrationUtils::PermissionAdder.add(:manage_sprint_items, :assign_versions) - ::Migration::MigrationUtils::PermissionAdder.add(:manage_sprint_items, :add_work_packages) - ::Migration::MigrationUtils::PermissionAdder.add(:manage_sprint_items, :edit_work_packages) - - # Remove new permissions that were added during up - RolePermission.delete_by(permission: %w(create_sprints manage_sprint_items)) + # Remove new permissions that were added during the up migration + RolePermission.delete_by(permission: %w(view_sprints create_sprints manage_sprint_items)) end end diff --git a/db/migrate/20260304160505_fix_sprint_role_dependencies.rb b/db/migrate/20260304160505_fix_sprint_role_dependencies.rb new file mode 100644 index 00000000000..a68994188c9 --- /dev/null +++ b/db/migrate/20260304160505_fix_sprint_role_dependencies.rb @@ -0,0 +1,39 @@ +# 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.root.join("db/migrate/migration_utils/permission_adder") + +class FixSprintRoleDependencies < ActiveRecord::Migration[8.1] + def change + ::Migration::MigrationUtils::PermissionAdder.add(:manage_sprint_items, :view_sprints) + ::Migration::MigrationUtils::PermissionAdder.add(:create_sprints, :view_sprints) + ::Migration::MigrationUtils::PermissionAdder.add(:view_sprints, :view_work_packages) + end +end diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index ef6fe72da58..c625fcce1e9 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -97,7 +97,7 @@ module OpenProject::Backlogs { rb_stories: %i[move reorder] }, permissible_on: :project, require: :member, - dependencies: %i[view_sprints add_work_packages edit_work_packages] + dependencies: :view_sprints permission :share_sprint, {}, diff --git a/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb b/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb index 254ed769535..8d32adaaf88 100644 --- a/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb +++ b/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb @@ -51,7 +51,7 @@ RSpec.describe OpenProject::AccessControl, "Backlogs module permissions" do # ru subject { described_class.permission(:manage_sprint_items) } it "depends on view_sprints, add_work_packages, and edit_work_packages" do - expect(subject.dependencies).to contain_exactly(:view_sprints, :add_work_packages, :edit_work_packages) + expect(subject.dependencies).to contain_exactly(:view_sprints) end end diff --git a/spec/migrations/fix_sprint_role_dependencies_spec.rb b/spec/migrations/fix_sprint_role_dependencies_spec.rb new file mode 100644 index 00000000000..68211e2ee51 --- /dev/null +++ b/spec/migrations/fix_sprint_role_dependencies_spec.rb @@ -0,0 +1,143 @@ +# 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 Rails.root.join("db/migrate/20260304160505_fix_sprint_role_dependencies") + +RSpec.describe FixSprintRoleDependencies, type: :model do + let!(:role) { create(:project_role, permissions:, add_public_permissions: false) } + + subject(:migrate) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:up) } } + + describe "completing depencencies for view_sprints permission" do + context "when view_work_packages is missing" do + let(:permissions) { [:view_sprints] } + + it "adds view_work_packages" do + expect { migrate } + .to change { role.reload.permissions } + .from(match_array(%i[view_sprints])) + .to(match_array(%i[view_sprints view_work_packages])) + end + end + + context "when view_work_packages is present" do + let(:permissions) { %i[view_sprints view_work_packages] } + + it "does not duplicate view_work_packages" do + expect { migrate }.not_to change { role.reload.permissions } + end + end + end + + describe "completing dependencies for create_sprints permission" do + context "when view_sprints and view_work_packages are missing" do + let(:permissions) { [:create_sprints] } + + it "adds view_sprints and view_work_packages" do + expect { migrate } + .to change { role.reload.permissions } + .from(match_array(%i[create_sprints])) + .to(match_array(%i[create_sprints view_sprints view_work_packages])) + end + end + + context "when view_work_packages is present" do + let(:permissions) { %i[create_sprints view_work_packages] } + + it "adds view_sprints" do + expect { migrate } + .to change { role.reload.permissions } + .from(match_array(%i[create_sprints view_work_packages])) + .to(match_array(%i[create_sprints view_sprints view_work_packages])) + end + end + + context "when view_sprints and view_work_packages are present" do + let(:permissions) { %i[create_sprints view_sprints view_work_packages] } + + it "does not change the permissions" do + expect { migrate }.not_to change { role.reload.permissions } + end + end + end + + describe "completing dependencies for manage_sprint_items permission" do + context "when view_sprints and view_work_packages are missing" do + let(:permissions) { [:manage_sprint_items] } + + it "adds view_sprints and view_work_packages" do + expect { migrate } + .to change { role.reload.permissions } + .from(match_array(%i[manage_sprint_items])) + .to(match_array(%i[manage_sprint_items view_sprints view_work_packages])) + end + end + + context "when view_work_packages is present" do + let(:permissions) { %i[manage_sprint_items view_work_packages] } + + it "adds view_sprints" do + expect { migrate } + .to change { role.reload.permissions } + .from(match_array(%i[manage_sprint_items view_work_packages])) + .to(match_array(%i[manage_sprint_items view_sprints view_work_packages])) + end + end + + context "when view_sprints and view_work_packages are present" do + let(:permissions) { %i[manage_sprint_items view_sprints view_work_packages] } + + it "does not change the permissions" do + expect { migrate }.not_to change { role.reload.permissions } + end + end + end + + describe "completing combined dependencies with view_work_packages missing" do + let(:permissions) { %i[view_sprints create_sprints manage_sprint_items] } + + it "adds view_work_packages without duplicating view_sprints" do + expect { migrate } + .to change { role.reload.permissions } + .from(match_array(%i[view_sprints create_sprints manage_sprint_items])) + .to(match_array(%i[view_sprints create_sprints manage_sprint_items view_work_packages])) + end + end + + describe "not copmpleting dependencies for other roles" do + let(:permissions) { [:edit_work_packages] } + + it "does not change the permissions" do + expect { migrate }.not_to change { role.reload.permissions } + end + end +end diff --git a/spec/migrations/migrate_backlogs_permissions_spec.rb b/spec/migrations/migrate_backlogs_permissions_spec.rb index 8ef75a3766a..db56eeaa7d5 100644 --- a/spec/migrations/migrate_backlogs_permissions_spec.rb +++ b/spec/migrations/migrate_backlogs_permissions_spec.rb @@ -34,82 +34,69 @@ require Rails.root.join("db/migrate/20260212145213_migrate_backlogs_permissions" RSpec.describe MigrateBacklogsPermissions, type: :model do subject(:migrate) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:up) } } - let!(:empty_role) { create(:project_role) } - # Using add_public_permissions: false to keep permission sets minimal. - let!(:backlog_viewer_role) do - create(:project_role, permissions: %i[view_master_backlog], add_public_permissions: false) - end - let!(:taskboard_viewer_role) do - create(:project_role, permissions: %i[view_taskboards], add_public_permissions: false) - end - let(:member_role_permissions) do - %i[view_master_backlog view_taskboards add_work_packages - edit_work_packages assign_versions] - end - let(:migrated_member_role_permissions) do - %i[add_work_packages edit_work_packages assign_versions view_sprints manage_sprint_items] - end - let!(:member_role) do - create(:project_role, permissions: member_role_permissions, add_public_permissions: false) - end - let(:manager_role_permissions) do - %i[view_master_backlog view_taskboards manage_versions select_done_statuses - update_sprints assign_versions add_work_packages edit_work_packages] - end - let(:migrated_manager_role_permissions) do - %i[manage_versions add_work_packages edit_work_packages assign_versions - view_sprints create_sprints manage_sprint_items] - end - let!(:manager_role) do - create(:project_role, permissions: manager_role_permissions, add_public_permissions: false) + # source permission => expected permissions after up migration. + up_mapping = { + view_master_backlog: %i[view_sprints], + view_taskboards: %i[view_sprints], + select_done_statuses: %i[create_sprints], + update_sprints: %i[create_sprints], + manage_versions: %i[manage_versions create_sprints], + assign_versions: %i[assign_versions manage_sprint_items] + } + + # source permission => expected permissions after rollback. + # Backlogs-specific permissions (view_master_backlog, view_taskboards, select_done_statuses, + # update_sprints) are lost because the down migration cannot determine the original source. + down_mapping = { + view_master_backlog: [], + view_taskboards: [], + select_done_statuses: [], + update_sprints: [], + manage_versions: %i[manage_versions], + assign_versions: %i[assign_versions] + } + + let(:all_source_permissions) do + %i(view_master_backlog + view_taskboards + select_done_statuses + update_sprints + manage_versions + assign_versions) end + let!(:role) { create(:project_role, permissions:, add_public_permissions: false) } + describe "migrating up" do - it "does not add any permissions to a role without backlogs permissions" do - expect { migrate }.not_to change { empty_role.reload.permissions } + context "with a role having no backlogs permissions" do + let(:permissions) { [] } + + it "does not change permissions" do + expect { migrate }.not_to change { role.reload.permissions } + end end - it "migrates manager_role permissions correctly" do - expect { migrate } - .to change { manager_role.reload.permissions } - .from(match_array(manager_role_permissions)) - .to(match_array(migrated_manager_role_permissions)) + up_mapping.each do |source_permission, expected_permissions| + context "with a role having only :#{source_permission} permission" do + let(:permissions) { [source_permission] } + + it "results in #{expected_permissions}" do + expect { migrate } + .to change { role.reload.permissions } + .from(contain_exactly(source_permission)) + .to(match_array(expected_permissions)) + end + end end - it "migrates backlog_viewer_role permissions correctly" do - expect { migrate } - .to change { backlog_viewer_role.reload.permissions } - .from(match_array(%i[view_master_backlog])) - .to(match_array(%i[view_sprints])) - end + context "with a role combining all source permissions" do + let(:permissions) { all_source_permissions } - it "migrates taskboard_viewer_role permissions correctly" do - expect { migrate } - .to change { taskboard_viewer_role.reload.permissions } - .from(match_array(%i[view_taskboards])) - .to(match_array(%i[view_sprints])) - end - - it "migrates member_role permissions correctly" do - expect { migrate } - .to change { member_role.reload.permissions } - .from(match_array(member_role_permissions)) - .to(match_array(migrated_member_role_permissions)) - end - - it "does not duplicate view_sprints when role had both view_master_backlog and view_taskboards" do - migrate - expect(manager_role.reload.role_permissions.where(permission: "view_sprints").count).to eq(1) - end - - it "does not duplicate create_sprints when role has multiple source permissions" do - migrate - expect(manager_role.reload.role_permissions.where(permission: "create_sprints").count).to eq(1) - end - - it "does not duplicate manage_sprint_items when role has multiple source permissions" do - migrate - expect(manager_role.reload.role_permissions.where(permission: "manage_sprint_items").count).to eq(1) + it "migrates to all new permissions plus retained core permissions" do + expect { migrate } + .to change { role.reload.permissions } + .to(match_array(%i[view_sprints create_sprints manage_sprint_items manage_versions assign_versions])) + end end end @@ -118,25 +105,26 @@ RSpec.describe MigrateBacklogsPermissions, type: :model do before { migrate } - it "reverts backlog_viewer_role permissions" do - expect { rollback } - .to change { backlog_viewer_role.reload.permissions } - .from(match_array(%i[view_sprints])) - .to(match_array(%i[view_taskboards view_master_backlog])) + down_mapping.each do |source_permission, expected_permissions| + context "with a role originally having only :#{source_permission} permission" do + let(:permissions) { [source_permission] } + + it "retains #{expected_permissions.empty? ? 'no' : expected_permissions} permissions" do + expect { rollback } + .to change { role.reload.permissions } + .to(match_array(expected_permissions)) + end + end end - it "reverts manager_role permissions" do - expect { rollback } - .to change { manager_role.reload.permissions } - .from(match_array(migrated_manager_role_permissions)) - .to(match_array(manager_role_permissions)) - end + context "with a role combining all source permissions" do + let(:permissions) { all_source_permissions } - it "reverts member_role permissions" do - expect { rollback } - .to change { member_role.reload.permissions } - .from(match_array(migrated_member_role_permissions)) - .to(match_array(member_role_permissions)) + it "retains only core permissions that were not deleted during up" do + expect { rollback } + .to change { role.reload.permissions } + .to(match_array(%i[manage_versions assign_versions])) + end end end end From 3366eb60b9af5e2ff95eb48cd09167c332e91e45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 11:14:13 +0000 Subject: [PATCH 131/334] Bump tar from 7.5.7 to 7.5.10 in /frontend Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.7 to 7.5.10. - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-tar/compare/v7.5.7...v7.5.10) --- updated-dependencies: - dependency-name: tar dependency-version: 7.5.10 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 345800ab020..4a496768efa 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23534,9 +23534,9 @@ } }, "node_modules/tar": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.10.tgz", + "integrity": "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -41283,9 +41283,9 @@ "dev": true }, "tar": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.10.tgz", + "integrity": "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==", "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", From 12047204549737db6773bc7f378da6c7356a20f7 Mon Sep 17 00:00:00 2001 From: Marcello Rocha Date: Thu, 5 Mar 2026 13:39:45 +0100 Subject: [PATCH 132/334] adds comment on why we handle HTTPX::HTTPErrors and why it is safe --- .../authentication_strategies/oauth_client_credentials.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb index 647216d53db..083c36ee3e0 100644 --- a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb +++ b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb @@ -61,6 +61,12 @@ module Storages end operation_result + # HTTPX default behaviour is to return error responses and not raise errors unless + # explicitly asked by using the `#raise_for_status`method. + # + # On Storages codebase we handle the error responses, but the OAuth + # plugin raises and exception when it fails to get a Token.. + # The handling below will only apply to authentication errors. rescue HTTPX::HTTPError => e error("Error while refreshing OAuth token - Payload: #{e.response}") From 344c12a47ea2b5c4036ea9104214c8f5eb6b95cd Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Thu, 5 Mar 2026 13:17:57 +0000 Subject: [PATCH 133/334] update locales from crowdin [ci skip] --- config/locales/crowdin/pl.yml | 350 +++++++++--------- .../backlogs/config/locales/crowdin/js-pl.yml | 4 +- .../backlogs/config/locales/crowdin/pl.yml | 88 ++--- modules/budgets/config/locales/crowdin/af.yml | 3 + modules/budgets/config/locales/crowdin/ar.yml | 3 + modules/budgets/config/locales/crowdin/az.yml | 3 + modules/budgets/config/locales/crowdin/be.yml | 3 + modules/budgets/config/locales/crowdin/bg.yml | 3 + modules/budgets/config/locales/crowdin/ca.yml | 3 + .../budgets/config/locales/crowdin/ckb-IR.yml | 3 + modules/budgets/config/locales/crowdin/cs.yml | 3 + modules/budgets/config/locales/crowdin/da.yml | 3 + modules/budgets/config/locales/crowdin/de.yml | 3 + modules/budgets/config/locales/crowdin/el.yml | 3 + modules/budgets/config/locales/crowdin/eo.yml | 3 + modules/budgets/config/locales/crowdin/es.yml | 3 + modules/budgets/config/locales/crowdin/et.yml | 3 + modules/budgets/config/locales/crowdin/eu.yml | 3 + modules/budgets/config/locales/crowdin/fa.yml | 3 + modules/budgets/config/locales/crowdin/fi.yml | 3 + .../budgets/config/locales/crowdin/fil.yml | 3 + modules/budgets/config/locales/crowdin/fr.yml | 3 + modules/budgets/config/locales/crowdin/he.yml | 3 + modules/budgets/config/locales/crowdin/hi.yml | 3 + modules/budgets/config/locales/crowdin/hr.yml | 3 + modules/budgets/config/locales/crowdin/hu.yml | 3 + modules/budgets/config/locales/crowdin/id.yml | 3 + modules/budgets/config/locales/crowdin/it.yml | 3 + modules/budgets/config/locales/crowdin/ja.yml | 3 + .../budgets/config/locales/crowdin/js-af.yml | 6 - .../budgets/config/locales/crowdin/js-ar.yml | 6 - .../budgets/config/locales/crowdin/js-az.yml | 6 - .../budgets/config/locales/crowdin/js-be.yml | 6 - .../budgets/config/locales/crowdin/js-bg.yml | 6 - .../budgets/config/locales/crowdin/js-ca.yml | 6 - .../config/locales/crowdin/js-ckb-IR.yml | 6 - .../budgets/config/locales/crowdin/js-cs.yml | 6 - .../budgets/config/locales/crowdin/js-da.yml | 6 - .../budgets/config/locales/crowdin/js-de.yml | 6 - .../budgets/config/locales/crowdin/js-el.yml | 6 - .../budgets/config/locales/crowdin/js-eo.yml | 6 - .../budgets/config/locales/crowdin/js-es.yml | 6 - .../budgets/config/locales/crowdin/js-et.yml | 6 - .../budgets/config/locales/crowdin/js-eu.yml | 6 - .../budgets/config/locales/crowdin/js-fa.yml | 6 - .../budgets/config/locales/crowdin/js-fi.yml | 6 - .../budgets/config/locales/crowdin/js-fil.yml | 6 - .../budgets/config/locales/crowdin/js-fr.yml | 6 - .../budgets/config/locales/crowdin/js-he.yml | 6 - .../budgets/config/locales/crowdin/js-hi.yml | 6 - .../budgets/config/locales/crowdin/js-hr.yml | 6 - .../budgets/config/locales/crowdin/js-hu.yml | 6 - .../budgets/config/locales/crowdin/js-id.yml | 6 - .../budgets/config/locales/crowdin/js-it.yml | 6 - .../budgets/config/locales/crowdin/js-ja.yml | 6 - .../budgets/config/locales/crowdin/js-ka.yml | 6 - .../budgets/config/locales/crowdin/js-kk.yml | 6 - .../budgets/config/locales/crowdin/js-ko.yml | 6 - .../budgets/config/locales/crowdin/js-lt.yml | 6 - .../budgets/config/locales/crowdin/js-lv.yml | 6 - .../budgets/config/locales/crowdin/js-mn.yml | 6 - .../budgets/config/locales/crowdin/js-ms.yml | 6 - .../budgets/config/locales/crowdin/js-ne.yml | 6 - .../budgets/config/locales/crowdin/js-nl.yml | 6 - .../budgets/config/locales/crowdin/js-no.yml | 6 - .../budgets/config/locales/crowdin/js-pl.yml | 6 - .../config/locales/crowdin/js-pt-BR.yml | 6 - .../config/locales/crowdin/js-pt-PT.yml | 6 - .../budgets/config/locales/crowdin/js-ro.yml | 6 - .../budgets/config/locales/crowdin/js-ru.yml | 6 - .../budgets/config/locales/crowdin/js-rw.yml | 6 - .../budgets/config/locales/crowdin/js-si.yml | 6 - .../budgets/config/locales/crowdin/js-sk.yml | 6 - .../budgets/config/locales/crowdin/js-sl.yml | 6 - .../budgets/config/locales/crowdin/js-sr.yml | 6 - .../budgets/config/locales/crowdin/js-sv.yml | 6 - .../budgets/config/locales/crowdin/js-th.yml | 6 - .../budgets/config/locales/crowdin/js-tr.yml | 6 - .../budgets/config/locales/crowdin/js-uk.yml | 6 - .../budgets/config/locales/crowdin/js-uz.yml | 6 - .../budgets/config/locales/crowdin/js-vi.yml | 6 - .../config/locales/crowdin/js-zh-CN.yml | 6 - .../config/locales/crowdin/js-zh-TW.yml | 6 - modules/budgets/config/locales/crowdin/ka.yml | 3 + modules/budgets/config/locales/crowdin/kk.yml | 3 + modules/budgets/config/locales/crowdin/ko.yml | 3 + modules/budgets/config/locales/crowdin/lt.yml | 3 + modules/budgets/config/locales/crowdin/lv.yml | 3 + modules/budgets/config/locales/crowdin/mn.yml | 3 + modules/budgets/config/locales/crowdin/ms.yml | 3 + modules/budgets/config/locales/crowdin/ne.yml | 3 + modules/budgets/config/locales/crowdin/nl.yml | 3 + modules/budgets/config/locales/crowdin/no.yml | 3 + modules/budgets/config/locales/crowdin/pl.yml | 51 +-- .../budgets/config/locales/crowdin/pt-BR.yml | 3 + .../budgets/config/locales/crowdin/pt-PT.yml | 3 + modules/budgets/config/locales/crowdin/ro.yml | 3 + modules/budgets/config/locales/crowdin/ru.yml | 3 + modules/budgets/config/locales/crowdin/rw.yml | 3 + modules/budgets/config/locales/crowdin/si.yml | 3 + modules/budgets/config/locales/crowdin/sk.yml | 3 + modules/budgets/config/locales/crowdin/sl.yml | 3 + modules/budgets/config/locales/crowdin/sr.yml | 3 + modules/budgets/config/locales/crowdin/sv.yml | 3 + modules/budgets/config/locales/crowdin/th.yml | 3 + modules/budgets/config/locales/crowdin/tr.yml | 3 + modules/budgets/config/locales/crowdin/uk.yml | 3 + modules/budgets/config/locales/crowdin/uz.yml | 3 + modules/budgets/config/locales/crowdin/vi.yml | 3 + .../budgets/config/locales/crowdin/zh-CN.yml | 3 + .../budgets/config/locales/crowdin/zh-TW.yml | 3 + modules/costs/config/locales/crowdin/af.yml | 2 +- modules/costs/config/locales/crowdin/ar.yml | 2 +- modules/costs/config/locales/crowdin/az.yml | 2 +- modules/costs/config/locales/crowdin/be.yml | 2 +- modules/costs/config/locales/crowdin/bg.yml | 2 +- modules/costs/config/locales/crowdin/ca.yml | 2 +- .../costs/config/locales/crowdin/ckb-IR.yml | 2 +- modules/costs/config/locales/crowdin/cs.yml | 2 +- modules/costs/config/locales/crowdin/da.yml | 2 +- modules/costs/config/locales/crowdin/de.yml | 2 +- modules/costs/config/locales/crowdin/el.yml | 2 +- modules/costs/config/locales/crowdin/eo.yml | 2 +- modules/costs/config/locales/crowdin/es.yml | 2 +- modules/costs/config/locales/crowdin/et.yml | 2 +- modules/costs/config/locales/crowdin/eu.yml | 2 +- modules/costs/config/locales/crowdin/fa.yml | 2 +- modules/costs/config/locales/crowdin/fi.yml | 2 +- modules/costs/config/locales/crowdin/fil.yml | 2 +- modules/costs/config/locales/crowdin/fr.yml | 2 +- modules/costs/config/locales/crowdin/he.yml | 2 +- modules/costs/config/locales/crowdin/hi.yml | 2 +- modules/costs/config/locales/crowdin/hr.yml | 2 +- modules/costs/config/locales/crowdin/hu.yml | 2 +- modules/costs/config/locales/crowdin/id.yml | 2 +- modules/costs/config/locales/crowdin/it.yml | 2 +- modules/costs/config/locales/crowdin/ja.yml | 2 +- .../costs/config/locales/crowdin/js-af.yml | 6 - .../costs/config/locales/crowdin/js-ar.yml | 6 - .../costs/config/locales/crowdin/js-az.yml | 6 - .../costs/config/locales/crowdin/js-be.yml | 6 - .../costs/config/locales/crowdin/js-bg.yml | 6 - .../costs/config/locales/crowdin/js-ca.yml | 6 - .../config/locales/crowdin/js-ckb-IR.yml | 6 - .../costs/config/locales/crowdin/js-cs.yml | 6 - .../costs/config/locales/crowdin/js-da.yml | 6 - .../costs/config/locales/crowdin/js-de.yml | 6 - .../costs/config/locales/crowdin/js-el.yml | 6 - .../costs/config/locales/crowdin/js-eo.yml | 6 - .../costs/config/locales/crowdin/js-es.yml | 6 - .../costs/config/locales/crowdin/js-et.yml | 6 - .../costs/config/locales/crowdin/js-eu.yml | 6 - .../costs/config/locales/crowdin/js-fa.yml | 6 - .../costs/config/locales/crowdin/js-fi.yml | 6 - .../costs/config/locales/crowdin/js-fil.yml | 6 - .../costs/config/locales/crowdin/js-fr.yml | 6 - .../costs/config/locales/crowdin/js-he.yml | 6 - .../costs/config/locales/crowdin/js-hi.yml | 6 - .../costs/config/locales/crowdin/js-hr.yml | 6 - .../costs/config/locales/crowdin/js-hu.yml | 6 - .../costs/config/locales/crowdin/js-id.yml | 6 - .../costs/config/locales/crowdin/js-it.yml | 6 - .../costs/config/locales/crowdin/js-ja.yml | 6 - .../costs/config/locales/crowdin/js-ka.yml | 6 - .../costs/config/locales/crowdin/js-kk.yml | 6 - .../costs/config/locales/crowdin/js-ko.yml | 6 - .../costs/config/locales/crowdin/js-lt.yml | 6 - .../costs/config/locales/crowdin/js-lv.yml | 6 - .../costs/config/locales/crowdin/js-mn.yml | 6 - .../costs/config/locales/crowdin/js-ms.yml | 6 - .../costs/config/locales/crowdin/js-ne.yml | 6 - .../costs/config/locales/crowdin/js-nl.yml | 6 - .../costs/config/locales/crowdin/js-no.yml | 6 - .../costs/config/locales/crowdin/js-pl.yml | 6 - .../costs/config/locales/crowdin/js-pt-BR.yml | 6 - .../costs/config/locales/crowdin/js-pt-PT.yml | 6 - .../costs/config/locales/crowdin/js-ro.yml | 6 - .../costs/config/locales/crowdin/js-ru.yml | 6 - .../costs/config/locales/crowdin/js-rw.yml | 6 - .../costs/config/locales/crowdin/js-si.yml | 6 - .../costs/config/locales/crowdin/js-sk.yml | 6 - .../costs/config/locales/crowdin/js-sl.yml | 6 - .../costs/config/locales/crowdin/js-sr.yml | 6 - .../costs/config/locales/crowdin/js-sv.yml | 6 - .../costs/config/locales/crowdin/js-th.yml | 6 - .../costs/config/locales/crowdin/js-tr.yml | 6 - .../costs/config/locales/crowdin/js-uk.yml | 6 - .../costs/config/locales/crowdin/js-uz.yml | 6 - .../costs/config/locales/crowdin/js-vi.yml | 6 - .../costs/config/locales/crowdin/js-zh-CN.yml | 6 - .../costs/config/locales/crowdin/js-zh-TW.yml | 6 - modules/costs/config/locales/crowdin/ka.yml | 2 +- modules/costs/config/locales/crowdin/kk.yml | 2 +- modules/costs/config/locales/crowdin/ko.yml | 2 +- modules/costs/config/locales/crowdin/lt.yml | 2 +- modules/costs/config/locales/crowdin/lv.yml | 2 +- modules/costs/config/locales/crowdin/mn.yml | 2 +- modules/costs/config/locales/crowdin/ms.yml | 2 +- modules/costs/config/locales/crowdin/ne.yml | 2 +- modules/costs/config/locales/crowdin/nl.yml | 2 +- modules/costs/config/locales/crowdin/no.yml | 2 +- modules/costs/config/locales/crowdin/pl.yml | 18 +- .../costs/config/locales/crowdin/pt-BR.yml | 2 +- .../costs/config/locales/crowdin/pt-PT.yml | 2 +- modules/costs/config/locales/crowdin/ro.yml | 2 +- modules/costs/config/locales/crowdin/ru.yml | 2 +- modules/costs/config/locales/crowdin/rw.yml | 2 +- modules/costs/config/locales/crowdin/si.yml | 2 +- modules/costs/config/locales/crowdin/sk.yml | 2 +- modules/costs/config/locales/crowdin/sl.yml | 2 +- modules/costs/config/locales/crowdin/sr.yml | 2 +- modules/costs/config/locales/crowdin/sv.yml | 2 +- modules/costs/config/locales/crowdin/th.yml | 2 +- modules/costs/config/locales/crowdin/tr.yml | 2 +- modules/costs/config/locales/crowdin/uk.yml | 2 +- modules/costs/config/locales/crowdin/uz.yml | 2 +- modules/costs/config/locales/crowdin/vi.yml | 2 +- .../costs/config/locales/crowdin/zh-CN.yml | 2 +- .../costs/config/locales/crowdin/zh-TW.yml | 2 +- .../documents/config/locales/crowdin/pl.yml | 6 +- .../grids/config/locales/crowdin/js-pl.yml | 4 +- modules/meeting/config/locales/crowdin/pl.yml | 38 +- 222 files changed, 493 insertions(+), 979 deletions(-) diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 665e67fb3b7..5d683e2822f 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -83,9 +83,9 @@ pl: confirmation: "Czy na pewno chcesz usunąć ten token wsparcia wersji Enterprise?" create_dialog: title: "Dodaj token Enterprise" - type_token_text: "Your Enterprise token text" + type_token_text: "Tekst tokenu Enterprise" token_placeholder: "Wklej swój token wsparcia wersji Enterprise tutaj" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "Więcej informacji o aktywowaniu wersji Enterprise zawiera nasza [dokumentacja](docs_url)." add_token: "Wyślij swój token wsparcia wersji Enterprise" replace_token: "Wymień swój obecny token wsparcia" order: "Zamów wersję Enterprise On-Premises" @@ -113,193 +113,193 @@ pl: import: title: "Import" jira: - title: "Jira Import" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + title: "Import Jira" + description: "To narzędzie służy do importowania danych z wystąpienia usługi Jira. Można skonfigurować wiele hostów usługi Jira i wybrać, co ma być importowane w każdym przebiegu importu." errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "Nie można usunąć hosta Jira z istniejącym importem" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + title: "Nie skonfigurowano jeszcze hostów Jira" + description: "Skonfiguruj host usługi Jira, aby rozpocząć importowanie elementów z Jira do tego wystąpienia OpenProject." configuration: - title: "Jira configuration" - new: "New configuration" + title: "Konfiguracja usługi Jira" + new: "Nowa konfiguracja" banner: - title: "Limited import" + title: "Ograniczony import" description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: - name: "Name" - url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + name: "Nazwa" + url: "Adres URL serwera / centrum danych Jira" + personal_access_token: "Osobisty token dostępu" + button_add: "Dodaj konfigurację" + button_save: "Zapisz konfigurację" + button_test: "Przetestuj konfigurację" + button_delete_token: "Usuń token" + delete_token_confirm: "Czy na pewno chcesz usunąć token? Poskutkuje to wyłączeniem połączenia Jira." + label_testing: "Testowanie konfiguracji..." + token_deleted: "Token został usunięty." test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" + success: "Połączono z serwerem %{server} (wersja %{version})" + failed: "Połączenie nie powiodło się: nie można pobrać informacji o serwerze" + error: "Podczas testowania połączenia wystąpił nieoczekiwany błąd" + connection_error: "Błąd połączenia: %{message}" parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + api_error: "Interfejs API Jira zwrócił status błędu %{status}. Sprawdź adres URL wystąpienia usługi Jira i token interfejsu API." + token_error: "Nieprawidłowy token interfejsu API. Sprawdź swoje dane poświadczenia w konfiguracji." + missing_credentials: "Aby przetestować połączenie, podaj zarówno adres URL, jak i osobisty token dostępu" + invalid_url: "Podaj prawidłowy adres URL" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "Nie udało się połączyć z serwerem Jira: %{message}" + connection_timeout: "Upłynął limit czasu połączenia z serwerem Jira: %{message}" + parse_error: "Nie udało się przeanalizować odpowiedzi interfejsu API usługi Jira: %{message}" + api_error: "Interfejs API usługi Jira zwrócił status błędu %{status}" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" - label_ago: "%{amount} ago" + projects: "Projekty" + last_change: "Ostatnia zmiana" + added: "Dodano" + label_ago: "%{amount} temu" run: - title: "Import run" - history: "History" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + title: "Uruchomienie importu" + history: "Historia" + remove_error: "Importu Jira nie można usunąć, gdy jest uruchomiony" + import_blocked_error: "Inne uruchomienie importu Jira jest obecnie w toku lub oczekuje na sprawdzenie. Przed rozpoczęciem nowego importu zakończ je lub cofnij." blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "Nie skonfigurowano jeszcze żadnych uruchomień importu" + description: "Utwórz uruchomienie importu, aby rozpocząć importowanie informacji z tego wystąpienia usługi Jira" 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: "Uruchomienie importu" + button_edit_configuration: "Edytuj konfigurację" status: initial: "Start" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" - configuring: "Select scope" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" - imported: "Review mode" - reverting: "Reverting" - revert_error: "Error during revert" - reverted: "Reverted" - completed: "Completed" + instance_meta_fetching: "Pobieranie metadanych" + instance_meta_error: "Błąd podczas pobierania metadanych" + instance_meta_done: "Pobrano metadane" + configuring: "Wybierz zakres" + projects_meta_fetching: "Pobieranie danych projektu" + projects_meta_error: "Błąd podczas pobierania danych projektu" + projects_meta_done: "Zebrano dane" + importing: "W toku" + import_error: "Błąd podczas importu" + imported: "Tryb przeglądu" + reverting: "Cofanie" + revert_error: "Błąd podczas cofania" + reverted: "Cofnięto" + completed: "Ukończono" wizard: - button_retry: "Retry" + button_retry: "Ponów próbę" parts: projects: - one: "1 project" - few: "%{count} projects" - many: "%{count} projects" - other: "%{count} projects" + one: "1 projekt" + few: "%{count} projekty" + many: "%{count} projektów" + other: "%{count} projektu" issues: - one: "1 issue" - few: "%{count} issues" - many: "%{count} issues" - other: "%{count} issues" + one: "1 problem" + few: "%{count} problemy" + many: "%{count} problemów" + other: "%{count} problemu" work_packages: - one: "1 work package" - few: "%{count} work packages" - many: "%{count} work packages" - other: "%{count} work packages" + one: "1 pakiet roboczy" + few: "%{count} pakiety robocze" + many: "%{count} pakietów roboczych" + other: "%{count} pakietu roboczego" types: - one: "1 type" - few: "%{count} types" - many: "%{count} types" - other: "%{count} types" + one: "1 typ" + few: "%{count} typy" + many: "%{count} typów" + other: "%{count} typu" statuses: one: "1 status" - few: "%{count} statuses" - many: "%{count} statuses" - other: "%{count} statuses" + few: "%{count} statusy" + many: "%{count} statusów" + other: "%{count} statusu" users: - one: "1 user" - few: "%{count} users" - many: "%{count} users" - other: "%{count} users" + one: "1 użytkownik" + few: "%{count} użytkowników" + many: "%{count} użytkowników" + other: "%{count} użytkownika" groups: fetch: - title: "Get base data" + title: "Pobierz dane bazowe" groups_and_users: - title: "Groups and Users" + title: "Grupy i użytkownicy" configuration: - title: "Configure import" + title: "Sknfiguruj import" confirming: - title: "Confirm and import" + title: "Potwierdź i zaimportuj" review: - title: "Review import" + title: "Sprawdź import" sections: fetch_data: - title: "Fetch instance meta data" - caption_done: "Completed" + title: "Pobierz metadane wystąpienia" + caption_done: "Ukończono" 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: "Pobieranie danych z Jira..." groups_and_users: - title: "Groups and Users" + title: "Grupy i użytkownicy" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" + title: "Zakres importu" + caption: "Wybierz co chcesz zaimportować do OpenProject" + caption_done: "Ukończono" 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 URL 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_available_data: "Available data" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" - button_continue: "Continue" - 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..." + label_available_data: "Dostępne dane" + label_not_available_data: "Niedostępne do importu" + button_select_projects: "Wybierz projekty do zaimportowania" + button_continue: "Kontynuuj" + label_import: "Wybierz projekty, które chcesz zaimportować." + button_select: "Wybierz projekty" + label_selected_data: "Wybrane dane do zaimportowania" + label_progress: "Pobieranie danych z Jira..." elements: - relations: "Relations between issues" + relations: "Relacje między problemami" workflows: "Project-level workflows" - users: "Users" - sprints: "Sprints" - schemes: "Schemas" + users: "Użytkownicy" + sprints: "Sprinty" + schemes: "Schematy" permissions: "User, group and project permissions" confirm_import: - title: "Import data" - caption: "Review your import settings and start the import" - caption_done: "Completed" - label_available_data: "Available data to import" - 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" + title: "Importuj dane" + caption: "Sprawdź ustawienia importu i rozpocznij import" + caption_done: "Ukończono" + label_available_data: "Dane dostępne do zaimportowania" + button_start: "Rozpocznij import" + description: "W ten sposób rozpoczniesz import z następującymi ustawieniami." + label_progress: "Import w toku..." + label_import_data: "Aktualnie importowane" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." - label_results: "Imported" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: "The imported data is currently in review mode. Click \"Finalize import\" to make the import permanent or \"Revert import\" to undo all changes made in this import run." - label_finalizing_progress: "Finalizing import..." - label_finalized: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + title: "Wyniki importu" + caption: "Sprawdź uruchomiony import lub cofnij import" + info: "Import powiódł się." + label_results: "Zaimportowano" + label_revert: "Cofnij import" + button_revert: "Cofnij import" + button_done: "Sfinalizuj import" + preview_description: "Zaimportowane dane są obecnie w trybie przeglądu. Kliknij przycisk „Sfinalizuj import”, aby zaimportować dane na stałe lub „Cofnij import”, aby cofnąć wszystkie zmiany wprowadzone wskutek importu." + label_finalizing_progress: "Finalizowanie importu..." + label_finalized: "Sfinalizowano import." + label_revert_progress: "Cofanie importu..." + label_reverted: "Cofnięto import." select_dialog: - filter_projects: "Filter by text" + filter_projects: "Filtruj według tekstu" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." - confirm: "I understand that this reversion will delete data permanently" + title: "Na stałe cofnąć ten import?" + description: "Spowoduje to usunięcie wszystkich zaimportowanych obiektów (w tym całych projektów), nawet jeśli po zaimportowaniu w OpenProject wystąpiła aktywność użytkownika w tych projektach." + confirm: "Rozumiem, że to cofnięcie poskutkuje trwałym usunięciem danych" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + title: "Sfinalizować ten import?" + description: "Po sfinalizowaniu importu nie można go już cofnąć. Wszystkie zaimportowane dane zostaną zaimportowane na stałe." + confirm: "Rozumiem, że tego działania nie będzie można cofnąć" + confirm_button: "Rozumiem" select_projects: - title: "Select projects" + title: "Wybierz projekty" 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." resources_heading: "Zasoby" - resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_description: "OpenProject implementuje następujące zasoby. Każdy z nich może zostać włączony, przemianowany i opisany zgodnie z Twoim życzeniem. Aby uzyskać więcej informacji, zapoznaj się z [dokumentacją zasobów MCP](docs_url)." resources_submit: "Zaktualizuj zasoby" tools_heading: "Narzędzia" tools_description: "OpenProject implementuje następujące narzędzia. Każde z nich może zostać włączone, przemianowane i opisane zgodnie z Twoim życzeniem. Aby uzyskać więcej informacji, zapoznaj się z [dokumentacją narzędzi MCP](docs_url)." @@ -308,17 +308,17 @@ pl: success: "Konfiguracje MCP zostały zaktualizowane." server_form: description_caption: "Sposób, w jaki serwer MCP będzie opisywany innym aplikacjom, które się z nim łączą." - title_caption: "A short title shown to applications that connect to the MCP server." - tool_response_format: "Tool response format" - tool_response_format_content_only_label: "Content only" + title_caption: "Krótki tytuł wyświetlany aplikacjom łączącym się z serwerem MCP." + tool_response_format: "Format odpowiedzi narzędzia" + tool_response_format_content_only_label: "Tylko treść" tool_response_format_content_only_caption: > - Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. - tool_response_format_full_label: "Full" + Wybierz tę opcję, jeśli klienci MCP łączący się z tym wystąpieniem nie obsługują zawartości strukturalnej. Odpowiedzi narzędzia będą zawierać tylko zwykłą treść tekstową i pomijać wersję ustrukturyzowaną. + tool_response_format_full_label: "Pełny" tool_response_format_full_caption: > - The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance. - tool_response_format_structured_only_label: "Structured content only" + Najbardziej kompatybilna opcja. Odpowiedzi narzędzia będą zawierać zarówno zwykłą, jak i ustrukturyzowaną treść, umożliwiając klientom MCP wybór formatu, który chcą odczytać. Może to zwiększyć liczbę tokenów, które model językowy musi przetworzyć, co może zwiększać koszty i zmniejszać wydajność. + tool_response_format_structured_only_label: "Tylko ustrukturyzowana treść" tool_response_format_structured_only_caption: > - Choose this if you are certain that MCP clients connecting to this instance support structured content. Tool responses will only include structured content and leave out its text representation. + Wybierz tę opcję, jeśli masz pewność, że klienci MCP łączący się z tym wystąpieniem obsługują treść strukturalną. Odpowiedzi narzędzia będą zawierać tylko treść ustrukturyzowaną i pomijać jej reprezentację tekstową. update: failure: "Nie można zaktualizować konfiguracji MCP." success: "Konfiguracja MCP została zaktualizowana." @@ -554,7 +554,7 @@ pl: contained_in_type: "Zawartość" confirm_destroy_option: "Usunięcie tej opcji spowoduje usunięcie wszystkich powiązanych wystąpień (np. w Work Package). Czy na pewno chcesz to usunąć?" reorder_alphabetical: "Ustaw kolejność wartości alfabetycznie" - reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?" + reorder_confirmation: "Ostrzeżenie: bieżąca kolejność dostępnych wartości oraz wszystkie niezapisane wartości zostaną utracone. Czy na pewno chcesz kontynuować?" placeholder_version_select: "W pierwszej kolejności wymagany jest wybór pakietu roboczego lub projektu" calculated_field_not_editable: "Atrybut nieedytowalny. Ta wartość jest obliczana automatycznie." no_role_assigment: "Brak przypisanie roli" @@ -582,13 +582,13 @@ pl: formula: project: "Dodaj wartości liczbowe lub wpisz „/”, aby wyszukać atrybut lub operator matematyczny." regexp: - all: "eg. ^[A-Z0-9]+$" - project: "eg. ^[A-Z0-9]+$" + all: "np. ^[A-Z0-9]+$" + project: "np. ^[A-Z0-9]+$" min_max: - all: "0 means no restriction" - project: "0 means no restriction" + all: "0 oznacza brak ograniczeń" + project: "0 oznacza brak ograniczeń" has_comment: - project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." + project: "Umożliwia użytkownikowi dodanie komentarza związanego z atrybutem projektu podczas wybierania wartości w przeglądzie projektu." tab: no_results_title_text: Nie ma jeszcze żadnych pól użytkownika. no_results_content_text: Utwórz pole użytkownika @@ -1386,7 +1386,7 @@ pl: activerecord: attributes: jira_import: - projects: "Projects" + projects: "Projekty" announcements: show_until: "Wyświetlaj do" attachment: @@ -1432,7 +1432,7 @@ pl: regexp: "Wyrażenie regularne" searchable: "Wyszukiwalne" admin_only: "Tylko dla administratorów" - has_comment: "Add a comment text field" + has_comment: "Dodaj pole tekstowe komentarza" custom_value: value: "Wartość" design_color: @@ -1761,7 +1761,7 @@ pl: not_available: "jest niedostępne z powodu konfiguracji systemu." not_deletable: "— nie można usunąć." not_current_user: "nie jest bieżącym użytkownikiem." - only_one_active_sprint_allowed: "only one active sprint is allowed per project." + only_one_active_sprint_allowed: "dozwolony jest tylko jeden aktywny sprint na projekt." not_found: "nie znaleziono." not_a_date: "nie jest poprawną datą." not_a_datetime: "nie jest poprawną datą i czasem." @@ -1871,7 +1871,7 @@ pl: meeting: error_conflict: "Nie można zapisać, ponieważ w tym czasie spotkanie zostało zaktualizowane przez inną osobę. Odśwież stronę." message: - cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." + cannot_move_message_to_forum_of_different_project: "Wiadomości nie można przenieść na forum innego projektu." notifications: at_least_one_channel: "Należy określić co najmniej jeden kanał dla wysyłania powiadomień." attributes: @@ -2130,7 +2130,7 @@ pl: in_use: "Ta nazwa tokena jest już używana, wybierz inną" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "Podaj prawidłowy protokół (http lub https)" template: body: "Sprawdź następujące pola:" header: @@ -2155,7 +2155,7 @@ pl: comment: "Komentarz" custom_action: "Działanie niestandardowe" custom_field: "Pola niestandardowe" - customized: "Customized" + customized: "Dostosowane" "doorkeeper/application": "Aplikacje OAuth" enterprise_token: one: "Token Enterprise" @@ -3207,7 +3207,7 @@ pl: caused_changes: dates_changed: "Daty zostały zmienione" default_attribute_written: "Zapisano atrybuty tylko do odczytu" - import: "Imported" + import: "Zaimportowano" progress_mode_changed_to_status_based: "Zaktualizowano obliczenie postępu" status_changed: "Status „%{status_name}”" system_update: "Aktualizacja systemu OpenProjekt:" @@ -3216,14 +3216,14 @@ pl: total_percent_complete_mode_changed_to_simple_average: "Obliczanie % Ukończenia opiera się teraz na średniej arytmetycznej % Ukończenia." cause_descriptions: import: - header: "changes by %{author}" - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" + header: "zmiany wprowadzone przez %{author}" + field_changed: "W polu %{field} wartość %{old_value} zmieniła się na %{new_value}" + field_set: "W polu %{field} ustawiono wartość %{value}" + field_removed: "Usunięto pole %{field}" field_updated: "%{field} updated" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" - set_with_diff: "%{field} set (%{link})" + deleted_with_diff: "Usunięto pole %{field} (%{link})" + changed_with_diff: "Zmieniono pole %{field} (%{link})" + set_with_diff: "Ustawiono pole %{field} (%{link})" work_package_predecessor_changed_times: przez zmiany poprzednika %{link} work_package_parent_changed_times: przez zmiany elementu nadrzędnego %{link} work_package_children_changed_times: przez zmiany elementu podrzędnego %{link} @@ -3310,7 +3310,7 @@ pl: active_tokens: "Aktywne tokeny" blank_description: "Nie masz skonfigurowanego i aktywnego dostępu do aplikacji innych firm." blank_title: "Brak tokenu aplikacji OAuth" - last_refreshed_at: "Last refreshed at" + last_refreshed_at: "Ostatnio odświeżono" title: "OAuth" table_title: "Tokeny aplikacji OAuth" text_hint: "Tokeny aplikacji OAuth pozwalają aplikacjom innych firm na łączenie się z tym wystąpieniem OpenProject." @@ -3550,7 +3550,7 @@ pl: label_duplicates: "Duplikaty" label_edit: "Edytuj" label_edit_x: "Edytuj: %{x}" - label_view_x: "View: %{x}" + label_view_x: "Wyświetl: %{x}" label_enable_multi_select: "Włącz wybór wielokrotny" label_enabled_project_custom_fields: "Aktywne pola niestandardowe" label_enabled_project_modules: "Aktywne moduły" @@ -3655,7 +3655,7 @@ pl: label_external_links: "Linki zewnętrzne" label_locale: "Język i region" label_jump_to_a_project: "Skok do projektu..." - label_jira_import: "Jira Import" + label_jira_import: "Import Jira" label_keyword_plural: "Słowa kluczowe" label_language_based: "Na podstawie języka użytkownika" label_last_activity: "Ostatnia aktywność" @@ -3678,7 +3678,7 @@ pl: label_lock_user: "Zablokuj użytkownika" label_logged_as: "Zalogowany jako" label_login: "Logowanie" - label_custom_comment: "%{name} comment" + label_custom_comment: "Komentarz %{name}" label_custom_logo: "Komputer z logotypem niestandardowym" label_custom_logo_mobile: "Telefon komórkowy z logotypem niestandardowym" label_custom_export_logo: "Logotyp eksportu niestandardowego" @@ -4307,7 +4307,7 @@ pl: notice_successful_delete: "Usuwanie zakończone sukcesem." notice_successful_cancel: "Anulowanie powiodło się." notice_successful_update: "Aktualizacja zakończona sukcesem." - notice_successful_move: "Successful move from %{from} to %{to}." + notice_successful_move: "Udane przeniesienie z %{from} do %{to}." notice_unsuccessful_create: "Utworzenie nie powiodło się." notice_unsuccessful_create_with_reason: "Utworzenie nie powiodło się: %{reason}" notice_unsuccessful_update: "Aktualizacja nie powiodła się." @@ -4471,7 +4471,7 @@ pl: permission_edit_project_query: "Edytuj zapytanie dotyczące projektu" placeholders: default: "-" - templated_hint: Automatically generated through type %{type} + templated_hint: Automatycznie wygenerowany przez typ %{type} portfolio: count: zero: "0 portfoliów" @@ -4654,9 +4654,9 @@ pl: setting_capture_external_links: "Przechwyć linki zewnętrzne" setting_capture_external_links_text: > Po włączeniu tej funkcji wszystkie linki zewnętrzne w tekście formatowanym będą przekierowywać na stronę z ostrzeżeniem przed opuszczeniem aplikacji. Pomaga to chronić użytkowników przed potencjalnie złośliwymi zewnętrznymi witrynami internetowymi. - setting_capture_external_links_require_login: "Require users to be logged in" + setting_capture_external_links_require_login: "Wymagaj zalogowania użytkowników" setting_capture_external_links_require_login_text: > - When enabled, users wanting to click on external links need to be logged in before being able to continue. + Po włączeniu tej opcji użytkownicy, którzy chcą kliknąć linki zewnętrzne, muszą się zalogować, aby móc kontynuować. setting_after_first_login_redirect_url: "Przekierowanie pierwszego logowania" setting_after_first_login_redirect_url_text_html: > Ustaw ścieżkę przekierowania użytkowników po ich pierwszym zalogowaniu. Jeśli jest pusta, przekierowuje do strony głównej wycieczki wdrożeniowej.
Przykład: /my/page @@ -4701,9 +4701,9 @@ pl: setting_smtp_password: "Hasło SMTP" setting_smtp_domain: "Domena SMTP HELLO" setting_activity_days_default: "Dni wyświetlane w aktywności projektu" - setting_api_tokens_enabled: "Enable API tokens" + setting_api_tokens_enabled: "Włącz tokeny interfejsu API" setting_api_tokens_enabled_caption: > - Decide whether users can create personal API tokens in their account settings. These tokens can be used to access the different APIs of OpenProject, such as APIv3 and MCP. + Zdecyduj, czy użytkownicy mogą tworzyć osobiste tokeny API w ustawieniach konta. Te tokeny mogą być używane do uzyskania dostępu do różnych interfejsów API usługi OpenProject, takich jak APIv3 i MCP. setting_app_subtitle: "Podtytuł" setting_app_title: "Tytuł" setting_attachment_max_size: "Maks. rozmiar załącznika" @@ -5244,7 +5244,7 @@ pl: reset_failed_logins: "Resetuj nieudane logowania" status_user_and_brute_force: "%{user} i %{brute_force}" status_change: "Zmiana statusu" - text_change_disabled_for_provider_login: "The name and email is set by your login provider and can thus not be changed." + text_change_disabled_for_provider_login: "Nazwa i adres e-mail są ustawiane przez dostawcę usług logowania i dlatego nie można ich zmienić." unlock: "Odblokuj" unlock_and_reset_failed_logins: "Odblokuj i resetuj nieudane logowania" error_cannot_delete_user: "User cannot be deleted" diff --git a/modules/backlogs/config/locales/crowdin/js-pl.yml b/modules/backlogs/config/locales/crowdin/js-pl.yml index 9f12530da91..310d4a98084 100644 --- a/modules/backlogs/config/locales/crowdin/js-pl.yml +++ b/modules/backlogs/config/locales/crowdin/js-pl.yml @@ -25,5 +25,5 @@ pl: properties: storyPoints: "Historia Punktów" burndown: - day: "Day" - points: "Points" + day: "Dzień" + points: "Punkty" diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index 5170eab8967..ef9117bb9ce 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -26,13 +26,13 @@ pl: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" + duration: "Czas trwania" + finish_date: "Data zakończenia" + goal: "Cel sprintu" + name: "Nazwa sprintu" sharing: "Sharing" sprint: - duration: "Sprint duration" + duration: "Czas trwania sprintu" work_package: position: "Pozycja" story_points: "Historia Punktów" @@ -54,7 +54,7 @@ pl: task_type: "Typ zadania" backlogs: any: "którekolwiek" - column_width: "Column width" + column_width: "Szerokość kolumny" definition_of_done: "Definicja Zrobione" impediment: "Przeszkoda" label_versions_default_fold_state: "Pokaż zwinięte wersje" @@ -62,10 +62,10 @@ pl: work_package_is_closed: "Zestaw Zadań będzie gotowy, kiedy" label_is_done_status: "Status %{status_name} oznacza zrobiony" points_label: - one: "point" - few: "points" - many: "points" - other: "points" + one: "punkt" + few: "punkty" + many: "punktów" + other: "punktu" positions_could_not_be_rebuilt: "Pozycje nie mogą zostać przebudowane." positions_rebuilt_successfully: "Pozycje zostały przebudowane pomyślnie." rebuild: "Przebuduj" @@ -74,10 +74,10 @@ pl: show_burndown_chart: "Burndown Chart" story: "Story" story_points: - one: "%{count} story point" - few: "%{count} story points" - many: "%{count} story points" - other: "%{count} story points" + one: "%{count} punkt historii" + few: "%{count} punkty historii" + many: "%{count} punktów historii" + other: "%{count} punktu historii" task: "Zadanie" task_color: "Kolor zadania" unassigned: "Nieprzypisane" @@ -85,28 +85,28 @@ pl: header_backlogs: "Moduł backlogów" button_update_backlogs: "Zaktualizuj moduł backlogów" backlog_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "Element %{name} jest pusty" + blankslate_description: "Nie zaplanowano jeszcze żadnych punktów. Przeciągnij punkty tutaj, aby je dodać." backlog_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Zwiń/rozwiń %{name}" label_story_count: - zero: "No stories in backlog" - one: "%{count} story in backlog" - other: "%{count} stories in backlog" + zero: "Brak historii w backlogu" + one: "%{count} historia w backlogu" + other: "Liczba historii w backlogu: %{count}" backlog_menu_component: - label_actions: "Backlog actions" + label_actions: "Działania backlogu" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Edytuj sprint" + new_story: "Nowa historia" + stories_tasks: "Historie/zadania" + task_board: "Panel zadań" + burndown_chart: "Wykres spalania (burndown)" wiki: "Wiki" - properties: "Properties" + properties: "Właściwości" story_component: - label_drag_story: "Move %{name}" + label_drag_story: "Przenieś %{name}" story_menu_component: - label_actions: "Story actions" + label_actions: "Działania historii" backlogs_points_burn_direction: "Punkty burn up/down" backlogs_product_backlog: "Backlog produktu" backlogs_story: "Story" @@ -114,14 +114,14 @@ pl: backlogs_task: "Zadanie" backlogs_task_type: "Typ zadania" backlogs_wiki_template: "Szablon dla strony wiki sprintu" - backlogs_empty_title: "No versions are defined yet" - backlogs_empty_action_text: "To start using backlogs, please create a version first" - backlogs_not_configured_title: "Backlogs not configured" - backlogs_not_configured_description: "Story and task types need to be set before using this module." - backlogs_not_configured_action_text: "Configure Backlogs" + backlogs_empty_title: "Nie zdefiniowano jeszcze żadnych wersji" + backlogs_empty_action_text: "Aby rozpocząć korzystanie z backlogów, najpierw utwórz wersję" + backlogs_not_configured_title: "Nie skonfigurowano backologów" + backlogs_not_configured_description: "Typy historii i zadań muszą zostać ustawione przed użyciem tego modułu." + backlogs_not_configured_action_text: "Skonfiguruj backlogi" burndown: - story_points: "Story points" - story_points_ideal: "Story points (ideal)" + story_points: "Punkty historii" + story_points_ideal: "Punkty historii (idealne)" errors: attributes: task_type: @@ -133,18 +133,18 @@ pl: label_points_burn_down: "W dół" label_points_burn_up: "W górę" label_sprint_impediments: "Przeszkody sprintu" - label_sprint_new: "New sprint" + label_sprint_new: "Nowy sprint" label_task_board: "Panel zadań" - permission_view_sprints: "View sprints" - permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" - permission_manage_sprint_items: "Manage sprint items" - permission_share_sprint: "Share sprint" + permission_view_sprints: "Wyświetl sprinty" + permission_create_sprints: "Utwórz sprinty" + permission_start_complete_sprint: "Rozpocznij/ukończ sprint" + permission_manage_sprint_items: "Zarządzaj elementami sprintu" + permission_share_sprint: "Udostępnij sprint" project_module_backlogs: "Backlogi" rb_burndown_charts: show: - blankslate_title: "No burndown data available" - blankslate_description: "Set start and end date for the sprint to generate a burndown chart." + blankslate_title: "Brak dostępnych danych spalania" + blankslate_description: "Ustaw datę rozpoczęcia i zakończenia sprintu, aby wygenerować wykres spalania." remaining_hours: "pozostała praca" version_settings_display_label: "Kolumna w backlogu" version_settings_display_option_left: "w lewo" diff --git a/modules/budgets/config/locales/crowdin/af.yml b/modules/budgets/config/locales/crowdin/af.yml index 6723af91a04..8c061519233 100644 --- a/modules/budgets/config/locales/crowdin/af.yml +++ b/modules/budgets/config/locales/crowdin/af.yml @@ -75,6 +75,9 @@ af: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/ar.yml b/modules/budgets/config/locales/crowdin/ar.yml index 9f77d4e82d1..a2a7f6e4a84 100644 --- a/modules/budgets/config/locales/crowdin/ar.yml +++ b/modules/budgets/config/locales/crowdin/ar.yml @@ -75,6 +75,9 @@ ar: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/az.yml b/modules/budgets/config/locales/crowdin/az.yml index 300c31355c4..b060183f1ee 100644 --- a/modules/budgets/config/locales/crowdin/az.yml +++ b/modules/budgets/config/locales/crowdin/az.yml @@ -75,6 +75,9 @@ az: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/be.yml b/modules/budgets/config/locales/crowdin/be.yml index 12ea531a51c..095f6efddb9 100644 --- a/modules/budgets/config/locales/crowdin/be.yml +++ b/modules/budgets/config/locales/crowdin/be.yml @@ -75,6 +75,9 @@ be: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/bg.yml b/modules/budgets/config/locales/crowdin/bg.yml index 855156f1fa7..b1dd240004e 100644 --- a/modules/budgets/config/locales/crowdin/bg.yml +++ b/modules/budgets/config/locales/crowdin/bg.yml @@ -75,6 +75,9 @@ bg: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/ca.yml b/modules/budgets/config/locales/crowdin/ca.yml index db054d046e2..317deaa9fef 100644 --- a/modules/budgets/config/locales/crowdin/ca.yml +++ b/modules/budgets/config/locales/crowdin/ca.yml @@ -75,6 +75,9 @@ ca: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/ckb-IR.yml b/modules/budgets/config/locales/crowdin/ckb-IR.yml index 5c8de8c2195..6f7a791f0fb 100644 --- a/modules/budgets/config/locales/crowdin/ckb-IR.yml +++ b/modules/budgets/config/locales/crowdin/ckb-IR.yml @@ -75,6 +75,9 @@ ckb-IR: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/cs.yml b/modules/budgets/config/locales/crowdin/cs.yml index 2ca95723ba2..5e0f7950e53 100644 --- a/modules/budgets/config/locales/crowdin/cs.yml +++ b/modules/budgets/config/locales/crowdin/cs.yml @@ -75,6 +75,9 @@ cs: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/da.yml b/modules/budgets/config/locales/crowdin/da.yml index 948597651c1..2305b5058e7 100644 --- a/modules/budgets/config/locales/crowdin/da.yml +++ b/modules/budgets/config/locales/crowdin/da.yml @@ -75,6 +75,9 @@ da: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/de.yml b/modules/budgets/config/locales/crowdin/de.yml index 94defae9e90..c9714a0541d 100644 --- a/modules/budgets/config/locales/crowdin/de.yml +++ b/modules/budgets/config/locales/crowdin/de.yml @@ -75,6 +75,9 @@ de: blankslate: heading: "Projektcontrolling starten" description: "Erhalten Sie einen Überblick über Ihre Budgets und Kosten, um den Status Ihres Projekts effizient zu verfolgen" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "Keine Budgetdaten." one: "Daten aus %{count} Budget, welches in folgenden Arbeitsbereichen enthalten ist: %{portfolios}, %{subprograms} und %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/el.yml b/modules/budgets/config/locales/crowdin/el.yml index 8d846e6bce1..4d86abc4d39 100644 --- a/modules/budgets/config/locales/crowdin/el.yml +++ b/modules/budgets/config/locales/crowdin/el.yml @@ -75,6 +75,9 @@ el: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/eo.yml b/modules/budgets/config/locales/crowdin/eo.yml index 087bbfb8237..b6559ce435c 100644 --- a/modules/budgets/config/locales/crowdin/eo.yml +++ b/modules/budgets/config/locales/crowdin/eo.yml @@ -75,6 +75,9 @@ eo: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/es.yml b/modules/budgets/config/locales/crowdin/es.yml index 5c2ddace965..0db407e1035 100644 --- a/modules/budgets/config/locales/crowdin/es.yml +++ b/modules/budgets/config/locales/crowdin/es.yml @@ -75,6 +75,9 @@ es: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/et.yml b/modules/budgets/config/locales/crowdin/et.yml index b1bf85d656a..288079ad783 100644 --- a/modules/budgets/config/locales/crowdin/et.yml +++ b/modules/budgets/config/locales/crowdin/et.yml @@ -75,6 +75,9 @@ et: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/eu.yml b/modules/budgets/config/locales/crowdin/eu.yml index d5b9be92818..02942a40c60 100644 --- a/modules/budgets/config/locales/crowdin/eu.yml +++ b/modules/budgets/config/locales/crowdin/eu.yml @@ -75,6 +75,9 @@ eu: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/fa.yml b/modules/budgets/config/locales/crowdin/fa.yml index dc7018af28e..b291d67ad6b 100644 --- a/modules/budgets/config/locales/crowdin/fa.yml +++ b/modules/budgets/config/locales/crowdin/fa.yml @@ -75,6 +75,9 @@ fa: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/fi.yml b/modules/budgets/config/locales/crowdin/fi.yml index b1d75fcdd9a..73aa9e61483 100644 --- a/modules/budgets/config/locales/crowdin/fi.yml +++ b/modules/budgets/config/locales/crowdin/fi.yml @@ -75,6 +75,9 @@ fi: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/fil.yml b/modules/budgets/config/locales/crowdin/fil.yml index 24e64e5ea6b..b4bee8ba6a7 100644 --- a/modules/budgets/config/locales/crowdin/fil.yml +++ b/modules/budgets/config/locales/crowdin/fil.yml @@ -75,6 +75,9 @@ fil: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/fr.yml b/modules/budgets/config/locales/crowdin/fr.yml index 3830c04a659..c45d80f0e46 100644 --- a/modules/budgets/config/locales/crowdin/fr.yml +++ b/modules/budgets/config/locales/crowdin/fr.yml @@ -75,6 +75,9 @@ fr: blankslate: heading: "Démarrer le contrôle du projet" description: "Obtenez une vue d'ensemble de vos budgets et de vos coûts pour suivre efficacement l'état de santé de votre projet" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "Pas de données budgétaires." one: "Données agrégées à partir de %{count} budget inclus dans %{portfolios}, %{subprograms} et %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/he.yml b/modules/budgets/config/locales/crowdin/he.yml index ba9015d9b0b..45f52a4dc00 100644 --- a/modules/budgets/config/locales/crowdin/he.yml +++ b/modules/budgets/config/locales/crowdin/he.yml @@ -75,6 +75,9 @@ he: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/hi.yml b/modules/budgets/config/locales/crowdin/hi.yml index d2713b9fae3..543fa10f54f 100644 --- a/modules/budgets/config/locales/crowdin/hi.yml +++ b/modules/budgets/config/locales/crowdin/hi.yml @@ -75,6 +75,9 @@ hi: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/hr.yml b/modules/budgets/config/locales/crowdin/hr.yml index ed8f161eda7..3332756f402 100644 --- a/modules/budgets/config/locales/crowdin/hr.yml +++ b/modules/budgets/config/locales/crowdin/hr.yml @@ -75,6 +75,9 @@ hr: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/hu.yml b/modules/budgets/config/locales/crowdin/hu.yml index e68c89b8516..2661e8c271f 100644 --- a/modules/budgets/config/locales/crowdin/hu.yml +++ b/modules/budgets/config/locales/crowdin/hu.yml @@ -75,6 +75,9 @@ hu: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/id.yml b/modules/budgets/config/locales/crowdin/id.yml index e6b93a22a9e..0ebfd1d4981 100644 --- a/modules/budgets/config/locales/crowdin/id.yml +++ b/modules/budgets/config/locales/crowdin/id.yml @@ -75,6 +75,9 @@ id: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/it.yml b/modules/budgets/config/locales/crowdin/it.yml index 8419df440b6..ade3aa6885d 100644 --- a/modules/budgets/config/locales/crowdin/it.yml +++ b/modules/budgets/config/locales/crowdin/it.yml @@ -75,6 +75,9 @@ it: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/ja.yml b/modules/budgets/config/locales/crowdin/ja.yml index 0304d239bf2..f4a64aa18b4 100644 --- a/modules/budgets/config/locales/crowdin/ja.yml +++ b/modules/budgets/config/locales/crowdin/ja.yml @@ -75,6 +75,9 @@ ja: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/js-af.yml b/modules/budgets/config/locales/crowdin/js-af.yml index 69f000a07e0..24686a89e24 100644 --- a/modules/budgets/config/locales/crowdin/js-af.yml +++ b/modules/budgets/config/locales/crowdin/js-af.yml @@ -21,12 +21,6 @@ #++ af: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-ar.yml b/modules/budgets/config/locales/crowdin/js-ar.yml index 424328f5668..b7408935ce4 100644 --- a/modules/budgets/config/locales/crowdin/js-ar.yml +++ b/modules/budgets/config/locales/crowdin/js-ar.yml @@ -21,12 +21,6 @@ #++ ar: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "الميزانية" diff --git a/modules/budgets/config/locales/crowdin/js-az.yml b/modules/budgets/config/locales/crowdin/js-az.yml index 27bb7bee14b..bfb1c5a391b 100644 --- a/modules/budgets/config/locales/crowdin/js-az.yml +++ b/modules/budgets/config/locales/crowdin/js-az.yml @@ -21,12 +21,6 @@ #++ az: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-be.yml b/modules/budgets/config/locales/crowdin/js-be.yml index 065122914c7..e0e000eac93 100644 --- a/modules/budgets/config/locales/crowdin/js-be.yml +++ b/modules/budgets/config/locales/crowdin/js-be.yml @@ -21,12 +21,6 @@ #++ be: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-bg.yml b/modules/budgets/config/locales/crowdin/js-bg.yml index bf1349480b7..0a9fc0fb665 100644 --- a/modules/budgets/config/locales/crowdin/js-bg.yml +++ b/modules/budgets/config/locales/crowdin/js-bg.yml @@ -21,12 +21,6 @@ #++ bg: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Бюджет" diff --git a/modules/budgets/config/locales/crowdin/js-ca.yml b/modules/budgets/config/locales/crowdin/js-ca.yml index 755ecd07d5c..0ecf3dd9ec5 100644 --- a/modules/budgets/config/locales/crowdin/js-ca.yml +++ b/modules/budgets/config/locales/crowdin/js-ca.yml @@ -21,12 +21,6 @@ #++ ca: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Pressupost" diff --git a/modules/budgets/config/locales/crowdin/js-ckb-IR.yml b/modules/budgets/config/locales/crowdin/js-ckb-IR.yml index a5ad12703bc..7a98628341c 100644 --- a/modules/budgets/config/locales/crowdin/js-ckb-IR.yml +++ b/modules/budgets/config/locales/crowdin/js-ckb-IR.yml @@ -21,12 +21,6 @@ #++ ckb-IR: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-cs.yml b/modules/budgets/config/locales/crowdin/js-cs.yml index 0ffdaed5667..a5d4aa31d7a 100644 --- a/modules/budgets/config/locales/crowdin/js-cs.yml +++ b/modules/budgets/config/locales/crowdin/js-cs.yml @@ -21,12 +21,6 @@ #++ cs: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Rozpočet" diff --git a/modules/budgets/config/locales/crowdin/js-da.yml b/modules/budgets/config/locales/crowdin/js-da.yml index effc7a263e6..5982027bddf 100644 --- a/modules/budgets/config/locales/crowdin/js-da.yml +++ b/modules/budgets/config/locales/crowdin/js-da.yml @@ -21,12 +21,6 @@ #++ da: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-de.yml b/modules/budgets/config/locales/crowdin/js-de.yml index 2bf1182d5c3..3ecf0a0a986 100644 --- a/modules/budgets/config/locales/crowdin/js-de.yml +++ b/modules/budgets/config/locales/crowdin/js-de.yml @@ -21,12 +21,6 @@ #++ de: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "Keine Budgetdaten" - description: "Fügen Sie diesem Projekt die geplanten Material- und Arbeitskosten hinzu, um mit der Überwachung des Budgets zu beginnen" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-el.yml b/modules/budgets/config/locales/crowdin/js-el.yml index dd5d31ca29e..1e5eb01e6c7 100644 --- a/modules/budgets/config/locales/crowdin/js-el.yml +++ b/modules/budgets/config/locales/crowdin/js-el.yml @@ -21,12 +21,6 @@ #++ el: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Προϋπολογισμός" diff --git a/modules/budgets/config/locales/crowdin/js-eo.yml b/modules/budgets/config/locales/crowdin/js-eo.yml index e818b59d427..380387b6f7f 100644 --- a/modules/budgets/config/locales/crowdin/js-eo.yml +++ b/modules/budgets/config/locales/crowdin/js-eo.yml @@ -21,12 +21,6 @@ #++ eo: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budĝeto" diff --git a/modules/budgets/config/locales/crowdin/js-es.yml b/modules/budgets/config/locales/crowdin/js-es.yml index 6b2566a638f..53afab21649 100644 --- a/modules/budgets/config/locales/crowdin/js-es.yml +++ b/modules/budgets/config/locales/crowdin/js-es.yml @@ -21,12 +21,6 @@ #++ es: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Presupuesto" diff --git a/modules/budgets/config/locales/crowdin/js-et.yml b/modules/budgets/config/locales/crowdin/js-et.yml index 1cc611cf693..4611f3cbdf2 100644 --- a/modules/budgets/config/locales/crowdin/js-et.yml +++ b/modules/budgets/config/locales/crowdin/js-et.yml @@ -21,12 +21,6 @@ #++ et: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Eelarve" diff --git a/modules/budgets/config/locales/crowdin/js-eu.yml b/modules/budgets/config/locales/crowdin/js-eu.yml index 14a883e701b..bc8e3c4629d 100644 --- a/modules/budgets/config/locales/crowdin/js-eu.yml +++ b/modules/budgets/config/locales/crowdin/js-eu.yml @@ -21,12 +21,6 @@ #++ eu: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-fa.yml b/modules/budgets/config/locales/crowdin/js-fa.yml index e906b9558bc..dafe5fe8fa9 100644 --- a/modules/budgets/config/locales/crowdin/js-fa.yml +++ b/modules/budgets/config/locales/crowdin/js-fa.yml @@ -21,12 +21,6 @@ #++ fa: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "بودجه" diff --git a/modules/budgets/config/locales/crowdin/js-fi.yml b/modules/budgets/config/locales/crowdin/js-fi.yml index 77a02798b61..b25cec7ea1d 100644 --- a/modules/budgets/config/locales/crowdin/js-fi.yml +++ b/modules/budgets/config/locales/crowdin/js-fi.yml @@ -21,12 +21,6 @@ #++ fi: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budjetti" diff --git a/modules/budgets/config/locales/crowdin/js-fil.yml b/modules/budgets/config/locales/crowdin/js-fil.yml index 6831878ffa5..299ce35ac06 100644 --- a/modules/budgets/config/locales/crowdin/js-fil.yml +++ b/modules/budgets/config/locales/crowdin/js-fil.yml @@ -21,12 +21,6 @@ #++ fil: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-fr.yml b/modules/budgets/config/locales/crowdin/js-fr.yml index 47c2cf93460..1adf25760ef 100644 --- a/modules/budgets/config/locales/crowdin/js-fr.yml +++ b/modules/budgets/config/locales/crowdin/js-fr.yml @@ -21,12 +21,6 @@ #++ fr: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "Pas de données budgétaires" - description: "Ajoutez les coûts unitaires et de main-d'œuvre prévus à ce projet pour commencer à suivre le budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-he.yml b/modules/budgets/config/locales/crowdin/js-he.yml index 8a8fb696b23..2fa76d31049 100644 --- a/modules/budgets/config/locales/crowdin/js-he.yml +++ b/modules/budgets/config/locales/crowdin/js-he.yml @@ -21,12 +21,6 @@ #++ he: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "תקציב" diff --git a/modules/budgets/config/locales/crowdin/js-hi.yml b/modules/budgets/config/locales/crowdin/js-hi.yml index 048fe002012..5811d625e65 100644 --- a/modules/budgets/config/locales/crowdin/js-hi.yml +++ b/modules/budgets/config/locales/crowdin/js-hi.yml @@ -21,12 +21,6 @@ #++ hi: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-hr.yml b/modules/budgets/config/locales/crowdin/js-hr.yml index aa428717252..fd83083245e 100644 --- a/modules/budgets/config/locales/crowdin/js-hr.yml +++ b/modules/budgets/config/locales/crowdin/js-hr.yml @@ -21,12 +21,6 @@ #++ hr: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budžet" diff --git a/modules/budgets/config/locales/crowdin/js-hu.yml b/modules/budgets/config/locales/crowdin/js-hu.yml index 21f5078620e..6678d1444e7 100644 --- a/modules/budgets/config/locales/crowdin/js-hu.yml +++ b/modules/budgets/config/locales/crowdin/js-hu.yml @@ -21,12 +21,6 @@ #++ hu: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Költségvetés" diff --git a/modules/budgets/config/locales/crowdin/js-id.yml b/modules/budgets/config/locales/crowdin/js-id.yml index a15514de2fc..7ecf5121b37 100644 --- a/modules/budgets/config/locales/crowdin/js-id.yml +++ b/modules/budgets/config/locales/crowdin/js-id.yml @@ -21,12 +21,6 @@ #++ id: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Bugdet" diff --git a/modules/budgets/config/locales/crowdin/js-it.yml b/modules/budgets/config/locales/crowdin/js-it.yml index b716be991f8..0fe4a3da5ac 100644 --- a/modules/budgets/config/locales/crowdin/js-it.yml +++ b/modules/budgets/config/locales/crowdin/js-it.yml @@ -21,12 +21,6 @@ #++ it: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Bilancio" diff --git a/modules/budgets/config/locales/crowdin/js-ja.yml b/modules/budgets/config/locales/crowdin/js-ja.yml index b5b066c58e4..11670a20a6f 100644 --- a/modules/budgets/config/locales/crowdin/js-ja.yml +++ b/modules/budgets/config/locales/crowdin/js-ja.yml @@ -21,12 +21,6 @@ #++ ja: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "予算" diff --git a/modules/budgets/config/locales/crowdin/js-ka.yml b/modules/budgets/config/locales/crowdin/js-ka.yml index 34bedbad5f7..1aeb1bb8aee 100644 --- a/modules/budgets/config/locales/crowdin/js-ka.yml +++ b/modules/budgets/config/locales/crowdin/js-ka.yml @@ -21,12 +21,6 @@ #++ ka: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "ბიუჯეტი" diff --git a/modules/budgets/config/locales/crowdin/js-kk.yml b/modules/budgets/config/locales/crowdin/js-kk.yml index 55fb15c2b88..eaa15ea407e 100644 --- a/modules/budgets/config/locales/crowdin/js-kk.yml +++ b/modules/budgets/config/locales/crowdin/js-kk.yml @@ -21,12 +21,6 @@ #++ kk: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-ko.yml b/modules/budgets/config/locales/crowdin/js-ko.yml index ce985e83c16..31a27e28558 100644 --- a/modules/budgets/config/locales/crowdin/js-ko.yml +++ b/modules/budgets/config/locales/crowdin/js-ko.yml @@ -21,12 +21,6 @@ #++ ko: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "예산" diff --git a/modules/budgets/config/locales/crowdin/js-lt.yml b/modules/budgets/config/locales/crowdin/js-lt.yml index 839999cdd8c..e53ace1a7b7 100644 --- a/modules/budgets/config/locales/crowdin/js-lt.yml +++ b/modules/budgets/config/locales/crowdin/js-lt.yml @@ -21,12 +21,6 @@ #++ lt: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Biudžetas" diff --git a/modules/budgets/config/locales/crowdin/js-lv.yml b/modules/budgets/config/locales/crowdin/js-lv.yml index 28158fbde5c..41f434bbc37 100644 --- a/modules/budgets/config/locales/crowdin/js-lv.yml +++ b/modules/budgets/config/locales/crowdin/js-lv.yml @@ -21,12 +21,6 @@ #++ lv: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budžets" diff --git a/modules/budgets/config/locales/crowdin/js-mn.yml b/modules/budgets/config/locales/crowdin/js-mn.yml index 13fe0a677be..eed4b01eb47 100644 --- a/modules/budgets/config/locales/crowdin/js-mn.yml +++ b/modules/budgets/config/locales/crowdin/js-mn.yml @@ -21,12 +21,6 @@ #++ mn: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-ms.yml b/modules/budgets/config/locales/crowdin/js-ms.yml index 8eea852de18..fb24a4cc8c6 100644 --- a/modules/budgets/config/locales/crowdin/js-ms.yml +++ b/modules/budgets/config/locales/crowdin/js-ms.yml @@ -21,12 +21,6 @@ #++ ms: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Anggaran" diff --git a/modules/budgets/config/locales/crowdin/js-ne.yml b/modules/budgets/config/locales/crowdin/js-ne.yml index 3daf2f8ca78..8061399b139 100644 --- a/modules/budgets/config/locales/crowdin/js-ne.yml +++ b/modules/budgets/config/locales/crowdin/js-ne.yml @@ -21,12 +21,6 @@ #++ ne: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-nl.yml b/modules/budgets/config/locales/crowdin/js-nl.yml index df232309a08..10eb7bea7f1 100644 --- a/modules/budgets/config/locales/crowdin/js-nl.yml +++ b/modules/budgets/config/locales/crowdin/js-nl.yml @@ -21,12 +21,6 @@ #++ nl: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Begroting" diff --git a/modules/budgets/config/locales/crowdin/js-no.yml b/modules/budgets/config/locales/crowdin/js-no.yml index b0d7a2967bf..90254550884 100644 --- a/modules/budgets/config/locales/crowdin/js-no.yml +++ b/modules/budgets/config/locales/crowdin/js-no.yml @@ -21,12 +21,6 @@ #++ "no": js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budsjett" diff --git a/modules/budgets/config/locales/crowdin/js-pl.yml b/modules/budgets/config/locales/crowdin/js-pl.yml index e9be5e78bca..52c7544e1aa 100644 --- a/modules/budgets/config/locales/crowdin/js-pl.yml +++ b/modules/budgets/config/locales/crowdin/js-pl.yml @@ -21,12 +21,6 @@ #++ pl: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budżet" diff --git a/modules/budgets/config/locales/crowdin/js-pt-BR.yml b/modules/budgets/config/locales/crowdin/js-pt-BR.yml index 1d105e9e7c8..829fea4936b 100644 --- a/modules/budgets/config/locales/crowdin/js-pt-BR.yml +++ b/modules/budgets/config/locales/crowdin/js-pt-BR.yml @@ -21,12 +21,6 @@ #++ pt-BR: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Orçamento" diff --git a/modules/budgets/config/locales/crowdin/js-pt-PT.yml b/modules/budgets/config/locales/crowdin/js-pt-PT.yml index 849cad6b524..3a1b4154dfa 100644 --- a/modules/budgets/config/locales/crowdin/js-pt-PT.yml +++ b/modules/budgets/config/locales/crowdin/js-pt-PT.yml @@ -21,12 +21,6 @@ #++ pt-PT: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Orçamento" diff --git a/modules/budgets/config/locales/crowdin/js-ro.yml b/modules/budgets/config/locales/crowdin/js-ro.yml index 52b70cd8df3..0f5db335e70 100644 --- a/modules/budgets/config/locales/crowdin/js-ro.yml +++ b/modules/budgets/config/locales/crowdin/js-ro.yml @@ -21,12 +21,6 @@ #++ ro: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Buget" diff --git a/modules/budgets/config/locales/crowdin/js-ru.yml b/modules/budgets/config/locales/crowdin/js-ru.yml index a1194b514f8..bc93eda87cd 100644 --- a/modules/budgets/config/locales/crowdin/js-ru.yml +++ b/modules/budgets/config/locales/crowdin/js-ru.yml @@ -21,12 +21,6 @@ #++ ru: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "Нет данных о бюджете" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Бюджет" diff --git a/modules/budgets/config/locales/crowdin/js-rw.yml b/modules/budgets/config/locales/crowdin/js-rw.yml index 1c2ec149828..9b98dce3e3d 100644 --- a/modules/budgets/config/locales/crowdin/js-rw.yml +++ b/modules/budgets/config/locales/crowdin/js-rw.yml @@ -21,12 +21,6 @@ #++ rw: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-si.yml b/modules/budgets/config/locales/crowdin/js-si.yml index 12fb7c5cf04..01aececa167 100644 --- a/modules/budgets/config/locales/crowdin/js-si.yml +++ b/modules/budgets/config/locales/crowdin/js-si.yml @@ -21,12 +21,6 @@ #++ si: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-sk.yml b/modules/budgets/config/locales/crowdin/js-sk.yml index b48b955d577..af89df7db13 100644 --- a/modules/budgets/config/locales/crowdin/js-sk.yml +++ b/modules/budgets/config/locales/crowdin/js-sk.yml @@ -21,12 +21,6 @@ #++ sk: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Rozpočet" diff --git a/modules/budgets/config/locales/crowdin/js-sl.yml b/modules/budgets/config/locales/crowdin/js-sl.yml index f389c5e8c65..cda30d40f75 100644 --- a/modules/budgets/config/locales/crowdin/js-sl.yml +++ b/modules/budgets/config/locales/crowdin/js-sl.yml @@ -21,12 +21,6 @@ #++ sl: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Proračun" diff --git a/modules/budgets/config/locales/crowdin/js-sr.yml b/modules/budgets/config/locales/crowdin/js-sr.yml index 9bf3ee56e00..5d0912d498a 100644 --- a/modules/budgets/config/locales/crowdin/js-sr.yml +++ b/modules/budgets/config/locales/crowdin/js-sr.yml @@ -21,12 +21,6 @@ #++ sr: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-sv.yml b/modules/budgets/config/locales/crowdin/js-sv.yml index c1dcee45969..f9c45781a0e 100644 --- a/modules/budgets/config/locales/crowdin/js-sv.yml +++ b/modules/budgets/config/locales/crowdin/js-sv.yml @@ -21,12 +21,6 @@ #++ sv: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-th.yml b/modules/budgets/config/locales/crowdin/js-th.yml index 1b84bc0a26e..ffe05a70d00 100644 --- a/modules/budgets/config/locales/crowdin/js-th.yml +++ b/modules/budgets/config/locales/crowdin/js-th.yml @@ -21,12 +21,6 @@ #++ th: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-tr.yml b/modules/budgets/config/locales/crowdin/js-tr.yml index 0e7ee626366..0784b99969e 100644 --- a/modules/budgets/config/locales/crowdin/js-tr.yml +++ b/modules/budgets/config/locales/crowdin/js-tr.yml @@ -21,12 +21,6 @@ #++ tr: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "Bütçe verisi yok" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Bütçe" diff --git a/modules/budgets/config/locales/crowdin/js-uk.yml b/modules/budgets/config/locales/crowdin/js-uk.yml index 42ce4babef2..6d6b85c4c4b 100644 --- a/modules/budgets/config/locales/crowdin/js-uk.yml +++ b/modules/budgets/config/locales/crowdin/js-uk.yml @@ -21,12 +21,6 @@ #++ uk: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Бюджет" diff --git a/modules/budgets/config/locales/crowdin/js-uz.yml b/modules/budgets/config/locales/crowdin/js-uz.yml index 2409daa03c8..10781fecd42 100644 --- a/modules/budgets/config/locales/crowdin/js-uz.yml +++ b/modules/budgets/config/locales/crowdin/js-uz.yml @@ -21,12 +21,6 @@ #++ uz: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Budget" diff --git a/modules/budgets/config/locales/crowdin/js-vi.yml b/modules/budgets/config/locales/crowdin/js-vi.yml index 27592961949..cbc9069ef1a 100644 --- a/modules/budgets/config/locales/crowdin/js-vi.yml +++ b/modules/budgets/config/locales/crowdin/js-vi.yml @@ -21,12 +21,6 @@ #++ vi: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "Ngân sách" diff --git a/modules/budgets/config/locales/crowdin/js-zh-CN.yml b/modules/budgets/config/locales/crowdin/js-zh-CN.yml index ea72cf7ca11..12cd3961915 100644 --- a/modules/budgets/config/locales/crowdin/js-zh-CN.yml +++ b/modules/budgets/config/locales/crowdin/js-zh-CN.yml @@ -21,12 +21,6 @@ #++ zh-CN: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "预算" diff --git a/modules/budgets/config/locales/crowdin/js-zh-TW.yml b/modules/budgets/config/locales/crowdin/js-zh-TW.yml index b2b0e0f8724..bf747d7a203 100644 --- a/modules/budgets/config/locales/crowdin/js-zh-TW.yml +++ b/modules/budgets/config/locales/crowdin/js-zh-TW.yml @@ -21,12 +21,6 @@ #++ zh-TW: js: - budgets: - widgets: - budget_by_cost_type: - blankslate: - title: "No budget data" - description: "Add planned unit and labor costs to this project to start tracking the budget" work_packages: properties: costObject: "預算" diff --git a/modules/budgets/config/locales/crowdin/ka.yml b/modules/budgets/config/locales/crowdin/ka.yml index 4936430f092..776f8f11c89 100644 --- a/modules/budgets/config/locales/crowdin/ka.yml +++ b/modules/budgets/config/locales/crowdin/ka.yml @@ -75,6 +75,9 @@ ka: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/kk.yml b/modules/budgets/config/locales/crowdin/kk.yml index 27861166d48..7109f24853f 100644 --- a/modules/budgets/config/locales/crowdin/kk.yml +++ b/modules/budgets/config/locales/crowdin/kk.yml @@ -75,6 +75,9 @@ kk: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/ko.yml b/modules/budgets/config/locales/crowdin/ko.yml index 5564b773578..19873ba5bcc 100644 --- a/modules/budgets/config/locales/crowdin/ko.yml +++ b/modules/budgets/config/locales/crowdin/ko.yml @@ -75,6 +75,9 @@ ko: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/lt.yml b/modules/budgets/config/locales/crowdin/lt.yml index 184d2bdb31a..33f2b9ff784 100644 --- a/modules/budgets/config/locales/crowdin/lt.yml +++ b/modules/budgets/config/locales/crowdin/lt.yml @@ -75,6 +75,9 @@ lt: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/lv.yml b/modules/budgets/config/locales/crowdin/lv.yml index e73ab0bd316..266e6979ab0 100644 --- a/modules/budgets/config/locales/crowdin/lv.yml +++ b/modules/budgets/config/locales/crowdin/lv.yml @@ -75,6 +75,9 @@ lv: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/mn.yml b/modules/budgets/config/locales/crowdin/mn.yml index f00941b6b90..fc503219afc 100644 --- a/modules/budgets/config/locales/crowdin/mn.yml +++ b/modules/budgets/config/locales/crowdin/mn.yml @@ -75,6 +75,9 @@ mn: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/ms.yml b/modules/budgets/config/locales/crowdin/ms.yml index 80ed78f378c..f16b58aeb1f 100644 --- a/modules/budgets/config/locales/crowdin/ms.yml +++ b/modules/budgets/config/locales/crowdin/ms.yml @@ -75,6 +75,9 @@ ms: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/ne.yml b/modules/budgets/config/locales/crowdin/ne.yml index 919208b94e9..1bc218fce7a 100644 --- a/modules/budgets/config/locales/crowdin/ne.yml +++ b/modules/budgets/config/locales/crowdin/ne.yml @@ -75,6 +75,9 @@ ne: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/nl.yml b/modules/budgets/config/locales/crowdin/nl.yml index fb8e243f63b..5f942c66eb5 100644 --- a/modules/budgets/config/locales/crowdin/nl.yml +++ b/modules/budgets/config/locales/crowdin/nl.yml @@ -75,6 +75,9 @@ nl: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/no.yml b/modules/budgets/config/locales/crowdin/no.yml index 785aa964d08..49b47c3ea00 100644 --- a/modules/budgets/config/locales/crowdin/no.yml +++ b/modules/budgets/config/locales/crowdin/no.yml @@ -75,6 +75,9 @@ blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/pl.yml b/modules/budgets/config/locales/crowdin/pl.yml index ee4d89c13c2..38f13281381 100644 --- a/modules/budgets/config/locales/crowdin/pl.yml +++ b/modules/budgets/config/locales/crowdin/pl.yml @@ -65,38 +65,41 @@ pl: budgets: widgets: budget_totals: - title: "Budget totals" - remaining_budget: "Remaining budget" - spent_budget: "Spent budget" - total_actual_costs: "Total actual costs" - total_planned_budget: "Total planned budget" + title: "Sumy budżetowe" + remaining_budget: "Pozostały budżet" + spent_budget: "Wydany budżet" + total_actual_costs: "Łączne koszty rzeczywiste" + total_planned_budget: "Łączny planowany budżet" budget_by_cost_type: - title: "Budget by cost type" + title: "Budżet według typu kosztów" blankslate: - heading: "Start project controlling" - description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + heading: "Rozpocznij kontrolowanie projektu" + description: "Uzyskaj przegląd swoich budżetów i kosztów, aby skutecznie śledzić stan projektu" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." - other: "Data aggregated from %{count} budgets included in %{portfolios}, %{subprograms} and %{subprojects}." + zero: "Brak danych budżetowych." + one: "Dane zagregowane z %{count} budżetu zawarte w %{portfolios}, %{subprograms} i %{subprojects}." + other: "Dane zagregowane z %{count} budżetów zawarte w %{portfolios}, %{subprograms} i %{subprojects}." caption_simple: - one: "Data aggregated from %{count} budget." - few: "Data aggregated from %{count} budgets." - many: "Data aggregated from %{count} budgets." - other: "Data aggregated from %{count} budgets." + one: "Dane zagregowane z %{count} budżetu." + few: "Dane zagregowane z %{count} budżetów." + many: "Dane zagregowane z %{count} budżetów." + other: "Dane zagregowane z %{count} budżetu." portfolio: - zero: "no portfolios" + zero: "brak portfoliów" one: "1 portfolio" - other: "%{count} portfolios" + other: "Liczba portfoliów: %{count}" subprogram: - zero: "no subprograms" - one: "1 subprogram" - other: "%{count} subprograms" + zero: "brak podprogramów" + one: "1 podprogram" + other: "Liczba podprogramów: %{count}" subproject: - zero: "no subprojects" - one: "1 subproject" - other: "%{count} subprojects" - view_details: "View budget details" + zero: "brak podprojektów" + one: "1 podprojekt" + other: "Liczba podprojektów: %{count}" + view_details: "Wyświetl szczegóły budżetu" events: budget: "Budżet edytowany" help_click_to_edit: "Kliknij tutaj aby edytować." diff --git a/modules/budgets/config/locales/crowdin/pt-BR.yml b/modules/budgets/config/locales/crowdin/pt-BR.yml index e8866b47bca..686c179b9c7 100644 --- a/modules/budgets/config/locales/crowdin/pt-BR.yml +++ b/modules/budgets/config/locales/crowdin/pt-BR.yml @@ -75,6 +75,9 @@ pt-BR: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/pt-PT.yml b/modules/budgets/config/locales/crowdin/pt-PT.yml index 0e4ba9b9b2d..e6315598473 100644 --- a/modules/budgets/config/locales/crowdin/pt-PT.yml +++ b/modules/budgets/config/locales/crowdin/pt-PT.yml @@ -75,6 +75,9 @@ pt-PT: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/ro.yml b/modules/budgets/config/locales/crowdin/ro.yml index 86f8cbb0e8c..1c9f6f1b56f 100644 --- a/modules/budgets/config/locales/crowdin/ro.yml +++ b/modules/budgets/config/locales/crowdin/ro.yml @@ -75,6 +75,9 @@ ro: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/ru.yml b/modules/budgets/config/locales/crowdin/ru.yml index 1873e6745c8..38316f71544 100644 --- a/modules/budgets/config/locales/crowdin/ru.yml +++ b/modules/budgets/config/locales/crowdin/ru.yml @@ -75,6 +75,9 @@ ru: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "Нет данных о бюджете." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/rw.yml b/modules/budgets/config/locales/crowdin/rw.yml index 6ed060b48ea..00fc3744131 100644 --- a/modules/budgets/config/locales/crowdin/rw.yml +++ b/modules/budgets/config/locales/crowdin/rw.yml @@ -75,6 +75,9 @@ rw: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/si.yml b/modules/budgets/config/locales/crowdin/si.yml index 5afb86ba50a..9526cb650a0 100644 --- a/modules/budgets/config/locales/crowdin/si.yml +++ b/modules/budgets/config/locales/crowdin/si.yml @@ -75,6 +75,9 @@ si: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/sk.yml b/modules/budgets/config/locales/crowdin/sk.yml index 907ffa0d06f..74696c7184b 100644 --- a/modules/budgets/config/locales/crowdin/sk.yml +++ b/modules/budgets/config/locales/crowdin/sk.yml @@ -75,6 +75,9 @@ sk: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/sl.yml b/modules/budgets/config/locales/crowdin/sl.yml index 19fa87a4b16..3f926245ee4 100644 --- a/modules/budgets/config/locales/crowdin/sl.yml +++ b/modules/budgets/config/locales/crowdin/sl.yml @@ -75,6 +75,9 @@ sl: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/sr.yml b/modules/budgets/config/locales/crowdin/sr.yml index 317b2b0b1ef..ff14cacc285 100644 --- a/modules/budgets/config/locales/crowdin/sr.yml +++ b/modules/budgets/config/locales/crowdin/sr.yml @@ -75,6 +75,9 @@ sr: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/sv.yml b/modules/budgets/config/locales/crowdin/sv.yml index 42fe929dfff..67ae3436b7a 100644 --- a/modules/budgets/config/locales/crowdin/sv.yml +++ b/modules/budgets/config/locales/crowdin/sv.yml @@ -75,6 +75,9 @@ sv: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/th.yml b/modules/budgets/config/locales/crowdin/th.yml index 8528f305417..6e0c2750144 100644 --- a/modules/budgets/config/locales/crowdin/th.yml +++ b/modules/budgets/config/locales/crowdin/th.yml @@ -75,6 +75,9 @@ th: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/tr.yml b/modules/budgets/config/locales/crowdin/tr.yml index f9b21abbafb..7735ec0d1b2 100644 --- a/modules/budgets/config/locales/crowdin/tr.yml +++ b/modules/budgets/config/locales/crowdin/tr.yml @@ -75,6 +75,9 @@ tr: blankslate: heading: "Proje kontrolüne başlayın" description: "Projenizin sağlık durumunu verimli bir şekilde takip etmek için bütçelerinize ve maliyetlerinize genel bir bakış elde edin" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "Bütçe verisi yok." one: "Veriler %{portfolios}, %{subprograms} ve %{subprojects} adreslerinde yer alan %{count} bütçesinden derlenmiştir." diff --git a/modules/budgets/config/locales/crowdin/uk.yml b/modules/budgets/config/locales/crowdin/uk.yml index 69cc16619f6..d1c1be60ce3 100644 --- a/modules/budgets/config/locales/crowdin/uk.yml +++ b/modules/budgets/config/locales/crowdin/uk.yml @@ -75,6 +75,9 @@ uk: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/uz.yml b/modules/budgets/config/locales/crowdin/uz.yml index eb20d1ab6c3..e1e9e916911 100644 --- a/modules/budgets/config/locales/crowdin/uz.yml +++ b/modules/budgets/config/locales/crowdin/uz.yml @@ -75,6 +75,9 @@ uz: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/vi.yml b/modules/budgets/config/locales/crowdin/vi.yml index 6c23e0c69c5..0510732d679 100644 --- a/modules/budgets/config/locales/crowdin/vi.yml +++ b/modules/budgets/config/locales/crowdin/vi.yml @@ -75,6 +75,9 @@ vi: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/zh-CN.yml b/modules/budgets/config/locales/crowdin/zh-CN.yml index 10342dffa85..83e609427c0 100644 --- a/modules/budgets/config/locales/crowdin/zh-CN.yml +++ b/modules/budgets/config/locales/crowdin/zh-CN.yml @@ -75,6 +75,9 @@ zh-CN: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/budgets/config/locales/crowdin/zh-TW.yml b/modules/budgets/config/locales/crowdin/zh-TW.yml index 0a6ac26deb2..9d645d40cb6 100644 --- a/modules/budgets/config/locales/crowdin/zh-TW.yml +++ b/modules/budgets/config/locales/crowdin/zh-TW.yml @@ -75,6 +75,9 @@ zh-TW: blankslate: heading: "Start project controlling" description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + blankslate_zero: + heading: "Budget details missing" + description: "Add details about your planned budget to see data here" caption: zero: "No budget data." one: "Data aggregated from %{count} budget included in %{portfolios}, %{subprograms} and %{subprojects}." diff --git a/modules/costs/config/locales/crowdin/af.yml b/modules/costs/config/locales/crowdin/af.yml index 46406c55faf..751d3217cb5 100644 --- a/modules/costs/config/locales/crowdin/af.yml +++ b/modules/costs/config/locales/crowdin/af.yml @@ -235,7 +235,7 @@ af: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/ar.yml b/modules/costs/config/locales/crowdin/ar.yml index 9cfac461839..da16cf9e48b 100644 --- a/modules/costs/config/locales/crowdin/ar.yml +++ b/modules/costs/config/locales/crowdin/ar.yml @@ -251,7 +251,7 @@ ar: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/az.yml b/modules/costs/config/locales/crowdin/az.yml index f3ccf8d97a1..65ed5f3dc8d 100644 --- a/modules/costs/config/locales/crowdin/az.yml +++ b/modules/costs/config/locales/crowdin/az.yml @@ -235,7 +235,7 @@ az: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/be.yml b/modules/costs/config/locales/crowdin/be.yml index 766011812ba..81fb4101aa6 100644 --- a/modules/costs/config/locales/crowdin/be.yml +++ b/modules/costs/config/locales/crowdin/be.yml @@ -243,7 +243,7 @@ be: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/bg.yml b/modules/costs/config/locales/crowdin/bg.yml index 288cb21f8c2..6333adb7007 100644 --- a/modules/costs/config/locales/crowdin/bg.yml +++ b/modules/costs/config/locales/crowdin/bg.yml @@ -235,7 +235,7 @@ bg: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/ca.yml b/modules/costs/config/locales/crowdin/ca.yml index 118617f97c7..d821577627d 100644 --- a/modules/costs/config/locales/crowdin/ca.yml +++ b/modules/costs/config/locales/crowdin/ca.yml @@ -235,7 +235,7 @@ ca: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/ckb-IR.yml b/modules/costs/config/locales/crowdin/ckb-IR.yml index 382123a5090..7edece35005 100644 --- a/modules/costs/config/locales/crowdin/ckb-IR.yml +++ b/modules/costs/config/locales/crowdin/ckb-IR.yml @@ -235,7 +235,7 @@ ckb-IR: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/cs.yml b/modules/costs/config/locales/crowdin/cs.yml index 71525707546..85d249a63ce 100644 --- a/modules/costs/config/locales/crowdin/cs.yml +++ b/modules/costs/config/locales/crowdin/cs.yml @@ -243,7 +243,7 @@ cs: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/da.yml b/modules/costs/config/locales/crowdin/da.yml index b0e0ebddd3e..7b576f85061 100644 --- a/modules/costs/config/locales/crowdin/da.yml +++ b/modules/costs/config/locales/crowdin/da.yml @@ -235,7 +235,7 @@ da: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/de.yml b/modules/costs/config/locales/crowdin/de.yml index 971a7f3b0c8..a9bcafcfa8a 100644 --- a/modules/costs/config/locales/crowdin/de.yml +++ b/modules/costs/config/locales/crowdin/de.yml @@ -235,7 +235,7 @@ de: title: "Tatsächliche Kosten pro Monat" blankslate: heading: "Erfassen Sie Ihre Zeit und Kosten" - description: "Verschaffen Sie sich einen Überblick über Ihre Kosten und die erfasste Zeit, um den Fortschritt Ihres Projekts zu überwachen." + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Zeit buchen" view_details: "Details zu den tatsächlichen Kosten anzeigen" ee: diff --git a/modules/costs/config/locales/crowdin/el.yml b/modules/costs/config/locales/crowdin/el.yml index 088dca3f74a..efef01b9b87 100644 --- a/modules/costs/config/locales/crowdin/el.yml +++ b/modules/costs/config/locales/crowdin/el.yml @@ -235,7 +235,7 @@ el: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/eo.yml b/modules/costs/config/locales/crowdin/eo.yml index 4c1ef5cd344..841aa1a8e71 100644 --- a/modules/costs/config/locales/crowdin/eo.yml +++ b/modules/costs/config/locales/crowdin/eo.yml @@ -235,7 +235,7 @@ eo: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/es.yml b/modules/costs/config/locales/crowdin/es.yml index 9e2be7e345b..a72d21b6763 100644 --- a/modules/costs/config/locales/crowdin/es.yml +++ b/modules/costs/config/locales/crowdin/es.yml @@ -235,7 +235,7 @@ es: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/et.yml b/modules/costs/config/locales/crowdin/et.yml index bdbbe0aac81..a16f0a3a120 100644 --- a/modules/costs/config/locales/crowdin/et.yml +++ b/modules/costs/config/locales/crowdin/et.yml @@ -235,7 +235,7 @@ et: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/eu.yml b/modules/costs/config/locales/crowdin/eu.yml index c0de77fb91b..b98c75d8e89 100644 --- a/modules/costs/config/locales/crowdin/eu.yml +++ b/modules/costs/config/locales/crowdin/eu.yml @@ -235,7 +235,7 @@ eu: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/fa.yml b/modules/costs/config/locales/crowdin/fa.yml index d0295c5e58e..887fb6e5159 100644 --- a/modules/costs/config/locales/crowdin/fa.yml +++ b/modules/costs/config/locales/crowdin/fa.yml @@ -235,7 +235,7 @@ fa: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/fi.yml b/modules/costs/config/locales/crowdin/fi.yml index be2b4dddbaf..2a157dd17f8 100644 --- a/modules/costs/config/locales/crowdin/fi.yml +++ b/modules/costs/config/locales/crowdin/fi.yml @@ -235,7 +235,7 @@ fi: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/fil.yml b/modules/costs/config/locales/crowdin/fil.yml index 96b527c3272..85d811e3543 100644 --- a/modules/costs/config/locales/crowdin/fil.yml +++ b/modules/costs/config/locales/crowdin/fil.yml @@ -235,7 +235,7 @@ fil: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/fr.yml b/modules/costs/config/locales/crowdin/fr.yml index bfbbc1564c9..32cba041db7 100644 --- a/modules/costs/config/locales/crowdin/fr.yml +++ b/modules/costs/config/locales/crowdin/fr.yml @@ -235,7 +235,7 @@ fr: title: "Coûts réels par mois" blankslate: heading: "Commencez à suivre votre temps et vos coûts" - description: "Obtenez une vue d'ensemble de vos coûts et du temps enregistré pour suivre l'avancement de votre projet" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Durée du journal" view_details: "Voir les détails des coûts réels" ee: diff --git a/modules/costs/config/locales/crowdin/he.yml b/modules/costs/config/locales/crowdin/he.yml index a4e76dbaecc..b4369f9a43c 100644 --- a/modules/costs/config/locales/crowdin/he.yml +++ b/modules/costs/config/locales/crowdin/he.yml @@ -243,7 +243,7 @@ he: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/hi.yml b/modules/costs/config/locales/crowdin/hi.yml index c9533473b77..19a1e050859 100644 --- a/modules/costs/config/locales/crowdin/hi.yml +++ b/modules/costs/config/locales/crowdin/hi.yml @@ -235,7 +235,7 @@ hi: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/hr.yml b/modules/costs/config/locales/crowdin/hr.yml index 9229a9dd352..06377b288c7 100644 --- a/modules/costs/config/locales/crowdin/hr.yml +++ b/modules/costs/config/locales/crowdin/hr.yml @@ -239,7 +239,7 @@ hr: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/hu.yml b/modules/costs/config/locales/crowdin/hu.yml index d75273bc92c..ab70582879a 100644 --- a/modules/costs/config/locales/crowdin/hu.yml +++ b/modules/costs/config/locales/crowdin/hu.yml @@ -235,7 +235,7 @@ hu: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/id.yml b/modules/costs/config/locales/crowdin/id.yml index 3e7cb6a5ecb..fa8b2ca0329 100644 --- a/modules/costs/config/locales/crowdin/id.yml +++ b/modules/costs/config/locales/crowdin/id.yml @@ -231,7 +231,7 @@ id: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/it.yml b/modules/costs/config/locales/crowdin/it.yml index a779459192a..a9277fe6605 100644 --- a/modules/costs/config/locales/crowdin/it.yml +++ b/modules/costs/config/locales/crowdin/it.yml @@ -235,7 +235,7 @@ it: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/ja.yml b/modules/costs/config/locales/crowdin/ja.yml index bef0e0fb11f..20532a2611f 100644 --- a/modules/costs/config/locales/crowdin/ja.yml +++ b/modules/costs/config/locales/crowdin/ja.yml @@ -231,7 +231,7 @@ ja: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/js-af.yml b/modules/costs/config/locales/crowdin/js-af.yml index 75637eb4d65..ebcfd41a0b0 100644 --- a/modules/costs/config/locales/crowdin/js-af.yml +++ b/modules/costs/config/locales/crowdin/js-af.yml @@ -21,12 +21,6 @@ #++ af: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-ar.yml b/modules/costs/config/locales/crowdin/js-ar.yml index 52030ac5328..18bf7b4b89f 100644 --- a/modules/costs/config/locales/crowdin/js-ar.yml +++ b/modules/costs/config/locales/crowdin/js-ar.yml @@ -21,12 +21,6 @@ #++ ar: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "هل أنت متأكد؟" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-az.yml b/modules/costs/config/locales/crowdin/js-az.yml index b48d0274082..f156d4a7756 100644 --- a/modules/costs/config/locales/crowdin/js-az.yml +++ b/modules/costs/config/locales/crowdin/js-az.yml @@ -21,12 +21,6 @@ #++ az: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-be.yml b/modules/costs/config/locales/crowdin/js-be.yml index d98cebc4b62..fea58c20022 100644 --- a/modules/costs/config/locales/crowdin/js-be.yml +++ b/modules/costs/config/locales/crowdin/js-be.yml @@ -21,12 +21,6 @@ #++ be: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-bg.yml b/modules/costs/config/locales/crowdin/js-bg.yml index 812f977af37..b22e40b313b 100644 --- a/modules/costs/config/locales/crowdin/js-bg.yml +++ b/modules/costs/config/locales/crowdin/js-bg.yml @@ -21,12 +21,6 @@ #++ bg: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Сигурни ли сте?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-ca.yml b/modules/costs/config/locales/crowdin/js-ca.yml index 97073e8bcdd..7b8a4cf324e 100644 --- a/modules/costs/config/locales/crowdin/js-ca.yml +++ b/modules/costs/config/locales/crowdin/js-ca.yml @@ -21,12 +21,6 @@ #++ ca: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "N'esteu segur?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-ckb-IR.yml b/modules/costs/config/locales/crowdin/js-ckb-IR.yml index e04e6de7ee8..76c60200455 100644 --- a/modules/costs/config/locales/crowdin/js-ckb-IR.yml +++ b/modules/costs/config/locales/crowdin/js-ckb-IR.yml @@ -21,12 +21,6 @@ #++ ckb-IR: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-cs.yml b/modules/costs/config/locales/crowdin/js-cs.yml index 2d969846738..cf1d691ba52 100644 --- a/modules/costs/config/locales/crowdin/js-cs.yml +++ b/modules/costs/config/locales/crowdin/js-cs.yml @@ -21,12 +21,6 @@ #++ cs: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Jste si jisti?" myTimeTracking: noSpecificTime: "Žádný konkrétní čas" diff --git a/modules/costs/config/locales/crowdin/js-da.yml b/modules/costs/config/locales/crowdin/js-da.yml index 0ba65008f3c..b0c6292920b 100644 --- a/modules/costs/config/locales/crowdin/js-da.yml +++ b/modules/costs/config/locales/crowdin/js-da.yml @@ -21,12 +21,6 @@ #++ da: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Sikker?" myTimeTracking: noSpecificTime: "Intet specifikt tidspunkt" diff --git a/modules/costs/config/locales/crowdin/js-de.yml b/modules/costs/config/locales/crowdin/js-de.yml index 70176ed3b22..66aa05aeac0 100644 --- a/modules/costs/config/locales/crowdin/js-de.yml +++ b/modules/costs/config/locales/crowdin/js-de.yml @@ -21,12 +21,6 @@ #++ de: js: - costs: - widgets: - actual_costs: - blankslate: - title: "Keine Daten für das aktuelle Jahr" - description: "Buchen Sie Zeiten und Kosten um die tatsächlichen Aufwände zu verfolgen" text_are_you_sure: "Sind Sie sicher?" myTimeTracking: noSpecificTime: "Keine bestimmte Zeit" diff --git a/modules/costs/config/locales/crowdin/js-el.yml b/modules/costs/config/locales/crowdin/js-el.yml index 0ab0b8b3329..d0b75250d25 100644 --- a/modules/costs/config/locales/crowdin/js-el.yml +++ b/modules/costs/config/locales/crowdin/js-el.yml @@ -21,12 +21,6 @@ #++ el: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Είστε σίγουρος/η;" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-eo.yml b/modules/costs/config/locales/crowdin/js-eo.yml index 4e3e2805c92..69e9128f69f 100644 --- a/modules/costs/config/locales/crowdin/js-eo.yml +++ b/modules/costs/config/locales/crowdin/js-eo.yml @@ -21,12 +21,6 @@ #++ eo: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-es.yml b/modules/costs/config/locales/crowdin/js-es.yml index cb1f4a162b4..3844b6e6ad1 100644 --- a/modules/costs/config/locales/crowdin/js-es.yml +++ b/modules/costs/config/locales/crowdin/js-es.yml @@ -21,12 +21,6 @@ #++ es: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "¿Estás seguro?" myTimeTracking: noSpecificTime: "No se ha especificado el tiempo" diff --git a/modules/costs/config/locales/crowdin/js-et.yml b/modules/costs/config/locales/crowdin/js-et.yml index 38502159de8..fc4dae84083 100644 --- a/modules/costs/config/locales/crowdin/js-et.yml +++ b/modules/costs/config/locales/crowdin/js-et.yml @@ -21,12 +21,6 @@ #++ et: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Kas oled kindel?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-eu.yml b/modules/costs/config/locales/crowdin/js-eu.yml index a63280db993..5d22e83f528 100644 --- a/modules/costs/config/locales/crowdin/js-eu.yml +++ b/modules/costs/config/locales/crowdin/js-eu.yml @@ -21,12 +21,6 @@ #++ eu: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-fa.yml b/modules/costs/config/locales/crowdin/js-fa.yml index 5387c15fc65..bfde2849d85 100644 --- a/modules/costs/config/locales/crowdin/js-fa.yml +++ b/modules/costs/config/locales/crowdin/js-fa.yml @@ -21,12 +21,6 @@ #++ fa: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "آیا مطمئن هستید؟" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-fi.yml b/modules/costs/config/locales/crowdin/js-fi.yml index c5cc62fa143..e24991e5a69 100644 --- a/modules/costs/config/locales/crowdin/js-fi.yml +++ b/modules/costs/config/locales/crowdin/js-fi.yml @@ -21,12 +21,6 @@ #++ fi: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Oletko varma?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-fil.yml b/modules/costs/config/locales/crowdin/js-fil.yml index 7dbbdb69495..1e6d84c189b 100644 --- a/modules/costs/config/locales/crowdin/js-fil.yml +++ b/modules/costs/config/locales/crowdin/js-fil.yml @@ -21,12 +21,6 @@ #++ fil: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Sigurado ka ba?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-fr.yml b/modules/costs/config/locales/crowdin/js-fr.yml index 4fd550640cd..b9d385c460c 100644 --- a/modules/costs/config/locales/crowdin/js-fr.yml +++ b/modules/costs/config/locales/crowdin/js-fr.yml @@ -21,12 +21,6 @@ #++ fr: js: - costs: - widgets: - actual_costs: - blankslate: - title: "Pas de données pour l'année en cours" - description: "Enregistrez le temps passé et les coûts pour les lots de travail afin de commencer à suivre les coûts réels" text_are_you_sure: "Êtes-vous sûr ?" myTimeTracking: noSpecificTime: "Aucune heure spécifique" diff --git a/modules/costs/config/locales/crowdin/js-he.yml b/modules/costs/config/locales/crowdin/js-he.yml index 84ee62842ab..5579c6a855a 100644 --- a/modules/costs/config/locales/crowdin/js-he.yml +++ b/modules/costs/config/locales/crowdin/js-he.yml @@ -21,12 +21,6 @@ #++ he: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "האם הינך בטוח?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-hi.yml b/modules/costs/config/locales/crowdin/js-hi.yml index ee3bd36df5c..d90bc5d7b76 100644 --- a/modules/costs/config/locales/crowdin/js-hi.yml +++ b/modules/costs/config/locales/crowdin/js-hi.yml @@ -21,12 +21,6 @@ #++ hi: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-hr.yml b/modules/costs/config/locales/crowdin/js-hr.yml index 5b650bd41b2..f93f3772ca4 100644 --- a/modules/costs/config/locales/crowdin/js-hr.yml +++ b/modules/costs/config/locales/crowdin/js-hr.yml @@ -21,12 +21,6 @@ #++ hr: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Da li ste sigurni?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-hu.yml b/modules/costs/config/locales/crowdin/js-hu.yml index 73b4c18de7f..85016678271 100644 --- a/modules/costs/config/locales/crowdin/js-hu.yml +++ b/modules/costs/config/locales/crowdin/js-hu.yml @@ -21,12 +21,6 @@ #++ hu: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Biztos vagy benne?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-id.yml b/modules/costs/config/locales/crowdin/js-id.yml index e305f439f80..942792bf167 100644 --- a/modules/costs/config/locales/crowdin/js-id.yml +++ b/modules/costs/config/locales/crowdin/js-id.yml @@ -21,12 +21,6 @@ #++ id: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Apakah anda yakin?" myTimeTracking: noSpecificTime: "Tidak ada waktu khusus" diff --git a/modules/costs/config/locales/crowdin/js-it.yml b/modules/costs/config/locales/crowdin/js-it.yml index 0d6a8f38822..dcbf6f278c6 100644 --- a/modules/costs/config/locales/crowdin/js-it.yml +++ b/modules/costs/config/locales/crowdin/js-it.yml @@ -21,12 +21,6 @@ #++ it: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Sei sicuro/a?" myTimeTracking: noSpecificTime: "Nessun orario specifico" diff --git a/modules/costs/config/locales/crowdin/js-ja.yml b/modules/costs/config/locales/crowdin/js-ja.yml index d6ef063c1c7..e0c4861fe5f 100644 --- a/modules/costs/config/locales/crowdin/js-ja.yml +++ b/modules/costs/config/locales/crowdin/js-ja.yml @@ -21,12 +21,6 @@ #++ ja: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "よろしいですか?" myTimeTracking: noSpecificTime: "時間指定なし" diff --git a/modules/costs/config/locales/crowdin/js-ka.yml b/modules/costs/config/locales/crowdin/js-ka.yml index e2853d75952..8a8f067ca8f 100644 --- a/modules/costs/config/locales/crowdin/js-ka.yml +++ b/modules/costs/config/locales/crowdin/js-ka.yml @@ -21,12 +21,6 @@ #++ ka: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "დარწმუნებული ბრძანდებით?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-kk.yml b/modules/costs/config/locales/crowdin/js-kk.yml index 409680953de..c2bb8b86969 100644 --- a/modules/costs/config/locales/crowdin/js-kk.yml +++ b/modules/costs/config/locales/crowdin/js-kk.yml @@ -21,12 +21,6 @@ #++ kk: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-ko.yml b/modules/costs/config/locales/crowdin/js-ko.yml index 7b35794b740..07afa92f832 100644 --- a/modules/costs/config/locales/crowdin/js-ko.yml +++ b/modules/costs/config/locales/crowdin/js-ko.yml @@ -21,12 +21,6 @@ #++ ko: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "계속하시겠습니까?" myTimeTracking: noSpecificTime: "특정 시간 없음" diff --git a/modules/costs/config/locales/crowdin/js-lt.yml b/modules/costs/config/locales/crowdin/js-lt.yml index 236a54e426c..f4813b72d86 100644 --- a/modules/costs/config/locales/crowdin/js-lt.yml +++ b/modules/costs/config/locales/crowdin/js-lt.yml @@ -21,12 +21,6 @@ #++ lt: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Ar esate įsitikinę?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-lv.yml b/modules/costs/config/locales/crowdin/js-lv.yml index 996b2fe9b41..e8d590f8383 100644 --- a/modules/costs/config/locales/crowdin/js-lv.yml +++ b/modules/costs/config/locales/crowdin/js-lv.yml @@ -21,12 +21,6 @@ #++ lv: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Vai esat pārliecināts?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-mn.yml b/modules/costs/config/locales/crowdin/js-mn.yml index 5cb44a727cd..65299d3b277 100644 --- a/modules/costs/config/locales/crowdin/js-mn.yml +++ b/modules/costs/config/locales/crowdin/js-mn.yml @@ -21,12 +21,6 @@ #++ mn: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-ms.yml b/modules/costs/config/locales/crowdin/js-ms.yml index 0dfaa7471c7..644f7652aae 100644 --- a/modules/costs/config/locales/crowdin/js-ms.yml +++ b/modules/costs/config/locales/crowdin/js-ms.yml @@ -21,12 +21,6 @@ #++ ms: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Adakah anda pasti?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-ne.yml b/modules/costs/config/locales/crowdin/js-ne.yml index 752c7b27538..f4893d59690 100644 --- a/modules/costs/config/locales/crowdin/js-ne.yml +++ b/modules/costs/config/locales/crowdin/js-ne.yml @@ -21,12 +21,6 @@ #++ ne: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-nl.yml b/modules/costs/config/locales/crowdin/js-nl.yml index 3b9dc6b3f25..b15513f62df 100644 --- a/modules/costs/config/locales/crowdin/js-nl.yml +++ b/modules/costs/config/locales/crowdin/js-nl.yml @@ -21,12 +21,6 @@ #++ nl: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Weet u het zeker?" myTimeTracking: noSpecificTime: "Geen specifieke tijd" diff --git a/modules/costs/config/locales/crowdin/js-no.yml b/modules/costs/config/locales/crowdin/js-no.yml index 6ff2fe129db..ac908f03d9b 100644 --- a/modules/costs/config/locales/crowdin/js-no.yml +++ b/modules/costs/config/locales/crowdin/js-no.yml @@ -21,12 +21,6 @@ #++ "no": js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Er du sikker?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-pl.yml b/modules/costs/config/locales/crowdin/js-pl.yml index be4bbb8d046..ea6e7d8911b 100644 --- a/modules/costs/config/locales/crowdin/js-pl.yml +++ b/modules/costs/config/locales/crowdin/js-pl.yml @@ -21,12 +21,6 @@ #++ pl: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Jesteś pewny?" myTimeTracking: noSpecificTime: "Brak określonego czasu" diff --git a/modules/costs/config/locales/crowdin/js-pt-BR.yml b/modules/costs/config/locales/crowdin/js-pt-BR.yml index e8d3fde87a2..8fa23cc8ee3 100644 --- a/modules/costs/config/locales/crowdin/js-pt-BR.yml +++ b/modules/costs/config/locales/crowdin/js-pt-BR.yml @@ -21,12 +21,6 @@ #++ pt-BR: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Você tem certeza?" myTimeTracking: noSpecificTime: "Sem horário específico" diff --git a/modules/costs/config/locales/crowdin/js-pt-PT.yml b/modules/costs/config/locales/crowdin/js-pt-PT.yml index a72c86f50be..ad5c6f1de08 100644 --- a/modules/costs/config/locales/crowdin/js-pt-PT.yml +++ b/modules/costs/config/locales/crowdin/js-pt-PT.yml @@ -21,12 +21,6 @@ #++ pt-PT: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Tem a certeza?" myTimeTracking: noSpecificTime: "Nenhum horário específico" diff --git a/modules/costs/config/locales/crowdin/js-ro.yml b/modules/costs/config/locales/crowdin/js-ro.yml index 87a69db8c91..d046bddfa4f 100644 --- a/modules/costs/config/locales/crowdin/js-ro.yml +++ b/modules/costs/config/locales/crowdin/js-ro.yml @@ -21,12 +21,6 @@ #++ ro: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Ești sigur?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-ru.yml b/modules/costs/config/locales/crowdin/js-ru.yml index b96bf4018a2..80dfaa314bb 100644 --- a/modules/costs/config/locales/crowdin/js-ru.yml +++ b/modules/costs/config/locales/crowdin/js-ru.yml @@ -21,12 +21,6 @@ #++ ru: js: - costs: - widgets: - actual_costs: - blankslate: - title: "Нет данных за текущий год" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Уверены?" myTimeTracking: noSpecificTime: "Нет определенного времени" diff --git a/modules/costs/config/locales/crowdin/js-rw.yml b/modules/costs/config/locales/crowdin/js-rw.yml index c4d2300cdd2..7227898766d 100644 --- a/modules/costs/config/locales/crowdin/js-rw.yml +++ b/modules/costs/config/locales/crowdin/js-rw.yml @@ -21,12 +21,6 @@ #++ rw: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-si.yml b/modules/costs/config/locales/crowdin/js-si.yml index aeb09be73f0..05fa741cb83 100644 --- a/modules/costs/config/locales/crowdin/js-si.yml +++ b/modules/costs/config/locales/crowdin/js-si.yml @@ -21,12 +21,6 @@ #++ si: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "ඔබට විශ්වාසද?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-sk.yml b/modules/costs/config/locales/crowdin/js-sk.yml index 7d87694de1b..7440dc7828d 100644 --- a/modules/costs/config/locales/crowdin/js-sk.yml +++ b/modules/costs/config/locales/crowdin/js-sk.yml @@ -21,12 +21,6 @@ #++ sk: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Ste si istí?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-sl.yml b/modules/costs/config/locales/crowdin/js-sl.yml index 51b995a8d8d..7e5712b5fde 100644 --- a/modules/costs/config/locales/crowdin/js-sl.yml +++ b/modules/costs/config/locales/crowdin/js-sl.yml @@ -21,12 +21,6 @@ #++ sl: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Ste prepričani?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-sr.yml b/modules/costs/config/locales/crowdin/js-sr.yml index 38ff9694f94..b777f8dcdbb 100644 --- a/modules/costs/config/locales/crowdin/js-sr.yml +++ b/modules/costs/config/locales/crowdin/js-sr.yml @@ -21,12 +21,6 @@ #++ sr: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-sv.yml b/modules/costs/config/locales/crowdin/js-sv.yml index 18f57eb1014..f761175ba34 100644 --- a/modules/costs/config/locales/crowdin/js-sv.yml +++ b/modules/costs/config/locales/crowdin/js-sv.yml @@ -21,12 +21,6 @@ #++ sv: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Är du säker?" myTimeTracking: noSpecificTime: "Ingen specifik tid" diff --git a/modules/costs/config/locales/crowdin/js-th.yml b/modules/costs/config/locales/crowdin/js-th.yml index 486773b9536..8a0ad66a4a1 100644 --- a/modules/costs/config/locales/crowdin/js-th.yml +++ b/modules/costs/config/locales/crowdin/js-th.yml @@ -21,12 +21,6 @@ #++ th: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "คุณแน่ใจหรือไม่ ?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-tr.yml b/modules/costs/config/locales/crowdin/js-tr.yml index 393d4f3ff9c..c740c6b7869 100644 --- a/modules/costs/config/locales/crowdin/js-tr.yml +++ b/modules/costs/config/locales/crowdin/js-tr.yml @@ -21,12 +21,6 @@ #++ tr: js: - costs: - widgets: - actual_costs: - blankslate: - title: "Geçerli yıl için veri yok" - description: "Gerçek maliyetleri izlemeye başlamak için iş paketleri için harcanan zamanı ve maliyetleri kaydedin" text_are_you_sure: "Emin misiniz?" myTimeTracking: noSpecificTime: "Belirli bir zaman yok" diff --git a/modules/costs/config/locales/crowdin/js-uk.yml b/modules/costs/config/locales/crowdin/js-uk.yml index 407a9c2003a..27c703868fb 100644 --- a/modules/costs/config/locales/crowdin/js-uk.yml +++ b/modules/costs/config/locales/crowdin/js-uk.yml @@ -21,12 +21,6 @@ #++ uk: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Ви впевненені?" myTimeTracking: noSpecificTime: "Немає визначеного часу" diff --git a/modules/costs/config/locales/crowdin/js-uz.yml b/modules/costs/config/locales/crowdin/js-uz.yml index 782523a0b95..9822ffecbf5 100644 --- a/modules/costs/config/locales/crowdin/js-uz.yml +++ b/modules/costs/config/locales/crowdin/js-uz.yml @@ -21,12 +21,6 @@ #++ uz: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Are you sure?" myTimeTracking: noSpecificTime: "No specific time" diff --git a/modules/costs/config/locales/crowdin/js-vi.yml b/modules/costs/config/locales/crowdin/js-vi.yml index 4e45ca42a62..e7e657e54b9 100644 --- a/modules/costs/config/locales/crowdin/js-vi.yml +++ b/modules/costs/config/locales/crowdin/js-vi.yml @@ -21,12 +21,6 @@ #++ vi: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "Bạn có chắc không?" myTimeTracking: noSpecificTime: "Không có thời gian cụ thể" diff --git a/modules/costs/config/locales/crowdin/js-zh-CN.yml b/modules/costs/config/locales/crowdin/js-zh-CN.yml index 77695d84fe7..1d5ae5b9e79 100644 --- a/modules/costs/config/locales/crowdin/js-zh-CN.yml +++ b/modules/costs/config/locales/crowdin/js-zh-CN.yml @@ -21,12 +21,6 @@ #++ zh-CN: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "是否确定?" myTimeTracking: noSpecificTime: "未指定时间" diff --git a/modules/costs/config/locales/crowdin/js-zh-TW.yml b/modules/costs/config/locales/crowdin/js-zh-TW.yml index 247ccc023c6..e91a4d2e258 100644 --- a/modules/costs/config/locales/crowdin/js-zh-TW.yml +++ b/modules/costs/config/locales/crowdin/js-zh-TW.yml @@ -21,12 +21,6 @@ #++ zh-TW: js: - costs: - widgets: - actual_costs: - blankslate: - title: "No data for current year" - description: "Log spent time and costs for work packages to start tracking actual costs" text_are_you_sure: "是否確定?" myTimeTracking: noSpecificTime: "無指定時間" diff --git a/modules/costs/config/locales/crowdin/ka.yml b/modules/costs/config/locales/crowdin/ka.yml index 967d33c11de..82f1853414e 100644 --- a/modules/costs/config/locales/crowdin/ka.yml +++ b/modules/costs/config/locales/crowdin/ka.yml @@ -235,7 +235,7 @@ ka: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/kk.yml b/modules/costs/config/locales/crowdin/kk.yml index ad92a19f83a..ad2aa157d7b 100644 --- a/modules/costs/config/locales/crowdin/kk.yml +++ b/modules/costs/config/locales/crowdin/kk.yml @@ -235,7 +235,7 @@ kk: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/ko.yml b/modules/costs/config/locales/crowdin/ko.yml index c83604b6f8c..82acbfa58e3 100644 --- a/modules/costs/config/locales/crowdin/ko.yml +++ b/modules/costs/config/locales/crowdin/ko.yml @@ -231,7 +231,7 @@ ko: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/lt.yml b/modules/costs/config/locales/crowdin/lt.yml index 2c27d1b6ffe..e8fac6161b9 100644 --- a/modules/costs/config/locales/crowdin/lt.yml +++ b/modules/costs/config/locales/crowdin/lt.yml @@ -243,7 +243,7 @@ lt: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/lv.yml b/modules/costs/config/locales/crowdin/lv.yml index b4df1765ba9..c9acdae640b 100644 --- a/modules/costs/config/locales/crowdin/lv.yml +++ b/modules/costs/config/locales/crowdin/lv.yml @@ -239,7 +239,7 @@ lv: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/mn.yml b/modules/costs/config/locales/crowdin/mn.yml index 87d5bed61dc..f5ba49c5f68 100644 --- a/modules/costs/config/locales/crowdin/mn.yml +++ b/modules/costs/config/locales/crowdin/mn.yml @@ -235,7 +235,7 @@ mn: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/ms.yml b/modules/costs/config/locales/crowdin/ms.yml index a4e86a8d7a6..17eb61b6ee3 100644 --- a/modules/costs/config/locales/crowdin/ms.yml +++ b/modules/costs/config/locales/crowdin/ms.yml @@ -231,7 +231,7 @@ ms: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/ne.yml b/modules/costs/config/locales/crowdin/ne.yml index 91422b119bf..3ec82ad2b7f 100644 --- a/modules/costs/config/locales/crowdin/ne.yml +++ b/modules/costs/config/locales/crowdin/ne.yml @@ -235,7 +235,7 @@ ne: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/nl.yml b/modules/costs/config/locales/crowdin/nl.yml index b98b4324430..657b6b1045c 100644 --- a/modules/costs/config/locales/crowdin/nl.yml +++ b/modules/costs/config/locales/crowdin/nl.yml @@ -235,7 +235,7 @@ nl: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/no.yml b/modules/costs/config/locales/crowdin/no.yml index 72be8803b39..04be7016cc3 100644 --- a/modules/costs/config/locales/crowdin/no.yml +++ b/modules/costs/config/locales/crowdin/no.yml @@ -235,7 +235,7 @@ title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/pl.yml b/modules/costs/config/locales/crowdin/pl.yml index 3541f44b48d..2c85b2505f2 100644 --- a/modules/costs/config/locales/crowdin/pl.yml +++ b/modules/costs/config/locales/crowdin/pl.yml @@ -213,10 +213,10 @@ pl: project_module_costs: "Czas i koszty" setting_allow_tracking_start_and_end_times: "Zezwól na czasy rozpoczęcia i zakończenia" setting_costs_currency: "Waluta" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "Jest to jednostka waluty. Może to być trzyliterowy kod ISO, taki jak EUR, USD lub JPY albo symbol, taki jak €, $ lub ¥." + setting_costs_currency_format: "Format waluty" + setting_costs_currency_format_prefix: "Przed liczbą (np. EUR 100)" + setting_costs_currency_format_suffix: "Po liczbie (np. 100 EUR)" setting_enforce_tracking_start_and_end_times: "Wymagaj czasów rozpoczęcia i zakończenia" setting_enforce_without_allow: "Nie można wymagać czasów rozpoczęcia i zakończenia bez zezwolenia na nie" setting_allow_tracking_start_and_end_times_caption: "Umożliwia wprowadzenie czasów rozpoczęcia i zakończenia w razie rejestrowania czasu." @@ -240,12 +240,12 @@ pl: costs: widgets: actual_costs: - title: "Actual costs by month" + title: "Rzeczywiste koszty według miesięcy" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" - action: "Log time" - view_details: "View actual costs details" + heading: "Zacznij śledzić swój czas i koszty" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." + action: "Rejestruj czas pracy" + view_details: "Wyświetl szczegóły rzeczywistych kosztów" ee: features: time_entry_time_restrictions: Wymagaj dokładnego śledzenia czasu diff --git a/modules/costs/config/locales/crowdin/pt-BR.yml b/modules/costs/config/locales/crowdin/pt-BR.yml index d95c3306fa5..9254edfa5a2 100644 --- a/modules/costs/config/locales/crowdin/pt-BR.yml +++ b/modules/costs/config/locales/crowdin/pt-BR.yml @@ -235,7 +235,7 @@ pt-BR: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/pt-PT.yml b/modules/costs/config/locales/crowdin/pt-PT.yml index c1cb5ec2ea9..770f546807a 100644 --- a/modules/costs/config/locales/crowdin/pt-PT.yml +++ b/modules/costs/config/locales/crowdin/pt-PT.yml @@ -235,7 +235,7 @@ pt-PT: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/ro.yml b/modules/costs/config/locales/crowdin/ro.yml index 0199141aa48..e1e0ace856c 100644 --- a/modules/costs/config/locales/crowdin/ro.yml +++ b/modules/costs/config/locales/crowdin/ro.yml @@ -239,7 +239,7 @@ ro: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/ru.yml b/modules/costs/config/locales/crowdin/ru.yml index 32d95e3e5d9..7c0d9adc533 100644 --- a/modules/costs/config/locales/crowdin/ru.yml +++ b/modules/costs/config/locales/crowdin/ru.yml @@ -243,7 +243,7 @@ ru: title: "Фактические затраты по месяцам" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Добавить трудозатраты" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/rw.yml b/modules/costs/config/locales/crowdin/rw.yml index a0aeb41bffe..20e2547d233 100644 --- a/modules/costs/config/locales/crowdin/rw.yml +++ b/modules/costs/config/locales/crowdin/rw.yml @@ -235,7 +235,7 @@ rw: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/si.yml b/modules/costs/config/locales/crowdin/si.yml index 7761ed4a758..208b3042c6e 100644 --- a/modules/costs/config/locales/crowdin/si.yml +++ b/modules/costs/config/locales/crowdin/si.yml @@ -235,7 +235,7 @@ si: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/sk.yml b/modules/costs/config/locales/crowdin/sk.yml index 2257327b9ac..6c8bc919c75 100644 --- a/modules/costs/config/locales/crowdin/sk.yml +++ b/modules/costs/config/locales/crowdin/sk.yml @@ -243,7 +243,7 @@ sk: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/sl.yml b/modules/costs/config/locales/crowdin/sl.yml index 765b02bd909..304ccd44bb6 100644 --- a/modules/costs/config/locales/crowdin/sl.yml +++ b/modules/costs/config/locales/crowdin/sl.yml @@ -243,7 +243,7 @@ sl: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/sr.yml b/modules/costs/config/locales/crowdin/sr.yml index a499909600e..6638b4d33a3 100644 --- a/modules/costs/config/locales/crowdin/sr.yml +++ b/modules/costs/config/locales/crowdin/sr.yml @@ -239,7 +239,7 @@ sr: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/sv.yml b/modules/costs/config/locales/crowdin/sv.yml index 0b7970b1337..bd40b4b80c9 100644 --- a/modules/costs/config/locales/crowdin/sv.yml +++ b/modules/costs/config/locales/crowdin/sv.yml @@ -235,7 +235,7 @@ sv: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/th.yml b/modules/costs/config/locales/crowdin/th.yml index 49881e45b85..b65b9cc6f77 100644 --- a/modules/costs/config/locales/crowdin/th.yml +++ b/modules/costs/config/locales/crowdin/th.yml @@ -231,7 +231,7 @@ th: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/tr.yml b/modules/costs/config/locales/crowdin/tr.yml index 2b6b58cd60b..2b758d6a338 100644 --- a/modules/costs/config/locales/crowdin/tr.yml +++ b/modules/costs/config/locales/crowdin/tr.yml @@ -235,7 +235,7 @@ tr: title: "Aylara göre gerçek maliyetler" blankslate: heading: "Zamanınızı ve maliyetlerinizi takip etmeye başlayın" - description: "Projenizin ilerleyişini izlemek için maliyetlerinize ve kaydedilen zamana genel bir bakış elde edin" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Günlük zamanı" view_details: "Gerçek maliyet ayrıntılarını görüntüleyin" ee: diff --git a/modules/costs/config/locales/crowdin/uk.yml b/modules/costs/config/locales/crowdin/uk.yml index 2dd461277d7..16105684c55 100644 --- a/modules/costs/config/locales/crowdin/uk.yml +++ b/modules/costs/config/locales/crowdin/uk.yml @@ -243,7 +243,7 @@ uk: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/uz.yml b/modules/costs/config/locales/crowdin/uz.yml index 8b998aab5f2..b245e161da9 100644 --- a/modules/costs/config/locales/crowdin/uz.yml +++ b/modules/costs/config/locales/crowdin/uz.yml @@ -235,7 +235,7 @@ uz: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/vi.yml b/modules/costs/config/locales/crowdin/vi.yml index 076c09745e3..bac89a48180 100644 --- a/modules/costs/config/locales/crowdin/vi.yml +++ b/modules/costs/config/locales/crowdin/vi.yml @@ -231,7 +231,7 @@ vi: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/zh-CN.yml b/modules/costs/config/locales/crowdin/zh-CN.yml index 4a883e6a83a..e0274e9a963 100644 --- a/modules/costs/config/locales/crowdin/zh-CN.yml +++ b/modules/costs/config/locales/crowdin/zh-CN.yml @@ -231,7 +231,7 @@ zh-CN: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/costs/config/locales/crowdin/zh-TW.yml b/modules/costs/config/locales/crowdin/zh-TW.yml index 35cbc319ba6..d55463b7e1a 100644 --- a/modules/costs/config/locales/crowdin/zh-TW.yml +++ b/modules/costs/config/locales/crowdin/zh-TW.yml @@ -231,7 +231,7 @@ zh-TW: title: "Actual costs by month" blankslate: heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project" + description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." action: "Log time" view_details: "View actual costs details" ee: diff --git a/modules/documents/config/locales/crowdin/pl.yml b/modules/documents/config/locales/crowdin/pl.yml index ff767719afb..1dbb0c4b3c5 100644 --- a/modules/documents/config/locales/crowdin/pl.yml +++ b/modules/documents/config/locales/crowdin/pl.yml @@ -24,7 +24,7 @@ pl: name: "Dokumenty OpenProject" description: "Wtyczka OpenProject umożliwiająca tworzenie dokumentów w projektach." attributes: - collaborative_editing_hocuspocus_url: "Hocuspocus server URL" + collaborative_editing_hocuspocus_url: "Adres URL serwera Hocuspocus" activerecord: errors: models: @@ -127,8 +127,8 @@ pl: some_unwritable: Niektóre wartości są konfigurowane za pomocą zmiennych środowiskowych i nie można ich edytować tutaj. hocuspocus_server_url: label: "Adres URL serwera Hocuspocus" - caption: "The WebSocket address of a working Hocuspocus server." - invalid_scheme: "Must use a WebSocket protocol (ws:// or wss://)." + caption: "Adres WebSocket działającego serwera Hocuspocus." + invalid_scheme: "Musi używać protokołu WebSocket (ws:// lub wss://)." hocuspocus_server_secret: label: "Klucz tajny klienta" caption: "Wklej klucz tajny dostarczony przez serwer Hocuspocus." diff --git a/modules/grids/config/locales/crowdin/js-pl.yml b/modules/grids/config/locales/crowdin/js-pl.yml index c4dad30d424..40cb8fe4b00 100644 --- a/modules/grids/config/locales/crowdin/js-pl.yml +++ b/modules/grids/config/locales/crowdin/js-pl.yml @@ -2,12 +2,12 @@ pl: js: grid: add_widget: 'Dodaj widżet' - widget_menu_label: 'Show menu options for %{widgetName} widget' + widget_menu_label: 'Pokaż opcje menu widżetu %{widgetName}' remove: 'Usuń widżet' configure: 'Konfiguruj widżet' widgets: missing_permission: "Nie masz uprawnień niezbędnych do wyświetlenia tego widżetu." - not_available: "This widget is currently unavailable." + not_available: "Ten widżet jest obecnie niedostępny." custom_text: title: 'Tekst niestandardowy/użytkownika' documents: diff --git a/modules/meeting/config/locales/crowdin/pl.yml b/modules/meeting/config/locales/crowdin/pl.yml index ee56f083535..9bf0cfafd32 100644 --- a/modules/meeting/config/locales/crowdin/pl.yml +++ b/modules/meeting/config/locales/crowdin/pl.yml @@ -70,10 +70,10 @@ pl: errors: models: meeting_participant: - user_invalid: "is not a valid participant." + user_invalid: "nie jest prawidłowym uczestnikiem." meeting_agenda_item: - section_not_belong_to_meeting: "Section does not belong to the same meeting." - user_invalid: "is not a valid participant." + section_not_belong_to_meeting: "Sekcja nie należy do tego samego spotkania." + user_invalid: "nie jest prawidłowym uczestnikiem." recurring_meeting_interim_response: not_an_occurrence: "is not a valid occurrence time for this recurring meeting" recurring_meeting: @@ -122,15 +122,15 @@ pl: error_notification_with_errors: "Nie udało się wysłać powiadomienie do adresatów: %{recipients}" label_meeting: "Spotkanie" label_meeting_plural: "Spotkania" - label_meeting_templates: "Templates" - label_meeting_template: "Template" - label_meeting_template_new: "New template" - label_meeting_template_create: "Create template" - label_meeting_template_delete: "Delete template" - label_meeting_template_edit: "Edit template" - label_meeting_create_from_template: "Create meeting from template" + label_meeting_templates: "Szablony" + label_meeting_template: "Szablon" + label_meeting_template_new: "Nowy szablon" + label_meeting_template_create: "Utwórz szablon" + label_meeting_template_delete: "Usuń szablon" + label_meeting_template_edit: "Edytuj szablon" + label_meeting_create_from_template: "Utwórz spotkanie z szablonu" label_meeting_new: "Nowe spotkanie" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_meeting_template_select: "Wybierz szablon, aby automatycznie skopiować z niego punkty planu spotkania" label_meeting_new_dynamic: "Nowe spotkanie jednorazowe" label_meeting_new_recurring: "Nowe spotkanie cykliczne" label_meeting_create: "Utwórz spotkanie" @@ -298,8 +298,8 @@ pl: confirmation_message_html: > To działanie jest nieodwracalne. Postępuj ostrożnie. template: - title: "Delete template" - heading: "Delete this template?" + title: "Usuń szablon" + heading: "Usunąć ten szablon?" occurrence: title: "Anuluj wystąpienie spotkania" heading: "Anulować to wystąpienie spotkania?" @@ -503,7 +503,7 @@ pl: end_series_dialog: title: "Zakończ serię spotkań" notice_successful_notification: "Aktualizacja zaproszenia do kalendarza jest wysyłana pocztą elektroniczną do wszystkich uczestników" - notice_meeting_template_created: "Template successfully created" + notice_meeting_template_created: "Szablon został utworzony" notice_timezone_missing: 'Została ustawiona domyślna strefa czasowa: %{zone}. Aby zmienić strefę czasową, kliknij tutaj.' notice_meeting_updated: "Ta strona została zaktualizowana przez kogoś innego. Załaduj ją ponownie, aby wyświetlić zmiany." permission_create_meetings: "Utwórz spotkanie" @@ -518,8 +518,8 @@ pl: text_duration_in_hours: "Czas trwania w godzinach" text_in_hours: "w godzinach" text_meeting_agenda_for_meeting: 'agenda spotkania "%{meeting}"' - text_meeting_template_blank_slate_heading: "There are no templates to display" - text_meeting_template_blank_slate: "You can create a new template for one-time meetings" + text_meeting_template_blank_slate_heading: "Nie ma żadnych szablonów do wyświetlenia" + text_meeting_template_blank_slate: "Możesz utworzyć nowy szablon jednorazowych spotkań" text_meeting_series_end_early_heading: "Usunąć przyszłe wystąpienia?" text_meeting_series_end_early: "Zakończenie serii spowoduje usunięcie wszelkich przyszłych otwartych lub zaplanowanych wystąpień spotkania" text_meeting_closing_are_you_sure: "Czy na pewno chcesz zamknąć plan spotkania?" @@ -625,9 +625,9 @@ pl: text_meeting_in_progress_dropdown_description: "Udokumentuj wyniki, takie jak potrzeby informacyjne lub decyzje podjęte podczas spotkania." text_meeting_closed_dropdown_description: "To spotkanie jest zamknięte. Nie można już modyfikować pozycji planu spotkania ani wyników." text_meeting_draft_banner: "Jesteś teraz w trybie wersji roboczej. To spotkanie nie wyśle żadnych aktualizacji kalendarza ani zaproszeń, nawet jeśli zmienisz szczegóły spotkania lub dodasz/usuniesz uczestników." - 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." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_banner: "Obecnie edytujesz szablon spotkania. Możesz użyć tego szablonu do tworzenia jednorazowych spotkań z predefiniowanym planem spotkania. Zmiany nie będą miały wpływu na już utworzone spotkania." + text_onetime_meeting_template_empty_heading: "Ten szablon spotkania jest pusty" + text_onetime_meeting_template_description: "Dodaj punkty planu spotkania i załączniki do tego szablonu. Będą one dołączane do każdego spotkania opartego na tym szablonie." text_exit_draft_mode_dialog_title: "Otworzyć to spotkanie i wysłać zaproszenia?" text_exit_draft_mode_dialog_subtitle: "Po zaplanowaniu spotkania nie można powrócić do trybu wersji roboczej." text_exit_draft_mode_dialog_template_title: "Otworzyć pierwsze wystąpienie z tej serii spotkań?" From 95c66e1f5e1774079c81cd88f191fc391309933c Mon Sep 17 00:00:00 2001 From: Marcello Rocha Date: Thu, 5 Mar 2026 14:33:05 +0100 Subject: [PATCH 134/334] Cleanup extreme edge case handling for nextcloud --- .../nextcloud/queries/download_link_query.rb | 8 +++----- .../nextcloud/queries/download_link_query_spec.rb | 12 +++++------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb b/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb index 41427e3201e..7ee86871c57 100644 --- a/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb +++ b/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb @@ -53,11 +53,7 @@ module Storages case response in { status: 200..299 } - if response.body.to_s.empty? - Failure(error.with(code: :unauthorized)) - else - build_download_link(response, error) - end + build_download_link(response, error) in { status: 404 } Failure(error.with(code: :not_found)) in { status: 401 } @@ -96,6 +92,8 @@ module Storages return parsing_error if token.blank? Success(token) + rescue HTTPX::Error + parsing_error end def download_link(token, origin_name) diff --git a/modules/storages/spec/common/storages/adapters/providers/nextcloud/queries/download_link_query_spec.rb b/modules/storages/spec/common/storages/adapters/providers/nextcloud/queries/download_link_query_spec.rb index a7b7f2ecd28..b5ab915fed1 100644 --- a/modules/storages/spec/common/storages/adapters/providers/nextcloud/queries/download_link_query_spec.rb +++ b/modules/storages/spec/common/storages/adapters/providers/nextcloud/queries/download_link_query_spec.rb @@ -81,15 +81,13 @@ module Storages end end - context "with outbound request returning 200 and an empty body", skip: "Pending investigation on NC behaviour" do - it "refreshes the token and returns success", vcr: "nextcloud/download_link_query_unauthorized" do + context "with outbound request returning 200 and an empty body" do + it "fails with code invalid_response", vcr: "nextcloud/download_link_query_unauthorized" do download_link = subject.call(auth_strategy:, input_data:) - expect(download_link).to be_success + expect(download_link).to be_failure - uri = download_link.value! - expect(uri.host).to eq("nextcloud.local") - expect(uri.path) - .to match(/index.php\/apps\/integration_openproject\/direct\/[0-9a-zA-Z]+\/#{file_link.origin_name}/) + error = download_link.failure + expect(error.code).to eq(:invalid_response) end end end From 358ff40e5c0aefaa760de695467611b57ff2998e Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Thu, 5 Mar 2026 11:13:35 +0100 Subject: [PATCH 135/334] [chore] add xwiki alias to traefik defaults - starting with xwiki development, this alias belongs to the defaults we are defining here --- docker/dev/tls/docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/dev/tls/docker-compose.yml b/docker/dev/tls/docker-compose.yml index 12411a09859..a75a3773a94 100644 --- a/docker/dev/tls/docker-compose.yml +++ b/docker/dev/tls/docker-compose.yml @@ -17,6 +17,7 @@ services: - openproject.${OPENPROJECT_DOCKER_DEV_TLD:-local} - openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD:-local} - nextcloud.${OPENPROJECT_DOCKER_DEV_TLD:-local} + - xwiki.${OPENPROJECT_DOCKER_DEV_TLD:-local} - gitlab.${OPENPROJECT_DOCKER_DEV_TLD:-local} - keycloak.${OPENPROJECT_DOCKER_DEV_TLD:-local} - hocuspocus.${OPENPROJECT_DOCKER_DEV_TLD:-local} From 074cf96782a6af08ca661694141e3dfa1880cc86 Mon Sep 17 00:00:00 2001 From: Klaus Zanders Date: Thu, 5 Mar 2026 15:56:10 +0100 Subject: [PATCH 136/334] Fix polish --- modules/budgets/config/locales/crowdin/pl.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/budgets/config/locales/crowdin/pl.yml b/modules/budgets/config/locales/crowdin/pl.yml index 38f13281381..29b2c968591 100644 --- a/modules/budgets/config/locales/crowdin/pl.yml +++ b/modules/budgets/config/locales/crowdin/pl.yml @@ -80,8 +80,8 @@ pl: description: "Add details about your planned budget to see data here" caption: zero: "Brak danych budżetowych." - one: "Dane zagregowane z %{count} budżetu zawarte w %{portfolios}, %{subprograms} i %{subprojects}." - other: "Dane zagregowane z %{count} budżetów zawarte w %{portfolios}, %{subprograms} i %{subprojects}." + one: "Dane zagregowane z %{count} budżetu zawarte w %{workspace}." + other: "Dane zagregowane z %{count} budżetów zawarte w %{workspace}." caption_simple: one: "Dane zagregowane z %{count} budżetu." few: "Dane zagregowane z %{count} budżetów." From 4befacc6c8fd5018b96b06eeb741d3760be3d92b Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Thu, 5 Mar 2026 15:54:03 +0100 Subject: [PATCH 137/334] [#72823] Refactor ProjectCustomFields::LoadService https://community.openproject.org/work_packages/72823 From fa69a60a441db5d18c11ed8858289fa37f84d812 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Wed, 4 Mar 2026 20:10:53 +0100 Subject: [PATCH 138/334] bring order to custom values both in the relation and project custom fields load service --- .../project_custom_fields/load_service.rb | 1 + .../lib/acts_as_customizable.rb | 2 +- spec/models/project_spec.rb | 17 ++++++ .../load_service_spec.rb | 52 +++++++++++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 spec/services/project_custom_fields/load_service_spec.rb diff --git a/app/services/project_custom_fields/load_service.rb b/app/services/project_custom_fields/load_service.rb index 50e3cbc4cdc..fab4801cf46 100644 --- a/app/services/project_custom_fields/load_service.rb +++ b/app/services/project_custom_fields/load_service.rb @@ -50,6 +50,7 @@ module ProjectCustomFields custom_field_id: @project_custom_fields.pluck(:id), customized_id: @project.id ) + .order(:id) .to_a end end diff --git a/lib_static/plugins/acts_as_customizable/lib/acts_as_customizable.rb b/lib_static/plugins/acts_as_customizable/lib/acts_as_customizable.rb index 033fd1f11a6..d15c7ec4bac 100644 --- a/lib_static/plugins/acts_as_customizable/lib/acts_as_customizable.rb +++ b/lib_static/plugins/acts_as_customizable/lib/acts_as_customizable.rb @@ -48,7 +48,7 @@ module Redmine # N.B. the default for validate should be false, however specs seem to think differently has_many :custom_values, -> { includes(:custom_field) - .order("#{CustomField.table_name}.position") + .order("#{CustomField.table_name}.position", "#{CustomValue.table_name}.id") }, as: :customized, dependent: :delete_all, validate: false, diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 89d8daf1017..6467104e8b0 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -540,6 +540,23 @@ RSpec.describe Project do end end + describe "#custom_values_for_custom_field" do + let(:custom_field) { create(:list_project_custom_field, multi_value: true) } + # intentionally out of order + let!(:cv2) { create(:custom_value, id: 1002, customized: project, custom_field:) } + let!(:cv1) { create(:custom_value, id: 1001, customized: project, custom_field:) } + let!(:cv3) { create(:custom_value, id: 1003, customized: project, custom_field:) } + + before do + allow(project).to receive(:available_custom_fields) { ProjectCustomField.all } + end + + it "returns values ordered by id" do + values = project.custom_values_for_custom_field(custom_field) + expect(values).to eq([cv1, cv2, cv3]) + end + end + describe "url identifier" do let(:reserved) do Rails.application.routes.routes diff --git a/spec/services/project_custom_fields/load_service_spec.rb b/spec/services/project_custom_fields/load_service_spec.rb new file mode 100644 index 00000000000..6c1ffbd25d9 --- /dev/null +++ b/spec/services/project_custom_fields/load_service_spec.rb @@ -0,0 +1,52 @@ +# 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 ProjectCustomFields::LoadService do + let(:project) { create(:project) } + let(:custom_field) { create(:list_project_custom_field, multi_value: true) } + + subject(:service) do + described_class.new(project:, project_custom_fields: ProjectCustomField.where(id: custom_field.id)) + end + + describe "#get_eager_loaded_project_custom_field_values_for" do + # intentionally out of order + let!(:cv2) { create(:custom_value, id: 1002, customized: project, custom_field:) } + let!(:cv1) { create(:custom_value, id: 1001, customized: project, custom_field:) } + let!(:cv3) { create(:custom_value, id: 1003, customized: project, custom_field:) } + + it "returns values for the given custom field ordered by id" do + values = service.get_eager_loaded_project_custom_field_values_for(custom_field.id) + expect(values).to eq([cv1, cv2, cv3]) + end + end +end From 17679fd0e42863ba3d7c27c1699c3bcfe640422d Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Wed, 4 Mar 2026 20:51:57 +0100 Subject: [PATCH 139/334] no need to call super in initialize of class inheriting (implicitly) from Object --- app/services/project_custom_fields/load_service.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/services/project_custom_fields/load_service.rb b/app/services/project_custom_fields/load_service.rb index fab4801cf46..e7a2998f834 100644 --- a/app/services/project_custom_fields/load_service.rb +++ b/app/services/project_custom_fields/load_service.rb @@ -31,7 +31,6 @@ module ProjectCustomFields class LoadService def initialize(project:, project_custom_fields:) - super() @project = project @project_custom_fields = project_custom_fields eager_load_project_custom_field_values From cb19d99d326038a64ce71c9a9ac2a8c5308d5290 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Wed, 4 Mar 2026 21:21:56 +0100 Subject: [PATCH 140/334] improve fetching in project custom field load service Match customized not only by id (should not be problematic, as cf ids are also used). Use custom fields without plucking, so no need for getting ids first, build one sql instead. --- app/services/project_custom_fields/load_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/project_custom_fields/load_service.rb b/app/services/project_custom_fields/load_service.rb index e7a2998f834..def24b66eae 100644 --- a/app/services/project_custom_fields/load_service.rb +++ b/app/services/project_custom_fields/load_service.rb @@ -46,8 +46,8 @@ module ProjectCustomFields @eager_loaded_project_custom_field_values = CustomValue .includes(custom_field: :custom_options) .where( - custom_field_id: @project_custom_fields.pluck(:id), - customized_id: @project.id + custom_field: @project_custom_fields, + customized: @project ) .order(:id) .to_a From ccbd707846065ab595aa7e430bbe40ab1a970ef0 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Wed, 4 Mar 2026 21:23:27 +0100 Subject: [PATCH 141/334] use group_by in project custom field load service to not repeatedly filter values --- .../project_custom_fields/load_service.rb | 27 ++++----- .../load_service_spec.rb | 55 +++++++++++++++---- 2 files changed, 55 insertions(+), 27 deletions(-) diff --git a/app/services/project_custom_fields/load_service.rb b/app/services/project_custom_fields/load_service.rb index def24b66eae..7f15d4c2c2b 100644 --- a/app/services/project_custom_fields/load_service.rb +++ b/app/services/project_custom_fields/load_service.rb @@ -31,26 +31,19 @@ module ProjectCustomFields class LoadService def initialize(project:, project_custom_fields:) - @project = project - @project_custom_fields = project_custom_fields - eager_load_project_custom_field_values + @values_by_custom_field_id = + CustomValue + .includes(custom_field: :custom_options) + .where( + custom_field: project_custom_fields, + customized: project + ) + .order(:id) + .group_by(&:custom_field_id) end def get_eager_loaded_project_custom_field_values_for(custom_field_id) - @eager_loaded_project_custom_field_values.select { |pcfv| pcfv.custom_field_id == custom_field_id } - end - - private - - def eager_load_project_custom_field_values - @eager_loaded_project_custom_field_values = CustomValue - .includes(custom_field: :custom_options) - .where( - custom_field: @project_custom_fields, - customized: @project - ) - .order(:id) - .to_a + @values_by_custom_field_id[custom_field_id] || [] end end end diff --git a/spec/services/project_custom_fields/load_service_spec.rb b/spec/services/project_custom_fields/load_service_spec.rb index 6c1ffbd25d9..8a5d2516d0b 100644 --- a/spec/services/project_custom_fields/load_service_spec.rb +++ b/spec/services/project_custom_fields/load_service_spec.rb @@ -33,20 +33,55 @@ require "spec_helper" RSpec.describe ProjectCustomFields::LoadService do let(:project) { create(:project) } let(:custom_field) { create(:list_project_custom_field, multi_value: true) } + let(:project_custom_fields) { ProjectCustomField.where(id: project_custom_field_ids) } + let(:project_custom_field_ids) { custom_field.id } - subject(:service) do - described_class.new(project:, project_custom_fields: ProjectCustomField.where(id: custom_field.id)) - end + subject(:service) { described_class.new(project:, project_custom_fields:) } describe "#get_eager_loaded_project_custom_field_values_for" do - # intentionally out of order - let!(:cv2) { create(:custom_value, id: 1002, customized: project, custom_field:) } - let!(:cv1) { create(:custom_value, id: 1001, customized: project, custom_field:) } - let!(:cv3) { create(:custom_value, id: 1003, customized: project, custom_field:) } + context "when the custom field has no values" do + it "returns an empty array" do + expect(service.get_eager_loaded_project_custom_field_values_for(custom_field.id)).to eq([]) + end + end - it "returns values for the given custom field ordered by id" do - values = service.get_eager_loaded_project_custom_field_values_for(custom_field.id) - expect(values).to eq([cv1, cv2, cv3]) + context "when the custom field has values" do + # intentionally out of order + let!(:cv2) { create(:custom_value, id: 1002, customized: project, custom_field:) } + let!(:cv1) { create(:custom_value, id: 1001, customized: project, custom_field:) } + let!(:cv3) { create(:custom_value, id: 1003, customized: project, custom_field:) } + + it "returns the values ordered by id" do + expect(service.get_eager_loaded_project_custom_field_values_for(custom_field.id)) + .to eq([cv1, cv2, cv3]) + end + + it "returns empty array for other custom field" do + expect(service.get_eager_loaded_project_custom_field_values_for(0)) + .to eq([]) + end + + context "when another custom field has values" do + let(:other_custom_field) { create(:list_project_custom_field, multi_value: true) } + let!(:other_cv) { create(:custom_value, customized: project, custom_field: other_custom_field) } + let(:project_custom_field_ids) { [custom_field.id, other_custom_field.id] } + + it "returns values only for the requested custom field" do + expect(service.get_eager_loaded_project_custom_field_values_for(custom_field.id)) + .to eq([cv1, cv2, cv3]) + expect(service.get_eager_loaded_project_custom_field_values_for(other_custom_field.id)) + .to eq([other_cv]) + end + end + + context "when another project has values for the same custom field" do + let!(:other_project_cv) { create(:custom_value, customized: create(:project), custom_field:) } + + it "returns only values for the given project" do + expect(service.get_eager_loaded_project_custom_field_values_for(custom_field.id)) + .to eq([cv1, cv2, cv3]) + end + end end end end From c97abceaf0115d8142acdd703db48c4a3083a7e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 12:20:42 -0300 Subject: [PATCH 142/334] Bump immutable from 5.1.3 to 5.1.5 in /frontend (#22199) Bumps [immutable](https://github.com/immutable-js/immutable-js) from 5.1.3 to 5.1.5. - [Release notes](https://github.com/immutable-js/immutable-js/releases) - [Changelog](https://github.com/immutable-js/immutable-js/blob/main/CHANGELOG.md) - [Commits](https://github.com/immutable-js/immutable-js/compare/v5.1.3...v5.1.5) --- updated-dependencies: - dependency-name: immutable dependency-version: 5.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4a496768efa..3ea29719135 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -16154,9 +16154,9 @@ } }, "node_modules/immutable": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", - "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "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 }, "node_modules/import-fresh": { @@ -36226,9 +36226,9 @@ "optional": true }, "immutable": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", - "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "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": { From 743692c8bebed44226a7596bb3de5e92f29a3259 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:21:03 +0100 Subject: [PATCH 143/334] bump aws-partitions --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4f6b17ce396..c3072b991c2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -342,7 +342,7 @@ GEM awesome_nested_set (3.9.0) activerecord (>= 4.0.0, < 8.2) aws-eventstream (1.4.0) - aws-partitions (1.1220.0) + aws-partitions (1.1221.0) aws-sdk-core (3.242.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -1817,7 +1817,7 @@ CHECKSUMS auto_strip_attributes (2.6.0) sha256=a7e2e0cf744de2bcd947fd68014220702bcc88c81274c1cd9ce6f7316aae39b0 awesome_nested_set (3.9.0) sha256=3ce99e816550f97f4de118e621630070aacf24928b920fe4a68846578a8daaed aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b - aws-partitions (1.1220.0) sha256=1567da9ae45cba28e1d31f5e996928b2eb92ad01700000846d6d90043be8670f + aws-partitions (1.1221.0) sha256=f09304480191f5ff03f8994705067779bc8fe5b4731183ce45f092afb706e8eb aws-sdk-core (3.242.0) sha256=c17b3003acc78d80c1a8437b285a1cfc5e4d7749ce7821cf3071e847535a29a0 aws-sdk-kms (1.122.0) sha256=47ce3f51b26bd7d76f1270cfdfca17b40073ecd3219c8c9400788712abfb4eb8 aws-sdk-s3 (1.213.0) sha256=af596ccf544582406db610e95cc9099276eaf03142f57a2f30f76940e598e50d From 3ecd145f7b0f92005ab98e9f37fa380e6ee3cf77 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:21:13 +0100 Subject: [PATCH 144/334] bump aws-sdk-s3 --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c3072b991c2..96ed6129053 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -354,7 +354,7 @@ GEM aws-sdk-kms (1.122.0) aws-sdk-core (~> 3, >= 3.241.4) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.213.0) + aws-sdk-s3 (1.214.0) aws-sdk-core (~> 3, >= 3.241.4) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -1820,7 +1820,7 @@ CHECKSUMS aws-partitions (1.1221.0) sha256=f09304480191f5ff03f8994705067779bc8fe5b4731183ce45f092afb706e8eb aws-sdk-core (3.242.0) sha256=c17b3003acc78d80c1a8437b285a1cfc5e4d7749ce7821cf3071e847535a29a0 aws-sdk-kms (1.122.0) sha256=47ce3f51b26bd7d76f1270cfdfca17b40073ecd3219c8c9400788712abfb4eb8 - aws-sdk-s3 (1.213.0) sha256=af596ccf544582406db610e95cc9099276eaf03142f57a2f30f76940e598e50d + aws-sdk-s3 (1.214.0) sha256=923135327634c873ecedbd8f396ea9939874d524b14fa65eced766660c8dd62e aws-sdk-sns (1.112.0) sha256=aff1b1b5bbcb4229599221c558a41790c1cd1a1fed47ac3d27d27512ad24b254 aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00 axe-core-api (4.11.1) sha256=a6460506449a692030620a0574fee7afa6cd38cfbbf6620d20bf4d53d33a80cc From 19086ffede3b19e6e0b5639a92b99b0a2652b545 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:21:35 +0100 Subject: [PATCH 145/334] bump brakeman --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 96ed6129053..ddc3e1f7802 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -390,7 +390,7 @@ GEM bindata (2.5.1) bootsnap (1.23.0) msgpack (~> 1.2) - brakeman (8.0.2) + brakeman (8.0.4) racc browser (6.2.0) builder (3.3.0) @@ -1833,7 +1833,7 @@ CHECKSUMS bigdecimal (3.3.1) sha256=eaa01e228be54c4f9f53bf3cc34fe3d5e845c31963e7fcc5bedb05a4e7d52218 bindata (2.5.1) sha256=53186a1ec2da943d4cb413583d680644eb810aacbf8902497aac8f191fad9e58 bootsnap (1.23.0) sha256=c1254f458d58558b58be0f8eb8f6eec2821456785b7cdd1e16248e2020d3f214 - brakeman (8.0.2) sha256=7b02065ce8b1de93949cefd3f2ad78e8eb370e644b95c8556a32a912a782426a + brakeman (8.0.4) sha256=7bf921fa9638544835df9aa7b3e720a9a72c0267f34f92135955edd80d4dcf6f browser (6.2.0) sha256=281d5295788825c9396427c292c2d2be0a5c91875c93c390fde6e5d61a5ace2d budgets (1.0.0) builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f From 51858a4f72dde04e1817afe23221ed686e48edbb Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:22:12 +0100 Subject: [PATCH 146/334] bump dry-schema --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index ddc3e1f7802..020643ad265 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -506,13 +506,13 @@ GEM concurrent-ruby (~> 1.0) dry-core (~> 1.1) zeitwerk (~> 2.6) - dry-schema (1.15.0) + dry-schema (1.16.0) concurrent-ruby (~> 1.0) dry-configurable (~> 1.0, >= 1.0.1) dry-core (~> 1.1) dry-initializer (~> 3.2) dry-logic (~> 1.6) - dry-types (~> 1.8) + dry-types (~> 1.9, >= 1.9.1) zeitwerk (~> 2.6) dry-types (1.9.1) bigdecimal (>= 3.0) @@ -1891,7 +1891,7 @@ CHECKSUMS dry-initializer (3.2.0) sha256=37d59798f912dc0a1efe14a4db4a9306989007b302dcd5f25d0a2a20c166c4e3 dry-logic (1.6.0) sha256=da6fedbc0f90fc41f9b0cc7e6f05f5d529d1efaef6c8dcc8e0733f685745cea2 dry-monads (1.9.0) sha256=9348a67b5c862c7a876342dbd94737fdf3fb3c17978382cf6801a85b27215816 - dry-schema (1.15.0) sha256=0f2a34adba4206bd6d46ec1b6b7691b402e198eecaff1d8349a7d48a77d82cd2 + dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 dry-validation (1.11.1) sha256=70900bb5a2d911c8aab566d3e360c6bff389b8bf92ea8e04885ce51c41ff8085 dumb_delegator (1.1.0) sha256=1ad255e5b095a2206a574c62b40c678f3d5c9151f1b3d0bae1b0463f7e40188e From f0a61ad3e8e06183d00fc3d610b0ca94e893b896 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:22:23 +0100 Subject: [PATCH 147/334] bump excon --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 020643ad265..7424fcd2566 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -558,7 +558,7 @@ GEM tzinfo eventmachine (1.2.7) eventmachine_httpserver (0.2.1) - excon (1.3.2) + excon (1.4.0) logger factory_bot (6.5.6) activesupport (>= 6.1.0) @@ -1908,7 +1908,7 @@ CHECKSUMS et-orbi (1.4.0) sha256=6c7e3c90779821f9e3b324c5e96fda9767f72995d6ae435b96678a4f3e2de8bc eventmachine (1.2.7) sha256=994016e42aa041477ba9cff45cbe50de2047f25dd418eba003e84f0d16560972 eventmachine_httpserver (0.2.1) sha256=5db5e8a23754204d43592e5fcc2160457c57c870babe6307c4e61fc95019b809 - excon (1.3.2) sha256=a089babe98638e58042a7d542b2bbd183304527e33d612b6dde22fa491a544a5 + excon (1.4.0) sha256=5d2bc9d2c79511a562e7fcac77cc7a40acd9cebcc55b80e537975ad8187f2924 factory_bot (6.5.6) sha256=12beb373214dccc086a7a63763d6718c49769d5606f0501e0a4442676917e077 factory_bot_rails (6.5.1) sha256=d3cc4851eae4dea8a665ec4a4516895045e710554d2b5ac9e68b94d351bc6d68 faraday (2.14.1) sha256=a43cceedc1e39d188f4d2cdd360a8aaa6a11da0c407052e426ba8d3fb42ef61c From b8780355e38829c7a717b60410dd288624132b67 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:22:44 +0100 Subject: [PATCH 148/334] bump google-protobuf --- Gemfile.lock | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7424fcd2566..7ef128902c1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -640,27 +640,27 @@ GEM base64 (~> 0.2) faraday (>= 1.0, < 3.a) google-logging-utils (0.2.0) - google-protobuf (4.33.5) + google-protobuf (4.34.0) bigdecimal - rake (>= 13) - google-protobuf (4.33.5-aarch64-linux-gnu) + rake (~> 13.3) + google-protobuf (4.34.0-aarch64-linux-gnu) bigdecimal - rake (>= 13) - google-protobuf (4.33.5-aarch64-linux-musl) + rake (~> 13.3) + google-protobuf (4.34.0-aarch64-linux-musl) bigdecimal - rake (>= 13) - google-protobuf (4.33.5-arm64-darwin) + rake (~> 13.3) + google-protobuf (4.34.0-arm64-darwin) bigdecimal - rake (>= 13) - google-protobuf (4.33.5-x86_64-darwin) + rake (~> 13.3) + google-protobuf (4.34.0-x86_64-darwin) bigdecimal - rake (>= 13) - google-protobuf (4.33.5-x86_64-linux-gnu) + rake (~> 13.3) + google-protobuf (4.34.0-x86_64-linux-gnu) bigdecimal - rake (>= 13) - google-protobuf (4.33.5-x86_64-linux-musl) + rake (~> 13.3) + google-protobuf (4.34.0-x86_64-linux-musl) bigdecimal - rake (>= 13) + rake (~> 13.3) googleapis-common-protos-types (1.22.0) google-protobuf (~> 4.26) googleauth (1.16.1) @@ -1941,13 +1941,13 @@ CHECKSUMS google-apis-gmail_v1 (0.47.0) sha256=3064434b6da55b85e2828ce4bb0f4d04e8cfd187a4ab262ceb1dcb01f98e49ef google-cloud-env (2.3.1) sha256=0faac01eb27be78c2591d64433663b1a114f8f7af55a4f819755426cac9178e7 google-logging-utils (0.2.0) sha256=675462b4ea5affa825a3442694ca2d75d0069455a1d0956127207498fca3df7b - google-protobuf (4.33.5) sha256=1b64fb774c101b23ac3f6923eca24be04fd971635d235c4cd4cfe0d752620da0 - google-protobuf (4.33.5-aarch64-linux-gnu) sha256=f70ca066e37a7ac60b4f34a836bb48ca3fc41a9371310052e484d8c9f925ff39 - google-protobuf (4.33.5-aarch64-linux-musl) sha256=d9ae90025f05db642e5603de5dbb2390cd1215bac7507fa575cc20b0db7e11a1 - google-protobuf (4.33.5-arm64-darwin) sha256=996d4e93c4232cc42f0facd821a92b4f4a926c3c9c1a768e7d768b33d9ef72f9 - google-protobuf (4.33.5-x86_64-darwin) sha256=173d1d6c9f0de93fd9ee25fde172d6fb6376099dca8844e19bc5782bbc7b93b0 - google-protobuf (4.33.5-x86_64-linux-gnu) sha256=a782adf86bfba207740b49d7bb9ccdc25c4fb8f800fe222af62bce951149338a - google-protobuf (4.33.5-x86_64-linux-musl) sha256=d14feec9118f44cfdc3ee4a1d1baa4e6dd77fa418967ccf22ecbe76b8c1bacbf + google-protobuf (4.34.0) sha256=bffaea30fbe2807c80667a78953b15645b3bef62b25c10ca187e4418119be531 + google-protobuf (4.34.0-aarch64-linux-gnu) sha256=0ab8a8a97976a2265d647e69b3ff1980c89184abdaf06d36091856c5ab37cc55 + google-protobuf (4.34.0-aarch64-linux-musl) sha256=0632a86df6d320eac3b335bd779499d43ad8ee6d1f8c8494b773ed5d3d5c6ab4 + google-protobuf (4.34.0-arm64-darwin) sha256=f83967a8095a9da676b79ba372c58fef2ca3878428bd40febfce65b3752c90d1 + google-protobuf (4.34.0-x86_64-darwin) sha256=4a5b67281993345adca54bb32947f25a289597eafaa240e5b714d0a740f99321 + google-protobuf (4.34.0-x86_64-linux-gnu) sha256=bbb333fbe79c16f35a2e2154cf29f3ce26f60390dba286b339861206d5435ef9 + google-protobuf (4.34.0-x86_64-linux-musl) sha256=0b75858a388b17e73aa4176df2e722762dbc92551b7075fdc562d33c1c6de0b0 googleapis-common-protos-types (1.22.0) sha256=f97492b77bd6da0018c860d5004f512fe7cd165554d7019a8f4df6a56fbfc4c7 googleauth (1.16.1) sha256=36776bce9d55d8c1a0c6638c939b000dcee5954ca5b728f06ec4c2df4a46709c grape (3.1.1) sha256=774f16782d917a90e69de0499dfaab571e5ad967569ac066a2b0b918af12de69 From 4ed8be5ab8fd40efdcac3d843d74d90ee63dd7c5 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:22:55 +0100 Subject: [PATCH 149/334] bump googleauth --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7ef128902c1..4880567bb07 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -663,7 +663,7 @@ GEM rake (~> 13.3) googleapis-common-protos-types (1.22.0) google-protobuf (~> 4.26) - googleauth (1.16.1) + googleauth (1.16.2) faraday (>= 1.0, < 3.a) google-cloud-env (~> 2.2) google-logging-utils (~> 0.1) @@ -1949,7 +1949,7 @@ CHECKSUMS google-protobuf (4.34.0-x86_64-linux-gnu) sha256=bbb333fbe79c16f35a2e2154cf29f3ce26f60390dba286b339861206d5435ef9 google-protobuf (4.34.0-x86_64-linux-musl) sha256=0b75858a388b17e73aa4176df2e722762dbc92551b7075fdc562d33c1c6de0b0 googleapis-common-protos-types (1.22.0) sha256=f97492b77bd6da0018c860d5004f512fe7cd165554d7019a8f4df6a56fbfc4c7 - googleauth (1.16.1) sha256=36776bce9d55d8c1a0c6638c939b000dcee5954ca5b728f06ec4c2df4a46709c + googleauth (1.16.2) sha256=15009502e2e38af71948cda918f230e27d327f6882a1e47967a5a4664930a638 grape (3.1.1) sha256=774f16782d917a90e69de0499dfaab571e5ad967569ac066a2b0b918af12de69 grape_logging (3.0.0) sha256=7b62d984ce96df15d120508668debe307e6a59ac1c511f1d9b5f3b4bea793e13 gravatar_image_tag (1.2.0) sha256=eb5630fea846b711e713b934a0178fb9785f02f4eb9ced8d6faa4d537c40fdcf From 3befbd3a457ffc2d1fe29b57f8d47131c1c33ac8 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:23:23 +0100 Subject: [PATCH 150/334] bump http-2 --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4880567bb07..a0a9f5b85d2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -695,7 +695,7 @@ GEM htmlbeautifier (1.4.3) htmldiff (0.0.1) htmlentities (4.3.4) - http-2 (1.1.2) + http-2 (1.1.3) http_parser.rb (0.8.1) httpx (1.6.3) http-2 (>= 1.0.0) @@ -1963,7 +1963,7 @@ CHECKSUMS htmlbeautifier (1.4.3) sha256=b43d08f7e2aa6ae1b5a6f0607b4ed8954c8d4a8e85fd2336f975dda1e4db385b htmldiff (0.0.1) sha256=a96d068c8b8ea96cca3154a61785365d83129f47f1df964c6b1666924ce113a1 htmlentities (4.3.4) sha256=125a73c6c9f2d1b62100b7c3c401e3624441b663762afa7fe428476435a673da - http-2 (1.1.2) sha256=8c1cb40203fc60b521c491509fee96c7b08092975eb30036465992433715ed40 + http-2 (1.1.3) sha256=1b2f379d35a11dbae94f8a1a52c053d8c161eb4a0c98b5d1605ff1b2bf171c9c http_parser.rb (0.8.1) sha256=9ae8df145b39aa5398b2f90090d651c67bd8e2ebfe4507c966579f641e11097a httpx (1.6.3) sha256=1b4a11b9572b78839f649ad6ebbe09b5f467cc458e0ee408bddc902b273a2e8a i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5 From 4b1699b3914baa6634deaa3d0a118ad4502cc3de Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:23:57 +0100 Subject: [PATCH 151/334] bump lefthook --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index a0a9f5b85d2..689952bbf34 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -767,7 +767,7 @@ GEM addressable (~> 2.8) childprocess (~> 5.0) logger (~> 1.6) - lefthook (2.1.1) + lefthook (2.1.2) letter_opener (1.10.0) launchy (>= 2.2, < 4) letter_opener_web (3.0.0) @@ -1989,7 +1989,7 @@ CHECKSUMS ladle (1.0.1) sha256=e8586964108c798d48bf57d2a65bd5602e8e5223a176b6602a0fb36c0bda90dc language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc launchy (3.1.1) sha256=72b847b5cc961589dde2c395af0108c86ff0119f42d4648d25b5440ebb10059e - lefthook (2.1.1) sha256=1b4ce49fbadb3f6584c07daaa9164e560e27bb5aba18446bb9de2378fcf3f5b6 + lefthook (2.1.2) sha256=da5a2484d68ee00d7fcc7e072e925c0246363eb20d77499d536bea209ae6ae06 letter_opener (1.10.0) sha256=2ff33f2e3b5c3c26d1959be54b395c086ca6d44826e8bf41a14ff96fdf1bdbb2 letter_opener_web (3.0.0) sha256=3f391efe0e8b9b24becfab5537dfb17a5cf5eb532038f947daab58cb4b749860 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 From 39fb306a7f870956c9d58526070f8e3f6643caeb Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:24:25 +0100 Subject: [PATCH 152/334] bump mime-types-data --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 689952bbf34..a08c36bcb99 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -824,7 +824,7 @@ GEM mime-types (3.7.0) logger mime-types-data (~> 3.2025, >= 3.2025.0507) - mime-types-data (3.2026.0224) + mime-types-data (3.2026.0303) mini_magick (5.3.1) logger mini_mime (1.1.5) @@ -2009,7 +2009,7 @@ CHECKSUMS meta-tags (2.22.3) sha256=41ead5437140869717cbdd659cc6f1caa3e498b3e74b03ed63503b5b38ed504f method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5 mime-types (3.7.0) sha256=dcebf61c246f08e15a4de34e386ebe8233791e868564a470c3fe77c00eed5e56 - mime-types-data (3.2026.0224) sha256=bea02e0168b37f6935696c4fcfeb3374a0a62e82e6187af5f3f3b709bf67e5fd + mime-types-data (3.2026.0303) sha256=164af1de5824c5195d4b503b0a62062383b65c08671c792412450cd22d3bc224 mini_magick (5.3.1) sha256=29395dfd76badcabb6403ee5aff6f681e867074f8f28ce08d78661e9e4a351c4 mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef minitest (6.0.2) sha256=db6e57956f6ecc6134683b4c87467d6dd792323c7f0eea7b93f66bd284adbc3d From 1d9a2c5788753221d3bbe2a454d74f0d923a2b50 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:24:51 +0100 Subject: [PATCH 153/334] bump opentelemetry-instrumentation-dalli --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index a08c36bcb99..8c5c136a0f3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -991,7 +991,7 @@ GEM opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-concurrent_ruby (0.24.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-dalli (0.29.1) + opentelemetry-instrumentation-dalli (0.29.2) opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-delayed_job (0.25.1) opentelemetry-instrumentation-base (~> 0.25) @@ -2091,7 +2091,7 @@ CHECKSUMS opentelemetry-instrumentation-base (0.25.0) sha256=642a3a7f08354e6e969423327a4fa67ed2cca7ac6fe5ee09e55b17d1c576da27 opentelemetry-instrumentation-bunny (0.24.0) sha256=1ec484e48a5f42a1d0c33e8e6bc7e9e78dd80f3ed9d63520b8a22ba564aa2585 opentelemetry-instrumentation-concurrent_ruby (0.24.0) sha256=229bd8b72000c59de693609bb637b8a9114992f5e0ab03730d7fd7ef91f7d1d2 - opentelemetry-instrumentation-dalli (0.29.1) sha256=fd5957fc1289b4c2155b2ffddbcd3268fe29869a56a588eb6d71d4f93424da91 + opentelemetry-instrumentation-dalli (0.29.2) sha256=21b82772ced1529288c7f08285d44d5690de11f3d275e24558a062f39a270f4f opentelemetry-instrumentation-delayed_job (0.25.1) sha256=47f35b10d2bfd9ac7c2bbbe10dea095a2e25db2a84f5351860ead969d180c3ec opentelemetry-instrumentation-ethon (0.27.0) sha256=bfd2e34a5f34c7114727b0e0c9d441a1c6c7a4cceb8374d90ae9332f009f3968 opentelemetry-instrumentation-excon (0.27.0) sha256=3d7e6e160f0328e1136646aabb23efefdb125854637d5bd57b849720f783b5bb From 62641e248f59c79fbd2f337c30a22e5be807e352 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:25:00 +0100 Subject: [PATCH 154/334] bump opentelemetry-instrumentation-httpx --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8c5c136a0f3..6e83aa22580 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1013,7 +1013,7 @@ GEM opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-http_client (0.27.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-httpx (0.6.0) + opentelemetry-instrumentation-httpx (0.6.1) opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-koala (0.23.0) opentelemetry-instrumentation-base (~> 0.25) @@ -2102,7 +2102,7 @@ CHECKSUMS opentelemetry-instrumentation-gruf (0.5.0) sha256=ee21be36e312e71b847c9a87168225625890121140a364b68d3668e0df58dacd opentelemetry-instrumentation-http (0.28.0) sha256=0946a9593d64740780d16e041f9441945c4970b17566ce98e1a63bd3b276cacd opentelemetry-instrumentation-http_client (0.27.0) sha256=6a639a21296d3b6d3934b2d5465bee5d5f9180208d0329a5bbe34b374030690e - opentelemetry-instrumentation-httpx (0.6.0) sha256=a4ee129cb7d5ea690565585b6a5c7a1d181a1e239c5360ec4554c15ce2b3fd6d + opentelemetry-instrumentation-httpx (0.6.1) sha256=9050801826bb0f148f603b39b119c4f49591955ee53d3d0b2a8fb1eb8f558022 opentelemetry-instrumentation-koala (0.23.0) sha256=8f324b50a2a64fd4994bb2b105a4cb0c80b64ec05cf5487d2daa906c650bc6f9 opentelemetry-instrumentation-lmdb (0.25.0) sha256=1e4d66d583ea242d4f72051062971f5af1ea353484d224abbd0aabdd1ce5f5cb opentelemetry-instrumentation-mongo (0.25.0) sha256=d04585669f928ea82e7c469f996061d39d8ff184278d57cf4fc77a6d607f9c7a From 22e382fbb565a45afa40a33373132c2662fd1240 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:26:20 +0100 Subject: [PATCH 155/334] bump rspec-mocks --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6e83aa22580..2f58280c42b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1307,7 +1307,7 @@ GEM rspec-expectations (3.13.5) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-mocks (3.13.7) + rspec-mocks (3.13.8) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) rspec-rails (8.0.3) @@ -2213,7 +2213,7 @@ CHECKSUMS rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587 rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836 - rspec-mocks (3.13.7) sha256=0979034e64b1d7a838aaaddf12bf065ea4dc40ef3d4c39f01f93ae2c66c62b1c + rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47 rspec-rails (8.0.3) sha256=b0a440e7a10700317d898a014852e26660867298c4076dbc3baa99c768b79dc1 rspec-retry (0.6.2) sha256=6101ba23a38809811ae3484acde4ab481c54d846ac66d5037ccb40131a60d858 rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c From 43d67c18454fdd6fcb949dd849b80ed693dc29b4 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:26:30 +0100 Subject: [PATCH 156/334] bump rubocop --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2f58280c42b..06f377057e2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1323,7 +1323,7 @@ GEM rspec-support (3.13.7) rspec-wait (1.0.2) rspec (>= 3.4) - rubocop (1.85.0) + rubocop (1.85.1) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) @@ -2218,7 +2218,7 @@ CHECKSUMS rspec-retry (0.6.2) sha256=6101ba23a38809811ae3484acde4ab481c54d846ac66d5037ccb40131a60d858 rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c rspec-wait (1.0.2) sha256=865f921239325d3d26fc10ded4bdd485d8b58bcaaad1a28dd85ed15266b5a912 - rubocop (1.85.0) sha256=317407feb681a07d54f64d2f9e1d6b6af1ce7678e51cd658e3ad8bd66da48c01 + rubocop (1.85.1) sha256=3dbcf9e961baa4c376eeeb2a03913dca5e3987033b04d38fa538aa1e7406cc77 rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb From 372721fbbee6c1810e03d916b3195475419949d6 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:26:45 +0100 Subject: [PATCH 157/334] bump ruby-prof --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 06f377057e2..0fac5473e22 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1369,7 +1369,7 @@ GEM iso8601 ruby-next-core (1.2.0) ruby-ole (1.2.13.1) - ruby-prof (2.0.2) + ruby-prof (2.0.4) base64 ostruct ruby-progressbar (1.13.0) @@ -2230,7 +2230,7 @@ CHECKSUMS ruby-duration (3.2.3) sha256=eb3d13b1df85067a015a8fb2ed8f1eec842a3b721e47c9b6fd74d2f356069784 ruby-next-core (1.2.0) sha256=f6a7d00bb5186cecbb02f7f1845a0f3a2c9788d35b6ccff5c9be3f0d46799b86 ruby-ole (1.2.13.1) sha256=578d10dd2a797a2b35a1286c6fb2c9525f67c24791346fc8015d39f0ffa3cb72 - ruby-prof (2.0.2) sha256=c489dbf8b029d3107ff4b74db6c01939f71427f985f6bb449e1170ed24073d0e + ruby-prof (2.0.4) sha256=42190ff6870e055a9d58b39df63e83442113ef7169c0e27b599942c3f15d1435 ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby-rc4 (0.1.5) sha256=00cc40a39d20b53f5459e7ea006a92cf584e9bc275e2a6f7aa1515510e896c03 ruby-saml (1.18.1) sha256=1b0e7a44aef150b4197955f5e015d593672e242cfdc5d06aa7554ec2350b9107 From 09412e10cb9cff7c9bad70c0586f86779179b6fd Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:27:32 +0100 Subject: [PATCH 158/334] bump vernier --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0fac5473e22..b4c9fa5f3a8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1482,7 +1482,7 @@ GEM activemodel (>= 3.0.0) public_suffix vcr (6.4.0) - vernier (1.9.0) + vernier (1.10.0) view_component (4.4.0) actionview (>= 7.1.0) activesupport (>= 7.1.0) @@ -2291,7 +2291,7 @@ CHECKSUMS validate_email (0.1.6) sha256=9dfe9016d527b17a8d3a6e95e4dc50a125400eef899d13d4cc2a254393f82ee4 validate_url (1.0.15) sha256=72fe164c0713d63a9970bd6700bea948babbfbdcec392f2342b6704042f57451 vcr (6.4.0) sha256=077ac92cc16efc5904eb90492a18153b5e6ca5398046d8a249a7c96a9ea24ae6 - vernier (1.9.0) sha256=3aa6169804144ef27744123525f8f884541185a2eeb53c77afb28ad33c4be3cd + vernier (1.10.0) sha256=5b1dc57012e08ed23e14f4d2943540140d454aa8434c7c35e7eb97befd4969bf view_component (4.4.0) sha256=ecccecb495ee4b4a5d9f93382992dc32c11a0708fde5ec261150a0f5223393d0 virtus (2.0.0) sha256=8841dae4eb7fcc097320ba5ea516bf1839e5d056c61ee27138aa4bddd6e3d1c2 warden (1.2.9) sha256=46684f885d35a69dbb883deabf85a222c8e427a957804719e143005df7a1efd0 From 48d6a3d516d7e453ae14aa710007ca671e21a506 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:27:51 +0100 Subject: [PATCH 159/334] bump yabeda --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b4c9fa5f3a8..bc91052be18 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1523,7 +1523,7 @@ GEM zeitwerk (>= 2.7) xpath (3.2.0) nokogiri (~> 1.8) - yabeda (0.14.0) + yabeda (0.15.0) anyway_config (>= 1.0, < 3) concurrent-ruby dry-initializer @@ -2306,7 +2306,7 @@ CHECKSUMS will_paginate (4.0.1) sha256=107b226ebe1d393d274575956a7c472e1eefdd97d8828e01b72d425d15a875b9 with_advisory_lock (7.5.0) sha256=dadb2f1ed35a10ed7b9649a6769e6848bc64f735a85eb8a6e162a81d383a15bf xpath (3.2.0) sha256=6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e - yabeda (0.14.0) sha256=bc517bf22d692ebd80a29fc9fd2246c257aaf92d10b2735a775e2419351a43bf + yabeda (0.15.0) sha256=81ce61c6e89d42ac3c5855aa2dcddfc2347c33d1595372d59d79e7dda4e72238 yabeda-activerecord (0.1.2) sha256=1dd281a64e5742445a6718aa05e799ea08a397e9ab9c0d254ece447635a3e0e2 yabeda-prometheus-mmap (0.4.0) sha256=1a66120756d6f931f03a7784e08e79060d71681ff83a9f5287df2ff756e9e2c9 yabeda-puma-plugin (0.9.0) sha256=b78673ecc7ee30bc50691ddc41b7022c1c1801843900d5101418f4a14b550bc8 From b4390304522236c11f1b98434ba5397fc255b08a Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:31:14 +0100 Subject: [PATCH 160/334] bump doorkeeper --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 57989caa52a..67dd0151b07 100644 --- a/Gemfile +++ b/Gemfile @@ -50,7 +50,7 @@ gem "connection_pool", "~> 3.0.2" gem "rdoc", ">= 2.4.2" -gem "doorkeeper", "~> 5.8.0" +gem "doorkeeper", "~> 5.9.0" # Maintain our own omniauth due to relative URL root issues # see upstream PR: https://github.com/omniauth/omniauth/pull/903 gem "omniauth", git: "https://github.com/opf/omniauth", ref: "7eb21563ba047ef86d71f099975587b5ec88f9c9" diff --git a/Gemfile.lock b/Gemfile.lock index bc91052be18..b659825f368 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -479,7 +479,7 @@ GEM disposable (0.6.3) declarative (>= 0.0.9, < 1.0.0) representable (>= 3.1.1, < 4) - doorkeeper (5.8.2) + doorkeeper (5.9.0) railties (>= 5) dotenv (3.2.0) dotenv-rails (3.2.0) @@ -1603,7 +1603,7 @@ DEPENDENCIES deckar01-task_list (~> 2.3.1) dentaku (~> 3.5) disposable (~> 0.6.2) - doorkeeper (~> 5.8.0) + doorkeeper (~> 5.9.0) dotenv-rails dry-container dry-monads @@ -1880,7 +1880,7 @@ CHECKSUMS descendants_tracker (0.0.4) sha256=e9c41dd4cfbb85829a9301ea7e7c48c2a03b26f09319db230e6479ccdc780897 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 disposable (0.6.3) sha256=7f2a3fb251bff6cd83f25b164043d4ec3531209b51b066ed476a9df9c2d384cc - doorkeeper (5.8.2) sha256=a73d07aeaf590b1e7e2a35390446f23131c9f37bc0561653e514d3973f4d50d3 + doorkeeper (5.9.0) sha256=edad053b3dcb6bf51e3181fc423333e7fba28863beb2122379643ce6463b6336 dotenv (3.2.0) sha256=e375b83121ea7ca4ce20f214740076129ab8514cd81378161f11c03853fe619d dotenv-rails (3.2.0) sha256=657e25554ba622ffc95d8c4f1670286510f47f2edda9f68293c3f661b303beab drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373 From b725c4288bb8ca692a72bdfec7e5f4c5a221534e Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:32:03 +0100 Subject: [PATCH 161/334] bump mcp --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 67dd0151b07..abae51cb781 100644 --- a/Gemfile +++ b/Gemfile @@ -161,7 +161,7 @@ gem "ttfunk", "~> 1.7.0" # remove after https://github.com/prawnpdf/prawn/issues # prawn implicitly depends on matrix gem no longer in ruby core with 3.1 gem "matrix", "~> 0.4.3" -gem "mcp", "~> 0.7.0" +gem "mcp", "~> 0.8.0" gem "meta-tags", "~> 2.22.3" diff --git a/Gemfile.lock b/Gemfile.lock index b659825f368..6f8f6ce6a1a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -814,7 +814,7 @@ GEM marcel (1.0.4) markly (0.15.2) matrix (0.4.3) - mcp (0.7.1) + mcp (0.8.0) json-schema (>= 4.1) messagebird-rest (5.0.0) jwt (< 4) @@ -1648,7 +1648,7 @@ DEPENDENCIES mail (= 2.9.0) markly (~> 0.15) matrix (~> 0.4.3) - mcp (~> 0.7.0) + mcp (~> 0.8.0) md_to_pdf! meta-tags (~> 2.22.3) mini_magick (~> 5.3.0) @@ -2003,7 +2003,7 @@ CHECKSUMS marcel (1.0.4) sha256=0d5649feb64b8f19f3d3468b96c680bae9746335d02194270287868a661516a4 markly (0.15.2) sha256=65dae965d4dd4ecd997fba43b93acc0fe7dadfec6f07a748640c7a9299a8551e matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b - mcp (0.7.1) sha256=fa967895d6952bad0d981ea907731d8528d2c246d2079d56a9c8bae83d14f1c7 + mcp (0.8.0) sha256=ae8bd146bb8e168852866fd26f805f52744f6326afb3211e073f78a95e0c34fb md_to_pdf (0.2.5) messagebird-rest (5.0.0) sha256=da4cc1efba3d5e4aa021fad07426c2cb6b326ce5670da5104bb8f6056a39d59c meta-tags (2.22.3) sha256=41ead5437140869717cbdd659cc6f1caa3e498b3e74b03ed63503b5b38ed504f From 6d92ae8a038898d0aed55a2fe4c004d9c8fa14be Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:33:07 +0100 Subject: [PATCH 162/334] bump view_component --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index abae51cb781..a4a6bc46825 100644 --- a/Gemfile +++ b/Gemfile @@ -239,7 +239,7 @@ gem "opentelemetry-exporter-otlp", "~> 0.31.0", require: false gem "opentelemetry-instrumentation-all", "~> 0.90.0", require: false gem "opentelemetry-sdk", "~> 1.10", require: false -gem "view_component", "~> 4.4.0" +gem "view_component", "~> 4.5.0" # Lookbook gem "lookbook", "2.3.14" diff --git a/Gemfile.lock b/Gemfile.lock index 6f8f6ce6a1a..326c073ba1c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1483,7 +1483,7 @@ GEM public_suffix vcr (6.4.0) vernier (1.10.0) - view_component (4.4.0) + view_component (4.5.0) actionview (>= 7.1.0) activesupport (>= 7.1.0) concurrent-ruby (~> 1) @@ -1771,7 +1771,7 @@ DEPENDENCIES validate_url vcr vernier - view_component (~> 4.4.0) + view_component (~> 4.5.0) warden (~> 1.2) warden-basic_auth (~> 0.2.1) webmock (~> 3.26) @@ -2292,7 +2292,7 @@ CHECKSUMS validate_url (1.0.15) sha256=72fe164c0713d63a9970bd6700bea948babbfbdcec392f2342b6704042f57451 vcr (6.4.0) sha256=077ac92cc16efc5904eb90492a18153b5e6ca5398046d8a249a7c96a9ea24ae6 vernier (1.10.0) sha256=5b1dc57012e08ed23e14f4d2943540140d454aa8434c7c35e7eb97befd4969bf - view_component (4.4.0) sha256=ecccecb495ee4b4a5d9f93382992dc32c11a0708fde5ec261150a0f5223393d0 + view_component (4.5.0) sha256=0d951360d830752da4d1daa5f6cb643f17c30f295fb779fd4de90a051537d9c1 virtus (2.0.0) sha256=8841dae4eb7fcc097320ba5ea516bf1839e5d056c61ee27138aa4bddd6e3d1c2 warden (1.2.9) sha256=46684f885d35a69dbb883deabf85a222c8e427a957804719e143005df7a1efd0 warden-basic_auth (0.2.1) sha256=bfc752e0109c0182c3e69e930284c5e1e81e7b4a354aeb2b5914ead1391f3c6e From 38e0f3c2ce8c66f2bd8b52a8a0d2e5d52e9362ad Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 5 Mar 2026 18:33:51 +0100 Subject: [PATCH 163/334] bump tzinfo-data --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index a4a6bc46825..bb618b931be 100644 --- a/Gemfile +++ b/Gemfile @@ -78,7 +78,7 @@ gem "addressable", "~> 2.8.9" gem "auto_strip_attributes", "~> 2.5" # Provide timezone info for TZInfo used by AR -gem "tzinfo-data", "~> 1.2025.1" +gem "tzinfo-data", "~> 1.2026.1" # to generate html-diffs (e.g. for wiki comparison) gem "htmldiff" diff --git a/Gemfile.lock b/Gemfile.lock index 326c073ba1c..497a63b8c42 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1467,7 +1467,7 @@ GEM turbo-rails (>= 1.3.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2025.3) + tzinfo-data (1.2026.1) tzinfo (>= 1.0.0) uber (0.1.0) unicode-display_width (3.2.0) @@ -1767,7 +1767,7 @@ DEPENDENCIES turbo-rails (~> 2.0.20) turbo_power (~> 0.7.0) turbo_tests! - tzinfo-data (~> 1.2025.1) + tzinfo-data (~> 1.2026.1) validate_url vcr vernier @@ -2282,7 +2282,7 @@ CHECKSUMS turbo_power (0.7.0) sha256=ad95d147e0fa761d0023ad9ca00528c7b7ddf6bba8ca2e23755d5b21b290d967 turbo_tests (2.2.0) tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b - tzinfo-data (1.2025.3) sha256=b546e2f1e5e5c40a0c619aafb24e30d3d6a128c2f689278f721b7286dd499562 + tzinfo-data (1.2026.1) sha256=4ea36519ae5ae2cf0fad471207a519be006daf42e3b2359ee9e9c53f113609fd uber (0.1.0) sha256=5beeb407ff807b5db994f82fa9ee07cfceaa561dad8af20be880bc67eba935dc unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f From 61162891b80507e97e3252026180d59d99a7f9a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:18:40 -0300 Subject: [PATCH 164/334] Bump googleauth from 1.16.1 to 1.16.2 (#22179) Bumps [googleauth](https://github.com/googleapis/google-auth-library-ruby) from 1.16.1 to 1.16.2. - [Release notes](https://github.com/googleapis/google-auth-library-ruby/releases) - [Changelog](https://github.com/googleapis/google-auth-library-ruby/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-auth-library-ruby/compare/googleauth/v1.16.1...googleauth/v1.16.2) --- updated-dependencies: - dependency-name: googleauth dependency-version: 1.16.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4f6b17ce396..21fd3781e30 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -663,7 +663,7 @@ GEM rake (>= 13) googleapis-common-protos-types (1.22.0) google-protobuf (~> 4.26) - googleauth (1.16.1) + googleauth (1.16.2) faraday (>= 1.0, < 3.a) google-cloud-env (~> 2.2) google-logging-utils (~> 0.1) @@ -1949,7 +1949,7 @@ CHECKSUMS google-protobuf (4.33.5-x86_64-linux-gnu) sha256=a782adf86bfba207740b49d7bb9ccdc25c4fb8f800fe222af62bce951149338a google-protobuf (4.33.5-x86_64-linux-musl) sha256=d14feec9118f44cfdc3ee4a1d1baa4e6dd77fa418967ccf22ecbe76b8c1bacbf googleapis-common-protos-types (1.22.0) sha256=f97492b77bd6da0018c860d5004f512fe7cd165554d7019a8f4df6a56fbfc4c7 - googleauth (1.16.1) sha256=36776bce9d55d8c1a0c6638c939b000dcee5954ca5b728f06ec4c2df4a46709c + googleauth (1.16.2) sha256=15009502e2e38af71948cda918f230e27d327f6882a1e47967a5a4664930a638 grape (3.1.1) sha256=774f16782d917a90e69de0499dfaab571e5ad967569ac066a2b0b918af12de69 grape_logging (3.0.0) sha256=7b62d984ce96df15d120508668debe307e6a59ac1c511f1d9b5f3b4bea793e13 gravatar_image_tag (1.2.0) sha256=eb5630fea846b711e713b934a0178fb9785f02f4eb9ced8d6faa4d537c40fdcf From 9ed1b60e0f41f7c84884b672871e5fa1ba5fb069 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 19:18:34 -0300 Subject: [PATCH 165/334] Bump dompurify from 3.3.1 to 3.3.2 (#22223) Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.3.1 to 3.3.2. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.3.1...3.3.2) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.3.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5c9d870c25d..cd5b9d00cbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1040,11 +1040,13 @@ "dev": true }, "node_modules/dompurify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", - "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.2.tgz", + "integrity": "sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==", "dev": true, - "license": "(MPL-2.0 OR Apache-2.0)", + "engines": { + "node": ">=20" + }, "optionalDependencies": { "@types/trusted-types": "^2.0.7" } From c8ff594de85f680d664e4b24c3bde426a703f93c Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Fri, 6 Mar 2026 02:49:12 +0000 Subject: [PATCH 166/334] update locales from crowdin [ci skip] --- config/locales/crowdin/de.yml | 6 +- config/locales/crowdin/js-fr.yml | 4 +- config/locales/crowdin/pl.yml | 74 ++-- config/locales/crowdin/pt-PT.yml | 404 +++++++++--------- .../backlogs/config/locales/crowdin/fr.yml | 32 +- .../backlogs/config/locales/crowdin/js-fr.yml | 2 +- .../config/locales/crowdin/js-pt-PT.yml | 4 +- .../backlogs/config/locales/crowdin/pl.yml | 2 +- .../backlogs/config/locales/crowdin/pt-PT.yml | 82 ++-- modules/budgets/config/locales/crowdin/pl.yml | 31 +- .../budgets/config/locales/crowdin/pt-PT.yml | 36 +- modules/costs/config/locales/crowdin/pl.yml | 2 +- .../costs/config/locales/crowdin/pt-PT.yml | 18 +- .../config/locales/crowdin/pt-PT.yml | 6 +- .../grids/config/locales/crowdin/js-pt-PT.yml | 4 +- modules/meeting/config/locales/crowdin/pl.yml | 16 +- .../meeting/config/locales/crowdin/pt-PT.yml | 54 +-- 17 files changed, 382 insertions(+), 395 deletions(-) diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 5aea07ba291..82576e664ce 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -1354,9 +1354,9 @@ de: jira_import: projects: "Projekte" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Name der Jira-Instanz" + url: "URL der Jira-Instanz" + personal_access_token: "Persönlicher Zugangs-Token" announcements: show_until: "Anzeigen bis" attachment: diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml index 27c30489db1..4b338ea6c65 100644 --- a/config/locales/crowdin/js-fr.yml +++ b/config/locales/crowdin/js-fr.yml @@ -513,10 +513,10 @@ fr: wiki: "Dans le wiki vous pouvez documenter et partager vos connaissances avec votre équipe." backlogs: overview: "Gérez votre travail dans la vue backlogs." - sprints: "Sur la droite, vous avez le backlog de produit et le backlog des bugs. Sur la gauche, vous avez leurs sprints respectifs. Ici, vous pouvez créer des épopées, histoires d'utilisateurs et bugs, prioriser via glisser-déposer et les ajouter à un sprint." + sprints: "Sur la droite, vous avez le backlog de produit et le backlog des bugs. Sur la gauche, vous avez leurs sprints respectifs. Ici, vous pouvez créer des epics, user stories et bugs, les prioriser via glisser-déposer et les ajouter à un sprint." task_board_arrow: "Pour voir votre Tableau de bord des Tâches, ouvrez le menu déroulant Sprint..." task_board_select: "…et sélectionnez l'entrée Tableau de bord des Tâches." - task_board: "Le tableau des tâches visualise la progression pour ce sprint. Cliquez sur l'icône plus (+) à côté d'un récit utilisateur pour ajouter de nouvelles tâches ou obstacles.
Le statut peut être mis à jour par glisser-déposer." + task_board: "Le tableau des tâches visualise la progression pour ce sprint. Cliquez sur l'icône plus (+) à côté d'une user story pour ajouter de nouvelles tâches ou de nouveaux obstacles.
Le statut peut être mis à jour par glisser-déposer." boards: overview: "Sélectionnez tableaux pour déplacer la vue et gérer votre projet en utilisant la vue des tableaux agiles." lists_kanban: "Ici, vous pouvez créer plusieurs listes (colonnes) dans votre tableau. Cette fonctionnalité vous permet de créer un tableau Kanban, par exemple." diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 279c1fdef47..4dc4fc6792b 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -125,7 +125,7 @@ pl: new: "Nowa konfiguracja" banner: title: "Ograniczony import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "To narzędzie importu jest obecnie w wersji beta i może importować tylko podstawowe dane: projekty, zgłoszenia problemów (nazwa, tytuł, opis, załączniki), użytkowników (nazwa, adres e-mail, członkostwo w projekcie), statusy i typy. Nie może importować przepływów pracy, pól niestandardowych, relacji między problemami ani uprawnień. Obecnie obsługujemy tylko serwery / centra danych Jira w wersjach 10.x i 11.x. Wystąpienia w chmurze nie są obecnie obsługiwane." form: fields: name: "Nazwa" @@ -143,7 +143,7 @@ pl: failed: "Połączenie nie powiodło się: nie można pobrać informacji o serwerze" error: "Podczas testowania połączenia wystąpił nieoczekiwany błąd" connection_error: "Błąd połączenia: %{message}" - parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." + parse_error: "Nie udało się przeanalizować odpowiedzi z serwera. Serwer może nie być prawidłowym wystąpieniem usługi Jira." api_error: "Interfejs API Jira zwrócił status błędu %{status}. Sprawdź adres URL wystąpienia usługi Jira i token interfejsu API." token_error: "Nieprawidłowy token interfejsu API. Sprawdź swoje dane poświadczenia w konfiguracji." missing_credentials: "Aby przetestować połączenie, podaj zarówno adres URL, jak i osobisty token dostępu" @@ -167,7 +167,7 @@ pl: title: "Nie skonfigurowano jeszcze żadnych uruchomień importu" description: "Utwórz uruchomienie importu, aby rozpocząć importowanie informacji z tego wystąpienia usługi Jira" 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." + description: "Przy każdym uruchomieniu importu możesz importować różne zestawy danych. Cofnięcie uruchomionego importu możliwe jest natychmiast po przejściu z trybu przeglądu, ale nie po sfinalizowaniu importu." button_import_run: "Uruchomienie importu" button_edit_configuration: "Edytuj konfigurację" status: @@ -234,8 +234,8 @@ pl: fetch_data: title: "Pobierz metadane wystąpienia" caption_done: "Ukończono" - description: "Check what data is available for import in the host Jira instance." - button_fetch: "Check available data" + description: "Sprawdź, jakie dane są dostępne do importu w wystąpieniu hosta Jira." + button_fetch: "Sprawdź dostępne dane" label_progress: "Pobieranie danych z Jira..." groups_and_users: title: "Grupy i użytkownicy" @@ -243,8 +243,8 @@ pl: title: "Zakres importu" caption: "Wybierz co chcesz zaimportować do OpenProject" caption_done: "Ukończono" - 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 URL 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_info: "Pamiętaj, że to narzędzie importu jest w wersji beta i nie może importować wszystkich typów danych. Poniżej znajduje się podsumowanie tego, co adres URL wystąpienia hosta Jira oferuje do importu i co to narzędzie jest obecnie w stanie zaimportować." + description: "Wybierz dane, które chcesz zaimportować z dostępnych danych pobranych z hosta wystąpienia Jira." label_available_data: "Dostępne dane" label_not_available_data: "Niedostępne do importu" button_select_projects: "Wybierz projekty do zaimportowania" @@ -255,11 +255,11 @@ pl: label_progress: "Pobieranie danych z Jira..." elements: relations: "Relacje między problemami" - workflows: "Project-level workflows" + workflows: "Przepływy pracy na poziomie projektu" users: "Użytkownicy" sprints: "Sprinty" schemes: "Schematy" - permissions: "User, group and project permissions" + permissions: "Uprawnienia użytkowników, grup i projektów" confirm_import: title: "Importuj dane" caption: "Sprawdź ustawienia importu i rozpocznij import" @@ -277,7 +277,7 @@ pl: label_revert: "Cofnij import" button_revert: "Cofnij import" button_done: "Sfinalizuj import" - preview_description: "Zaimportowane dane są obecnie w trybie przeglądu. Kliknij przycisk „Sfinalizuj import”, aby zaimportować dane na stałe lub „Cofnij import”, aby cofnąć wszystkie zmiany wprowadzone wskutek importu." + preview_description: 'Zaimportowane dane są obecnie w trybie przeglądu. Kliknij przycisk „Sfinalizuj import”, aby zaimportować dane na stałe lub „Cofnij import”, aby cofnąć wszystkie zmiany wprowadzone wskutek importu.' label_finalizing_progress: "Finalizowanie importu..." label_finalized: "Sfinalizowano import." label_revert_progress: "Cofanie importu..." @@ -297,7 +297,7 @@ pl: title: "Wybierz projekty" 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." + description: "Protokół kontekstu modelu umożliwia agentom AI dostarczanie użytkownikom narzędzi i zasobów udostępnianych przez to wystąpienie OpenProject. Ta funkcja jest nadal w wersji beta." resources_heading: "Zasoby" resources_description: "OpenProject implementuje następujące zasoby. Każdy z nich może zostać włączony, przemianowany i opisany zgodnie z Twoim życzeniem. Aby uzyskać więcej informacji, zapoznaj się z [dokumentacją zasobów MCP](docs_url)." resources_submit: "Zaktualizuj zasoby" @@ -607,8 +607,8 @@ pl: confirmation_live_message_unchecked: "Przycisk kontynuowania jest teraz nieaktywny. Aby kontynuować, zaznacz pole wyboru." mcp_configurations: server_url_component: - caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." - label: "Server URL" + caption: "Adres URL, pod którym będzie dostępny serwer MCP OpenProject. Wymagany do skonfigurowania klientów MCP." + label: "Adres URL serwera" op_dry_validation: or: "lub" errors: @@ -815,7 +815,7 @@ pl: is_for_all_blank_slate: heading: Dla wszystkich projektów description: Ten atrybut projektu jest włączony we wszystkich projektach, ponieważ jest zaznaczona opcja „Dla wszystkich projektów”. Nie można go wyłączyć dla poszczególnych projektów. - enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. + enabled_via_assignee_when_submitted_html: Tego atrybutu projektu nie można wyłączyć, ponieważ jest on ustawiony jako osoba przypisana w chwili przesłania żądań zainicjowania projektów. types: no_results_title_text: Nie ma dostępnych typów. form: @@ -831,8 +831,8 @@ pl: new_label: "Nowy priorytet" creation_wizard: errors: - no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." - no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." + no_work_package_type: "Nie udało się włączyć żądania zainicjowania projektu, ponieważ wymaga to co najmniej jednego aktywnego typu pakietu roboczego, a ten projekt nie ma żadnego. Dodaj co najmniej jeden typ pakietu roboczego do tego projektu." + no_status_when_submitted: "Nie udało się włączyć żądania zainicjowania projektu, ponieważ typ pakietu roboczego %{type} wymaga co najmniej jednego powiązanego z nim statusu. Włącz co najmniej jeden przepływ pracy statusu dla tego typu pakietu roboczego." export: description_attachment_export: "Wygenerowany artefakt zostanie zapisany jako załącznik PDF do pakietu roboczego artefaktu." description_file_link_export: "Pakiet roboczy artefaktu będzie zawierał link do pliku PDF przechowywanego w zewnętrznym magazynie plików. Wymaga działającego magazynu plików z automatycznie zarządzanymi folderami tego projektu. Obecnie obsługiwane są tylko magazyny plików Nextcloud." @@ -846,7 +846,7 @@ pl: label_request_submission: "Przesłanie żądania" project_attributes_description: > Wybierz atrybuty projektu, które powinny zostać uwzględnione w żądaniu zainicjowania projektu. Ta lista zawiera tylko [atrybuty projektu](project_attributes_url) włączone dla tego projektu. - enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. + enabled_because_required_html: Tego atrybutu projektu nie można wyłączyć dla tego żądania zainicjowania projektu, ponieważ jest on zdefiniowany jako wymagany. Może to zmienić administrator wystąpienia w ustawieniach administracyjnych. status: button_edit: Edytuj status wizard: @@ -1388,9 +1388,9 @@ pl: jira_import: projects: "Projekty" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Nazwa wystąpienia Jira" + url: "Adres URL wystąpienia Jira" + personal_access_token: "Osobisty token dostępu" announcements: show_until: "Wyświetlaj do" attachment: @@ -2787,7 +2787,7 @@ pl: gantt_pdf_export: Eksport wykresu Gantta w formacie PDF ldap_groups: Synchronizacja użytkowników i grup LDAP mcp_server: Model Context Protocol (MCP) - meeting_templates: Reusable meeting templates + meeting_templates: Szablony spotkań wielokrotnego użytku nextcloud_sso: Logowanie jednokrotne do magazynu Nextcloud one_drive_sharepoint_file_storage: Magazyn plików OneDrive/SharePoint placeholder_users: Użytkownicy zastępczy @@ -2865,9 +2865,9 @@ pl: title: "Działania niestandardowe" description: "Akcje niestandardowe są skrótami do zestawu predefiniowanych akcji, które można udostępnić w określonych pakietach roboczych na podstawie statusu, roli, typu lub projektu." mcp_server: - description: "Bring OpenProject into your AI workflows with a secure MCP server." + description: "Wprowadź OpenProject do swoich przepływów pracy AI przy użyciu bezpiecznego serwera MCP." meeting_templates: - description: "Define meeting templates with a set agenda structure and save time by reusing them when creating new meetings." + description: "Zdefiniuj szablony spotkań z ustaloną strukturą planu spotkania i oszczędzaj czas, używając ich ponownie podczas tworzenia nowych spotkań." nextcloud_sso: title: "Logowanie jednokrotne do magazynu Nextcloud" description: "Włącz bezproblemowe, bezpieczne uwierzytelnianie dla swojego magazynu Nextcloud za pomocą logowania jednokrotnego. Uprość zarządzanie dostępem i zwiększ wygodę użytkowników." @@ -3182,16 +3182,16 @@ pl: #We need to include the version to invalidate outdated translations in other locales "17_2": new_features_title: > - The release contains various new features and improvements, such as: + Wydanie zawiera różne nowe funkcje i ulepszenia, takie jak: new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved accessibility - line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments. - line_4: PDF export enhancements - line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module - line_7: Harmonized custom field forms + line_0: Przepływy pracy AI przy użyciu bezpiecznego serwera MCP (plan Professional i wyższe) + line_1: Ulepszona strona główna projektu z nowym widżetem budżetów i lepszą dostępnością + line_2: "Spotkania: szablony spotkań (plan Basic i wyższe)" + line_3: Większa przejrzystość dzięki komentarzom do atrybutów projektu. + line_4: Ulepszenia eksportu plików PDF + line_5: Zwiększone bezpieczeństwo linków zewnętrznych (plan Premium i wyższe) + line_6: Ulepszenia UI/UX w module Backlogs + line_7: Zharmonizowane formularze pól niestandardowych links: upgrade_enterprise_edition: "Aktualizuj do wersji Enterprise" postgres_migration: "Migrowanie instalacji do PostgreSQL" @@ -3209,7 +3209,7 @@ pl: journals: changes_retracted: "Zmiany zostały wycofane." caused_changes: - budget_deleted: "Budget has been deleted" + budget_deleted: "Budżet został usunięty" dates_changed: "Daty zostały zmienione" default_attribute_written: "Zapisano atrybuty tylko do odczytu" import: "Zaimportowano" @@ -3225,7 +3225,7 @@ pl: field_changed: "W polu %{field} wartość %{old_value} zmieniła się na %{new_value}" field_set: "W polu %{field} ustawiono wartość %{value}" field_removed: "Usunięto pole %{field}" - field_updated: "%{field} updated" + field_updated: "Zaktualizowano %{field}" deleted_with_diff: "Usunięto pole %{field} (%{link})" changed_with_diff: "Zmieniono pole %{field} (%{link})" set_with_diff: "Ustawiono pole %{field} (%{link})" @@ -3235,7 +3235,7 @@ pl: work_package_related_changed_times: przez zmiany powiązanego %{link} work_package_duplicate_closed: Status został automatycznie zaktualizowany przez zduplikowany pakiet roboczy %{link} unaccessable_work_package_changed: poprzez zmiany powiązanego pakietu roboczego - budget_deleted: Budget has been deleted + budget_deleted: Budżet został usunięty working_days_changed: changed: "przez zmiany dni roboczych (%{changes})" days: @@ -3402,7 +3402,7 @@ pl: label_always_visible: "Zawsze wyświetlana" label_announcement: "Ogłoszenie" label_angular: "AngularJS" - label_app_modules: "%{app_title} modules" + label_app_modules: "Moduły %{app_title}" label_api_access_key: "Klucz dostępu API" label_api_access_key_created_on: "Klucz API utworzony %{value} temu" label_api_access_key_type: "API" @@ -5253,7 +5253,7 @@ pl: text_change_disabled_for_provider_login: "Nazwa i adres e-mail są ustawiane przez dostawcę usług logowania i dlatego nie można ich zmienić." unlock: "Odblokuj" unlock_and_reset_failed_logins: "Odblokuj i resetuj nieudane logowania" - error_cannot_delete_user: "User cannot be deleted" + error_cannot_delete_user: "Nie można usunąć użytkownika" version_status_closed: "Zamknięte" version_status_locked: "zablokowane" version_status_open: "Otwarte" diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index e22b4961a63..33c722cc4da 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -83,9 +83,9 @@ pt-PT: confirmation: "Tem a certeza de que quer eliminar este token de apoio da edição Enterprise?" create_dialog: title: "Adicionar token Enterprise" - type_token_text: "Your Enterprise token text" + type_token_text: "O texto do seu token Enterprise" token_placeholder: "Cole aqui o seu token de apoio da edição Enterprise" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "Para mais informações sobre como ativar a edição Enterprise, consulte a nossa [documentação](docs_url)." add_token: "Carregar um token de suporte da edição Enterprise" replace_token: "Substituir o seu token de suporte atual" order: "Encomendar a edição Enterprise on-premises" @@ -111,183 +111,183 @@ pt-PT: text: "As ações individuais de um utilizador (por exemplo, atualizar um pacote de trabalho duas vezes) são agregadas numa única ação se a sua diferença de idade for menor que o intervalo de tempo especificado. Serão mostradas como uma única ação dentro da aplicação. Também vai atrasar as notificações pelo mesmo período de tempo, o que reduz o número de e-mails enviados, e afeta ainda o atraso de %{webhook_link}." link: "webhook" import: - title: "Import" + title: "Importar" jira: - title: "Jira Import" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + title: "Importação Jira" + description: "Utilize esta ferramenta para importar dados da sua instância do Jira. Pode configurar vários anfitriões do Jira, e escolher o que importar em cada execução de importação." errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "Não é possível eliminar o anfitrião do Jira com importações existentes" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + title: "Ainda não há anfitriões do Jira configurados" + description: "Configure um anfitrião do Jira para começar a importar elementos do Jira para esta instância do OpenProject." configuration: - title: "Jira configuration" - new: "New configuration" + title: "Configuração do Jira" + new: "Nova configuração" banner: - title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + title: "Importação limitada" + description: "Esta ferramenta de importação está em fase beta, e só consegue importar dados básicos: projetos, problemas (nome, título, descrição, anexos), utilizadores (nome, e-mail, associação ao projeto), estados e tipos. Não pode importar fluxos de trabalho, campos personalizados, relações de problemas ou permissões. Neste momento, só temos suporte para o servidor/centro de dados Jira nas versões 10.x e 11.x. As instâncias na nuvem não são suportadas agora." form: fields: - name: "Name" - url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + name: "Nome" + url: "URL do servidor/centro de dados do Jira" + personal_access_token: "Token de acesso pessoal" + button_add: "Adicionar configuração" + button_save: "Guardar configuração" + button_test: "Testar configuração" + button_delete_token: "Eliminar token" + delete_token_confirm: "Tem a certeza de que quer eliminar o token? Isto vai desativar a ligação ao Jira." + label_testing: "A testar configuração..." + token_deleted: "O token foi eliminado com sucesso." test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + success: "Ligado com sucesso a %{server} (versão %{version})" + failed: "A ligação falhou: Não foi possível recuperar as informações do servidor" + error: "Ocorreu um erro inesperado ao testar a ligação" + connection_error: "Erro de ligação: %{message}" + parse_error: "Falha ao analisar a resposta do servidor. O servidor pode não ser uma instância válida do Jira." + api_error: "A API do Jira devolveu o estado de erro %{status}. Verifique o URL da sua instância do Jira e o token da API." + token_error: "Token de API inválido. Verifique as suas credenciais na configuração." + missing_credentials: "Forneça o URL e o Token de Acesso Pessoal para testar a ligação" + invalid_url: "Forneça um URL válido" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "Falha na ligação ao servidor Jira: %{message}" + connection_timeout: "O tempo de ligação ao servidor Jira expirou: %{message}" + parse_error: "Falha na análise da resposta da API do Jira: %{message}" + api_error: "A API do Jira devolveu o estado de erro %{status}" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" - label_ago: "%{amount} ago" + projects: "Projetos" + last_change: "Última alteração" + added: "Adicionado" + label_ago: "Há %{amount}" run: - title: "Import run" - history: "History" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + title: "Importar execução" + history: "Histórico" + remove_error: "Uma importação do Jira não pode ser removida enquanto está a ser executada" + import_blocked_error: "Está em curso ou a aguardar revisão outra importação do Jira. Conclua-a ou reverta-a antes de iniciar uma nova importação." blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "Ainda não foram feitas importações" + description: "Crie uma execução de importação para começar a importar informações desta instância do Jira" 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" + description: "Pode importar diferentes conjuntos de dados em cada execução de importação. É possível anular uma execução de importação imediatamente após o modo de revisão, mas não após a finalização." + button_import_run: "Importar execução" + button_edit_configuration: "Editar configuração" status: - initial: "Start" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" - configuring: "Select scope" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" - imported: "Review mode" - reverting: "Reverting" - revert_error: "Error during revert" - reverted: "Reverted" - completed: "Completed" + initial: "Iniciar" + instance_meta_fetching: "A recolher metadados" + instance_meta_error: "Erro ao recolher metadados" + instance_meta_done: "Metadados recolhidos" + configuring: "Selecionar âmbito" + projects_meta_fetching: "A recolher dados do projeto" + projects_meta_error: "Erro ao recolher os dados do projeto" + projects_meta_done: "Dados recolhidos" + importing: "A decorrer" + import_error: "Erro durante a importação" + imported: "Modo de revisão" + reverting: "A reverter" + revert_error: "Erro durante a reversão" + reverted: "Revertido" + completed: "Concluído" wizard: - button_retry: "Retry" + button_retry: "Tentar novamente" parts: projects: - one: "1 project" - other: "%{count} projects" + one: "1 projeto" + other: "%{count} projetos" issues: - one: "1 issue" - other: "%{count} issues" + one: "1 ocorrência" + other: "%{count} ocorrências" work_packages: - one: "1 work package" - other: "%{count} work packages" + one: "1 pacote de trabalho" + other: "%{count} pacotes de trabalho" types: - one: "1 type" - other: "%{count} types" + one: "1 tipo" + other: "%{count} tipos" statuses: - one: "1 status" - other: "%{count} statuses" + one: "1 estado" + other: "%{count} estados" users: - one: "1 user" - other: "%{count} users" + one: "1 utilizador" + other: "%{count} utilizadores" groups: fetch: - title: "Get base data" + title: "Obter dados de base" groups_and_users: - title: "Groups and Users" + title: "Grupos e utilizadores" configuration: - title: "Configure import" + title: "Configurar importação" confirming: - title: "Confirm and import" + title: "Confirmar e importar" review: - title: "Review import" + title: "Revisão da importação" sections: fetch_data: - title: "Fetch instance meta data" - caption_done: "Completed" - description: "Check what data is available for import in the host Jira instance." - button_fetch: "Check available data" - label_progress: "Fetching data from Jira..." + title: "Recolher metadados da instância" + caption_done: "Concluído" + description: "Verifique quais os dados disponíveis para importação na instância do Jira anfitrião." + button_fetch: "Verifique os dados disponíveis" + label_progress: "A recolher dados do Jira..." groups_and_users: - title: "Groups and Users" + title: "Grupos e utilizadores" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" - 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 URL 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_available_data: "Available data" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" - button_continue: "Continue" - 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..." + title: "Âmbito de importação" + caption: "Escolha o que quer importar para o OpenProject" + caption_done: "Concluído" + label_info: "Tenha em atenção que esta ferramenta de importação está em fase beta e não consegue importar todos os tipos de dados. Eis um resumo do que o URL da instância do Jira anfitrião oferece para importação, e o que esta ferramenta consegue importar neste momento." + description: "Selecione os dados que pretende importar a partir dos dados disponíveis obtidos na instância anfitriã do Jira." + label_available_data: "Dados disponíveis" + label_not_available_data: "Não disponível para importação" + button_select_projects: "Selecionar projetos para importar" + button_continue: "Continuar" + label_import: "Selecione os projetos que quer importar." + button_select: "Selecionar projetos" + label_selected_data: "Dados selecionados para importação" + label_progress: "A recolher dados do Jira..." elements: - relations: "Relations between issues" - workflows: "Project-level workflows" - users: "Users" + relations: "Relações entre questões" + workflows: "Fluxos de trabalho ao nível do projeto" + users: "Utilizadores" sprints: "Sprints" - schemes: "Schemas" - permissions: "User, group and project permissions" + schemes: "Esquemas" + permissions: "Permissões de utilizadores, grupos e projetos" confirm_import: - title: "Import data" - caption: "Review your import settings and start the import" - caption_done: "Completed" - label_available_data: "Available data to import" - 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" + title: "Importar dados" + caption: "Analise as suas definições de importação e inicie a importação" + caption_done: "Concluído" + label_available_data: "Dados disponíveis para importação" + button_start: "Iniciar importação" + description: "Está prestes a iniciar uma execução de importação com as seguintes definições." + label_progress: "Importação em curso..." + label_import_data: "A importar" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." - label_results: "Imported" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: 'The imported data is currently in review mode. Click "Finalize import" to make the import permanent or "Revert import" to undo all changes made in this import run.' - label_finalizing_progress: "Finalizing import..." - label_finalized: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + title: "Importar resultados de execução" + caption: "Analisar a execução da importação ou reverter a importação" + info: "A importação foi executada com êxito." + label_results: "Importado" + label_revert: "Reverter importação" + button_revert: "Reverter importação" + button_done: "Finalizar importação" + preview_description: 'Os dados importados estão em modo de revisão. Clique em "Finalizar importação" para tornar a importação permanente ou em "Reverter importação" para anular todas as alterações feitas nesta importação.' + label_finalizing_progress: "A finalizar importação..." + label_finalized: "Importação finalizada." + label_revert_progress: "A reverter a importação..." + label_reverted: "Importação revertida." select_dialog: - filter_projects: "Filter by text" + filter_projects: "Filtrar por texto" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." - confirm: "I understand that this reversion will delete data permanently" + title: "Reverter permanentemente esta importação?" + description: "Isto vai eliminar todos os objetos importados (incluindo projetos inteiros), mesmo que tenha havido atividade do utilizador nesses projetos após a importação no OpenProject." + confirm: "Compreendo que esta reversão irá apagar os dados permanentemente" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + title: "Finalizar esta importação?" + description: "Uma vez finalizada, esta importação já não pode ser revertida. Todos os dados importados estarão permanentemente importados." + confirm: "Compreendo que esta ação não pode ser anulada" + confirm_button: "Compreendido" select_projects: - title: "Select projects" + title: "Selecionar projetos" 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." + description: "O protocolo de contexto do modelo permite que os agentes de IA forneçam aos seus utilizadores ferramentas e recursos expostos por esta instância do OpenProject. Esta funcionalidade ainda está em fase beta." resources_heading: "Recursos" - resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_description: "O OpenProject implementa as seguintes funcionalidades. Cada uma pode ser ativada, renomeada e descrita como quiser. Para mais informações, consulte a [documentação sobre funcionalidades MCP](docs_url)." resources_submit: "Atualizar recursos" tools_heading: "Ferramentas" tools_description: "O OpenProject implementa as seguintes ferramentas. Cada uma pode ser ativada, renomeada e descrita como quiser. Para mais informações, consulte a [documentação sobre ferramentas MCP](docs_url)." @@ -296,17 +296,17 @@ pt-PT: success: "As configurações da MCP foram atualizadas com êxito." server_form: description_caption: "Como o servidor MCP será descrito a outras aplicações que se ligam a ele." - title_caption: "A short title shown to applications that connect to the MCP server." - tool_response_format: "Tool response format" - tool_response_format_content_only_label: "Content only" + title_caption: "Um título curto apresentado às aplicações que se ligam ao servidor MCP." + tool_response_format: "Formato de resposta da ferramenta" + tool_response_format_content_only_label: "Apenas conteúdo" tool_response_format_content_only_caption: > - Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. - tool_response_format_full_label: "Full" + Escolha esta opção se os clientes MCP que se ligam a esta instância não suportam conteúdo estruturado. As respostas da ferramenta conterão apenas conteúdo de texto simples, e deixarão de fora a versão estruturada. + tool_response_format_full_label: "Completo" tool_response_format_full_caption: > - The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance. - tool_response_format_structured_only_label: "Structured content only" + A opção mais compatível. As respostas da ferramenta incluirão conteúdo regular e estruturado, permitindo que os clientes MCP escolham o formato que desejam ler. Isto pode aumentar o número de tokens que o modelo de linguagem tem de processar, aumentando potencialmente o custo e diminuindo o desempenho. + tool_response_format_structured_only_label: "Apenas conteúdo estruturado" tool_response_format_structured_only_caption: > - Choose this if you are certain that MCP clients connecting to this instance support structured content. Tool responses will only include structured content and leave out its text representation. + Escolha esta opção se tiver a certeza de que os clientes MCP que se ligam a esta instância suportam conteúdo estruturado. As respostas da ferramenta só incluirão conteúdo estruturado, e deixarão de fora a sua representação de texto. update: failure: "Não foi possível atualizar a configuração MCP." success: "A configuração da MCP foi atualizada com êxito." @@ -543,7 +543,7 @@ pt-PT: contained_in_type: "Incluído no tipo" confirm_destroy_option: "Apagar uma opção irá apagar todas as suas ocorrências (ex. em pacotes de trabalho). Tem certeza que quer apagá-la?" reorder_alphabetical: "Reordenar valores em ordem alfabética" - reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?" + reorder_confirmation: "Aviso: Será perdida a ordem atual dos valores disponíveis, bem como todos os valores não guardados. Tem a certeza de que quer continuar?" placeholder_version_select: "A seleção do pacote de trabalho ou do projeto é necessária em primeiro lugar" calculated_field_not_editable: "Atributo não editável. Este valor é calculado automaticamente." no_role_assigment: "Sem atribuição de funções" @@ -571,13 +571,13 @@ pt-PT: formula: project: "Adicione valores numéricos ou escreva / para procurar um atributo ou um operador matemático." regexp: - all: "eg. ^[A-Z0-9]+$" - project: "eg. ^[A-Z0-9]+$" + all: "ex. ^[A-Z0-9]+$" + project: "ex. ^[A-Z0-9]+$" min_max: - all: "0 means no restriction" - project: "0 means no restriction" + all: "0 significa sem restrições" + project: "0 significa sem restrições" has_comment: - project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." + project: "Permite ao utilizador adicionar um comentário relacionado com o atributo do projeto quando seleciona o valor na síntese do projeto." tab: no_results_title_text: Atualmente, não existem campos personalizados. no_results_content_text: Criar um novo campo personalizado @@ -596,8 +596,8 @@ pt-PT: confirmation_live_message_unchecked: "O botão para prosseguir está agora inativo. Tem de assinalar a caixa de verificação para continuar." mcp_configurations: server_url_component: - caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." - label: "Server URL" + caption: "URL em que o servidor OpenProject MCP estará acessível. Necessário para a configuração de clientes MCP." + label: "URL do servidor" op_dry_validation: or: "ou" errors: @@ -802,7 +802,7 @@ pt-PT: is_for_all_blank_slate: heading: Para todos os projetos description: Este atributo do projeto é ativado em todos os projetos, uma vez que a opção "Para todos os projetos" está assinalada. Não pode ser desativado para projetos individuais. - enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. + enabled_via_assignee_when_submitted_html: Este atributo de projeto não pode ser desativado, visto que está definido como encarregado quando enviado para pedidos de iniciação de projetos. types: no_results_title_text: Atualmente, não existem tipos disponíveis. form: @@ -818,8 +818,8 @@ pt-PT: new_label: "Nova prioridade" creation_wizard: errors: - no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." - no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." + no_work_package_type: "Não foi possível ativar o pedido de iniciação do projeto porque requer pelo menos um tipo de pacote de trabalho ativo, e este projeto não tem nenhum. Adicione pelo menos um tipo de pacote de trabalho a este projeto." + no_status_when_submitted: "Falha ao ativar o pedido de iniciação do projeto, porque o tipo de pacote de trabalho %{type} requer pelo menos um estado associado. Ative pelo menos um fluxo de estados para este tipo de pacote de trabalho." export: description_attachment_export: "O artefacto gerado será guardado como anexo PDF no pacote de trabalho do artefacto." description_file_link_export: "O pacote de trabalho do artefacto terá uma ligação de ficheiro a um PDF armazenado num arquivo externo. Requer um armazenamento de ficheiros funcional com pastas de projeto geridas automaticamente para este projeto. De momento, só são suportados os armazenamentos de ficheiros Nextcloud." @@ -833,7 +833,7 @@ pt-PT: label_request_submission: "Pedido de envio" project_attributes_description: > Selecione os atributos do projeto que devem ser incluídos na solicitação de início do projeto. Esta lista inclui apenas [atributos do projeto](project_attributes_url) ativados para este projeto. - enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. + enabled_because_required_html: Este atributo de projeto não pode ser desativado para este pedido de iniciação de projeto, uma vez que está definido como obrigatório. Isto pode ser alterado nas configurações de administração pelo administrador da instância. status: button_edit: Editar estado wizard: @@ -1357,11 +1357,11 @@ pt-PT: activerecord: attributes: jira_import: - projects: "Projects" + projects: "Projetos" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Nome da instância do Jira" + url: "URL da instância do Jira" + personal_access_token: "Token de acesso pessoal" announcements: show_until: "Exibir até" attachment: @@ -1407,7 +1407,7 @@ pt-PT: regexp: "Expressão regular" searchable: "Pesquisável" admin_only: "Apenas administradores" - has_comment: "Add a comment text field" + has_comment: "Adicione um campo de texto de comentário" custom_value: value: "Valor" design_color: @@ -1736,7 +1736,7 @@ pt-PT: not_available: "não está disponível devido a uma configuração do sistema." not_deletable: "não pode ser eliminado" not_current_user: "não é o utilizador atual." - only_one_active_sprint_allowed: "only one active sprint is allowed per project." + only_one_active_sprint_allowed: "só é permitido um sprint ativo por projeto." not_found: "não encontrado." not_a_date: "não é uma data válida." not_a_datetime: "não é uma data/hora válida." @@ -1844,7 +1844,7 @@ pt-PT: meeting: error_conflict: "Não foi possível guardar porque a reunião entretanto foi atualizada por outra pessoa. Recarregue a página." message: - cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." + cannot_move_message_to_forum_of_different_project: "Uma mensagem não pode ser movida para um fórum de um projeto diferente." notifications: at_least_one_channel: "É necessário especificar pelo menos um canal para o envio de notificações." attributes: @@ -2101,7 +2101,7 @@ pt-PT: in_use: "Este nome de token já está a ser utilizado, selecione um diferente" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "Forneça um protocolo válido (http ou https)" template: body: "Por favor, verifique os seguintes campos:" header: @@ -2120,7 +2120,7 @@ pt-PT: comment: "Comentario" custom_action: "Ação personalizada" custom_field: "Campo personalizado" - customized: "Customized" + customized: "Personalizado" "doorkeeper/application": "Aplicação OAuth" enterprise_token: one: "Token Enterprise" @@ -2677,8 +2677,8 @@ pt-PT: edit_attribute_groups: Editar grupos de atributos gantt_pdf_export: Exportação de PDF de Gantt ldap_groups: Sincronização de utilizadores e grupos LDAP - mcp_server: Model Context Protocol (MCP) - meeting_templates: Reusable meeting templates + mcp_server: Protocolo de contexto de modelo (MCP) + meeting_templates: Modelos de reunião reutilizáveis nextcloud_sso: Início de sessão único para armazenamento Nextcloud one_drive_sharepoint_file_storage: Armazenamento de ficheiros no OneDrive/SharePoint placeholder_users: Utilizadores de marcador de posição @@ -2756,9 +2756,9 @@ pt-PT: title: "Ações personalizadas" description: "As ações personalizadas são atalhos de um clique para um conjunto de ações predefinidas que pode disponibilizar em determinados pacotes de trabalho com base no estado, função, tipo ou projeto." mcp_server: - description: "Bring OpenProject into your AI workflows with a secure MCP server." + description: "Traga o OpenProject para os seus fluxos de trabalho de IA com um servidor MCP seguro." meeting_templates: - description: "Define meeting templates with a set agenda structure and save time by reusing them when creating new meetings." + description: "Defina modelos de reunião com uma estrutura de agenda definida e poupe tempo reutilizando-os ao criar novas reuniões." nextcloud_sso: title: "Início de sessão único para armazenamento Nextcloud" description: "Permita uma autenticação perfeita e segura para o seu armazenamento Nextcloud com o início de sessão único. Simplifique a gestão do acesso e aumente a conveniência do utilizador." @@ -3071,16 +3071,16 @@ pt-PT: #We need to include the version to invalidate outdated translations in other locales "17_2": new_features_title: > - The release contains various new features and improvements, such as: + A versão contém várias novas funcionalidades e melhorias, como: new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved accessibility - line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments. - line_4: PDF export enhancements - line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module - line_7: Harmonized custom field forms + line_0: Fluxos de trabalho de IA com um servidor MCP seguro (plano Professional e superior) + line_1: Página inicial do projeto melhorada com um novo widget para orçamentos e melhor acessibilidade + line_2: "Reuniões: Modelos de reunião (Plano básico e superior)" + line_3: Maior transparência nos comentários sobre os atributos dos projetos. + line_4: Melhorias na exportação de PDF + line_5: Maior segurança para ligações externas (plano Premium e superior) + line_6: Melhorias de UI/UX no módulo Backlogs + line_7: Formulários personalizados harmonizados links: upgrade_enterprise_edition: "Aprimorar para a edição Enterprise" postgres_migration: "A migrar a sua instalação para PostgreSQL" @@ -3098,10 +3098,10 @@ pt-PT: journals: changes_retracted: "As mudanças foram retraídas." caused_changes: - budget_deleted: "Budget has been deleted" + budget_deleted: "O orçamento foi eliminado" dates_changed: "Datas alteradas" default_attribute_written: "Escrita de atributos só de leitura" - import: "Imported" + import: "Importado" progress_mode_changed_to_status_based: "Cálculo do progresso atualizado" status_changed: "Estado \"%{status_name}\"" system_update: "Atualização do sistema OpenProject:" @@ -3110,21 +3110,21 @@ pt-PT: total_percent_complete_mode_changed_to_simple_average: "O cálculo dos totais da % de conclusão baseia-se agora numa média simples de apenas os valores da % de conclusão." cause_descriptions: import: - header: "changes by %{author}" - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" - field_updated: "%{field} updated" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" - set_with_diff: "%{field} set (%{link})" + header: "alterações de %{author}" + field_changed: "%{field} alterado de %{old_value} para %{new_value}" + field_set: "%{field} definido para %{value}" + field_removed: "%{field} removido" + field_updated: "%{field} atualizado" + deleted_with_diff: "%{field} eliminou (%{link})" + changed_with_diff: "%{field} alterou (%{link})" + set_with_diff: "%{field} definiu (%{link})" work_package_predecessor_changed_times: por alterações no %{link} antecessor work_package_parent_changed_times: por alterações no %{link} principal work_package_children_changed_times: por alterações no %{link} secundário work_package_related_changed_times: por alterações no %{link} relacionado work_package_duplicate_closed: O estado foi automaticamente atualizado pelo pacote de trabalho duplicado %{link} unaccessable_work_package_changed: por alterações num pacote de trabalho relacionado - budget_deleted: Budget has been deleted + budget_deleted: O orçamento foi eliminado working_days_changed: changed: "por alterações nos dias úteis (%{changes})" days: @@ -3205,7 +3205,7 @@ pt-PT: active_tokens: "Tokens ativos" blank_description: "Não existe um acesso a aplicações de terceiros configurado e ativo para si." blank_title: "Nenhum token de aplicação OAuth" - last_refreshed_at: "Last refreshed at" + last_refreshed_at: "Última atualização em" title: "OAuth" table_title: "Tokens de aplicação OAuth" text_hint: "Os tokens de aplicação OAuth permitem que aplicações de terceiros se liguem a esta instância do OpenProject." @@ -3291,7 +3291,7 @@ pt-PT: label_always_visible: "Sempre exibido" label_announcement: "Aviso" label_angular: "AngularJS" - label_app_modules: "%{app_title} modules" + label_app_modules: "%{app_title} módulos" label_api_access_key: "API access key" label_api_access_key_created_on: "Chave de acesso API criada há %{value}" label_api_access_key_type: "API" @@ -3445,7 +3445,7 @@ pt-PT: label_duplicates: "duplicados" label_edit: "Editar" label_edit_x: "Editar: %{x}" - label_view_x: "View: %{x}" + label_view_x: "Ver: %{x}" label_enable_multi_select: "Alternar para selecção múltipla" label_enabled_project_custom_fields: "Campos personalizados activados" label_enabled_project_modules: "Módulos activados" @@ -3550,7 +3550,7 @@ pt-PT: label_external_links: "Links externos" label_locale: "Idioma e região" label_jump_to_a_project: "Saltar para um projeto..." - label_jira_import: "Jira Import" + label_jira_import: "Importação Jira" label_keyword_plural: "Palavras-chave" label_language_based: "Com base no idioma do utilizador" label_last_activity: "Última atividade" @@ -3573,7 +3573,7 @@ pt-PT: label_lock_user: "Bloquear utilizador" label_logged_as: "Autenticado como" label_login: "Iniciar sessão" - label_custom_comment: "%{name} comment" + label_custom_comment: "%{name} comentário" label_custom_logo: "Logótipo personalizado para computador" label_custom_logo_mobile: "Logótipo personalizado para dispositivo móvel" label_custom_export_logo: "Logótipo de exportação personalizado" @@ -4200,7 +4200,7 @@ pt-PT: notice_successful_delete: "Eliminado com sucesso." notice_successful_cancel: "Cancelamento bem-sucedido." notice_successful_update: "Actualizado com sucesso." - notice_successful_move: "Successful move from %{from} to %{to}." + notice_successful_move: "Movimento bem-sucedido de %{from} para %{to}." notice_unsuccessful_create: "A criação falhou." notice_unsuccessful_create_with_reason: "A criação falhou: %{reason}" notice_unsuccessful_update: "Falha na atualização." @@ -4362,7 +4362,7 @@ pt-PT: permission_edit_project_query: "Editar consulta de projeto" placeholders: default: "-" - templated_hint: Automatically generated through type %{type} + templated_hint: Gerado automaticamente através do tipo %{type} portfolio: count: zero: "0 carteiras" @@ -4545,9 +4545,9 @@ pt-PT: setting_capture_external_links: "Capturar links externos" setting_capture_external_links_text: > Quando ativada, todos os links externos no texto formatado serão redirecionados através de uma página de aviso antes de sair da aplicação. Isto ajuda a proteger os utilizadores de sites externos potencialmente maliciosos. - setting_capture_external_links_require_login: "Require users to be logged in" + setting_capture_external_links_require_login: "Exigir que os utilizadores tenham sessão iniciada" setting_capture_external_links_require_login_text: > - When enabled, users wanting to click on external links need to be logged in before being able to continue. + Quando ativado, os utilizadores que pretendam clicar em ligações externas têm de ter sessão iniciada antes de poderem continuar. setting_after_first_login_redirect_url: "Redirecionamento do primeiro início de sessão" setting_after_first_login_redirect_url_text_html: > Defina um caminho para redirecionar os utilizadores após o primeiro início de sessão. Se estiver vazio, redireciona para a página inicial do tour de integração.
Exemplo: /my/page @@ -4592,9 +4592,9 @@ pt-PT: setting_smtp_password: "Senha SMTP" setting_smtp_domain: "Domínio SMTP HELO" setting_activity_days_default: "Dias mostrados na atividade do projeto" - setting_api_tokens_enabled: "Enable API tokens" + setting_api_tokens_enabled: "Ativar tokens de API" setting_api_tokens_enabled_caption: > - Decide whether users can create personal API tokens in their account settings. These tokens can be used to access the different APIs of OpenProject, such as APIv3 and MCP. + Decida se os utilizadores podem criar tokens API pessoais nas definições da sua conta. Estes tokens podem ser utilizados para aceder às diferentes APIs do OpenProject, como APIv3 e MCP. setting_app_subtitle: "Subtítulo da aplicação" setting_app_title: "Título da aplicação" setting_attachment_max_size: "Tamanho máx. do anexo" @@ -5133,10 +5133,10 @@ pt-PT: reset_failed_logins: "Restaurar inícios de sessão falhados" status_user_and_brute_force: "%{user} e %{brute_force}" status_change: "Alteração de estado" - text_change_disabled_for_provider_login: "The name and email is set by your login provider and can thus not be changed." + text_change_disabled_for_provider_login: "O nome e o e-mail são definidos pelo seu fornecedor de início de sessão, e não podem ser alterados." unlock: "Desbloquear" unlock_and_reset_failed_logins: "Desbloquear e redefinir logins errados" - error_cannot_delete_user: "User cannot be deleted" + error_cannot_delete_user: "O utilizador não pode ser eliminado" version_status_closed: "fechado" version_status_locked: "bloqueado" version_status_open: "abrir" diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index 0b4aba28eac..6e425e11d5b 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -35,7 +35,7 @@ fr: duration: "Durée du sprint" work_package: position: "Position" - story_points: "Points d'histoire" + story_points: "Story points" backlogs_work_package_type: "Type de backlog" errors: models: @@ -54,7 +54,7 @@ fr: task_type: "Type de tâche" backlogs: any: "tout" - column_width: "Largeur de la colonne" + column_width: "Largeur de colonne" definition_of_done: "Définition de Fait" impediment: "Obstacle" label_versions_default_fold_state: "Afficher les versions de manière repliée" @@ -69,10 +69,10 @@ fr: rebuild: "Reconstruire" rebuild_positions: "Reconstruire les positions" remaining_hours: "Travail restant" - show_burndown_chart: "Graphique d'avancement" + show_burndown_chart: "Graphique burndown" story: "Histoire" story_points: - one: "%{count} story point " + one: "%{count} story point" other: "%{count} story points" task: "Tâche" task_color: "Couleur des tâches" @@ -86,17 +86,17 @@ fr: backlog_header_component: label_toggle_backlog: "Réduire/développer %{name}" label_story_count: - zero: "Pas d'histoires dans le carnet de commandes" - one: "%{count} article en attente" - other: "%{count} histoires en attente" + zero: "Aucune histoire dans le backlog" + one: "%{count} histoire dans le backlog" + other: "%{count} histoires dans le backlog" backlog_menu_component: - label_actions: "Actions en attente" + label_actions: "Actions dans le backlog" action_menu: - edit_sprint: "Editer le sprint" - new_story: "Nouvelle story" + edit_sprint: "Modifier le sprint" + new_story: "Nouvelle histoire" stories_tasks: "Histoires/tâches" task_board: "Tableau des tâches" - burndown_chart: "Graphique d'avancement" + burndown_chart: "Graphique burndown" wiki: "Wiki" properties: "Propriétés" story_component: @@ -111,13 +111,13 @@ fr: backlogs_task_type: "Type de tâche" backlogs_wiki_template: "Modèle pour page wiki de sprint" backlogs_empty_title: "Aucune version n'est encore définie" - backlogs_empty_action_text: "Pour commencer à utiliser les backlogs, veuillez d'abord créer une version" + backlogs_empty_action_text: "Veuillez créer une version avant de commencer à utiliser les backlogs" backlogs_not_configured_title: "Les backlogs ne sont pas configurés" backlogs_not_configured_description: "Les types d'histoires et de tâches doivent être définis avant d'utiliser ce module." backlogs_not_configured_action_text: "Configurer les backlogs" burndown: story_points: "Story points" - story_points_ideal: "Points d'histoire (idéal)" + story_points_ideal: "Story points (idéal)" errors: attributes: task_type: @@ -133,14 +133,14 @@ fr: label_task_board: "Tableau des tâches" permission_view_sprints: "Voir les sprints" permission_create_sprints: "Créer des sprints" - permission_start_complete_sprint: "Démarrer/Clore le sprint" + permission_start_complete_sprint: "Commencer/terminer le sprint" permission_manage_sprint_items: "Gérer les éléments du sprint" permission_share_sprint: "Partager le sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: - blankslate_title: "Pas de données disponibles sur le burndown" - blankslate_description: "Définissez les dates de début et de fin du sprint afin de générer un tableau d'avancement." + blankslate_title: "Aucune donnée disponible sur le burndown" + blankslate_description: "Définissez les dates de début et de fin du sprint afin de générer un graphique burndown." remaining_hours: "travail restant" version_settings_display_label: "Colonne dans le backlog" version_settings_display_option_left: "gauche" diff --git a/modules/backlogs/config/locales/crowdin/js-fr.yml b/modules/backlogs/config/locales/crowdin/js-fr.yml index 7c1e4c80f3d..32449e48902 100644 --- a/modules/backlogs/config/locales/crowdin/js-fr.yml +++ b/modules/backlogs/config/locales/crowdin/js-fr.yml @@ -23,7 +23,7 @@ fr: js: work_packages: properties: - storyPoints: "Points d'histoire" + storyPoints: "Story points" burndown: day: "Jour" points: "Points" diff --git a/modules/backlogs/config/locales/crowdin/js-pt-PT.yml b/modules/backlogs/config/locales/crowdin/js-pt-PT.yml index 702c2f4368c..5405cc9abe0 100644 --- a/modules/backlogs/config/locales/crowdin/js-pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/js-pt-PT.yml @@ -25,5 +25,5 @@ pt-PT: properties: storyPoints: "Pontos de histórico" burndown: - day: "Day" - points: "Points" + day: "Dia" + points: "Pontos" diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index ef9117bb9ce..0a6e3ddb448 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -30,7 +30,7 @@ pl: finish_date: "Data zakończenia" goal: "Cel sprintu" name: "Nazwa sprintu" - sharing: "Sharing" + sharing: "Udostępnianie" sprint: duration: "Czas trwania sprintu" work_package: diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml index 110b226be99..36f2ababe64 100644 --- a/modules/backlogs/config/locales/crowdin/pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml @@ -26,13 +26,13 @@ pt-PT: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" - sharing: "Sharing" + duration: "Duração" + finish_date: "Data de término" + goal: "Objetivo do sprint" + name: "Nome do sprint" + sharing: "Partilhar" sprint: - duration: "Sprint duration" + duration: "Duração do sprint" work_package: position: "Posição" story_points: "Pontos de histórico" @@ -54,7 +54,7 @@ pt-PT: task_type: "Tipo de tarefa" backlogs: any: "qualquer" - column_width: "Column width" + column_width: "Largura da coluna" definition_of_done: "Definição de feito" impediment: "Impedimento" label_versions_default_fold_state: "Mostrar versões dobradas" @@ -62,8 +62,8 @@ pt-PT: work_package_is_closed: "Pacote de trabalho está feito quando" label_is_done_status: "O estado %{status_name} significa terminado" points_label: - one: "point" - other: "points" + one: "ponto" + other: "pontos" positions_could_not_be_rebuilt: "As posições não puderam ser reconstruídas." positions_rebuilt_successfully: "Posições reconstruídas com êxito." rebuild: "Reconstruir" @@ -72,8 +72,8 @@ pt-PT: show_burndown_chart: "Gráfico de Burndown" story: "História" story_points: - one: "%{count} story point" - other: "%{count} story points" + one: "%{count} ponto de história" + other: "%{count} pontos de história" task: "Tarefa" task_color: "Cor de tarefa" unassigned: "Não atribuído" @@ -81,28 +81,28 @@ pt-PT: header_backlogs: "Módulo de backlogs" button_update_backlogs: "Atualizar o módulo de backlogs" backlog_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} está vazio" + blankslate_description: "Ainda não existem elementos planeados. Arraste elementos para aqui para os adicionar." backlog_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Recolher/expandir %{name}" label_story_count: - zero: "No stories in backlog" - one: "%{count} story in backlog" - other: "%{count} stories in backlog" + zero: "Não há histórias no backlog" + one: "%{count} história no backlog" + other: "%{count} histórias no backlog" backlog_menu_component: - label_actions: "Backlog actions" + label_actions: "Ações de backlog" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Editar sprint" + new_story: "Nova história" + stories_tasks: "Histórias/tarefas" + task_board: "Quadro de tarefas" + burndown_chart: "Gráfico de burndown" wiki: "Wiki" - properties: "Properties" + properties: "Propriedades" story_component: - label_drag_story: "Move %{name}" + label_drag_story: "Mover %{name}" story_menu_component: - label_actions: "Story actions" + label_actions: "Ações de história" backlogs_points_burn_direction: "Pontos queimam para cima/para baixo" backlogs_product_backlog: "Backlog do produto" backlogs_story: "História" @@ -110,14 +110,14 @@ pt-PT: backlogs_task: "Tarefa" backlogs_task_type: "Tipo de tarefa" backlogs_wiki_template: "Modelo para a página wiki de sprint" - backlogs_empty_title: "No versions are defined yet" - backlogs_empty_action_text: "To start using backlogs, please create a version first" - backlogs_not_configured_title: "Backlogs not configured" - backlogs_not_configured_description: "Story and task types need to be set before using this module." - backlogs_not_configured_action_text: "Configure Backlogs" + backlogs_empty_title: "Ainda não foram definidas versões" + backlogs_empty_action_text: "Para começar a utilizar backlogs, crie primeiro uma versão" + backlogs_not_configured_title: "Backlogs não configurados" + backlogs_not_configured_description: "Os tipos de história e de tarefa têm de ser definidos antes de utilizar este módulo." + backlogs_not_configured_action_text: "Configurar backlogs" burndown: - story_points: "Story points" - story_points_ideal: "Story points (ideal)" + story_points: "Pontos de história" + story_points_ideal: "Pontos de história (ideal)" errors: attributes: task_type: @@ -129,18 +129,18 @@ pt-PT: label_points_burn_down: "Abaixo" label_points_burn_up: "Acima" label_sprint_impediments: "Impedimentos de Sprint" - label_sprint_new: "New sprint" + label_sprint_new: "Novo sprint" label_task_board: "Quadro de tarefas" - permission_view_sprints: "View sprints" - permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" - permission_manage_sprint_items: "Manage sprint items" - permission_share_sprint: "Share sprint" + permission_view_sprints: "Ver sprints" + permission_create_sprints: "Criar sprints" + permission_start_complete_sprint: "Iniciar/completar sprint" + permission_manage_sprint_items: "Gerir elementos de sprint" + permission_share_sprint: "Partilhar sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: - blankslate_title: "No burndown data available" - blankslate_description: "Set start and end date for the sprint to generate a burndown chart." + blankslate_title: "Não há dados de burndown disponíveis" + blankslate_description: "Defina a data de início e de fim do sprint para gerar um gráfico de burndown." remaining_hours: "trabalho restante" version_settings_display_label: "Coluna no backlog" version_settings_display_option_left: "esquerda" diff --git a/modules/budgets/config/locales/crowdin/pl.yml b/modules/budgets/config/locales/crowdin/pl.yml index 29b2c968591..5742d0050e8 100644 --- a/modules/budgets/config/locales/crowdin/pl.yml +++ b/modules/budgets/config/locales/crowdin/pl.yml @@ -44,7 +44,7 @@ pl: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "is not a member of the budget's project" + not_a_member_of_budget_project: "nie jest członkiem projektu budżetu" models: budget: "Budżet" material_budget_item: "Jednostka" @@ -76,29 +76,16 @@ pl: heading: "Rozpocznij kontrolowanie projektu" description: "Uzyskaj przegląd swoich budżetów i kosztów, aby skutecznie śledzić stan projektu" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "Brak szczegółów budżetu" + description: "Aby zobaczyć tutaj dane, dodaj szczegóły dotyczące planowanego budżetu" caption: zero: "Brak danych budżetowych." - one: "Dane zagregowane z %{count} budżetu zawarte w %{workspace}." - other: "Dane zagregowane z %{count} budżetów zawarte w %{workspace}." - caption_simple: - one: "Dane zagregowane z %{count} budżetu." - few: "Dane zagregowane z %{count} budżetów." - many: "Dane zagregowane z %{count} budżetów." - other: "Dane zagregowane z %{count} budżetu." - portfolio: - zero: "brak portfoliów" - one: "1 portfolio" - other: "Liczba portfoliów: %{count}" - subprogram: - zero: "brak podprogramów" - one: "1 podprogram" - other: "Liczba podprogramów: %{count}" - subproject: - zero: "brak podprojektów" - one: "1 podprojekt" - other: "Liczba podprojektów: %{count}" + one: "Dane zagregowane z %{count} budżetu zawarte w tej %{workspace}." + other: "Dane zagregowane z %{count} budżetów zawartych na tej %{workspace}." + caption_with_subitems: + zero: "Brak danych budżetowych." + one: "Dane zagregowane z %{count} budżetu zawarte w tej %{workspace} i jej podpozycjach." + other: "Dane zagregowane z %{count} budżetów zawarte w tej %{workspace} i jej podpozycjach." view_details: "Wyświetl szczegóły budżetu" events: budget: "Budżet edytowany" diff --git a/modules/budgets/config/locales/crowdin/pt-PT.yml b/modules/budgets/config/locales/crowdin/pt-PT.yml index 83480d0bcc3..5b893f1062a 100644 --- a/modules/budgets/config/locales/crowdin/pt-PT.yml +++ b/modules/budgets/config/locales/crowdin/pt-PT.yml @@ -44,7 +44,7 @@ pt-PT: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "is not a member of the budget's project" + not_a_member_of_budget_project: "não é membro do projeto do orçamento" models: budget: "Orçamento" material_budget_item: "Unidade" @@ -65,28 +65,28 @@ pt-PT: budgets: widgets: budget_totals: - title: "Budget totals" - remaining_budget: "Remaining budget" - spent_budget: "Spent budget" - total_actual_costs: "Total actual costs" - total_planned_budget: "Total planned budget" + title: "Totais do orçamento" + remaining_budget: "Orçamento restante" + spent_budget: "Orçamento gasto" + total_actual_costs: "Custos totais efetivos" + total_planned_budget: "Orçamento total previsto" budget_by_cost_type: - title: "Budget by cost type" + title: "Orçamento por tipo de custos" blankslate: - heading: "Start project controlling" - description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + heading: "Iniciar o controlo do projeto" + description: "Obtenha uma síntese dos orçamentos e custos para acompanhar eficazmente o estado de saúde do seu projeto" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "Faltam dados orçamentais" + description: "Adicione detalhes sobre o seu orçamento planeado para ver os dados aqui" caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace}." - other: "Data aggregated from %{count} budgets included in this %{workspace}." + zero: "Sem dados de orçamento." + one: "Dados agregados de %{count} de orçamento incluído neste %{workspace}." + other: "Dados agregados de %{count} de orçamentos incluídos neste %{workspace}." caption_with_subitems: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." - other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." - view_details: "View budget details" + zero: "Sem dados de orçamento." + one: "Dados agregados de %{count} de orçamento incluído neste %{workspace} e seus sub-elementos." + other: "Dados agregados de %{count} de orçamentos incluídos neste %{workspace} e seus sub-elementos." + view_details: "Ver detalhes do orçamento" events: budget: "Orçamento editado" help_click_to_edit: "Clique aqui para editar." diff --git a/modules/costs/config/locales/crowdin/pl.yml b/modules/costs/config/locales/crowdin/pl.yml index 2c85b2505f2..b5baf20cc3e 100644 --- a/modules/costs/config/locales/crowdin/pl.yml +++ b/modules/costs/config/locales/crowdin/pl.yml @@ -243,7 +243,7 @@ pl: title: "Rzeczywiste koszty według miesięcy" blankslate: heading: "Zacznij śledzić swój czas i koszty" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." + description: "Uzyskaj przegląd kosztów i zarejestrowanego czasu, aby monitorować postęp projektu. Upewnij się, że pakiety robocze są powiązane z właściwym budżetem." action: "Rejestruj czas pracy" view_details: "Wyświetl szczegóły rzeczywistych kosztów" ee: diff --git a/modules/costs/config/locales/crowdin/pt-PT.yml b/modules/costs/config/locales/crowdin/pt-PT.yml index 770f546807a..80651578281 100644 --- a/modules/costs/config/locales/crowdin/pt-PT.yml +++ b/modules/costs/config/locales/crowdin/pt-PT.yml @@ -205,10 +205,10 @@ pt-PT: project_module_costs: "Tempo e custos" setting_allow_tracking_start_and_end_times: "Permitir horário de início e término" setting_costs_currency: "Moeda" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "Esta é a unidade monetária. Pode ser um código ISO de três letras como EUR, USD ou JPY ou um símbolo como €, $ ou ¥." + setting_costs_currency_format: "Formato da moeda" + setting_costs_currency_format_prefix: "Antes do número (por exemplo, 100 euros)" + setting_costs_currency_format_suffix: "Após o número (por exemplo, 100 EUR)" setting_enforce_tracking_start_and_end_times: "Exigir hora de início e término" setting_enforce_without_allow: "Não é possível exigir horas de início e de fim sem as autorizar" setting_allow_tracking_start_and_end_times_caption: "Permite introduzir as horas de início e de término ao registar o tempo." @@ -232,12 +232,12 @@ pt-PT: costs: widgets: actual_costs: - title: "Actual costs by month" + title: "Custos reais por mês" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." - action: "Log time" - view_details: "View actual costs details" + heading: "Comece a controlar o seu tempo e os seus custos" + description: "Obtenha uma síntese dos custos e do tempo registado para monitorizar o progresso do seu projeto. Confirme se os pacotes de trabalho estão associados ao orçamento correto." + action: "Registo de tempo" + view_details: "Ver detalhes dos custos reais" ee: features: time_entry_time_restrictions: Exigir controlo exato das horas diff --git a/modules/documents/config/locales/crowdin/pt-PT.yml b/modules/documents/config/locales/crowdin/pt-PT.yml index 4dfd1bd241f..ed01d5fd99a 100644 --- a/modules/documents/config/locales/crowdin/pt-PT.yml +++ b/modules/documents/config/locales/crowdin/pt-PT.yml @@ -24,7 +24,7 @@ pt-PT: name: "Documentos do OpenProject" description: "Um plugin OpenProject para permitir a criação de documentos em projetos." attributes: - collaborative_editing_hocuspocus_url: "Hocuspocus server URL" + collaborative_editing_hocuspocus_url: "URL do servidor Hocuspocus" activerecord: errors: models: @@ -123,8 +123,8 @@ pt-PT: some_unwritable: Alguns valores são configurados através de variáveis de ambiente e não podem ser editados aqui. hocuspocus_server_url: label: "URL do servidor Hocuspocus" - caption: "The WebSocket address of a working Hocuspocus server." - invalid_scheme: "Must use a WebSocket protocol (ws:// or wss://)." + caption: "O endereço WebSocket de um servidor Hocuspocus em funcionamento." + invalid_scheme: "Deve utilizar um protocolo WebSocket (ws:// ou wss://)." hocuspocus_server_secret: label: "Segredo do cliente" caption: "Cole o segredo fornecido pelo servidor Hocuspocus." diff --git a/modules/grids/config/locales/crowdin/js-pt-PT.yml b/modules/grids/config/locales/crowdin/js-pt-PT.yml index a8c82c07a3f..9755437ea2a 100644 --- a/modules/grids/config/locales/crowdin/js-pt-PT.yml +++ b/modules/grids/config/locales/crowdin/js-pt-PT.yml @@ -2,12 +2,12 @@ pt-PT: js: grid: add_widget: 'Adicionar widget' - widget_menu_label: 'Show menu options for %{widgetName} widget' + widget_menu_label: 'Mostrar opções de menu para o widget %{widgetName}' remove: 'Remover o widget' configure: 'Configurar widget' widgets: missing_permission: "Não tem as permissões necessárias para visualizar este widget." - not_available: "This widget is currently unavailable." + not_available: "Este widget não está disponível de momento." custom_text: title: 'Texto personalizado' documents: diff --git a/modules/meeting/config/locales/crowdin/pl.yml b/modules/meeting/config/locales/crowdin/pl.yml index 9bf0cfafd32..8ea02388ab9 100644 --- a/modules/meeting/config/locales/crowdin/pl.yml +++ b/modules/meeting/config/locales/crowdin/pl.yml @@ -62,7 +62,7 @@ pl: end_date: "Data zakończenia" iterations: "Wystąpienia" recurring_meeting_interim_response: - start_time: "Start time" + start_time: "Czas rozpoczęcia" meeting_participant: invited: "Zaproszeni" attended: "Uczestniczył" @@ -75,7 +75,7 @@ pl: section_not_belong_to_meeting: "Sekcja nie należy do tego samego spotkania." user_invalid: "nie jest prawidłowym uczestnikiem." recurring_meeting_interim_response: - not_an_occurrence: "is not a valid occurrence time for this recurring meeting" + not_an_occurrence: "nie jest prawidłowym czasem wystąpienia tego spotkania cyklicznego" recurring_meeting: must_cover_existing_meetings: one: "W serii znajduje się jedno otwarte spotkanie, które nie jest uwzględnione w nowym harmonogramie. Dostosuj harmonogram tak, aby obejmował wszystkie istniejące spotkania." @@ -256,9 +256,9 @@ pl: header: "Anulowano: spotkanie „%{title}”" header_occurrence: "Anulowano: wystąpienie spotkania „%{title}”" header_series: "Anulowano: serię spotkań „%{title}”" - 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" + summary_occurrence: "Wystąpienie „%{title}” zostało anulowane przez użytkownika %{actor} lub usunięto Cię jako uczestnika" + summary_series: "Seria spotkań „%{title}” została anulowana przez użytkownika %{actor} lub usunięto Cię jako uczestnika" + summary: "„%{title}” anulował użytkownik %{actor} lub usunięto Cię jako uczestnika" date_time: "Zaplanowana data/godzina" participant_added: header: "Spotkanie „%{title}” — dodano uczestnika" @@ -272,7 +272,7 @@ pl: summary_series: "Użytkownik %{actor} usunął uczestnika %{participant} z serii spotkań „%{title}”" ended: header_series: "Zakończono: serię spotkań „%{title}”" - summary_series: "Meeting series '%{title}' has been ended by %{actor}" + summary_series: "Seria spotkań „%{title}” została zakończona przez użytkownika %{actor}" updated: header: "Spotkanie „%{title}” zostało zaktualizowane" summary: "Spotkanie „%{title}” zostało zaktualizowane przez użytkownika %{actor}" @@ -565,8 +565,8 @@ pl: label_agenda_item_move_up: "Przenieś wyżej" label_agenda_item_move_down: "Przenieś niżej" label_agenda_item_duplicate: "Duplikuj" - label_agenda_item_duplicate_in_next: "Duplicate in next meeting" - label_agenda_item_duplicate_in_next_title: "Duplicate in next meeting?" + label_agenda_item_duplicate_in_next: "Duplikuj w następnym spotkaniu" + 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_work_package_add: "Dodaj pakiet roboczy" diff --git a/modules/meeting/config/locales/crowdin/pt-PT.yml b/modules/meeting/config/locales/crowdin/pt-PT.yml index 8215ffdc035..224a445c740 100644 --- a/modules/meeting/config/locales/crowdin/pt-PT.yml +++ b/modules/meeting/config/locales/crowdin/pt-PT.yml @@ -60,7 +60,7 @@ pt-PT: end_date: "Data de fim" iterations: "Ocorrências" recurring_meeting_interim_response: - start_time: "Start time" + start_time: "Hora de início" meeting_participant: invited: "Convidados" attended: "Participou" @@ -68,12 +68,12 @@ pt-PT: errors: models: meeting_participant: - user_invalid: "is not a valid participant." + user_invalid: "não é um participante válido." meeting_agenda_item: - section_not_belong_to_meeting: "Section does not belong to the same meeting." - user_invalid: "is not a valid participant." + section_not_belong_to_meeting: "A secção não pertence à mesma reunião." + user_invalid: "não é um participante válido." recurring_meeting_interim_response: - not_an_occurrence: "is not a valid occurrence time for this recurring meeting" + not_an_occurrence: "não é uma hora de ocorrência válida para esta reunião periódica" recurring_meeting: must_cover_existing_meetings: one: "Há uma reunião aberta na série que não é abrangida pelo novo calendário. Ajuste o calendário para incluir todas as reuniões existentes." @@ -118,15 +118,15 @@ pt-PT: error_notification_with_errors: "Falha ao enviar a notificação. Os seguintes destinatários não podem ser notificados: %{recipients}" label_meeting: "Reunião" label_meeting_plural: "Reuniões" - label_meeting_templates: "Templates" - label_meeting_template: "Template" - label_meeting_template_new: "New template" - label_meeting_template_create: "Create template" - label_meeting_template_delete: "Delete template" - label_meeting_template_edit: "Edit template" - label_meeting_create_from_template: "Create meeting from template" + label_meeting_templates: "Modelos" + label_meeting_template: "Modelo" + label_meeting_template_new: "Novo modelo" + label_meeting_template_create: "Criar novo modelo" + label_meeting_template_delete: "Eliminar modelo" + label_meeting_template_edit: "Editar modelo" + label_meeting_create_from_template: "Criar reunião a partir de modelo" label_meeting_new: "Nova reunião" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_meeting_template_select: "Selecione um modelo para copiar automaticamente os seus pontos da agenda" label_meeting_new_dynamic: "Nova reunião única" label_meeting_new_recurring: "Nova reunião recorrente" label_meeting_create: "Criar reunião" @@ -246,9 +246,9 @@ pt-PT: header: "Cancelada: Reunião \"%{title}\"" header_occurrence: "Cancelada: ocorrência de reunião \"%{title}\"" header_series: "Cancelada: série de reuniões \"%{title}\"" - 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" + summary_occurrence: "Uma ocorrência de '%{title}' foi cancelada por %{actor}, ou foi removido como participante" + summary_series: "A série de reuniões '%{title}' foi cancelada por %{actor}, ou foi removido como participante" + summary: "'%{title}' foi cancelado por %{actor}, ou foi removido como participante" date_time: "Data/hora programada" participant_added: header: "Reunião '%{title}' - Participante adicionado" @@ -262,7 +262,7 @@ pt-PT: summary_series: "%{actor} removeu %{participant} da série de reuniões '%{title}'" ended: header_series: "Terminada: Série de reuniões \"%{title}\"" - summary_series: "Meeting series '%{title}' has been ended by %{actor}" + summary_series: "A série de reuniões \"%{title}\" foi terminada por %{actor}" updated: header: "A reunião '%{title}' foi atualizada" summary: "A reunião '%{title}' foi atualizada por %{actor}" @@ -288,8 +288,8 @@ pt-PT: confirmation_message_html: > Esta ação não pode ser anulada. Proceda com cuidado. template: - title: "Delete template" - heading: "Delete this template?" + title: "Eliminar modelo" + heading: "Eliminar este modelo?" occurrence: title: "Cancelar ocorrência de reunião" heading: "Cancelar esta ocorrência de reunião?" @@ -489,7 +489,7 @@ pt-PT: end_series_dialog: title: "Terminar série de reuniões" notice_successful_notification: "Atualização de calendário por e-mail enviada a todos os participantes" - notice_meeting_template_created: "Template successfully created" + notice_meeting_template_created: "Modelo criado com êxito" notice_timezone_missing: Sem fuso horário definido, presume-se %{zone}. Para escolher o seu fuso horário, por favor clique aqui. notice_meeting_updated: "Esta página foi atualizada por outra pessoa. Recarregue para ver as alterações." permission_create_meetings: "Criar reuniões" @@ -504,8 +504,8 @@ pt-PT: text_duration_in_hours: "Duração em horas" text_in_hours: "em horas" text_meeting_agenda_for_meeting: 'agenda para a reunião "%{meeting}"' - text_meeting_template_blank_slate_heading: "There are no templates to display" - text_meeting_template_blank_slate: "You can create a new template for one-time meetings" + text_meeting_template_blank_slate_heading: "Não há modelos para apresentar" + text_meeting_template_blank_slate: "Pode criar um novo modelo para reuniões únicas" text_meeting_series_end_early_heading: "Eliminar ocorrências futuras?" text_meeting_series_end_early: "Ao terminar a série, elimina todas as ocorrências de reuniões futuras abertas ou agendadas" text_meeting_closing_are_you_sure: "Tem a certeza de que deseja fechar a agenda da reunião?" @@ -551,8 +551,8 @@ pt-PT: label_agenda_item_move_up: "Subir" label_agenda_item_move_down: "Descer" label_agenda_item_duplicate: "Duplicar" - label_agenda_item_duplicate_in_next: "Duplicate in next meeting" - label_agenda_item_duplicate_in_next_title: "Duplicate in next meeting?" + label_agenda_item_duplicate_in_next: "Duplicar na próxima reunião" + 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_work_package_add: "Adicionar pacote de trabalho" @@ -611,9 +611,9 @@ pt-PT: text_meeting_in_progress_dropdown_description: "Documentar os resultados, como as necessidades de informação ou as decisões tomadas durante a reunião." text_meeting_closed_dropdown_description: "Esta reunião está encerrada. Já não é possível modificar os pontos da ordem de trabalhos ou os resultados." text_meeting_draft_banner: "Está no modo de rascunho. Esta reunião não enviará atualizações de calendário ou convites, mesmo que altere os detalhes da reunião ou adicione/remova participantes." - 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." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_banner: "Está a editar um modelo de reunião. Pode utilizar este modelo para criar reuniões únicas com uma agenda predefinida. As alterações não afetarão as reuniões já criadas." + text_onetime_meeting_template_empty_heading: "Este modelo de reunião está vazio" + text_onetime_meeting_template_description: "Adicione elementos da agenda e anexos a este modelo. Serão incluídos em todas as reuniões com base neste modelo." text_exit_draft_mode_dialog_title: "Abrir esta reunião e enviar convites?" text_exit_draft_mode_dialog_subtitle: "Não pode regressar ao modo de rascunho após agendar uma reunião." text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?" From fbb4cb4793e327e33d4218af200eb3e47950d62b Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Fri, 6 Mar 2026 03:48:39 +0000 Subject: [PATCH 167/334] update locales from crowdin [ci skip] --- .../backlogs/config/locales/crowdin/zh-CN.yml | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index 25a17221901..081e2ecbb07 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -26,13 +26,13 @@ zh-CN: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" + duration: "持续时间" + finish_date: "完成日期" + goal: "冲刺目标" + name: "冲刺名称" sharing: "Sharing" sprint: - duration: "Sprint duration" + duration: "冲刺持续时间" work_package: position: "位置" story_points: "故事点" @@ -49,12 +49,12 @@ zh-CN: sprint: cannot_end_before_it_starts: "比赛不可以在开始前结束。" models: - sprint: "Sprint" + sprint: "冲刺" attributes: task_type: "任务类型" backlogs: any: "任一" - column_width: "Column width" + column_width: "列宽" definition_of_done: "完成的定义" impediment: "障碍" label_versions_default_fold_state: "显示已折叠的版本" @@ -62,7 +62,7 @@ zh-CN: work_package_is_closed: "工作包已完成,当" label_is_done_status: "状态 %{status_name} 表示已完成" points_label: - other: "points" + other: "点数" positions_could_not_be_rebuilt: "无法重建顺序" positions_rebuilt_successfully: "已成功重建顺序" rebuild: "重建" @@ -71,7 +71,7 @@ zh-CN: show_burndown_chart: "燃尽图" story: "故事" story_points: - other: "%{count} story points" + other: "%{count} 个故事点" task: "任务" task_color: "任务颜色" unassigned: "未指定" @@ -79,18 +79,18 @@ zh-CN: header_backlogs: "积压工作模块" button_update_backlogs: "更新积压工作模块" backlog_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} 为空" + blankslate_description: "尚未计划项目。将项目拖到此处即可添加。" backlog_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "折叠/展开 %{name}" label_story_count: - zero: "No stories in backlog" - one: "%{count} story in backlog" - other: "%{count} stories in backlog" + zero: "待办清单中没有故事" + one: "待办清单中有 %{count} 个故事" + other: "待办清单中有 %{count} 个故事" backlog_menu_component: - label_actions: "Backlog actions" + label_actions: "待办清单操作" action_menu: - edit_sprint: "Edit sprint" + edit_sprint: "编辑冲刺" new_story: "New story" stories_tasks: "Stories/Tasks" task_board: "Task board" From c4c762fbd23b434851f5d1d65df36db0b9a1c8a2 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Fri, 6 Mar 2026 08:04:15 +0100 Subject: [PATCH 168/334] Indicate session cookies as SameSite=lax This is an additional measure ensuring that cross-site requests can't be performed in the scope of the user's session. Some browsers might already expose this as the default behaviour, but it's generally recommended to set this explicitly whenever a cookie is not needed in a cross-site context. --- config/initializers/session_store.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index a0b70d27cf2..4ecc5bc38c9 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -36,6 +36,7 @@ relative_url_root = config["rails_relative_url_root"].presence session_options = { key: config["session_cookie_name"], httponly: true, + same_site: :lax, secure: config.https?, path: relative_url_root } From 4880f52515f22558365048c8f02ba2ff4d130163 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Wed, 4 Mar 2026 17:36:01 +0100 Subject: [PATCH 169/334] Add template sharing --- .../meetings/index/form_component.rb | 2 +- .../side_panel/sharing_component.html.erb | 66 +++++++++++++++++++ .../meetings/side_panel/sharing_component.rb | 58 ++++++++++++++++ .../meetings/side_panel_component.html.erb | 4 ++ .../app/contracts/meetings/base_contract.rb | 1 + .../meetings/agenda_component_streams.rb | 10 +++ .../meeting_templates_controller.rb | 12 ++-- .../app/controllers/meetings_controller.rb | 21 +++++- .../forms/meeting/template_autocompleter.rb | 2 +- modules/meeting/app/models/meeting.rb | 19 ++++++ .../meetings/set_attributes_service.rb | 3 +- modules/meeting/config/locales/en.yml | 7 ++ modules/meeting/config/routes.rb | 1 + .../20260302152255_add_sharing_to_meetings.rb | 35 ++++++++++ .../lib/open_project/meeting/engine.rb | 2 +- 15 files changed, 232 insertions(+), 11 deletions(-) create mode 100644 modules/meeting/app/components/meetings/side_panel/sharing_component.html.erb create mode 100644 modules/meeting/app/components/meetings/side_panel/sharing_component.rb create mode 100644 modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb diff --git a/modules/meeting/app/components/meetings/index/form_component.rb b/modules/meeting/app/components/meetings/index/form_component.rb index 119128c8f43..6e3e1dfe2ed 100644 --- a/modules/meeting/app/components/meetings/index/form_component.rb +++ b/modules/meeting/app/components/meetings/index/form_component.rb @@ -83,7 +83,7 @@ module Meetings def available_templates return [] unless @project - @available_templates ||= Meeting.onetime_templates.where(project: @project).visible + @available_templates ||= Meeting.templates_visible_in_project(@project) end end end diff --git a/modules/meeting/app/components/meetings/side_panel/sharing_component.html.erb b/modules/meeting/app/components/meetings/side_panel/sharing_component.html.erb new file mode 100644 index 00000000000..b1364f077a5 --- /dev/null +++ b/modules/meeting/app/components/meetings/side_panel/sharing_component.html.erb @@ -0,0 +1,66 @@ +<%#-- 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. + +++#%> + +<%= + component_wrapper do + render(Primer::OpenProject::SidePanel::Section.new) do |section| + section.with_title { t(:label_meeting_template_sharing) } + + flex_layout do |content| + content.with_row do + render(Primer::Beta::Text.new(color: :subtle)) do + t(:text_meeting_template_sharing_description) + end + end + + content.with_row(mt: 3) do + render(Primer::Alpha::ActionMenu.new) do |menu| + menu.with_show_button(scheme: :secondary) do |button| + button.with_trailing_visual_icon(icon: :"triangle-down") + sharing_label(@meeting.sharing) + end + + Meeting.sharings.each_key do |sharing| + menu.with_item( + label: sharing_label(sharing), + tag: :a, + href: change_sharing_path(sharing), + content_arguments: { data: { + action: "click->meetings--submit#intercept", + href: change_sharing_path(sharing), + method: "PUT" + } } + ) + end + end + end + end + end + end +%> diff --git a/modules/meeting/app/components/meetings/side_panel/sharing_component.rb b/modules/meeting/app/components/meetings/side_panel/sharing_component.rb new file mode 100644 index 00000000000..89547b5620a --- /dev/null +++ b/modules/meeting/app/components/meetings/side_panel/sharing_component.rb @@ -0,0 +1,58 @@ +# 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 Meetings + class SidePanel::SharingComponent < ApplicationComponent + include ApplicationHelper + include OpTurbo::Streamable + include OpPrimer::ComponentHelpers + + def initialize(meeting:) + super + + @meeting = meeting + @project = meeting.project + end + + def render? + User.current.allowed_in_project?(:edit_meetings, @project) + end + + private + + def sharing_label(sharing) + I18n.t("label_meeting_template_sharing_#{sharing}") + end + + def change_sharing_path(sharing) + change_sharing_project_meeting_path(@project, @meeting, sharing:) + end + end +end diff --git a/modules/meeting/app/components/meetings/side_panel_component.html.erb b/modules/meeting/app/components/meetings/side_panel_component.html.erb index c8ceb86e01f..1280f39c3b7 100644 --- a/modules/meeting/app/components/meetings/side_panel_component.html.erb +++ b/modules/meeting/app/components/meetings/side_panel_component.html.erb @@ -20,6 +20,10 @@ ) end + if @meeting.onetime_template? + panel.with_section(Meetings::SidePanel::SharingComponent.new(meeting: @meeting)) + end + panel.with_section( Meetings::SidePanel::AttachmentsComponent.new(meeting: @meeting), grid_row_arguments: desktop_grid_row_arguments diff --git a/modules/meeting/app/contracts/meetings/base_contract.rb b/modules/meeting/app/contracts/meetings/base_contract.rb index 8e51766fad3..48c1a120bcf 100644 --- a/modules/meeting/app/contracts/meetings/base_contract.rb +++ b/modules/meeting/app/contracts/meetings/base_contract.rb @@ -44,5 +44,6 @@ module Meetings attribute :start_time_hour attribute :template attribute :notify + attribute :sharing end end diff --git a/modules/meeting/app/controllers/concerns/meetings/agenda_component_streams.rb b/modules/meeting/app/controllers/concerns/meetings/agenda_component_streams.rb index 4f6792e8d26..b38ec1790b5 100644 --- a/modules/meeting/app/controllers/concerns/meetings/agenda_component_streams.rb +++ b/modules/meeting/app/controllers/concerns/meetings/agenda_component_streams.rb @@ -89,6 +89,16 @@ module Meetings ) end + def update_sidebar_sharing_component_via_turbo_stream(meeting: @meeting) + return unless meeting.onetime_template? + + update_via_turbo_stream( + component: Meetings::SidePanel::SharingComponent.new( + meeting: + ) + ) + end + def update_add_user_form_component_via_turbo_stream(meeting: @meeting) update_via_turbo_stream( component: Meetings::Participants::AddUserFormComponent.new(meeting:) diff --git a/modules/meeting/app/controllers/meeting_templates_controller.rb b/modules/meeting/app/controllers/meeting_templates_controller.rb index 0e8b706fda4..0e6bb7074f4 100644 --- a/modules/meeting/app/controllers/meeting_templates_controller.rb +++ b/modules/meeting/app/controllers/meeting_templates_controller.rb @@ -40,11 +40,13 @@ class MeetingTemplatesController < ApplicationController menu_item :meetings def index - @templates = Meeting.onetime_templates - .visible - .order(:title) - - @templates = @templates.where(project_id: @project.id) if @project + @templates = if @project + Meeting.available_onetime_templates.where(project_id: @project.id).order(:title) + else + accessible_ids = Project.allowed_to(User.current, :view_meetings).select(:id) + base = Meeting.available_onetime_templates + base.where(project_id: accessible_ids).or(base.where(sharing: :system)).order(:title) + end render "meeting_templates/index", locals: { menu_name: project_or_global_menu } diff --git a/modules/meeting/app/controllers/meetings_controller.rb b/modules/meeting/app/controllers/meetings_controller.rb index ebcc37486e9..6440ca0fa22 100644 --- a/modules/meeting/app/controllers/meetings_controller.rb +++ b/modules/meeting/app/controllers/meetings_controller.rb @@ -292,6 +292,23 @@ class MeetingsController < ApplicationController respond_with_turbo_streams end + def change_sharing + sharing = params[:sharing] + + if Meeting.sharings.key?(sharing) + call = ::Meetings::UpdateService + .new(user: current_user, model: @meeting) + .call(sharing:) + + render_base_error_in_flash_message_via_turbo_stream(call.errors) unless call.success? + end + + update_header_component_via_turbo_stream + update_sidebar_sharing_component_via_turbo_stream + + respond_with_turbo_streams + end + def download_ics ::Meetings::ICalService .new(user: current_user, meeting: @meeting) @@ -467,7 +484,7 @@ class MeetingsController < ApplicationController @meeting = call.result # When coming from the "Create from template" button, load the template to hide the form field - @copy_from = Meeting.onetime_templates.visible.find_by(id: params[:template_id]) if params[:template_id].present? + @copy_from = Meeting.templates_visible_in_project(@project).find_by(id: params[:template_id]) if params[:template_id].present? end def global_upcoming_meetings @@ -561,7 +578,7 @@ class MeetingsController < ApplicationController # Check for template selection from form submission template_id = params[:meeting][:template_id] if template_id.present? - @copy_from = Meeting.onetime_templates.visible.find_by(id: template_id) + @copy_from = Meeting.templates_visible_in_project(@project).find_by(id: template_id) return end diff --git a/modules/meeting/app/forms/meeting/template_autocompleter.rb b/modules/meeting/app/forms/meeting/template_autocompleter.rb index e236a3d1ec5..3a4f94ea3a0 100644 --- a/modules/meeting/app/forms/meeting/template_autocompleter.rb +++ b/modules/meeting/app/forms/meeting/template_autocompleter.rb @@ -61,6 +61,6 @@ class Meeting::TemplateAutocompleter < ApplicationForm private def templates - Meeting.onetime_templates.where(project: @project).visible.order(:title) + Meeting.templates_visible_in_project(@project).order(:title) end end diff --git a/modules/meeting/app/models/meeting.rb b/modules/meeting/app/models/meeting.rb index d5af7813fbf..154e008831f 100644 --- a/modules/meeting/app/models/meeting.rb +++ b/modules/meeting/app/models/meeting.rb @@ -91,6 +91,10 @@ class Meeting < ApplicationRecord joins(:participants).where(meeting_participants: { user_id: user.id }) } + scope :available_onetime_templates, -> { + onetime_templates.where(project_id: Project.active.select(:id)) + } + acts_as_attachable( after_remove: :attachments_changed, order: "#{Attachment.table_name}.file", @@ -135,6 +139,21 @@ class Meeting < ApplicationRecord closed: 5 } + enum :sharing, { + none: 0, + descendants: 1, + system: 2 + }, prefix: :sharing + + def self.templates_visible_in_project(project, user = User.current) + accessible_ids = Project.allowed_to(user, :view_meetings).select(:id) + + available_onetime_templates + .where(project_id: project.id).where(project_id: accessible_ids) + .or(available_onetime_templates.where(sharing: :descendants, project_id: project.ancestors.select(:id))) + .or(available_onetime_templates.where(sharing: :system)) + end + def recurring? recurring_meeting_id.present? end diff --git a/modules/meeting/app/services/meetings/set_attributes_service.rb b/modules/meeting/app/services/meetings/set_attributes_service.rb index b8cd8b93a4b..08d18200012 100644 --- a/modules/meeting/app/services/meetings/set_attributes_service.rb +++ b/modules/meeting/app/services/meetings/set_attributes_service.rb @@ -41,12 +41,13 @@ module Meetings end end - def set_default_attributes(_params) + def set_default_attributes(_params) # rubocop:disable Metrics/AbcSize model.change_by_system do model.author = user model.duration ||= 1 model.state = "draft" if !model.recurring? || model.template? model.notify = false + model.sharing = "none" end end diff --git a/modules/meeting/config/locales/en.yml b/modules/meeting/config/locales/en.yml index 89e4c92930f..240ac76627a 100644 --- a/modules/meeting/config/locales/en.yml +++ b/modules/meeting/config/locales/en.yml @@ -53,6 +53,7 @@ en: start_date: "Date" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -688,6 +689,12 @@ en: text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." diff --git a/modules/meeting/config/routes.rb b/modules/meeting/config/routes.rb index 6679305e5f2..fecf73d4ee0 100644 --- a/modules/meeting/config/routes.rb +++ b/modules/meeting/config/routes.rb @@ -73,6 +73,7 @@ Rails.application.routes.draw do get :details_dialog put :update_details put :change_state + put :change_sharing post :notify get :history get :delete_dialog diff --git a/modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb b/modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb new file mode 100644 index 00000000000..8826f7ac30c --- /dev/null +++ b/modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb @@ -0,0 +1,35 @@ +# 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. +#++ + +class AddSharingToMeetings < ActiveRecord::Migration[8.1] + def change + add_column :meetings, :sharing, :integer, null: false, default: 0 + end +end diff --git a/modules/meeting/lib/open_project/meeting/engine.rb b/modules/meeting/lib/open_project/meeting/engine.rb index ea092bf9af0..da1df3a357e 100644 --- a/modules/meeting/lib/open_project/meeting/engine.rb +++ b/modules/meeting/lib/open_project/meeting/engine.rb @@ -65,7 +65,7 @@ module OpenProject::Meeting contract_actions: { meetings: %i[create] } permission :edit_meetings, { - meetings: %i[edit cancel_edit update update_title change_state toggle_notifications_dialog + meetings: %i[edit cancel_edit update update_title change_state change_sharing toggle_notifications_dialog details_dialog update_details toggle_notifications exit_draft_mode_dialog exit_draft_mode], recurring_meetings: %i[edit cancel_edit update update_title details_dialog update_details notify end_series end_series_dialog], From 067e4b5f0a41bf871bd5d42da0a517798e536585 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Thu, 5 Mar 2026 16:48:09 +0100 Subject: [PATCH 170/334] Add model and request specs --- modules/meeting/spec/models/meeting_spec.rb | 52 ++++++++++++++ .../spec/requests/meeting_templates_spec.rb | 70 +++++++++++++++++++ .../meeting/spec/requests/meetings_spec.rb | 46 ++++++++++++ 3 files changed, 168 insertions(+) diff --git a/modules/meeting/spec/models/meeting_spec.rb b/modules/meeting/spec/models/meeting_spec.rb index 50e3395aff5..bcdaff8501e 100644 --- a/modules/meeting/spec/models/meeting_spec.rb +++ b/modules/meeting/spec/models/meeting_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + #-- copyright # OpenProject is an open source project management software. # Copyright (C) the OpenProject GmbH @@ -189,4 +190,55 @@ RSpec.describe Meeting do end end end + + describe ".templates_visible_in_project" do + shared_let(:ancestor_project) { create(:project) } + shared_let(:current_project) { create(:project, parent: ancestor_project) } + shared_let(:descendant_project) { create(:project, parent: current_project) } + shared_let(:unrelated_project) { create(:project) } + + shared_let(:user) { create(:user, member_with_permissions: { current_project => [:view_meetings] }) } + + subject { described_class.templates_visible_in_project(current_project, user) } + + context "with templates in the same project" do + shared_let(:template_none) { create(:onetime_template, project: current_project, sharing: :none) } + shared_let(:template_descendants) { create(:onetime_template, project: current_project, sharing: :descendants) } + shared_let(:template_system) { create(:onetime_template, project: current_project, sharing: :system) } + + it { expect(subject).to include(template_none) } + it { expect(subject).to include(template_descendants) } + it { expect(subject).to include(template_system) } + end + + context "with templates in an unrelated project" do + shared_let(:template_none) { create(:onetime_template, project: unrelated_project, sharing: :none) } + shared_let(:template_descendants) { create(:onetime_template, project: unrelated_project, sharing: :descendants) } + shared_let(:template_system) { create(:onetime_template, project: unrelated_project, sharing: :system) } + + it { expect(subject).not_to include(template_none) } + it { expect(subject).not_to include(template_descendants) } + it { expect(subject).to include(template_system) } + end + + context "with templates in a descendant project" do + shared_let(:template_none) { create(:onetime_template, project: descendant_project, sharing: :none) } + shared_let(:template_descendants) { create(:onetime_template, project: descendant_project, sharing: :descendants) } + shared_let(:template_system) { create(:onetime_template, project: descendant_project, sharing: :system) } + + it { expect(subject).not_to include(template_none) } + it { expect(subject).not_to include(template_descendants) } + it { expect(subject).to include(template_system) } + end + + context "with templates in an ancestor project" do + shared_let(:template_none) { create(:onetime_template, project: ancestor_project, sharing: :none) } + shared_let(:template_descendants) { create(:onetime_template, project: ancestor_project, sharing: :descendants) } + shared_let(:template_system) { create(:onetime_template, project: ancestor_project, sharing: :system) } + + it { expect(subject).not_to include(template_none) } + it { expect(subject).to include(template_descendants) } + it { expect(subject).to include(template_system) } + end + end end diff --git a/modules/meeting/spec/requests/meeting_templates_spec.rb b/modules/meeting/spec/requests/meeting_templates_spec.rb index 10bbb49baed..0c0c9b1cc75 100644 --- a/modules/meeting/spec/requests/meeting_templates_spec.rb +++ b/modules/meeting/spec/requests/meeting_templates_spec.rb @@ -204,4 +204,74 @@ RSpec.describe "Meeting templates requests", end end end + + describe "GET /projects/:id/meetings/templates (project templates index page)" do + shared_let(:ancestor_project) { create(:project, enabled_module_names: %i[meetings]) } + shared_let(:current_project) { create(:project, enabled_module_names: %i[meetings], parent: ancestor_project) } + shared_let(:descendant_project) { create(:project, enabled_module_names: %i[meetings], parent: current_project) } + shared_let(:unrelated_project) { create(:project, enabled_module_names: %i[meetings]) } + + shared_let(:user) do + create(:user, member_with_permissions: { current_project => %i[view_meetings] }) + end + + shared_let(:own_template) { create(:onetime_template, project: current_project, title: "Own template") } + shared_let(:ancestor_none_template) do + create(:onetime_template, project: ancestor_project, sharing: :none, title: "Ancestor none") + end + shared_let(:ancestor_descendants_template) do + create(:onetime_template, project: ancestor_project, sharing: :descendants, title: "Ancestor descendants") + end + shared_let(:descendant_template) do + create(:onetime_template, project: descendant_project, sharing: :descendants, title: "Descendant template") + end + shared_let(:system_template) do + create(:onetime_template, project: unrelated_project, sharing: :system, title: "System template") + end + + before { login_as user } + + it "shows only templates belonging to the project, regardless of sharing level" do + get templates_project_meetings_path(current_project) + + expect(response.body).to include("Own template") + + expect(response.body).not_to include("Ancestor none") + expect(response.body).not_to include("Ancestor descendants") + expect(response.body).not_to include("Descendant template") + expect(response.body).not_to include("System template") + end + end + + describe "GET /meetings/templates (global templates index page)" do + shared_let(:accessible_project) { create(:project, enabled_module_names: %i[meetings]) } + shared_let(:inaccessible_project) { create(:project, enabled_module_names: %i[meetings]) } + + shared_let(:user) do + create(:user, member_with_permissions: { accessible_project => %i[view_meetings] }) + end + + shared_let(:own_template) { create(:onetime_template, project: accessible_project, title: "Own template") } + shared_let(:inaccessible_none_template) do + create(:onetime_template, project: inaccessible_project, sharing: :none, title: "Inaccessible none") + end + shared_let(:inaccessible_descendants_template) do + create(:onetime_template, project: inaccessible_project, sharing: :descendants, title: "Inaccessible descendants") + end + shared_let(:system_template) do + create(:onetime_template, project: inaccessible_project, sharing: :system, title: "System template") + end + + before { login_as user } + + it "shows system templates and templates from accessible projects" do + get templates_meetings_path + + expect(response.body).to include("Own template") + expect(response.body).to include("System template") + + expect(response.body).not_to include("Inaccessible none") + expect(response.body).not_to include("Inaccessible descendants") + end + end end diff --git a/modules/meeting/spec/requests/meetings_spec.rb b/modules/meeting/spec/requests/meetings_spec.rb index 86c060c4946..38b95110020 100644 --- a/modules/meeting/spec/requests/meetings_spec.rb +++ b/modules/meeting/spec/requests/meetings_spec.rb @@ -201,4 +201,50 @@ RSpec.describe "Meeting requests", end end end + + describe "GET new_dialog - template selector visibility", with_ee: [:meeting_templates] do + shared_let(:ancestor_project) { create(:project, enabled_module_names: %i[meetings]) } + shared_let(:current_project) { create(:project, enabled_module_names: %i[meetings], parent: ancestor_project) } + shared_let(:descendant_project) { create(:project, enabled_module_names: %i[meetings], parent: current_project) } + shared_let(:unrelated_project) { create(:project, enabled_module_names: %i[meetings]) } + + shared_let(:user) do + create(:user, member_with_permissions: { current_project => %i[view_meetings create_meetings] }) + end + + shared_let(:own_template) { create(:onetime_template, project: current_project, title: "Own template") } + shared_let(:ancestor_none_template) do + create(:onetime_template, project: ancestor_project, sharing: :none, title: "Ancestor none") + end + shared_let(:ancestor_descendants_template) do + create(:onetime_template, project: ancestor_project, sharing: :descendants, title: "Ancestor descendants") + end + shared_let(:descendant_none_template) do + create(:onetime_template, project: descendant_project, sharing: :none, title: "Descendant none") + end + shared_let(:descendant_descendants_template) do + create(:onetime_template, project: descendant_project, sharing: :descendants, title: "Descendant descendants") + end + shared_let(:unrelated_none_template) do + create(:onetime_template, project: unrelated_project, sharing: :none, title: "Unrelated none") + end + shared_let(:system_template) do + create(:onetime_template, project: unrelated_project, sharing: :system, title: "System template") + end + + before { login_as user } + + it "shows own and those shared with descendants and all projects" do + get new_dialog_project_meetings_path(current_project), as: :turbo_stream + + expect(response.body).to include("Own template") + expect(response.body).to include("Ancestor descendants") + expect(response.body).to include("System template") + + expect(response.body).not_to include("Ancestor none") + expect(response.body).not_to include("Descendant none") + expect(response.body).not_to include("Descendant descendants") + expect(response.body).not_to include("Unrelated none") + end + end end From 2e719ba283a5f6b259527412e94272725875e378 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Thu, 5 Mar 2026 17:51:20 +0100 Subject: [PATCH 171/334] Add feature spec --- .../template_sharing_spec.rb | 159 ++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 modules/meeting/spec/features/meeting_templates/template_sharing_spec.rb diff --git a/modules/meeting/spec/features/meeting_templates/template_sharing_spec.rb b/modules/meeting/spec/features/meeting_templates/template_sharing_spec.rb new file mode 100644 index 00000000000..8442ed84632 --- /dev/null +++ b/modules/meeting/spec/features/meeting_templates/template_sharing_spec.rb @@ -0,0 +1,159 @@ +# 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_relative "../../support/pages/meetings/show" +require_relative "../../support/pages/meetings/index" + +RSpec.describe "Template sharing", :js do + shared_let(:project) { create(:project, enabled_module_names: %i[meetings]) } + shared_let(:template) { create(:onetime_template, project:, title: "My template", sharing: :none) } + + let(:show_page) { Pages::Meetings::Show.new(template) } + + context "as user with edit_meetings permission" do + shared_let(:editor) do + create(:user, member_with_permissions: { project => %i[view_meetings edit_meetings] }) + end + + before do + login_as editor + show_page.visit! + end + + it "shows the sharing section in the sidebar" do + expect(page).to have_text(I18n.t(:label_meeting_template_sharing)) + expect(page).to have_text(I18n.t(:label_meeting_template_sharing_none)) + end + + it "can change sharing to subprojects" do + within("#meetings-side-panel-sharing-component") do + click_button I18n.t(:label_meeting_template_sharing_none) + click_link_or_button I18n.t(:label_meeting_template_sharing_descendants) + end + + wait_for_network_idle + + expect(page).to have_text(I18n.t(:label_meeting_template_sharing_descendants)) + expect(template.reload.sharing).to eq("descendants") + end + + it "can change sharing to all projects" do + within("#meetings-side-panel-sharing-component") do + click_button I18n.t(:label_meeting_template_sharing_none) + click_link_or_button I18n.t(:label_meeting_template_sharing_system) + end + + wait_for_network_idle + + expect(page).to have_text(I18n.t(:label_meeting_template_sharing_system)) + expect(template.reload.sharing).to eq("system") + end + + it "can change sharing back to only this project" do + template.update!(sharing: :descendants) + show_page.visit! + + within("#meetings-side-panel-sharing-component") do + click_button I18n.t(:label_meeting_template_sharing_descendants) + click_link_or_button I18n.t(:label_meeting_template_sharing_none) + end + + wait_for_network_idle + + expect(page).to have_text(I18n.t(:label_meeting_template_sharing_none)) + expect(template.reload.sharing).to eq("none") + end + end + + context "as user with view_meetings only" do + shared_let(:viewer) do + create(:user, member_with_permissions: { project => %i[view_meetings] }) + end + + before do + login_as viewer + show_page.visit! + end + + it "does not show the sharing section" do + expect(page).to have_no_css("#meetings-side-panel-sharing-component") + end + end + + # Happy path + context "when sharing level is changed", with_ee: [:meeting_templates] do + shared_let(:child_project) { create(:project, enabled_module_names: %i[meetings], parent: project) } + shared_let(:user) do + create(:user, member_with_permissions: { + project => %i[view_meetings edit_meetings], + child_project => %i[view_meetings create_meetings] + }) + end + + let(:child_meetings_page) { Pages::Meetings::Index.new(project: child_project) } + + before { login_as user } + + it "toggles visibility in child project's new meeting form" do + # Template not visible before sharing change + child_meetings_page.visit! + child_meetings_page.click_on "add-meeting-button" + child_meetings_page.click_on "One-time" + + within_dialog "New one-time meeting" do + expect(page).to have_no_css('[data-test-selector="template_id"]') + end + + # Change sharing to descendants + visit project_meeting_path(project, template) + + within("#meetings-side-panel-sharing-component") do + click_button I18n.t(:label_meeting_template_sharing_none) + click_link_or_button I18n.t(:label_meeting_template_sharing_descendants) + end + + wait_for_network_idle + + expect(template.reload.sharing).to eq("descendants") + + # Template is now visible in child project form + child_meetings_page.visit! + child_meetings_page.click_on "add-meeting-button" + child_meetings_page.click_on "One-time" + + within_dialog "New one-time meeting" do + find('[data-test-selector="template_id"]').click + expect(page).to have_text(template.title) + end + end + end +end From 1849f8b4ca2d6953e3b5049daaf948aaec3ba969 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 05:39:59 -0300 Subject: [PATCH 172/334] Bump autoprefixer from 10.4.23 to 10.4.27 in /frontend (#22181) Bumps [autoprefixer](https://github.com/postcss/autoprefixer) from 10.4.23 to 10.4.27. - [Release notes](https://github.com/postcss/autoprefixer/releases) - [Changelog](https://github.com/postcss/autoprefixer/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/autoprefixer/compare/10.4.23...10.4.27) --- updated-dependencies: - dependency-name: autoprefixer dependency-version: 10.4.27 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 82 ++++++++++++++++++++++++++++++-------- frontend/package.json | 2 +- 2 files changed, 66 insertions(+), 18 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3ea29719135..b13ff351019 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -72,7 +72,7 @@ "@uirouter/rx": "^1.0.0", "@w11k/ngx-componentdestroyed": "^5.0.2", "@xeokit/xeokit-bim-viewer": "2.7.1", - "autoprefixer": "^10.4.23", + "autoprefixer": "^10.4.27", "byte-base64": "^1.1.0", "chart.js": "4.5.1", "chartjs-adapter-luxon": "^1.3.1", @@ -879,6 +879,42 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/@angular-devkit/build-angular/node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -11492,9 +11528,9 @@ "integrity": "sha512-VVE1H6cc4ai+ZXo/CRWoJiHXrA1qfA31DPnx6D20+kSI547hQN5Greh51LQ1baMRMfxO5K5M4ImMtZbZt2DODQ==" }, "node_modules/autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", "funding": [ { "type": "opencollective", @@ -11511,7 +11547,7 @@ ], "dependencies": { "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", + "caniuse-lite": "^1.0.30001774", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -12075,9 +12111,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001764", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", - "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", + "version": "1.0.30001776", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz", + "integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==", "funding": [ { "type": "opencollective", @@ -12091,8 +12127,7 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/ccount": { "version": "2.0.1", @@ -26291,6 +26326,19 @@ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true }, + "autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "requires": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + } + }, "chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -32956,12 +33004,12 @@ "integrity": "sha512-VVE1H6cc4ai+ZXo/CRWoJiHXrA1qfA31DPnx6D20+kSI547hQN5Greh51LQ1baMRMfxO5K5M4ImMtZbZt2DODQ==" }, "autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", "requires": { "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", + "caniuse-lite": "^1.0.30001774", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -33331,9 +33379,9 @@ "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" }, "caniuse-lite": { - "version": "1.0.30001764", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", - "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==" + "version": "1.0.30001776", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz", + "integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==" }, "ccount": { "version": "2.0.1", diff --git a/frontend/package.json b/frontend/package.json index c2fd2da0f94..09dfda7f2a4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -127,7 +127,7 @@ "@uirouter/rx": "^1.0.0", "@w11k/ngx-componentdestroyed": "^5.0.2", "@xeokit/xeokit-bim-viewer": "2.7.1", - "autoprefixer": "^10.4.23", + "autoprefixer": "^10.4.27", "byte-base64": "^1.1.0", "chart.js": "4.5.1", "chartjs-adapter-luxon": "^1.3.1", From 116ed1ccf8712ddaea031eef2ab11335452e09d1 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:45:19 +0200 Subject: [PATCH 173/334] Restore the select_done_statuses permission. --- .../20260212145213_migrate_backlogs_permissions.rb | 12 +++++------- modules/backlogs/config/locales/en.yml | 5 +++-- modules/backlogs/lib/open_project/backlogs/engine.rb | 10 ++++++++-- .../backlogs/spec/features/resolved_status_spec.rb | 2 +- spec/migrations/migrate_backlogs_permissions_spec.rb | 7 ++----- 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/db/migrate/20260212145213_migrate_backlogs_permissions.rb b/db/migrate/20260212145213_migrate_backlogs_permissions.rb index aa5c3a42afe..f6e0fa4675a 100644 --- a/db/migrate/20260212145213_migrate_backlogs_permissions.rb +++ b/db/migrate/20260212145213_migrate_backlogs_permissions.rb @@ -9,7 +9,6 @@ class MigrateBacklogsPermissions < ActiveRecord::Migration[8.1] ::Migration::MigrationUtils::PermissionRenamer.rename(:view_taskboards, :view_sprints) ::Migration::MigrationUtils::PermissionAdder.add(:manage_versions, :create_sprints) - ::Migration::MigrationUtils::PermissionRenamer.rename(:select_done_statuses, :create_sprints) ::Migration::MigrationUtils::PermissionRenamer.rename(:update_sprints, :create_sprints) ::Migration::MigrationUtils::PermissionAdder.add(:assign_versions, :manage_sprint_items) @@ -17,14 +16,13 @@ class MigrateBacklogsPermissions < ActiveRecord::Migration[8.1] def down # Note: Ideally the `:view_taskboards`, `:view_master_backlog`, `:manage_versions`, - # `:select_done_statuses`, `:update_sprints` permissions should be restored too, - # but unfortunately we cannot know which one lead to the user gaining `:view_sprints` - # or `:create_sprints` permissions. + # `:update_sprints` permissions should be restored too, but unfortunately we cannot know + # which one lead to the user gaining `:view_sprints` or `:create_sprints` permissions. # There are 2 possible solutions for this issue: # 1. Grant both the `:view_taskboards`, `:view_master_backlog` where `:view_sprints` was granted. - # Respectively, grant `:manage_versions`, `:select_done_statuses`, `:update_sprints` permissions - # where `:create_sprints` was granted. Unfortunately this leads to users gaining permissions - # they didn't possibly had before the migration. + # Respectively, grant `:manage_versions`, `:update_sprints` permissions where `:create_sprints` + # was granted. Unfortunately this leads to users gaining permissions they didn't possibly had + # before the migration. # 2. Grant none of the undecisible permissions, which leads to users losing permissions they had # before the migration. # diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index 03ef58d6840..0ed1b8c5043 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -155,11 +155,12 @@ en: label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index c625fcce1e9..f20567b2f0c 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -78,10 +78,16 @@ module OpenProject::Backlogs permissible_on: :project, dependencies: :view_work_packages + permission :select_done_statuses, + { + "projects/settings/backlogs": %i[show update rebuild_positions] + }, + permissible_on: :project, + require: :member + permission :create_sprints, { rb_sprints: %i[new_dialog refresh_form create edit_name update], - rb_wikis: %i[edit update], - "projects/settings/backlogs": %i[show update rebuild_positions] }, + rb_wikis: %i[edit update] }, permissible_on: :project, require: :member, dependencies: :view_sprints diff --git a/modules/backlogs/spec/features/resolved_status_spec.rb b/modules/backlogs/spec/features/resolved_status_spec.rb index 3470bfca8c4..e2dd860eff3 100644 --- a/modules/backlogs/spec/features/resolved_status_spec.rb +++ b/modules/backlogs/spec/features/resolved_status_spec.rb @@ -37,7 +37,7 @@ RSpec.describe "Resolved status" do let!(:status) { create(:status, is_default: true) } let(:role) do create(:project_role, - permissions: %i[create_sprints view_sprints]) + permissions: %i[select_done_statuses view_sprints]) end let!(:current_user) do create(:user, diff --git a/spec/migrations/migrate_backlogs_permissions_spec.rb b/spec/migrations/migrate_backlogs_permissions_spec.rb index db56eeaa7d5..67703ea716a 100644 --- a/spec/migrations/migrate_backlogs_permissions_spec.rb +++ b/spec/migrations/migrate_backlogs_permissions_spec.rb @@ -38,19 +38,17 @@ RSpec.describe MigrateBacklogsPermissions, type: :model do up_mapping = { view_master_backlog: %i[view_sprints], view_taskboards: %i[view_sprints], - select_done_statuses: %i[create_sprints], update_sprints: %i[create_sprints], manage_versions: %i[manage_versions create_sprints], assign_versions: %i[assign_versions manage_sprint_items] } # source permission => expected permissions after rollback. - # Backlogs-specific permissions (view_master_backlog, view_taskboards, select_done_statuses, - # update_sprints) are lost because the down migration cannot determine the original source. + # Backlogs-specific permissions (view_master_backlog, view_taskboards, update_sprints) + # are lost because the down migration cannot determine the original source. down_mapping = { view_master_backlog: [], view_taskboards: [], - select_done_statuses: [], update_sprints: [], manage_versions: %i[manage_versions], assign_versions: %i[assign_versions] @@ -59,7 +57,6 @@ RSpec.describe MigrateBacklogsPermissions, type: :model do let(:all_source_permissions) do %i(view_master_backlog view_taskboards - select_done_statuses update_sprints manage_versions assign_versions) From 9f1cd4f1d79915191241a03b16ee923c7a762b0a Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Fri, 6 Mar 2026 17:18:17 +0100 Subject: [PATCH 174/334] Update enum to string --- modules/meeting/app/models/meeting.rb | 9 +++++---- .../db/migrate/20260302152255_add_sharing_to_meetings.rb | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/meeting/app/models/meeting.rb b/modules/meeting/app/models/meeting.rb index 154e008831f..8bc03bce7b7 100644 --- a/modules/meeting/app/models/meeting.rb +++ b/modules/meeting/app/models/meeting.rb @@ -122,6 +122,7 @@ class Meeting < ApplicationRecord accepts_nested_attributes_for :participants, allow_destroy: true validates :title, :project_id, presence: true + validates :sharing, absence: true, unless: :onetime_template? validates :duration, numericality: { greater_than: 0 } @@ -140,10 +141,10 @@ class Meeting < ApplicationRecord } enum :sharing, { - none: 0, - descendants: 1, - system: 2 - }, prefix: :sharing + none: "none", + descendants: "descendants", + system: "system" + }, prefix: :sharing, validate: { allow_nil: true } def self.templates_visible_in_project(project, user = User.current) accessible_ids = Project.allowed_to(user, :view_meetings).select(:id) diff --git a/modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb b/modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb index 8826f7ac30c..96725388a20 100644 --- a/modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb +++ b/modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb @@ -30,6 +30,6 @@ class AddSharingToMeetings < ActiveRecord::Migration[8.1] def change - add_column :meetings, :sharing, :integer, null: false, default: 0 + add_column :meetings, :sharing, :string, null: true, default: nil end end From 4926f30f1e0a1a46ba913b07b3a0fe5727cc5a2f Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Fri, 6 Mar 2026 17:18:44 +0100 Subject: [PATCH 175/334] Add more validations --- .../app/contracts/meetings/base_contract.rb | 12 +++++++- .../meetings/set_attributes_service.rb | 2 +- .../meetings/create_contract_spec.rb | 12 ++++++++ .../meetings/update_contract_spec.rb | 14 +++++++++ modules/meeting/spec/models/meeting_spec.rb | 29 +++++++++++++++++++ .../create_service_integration_spec.rb | 18 ++++++++++++ 6 files changed, 85 insertions(+), 2 deletions(-) diff --git a/modules/meeting/app/contracts/meetings/base_contract.rb b/modules/meeting/app/contracts/meetings/base_contract.rb index 48c1a120bcf..25400c061fb 100644 --- a/modules/meeting/app/contracts/meetings/base_contract.rb +++ b/modules/meeting/app/contracts/meetings/base_contract.rb @@ -44,6 +44,16 @@ module Meetings attribute :start_time_hour attribute :template attribute :notify - attribute :sharing + attribute :sharing do + validate_sharing_only_on_onetime_templates + end + + private + + def validate_sharing_only_on_onetime_templates + return if model.onetime_template? + + errors.add :sharing, :not_allowed if model.sharing.present? + end end end diff --git a/modules/meeting/app/services/meetings/set_attributes_service.rb b/modules/meeting/app/services/meetings/set_attributes_service.rb index 08d18200012..dd5784d8586 100644 --- a/modules/meeting/app/services/meetings/set_attributes_service.rb +++ b/modules/meeting/app/services/meetings/set_attributes_service.rb @@ -47,7 +47,7 @@ module Meetings model.duration ||= 1 model.state = "draft" if !model.recurring? || model.template? model.notify = false - model.sharing = "none" + model.sharing = "none" if model.onetime_template? end end diff --git a/modules/meeting/spec/contracts/meetings/create_contract_spec.rb b/modules/meeting/spec/contracts/meetings/create_contract_spec.rb index be7a26635ae..4858a65b5ae 100644 --- a/modules/meeting/spec/contracts/meetings/create_contract_spec.rb +++ b/modules/meeting/spec/contracts/meetings/create_contract_spec.rb @@ -44,6 +44,18 @@ RSpec.describe Meetings::CreateContract do end it_behaves_like "contract is valid" + + context "when setting sharing on a non-template" do + let(:meeting) { build(:meeting, project:, sharing: :none) } + + it_behaves_like "contract is invalid", sharing: %i[present not_allowed] + end + + context "when setting sharing on a onetime template" do + let(:meeting) { build(:onetime_template, project:, sharing: :none) } + + it_behaves_like "contract is valid" + end end context "without permission" do diff --git a/modules/meeting/spec/contracts/meetings/update_contract_spec.rb b/modules/meeting/spec/contracts/meetings/update_contract_spec.rb index 29d95655bfd..c8aef61331d 100644 --- a/modules/meeting/spec/contracts/meetings/update_contract_spec.rb +++ b/modules/meeting/spec/contracts/meetings/update_contract_spec.rb @@ -45,6 +45,20 @@ RSpec.describe Meetings::UpdateContract do it_behaves_like "contract is valid" + context "when setting sharing on a non-template" do + let(:meeting) { create(:meeting, project:, sharing: nil) } + + before { meeting.sharing = "none" } + + it_behaves_like "contract is invalid", sharing: %i[present not_allowed] + end + + context "when setting sharing on a onetime template" do + let(:meeting) { create(:onetime_template, project:, sharing: :none) } + + it_behaves_like "contract is valid" + end + context "when lock_version is changed" do before do allow(meeting).to receive(:lock_version_changed?).and_return(true) diff --git a/modules/meeting/spec/models/meeting_spec.rb b/modules/meeting/spec/models/meeting_spec.rb index bcdaff8501e..2e3b34d9222 100644 --- a/modules/meeting/spec/models/meeting_spec.rb +++ b/modules/meeting/spec/models/meeting_spec.rb @@ -241,4 +241,33 @@ RSpec.describe Meeting do it { expect(subject).to include(template_system) } end end + + describe "sharing" do + context "for a regular meeting" do + let(:meeting) { build(:meeting, project:, sharing: :none) } + + it "is invalid" do + expect(meeting).not_to be_valid + expect(meeting.errors[:sharing]).to be_present + end + end + + context "for a series template" do + let(:recurring) { create(:recurring_meeting, project:) } + let(:meeting) { build(:meeting_template, sharing: :none, recurring_meeting: recurring) } + + it "is invalid" do + expect(meeting).not_to be_valid + expect(meeting.errors[:sharing]).to be_present + end + end + + context "for an onetime template" do + let(:meeting) { build(:onetime_template, project:, sharing: :none) } + + it "is valid" do + expect(meeting).to be_valid + end + end + end end diff --git a/modules/meeting/spec/services/meetings/create_service_integration_spec.rb b/modules/meeting/spec/services/meetings/create_service_integration_spec.rb index 26dc2e991c4..508e3b60954 100644 --- a/modules/meeting/spec/services/meetings/create_service_integration_spec.rb +++ b/modules/meeting/spec/services/meetings/create_service_integration_spec.rb @@ -109,4 +109,22 @@ RSpec.describe Meetings::CreateService, "integration", type: :model do end end end + + describe "sharing" do + context "when creating a regular meeting" do + it "does not set sharing" do + expect(subject).to be_success + expect(subject.result.sharing).to be_nil + end + end + + context "when creating an onetime template" do + let(:default_params) { { project:, title: "My template", template: true } } + + it "sets sharing to none by default" do + expect(subject).to be_success + expect(subject.result.sharing).to eq("none") + end + end + end end From 29f35037ced90b8cc3960ac194c3bf82f9789197 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Fri, 6 Mar 2026 18:35:56 +0100 Subject: [PATCH 176/334] Fix failing specs --- modules/meeting/app/services/meetings/copy_service.rb | 2 +- modules/meeting/spec/factories/meeting_factory.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/meeting/app/services/meetings/copy_service.rb b/modules/meeting/app/services/meetings/copy_service.rb index 2d39db05136..eaa751e1e10 100644 --- a/modules/meeting/app/services/meetings/copy_service.rb +++ b/modules/meeting/app/services/meetings/copy_service.rb @@ -94,7 +94,7 @@ module Meetings end def writable_meeting_attributes(meeting) - instantiate_contract(meeting, user).writable_attributes - %w[start_date start_time_hour uid] + instantiate_contract(meeting, user).writable_attributes - %w[start_date start_time_hour uid sharing] end def copy_meeting_attachment(copy) diff --git a/modules/meeting/spec/factories/meeting_factory.rb b/modules/meeting/spec/factories/meeting_factory.rb index 1711cc37caa..9aabde5eda9 100644 --- a/modules/meeting/spec/factories/meeting_factory.rb +++ b/modules/meeting/spec/factories/meeting_factory.rb @@ -67,6 +67,7 @@ FactoryBot.define do meeting.sequence(:title) { |n| "Onetime template #{n}" } template { true } recurring_meeting { nil } + sharing { :none } end end end From 2c01088f320685bf13aeb5f48ffb8da1aa02acac Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Sat, 7 Mar 2026 03:42:38 +0000 Subject: [PATCH 177/334] update locales from crowdin [ci skip] --- config/locales/crowdin/fr.yml | 146 +++---- config/locales/crowdin/js-fr.yml | 4 +- config/locales/crowdin/ko.yml | 50 +-- config/locales/crowdin/pl.yml | 3 - config/locales/crowdin/pt-BR.yml | 106 ++--- config/locales/crowdin/pt-PT.yml | 3 - config/locales/crowdin/zh-CN.yml | 394 +++++++++--------- .../backlogs/config/locales/crowdin/es.yml | 48 +-- .../config/locales/crowdin/js-zh-CN.yml | 4 +- .../backlogs/config/locales/crowdin/ko.yml | 80 ++-- .../backlogs/config/locales/crowdin/pt-BR.yml | 80 ++-- .../backlogs/config/locales/crowdin/zh-CN.yml | 54 +-- .../boards/config/locales/crowdin/zh-CN.yml | 2 +- modules/budgets/config/locales/crowdin/de.yml | 16 +- modules/budgets/config/locales/crowdin/fr.yml | 18 +- modules/budgets/config/locales/crowdin/ko.yml | 24 +- .../budgets/config/locales/crowdin/pt-BR.yml | 24 +- .../budgets/config/locales/crowdin/zh-CN.yml | 36 +- modules/costs/config/locales/crowdin/de.yml | 10 +- modules/costs/config/locales/crowdin/fr.yml | 28 +- .../costs/config/locales/crowdin/js-fr.yml | 2 +- modules/costs/config/locales/crowdin/ko.yml | 18 +- .../costs/config/locales/crowdin/pt-BR.yml | 18 +- .../costs/config/locales/crowdin/zh-CN.yml | 18 +- .../documents/config/locales/crowdin/ko.yml | 6 +- .../config/locales/crowdin/pt-BR.yml | 6 +- .../config/locales/crowdin/zh-CN.yml | 6 +- .../grids/config/locales/crowdin/js-de.yml | 2 +- .../grids/config/locales/crowdin/js-zh-CN.yml | 4 +- modules/meeting/config/locales/crowdin/fr.yml | 16 +- modules/meeting/config/locales/crowdin/ko.yml | 40 +- .../meeting/config/locales/crowdin/pt-BR.yml | 36 +- .../meeting/config/locales/crowdin/zh-CN.yml | 54 +-- 33 files changed, 675 insertions(+), 681 deletions(-) diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index fda89c1e42e..0b568a8d189 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -114,7 +114,7 @@ fr: title: "Importation" jira: title: "Importation de Jira" - description: "Utilisez cet outil pour importer des données depuis votre instance Jira. Vous pouvez configurer plusieurs hôtes Jira et choisir les données à importer à chaque cycle d'importation." + description: "Utilisez cet outil pour importer des données à partir de votre instance Jira. Vous pouvez configurer plusieurs hôtes Jira et choisir les données à importer à chaque cycle d'importation." errors: cannot_delete_with_imports: "Impossible de supprimer un hôte Jira avec des importations existantes" blank: @@ -125,7 +125,7 @@ fr: new: "Nouvelle configuration" banner: title: "Importation limitée" - description: "Cet outil d'importation est actuellement en version bêta et ne peut importer que des données de base : projets, tickets (nom, titre, description, pièces jointes), utilisateurs (nom, email, appartenance à un projet), statuts et types. Il ne peut pas importer les flux de travail, les champs personnalisés, les relations entre les tickets, ou les autorisations. Nous ne prenons actuellement en charge que les versions 10.x et 11.x de Jira Server/Data Center. Les instances cloud ne sont pas prises en charge pour le moment." + description: "Cet outil d'importation est actuellement en version bêta et ne peut importer que des données de base : projets, tickets (nom, titre, description, pièces jointes), utilisateurs (nom, e-mail, appartenance à un projet), statuts et types. Il ne peut pas importer les flux de travail, les champs personnalisés, les relations entre les tickets ou les autorisations. Nous ne prenons actuellement en charge que les versions 10.x et 11.x de Jira Server/Data Center. Les instances cloud ne sont pas prises en charge pour le moment." form: fields: name: "Nom" @@ -135,17 +135,17 @@ fr: button_save: "Enregistrer la configuration" button_test: "Tester la configuration" button_delete_token: "Supprimer le jeton d'accès" - delete_token_confirm: "Êtes-vous sûr de vouloir supprimer le jeton ? Cela désactivera la connexion à Jira." + delete_token_confirm: "Voulez-vous vraiment supprimer le jeton ? Cela désactivera la connexion à Jira." label_testing: "Test de la configuration..." token_deleted: "Le jeton a été supprimé avec succès." test: success: "Connexion réussie à %{server} (version %{version})" - failed: "Échec de la connexion : Impossible de récupérer les informations sur le serveur" + failed: "Échec de la connexion : impossible de récupérer les informations du serveur" error: "Une erreur inattendue s'est produite lors du test de la connexion" connection_error: "Erreur de connexion : %{message}" parse_error: "Impossible d'analyser la réponse du serveur. Le serveur n'est peut-être pas une instance Jira valide." - api_error: "L'API Jira a renvoyé le statut d'erreur %{status}. Veuillez vérifier l'URL de votre instance Jira et le jeton API." - token_error: "Jeton API invalide. Veuillez vérifier vos informations d'identification dans la configuration." + api_error: "L'API Jira a renvoyé le statut d'erreur %{status}. Veuillez vérifier l'URL de votre instance Jira et le jeton d'API." + token_error: "Jeton d'API invalide. Veuillez vérifier vos informations d'identification dans la configuration." missing_credentials: "Veuillez fournir l'URL et le jeton d'accès personnel pour tester la connexion" invalid_url: "Veuillez fournir une URL valide" client: @@ -157,33 +157,33 @@ fr: projects: "Projets" last_change: "Dernière modification" added: "Ajouté" - label_ago: "%{amount} il y a" + label_ago: "Il y a %{amount}" run: - title: "Importation" + title: "Cycle d'importation" history: "Historique" remove_error: "Une importation Jira ne peut pas être supprimée lorsqu'elle est en cours d'exécution" - import_blocked_error: "Une autre importation Jira est actuellement en cours ou en attente de révision. Veuillez la terminer ou la corriger avant de commencer une nouvelle importation." + import_blocked_error: "Un autre cycle d'importation Jira est actuellement en cours ou en attente de révision. Veuillez le terminer ou l'annuler avant de commencer une nouvelle importation." blank: - title: "Aucun cycle d'importation n'a encore été mis en place" - description: "Créez une exécution d'importation pour commencer à importer des informations à partir de cette instance Jira" + title: "Aucun cycle d'importation n'a encore été configuré" + description: "Créez un cycle d'importation pour commencer à importer des informations à partir de cette instance Jira" index: - description: "Vous pouvez importer différents ensembles de données à chaque cycle d'importation. Il est possible d'annuler une importation immédiatement après en mode révision, mais pas après la finalisation." - button_import_run: "Importation" - button_edit_configuration: "Editer la configuration" + description: "Vous pouvez importer différents ensembles de données à chaque cycle d'importation. Il est possible d'annuler un cycle d'importation immédiatement après en mode révision, mais pas après la finalisation." + button_import_run: "Cycle d'importation" + button_edit_configuration: "Éditer la configuration" status: - initial: "Début" + initial: "Commencer" instance_meta_fetching: "Récupération des métadonnées" - instance_meta_error: "Erreur dans l'extraction des métadonnées" - instance_meta_done: "Métadonnées recherchées" - configuring: "Sélectionnez le champ d'application" - projects_meta_fetching: "Récupérer les données d'un projet" - projects_meta_error: "Erreur dans l'extraction des données du projet" + instance_meta_error: "Erreur lors de la récupération des métadonnées" + instance_meta_done: "Métadonnées récupérées" + configuring: "Sélectionnez la portée" + projects_meta_fetching: "Récupération des données du projet" + projects_meta_error: "Erreur lors de la récupération des données du projet" projects_meta_done: "Données recueillies" importing: "En cours" import_error: "Erreur lors de l'importation" imported: "Mode révision" - reverting: "Retour à l'état initial" - revert_error: "Erreur lors de l'inversion" + reverting: "Rétablissement en cours" + revert_error: "Erreur lors de la restauration" reverted: "Restauré" completed: "Terminé" wizard: @@ -224,62 +224,62 @@ fr: caption_done: "Terminé" description: "Vérifiez quelles données sont disponibles pour l'importation dans l'instance Jira hôte." button_fetch: "Vérifier les données disponibles" - label_progress: "Récupérer les données de Jira..." + label_progress: "Récupération des données de Jira..." groups_and_users: title: "Groupes et utilisateurs" import_scope: - title: "Champ d'application de l'importation" + title: "Portée de l'importation" caption: "Choisissez ce que vous voulez importer dans OpenProject" caption_done: "Terminé" label_info: "Veuillez noter que cet outil d'importation est en version bêta et qu'il ne peut pas importer tous les types de données. Voici un résumé de ce que l'URL de l'instance Jira hôte offre à l'importation et de ce que cet outil est capable d'importer pour le moment." description: "Sélectionnez les données que vous souhaitez importer parmi les données disponibles extraites de l'instance Jira hôte." label_available_data: "Données disponibles" - label_not_available_data: "Non disponible à l'importation" + label_not_available_data: "Indisponibles pour l'importation" button_select_projects: "Sélectionnez les projets à importer" button_continue: "Continuer" label_import: "Sélectionnez les projets que vous souhaitez importer." - button_select: "Sélectionner des projets" + button_select: "Sélectionner les projets" label_selected_data: "Données sélectionnées pour l'importation" - label_progress: "Récupérer les données de Jira..." + label_progress: "Récupération des données de Jira..." elements: - relations: "Relations entre les questions" - workflows: "Workflows au niveau du projet" + relations: "Relations entre les problèmes" + workflows: "Flux de travail au niveau du projet" users: "Utilisateurs" sprints: "Sprints" schemes: "Schémas" permissions: "Autorisations d'utilisateur, de groupe et de projet" confirm_import: - title: "Importer les données" + title: "Importation des données" caption: "Vérifiez vos paramètres d'importation et démarrez l'importation" caption_done: "Terminé" - label_available_data: "Données disponibles à importer" - button_start: "Lancer l'importation" + label_available_data: "Données disponibles pour l'importation" + button_start: "Démarrer l'importation" description: "Vous êtes sur le point de lancer un cycle d'importation avec les paramètres suivants." - label_progress: "Import en cours..." + label_progress: "Importation en cours..." label_import_data: "Importation en cours" import_result: - title: "Importer les résultats de l'exécution" - caption: "Vérifier l'exécution de l'importation ou annuler l'importation" - info: "L'importation a été effectuée avec succès." + title: "Résultats du cycle d'importation" + caption: "Examiner le cycle d'importation ou annuler l'importation" + info: "Le cycle d'importation a été effectué avec succès." label_results: "Importé" label_revert: "Annuler l'importation" button_revert: "Annuler l'importation" button_done: "Finaliser l'importation" - preview_description: 'Les données importées sont actuellement en mode révision. Cliquez sur "Finaliser l''importation" pour rendre l''importation permanente ou sur "Revenir à l''importation" pour annuler toutes les modifications apportées lors de cette importation.' + preview_description: 'Les données importées sont actuellement en mode révision. Cliquez sur « Finaliser l''importation » pour rendre l''importation permanente ou sur « Annuler l''importation » pour annuler toutes les modifications apportées lors de ce cycle d''importation.' label_finalizing_progress: "Finalisation de l'importation..." label_finalized: "Importation finalisée." - label_revert_progress: "Importation réversible..." + label_revert_progress: "Annulation de l'importation..." label_reverted: "Importation annulée." select_dialog: filter_projects: "Filtrer par texte" revert_dialog: - title: "Réinitialiser définitivement cette importation ?" - description: "Cela supprimera tous les objets importés (y compris des projets entiers), même s'il y a eu une activité de l'utilisateur dans ces projets après l'importation dans OpenProject." - confirm: "Je comprends que cette réversion effacera les données de façon permanente" + title: "Annuler définitivement cette importation ?" + description: "Cette opération supprimera tous les objets importés (y compris les projets entiers), même s'il y a eu une activité de l'utilisateur dans ces projets après l'importation dans OpenProject." + confirm: "Je comprends que cette réversion supprimera les données de façon permanente" finalize_dialog: title: "Finaliser cette importation ?" description: "Une fois finalisée, cette importation ne peut plus être annulée. Toutes les données importées le seront définitivement." - confirm: "Je comprends que cette action ne peut être annulée" + confirm: "Je comprends que cette action ne peut pas être annulée" confirm_button: "Compris" select_projects: title: "Sélectionner des projets" @@ -287,7 +287,7 @@ fr: index: description: "Le protocole de contexte de modèle permet aux agents d'IA de fournir à leurs utilisateurs les outils et les ressources exposés par cette instance d'OpenProject. Cette fonctionnalité est encore en version bêta." resources_heading: "Ressources" - resources_description: "OpenProject met en œuvre les ressources suivantes. Chacune d'entre elles peut être activée, renommée et décrite comme vous le souhaitez. Pour plus d'informations, veuillez vous référer à la [documentation sur les ressources MCP](docs_url)." + resources_description: "OpenProject implémente les ressources suivantes. Chacune d'entre elles peut être activée, renommée et décrite comme vous le souhaitez. Pour en savoir plus, veuillez vous référer à la [documentation sur les ressources MCP](docs_url)." resources_submit: "Mettre à jour les ressources" tools_heading: "Outils" tools_description: "OpenProject implémente les outils suivants. Chacun d'entre eux peut être activé, renommé et décrit comme vous le souhaitez. Pour en savoir plus, veuillez vous référer à la [documentation sur les outils MCP](docs_url)." @@ -296,7 +296,7 @@ fr: success: "Les configurations MCP ont été mises à jour avec succès." server_form: description_caption: "Comment le serveur MCP sera décrit aux autres applications qui s'y connectent." - title_caption: "Titre court affiché aux applications qui se connectent au serveur MCP." + title_caption: "Un titre court affiché aux applications qui se connectent au serveur MCP." tool_response_format: "Format de réponse de l'outil" tool_response_format_content_only_label: "Contenu uniquement" tool_response_format_content_only_caption: > @@ -306,7 +306,7 @@ fr: L'option la plus compatible. Les réponses de l'outil comprendront à la fois du contenu régulier et structuré, ce qui permettra aux clients MCP de choisir le format qu'ils souhaitent lire. Cela peut augmenter le nombre de jetons que le modèle linguistique doit traiter, ce qui peut entraîner une augmentation des coûts et une diminution des performances. tool_response_format_structured_only_label: "Contenu structuré uniquement" tool_response_format_structured_only_caption: > - Choisissez cette option si vous êtes certain que les clients MCP qui se connectent à cette instance prennent en charge le contenu structuré. Les réponses de l'outil n'incluront que le contenu structuré et ne tiendront pas compte de sa représentation textuelle. + Choisissez cette option si vous avez la certitude que les clients MCP qui se connectent à cette instance prennent en charge le contenu structuré. Les réponses de l'outil n'incluront que le contenu structuré et ne tiendront pas compte de sa représentation textuelle. update: failure: "La configuration MCP n'a pas pu être mise à jour." success: "La configuration MCP a été mise à jour avec succès." @@ -545,7 +545,7 @@ fr: contained_in_type: "Figurant dans le type" confirm_destroy_option: "Supprimer une option supprimera toutes ses occurrences (ex. dans les plans de travail). Êtes-vous sûr de vouloir le supprimer ?" reorder_alphabetical: "Réorganiser les valeurs par ordre alphabétique" - reorder_confirmation: "Attention : L'ordre actuel des valeurs disponibles ainsi que toutes les valeurs non enregistrées seront perdus. Êtes-vous sûr de vouloir continuer ?" + reorder_confirmation: "Attention : l'ordre actuel des valeurs disponibles ainsi que toutes les valeurs non enregistrées seront perdus. Voulez-vous vraiment continuer ?" placeholder_version_select: "La sélection d'un lot de travaux ou d'un projet est requise en premier lieu" calculated_field_not_editable: "Attribut non modifiable. Cette valeur est calculée automatiquement." no_role_assigment: "Pas d'attribution de rôle" @@ -573,11 +573,11 @@ fr: formula: project: "Ajoutez des valeurs numériques ou saisissez / pour rechercher un attribut ou un opérateur mathématique." regexp: - all: "ex. ^[A-Z0-9]+$" - project: "ex. ^[A-Z0-9]+$" + all: "p. ex., ^[A-Z0-9]+$" + project: "p. ex., ^[A-Z0-9]+$" min_max: all: "0 signifie aucune restriction" - project: "0 pour aucune restriction" + project: "0 signifie aucune restriction" has_comment: project: "Permet à l'utilisateur d'ajouter un commentaire relatif à l'attribut du projet lorsqu'il sélectionne la valeur dans la vue d'ensemble du projet." tab: @@ -804,7 +804,7 @@ fr: is_for_all_blank_slate: heading: Pour tous les projets description: Cet attribut de projet est activé dans tous les projets, car l'option « Pour tous les projets » est cochée. Il ne peut pas être désactivé pour les projets individuels. - enabled_via_assignee_when_submitted_html: Cet attribut de projet ne peut pas être désactivé car il est défini comme assignee when submitted pour les demandes d'initiation de projet. + enabled_via_assignee_when_submitted_html: Cet attribut de projet ne peut pas être désactivé, car il est défini comme responsable au moment de l'envoi pour les demandes d'initiation de projet. types: no_results_title_text: Il n'y a actuellement aucun type disponible. form: @@ -820,8 +820,8 @@ fr: new_label: "Nouvelle priorité" creation_wizard: errors: - no_work_package_type: "La demande d'initiation de projet n'a pas pu être activée car elle nécessite au moins un type de lot de travaux actif et ce projet n'en a pas. Veuillez ajouter au moins un type de lot de travail à ce projet." - no_status_when_submitted: "Échec de l'activation de la demande d'initiation de projet car le type de lot de travail %{type} doit être associé à au moins un statut. Veuillez activer au moins un workflow de statut pour ce type de work package." + no_work_package_type: "La demande d'initiation de projet n'a pas pu être activée, car elle nécessite au moins un type de lot de travaux actif et ce projet n'en a pas. Veuillez ajouter au moins un type de lot de travaux à ce projet." + no_status_when_submitted: "Échec de l'activation de la demande d'initiation de projet, car le type de lot de travaux %{type} doit être associé à au moins un statut. Veuillez activer au moins un flux de travail de statut pour ce type de lot de travaux." export: description_attachment_export: "L'artefact généré sera enregistré en tant que pièce jointe au format PDF dans le lot de travaux de l'artefact." description_file_link_export: "Le lot de travaux de l'artefact contient un lien vers un fichier PDF stocké dans un espace de stockage de fichiers externe. Nécessite un stockage de fichiers de travail avec des dossiers de projet gérés automatiquement pour ce projet. Pour le moment, seuls les espaces de stockage de fichiers Nextcloud sont pris en charge." @@ -1360,9 +1360,9 @@ fr: jira_import: projects: "Projets" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Nom de l'instance Jira" + url: "URL de l'instance Jira" + personal_access_token: "Jeton d'accès personnel" announcements: show_until: "Afficher jusqu'à" attachment: @@ -1687,7 +1687,7 @@ fr: spent_hours: "Temps passé" spent_time: "Temps passé" subproject: "Sous-projet" - time_entries: "Consigner temps" + time_entries: "Consigner du temps" type: "Type" version: "Version" watcher: "Observateur" @@ -2757,7 +2757,7 @@ fr: title: "Actions personnalisées" description: "Les actions personnalisées sont des raccourcis en un clic vers un ensemble d'actions prédéfinies que vous pouvez rendre disponibles sur certains lots de travaux en fonction de l'état, du rôle, du type ou du projet." mcp_server: - description: "Introduisez OpenProject dans vos workflows AI avec un serveur MCP sécurisé." + description: "Introduisez OpenProject dans vos flux de travail d'IA avec un serveur MCP sécurisé." meeting_templates: description: "Définissez des modèles de réunion avec une structure d'ordre du jour définie et gagnez du temps en les réutilisant lors de la création de nouvelles réunions." nextcloud_sso: @@ -3072,14 +3072,14 @@ fr: #We need to include the version to invalidate outdated translations in other locales "17_2": new_features_title: > - Cette version contient plusieurs nouvelles fonctionnalités et améliorations, telles que: + Cette version contient plusieurs nouvelles fonctionnalités et améliorations, telles que : new_features_list: - line_0: Workflows AI avec un serveur MCP sécurisé (plan Professionnel et supérieurs) + line_0: Flux de travail d'IA avec un serveur MCP sécurisé (abonnements Professional et supérieurs) line_1: Amélioration de la page d'accueil du projet avec un nouveau widget pour les budgets et amélioration de l'accessibilité - line_2: "Réunions : Modèles de réunion (plan de base et supérieurs)" - line_3: Meilleure transparence des commentaires sur les attributs des projets. + line_2: "Réunions : modèles de réunion (abonnements Basic et supérieurs)" + line_3: Meilleure transparence avec les commentaires sur les attributs de projet. line_4: Amélioration de l'exportation PDF - line_5: Sécurité accrue pour les liens externes (à partir du plan Premium) + line_5: Sécurité accrue pour les liens externes (à partir de l'abonnement Premium) line_6: Améliorations UI/UX dans le module Backlogs line_7: Formulaires de champs personnalisés harmonisés links: @@ -3099,7 +3099,7 @@ fr: journals: changes_retracted: "Les modifications ont été retirées." caused_changes: - budget_deleted: "Budget has been deleted" + budget_deleted: "La budget a été supprimé" dates_changed: "Dates modifiées" default_attribute_written: "Attributs en lecture seule écrits" import: "Importé" @@ -3111,10 +3111,10 @@ fr: total_percent_complete_mode_changed_to_simple_average: "Le calcul des totaux de % d'achèvement est désormais basé sur une simple moyenne des seules valeurs de % d'achèvement." cause_descriptions: import: - header: "changements par %{author}" - field_changed: "%{field} a changé de %{old_value} à %{new_value}" - field_set: "%{field} sur %{value}" - field_removed: "%{field} supprimée" + header: "modifications par %{author}" + field_changed: "%{field} a modifié de %{old_value} à %{new_value}" + field_set: "%{field} réglé sur %{value}" + field_removed: "%{field} supprimé" field_updated: "%{field} mis à jour" deleted_with_diff: "%{field} supprimé (%{link})" changed_with_diff: "%{field} modifié (%{link})" @@ -3125,7 +3125,7 @@ fr: work_package_related_changed_times: par changement vers %{link} connexe work_package_duplicate_closed: Le statut a été mis à jour automatiquement par le doublon de lot de travaux %{link} unaccessable_work_package_changed: par changement vers un lot de travaux connexe - budget_deleted: Budget has been deleted + budget_deleted: La budget a été supprimé working_days_changed: changed: "par changement vers des jours ouvrables (%{changes})" days: @@ -3206,7 +3206,7 @@ fr: active_tokens: "Jetons actifs" blank_description: "Aucun accès à une application tierce n'est configuré et actif pour vous." blank_title: "Pas de jeton d'application OAuth" - last_refreshed_at: "Dernière mise à jour le" + last_refreshed_at: "Dernière actualisation le" title: "OAuth" table_title: "Jetons d'application OAuth" text_hint: "Les jetons d'application OAuth permettent aux applications tierces de se connecter à cette instance d'OpenProject." @@ -3292,7 +3292,7 @@ fr: label_always_visible: "Toujours affiché" label_announcement: "Annonce ou avis. " label_angular: "AngularJS" - label_app_modules: "%{app_title} modules" + label_app_modules: "Modules %{app_title}" label_api_access_key: "Clé d'accès API" label_api_access_key_created_on: "Clé d'accès API créé il y a %{value}" label_api_access_key_type: "API" @@ -3574,7 +3574,7 @@ fr: label_lock_user: "Verrouiller l’utilisateur" label_logged_as: "Connecté en tant que" label_login: "Connexion" - label_custom_comment: "%{name} commentaire" + label_custom_comment: "Commentaire de %{name}" label_custom_logo: "Logo personnalisé pour ordinateur" label_custom_logo_mobile: "Logo personnalisé pour mobile" label_custom_export_logo: "Logo d'exportation personnalisé" @@ -4596,9 +4596,9 @@ fr: setting_smtp_password: "Mot de passe SMTP" setting_smtp_domain: "Domaine SMTP HELO" setting_activity_days_default: "Nombre des jours affichés dans l'activité du projet" - setting_api_tokens_enabled: "Activer les jetons API" + setting_api_tokens_enabled: "Activer les jetons d'API" setting_api_tokens_enabled_caption: > - Décidez si les utilisateurs peuvent créer des jetons API personnels dans les paramètres de leur compte. Ces jetons peuvent être utilisés pour accéder aux différentes API d'OpenProject, telles que APIv3 et MCP. + Décidez si les utilisateurs peuvent créer des jetons d'API personnels dans les paramètres de leur compte. Ces jetons peuvent être utilisés pour accéder aux différentes API d'OpenProject, telles que APIv3 et MCP. setting_app_subtitle: "Sous-titre de l'Application" setting_app_title: "Titre de l'Application" setting_attachment_max_size: "Taille maximale de la pièce jointe" diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml index 4b338ea6c65..ad51bf1455a 100644 --- a/config/locales/crowdin/js-fr.yml +++ b/config/locales/crowdin/js-fr.yml @@ -87,7 +87,7 @@ fr: button_advanced_filter: "Filtre avancé" button_list_view: "Vue en liste" button_show_view: "Affichage plein écran" - button_log_time: "Afficher l'horodatage" + button_log_time: "Consigner du temps" button_start_timer: "Démarrer le suivi du temps" button_stop_timer: "Arrêter le suivi du temps" button_more: "Plus" @@ -705,7 +705,7 @@ fr: nevermind: "Peu importe" time_entry: work_package_required: "Nécessite d'abord la sélection d'un lot de travaux." - title: "Consigner temps" + title: "Consigner du temps" tracking: "Suivi du temps" stop: "Arrêter" timer: diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 7ebcc3e3784..6ede4bb65c1 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -83,9 +83,9 @@ ko: confirmation: "이 Enterprise Edition 지원 토큰을 삭제하시겠습니까?" create_dialog: title: "Enterprise 토큰 추가" - type_token_text: "Your Enterprise token text" + type_token_text: "내 Enterprise 토큰 텍스트" token_placeholder: "여기에 Enterprise Edition 지원 토큰을 붙여넣으세요" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "Enterprise 버전을 활성화하는 방법에 대해 자세히 알아보려면 [설명서](docs_url )를 참조하세요." add_token: "Enterprise edition 지원 토큰을 업로드하세요." replace_token: "당신의 현재 지원 토큰을 바꾸세요." order: "Enterprise on-premises edition 주문하기" @@ -111,38 +111,38 @@ ko: text: "사용자의 개별 작업(예: 작업 패키지를 두 번 업데이트)은 연령 차이가 지정된 기간 미만인 경우 단일 작업으로 집계됩니다. 애플리케이션 내에서 단일 작업으로 표시됩니다. 또한 이는 전송되는 이메일 수를 줄이는 동일한 시간만큼 알림을 지연시키고 %{webhook_link} 지연에도 영향을 미칩니다." link: "webhook" import: - title: "Import" + title: "가져오기" jira: - title: "Jira Import" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + title: "Jira 가져오기" + description: "이 도구를 사용하여 Jira 인스턴스에서 데이터를 가져옵니다. 여러 Jira 호스트를 구성하고 가져오기 실행 각각에서 가져올 항목을 선택할 수 있습니다." errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "기존 가져오기가 있는 Jira 호스트는 삭제할 수 없습니다" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + title: "아직 구성된 Jira 호스트 없음" + description: "Jira에서 이 OpenProject 인스턴스로 항목 가져오기를 시작하려면 Jira 호스트를 구성합니다." configuration: - title: "Jira configuration" - new: "New configuration" + title: "Jira 구성" + new: "새 구성" banner: - title: "Limited import" + title: "제한된 가져오기" description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: - name: "Name" - url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + name: "이름" + url: "Jira 서버/데이터 센터 URL" + personal_access_token: "개인 액세스 토큰" + button_add: "구성 추가" + button_save: "구성 저장" + button_test: "구성 테스트" + button_delete_token: "토큰 삭제" + delete_token_confirm: "토큰을 삭제하시겠습니까? 그러면 Jira 연결이 비활성화됩니다." + label_testing: "구성 테스트 중..." + token_deleted: "토큰이 삭제되었습니다." test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" + success: "%{server}(버전 %{version})에 연결되었습니다" + failed: "연결 실패: 서버 정보를 검색할 수 없습니다" + error: "연결을 테스트하는 동안 예기치 않은 오류가 발생했습니다" + connection_error: "연결 오류: %{message}" parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 1fa05f24d43..4dc4fc6792b 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -1385,9 +1385,6 @@ pl: dependencies: "Zależności" activerecord: attributes: - agile/sprint: - sharing: "Udostępnianie" - finish_date: "Data zakończenia" jira_import: projects: "Projekty" "import/jira": diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index b7c135abc18..8babfc3b13c 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -111,7 +111,7 @@ pt-BR: text: "As ações individuais de um usuário (por exemplo, atualizar um pacote de trabalho duas vezes) são agregadas em uma única ação se o intervalo de tempo for menor que o intervalo especificado. Eles serão exibidos como uma única ação dentro do aplicativo. Isso também atrasará as notificações no mesmo intervalo de tempo, reduzindo o número de e-mails enviados e também afetará o atraso de %{webhook_link}." link: "webhook" import: - title: "Import" + title: "Importar" jira: title: "Jira Import" description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." @@ -122,19 +122,19 @@ pt-BR: description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." configuration: title: "Jira configuration" - new: "New configuration" + new: "Nova configuração" banner: title: "Limited import" description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: - name: "Name" + name: "Nome" url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" + personal_access_token: "Token de acesso pessoal" + button_add: "Adicionar configuração" + button_save: "Salvar configuração" + button_test: "Testar configuração" + button_delete_token: "Excluir token" delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." label_testing: "Testing configuration..." token_deleted: "Token was successfully deleted." @@ -147,20 +147,20 @@ pt-BR: api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." token_error: "Invalid API token. Please check your credentials in the configuration." missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + invalid_url: "Forneça um URL válido" client: connection_error: "Failed to connect to Jira server: %{message}" connection_timeout: "Connection to Jira server timed out: %{message}" parse_error: "Failed to parse Jira API response: %{message}" api_error: "Jira API returned error status %{status}" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" + projects: "Projetos" + last_change: "Última alteração" + added: "Adicionado" label_ago: "%{amount} ago" run: title: "Import run" - history: "History" + history: "Histórico" remove_error: "A Jira import cannot be removed while it is running" import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." blank: @@ -169,25 +169,25 @@ pt-BR: 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_edit_configuration: "Editar configuração" status: - initial: "Start" + initial: "Iniciar" instance_meta_fetching: "Fetching meta data" instance_meta_error: "Error fetching meta data" instance_meta_done: "Meta data fetched" - configuring: "Select scope" + configuring: "Selecione o escopo" projects_meta_fetching: "Fetching project data" projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" - imported: "Review mode" - reverting: "Reverting" + projects_meta_done: "Dados coletados" + importing: "Em andamento" + import_error: "Erro durante importação" + imported: "Modo de revisão" + reverting: "Revertendo" revert_error: "Error during revert" - reverted: "Reverted" - completed: "Completed" + reverted: "Revertido" + completed: "Concluído" wizard: - button_retry: "Retry" + button_retry: "Tentar novamente" parts: projects: one: "1 project" @@ -213,15 +213,15 @@ pt-BR: groups_and_users: title: "Groups and Users" configuration: - title: "Configure import" + title: "Configurar importação" confirming: - title: "Confirm and import" + title: "Confirmar e importar" review: title: "Review import" sections: fetch_data: title: "Fetch instance meta data" - caption_done: "Completed" + caption_done: "Concluído" description: "Check what data is available for import in the host Jira instance." button_fetch: "Check available data" label_progress: "Fetching data from Jira..." @@ -230,38 +230,38 @@ pt-BR: import_scope: title: "Import scope" caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" + caption_done: "Concluído" 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 URL 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_available_data: "Available data" + label_available_data: "Dados disponíveis" label_not_available_data: "Not available for import" button_select_projects: "Select projects to import" - button_continue: "Continue" + button_continue: "Continuar" label_import: "Select which projects you would like to import." - button_select: "Select projects" + button_select: "Selecionar projetos" label_selected_data: "Selected data for import" label_progress: "Fetching data from Jira..." elements: relations: "Relations between issues" workflows: "Project-level workflows" - users: "Users" + users: "Usuários" sprints: "Sprints" - schemes: "Schemas" + schemes: "Esquemas" permissions: "User, group and project permissions" confirm_import: - title: "Import data" + title: "Importar dados" caption: "Review your import settings and start the import" - caption_done: "Completed" + caption_done: "Concluído" label_available_data: "Available data to import" - button_start: "Start import" + button_start: "Iniciar importação" description: "You are about to start an import run with the following settings." - label_progress: "Import in progress..." + label_progress: "Importação em andamento..." label_import_data: "Currently importing" import_result: title: "Import run results" caption: "Review import run or revert import" info: "Import run successful." - label_results: "Imported" + label_results: "Importado" label_revert: "Revert import" button_revert: "Revert import" button_done: "Finalize import" @@ -271,7 +271,7 @@ pt-BR: label_revert_progress: "Reverting import..." label_reverted: "Import reverted." select_dialog: - filter_projects: "Filter by text" + filter_projects: "Filtrar por texto" revert_dialog: title: "Permanently revert this import?" description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." @@ -279,15 +279,15 @@ pt-BR: finalize_dialog: title: "Finalize this import?" description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + confirm: "Compreendo que esta ação é irreversível" + confirm_button: "Compreendido" select_projects: - title: "Select projects" + title: "Selecionar projetos" 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." resources_heading: "Recursos" - resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_description: "O OpenProject implementa as seguintes recursos. Cada uma pode ser habilitada, renomeada e descrita conforme desejado. Para mais informações, consulte a [documentação sobre recursos MCP](docs_url)." resources_submit: "Atualizar recursos" tools_heading: "Ferramentas" tools_description: "O OpenProject implementa as seguintes ferramentas. Cada uma pode ser habilitada, renomeada e descrita conforme desejado. Para mais informações, consulte a [documentação sobre ferramentas MCP](docs_url)." @@ -296,12 +296,12 @@ pt-BR: success: "Configurações MCP atualizadas com sucesso." server_form: description_caption: "Como o servidor MCP será descrito para outros aplicativos que se conectarem a ele." - title_caption: "A short title shown to applications that connect to the MCP server." + title_caption: "Um título curto exibido para aplicativos que se conectam ao servidor MCP." tool_response_format: "Tool response format" - tool_response_format_content_only_label: "Content only" + tool_response_format_content_only_label: "Apenas conteúdo" tool_response_format_content_only_caption: > Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. - tool_response_format_full_label: "Full" + tool_response_format_full_label: "Completo" tool_response_format_full_caption: > The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance. tool_response_format_structured_only_label: "Structured content only" @@ -572,11 +572,11 @@ pt-BR: formula: project: "Adicione valores numéricos ou digite / para buscar um atributo ou um operador matemático." regexp: - all: "eg. ^[A-Z0-9]+$" - project: "eg. ^[A-Z0-9]+$" + all: "ex. ^[A-Z0-9]+$" + project: "ex. ^[A-Z0-9]+$" min_max: - all: "0 means no restriction" - project: "0 means no restriction" + all: "0 significa que não há restrição" + project: "0 significa que não há restrição" has_comment: project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." tab: @@ -1357,7 +1357,7 @@ pt-BR: activerecord: attributes: jira_import: - projects: "Projects" + projects: "Projetos" "import/jira": name: "Jira instance name" url: "Jira instance URL" @@ -2120,7 +2120,7 @@ pt-BR: comment: "Comentário" custom_action: "Ação personalizada" custom_field: "Campo personalizado" - customized: "Customized" + customized: "Personalizado" "doorkeeper/application": "Aplicação OAuth" enterprise_token: one: "Token Enterprise" @@ -3101,7 +3101,7 @@ pt-BR: budget_deleted: "Budget has been deleted" dates_changed: "Datas alteradas" default_attribute_written: "Atributos de somente leitura escritos" - import: "Imported" + import: "Importado" progress_mode_changed_to_status_based: "Cálculo de progresso atualizado" status_changed: "Status '%{status_name}'" system_update: "Atualização do sistema OpenProject:" diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index 16a38ef2c73..33c722cc4da 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -1356,9 +1356,6 @@ pt-PT: dependencies: "Dependências" activerecord: attributes: - agile/sprint: - sharing: "Partilhar" - finish_date: "Data de término" jira_import: projects: "Projetos" "import/jira": diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index 8ff7eb0f1c6..cad052c0aba 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -83,9 +83,9 @@ zh-CN: confirmation: "确定要删除此企业版支持令牌吗?" create_dialog: title: "添加企业令牌" - type_token_text: "Your Enterprise token text" + type_token_text: "您的企业令牌文本" token_placeholder: "在此处粘贴您的企业版支持令牌" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "要详细了解如何激活企业版,请查阅我们的[文档](docs_url)。" add_token: "上传企业版支持令牌" replace_token: "替换您当前的支持令牌" order: "订购本地部署的 Enterprise edition" @@ -111,177 +111,177 @@ zh-CN: text: "如果用户的多项操作(例如,更新工作包两次)的时间间隔小于指定的时间跨度,则这些操作将被聚合为单个操作,并在应用程序中显示为单个操作。这也会将通知延迟同等的时间,从而减少电子邮件的发送数量,并且还会影响 %{webhook_link} 延迟。" link: "Webhook" import: - title: "Import" + title: "导入" jira: - title: "Jira Import" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + title: "Jira 导入" + description: "使用此工具从您的 Jira 实例中导入数据。您可以配置多个 Jira 主机,并选择每次导入运行要导入的内容。" errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "无法删除具有现有导入的 Jira 主机" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + title: "尚未配置 Jira 主机" + description: "配置 Jira 主机,以开始将 Jira 中的条目导入此 OpenProject 实例。" configuration: - title: "Jira configuration" - new: "New configuration" + title: "Jira 配置" + new: "新配置" banner: - title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + title: "受限导入" + description: "此导入工具目前处于测试阶段,只能导入基本数据:项目、问题(名称、标题、描述、附件)、用户(名称、电子邮件地址、项目成员资格)、状态和类型。不能导入工作流、自定义字段、问题关系或权限。我们目前仅支持 Jira Server/Data Center 版本 10.x 和 11.x。目前不支持云实例。" form: fields: - name: "Name" - url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + name: "名称" + url: "Jira 服务器/数据中心 URL" + personal_access_token: "个人访问令牌" + button_add: "添加配置" + button_save: "保存配置" + button_test: "测试配置" + button_delete_token: "删除令牌" + delete_token_confirm: "确定要删除令牌吗?这将禁用 Jira 连接。" + label_testing: "正在测试配置…" + token_deleted: "令牌已成功删除。" test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + success: "成功连接到 %{server}(版本 %{version})" + failed: "连接失败:无法检索服务器信息" + error: "测试连接时意外出错" + connection_error: "连接错误:%{message}" + parse_error: "服务器响应解析失败。服务器可能不是有效的 Jira 实例。" + api_error: "Jira API 返回错误状态 %{status}。请检查您的 Jira 实例 URL 和 API 令牌。" + token_error: "API 令牌无效。请在配置中检查您的凭据。" + missing_credentials: "请提供 URL 和个人访问令牌,以测试连接" + invalid_url: "请提供有效的 URL" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "Jira 服务器连接失败:%{message}" + connection_timeout: "与 Jira 服务器的连接超时:%{message}" + parse_error: "Jira API 响应解析失败:%{message}" + api_error: "Jira API 返回错误状态 %{status}" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" - label_ago: "%{amount} ago" + projects: "项目" + last_change: "上次更改" + added: "已添加" + label_ago: "%{amount} 前" run: - title: "Import run" - history: "History" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + title: "导入运行" + history: "历史记录" + remove_error: "无法移除正在运行的 Jira 导入" + import_blocked_error: "另一个 Jira 导入运行当前正在执行或等待审核。请先完成或撤消当前运行,然后再开始新的导入。" blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "尚未设置导入运行" + description: "创建导入运行,开始从此 Jira 实例中导入信息" 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" + description: "每次导入运行都可以导入不同的数据集。可以在审核模式后立即撤消导入运行,但不能在完成后撤消。" + button_import_run: "导入运行" + button_edit_configuration: "编辑设置" status: - initial: "Start" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" - configuring: "Select scope" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" - imported: "Review mode" - reverting: "Reverting" - revert_error: "Error during revert" - reverted: "Reverted" - completed: "Completed" + initial: "开始" + instance_meta_fetching: "正在获取元数据" + instance_meta_error: "获取元数据时出错" + instance_meta_done: "元数据已获取" + configuring: "选择范围" + projects_meta_fetching: "正在获取项目数据" + projects_meta_error: "获取项目数据时出错" + projects_meta_done: "数据已收集" + importing: "进行中" + import_error: "导入过程中出错" + imported: "审核模式" + reverting: "撤消中" + revert_error: "撤消过程中出错" + reverted: "已撤消" + completed: "已完成" wizard: - button_retry: "Retry" + button_retry: "重试" parts: projects: - other: "%{count} projects" + other: "%{count} 个项目" issues: - other: "%{count} issues" + other: "%{count} 个问题" work_packages: - other: "%{count} work packages" + other: "%{count} 个工作包" types: - other: "%{count} types" + other: "%{count} 种类型" statuses: - other: "%{count} statuses" + other: "%{count} 种状态" users: - other: "%{count} users" + other: "%{count} 名用户" groups: fetch: - title: "Get base data" + title: "获取基础数据" groups_and_users: - title: "Groups and Users" + title: "群组和用户" configuration: - title: "Configure import" + title: "配置导入" confirming: - title: "Confirm and import" + title: "确认并导入" review: - title: "Review import" + title: "审核导入" sections: fetch_data: - title: "Fetch instance meta data" - caption_done: "Completed" - description: "Check what data is available for import in the host Jira instance." - button_fetch: "Check available data" - label_progress: "Fetching data from Jira..." + title: "获取实例元数据" + caption_done: "已完成" + description: "检查主机 Jira 实例中有哪些数据可以导入。" + button_fetch: "检查可用数据" + label_progress: "正在从 Jira 获取数据…" groups_and_users: - title: "Groups and Users" + title: "群组和用户" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" - 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 URL 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_available_data: "Available data" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" - button_continue: "Continue" - 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..." + title: "导入范围" + caption: "选择要导入 OpenProject 的内容" + caption_done: "已完成" + label_info: "请注意,此导入工具仍处于测试阶段,不能导入所有类型的数据。以下是主机 Jira 实例 URL 提供的导入功能摘要,以及此工具目前能够导入的内容。" + description: "在从主机 Jira 实例获取的可用数据中选择要导入的数据。" + label_available_data: "可用数据" + label_not_available_data: "不可导入" + button_select_projects: "选择要导入的项目" + button_continue: "继续" + label_import: "选择要导入的项目。" + button_select: "选择项目" + label_selected_data: "已选择要导入的数据" + label_progress: "正在从 Jira 获取数据…" elements: - relations: "Relations between issues" - workflows: "Project-level workflows" - users: "Users" - sprints: "Sprints" - schemes: "Schemas" - permissions: "User, group and project permissions" + relations: "问题之间的关系" + workflows: "项目级工作流" + users: "用户" + sprints: "冲刺" + schemes: "方案" + permissions: "用户、群组和项目权限" confirm_import: - title: "Import data" - caption: "Review your import settings and start the import" - caption_done: "Completed" - label_available_data: "Available data to import" - 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" + title: "导入数据" + caption: "审核导入设置并开始导入" + caption_done: "已完成" + label_available_data: "可导入的数据" + button_start: "开始导入" + description: "您即将使用以下设置开始导入运行。" + label_progress: "正在导入…" + label_import_data: "当前正在导入" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." - label_results: "Imported" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: 'The imported data is currently in review mode. Click "Finalize import" to make the import permanent or "Revert import" to undo all changes made in this import run.' - label_finalizing_progress: "Finalizing import..." - label_finalized: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + title: "导入运行结果" + caption: "审核导入运行或撤消导入" + info: "导入运行成功。" + label_results: "已导入" + label_revert: "撤消导入" + button_revert: "撤消导入" + button_done: "完成导入" + preview_description: '导入的数据当前处于审核模式。点击“完成导入”可永久导入,点击“撤消导入”可撤消本次导入运行中的所有更改。' + label_finalizing_progress: "正在完成导入…" + label_finalized: "导入已完成。" + label_revert_progress: "正在撤消导入…" + label_reverted: "导入已撤消。" select_dialog: - filter_projects: "Filter by text" + filter_projects: "按文本筛选" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." - confirm: "I understand that this reversion will delete data permanently" + title: "是否永久撤消此导入?" + description: "这将删除所有导入的对象(包括整个项目),即使在 OpenProject 上导入后这些项目中有用户活动。" + confirm: "我明白,此撤消操作会永久删除数据" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + title: "是否完成此导入?" + description: "完成后,此导入将无法再撤消。所有导入的数据将永久导入。" + confirm: "我明白此操作无法撤消" + confirm_button: "明白了" select_projects: - title: "Select projects" + title: "选择项目" 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." + description: "Model Context Protocol 允许 AI 智能体向其用户提供此 OpenProject 实例所公开的工具和资源。此功能仍处于测试阶段。" resources_heading: "资源" - resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_description: "OpenProject 实现了以下资源。每种工具都可以根据需要启用、重命名和描述。有关详情,请参阅[关于 MCP 资源的文档](docs_url)。" resources_submit: "更新资源" tools_heading: "工具" tools_description: "OpenProject 实现了以下工具。每种工具都可以根据需要启用、重命名和描述。有关详情,请参阅[关于 MCP 工具的文档](docs_url)。" @@ -290,17 +290,17 @@ zh-CN: success: "MCP 配置已成功更新。" server_form: description_caption: "如何向连接到 MCP 服务器的其他应用程序描述该 MCP 服务器。" - title_caption: "A short title shown to applications that connect to the MCP server." - tool_response_format: "Tool response format" - tool_response_format_content_only_label: "Content only" + title_caption: "展示给连接到 MCP 服务器的应用程序的简短标题。" + tool_response_format: "工具响应格式" + tool_response_format_content_only_label: "仅内容" tool_response_format_content_only_caption: > - Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. - tool_response_format_full_label: "Full" + 如果连接到此实例的 MCP 客户端不支持结构化内容,则选中此项。此后,工具响应将只包含纯文本内容,而不包含结构化版本。 + tool_response_format_full_label: "完整" tool_response_format_full_caption: > - The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance. - tool_response_format_structured_only_label: "Structured content only" + 最兼容的选项。工具响应将包含常规内容和结构化内容,MCP 客户端可以选择要读取的格式。这可能会增加语言模型需要处理的词元数,从而可能导致成本增加,性能降低。 + tool_response_format_structured_only_label: "仅结构化内容" tool_response_format_structured_only_caption: > - Choose this if you are certain that MCP clients connecting to this instance support structured content. Tool responses will only include structured content and leave out its text representation. + 如果您确定连接到此实例的 MCP 客户端支持结构化内容,则选中此项。此后,工具响应将只包含结构化内容,而不包含其文本表示。 update: failure: "MCP 配置无法更新。" success: "MCP 配置已成功更新。" @@ -536,7 +536,7 @@ zh-CN: contained_in_type: "已包含在类型中" confirm_destroy_option: "删除某个选项将会删除其所有实例 (例如, 在工作包中)。确定要删除?" reorder_alphabetical: "按字母顺序重新排序" - reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?" + reorder_confirmation: "警告:当前的可用值顺序以及所有未保存的值都将丢失。确定要继续吗?" placeholder_version_select: "需要先选择工作包或项目" calculated_field_not_editable: "不可编辑属性。此值是自动计算的。" no_role_assigment: "无角色指定" @@ -564,13 +564,13 @@ zh-CN: formula: project: "添加数值或输入 / 以搜索特性或数学运算符。" regexp: - all: "eg. ^[A-Z0-9]+$" - project: "eg. ^[A-Z0-9]+$" + all: "例如 ^[A-Z0-9]+$" + project: "例如 ^[A-Z0-9]+$" min_max: - all: "0 means no restriction" - project: "0 means no restriction" + all: "0 表示无限制" + project: "0 表示无限制" has_comment: - project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." + project: "用户可以在项目概览中选择值时添加与项目特性相关的注释。" tab: no_results_title_text: 目前没有自定义字段。 no_results_content_text: 创建新的自定义字段 @@ -589,8 +589,8 @@ zh-CN: confirmation_live_message_unchecked: "继续按钮现已失效。您需要勾选复选框才能继续。" mcp_configurations: server_url_component: - caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." - label: "Server URL" + caption: "可连接 OpenProject MCP 服务器的 URL。设置 MCP 客户端时需要使用。" + label: "服务器 URL" op_dry_validation: or: "或" errors: @@ -794,7 +794,7 @@ zh-CN: is_for_all_blank_slate: heading: 适用于所有项目 description: 由于选中了“适用于所有项目”选项,所有项目都启用了此项目特性。无法为个别项目停用该特性。 - enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. + enabled_via_assignee_when_submitted_html: 无法禁用此项目特性,因为在提交项目启动请求时,它被设为受理人。 types: no_results_title_text: 目前有可用的类型。 form: @@ -810,8 +810,8 @@ zh-CN: new_label: "新优先级" creation_wizard: errors: - no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." - no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." + no_work_package_type: "无法启用项目启动请求,因为它至少需要一个活动的工作包类型,但此项目没有。请为此项目至少添加一种工作包类型。" + no_status_when_submitted: "无法启用项目启动请求,因为工作包类型 %{type} 至少需要一个与之相关的状态。请为此工作包类型至少启用一个状态工作流。" export: description_attachment_export: "生成的工件将作为 PDF 附件保存到工件工作包中。" description_file_link_export: "工件工作包将有一个文件链接,指向存储在外部文件存储空间的 PDF 文件。此项目需要一个有效文件存储空间,其中包含自动管理的项目文件夹。目前仅支持 Nextcloud 文件存储空间。" @@ -825,7 +825,7 @@ zh-CN: label_request_submission: "请求提交" project_attributes_description: > 选择哪些项目特性应包含在项目启动请求中。此列表仅包含为此项目启用的[项目特性](project_attributes_url)。 - enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. + enabled_because_required_html: 无法为此项目启动请求禁用此项目特性,因为它被定义为必填项。实例管理员可在管理设置中更改此设置。 status: button_edit: 编辑状态 wizard: @@ -1341,11 +1341,11 @@ zh-CN: activerecord: attributes: jira_import: - projects: "Projects" + projects: "项目" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Jira 实例名称" + url: "Jira 实例 URL" + personal_access_token: "个人访问令牌" announcements: show_until: "显示截止日期" attachment: @@ -1391,7 +1391,7 @@ zh-CN: regexp: "正则表达式" searchable: "可搜索" admin_only: "仅管理员" - has_comment: "Add a comment text field" + has_comment: "添加注释文本字段" custom_value: value: "值" design_color: @@ -1720,7 +1720,7 @@ zh-CN: not_available: "因系统配置而不可用。" not_deletable: "无法删除。" not_current_user: "不是当前用户。" - only_one_active_sprint_allowed: "only one active sprint is allowed per project." + only_one_active_sprint_allowed: "每个项目只允许有一个活跃的冲刺。" not_found: "未找到" not_a_date: "不是有效的日期。" not_a_datetime: "不是有效的日期时间。" @@ -1827,7 +1827,7 @@ zh-CN: meeting: error_conflict: "无法保存,因为会议已被其他人同时更新。请重新加载页面。" message: - cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." + cannot_move_message_to_forum_of_different_project: "无法将消息转移到其他项目的论坛。" notifications: at_least_one_channel: "至少需要指定一个发送通知的通道。" attributes: @@ -2083,7 +2083,7 @@ zh-CN: in_use: "此令牌名称已被使用,请选择其他令牌名称" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "请提供有效的协议(http 或 https)" template: body: "请检查以下字段:" header: @@ -2099,7 +2099,7 @@ zh-CN: comment: "评论" custom_action: "自定义操作" custom_field: "自定义字段" - customized: "Customized" + customized: "自定义" "doorkeeper/application": "OAuth应用程序" enterprise_token: other: "企业令牌" @@ -2270,7 +2270,7 @@ zh-CN: role: "角色" roles: "角色" search: "搜索" - sprint: "Sprint" + sprint: "冲刺" start_date: "开始日期" status: "状态" state: "地区" @@ -2622,7 +2622,7 @@ zh-CN: gantt_pdf_export: 甘特图 PDF 导出 ldap_groups: LDAP 用户和群组同步 mcp_server: Model Context Protocol (MCP) - meeting_templates: Reusable meeting templates + meeting_templates: 可重用会议模板 nextcloud_sso: Nextcloud存储的单点登录(SSO) one_drive_sharepoint_file_storage: OneDrive/SharePoint 文件存储 placeholder_users: 占位符用户 @@ -2700,9 +2700,9 @@ zh-CN: title: "自定义操作" description: "自定义操作是一键快捷方式,指向一组预定义的操作,您可以根据状态、角色、类型或项目在某些工作包上使用这些操作。" mcp_server: - description: "Bring OpenProject into your AI workflows with a secure MCP server." + description: "通过安全的 MCP 服务器将 OpenProject 引入您的 AI 工作流。" meeting_templates: - description: "Define meeting templates with a set agenda structure and save time by reusing them when creating new meetings." + description: "定义具有设定的议程结构的会议模板,并在创建新会议时重复使用这些模板,从而节省时间。" nextcloud_sso: title: "Nextcloud存储的单点登录(SSO)" description: "使用单点登录为您的 Nextcloud 存储启用无缝且安全的身份验证。简化访问管理并提升用户便利性。" @@ -3014,16 +3014,16 @@ zh-CN: #We need to include the version to invalidate outdated translations in other locales "17_2": new_features_title: > - The release contains various new features and improvements, such as: + 此版本包含各种新功能和改进,例如: new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved accessibility - line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments. - line_4: PDF export enhancements - line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module - line_7: Harmonized custom field forms + line_0: 通过安全的 MCP 服务器实现的 AI 工作流(专业版及更高版本) + line_1: 改进了项目主页,新增了预算微件,提高了可访问性 + line_2: "会议:会议模板(基本方案及更高版本)" + line_3: 通过项目特性注释,提高了透明度。 + line_4: PDF 导出增强功能 + line_5: 提高了外部链接的安全性(高级方案及更高版本) + line_6: 积压工作模块中的 UI/UX 改进 + line_7: 统一的自定义字段表单 links: upgrade_enterprise_edition: "升级到企业版" postgres_migration: "将您的安装迁移到 PostgreSQL" @@ -3041,10 +3041,10 @@ zh-CN: journals: changes_retracted: "更改已撤回。" caused_changes: - budget_deleted: "Budget has been deleted" + budget_deleted: "预算已删除" dates_changed: "日期已更改" default_attribute_written: "已写入只读属性" - import: "Imported" + import: "已导入" progress_mode_changed_to_status_based: "更新进度计算" status_changed: "状态 '%{status_name}'" system_update: "OpenProject 系统更新:" @@ -3053,21 +3053,21 @@ zh-CN: total_percent_complete_mode_changed_to_simple_average: "完成% 总数的计算现在仅基于完成% 值的简单平均值。" cause_descriptions: import: - header: "changes by %{author}" - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" - field_updated: "%{field} updated" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" - set_with_diff: "%{field} set (%{link})" + header: "更改者:%{author}" + field_changed: "%{field} 已从 %{old_value} 更改为 %{new_value}" + field_set: "%{field} 设置为 %{value}" + field_removed: "%{field} 已移除" + field_updated: "%{field} 已更新" + deleted_with_diff: "%{field} 已删除 (%{link})" + changed_with_diff: "%{field} 已更改 (%{link})" + set_with_diff: "%{field} 已设置 (%{link})" work_package_predecessor_changed_times: 根据前置任务 %{link}的更改 work_package_parent_changed_times: 通过对父级的更改 %{link} work_package_children_changed_times: 通过对子级的更改 %{link} work_package_related_changed_times: 通过对相关内容的更改 %{link} work_package_duplicate_closed: 重复的工作包自动更新了状态 %{link} unaccessable_work_package_changed: 通过对相关工作包的更改 - budget_deleted: Budget has been deleted + budget_deleted: 预算已删除 working_days_changed: changed: "通过更改工作日(%{changes})" days: @@ -3148,7 +3148,7 @@ zh-CN: active_tokens: "有效令牌" blank_description: "没有为您配置和激活第三方应用程序访问权限。" blank_title: "没有 OAuth 应用程序令牌" - last_refreshed_at: "Last refreshed at" + last_refreshed_at: "最后刷新时间" title: "OAuth" table_title: "OAuth 应用程序令牌" text_hint: "OAuth 应用程序令牌允许第三方应用程序与此 OpenProject 实例关联。" @@ -3234,7 +3234,7 @@ zh-CN: label_always_visible: "总是显示" label_announcement: "公告" label_angular: "AngularJS" - label_app_modules: "%{app_title} modules" + label_app_modules: "%{app_title} 模块" label_api_access_key: "API 访问键" label_api_access_key_created_on: "API 访问密钥创建于 %{value} 前" label_api_access_key_type: "API" @@ -3388,7 +3388,7 @@ zh-CN: label_duplicates: "复制" label_edit: "编辑" label_edit_x: "编辑:%{x}" - label_view_x: "View: %{x}" + label_view_x: "查看:%{x}" label_enable_multi_select: "切换多选" label_enabled_project_custom_fields: "启用自定义字段" label_enabled_project_modules: "启用的模块" @@ -3493,7 +3493,7 @@ zh-CN: label_external_links: "外部链接" label_locale: "语言和地区" label_jump_to_a_project: "跳转到一个项目..." - label_jira_import: "Jira Import" + label_jira_import: "Jira 导入" label_keyword_plural: "关键词" label_language_based: "基于用户的语言" label_last_activity: "最近一次活动" @@ -3516,7 +3516,7 @@ zh-CN: label_lock_user: "锁定用户" label_logged_as: "登录用户名" label_login: "登录" - label_custom_comment: "%{name} comment" + label_custom_comment: "%{name} 注释" label_custom_logo: "自定义徽标桌面版" label_custom_logo_mobile: "自定义徽标移动版" label_custom_export_logo: "自定义导出徽标" @@ -4141,7 +4141,7 @@ zh-CN: notice_successful_delete: "成功删除。" notice_successful_cancel: "取消成功" notice_successful_update: "成功更新。" - notice_successful_move: "Successful move from %{from} to %{to}." + notice_successful_move: "成功从 %{from} 移动到 %{to}。" notice_unsuccessful_create: "创建失败。" notice_unsuccessful_create_with_reason: "创建失败:%{reason}" notice_unsuccessful_update: "更新失败。" @@ -4301,7 +4301,7 @@ zh-CN: permission_edit_project_query: "编辑项目查询" placeholders: default: "-" - templated_hint: Automatically generated through type %{type} + templated_hint: 通过类型 %{type} 自动生成 portfolio: count: zero: "0 个项目组合" @@ -4484,9 +4484,9 @@ zh-CN: setting_capture_external_links: "捕获外部链接" setting_capture_external_links_text: > 启用后,格式化文本中的所有外部链接在离开应用程序前都会重定向至警告页面。这有助于保护用户免受潜在恶意外部网站的危害。 - setting_capture_external_links_require_login: "Require users to be logged in" + setting_capture_external_links_require_login: "需要用户登录" setting_capture_external_links_require_login_text: > - When enabled, users wanting to click on external links need to be logged in before being able to continue. + 启用后,想要点击外部链接的用户需要先登录,然后才能继续操作。 setting_after_first_login_redirect_url: "首次登录重定向" setting_after_first_login_redirect_url_text_html: > 设置用户首次登录后的重定向路径。如果该路径为空,则重定向到主页以进行导览介绍。
示例: /my/page @@ -4531,9 +4531,9 @@ zh-CN: setting_smtp_password: "SMTP 密码" setting_smtp_domain: "SMTP HELO 域" setting_activity_days_default: "项目活动显示的天数" - setting_api_tokens_enabled: "Enable API tokens" + setting_api_tokens_enabled: "启用 API 令牌" setting_api_tokens_enabled_caption: > - Decide whether users can create personal API tokens in their account settings. These tokens can be used to access the different APIs of OpenProject, such as APIv3 and MCP. + 决定用户是否可以在帐户设置中创建个人 API 令牌。这些令牌可用于访问 OpenProject 的不同 API,如 APIv3 和 MCP。 setting_app_subtitle: "应用副标题" setting_app_title: "应用程序标题" setting_attachment_max_size: "最大的附件大小" @@ -5071,10 +5071,10 @@ zh-CN: reset_failed_logins: "重置失败的帐户" status_user_and_brute_force: "%{user} 和 %{brute_force}" status_change: "状态更改" - text_change_disabled_for_provider_login: "The name and email is set by your login provider and can thus not be changed." + text_change_disabled_for_provider_login: "名称和电子邮件地址由您的登录提供商设置,因此无法更改。" unlock: "解锁​​​​" unlock_and_reset_failed_logins: "解锁和重置失败的帐户" - error_cannot_delete_user: "User cannot be deleted" + error_cannot_delete_user: "无法删除用户" version_status_closed: "关闭" version_status_locked: "锁定" version_status_open: "打开" diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index 6e02bc331a7..bca9221e609 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -26,13 +26,13 @@ es: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" - sharing: "Sharing" + duration: "Duración" + finish_date: "Fecha de finalización" + goal: "Objetivo del sprint" + name: "Nombre del sprint" + sharing: "Uso compartido" sprint: - duration: "Sprint duration" + duration: "Duración del sprint" work_package: position: "Posición" story_points: "Puntos de Historia" @@ -54,7 +54,7 @@ es: task_type: "Tipo de tarea" backlogs: any: "cualquiera" - column_width: "Column width" + column_width: "Ancho de columna" definition_of_done: "Criterio de Aceptación" impediment: "Impedimento" label_versions_default_fold_state: "Mostrar versiones colapsadas" @@ -62,8 +62,8 @@ es: work_package_is_closed: "El paquete de trabajo esta terminado, cuando" label_is_done_status: "El estado %{status_name} significa completado" points_label: - one: "point" - other: "points" + one: "punto" + other: "puntos" positions_could_not_be_rebuilt: "Las posiciones no pudieron ser reconstruidas." positions_rebuilt_successfully: "Posiciones reconstruidas con éxito." rebuild: "Reconstruir" @@ -72,8 +72,8 @@ es: show_burndown_chart: "Diagrama de Quemado" story: "Historia" story_points: - one: "%{count} story point" - other: "%{count} story points" + one: "%{count} punto de historia" + other: "%{count} puntos de historia" task: "Tarea" task_color: "Color de la tarea" unassigned: "No asignado" @@ -81,24 +81,24 @@ es: header_backlogs: "Módulo de trabajos pendientes" button_update_backlogs: "Actualizar módulo de trabajos pendientes" backlog_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} está vacío" + blankslate_description: "Aún no hay elementos previstos. Arrastre los elementos aquí para añadirlos." backlog_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Contraer/expandir %{name}" label_story_count: - zero: "No stories in backlog" - one: "%{count} story in backlog" - other: "%{count} stories in backlog" + zero: "No hay historias en backlog" + one: "%{count} historia en backlog" + other: "%{count} historias en backlog" backlog_menu_component: - label_actions: "Backlog actions" + label_actions: "Acciones de backlog" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Editar sprint" + new_story: "Nueva historia" + stories_tasks: "Historias/tareas" + task_board: "Panel de tareas" + burndown_chart: "Diagrama Burndown" wiki: "Wiki" - properties: "Properties" + properties: "Propiedades" story_component: label_drag_story: "Move %{name}" story_menu_component: diff --git a/modules/backlogs/config/locales/crowdin/js-zh-CN.yml b/modules/backlogs/config/locales/crowdin/js-zh-CN.yml index 4d23720f048..b704b0ad017 100644 --- a/modules/backlogs/config/locales/crowdin/js-zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/js-zh-CN.yml @@ -25,5 +25,5 @@ zh-CN: properties: storyPoints: "故事点" burndown: - day: "Day" - points: "Points" + day: "天" + points: "点" diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index 82e87b2afae..a6642fd3d60 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -26,13 +26,13 @@ ko: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" + duration: "기간" + finish_date: "완료 날짜" + goal: "스프린트 목표" + name: "스프린트 이름" sharing: "Sharing" sprint: - duration: "Sprint duration" + duration: "스프린트 기간" work_package: position: "위치" story_points: "스토리 포인트" @@ -49,12 +49,12 @@ ko: sprint: cannot_end_before_it_starts: "스프린트는 시작되기 전에 끝날 수 없습니다." models: - sprint: "Sprint" + sprint: "스프린트" attributes: task_type: "작업 유형" backlogs: any: "모두" - column_width: "Column width" + column_width: "열 너비" definition_of_done: "완료 정의" impediment: "제한" label_versions_default_fold_state: "접힌 버전 표시" @@ -62,7 +62,7 @@ ko: work_package_is_closed: "다음 경우에 작업 패키지가 완료됩니다." label_is_done_status: "%{status_name} 상태는 완료를 의미합니다." points_label: - other: "points" + other: "포인트" positions_could_not_be_rebuilt: "위치를 다시 빌드할 수 없습니다." positions_rebuilt_successfully: "위치가 성공적으로 다시 빌드되었습니다." rebuild: "다시 빌드" @@ -71,7 +71,7 @@ ko: show_burndown_chart: "번다운 차트" story: "스토리" story_points: - other: "%{count} story points" + other: "%{count} 스토리 포인트" task: "작업" task_color: "작업 색상" unassigned: "할당되지 않음" @@ -79,28 +79,28 @@ ko: header_backlogs: "백로그 모듈" button_update_backlogs: "백로그 모듈 업데이트" backlog_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name}이(가) 비어 있습니다" + blankslate_description: "아직 계획된 항목이 없습니다. 항목을 추가하려면 여기로 드래그하세요." backlog_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "%{name} 축소/확장" label_story_count: - zero: "No stories in backlog" - one: "%{count} story in backlog" - other: "%{count} stories in backlog" + zero: "백로그에 스토리 없음" + one: "백로그의 %{count}개 스토리" + other: "백로그의 %{count}개 스토리" backlog_menu_component: - label_actions: "Backlog actions" + label_actions: "백로그 작업" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" - wiki: "Wiki" - properties: "Properties" + edit_sprint: "스프린트 편집" + new_story: "새로운 스토리" + stories_tasks: "스토리/작업" + task_board: "작업 보드" + burndown_chart: "번다운 차트" + wiki: "위키" + properties: "속성" story_component: - label_drag_story: "Move %{name}" + label_drag_story: "%{name} 이동" story_menu_component: - label_actions: "Story actions" + label_actions: "스토리 작업" backlogs_points_burn_direction: "포인트 번 업/다운" backlogs_product_backlog: "제품 백로그" backlogs_story: "스토리" @@ -108,14 +108,14 @@ ko: backlogs_task: "일감" backlogs_task_type: "작업 유형" backlogs_wiki_template: "스프린트 위키 페이지에 대한 템플릿" - backlogs_empty_title: "No versions are defined yet" - backlogs_empty_action_text: "To start using backlogs, please create a version first" - backlogs_not_configured_title: "Backlogs not configured" - backlogs_not_configured_description: "Story and task types need to be set before using this module." - backlogs_not_configured_action_text: "Configure Backlogs" + backlogs_empty_title: "아직 정의된 버전 없음" + backlogs_empty_action_text: "백로그 사용을 시작하려면 먼저 버전을 만드세요" + backlogs_not_configured_title: "백로그 구성 안 됨" + backlogs_not_configured_description: "이 모듈을 사용하기 전에 스토리 및 작업 유형을 설정해야 합니다." + backlogs_not_configured_action_text: "백로그 구성" burndown: - story_points: "Story points" - story_points_ideal: "Story points (ideal)" + story_points: "스토리 포인트" + story_points_ideal: "스토리 포인트(적합함)" errors: attributes: task_type: @@ -127,18 +127,18 @@ ko: label_points_burn_down: "아래" label_points_burn_up: "위" label_sprint_impediments: "스프린트 제한" - label_sprint_new: "New sprint" + label_sprint_new: "새로운 스프린트" label_task_board: "작업 보드" - permission_view_sprints: "View sprints" - permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" - permission_manage_sprint_items: "Manage sprint items" - permission_share_sprint: "Share sprint" + permission_view_sprints: "스프린트 보기" + permission_create_sprints: "스프린트 만들기" + permission_start_complete_sprint: "스프린트 시작/완료" + permission_manage_sprint_items: "스프린트 항목 관리" + permission_share_sprint: "스프린트 공유" project_module_backlogs: "백로그" rb_burndown_charts: show: - blankslate_title: "No burndown data available" - blankslate_description: "Set start and end date for the sprint to generate a burndown chart." + blankslate_title: "사용 가능한 번다운 데이터 없음" + blankslate_description: "스프린트의 시작 날짜와 종료 날짜를 설정하여 번다운 차트를 생성합니다." remaining_hours: "남은 작업" version_settings_display_label: "백로그의 열" version_settings_display_option_left: "왼쪽" diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index 651194a4984..35a40a042ce 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -26,13 +26,13 @@ pt-BR: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" + duration: "Duração" + finish_date: "Data de conclusão" + goal: "Objetivo da sprint" + name: "Nome da sprint" sharing: "Sharing" sprint: - duration: "Sprint duration" + duration: "Duração da sprint" work_package: position: "Posição" story_points: "Pontos de história" @@ -54,7 +54,7 @@ pt-BR: task_type: "Tipo de tarefa" backlogs: any: "qualquer" - column_width: "Column width" + column_width: "Largura da coluna" definition_of_done: "Definição de pronto" impediment: "Impedimento" label_versions_default_fold_state: "Mostrar versões em modo fechado" @@ -62,8 +62,8 @@ pt-BR: work_package_is_closed: "Pacote de trabalho está pronto, quando" label_is_done_status: "Situação %{status_name} significa pronto" points_label: - one: "point" - other: "points" + one: "ponto" + other: "pontos" positions_could_not_be_rebuilt: "Posições não poderiam ser reconstruídas." positions_rebuilt_successfully: "Posições reconstruídas com sucesso." rebuild: "Reconstruir" @@ -72,8 +72,8 @@ pt-BR: show_burndown_chart: "Gráfico de Burndown" story: "História" story_points: - one: "%{count} story point" - other: "%{count} story points" + one: "%{count} ponto de história" + other: "%{count} pontos de história" task: "Tarefa" task_color: "Cor da tarefa" unassigned: "Não atribuída" @@ -81,28 +81,28 @@ pt-BR: header_backlogs: "Módulo de backlogs" button_update_backlogs: "Atualizar módulo de backlogs" backlog_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} está vazio" + blankslate_description: "Ainda não há itens planejados. Arraste os itens para este espaço para adicioná-los." backlog_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Recolher/Expandir %{name}" label_story_count: - zero: "No stories in backlog" - one: "%{count} story in backlog" - other: "%{count} stories in backlog" + zero: "Nenhuma história no backlog" + one: "%{count} história no backlog" + other: "%{count} histórias no backlog" backlog_menu_component: - label_actions: "Backlog actions" + label_actions: "Ações do backlog" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Editar sprint" + new_story: "Nova história" + stories_tasks: "Histórias/Tarefas" + task_board: "Quadro de tarefas" + burndown_chart: "Gráfico de burndown" wiki: "Wiki" - properties: "Properties" + properties: "Propriedades" story_component: - label_drag_story: "Move %{name}" + label_drag_story: "Mover %{name}" story_menu_component: - label_actions: "Story actions" + label_actions: "Ações da história" backlogs_points_burn_direction: "Pontos burn up/down" backlogs_product_backlog: "Backlog do produto" backlogs_story: "História" @@ -110,14 +110,14 @@ pt-BR: backlogs_task: "Tarefa" backlogs_task_type: "Tipo de tarefa" backlogs_wiki_template: "Modelo para página wiki da sprint" - backlogs_empty_title: "No versions are defined yet" - backlogs_empty_action_text: "To start using backlogs, please create a version first" - backlogs_not_configured_title: "Backlogs not configured" - backlogs_not_configured_description: "Story and task types need to be set before using this module." - backlogs_not_configured_action_text: "Configure Backlogs" + backlogs_empty_title: "Ainda não há versões definidas" + backlogs_empty_action_text: "Para começar a usar o backlog, primeiro crie uma versão" + backlogs_not_configured_title: "Backlogs não configurados" + backlogs_not_configured_description: "Os tipos de histórias e tarefas precisam ser definidos antes de usar este módulo." + backlogs_not_configured_action_text: "Configurar backlogs" burndown: - story_points: "Story points" - story_points_ideal: "Story points (ideal)" + story_points: "Pontos de história" + story_points_ideal: "Pontos de história (ideal)" errors: attributes: task_type: @@ -129,18 +129,18 @@ pt-BR: label_points_burn_down: "Abaixo" label_points_burn_up: "Acima" label_sprint_impediments: "Impedimentos da Sprint" - label_sprint_new: "New sprint" + label_sprint_new: "Nova sprint" label_task_board: "Quadro de tarefas" - permission_view_sprints: "View sprints" - permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" - permission_manage_sprint_items: "Manage sprint items" - permission_share_sprint: "Share sprint" + permission_view_sprints: "Ver sprints" + permission_create_sprints: "Criar sprints" + permission_start_complete_sprint: "Iniciar/concluir sprint" + permission_manage_sprint_items: "Gerenciar itens da sprint" + permission_share_sprint: "Compartilhar sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: - blankslate_title: "No burndown data available" - blankslate_description: "Set start and end date for the sprint to generate a burndown chart." + blankslate_title: "Nenhum dado de burndown disponível" + blankslate_description: "Defina a data de início e término da sprint para gerar o gráfico de burndown." remaining_hours: "trabalho restante" version_settings_display_label: "Coluna no backlog" version_settings_display_option_left: "esquerda" diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index 4dc8a64db74..7f195b6d6e9 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -30,7 +30,7 @@ zh-CN: finish_date: "完成日期" goal: "冲刺目标" name: "冲刺名称" - sharing: "Sharing" + sharing: "共享中" sprint: duration: "冲刺持续时间" work_package: @@ -62,7 +62,7 @@ zh-CN: work_package_is_closed: "工作包已完成,当" label_is_done_status: "状态 %{status_name} 表示已完成" points_label: - other: "点数" + other: "点" positions_could_not_be_rebuilt: "无法重建顺序" positions_rebuilt_successfully: "已成功重建顺序" rebuild: "重建" @@ -80,27 +80,27 @@ zh-CN: button_update_backlogs: "更新积压工作模块" backlog_component: blankslate_title: "%{name} 为空" - blankslate_description: "尚未计划项目。将项目拖到此处即可添加。" + blankslate_description: "尚未计划条目。请将条目拖到此处以添加。" backlog_header_component: label_toggle_backlog: "折叠/展开 %{name}" label_story_count: - zero: "待办清单中没有故事" - one: "待办清单中有 %{count} 个故事" - other: "待办清单中有 %{count} 个故事" + zero: "积压工作中没有故事" + one: "积压工作中有 %{count} 个故事" + other: "积压工作中有 %{count} 个故事" backlog_menu_component: - label_actions: "待办清单操作" + label_actions: "积压工作操作" action_menu: edit_sprint: "编辑冲刺" new_story: "新故事" stories_tasks: "故事/任务" task_board: "任务板" - burndown_chart: "Burndown chart" - wiki: "Wiki" - properties: "Properties" + burndown_chart: "燃尽图" + wiki: "维基百科" + properties: "属性" story_component: - label_drag_story: "Move %{name}" + label_drag_story: "移动 %{name}" story_menu_component: - label_actions: "Story actions" + label_actions: "故事操作" backlogs_points_burn_direction: "点数燃尽曲线" backlogs_product_backlog: "产品待办清单" backlogs_story: "故事" @@ -108,14 +108,14 @@ zh-CN: backlogs_task: "任务" backlogs_task_type: "任务类型" backlogs_wiki_template: "冲刺 (Sprint) 的维基页面模板" - backlogs_empty_title: "No versions are defined yet" - backlogs_empty_action_text: "To start using backlogs, please create a version first" - backlogs_not_configured_title: "Backlogs not configured" - backlogs_not_configured_description: "Story and task types need to be set before using this module." - backlogs_not_configured_action_text: "Configure Backlogs" + backlogs_empty_title: "尚未定义版本" + backlogs_empty_action_text: "要开始使用积压工作,请先创建一个版本" + backlogs_not_configured_title: "未配置积压工作" + backlogs_not_configured_description: "使用此模块前,需要设置故事和任务类型。" + backlogs_not_configured_action_text: "配置积压工作" burndown: - story_points: "Story points" - story_points_ideal: "Story points (ideal)" + story_points: "故事点" + story_points_ideal: "故事点(理想)" errors: attributes: task_type: @@ -127,18 +127,18 @@ zh-CN: label_points_burn_down: "减少" label_points_burn_up: "增加" label_sprint_impediments: "冲刺 (sprint) 障碍" - label_sprint_new: "New sprint" + label_sprint_new: "新冲刺" label_task_board: "任务板" - permission_view_sprints: "View sprints" - permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" - permission_manage_sprint_items: "Manage sprint items" - permission_share_sprint: "Share sprint" + permission_view_sprints: "查看冲刺" + permission_create_sprints: "创建冲刺" + permission_start_complete_sprint: "开始/完成冲刺" + permission_manage_sprint_items: "管理冲刺条目" + permission_share_sprint: "共享冲刺" project_module_backlogs: "待办清单" rb_burndown_charts: show: - blankslate_title: "No burndown data available" - blankslate_description: "Set start and end date for the sprint to generate a burndown chart." + blankslate_title: "没有可用的燃尽数据" + blankslate_description: "设置冲刺的开始和结束日期,以生成燃尽图。" remaining_hours: "剩余工时" version_settings_display_label: "待办清单中的列" version_settings_display_option_left: "左" diff --git a/modules/boards/config/locales/crowdin/zh-CN.yml b/modules/boards/config/locales/crowdin/zh-CN.yml index 48e7b406192..f67cfb9d484 100644 --- a/modules/boards/config/locales/crowdin/zh-CN.yml +++ b/modules/boards/config/locales/crowdin/zh-CN.yml @@ -20,7 +20,7 @@ zh-CN: action: "操作面板 (%{attribute})" board_type_attributes: assignee: 受理人 - status: Kanban + status: 看板 version: 版本 subproject: 子项目 subtasks: 父子 diff --git a/modules/budgets/config/locales/crowdin/de.yml b/modules/budgets/config/locales/crowdin/de.yml index 0c514190c1f..0ca8bc88c60 100644 --- a/modules/budgets/config/locales/crowdin/de.yml +++ b/modules/budgets/config/locales/crowdin/de.yml @@ -44,7 +44,7 @@ de: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "is not a member of the budget's project" + not_a_member_of_budget_project: "ist kein Mitglied des Budgetprojekts" models: budget: "Budget" material_budget_item: "Stück" @@ -76,16 +76,16 @@ de: heading: "Projektcontrolling starten" description: "Erhalten Sie einen Überblick über Ihre Budgets und Kosten, um den Status Ihres Projekts effizient zu verfolgen" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "Budgetdetails fehlen" + description: "Fügen Sie Details zu Ihrem geplanten Budget hinzu, um die Daten hier zu sehen" caption: zero: "Keine Budgetdaten." - one: "Data aggregated from %{count} budget included in this %{workspace}." - other: "Data aggregated from %{count} budgets included in this %{workspace}." + one: "Daten aggregiert aus %{count} Budget in diesem %{workspace}." + other: "Daten aggregiert aus %{count} Budgets in diesem %{workspace}." caption_with_subitems: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." - other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." + zero: "Keine Budgetdaten." + one: "Daten aggregiert aus %{count} Budget in diesem %{workspace} und seinen Unterelementen." + other: "Daten aggregiert aus %{count} Budgets in diesem %{workspace} und seinen Unterelementen." view_details: "Budgetdetails anzeigen" events: budget: "Budget bearbeitet" diff --git a/modules/budgets/config/locales/crowdin/fr.yml b/modules/budgets/config/locales/crowdin/fr.yml index 9b8ec632b0c..85f799c6f0d 100644 --- a/modules/budgets/config/locales/crowdin/fr.yml +++ b/modules/budgets/config/locales/crowdin/fr.yml @@ -74,18 +74,18 @@ fr: title: "Budget par type de coût" blankslate: heading: "Démarrer le contrôle du projet" - description: "Obtenez une vue d'ensemble de vos budgets et de vos coûts pour suivre efficacement l'état de santé de votre projet" + description: "Profitez d'une vue d'ensemble de vos budgets et de vos coûts pour suivre efficacement l'état de santé de votre projet" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "Détails du budget manquant" + description: "Ajoutez les détails de votre budget prévisionnel pour voir les données ici" caption: - zero: "Pas de données budgétaires." - one: "Data aggregated from %{count} budget included in this %{workspace}." - other: "Data aggregated from %{count} budgets included in this %{workspace}." + zero: "Aucune donnée budgétaire." + one: "Données agrégées à partir de %{count} budget inclus dans ce %{workspace}." + other: "Données agrégées à partir des %{count} budgets inclus dans ce %{workspace}." caption_with_subitems: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." - other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." + zero: "Pas de données budgétaires." + one: "Les données agrégées à partir du budget %{count} sont incluses dans ce %{workspace} et ses sous-points." + other: "Les données agrégées à partir des %{count} budgets sont incluses dans ce %{workspace} et ses sous-éléments." view_details: "Voir les détails du budget" events: budget: "Budget modifié" diff --git a/modules/budgets/config/locales/crowdin/ko.yml b/modules/budgets/config/locales/crowdin/ko.yml index 639199e1884..13847fa1a8e 100644 --- a/modules/budgets/config/locales/crowdin/ko.yml +++ b/modules/budgets/config/locales/crowdin/ko.yml @@ -65,28 +65,28 @@ ko: budgets: widgets: budget_totals: - title: "Budget totals" - remaining_budget: "Remaining budget" - spent_budget: "Spent budget" - total_actual_costs: "Total actual costs" - total_planned_budget: "Total planned budget" + title: "예산 합계" + remaining_budget: "남은 예산" + spent_budget: "소비된 예산" + total_actual_costs: "총 실제 비용" + total_planned_budget: "총 계획 예산" budget_by_cost_type: - title: "Budget by cost type" + title: "비용 유형별 예산" blankslate: - heading: "Start project controlling" - description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + heading: "프로젝트 제어 시작" + description: "예산 및 비용에 대한 개요를 확인하여 효율적으로 프로젝트 상태를 추적합니다" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "예산 세부 정보 누락" + description: "계획된 예산에 대한 세부 정보를 추가하여 여기에서 데이터를 확인합니다" caption: - zero: "No budget data." + zero: "예산 데이터가 없습니다." one: "Data aggregated from %{count} budget included in this %{workspace}." other: "Data aggregated from %{count} budgets included in this %{workspace}." caption_with_subitems: zero: "No budget data." one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." - view_details: "View budget details" + view_details: "예산 세부 정보 보기" events: budget: "예산 편집됨" help_click_to_edit: "편집하려면 여기를 클릭하세요." diff --git a/modules/budgets/config/locales/crowdin/pt-BR.yml b/modules/budgets/config/locales/crowdin/pt-BR.yml index 35d5e1085a6..4a28b36a9b2 100644 --- a/modules/budgets/config/locales/crowdin/pt-BR.yml +++ b/modules/budgets/config/locales/crowdin/pt-BR.yml @@ -65,28 +65,28 @@ pt-BR: budgets: widgets: budget_totals: - title: "Budget totals" - remaining_budget: "Remaining budget" - spent_budget: "Spent budget" - total_actual_costs: "Total actual costs" - total_planned_budget: "Total planned budget" + title: "Totais do orçamento" + remaining_budget: "Orçamento restante" + spent_budget: "Orçamento gasto" + total_actual_costs: "Total dos custos reais" + total_planned_budget: "Total do orçamento planejado" budget_by_cost_type: - title: "Budget by cost type" + title: "Orçamento por tipo de custo" blankslate: - heading: "Start project controlling" - description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + heading: "Iniciar controle do projeto" + description: "Obtenha uma visão geral dos seus orçamentos e custos para acompanhar com eficiência a situação do seu projeto" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "Detalhes de orçamento ausentes" + description: "Adicione os detalhes do orçamento planejado para visualizar os dados aqui" caption: - zero: "No budget data." + zero: "Nenhum dado de orçamento." one: "Data aggregated from %{count} budget included in this %{workspace}." other: "Data aggregated from %{count} budgets included in this %{workspace}." caption_with_subitems: zero: "No budget data." one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." - view_details: "View budget details" + view_details: "Ver detalhes do orçamento" events: budget: "Orçamento editado" help_click_to_edit: "Clique aqui para editar." diff --git a/modules/budgets/config/locales/crowdin/zh-CN.yml b/modules/budgets/config/locales/crowdin/zh-CN.yml index ae49beb5cd9..99dde4a9d20 100644 --- a/modules/budgets/config/locales/crowdin/zh-CN.yml +++ b/modules/budgets/config/locales/crowdin/zh-CN.yml @@ -44,7 +44,7 @@ zh-CN: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "is not a member of the budget's project" + not_a_member_of_budget_project: "不是预算项目的成员" models: budget: "预算" material_budget_item: "单位" @@ -65,28 +65,28 @@ zh-CN: budgets: widgets: budget_totals: - title: "Budget totals" - remaining_budget: "Remaining budget" - spent_budget: "Spent budget" - total_actual_costs: "Total actual costs" - total_planned_budget: "Total planned budget" + title: "预算总额" + remaining_budget: "剩余预算" + spent_budget: "已用预算" + total_actual_costs: "实际成本总额" + total_planned_budget: "计划预算总额" budget_by_cost_type: - title: "Budget by cost type" + title: "按成本类型分列的预算" blankslate: - heading: "Start project controlling" - description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + heading: "开始项目控制" + description: "概括了解预算和成本,有效跟踪项目的健康状况" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "预算详情缺失" + description: "添加计划预算的详情,以便在此处查看数据" caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace}." - other: "Data aggregated from %{count} budgets included in this %{workspace}." + zero: "无预算数据。" + one: "从包含在此 %{workspace} 中的 %{count} 个预算中汇总的数据。" + other: "从包含在此 %{workspace} 中的 %{count} 个预算中汇总的数据。" caption_with_subitems: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." - other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." - view_details: "View budget details" + zero: "无预算数据。" + one: "从包含在此 %{workspace} 及其子条目中的 %{count} 个预算中汇总的数据。" + other: "从包含在此 %{workspace} 及其子条目中的 %{count} 个预算中汇总的数据。" + view_details: "查看预算详情" events: budget: "预算已编辑" help_click_to_edit: "单击此处进行编辑。" diff --git a/modules/costs/config/locales/crowdin/de.yml b/modules/costs/config/locales/crowdin/de.yml index a9bcafcfa8a..f4ab9eb9320 100644 --- a/modules/costs/config/locales/crowdin/de.yml +++ b/modules/costs/config/locales/crowdin/de.yml @@ -205,10 +205,10 @@ de: project_module_costs: "Zeit und Kosten" setting_allow_tracking_start_and_end_times: "Start- und Endzeiten erlaubt" setting_costs_currency: "Währung" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "Dies ist die Einheit der Währung. Es kann ein ISO-Code mit drei Buchstaben wie EUR, USD oder JPY sein oder ein Symbol wie €, $ oder ¥." + setting_costs_currency_format: "Format der Währung" + 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 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." @@ -235,7 +235,7 @@ de: title: "Tatsächliche Kosten pro Monat" blankslate: heading: "Erfassen Sie Ihre Zeit und Kosten" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." + description: "Erhalten Sie einen Überblick über Ihre Kosten und protokollierte Zeit, um den Fortschritt Ihres Projekts zu verfolgen. Stellen Sie sicher, dass Arbeitspakete mit dem richtigen Budget verknüpft sind." action: "Zeit buchen" view_details: "Details zu den tatsächlichen Kosten anzeigen" ee: diff --git a/modules/costs/config/locales/crowdin/fr.yml b/modules/costs/config/locales/crowdin/fr.yml index 32cba041db7..540036f35ba 100644 --- a/modules/costs/config/locales/crowdin/fr.yml +++ b/modules/costs/config/locales/crowdin/fr.yml @@ -82,7 +82,7 @@ fr: models: time_entry: invalid_time: "doit être entre 00:00 et 23:59." - cannot_log_for_this_work_package: "Impossible d'enregistrer le journal pour ce lot de travaux." + cannot_log_for_this_work_package: "Impossible de consigner du temps pour ce lot de travaux." duplicate_ongoing: "Une saisie de temps en cours existe déjà pour cet utilisateur." 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." @@ -97,10 +97,10 @@ fr: valid_from: "Valable à partir du" fixed_date: "Date fixe" button_add_rate: "Ajouter tarif" - button_log_costs: "Consigner coûts unitaires" - button_log_time: "Journal" + button_log_costs: "Consigner des coûts unitaires" + button_log_time: "Consigner" button_add_activity: "Activité" - button_add_time_entry: "Consigner temps" + button_add_time_entry: "Consigner du temps" button_stop_timer: "Arrêter le suivi du temps" caption_booked_on_project: "Réservé pour le projet" caption_default: "Défaut" @@ -113,10 +113,10 @@ fr: caption_save_rate: "Enregistrer tarif" caption_set_rate: "Définir le tarif actuel" caption_show_locked: "Afficher les types verrouillés" - caption_log_time_dialog: "Sauvegarder le journal" + caption_log_time_dialog: "Consigner du temps" description_date_for_new_rate: "Date pour le nouveau tarif" description_costs_settings: "Définissez le format souhaité pour les coûts dans tous les projets." - description_time_settings: "Définissez les champs à remplir obligatoirement lors de l'enregistrement du temps de travail dans tous les projets." + description_time_settings: "Définissez les champs à remplir obligatoirement lors de la consignation du temps de travail dans tous les projets." group_by_others: "dans aucun groupe" label_between: "entre" label_cost_filter_add: "Ajouter filtre d'entrée de coût" @@ -142,7 +142,7 @@ fr: label_work_package_filter_add: "Ajouter filtre de lot de travaux" label_kind: "Type" label_less_or_equal: "<=" - label_log_costs: "Journaliser les coûts unitaires" + label_log_costs: "Consigner des coûts unitaires" label_new_time_entry_activity: "Nouvelle saisie de temps d'activité" label_time_entry_activity_form_description: "Les modifications apportées à cette saisie du temps d'activité seront répercutées dans tous les projets où elle est activée." label_no: "Non" @@ -194,7 +194,7 @@ fr: permission_edit_hourly_rates: "Éditer les tarifs horaires" permission_edit_own_hourly_rate: "Éditer ses propres tarifs horaires" permission_edit_rates: "Éditer les tarifs" - permission_log_costs: "Réserver coûts unitaires" + permission_log_costs: "Réserver des coûts unitaires" permission_log_own_costs: "Réserver coûts unitaires propres" permission_view_cost_entries: "Afficher coûts réservés" permission_view_cost_rates: "Voir les tarifs de coût" @@ -205,10 +205,10 @@ fr: project_module_costs: "Temps et coûts" setting_allow_tracking_start_and_end_times: "Autoriser les heures de début et de fin" setting_costs_currency: "Devise" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "Il s'agit de l'unité monétaire. Il peut s'agir d'un code ISO à trois lettres comme EUR, USD ou JPY ou d'un symbole comme €, $ ou ¥." + setting_costs_currency_format: "Format de devise" + setting_costs_currency_format_prefix: "Avant le nombre (par exemple 100 EUR)" + setting_costs_currency_format_suffix: "Après le nombre (par exemple 100 EUR)" setting_enforce_tracking_start_and_end_times: "Exiger les heures de début et de fin" setting_enforce_without_allow: "Il est nécessaire d'autoriser les heures de début et de fin pour pouvoir les exiger" setting_allow_tracking_start_and_end_times_caption: "Active la saisie des heures de début et de fin lors de la journalisation." @@ -235,8 +235,8 @@ fr: title: "Coûts réels par mois" blankslate: heading: "Commencez à suivre votre temps et vos coûts" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." - action: "Durée du journal" + description: "Obtenez une vue d'ensemble de vos coûts et du temps consignés pour suivre l'avancement de votre projet. Assurez-vous que les lots de travaux sont associés au bon budget." + action: "Enregistrer le temps" view_details: "Voir les détails des coûts réels" ee: features: diff --git a/modules/costs/config/locales/crowdin/js-fr.yml b/modules/costs/config/locales/crowdin/js-fr.yml index b9d385c460c..79740f6f9e0 100644 --- a/modules/costs/config/locales/crowdin/js-fr.yml +++ b/modules/costs/config/locales/crowdin/js-fr.yml @@ -30,6 +30,6 @@ fr: properties: overallCosts: "Coûts globaux" spentUnits: "Unités consommées" - button_log_costs: "Consigner coûts unitaires" + button_log_costs: "Consigner des coûts unitaires" label_hour: "heure" label_hours: "heures" diff --git a/modules/costs/config/locales/crowdin/ko.yml b/modules/costs/config/locales/crowdin/ko.yml index 82acbfa58e3..3d1a75f7ab3 100644 --- a/modules/costs/config/locales/crowdin/ko.yml +++ b/modules/costs/config/locales/crowdin/ko.yml @@ -201,10 +201,10 @@ ko: project_module_costs: "시간 및 비용" setting_allow_tracking_start_and_end_times: "시작 및 완료 시간 허용" setting_costs_currency: "통화" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "통화 단위입니다. EUR, USD, JPY 같은 문자 세 개의 ISO 코드 또는 €, $, ¥ 같은 기호일 수 있습니다." + setting_costs_currency_format: "통화 형식" + setting_costs_currency_format_prefix: "숫자 앞(예: EUR 100)" + setting_costs_currency_format_suffix: "숫자 뒤(예: 100 EUR)" setting_enforce_tracking_start_and_end_times: "시작 및 완료 시간 필요" setting_enforce_without_allow: "이 옵션을 허용하지 않으면 시작 및 완료 시간 요구가 가능하지 않습니다" setting_allow_tracking_start_and_end_times_caption: "시간을 기록할 때 시작 및 완료 시간 입력을 활성화합니다." @@ -228,12 +228,12 @@ ko: costs: widgets: actual_costs: - title: "Actual costs by month" + title: "월별 실제 비용" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." - action: "Log time" - view_details: "View actual costs details" + heading: "시간 및 비용 추적 시작" + description: "비용 및 기록된 시간에 대한 개요를 확인하여 프로젝트의 진행률을 모니터링합니다. 작업 패키지가 올바른 예산과 연결되어 있는지 확인해야 합니다." + action: "시간 기록" + view_details: "실제 비용 세부 정보 보기" ee: features: time_entry_time_restrictions: 정확한 시간 추적 요구 diff --git a/modules/costs/config/locales/crowdin/pt-BR.yml b/modules/costs/config/locales/crowdin/pt-BR.yml index 9254edfa5a2..85049ad6152 100644 --- a/modules/costs/config/locales/crowdin/pt-BR.yml +++ b/modules/costs/config/locales/crowdin/pt-BR.yml @@ -205,10 +205,10 @@ pt-BR: project_module_costs: "Tempo e custos" setting_allow_tracking_start_and_end_times: "Permitir horários de início e de término" setting_costs_currency: "Moeda" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "Esta é a moeda utilizada. Pode ser representada por um código ISO de três letras, como EUR, USD ou JPY, ou por um símbolo, como €, $ ou ¥." + setting_costs_currency_format: "Formato da moeda" + setting_costs_currency_format_prefix: "Antes do valor (por exemplo: EUR 100)" + setting_costs_currency_format_suffix: "Após o valor (por exemplo: 100 EUR)" setting_enforce_tracking_start_and_end_times: "Exigir horários de início e término" setting_enforce_without_allow: "Exigir os horários de início e término não é possível sem habilitá-los" setting_allow_tracking_start_and_end_times_caption: "Ativa a inserção de horários de início e término ao registrar o tempo." @@ -232,12 +232,12 @@ pt-BR: costs: widgets: actual_costs: - title: "Actual costs by month" + title: "Custos reais por mês" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." - action: "Log time" - view_details: "View actual costs details" + heading: "Comece a registrar seu tempo e seus custos" + description: "Obtenha uma visão geral dos seus custos e do tempo registrado para acompanhar o progresso do seu projeto. Certifique-se de que os pacotes de trabalho estejam associados ao orçamento correto." + action: "Registrar tempo" + view_details: "Ver detalhes dos custos reais" ee: features: time_entry_time_restrictions: Exigir controle exato de tempo diff --git a/modules/costs/config/locales/crowdin/zh-CN.yml b/modules/costs/config/locales/crowdin/zh-CN.yml index e0274e9a963..e7d36a35575 100644 --- a/modules/costs/config/locales/crowdin/zh-CN.yml +++ b/modules/costs/config/locales/crowdin/zh-CN.yml @@ -201,10 +201,10 @@ zh-CN: project_module_costs: "工时和成本" setting_allow_tracking_start_and_end_times: "允许开始和完成时间" setting_costs_currency: "货币" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "这是货币单位。可以是 EUR、USD 或 JPY 等三个字母的 ISO 代码,也可以是 €、$ 或 ¥ 等符号。" + setting_costs_currency_format: "货币格式" + setting_costs_currency_format_prefix: "在数字前(例如 EUR 100)" + setting_costs_currency_format_suffix: "在数字后(例如 100 EUR)" setting_enforce_tracking_start_and_end_times: "需要开始和完成时间" setting_enforce_without_allow: "如果不允许,则无法要求开始和结束时间" setting_allow_tracking_start_and_end_times_caption: "启用在记录时间时输入开始和结束时间。" @@ -228,12 +228,12 @@ zh-CN: costs: widgets: actual_costs: - title: "Actual costs by month" + title: "每月实际成本" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." - action: "Log time" - view_details: "View actual costs details" + heading: "开始跟踪时间和成本" + description: "概括了解成本和记录的时间,以便监控项目进度。确保工作包与正确的预算相关联。" + action: "记录时间" + view_details: "查看实际成本详情" ee: features: time_entry_time_restrictions: 需要准确的时间跟踪 diff --git a/modules/documents/config/locales/crowdin/ko.yml b/modules/documents/config/locales/crowdin/ko.yml index 7442a3181e8..6dd3bbe14c1 100644 --- a/modules/documents/config/locales/crowdin/ko.yml +++ b/modules/documents/config/locales/crowdin/ko.yml @@ -24,7 +24,7 @@ ko: name: "OpenProject 문서" description: "프로젝트에서 문서 생성을 허용하는 OpenProject 플러그인입니다." attributes: - collaborative_editing_hocuspocus_url: "Hocuspocus server URL" + collaborative_editing_hocuspocus_url: "Hocuspocus 서버 URL" activerecord: errors: models: @@ -121,8 +121,8 @@ ko: some_unwritable: 일부 값은 환경 변수를 통해 구성되며 여기에서 편집할 수 없습니다. hocuspocus_server_url: label: "Hocuspocus 서버 URL" - caption: "The WebSocket address of a working Hocuspocus server." - invalid_scheme: "Must use a WebSocket protocol (ws:// or wss://)." + caption: "작동 중인 Hocuspocus 서버의 WebSocket 주소입니다." + invalid_scheme: "WebSocket 프로토콜(ws:// 또는 wss://)을 사용해야 합니다." hocuspocus_server_secret: label: "클라이언트 비밀번호" caption: "Hocuspocus 서버에서 제공한 비밀번호를 붙여넣으세요." diff --git a/modules/documents/config/locales/crowdin/pt-BR.yml b/modules/documents/config/locales/crowdin/pt-BR.yml index abeb92255d8..f61e93f1347 100644 --- a/modules/documents/config/locales/crowdin/pt-BR.yml +++ b/modules/documents/config/locales/crowdin/pt-BR.yml @@ -24,7 +24,7 @@ pt-BR: name: "Documentos do OpenProject" description: "Um plugin OpenProject para permitir a criação de documentos em projetos." attributes: - collaborative_editing_hocuspocus_url: "Hocuspocus server URL" + collaborative_editing_hocuspocus_url: "URL do servidor Hocuspocus" activerecord: errors: models: @@ -123,8 +123,8 @@ pt-BR: some_unwritable: Alguns valores são configurados por meio de variáveis de ambiente e não podem ser editados aqui. hocuspocus_server_url: label: "URL do servidor Hocuspocus" - caption: "The WebSocket address of a working Hocuspocus server." - invalid_scheme: "Must use a WebSocket protocol (ws:// or wss://)." + caption: "O endereço WebSocket de um servidor Hocuspocus em funcionamento." + invalid_scheme: "Deve usar um protocolo WebSocket (ws:// ou wss://)." hocuspocus_server_secret: label: "Segredo do cliente" caption: "Cole o segredo fornecido pelo servidor Hocuspocus." diff --git a/modules/documents/config/locales/crowdin/zh-CN.yml b/modules/documents/config/locales/crowdin/zh-CN.yml index 32a9999c5fe..2cbb46ca361 100644 --- a/modules/documents/config/locales/crowdin/zh-CN.yml +++ b/modules/documents/config/locales/crowdin/zh-CN.yml @@ -24,7 +24,7 @@ zh-CN: name: "OpenProject 文档" description: "允许在项目中创建文档的 OpenProject 插件。" attributes: - collaborative_editing_hocuspocus_url: "Hocuspocus server URL" + collaborative_editing_hocuspocus_url: "Hocuspocus 服务器 URL" activerecord: errors: models: @@ -121,8 +121,8 @@ zh-CN: some_unwritable: 一些值通过环境变量配置,无法在此处编辑。 hocuspocus_server_url: label: "Hocuspocus 服务器 URL" - caption: "The WebSocket address of a working Hocuspocus server." - invalid_scheme: "Must use a WebSocket protocol (ws:// or wss://)." + caption: "有效 Hocuspocus 服务器的 WebSocket 地址。" + invalid_scheme: "必须使用 WebSocket 协议(ws:// 或 wss://)。" hocuspocus_server_secret: label: "客户端密钥" caption: "粘贴 Hocuspocus 服务器提供的密钥。" diff --git a/modules/grids/config/locales/crowdin/js-de.yml b/modules/grids/config/locales/crowdin/js-de.yml index 464207ac38d..35322bc76f1 100644 --- a/modules/grids/config/locales/crowdin/js-de.yml +++ b/modules/grids/config/locales/crowdin/js-de.yml @@ -51,7 +51,7 @@ de: title: 'Arbeitspaket-Tabelle' work_packages_graph: title: 'Arbeitspaket-Graph' - summary: "%{chartType} Tabelle mit Arbeitspaketen, die %{description} sind." + summary: "%{chartType} Diagramm zeigt Arbeitspakete. Zusammenfassung: %{description}." work_packages_calendar: title: 'Kalender' work_packages_overview: diff --git a/modules/grids/config/locales/crowdin/js-zh-CN.yml b/modules/grids/config/locales/crowdin/js-zh-CN.yml index 8eb6c2e836e..d47790eeea7 100644 --- a/modules/grids/config/locales/crowdin/js-zh-CN.yml +++ b/modules/grids/config/locales/crowdin/js-zh-CN.yml @@ -2,12 +2,12 @@ zh-CN: js: grid: add_widget: '添加微件' - widget_menu_label: 'Show menu options for %{widgetName} widget' + widget_menu_label: '显示 %{widgetName} 微件的菜单选项' remove: '移除微件' configure: '配置微件' widgets: missing_permission: "您没有查看此微件所需的权限。" - not_available: "This widget is currently unavailable." + not_available: "此微件目前不可用。" custom_text: title: '自定义文本' documents: diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index 4eb86c80af8..cda7c7c33af 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -126,7 +126,7 @@ fr: label_meeting_template_edit: "Éditer le modèle" label_meeting_create_from_template: "Créer une réunion à partir d'un modèle" label_meeting_new: "Nouvelle réunion" - caption_meeting_template_select: "Sélectionnez un modèle et copier automatiquement ses éléments de l'ordre du jour" + caption_meeting_template_select: "Sélectionnez un modèle pour copier automatiquement ses points de l'ordre du jour" label_meeting_new_dynamic: "Nouvelle réunion ponctuelle" label_meeting_new_recurring: "Nouvelle réunion récurrente" label_meeting_create: "Créer une réunion" @@ -246,9 +246,9 @@ fr: header: "Annulée : Réunion « %{title} »" header_occurrence: "Annulée : occurrence de la réunion « %{title} »" header_series: "Annulée : série de réunions « %{title} »" - summary_occurrence: "Une occurrence de '%{title}' a été annulée par %{actor}, ou vous avez été supprimé en tant que participant" - summary_series: "La série de réunions '%{title}' a été annulée par %{actor}, ou vous avez été retiré en tant que participant" - summary: "'%{title}' a été annulé par %{actor}, ou vous avez été supprimé en tant que participant" + summary_occurrence: "Une occurrence de « %{title} » a été annulée par %{actor}, ou vous avez été supprimé(e) en tant que participant(e)" + summary_series: "La série de réunions « %{title} » a été annulée par %{actor}, ou vous avez été supprimé(e) en tant que participant(e)" + summary: "« %{title} » a été annulé par %{actor}, ou vous avez été supprimé(e) en tant que participant(e)" date_time: "Date/heure prévue" participant_added: header: "Réunion « %{title} » - Participant ajouté" @@ -262,7 +262,7 @@ fr: summary_series: "%{actor} a supprimé %{participant} de la série de réunions « %{title} »" ended: header_series: "Terminé : Série de rencontres '%{title}'" - summary_series: "La série de réunions '%{title}' a été clôturée par %{actor}" + summary_series: "La série de réunions « %{title} » a été clôturée par %{actor}" updated: header: "La réunion « %{title} » a été mise à jour" summary: "La réunion « %{title} » a été mise à jour par %{actor}" @@ -289,7 +289,7 @@ fr: Cette action est irréversible. Veuillez procéder avec prudence. template: title: "Supprimer le modèle" - heading: "Supprimer ce modèle\_?" + heading: "Supprimer ce modèle ?" occurrence: title: "Annuler l'occurrence de la réunion" heading: "Annuler cette occurrence de réunion ?" @@ -504,7 +504,7 @@ fr: text_duration_in_hours: "Durée en heures" text_in_hours: "en heures" text_meeting_agenda_for_meeting: 'ordre du jour de la réunion «%{meeting} »' - text_meeting_template_blank_slate_heading: "Il n'y a pas de modèles à afficher" + text_meeting_template_blank_slate_heading: "Il n'y a aucun modèle à afficher" text_meeting_template_blank_slate: "Vous pouvez créer un nouveau modèle pour des réunions ponctuelles" text_meeting_series_end_early_heading: "Supprimer les futures occurrences ?" text_meeting_series_end_early: "La fin de la série supprimera les futures occurrences de réunions ouvertes ou planifiées" @@ -613,7 +613,7 @@ fr: text_meeting_draft_banner: "Vous êtes actuellement en mode brouillon. Cette réunion n'enverra pas de mises à jour de calendrier ni d'invitations, même si vous modifiez les détails de la réunion ou si vous ajoutez/supprimez des participants." text_onetime_meeting_template_banner: "Vous êtes en train de modifier un modèle de réunion. Vous pouvez utiliser ce modèle pour créer des réunions ponctuelles avec un ordre du jour prédéfini. Les modifications n'affecteront pas les réunions déjà créées." text_onetime_meeting_template_empty_heading: "Ce modèle de réunion est vide" - text_onetime_meeting_template_description: "Ajouter des éléments à l'ordre du jour et des pièces jointes à ce modèle. Ils seront inclus dans chaque réunion basée sur ce modèle." + text_onetime_meeting_template_description: "Ajoutez des éléments à l'ordre du jour et des pièces jointes à ce modèle. Ils seront inclus dans chaque réunion basée sur ce modèle." text_exit_draft_mode_dialog_title: "Ouvrez cette réunion et envoyez des invitations ?" text_exit_draft_mode_dialog_subtitle: "Vous ne pouvez pas revenir au mode brouillon une fois que vous avez planifié une réunion." text_exit_draft_mode_dialog_template_title: "Ouvrez la première occurrence de cette série de réunions ?" diff --git a/modules/meeting/config/locales/crowdin/ko.yml b/modules/meeting/config/locales/crowdin/ko.yml index ae42f59194e..4e574e8ad72 100644 --- a/modules/meeting/config/locales/crowdin/ko.yml +++ b/modules/meeting/config/locales/crowdin/ko.yml @@ -67,10 +67,10 @@ ko: errors: models: meeting_participant: - user_invalid: "is not a valid participant." + user_invalid: "- 유효한 참가자가 아닙니다." meeting_agenda_item: - section_not_belong_to_meeting: "Section does not belong to the same meeting." - user_invalid: "is not a valid participant." + section_not_belong_to_meeting: "섹션이 같은 미팅에 속하지 않습니다." + user_invalid: "- 유효한 참가자가 아닙니다." recurring_meeting_interim_response: not_an_occurrence: "is not a valid occurrence time for this recurring meeting" recurring_meeting: @@ -116,15 +116,15 @@ ko: error_notification_with_errors: "알림을 보내지 못했습니다. 다음 수신자에게 알리지 못했습니다. %{recipients}" label_meeting: "미팅" label_meeting_plural: "미팅" - label_meeting_templates: "Templates" - label_meeting_template: "Template" - label_meeting_template_new: "New template" - label_meeting_template_create: "Create template" - label_meeting_template_delete: "Delete template" - label_meeting_template_edit: "Edit template" - label_meeting_create_from_template: "Create meeting from template" + label_meeting_templates: "템플릿" + label_meeting_template: "템플릿" + label_meeting_template_new: "새 템플릿" + label_meeting_template_create: "템플릿 만들기" + label_meeting_template_delete: "템플릿 삭제" + label_meeting_template_edit: "템플릿 편집" + label_meeting_create_from_template: "템플릿에서 미팅 만들기" label_meeting_new: "새 미팅" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_meeting_template_select: "템플릿을 선택하면 의제 항목이 자동으로 복사됩니다." label_meeting_new_dynamic: "새로운 일회성 미팅" label_meeting_new_recurring: "새로운 반복 미팅" label_meeting_create: "미팅 생성" @@ -283,8 +283,8 @@ ko: confirmation_message_html: > 이 작업은 되돌릴 수 없습니다. 주의하여 진행하세요. template: - title: "Delete template" - heading: "Delete this template?" + title: "템플릿 삭제" + heading: "이 템플릿을 삭제하시겠습니까?" occurrence: title: "미팅 항목 취소" heading: "이 미팅 항목을 취소하시겠습니까?" @@ -420,7 +420,7 @@ ko: button_finalize: "첫 번째 미팅 열기" blank_title: "미팅 시리즈 템플릿이 비어 있습니다." description: > - 이 템플릿은 시리즈의 새로운 미팅이 생성될 때마다 사용됩니다. 이 템플릿에 안건 항목, 참가자 및 첨부 파일을 추가할 수 있습니다. + 이 템플릿은 시리즈의 새로운 미팅이 생성될 때마다 사용됩니다. 이 템플릿에 의제 항목, 참가자 및 첨부 파일을 추가할 수 있습니다. label_view_template: "템플릿 보기" label_edit_template: "템플릿 편집" banner_html: > @@ -482,7 +482,7 @@ ko: end_series_dialog: title: "미팅 시리즈 종료" notice_successful_notification: "모든 참가자에게 보내는 이메일 캘린더 업데이트" - notice_meeting_template_created: "Template successfully created" + notice_meeting_template_created: "템플릿이 생성되었습니다" notice_timezone_missing: 표준 시간대가 설정되지 않았으며 %{zone}(으)로 간주됩니다. 해당 표준 시간대를 선택하려면 여기를 클릭하세요. notice_meeting_updated: "이 페이지는 다른 사람이 업데이트했습니다. 변경 사항을 보려면 다시 로드하세요." permission_create_meetings: "미팅 생성" @@ -497,8 +497,8 @@ ko: text_duration_in_hours: "기간(시간)" text_in_hours: " 시간" text_meeting_agenda_for_meeting: '미팅 "%{meeting}"에 대한 의제' - text_meeting_template_blank_slate_heading: "There are no templates to display" - text_meeting_template_blank_slate: "You can create a new template for one-time meetings" + text_meeting_template_blank_slate_heading: "표시할 템플릿이 없습니다" + text_meeting_template_blank_slate: "일회성 미팅을 위한 새 템플릿을 만들 수 있습니다" text_meeting_series_end_early_heading: "향후 항목을 삭제하시겠습니까?" text_meeting_series_end_early: "이 시리즈를 종료하면 향후 오픈 또는 예정된 미팅 항목이 모두 삭제됩니다" text_meeting_closing_are_you_sure: "미팅 어젠더를 닫으시겠습니까?" @@ -604,9 +604,9 @@ ko: 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." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_banner: "현재 미팅 템플릿을 편집하는 중입니다. 이 템플릿을 사용하여 사전 정의된 의제가 있는 일회성 미팅을 만들 수 있습니다. 변경 사항은 이미 생성된 미팅에 영향을 미치지 않습니다." + text_onetime_meeting_template_empty_heading: "이 미팅 템플릿은 비어 있습니다" + text_onetime_meeting_template_description: "이 템플릿에 의제 항목과 첨부 파일을 추가하세요. 이 템플릿에 기반한 모든 미팅에 해당 의제 항목과 첨부 파일이 포함됩니다." text_exit_draft_mode_dialog_title: "이 미팅을 열고 초대장을 보내시겠습니까?" text_exit_draft_mode_dialog_subtitle: "미팅을 예약한 후에는 초안 모드로 돌아갈 수 없습니다." text_exit_draft_mode_dialog_template_title: "이 미팅 시리즈의 첫 번째 항목을 열어보시겠습니까?" diff --git a/modules/meeting/config/locales/crowdin/pt-BR.yml b/modules/meeting/config/locales/crowdin/pt-BR.yml index d7d1686aa31..f385ab6aa82 100644 --- a/modules/meeting/config/locales/crowdin/pt-BR.yml +++ b/modules/meeting/config/locales/crowdin/pt-BR.yml @@ -68,10 +68,10 @@ pt-BR: errors: models: meeting_participant: - user_invalid: "is not a valid participant." + user_invalid: "não é um participante válido." meeting_agenda_item: - section_not_belong_to_meeting: "Section does not belong to the same meeting." - user_invalid: "is not a valid participant." + section_not_belong_to_meeting: "A seção não pertence à mesma reunião." + user_invalid: "não é um participante válido." recurring_meeting_interim_response: not_an_occurrence: "is not a valid occurrence time for this recurring meeting" recurring_meeting: @@ -118,15 +118,15 @@ pt-BR: error_notification_with_errors: "Falha ao enviar notificação. Os seguintes destinatários não puderam ser notificados: %{recipients}" label_meeting: "Reunião" label_meeting_plural: "Reuniões" - label_meeting_templates: "Templates" - label_meeting_template: "Template" - label_meeting_template_new: "New template" - label_meeting_template_create: "Create template" - label_meeting_template_delete: "Delete template" - label_meeting_template_edit: "Edit template" - label_meeting_create_from_template: "Create meeting from template" + label_meeting_templates: "Modelos" + label_meeting_template: "Modelo" + label_meeting_template_new: "Novo modelo" + label_meeting_template_create: "Criar modelo" + label_meeting_template_delete: "Excluir modelo" + label_meeting_template_edit: "Editar modelo" + label_meeting_create_from_template: "Criar reunião a partir de um modelo" label_meeting_new: "Nova Reunião" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_meeting_template_select: "Selecione um modelo para copiar automaticamente os itens da agenda" label_meeting_new_dynamic: "Nova reunião única" label_meeting_new_recurring: "Nova reunião recorrente" label_meeting_create: "Criar reunião" @@ -288,8 +288,8 @@ pt-BR: confirmation_message_html: > Essa ação não pode ser desfeita. Prossiga com cautela. template: - title: "Delete template" - heading: "Delete this template?" + title: "Excluir modelo" + heading: "Excluir este modelo?" occurrence: title: "Cancelar ocorrência da reunião" heading: "Cancelar esta ocorrência da reunião?" @@ -489,7 +489,7 @@ pt-BR: end_series_dialog: title: "Encerrar série de reuniões" notice_successful_notification: "Atualização do calendário enviada por e-mail para todos os participantes" - notice_meeting_template_created: "Template successfully created" + notice_meeting_template_created: "Modelo criado com sucesso" notice_timezone_missing: Nenhum fuso horário está definido, portanto assumiu-se %{zone}. Para escolher o seu fuso horário, clique aqui. notice_meeting_updated: "Esta página foi atualizada por outra pessoa. Recarregue para visualizar as alterações." permission_create_meetings: "Criar reuniões" @@ -504,8 +504,8 @@ pt-BR: text_duration_in_hours: "Duração em horas" text_in_hours: "em horas" text_meeting_agenda_for_meeting: 'agenda para a reunião "%{meeting}"' - text_meeting_template_blank_slate_heading: "There are no templates to display" - text_meeting_template_blank_slate: "You can create a new template for one-time meetings" + text_meeting_template_blank_slate_heading: "Não há modelos para exibir" + text_meeting_template_blank_slate: "Você pode criar um novo modelo para reuniões únicas" text_meeting_series_end_early_heading: "Excluir ocorrências futuras?" text_meeting_series_end_early: "Encerrar a série excluirá qualquer reunião futura, aberta ou agendada" text_meeting_closing_are_you_sure: "Você tem certeza de que deseja encerar a pauta da reunião?" @@ -611,8 +611,8 @@ pt-BR: text_meeting_in_progress_dropdown_description: "Registre os resultados como solicitações de informação ou decisões tomadas durante a reunião." text_meeting_closed_dropdown_description: "Esta reunião está encerrada. Já não é possível modificar os pontos da ordem de trabalhos ou os resultados." text_meeting_draft_banner: "Você está no modo rascunho. Esta reunião não enviará nenhuma atualização de calendário ou convite, mesmo que você altere os detalhes da reunião ou adicione/remoca participantes." - 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." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_banner: "Você está editando um modelo de reunião. Use este modelo para criar reuniões únicas com uma agenda predefinida. As alterações não afetarão reuniões já criadas." + text_onetime_meeting_template_empty_heading: "Este modelo de reunião está vazio" text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." text_exit_draft_mode_dialog_title: "Abrir esta reunião e enviar convites?" text_exit_draft_mode_dialog_subtitle: "Você não pode retornar ao modo rascunho após você agendar a reunião." diff --git a/modules/meeting/config/locales/crowdin/zh-CN.yml b/modules/meeting/config/locales/crowdin/zh-CN.yml index e550bc23d32..b09fd6a1519 100644 --- a/modules/meeting/config/locales/crowdin/zh-CN.yml +++ b/modules/meeting/config/locales/crowdin/zh-CN.yml @@ -59,7 +59,7 @@ zh-CN: end_date: "结束日期" iterations: "事件" recurring_meeting_interim_response: - start_time: "Start time" + start_time: "开始时间" meeting_participant: invited: "已邀请" attended: "已参加" @@ -67,12 +67,12 @@ zh-CN: errors: models: meeting_participant: - user_invalid: "is not a valid participant." + user_invalid: "不是有效的参与者。" meeting_agenda_item: - section_not_belong_to_meeting: "Section does not belong to the same meeting." - user_invalid: "is not a valid participant." + section_not_belong_to_meeting: "该部分不属于同一次会议。" + user_invalid: "不是有效的参与者。" recurring_meeting_interim_response: - not_an_occurrence: "is not a valid occurrence time for this recurring meeting" + not_an_occurrence: "不是此定期会议的有效发生时间" recurring_meeting: must_cover_existing_meetings: one: "该系列会议中有一次公开会议未列入新时间表。请调整时间表,将会议包含在内。" @@ -116,15 +116,15 @@ zh-CN: error_notification_with_errors: "发送通知失败。无法通知下列收件人:%{recipients}" label_meeting: "会议" label_meeting_plural: "会议" - label_meeting_templates: "Templates" - label_meeting_template: "Template" - label_meeting_template_new: "New template" - label_meeting_template_create: "Create template" - label_meeting_template_delete: "Delete template" - label_meeting_template_edit: "Edit template" - label_meeting_create_from_template: "Create meeting from template" + label_meeting_templates: "模板" + label_meeting_template: "模板" + label_meeting_template_new: "新模板" + label_meeting_template_create: "创建模板" + label_meeting_template_delete: "删除模板" + label_meeting_template_edit: "编辑模板" + label_meeting_create_from_template: "根据模板创建会议" label_meeting_new: "新增会议" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_meeting_template_select: "选择一个模板,以自动复制其议程条目" label_meeting_new_dynamic: "新的动态会议" label_meeting_new_recurring: "新的定期会议" label_meeting_create: "创建会议" @@ -241,9 +241,9 @@ zh-CN: header: "已取消:会议 '%{title}'" header_occurrence: "已取消:会议事件 '%{title}'" header_series: "已取消:会议系列 '%{title}'" - 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" + summary_occurrence: "'%{title}' 的事件已被 %{actor} 取消,或者您的参与者身份已被移除" + summary_series: "会议系列 '%{title}' 已被 %{actor} 取消,或者您的参与者身份已被移除" + summary: "'%{title}' 已被 %{actor} 取消,或者您的参与者身份已被移除" date_time: "预定日期/时间" participant_added: header: "会议 '%{title}' - 已添加参加者" @@ -257,7 +257,7 @@ zh-CN: summary_series: "%{actor} 将 %{participant} 从会议系列 '%{title}' 中移除" ended: header_series: "结束:会议系列 '%{title}'" - summary_series: "Meeting series '%{title}' has been ended by %{actor}" + summary_series: "会议系列 '%{title}' 已由 %{actor} 结束" updated: header: "会议 '%{title}' 已更新" summary: "会议 '%{title}' 已由 %{actor} 更新" @@ -283,8 +283,8 @@ zh-CN: confirmation_message_html: > 此操作不可逆。请谨慎处理。 template: - title: "Delete template" - heading: "Delete this template?" + title: "删除模板" + heading: "是否删除此模板?" occurrence: title: "取消会议事件" heading: "取消此会议事件?" @@ -482,7 +482,7 @@ zh-CN: end_series_dialog: title: "结束会议系列" notice_successful_notification: "已向所有与会者发送电子邮件日历更新" - notice_meeting_template_created: "Template successfully created" + notice_meeting_template_created: "模板创建成功" notice_timezone_missing: 没有设定时区,预设时区为 %{zone}。要选择您的时区,请单击此处。 notice_meeting_updated: "此页面已被其他人更新。重新加载以查看更改。" permission_create_meetings: "创建会议" @@ -497,8 +497,8 @@ zh-CN: text_duration_in_hours: "持续时间(单位:小时)" text_in_hours: "小时" text_meeting_agenda_for_meeting: '“%{meeting}”会议议程' - text_meeting_template_blank_slate_heading: "There are no templates to display" - text_meeting_template_blank_slate: "You can create a new template for one-time meetings" + text_meeting_template_blank_slate_heading: "没有可显示的模板" + text_meeting_template_blank_slate: "可以为一次性会议创建新模板" text_meeting_series_end_early_heading: "删除未来发生的事件?" text_meeting_series_end_early: "结束系列将删除任何将来的公开会议或预定会议的事件" text_meeting_closing_are_you_sure: "确定要关闭该会议议程吗?" @@ -544,8 +544,8 @@ zh-CN: label_agenda_item_move_up: "向上移动" label_agenda_item_move_down: "向下移动" label_agenda_item_duplicate: "复制" - label_agenda_item_duplicate_in_next: "Duplicate in next meeting" - label_agenda_item_duplicate_in_next_title: "Duplicate in next meeting?" + label_agenda_item_duplicate_in_next: "在下次会议中重复" + label_agenda_item_duplicate_in_next_title: "是否在下次会议中重复?" label_agenda_item_add_notes: "添加备注" label_agenda_item_add_outcome: "添加成果" label_agenda_item_work_package_add: "添加工作包" @@ -604,9 +604,9 @@ zh-CN: 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." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_banner: "您当前正在编辑会议模板。您可以使用此模板创建具有预定义议程的一次性会议。更改不会影响已创建的会议。" + text_onetime_meeting_template_empty_heading: "此会议模板为空" + text_onetime_meeting_template_description: "请将议程条目和附件添加到此模板。所有基于此模板的会议都将包含这些内容。" text_exit_draft_mode_dialog_title: "是否打开此会议并发送邀请?" text_exit_draft_mode_dialog_subtitle: "会议安排完成后,您将无法返回到草稿模式。" text_exit_draft_mode_dialog_template_title: "是否打开此会议系列的第一个会议?" From 4db7ad8d6dedb69d8d372b5a9ab668dab7edeef4 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Sun, 8 Mar 2026 03:48:59 +0000 Subject: [PATCH 178/334] update locales from crowdin [ci skip] --- config/locales/crowdin/it.yml | 406 +++++++++--------- config/locales/crowdin/ko.yml | 284 ++++++------ config/locales/crowdin/pt-BR.yml | 294 ++++++------- config/locales/crowdin/zh-CN.yml | 60 +-- .../backlogs/config/locales/crowdin/it.yml | 82 ++-- .../backlogs/config/locales/crowdin/js-it.yml | 4 +- .../backlogs/config/locales/crowdin/js-ko.yml | 4 +- .../config/locales/crowdin/js-pt-BR.yml | 4 +- .../backlogs/config/locales/crowdin/ko.yml | 2 +- .../backlogs/config/locales/crowdin/pt-BR.yml | 2 +- .../backlogs/config/locales/crowdin/zh-CN.yml | 4 +- modules/budgets/config/locales/crowdin/it.yml | 36 +- modules/budgets/config/locales/crowdin/ko.yml | 2 +- .../budgets/config/locales/crowdin/pt-BR.yml | 12 +- .../budgets/config/locales/crowdin/zh-CN.yml | 8 +- modules/costs/config/locales/crowdin/it.yml | 18 +- .../costs/config/locales/crowdin/zh-CN.yml | 4 +- .../documents/config/locales/crowdin/it.yml | 6 +- .../grids/config/locales/crowdin/js-it.yml | 4 +- .../grids/config/locales/crowdin/js-ko.yml | 4 +- .../grids/config/locales/crowdin/js-pt-BR.yml | 4 +- modules/meeting/config/locales/crowdin/it.yml | 54 +-- modules/meeting/config/locales/crowdin/ko.yml | 2 +- .../meeting/config/locales/crowdin/pt-BR.yml | 38 +- .../meeting/config/locales/crowdin/zh-CN.yml | 8 +- 25 files changed, 673 insertions(+), 673 deletions(-) diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index 6d38bf4d6ee..da4711e9f88 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -83,9 +83,9 @@ it: confirmation: "Vuoi davvero eliminare questo token di assistenza dell'Enterprise Edition?" create_dialog: title: "Aggiungi token Enterprise" - type_token_text: "Your Enterprise token text" + type_token_text: "Testo del token Enterprise" token_placeholder: "Incolla il tuo token di assistenza per Enterprise edition qui" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "Per saperne di più su come attivare l'edizione Enterprise, consulta la nostra [documentazione](docs_url)." add_token: "Carica un token di assistenza per Enterprise edition" replace_token: "Sostituisci il token di assistenza attuale" order: "Ordina l'edizione Enterprise on-premises" @@ -111,183 +111,183 @@ it: text: "Le singole azioni di un utente (es. l'aggiornamento di una macro-attività due volte) vengono aggregate in un'unica azione se il tempo intercorso tra esse è inferiore al periodo minimo di tempo impostato. Verranno visualizzate quindi come un'unica azione all'interno dell'applicazione. Questo ritarderà anche le notifiche della stessa quantità di tempo, riducendo così il numero di email inviate, e influirà anche sul ritardo di %{webhook_link}." link: "webhook" import: - title: "Import" + title: "Importa" jira: - title: "Jira Import" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + title: "Importazione di Jira" + description: "Utilizza questo strumento per importare dati dalla tua istanza Jira. Puoi configurare più host Jira e scegliere cosa importare a ogni importazione." errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "Impossibile eliminare l'host Jira con importazioni esistenti" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + title: "Nessun host Jira ancora configurato" + description: "Configura un host Jira per iniziare a importare elementi da Jira a questa istanza di OpenProject." configuration: - title: "Jira configuration" - new: "New configuration" + title: "Configurazione Jira" + new: "Nuova configurazione" banner: - title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + title: "Importazione limitata" + description: "Questo strumento di importazione è attualmente in versione beta e può importare solo dati di base: progetti, issue (nome, titolo, descrizione, allegati), utenti (nome, email, appartenenza al progetto), stati e tipi. Non può importare flussi di lavoro, campi personalizzati, relazioni tra issue o autorizzazioni. Al momento supportiamo solo le versioni 10.x e 11.x di Jira Server/Data Center. Le istanze cloud non sono supportate al momento." form: fields: - name: "Name" - url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + name: "Nome" + url: "URL del server/data center Jira" + personal_access_token: "Token di acceso personale" + button_add: "Aggiungi configurazione" + button_save: "Salva configurazione" + button_test: "Configurazione di test" + button_delete_token: "Elimina token" + delete_token_confirm: "Vuoi davvero eliminare il token? Questo disabiliterà la connessione Jira." + label_testing: "Configurazione di test..." + token_deleted: "Il token è stato eliminato con successo." test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + success: "Connessione riuscita a %{server} (versione %{version})" + failed: "Connessione non riuscita: impossibile recuperare le informazioni sul server" + error: "Si è verificato un errore imprevisto durante il test della connessione" + connection_error: "Errore di connessione: %{message}" + parse_error: "Impossibile analizzare la risposta dal server. Il server potrebbe non essere un'istanza Jira valida." + api_error: "L'API Jira ha restituito lo stato di errore %{status}. Controlla l'URL dell'istanza Jira e il token API." + token_error: "Token API non valido. Controlla le tue credenziali nella configurazione." + missing_credentials: "Fornisci sia l'URL che il token di accesso personale per testare la connessione" + invalid_url: "Fornisci un URL valido" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "Impossibile connettersi al server Jira: %{message}" + connection_timeout: "La connessione al server Jira è scaduta: %{message}" + parse_error: "Impossibile analizzare la risposta dell'API Jira: %{message}" + api_error: "Jira API ha restituito lo stato di errore %{status}" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" - label_ago: "%{amount} ago" + projects: "Progetti" + last_change: "Ultima modifica" + added: "Aggiunta" + label_ago: "%{amount} fa" run: - title: "Import run" - history: "History" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + title: "Importa esecuzione" + history: "Cronologia" + remove_error: "Un'importazione di Jira non può essere rimossa mentre è in esecuzione" + import_blocked_error: "Un'altra importazione Jira è attualmente in corso o in attesa di revisione. Completala o annullala prima di iniziare una nuova importazione." blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "Nessuna importazione ancora impostata" + description: "Crea un'esecuzione di importazione per iniziare a importare informazioni da questa istanza di Jira" 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" + description: "È possibile importare diversi set di dati a ogni importazione. È possibile annullare un'importazione subito dopo in modalità di revisione, ma non dopo la finalizzazione." + button_import_run: "Importa esecuzione" + button_edit_configuration: "Modifica configurazione" status: - initial: "Start" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" - configuring: "Select scope" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" - imported: "Review mode" - reverting: "Reverting" - revert_error: "Error during revert" - reverted: "Reverted" - completed: "Completed" + initial: "Inizio" + instance_meta_fetching: "Recupero dei metadati" + instance_meta_error: "Errore nel recupero dei metadati" + instance_meta_done: "Metadati recuperati" + configuring: "Seleziona l'ambito" + projects_meta_fetching: "Recupero dei dati di progetto" + projects_meta_error: "Errore nel recupero dei dati di progetto" + projects_meta_done: "Dati raccolti" + importing: "In corso" + import_error: "Errore nell'importazione" + imported: "Modalità di revisione" + reverting: "Ripristino" + revert_error: "Errore durante il ripristino" + reverted: "Ripristinato" + completed: "Completato" wizard: - button_retry: "Retry" + button_retry: "Riprova" parts: projects: - one: "1 project" - other: "%{count} projects" + one: "1 progetto" + other: "%{count} progetti" issues: - one: "1 issue" - other: "%{count} issues" + one: "1 problema" + other: "%{count} problemi" work_packages: - one: "1 work package" - other: "%{count} work packages" + one: "1 macro-attività" + other: "%{count} macro-attività" types: - one: "1 type" - other: "%{count} types" + one: "1 tipo" + other: "%{count} tipi" statuses: - one: "1 status" - other: "%{count} statuses" + one: "1 stato" + other: "%{count} stati" users: - one: "1 user" - other: "%{count} users" + one: "1 utente" + other: "%{count} utenti" groups: fetch: - title: "Get base data" + title: "Ottieni dati di base" groups_and_users: - title: "Groups and Users" + title: "Gruppi e Utenti" configuration: - title: "Configure import" + title: "Configura importazione" confirming: - title: "Confirm and import" + title: "Conferma e importa" review: - title: "Review import" + title: "Revisione importazione" sections: fetch_data: - title: "Fetch instance meta data" - caption_done: "Completed" - description: "Check what data is available for import in the host Jira instance." - button_fetch: "Check available data" - label_progress: "Fetching data from Jira..." + title: "Recupero dei metadati dell'istanza" + caption_done: "Completato" + description: "Controlla quali dati sono disponibili per l'importazione nell'istanza Jira host." + button_fetch: "Controlla i dati disponibili" + label_progress: "Recupero dei dati da Jira..." groups_and_users: - title: "Groups and Users" + title: "Gruppi e Utenti" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" - 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 URL 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_available_data: "Available data" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" - button_continue: "Continue" - 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..." + title: "Importa ambito" + caption: "Scegli cosa vuoi importare in OpenProject" + caption_done: "Completato" + label_info: "Tieni presente che questo strumento di importazione è in versione beta e non può importare tutti i tipi di dati. Ecco un riepilogo di ciò che l'URL dell'istanza Jira host offre per l'importazione e di ciò che questo strumento è in grado di importare al momento." + description: "Seleziona i dati che desideri importare tra quelli disponibili recuperati dall'istanza host di Jira." + label_available_data: "Dati disponibili" + label_not_available_data: "Non disponibile per l'importazione" + button_select_projects: "Seleziona i progetti da importare" + button_continue: "Continua" + label_import: "Seleziona quali progetti vuoi importare." + button_select: "Seleziona i progetti" + label_selected_data: "Dati selezionati per l'importazione" + label_progress: "Recupero dei dati da Jira..." elements: - relations: "Relations between issues" - workflows: "Project-level workflows" - users: "Users" - sprints: "Sprints" - schemes: "Schemas" - permissions: "User, group and project permissions" + relations: "Relazioni tra i problemi" + workflows: "Flussi di lavoro a livello di progetto" + users: "Utenti" + sprints: "Sprint" + schemes: "Schemi" + permissions: "Autorizzazioni per utenti, gruppi e progetti" confirm_import: - title: "Import data" - caption: "Review your import settings and start the import" - caption_done: "Completed" - label_available_data: "Available data to import" - 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" + title: "Importa dati" + caption: "Controlla le impostazioni dell'importazione e avviala" + caption_done: "Completato" + label_available_data: "Dati disponibili da importare" + button_start: "Avvia l'importazione" + description: "Stai per avviare un'importazione con le seguenti impostazioni." + label_progress: "Importazione in corso..." + label_import_data: "Importazione in corso" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." - label_results: "Imported" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: 'The imported data is currently in review mode. Click "Finalize import" to make the import permanent or "Revert import" to undo all changes made in this import run.' - label_finalizing_progress: "Finalizing import..." - label_finalized: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + title: "Importa i risultati dell'esecuzione" + caption: "Rivedi l'esecuzione dell'importazione o annulla l'importazione" + info: "Importazione eseguita con successo." + label_results: "Importato" + label_revert: "Annulla l'importazione" + button_revert: "Annulla l'importazione" + button_done: "Finalizza l'importazione" + preview_description: 'I dati importati sono attualmente in modalità di revisione. Fare clic su "Finalizza l''importazione" per rendere l''importazione permanente o su "Annulla l''importazione" per annullare tutte le modifiche apportate in questa importazione.' + label_finalizing_progress: "Completamento dell'importazione..." + label_finalized: "Importazione finalizzata." + label_revert_progress: "Annullamento dell'importazione in corso..." + label_reverted: "Importazione annullata." select_dialog: - filter_projects: "Filter by text" + filter_projects: "Filtro testo" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." - confirm: "I understand that this reversion will delete data permanently" + title: "Annullare definitivamente questa importazione?" + description: "Questa operazione eliminerà tutti gli oggetti importati (inclusi interi progetti), anche se è stata rilevata attività utente in tali progetti dopo l'importazione su OpenProject." + confirm: "Comprendo che questa operazione eliminerà i dati in modo permanente" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + title: "Finalizzare questa importazione?" + description: "Una volta finalizzata, questa importazione non potrà più essere annullata. Tutti i dati importati verranno importati in modo permanente." + confirm: "Comprendo che questa azione non può essere annullata" + confirm_button: "Ho capito" select_projects: - title: "Select projects" + title: "Seleziona i progetti" 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." + description: "Il protocollo di contesto del modello consente agli agenti di intelligenza artificiale di fornire ai propri utenti strumenti e risorse esposti da questa istanza di OpenProject. Questa funzionalità è ancora in versione beta." resources_heading: "Risorse" - resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_description: "OpenProject implementa le seguenti risorse. Ognuna di esse può essere abilitata, rinominata e descritta a piacere. Per ulteriori informazioni, consultare la [documentazione sulle risorse MCP](docs_url)." resources_submit: "Aggiorna risorse" tools_heading: "Strumenti" tools_description: "OpenProject implementa i seguenti strumenti. Ognuno di essi può essere abilitato, rinominato e descritto a piacere. Per ulteriori informazioni, consultare la [documentazione sugli strumenti MCP](docs_url)." @@ -296,17 +296,17 @@ it: success: "Configurazioni MCP aggiornate con successo." server_form: description_caption: "Come verrà descritto il server MCP alle altre applicazioni che vi si collegheranno." - title_caption: "A short title shown to applications that connect to the MCP server." - tool_response_format: "Tool response format" - tool_response_format_content_only_label: "Content only" + title_caption: "Un breve titolo mostrato alle applicazioni che si connettono al server MCP." + tool_response_format: "Formato di risposta dello strumento" + tool_response_format_content_only_label: "Solo contenuto" tool_response_format_content_only_caption: > - Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. - tool_response_format_full_label: "Full" + Seleziona questa opzione se i client MCP che si connettono a questa istanza non supportano contenuti strutturati. Le risposte dello strumento conterranno solo testo normale e ometteranno la versione strutturata. + tool_response_format_full_label: "Completa" tool_response_format_full_caption: > - The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance. - tool_response_format_structured_only_label: "Structured content only" + L'opzione più compatibile. Le risposte dello strumento includeranno sia contenuti regolari che strutturati, consentendo ai clienti MCP di scegliere il formato che desiderano leggere. Ciò potrebbe aumentare il numero di token che il modello linguistico deve elaborare, con un potenziale aumento dei costi e una riduzione delle prestazioni. + tool_response_format_structured_only_label: "Solo contenuti strutturati" tool_response_format_structured_only_caption: > - Choose this if you are certain that MCP clients connecting to this instance support structured content. Tool responses will only include structured content and leave out its text representation. + Seleziona questa opzione se hai certezza che i client MCP che si connettono a questa istanza supportino contenuti strutturati. Le risposte dello strumento includeranno solo contenuti strutturati, escludendone la rappresentazione testuale. update: failure: "La configurazione MCP non può essere aggiornata." success: "La configurazione MCP è stata aggiornata correttamente." @@ -543,7 +543,7 @@ it: contained_in_type: "Contenuto nel tipo" confirm_destroy_option: "L'eliminazione di un'opzione eliminerà tutte le sue occorrenze (ad es. nelle macro-attività). Procedere all'eliminazione?" reorder_alphabetical: "Riordina i valori alfabeticamente" - reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?" + reorder_confirmation: "Attenzione: l'ordine attuale dei valori disponibili e tutti i valori non salvati andranno persi. Vuoi continuare?" placeholder_version_select: "Prima è necessario selezionare la macro-attività o il progetto" calculated_field_not_editable: "Attributo non modificabile. Questo valore viene calcolato automaticamente." no_role_assigment: "Nessuna assegnazione di ruolo" @@ -571,13 +571,13 @@ it: formula: project: "Aggiungi valori numerici o digita / per cercare un attributo o un operatore matematico." regexp: - all: "eg. ^[A-Z0-9]+$" - project: "eg. ^[A-Z0-9]+$" + all: "es. ^[A-Z0-9]+$" + project: "es. ^[A-Z0-9]+$" min_max: - all: "0 means no restriction" - project: "0 means no restriction" + all: "0 significa nessuna restrizione" + project: "0 significa nessuna restrizione" has_comment: - project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." + project: "Consente all'utente di aggiungere un commento relativo all'attributo del progetto quando seleziona il valore nella panoramica del progetto." tab: no_results_title_text: Al momento non esistono campi personalizzati. no_results_content_text: Crea un nuovo campo personalizzato @@ -596,8 +596,8 @@ it: confirmation_live_message_unchecked: "Il pulsante per procedere è ora inattivo. Devi spuntare la casella per continuare." mcp_configurations: server_url_component: - caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." - label: "Server URL" + caption: "URL a cui sarà raggiungibile il server OpenProject MCP. Necessario per la configurazione dei client MCP." + label: "URL del server" op_dry_validation: or: "oppure" errors: @@ -802,7 +802,7 @@ it: is_for_all_blank_slate: heading: Per tutti i progetti description: Questo attributo di progetto è attivato in tutti i progetti, poiché l'opzione "Per tutti i progetti" è selezionata. Non può essere disattivato per i singoli progetti. - enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. + enabled_via_assignee_when_submitted_html: Questo attributo del progetto non può essere disabilitato poiché è impostato come assegnatario quando inviato per le richieste di avvio del progetto. types: no_results_title_text: Al momento non sono disponibili tipi. form: @@ -818,8 +818,8 @@ it: new_label: "Nuova priorità" creation_wizard: errors: - no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." - no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." + no_work_package_type: "Impossibile abilitare la richiesta di avvio del progetto perché richiede almeno un tipo di macro-attività attivo e questo progetto non ne ha nessuno. Aggiungere almeno un tipo di macro-attività a questo progetto." + no_status_when_submitted: "Impossibile abilitare la richiesta di avvio del progetto perché il tipo di macro-attività %{type} richiede almeno uno stato associato. Abilitare almeno un flusso di lavoro di stato per questo tipo di macro-attività." export: description_attachment_export: "L'artefatto generato verrà salvato come allegato PDF alla macro-attività dell'artefatto." description_file_link_export: "La macro-attività dell'artefatto includerà un collegamento a un file PDF archiviato in uno spazio di archiviazione esterno. Richiede uno spazio di archiviazione file funzionante con cartelle di progetto gestite automaticamente per questo progetto. Al momento sono supportati solo archivi file Nextcloud." @@ -833,7 +833,7 @@ it: label_request_submission: "Richiesta di invio" project_attributes_description: > Seleziona quali attributi di progetto includere nella richiesta di avvio del progetto. Questo elenco include solo gli [attributi di progetto](project_attributes_url) abilitati per questo progetto. - enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. + enabled_because_required_html: Questo attributo di progetto non può essere disabilitato per questa richiesta di avvio del progetto poiché è definito come obbligatorio. Questa impostazione può essere modificata nelle impostazioni di amministrazione dall'amministratore dell'istanza. status: button_edit: Modifica lo stato wizard: @@ -1357,11 +1357,11 @@ it: activerecord: attributes: jira_import: - projects: "Projects" + projects: "Progetti" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Nome dell'istanza Jira" + url: "URL dell'istanza Jira" + personal_access_token: "Token di accesso personale" announcements: show_until: "Visualizza fino a" attachment: @@ -1407,7 +1407,7 @@ it: regexp: "Espressione regolare" searchable: "Ricercabile" admin_only: "Solo amministratore" - has_comment: "Add a comment text field" + has_comment: "Aggiungere un campo di testo per i commenti" custom_value: value: "Valore" design_color: @@ -1736,7 +1736,7 @@ it: not_available: "non è disponibile a causa di una configurazione di sistema." not_deletable: "non può essere eliminato." not_current_user: "non è l'utente attuale." - only_one_active_sprint_allowed: "only one active sprint is allowed per project." + only_one_active_sprint_allowed: "è consentito un solo sprint attivo per progetto." not_found: "non trovato." not_a_date: "non è una data valida." not_a_datetime: "non è un'orario valido." @@ -1844,7 +1844,7 @@ it: meeting: error_conflict: "Impossibile salvare perché la riunione è stata aggiornata da qualcun altro nel frattempo. Ricarica la pagina." message: - cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." + cannot_move_message_to_forum_of_different_project: "Un messaggio non può essere spostato in un forum di un altro progetto." notifications: at_least_one_channel: "Deve essere specificato almeno un canale per l'invio delle notifiche." attributes: @@ -2101,7 +2101,7 @@ it: in_use: "Questo nome di token è già utilizzato, scegline uno differente" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "Fornisci un protocollo valido (http o https)" template: body: "Perfavore controlla i seguenti campi:" header: @@ -2120,7 +2120,7 @@ it: comment: "Commento" custom_action: "Azione personalizzata" custom_field: "Campo personalizzato" - customized: "Customized" + customized: "Personalizzato" "doorkeeper/application": "Applicazione OAuth" enterprise_token: one: "Token Enterprise" @@ -2677,8 +2677,8 @@ it: edit_attribute_groups: Modifica proprietà gruppo gantt_pdf_export: Esportazione PDF Gantt ldap_groups: Utenti LDAP e sincronizzazione di gruppo - mcp_server: Model Context Protocol (MCP) - meeting_templates: Reusable meeting templates + mcp_server: Modello di protocollo contestuale (MCP - Model Context Protocol) + meeting_templates: Modelli di riunione riutilizzabili nextcloud_sso: Accesso singolo per Nextcloud Storage one_drive_sharepoint_file_storage: Archiviazione file OneDrive/SharePoint placeholder_users: Utenti segnaposto @@ -2756,9 +2756,9 @@ it: title: "Azioni personalizzate" description: "Le azioni personalizzate sono scorciatoie che con un clic ti consentono di eseguire una serie di azioni predefinite che è possibile rendere disponibili su determinate macro-attività in base a stato, ruolo, tipo o progetto." mcp_server: - description: "Bring OpenProject into your AI workflows with a secure MCP server." + description: "Integra OpenProject nei tuoi flussi di lavoro di intelligenza artificiale con un server MCP sicuro." meeting_templates: - description: "Define meeting templates with a set agenda structure and save time by reusing them when creating new meetings." + description: "Definisci modelli di riunione con una struttura di agenda definita e risparmia tempo riutilizzandoli quando crei nuove riunioni." nextcloud_sso: title: "Single Sign-On per Nextcloud Storage" description: "Abilita un'autenticazione veloce e sicura per il tuo archivio Nextcloud con Single Sign-On. Semplifica la gestione degli accessi e migliora la praticità per l'utente." @@ -3071,16 +3071,16 @@ it: #We need to include the version to invalidate outdated translations in other locales "17_2": new_features_title: > - The release contains various new features and improvements, such as: + Questa versione contiene diverse nuove funzionalità e miglioramenti, come ad esempio: new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved accessibility - line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments. - line_4: PDF export enhancements - line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module - line_7: Harmonized custom field forms + line_0: Flussi di lavoro IA con un server MCP sicuro (piano Professional e superiori) + line_1: Migliorata la home page del progetto con un nuovo widget per i budget e una migliore accessibilità + line_2: "Riunioni: modelli di riunione (piano Basic e superiore)" + line_3: Maggiore trasparenza con i commenti sugli attributi del progetto. + line_4: Miglioramenti all'esportazione di PDF + line_5: Maggiore sicurezza per i link esterni (piano Premium e superiori) + line_6: Miglioramenti UI/UX nel modulo Backlog + line_7: Moduli di campi personalizzati armonizzati links: upgrade_enterprise_edition: "Aggiorna ad Enterprise edition" postgres_migration: "Migrazione dell'installazione su PostgreSQL" @@ -3098,10 +3098,10 @@ it: journals: changes_retracted: "Le modifiche sono state annullate." caused_changes: - budget_deleted: "Budget has been deleted" + budget_deleted: "Il budget è stato cancellato" dates_changed: "Date cambiate" default_attribute_written: "Attributi di sola lettura scritti" - import: "Imported" + import: "Importato" progress_mode_changed_to_status_based: "Calcolo dei progressi aggiornato" status_changed: "Stato '%{status_name}'" system_update: "Aggiornamento del sistema OpenProject:" @@ -3110,21 +3110,21 @@ it: total_percent_complete_mode_changed_to_simple_average: "Il calcolo dei totali della % completamento si basa ora su una media semplice dei soli valori della % completamento." cause_descriptions: import: - header: "changes by %{author}" - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" - field_updated: "%{field} updated" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" - set_with_diff: "%{field} set (%{link})" + header: "modifiche di %{author}" + field_changed: "%{field} è cambiato da %{old_value} a %{new_value}" + field_set: "%{field} impostato su %{value}" + field_removed: "%{field} rimosso" + field_updated: "%{field} aggiornato" + deleted_with_diff: "%{field} eliminato (%{link})" + changed_with_diff: "%{field} modificato (%{link})" + set_with_diff: "%{field} impostato (%{link})" work_package_predecessor_changed_times: da modifiche al predecessore %{link} work_package_parent_changed_times: da modifiche al genitore %{link} work_package_children_changed_times: da modifiche al figlio %{link} work_package_related_changed_times: da modifiche a elemento correlato %{link} work_package_duplicate_closed: Lo stato è stato aggiornato automaticamente dalla macro-attività duplicata %{link} unaccessable_work_package_changed: da modifiche a macro-attività correlata - budget_deleted: Budget has been deleted + budget_deleted: Il budget è stato cancellato working_days_changed: changed: "da modifiche ai giorni lavorativi (%{changes})" days: @@ -3205,7 +3205,7 @@ it: active_tokens: "Token attivi" blank_description: "Non è configurato e attivo alcun accesso ad applicazioni di terze parti per te." blank_title: "Nessun token di applicazione OAuth" - last_refreshed_at: "Last refreshed at" + last_refreshed_at: "Ultimo aggiornamento:" title: "OAuth" table_title: "Token di applicazione OAuth" text_hint: "I token di applicazione OAuth consentono alle applicazioni di terze parti di connettersi con questa istanza OpenProject." @@ -3291,7 +3291,7 @@ it: label_always_visible: "Sempre visibile" label_announcement: "Annuncio" label_angular: "AngularJS" - label_app_modules: "%{app_title} modules" + label_app_modules: "Moduli %{app_title}" label_api_access_key: "Chiave di accesso API" label_api_access_key_created_on: "Chiave di accesso API creata %{value} fa" label_api_access_key_type: "API" @@ -3445,7 +3445,7 @@ it: label_duplicates: "duplica" label_edit: "Modifica" label_edit_x: "Modifica: %{x}" - label_view_x: "View: %{x}" + label_view_x: "Visualizza: %{x}" label_enable_multi_select: "Attiva/disattiva multiselezione" label_enabled_project_custom_fields: "Campi personalizzati abilitati" label_enabled_project_modules: "Moduli abilitati" @@ -3550,7 +3550,7 @@ it: label_external_links: "Link esterni" label_locale: "Lingua e paese" label_jump_to_a_project: "Salta ad altro progetto..." - label_jira_import: "Jira Import" + label_jira_import: "Importazione di Jira" label_keyword_plural: "Parole chiave" label_language_based: "Basato sulla lingua dell'utente" label_last_activity: "Ultima attività" @@ -3573,7 +3573,7 @@ it: label_lock_user: "Blocca utente" label_logged_as: "Accesso eseguito come" label_login: "Accedi" - label_custom_comment: "%{name} comment" + label_custom_comment: "Commento di %{name}" label_custom_logo: "Logo desktop personalizzato" label_custom_logo_mobile: "Logo mobile personalizzato" label_custom_export_logo: "Esportazione personalizzata logo" @@ -4201,7 +4201,7 @@ it: notice_successful_delete: "Cancellato con successo." notice_successful_cancel: "Cancellato con successo." notice_successful_update: "Aggiornato con successo." - notice_successful_move: "Successful move from %{from} to %{to}." + notice_successful_move: "Spostamento riuscito da %{from} a %{to}." notice_unsuccessful_create: "Creazione fallita." notice_unsuccessful_create_with_reason: "Creazione non riuscita: %{reason}" notice_unsuccessful_update: "Aggiornamento non riuscito." @@ -4363,7 +4363,7 @@ it: permission_edit_project_query: "Modifica elenco di progetti" placeholders: default: "-" - templated_hint: Automatically generated through type %{type} + templated_hint: Generato automaticamente tramite il tipo %{type} portfolio: count: zero: "0 portfolio" @@ -4548,9 +4548,9 @@ it: setting_capture_external_links: "Intercetta link esterni" setting_capture_external_links_text: > Se l'opzione è abilitata, tutti i link esterni in testo formattato verranno reindirizzati a una pagina di avviso prima di uscire dall'applicazione. Questo aiuta a proteggere gli utenti da siti web esterni potenzialmente dannosi. - setting_capture_external_links_require_login: "Require users to be logged in" + setting_capture_external_links_require_login: "Richiedi agli utenti di effettuare l'accesso" setting_capture_external_links_require_login_text: > - When enabled, users wanting to click on external links need to be logged in before being able to continue. + Se l'opzione è abilitata, gli utenti che desiderano fare clic sui link esterni devono aver effettuato l'accesso prima di poter continuare. setting_after_first_login_redirect_url: "Reindirizzamento di primo accesso" setting_after_first_login_redirect_url_text_html: > Imposta un percorso per reindirizzare gli utenti dopo il loro primo accesso. Se vuoto, reindirizza alla home page per il tour di onboarding.
Esempio: /my/page @@ -4595,9 +4595,9 @@ it: setting_smtp_password: "Password SMTP" setting_smtp_domain: "Dominio SMTP HELO" setting_activity_days_default: "Intervallo di giorni visualizzati sulle attività del progetto" - setting_api_tokens_enabled: "Enable API tokens" + setting_api_tokens_enabled: "Abilita i token API" setting_api_tokens_enabled_caption: > - Decide whether users can create personal API tokens in their account settings. These tokens can be used to access the different APIs of OpenProject, such as APIv3 and MCP. + Decidi se gli utenti possono creare token API personali nelle impostazioni del proprio account. Questi token possono essere utilizzati per accedere alle diverse API di OpenProject, come APIv3 e MCP. setting_app_subtitle: "Sottotitolo applicazione" setting_app_title: "Titolo applicazione" setting_attachment_max_size: "Dimensione max. dell'allegato" @@ -5136,10 +5136,10 @@ it: reset_failed_logins: "Azzera gli accessi falliti" status_user_and_brute_force: "%{user} e %{brute_force}" status_change: "Cambiamento di stato" - text_change_disabled_for_provider_login: "The name and email is set by your login provider and can thus not be changed." + text_change_disabled_for_provider_login: "Il nome e l'e-mail sono impostati dal servizio con cui hai effettuato l'accesso e non possono essere modificati." unlock: "Sblocca" unlock_and_reset_failed_logins: "Sblocca e azzera gli accessi non riusciti" - error_cannot_delete_user: "User cannot be deleted" + error_cannot_delete_user: "L'utente non può essere eliminato" version_status_closed: "chiuso" version_status_locked: "bloccato" version_status_open: "aperte" diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 6ede4bb65c1..5ba9a11f023 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -144,144 +144,144 @@ ko: error: "연결을 테스트하는 동안 예기치 않은 오류가 발생했습니다" connection_error: "연결 오류: %{message}" parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + api_error: "Jira API가 오류 상태 %{status}을(를) 반환했습니다. Jira 인스턴스 URL 및 API 토큰을 확인하세요." + token_error: "잘못된 API 토큰입니다. 구성에서 자격 증명을 확인하세요." + missing_credentials: "URL과 개인 액세스 토큰을 모두 제공하여 연결을 테스트하세요" + invalid_url: "유효한 URL을 제공하세요" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "Jira 서버에 연결하지 못했습니다: %{message}" + connection_timeout: "Jira 서버에 연결이 시간 초과되었습니다: %{message}" + parse_error: "Jira API 응답을 구문 분석하지 못했습니다: %{message}" + api_error: "Jira API가 오류 상태 %{status}을(를) 반환했습니다" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" - label_ago: "%{amount} ago" + projects: "프로젝트" + last_change: "마지막 변경" + added: "추가됨" + label_ago: "%{amount} 전" run: - title: "Import run" - history: "History" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + title: "가져오기 실행" + history: "기록" + remove_error: "Jira 가져오기는 실행되는 동안 제거할 수 없습니다" + import_blocked_error: "다른 Jira 가져오기 실행이 현재 진행 중이거나 검토를 기다리는 중입니다. 새 가져오기를 시작하기 전에 완료하거나 되돌리세요." blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "가져오기 실행이 아직 설정되지 않음" + description: "가져오기 실행을 만들어서 이 Jira 인스턴스에서 정보 가져오기를 시작하세요" 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: "가져오기 실행" + button_edit_configuration: "구성 편집" status: - initial: "Start" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" - configuring: "Select scope" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" - imported: "Review mode" - reverting: "Reverting" - revert_error: "Error during revert" - reverted: "Reverted" - completed: "Completed" + initial: "시작" + instance_meta_fetching: "메타 데이터를 가져오는 중" + instance_meta_error: "메타 데이터를 가져오는 중에 오류 발생" + instance_meta_done: "메타 데이터 가져옴" + configuring: "범위 선택" + projects_meta_fetching: "프로젝트 데이터를 가져오는 중" + projects_meta_error: "프로젝트 데이터를 가져오는 중에 오류 발생" + projects_meta_done: "데이터 수집함" + importing: "진행 중" + import_error: "가져오는 중에 오류 발생" + imported: "검토 모드" + reverting: "되돌리는 중" + revert_error: "되돌리는 중에 오류 발생" + reverted: "되돌림" + completed: "완료됨" wizard: - button_retry: "Retry" + button_retry: "다시 시도" parts: projects: - other: "%{count} projects" + other: "%{count}개 프로젝트" issues: - other: "%{count} issues" + other: "%{count}개 이슈" work_packages: - other: "%{count} work packages" + other: "%{count}개 작업 패키지" types: - other: "%{count} types" + other: "%{count}개 유형" statuses: - other: "%{count} statuses" + other: "%{count}개 상태" users: - other: "%{count} users" + other: "%{count}명 사용자" groups: fetch: - title: "Get base data" + title: "기본 데이터 가져오기" groups_and_users: - title: "Groups and Users" + title: "그룹 및 사용자" configuration: - title: "Configure import" + title: "가져오기 구성" confirming: - title: "Confirm and import" + title: "확인 및 가져오기" review: - title: "Review import" + title: "가져오기 검토" sections: fetch_data: - title: "Fetch instance meta data" - caption_done: "Completed" + title: "인스턴스 메타 데이터 가져오기" + caption_done: "완료됨" 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: "Jira에서 데이터를 가져오는 중..." groups_and_users: - title: "Groups and Users" + title: "그룹 및 사용자" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" + title: "가져오기 범위" + caption: "OpenProject로 가져올 항목을 선택합니다" + caption_done: "완료됨" 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 URL 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_available_data: "Available data" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" - button_continue: "Continue" - 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..." + label_available_data: "사용 가능한 데이터" + label_not_available_data: "가져오기에 사용할 수 없음" + button_select_projects: "가져올 프로젝트 선택" + button_continue: "계속" + label_import: "가져올 프로젝트를 선택합니다." + button_select: "프로젝트 선택" + label_selected_data: "가져올 데이터 선택함" + label_progress: "Jira에서 데이터를 가져오는 중..." elements: - relations: "Relations between issues" + relations: "이슈 간의 관계" workflows: "Project-level workflows" - users: "Users" - sprints: "Sprints" - schemes: "Schemas" + users: "사용자" + sprints: "스프린트" + schemes: "스키마" permissions: "User, group and project permissions" confirm_import: - title: "Import data" - caption: "Review your import settings and start the import" - caption_done: "Completed" - label_available_data: "Available data to import" - 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" + title: "데이터 가져오기" + caption: "가져오기 설정을 검토하고 가져오기를 시작합니다" + caption_done: "완료됨" + label_available_data: "가져올 수 있는 데이터" + button_start: "가져오기 시작" + description: "다음 설정으로 가져오기 실행을 시작하려고 합니다." + label_progress: "가져오기 진행 중..." + label_import_data: "현재 가져오는 중" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." - label_results: "Imported" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: 'The imported data is currently in review mode. Click "Finalize import" to make the import permanent or "Revert import" to undo all changes made in this import run.' - label_finalizing_progress: "Finalizing import..." - label_finalized: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + title: "가져오기 실행 결과" + caption: "가져오기 실행 검토 또는 가져오기 되돌리기" + info: "가져오기 실행에 성공했습니다." + label_results: "가져옴" + label_revert: "가져오기 되돌리기" + button_revert: "가져오기 되돌리기" + button_done: "가져오기 완료" + preview_description: '가져온 데이터는 현재 검토 모드에 있습니다. 가져오기를 영구적으로 적용하려면 "가져오기 완료"를 클릭하고, 가져오기 실행에서 변경된 모든 사항을 취소하려면 "가져오기 되돌리기"를 클릭합니다.' + label_finalizing_progress: "가져오기를 완료하는 중..." + label_finalized: "가져오기가 완료되었습니다." + label_revert_progress: "가져오기를 되돌리는 중..." + label_reverted: "가져오기를 되돌렸습니다." select_dialog: - filter_projects: "Filter by text" + filter_projects: "텍스트로 필터링" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." - confirm: "I understand that this reversion will delete data permanently" + title: "이 가져오기를 영구적으로 되돌리시겠습니까?" + description: "이렇게 하면 OpenProject의 가져오기 후 해당 프로젝트에 사용자 활동이 있더라도 가져온 모든 개체(전체 프로젝트 포함)가 삭제됩니다." + confirm: "이 되돌리기를 통해 데이터가 영구적으로 삭제됨을 이해합니다" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + title: "이 가져오기를 완료하시겠습니까?" + description: "가져오기가 완료되면 더 이상 되돌릴 수 없습니다. 가져온 모든 데이터는 영구적으로 가져오게 됩니다." + confirm: "이 작업을 취소할 수 없음을 이해합니다." + confirm_button: "이해함" select_projects: - title: "Select projects" + title: "프로젝트 선택" 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." resources_heading: "리소스" - resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_description: "OpenProject는 다음 리소스를 구현합니다. 원하는 대로 각 도구를 활성화하고, 이름을 바꾸고, 설명할 수 있습니다. 자세한 내용은 [MCP 리소스의 문서](docs_url)를 참조하세요." resources_submit: "리소스 업데이트" tools_heading: "도구" tools_description: "OpenProject는 다음 도구를 구현합니다. 원하는 대로 각 도구를 활성화하고, 이름을 바꾸고, 설명할 수 있습니다. 자세한 내용은 [MCP 도구의 문서](docs_url)를 참조하세요." @@ -290,17 +290,17 @@ ko: success: "MCP 구성이 업데이트되었습니다." server_form: description_caption: "MCP 서버에 연결하는 다른 애플리케이션에 대해 MCP 서버가 설명되는 방식입니다." - title_caption: "A short title shown to applications that connect to the MCP server." - tool_response_format: "Tool response format" - tool_response_format_content_only_label: "Content only" + title_caption: "MCP 서버에 연결하는 애플리케이션에 표시되는 짧은 제목입니다." + tool_response_format: "도구 응답 형식" + tool_response_format_content_only_label: "콘텐츠 전용" tool_response_format_content_only_caption: > - Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. - tool_response_format_full_label: "Full" + 이 인스턴스에 연결하는 MCP 클라이언트가 구조화된 콘텐츠를 지원하지 않는 경우 이 옵션을 선택하세요. 도구 응답에는 일반 텍스트 콘텐츠만 포함되며 구조화된 버전은 제외됩니다. + tool_response_format_full_label: "전체" tool_response_format_full_caption: > - The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance. - tool_response_format_structured_only_label: "Structured content only" + 가장 호환성이 높은 옵션입니다. 도구 응답에는 일반 콘텐츠와 구조화된 콘텐츠가 모두 포함되므로, MCP 클라이언트가 원하는 형식을 선택할 수 있습니다. 이렇게 하면 언어 모델이 처리해야 하는 토큰 수가 증가하여, 잠재적으로 비용이 높아지고 성능이 저하될 수 있습니다. + tool_response_format_structured_only_label: "구조화된 콘텐츠 전용" tool_response_format_structured_only_caption: > - Choose this if you are certain that MCP clients connecting to this instance support structured content. Tool responses will only include structured content and leave out its text representation. + 이 인스턴스에 연결하는 MCP 클라이언트가 구조화된 콘텐츠를 지원하는 것이 분명한 경우 이 옵션을 선택하세요. 도구 응답에는 구조화된 콘텐츠만 포함되며 텍스트 표현은 제외됩니다. update: failure: "MCP 구성을 업데이트할 수 없습니다." success: "MCP 구성이 업데이트되었습니다." @@ -539,7 +539,7 @@ ko: contained_in_type: "타입에 포함됨." confirm_destroy_option: "옵션을 삭제하면 모든 해당 항목(예: 작업 패키지 내 모든 항목)이 삭제됩니다. 그래도 삭제하시겠습니까?" reorder_alphabetical: "알파벳순으로 값 재정렬" - reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?" + reorder_confirmation: "경고: 사용 가능한 값의 현재 순서 및 저장되지 않은 모든 값이 손실됩니다. 계속하시겠습니까?" placeholder_version_select: "먼저 작업 패키지 또는 프로젝트를 선택해야 합니다" calculated_field_not_editable: "편집할 수 없는 특성입니다. 이 값은 자동으로 계산됩니다." no_role_assigment: "역할 할당 없음" @@ -567,13 +567,13 @@ ko: formula: project: "숫자 값을 추가하거나 /를 입력하여 특성 또는 수학 연산자를 검색합니다." regexp: - all: "eg. ^[A-Z0-9]+$" - project: "eg. ^[A-Z0-9]+$" + all: "예: ^[A-Z0-9]+$" + project: "예: ^[A-Z0-9]+$" min_max: - all: "0 means no restriction" - project: "0 means no restriction" + all: "0은 제한이 없음을 의미합니다" + project: "0은 제한이 없음을 의미합니다" has_comment: - project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." + project: "사용자가 프로젝트 개요에서 값을 선택할 때 프로젝트 특성과 관련된 코멘트를 추가할 수 있습니다." tab: no_results_title_text: 사용자 필드가 없습니다. no_results_content_text: 새 사용자 필드 생성 @@ -593,7 +593,7 @@ ko: mcp_configurations: server_url_component: caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." - label: "Server URL" + label: "서버 URL" op_dry_validation: or: "또는" errors: @@ -1345,11 +1345,11 @@ ko: activerecord: attributes: jira_import: - projects: "Projects" + projects: "프로젝트" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Jira 인스턴스 이름" + url: "Jira 인스턴스 URL" + personal_access_token: "개인 액세스 토큰" announcements: show_until: "표시 기한" attachment: @@ -1395,7 +1395,7 @@ ko: regexp: "정규 표현식" searchable: "검색가능한" admin_only: "관리자 전용" - has_comment: "Add a comment text field" + has_comment: "코멘트 텍스트 필드 추가" custom_value: value: "값" design_color: @@ -1724,7 +1724,7 @@ ko: not_available: "- 시스템 구성으로 인해 사용 가능하지 않습니다." not_deletable: "- 삭제할 수 없습니다." not_current_user: "은(는) 현재 유효한 사용자가 아닙니다." - only_one_active_sprint_allowed: "only one active sprint is allowed per project." + only_one_active_sprint_allowed: "프로젝트당 하나의 활성 스프린트만 허용됩니다." not_found: "- 찾을 수 없습니다." not_a_date: "은(는) 유효한 날짜가 아닙니다." not_a_datetime: "은(는) 유효한 날짜가 아닙니다." @@ -1831,7 +1831,7 @@ ko: meeting: error_conflict: "그 사이에 다른 사람이 미팅을 업데이트했기 때문에 저장할 수 없습니다. 페이지를 다시 로드하세요." message: - cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." + cannot_move_message_to_forum_of_different_project: "다른 프로젝트의 포럼으로 메시지를 이동할 수 없습니다." notifications: at_least_one_channel: "알림을 보낼 채널을 하나 이상 지정해야 합니다." attributes: @@ -2087,7 +2087,7 @@ ko: in_use: "이 토큰 이름은 이미 사용 중입니다. 다른 이름을 선택하세요" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "유효한 프로토콜(http 또는 https)을 입력하세요" template: body: "다음 필드를 확인 하십시오." header: @@ -2103,7 +2103,7 @@ ko: comment: "코멘트" custom_action: "사용자 지정 작업" custom_field: "사용자 정의 필드" - customized: "Customized" + customized: "사용자 지정됨" "doorkeeper/application": "OAuth 애플리케이션" enterprise_token: other: "Enterprise 토큰" @@ -2274,7 +2274,7 @@ ko: role: "역할" roles: "역할" search: "검색" - sprint: "Sprint" + sprint: "스프린트" start_date: "시작 날짜" status: "상태" state: "상태" @@ -2625,8 +2625,8 @@ ko: edit_attribute_groups: 특성 그룹 편집 gantt_pdf_export: Gantt PDF 내보내기 ldap_groups: LDAP 사용자 및 그룹 동기화 - mcp_server: Model Context Protocol (MCP) - meeting_templates: Reusable meeting templates + mcp_server: 모델 컨텍스트 프로토콜(MCP) + meeting_templates: 재사용 가능한 미팅 템플릿 nextcloud_sso: Nextcloud 저장소용 Single Sign-On one_drive_sharepoint_file_storage: OneDrive/SharePoint 파일 저장소 placeholder_users: 플레이스홀더 사용자 @@ -3048,7 +3048,7 @@ ko: budget_deleted: "Budget has been deleted" dates_changed: "변경된 날짜" default_attribute_written: "읽기 전용 특성 작성됨" - import: "Imported" + import: "가져옴" progress_mode_changed_to_status_based: "진행률 계산 업데이트됨" status_changed: "상태 '%{status_name}'" system_update: "OpenProject 시스템 업데이트:" @@ -3057,14 +3057,14 @@ ko: total_percent_complete_mode_changed_to_simple_average: "이제 완료 % 합계 계산은 완료 % 값의 단순 평균만을 기반으로 합니다." cause_descriptions: import: - header: "changes by %{author}" - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" + header: "%{author} 님이 변경함" + field_changed: "%{field}이(가) %{old_value}에서 %{new_value}(으)로 변경됨" + field_set: "%{field}이(가) %{value}(으)로 설정됨" + field_removed: "%{field} 제거됨" field_updated: "%{field} updated" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" - set_with_diff: "%{field} set (%{link})" + deleted_with_diff: "%{field} 삭제됨(%{link})" + changed_with_diff: "%{field} 변경됨(%{link})" + set_with_diff: "%{field} 설정됨(%{link})" work_package_predecessor_changed_times: 선행 단계 %{link}에 대한 변경 사항 기준 work_package_parent_changed_times: 부모 %{link}에 대한 변경 사항 기준 work_package_children_changed_times: 자식 %{link}에 대한 변경 사항 기준 @@ -3152,7 +3152,7 @@ ko: active_tokens: "활성 토큰" blank_description: "타사 애플리케이션 액세스가 구성 및 활성화되어 있지 않습니다." blank_title: "OAuth 애플리케이션 토큰 없음" - last_refreshed_at: "Last refreshed at" + last_refreshed_at: "마지막 새로고침:" title: "OAuth" table_title: "OAuth 애플리케이션 토큰" text_hint: "OAuth 애플리케이션 토큰을 통해 타사 애플리케이션이 이 OpenProject 인스턴스와 연결할 수 있습니다." @@ -3392,7 +3392,7 @@ ko: label_duplicates: "복제" label_edit: "편집" label_edit_x: "편집: %{x}" - label_view_x: "View: %{x}" + label_view_x: "보기: %{x}" label_enable_multi_select: "다중 선택 토글" label_enabled_project_custom_fields: "사용자 정의 필드 사용" label_enabled_project_modules: "사용 가능한 모듈" @@ -3497,7 +3497,7 @@ ko: label_external_links: "외부 링크" label_locale: "언어 및 지역" label_jump_to_a_project: "프로젝트로 이동..." - label_jira_import: "Jira Import" + label_jira_import: "Jira 가져오기" label_keyword_plural: "키워드" label_language_based: "사용자 언어에 따름" label_last_activity: "마지막 활동" @@ -3520,7 +3520,7 @@ ko: label_lock_user: "사용자 잠금" label_logged_as: "로그인한 계정:" label_login: "로그인" - label_custom_comment: "%{name} comment" + label_custom_comment: "%{name} 코멘트" label_custom_logo: "사용자 지정 로고 데스크톱" label_custom_logo_mobile: "사용자 지정 로고 모바일" label_custom_export_logo: "사용자 지정 내보내기 로고" @@ -4147,7 +4147,7 @@ ko: notice_successful_delete: "삭제에 성공했습니다." notice_successful_cancel: "취소에 성공했습니다." notice_successful_update: "업데이트에 성공했습니다." - notice_successful_move: "Successful move from %{from} to %{to}." + notice_successful_move: "%{from}에서 %{to}(으)로 이동했습니다." notice_unsuccessful_create: "생성이 실패했습니다." notice_unsuccessful_create_with_reason: "생성 실패: %{reason}" notice_unsuccessful_update: "업데이트에 실패했습니다." @@ -4307,7 +4307,7 @@ ko: permission_edit_project_query: "프로젝트 쿼리 편집" placeholders: default: "-" - templated_hint: Automatically generated through type %{type} + templated_hint: '%{type} 유형을 통해 자동으로 생성됨' portfolio: count: zero: "0개 포트폴리오" @@ -4490,9 +4490,9 @@ ko: setting_capture_external_links: "외부 링크 캡처" setting_capture_external_links_text: > 활성화된 경우, 서식이 지정된 텍스트의 모든 외부 링크는 애플리케이션을 종료하기 전에 경고 페이지를 통해 리디렉션됩니다. 따라서 잠재적인 악성 외부 웹사이트로부터 사용자를 보호할 수 있습니다. - setting_capture_external_links_require_login: "Require users to be logged in" + setting_capture_external_links_require_login: "사용자가 로그인해야 함" setting_capture_external_links_require_login_text: > - When enabled, users wanting to click on external links need to be logged in before being able to continue. + 이 옵션을 활성화하면, 외부 링크를 클릭하려는 사용자는 로그인해야 계속할 수 있습니다. setting_after_first_login_redirect_url: "첫 번째 로그인 리디렉션" setting_after_first_login_redirect_url_text_html: > 첫 로그인 후 사용자를 리디렉션할 경로를 설정하세요. 비어 있으면 온보딩 투어의 홈페이지로 리디렉션됩니다.
예: /my/page @@ -4537,9 +4537,9 @@ ko: setting_smtp_password: "SMTP 비밀번호" setting_smtp_domain: "SMTP HELO 도메인" setting_activity_days_default: "프로젝트 작업에 표시되는 기간(일)" - setting_api_tokens_enabled: "Enable API tokens" + setting_api_tokens_enabled: "API 토큰 활성화" setting_api_tokens_enabled_caption: > - Decide whether users can create personal API tokens in their account settings. These tokens can be used to access the different APIs of OpenProject, such as APIv3 and MCP. + 사용자가 계정 설정에서 개인 API 토큰을 만들 수 있는지 여부를 결정합니다. 해당 토큰은 APIv3 및 MCP와 같은 OpenProject의 다양한 API에 액세스하는 데 사용할 수 있습니다. setting_app_subtitle: "응용 프로그램 부제목" setting_app_title: "응용 프로그램 제목" setting_attachment_max_size: "첨부 파일 최대 크기" @@ -5077,7 +5077,7 @@ ko: reset_failed_logins: "실패한 로그인 재설정" status_user_and_brute_force: "%{user} 및 %{brute_force}" status_change: "상태 변경" - text_change_disabled_for_provider_login: "The name and email is set by your login provider and can thus not be changed." + text_change_disabled_for_provider_login: "이름 및 이메일은 로그인 공급자가 설정하므로 변경할 수 없습니다." unlock: "잠금 해제" unlock_and_reset_failed_logins: "실패한 로그인 잠금 해제 및 재설정" error_cannot_delete_user: "User cannot be deleted" diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 8babfc3b13c..dcf91bd933a 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -83,9 +83,9 @@ pt-BR: confirmation: "Tem certeza de que deseja excluir este token de suporte da edição Enterprise?" create_dialog: title: "Adicionar token Enterprise" - type_token_text: "Your Enterprise token text" + type_token_text: "Seu texto de token Enterprise" token_placeholder: "Colar seu token de suporte da edição Enterprise" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "Para saber mais sobre como ativar a edição Enterprise, consulte nossa [documentação](docs_url)." add_token: "Carregar um token de suporte da edição Enterprise " replace_token: "Substitua seu token atual de suporte" order: "Solicitar edição Enterprise local" @@ -113,179 +113,179 @@ pt-BR: import: title: "Importar" jira: - title: "Jira Import" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + title: "Importação do Jira" + description: "Use esta ferramenta para importar dados da sua instância do Jira. Você pode configurar vários hosts do Jira e escolher o que importar em cada execução de importação." errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "Não é possível excluir o host do Jira enquanto houver importações existentes" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + title: "Nenhum host do Jira configurado até o momento" + description: "Configure um host do Jira para começar a importar itens do Jira para esta instância do OpenProject." configuration: - title: "Jira configuration" + title: "Configuração do Jira" new: "Nova configuração" banner: - title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + title: "Importação limitada" + description: "Esta ferramenta de importação está atualmente em versão beta e só consegue importar dados básicos: projetos, tarefas (nome, título, descrição, anexos), usuários (nome, e-mail, participação em projetos), status e tipos. Não é possível importar fluxos de trabalho, campos personalizados, relações entre tarefas ou permissões. No momento, só damos suporte às versões 10.x e 11.x do Jira Server/Data Center. Instâncias Cloud não possuem suporte." form: fields: name: "Nome" - url: "Jira Server/Data Center URL" + url: "URL do Jira Server/Data Center" personal_access_token: "Token de acesso pessoal" button_add: "Adicionar configuração" button_save: "Salvar configuração" button_test: "Testar configuração" button_delete_token: "Excluir token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + delete_token_confirm: "Tem certeza de que deseja excluir o token? Isso desativará a conexão com o Jira." + label_testing: "Testando configuração..." + token_deleted: "Token excluído com sucesso." test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" + success: "Conectado com sucesso a %{server} (versão %{version})" + failed: "Falha na conexão: não foi possível recuperar as informações do servidor" + error: "Ocorreu um erro inesperado ao testar a conexão" + connection_error: "Erro de conexão: %{message}" + parse_error: "Falha ao interpretar a resposta do servidor. O servidor pode não ser uma instância válida do Jira." + api_error: "A API do Jira retornou o status de erro %{status}. Verifique o URL da sua instância do Jira e o token da API." + token_error: "Token da API inválido. Verifique suas credenciais na configuração." + missing_credentials: "Forneça tanto o URL quanto o Token de Acesso Pessoal para testar a conexão" invalid_url: "Forneça um URL válido" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "Falha ao conectar ao servidor Jira: %{message}" + connection_timeout: "O tempo de conexão com o servidor Jira esgotou: %{message}" + parse_error: "Falha ao analisar a resposta da API do Jira: %{message}" + api_error: "A API do Jira retornou o status de erro %{status}" columns: projects: "Projetos" last_change: "Última alteração" added: "Adicionado" - label_ago: "%{amount} ago" + label_ago: "Há %{amount}" run: - title: "Import run" + title: "Execução de importação" history: "Histórico" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + remove_error: "Uma importação do Jira não pode ser removida enquanto estiver em execução" + import_blocked_error: "Outra execução de importação do Jira está em andamento ou aguardando revisão. Conclua ou reverta-a antes de iniciar uma nova importação." blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "Ainda não há execuções de importação configuradas" + description: "Crie uma execução de importação para começar a importar informações desta instância do Jira" 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" + description: "Você pode importar diferentes conjuntos de dados em cada execução de importação. É possível desfazer uma execução de importação imediatamente após o modo de revisão, mas não após a finalização." + button_import_run: "Execução de importação" button_edit_configuration: "Editar configuração" status: initial: "Iniciar" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" + instance_meta_fetching: "Buscando metadados" + instance_meta_error: "Erro ao buscar metadados" + instance_meta_done: "Metadados obtidos" configuring: "Selecione o escopo" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" + projects_meta_fetching: "Buscando dados do projeto" + projects_meta_error: "Erro ao buscar dados do projeto" projects_meta_done: "Dados coletados" importing: "Em andamento" import_error: "Erro durante importação" imported: "Modo de revisão" reverting: "Revertendo" - revert_error: "Error during revert" + revert_error: "Erro durante a reversão" reverted: "Revertido" completed: "Concluído" wizard: button_retry: "Tentar novamente" parts: projects: - one: "1 project" - other: "%{count} projects" + one: "1 projeto" + other: "%{count} projetos" issues: - one: "1 issue" - other: "%{count} issues" + one: "1 tarefa" + other: "%{count} tarefas" work_packages: - one: "1 work package" - other: "%{count} work packages" + one: "1 pacote de trabalho" + other: "%{count} pacotes de trabalho" types: - one: "1 type" - other: "%{count} types" + one: "1 tipo" + other: "%{count} tipos" statuses: one: "1 status" - other: "%{count} statuses" + other: "%{count} status" users: - one: "1 user" - other: "%{count} users" + one: "1 usuário" + other: "%{count} usuários" groups: fetch: - title: "Get base data" + title: "Obter dados básicos" groups_and_users: - title: "Groups and Users" + title: "Grupos e usuários" configuration: title: "Configurar importação" confirming: title: "Confirmar e importar" review: - title: "Review import" + title: "Revisar importação" sections: fetch_data: - title: "Fetch instance meta data" + title: "Buscar metadados da instância" caption_done: "Concluído" - description: "Check what data is available for import in the host Jira instance." - button_fetch: "Check available data" - label_progress: "Fetching data from Jira..." + description: "Verifique quais dados estão disponíveis para importação na instância do Jira host." + button_fetch: "Verificar dados disponíveis" + label_progress: "Buscando dados do Jira..." groups_and_users: - title: "Groups and Users" + title: "Grupos e usuários" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" + title: "Escopo da importação" + caption: "Escolha o que deseja importar para o OpenProject" caption_done: "Concluído" - 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 URL 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_info: "Observe que esta ferramenta de importação está em versão beta e não consegue importar todos os tipos de dados. A seguir, um resumo do que o URL da instância Jira host oferece para importação e do que esta ferramenta consegue importar no momento." + description: "Selecione os dados que deseja importar a partir das informações disponíveis obtidas da instância Jira host." label_available_data: "Dados disponíveis" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" + label_not_available_data: "Não disponível para importação" + button_select_projects: "Selecione os projetos para importar" button_continue: "Continuar" - label_import: "Select which projects you would like to import." + label_import: "Selecione os projetos que você deseja importar." button_select: "Selecionar projetos" - label_selected_data: "Selected data for import" - label_progress: "Fetching data from Jira..." + label_selected_data: "Dados selecionados para importação" + label_progress: "Buscando dados do Jira..." elements: - relations: "Relations between issues" - workflows: "Project-level workflows" + relations: "Relações entre tarefas" + workflows: "Fluxos de trabalho no nível do projeto" users: "Usuários" sprints: "Sprints" schemes: "Esquemas" - permissions: "User, group and project permissions" + permissions: "Permissões de usuários, grupos e projetos" confirm_import: title: "Importar dados" - caption: "Review your import settings and start the import" + caption: "Revise suas configurações de importação e inicie a importação" caption_done: "Concluído" - label_available_data: "Available data to import" + label_available_data: "Dados disponíveis para importação" button_start: "Iniciar importação" - description: "You are about to start an import run with the following settings." + description: "Você está prestes a iniciar uma execução de importação com as seguintes configurações." label_progress: "Importação em andamento..." - label_import_data: "Currently importing" + label_import_data: "Importando no momento" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." + title: "Resultados da execução de importação" + caption: "Revisar execução de importação ou reverter importação" + info: "Execução de importação concluída com sucesso." label_results: "Importado" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: 'The imported data is currently in review mode. Click "Finalize import" to make the import permanent or "Revert import" to undo all changes made in this import run.' - label_finalizing_progress: "Finalizing import..." - label_finalized: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + label_revert: "Reverter importação" + button_revert: "Reverter importação" + button_done: "Finalize importação" + preview_description: 'Os dados importados estão atualmente em modo de revisão. Clique em “Finalizar importação” para tornar a importação permanente ou em “Reverter importação” para desfazer todas as alterações feitas nesta execução de importação.' + label_finalizing_progress: "Finalizando importação..." + label_finalized: "Importação finalizada." + label_revert_progress: "Revertendo importação..." + label_reverted: "Importação revertida." select_dialog: filter_projects: "Filtrar por texto" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." - confirm: "I understand that this reversion will delete data permanently" + title: "Deseja reverter esta importação de forma permanente?" + description: "Isso excluirá todos os objetos importados (incluindo projetos inteiros), mesmo que tenha havido atividade de usuários nesses projetos após a importação no OpenProject." + confirm: "Estou ciente de que esta reversão excluirá os dados de forma permanente" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." + title: "Deseja finalizar esta importação?" + description: "Após a finalização, esta importação não poderá mais ser revertida. Todos os dados importados se tornarão permanentes." confirm: "Compreendo que esta ação é irreversível" confirm_button: "Compreendido" select_projects: title: "Selecionar projetos" 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." + description: "O protocolo de contexto do modelo permite que agentes de IA forneçam aos seus usuários ferramentas e recursos disponibilizados por esta instância do OpenProject. Este recurso ainda está em versão beta." resources_heading: "Recursos" resources_description: "O OpenProject implementa as seguintes recursos. Cada uma pode ser habilitada, renomeada e descrita conforme desejado. Para mais informações, consulte a [documentação sobre recursos MCP](docs_url)." resources_submit: "Atualizar recursos" @@ -297,16 +297,16 @@ pt-BR: server_form: description_caption: "Como o servidor MCP será descrito para outros aplicativos que se conectarem a ele." title_caption: "Um título curto exibido para aplicativos que se conectam ao servidor MCP." - tool_response_format: "Tool response format" + tool_response_format: "Formato de resposta da ferramenta" tool_response_format_content_only_label: "Apenas conteúdo" tool_response_format_content_only_caption: > - Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. + Escolha esta opção se os clientes MCP que se conectam a esta instância não derem suporte ao conteúdo estruturado. As respostas da ferramenta só conterão texto simples, sem a versão estruturada. tool_response_format_full_label: "Completo" tool_response_format_full_caption: > - The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance. - tool_response_format_structured_only_label: "Structured content only" + A opção mais compatível. As respostas da ferramenta incluirão tanto o conteúdo normal quanto o estruturado, permitindo que os clientes MCP escolham qual formato desejam visualizar. Isso pode aumentar o número de tokens que o modelo de linguagem precisa processar, potencialmente elevando o custo e reduzindo o desempenho. + tool_response_format_structured_only_label: "Somente conteúdo estruturado" tool_response_format_structured_only_caption: > - Choose this if you are certain that MCP clients connecting to this instance support structured content. Tool responses will only include structured content and leave out its text representation. + Escolha esta opção se tiver certeza de que os clientes MCP que se conectam a esta instância derem suporte ao conteúdo estruturado. As respostas da ferramenta incluirão apenas o conteúdo estruturado, sem a versão em texto. update: failure: "A configuração MCP não pôde ser atualizada." success: "Configuração MCP atualizada com sucesso." @@ -544,7 +544,7 @@ pt-BR: contained_in_type: "Contido no tipo" confirm_destroy_option: "Removendo uma opção removerá todas as suas ocorrências (ex. em pacotes de trabalho). Tem certeza que você quer removê-la?" reorder_alphabetical: "Reorganizar valores em ordem alfabética" - reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?" + reorder_confirmation: "Aviso: A ordem atual dos valores disponíveis, assim como todos os valores não salvos, será perdida. Tem certeza de que deseja continuar?" placeholder_version_select: "Primeiro é necessária a seleção do pacote de trabalho ou projeto" calculated_field_not_editable: "Atributo não editável. O valor é calculado automaticamente." no_role_assigment: "Nenhuma atribuição de função" @@ -578,7 +578,7 @@ pt-BR: all: "0 significa que não há restrição" project: "0 significa que não há restrição" has_comment: - project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." + project: "Permite ao usuário adicionar um comentário relacionado ao atributo do projeto ao selecionar o valor na visão geral do projeto." tab: no_results_title_text: Atualmente, não há campos personalizados. no_results_content_text: Criar um novo campo personalizado @@ -597,8 +597,8 @@ pt-BR: confirmation_live_message_unchecked: "O botão para prosseguir está desativado. É necessário marcar a caixa de seleção para continuar." mcp_configurations: server_url_component: - caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." - label: "Server URL" + caption: "O URL em que o servidor MCP do OpenProject estará acessível. Necessário para configurar os clientes MCP." + label: "URL do servidor" op_dry_validation: or: "ou" errors: @@ -803,7 +803,7 @@ pt-BR: is_for_all_blank_slate: heading: Para todos os projetos description: Este atributo de projeto está ativado em todos os projetos, pois a opção “Para todos os projetos” está selecionada. Não é possível desativá-lo para projetos individuais. - enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. + enabled_via_assignee_when_submitted_html: Este atributo do projeto não pode ser desativado, pois está configurado como responsável ao enviar nas solicitações de início de projeto. types: no_results_title_text: Atualmente, não há tipos disponíveis. form: @@ -819,8 +819,8 @@ pt-BR: new_label: "Nova prioridade" creation_wizard: errors: - no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." - no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." + no_work_package_type: "Falha ao ativar a solicitação de início de projeto, pois é necessário ter pelo menos um tipo de pacote de trabalho ativo, e este projeto não possui nenhum. Adicione pelo menos um tipo de pacote de trabalho a este projeto." + no_status_when_submitted: "Falha ao ativar a solicitação de início de projeto, pois o tipo de pacote de trabalho %{type} precisa ter pelo menos um status associado. Habilite pelo menos um fluxo de trabalho de status para este tipo de pacote de trabalho." export: description_attachment_export: "O artefato gerado será salvo como um anexo PDF no pacote de trabalho do artefato." description_file_link_export: "O pacote de trabalho do artefato incluirá um link para um PDF armazenado em um armazenamento de arquivos externo. É necessário que o armazenamento ofereça gerenciamento automático de pastas por projeto. Atualmente, apenas armazenamentos Nextcloud são compatíveis." @@ -834,7 +834,7 @@ pt-BR: label_request_submission: "Envio de solicitação" project_attributes_description: > Selecione quais atributos do projeto devem ser incluídos na solicitação de início do projeto. Esta lista inclui apenas [atributos do projeto](project_attributes_url) habilitados para este projeto. - enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. + enabled_because_required_html: Este atributo do projeto não pode ser desativado para esta solicitação de início de projeto, pois é obrigatório. Essa opção pode ser alterada pelo administrador da instância nas configurações de administração. status: button_edit: Editar status wizard: @@ -1359,9 +1359,9 @@ pt-BR: jira_import: projects: "Projetos" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Nome da instância Jira" + url: "URL da instância Jira" + personal_access_token: "Token de acesso de pessoal" announcements: show_until: "Exibir até" attachment: @@ -1407,7 +1407,7 @@ pt-BR: regexp: "Expressão regular" searchable: "Pesquisável" admin_only: "Apenas administrador" - has_comment: "Add a comment text field" + has_comment: "Adicionar um campo de texto para comentário" custom_value: value: "Valor" design_color: @@ -1736,7 +1736,7 @@ pt-BR: not_available: "não está disponível devido a uma configuração do sistema." not_deletable: "não pode ser excluído." not_current_user: "não é o usuário atual." - only_one_active_sprint_allowed: "only one active sprint is allowed per project." + only_one_active_sprint_allowed: "apenas uma sprint ativa é permitida por projeto." not_found: "não encontrado." not_a_date: "não é uma data válida." not_a_datetime: "não é uma data/hora válida." @@ -1844,7 +1844,7 @@ pt-BR: meeting: error_conflict: "Não foi possível salvar, pois a reunião foi atualizada por outra pessoa enquanto isso. Atualize a página, por favor." message: - cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." + cannot_move_message_to_forum_of_different_project: "Uma mensagem não pode ser movida para um fórum de outro projeto." notifications: at_least_one_channel: "É necessário especificar pelo menos um canal para o envio de notificações." attributes: @@ -2101,7 +2101,7 @@ pt-BR: in_use: "Este nome de token já está em uso, escolha outro" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "Forneça um protocolo válido (http ou https)" template: body: "Por favor, verifique os seguintes campos:" header: @@ -2677,8 +2677,8 @@ pt-BR: edit_attribute_groups: Editar atributo de grupos gantt_pdf_export: Exportar diagrama de Gantt para PDF ldap_groups: Sincronização de usuários e grupos LDAP - mcp_server: Model Context Protocol (MCP) - meeting_templates: Reusable meeting templates + mcp_server: Protocolo de Contexto do Modelo (MCP) + meeting_templates: Modelos de reunião reutilizáveis nextcloud_sso: Autenticação única para o armazenamento do Nextcloud one_drive_sharepoint_file_storage: Armazenamento de Arquivos OneDrive/SharePoint placeholder_users: Usuários Genéricos @@ -2756,9 +2756,9 @@ pt-BR: title: "Ações personalizadas" description: "As ações personalizadas são atalhos de clique único para um conjunto de ações pré-definidas que você pode disponibilizar em certos pacotes de trabalho com base no estado, função, tipo ou projeto." mcp_server: - description: "Bring OpenProject into your AI workflows with a secure MCP server." + description: "Integre o OpenProject aos seus fluxos de trabalho de IA com um servidor MCP seguro." meeting_templates: - description: "Define meeting templates with a set agenda structure and save time by reusing them when creating new meetings." + description: "Defina modelos de reunião com uma estrutura de pauta predefinida e economize tempo reutilizando-os ao criar novas reuniões." nextcloud_sso: title: "Autenticação única para o armazenamento do Nextcloud" description: "Ative a autenticação segura e contínua para o seu armazenamento Nextcloud com Autenticação única. Simplifique o gerenciamento de acessos e melhore a experiência do usuário." @@ -3071,16 +3071,16 @@ pt-BR: #We need to include the version to invalidate outdated translations in other locales "17_2": new_features_title: > - The release contains various new features and improvements, such as: + A versão traz diversos novos recursos e melhorias, como: new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved accessibility - line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments. - line_4: PDF export enhancements - line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module - line_7: Harmonized custom field forms + line_0: Fluxos de trabalho de IA com um servidor MCP seguro (plano Professional ou superior) + line_1: Página inicial do projeto aprimorada, com novo widget para orçamentos e acessibilidade melhorada + line_2: "Reuniões: Modelos de reunião (plano Basic ou superior)" + line_3: Mais transparência com comentários nos atributos do projeto. + line_4: Melhorias na exportação para PDF + line_5: Segurança reforçada para links externos (plano Premium ou superior) + line_6: Melhorias de UI/UX no módulo de Backlogs + line_7: Formulários de campos personalizados harmonizados links: upgrade_enterprise_edition: "Atualizar para a edição Enterprise" postgres_migration: "Migrando sua instalação para PostgreSQL" @@ -3098,7 +3098,7 @@ pt-BR: journals: changes_retracted: "As mudanças foram retraídas." caused_changes: - budget_deleted: "Budget has been deleted" + budget_deleted: "Orçamento foi excluído" dates_changed: "Datas alteradas" default_attribute_written: "Atributos de somente leitura escritos" import: "Importado" @@ -3110,21 +3110,21 @@ pt-BR: total_percent_complete_mode_changed_to_simple_average: "O cálculo dos totais de % de conclusão agora é feito com base na média simples dos valores de % de conclusão." cause_descriptions: import: - header: "changes by %{author}" - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" - field_updated: "%{field} updated" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" - set_with_diff: "%{field} set (%{link})" + header: "alterações por %{author}" + field_changed: "%{field} alterado de %{old_value} para %{new_value}" + field_set: "%{field} definido como %{value}" + field_removed: "%{field} removido" + field_updated: "%{field} atualizado" + deleted_with_diff: "%{field} excluído (%{link})" + changed_with_diff: "%{field} alterado (%{link})" + set_with_diff: "%{field} definido (%{link})" work_package_predecessor_changed_times: por alterações ao antecessor %{link} work_package_parent_changed_times: por alterações ao primário %{link} work_package_children_changed_times: por alterações ao secundário %{link} work_package_related_changed_times: por alterações ao %{link} relacionado work_package_duplicate_closed: O status foi atualizado automaticamente pelo pacote de trabalho duplicado %{link} unaccessable_work_package_changed: por alterações a um pacote de trabalho relacionado - budget_deleted: Budget has been deleted + budget_deleted: Orçamento foi excluído working_days_changed: changed: "por alterações a dias úteis (%{changes})" days: @@ -3205,7 +3205,7 @@ pt-BR: active_tokens: "Tokens ativos" blank_description: "Não há nenhum acesso ativo de aplicativos de terceiros configurado para sua conta." blank_title: "Sem token de aplicativo OAuth" - last_refreshed_at: "Last refreshed at" + last_refreshed_at: "Última atualização em" title: "OAuth" table_title: "Tokens de aplicativo OAuth" text_hint: "Tokens de aplicativo OAuth permitem que aplicativos de terceiros se conectem a esta instância do OpenProject." @@ -3445,7 +3445,7 @@ pt-BR: label_duplicates: "Duplicados" label_edit: "Editar" label_edit_x: "Editar: %{x}" - label_view_x: "View: %{x}" + label_view_x: "Visualizar: %{x}" label_enable_multi_select: "Alterna para seleção múltipla" label_enabled_project_custom_fields: "Campos personalizados habilitados" label_enabled_project_modules: "Módulos habilitados" @@ -3550,7 +3550,7 @@ pt-BR: label_external_links: "Links externos" label_locale: "Idioma e região" label_jump_to_a_project: "Saltar para um projeto..." - label_jira_import: "Jira Import" + label_jira_import: "Importação do Jira" label_keyword_plural: "Palavras-chave" label_language_based: "Com base no idioma do usuário" label_last_activity: "Última atividade" @@ -3573,7 +3573,7 @@ pt-BR: label_lock_user: "Bloquear usuário" label_logged_as: "Conectado como" label_login: "Fazer login" - label_custom_comment: "%{name} comment" + label_custom_comment: "Comentário de %{name}" label_custom_logo: "Logotipo personalizado para desktop" label_custom_logo_mobile: "Logotipo personalizado para celular" label_custom_export_logo: "Logo de exportação personalizado" @@ -4200,7 +4200,7 @@ pt-BR: notice_successful_delete: "Exclusão bem sucedida." notice_successful_cancel: "Cancelamento bem-sucedido." notice_successful_update: "Atualizado com sucesso." - notice_successful_move: "Successful move from %{from} to %{to}." + notice_successful_move: "Movido com sucesso de %{from} para %{to}." notice_unsuccessful_create: "Falha na criação." notice_unsuccessful_create_with_reason: "Falha na criação: %{reason}" notice_unsuccessful_update: "Falha na atualização." @@ -4362,7 +4362,7 @@ pt-BR: permission_edit_project_query: "Editar consulta do projeto" placeholders: default: "-" - templated_hint: Automatically generated through type %{type} + templated_hint: Gerado automaticamente através do tipo %{type} portfolio: count: zero: "0 portfólios" @@ -4547,9 +4547,9 @@ pt-BR: setting_capture_external_links: "Capturar links externos" setting_capture_external_links_text: > Quando ativado, todos os links externos em textos formatados serão redirecionados por uma página de aviso antes de sair do aplicativo. Isso ajuda a proteger os usuários de sites externos potencialmente maliciosos. - setting_capture_external_links_require_login: "Require users to be logged in" + setting_capture_external_links_require_login: "Exigir que os usuários estejam conectados" setting_capture_external_links_require_login_text: > - When enabled, users wanting to click on external links need to be logged in before being able to continue. + Quando habilitado, os usuários que desejarem clicar em links externos precisarão estar conectados antes de continuar. setting_after_first_login_redirect_url: "Redirecionamento de primeiro login" setting_after_first_login_redirect_url_text_html: > Defina um caminho para redirecionar os usuários após o primeiro login. Se deixado em branco, eles serão redirecionados para a página inicial do tour de introdução.
Exemplo: /my/page @@ -4594,9 +4594,9 @@ pt-BR: setting_smtp_password: "Senha SMTP" setting_smtp_domain: "Domínio SMTP HELO" setting_activity_days_default: "Dias exibidos na atividade de projeto" - setting_api_tokens_enabled: "Enable API tokens" + setting_api_tokens_enabled: "Ativar tokens de API" setting_api_tokens_enabled_caption: > - Decide whether users can create personal API tokens in their account settings. These tokens can be used to access the different APIs of OpenProject, such as APIv3 and MCP. + Determine se os usuários podem criar tokens de API pessoais nas configurações da conta. Esses tokens podem ser usados para acessar as diferentes APIs do OpenProject, como APIv3 e MCP. setting_app_subtitle: "Subtítulo do aplicativo" setting_app_title: "Título da aplicação" setting_attachment_max_size: "Tamanho máximo dos anexos" @@ -5135,10 +5135,10 @@ pt-BR: reset_failed_logins: "Redefinição de logins que falharam" status_user_and_brute_force: "%{user} e %{brute_force}" status_change: "Mudança de situação" - text_change_disabled_for_provider_login: "The name and email is set by your login provider and can thus not be changed." + text_change_disabled_for_provider_login: "O nome e o e-mail são definidos por seu provedor de login e, por isso, não podem ser alterados." unlock: "Desbloquear" unlock_and_reset_failed_logins: "Desbloquear e redefinir logins com falha" - error_cannot_delete_user: "User cannot be deleted" + error_cannot_delete_user: "Usuário não pode ser excluído" version_status_closed: "fechado" version_status_locked: "bloqueado" version_status_open: "aberto" diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index cad052c0aba..93aa0e3df3a 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -141,7 +141,7 @@ zh-CN: test: success: "成功连接到 %{server}(版本 %{version})" failed: "连接失败:无法检索服务器信息" - error: "测试连接时意外出错" + error: "测试连接时发生意外错误" connection_error: "连接错误:%{message}" parse_error: "服务器响应解析失败。服务器可能不是有效的 Jira 实例。" api_error: "Jira API 返回错误状态 %{status}。请检查您的 Jira 实例 URL 和 API 令牌。" @@ -149,15 +149,15 @@ zh-CN: missing_credentials: "请提供 URL 和个人访问令牌,以测试连接" invalid_url: "请提供有效的 URL" client: - connection_error: "Jira 服务器连接失败:%{message}" + connection_error: "无法连接到 Jira 服务器:%{message}" connection_timeout: "与 Jira 服务器的连接超时:%{message}" - parse_error: "Jira API 响应解析失败:%{message}" + parse_error: "无法解析 Jira API 响应:%{message}" api_error: "Jira API 返回错误状态 %{status}" columns: projects: "项目" last_change: "上次更改" added: "已添加" - label_ago: "%{amount} 前" + label_ago: "%{amount}前" run: title: "导入运行" history: "历史记录" @@ -169,7 +169,7 @@ zh-CN: index: description: "每次导入运行都可以导入不同的数据集。可以在审核模式后立即撤消导入运行,但不能在完成后撤消。" button_import_run: "导入运行" - button_edit_configuration: "编辑设置" + button_edit_configuration: "编辑配置" status: initial: "开始" instance_meta_fetching: "正在获取元数据" @@ -182,7 +182,7 @@ zh-CN: importing: "进行中" import_error: "导入过程中出错" imported: "审核模式" - reverting: "撤消中" + reverting: "正在撤消" revert_error: "撤消过程中出错" reverted: "已撤消" completed: "已完成" @@ -200,7 +200,7 @@ zh-CN: statuses: other: "%{count} 种状态" users: - other: "%{count} 名用户" + other: "%{count} 个用户" groups: fetch: title: "获取基础数据" @@ -294,13 +294,13 @@ zh-CN: tool_response_format: "工具响应格式" tool_response_format_content_only_label: "仅内容" tool_response_format_content_only_caption: > - 如果连接到此实例的 MCP 客户端不支持结构化内容,则选中此项。此后,工具响应将只包含纯文本内容,而不包含结构化版本。 + 如果连接到此实例的 MCP 客户端不支持结构化内容,则选中此项。工具响应将只包含纯文本内容,而不包含结构化版本。 tool_response_format_full_label: "完整" tool_response_format_full_caption: > 最兼容的选项。工具响应将包含常规内容和结构化内容,MCP 客户端可以选择要读取的格式。这可能会增加语言模型需要处理的词元数,从而可能导致成本增加,性能降低。 tool_response_format_structured_only_label: "仅结构化内容" tool_response_format_structured_only_caption: > - 如果您确定连接到此实例的 MCP 客户端支持结构化内容,则选中此项。此后,工具响应将只包含结构化内容,而不包含其文本表示。 + 如果您确定连接到此实例的 MCP 客户端支持结构化内容,则选中此项。工具响应将只包含结构化内容,而不包含其文本表示。 update: failure: "MCP 配置无法更新。" success: "MCP 配置已成功更新。" @@ -570,7 +570,7 @@ zh-CN: all: "0 表示无限制" project: "0 表示无限制" has_comment: - project: "用户可以在项目概览中选择值时添加与项目特性相关的注释。" + project: "允许用户在项目概览中选择值时添加与项目特性相关的注释。" tab: no_results_title_text: 目前没有自定义字段。 no_results_content_text: 创建新的自定义字段 @@ -589,7 +589,7 @@ zh-CN: confirmation_live_message_unchecked: "继续按钮现已失效。您需要勾选复选框才能继续。" mcp_configurations: server_url_component: - caption: "可连接 OpenProject MCP 服务器的 URL。设置 MCP 客户端时需要使用。" + caption: "可以访问 OpenProject MCP 服务器的 URL。设置 MCP 客户端时需要使用。" label: "服务器 URL" op_dry_validation: or: "或" @@ -810,7 +810,7 @@ zh-CN: new_label: "新优先级" creation_wizard: errors: - no_work_package_type: "无法启用项目启动请求,因为它至少需要一个活动的工作包类型,但此项目没有。请为此项目至少添加一种工作包类型。" + no_work_package_type: "无法启用项目启动请求,因为它至少需要一个有效工作包类型,但此项目没有。请为此项目至少添加一种工作包类型。" no_status_when_submitted: "无法启用项目启动请求,因为工作包类型 %{type} 至少需要一个与之相关的状态。请为此工作包类型至少启用一个状态工作流。" export: description_attachment_export: "生成的工件将作为 PDF 附件保存到工件工作包中。" @@ -825,7 +825,7 @@ zh-CN: label_request_submission: "请求提交" project_attributes_description: > 选择哪些项目特性应包含在项目启动请求中。此列表仅包含为此项目启用的[项目特性](project_attributes_url)。 - enabled_because_required_html: 无法为此项目启动请求禁用此项目特性,因为它被定义为必填项。实例管理员可在管理设置中更改此设置。 + enabled_because_required_html: 无法为此项目启动请求禁用此项目特性,因为它被定义为必选项。实例管理员可以在管理设置中更改此设置。 status: button_edit: 编辑状态 wizard: @@ -1720,7 +1720,7 @@ zh-CN: not_available: "因系统配置而不可用。" not_deletable: "无法删除。" not_current_user: "不是当前用户。" - only_one_active_sprint_allowed: "每个项目只允许有一个活跃的冲刺。" + only_one_active_sprint_allowed: "每个项目只允许有一个有效冲刺。" not_found: "未找到" not_a_date: "不是有效的日期。" not_a_datetime: "不是有效的日期时间。" @@ -3016,8 +3016,8 @@ zh-CN: new_features_title: > 此版本包含各种新功能和改进,例如: new_features_list: - line_0: 通过安全的 MCP 服务器实现的 AI 工作流(专业版及更高版本) - line_1: 改进了项目主页,新增了预算微件,提高了可访问性 + line_0: 通过安全的 MCP 服务器实现的 AI 工作流(专业方案及更高版本) + line_1: 改进了项目首页,新增了预算微件,提高了可访问性 line_2: "会议:会议模板(基本方案及更高版本)" line_3: 通过项目特性注释,提高了透明度。 line_4: PDF 导出增强功能 @@ -3054,13 +3054,13 @@ zh-CN: cause_descriptions: import: header: "更改者:%{author}" - field_changed: "%{field} 已从 %{old_value} 更改为 %{new_value}" - field_set: "%{field} 设置为 %{value}" - field_removed: "%{field} 已移除" - field_updated: "%{field} 已更新" - deleted_with_diff: "%{field} 已删除 (%{link})" - changed_with_diff: "%{field} 已更改 (%{link})" - set_with_diff: "%{field} 已设置 (%{link})" + field_changed: "“%{field}”已从 %{old_value} 更改为 %{new_value}" + field_set: "“%{field}”设置为 %{value}" + field_removed: "“%{field}”已移除" + field_updated: "“%{field}”已更新" + deleted_with_diff: "“%{field}”已删除 (%{link})" + changed_with_diff: "“%{field}”已更改 (%{link})" + set_with_diff: "“%{field}”已设置 (%{link})" work_package_predecessor_changed_times: 根据前置任务 %{link}的更改 work_package_parent_changed_times: 通过对父级的更改 %{link} work_package_children_changed_times: 通过对子级的更改 %{link} @@ -3219,7 +3219,7 @@ zh-CN: label_added: "已添加" label_added_by: "由%{author}添加" label_added_by_on: "由 %{author} 添加 %{date}" - label_added_time_by: "由 %{author} %{age} 前添加" + label_added_time_by: "由 %{author} %{age}前添加" label_additional_workflow_transitions_for_assignee: "当用户是受理人时允许额外的转移" label_additional_workflow_transitions_for_author: "当用户是作者时允许额外转移" label_administration: "管理" @@ -3236,7 +3236,7 @@ zh-CN: label_angular: "AngularJS" label_app_modules: "%{app_title} 模块" label_api_access_key: "API 访问键" - label_api_access_key_created_on: "API 访问密钥创建于 %{value} 前" + label_api_access_key_created_on: "API 访问密钥创建于 %{value}前" label_api_access_key_type: "API" label_auto_option: "(自动)" label_ical_access_key_type: "iCalendar" @@ -3421,7 +3421,7 @@ zh-CN: label_favorite: "收藏夹" label_feed_plural: "订阅源" label_feeds_access_key: "RSS 访问密钥" - label_feeds_access_key_created_on: "RSS 访问密钥创建于 %{value} 前" + label_feeds_access_key_created_on: "RSS 访问密钥创建于 %{value}前" label_feeds_access_key_type: "RSS 订阅" label_file_plural: "文件" label_filter: "筛选器" @@ -3516,7 +3516,7 @@ zh-CN: label_lock_user: "锁定用户" label_logged_as: "登录用户名" label_login: "登录" - label_custom_comment: "%{name} 注释" + label_custom_comment: "%{name}注释" label_custom_logo: "自定义徽标桌面版" label_custom_logo_mobile: "自定义徽标移动版" label_custom_export_logo: "自定义导出徽标" @@ -3800,9 +3800,9 @@ zh-CN: label_type_new: "新类型" label_type_plural: "类型" label_ui: "用户界面" - label_updated_time: "%{value} 前更新" + label_updated_time: "%{value}前更新" label_updated_time_at: "%{author} %{age}" - label_updated_time_by: "%{author} 于 %{age} 前更新" + label_updated_time_by: "%{author} 于 %{age}前更新" label_upgrade_guides: "升级指南" label_used_by: "使用于" label_used_by_types: "用于类型" @@ -4301,7 +4301,7 @@ zh-CN: permission_edit_project_query: "编辑项目查询" placeholders: default: "-" - templated_hint: 通过类型 %{type} 自动生成 + templated_hint: 通过“%{type}”类型自动生成 portfolio: count: zero: "0 个项目组合" diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml index c8d2735c844..55ed57ffdf8 100644 --- a/modules/backlogs/config/locales/crowdin/it.yml +++ b/modules/backlogs/config/locales/crowdin/it.yml @@ -26,13 +26,13 @@ it: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" - sharing: "Sharing" + duration: "Durata" + finish_date: "Data di fine" + goal: "Obiettivo dello sprint" + name: "Nome dello sprint" + sharing: "Condivisione" sprint: - duration: "Sprint duration" + duration: "Durata dello sprint" work_package: position: "Posizione" story_points: "Punti della storia" @@ -54,7 +54,7 @@ it: task_type: "Tipo di attività" backlogs: any: "qualsiasi" - column_width: "Column width" + column_width: "Larghezza della colonna" definition_of_done: "Definizione di fatto" impediment: "Impedimento" label_versions_default_fold_state: "Espandi le versioni" @@ -62,8 +62,8 @@ it: work_package_is_closed: "Il pacchetto di lavoro è fatto, quando" label_is_done_status: "Lo stato %{status_name} vuol dire completato" points_label: - one: "point" - other: "points" + one: "punto" + other: "punti" positions_could_not_be_rebuilt: "Le posizioni non potrebbero essere ricostruite." positions_rebuilt_successfully: "Posizioni ricostruite correttamente." rebuild: "Ricostruisci" @@ -72,8 +72,8 @@ it: show_burndown_chart: "Grafico Burndown" story: "Storia" story_points: - one: "%{count} story point" - other: "%{count} story points" + one: "%{count} punto story" + other: "%{count} punti story" task: "Attività" task_color: "Colore attività" unassigned: "Non assegnato" @@ -81,28 +81,28 @@ it: header_backlogs: "Modulo backlog" button_update_backlogs: "Aggiorna il modulo backlog" backlog_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} è vuoto" + blankslate_description: "Nessun elemento pianificato ancora. Trascina gli elementi qui per aggiungerli." backlog_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Comprimi/Espandi %{name}" label_story_count: - zero: "No stories in backlog" - one: "%{count} story in backlog" - other: "%{count} stories in backlog" + zero: "Nessuna story nel backlog" + one: "%{count} story nel backlog" + other: "%{count} story nel backlog" backlog_menu_component: - label_actions: "Backlog actions" + label_actions: "Azioni nel backlog" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Modifica sprint" + new_story: "Nuova story" + stories_tasks: "Story/Task" + task_board: "Bacheca dei task" + burndown_chart: "Grafico Burndown" wiki: "Wiki" - properties: "Properties" + properties: "Proprietà" story_component: - label_drag_story: "Move %{name}" + label_drag_story: "Sposta %{name}" story_menu_component: - label_actions: "Story actions" + label_actions: "Azioni della story" backlogs_points_burn_direction: "Punteggi per burn positivo/negativo" backlogs_product_backlog: "Backlog del prodotto" backlogs_story: "Storia" @@ -110,14 +110,14 @@ it: backlogs_task: "Attività" backlogs_task_type: "Tipo di attività" backlogs_wiki_template: "Modello per pagina wiki dello sprint" - backlogs_empty_title: "No versions are defined yet" - backlogs_empty_action_text: "To start using backlogs, please create a version first" - backlogs_not_configured_title: "Backlogs not configured" - backlogs_not_configured_description: "Story and task types need to be set before using this module." - backlogs_not_configured_action_text: "Configure Backlogs" + backlogs_empty_title: "Non sono ancora state definite delle versioni" + backlogs_empty_action_text: "Per iniziare a usare i backlog, crea prima una versione" + backlogs_not_configured_title: "Backlog non configurati" + backlogs_not_configured_description: "Prima di utilizzare questo modulo è necessario impostare la tipologia di story e di task." + backlogs_not_configured_action_text: "Configura i backlog" burndown: - story_points: "Story points" - story_points_ideal: "Story points (ideal)" + story_points: "Punti story" + story_points_ideal: "Punti story (ideali)" errors: attributes: task_type: @@ -129,18 +129,18 @@ it: label_points_burn_down: "Verso il basso" label_points_burn_up: "Verso l'alto" label_sprint_impediments: "Impedimenti allo sprint" - label_sprint_new: "New sprint" + label_sprint_new: "Nuovo sprint" label_task_board: "Pannello delle attività" - permission_view_sprints: "View sprints" - permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" - permission_manage_sprint_items: "Manage sprint items" - permission_share_sprint: "Share sprint" + permission_view_sprints: "Visualizza gli sprint" + permission_create_sprints: "Crea gli sprint" + permission_start_complete_sprint: "Iniziare/completa lo sprint" + permission_manage_sprint_items: "Gestisci gli elementi dello sprint" + permission_share_sprint: "Condividi lo sprint" project_module_backlogs: "Backlog" rb_burndown_charts: show: - blankslate_title: "No burndown data available" - blankslate_description: "Set start and end date for the sprint to generate a burndown chart." + blankslate_title: "Non sono disponibili dati di burndown" + blankslate_description: "Imposta la data di inizio e di fine dello sprint per generare un grafico di burndown." remaining_hours: "lavoro residuo" version_settings_display_label: "Colonna nel backlog" version_settings_display_option_left: "sinistra" diff --git a/modules/backlogs/config/locales/crowdin/js-it.yml b/modules/backlogs/config/locales/crowdin/js-it.yml index 334cf2c3973..97e6364d9ed 100644 --- a/modules/backlogs/config/locales/crowdin/js-it.yml +++ b/modules/backlogs/config/locales/crowdin/js-it.yml @@ -25,5 +25,5 @@ it: properties: storyPoints: "Punti della storia" burndown: - day: "Day" - points: "Points" + day: "Giorno" + points: "Punti" diff --git a/modules/backlogs/config/locales/crowdin/js-ko.yml b/modules/backlogs/config/locales/crowdin/js-ko.yml index 34bf0f016c0..1e87ff5a9b1 100644 --- a/modules/backlogs/config/locales/crowdin/js-ko.yml +++ b/modules/backlogs/config/locales/crowdin/js-ko.yml @@ -25,5 +25,5 @@ ko: properties: storyPoints: "스토리 포인트" burndown: - day: "Day" - points: "Points" + day: "일" + points: "포인트" diff --git a/modules/backlogs/config/locales/crowdin/js-pt-BR.yml b/modules/backlogs/config/locales/crowdin/js-pt-BR.yml index bb6d4d398bb..0f4a3462b7c 100644 --- a/modules/backlogs/config/locales/crowdin/js-pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/js-pt-BR.yml @@ -25,5 +25,5 @@ pt-BR: properties: storyPoints: "Pontos de História" burndown: - day: "Day" - points: "Points" + day: "Dia" + points: "Pontos" diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index a6642fd3d60..337429c9d44 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -30,7 +30,7 @@ ko: finish_date: "완료 날짜" goal: "스프린트 목표" name: "스프린트 이름" - sharing: "Sharing" + sharing: "공유" sprint: duration: "스프린트 기간" work_package: diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index 35a40a042ce..2bbf0656349 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -30,7 +30,7 @@ pt-BR: finish_date: "Data de conclusão" goal: "Objetivo da sprint" name: "Nome da sprint" - sharing: "Sharing" + sharing: "Compartilhamento" sprint: duration: "Duração da sprint" work_package: diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index 7f195b6d6e9..ccc9db5d9a2 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -30,7 +30,7 @@ zh-CN: finish_date: "完成日期" goal: "冲刺目标" name: "冲刺名称" - sharing: "共享中" + sharing: "共享" sprint: duration: "冲刺持续时间" work_package: @@ -95,7 +95,7 @@ zh-CN: stories_tasks: "故事/任务" task_board: "任务板" burndown_chart: "燃尽图" - wiki: "维基百科" + wiki: "维基" properties: "属性" story_component: label_drag_story: "移动 %{name}" diff --git a/modules/budgets/config/locales/crowdin/it.yml b/modules/budgets/config/locales/crowdin/it.yml index cd052fd0889..318aed3e097 100644 --- a/modules/budgets/config/locales/crowdin/it.yml +++ b/modules/budgets/config/locales/crowdin/it.yml @@ -44,7 +44,7 @@ it: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "is not a member of the budget's project" + not_a_member_of_budget_project: "non è un membro del progetto di budget" models: budget: "Bilancio" material_budget_item: "Unità" @@ -65,28 +65,28 @@ it: budgets: widgets: budget_totals: - title: "Budget totals" - remaining_budget: "Remaining budget" - spent_budget: "Spent budget" - total_actual_costs: "Total actual costs" - total_planned_budget: "Total planned budget" + title: "Totali del budget" + remaining_budget: "Budget rimanente" + spent_budget: "Budget speso" + total_actual_costs: "Totale costi effettivi" + total_planned_budget: "Budget totale pianificato" budget_by_cost_type: - title: "Budget by cost type" + title: "Budget per tipo di costo" blankslate: - heading: "Start project controlling" - description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + heading: "Avvia il controllo del progetto" + description: "Ottieni una panoramica dei tuoi budget e costi per monitorare in modo efficiente lo stato di salute del tuo progetto" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "Dettagli del budget mancanti" + description: "Aggiungi dettagli sul tuo budget pianificato per visualizzare i dati qui" caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace}." - other: "Data aggregated from %{count} budgets included in this %{workspace}." + zero: "Nessun dato di budget." + one: "Dati aggregati da %{count} budget incluso in questo %{workspace}." + other: "Dati aggregati da %{count} budget inclusi in questo %{workspace}." caption_with_subitems: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." - other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." - view_details: "View budget details" + zero: "Nessun dato di budget." + one: "Dati aggregati da %{count} budget incluso in questo %{workspace} e nei suoi sottoelementi." + other: "Dati aggregati da %{count} budget inclusi in questo %{workspace} e nei suoi sottoelementi." + view_details: "Visualizza i dettagli del budget" events: budget: "Bilancio modificato" help_click_to_edit: "Clicca qui per modificare." diff --git a/modules/budgets/config/locales/crowdin/ko.yml b/modules/budgets/config/locales/crowdin/ko.yml index 13847fa1a8e..5743e90bbf8 100644 --- a/modules/budgets/config/locales/crowdin/ko.yml +++ b/modules/budgets/config/locales/crowdin/ko.yml @@ -83,7 +83,7 @@ ko: one: "Data aggregated from %{count} budget included in this %{workspace}." other: "Data aggregated from %{count} budgets included in this %{workspace}." caption_with_subitems: - zero: "No budget data." + zero: "예산 데이터가 없습니다." one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." view_details: "예산 세부 정보 보기" diff --git a/modules/budgets/config/locales/crowdin/pt-BR.yml b/modules/budgets/config/locales/crowdin/pt-BR.yml index 4a28b36a9b2..980c21156ff 100644 --- a/modules/budgets/config/locales/crowdin/pt-BR.yml +++ b/modules/budgets/config/locales/crowdin/pt-BR.yml @@ -44,7 +44,7 @@ pt-BR: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "is not a member of the budget's project" + not_a_member_of_budget_project: "não é membro do projeto do orçamento" models: budget: "Orçamento" material_budget_item: "Unidade" @@ -80,12 +80,12 @@ pt-BR: description: "Adicione os detalhes do orçamento planejado para visualizar os dados aqui" caption: zero: "Nenhum dado de orçamento." - one: "Data aggregated from %{count} budget included in this %{workspace}." - other: "Data aggregated from %{count} budgets included in this %{workspace}." + one: "Dados agregados de %{count} orçamento incluídos neste %{workspace}." + other: "Dados agregados de %{count} orçamentos incluídos neste %{workspace}." caption_with_subitems: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." - other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." + zero: "Sem dados de orçamento." + one: "Dados agregados de %{count} orçamento incluídos neste %{workspace} e em seus subitens." + other: "Dados agregados de %{count} orçamentos incluídos neste %{workspace} e em seus subitens." view_details: "Ver detalhes do orçamento" events: budget: "Orçamento editado" diff --git a/modules/budgets/config/locales/crowdin/zh-CN.yml b/modules/budgets/config/locales/crowdin/zh-CN.yml index 99dde4a9d20..5bc4da401e0 100644 --- a/modules/budgets/config/locales/crowdin/zh-CN.yml +++ b/modules/budgets/config/locales/crowdin/zh-CN.yml @@ -44,7 +44,7 @@ zh-CN: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "不是预算项目的成员" + not_a_member_of_budget_project: "不属于预算的项目" models: budget: "预算" material_budget_item: "单位" @@ -76,8 +76,8 @@ zh-CN: heading: "开始项目控制" description: "概括了解预算和成本,有效跟踪项目的健康状况" blankslate_zero: - heading: "预算详情缺失" - description: "添加计划预算的详情,以便在此处查看数据" + heading: "预算详细信息缺失" + description: "添加计划预算的详细信息,以便在此处查看数据" caption: zero: "无预算数据。" one: "从包含在此 %{workspace} 中的 %{count} 个预算中汇总的数据。" @@ -86,7 +86,7 @@ zh-CN: zero: "无预算数据。" one: "从包含在此 %{workspace} 及其子条目中的 %{count} 个预算中汇总的数据。" other: "从包含在此 %{workspace} 及其子条目中的 %{count} 个预算中汇总的数据。" - view_details: "查看预算详情" + view_details: "查看预算详细信息" events: budget: "预算已编辑" help_click_to_edit: "单击此处进行编辑。" diff --git a/modules/costs/config/locales/crowdin/it.yml b/modules/costs/config/locales/crowdin/it.yml index a9277fe6605..bd91938ee28 100644 --- a/modules/costs/config/locales/crowdin/it.yml +++ b/modules/costs/config/locales/crowdin/it.yml @@ -205,10 +205,10 @@ it: project_module_costs: "Tempi e costi" setting_allow_tracking_start_and_end_times: "Consenti orari di inizio e fine" setting_costs_currency: "Valuta" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "Questa è l'unità di valuta. Può essere un codice ISO a tre lettere come EUR, USD o JPY o un simbolo come €, $ o 한." + setting_costs_currency_format: "Formato valuta" + setting_costs_currency_format_prefix: "Prima del numero (ad esempio, EUR 100)" + setting_costs_currency_format_suffix: "Dopo il numero (ad esempio, 100 EUR)" setting_enforce_tracking_start_and_end_times: "Richiede orari di inizio e di fine" setting_enforce_without_allow: "Non è possibile richiedere orari di inizio e fine senza consentirli" setting_allow_tracking_start_and_end_times_caption: "Consente di inserire gli orari di inizio e di fine durante la registrazione dell'orario." @@ -232,12 +232,12 @@ it: costs: widgets: actual_costs: - title: "Actual costs by month" + title: "Costi effettivi per mese" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." - action: "Log time" - view_details: "View actual costs details" + heading: "Inizia a monitorare tempi e costi" + description: "Ottieni una panoramica dei costi e dei tempi registrati per monitorare l'avanzamento del tuo progetto. Assicurati che i pacchetti di lavoro siano associati al budget corretto." + action: "Registra tempo" + view_details: "Visualizza i dettagli dei costi effettivi" ee: features: time_entry_time_restrictions: Richiedi il tracciamento esatto dell'orario diff --git a/modules/costs/config/locales/crowdin/zh-CN.yml b/modules/costs/config/locales/crowdin/zh-CN.yml index e7d36a35575..f221761a2e3 100644 --- a/modules/costs/config/locales/crowdin/zh-CN.yml +++ b/modules/costs/config/locales/crowdin/zh-CN.yml @@ -228,12 +228,12 @@ zh-CN: costs: widgets: actual_costs: - title: "每月实际成本" + title: "实际成本(按月)" blankslate: heading: "开始跟踪时间和成本" description: "概括了解成本和记录的时间,以便监控项目进度。确保工作包与正确的预算相关联。" action: "记录时间" - view_details: "查看实际成本详情" + view_details: "查看实际成本详细信息" ee: features: time_entry_time_restrictions: 需要准确的时间跟踪 diff --git a/modules/documents/config/locales/crowdin/it.yml b/modules/documents/config/locales/crowdin/it.yml index a982b822a5a..71b63affccf 100644 --- a/modules/documents/config/locales/crowdin/it.yml +++ b/modules/documents/config/locales/crowdin/it.yml @@ -24,7 +24,7 @@ it: name: "Documenti OpenProject" description: "Un plugin OpenProject per consentire la creazione di documenti nei progetti." attributes: - collaborative_editing_hocuspocus_url: "Hocuspocus server URL" + collaborative_editing_hocuspocus_url: "URL del server Hocuspocus" activerecord: errors: models: @@ -123,8 +123,8 @@ it: some_unwritable: Alcuni valori sono configurati tramite variabili di ambiente e non possono essere modificati qui. hocuspocus_server_url: label: "URL del server Hocuspocus" - caption: "The WebSocket address of a working Hocuspocus server." - invalid_scheme: "Must use a WebSocket protocol (ws:// or wss://)." + caption: "L'indirizzo WebSocket di un server Hocuspocus funzionante." + invalid_scheme: "Deve usare un protocollo WebSocket (ws:// o wss://)." hocuspocus_server_secret: label: "Segreto client" caption: "Incolla il segreto fornito dal server Hocuspocus." diff --git a/modules/grids/config/locales/crowdin/js-it.yml b/modules/grids/config/locales/crowdin/js-it.yml index c0807175d1a..6dd68fb2f27 100644 --- a/modules/grids/config/locales/crowdin/js-it.yml +++ b/modules/grids/config/locales/crowdin/js-it.yml @@ -2,12 +2,12 @@ it: js: grid: add_widget: 'Aggiungi widget' - widget_menu_label: 'Show menu options for %{widgetName} widget' + widget_menu_label: 'Mostra le opzioni del menu per il widget %{widgetName}' remove: 'Rimuovi widget' configure: 'Configura il widget' widgets: missing_permission: "Non hai i permessi necessari per visualizzare questo widget." - not_available: "This widget is currently unavailable." + not_available: "Questo widget non è attualmente disponibile." custom_text: title: 'Testo personalizzato' documents: diff --git a/modules/grids/config/locales/crowdin/js-ko.yml b/modules/grids/config/locales/crowdin/js-ko.yml index 79eb4fe3d07..f538144b35c 100644 --- a/modules/grids/config/locales/crowdin/js-ko.yml +++ b/modules/grids/config/locales/crowdin/js-ko.yml @@ -2,12 +2,12 @@ ko: js: grid: add_widget: '위젯 추가' - widget_menu_label: 'Show menu options for %{widgetName} widget' + widget_menu_label: '%{widgetName} 위젯의 메뉴 옵션 표시' remove: '위젯 제거' configure: '위젯 구성' widgets: missing_permission: "이 위젯을 보는 데 필요한 권한이 없습니다." - not_available: "This widget is currently unavailable." + not_available: "이 위젯은 현재 사용할 수 없습니다." custom_text: title: '사용자 지정 텍스트' documents: diff --git a/modules/grids/config/locales/crowdin/js-pt-BR.yml b/modules/grids/config/locales/crowdin/js-pt-BR.yml index 967cde12cf3..a7b0f998611 100644 --- a/modules/grids/config/locales/crowdin/js-pt-BR.yml +++ b/modules/grids/config/locales/crowdin/js-pt-BR.yml @@ -2,12 +2,12 @@ pt-BR: js: grid: add_widget: 'Adicionar widget' - widget_menu_label: 'Show menu options for %{widgetName} widget' + widget_menu_label: 'Exibir opções de menu para o widget %{widgetName}' remove: 'Remover widget' configure: 'Configurar widget' widgets: missing_permission: "Você não tem as permissões necessárias para visualizar este widget." - not_available: "This widget is currently unavailable." + not_available: "Este widget não está disponível no momento." custom_text: title: 'Texto personalizado' documents: diff --git a/modules/meeting/config/locales/crowdin/it.yml b/modules/meeting/config/locales/crowdin/it.yml index 7ecc9bb9f13..65cfe8e20cb 100644 --- a/modules/meeting/config/locales/crowdin/it.yml +++ b/modules/meeting/config/locales/crowdin/it.yml @@ -60,7 +60,7 @@ it: end_date: "Data di scadenza" iterations: "Ricorrenze" recurring_meeting_interim_response: - start_time: "Start time" + start_time: "Ora di inizio" meeting_participant: invited: "Invitato" attended: "Ha partecipato" @@ -68,12 +68,12 @@ it: errors: models: meeting_participant: - user_invalid: "is not a valid participant." + user_invalid: "non è un partecipante valido." meeting_agenda_item: - section_not_belong_to_meeting: "Section does not belong to the same meeting." - user_invalid: "is not a valid participant." + section_not_belong_to_meeting: "La sezione non appartiene alla stessa riunione." + user_invalid: "non è un partecipante valido." recurring_meeting_interim_response: - not_an_occurrence: "is not a valid occurrence time for this recurring meeting" + not_an_occurrence: "non è un orario di occorrenza valido per questa riunione ricorrente" recurring_meeting: must_cover_existing_meetings: one: "C'è una riunione aperta nella serie che non è coperta dal nuovo programma. Adatta il programma per includere tutte le riunioni esistenti." @@ -118,15 +118,15 @@ it: error_notification_with_errors: "Impossibile inviare notifica. Non è possibile notificare i seguenti destinatari: %{recipients}" label_meeting: "Riunione" label_meeting_plural: "Riunioni" - label_meeting_templates: "Templates" - label_meeting_template: "Template" - label_meeting_template_new: "New template" - label_meeting_template_create: "Create template" - label_meeting_template_delete: "Delete template" - label_meeting_template_edit: "Edit template" - label_meeting_create_from_template: "Create meeting from template" + label_meeting_templates: "Modelli" + label_meeting_template: "Modello" + label_meeting_template_new: "Nuovo modello" + label_meeting_template_create: "Crea modello" + label_meeting_template_delete: "Elimina modello" + label_meeting_template_edit: "Modifica modello" + label_meeting_create_from_template: "Crea una riunione da un modello" label_meeting_new: "Nuova riunione" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_meeting_template_select: "Seleziona un modello per copiare automaticamente i suoi elementi dell'ordine del giorno" label_meeting_new_dynamic: "Nuova riunione una tantum" label_meeting_new_recurring: "Nuova riunione ricorrente" label_meeting_create: "Crea riunione" @@ -246,9 +246,9 @@ it: header: "Cancellata: riunione \"%{title}\"" header_occurrence: "Cancellata: occorrenza della riunione \"%{title}\"" header_series: "Cancellata: serie di riunioni \"%{title}\"" - 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" + summary_occurrence: "Un'occorrenza di '%{title}' è stata annullata da %{actor}, oppure ti hanno rimosso come partecipante" + summary_series: "La serie di riunioni '%{title}' è stata annullata da %{actor} oppure ti hanno rimosso come partecipante" + summary: "'%{title}' è stata annullata da %{actor} oppure ti hanno rimosso come partecipante" date_time: "Data/ora programmata" participant_added: header: "Riunione '%{title}' - Partecipante aggiunto" @@ -262,7 +262,7 @@ it: summary_series: "%{actor} ha rimosso %{participant} dalla serie di riunioni '%{title}'" ended: header_series: "Terminata: serie di riunioni \"%{title}\"" - summary_series: "Meeting series '%{title}' has been ended by %{actor}" + summary_series: "La serie di riunioni '%{title}' è stata conclusa da %{actor}" updated: header: "La riunione \"%{title}\" è stata aggiornata" summary: "La riunione \"%{title}\" è stata aggiornata da %{actor}" @@ -288,8 +288,8 @@ it: confirmation_message_html: > Questa azione è irreversibile. Procedi con cautela. template: - title: "Delete template" - heading: "Delete this template?" + title: "Elimina modello" + heading: "Eliminare questo modello?" occurrence: title: "Cancella l'occorrenza della riunione" heading: "Cancellare questa occorrenza della riunione?" @@ -489,7 +489,7 @@ it: end_series_dialog: title: "Termina serie di riunioni" notice_successful_notification: "Aggiornamento del calendario via e-mail inviato a tutti i partecipanti" - notice_meeting_template_created: "Template successfully created" + notice_meeting_template_created: "Modello creato correttamente" notice_timezone_missing: Nessun fuso orario è impostato e la %{zone} è un requisito necessario. Per scegliere il tuo fuso orario, fare clic qui. notice_meeting_updated: "Questa pagina è stata aggiornata da qualcun altro. Ricarica per visualizzare le modifiche." permission_create_meetings: "Creare riunioni" @@ -504,8 +504,8 @@ it: text_duration_in_hours: "Durata in ore" text_in_hours: "in ore" text_meeting_agenda_for_meeting: 'ordine del giorno della riunione "%{meeting}"' - text_meeting_template_blank_slate_heading: "There are no templates to display" - text_meeting_template_blank_slate: "You can create a new template for one-time meetings" + text_meeting_template_blank_slate_heading: "Non ci sono modelli da visualizzare" + text_meeting_template_blank_slate: "È possibile creare un nuovo modello per riunioni una tantum" text_meeting_series_end_early_heading: "Cancellare le occorrenze future?" text_meeting_series_end_early: "La chiusura della serie cancellerà tutte le future occorrenze di riunioni aperte o programmate" text_meeting_closing_are_you_sure: "Vuoi davvero chiudere l'agenda di questa riunione?" @@ -551,8 +551,8 @@ it: label_agenda_item_move_up: "Sposta su" label_agenda_item_move_down: "Sposta giu" label_agenda_item_duplicate: "Duplica" - label_agenda_item_duplicate_in_next: "Duplicate in next meeting" - label_agenda_item_duplicate_in_next_title: "Duplicate in next meeting?" + label_agenda_item_duplicate_in_next: "Duplica nella prossima riunione" + 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_work_package_add: "Aggiungi macro-attività" @@ -611,9 +611,9 @@ it: text_meeting_in_progress_dropdown_description: "Documenta i risultati, come le esigenze informative o le decisioni prese durante la riunione." text_meeting_closed_dropdown_description: "Questa riunione è chiusa. Non puoi più modificare i punti all'ordine del giorno." text_meeting_draft_banner: "Al momento sei in modalità bozza. Questa riunione non invierà alcun aggiornamento del calendario né inviti, anche in caso di modifica dei dettagli della riunione o di aggiunta o rimozione di partecipanti." - 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." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_banner: "Stai modificando un modello di riunione. Puoi utilizzare questo modello per creare riunioni singole con un ordine del giorno predefinito. Le modifiche non influiranno sulle riunioni già create." + text_onetime_meeting_template_empty_heading: "Questo modello di riunione è vuoto" + text_onetime_meeting_template_description: "Aggiungi a questo modello i punti all'ordine del giorno e gli allegati. Saranno inclusi in ogni riunione basata su questo modello." text_exit_draft_mode_dialog_title: "Aprire questa riunione e inviare gli inviti?" text_exit_draft_mode_dialog_subtitle: "Non può tornare alla modalità bozza una volta programmata una riunione." text_exit_draft_mode_dialog_template_title: "Aprire la prima occorrenza di questa serie di riunioni?" diff --git a/modules/meeting/config/locales/crowdin/ko.yml b/modules/meeting/config/locales/crowdin/ko.yml index 4e574e8ad72..4aa067f248d 100644 --- a/modules/meeting/config/locales/crowdin/ko.yml +++ b/modules/meeting/config/locales/crowdin/ko.yml @@ -59,7 +59,7 @@ ko: end_date: "종료 날짜" iterations: "항목" recurring_meeting_interim_response: - start_time: "Start time" + start_time: "시작 시간" meeting_participant: invited: "초대됨" attended: "참석함" diff --git a/modules/meeting/config/locales/crowdin/pt-BR.yml b/modules/meeting/config/locales/crowdin/pt-BR.yml index f385ab6aa82..e5860858f26 100644 --- a/modules/meeting/config/locales/crowdin/pt-BR.yml +++ b/modules/meeting/config/locales/crowdin/pt-BR.yml @@ -60,7 +60,7 @@ pt-BR: end_date: "Data de término" iterations: "Ocorrências" recurring_meeting_interim_response: - start_time: "Start time" + start_time: "Hora de início" meeting_participant: invited: "Convidado" attended: "Participou" @@ -73,7 +73,7 @@ pt-BR: section_not_belong_to_meeting: "A seção não pertence à mesma reunião." user_invalid: "não é um participante válido." recurring_meeting_interim_response: - not_an_occurrence: "is not a valid occurrence time for this recurring meeting" + not_an_occurrence: "não é um horário válido para esta reunião recorrente" recurring_meeting: must_cover_existing_meetings: one: "Há uma reunião aberta na série que não está contemplada na nova programação. Ajuste a programação para incluir todas as reuniões existentes." @@ -126,7 +126,7 @@ pt-BR: label_meeting_template_edit: "Editar modelo" label_meeting_create_from_template: "Criar reunião a partir de um modelo" label_meeting_new: "Nova Reunião" - caption_meeting_template_select: "Selecione um modelo para copiar automaticamente os itens da agenda" + caption_meeting_template_select: "Selecione um modelo para copiar automaticamente os itens da pauta" label_meeting_new_dynamic: "Nova reunião única" label_meeting_new_recurring: "Nova reunião recorrente" label_meeting_create: "Criar reunião" @@ -207,7 +207,7 @@ pt-BR: no_participants: "Sem participantes" show_all: "Mostrar todos" text: - template: "Esses participantes serão adicionados automaticamente a todas as reuniões futuras à medida que forem agendadas." + template: "Esses participantes serão convidados automaticamente para todas as futuras reuniões à medida que forem criadas." manage_participants: "Pesquisar e adicionar membros do projeto como participantes desta reunião." search_for_members: "Pesquisar membros do projeto" blankslate: @@ -215,7 +215,7 @@ pt-BR: description: "Ainda não há participantes." attachments: template: "Esses arquivos anexados serão adicionados a todas as reuniões futuras da série." - text: "Os arquivos anexados podem ser acessados por todos os participantes da reunião. Além disso, você pode simplesmente arrastá-los e soltá-los nas anotações do item da agenda." + text: "Os arquivos anexados estão disponíveis para todos os participantes da reunião. Você também pode arrastá-los e soltá-los nas anotações dos itens da pauta." copy: title: "Copiar reunião: %{title}" attachments: "Copiar anexos" @@ -389,8 +389,8 @@ pt-BR: total_items: "%{current} de %{total}" previous: "Anterior" next: "Próximo" - no_items: "Sem itens na agenda" - no_items_flash: "Não há itens na agenda para apresentar." + no_items: "Sem itens na pauta" + no_items_flash: "Não há itens na pauta para apresentar." ical_response: update_failed: "Não foi possível atualizar status de participação." meeting_not_found: "Reunião não encontrada por UID." @@ -556,7 +556,7 @@ pt-BR: label_agenda_item_add_notes: "Adicionar anotações" label_agenda_item_add_outcome: "Adicionar resultado" label_agenda_item_work_package_add: "Adicionar pacote de trabalho" - label_agenda_item_work_package: "Pacote de trabalho do item da agenda" + label_agenda_item_work_package: "Pacote de trabalho do Item da pauta" label_section_rename: "Renomear seção" label_agenda_outcome: "Resultado" label_agenda_new_outcome: "Novo resultado" @@ -583,8 +583,8 @@ pt-BR: label_series_backlog_clear_title: "Limpar backlog da série?" text_series_backlog_clear_description: > Isso removerá todos os itens do backlog da série, que é compartilhado com todas as reuniões desta série. Tem certeza de que deseja continuar? Essa ação é irreversível. - text_agenda_item_title: 'Item da agenda "%{title}"' - text_agenda_work_package_deleted: "Item da agenda para o pacote de trabalho excluído" + text_agenda_item_title: 'Item da pauta "%{title}"' + text_agenda_work_package_deleted: "Item da pauta para o pacote de trabalho excluído" text_deleted_agenda_item: "Item da agenda excluído" label_initial_meeting_details: "Reunião" label_meeting_details: "Detalhes da reunião" @@ -603,7 +603,7 @@ pt-BR: label_meeting_close_action: "Fechar reunião" label_meeting_in_progress_action: "Iniciar reunião" label_meeting_open_action: "Reunião aberta" - text_meeting_draft_description: "Prepare sua agenda no modo rascunho. Esta reunião não enviará nenhuma atualização de calendário ou convite, mesmo que você altere os detalhes da reunião ou adicione/remova participantes." + text_meeting_draft_description: "Prepare sua pauta em modo rascunho. Esta reunião não enviará nenhuma atualização de calendário ou convites, mesmo que você altere os detalhes da reunião ou adicione/remova participantes." text_meeting_open_description: "Você pode adicionar ou remover participantes e itens da agenda. Assim que a agenda estiver pronta, marque-a como \"Em andamento\" para registrar os resultados." text_meeting_closed_description: "Esta reunião está fechada. Você não pode mais adicionar/remover itens da agenda." text_meeting_in_progress_description: "Você pode modificar a agenda, registrar os resultados de cada item e acompanhar a presença dos participantes. Após a conclusão da reunião, você pode marcá-la como encerrada para bloqueá-la." @@ -611,11 +611,11 @@ pt-BR: text_meeting_in_progress_dropdown_description: "Registre os resultados como solicitações de informação ou decisões tomadas durante a reunião." text_meeting_closed_dropdown_description: "Esta reunião está encerrada. Já não é possível modificar os pontos da ordem de trabalhos ou os resultados." text_meeting_draft_banner: "Você está no modo rascunho. Esta reunião não enviará nenhuma atualização de calendário ou convite, mesmo que você altere os detalhes da reunião ou adicione/remoca participantes." - text_onetime_meeting_template_banner: "Você está editando um modelo de reunião. Use este modelo para criar reuniões únicas com uma agenda predefinida. As alterações não afetarão reuniões já criadas." + text_onetime_meeting_template_banner: "Você está editando um modelo de reunião. Pode usar este modelo para criar reuniões pontuais com uma pauta predefinida. Alterações não afetarão reuniões já criadas." text_onetime_meeting_template_empty_heading: "Este modelo de reunião está vazio" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_description: "Adicione itens da pauta e anexos a este modelo. Eles serão incluídos em todas as reuniões baseadas neste modelo." text_exit_draft_mode_dialog_title: "Abrir esta reunião e enviar convites?" - text_exit_draft_mode_dialog_subtitle: "Você não pode retornar ao modo rascunho após você agendar a reunião." + text_exit_draft_mode_dialog_subtitle: "Não é possível voltar ao modo rascunho depois de agendar uma reunião." text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?" text_exit_draft_mode_dialog_template_subtitle: "Você não pode retornar ao modo rascunho após isto." text_meeting_not_editable_anymore: "A reunião não pode mais ser editada." @@ -629,17 +629,17 @@ pt-BR: text_add_work_package_to_meeting_form: "O pacote de trabalho será adicionado à reunião selecionada ou ao backlog como um item da agenda." text_add_work_package_to_meeting_description: "Um pacote de trabalho pode ser adicionado a uma ou várias reuniões para discussão. Quaisquer anotações sobre ele também ficarão visíveis aqui." text_agenda_item_no_notes: "Nenhum comentário foi feito" - text_agenda_item_not_editable_anymore: "Este item da agenda não pode mais ser editado." + text_agenda_item_not_editable_anymore: "Este item da pauta não pode mais ser editado." text_agenda_item_move_next_meeting: "Este item será transferido para a próxima reunião em %{date} às %{time}." - text_agenda_item_moved_to_next_meeting: "Item da agenda movido para a próxima reunião em %{date}" - text_agenda_item_duplicate_in_next_meeting: "Tem certeza de que deseja adicionar uma cópia deste item da agenda à próxima reunião, em %{date} às %{time}? Os resultados não serão duplicados." - text_agenda_item_duplicated_in_next_meeting: "Item da agenda duplicado na próxima reunião, em %{date}" + text_agenda_item_moved_to_next_meeting: "Item da pauta movido para a próxima reunião em %{date}" + text_agenda_item_duplicate_in_next_meeting: "Tem certeza de que deseja adicionar uma cópia deste item da pauta à próxima reunião, em %{date} às %{time}? Os resultados não serão duplicados." + text_agenda_item_duplicated_in_next_meeting: "Item da pauta duplicado na próxima reunião, em %{date}" text_work_package_has_no_upcoming_meeting_agenda_items: "Este pacote de trabalho ainda não está programado na agenda de uma reunião futura." text_agenda_item_no_available_occurrence: "Todas as ocorrências futuras foram canceladas." text_agenda_item_dialog_skipping_cancelled_one: "Observação: Ignorar a ocorrência cancelada em %{date}." text_agenda_item_dialog_skipping_cancelled_many: "Observação: Ignorar %{count} ocorrências canceladas." text_work_package_add_to_meeting_hint: 'Use o botão "Adicionar à reunião" para adicionar este pacote de trabalho a uma próxima reunião.' - text_work_package_has_no_past_meeting_agenda_items: "Este pacote de trabalho não foi adicionado como item da agenda em uma reunião anterior." + text_work_package_has_no_past_meeting_agenda_items: "Este pacote de trabalho não foi adicionado como item da pauta em uma reunião anterior." text_email_updates_muted: "As atualizações de calendário por e-mail estão silenciadas. Os participantes não receberão convites atualizados por e-mail quando você fizer alterações." text_email_updates_enabled: "As atualizações de calendário por e-mail estão habilitados. Todos os participantes receberão convites atualizados por e-mail quando você fizer alterações." my_account: diff --git a/modules/meeting/config/locales/crowdin/zh-CN.yml b/modules/meeting/config/locales/crowdin/zh-CN.yml index b09fd6a1519..31d7c1e89fb 100644 --- a/modules/meeting/config/locales/crowdin/zh-CN.yml +++ b/modules/meeting/config/locales/crowdin/zh-CN.yml @@ -69,10 +69,10 @@ zh-CN: meeting_participant: user_invalid: "不是有效的参与者。" meeting_agenda_item: - section_not_belong_to_meeting: "该部分不属于同一次会议。" + section_not_belong_to_meeting: "该部分不属于同一个会议。" user_invalid: "不是有效的参与者。" recurring_meeting_interim_response: - not_an_occurrence: "不是此定期会议的有效发生时间" + not_an_occurrence: "不是此定期会议的有效事件时间" recurring_meeting: must_cover_existing_meetings: one: "该系列会议中有一次公开会议未列入新时间表。请调整时间表,将会议包含在内。" @@ -118,7 +118,7 @@ zh-CN: label_meeting_plural: "会议" label_meeting_templates: "模板" label_meeting_template: "模板" - label_meeting_template_new: "新模板" + label_meeting_template_new: "新建模板" label_meeting_template_create: "创建模板" label_meeting_template_delete: "删除模板" label_meeting_template_edit: "编辑模板" @@ -606,7 +606,7 @@ zh-CN: text_meeting_draft_banner: "您目前处于草稿模式。即使您更改了会议详细信息或添加/移除了参与者,此会议也不会发送任何日历更新或邀请。" text_onetime_meeting_template_banner: "您当前正在编辑会议模板。您可以使用此模板创建具有预定义议程的一次性会议。更改不会影响已创建的会议。" text_onetime_meeting_template_empty_heading: "此会议模板为空" - text_onetime_meeting_template_description: "请将议程条目和附件添加到此模板。所有基于此模板的会议都将包含这些内容。" + text_onetime_meeting_template_description: "将议程条目和附件添加到此模板。所有基于此模板的会议都将包含这些内容。" text_exit_draft_mode_dialog_title: "是否打开此会议并发送邀请?" text_exit_draft_mode_dialog_subtitle: "会议安排完成后,您将无法返回到草稿模式。" text_exit_draft_mode_dialog_template_title: "是否打开此会议系列的第一个会议?" From af3f45f765f0b5311ef82fd4adef91adc48d4b50 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Mon, 9 Mar 2026 03:50:53 +0000 Subject: [PATCH 179/334] update locales from crowdin [ci skip] --- config/locales/crowdin/es.yml | 400 +++++++++--------- config/locales/crowdin/th.yml | 4 +- .../auth_saml/config/locales/crowdin/th.yml | 16 +- .../backlogs/config/locales/crowdin/es.yml | 36 +- .../backlogs/config/locales/crowdin/js-es.yml | 4 +- .../backlogs/config/locales/crowdin/th.yml | 156 +++---- .../backlogs/config/locales/crowdin/uk.yml | 18 +- modules/budgets/config/locales/crowdin/es.yml | 36 +- modules/budgets/config/locales/crowdin/th.yml | 28 +- modules/costs/config/locales/crowdin/es.yml | 18 +- modules/costs/config/locales/crowdin/th.yml | 128 +++--- .../documents/config/locales/crowdin/es.yml | 6 +- .../grids/config/locales/crowdin/js-es.yml | 4 +- modules/meeting/config/locales/crowdin/es.yml | 44 +- modules/meeting/config/locales/crowdin/fr.yml | 5 +- modules/meeting/config/locales/crowdin/it.yml | 5 +- modules/meeting/config/locales/crowdin/ko.yml | 5 +- .../meeting/config/locales/crowdin/pt-BR.yml | 5 +- .../meeting/config/locales/crowdin/zh-CN.yml | 5 +- .../reporting/config/locales/crowdin/th.yml | 2 +- .../config/locales/crowdin/th.yml | 8 +- .../xls_export/config/locales/crowdin/th.yml | 16 +- 22 files changed, 477 insertions(+), 472 deletions(-) diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 7f8d9ecb084..b1840159515 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -83,9 +83,9 @@ es: confirmation: "¿Seguro que desea eliminar este token de soporte de la edición Enterprise?" create_dialog: title: "Añadir token de Enterprise" - type_token_text: "Your Enterprise token text" + type_token_text: "El texto de su Enterprise token" token_placeholder: "Pegue su token de soporte de la edición Enterprise aquí" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "Para obtener más información sobre cómo activar la edición Enterprise, consulte nuestra [documentación](docs_url)." add_token: "Cargue el token de soporte de Enterprise" replace_token: "Reemplace su token de soporte actual" order: "Solicitar Enterprise On-Premises" @@ -111,183 +111,183 @@ es: text: "Las acciones individuales de un usuario (como actualizar dos veces un paquete de trabajo) se combinan en una sola acción si la diferencia de antigüedad es inferior al intervalo de tiempo especificado. Se mostrarán como una sola acción en la aplicación. También se retrasarán las notificaciones por la misma cantidad de tiempo, lo que reducirá el número de correos electrónicos enviados y causará también que se retrase el %{webhook_link}." link: "webhook" import: - title: "Import" + title: "Importar" jira: - title: "Jira Import" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + title: "Importación desde Jira" + description: "Utilice esta herramienta para importar datos desde su instancia de Jira. Puede configurar varios hosts de Jira y elegir qué importar en cada ejecución de importación." errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "No se puede eliminar el host de Jira con importaciones existentes" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + title: "Aún no se han configurado los hosts de Jira" + description: "Configure un host de Jira para comenzar a importar elementos desde Jira a esta instancia de OpenProject." configuration: - title: "Jira configuration" - new: "New configuration" + title: "Configuración de Jira" + new: "Nueva configuración" banner: - title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + title: "Importación limitada" + description: "Esta herramienta de importación se encuentra actualmente en fase beta y solo puede importar datos básicos: proyectos, incidencias (nombre, título, descripción, archivos adjuntos), usuarios (nombre, correo electrónico, pertenencia a proyectos), estados y tipos. No puede importar flujos de trabajo, campos personalizados, relaciones entre incidencias ni permisos. Actualmente solo es compatible con las versiones 10.x y 11.x de Jira Server/Data Center. Por el momento, no es compatible con instancias en la nube." form: fields: - name: "Name" - url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + name: "Nombre" + url: "URL del servidor/Jira Data Center" + personal_access_token: "Token de acceso personal" + button_add: "Agregar configuración" + button_save: "Guardar configuración" + button_test: "Probar configuración" + button_delete_token: "Eliminar token" + delete_token_confirm: "¿Seguro que desea eliminar el token? Esto desactivará la conexión a Jira." + label_testing: "Probando la configuración..." + token_deleted: "Token eliminado correctamente." test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + success: "Se ha conectado con éxito a %{server} (versión %{version})" + failed: "Error de conexión: no se ha podido recuperar la información del servidor" + error: "Se ha producido un error inesperado al probar la conexión" + connection_error: "Error de conexión: %{message}" + parse_error: "Error al analizar la respuesta del servidor. Puede que el servidor no sea una instancia válida de Jira." + api_error: "La API de Jira ha devuelto el estado de error %{status}. Compruebe la URL de su instancia de Jira y el token de la API." + token_error: "Token API no válido. Compruebe sus credenciales en la configuración." + missing_credentials: "Proporcione la URL y el token de acceso personal para probar la conexión" + invalid_url: "Proporcione una URL válida" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "No se pudo conectar al servidor de Jira: %{message}" + connection_timeout: "La conexión con el servidor de Jira ha expirado: %{message}" + parse_error: "Error al analizar la respuesta de la API de Jira: %{message}" + api_error: "La API de Jira ha devuelto el estado de error %{status}" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" - label_ago: "%{amount} ago" + projects: "Proyectos" + last_change: "Última modificación" + added: "Añadido" + label_ago: "Hace %{amount}" run: - title: "Import run" - history: "History" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + title: "Importar ejecución" + history: "Historial" + remove_error: "No se puede eliminar una importación de Jira mientras se está ejecutando" + import_blocked_error: "Actualmente hay otra importación de Jira en curso o pendiente de revisión. Complétela o revierta antes de iniciar una nueva importación." blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "Aún no se han configurado ejecuciones de importación" + description: "Cree una ejecución de importación para comenzar a importar información de esta instancia de Jira" 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" + description: "Puede importar diferentes conjuntos de datos con cada ejecución de importación. Se puede deshacer una ejecución de importación inmediatamente después en el modo de revisión, pero no después de finalizarla." + button_import_run: "Importar ejecución" + button_edit_configuration: "Editar configuración" status: - initial: "Start" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" - configuring: "Select scope" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" + initial: "Inicio" + instance_meta_fetching: "Obteniendo metadatos" + instance_meta_error: "Error al obtener metadatos" + instance_meta_done: "Metadatos obtenidos" + configuring: "Seleccionar ámbito" + projects_meta_fetching: "Obteniendo datos del proyecto" + projects_meta_error: "Error al obtener los datos del proyecto" + projects_meta_done: "Información recopilada" + importing: "En curso" + import_error: "Error durante la importación" imported: "Review mode" - reverting: "Reverting" - revert_error: "Error during revert" - reverted: "Reverted" - completed: "Completed" + reverting: "Revirtiendo" + revert_error: "Error durante la reversión" + reverted: "Revertido" + completed: "Completado" wizard: - button_retry: "Retry" + button_retry: "Reintentar" parts: projects: - one: "1 project" - other: "%{count} projects" + one: "1 proyecto" + other: "%{count} projectos" issues: - one: "1 issue" - other: "%{count} issues" + one: "1 incidencia" + other: "%{count} incidencias" work_packages: - one: "1 work package" - other: "%{count} work packages" + one: "1 paquete de trabajo" + other: "%{count} paquetes de trabajo" types: - one: "1 type" - other: "%{count} types" + one: "1 tipo" + other: "%{count} tipos" statuses: - one: "1 status" - other: "%{count} statuses" + one: "1 estado" + other: "%{count} estados" users: - one: "1 user" - other: "%{count} users" + one: "1 usuario" + other: "%{count} usuarios" groups: fetch: - title: "Get base data" + title: "Obtener datos base" groups_and_users: - title: "Groups and Users" + title: "Grupos y usuarios" configuration: - title: "Configure import" + title: "Configurar importación" confirming: - title: "Confirm and import" + title: "Confirmar e importar" review: - title: "Review import" + title: "Revisar importación" sections: fetch_data: - title: "Fetch instance meta data" - caption_done: "Completed" - description: "Check what data is available for import in the host Jira instance." - button_fetch: "Check available data" - label_progress: "Fetching data from Jira..." + title: "Obtener metadatos de instancia" + caption_done: "Completado" + description: "Compruebe qué datos están disponibles para importar en la instancia de Jira host." + button_fetch: "Compruebe los datos disponibles" + label_progress: "Obteniendo datos de Jira..." groups_and_users: - title: "Groups and Users" + title: "Grupos y usuarios" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" - 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 URL 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_available_data: "Available data" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" - button_continue: "Continue" - 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..." + title: "Ámbito de importación" + caption: "Elija lo que desea importar en OpenProject" + caption_done: "Completado" + label_info: "Tenga en cuenta que esta herramienta de importación se encuentra en fase beta y no puede importar todos los tipos de datos. A continuación se ofrece un resumen de lo que la URL de la instancia de host de Jira ofrece para importar y lo que esta herramienta puede importar en este momento." + description: "Seleccione los datos que desea importar de entre los datos disponibles obtenidos de la instancia de host de Jira." + label_available_data: "Datos disponibles" + label_not_available_data: "No disponible para la importación" + button_select_projects: "Seleccionar proyectos para importar" + button_continue: "Continuar" + label_import: "Seleccione los proyectos que desea importar." + button_select: "Seleccionar proyectos" + label_selected_data: "Datos seleccionados para la importación" + label_progress: "Obteniendo datos de Jira..." elements: - relations: "Relations between issues" - workflows: "Project-level workflows" - users: "Users" + relations: "Relaciones entre incidencias" + workflows: "Flujos de trabajo a nivel de proyecto" + users: "Usuarios" sprints: "Sprints" - schemes: "Schemas" - permissions: "User, group and project permissions" + schemes: "Esquemas" + permissions: "Permisos de usuario, grupo y proyecto" confirm_import: - title: "Import data" - caption: "Review your import settings and start the import" - caption_done: "Completed" - label_available_data: "Available data to import" - 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" + title: "Importar datos" + caption: "Revise la configuración de importación y comience la importación" + caption_done: "Completado" + label_available_data: "Datos disponibles para importar" + button_start: "Iniciar importación" + description: "Está a punto de iniciar una importación con la siguiente configuración." + label_progress: "Importando..." + label_import_data: "Importando" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." - label_results: "Imported" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: 'The imported data is currently in review mode. Click "Finalize import" to make the import permanent or "Revert import" to undo all changes made in this import run.' - label_finalizing_progress: "Finalizing import..." - label_finalized: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + title: "Importar resultados de ejecución" + caption: "Revise o revierta la importación" + info: "Importación ejecutada con éxito." + label_results: "Importado" + label_revert: "Revertir importación" + button_revert: "Revertir importación" + button_done: "Finalizar importación" + preview_description: 'Los datos importados se encuentran actualmente en modo de revisión. Haga clic en «Finalizar importación» para que la importación sea permanente o en «Revertir importación» para deshacer todos los cambios realizados en esta importación.' + label_finalizing_progress: "Finalizando importación..." + label_finalized: "Importación finalizada." + label_revert_progress: "Revirtiendo importación..." + label_reverted: "Importación revertida." select_dialog: - filter_projects: "Filter by text" + filter_projects: "Filtrar por texto" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." - confirm: "I understand that this reversion will delete data permanently" + title: "¿Revertir esta importación de forma permanente?" + description: "Esto eliminará todos los objetos importados (incluidos proyectos completos) incluso si hubo actividad de usuario en esos proyectos después de la importación en OpenProject." + confirm: "Entiendo que esta reversión eliminará los datos de forma permanente" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + title: "¿Finalizar esta importación?" + description: "Una vez finalizada, esta importación ya no se podrá revertir. Todos los datos importados se importarán de forma permanente." + confirm: "Entiendo que esta acción no se puede deshacer" + confirm_button: "Entendido" select_projects: - title: "Select projects" + title: "Seleccione los proyectos" 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." + description: "El protocolo de contexto de modelo (MCP, por sus siglas en inglés) permite a los agentes de IA proporcionar a sus usuarios herramientas y recursos expuestos por esta instancia de OpenProject. Esta función aún se encuentra en fase beta." resources_heading: "Recursos" - resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_description: "OpenProject implementa los siguientes recursos. Cada uno de ellos puede habilitarse, renombrarse y describirse como usted desee. Para más información, consulte la [documentación sobre recursos del MCP](docs_url)." resources_submit: "Actualizar recursos" tools_heading: "Herramientas" tools_description: "OpenProject implementa las siguientes herramientas. Cada una de ellas puede habilitarse, renombrarse y describirse como usted desee. Para más información, consulte la [documentación sobre herramientas del MCP](docs_url)." @@ -296,17 +296,17 @@ es: success: "Las configuraciones del MCP se actualizaron correctamente." server_form: description_caption: "Cómo se describirá el servidor del MCP a otras aplicaciones que se conecten a él." - title_caption: "A short title shown to applications that connect to the MCP server." - tool_response_format: "Tool response format" - tool_response_format_content_only_label: "Content only" + title_caption: "Un título corto que se muestra a las aplicaciones que se conectan al servidor del MCP." + tool_response_format: "Formato de respuesta de la herramienta" + tool_response_format_content_only_label: "Solo contenido" tool_response_format_content_only_caption: > - Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. - tool_response_format_full_label: "Full" + Seleccione esta opción si los clientes de MCP que se conectan a esta instancia no admiten contenido estructurado. Las respuestas de la herramienta solo contendrán contenido de texto sin formato y omitirán la versión estructurada. + tool_response_format_full_label: "Completo" tool_response_format_full_caption: > - The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance. - tool_response_format_structured_only_label: "Structured content only" + La opción más compatible. Las respuestas de la herramienta incluirán tanto contenido regular como estructurado, lo que permitirá a los clientes de MCP elegir el formato que desean leer. Esto puede aumentar el número de tokens que el modelo de lenguaje tiene que procesar, lo que podría incrementar el coste y reducir el rendimiento. + tool_response_format_structured_only_label: "Solo contenido estructurado" tool_response_format_structured_only_caption: > - Choose this if you are certain that MCP clients connecting to this instance support structured content. Tool responses will only include structured content and leave out its text representation. + Seleccione esta opción si sabe con certeza que los clientes MCP que se conectan a esta instancia admiten contenido estructurado. Las respuestas de la herramienta solo incluirán contenido estructurado y omitirán su representación textual. update: failure: "No se ha podido actualizar la configuración del MCP." success: "La configuración del MCP se ha actualizado correctamente." @@ -543,7 +543,7 @@ es: contained_in_type: "Incluido en el tipo" confirm_destroy_option: "Al eliminar una opción, se eliminarán todas las repeticiones (por ejemplo, en paquetes de trabajo). ¿Está seguro de que desea eliminarla?" reorder_alphabetical: "Ordenar los valores alfabéticamente" - reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?" + reorder_confirmation: "Advertencia: Se perderá el orden actual de los valores disponibles, así como todos los valores no guardados. ¿Seguro que desea continuar?" placeholder_version_select: "Primero debe seleccionar el paquete de trabajo o el proyecto" calculated_field_not_editable: "Atributo no editable. Este valor se calcula automáticamente." no_role_assigment: "Sin asignación de roles" @@ -571,13 +571,13 @@ es: formula: project: "Añada valores numéricos o escriba/para buscar un atributo o un operador matemático." regexp: - all: "eg. ^[A-Z0-9]+$" - project: "eg. ^[A-Z0-9]+$" + all: "ej. ^[A-Z0-9]+$" + project: "ej. ^[A-Z0-9]+$" min_max: - all: "0 means no restriction" - project: "0 means no restriction" + all: "0 significa sin restricción" + project: "0 significa sin restricción" has_comment: - project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." + project: "Permite al usuario añadir un comentario relacionado con el atributo del proyecto al seleccionar el valor en la descripción general del proyecto." tab: no_results_title_text: Actualmente no hay campos personalizados. no_results_content_text: Crear un nuevo campo personalizado @@ -596,8 +596,8 @@ es: confirmation_live_message_unchecked: "El botón para continuar ya está inactivo. Debe marcar la casilla para continuar." mcp_configurations: server_url_component: - caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." - label: "Server URL" + caption: "La URL en la que se podrá acceder al servidor OpenProject MCP. Es necesaria para configurar los clientes de MCP." + label: "URL del servidor" op_dry_validation: or: "o" errors: @@ -802,7 +802,7 @@ es: is_for_all_blank_slate: heading: Para todos los proyectos description: Este atributo de proyecto está activado en todos los proyectos, ya que la opción «Para todos los proyectos» está marcada. No puede desactivarse para proyectos individuales. - enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. + enabled_via_assignee_when_submitted_html: Este atributo del proyecto no se puede desactivar, ya que está configurado como asignado al enviarlo para las solicitudes de inicio de proyectos. types: no_results_title_text: Actualmente no hay tipos disponibles. form: @@ -818,8 +818,8 @@ es: new_label: "Nueva prioridad" creation_wizard: errors: - no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." - no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." + no_work_package_type: "No se ha podido habilitar la solicitud de inicio del proyecto porque requiere al menos un tipo de paquete de trabajo activo y este proyecto no tiene ninguno. Añada al menos un tipo de paquete de trabajo a este proyecto." + no_status_when_submitted: "No se ha podido habilitar la solicitud de inicio del proyecto porque el tipo de paquete de trabajo %{type} requiere al menos un estado asociado. Habilite al menos un flujo de trabajo de estado para este tipo de paquete de trabajo." export: description_attachment_export: "El artefacto generado se guardará como PDF adjunto al paquete de trabajo del artefacto." description_file_link_export: "El paquete de trabajo de artefactos tendrá un enlace de archivo a un PDF almacenado en un almacenamiento de archivos externo. Requiere un almacenamiento de archivos de trabajo con carpetas de proyecto gestionadas automáticamente para este proyecto. Por el momento sólo son compatibles los almacenamientos de archivos Nextcloud." @@ -833,7 +833,7 @@ es: label_request_submission: "Envío de la solicitud" project_attributes_description: > Selecciona los atributos del proyecto que deben incluirse en la solicitud de inicio del proyecto. Esta lista solo incluye los [atributos del proyecto](project_attributes_url) habilitados para este proyecto. - enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. + enabled_because_required_html: Este atributo del proyecto no se puede desactivar para esta solicitud de inicio de proyecto, ya que está definido como obligatorio. El administrador de la instancia puede cambiarlo en la configuración de administración. status: button_edit: Editar estado wizard: @@ -1357,11 +1357,11 @@ es: activerecord: attributes: jira_import: - projects: "Projects" + projects: "Proyectos" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Nombre de instancia de Jira" + url: "URL de instancia de Jira" + personal_access_token: "Token de acceso personal" announcements: show_until: "Mostrar hasta" attachment: @@ -1407,7 +1407,7 @@ es: regexp: "Expresión regular" searchable: "Buscable" admin_only: "Solo administradores" - has_comment: "Add a comment text field" + has_comment: "Añadir un campo de texto de comentario" custom_value: value: "Valor" design_color: @@ -1736,7 +1736,7 @@ es: not_available: "no está disponible debido a una configuración del sistema." not_deletable: "no se puede eliminar." not_current_user: "no es el usuario actual." - only_one_active_sprint_allowed: "only one active sprint is allowed per project." + only_one_active_sprint_allowed: "solo se permite un sprint activo por proyecto." not_found: "no encontrado." not_a_date: "no es una fecha válida." not_a_datetime: "no es una fecha/hora válida." @@ -1844,7 +1844,7 @@ es: meeting: error_conflict: "No se ha podido guardar porque otra persona ha actualizado la reunión mientras tanto. Vuelva a cargar la página." message: - cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." + cannot_move_message_to_forum_of_different_project: "No se puede mover un mensaje a un foro de un proyecto diferente." notifications: at_least_one_channel: "Debe especificarse al menos un canal para enviar notificaciones." attributes: @@ -2101,7 +2101,7 @@ es: in_use: "Este nombre de token ya está en uso; seleccione uno diferente" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "Proporcione un protocolo válido (http o https)" template: body: "Por favor revise los siguientes campos:" header: @@ -2120,7 +2120,7 @@ es: comment: "Comentario" custom_action: "Acción personalizada" custom_field: "Campo personalizado" - customized: "Customized" + customized: "Personalizado" "doorkeeper/application": "Aplicación OAuth" enterprise_token: one: "Token de Enterprise" @@ -2677,8 +2677,8 @@ es: edit_attribute_groups: Editar grupos de atributos gantt_pdf_export: Exportación de Gantt a PDF ldap_groups: Usuarios de LDAP y sincronización de grupos - mcp_server: Model Context Protocol (MCP) - meeting_templates: Reusable meeting templates + mcp_server: Protocolo de contexto de modelo (MCP) + meeting_templates: Plantillas de reuniones reutilizables nextcloud_sso: Inicio de sesión único para almacenamiento en la nube one_drive_sharepoint_file_storage: Almacenamiento de archivos OneDrive/SharePoint placeholder_users: Usuarios de marcadores de posición @@ -2756,9 +2756,9 @@ es: title: "Acciones personalizadas" description: "Las acciones personalizadas son accesos directos con un solo clic a un conjunto de acciones predefinidas que puede mostrar en determinados paquetes de trabajo según el estado, rol, tipo o proyecto." mcp_server: - description: "Bring OpenProject into your AI workflows with a secure MCP server." + description: "Incorpore OpenProject a sus flujos de trabajo de IA con un servidor MCP seguro." meeting_templates: - description: "Define meeting templates with a set agenda structure and save time by reusing them when creating new meetings." + description: "Defina plantillas de reuniones con una estructura de orden del día fija y ahorre tiempo reutilizándolas al crear nuevas reuniones." nextcloud_sso: title: "Inicio de sesión único para almacenamiento en la nube" description: "Habilite una autenticación fluida y segura para su almacenamiento Nextcloud con el inicio de sesión único. Simplifique la gestión del acceso y mejore la comodidad de los usuarios." @@ -3071,16 +3071,16 @@ es: #We need to include the version to invalidate outdated translations in other locales "17_2": new_features_title: > - The release contains various new features and improvements, such as: + El lanzamiento incluye varias funciones nuevas y mejoras, tales como: new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved accessibility - line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments. - line_4: PDF export enhancements - line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module - line_7: Harmonized custom field forms + line_0: Flujos de trabajo de IA con un servidor MCP seguro (plan Professional y superiores) + line_1: Página de inicio del proyecto mejorada con un nuevo widget para presupuestos y accesibilidad mejorada + line_2: "Reuniones: plantillas de reuniones (plan Basic y superiores)" + line_3: Mayor transparencia con los comentarios sobre los atributos del proyecto + line_4: Mejoras en la exportación a PDF + line_5: Mayor seguridad para los enlaces externos (plan Premium y superiores) + line_6: Mejoras en UI/UX en el módulo de backlogs + line_7: Formularios de campos personalizados armonizados links: upgrade_enterprise_edition: "Actualizar a Enterprise" postgres_migration: "Migrando su instalación a PostgreSQL" @@ -3098,10 +3098,10 @@ es: journals: changes_retracted: "Se deshicieron los cambios." caused_changes: - budget_deleted: "Budget has been deleted" + budget_deleted: "Se ha eliminado el presupuesto" dates_changed: "Cambio de fechas" default_attribute_written: "Atributos de solo lectura escritos" - import: "Imported" + import: "Importado" progress_mode_changed_to_status_based: "Cálculo del progreso actualizado" status_changed: "Estado «%{status_name}»" system_update: "Actualización del sistema OpenProject:" @@ -3110,21 +3110,21 @@ es: total_percent_complete_mode_changed_to_simple_average: "El cálculo de los totales de % completado se basa ahora en una media simple de solo los valores de % completado." cause_descriptions: import: - header: "changes by %{author}" - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" - field_updated: "%{field} updated" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" - set_with_diff: "%{field} set (%{link})" + header: "cambios de %{author}" + field_changed: "%{field} ha cambiado de %{old_value} a %{new_value}" + field_set: "%{field} configurado a %{value}" + field_removed: "%{field} eliminado" + field_updated: "%{field} actualizado" + deleted_with_diff: "%{field} eliminado (%{link})" + changed_with_diff: "%{field} modificado (%{link})" + set_with_diff: "%{field} fijado (%{link})" work_package_predecessor_changed_times: por cambios al %{link} predecesor work_package_parent_changed_times: por cambios al %{link} principal work_package_children_changed_times: por cambios en el secundario %{link} work_package_related_changed_times: por cambios en los %{link} relacionados work_package_duplicate_closed: El estado fue actualizado automáticamente por el paquete de trabajo duplicado %{link} unaccessable_work_package_changed: por cambios en un paquete de trabajo relacionado - budget_deleted: Budget has been deleted + budget_deleted: Se ha eliminado el presupuesto working_days_changed: changed: "por cambios en días laborables (%{changes})" days: @@ -3205,7 +3205,7 @@ es: active_tokens: "Tokens activos" blank_description: "No hay ningún acceso a aplicaciones de terceros configurado y activo para usted." blank_title: "No hay token de aplicación OAuth" - last_refreshed_at: "Last refreshed at" + last_refreshed_at: "Última actualización el" title: "OAuth" table_title: "Tokens de aplicación OAuth" text_hint: "Los tokens de aplicación OAuth permiten a las aplicaciones de terceros conectarse con esta instancia de OpenProject." @@ -3445,7 +3445,7 @@ es: label_duplicates: "duplicados" label_edit: "Editar" label_edit_x: "Editar: %{x}" - label_view_x: "View: %{x}" + label_view_x: "Ver: %{x}" label_enable_multi_select: "Selección multiple" label_enabled_project_custom_fields: "Habilitar campos personalizados" label_enabled_project_modules: "Habilitar módulos" @@ -3550,7 +3550,7 @@ es: label_external_links: "Enlaces externos" label_locale: "Idioma y región" label_jump_to_a_project: "Saltar a un proyecto..." - label_jira_import: "Jira Import" + label_jira_import: "Importación desde Jira" label_keyword_plural: "Palabras clave" label_language_based: "Basado en el idioma del usuario" label_last_activity: "Última actividad" @@ -3573,7 +3573,7 @@ es: label_lock_user: "Bloquear usuario" label_logged_as: "Sesión iniciada como" label_login: "Ingresar" - label_custom_comment: "%{name} comment" + label_custom_comment: "Comentario de %{name}" label_custom_logo: "Logotipo personalizado de sobremesa" label_custom_logo_mobile: "Logotipo personalizado de móvil" label_custom_export_logo: "Logotipo de exportación personalizado" @@ -4201,7 +4201,7 @@ es: notice_successful_delete: "Eliminado con éxito." notice_successful_cancel: "Cancelación exitosa." notice_successful_update: "Actualización correcta." - notice_successful_move: "Successful move from %{from} to %{to}." + notice_successful_move: "Traslado con éxito de %{from} a %{to}." notice_unsuccessful_create: "Error en la creación." notice_unsuccessful_create_with_reason: "Error en la creación: %{reason}" notice_unsuccessful_update: "Error al actualizar." @@ -4362,7 +4362,7 @@ es: permission_edit_project_query: "Editar vistas de proyecto" placeholders: default: "-" - templated_hint: Automatically generated through type %{type} + templated_hint: Generado automáticamente a través del tipo %{type} portfolio: count: zero: "0 carteras" @@ -4547,9 +4547,9 @@ es: setting_capture_external_links: "Detección de enlaces externos" setting_capture_external_links_text: > Cuando esta función está habilitada, todos los enlaces externos en texto formateado redirigirán a una página de advertencia antes de salir de la aplicación. Esto ayuda a proteger a los usuarios de sitios web externos potencialmente maliciosos. - setting_capture_external_links_require_login: "Require users to be logged in" + setting_capture_external_links_require_login: "Requerir que los usuarios inicien sesión" setting_capture_external_links_require_login_text: > - When enabled, users wanting to click on external links need to be logged in before being able to continue. + Cuando esta función está habilitada, los usuarios que deseen hacer clic en enlaces externos deben iniciar sesión antes de poder continuar. setting_after_first_login_redirect_url: "Primera redirección de inicio de sesión" setting_after_first_login_redirect_url_text_html: > Establezca una ruta para redirigir a los usuarios tras su primer inicio de sesión. Si está vacía, redirige a la página de inicio del recorrido de incorporación.
Ejemplo: /my/page @@ -4594,9 +4594,9 @@ es: setting_smtp_password: "Contraseña SMTP" setting_smtp_domain: "Dominio SMTP HELO" setting_activity_days_default: "Días mostrados en actividad de proyecto" - setting_api_tokens_enabled: "Enable API tokens" + setting_api_tokens_enabled: "Habilitar tokens API" setting_api_tokens_enabled_caption: > - Decide whether users can create personal API tokens in their account settings. These tokens can be used to access the different APIs of OpenProject, such as APIv3 and MCP. + Decida si los usuarios pueden crear tokens API personales en la configuración de sus cuentas. Estos tokens se pueden utilizar para acceder a las diferentes API de OpenProject, como APIv3 y MCP. setting_app_subtitle: "Subtítulo de aplicación" setting_app_title: "Título de aplicación" setting_attachment_max_size: "Tamaño máximo de adjunto" @@ -5135,10 +5135,10 @@ es: reset_failed_logins: "Resetear los inicios de sesión fallidos" status_user_and_brute_force: "%{user} y %{brute_force}" status_change: "Cambio de estado" - text_change_disabled_for_provider_login: "The name and email is set by your login provider and can thus not be changed." + text_change_disabled_for_provider_login: "El nombre y el correo electrónico los configura su proveedor de inicio de sesión y no se pueden cambiar." unlock: "Desbloquear" unlock_and_reset_failed_logins: "Desbloquear y resetear los inicios de sesión fallidos" - error_cannot_delete_user: "User cannot be deleted" + error_cannot_delete_user: "No se puede eliminar el usuario" version_status_closed: "cerrado" version_status_locked: "bloqueado" version_status_open: "abierto" diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index 28021dc8f02..df266e3d45a 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -3276,7 +3276,7 @@ th: label_backup: "สำรอง" label_backup_code: "Backup code" label_basic_details: "Basic details" - label_between: "between" + label_between: "ระหว่าง" label_blocked_by: "ถูกบล็อคโดย" label_blocks: "บล็อก" label_blog: "Blog" @@ -3448,7 +3448,7 @@ th: label_global_roles: "Global roles" label_git_path: "เส้นทางไปยังไดเรคทอรี่ ของไฟล์ .git" label_greater_or_equal: ">=" - label_group_by: "Group by" + label_group_by: "จัดกลุ่มโดย" label_group_new: "กลุ่มใหม่" label_group: "กลุ่ม" label_group_named: "Group %{name}" diff --git a/modules/auth_saml/config/locales/crowdin/th.yml b/modules/auth_saml/config/locales/crowdin/th.yml index b3a58975c68..1443a2ce294 100644 --- a/modules/auth_saml/config/locales/crowdin/th.yml +++ b/modules/auth_saml/config/locales/crowdin/th.yml @@ -4,14 +4,14 @@ th: saml/provider: display_name: ชื่อ identifier: รหัส - secret: Secret - scope: Scope - assertion_consumer_service_url: ACS (Assertion consumer service) URL - limit_self_registration: Limit self registration - sp_entity_id: Service entity ID - metadata_url: Identity provider metadata URL - name_identifier_format: Name identifier format - idp_sso_service_url: Identity provider login endpoint + secret: รหัสลับ + scope: ขอบเขตงาน + assertion_consumer_service_url: URL บริการยืนยันตัวตน (ACS) + limit_self_registration: จำกัดการลงทะเบียนด้วยตนเอง + sp_entity_id: รหัสระบุเอนทิตีบริการ (Service Entity ID) + metadata_url: URL ข้อมูลเมทาดาตาของผู้ให้บริการระบุตัวตน (IdP) + name_identifier_format: รูปแบบรหัสระบุชื่อ (Name Identifier Format) + idp_sso_service_url: จุดลงชื่อเข้าใช้ของผู้ให้บริการระบุตัวตน (IdP) idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider authn_requests_signed: Sign SAML AuthnRequests diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index bca9221e609..9d03fa47032 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -96,13 +96,13 @@ es: new_story: "Nueva historia" stories_tasks: "Historias/tareas" task_board: "Panel de tareas" - burndown_chart: "Diagrama Burndown" + burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Propiedades" story_component: - label_drag_story: "Move %{name}" + label_drag_story: "Mover %{name}" story_menu_component: - label_actions: "Story actions" + label_actions: "Acciones de la historia" backlogs_points_burn_direction: "Puntos de quemado arriba/abajo" backlogs_product_backlog: "Cartera de producto" backlogs_story: "Historia" @@ -110,14 +110,14 @@ es: backlogs_task: "Tarea" backlogs_task_type: "Tipo de tarea" backlogs_wiki_template: "Plantilla para la página wiki de iteración" - backlogs_empty_title: "No versions are defined yet" - backlogs_empty_action_text: "To start using backlogs, please create a version first" - backlogs_not_configured_title: "Backlogs not configured" - backlogs_not_configured_description: "Story and task types need to be set before using this module." - backlogs_not_configured_action_text: "Configure Backlogs" + backlogs_empty_title: "Aún no se han definido versiones" + backlogs_empty_action_text: "Para empezar a utilizar los backlogs, primero cree una versión" + backlogs_not_configured_title: "Backlogs no configurados" + backlogs_not_configured_description: "Es necesario configurar los tipos de historia y tarea antes de utilizar este módulo." + backlogs_not_configured_action_text: "Configurar backlogs" burndown: - story_points: "Story points" - story_points_ideal: "Story points (ideal)" + story_points: "Puntos de historia" + story_points_ideal: "Puntos de historia (ideal)" errors: attributes: task_type: @@ -129,18 +129,18 @@ es: label_points_burn_down: "Abajo" label_points_burn_up: "Arriba" label_sprint_impediments: "Impedimentos de sprint" - label_sprint_new: "New sprint" + label_sprint_new: "Nuevo sprint" label_task_board: "Tablero de tareas" - permission_view_sprints: "View sprints" - permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" - permission_manage_sprint_items: "Manage sprint items" - permission_share_sprint: "Share sprint" + permission_view_sprints: "Ver sprints" + permission_create_sprints: "Crear sprints" + permission_start_complete_sprint: "Iniciar/completar sprint" + permission_manage_sprint_items: "Gestionar elementos de sprint" + permission_share_sprint: "Compartir sprint" project_module_backlogs: "Backlogs" rb_burndown_charts: show: - blankslate_title: "No burndown data available" - blankslate_description: "Set start and end date for the sprint to generate a burndown chart." + blankslate_title: "No hay datos de trabajo pendiente disponibles" + blankslate_description: "Establezca la fecha de inicio y finalización del sprint para generar un gráfico de trabajo pendiente." remaining_hours: "trabajo restante" version_settings_display_label: "Columna en backlog" version_settings_display_option_left: "izquierda" diff --git a/modules/backlogs/config/locales/crowdin/js-es.yml b/modules/backlogs/config/locales/crowdin/js-es.yml index 833e0141322..0721bbcb551 100644 --- a/modules/backlogs/config/locales/crowdin/js-es.yml +++ b/modules/backlogs/config/locales/crowdin/js-es.yml @@ -25,5 +25,5 @@ es: properties: storyPoints: "Puntos de Historia" burndown: - day: "Day" - points: "Points" + day: "Día" + points: "Puntos" diff --git a/modules/backlogs/config/locales/crowdin/th.yml b/modules/backlogs/config/locales/crowdin/th.yml index 646b1e09493..9b3e5cf07e3 100644 --- a/modules/backlogs/config/locales/crowdin/th.yml +++ b/modules/backlogs/config/locales/crowdin/th.yml @@ -26,124 +26,124 @@ th: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" - goal: "Sprint goal" - name: "Sprint name" + duration: "ระยะเวลา" + finish_date: "วันที่เสร็จสิ้น" + goal: "เป้าหมายสปริ๊นต์" + name: "ชื่อสปรินต์" sharing: "Sharing" sprint: - duration: "Sprint duration" + duration: "ระยะเวลาการสปรินต์" work_package: position: "ตำแหน่ง" story_points: "" - backlogs_work_package_type: "Backlog type" + backlogs_work_package_type: "ประเภทงานค้าง" errors: models: work_package: attributes: blocks_ids: can_only_contain_work_packages_of_current_sprint: "" - must_block_at_least_one_work_package: "must contain the ID of at least one ticket." + must_block_at_least_one_work_package: "ต้องระบุรหัสรายการงานอย่างน้อยหนึ่งรายการ" version_id: - task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version." + task_version_must_be_the_same_as_story_version: "เวอร์ชันต้องตรงกับสตอรี่หลัก" sprint: - cannot_end_before_it_starts: "Sprint cannot end before it starts." + cannot_end_before_it_starts: "กรุณาระบุวันสิ้นสุดให้หลังจากวันเริ่มต้นสปรินต์" models: - sprint: "Sprint" + sprint: "สปรินท์" attributes: - task_type: "Task type" + task_type: "ประเภทงาน" backlogs: any: "ทั้งหมด" - column_width: "Column width" + column_width: "ความกว้างของคอลัมน์" definition_of_done: "นิยามของคำว่าเสร็จสิ้น" - impediment: "Impediment" - label_versions_default_fold_state: "Show versions folded" - caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." - work_package_is_closed: "Work package is done, when" - label_is_done_status: "Status %{status_name} means done" + impediment: "รายการอุปสรรค" + label_versions_default_fold_state: "แสดงเวอร์ชันที่พับอยู่" + caption_versions_default_fold_state: "เวอร์ชันจะถูกพับไว้เป็นค่าเริ่มต้น กรุณาคลิกเพื่อขยายดูทีละรายการ" + work_package_is_closed: "งานจะถือว่า เสร็จสิ้น เมื่อ" + label_is_done_status: "สถานะ %{status_name} หมายถึง เสร็จสิ้น" points_label: - other: "points" - positions_could_not_be_rebuilt: "Positions could not be rebuilt." - positions_rebuilt_successfully: "Positions rebuilt successfully." - rebuild: "Rebuild" - rebuild_positions: "Rebuild positions" - remaining_hours: "Remaining work" - show_burndown_chart: "Burndown Chart" - story: "Story" + other: "คะแนน" + positions_could_not_be_rebuilt: "ไม่สามารถจัดลำดับตำแหน่งใหม่ได้" + positions_rebuilt_successfully: "ดลำดับตำแหน่งใหม่สำเร็จแล้ว" + rebuild: "สร้างใหม่" + rebuild_positions: "จัดลำดับตำแหน่งใหม่" + remaining_hours: "งานที่เหลือ" + show_burndown_chart: "กราฟติดตามงาน (Burndown)" + story: "สตอรี่" story_points: - other: "%{count} story points" + other: "%{count} คะแนนสตอรี่" task: "งาน" task_color: "สีของงาน" unassigned: "ไม่ได้กำหนด" user_preference: - header_backlogs: "Backlogs module" - button_update_backlogs: "Update backlogs module" + header_backlogs: "โมดูลรายการงานคงค้าง" + button_update_backlogs: "อัปเดตโมดูลรายการงานคงค้าง" backlog_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} ว่างอยู่" + blankslate_description: "ยังไม่มีรายการที่วางแผนไว้ ลากรายการมาวางที่นี่เพื่อเพิ่ม" backlog_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "พับ/ขยาย %{name}" label_story_count: - zero: "No stories in backlog" - one: "%{count} story in backlog" - other: "%{count} stories in backlog" + zero: "ไม่มีสตอรี่ในรายการงานคงค้าง" + one: "%{count} สตอรี่ในรายการงานคงค้าง" + other: "%{count} สตอรี่ในรายการงานคงค้าง" backlog_menu_component: - label_actions: "Backlog actions" + label_actions: "การจัดการรายการงานคงค้าง" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" - wiki: "Wiki" - properties: "Properties" + edit_sprint: "แก้ไขสปรินท์" + new_story: "สตอรี่ใหม่" + stories_tasks: "สตอรี่/งาน" + task_board: "กระดานงาน" + burndown_chart: "กราฟติดตามงาน (Burndown)" + wiki: "วิกิ" + properties: "คุณสมบัติ" story_component: - label_drag_story: "Move %{name}" + label_drag_story: "ย้าย %{name}" story_menu_component: - label_actions: "Story actions" - backlogs_points_burn_direction: "Points burn up/down" - backlogs_product_backlog: "Product backlog" - backlogs_story: "Story" - backlogs_story_type: "Story types" + label_actions: "การจัดการสตอรี่" + backlogs_points_burn_direction: "กราฟแสดงคะแนน (Burn up/down)" + backlogs_product_backlog: "รายการงานคงค้างผลิตภัณฑ์" + backlogs_story: "สตอรี่" + backlogs_story_type: "ประเภทสตอรี่" backlogs_task: "งาน" - backlogs_task_type: "Task type" - backlogs_wiki_template: "Template for sprint wiki page" - backlogs_empty_title: "No versions are defined yet" - backlogs_empty_action_text: "To start using backlogs, please create a version first" - backlogs_not_configured_title: "Backlogs not configured" - backlogs_not_configured_description: "Story and task types need to be set before using this module." - backlogs_not_configured_action_text: "Configure Backlogs" + backlogs_task_type: "ประเภทงาน" + backlogs_wiki_template: "แม่แบบสำหรับหน้าวิกิสปรินท์" + backlogs_empty_title: "ยังไม่มีการกำหนดเวอร์ชัน" + backlogs_empty_action_text: "ในการเริ่มใช้งานรายการงานคงค้าง กรุณาสร้างเวอร์ชันก่อน" + backlogs_not_configured_title: "รายการงานคงค้างยังไม่ได้ตั้งค่า" + backlogs_not_configured_description: "ต้องกำหนดประเภทสตอรี่และประเภทงานก่อนใช้งานโมดูลนี้" + backlogs_not_configured_action_text: "ตั้งค่ารายการงานคงค้าง" burndown: - story_points: "Story points" - story_points_ideal: "Story points (ideal)" + story_points: "คะแนนสตอรี่" + story_points_ideal: "คะแนนสตอรี่ (ตามอุดมคติ)" errors: attributes: task_type: - cannot_be_story_type: "can not also be a story type" - label_backlogs: "Backlogs" - label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." + cannot_be_story_type: "ไม่สามารถเป็นประเภทสตอรี่ได้เช่นกัน" + label_backlogs: "รายการงานคงค้าง" + label_backlogs_unconfigured: "คุณยังไม่ได้ตั้งค่ารายการงานคงค้าง กรุณาไปที่ %{administration} > %{plugins} จากนั้นคลิกที่ลิงก์ %{configure} ของปลั๊กอินนี้ เมื่อคุณตั้งค่าฟิลด์ต่าง ๆ เรียบร้อยแล้ว ให้กลับมาที่หน้านี้เพื่อเริ่มใช้งานเครื่องมือ" label_blocks_ids: "Id ของแพคเกจการทำงานที่ถูกบล็อก" - label_column_in_backlog: "Column in backlog" - label_points_burn_down: "Down" - label_points_burn_up: "Up" - label_sprint_impediments: "Sprint Impediments" - label_sprint_new: "New sprint" - label_task_board: "Task board" - permission_view_sprints: "View sprints" - permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" - permission_manage_sprint_items: "Manage sprint items" - permission_share_sprint: "Share sprint" - project_module_backlogs: "Backlogs" + label_column_in_backlog: "คอลัมน์ในรายการงานคงค้าง" + label_points_burn_down: "ลง" + label_points_burn_up: "ขึ้น" + label_sprint_impediments: "อุปสรรคของสปรินท์" + label_sprint_new: "สปรินท์ใหม่" + label_task_board: "กระดานงาน" + permission_view_sprints: "ดูสปรินท์" + permission_create_sprints: "สร้างสปรินท์" + permission_start_complete_sprint: "เริ่มต้น/เสร็จสิ้นสปรินท์" + permission_manage_sprint_items: "จัดการรายการในสปรินท์" + permission_share_sprint: "แชร์สปรินท์" + project_module_backlogs: "รายการงานคงค้าง" rb_burndown_charts: show: - blankslate_title: "No burndown data available" - blankslate_description: "Set start and end date for the sprint to generate a burndown chart." - remaining_hours: "remaining work" - version_settings_display_label: "Column in backlog" - version_settings_display_option_left: "left" + blankslate_title: "ไม่มีข้อมูลกราฟติดตามงาน (Burndown)" + blankslate_description: "กำหนดวันเริ่มต้นและสิ้นสุดของสปรินท์" + remaining_hours: "งานที่เหลือ" + version_settings_display_label: "คอลัมน์ในรายการงานคงค้าง" + version_settings_display_option_left: "ซ้าย" version_settings_display_option_none: "ไม่มี" - version_settings_display_option_right: "right" + version_settings_display_option_right: "ขวา" setting_plugin_openproject_backlogs_story_types_caption: | Types treated as backlog stories (e.g., Feature, User story). Must differ from task type. setting_plugin_openproject_backlogs_task_type_caption: | diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml index df4f5f2883f..bd19e75d3a7 100644 --- a/modules/backlogs/config/locales/crowdin/uk.yml +++ b/modules/backlogs/config/locales/crowdin/uk.yml @@ -26,8 +26,8 @@ uk: activerecord: attributes: agile/sprint: - duration: "Duration" - finish_date: "Finish date" + duration: "Тривалість" + finish_date: "Дата закінчення" goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" @@ -54,7 +54,7 @@ uk: task_type: "Тип завдання" backlogs: any: "будь-який" - column_width: "Column width" + column_width: "Ширина стовпця" definition_of_done: "Визначення завершено" impediment: "Перешкода" label_versions_default_fold_state: "Показати складені версії" @@ -88,7 +88,7 @@ uk: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Згорнути/розгорнути %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" @@ -97,14 +97,14 @@ uk: label_actions: "Backlog actions" action_menu: edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" + new_story: "Нова історія" + stories_tasks: "Історії/Завдання" + task_board: "Дошка завдань" burndown_chart: "Burndown chart" wiki: "Wiki" - properties: "Properties" + properties: "Властивості" story_component: - label_drag_story: "Move %{name}" + label_drag_story: "Перемістити %{name}" story_menu_component: label_actions: "Story actions" backlogs_points_burn_direction: "Бали спалюються вгору/вниз" diff --git a/modules/budgets/config/locales/crowdin/es.yml b/modules/budgets/config/locales/crowdin/es.yml index b04f999dbdb..b44cea74099 100644 --- a/modules/budgets/config/locales/crowdin/es.yml +++ b/modules/budgets/config/locales/crowdin/es.yml @@ -44,7 +44,7 @@ es: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "is not a member of the budget's project" + not_a_member_of_budget_project: "no es miembro del proyecto presupuestario" models: budget: "Presupuesto" material_budget_item: "Unidad" @@ -65,28 +65,28 @@ es: budgets: widgets: budget_totals: - title: "Budget totals" - remaining_budget: "Remaining budget" - spent_budget: "Spent budget" - total_actual_costs: "Total actual costs" - total_planned_budget: "Total planned budget" + title: "Total del presupuesto" + remaining_budget: "Presupuesto restante" + spent_budget: "Presupuesto gastado" + total_actual_costs: "Costes reales totales" + total_planned_budget: "Presupuesto total previsto" budget_by_cost_type: - title: "Budget by cost type" + title: "Presupuesto por tipo de coste" blankslate: - heading: "Start project controlling" - description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + heading: "Comience a controlar su proyecto" + description: "Obtenga una visión general de los presupuestos y costes para realizar un seguimiento eficaz del estado de su proyecto" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "Faltan detalles del presupuesto" + description: "Añada detalles sobre su presupuesto previsto para ver los datos aquí" caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace}." - other: "Data aggregated from %{count} budgets included in this %{workspace}." + zero: "No hay datos presupuestarios." + one: "Datos recopilados de %{count} presupuesto incluido en este %{workspace}." + other: "Datos recopilados de %{count} presupuestos incluidos en este %{workspace}." caption_with_subitems: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." - other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." - view_details: "View budget details" + zero: "No hay datos presupuestarios." + one: "Datos recopilados de %{count} presupuesto incluido en este %{workspace} y sus subelementos." + other: "Datos recopilados de %{count} presupuestos incluidos en este %{workspace} y sus subelementos." + view_details: "Ver los detalles del presupuesto" events: budget: "Presupuesto editado" help_click_to_edit: "Haga clic aquí para editar." diff --git a/modules/budgets/config/locales/crowdin/th.yml b/modules/budgets/config/locales/crowdin/th.yml index 84779e53b0d..37b7c7768f7 100644 --- a/modules/budgets/config/locales/crowdin/th.yml +++ b/modules/budgets/config/locales/crowdin/th.yml @@ -26,19 +26,19 @@ th: attributes: budget: author: "ผู้เขียน" - available: "Available" - budget: "Planned" - budget_ratio: "Spent (ratio)" + available: "พร้อมใช้งาน" + budget: "วางแผนแล้ว" + budget_ratio: "ใช้ไปแล้ว (อัตราส่วน)" description: "คำอธิบาย" - spent: "Spent" + spent: "ใช้ไปแล้ว" status: "สถานะ" subject: "หัวข้อ" - type: "Cost type" - labor_budget: "Planned labor costs" - material_budget: "Planned unit costs" - base_amount: "Base amount" + type: "ประเภทต้นทุน" + labor_budget: "ต้นทุนแรงงานที่วางแผนไว้" + material_budget: "ต้นทุนหน่วยที่วางแผนไว้" + base_amount: "จำนวนฐาน" work_package: - budget_subject: "Budget title" + budget_subject: "ชื่องบประมาณ" errors: models: labor_budget_item: @@ -46,14 +46,14 @@ th: principal: not_a_member_of_budget_project: "is not a member of the budget's project" models: - budget: "Budget" - material_budget_item: "Unit" + budget: "งบประมาณ" + material_budget_item: "หน่วย" activity: filter: - budget: "Budgets" + budget: "งบประมาณ" attributes: - budget: "Budget" - button_add_budget_item: "Add planned costs" + budget: "งบประมาณ" + button_add_budget_item: "เพิ่มต้นทุนที่วางแผนไว้" button_add_budget: "Add budget" button_add_cost_type: "Add cost type" button_cancel_edit_budget: "Cancel editing budget" diff --git a/modules/costs/config/locales/crowdin/es.yml b/modules/costs/config/locales/crowdin/es.yml index a72d21b6763..26f864fe58c 100644 --- a/modules/costs/config/locales/crowdin/es.yml +++ b/modules/costs/config/locales/crowdin/es.yml @@ -205,10 +205,10 @@ es: project_module_costs: "Tiempo y costos" setting_allow_tracking_start_and_end_times: "Permitir horas de inicio y finalización" setting_costs_currency: "Moneda" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "Se refiere a la unidad monetaria. Puede ser un código ISO de tres letras, como EUR, USD o JPY, o un símbolo, como €, $ o ¥." + setting_costs_currency_format: "Formato de la moneda" + setting_costs_currency_format_prefix: "Antes del importe (por ejemplo, EUR 100)" + setting_costs_currency_format_suffix: "Después del importe (por ejemplo, 100 EUR)" setting_enforce_tracking_start_and_end_times: "Requerir horas de inicio y finalización" setting_enforce_without_allow: "No es posible requerir horas de inicio y finalización sin permitirlas antes" setting_allow_tracking_start_and_end_times_caption: "Habilita la introducción de las horas de inicio y finalización cuando se registra tiempo." @@ -232,12 +232,12 @@ es: costs: widgets: actual_costs: - title: "Actual costs by month" + title: "Costes reales por mes" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." - action: "Log time" - view_details: "View actual costs details" + heading: "Empiece a controlar su tiempo y sus costes" + description: "Obtenga una visión general de los costes y del tiempo registrado para supervisar el progreso de su proyecto. Asegúrese de que los paquetes de trabajo estén asociados al presupuesto correcto." + action: "Tiempo registrado" + view_details: "Ver los detalles de los costes reales" ee: features: time_entry_time_restrictions: Requiere un seguimiento del tiempo exacto diff --git a/modules/costs/config/locales/crowdin/th.yml b/modules/costs/config/locales/crowdin/th.yml index b65b9cc6f77..9f04b5cf116 100644 --- a/modules/costs/config/locales/crowdin/th.yml +++ b/modules/costs/config/locales/crowdin/th.yml @@ -93,70 +93,70 @@ th: valid_from: "Valid from" fixed_date: "Fixed date" button_add_rate: "Add rate" - button_log_costs: "Log unit costs" - button_log_time: "Log" + button_log_costs: "บันทึกต้นทุนหน่วย" + button_log_time: "บันทึก" button_add_activity: "กิจกรรม" button_add_time_entry: "เวลาที่ถูกบันทึก" - button_stop_timer: "Stop timer" - caption_booked_on_project: "Booked on project" + button_stop_timer: "หยุดตัวจับเวลา" + caption_booked_on_project: "จองในโครงการแล้ว" caption_default: "ค่าเริ่มต้น" - caption_default_rate_history_for: "Default rate history for %{user}" - caption_locked_on: "Locked on" - caption_materials: "Units" - caption_rate_history: "Rate history" - caption_rate_history_for: "Rate history for %{user}" - caption_rate_history_for_project: "Rate history for %{user} in project %{project}" - caption_save_rate: "Save rate" - caption_set_rate: "Set current rate" - caption_show_locked: "Show locked types" + caption_default_rate_history_for: "ประวัติอัตราเริ่มต้นสำหรับ %{user}" + caption_locked_on: "ล็อกเมื่อ" + caption_materials: "หน่วย" + caption_rate_history: "ประวัติอัตรา" + caption_rate_history_for: "ประวัติอัตราสำหรับ %{user}" + caption_rate_history_for_project: "ประวัติอัตราสำหรับ %{user} ในโครงการ %{project}" + caption_save_rate: "บันทึกอัตรา" + caption_set_rate: "กำหนดอัตราปัจจุบัน" + caption_show_locked: "แสดงประเภทที่ล็อกไว้" caption_log_time_dialog: "เวลาที่ถูกบันทึก" - description_date_for_new_rate: "Date for new rate" - 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." - group_by_others: "not in any group" - label_between: "between" - label_cost_filter_add: "Add cost entry filter" - label_costlog: "Logged unit costs" - label_cost_plural: "Costs" - label_cost_type_plural: "Cost types" - label_cost_type_specific: "Cost type #%{id}: %{name}" - label_costs_per_page: "Costs per page" - 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" + description_date_for_new_rate: "วันที่สำหรับอัตราใหม่" + description_costs_settings: "กำหนดรูปแบบค่าใช้จ่ายที่ต้องการสำหรับทุกโครงการ" + description_time_settings: "กำหนดฟิลด์ที่จำเป็นต้องระบุเมื่อบันทึกเวลาในทุกโครงการ" + group_by_others: "ม่อยู่ในกลุ่มใด ๆ" + label_between: "ระหว่าง" + label_cost_filter_add: "เพิ่มตัวกรองรายการต้นทุน" + label_costlog: "ต้นทุนหน่วยที่บันทึกแล้ว" + label_cost_plural: "ต้นทุน" + label_cost_type_plural: "ประเภทต้นทุน" + label_cost_type_specific: "ประเภทต้นทุน #%{id}: %{name}" + label_costs_per_page: "ต้นทุนต่อหน้า" + 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: "แสดงประเภท" label_edit: "แก้ไข" - label_generic_user: "Generic user" + label_generic_user: "ผู้ใช้ทั่วไป" label_greater_or_equal: ">=" - label_group_by: "Group by" - label_group_by_add: "Add grouping field" - label_hourly_rate: "Hourly rate" - label_include_deleted: "Include deleted" - label_work_package_filter_add: "Add work package filter" + label_group_by: "จัดกลุ่มโดย" + label_group_by_add: "พิ่มฟิลด์การจัดกลุ่ม" + label_hourly_rate: "อัตราต่อชั่วโมง" + label_include_deleted: "รวมสิ่งที่ถูกลบ" + label_work_package_filter_add: "เพิ่มตัวกรองชุดงาน" label_kind: "ประเภท" label_less_or_equal: "<=" - label_log_costs: "Log unit costs" - label_new_time_entry_activity: "New time entry activity" - label_time_entry_activity_form_description: "Changes to this time entry activity will be reflected in all projects where it is enabled." + label_log_costs: "บันทึกต้นทุนหน่วย" + label_new_time_entry_activity: "กิจกรรมการบันทึกเวลาใหม่" + label_time_entry_activity_form_description: "การเปลี่ยนแปลงในกิจกรรมการบันทึกเวลานี้จะส่งผลไปยังทุกโครงการที่เปิดใช้งานกิจกรรมดังกล่าว" label_no: "ไม่ใช่" label_option_plural: "ตัวเลือก" - label_overall_costs: "Overall costs" - label_rate: "Rate" - label_rate_plural: "Rates" - label_status_finished: "Finished" + label_overall_costs: "ค่าใช้จ่ายทั้งหมด" + label_rate: "อัตรา" + label_rate_plural: "อัตรา" + label_status_finished: "เสร็จสิ้นแล้ว" label_show: "แสดง" - label_units: "Cost units" + label_units: "หน่วยต้นทุน" label_user: "ผู้ใช้" - label_until: "until" - label_valid_from: "Valid from" + label_until: "จนถึง" + label_valid_from: "มีผลตั้งแต่" label_yes: "ใช่" label_time: "Time" - label_cost: "Cost" - label_costs: "Costs" - label_mandatory_fields: "Mandatory fields" + label_cost: "ต้นทุน" + label_costs: "ต้นทุน" + label_mandatory_fields: "ฟิลด์ที่จำเป็นต้องระบุ" label_my_time_tracking: "My time tracking" label_no_time: "No time tracked" label_next_day: "Next day" @@ -214,29 +214,29 @@ th: text_destroy_time_and_cost_entries: "Delete reported hours and costs" text_destroy_time_and_cost_entries_question: "%{hours} hours, %{cost_entries} were reported on the work packages you are about to delete. What do you want to do ?" text_reassign_time_and_cost_entries: "Reassign reported hours and costs to this work package:" - text_warning_hidden_elements: "Some entries may have been excluded from the aggregation." - week: "week" + text_warning_hidden_elements: "บางรายการอาจถูกคัดออกจากการคำนวณสรุปยอดรวม" + week: "สัปดาห์" total_times: - workweek: "Workweek Total: %{hours}" - week: "Week Total: %{hours}" - month: "Month Total: %{hours}" - day: "Day Total: %{hours}" + workweek: "ยอดรวมสัปดาห์การทำงาน: %{hours}" + week: "รวมเวลาต่อสัปดาห์: %{hours}" + month: "รวมเวลาต่อเดือน: %{hours}" + day: "รวมเวลาต่อวัน: %{hours}" api_v3: errors: validation: - start_time_different_date: "Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date." + start_time_different_date: "นที่ในส่วนเวลาเริ่มต้น (%{start_time}) ต้องเป็นวันเดียวกันกับวันที่บันทึกเวลา (%{spent_on})" costs: widgets: actual_costs: - title: "Actual costs by month" + title: "ต้นทุนจริงตามเดือน" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." - action: "Log time" - view_details: "View actual costs details" + heading: "เริ่มบันทึกเวลาและต้นทุนของคุณ" + description: "ดูภาพรวมของต้นทุนและเวลาที่บันทึกไว้เพื่อติดตามความคืบหน้าของโครงการ ตรวจสอบให้แน่ใจว่าแพ็กเกจงานมีความเชื่อมโยงกับงบประมาณที่ถูกต้องถูกต้อง" + action: "เวลาที่ถูกบันทึก" + view_details: "ดูรายละเอียดต้นทุนจริง" ee: features: - time_entry_time_restrictions: Require exact time tracking + time_entry_time_restrictions: กำหนดให้บันทึกเวลาแบบระบุช่วงเวลาที่ชัดเจน upsell: time_entry_time_restrictions: - description: "Improve your time tracking by requiring exact start and finish times when logging time." + description: "ปรับปรุงการบันทึกเวลาของคุณให้ดียิ่งขึ้น โดยกำหนดให้ระบุเวลาเริ่มต้นและเวลาสิ้นสุดที่แน่นอนเมื่อบันทึกเวลา" diff --git a/modules/documents/config/locales/crowdin/es.yml b/modules/documents/config/locales/crowdin/es.yml index 94bd1179c66..30c24b14e10 100644 --- a/modules/documents/config/locales/crowdin/es.yml +++ b/modules/documents/config/locales/crowdin/es.yml @@ -24,7 +24,7 @@ es: name: "Documentos de OpenProject" description: "Un plug-in OpenProject para permitir la creación de documentos en proyectos." attributes: - collaborative_editing_hocuspocus_url: "Hocuspocus server URL" + collaborative_editing_hocuspocus_url: "URL del servidor Hocuspocus" activerecord: errors: models: @@ -121,8 +121,8 @@ es: some_unwritable: Algunos valores están configurados en las variables de entorno y no pueden ser configurados aquí. hocuspocus_server_url: label: "URL del servidor Hocuspocus" - caption: "The WebSocket address of a working Hocuspocus server." - invalid_scheme: "Must use a WebSocket protocol (ws:// or wss://)." + caption: "La dirección WebSocket de un servidor Hocuspocus operativo." + invalid_scheme: "Debe utilizar un protocolo WebSocket (ws:// o wss://)." hocuspocus_server_secret: label: "Cliente Secreto" caption: "Pega el secreto proporcionado por el servidor Hocuspocus." diff --git a/modules/grids/config/locales/crowdin/js-es.yml b/modules/grids/config/locales/crowdin/js-es.yml index 5607a7d10f9..719fa552a3a 100644 --- a/modules/grids/config/locales/crowdin/js-es.yml +++ b/modules/grids/config/locales/crowdin/js-es.yml @@ -2,12 +2,12 @@ es: js: grid: add_widget: 'Agregar widget' - widget_menu_label: 'Show menu options for %{widgetName} widget' + widget_menu_label: 'Mostrar opciones de menú para el widget %{widgetName}' remove: 'Quitar widget' configure: 'Configurar widget' widgets: missing_permission: "No tiene los permisos necesarios para ver este widget." - not_available: "This widget is currently unavailable." + not_available: "Este widget no está disponible actualmente." custom_text: title: 'Texto personalizado' documents: diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml index 7bcd99b2ebc..885dcca591b 100644 --- a/modules/meeting/config/locales/crowdin/es.yml +++ b/modules/meeting/config/locales/crowdin/es.yml @@ -60,7 +60,7 @@ es: end_date: "Fecha de finalización" iterations: "Repeticiones" recurring_meeting_interim_response: - start_time: "Start time" + start_time: "Hora de inicio" meeting_participant: invited: "Invitado" attended: "Ha asistido" @@ -68,12 +68,12 @@ es: errors: models: meeting_participant: - user_invalid: "is not a valid participant." + user_invalid: "no es un participante válido." meeting_agenda_item: - section_not_belong_to_meeting: "Section does not belong to the same meeting." - user_invalid: "is not a valid participant." + section_not_belong_to_meeting: "La sección no pertenece a la misma reunión." + user_invalid: "no es un participante válido." recurring_meeting_interim_response: - not_an_occurrence: "is not a valid occurrence time for this recurring meeting" + not_an_occurrence: "no es una hora de repetición válida para esta reunión periódica" recurring_meeting: must_cover_existing_meetings: one: "Hay una reunión abierta en la serie que no está cubierta por el nuevo calendario. Ajuste el calendario para incluir todas las reuniones existentes." @@ -118,13 +118,13 @@ es: error_notification_with_errors: "Error al enviar la notificación. Los siguientes destinatarios no han sido notificados: %{recipients}" label_meeting: "Reunión" label_meeting_plural: "Reuniones" - label_meeting_templates: "Templates" - label_meeting_template: "Template" - label_meeting_template_new: "New template" - label_meeting_template_create: "Create template" - label_meeting_template_delete: "Delete template" - label_meeting_template_edit: "Edit template" - label_meeting_create_from_template: "Create meeting from template" + label_meeting_templates: "Plantillas" + label_meeting_template: "Plantilla" + label_meeting_template_new: "Nueva plantilla" + label_meeting_template_create: "Crear plantilla" + label_meeting_template_delete: "Eliminar plantilla" + label_meeting_template_edit: "Editar plantilla" + label_meeting_create_from_template: "Crear una reunión a partir de una plantilla" label_meeting_new: "Nueva reunión" label_meeting_new_dynamic: "Nueva reunión única" label_meeting_new_recurring: "Nueva reunión periódica" @@ -194,8 +194,8 @@ es: label_time_zone: "Zona horaria" label_start_date: "Fecha de inicio" label_subscribe_icalendar: "Suscribirse al calendario" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" - caption_template_project_select: "Please select the project in which to create this meeting template" + caption_meeting_template_select: "Seleccione una plantilla para copiar automáticamente sus puntos del orden del día" + caption_template_project_select: "Seleccione el proyecto en el que desea crear esta plantilla de reunión" meeting: participants: label: @@ -289,8 +289,8 @@ es: confirmation_message_html: > Esta acción no es reversible. Proceda con precaución. template: - title: "Delete template" - heading: "Delete this template?" + title: "Eliminar plantilla" + heading: "¿Eliminar esta plantilla?" occurrence: title: "Cancelar repetición de reunión" heading: "¿Desea cancelar esta repetición de reunión?" @@ -490,7 +490,7 @@ es: end_series_dialog: title: "Finalizar serie de reuniones" notice_successful_notification: "Actualización de calendario enviada por correo electrónico a todos los participantes" - notice_meeting_template_created: "Template successfully created" + notice_meeting_template_created: "Plantilla creada correctamente" notice_timezone_missing: No se ha establecido zona horaria y se asume %{zone}. Para elegir su zona horaria, por favor, haga clic aquí. notice_meeting_updated: "Esta página ha sido actualizada por otra persona. Recárguela para ver los cambios." permission_create_meetings: "Crear reuniones" @@ -505,8 +505,8 @@ es: text_duration_in_hours: "Duración en horas" text_in_hours: "en horas" text_meeting_agenda_for_meeting: 'agenda para la reunión "%{meeting}"' - text_meeting_template_blank_slate_heading: "There are no templates to display" - text_meeting_template_blank_slate: "You can create a new template for one-time meetings" + text_meeting_template_blank_slate_heading: "No hay plantillas que mostrar" + text_meeting_template_blank_slate: "Puede crear una nueva plantilla para reuniones únicas" text_meeting_series_end_early_heading: "¿Eliminar futuras repeticiones?" text_meeting_series_end_early: "Al finalizar la serie, se eliminarán todas las repeticiones futuras abiertas o programadas" text_meeting_closing_are_you_sure: "¿Seguro que quiere cerrar el orden del día de la reunión?" @@ -612,9 +612,9 @@ es: text_meeting_in_progress_dropdown_description: "Documente los resultados, como las necesidades de información o las decisiones tomadas durante la reunión." text_meeting_closed_dropdown_description: "Esta reunión está cerrada. Ya no puede modificar los puntos del orden del día ni los resultados." text_meeting_draft_banner: "Estás en modo Borrador. Esta reunión no enviará actualizaciones ni invitaciones de calendario, incluso si cambias los detalles de la reunión o añades/eliminas participantes." - 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." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." + text_onetime_meeting_template_banner: "Está editando una plantilla de reunión. Puede utilizar esta plantilla para crear reuniones únicas con un orden del día predefinido. Los cambios no afectarán a las reuniones ya creadas." + text_onetime_meeting_template_empty_heading: "Esta plantilla de reunión está vacía" + text_onetime_meeting_template_empty_description: "Añada aquí los puntos del orden del día, las secciones y los archivos adjuntos. Se incluirán en todas las reuniones creadas con esta plantilla." text_exit_draft_mode_dialog_title: "¿Abrir esta reunión y enviar invitaciones?" text_exit_draft_mode_dialog_subtitle: "Una vez programada una reunión, no puedes volver al modo Borrador." text_exit_draft_mode_dialog_template_title: "¿Abrir la primera repetición de esta serie de reuniones?" diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index cda7c7c33af..3314025a714 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -126,7 +126,6 @@ fr: label_meeting_template_edit: "Éditer le modèle" label_meeting_create_from_template: "Créer une réunion à partir d'un modèle" label_meeting_new: "Nouvelle réunion" - caption_meeting_template_select: "Sélectionnez un modèle pour copier automatiquement ses points de l'ordre du jour" label_meeting_new_dynamic: "Nouvelle réunion ponctuelle" label_meeting_new_recurring: "Nouvelle réunion récurrente" label_meeting_create: "Créer une réunion" @@ -195,6 +194,8 @@ fr: label_time_zone: "Fuseau horaire" label_start_date: "Date de début" label_subscribe_icalendar: "S'abonner au calendrier" + caption_meeting_template_select: "Sélectionnez un modèle pour copier automatiquement ses points de l'ordre du jour" + caption_template_project_select: "Veuillez sélectionner le projet dans lequel vous souhaitez créer ce modèle de réunion" meeting: participants: label: @@ -613,7 +614,7 @@ fr: text_meeting_draft_banner: "Vous êtes actuellement en mode brouillon. Cette réunion n'enverra pas de mises à jour de calendrier ni d'invitations, même si vous modifiez les détails de la réunion ou si vous ajoutez/supprimez des participants." text_onetime_meeting_template_banner: "Vous êtes en train de modifier un modèle de réunion. Vous pouvez utiliser ce modèle pour créer des réunions ponctuelles avec un ordre du jour prédéfini. Les modifications n'affecteront pas les réunions déjà créées." text_onetime_meeting_template_empty_heading: "Ce modèle de réunion est vide" - text_onetime_meeting_template_description: "Ajoutez des éléments à l'ordre du jour et des pièces jointes à ce modèle. Ils seront inclus dans chaque réunion basée sur ce modèle." + text_onetime_meeting_template_empty_description: "Ajoutez ici les points de l'ordre du jour, les sections et les pièces jointes. Ils seront inclus dans toutes les réunions créées à l'aide de ce modèle." text_exit_draft_mode_dialog_title: "Ouvrez cette réunion et envoyez des invitations ?" text_exit_draft_mode_dialog_subtitle: "Vous ne pouvez pas revenir au mode brouillon une fois que vous avez planifié une réunion." text_exit_draft_mode_dialog_template_title: "Ouvrez la première occurrence de cette série de réunions ?" diff --git a/modules/meeting/config/locales/crowdin/it.yml b/modules/meeting/config/locales/crowdin/it.yml index 65cfe8e20cb..934a7b4eb61 100644 --- a/modules/meeting/config/locales/crowdin/it.yml +++ b/modules/meeting/config/locales/crowdin/it.yml @@ -126,7 +126,6 @@ it: label_meeting_template_edit: "Modifica modello" label_meeting_create_from_template: "Crea una riunione da un modello" label_meeting_new: "Nuova riunione" - caption_meeting_template_select: "Seleziona un modello per copiare automaticamente i suoi elementi dell'ordine del giorno" label_meeting_new_dynamic: "Nuova riunione una tantum" label_meeting_new_recurring: "Nuova riunione ricorrente" label_meeting_create: "Crea riunione" @@ -195,6 +194,8 @@ it: label_time_zone: "Fuso orario" label_start_date: "Data di inizio" label_subscribe_icalendar: "Iscriviti al calendario" + caption_meeting_template_select: "Seleziona un modello per copiare automaticamente i suoi elementi dell'ordine del giorno" + caption_template_project_select: "Seleziona il progetto in cui creare questo modello di riunione" meeting: participants: label: @@ -613,7 +614,7 @@ it: text_meeting_draft_banner: "Al momento sei in modalità bozza. Questa riunione non invierà alcun aggiornamento del calendario né inviti, anche in caso di modifica dei dettagli della riunione o di aggiunta o rimozione di partecipanti." text_onetime_meeting_template_banner: "Stai modificando un modello di riunione. Puoi utilizzare questo modello per creare riunioni singole con un ordine del giorno predefinito. Le modifiche non influiranno sulle riunioni già create." text_onetime_meeting_template_empty_heading: "Questo modello di riunione è vuoto" - text_onetime_meeting_template_description: "Aggiungi a questo modello i punti all'ordine del giorno e gli allegati. Saranno inclusi in ogni riunione basata su questo modello." + text_onetime_meeting_template_empty_description: "Aggiungi a questo modello i punti all'ordine del giorno, le sezioni e gli allegati. Saranno inclusi in ogni riunione creata usando questo modello." text_exit_draft_mode_dialog_title: "Aprire questa riunione e inviare gli inviti?" text_exit_draft_mode_dialog_subtitle: "Non può tornare alla modalità bozza una volta programmata una riunione." text_exit_draft_mode_dialog_template_title: "Aprire la prima occorrenza di questa serie di riunioni?" diff --git a/modules/meeting/config/locales/crowdin/ko.yml b/modules/meeting/config/locales/crowdin/ko.yml index 4aa067f248d..15d1d2ebab8 100644 --- a/modules/meeting/config/locales/crowdin/ko.yml +++ b/modules/meeting/config/locales/crowdin/ko.yml @@ -124,7 +124,6 @@ ko: label_meeting_template_edit: "템플릿 편집" label_meeting_create_from_template: "템플릿에서 미팅 만들기" label_meeting_new: "새 미팅" - caption_meeting_template_select: "템플릿을 선택하면 의제 항목이 자동으로 복사됩니다." label_meeting_new_dynamic: "새로운 일회성 미팅" label_meeting_new_recurring: "새로운 반복 미팅" label_meeting_create: "미팅 생성" @@ -190,6 +189,8 @@ ko: label_time_zone: "표준 시간대" label_start_date: "시작일" label_subscribe_icalendar: "캘린더 구독" + caption_meeting_template_select: "템플릿을 선택하면 의제 항목이 자동으로 복사됩니다." + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -606,7 +607,7 @@ ko: text_meeting_draft_banner: "초안 모드에 현재 있습니다. 이 미팅은 미팅 세부 정보를 변경하거나 참가자를 추가/제거하더라도 캘린더 업데이트나 초대장을 전송하지 않습니다." text_onetime_meeting_template_banner: "현재 미팅 템플릿을 편집하는 중입니다. 이 템플릿을 사용하여 사전 정의된 의제가 있는 일회성 미팅을 만들 수 있습니다. 변경 사항은 이미 생성된 미팅에 영향을 미치지 않습니다." text_onetime_meeting_template_empty_heading: "이 미팅 템플릿은 비어 있습니다" - text_onetime_meeting_template_description: "이 템플릿에 의제 항목과 첨부 파일을 추가하세요. 이 템플릿에 기반한 모든 미팅에 해당 의제 항목과 첨부 파일이 포함됩니다." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "이 미팅을 열고 초대장을 보내시겠습니까?" text_exit_draft_mode_dialog_subtitle: "미팅을 예약한 후에는 초안 모드로 돌아갈 수 없습니다." text_exit_draft_mode_dialog_template_title: "이 미팅 시리즈의 첫 번째 항목을 열어보시겠습니까?" diff --git a/modules/meeting/config/locales/crowdin/pt-BR.yml b/modules/meeting/config/locales/crowdin/pt-BR.yml index e5860858f26..afbd98bf1a4 100644 --- a/modules/meeting/config/locales/crowdin/pt-BR.yml +++ b/modules/meeting/config/locales/crowdin/pt-BR.yml @@ -126,7 +126,6 @@ pt-BR: label_meeting_template_edit: "Editar modelo" label_meeting_create_from_template: "Criar reunião a partir de um modelo" label_meeting_new: "Nova Reunião" - caption_meeting_template_select: "Selecione um modelo para copiar automaticamente os itens da pauta" label_meeting_new_dynamic: "Nova reunião única" label_meeting_new_recurring: "Nova reunião recorrente" label_meeting_create: "Criar reunião" @@ -195,6 +194,8 @@ pt-BR: label_time_zone: "Fuso horário" label_start_date: "Data de início" label_subscribe_icalendar: "Assinar calendário" + caption_meeting_template_select: "Selecione um modelo para copiar automaticamente os itens da pauta" + caption_template_project_select: "Selecione o projeto no qual deseja criar este modelo de reunião" meeting: participants: label: @@ -613,7 +614,7 @@ pt-BR: text_meeting_draft_banner: "Você está no modo rascunho. Esta reunião não enviará nenhuma atualização de calendário ou convite, mesmo que você altere os detalhes da reunião ou adicione/remoca participantes." text_onetime_meeting_template_banner: "Você está editando um modelo de reunião. Pode usar este modelo para criar reuniões pontuais com uma pauta predefinida. Alterações não afetarão reuniões já criadas." text_onetime_meeting_template_empty_heading: "Este modelo de reunião está vazio" - text_onetime_meeting_template_description: "Adicione itens da pauta e anexos a este modelo. Eles serão incluídos em todas as reuniões baseadas neste modelo." + text_onetime_meeting_template_empty_description: "Adicione aqui itens de pauta, seções e anexos. Eles serão incluídos em todas as reuniões criadas com este modelo." text_exit_draft_mode_dialog_title: "Abrir esta reunião e enviar convites?" text_exit_draft_mode_dialog_subtitle: "Não é possível voltar ao modo rascunho depois de agendar uma reunião." text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?" diff --git a/modules/meeting/config/locales/crowdin/zh-CN.yml b/modules/meeting/config/locales/crowdin/zh-CN.yml index 31d7c1e89fb..b4ec178cde3 100644 --- a/modules/meeting/config/locales/crowdin/zh-CN.yml +++ b/modules/meeting/config/locales/crowdin/zh-CN.yml @@ -124,7 +124,6 @@ zh-CN: label_meeting_template_edit: "编辑模板" label_meeting_create_from_template: "根据模板创建会议" label_meeting_new: "新增会议" - caption_meeting_template_select: "选择一个模板,以自动复制其议程条目" label_meeting_new_dynamic: "新的动态会议" label_meeting_new_recurring: "新的定期会议" label_meeting_create: "创建会议" @@ -190,6 +189,8 @@ zh-CN: label_time_zone: "时区" label_start_date: "开始日期" label_subscribe_icalendar: "订阅日历" + caption_meeting_template_select: "选择一个模板,以自动复制其议程条目" + caption_template_project_select: "请选择要在其中创建此会议模板的项目" meeting: participants: label: @@ -606,7 +607,7 @@ zh-CN: text_meeting_draft_banner: "您目前处于草稿模式。即使您更改了会议详细信息或添加/移除了参与者,此会议也不会发送任何日历更新或邀请。" text_onetime_meeting_template_banner: "您当前正在编辑会议模板。您可以使用此模板创建具有预定义议程的一次性会议。更改不会影响已创建的会议。" text_onetime_meeting_template_empty_heading: "此会议模板为空" - text_onetime_meeting_template_description: "将议程条目和附件添加到此模板。所有基于此模板的会议都将包含这些内容。" + text_onetime_meeting_template_empty_description: "在此处添加议程条目、部分和附件。使用此模板创建的每个会议都将包含这些内容。" text_exit_draft_mode_dialog_title: "是否打开此会议并发送邀请?" text_exit_draft_mode_dialog_subtitle: "会议安排完成后,您将无法返回到草稿模式。" text_exit_draft_mode_dialog_template_title: "是否打开此会议系列的第一个会议?" diff --git a/modules/reporting/config/locales/crowdin/th.yml b/modules/reporting/config/locales/crowdin/th.yml index b56be338b8a..2db674e4636 100644 --- a/modules/reporting/config/locales/crowdin/th.yml +++ b/modules/reporting/config/locales/crowdin/th.yml @@ -70,7 +70,7 @@ th: label_filter: "ตัวกรอง" label_filter_add: "Add Filter" label_filter_plural: "ตัวกรอง" - label_group_by: "Group by" + label_group_by: "จัดกลุ่มโดย" label_group_by_add: "Add Group-by Attribute" label_inactive: "«inactive»" label_no: "ไม่ใช่" diff --git a/modules/team_planner/config/locales/crowdin/th.yml b/modules/team_planner/config/locales/crowdin/th.yml index ad371eda7f9..aaac0dbfcf3 100644 --- a/modules/team_planner/config/locales/crowdin/th.yml +++ b/modules/team_planner/config/locales/crowdin/th.yml @@ -3,12 +3,12 @@ th: plugin_openproject_team_planner: name: "OpenProject Team Planner" description: "Provides team planner views." - permission_view_team_planner: "View team planner" - permission_manage_team_planner: "Manage team planner" - project_module_team_planner_view: "Team planners" + permission_view_team_planner: "ดูตัววางแผนทีม" + permission_manage_team_planner: "จัดการตัววางแผนทีม" + project_module_team_planner_view: "ผู้วางแผนทีม" ee: feature_names: - team_planner_view: "Team planner" + team_planner_view: "ผู้วางแผนทีม" upsell: team_planner_view: title: "Team planner" diff --git a/modules/xls_export/config/locales/crowdin/th.yml b/modules/xls_export/config/locales/crowdin/th.yml index 8986981ef7b..a08c8cb29df 100644 --- a/modules/xls_export/config/locales/crowdin/th.yml +++ b/modules/xls_export/config/locales/crowdin/th.yml @@ -2,15 +2,15 @@ th: plugin_openproject_xls_export: name: "OpenProject XLS Export" description: "Export issue lists as Excel spreadsheets (.xls)." - export_to_excel: "Export XLS" - print_with_description: "Print preview with description" - sentence_separator_or: "or" - different_formats: Different formats + export_to_excel: "ส่งออกไฟล์ XLS" + print_with_description: "แสดงตัวอย่างการพิมพ์พร้อมคำอธิบาย" + sentence_separator_or: "หรือ" + different_formats: รูปแบบอื่น ๆ export: format: xls: "XLS" - xls_with_descriptions: "XLS with descriptions" - xls_with_relations: "XLS with relations" + xls_with_descriptions: "ไฟล์ XLS พร้อมคำอธิบาย" + xls_with_relations: "ไฟล์ XLS พร้อมความสัมพันธ์" xls_export: - child_of: child of - parent_of: parent of + child_of: เป็นรายการย่อยของ + parent_of: เป็นรายการหลักของ From 368fab70aa4cc416528d741f674298a136658a46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Mar 2026 06:07:05 -0300 Subject: [PATCH 180/334] Bump the html-eslint group in /frontend with 2 updates (#22257) Bumps the html-eslint group in /frontend with 2 updates: [@html-eslint/eslint-plugin](https://github.com/yeonjuan/html-eslint) and [@html-eslint/parser](https://github.com/yeonjuan/html-eslint). Updates `@html-eslint/eslint-plugin` from 0.55.0 to 0.56.0 - [Release notes](https://github.com/yeonjuan/html-eslint/releases) - [Commits](https://github.com/yeonjuan/html-eslint/compare/v0.55.0...v0.56.0) Updates `@html-eslint/parser` from 0.55.0 to 0.56.0 - [Release notes](https://github.com/yeonjuan/html-eslint/releases) - [Commits](https://github.com/yeonjuan/html-eslint/compare/v0.55.0...v0.56.0) --- updated-dependencies: - dependency-name: "@html-eslint/eslint-plugin" dependency-version: 0.56.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: html-eslint - dependency-name: "@html-eslint/parser" dependency-version: 0.56.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: html-eslint ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 159 ++++++++++++++++++++++--------------- frontend/package.json | 4 +- 2 files changed, 95 insertions(+), 68 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b13ff351019..b6cc17786b5 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -138,8 +138,8 @@ "@angular-eslint/template-parser": "20.7.0", "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", - "@html-eslint/eslint-plugin": "^0.55.0", - "@html-eslint/parser": "^0.55.0", + "@html-eslint/eslint-plugin": "^0.56.0", + "@html-eslint/parser": "^0.56.0", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@stylistic/eslint-plugin": "^5.7.1", "@types/codemirror": "5.60.5", @@ -4804,9 +4804,9 @@ } }, "node_modules/@eslint/css-tree": { - "version": "3.6.8", - "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-3.6.8.tgz", - "integrity": "sha512-s0f40zY7dlMp8i0Jf0u6l/aSswS0WRAgkhgETgiCJRcxIWb4S/Sp9uScKHWbkM3BnoFLbJbmOYk5AZUDFVxaLA==", + "version": "3.6.9", + "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-3.6.9.tgz", + "integrity": "sha512-3D5/OHibNEGk+wKwNwMbz63NMf367EoR4mVNNpxddCHKEb2Nez7z62J2U6YjtErSsZDoY0CsccmoUpdEbkogNA==", "dev": true, "dependencies": { "mdn-data": "2.23.0", @@ -5287,18 +5287,32 @@ "@rails/actioncable": ">=7.0" } }, + "node_modules/@html-eslint/core": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.56.0.tgz", + "integrity": "sha512-xbgEwKMFVZXZdr/43irrXTs6z+lijKDSWt5Zi7CRCyc1cdf7J6dQDT9QDInuwadJJEqc/er+VVjFNY/Ymv9GCA==", + "dev": true, + "dependencies": { + "@html-eslint/types": "^0.56.0", + "eslint": "^9.39.1", + "html-standard": "^0.0.13" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@html-eslint/eslint-plugin": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.55.0.tgz", - "integrity": "sha512-mNmw8Eedu1x6ZjstfniqDp4dA70EXzJIfyzxe7X5Olgaih9w4t1CsnH5XJwsWEYMvOheiv71pDsQne+C4EfgDg==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.56.0.tgz", + "integrity": "sha512-CEJDF8O9ObZvRjJm5igNW+th11xvsXVKFXvnWKKnbaXNufPVdKMbC/GA4RoYKKc4R6tI0lhQz5qPEVNWrWiOew==", "dev": true, "dependencies": { "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/parser": "^0.55.0", - "@html-eslint/template-parser": "^0.55.0", - "@html-eslint/template-syntax-parser": "^0.55.0", - "@html-eslint/types": "^0.55.0", - "html-standard": "^0.0.11" + "@html-eslint/core": "^0.56.0", + "@html-eslint/parser": "^0.56.0", + "@html-eslint/template-parser": "^0.56.0", + "@html-eslint/template-syntax-parser": "^0.56.0", + "@html-eslint/types": "^0.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5308,41 +5322,41 @@ } }, "node_modules/@html-eslint/parser": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.55.0.tgz", - "integrity": "sha512-Pa83FiD56am3NG3mn+L9xDrL4y0HTAcEyWZxETRbIbcfzac5kwUzzWyMl5fSEMbmdSbpB9so0di9OijTXqkEfg==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.56.0.tgz", + "integrity": "sha512-QpUW88eu/LDws5ImzqoTbZjeQ4xTDlWPoP7IqSxQLSFQa0Ixkyw9x/LN/azJfaJNwCv9U94eNRSDCOjDNAh0gA==", "dev": true, "dependencies": { - "@eslint/css-tree": "^3.6.8", - "@html-eslint/template-syntax-parser": "^0.55.0", - "@html-eslint/types": "^0.55.0", + "@eslint/css-tree": "^3.6.9", + "@html-eslint/template-syntax-parser": "^0.56.0", + "@html-eslint/types": "^0.56.0", "css-tree": "^3.1.0", "es-html-parser": "0.3.1" } }, "node_modules/@html-eslint/template-parser": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.55.0.tgz", - "integrity": "sha512-vxRYwgAxpdLyhS+5lAiYKbQ+ueRS2v2Go8TxatEc6xCasJ9h3snJ8zoe4dj0N3NYxRfW2Vo1FmUoDFkrW7ynhA==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.56.0.tgz", + "integrity": "sha512-zd4IV/PSaiOiS2W7129J+G6QOLfocno8UHAcm/+w/oKrCXr9EyIhJj9bx7ZBYMvLYBSF8hndpIBoBppegIy4iQ==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.55.0", + "@html-eslint/types": "^0.56.0", "es-html-parser": "0.3.1" } }, "node_modules/@html-eslint/template-syntax-parser": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.55.0.tgz", - "integrity": "sha512-IRle7gxcTZsqQDwWDoWNLVBgX0z9m+PddmK+gYMZTNwrxcwvQEUj3wchhyBhUt4/7ZSvmIttJYQrfG+HbhhE+w==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.56.0.tgz", + "integrity": "sha512-vH5YGgODce8cUwwgDa0UoAc2Ta4HnAm2mlJ0wuBjbXk6fzE7mkmoyk23k80W79zAssgJ0+r5s7mvAdIFCyAQjw==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.55.0" + "@html-eslint/types": "^0.56.0" } }, "node_modules/@html-eslint/types": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.55.0.tgz", - "integrity": "sha512-jJCy/mazjjVvErlTnRozLThi+T0fHayi6kGYThUzWDVWBGdQTIrrZqbvYSQYnA1i0zAWc+mDa3KyQENjcF3Bdw==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.56.0.tgz", + "integrity": "sha512-e4mVkBa1/UAO4hWj2xej7UX5Ij0uWyaNpDNPOzuo4ON2ftk80Cz7RobRkd49GQ8pk4WXeIfaXCMU2HeHqz0Jzg==", "dev": true, "dependencies": { "@types/css-tree": "^2.3.11", @@ -15812,12 +15826,13 @@ } }, "node_modules/html-standard": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/html-standard/-/html-standard-0.0.11.tgz", - "integrity": "sha512-X5QWANKpR6WNWWqC8Gdhj9QuovKPL0XsPoPMx4XXjpbbOEsUDuARJ9S9bVGn27hrtJM8UlfEghdHkuSu3W8GIg==", + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/html-standard/-/html-standard-0.0.13.tgz", + "integrity": "sha512-6oNfW3c1t44O7jVXu0tp4E5MbHifWlXrHlZBPt6y7vFdgLOUUh8hyzoRhfUgozlBUK6oLLYhqP1uIqbZ8ggcBA==", "dev": true, "dependencies": { - "vscode-css-languageservice": "^6.3.9" + "vscode-css-languageservice": "^6.3.9", + "vscode-languageserver-textdocument": "^1.0.12" } }, "node_modules/html-void-elements": { @@ -28710,9 +28725,9 @@ } }, "@eslint/css-tree": { - "version": "3.6.8", - "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-3.6.8.tgz", - "integrity": "sha512-s0f40zY7dlMp8i0Jf0u6l/aSswS0WRAgkhgETgiCJRcxIWb4S/Sp9uScKHWbkM3BnoFLbJbmOYk5AZUDFVxaLA==", + "version": "3.6.9", + "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-3.6.9.tgz", + "integrity": "sha512-3D5/OHibNEGk+wKwNwMbz63NMf367EoR4mVNNpxddCHKEb2Nez7z62J2U6YjtErSsZDoY0CsccmoUpdEbkogNA==", "dev": true, "requires": { "mdn-data": "2.23.0", @@ -29070,56 +29085,67 @@ "@rails/actioncable": ">=7.0" } }, + "@html-eslint/core": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.56.0.tgz", + "integrity": "sha512-xbgEwKMFVZXZdr/43irrXTs6z+lijKDSWt5Zi7CRCyc1cdf7J6dQDT9QDInuwadJJEqc/er+VVjFNY/Ymv9GCA==", + "dev": true, + "requires": { + "@html-eslint/types": "^0.56.0", + "eslint": "^9.39.1", + "html-standard": "^0.0.13" + } + }, "@html-eslint/eslint-plugin": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.55.0.tgz", - "integrity": "sha512-mNmw8Eedu1x6ZjstfniqDp4dA70EXzJIfyzxe7X5Olgaih9w4t1CsnH5XJwsWEYMvOheiv71pDsQne+C4EfgDg==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.56.0.tgz", + "integrity": "sha512-CEJDF8O9ObZvRjJm5igNW+th11xvsXVKFXvnWKKnbaXNufPVdKMbC/GA4RoYKKc4R6tI0lhQz5qPEVNWrWiOew==", "dev": true, "requires": { "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/parser": "^0.55.0", - "@html-eslint/template-parser": "^0.55.0", - "@html-eslint/template-syntax-parser": "^0.55.0", - "@html-eslint/types": "^0.55.0", - "html-standard": "^0.0.11" + "@html-eslint/core": "^0.56.0", + "@html-eslint/parser": "^0.56.0", + "@html-eslint/template-parser": "^0.56.0", + "@html-eslint/template-syntax-parser": "^0.56.0", + "@html-eslint/types": "^0.56.0" } }, "@html-eslint/parser": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.55.0.tgz", - "integrity": "sha512-Pa83FiD56am3NG3mn+L9xDrL4y0HTAcEyWZxETRbIbcfzac5kwUzzWyMl5fSEMbmdSbpB9so0di9OijTXqkEfg==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.56.0.tgz", + "integrity": "sha512-QpUW88eu/LDws5ImzqoTbZjeQ4xTDlWPoP7IqSxQLSFQa0Ixkyw9x/LN/azJfaJNwCv9U94eNRSDCOjDNAh0gA==", "dev": true, "requires": { - "@eslint/css-tree": "^3.6.8", - "@html-eslint/template-syntax-parser": "^0.55.0", - "@html-eslint/types": "^0.55.0", + "@eslint/css-tree": "^3.6.9", + "@html-eslint/template-syntax-parser": "^0.56.0", + "@html-eslint/types": "^0.56.0", "css-tree": "^3.1.0", "es-html-parser": "0.3.1" } }, "@html-eslint/template-parser": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.55.0.tgz", - "integrity": "sha512-vxRYwgAxpdLyhS+5lAiYKbQ+ueRS2v2Go8TxatEc6xCasJ9h3snJ8zoe4dj0N3NYxRfW2Vo1FmUoDFkrW7ynhA==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.56.0.tgz", + "integrity": "sha512-zd4IV/PSaiOiS2W7129J+G6QOLfocno8UHAcm/+w/oKrCXr9EyIhJj9bx7ZBYMvLYBSF8hndpIBoBppegIy4iQ==", "dev": true, "requires": { - "@html-eslint/types": "^0.55.0", + "@html-eslint/types": "^0.56.0", "es-html-parser": "0.3.1" } }, "@html-eslint/template-syntax-parser": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.55.0.tgz", - "integrity": "sha512-IRle7gxcTZsqQDwWDoWNLVBgX0z9m+PddmK+gYMZTNwrxcwvQEUj3wchhyBhUt4/7ZSvmIttJYQrfG+HbhhE+w==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.56.0.tgz", + "integrity": "sha512-vH5YGgODce8cUwwgDa0UoAc2Ta4HnAm2mlJ0wuBjbXk6fzE7mkmoyk23k80W79zAssgJ0+r5s7mvAdIFCyAQjw==", "dev": true, "requires": { - "@html-eslint/types": "^0.55.0" + "@html-eslint/types": "^0.56.0" } }, "@html-eslint/types": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.55.0.tgz", - "integrity": "sha512-jJCy/mazjjVvErlTnRozLThi+T0fHayi6kGYThUzWDVWBGdQTIrrZqbvYSQYnA1i0zAWc+mDa3KyQENjcF3Bdw==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.56.0.tgz", + "integrity": "sha512-e4mVkBa1/UAO4hWj2xej7UX5Ij0uWyaNpDNPOzuo4ON2ftk80Cz7RobRkd49GQ8pk4WXeIfaXCMU2HeHqz0Jzg==", "dev": true, "requires": { "@types/css-tree": "^2.3.11", @@ -36027,12 +36053,13 @@ } }, "html-standard": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/html-standard/-/html-standard-0.0.11.tgz", - "integrity": "sha512-X5QWANKpR6WNWWqC8Gdhj9QuovKPL0XsPoPMx4XXjpbbOEsUDuARJ9S9bVGn27hrtJM8UlfEghdHkuSu3W8GIg==", + "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-css-languageservice": "^6.3.9", + "vscode-languageserver-textdocument": "^1.0.12" } }, "html-void-elements": { diff --git a/frontend/package.json b/frontend/package.json index 09dfda7f2a4..42bab64df40 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,8 +14,8 @@ "@angular-eslint/template-parser": "20.7.0", "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", - "@html-eslint/eslint-plugin": "^0.55.0", - "@html-eslint/parser": "^0.55.0", + "@html-eslint/eslint-plugin": "^0.56.0", + "@html-eslint/parser": "^0.56.0", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@stylistic/eslint-plugin": "^5.7.1", "@types/codemirror": "5.60.5", From 0529bc22d366d50a5c5aae4761e17389413b87cf Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Mon, 9 Mar 2026 11:48:14 +0000 Subject: [PATCH 181/334] update locales from crowdin [ci skip] --- config/locales/crowdin/es.yml | 2 +- config/locales/crowdin/ko.yml | 62 ++-- config/locales/crowdin/uk.yml | 266 +++++++++--------- .../backlogs/config/locales/crowdin/af.yml | 5 +- .../backlogs/config/locales/crowdin/ar.yml | 5 +- .../backlogs/config/locales/crowdin/az.yml | 5 +- .../backlogs/config/locales/crowdin/be.yml | 5 +- .../backlogs/config/locales/crowdin/bg.yml | 5 +- .../backlogs/config/locales/crowdin/ca.yml | 5 +- .../config/locales/crowdin/ckb-IR.yml | 5 +- .../backlogs/config/locales/crowdin/cs.yml | 5 +- .../backlogs/config/locales/crowdin/da.yml | 5 +- .../backlogs/config/locales/crowdin/de.yml | 5 +- .../backlogs/config/locales/crowdin/el.yml | 5 +- .../backlogs/config/locales/crowdin/eo.yml | 5 +- .../backlogs/config/locales/crowdin/es.yml | 5 +- .../backlogs/config/locales/crowdin/et.yml | 5 +- .../backlogs/config/locales/crowdin/eu.yml | 5 +- .../backlogs/config/locales/crowdin/fa.yml | 5 +- .../backlogs/config/locales/crowdin/fi.yml | 5 +- .../backlogs/config/locales/crowdin/fil.yml | 5 +- .../backlogs/config/locales/crowdin/fr.yml | 5 +- .../backlogs/config/locales/crowdin/he.yml | 5 +- .../backlogs/config/locales/crowdin/hi.yml | 5 +- .../backlogs/config/locales/crowdin/hr.yml | 5 +- .../backlogs/config/locales/crowdin/hu.yml | 5 +- .../backlogs/config/locales/crowdin/id.yml | 5 +- .../backlogs/config/locales/crowdin/it.yml | 5 +- .../backlogs/config/locales/crowdin/ja.yml | 5 +- .../backlogs/config/locales/crowdin/ka.yml | 5 +- .../backlogs/config/locales/crowdin/kk.yml | 5 +- .../backlogs/config/locales/crowdin/ko.yml | 5 +- .../backlogs/config/locales/crowdin/lt.yml | 5 +- .../backlogs/config/locales/crowdin/lv.yml | 5 +- .../backlogs/config/locales/crowdin/mn.yml | 5 +- .../backlogs/config/locales/crowdin/ms.yml | 5 +- .../backlogs/config/locales/crowdin/ne.yml | 5 +- .../backlogs/config/locales/crowdin/nl.yml | 5 +- .../backlogs/config/locales/crowdin/no.yml | 5 +- .../backlogs/config/locales/crowdin/pl.yml | 5 +- .../backlogs/config/locales/crowdin/pt-BR.yml | 5 +- .../backlogs/config/locales/crowdin/pt-PT.yml | 5 +- .../backlogs/config/locales/crowdin/ro.yml | 5 +- .../backlogs/config/locales/crowdin/ru.yml | 5 +- .../backlogs/config/locales/crowdin/rw.yml | 5 +- .../backlogs/config/locales/crowdin/si.yml | 5 +- .../backlogs/config/locales/crowdin/sk.yml | 5 +- .../backlogs/config/locales/crowdin/sl.yml | 5 +- .../backlogs/config/locales/crowdin/sr.yml | 5 +- .../backlogs/config/locales/crowdin/sv.yml | 5 +- .../backlogs/config/locales/crowdin/th.yml | 5 +- .../backlogs/config/locales/crowdin/tr.yml | 5 +- .../backlogs/config/locales/crowdin/uk.yml | 73 ++--- .../backlogs/config/locales/crowdin/uz.yml | 5 +- .../backlogs/config/locales/crowdin/vi.yml | 5 +- .../backlogs/config/locales/crowdin/zh-CN.yml | 5 +- .../backlogs/config/locales/crowdin/zh-TW.yml | 5 +- modules/boards/config/locales/crowdin/uk.yml | 2 +- modules/budgets/config/locales/crowdin/ko.yml | 10 +- modules/budgets/config/locales/crowdin/uk.yml | 24 +- modules/costs/config/locales/crowdin/uk.yml | 18 +- .../documents/config/locales/crowdin/uk.yml | 6 +- modules/meeting/config/locales/crowdin/af.yml | 6 + modules/meeting/config/locales/crowdin/ar.yml | 6 + modules/meeting/config/locales/crowdin/az.yml | 6 + modules/meeting/config/locales/crowdin/be.yml | 6 + modules/meeting/config/locales/crowdin/bg.yml | 6 + modules/meeting/config/locales/crowdin/ca.yml | 6 + .../meeting/config/locales/crowdin/ckb-IR.yml | 6 + modules/meeting/config/locales/crowdin/cs.yml | 6 + modules/meeting/config/locales/crowdin/da.yml | 6 + modules/meeting/config/locales/crowdin/de.yml | 46 +-- modules/meeting/config/locales/crowdin/el.yml | 6 + modules/meeting/config/locales/crowdin/eo.yml | 6 + modules/meeting/config/locales/crowdin/es.yml | 6 + modules/meeting/config/locales/crowdin/et.yml | 6 + modules/meeting/config/locales/crowdin/eu.yml | 6 + modules/meeting/config/locales/crowdin/fa.yml | 6 + modules/meeting/config/locales/crowdin/fi.yml | 6 + .../meeting/config/locales/crowdin/fil.yml | 6 + modules/meeting/config/locales/crowdin/fr.yml | 6 + modules/meeting/config/locales/crowdin/he.yml | 6 + modules/meeting/config/locales/crowdin/hi.yml | 6 + modules/meeting/config/locales/crowdin/hr.yml | 6 + modules/meeting/config/locales/crowdin/hu.yml | 6 + modules/meeting/config/locales/crowdin/id.yml | 6 + modules/meeting/config/locales/crowdin/it.yml | 6 + modules/meeting/config/locales/crowdin/ja.yml | 6 + modules/meeting/config/locales/crowdin/ka.yml | 6 + modules/meeting/config/locales/crowdin/kk.yml | 6 + modules/meeting/config/locales/crowdin/ko.yml | 24 +- modules/meeting/config/locales/crowdin/lt.yml | 6 + modules/meeting/config/locales/crowdin/lv.yml | 6 + modules/meeting/config/locales/crowdin/mn.yml | 6 + modules/meeting/config/locales/crowdin/ms.yml | 6 + modules/meeting/config/locales/crowdin/ne.yml | 6 + modules/meeting/config/locales/crowdin/nl.yml | 6 + modules/meeting/config/locales/crowdin/no.yml | 6 + modules/meeting/config/locales/crowdin/pl.yml | 6 + .../meeting/config/locales/crowdin/pt-BR.yml | 6 + .../meeting/config/locales/crowdin/pt-PT.yml | 6 + modules/meeting/config/locales/crowdin/ro.yml | 6 + modules/meeting/config/locales/crowdin/ru.yml | 6 + modules/meeting/config/locales/crowdin/rw.yml | 6 + modules/meeting/config/locales/crowdin/si.yml | 6 + modules/meeting/config/locales/crowdin/sk.yml | 6 + modules/meeting/config/locales/crowdin/sl.yml | 6 + modules/meeting/config/locales/crowdin/sr.yml | 6 + modules/meeting/config/locales/crowdin/sv.yml | 6 + modules/meeting/config/locales/crowdin/th.yml | 6 + modules/meeting/config/locales/crowdin/tr.yml | 6 + modules/meeting/config/locales/crowdin/uk.yml | 42 +-- modules/meeting/config/locales/crowdin/uz.yml | 6 + modules/meeting/config/locales/crowdin/vi.yml | 6 + .../meeting/config/locales/crowdin/zh-CN.yml | 6 + .../meeting/config/locales/crowdin/zh-TW.yml | 6 + 116 files changed, 762 insertions(+), 384 deletions(-) diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index b1840159515..826ed540164 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -181,7 +181,7 @@ es: projects_meta_done: "Información recopilada" importing: "En curso" import_error: "Error durante la importación" - imported: "Review mode" + imported: "Modo de revisión" reverting: "Revirtiendo" revert_error: "Error durante la reversión" reverted: "Revertido" diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 5ba9a11f023..3f0968b53ba 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -125,7 +125,7 @@ ko: new: "새 구성" banner: title: "제한된 가져오기" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + description: "이 가져오기 도구는 현재 베타 버전이며 프로젝트, 이슈(이름, 제목, 설명, 첨부 파일), 사용자(이름, 이메일, 프로젝트 멤버십), 상태 및 유형과 같은 기본 데이터만 가져올 수 있습니다. 워크플로, 사용자 지정 필드, 이슈 관계 또는 권한은 가져올 수 없습니다. Jira Server/Data Center 버전 10.x 및 11.x만 현재 지원합니다. 클라우드 인스턴스는 현재 지원되지 않습니다." form: fields: name: "이름" @@ -143,7 +143,7 @@ ko: failed: "연결 실패: 서버 정보를 검색할 수 없습니다" error: "연결을 테스트하는 동안 예기치 않은 오류가 발생했습니다" connection_error: "연결 오류: %{message}" - parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." + parse_error: "서버에서 응답을 구문 분석하지 못했습니다. 서버가 유효한 Jira 인스턴스가 아닐 수 있습니다." api_error: "Jira API가 오류 상태 %{status}을(를) 반환했습니다. Jira 인스턴스 URL 및 API 토큰을 확인하세요." token_error: "잘못된 API 토큰입니다. 구성에서 자격 증명을 확인하세요." missing_credentials: "URL과 개인 액세스 토큰을 모두 제공하여 연결을 테스트하세요" @@ -167,7 +167,7 @@ ko: title: "가져오기 실행이 아직 설정되지 않음" description: "가져오기 실행을 만들어서 이 Jira 인스턴스에서 정보 가져오기를 시작하세요" 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." + description: "가져오기를 실행할 때마다 다른 데이터 세트를 가져올 수 있습니다. 검토 모드에서 가져오기 실행은 직후에 실행 취소할 수 있지만 완료한 후에는 실행 취소할 수 없습니다." button_import_run: "가져오기 실행" button_edit_configuration: "구성 편집" status: @@ -216,8 +216,8 @@ ko: fetch_data: title: "인스턴스 메타 데이터 가져오기" caption_done: "완료됨" - description: "Check what data is available for import in the host Jira instance." - button_fetch: "Check available data" + description: "호스트 Jira 인스턴스에서 가져올 수 있는 데이터를 확인하세요." + button_fetch: "사용 가능한 데이터 확인" label_progress: "Jira에서 데이터를 가져오는 중..." groups_and_users: title: "그룹 및 사용자" @@ -225,8 +225,8 @@ ko: title: "가져오기 범위" caption: "OpenProject로 가져올 항목을 선택합니다" caption_done: "완료됨" - 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 URL 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_info: "이 가져오기 도구는 베타 버전이며 일부 유형의 데이터를 가져올 수 없다는 점에 유의하세요. 호스트 Jira 인스턴스 URL에서 가져오기용으로 제공하는 항목과 이 도구에서 현재 가져올 수 있는 항목에 대한 요약은 다음과 같습니다." + description: "호스트 Jira 인스턴스에서 가져온 사용 가능한 데이터에서 가져올 데이터를 선택합니다." label_available_data: "사용 가능한 데이터" label_not_available_data: "가져오기에 사용할 수 없음" button_select_projects: "가져올 프로젝트 선택" @@ -237,11 +237,11 @@ ko: label_progress: "Jira에서 데이터를 가져오는 중..." elements: relations: "이슈 간의 관계" - workflows: "Project-level workflows" + workflows: "프로젝트 수준 워크플로" users: "사용자" sprints: "스프린트" schemes: "스키마" - permissions: "User, group and project permissions" + permissions: "사용자, 그룹 및 프로젝트 권한" confirm_import: title: "데이터 가져오기" caption: "가져오기 설정을 검토하고 가져오기를 시작합니다" @@ -279,7 +279,7 @@ ko: title: "프로젝트 선택" 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." + description: "모델 컨텍스트 프로토콜을 통해 AI 에이전트는 이 OpenProject 인스턴스에 의해 노출된 도구와 리소스를 사용자에게 제공할 수 있습니다. 이 기능은 아직 베타 버전입니다." resources_heading: "리소스" resources_description: "OpenProject는 다음 리소스를 구현합니다. 원하는 대로 각 도구를 활성화하고, 이름을 바꾸고, 설명할 수 있습니다. 자세한 내용은 [MCP 리소스의 문서](docs_url)를 참조하세요." resources_submit: "리소스 업데이트" @@ -592,7 +592,7 @@ ko: confirmation_live_message_unchecked: "진행 버튼이 이제 비활성화되었습니다. 계속하려면 확인란을 선택해야 합니다." mcp_configurations: server_url_component: - caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." + caption: "OpenProject MCP 서버에 연결할 수 있는 URL입니다. MCP 클라이언트를 설정하는 데 필요합니다." label: "서버 URL" op_dry_validation: or: "또는" @@ -797,7 +797,7 @@ ko: is_for_all_blank_slate: heading: 모든 프로젝트용 description: '"모든 프로젝트용" 옵션이 선택되었으므로 모든 프로젝트에서 이 프로젝트 특성이 활성화되었습니다. 개별 프로젝트에 대해 비활성화할 수 없습니다.' - enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. + enabled_via_assignee_when_submitted_html: 이 프로젝트 특성은 프로젝트 시작 요청 제출 시 담당자로 설정되었으므로 비활성화할 수 없습니다. types: no_results_title_text: 사용 가능한 타입이 없습니다. form: @@ -813,8 +813,8 @@ ko: new_label: "새로운 우선 순위" creation_wizard: errors: - no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." - no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." + no_work_package_type: "프로젝트 시작 요청을 사용하려면 활성 작업 패키지 유형이 하나 이상 필요하지만 이 프로젝트에는 하나도 없기 때문에 프로젝트 시작 요청을 활성화하지 못했습니다. 이 프로젝트에 작업 패키지 유형을 하나 이상 추가하세요." + no_status_when_submitted: "작업 패키지 유형 %{type}에는 연결된 상태가 하나 이상 필요하므로 프로젝트 시작 요청을 활성화하지 못했습니다. 이 작업 패키지 유형에 대한 상태 워크플로를 하나 이상 활성화하세요." export: description_attachment_export: "생성된 아티팩트는 아티팩트 작업 패키지에 PDF 첨부 파일로 저장됩니다." description_file_link_export: "아티팩트 작업 패키지에는 외부 파일 저장소에 저장된 PDF에 대한 파일 링크가 있습니다. 이 프로젝트에 대해 자동으로 관리되는 프로젝트 폴더가 있는 작업 파일 저장소가 필요합니다. 현재는 Nextcloud 파일 저장소만 지원됩니다." @@ -828,7 +828,7 @@ ko: label_request_submission: "요청 제출" project_attributes_description: > 프로젝트 시작 요청에 포함해야 하는 프로젝트 특성을 선택합니다. 이 목록에는 해당 프로젝트에 대해 활성화된 [프로젝트 특성](project_attributes_url)만 포함됩니다. - enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. + enabled_because_required_html: 이 프로젝트 특성은 필수로 정의되어 있으므로 이 프로젝트 시작 요청에 대해 비활성화할 수 없습니다. 이 특성은 인스턴스의 관리자가 관리 설정에서 변경할 수 있습니다. status: button_edit: 상태 편집 wizard: @@ -2704,9 +2704,9 @@ ko: title: "사용자 지정 작업" description: "사용자 지정 작업은 상태, 역할, 유형 또는 프로젝트를 기반으로 특정 작업 패키지에서 사용할 수 있도록 미리 정의된 작업 세트에 대한 원클릭 바로 가기입니다." mcp_server: - description: "Bring OpenProject into your AI workflows with a secure MCP server." + description: "안전한 MCP 서버를 사용하여 AI 워크플로에 OpenProject를 도입하세요." meeting_templates: - description: "Define meeting templates with a set agenda structure and save time by reusing them when creating new meetings." + description: "설정된 의제 구조로 미팅 템플릿을 정의하고, 새 미팅을 만들 때 이 템플릿을 재사용하여 시간을 절약하세요." nextcloud_sso: title: "Nextcloud 저장소용 Single Sign-On" description: "Single Sign-On을 사용하여 Nextcloud 저장소에 대한 원활하고 안전한 인증을 활성화합니다. 액세스 관리를 간소화하고 사용자 편의성을 개선합니다." @@ -3018,16 +3018,16 @@ ko: #We need to include the version to invalidate outdated translations in other locales "17_2": new_features_title: > - The release contains various new features and improvements, such as: + 이 릴리스에는 다음과 같은 다양한 새로운 기능과 개선 사항이 포함되어 있습니다. new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved accessibility - line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments. - line_4: PDF export enhancements - line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module - line_7: Harmonized custom field forms + line_0: 안전한 MCP 서버를 사용하는 AI 워크플로(Professional 플랜 이상) + line_1: 새 예산 위젯이 포함되고 접근성이 향상되어 프로젝트 홈 페이지가 개선됨 + line_2: "미팅: 미팅 템플릿(Basic 플랜 이상)" + line_3: 프로젝트 특성 코멘트의 투명성 향상됨. + line_4: PDF 내보내기 개선 사항 + line_5: 외부 링크에 대한 보안 강화됨(Premium 플랜 이상) + line_6: 백로그 모듈의 UI/UX 개선 사항 + line_7: 통합 사용자 지정 필드 양식 links: upgrade_enterprise_edition: "Enterprise Edition으로 업그레이드" postgres_migration: "설치를 PostgreSQL로 마이그레이션" @@ -3045,7 +3045,7 @@ ko: journals: changes_retracted: "변경 사항이 취소되었습니다." caused_changes: - budget_deleted: "Budget has been deleted" + budget_deleted: "예산이 삭제되었습니다" dates_changed: "변경된 날짜" default_attribute_written: "읽기 전용 특성 작성됨" import: "가져옴" @@ -3061,7 +3061,7 @@ ko: field_changed: "%{field}이(가) %{old_value}에서 %{new_value}(으)로 변경됨" field_set: "%{field}이(가) %{value}(으)로 설정됨" field_removed: "%{field} 제거됨" - field_updated: "%{field} updated" + field_updated: "%{field} 업데이트됨" deleted_with_diff: "%{field} 삭제됨(%{link})" changed_with_diff: "%{field} 변경됨(%{link})" set_with_diff: "%{field} 설정됨(%{link})" @@ -3071,7 +3071,7 @@ ko: work_package_related_changed_times: 관련 %{link}에 대한 변경 사항 기준 work_package_duplicate_closed: 중복 작업 패키지에 의해 자동으로 상태가 업데이트되었습니다(%{link}) unaccessable_work_package_changed: 관련 작업 패키지에 대한 변경 사항 기준 - budget_deleted: Budget has been deleted + budget_deleted: 예산이 삭제되었습니다 working_days_changed: changed: "근무일에 대한 변경 사항 기준(%{changes})" days: @@ -3238,7 +3238,7 @@ ko: label_always_visible: "항상 표시" label_announcement: "공지 사항" label_angular: "AngularJS" - label_app_modules: "%{app_title} modules" + label_app_modules: "%{app_title} 모듈" label_api_access_key: "API 액세스 키" label_api_access_key_created_on: "API 액세스 키가 %{value} 전에 생성되었습니다." label_api_access_key_type: "API" @@ -5080,7 +5080,7 @@ ko: text_change_disabled_for_provider_login: "이름 및 이메일은 로그인 공급자가 설정하므로 변경할 수 없습니다." unlock: "잠금 해제" unlock_and_reset_failed_logins: "실패한 로그인 잠금 해제 및 재설정" - error_cannot_delete_user: "User cannot be deleted" + error_cannot_delete_user: "사용자를 삭제할 수 없습니다" version_status_closed: "닫음" version_status_locked: "잠김" version_status_open: "열기" diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index 8843ce1af0b..19e274587ec 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -83,9 +83,9 @@ uk: confirmation: "Справді видалити цей маркер підтримки версії Enterprise?" create_dialog: title: "Додати маркер Enterprise" - type_token_text: "Your Enterprise token text" + type_token_text: "Текст вашого маркера Enterprise" token_placeholder: "Вставте тут свій маркер підтримки версії Enterprise" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "Щоб дізнатися більше про те, як активувати версію Enterprise, перегляньте [документацію](docs_url)." add_token: "Додати маркер підтримки версії Enterprise" replace_token: "Замініть поточний маркер підтримки" order: "Замовте локальну версію Enterprise" @@ -111,182 +111,182 @@ uk: text: "Окремі дії користувача (напр., оновлення робочого пакета двічі) зводяться в одну дію, якщо відмінність у часі між ними менша за вказаний проміжок часу. Їх буде виведено як окремі дії в межах додатка. Крім того, це призведе до затримки сповіщень на такий самий проміжок часу, що зменшить кількість електронних листів, які надсилатимуться, а також вплине на затримку %{webhook_link}." link: "вебгука" import: - title: "Import" + title: "Імпортувати" jira: - title: "Jira Import" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + title: "Імпорт із Jira" + description: "Використовуйте цей інструмент для імпорту даних зі свого екземпляра Jira. Ви можете налаштувати кілька хостів Jira й вибрати, що імпортувати в кожному циклі імпорту." errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "Не вдається видалити хост Jira з наявними процесами імпорту" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + title: "Ще немає налаштованих хостів Jira" + description: "Налаштуйте хост Jira, щоб почати імпорт елементів із Jira в цей екземпляр OpenProject." configuration: - title: "Jira configuration" - new: "New configuration" + title: "Конфігурація Jira" + new: "Нова конфігурація" banner: - title: "Limited import" + title: "Обмежений імпорт" description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." form: fields: - name: "Name" - url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + name: "Назва" + url: "URL-адреса сервера / центру обробки даних Jira" + personal_access_token: "Персональний маркер доступу" + button_add: "Додати конфігурацію" + button_save: "Зберегти конфігурацію" + button_test: "Перевірити конфігурацію" + button_delete_token: "Видалити маркер" + delete_token_confirm: "Справді видалити маркер? З’єднання з Jira буде розірвано." + label_testing: "Перевірка конфігурації…" + token_deleted: "Маркер успішно видалено." test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" + success: "Встановлено з’єднання із сервером %{server} (версії %{version})" + failed: "З’єднання не встановлено: не вдалось отримати інформацію про сервер" + error: "Під час перевірки з’єднання сталася неочікувана помилка" + connection_error: "Помилка з’єднання: %{message}" parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + api_error: "Інтерфейс Jira API повернув статус помилки %{status}. Перевірте URL-адресу свого екземпляра Jira й маркер API." + token_error: "Недійсний маркер API. Перевірте облікові дані, що використовуються в конфігурації." + missing_credentials: "Укажіть URL-адресу й персональний маркер доступу для перевірки з’єднання" + invalid_url: "Укажіть дійсну URL-адресу" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "Не вдалося під’єднатися до сервера Jira: %{message}" + connection_timeout: "Час очікування на встановлення з’єднання до сервера Jira минув: %{message}" + parse_error: "Не вдалося проаналізувати відповідь Jira API: %{message}" + api_error: "Інтерфейс Jira API повернув статус помилки %{status}" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" - label_ago: "%{amount} ago" + projects: "Проєкти" + last_change: "Остання зміна" + added: "Додано" + label_ago: "%{amount} тому" run: - title: "Import run" - history: "History" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + title: "Цикл імпорту" + history: "Історія" + remove_error: "Імпорт Jira не можна видалити, поки він виконується" + import_blocked_error: "Зараз виконується або очікує на перевірку ще один цикл імпорту Jira. Завершіть або скасуйте його, якщо потрібно почати новий імпорт." blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "Немає налаштованих циклів імпорту" + description: "Створіть цикл імпорту, щоб почати імпортувати інформацію із цього екземпляра Jira" 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: "Цикл імпорту" + button_edit_configuration: "Змінити конфігурацію" status: - initial: "Start" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" - configuring: "Select scope" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" - imported: "Review mode" - reverting: "Reverting" - revert_error: "Error during revert" - reverted: "Reverted" - completed: "Completed" + initial: "Початок" + instance_meta_fetching: "Отримання метаданих" + instance_meta_error: "Не вдалось отримати метадані" + instance_meta_done: "Метадані отримано" + configuring: "Вибір обсягу" + projects_meta_fetching: "Отримання даних про проєкт" + projects_meta_error: "Не вдалось отримати дані про проєкт" + projects_meta_done: "Дані зібрано" + importing: "Виконання" + import_error: "Помилка під час імпорту" + imported: "Режим перевірки" + reverting: "Скасування внесених змін" + revert_error: "Помилка під час скасування внесених змін" + reverted: "Внесені зміни скасовано" + completed: "Завершено" wizard: - button_retry: "Retry" + button_retry: "Повторити спробу" parts: projects: - one: "1 project" - few: "%{count} projects" - many: "%{count} projects" - other: "%{count} projects" + one: "1 проєкт" + few: "%{count} проєкти" + many: "%{count} проєктів" + other: "%{count} проєкту" issues: - one: "1 issue" - few: "%{count} issues" - many: "%{count} issues" - other: "%{count} issues" + one: "1 проблема" + few: "%{count} проблеми" + many: "%{count} проблем" + other: "%{count} проблеми" work_packages: - one: "1 work package" - few: "%{count} work packages" - many: "%{count} work packages" - other: "%{count} work packages" + one: "1 пакет робіт" + few: "%{count} пакети робіт" + many: "%{count} пакетів робіт" + other: "%{count} пакета робіт" types: - one: "1 type" - few: "%{count} types" - many: "%{count} types" - other: "%{count} types" + one: "1 тип" + few: "%{count} типи" + many: "%{count} типів" + other: "%{count} типу" statuses: - one: "1 status" - few: "%{count} statuses" - many: "%{count} statuses" - other: "%{count} statuses" + one: "1 статус" + few: "%{count} статуси" + many: "%{count} статусів" + other: "%{count} статусу" users: - one: "1 user" - few: "%{count} users" - many: "%{count} users" - other: "%{count} users" + one: "1 користувач" + few: "%{count} користувачі" + many: "%{count} користувачів" + other: "%{count} користувача" groups: fetch: - title: "Get base data" + title: "Отримайте базові дані" groups_and_users: - title: "Groups and Users" + title: "Групи й користувачі" configuration: - title: "Configure import" + title: "Налаштуйте імпорт" confirming: - title: "Confirm and import" + title: "Підтвердіть і імпортуйте" review: - title: "Review import" + title: "Перевірте імпорт" sections: fetch_data: - title: "Fetch instance meta data" - caption_done: "Completed" + title: "Отримайте метадані екземпляра" + caption_done: "Завершено" 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: "Отримання даних із Jira…" groups_and_users: - title: "Groups and Users" + title: "Групи й користувачі" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" + title: "Обсяг імпорту" + caption: "Виберіть, що ви хочете імпортувати в OpenProject" + caption_done: "Завершено" 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 URL 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_available_data: "Available data" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" - button_continue: "Continue" - 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..." + label_available_data: "Доступні дані" + label_not_available_data: "Недоступно для імпорту" + button_select_projects: "Виберіть проєкти для імпорту" + button_continue: "Продовжити" + label_import: "Виберіть проєкти, які ви хочете імпортувати." + button_select: "Вибрати проєкти" + label_selected_data: "Вибрані дані для імпорту" + label_progress: "Отримання даних із Jira…" elements: - relations: "Relations between issues" + relations: "Зв’язки між проблемами" workflows: "Project-level workflows" - users: "Users" - sprints: "Sprints" - schemes: "Schemas" + users: "Користувачі" + sprints: "Спринти" + schemes: "Схеми" permissions: "User, group and project permissions" confirm_import: - title: "Import data" - caption: "Review your import settings and start the import" - caption_done: "Completed" - label_available_data: "Available data to import" - 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" + title: "Імпортуйте дані" + caption: "Перегляньте налаштування імпорту й запустіть його" + caption_done: "Завершено" + label_available_data: "Дані, доступні для імпорту" + button_start: "Почати імпорт" + description: "Ви збираєтеся запустити імпорт із наведеними далі налаштуваннями." + label_progress: "Виконується імпорт…" + label_import_data: "Зараз імпортується" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." - label_results: "Imported" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: 'The imported data is currently in review mode. Click "Finalize import" to make the import permanent or "Revert import" to undo all changes made in this import run.' - label_finalizing_progress: "Finalizing import..." - label_finalized: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + title: "Результати циклу імпорту" + caption: "Перегляньте дані про цикл імпорту або скасуйте внесені зміни" + info: "Циклу імпорту успішно виконано." + label_results: "Імпортовано" + label_revert: "Скасувати імпорт" + button_revert: "Скасувати імпорт" + button_done: "Завершити імпорт" + preview_description: 'Імпортовані дані зараз перебувають у режимі перевірки. Натисніть «Завершити імпорт», щоб застосувати зміни, або «Скасувати імпорт», щоб скасувати всі зміни, внесені під час цього циклу імпорту.' + label_finalizing_progress: "Завершення імпорту…" + label_finalized: "Імпорт завершено." + label_revert_progress: "Скасування імпорту…" + label_reverted: "Імпорт скасовано." select_dialog: - filter_projects: "Filter by text" + filter_projects: "Фільтрування за текстом" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." + title: "Остаточно скасувати цей імпорт?" + description: "Буде видалено всі імпортовані об’єкти (зокрема цілі проєкти), навіть якщо користувачі виконували з ними дії в OpenProject після імпорту." confirm: "I understand that this reversion will delete data permanently" finalize_dialog: title: "Finalize this import?" @@ -3188,7 +3188,7 @@ uk: line_3: Better transparency with project attribute comments. line_4: PDF export enhancements line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module + line_6: Покращення UI/UX у модулі беклогів line_7: Harmonized custom field forms links: upgrade_enterprise_edition: "Оновлення до версії Enterprise" diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml index d8da316ba21..0c9d44ea08c 100644 --- a/modules/backlogs/config/locales/crowdin/af.yml +++ b/modules/backlogs/config/locales/crowdin/af.yml @@ -131,11 +131,12 @@ af: label_sprint_impediments: "Sprint belemmerings" label_sprint_new: "New sprint" label_task_board: "Taak bord" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Kies gedoen statusse" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Agterstandes" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ar.yml b/modules/backlogs/config/locales/crowdin/ar.yml index 66d7a9c4be7..cfb5ad40f89 100644 --- a/modules/backlogs/config/locales/crowdin/ar.yml +++ b/modules/backlogs/config/locales/crowdin/ar.yml @@ -139,11 +139,12 @@ ar: label_sprint_impediments: "عوائق السباق" label_sprint_new: "New sprint" label_task_board: "لوحة المهمة" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "حدد حالات الاتمام" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "الأعمال المتراكمة غير المنجزة" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/az.yml b/modules/backlogs/config/locales/crowdin/az.yml index 270dce5d8fb..730442d3672 100644 --- a/modules/backlogs/config/locales/crowdin/az.yml +++ b/modules/backlogs/config/locales/crowdin/az.yml @@ -131,11 +131,12 @@ az: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/be.yml b/modules/backlogs/config/locales/crowdin/be.yml index 8e132c6898b..191fb2b82c2 100644 --- a/modules/backlogs/config/locales/crowdin/be.yml +++ b/modules/backlogs/config/locales/crowdin/be.yml @@ -135,11 +135,12 @@ be: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/bg.yml b/modules/backlogs/config/locales/crowdin/bg.yml index c3d4638764a..40eef1c70e8 100644 --- a/modules/backlogs/config/locales/crowdin/bg.yml +++ b/modules/backlogs/config/locales/crowdin/bg.yml @@ -131,11 +131,12 @@ bg: label_sprint_impediments: "Пречки за спринт" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Изберете готови състояния" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Назад" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ca.yml b/modules/backlogs/config/locales/crowdin/ca.yml index 61396d82516..66a3b78a698 100644 --- a/modules/backlogs/config/locales/crowdin/ca.yml +++ b/modules/backlogs/config/locales/crowdin/ca.yml @@ -131,11 +131,12 @@ ca: label_sprint_impediments: "Impediments de sprint" label_sprint_new: "New sprint" label_task_board: "Tauler de tasques" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Selecciona els estats acabats" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ckb-IR.yml b/modules/backlogs/config/locales/crowdin/ckb-IR.yml index d2d018e4fbb..75d995148d6 100644 --- a/modules/backlogs/config/locales/crowdin/ckb-IR.yml +++ b/modules/backlogs/config/locales/crowdin/ckb-IR.yml @@ -131,11 +131,12 @@ ckb-IR: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml index 70a57691619..7db06c435cb 100644 --- a/modules/backlogs/config/locales/crowdin/cs.yml +++ b/modules/backlogs/config/locales/crowdin/cs.yml @@ -135,11 +135,12 @@ cs: label_sprint_impediments: "Běh impedimenty" label_sprint_new: "New sprint" label_task_board: "Tabule úkolů" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Vybrat stavy dokončených" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Nevyřízené položky" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/da.yml b/modules/backlogs/config/locales/crowdin/da.yml index d39b5bc31bc..27fe6a906cf 100644 --- a/modules/backlogs/config/locales/crowdin/da.yml +++ b/modules/backlogs/config/locales/crowdin/da.yml @@ -131,11 +131,12 @@ da: label_sprint_impediments: "Sprint-hindringer" label_sprint_new: "New sprint" label_task_board: "Opgaveoversigt" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Vælg udført-statusser" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 5da863b7fc8..8addb34611f 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -131,11 +131,12 @@ de: label_sprint_impediments: "Sprint Hindernisse" label_sprint_new: "Neuer Sprint" label_task_board: "Taskboard" - permission_view_sprints: "View sprints" permission_create_sprints: "Sprints erstellen" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Abgeschlossene Status auswählen" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/el.yml b/modules/backlogs/config/locales/crowdin/el.yml index 63c6e1b25e4..09944224b96 100644 --- a/modules/backlogs/config/locales/crowdin/el.yml +++ b/modules/backlogs/config/locales/crowdin/el.yml @@ -131,11 +131,12 @@ el: label_sprint_impediments: "Εμπόδια Sprint" label_sprint_new: "New sprint" label_task_board: "Πίνακας εργασιών" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/eo.yml b/modules/backlogs/config/locales/crowdin/eo.yml index 0599d6bd42c..e416e859712 100644 --- a/modules/backlogs/config/locales/crowdin/eo.yml +++ b/modules/backlogs/config/locales/crowdin/eo.yml @@ -131,11 +131,12 @@ eo: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index 9d03fa47032..bbdeeec2e77 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -131,11 +131,12 @@ es: label_sprint_impediments: "Impedimentos de sprint" label_sprint_new: "Nuevo sprint" label_task_board: "Tablero de tareas" - permission_view_sprints: "Ver sprints" permission_create_sprints: "Crear sprints" - permission_start_complete_sprint: "Iniciar/completar sprint" permission_manage_sprint_items: "Gestionar elementos de sprint" + permission_select_done_statuses: "Seleccionar estados de finalización" permission_share_sprint: "Compartir sprint" + permission_start_complete_sprint: "Iniciar/completar sprint" + permission_view_sprints: "Ver sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/et.yml b/modules/backlogs/config/locales/crowdin/et.yml index b758ef183ad..5ff66db95d4 100644 --- a/modules/backlogs/config/locales/crowdin/et.yml +++ b/modules/backlogs/config/locales/crowdin/et.yml @@ -131,11 +131,12 @@ et: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Vali valmis staatused" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/eu.yml b/modules/backlogs/config/locales/crowdin/eu.yml index 817d5ef8d8f..c548ffda646 100644 --- a/modules/backlogs/config/locales/crowdin/eu.yml +++ b/modules/backlogs/config/locales/crowdin/eu.yml @@ -131,11 +131,12 @@ eu: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/fa.yml b/modules/backlogs/config/locales/crowdin/fa.yml index a9d74a009fa..35a29990d82 100644 --- a/modules/backlogs/config/locales/crowdin/fa.yml +++ b/modules/backlogs/config/locales/crowdin/fa.yml @@ -131,11 +131,12 @@ fa: label_sprint_impediments: " موانع تاخت" label_sprint_new: "New sprint" label_task_board: "تابلوی وظیفه" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "انتخاب وضعیت های انجام شده" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "وظایف" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/fi.yml b/modules/backlogs/config/locales/crowdin/fi.yml index 6933c27113c..fd5a0e94a53 100644 --- a/modules/backlogs/config/locales/crowdin/fi.yml +++ b/modules/backlogs/config/locales/crowdin/fi.yml @@ -131,11 +131,12 @@ fi: label_sprint_impediments: "Sprintin esteet" label_sprint_new: "New sprint" label_task_board: "Tehtävätaulu" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Työjonot" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/fil.yml b/modules/backlogs/config/locales/crowdin/fil.yml index 13e748d4e23..d2d8fbde51b 100644 --- a/modules/backlogs/config/locales/crowdin/fil.yml +++ b/modules/backlogs/config/locales/crowdin/fil.yml @@ -131,11 +131,12 @@ fil: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index 6e425e11d5b..5f9f4ab47b7 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -131,11 +131,12 @@ fr: label_sprint_impediments: "Obstacles de sprint" label_sprint_new: "Nouveau sprint" label_task_board: "Tableau des tâches" - permission_view_sprints: "Voir les sprints" permission_create_sprints: "Créer des sprints" - permission_start_complete_sprint: "Commencer/terminer le sprint" permission_manage_sprint_items: "Gérer les éléments du sprint" + permission_select_done_statuses: "Sélectionner les statuts terminés" permission_share_sprint: "Partager le sprint" + permission_start_complete_sprint: "Commencer/terminer le sprint" + permission_view_sprints: "Voir les sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/he.yml b/modules/backlogs/config/locales/crowdin/he.yml index 45e3711813c..eb56d12ac73 100644 --- a/modules/backlogs/config/locales/crowdin/he.yml +++ b/modules/backlogs/config/locales/crowdin/he.yml @@ -135,11 +135,12 @@ he: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/hi.yml b/modules/backlogs/config/locales/crowdin/hi.yml index 3d9002f92e7..74e073e254d 100644 --- a/modules/backlogs/config/locales/crowdin/hi.yml +++ b/modules/backlogs/config/locales/crowdin/hi.yml @@ -131,11 +131,12 @@ hi: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/hr.yml b/modules/backlogs/config/locales/crowdin/hr.yml index 2a0fc06d152..1e50067fe6d 100644 --- a/modules/backlogs/config/locales/crowdin/hr.yml +++ b/modules/backlogs/config/locales/crowdin/hr.yml @@ -133,11 +133,12 @@ hr: label_sprint_impediments: "Prepreke perioda razvoja" label_sprint_new: "New sprint" label_task_board: "Upravitelj zadatcima" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/hu.yml b/modules/backlogs/config/locales/crowdin/hu.yml index 0f2b3d92eb0..ab4df893e01 100644 --- a/modules/backlogs/config/locales/crowdin/hu.yml +++ b/modules/backlogs/config/locales/crowdin/hu.yml @@ -131,11 +131,12 @@ hu: label_sprint_impediments: "Sprint akadályai" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Elkészültek kiválasztása" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/id.yml b/modules/backlogs/config/locales/crowdin/id.yml index ffc09eb1198..dd7ef7600b8 100644 --- a/modules/backlogs/config/locales/crowdin/id.yml +++ b/modules/backlogs/config/locales/crowdin/id.yml @@ -129,11 +129,12 @@ id: label_sprint_impediments: "Hanbatan kekuatan" label_sprint_new: "New sprint" label_task_board: "Papan tugas" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Pilih status selesai" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml index 55ed57ffdf8..0bc0a7cb99c 100644 --- a/modules/backlogs/config/locales/crowdin/it.yml +++ b/modules/backlogs/config/locales/crowdin/it.yml @@ -131,11 +131,12 @@ it: label_sprint_impediments: "Impedimenti allo sprint" label_sprint_new: "Nuovo sprint" label_task_board: "Pannello delle attività" - permission_view_sprints: "Visualizza gli sprint" permission_create_sprints: "Crea gli sprint" - permission_start_complete_sprint: "Iniziare/completa lo sprint" permission_manage_sprint_items: "Gestisci gli elementi dello sprint" + permission_select_done_statuses: "Seleziona gli stati terminati" permission_share_sprint: "Condividi lo sprint" + permission_start_complete_sprint: "Iniziare/completa lo sprint" + permission_view_sprints: "Visualizza gli sprint" project_module_backlogs: "Backlog" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ja.yml b/modules/backlogs/config/locales/crowdin/ja.yml index a2d450f2098..674f36c4984 100644 --- a/modules/backlogs/config/locales/crowdin/ja.yml +++ b/modules/backlogs/config/locales/crowdin/ja.yml @@ -129,11 +129,12 @@ ja: label_sprint_impediments: "スプリント障害事項" label_sprint_new: "New sprint" label_task_board: "かんばん" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "完了ステータスを選択" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "バックログ" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ka.yml b/modules/backlogs/config/locales/crowdin/ka.yml index 9a2ddfabdb5..8c1392c756f 100644 --- a/modules/backlogs/config/locales/crowdin/ka.yml +++ b/modules/backlogs/config/locales/crowdin/ka.yml @@ -131,11 +131,12 @@ ka: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "ამოცანების დაფა" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "აირჩიეთ დასრულების სტატუსები" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "შეუსრულებელი ამოცანები" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/kk.yml b/modules/backlogs/config/locales/crowdin/kk.yml index 48d2e84dc76..7a3cd70aadb 100644 --- a/modules/backlogs/config/locales/crowdin/kk.yml +++ b/modules/backlogs/config/locales/crowdin/kk.yml @@ -131,11 +131,12 @@ kk: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index 337429c9d44..af6250238d6 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -129,11 +129,12 @@ ko: label_sprint_impediments: "스프린트 제한" label_sprint_new: "새로운 스프린트" label_task_board: "작업 보드" - permission_view_sprints: "스프린트 보기" permission_create_sprints: "스프린트 만들기" - permission_start_complete_sprint: "스프린트 시작/완료" permission_manage_sprint_items: "스프린트 항목 관리" + permission_select_done_statuses: "완료 상태 선택" permission_share_sprint: "스프린트 공유" + permission_start_complete_sprint: "스프린트 시작/완료" + permission_view_sprints: "스프린트 보기" project_module_backlogs: "백로그" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/lt.yml b/modules/backlogs/config/locales/crowdin/lt.yml index 3a309a4e2eb..33aa6c34663 100644 --- a/modules/backlogs/config/locales/crowdin/lt.yml +++ b/modules/backlogs/config/locales/crowdin/lt.yml @@ -135,11 +135,12 @@ lt: label_sprint_impediments: "Sprinto trukdžiai" label_sprint_new: "New sprint" label_task_board: "Užduočių lenta" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Parinkite atliktas būsenas" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Darbų sąrašai" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/lv.yml b/modules/backlogs/config/locales/crowdin/lv.yml index a67fe2215bd..b458568e439 100644 --- a/modules/backlogs/config/locales/crowdin/lv.yml +++ b/modules/backlogs/config/locales/crowdin/lv.yml @@ -133,11 +133,12 @@ lv: label_sprint_impediments: "Sprinta šķēršļi" label_sprint_new: "New sprint" label_task_board: "Pieteikumu tāfele" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Izvēlieties pabeigtības statusu" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Darbu krātuve" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/mn.yml b/modules/backlogs/config/locales/crowdin/mn.yml index c6bcdd3183e..17c1eee55ba 100644 --- a/modules/backlogs/config/locales/crowdin/mn.yml +++ b/modules/backlogs/config/locales/crowdin/mn.yml @@ -131,11 +131,12 @@ mn: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ms.yml b/modules/backlogs/config/locales/crowdin/ms.yml index c02e0260b8f..8147f33eb62 100644 --- a/modules/backlogs/config/locales/crowdin/ms.yml +++ b/modules/backlogs/config/locales/crowdin/ms.yml @@ -129,11 +129,12 @@ ms: label_sprint_impediments: "Halangan Pecutan" label_sprint_new: "New sprint" label_task_board: "Papan tugasan" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Pilih status selesai" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Tunggakan" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ne.yml b/modules/backlogs/config/locales/crowdin/ne.yml index 7e058e096ab..27bcdc9112b 100644 --- a/modules/backlogs/config/locales/crowdin/ne.yml +++ b/modules/backlogs/config/locales/crowdin/ne.yml @@ -131,11 +131,12 @@ ne: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml index b42c7287ce2..c3bb46d19e3 100644 --- a/modules/backlogs/config/locales/crowdin/nl.yml +++ b/modules/backlogs/config/locales/crowdin/nl.yml @@ -131,11 +131,12 @@ nl: label_sprint_impediments: "Sprint Obstakels" label_sprint_new: "New sprint" label_task_board: "Taakbord" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Selecteer voltooide statussen" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index 3ad358ece55..c7fbbae7275 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -131,11 +131,12 @@ label_sprint_impediments: "Hindring i etappe" label_sprint_new: "New sprint" label_task_board: "Oppgavetavle" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Velg ferdige statuser" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Forsinkelser" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index 0a6e3ddb448..05a52cdafcc 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -135,11 +135,12 @@ pl: label_sprint_impediments: "Przeszkody sprintu" label_sprint_new: "Nowy sprint" label_task_board: "Panel zadań" - permission_view_sprints: "Wyświetl sprinty" permission_create_sprints: "Utwórz sprinty" - permission_start_complete_sprint: "Rozpocznij/ukończ sprint" permission_manage_sprint_items: "Zarządzaj elementami sprintu" + permission_select_done_statuses: "Wybierz wykonane statusy" permission_share_sprint: "Udostępnij sprint" + permission_start_complete_sprint: "Rozpocznij/ukończ sprint" + permission_view_sprints: "Wyświetl sprinty" project_module_backlogs: "Backlogi" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index 2bbf0656349..261aeec5670 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -131,11 +131,12 @@ pt-BR: label_sprint_impediments: "Impedimentos da Sprint" label_sprint_new: "Nova sprint" label_task_board: "Quadro de tarefas" - permission_view_sprints: "Ver sprints" permission_create_sprints: "Criar sprints" - permission_start_complete_sprint: "Iniciar/concluir sprint" permission_manage_sprint_items: "Gerenciar itens da sprint" + permission_select_done_statuses: "Selecione situações concluídas" permission_share_sprint: "Compartilhar sprint" + permission_start_complete_sprint: "Iniciar/concluir sprint" + permission_view_sprints: "Ver sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml index 36f2ababe64..f35a747f3fa 100644 --- a/modules/backlogs/config/locales/crowdin/pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml @@ -131,11 +131,12 @@ pt-PT: label_sprint_impediments: "Impedimentos de Sprint" label_sprint_new: "Novo sprint" label_task_board: "Quadro de tarefas" - permission_view_sprints: "Ver sprints" permission_create_sprints: "Criar sprints" - permission_start_complete_sprint: "Iniciar/completar sprint" permission_manage_sprint_items: "Gerir elementos de sprint" + permission_select_done_statuses: "Selecione os estados concluídos" permission_share_sprint: "Partilhar sprint" + permission_start_complete_sprint: "Iniciar/completar sprint" + permission_view_sprints: "Ver sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ro.yml b/modules/backlogs/config/locales/crowdin/ro.yml index c531362de36..631f4e9115b 100644 --- a/modules/backlogs/config/locales/crowdin/ro.yml +++ b/modules/backlogs/config/locales/crowdin/ro.yml @@ -133,11 +133,12 @@ ro: label_sprint_impediments: "Impedimentele Sprint" label_sprint_new: "New sprint" label_task_board: "Tablă de sarcini" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Selectează stările realizate" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Restanțe" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index c60150308fe..869d3c7f0a2 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -135,11 +135,12 @@ ru: label_sprint_impediments: "Препятствия спринта" label_sprint_new: "Новый спринт" label_task_board: "Панель задач" - permission_view_sprints: "View sprints" permission_create_sprints: "Создание спринтов" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Выберите завершенные статусы" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Бэклоги" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/rw.yml b/modules/backlogs/config/locales/crowdin/rw.yml index 1925bfac9bf..8f8d4c09528 100644 --- a/modules/backlogs/config/locales/crowdin/rw.yml +++ b/modules/backlogs/config/locales/crowdin/rw.yml @@ -131,11 +131,12 @@ rw: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/si.yml b/modules/backlogs/config/locales/crowdin/si.yml index 5c869db9137..710dc1f7777 100644 --- a/modules/backlogs/config/locales/crowdin/si.yml +++ b/modules/backlogs/config/locales/crowdin/si.yml @@ -131,11 +131,12 @@ si: label_sprint_impediments: "ස්ප්රින්ට් බාධාවන්" label_sprint_new: "New sprint" label_task_board: "කාර්ය මණ්ඩලය" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "බැක්ලොග්ස්" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/sk.yml b/modules/backlogs/config/locales/crowdin/sk.yml index cb7351169f1..582de6ef58e 100644 --- a/modules/backlogs/config/locales/crowdin/sk.yml +++ b/modules/backlogs/config/locales/crowdin/sk.yml @@ -135,11 +135,12 @@ sk: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Výber stavov hotovo" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/sl.yml b/modules/backlogs/config/locales/crowdin/sl.yml index 8817f143646..7f31c3f53a8 100644 --- a/modules/backlogs/config/locales/crowdin/sl.yml +++ b/modules/backlogs/config/locales/crowdin/sl.yml @@ -135,11 +135,12 @@ sl: label_sprint_impediments: "Motnje sprinta" label_sprint_new: "New sprint" label_task_board: "Tabla opravil" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Označi statuse narejeno" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Zaostanki" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/sr.yml b/modules/backlogs/config/locales/crowdin/sr.yml index 23726199b5c..4108f9cd9ce 100644 --- a/modules/backlogs/config/locales/crowdin/sr.yml +++ b/modules/backlogs/config/locales/crowdin/sr.yml @@ -133,11 +133,12 @@ sr: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/sv.yml b/modules/backlogs/config/locales/crowdin/sv.yml index 6daea5b38d2..954a85a3d5d 100644 --- a/modules/backlogs/config/locales/crowdin/sv.yml +++ b/modules/backlogs/config/locales/crowdin/sv.yml @@ -131,11 +131,12 @@ sv: label_sprint_impediments: "Sprint hinder" label_sprint_new: "New sprint" label_task_board: "Aktivitetstavla" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Välj klar status" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backloggar" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/th.yml b/modules/backlogs/config/locales/crowdin/th.yml index 9b3e5cf07e3..2bac72be0f4 100644 --- a/modules/backlogs/config/locales/crowdin/th.yml +++ b/modules/backlogs/config/locales/crowdin/th.yml @@ -129,11 +129,12 @@ th: label_sprint_impediments: "อุปสรรคของสปรินท์" label_sprint_new: "สปรินท์ใหม่" label_task_board: "กระดานงาน" - permission_view_sprints: "ดูสปรินท์" permission_create_sprints: "สร้างสปรินท์" - permission_start_complete_sprint: "เริ่มต้น/เสร็จสิ้นสปรินท์" permission_manage_sprint_items: "จัดการรายการในสปรินท์" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "แชร์สปรินท์" + permission_start_complete_sprint: "เริ่มต้น/เสร็จสิ้นสปรินท์" + permission_view_sprints: "ดูสปรินท์" project_module_backlogs: "รายการงานคงค้าง" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/tr.yml b/modules/backlogs/config/locales/crowdin/tr.yml index e2f5a59861f..93e912f1a7a 100644 --- a/modules/backlogs/config/locales/crowdin/tr.yml +++ b/modules/backlogs/config/locales/crowdin/tr.yml @@ -131,11 +131,12 @@ tr: label_sprint_impediments: "Sprint Engelleri" label_sprint_new: "New sprint" label_task_board: "Görev panosu" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Tamamlanan durumları seçiniz" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "İş listesi" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml index bd19e75d3a7..f0b57ebd599 100644 --- a/modules/backlogs/config/locales/crowdin/uk.yml +++ b/modules/backlogs/config/locales/crowdin/uk.yml @@ -28,11 +28,11 @@ uk: agile/sprint: duration: "Тривалість" finish_date: "Дата закінчення" - goal: "Sprint goal" - name: "Sprint name" + goal: "Ціль спринту" + name: "Ім’я спринту" sharing: "Sharing" sprint: - duration: "Sprint duration" + duration: "Тривалість спринту" work_package: position: "Позиція" story_points: "Сторі-поінти" @@ -49,7 +49,7 @@ uk: sprint: cannot_end_before_it_starts: "Спринт не може закінчитися, перш ніж він почне працювати." models: - sprint: "Sprint" + sprint: "Спринт" attributes: task_type: "Тип завдання" backlogs: @@ -62,10 +62,10 @@ uk: work_package_is_closed: "Робочий пакет виконується, коли" label_is_done_status: "Стан %{status_name} означає виконано" points_label: - one: "point" - few: "points" - many: "points" - other: "points" + one: "одиниця" + few: "одиниці" + many: "одиниць" + other: "одиниці" positions_could_not_be_rebuilt: "Позиції не могли бути відновлені." positions_rebuilt_successfully: "Позиції успішно відновлені." rebuild: "Перебудувати" @@ -74,10 +74,10 @@ uk: show_burndown_chart: "Графік Burndown" story: "Історія" story_points: - one: "%{count} story point" - few: "%{count} story points" - many: "%{count} story points" - other: "%{count} story points" + one: "%{count} cторі-поінт" + few: "%{count} сторі-поінти" + many: "%{count} сторі-поінтів" + other: "%{count} сторі-поінта" task: "Завдання" task_color: "Колір завдання" unassigned: "Не призначено" @@ -85,28 +85,28 @@ uk: header_backlogs: "Модуль невиконаних завдань" button_update_backlogs: "Оновити модуль невиконаних завдань" backlog_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} нічого не містить" + blankslate_description: "Ще нічого не заплановано. Перетягніть елементи сюди, щоб додати їх." backlog_header_component: label_toggle_backlog: "Згорнути/розгорнути %{name}" label_story_count: - zero: "No stories in backlog" - one: "%{count} story in backlog" - other: "%{count} stories in backlog" + zero: "Немає історій у беклозі" + one: "%{count} історія в беклозі" + other: "%{count} історії(-й) у беклозі" backlog_menu_component: - label_actions: "Backlog actions" + label_actions: "Дії беклогу" action_menu: - edit_sprint: "Edit sprint" + edit_sprint: "Редагувати спринт" new_story: "Нова історія" stories_tasks: "Історії/Завдання" task_board: "Дошка завдань" - burndown_chart: "Burndown chart" + burndown_chart: "Діаграма згорання завдань" wiki: "Wiki" properties: "Властивості" story_component: label_drag_story: "Перемістити %{name}" story_menu_component: - label_actions: "Story actions" + label_actions: "Дії історії" backlogs_points_burn_direction: "Бали спалюються вгору/вниз" backlogs_product_backlog: "Backlog продукту" backlogs_story: "Історія" @@ -114,14 +114,14 @@ uk: backlogs_task: "Завдання" backlogs_task_type: "Тип завдання" backlogs_wiki_template: "Шаблон для спринтерської вікі-сторінки" - backlogs_empty_title: "No versions are defined yet" - backlogs_empty_action_text: "To start using backlogs, please create a version first" - backlogs_not_configured_title: "Backlogs not configured" - backlogs_not_configured_description: "Story and task types need to be set before using this module." - backlogs_not_configured_action_text: "Configure Backlogs" + backlogs_empty_title: "Версії ще не визначено" + backlogs_empty_action_text: "Щоб почати користуватися беклогами, спочатку створіть версію" + backlogs_not_configured_title: "Беклоги не налаштовано" + backlogs_not_configured_description: "Перш ніж використовувати цей модуль, необхідно визначити типи історій і завдань." + backlogs_not_configured_action_text: "Налаштувати беклоги" burndown: - story_points: "Story points" - story_points_ideal: "Story points (ideal)" + story_points: "Сторі-поінти" + story_points_ideal: "Сторі-поінти (ідеально)" errors: attributes: task_type: @@ -133,18 +133,19 @@ uk: label_points_burn_down: "Вниз" label_points_burn_up: "Вгору" label_sprint_impediments: "Перешкоди спринту" - label_sprint_new: "New sprint" + label_sprint_new: "Новий спринт" label_task_board: "Дошка завдань" - permission_view_sprints: "View sprints" - permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" - permission_manage_sprint_items: "Manage sprint items" - permission_share_sprint: "Share sprint" + permission_create_sprints: "Створення спринтів" + permission_manage_sprint_items: "Керування елементами спринтів" + permission_select_done_statuses: "Виберіть завершені статуси" + permission_share_sprint: "Надання доступу до спринтів" + permission_start_complete_sprint: "Початок/завершення спринтів" + permission_view_sprints: "Перегляд спринтів" project_module_backlogs: "Невиконані завдання" rb_burndown_charts: show: - blankslate_title: "No burndown data available" - blankslate_description: "Set start and end date for the sprint to generate a burndown chart." + blankslate_title: "Немає даних про згорання завдань" + blankslate_description: "Визначте дату початку й завершення спринту, щоб згенерувати діаграму згорання завдань." remaining_hours: "залишок роботи" version_settings_display_label: "Стовпець у backlog-у" version_settings_display_option_left: "зліва" diff --git a/modules/backlogs/config/locales/crowdin/uz.yml b/modules/backlogs/config/locales/crowdin/uz.yml index 618cb4ab3ac..76829c5a58b 100644 --- a/modules/backlogs/config/locales/crowdin/uz.yml +++ b/modules/backlogs/config/locales/crowdin/uz.yml @@ -131,11 +131,12 @@ uz: label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Select done statuses" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/vi.yml b/modules/backlogs/config/locales/crowdin/vi.yml index 6e8f878fdb7..a670ec2b207 100644 --- a/modules/backlogs/config/locales/crowdin/vi.yml +++ b/modules/backlogs/config/locales/crowdin/vi.yml @@ -129,11 +129,12 @@ vi: label_sprint_impediments: "Trở ngại nước rút" label_sprint_new: "New sprint" label_task_board: "Bảng nhiệm vụ" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "Chọn trạng thái hoàn thành" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "tồn đọng" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index ccc9db5d9a2..d06c965edbd 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -129,11 +129,12 @@ zh-CN: label_sprint_impediments: "冲刺 (sprint) 障碍" label_sprint_new: "新冲刺" label_task_board: "任务板" - permission_view_sprints: "查看冲刺" permission_create_sprints: "创建冲刺" - permission_start_complete_sprint: "开始/完成冲刺" permission_manage_sprint_items: "管理冲刺条目" + permission_select_done_statuses: "选择完成状态" permission_share_sprint: "共享冲刺" + permission_start_complete_sprint: "开始/完成冲刺" + permission_view_sprints: "查看冲刺" project_module_backlogs: "待办清单" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/zh-TW.yml b/modules/backlogs/config/locales/crowdin/zh-TW.yml index 2a07a6d5d5e..8f9ba7fc53f 100644 --- a/modules/backlogs/config/locales/crowdin/zh-TW.yml +++ b/modules/backlogs/config/locales/crowdin/zh-TW.yml @@ -129,11 +129,12 @@ zh-TW: label_sprint_impediments: "進度阻礙" label_sprint_new: "New sprint" label_task_board: "任務看板" - permission_view_sprints: "View sprints" permission_create_sprints: "Create sprints" - permission_start_complete_sprint: "Start/complete sprint" permission_manage_sprint_items: "Manage sprint items" + permission_select_done_statuses: "選擇完成狀態" permission_share_sprint: "Share sprint" + permission_start_complete_sprint: "Start/complete sprint" + permission_view_sprints: "View sprints" project_module_backlogs: "待辦事項" rb_burndown_charts: show: diff --git a/modules/boards/config/locales/crowdin/uk.yml b/modules/boards/config/locales/crowdin/uk.yml index 934fbc097a8..c4235697448 100644 --- a/modules/boards/config/locales/crowdin/uk.yml +++ b/modules/boards/config/locales/crowdin/uk.yml @@ -20,7 +20,7 @@ uk: action: "Дошка дій (%{attribute})" board_type_attributes: assignee: Виконавець - status: Kanban + status: Канбан version: Версія subproject: Підпроєкт subtasks: Батьківські й дочірні елементи diff --git a/modules/budgets/config/locales/crowdin/ko.yml b/modules/budgets/config/locales/crowdin/ko.yml index 5743e90bbf8..9f1672b34c4 100644 --- a/modules/budgets/config/locales/crowdin/ko.yml +++ b/modules/budgets/config/locales/crowdin/ko.yml @@ -44,7 +44,7 @@ ko: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "is not a member of the budget's project" + not_a_member_of_budget_project: "- 예산 프로젝트의 멤버가 아닙니다" models: budget: "예산" material_budget_item: "단위" @@ -80,12 +80,12 @@ ko: description: "계획된 예산에 대한 세부 정보를 추가하여 여기에서 데이터를 확인합니다" caption: zero: "예산 데이터가 없습니다." - one: "Data aggregated from %{count} budget included in this %{workspace}." - other: "Data aggregated from %{count} budgets included in this %{workspace}." + one: "이 %{workspace}에 포함된 %{count} 예산에서 집계된 데이터입니다." + other: "이 %{workspace}에 포함된 %{count} 예산에서 집계된 데이터입니다." caption_with_subitems: zero: "예산 데이터가 없습니다." - one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." - other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." + one: "이 %{workspace} 및 해당 하위 항목에 포함된 %{count} 예산에서 집계된 데이터입니다." + other: "이 %{workspace} 및 해당 하위 항목에 포함된 %{count} 예산에서 집계된 데이터입니다." view_details: "예산 세부 정보 보기" events: budget: "예산 편집됨" diff --git a/modules/budgets/config/locales/crowdin/uk.yml b/modules/budgets/config/locales/crowdin/uk.yml index 8fa150602ea..32382075ff6 100644 --- a/modules/budgets/config/locales/crowdin/uk.yml +++ b/modules/budgets/config/locales/crowdin/uk.yml @@ -65,28 +65,28 @@ uk: budgets: widgets: budget_totals: - title: "Budget totals" - remaining_budget: "Remaining budget" - spent_budget: "Spent budget" - total_actual_costs: "Total actual costs" - total_planned_budget: "Total planned budget" + title: "Загальні суми бюджету" + remaining_budget: "Залишок бюджету" + spent_budget: "Витрачений бюджет" + total_actual_costs: "Загальна сума фактичних витрат" + total_planned_budget: "Загальна сума запланованого бюджету" budget_by_cost_type: - title: "Budget by cost type" + title: "Бюджет за типом витрат" blankslate: - heading: "Start project controlling" - description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + heading: "Почніть контролювати роботу над проєктом" + description: "Переглядайте свої бюджети й витрати, щоб ефективно відстежувати стан проєкту" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "Немає інформації про бюджет" + description: "Додайте інформацію про запланований бюджет, щоб побачити дані тут" caption: - zero: "No budget data." + zero: "Немає даних про бюджет." one: "Data aggregated from %{count} budget included in this %{workspace}." other: "Data aggregated from %{count} budgets included in this %{workspace}." caption_with_subitems: zero: "No budget data." one: "Data aggregated from %{count} budget included in this %{workspace} and its subitems." other: "Data aggregated from %{count} budgets included in this %{workspace} and its subitems." - view_details: "View budget details" + view_details: "Переглянути інформацію про бюджет" events: budget: "Бюджет відредаговано" help_click_to_edit: "Натисніть тут, щоб редагувати." diff --git a/modules/costs/config/locales/crowdin/uk.yml b/modules/costs/config/locales/crowdin/uk.yml index 16105684c55..c5d2252eb4b 100644 --- a/modules/costs/config/locales/crowdin/uk.yml +++ b/modules/costs/config/locales/crowdin/uk.yml @@ -213,10 +213,10 @@ uk: project_module_costs: "Час і витрати" setting_allow_tracking_start_and_end_times: "Дозволити час початку й закінчення" setting_costs_currency: "Валюта" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "Це одиниця валюти. На її позначення може використовуватися трилітерний код ISO (наприклад, EUR, USD чи JPY) або символ (€, $, ¥ тощо)." + setting_costs_currency_format: "Формат валюти" + setting_costs_currency_format_prefix: "Перед числом (наприклад, EUR 100)" + setting_costs_currency_format_suffix: "Після числа (наприклад, 100 EUR)" setting_enforce_tracking_start_and_end_times: "Вимагати час початку й закінчення" setting_enforce_without_allow: "Вимога часу початку й закінчення неможлива без відповідного налаштування" setting_allow_tracking_start_and_end_times_caption: "Дає змогу вводити час початку й закінчення в журнал обліку часу." @@ -240,12 +240,12 @@ uk: costs: widgets: actual_costs: - title: "Actual costs by month" + title: "Фактичні витрати по місяцях" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." - action: "Log time" - view_details: "View actual costs details" + heading: "Почніть відстежувати час і витрати" + description: "Переглядайте свої витрати й зафіксований час, щоб контролювати прогрес роботи над проєктом. Переконайтеся, що пакети робіт зв’язано з відповідним бюджетом." + action: "Записати час" + view_details: "Переглянути дані пор фактичні витрати" ee: features: time_entry_time_restrictions: Вимагати точного відстеження часу diff --git a/modules/documents/config/locales/crowdin/uk.yml b/modules/documents/config/locales/crowdin/uk.yml index ad87659461a..f8a49930dd1 100644 --- a/modules/documents/config/locales/crowdin/uk.yml +++ b/modules/documents/config/locales/crowdin/uk.yml @@ -24,7 +24,7 @@ uk: name: "Документи OpenProject " description: "Плагін OpenProject дозволяє створювати документи в проектах." attributes: - collaborative_editing_hocuspocus_url: "Hocuspocus server URL" + collaborative_editing_hocuspocus_url: "URL-адреса сервера Hocuspocus" activerecord: errors: models: @@ -127,8 +127,8 @@ uk: some_unwritable: Деякі значення налаштовуються за допомогою змінних середовища і не можуть бути відредаговані тут. hocuspocus_server_url: label: "URL-адреса сервера Hocuspocus" - caption: "The WebSocket address of a working Hocuspocus server." - invalid_scheme: "Must use a WebSocket protocol (ws:// or wss://)." + caption: "Адреса WebSocket робочого сервера Hocuspocus." + invalid_scheme: "Слід використовувати протокол WebSocket (ws:// or wss://)." hocuspocus_server_secret: label: "Секретний ключ клієнта" caption: "Вставте секретний код, наданий сервером Hocuspocus." diff --git a/modules/meeting/config/locales/crowdin/af.yml b/modules/meeting/config/locales/crowdin/af.yml index 6fdedae0649..bede303dc2d 100644 --- a/modules/meeting/config/locales/crowdin/af.yml +++ b/modules/meeting/config/locales/crowdin/af.yml @@ -42,6 +42,7 @@ af: start_date: "Datum" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Titel" author: "Outeur" @@ -619,6 +620,11 @@ af: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/ar.yml b/modules/meeting/config/locales/crowdin/ar.yml index 01a60b1f048..7c93bf81ff3 100644 --- a/modules/meeting/config/locales/crowdin/ar.yml +++ b/modules/meeting/config/locales/crowdin/ar.yml @@ -46,6 +46,7 @@ ar: start_date: "التاريخ" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "العنوان" author: "المؤلف" @@ -647,6 +648,11 @@ ar: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/az.yml b/modules/meeting/config/locales/crowdin/az.yml index a17ea75ee84..b693955ef16 100644 --- a/modules/meeting/config/locales/crowdin/az.yml +++ b/modules/meeting/config/locales/crowdin/az.yml @@ -42,6 +42,7 @@ az: start_date: "Date" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -619,6 +620,11 @@ az: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/be.yml b/modules/meeting/config/locales/crowdin/be.yml index fc460aeee00..d6adcda5ab3 100644 --- a/modules/meeting/config/locales/crowdin/be.yml +++ b/modules/meeting/config/locales/crowdin/be.yml @@ -44,6 +44,7 @@ be: start_date: "Дата" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -633,6 +634,11 @@ be: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/bg.yml b/modules/meeting/config/locales/crowdin/bg.yml index 42ad60b5877..66390c88074 100644 --- a/modules/meeting/config/locales/crowdin/bg.yml +++ b/modules/meeting/config/locales/crowdin/bg.yml @@ -42,6 +42,7 @@ bg: start_date: "Дата" start_time: "Начален час" start_time_hour: "Начален час" + sharing: "Sharing" meeting_agenda_item: title: "Заглавие" author: "Автор" @@ -619,6 +620,11 @@ bg: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Тази среща вече не може да се редактира." text_meeting_not_present_anymore: "Тази среща е заличена. Моля, изберете друга среща." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/ca.yml b/modules/meeting/config/locales/crowdin/ca.yml index acf2a23f64f..d4f003d22dc 100644 --- a/modules/meeting/config/locales/crowdin/ca.yml +++ b/modules/meeting/config/locales/crowdin/ca.yml @@ -42,6 +42,7 @@ ca: start_date: "Data" start_time: "Hora d'inici" start_time_hour: "Hora d'inici" + sharing: "Sharing" meeting_agenda_item: title: "Títol" author: "Autor/a" @@ -619,6 +620,11 @@ ca: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Aquesta reunió ja no es pot editar." text_meeting_not_present_anymore: "Aquesta reunió es va eliminar. Si us plau, selecciona una altra reunió." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/ckb-IR.yml b/modules/meeting/config/locales/crowdin/ckb-IR.yml index ce28e54db24..aacd35ef92a 100644 --- a/modules/meeting/config/locales/crowdin/ckb-IR.yml +++ b/modules/meeting/config/locales/crowdin/ckb-IR.yml @@ -42,6 +42,7 @@ ckb-IR: start_date: "Date" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -619,6 +620,11 @@ ckb-IR: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index e06c9942627..f3d06009bc3 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -44,6 +44,7 @@ cs: start_date: "Datum" start_time: "Čas zahájení" start_time_hour: "Čas zahájení" + sharing: "Sharing" meeting_agenda_item: title: "Název" author: "Autor" @@ -633,6 +634,11 @@ cs: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." 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." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/da.yml b/modules/meeting/config/locales/crowdin/da.yml index 1c93c068c16..44c0a02e3cc 100644 --- a/modules/meeting/config/locales/crowdin/da.yml +++ b/modules/meeting/config/locales/crowdin/da.yml @@ -42,6 +42,7 @@ da: start_date: "Dato" start_time: "Starttidspunkt" start_time_hour: "Starttidspunkt" + sharing: "Sharing" meeting_agenda_item: title: "Titel" author: "Forfatter" @@ -619,6 +620,11 @@ da: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index 3f76f579fbf..6cbfe32cbe9 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -22,13 +22,13 @@ #English strings go here for Rails i18n de: plugin_openproject_meeting: - name: "OpenProject Besprechung" + name: "OpenProject Besprechungen" description: >- - Besprechungen für OpenProject + Dieses Modul fügt Funktionen zur Unterstützung von Besprechungen zu OpenProject hinzu. Sie können Besprechungen planen und dabei Teilnehmer 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 Teilnehmer ausgewählt und Protokolle auf der Grundlage der Tagesordnung erstellt werden. Schließlich kann das Protokoll an alle Teilnehmer und Eingeladenen gesendet werden. activerecord: attributes: meeting: - type: "Besprechungstyp" + type: "Art der Besprechung" location: "Ort/Raum" duration: "Dauer" notes: "Anmerkungen" @@ -42,6 +42,7 @@ de: start_date: "Datum" start_time: "Startzeit" start_time_hour: "Startzeit" + sharing: "Sharing" meeting_agenda_item: title: "Titel" author: "Autor" @@ -70,10 +71,10 @@ de: meeting_participant: user_invalid: "ist kein gültiger Teilnehmer." meeting_agenda_item: - section_not_belong_to_meeting: "Section does not belong to the same meeting." + 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: "is not a valid occurrence time for this recurring meeting" + 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." @@ -118,13 +119,13 @@ de: error_notification_with_errors: "Benachrichtigungversenden fehlgeschlagen. Folgende Empfänger konnten nicht benachrichtigt werden: %{recipients}" label_meeting: "Besprechung" label_meeting_plural: "Besprechungen" - label_meeting_templates: "Templates" - label_meeting_template: "Template" - label_meeting_template_new: "New template" - label_meeting_template_create: "Create template" - label_meeting_template_delete: "Delete template" - label_meeting_template_edit: "Edit template" - label_meeting_create_from_template: "Create meeting from template" + label_meeting_templates: "Vorlagen" + label_meeting_template: "Vorlage" + label_meeting_template_new: "Neue Vorlage" + label_meeting_template_create: "Vorlage erstellen" + label_meeting_template_delete: "Vorlage löschen" + label_meeting_template_edit: "Vorlage bearbeiten" + label_meeting_create_from_template: "Besprechung aus Vorlage erstellen" label_meeting_new: "Neue Besprechung" label_meeting_new_dynamic: "Neue einmalige Besprechung" label_meeting_new_recurring: "Neue Terminserie" @@ -194,7 +195,7 @@ de: label_time_zone: "Zeitzone" label_start_date: "Beginn" label_subscribe_icalendar: "Im Kalender abonnieren" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_meeting_template_select: "Wählen Sie eine Vorlage, um deren Tagesordnungspunkte automatisch zu kopieren" caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: @@ -289,8 +290,8 @@ de: confirmation_message_html: > Diese Aktion kann nicht rückgängig gemacht werden. Bitte prüfen Sie die Angaben, bevor Sie fortfahren. template: - title: "Delete template" - heading: "Delete this template?" + title: "Vorlage löschen" + heading: "Vorlage löschen?" occurrence: title: "Wiederkehrende Besprechung absagen" heading: "Dieses Ereignis absagen?" @@ -490,7 +491,7 @@ de: end_series_dialog: title: "Terminserie beenden" notice_successful_notification: "E-Mail-Kalendereinladung an alle Teilnehmer gesendet" - notice_meeting_template_created: "Template successfully created" + notice_meeting_template_created: "Vorlage wurde erstellt" notice_timezone_missing: Keine Zeitzone eingestellt und daher %{zone} angenommen. Um Ihre Zeitzone einzustellen, klicken Sie bitte hier. notice_meeting_updated: "Diese Seite wurde von einem anderen Benutzer verändert. Laden Sie neu, um die Änderungen zu sehen." permission_create_meetings: "Besprechungen erstellen" @@ -505,8 +506,8 @@ de: text_duration_in_hours: "Dauer in Stunden" text_in_hours: "in Stunden" text_meeting_agenda_for_meeting: 'die Agenda für die Besprechung "%{meeting}"' - text_meeting_template_blank_slate_heading: "There are no templates to display" - text_meeting_template_blank_slate: "You can create a new template for one-time meetings" + text_meeting_template_blank_slate_heading: "Es gibt keine Vorlagen zum Anzeigen" + text_meeting_template_blank_slate: "Sie können eine neue Vorlage für einmalige Besprechungen erstellen" text_meeting_series_end_early_heading: "Zukünftige Ereignisse löschen?" text_meeting_series_end_early: "Durch das Beenden der Terminserie werden alle zukünftigen offenen oder geplanten Besprechungsereignisse gelöscht" text_meeting_closing_are_you_sure: "Sind Sie sicher, dass Sie die Agenda schließen wollen?" @@ -612,13 +613,18 @@ de: text_meeting_in_progress_dropdown_description: "Ergebnisse der Besprechung festhalten, wie z. B. Informationsbedarf oder Entscheidungen, die während der Besprechung getroffen werden." text_meeting_closed_dropdown_description: "Diese Besprechung ist geschlossen. Sie können keine Tagesordnungspunkte mehr hinzufügen/entfernen." text_meeting_draft_banner: "Dieses Meeting ist derzeit ein Entwurf. Diese Besprechung sendet keine Kalenderaktualisierungen oder Einladungen, selbst wenn Sie Besprechungsdetails ändern oder Teilnehmer hinzufügen/entfernen." - 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." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_banner: "Sie bearbeiten gerade eine Meeting-Vorlage. Sie können diese Vorlage verwenden, um einmalige Besprechungen mit einer vordefinierten Tagesordnung zu erstellen. Änderungen wirken sich nicht auf bereits erstellte Meetings aus." + text_onetime_meeting_template_empty_heading: "Die Vorlage für Besprechungen ist leer" text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Diese Besprechung öffnen und Einladungen verschicken?" text_exit_draft_mode_dialog_subtitle: "Sie können nicht mehr zum Entwurfsmodus zurückkehren, sobald Sie die Besprechung eröffnen." text_exit_draft_mode_dialog_template_title: "Das erste Vorkommen dieser Terminserie öffnen?" text_exit_draft_mode_dialog_template_subtitle: "Sie können danach nicht mehr in den Entwurfsmodus zurückkehren." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Diese Besprechung ist nicht mehr bearbeitbar." text_meeting_not_present_anymore: "Dieses Meeting wurde gelöscht. Bitte wählen Sie eine andere Besprechung." label_add_work_package_to_meeting_dialog_title: "Besprechung auswählen" diff --git a/modules/meeting/config/locales/crowdin/el.yml b/modules/meeting/config/locales/crowdin/el.yml index 50dc9392b83..9929c59805c 100644 --- a/modules/meeting/config/locales/crowdin/el.yml +++ b/modules/meeting/config/locales/crowdin/el.yml @@ -42,6 +42,7 @@ el: start_date: "Ημερομηνία" start_time: "Ώρα έναρξης" start_time_hour: "Ώρα έναρξης" + sharing: "Sharing" meeting_agenda_item: title: "Τίτλος" author: "Συγγραφέας" @@ -619,6 +620,11 @@ el: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/eo.yml b/modules/meeting/config/locales/crowdin/eo.yml index 6a0f507a9e5..ce8ee932dd2 100644 --- a/modules/meeting/config/locales/crowdin/eo.yml +++ b/modules/meeting/config/locales/crowdin/eo.yml @@ -42,6 +42,7 @@ eo: start_date: "Dato" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Titolo" author: "Aŭtoro" @@ -619,6 +620,11 @@ eo: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml index 885dcca591b..e849d11ed24 100644 --- a/modules/meeting/config/locales/crowdin/es.yml +++ b/modules/meeting/config/locales/crowdin/es.yml @@ -42,6 +42,7 @@ es: start_date: "Fecha" start_time: "Hora de inicio" start_time_hour: "Hora de inicio" + sharing: "Sharing" meeting_agenda_item: title: "Título" author: "Autor" @@ -619,6 +620,11 @@ es: text_exit_draft_mode_dialog_subtitle: "Una vez programada una reunión, no puedes volver al modo Borrador." text_exit_draft_mode_dialog_template_title: "¿Abrir la primera repetición de esta serie de reuniones?" text_exit_draft_mode_dialog_template_subtitle: "No podrás volver al modo Borrador después de esto." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Esta reunión ya no es editable." text_meeting_not_present_anymore: "Esta reunión ha sido eliminada. Por favor, seleccione otra reunión." label_add_work_package_to_meeting_dialog_title: "Seleccionar reunión" diff --git a/modules/meeting/config/locales/crowdin/et.yml b/modules/meeting/config/locales/crowdin/et.yml index dd2123de87e..4d1360dcdc0 100644 --- a/modules/meeting/config/locales/crowdin/et.yml +++ b/modules/meeting/config/locales/crowdin/et.yml @@ -42,6 +42,7 @@ et: start_date: "Kuupäev" start_time: "Algusaeg" start_time_hour: "Algusaeg" + sharing: "Sharing" meeting_agenda_item: title: "Pealkiri" author: "Autor" @@ -619,6 +620,11 @@ et: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/eu.yml b/modules/meeting/config/locales/crowdin/eu.yml index cea506922d6..4288e3ad77c 100644 --- a/modules/meeting/config/locales/crowdin/eu.yml +++ b/modules/meeting/config/locales/crowdin/eu.yml @@ -42,6 +42,7 @@ eu: start_date: "Date" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -619,6 +620,11 @@ eu: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/fa.yml b/modules/meeting/config/locales/crowdin/fa.yml index a0207f78ca3..286b986e412 100644 --- a/modules/meeting/config/locales/crowdin/fa.yml +++ b/modules/meeting/config/locales/crowdin/fa.yml @@ -42,6 +42,7 @@ fa: start_date: "تاریخ" start_time: "زمان شروع" start_time_hour: "زمان شروع" + sharing: "Sharing" meeting_agenda_item: title: "عنوان" author: "نویسنده" @@ -619,6 +620,11 @@ fa: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/fi.yml b/modules/meeting/config/locales/crowdin/fi.yml index 3d6caee3112..28a4bf35b1a 100644 --- a/modules/meeting/config/locales/crowdin/fi.yml +++ b/modules/meeting/config/locales/crowdin/fi.yml @@ -42,6 +42,7 @@ fi: start_date: "Päivämäärä" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Otsikko" author: "Tekijä" @@ -619,6 +620,11 @@ fi: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/fil.yml b/modules/meeting/config/locales/crowdin/fil.yml index 87115689c25..4a94a864c83 100644 --- a/modules/meeting/config/locales/crowdin/fil.yml +++ b/modules/meeting/config/locales/crowdin/fil.yml @@ -42,6 +42,7 @@ fil: start_date: "Petsa" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Pamagat" author: "May-akda" @@ -619,6 +620,11 @@ fil: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index 3314025a714..dda0dd01e95 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -42,6 +42,7 @@ fr: start_date: "Date" start_time: "Heure de début" start_time_hour: "Heure de début" + sharing: "Sharing" meeting_agenda_item: title: "Titre" author: "Auteur" @@ -619,6 +620,11 @@ fr: text_exit_draft_mode_dialog_subtitle: "Vous ne pouvez pas revenir au mode brouillon une fois que vous avez planifié une réunion." text_exit_draft_mode_dialog_template_title: "Ouvrez la première occurrence de cette série de réunions ?" text_exit_draft_mode_dialog_template_subtitle: "Vous ne pouvez plus revenir au mode brouillon après cette opération." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Cette réunion n'est plus modifiable." text_meeting_not_present_anymore: "Cette réunion a été supprimée. Veuillez sélectionner une autre réunion." label_add_work_package_to_meeting_dialog_title: "Sélectionner la réunion" diff --git a/modules/meeting/config/locales/crowdin/he.yml b/modules/meeting/config/locales/crowdin/he.yml index 0c6c1ea40ea..bb22503ab45 100644 --- a/modules/meeting/config/locales/crowdin/he.yml +++ b/modules/meeting/config/locales/crowdin/he.yml @@ -44,6 +44,7 @@ he: start_date: "תאריך" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "כותרת" author: "מחבר" @@ -633,6 +634,11 @@ he: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/hi.yml b/modules/meeting/config/locales/crowdin/hi.yml index fafe394fc0a..00cfbd80de7 100644 --- a/modules/meeting/config/locales/crowdin/hi.yml +++ b/modules/meeting/config/locales/crowdin/hi.yml @@ -42,6 +42,7 @@ hi: start_date: "तिथि" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "शीर्षक" author: "Author" @@ -619,6 +620,11 @@ hi: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/hr.yml b/modules/meeting/config/locales/crowdin/hr.yml index 6ebf9bd57e0..468929aa170 100644 --- a/modules/meeting/config/locales/crowdin/hr.yml +++ b/modules/meeting/config/locales/crowdin/hr.yml @@ -43,6 +43,7 @@ hr: start_date: "Datum" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Naziv" author: "Autor" @@ -626,6 +627,11 @@ hr: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/hu.yml b/modules/meeting/config/locales/crowdin/hu.yml index f5e69bfeb6c..7c0ff277101 100644 --- a/modules/meeting/config/locales/crowdin/hu.yml +++ b/modules/meeting/config/locales/crowdin/hu.yml @@ -42,6 +42,7 @@ hu: start_date: "dátum" start_time: "Kezdés" start_time_hour: "Kezdés" + sharing: "Sharing" meeting_agenda_item: title: "Cím" author: "Szerző" @@ -619,6 +620,11 @@ hu: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Ez a megbeszélés már nem szerkeszthető." text_meeting_not_present_anymore: "Ez a megbeszélés törlésre került. Kérjük, válasszon ki egy másik megbeszélést." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/id.yml b/modules/meeting/config/locales/crowdin/id.yml index 1ebe98f4eca..4a5ac180659 100644 --- a/modules/meeting/config/locales/crowdin/id.yml +++ b/modules/meeting/config/locales/crowdin/id.yml @@ -41,6 +41,7 @@ id: start_date: "Tanggal" start_time: "Waktu mulai" start_time_hour: "Waktu mulai" + sharing: "Sharing" meeting_agenda_item: title: "Judul" author: "Penulis" @@ -612,6 +613,11 @@ id: text_exit_draft_mode_dialog_subtitle: "Anda tidak dapat kembali ke mode draf setellah Anda menjadwalkan rapat." text_exit_draft_mode_dialog_template_title: "Buka acara yang pertama dalam seri rapat ini?" text_exit_draft_mode_dialog_template_subtitle: "Anda tidak dapat kembali ke mode draf setelah ini." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Rapat ini tidak dapat disunting kembali." text_meeting_not_present_anymore: "Rapat ini telah dihapus. Silakan pilih rapat yang lain." label_add_work_package_to_meeting_dialog_title: "Pilih rapat" diff --git a/modules/meeting/config/locales/crowdin/it.yml b/modules/meeting/config/locales/crowdin/it.yml index 934a7b4eb61..a81edfb261e 100644 --- a/modules/meeting/config/locales/crowdin/it.yml +++ b/modules/meeting/config/locales/crowdin/it.yml @@ -42,6 +42,7 @@ it: start_date: "Data" start_time: "Ora di inizio" start_time_hour: "Ora di inizio" + sharing: "Sharing" meeting_agenda_item: title: "Titolo" author: "Autore" @@ -619,6 +620,11 @@ it: text_exit_draft_mode_dialog_subtitle: "Non può tornare alla modalità bozza una volta programmata una riunione." text_exit_draft_mode_dialog_template_title: "Aprire la prima occorrenza di questa serie di riunioni?" text_exit_draft_mode_dialog_template_subtitle: "Non puoi tornare alla modalità bozza dopo averlo fatto." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Questa riunione non è più modificabile." text_meeting_not_present_anymore: "Questa riunione è stata eliminata. Seleziona un'altra riunione." label_add_work_package_to_meeting_dialog_title: "Seleziona riunione" diff --git a/modules/meeting/config/locales/crowdin/ja.yml b/modules/meeting/config/locales/crowdin/ja.yml index ebe15a4e53f..63c5d3f8cc1 100644 --- a/modules/meeting/config/locales/crowdin/ja.yml +++ b/modules/meeting/config/locales/crowdin/ja.yml @@ -41,6 +41,7 @@ ja: start_date: "日付" start_time: "開始時間" start_time_hour: "開始時間" + sharing: "Sharing" meeting_agenda_item: title: "タイトル" author: "作成者" @@ -612,6 +613,11 @@ ja: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "この会議はもう編集できません。" text_meeting_not_present_anymore: "この会議は削除されました。別の会議を選択してください。" label_add_work_package_to_meeting_dialog_title: "会議の選択" diff --git a/modules/meeting/config/locales/crowdin/ka.yml b/modules/meeting/config/locales/crowdin/ka.yml index 2b3930e73bf..2adf17a7f10 100644 --- a/modules/meeting/config/locales/crowdin/ka.yml +++ b/modules/meeting/config/locales/crowdin/ka.yml @@ -42,6 +42,7 @@ ka: start_date: "თარიღი" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "სათაური" author: "ავტორი" @@ -619,6 +620,11 @@ ka: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/kk.yml b/modules/meeting/config/locales/crowdin/kk.yml index eb3c476208d..d7b50896e55 100644 --- a/modules/meeting/config/locales/crowdin/kk.yml +++ b/modules/meeting/config/locales/crowdin/kk.yml @@ -42,6 +42,7 @@ kk: start_date: "Date" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -619,6 +620,11 @@ kk: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/ko.yml b/modules/meeting/config/locales/crowdin/ko.yml index 15d1d2ebab8..fed6553910d 100644 --- a/modules/meeting/config/locales/crowdin/ko.yml +++ b/modules/meeting/config/locales/crowdin/ko.yml @@ -41,6 +41,7 @@ ko: start_date: "날짜" start_time: "시작 시간" start_time_hour: "시작 시간" + sharing: "Sharing" meeting_agenda_item: title: "제목" author: "작성자" @@ -72,7 +73,7 @@ ko: section_not_belong_to_meeting: "섹션이 같은 미팅에 속하지 않습니다." user_invalid: "- 유효한 참가자가 아닙니다." recurring_meeting_interim_response: - not_an_occurrence: "is not a valid occurrence time for this recurring meeting" + not_an_occurrence: "- 이 반복 미팅에 유효한 항목 시간이 아닙니다" recurring_meeting: must_cover_existing_meetings: one: "이 시리즈에는 새로운 스케줄에 포함되지 않은 오픈 미팅이 하나 있습니다. 모든 기존 미팅을 포함하도록 스케줄을 조정하세요." @@ -190,7 +191,7 @@ ko: label_start_date: "시작일" label_subscribe_icalendar: "캘린더 구독" caption_meeting_template_select: "템플릿을 선택하면 의제 항목이 자동으로 복사됩니다." - caption_template_project_select: "Please select the project in which to create this meeting template" + caption_template_project_select: "이 미팅 템플릿을 만들 프로젝트를 선택하세요" meeting: participants: label: @@ -242,9 +243,9 @@ ko: header: "취소됨: 미팅 '%{title}'" header_occurrence: "취소됨: 미팅 항목 '%{title}'" header_series: "취소됨: 미팅 시리즈 '%{title}'" - 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" + summary_occurrence: "'%{title}' 항목이 %{actor} 님에 의해 취소되었거나, 참가자에서 회원님이 제거되었습니다" + summary_series: "'%{title}' 미팅 시리즈가 %{actor} 님에 의해 취소되었거나, 참가자에서 회원님이 제거되었습니다" + summary: "'%{title}'이(가) %{actor} 님에 의해 취소되었거나, 참가자에서 회원님이 제거되었습니다" date_time: "스케줄링된 날짜/시간" participant_added: header: "미팅 '%{title}' - 참가자 추가됨" @@ -258,7 +259,7 @@ ko: summary_series: "%{actor} 님이 미팅 시리즈 '%{title}'에서 %{participant} 님을 제거했습니다" ended: header_series: "종료됨: 미팅 시리즈 '%{title}'" - summary_series: "Meeting series '%{title}' has been ended by %{actor}" + summary_series: "'%{title}' 미팅 시리즈를 %{actor} 님이 종료했습니다" updated: header: "'%{title}' 미팅이 업데이트되었습니다" summary: "'%{title}' 미팅을 %{actor} 님이 업데이트했습니다" @@ -545,8 +546,8 @@ ko: label_agenda_item_move_up: "위로 이동" label_agenda_item_move_down: "아래로 이동" label_agenda_item_duplicate: "복제" - label_agenda_item_duplicate_in_next: "Duplicate in next meeting" - label_agenda_item_duplicate_in_next_title: "Duplicate in next meeting?" + label_agenda_item_duplicate_in_next: "다음 미팅에 복제" + label_agenda_item_duplicate_in_next_title: "다음 미팅에 복제하시겠습니까?" label_agenda_item_add_notes: "메모 추가" label_agenda_item_add_outcome: "결과 추가" label_agenda_item_work_package_add: "작업 패키지 추가" @@ -607,11 +608,16 @@ ko: text_meeting_draft_banner: "초안 모드에 현재 있습니다. 이 미팅은 미팅 세부 정보를 변경하거나 참가자를 추가/제거하더라도 캘린더 업데이트나 초대장을 전송하지 않습니다." text_onetime_meeting_template_banner: "현재 미팅 템플릿을 편집하는 중입니다. 이 템플릿을 사용하여 사전 정의된 의제가 있는 일회성 미팅을 만들 수 있습니다. 변경 사항은 이미 생성된 미팅에 영향을 미치지 않습니다." text_onetime_meeting_template_empty_heading: "이 미팅 템플릿은 비어 있습니다" - text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." + text_onetime_meeting_template_empty_description: "여기에 의제 항목, 섹션 및 첨부 파일을 추가하세요. 이 템플릿을 사용하여 생성된 모든 미팅에 해당 항목이 포함됩니다." text_exit_draft_mode_dialog_title: "이 미팅을 열고 초대장을 보내시겠습니까?" text_exit_draft_mode_dialog_subtitle: "미팅을 예약한 후에는 초안 모드로 돌아갈 수 없습니다." text_exit_draft_mode_dialog_template_title: "이 미팅 시리즈의 첫 번째 항목을 열어보시겠습니까?" text_exit_draft_mode_dialog_template_subtitle: "이후에는 초안 모드로 돌아갈 수 없습니다." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "이 미팅은 더 이상 편집할 수 없습니다." text_meeting_not_present_anymore: "이 미팅은 삭제되었습니다. 다른 미팅을 선택해 주세요." label_add_work_package_to_meeting_dialog_title: "미팅 선택" diff --git a/modules/meeting/config/locales/crowdin/lt.yml b/modules/meeting/config/locales/crowdin/lt.yml index 9ed2501ffc6..759c038b5e8 100644 --- a/modules/meeting/config/locales/crowdin/lt.yml +++ b/modules/meeting/config/locales/crowdin/lt.yml @@ -44,6 +44,7 @@ lt: start_date: "Data" start_time: "Pradžios laikas" start_time_hour: "Pradžios laikas" + sharing: "Sharing" meeting_agenda_item: title: "Pavadinimas" author: "Autorius" @@ -633,6 +634,11 @@ lt: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Šis susitikimas daugiau neberedaguojamas" text_meeting_not_present_anymore: "Šis susitikimas buvo ištrintas. Prašome parinkti kitą susitikimą." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/lv.yml b/modules/meeting/config/locales/crowdin/lv.yml index f61a95c05f6..4463108c218 100644 --- a/modules/meeting/config/locales/crowdin/lv.yml +++ b/modules/meeting/config/locales/crowdin/lv.yml @@ -43,6 +43,7 @@ lv: start_date: "Datums" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Virsraksts" author: "Autors" @@ -626,6 +627,11 @@ lv: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/mn.yml b/modules/meeting/config/locales/crowdin/mn.yml index e36707a31e8..5a002f9e11f 100644 --- a/modules/meeting/config/locales/crowdin/mn.yml +++ b/modules/meeting/config/locales/crowdin/mn.yml @@ -42,6 +42,7 @@ mn: start_date: "Date" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -619,6 +620,11 @@ mn: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/ms.yml b/modules/meeting/config/locales/crowdin/ms.yml index 6896c316366..c16b71c87a8 100644 --- a/modules/meeting/config/locales/crowdin/ms.yml +++ b/modules/meeting/config/locales/crowdin/ms.yml @@ -41,6 +41,7 @@ ms: start_date: "Tarikh" start_time: "Masa mula" start_time_hour: "Masa mula" + sharing: "Sharing" meeting_agenda_item: title: "Tajuk" author: "Pengarang" @@ -612,6 +613,11 @@ ms: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Mesyuarat ini tidak boleh diedit lagi." text_meeting_not_present_anymore: "Mesyuarat ini telah dipadamkan. Sila pilih mesyuarat lain." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/ne.yml b/modules/meeting/config/locales/crowdin/ne.yml index 71a4e46aaf1..2dbdf539852 100644 --- a/modules/meeting/config/locales/crowdin/ne.yml +++ b/modules/meeting/config/locales/crowdin/ne.yml @@ -42,6 +42,7 @@ ne: start_date: "Date" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -619,6 +620,11 @@ ne: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/nl.yml b/modules/meeting/config/locales/crowdin/nl.yml index 5c61689c80d..097df7a9fde 100644 --- a/modules/meeting/config/locales/crowdin/nl.yml +++ b/modules/meeting/config/locales/crowdin/nl.yml @@ -42,6 +42,7 @@ nl: start_date: "Datum" start_time: "Starttijd" start_time_hour: "Starttijd" + sharing: "Sharing" meeting_agenda_item: title: "Titel" author: "Auteur" @@ -619,6 +620,11 @@ nl: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Deze vergadering kan niet meer bewerkt worden." text_meeting_not_present_anymore: "Deze vergadering is verwijderd. Selecteer een andere vergadering." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/no.yml b/modules/meeting/config/locales/crowdin/no.yml index f1e84790589..6aa99381267 100644 --- a/modules/meeting/config/locales/crowdin/no.yml +++ b/modules/meeting/config/locales/crowdin/no.yml @@ -42,6 +42,7 @@ start_date: "Dato" start_time: "Starttid" start_time_hour: "Starttid" + sharing: "Sharing" meeting_agenda_item: title: "Tittel" author: "Forfatter" @@ -619,6 +620,11 @@ text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Dette møtet er ikke lenger redigerbart." text_meeting_not_present_anymore: "Dette møtet ble slettet. Velg et annet møte." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/pl.yml b/modules/meeting/config/locales/crowdin/pl.yml index ec18b5c45c4..1c049d86032 100644 --- a/modules/meeting/config/locales/crowdin/pl.yml +++ b/modules/meeting/config/locales/crowdin/pl.yml @@ -44,6 +44,7 @@ pl: start_date: "Data" start_time: "Data rozpoczęcia" start_time_hour: "Godzina rozpoczęcia" + sharing: "Sharing" meeting_agenda_item: title: "Tytuł" author: "Autor" @@ -633,6 +634,11 @@ pl: text_exit_draft_mode_dialog_subtitle: "Po zaplanowaniu spotkania nie można powrócić do trybu wersji roboczej." text_exit_draft_mode_dialog_template_title: "Otworzyć pierwsze wystąpienie z tej serii spotkań?" text_exit_draft_mode_dialog_template_subtitle: "Po tym nie możesz powrócić do trybu wersji roboczej." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Tego spotkania nie można już edytować." text_meeting_not_present_anymore: "To spotkanie zostało usunięte. Wybierz inne spotkanie." label_add_work_package_to_meeting_dialog_title: "Wybierz spotkanie" diff --git a/modules/meeting/config/locales/crowdin/pt-BR.yml b/modules/meeting/config/locales/crowdin/pt-BR.yml index afbd98bf1a4..edae21ab20f 100644 --- a/modules/meeting/config/locales/crowdin/pt-BR.yml +++ b/modules/meeting/config/locales/crowdin/pt-BR.yml @@ -42,6 +42,7 @@ pt-BR: start_date: "Data" start_time: "Hora de início" start_time_hour: "Hora de início" + sharing: "Sharing" meeting_agenda_item: title: "Título" author: "Autor" @@ -619,6 +620,11 @@ pt-BR: text_exit_draft_mode_dialog_subtitle: "Não é possível voltar ao modo rascunho depois de agendar uma reunião." text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?" text_exit_draft_mode_dialog_template_subtitle: "Você não pode retornar ao modo rascunho após isto." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "A reunião não pode mais ser editada." text_meeting_not_present_anymore: "Esta reunião foi excluída. Selecione outra reunião." label_add_work_package_to_meeting_dialog_title: "Selecionar reunião" diff --git a/modules/meeting/config/locales/crowdin/pt-PT.yml b/modules/meeting/config/locales/crowdin/pt-PT.yml index d4bc3db52aa..194ff4d8fcd 100644 --- a/modules/meeting/config/locales/crowdin/pt-PT.yml +++ b/modules/meeting/config/locales/crowdin/pt-PT.yml @@ -42,6 +42,7 @@ pt-PT: start_date: "Data" start_time: "Hora de início" start_time_hour: "Hora de início" + sharing: "Sharing" meeting_agenda_item: title: "Título" author: "Autor" @@ -619,6 +620,11 @@ pt-PT: text_exit_draft_mode_dialog_subtitle: "Não pode regressar ao modo de rascunho após agendar uma reunião." text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?" text_exit_draft_mode_dialog_template_subtitle: "Depois disso, não pode voltar ao modo de rascunho." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Esta reunião não é mais editável." text_meeting_not_present_anymore: "Esta reunião foi excluída. Por favor, selecione outra reunião." label_add_work_package_to_meeting_dialog_title: "Selecionar reunião" diff --git a/modules/meeting/config/locales/crowdin/ro.yml b/modules/meeting/config/locales/crowdin/ro.yml index 5ad3e74bfa0..aa95b245e0c 100644 --- a/modules/meeting/config/locales/crowdin/ro.yml +++ b/modules/meeting/config/locales/crowdin/ro.yml @@ -43,6 +43,7 @@ ro: start_date: "Dată" start_time: "Dată început" start_time_hour: "Dată început" + sharing: "Sharing" meeting_agenda_item: title: "Titlu" author: "Autor" @@ -626,6 +627,11 @@ ro: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index bd5e282c019..f9d4a5a4fa7 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -44,6 +44,7 @@ ru: start_date: "Дата" start_time: "Время начала" start_time_hour: "Время начала" + sharing: "Sharing" meeting_agenda_item: title: "Заголовок" author: "Автор" @@ -633,6 +634,11 @@ ru: text_exit_draft_mode_dialog_subtitle: "Вы не можете вернуться в режим черновика после того, как запланировали совещание." text_exit_draft_mode_dialog_template_title: "Открыть первое совещание из этой серии?" text_exit_draft_mode_dialog_template_subtitle: "После этого Вы не сможете вернуться в режим черновика." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Это совещание больше нельзя редактировать." text_meeting_not_present_anymore: "Это совещание было удалено. Пожалуйста, выберите другое." label_add_work_package_to_meeting_dialog_title: "Выберите совещание" diff --git a/modules/meeting/config/locales/crowdin/rw.yml b/modules/meeting/config/locales/crowdin/rw.yml index 74cd8cb745d..f9c3f4f57c3 100644 --- a/modules/meeting/config/locales/crowdin/rw.yml +++ b/modules/meeting/config/locales/crowdin/rw.yml @@ -42,6 +42,7 @@ rw: start_date: "Date" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -619,6 +620,11 @@ rw: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/si.yml b/modules/meeting/config/locales/crowdin/si.yml index 61003981c93..eaac03ff503 100644 --- a/modules/meeting/config/locales/crowdin/si.yml +++ b/modules/meeting/config/locales/crowdin/si.yml @@ -42,6 +42,7 @@ si: start_date: "දිනය" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "මාතෘකාව" author: "කර්තෘ" @@ -619,6 +620,11 @@ si: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/sk.yml b/modules/meeting/config/locales/crowdin/sk.yml index 30f9dd46824..8d8d78b15b0 100644 --- a/modules/meeting/config/locales/crowdin/sk.yml +++ b/modules/meeting/config/locales/crowdin/sk.yml @@ -44,6 +44,7 @@ sk: start_date: "Dátum" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Nadpis" author: "Autor" @@ -633,6 +634,11 @@ sk: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/sl.yml b/modules/meeting/config/locales/crowdin/sl.yml index 2703081ec7b..e4d2e0fec82 100644 --- a/modules/meeting/config/locales/crowdin/sl.yml +++ b/modules/meeting/config/locales/crowdin/sl.yml @@ -44,6 +44,7 @@ sl: start_date: "Datum" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Naslov" author: "Avtor" @@ -633,6 +634,11 @@ sl: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/sr.yml b/modules/meeting/config/locales/crowdin/sr.yml index ee7e301be47..63b870d51c8 100644 --- a/modules/meeting/config/locales/crowdin/sr.yml +++ b/modules/meeting/config/locales/crowdin/sr.yml @@ -43,6 +43,7 @@ sr: start_date: "Date" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -626,6 +627,11 @@ sr: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/sv.yml b/modules/meeting/config/locales/crowdin/sv.yml index 75410f70c81..ea74805fc1b 100644 --- a/modules/meeting/config/locales/crowdin/sv.yml +++ b/modules/meeting/config/locales/crowdin/sv.yml @@ -42,6 +42,7 @@ sv: start_date: "Datum" start_time: "Starttid" start_time_hour: "Starttid" + sharing: "Sharing" meeting_agenda_item: title: "Titel" author: "Upphovsman" @@ -619,6 +620,11 @@ sv: text_exit_draft_mode_dialog_subtitle: "Du kan inte gå tillbaka till utkastet när du schemalägger ett möte." text_exit_draft_mode_dialog_template_title: "Öppna den första förekomsten av denna mötesserie?" text_exit_draft_mode_dialog_template_subtitle: "Du kan inte återgå till utkastläget efter detta." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Detta möte är inte längre redigerbart." text_meeting_not_present_anymore: "Detta möte har tagits bort. Vänligen välj ett annat möte." label_add_work_package_to_meeting_dialog_title: "Välj möte" diff --git a/modules/meeting/config/locales/crowdin/th.yml b/modules/meeting/config/locales/crowdin/th.yml index 379be6c0638..9b556335b66 100644 --- a/modules/meeting/config/locales/crowdin/th.yml +++ b/modules/meeting/config/locales/crowdin/th.yml @@ -41,6 +41,7 @@ th: start_date: "วันที่" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "ชื่อเรื่อง" author: "ผู้เขียน" @@ -612,6 +613,11 @@ th: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/tr.yml b/modules/meeting/config/locales/crowdin/tr.yml index c839a67802a..c390cd7490f 100644 --- a/modules/meeting/config/locales/crowdin/tr.yml +++ b/modules/meeting/config/locales/crowdin/tr.yml @@ -42,6 +42,7 @@ tr: start_date: "Tarih" start_time: "Başlama tarihi" start_time_hour: "Başlama saati" + sharing: "Sharing" meeting_agenda_item: title: "Başlık" author: "Yazar" @@ -619,6 +620,11 @@ tr: text_exit_draft_mode_dialog_subtitle: "Bir toplantı planladıktan sonra taslak moduna geri dönemezsiniz." text_exit_draft_mode_dialog_template_title: "Bu toplantı serisinin ilkini açar mısınız?" text_exit_draft_mode_dialog_template_subtitle: "Bundan sonra taslak moduna geri dönemezsiniz." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Bu toplantıyı artık düzenleyemezsiniz." text_meeting_not_present_anymore: "Toplantı silinmiş. Başka bir toplantı seçin lütfen." label_add_work_package_to_meeting_dialog_title: "Toplantı seç" diff --git a/modules/meeting/config/locales/crowdin/uk.yml b/modules/meeting/config/locales/crowdin/uk.yml index 2609642c907..1fde93aaf69 100644 --- a/modules/meeting/config/locales/crowdin/uk.yml +++ b/modules/meeting/config/locales/crowdin/uk.yml @@ -44,6 +44,7 @@ uk: start_date: "Дата" start_time: "Час початку" start_time_hour: "Час початку" + sharing: "Sharing" meeting_agenda_item: title: "Назва " author: "Автор" @@ -70,10 +71,10 @@ uk: errors: models: meeting_participant: - user_invalid: "is not a valid participant." + user_invalid: "не є дійсним учасником." meeting_agenda_item: - section_not_belong_to_meeting: "Section does not belong to the same meeting." - user_invalid: "is not a valid participant." + section_not_belong_to_meeting: "Розділ не належить до тієї самої наради." + user_invalid: "не є дійсним учасником." recurring_meeting_interim_response: not_an_occurrence: "is not a valid occurrence time for this recurring meeting" recurring_meeting: @@ -122,13 +123,13 @@ uk: error_notification_with_errors: "Не вдалося надіслати сповіщення. Неможливо отримати сповіщення про таких одержувачів: %{recipients}" label_meeting: "Зустріч" label_meeting_plural: "Зустрічі" - label_meeting_templates: "Templates" - label_meeting_template: "Template" - label_meeting_template_new: "New template" - label_meeting_template_create: "Create template" - label_meeting_template_delete: "Delete template" - label_meeting_template_edit: "Edit template" - label_meeting_create_from_template: "Create meeting from template" + label_meeting_templates: "Шаблони" + label_meeting_template: "Шаблон" + label_meeting_template_new: "Новий шаблон" + label_meeting_template_create: "Створити шаблон" + label_meeting_template_delete: "Видалити шаблон" + label_meeting_template_edit: "Редагувати шаблон" + label_meeting_create_from_template: "Створити нараду на основі шаблона" label_meeting_new: "Нова зустріч" label_meeting_new_dynamic: "Нова одноразова нарада" label_meeting_new_recurring: "Нова повторювана нарада" @@ -204,7 +205,7 @@ uk: label_time_zone: "Часовий пояс" label_start_date: "Дата початку" label_subscribe_icalendar: "Підписатися на календар" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_meeting_template_select: "Виберіть шаблон, щоб автоматично скопіювати пункти порядку денного" caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: @@ -299,8 +300,8 @@ uk: confirmation_message_html: > Зверніть увагу: цю дію не можна відмінити. template: - title: "Delete template" - heading: "Delete this template?" + title: "Видалити шаблон" + heading: "Видалити цей шаблон?" occurrence: title: "Скасувати нараду серії" heading: "Скасувати цю нараду серії?" @@ -504,7 +505,7 @@ uk: end_series_dialog: title: "Завершити серію нарад" notice_successful_notification: "Оновлення з календаря надіслано електронною поштою всім учасникам" - notice_meeting_template_created: "Template successfully created" + notice_meeting_template_created: "Шаблон успішно створено" notice_timezone_missing: Часовий пояс не встановлено і %{zone} передбачається. Щоб вибрати часовий пояс, натисніть тут. notice_meeting_updated: "Цю сторінку оновив інший користувач. Перезавантажте її, щоб побачити зміни." permission_create_meetings: "Створюйте зустрічі" @@ -519,8 +520,8 @@ uk: text_duration_in_hours: "Тривалість у годинах" text_in_hours: "у годинах" text_meeting_agenda_for_meeting: 'порядку денного засідання %{meeting}' - text_meeting_template_blank_slate_heading: "There are no templates to display" - text_meeting_template_blank_slate: "You can create a new template for one-time meetings" + text_meeting_template_blank_slate_heading: "Шаблонів не знайдено" + text_meeting_template_blank_slate: "Ви можете створити шаблон для одноразових нарад" text_meeting_series_end_early_heading: "Видалити майбутні наради серії?" text_meeting_series_end_early: "Завершення серії призведе до видалення всіх наступних відкритих або запланованих нарад" text_meeting_closing_are_you_sure: "Справді закрити порядок денний заходу?" @@ -626,13 +627,18 @@ uk: 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." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_banner: "Ви редагуєте шаблон наради. Цей шаблон можна використовувати для створення одноразових нарад із заздалегідь визначеним порядком денним. Зміни не вплинуть на вже створені наради." + text_onetime_meeting_template_empty_heading: "Цей шаблон наради порожній" text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Відкрити цю нараду й надіслати запрошення?" text_exit_draft_mode_dialog_subtitle: "Запланувавши нараду, не можна повернутися в режим чернетки." text_exit_draft_mode_dialog_template_title: "Відкрити першу нараду цієї серії?" text_exit_draft_mode_dialog_template_subtitle: "Після цього не можна буде повернутися в режим чернетки." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Цю нараду більше не можна редагувати." text_meeting_not_present_anymore: "Цю нараду видалено. Виберіть іншу нараду." label_add_work_package_to_meeting_dialog_title: "Вибрати нараду" diff --git a/modules/meeting/config/locales/crowdin/uz.yml b/modules/meeting/config/locales/crowdin/uz.yml index 2e53f66911c..fe71a68b19d 100644 --- a/modules/meeting/config/locales/crowdin/uz.yml +++ b/modules/meeting/config/locales/crowdin/uz.yml @@ -42,6 +42,7 @@ uz: start_date: "Date" start_time: "Start time" start_time_hour: "Start time" + sharing: "Sharing" meeting_agenda_item: title: "Title" author: "Author" @@ -619,6 +620,11 @@ uz: text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "This meeting is not editable anymore." text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting." label_add_work_package_to_meeting_dialog_title: "Select meeting" diff --git a/modules/meeting/config/locales/crowdin/vi.yml b/modules/meeting/config/locales/crowdin/vi.yml index 1eb3bca9ba0..06779739f1b 100644 --- a/modules/meeting/config/locales/crowdin/vi.yml +++ b/modules/meeting/config/locales/crowdin/vi.yml @@ -41,6 +41,7 @@ vi: start_date: "ngày" start_time: "Thời gian bắt đầu" start_time_hour: "Thời gian bắt đầu" + sharing: "Sharing" meeting_agenda_item: title: "tiêu đề" author: "tác giả" @@ -612,6 +613,11 @@ vi: text_exit_draft_mode_dialog_subtitle: "Bạn không thể quay lại chế độ nháp sau khi lên lịch cuộc họp." text_exit_draft_mode_dialog_template_title: "Mở lần xuất hiện đầu tiên của chuỗi cuộc họp này?" text_exit_draft_mode_dialog_template_subtitle: "Bạn không thể quay lại chế độ nháp sau này." + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "Cuộc họp này không thể chỉnh sửa được nữa." text_meeting_not_present_anymore: "Cuộc họp này đã bị xóa. Vui lòng chọn một cuộc họp khác." label_add_work_package_to_meeting_dialog_title: "Chọn cuộc họp" diff --git a/modules/meeting/config/locales/crowdin/zh-CN.yml b/modules/meeting/config/locales/crowdin/zh-CN.yml index b4ec178cde3..3fd94209580 100644 --- a/modules/meeting/config/locales/crowdin/zh-CN.yml +++ b/modules/meeting/config/locales/crowdin/zh-CN.yml @@ -41,6 +41,7 @@ zh-CN: start_date: "日期" start_time: "开始时间" start_time_hour: "开始时间" + sharing: "Sharing" meeting_agenda_item: title: "标题" author: "作者" @@ -612,6 +613,11 @@ zh-CN: text_exit_draft_mode_dialog_subtitle: "会议安排完成后,您将无法返回到草稿模式。" text_exit_draft_mode_dialog_template_title: "是否打开此会议系列的第一个会议?" text_exit_draft_mode_dialog_template_subtitle: "在此之后,您将无法返回到草稿模式。" + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "本次会议已不可编辑。" text_meeting_not_present_anymore: "此次会议已被删除。请选择另一次会议。" label_add_work_package_to_meeting_dialog_title: "选择会议" diff --git a/modules/meeting/config/locales/crowdin/zh-TW.yml b/modules/meeting/config/locales/crowdin/zh-TW.yml index 3c47a83f41c..36592a630c6 100644 --- a/modules/meeting/config/locales/crowdin/zh-TW.yml +++ b/modules/meeting/config/locales/crowdin/zh-TW.yml @@ -41,6 +41,7 @@ zh-TW: start_date: "日期" start_time: "開始時間" start_time_hour: "開始時間" + sharing: "Sharing" meeting_agenda_item: title: "標題" author: "會議發起者" @@ -612,6 +613,11 @@ zh-TW: text_exit_draft_mode_dialog_subtitle: "一旦排定會議,就無法返回草稿模式。" text_exit_draft_mode_dialog_template_title: "要開啟此會議系列的第一場會議嗎?" text_exit_draft_mode_dialog_template_subtitle: "之後您就無法回到草稿模式。" + label_meeting_template_sharing: "Sharing" + label_meeting_template_sharing_none: "Only this project" + label_meeting_template_sharing_descendants: "Subprojects" + label_meeting_template_sharing_system: "All projects" + text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." text_meeting_not_editable_anymore: "本次會議已不可編輯。" text_meeting_not_present_anymore: "此次會議已被刪除。請選擇另一場會議。" label_add_work_package_to_meeting_dialog_title: "選擇會議" From 3761f142882a9b317d81ee6e6fb865ed31071ac3 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Tue, 24 Feb 2026 15:45:12 +0100 Subject: [PATCH 182/334] [#71250] Backlog view can render a sprint [#71250] Draft: edit_dialog for sprints # Conflicts: # modules/backlogs/lib/open_project/backlogs/engine.rb --- app/models/permitted_params.rb | 1 + .../new_sprint_form_component.html.erb | 4 +- .../backlogs/new_sprint_form_component.rb | 13 ++ .../backlogs/sprint_component.html.erb | 63 ++++++++++ .../components/backlogs/sprint_component.rb | 92 ++++++++++++++ .../backlogs/sprint_header_component.html.erb | 90 ++++++++++++++ .../backlogs/sprint_header_component.rb | 84 +++++++++++++ .../backlogs/sprint_menu_component.html.erb | 113 ++++++++++++++++++ .../backlogs/sprint_menu_component.rb | 59 +++++++++ .../rb_master_backlogs_controller.rb | 13 +- .../app/controllers/rb_sprints_controller.rb | 14 ++- modules/backlogs/app/models/agile/sprint.rb | 6 + .../views/rb_master_backlogs/_list.html.erb | 8 +- modules/backlogs/config/routes.rb | 8 +- 14 files changed, 560 insertions(+), 8 deletions(-) create mode 100644 modules/backlogs/app/components/backlogs/sprint_component.html.erb create mode 100644 modules/backlogs/app/components/backlogs/sprint_component.rb create mode 100644 modules/backlogs/app/components/backlogs/sprint_header_component.html.erb create mode 100644 modules/backlogs/app/components/backlogs/sprint_header_component.rb create mode 100644 modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb create mode 100644 modules/backlogs/app/components/backlogs/sprint_menu_component.rb diff --git a/app/models/permitted_params.rb b/app/models/permitted_params.rb index 6562883140e..51dec7954b7 100644 --- a/app/models/permitted_params.rb +++ b/app/models/permitted_params.rb @@ -557,6 +557,7 @@ class PermittedParams :priority_id, :remaining_hours, :responsible_id, + :sprint_id, :start_date, :status_id, :type_id, diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb index 4d07f79aeef..db3d8bebb39 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.html.erb @@ -33,9 +33,9 @@ See COPYRIGHT and LICENSE files for more details. id: Backlogs::NewSprintFormComponent::FORM_ID, model: @sprint, scope: :sprint, - method: :post, + method: http_verb, class: "op-sprints--form", - url: project_sprints_path(@sprint.project_id), + url: form_url, data: data_attributes ) do |f| flex_layout(mb: 2) do |flex| diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb b/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb index c4171ad193a..a66dd3998e8 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb @@ -45,6 +45,19 @@ module Backlogs private + def http_verb + @sprint.new_record? ? :post : :put + end + + def form_url + if @sprint.new_record? + project_sprints_path(@sprint.project_id) + else + # TODO: update path + "" + end + end + def data_attributes { controller: "refresh-on-form-changes", diff --git a/modules/backlogs/app/components/backlogs/sprint_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_component.html.erb new file mode 100644 index 00000000000..f1fd27e97a2 --- /dev/null +++ b/modules/backlogs/app/components/backlogs/sprint_component.html.erb @@ -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. + +++# %> + +<%= component_wrapper(tag: :section) do %> + <%= render(Primer::Beta::BorderBox.new(**@system_arguments)) do |border_box| %> + <% border_box.with_header do %> + <%= render(Backlogs::SprintHeaderComponent.new(sprint:, folded: folded?)) %> + <% end %> + <% if stories.empty? %> + <% border_box.with_row(data: { empty_list_item: true }) do %> + <%= + render Primer::Beta::Blankslate.new(role: "status", aria: { live: "polite" }) do |blankslate| + blankslate.with_heading(tag: :h4).with_content(t(".blankslate_title", name: sprint.name)) + blankslate.with_description_content(t(".blankslate_description")) + end + %> + <% end %> + <% end %> + <% stories.each do |story| %> + <% border_box.with_row( + id: dom_id(story), + classes: "Box-row--hover-blue Box-row--focus-gray Box-row--clickable Box-row--draggable", + data: draggable_item_config(story).merge( + story: true, + controller: "backlogs--story", + backlogs__story_id_value: story.id, + backlogs__story_split_url_value: details_backlogs_project_backlogs_path(project, story), + backlogs__story_full_url_value: work_package_path(story), + backlogs__story_selected_class: "Box-row--blue" + ), + tabindex: 0 + ) do %> + <%= render(Backlogs::StoryComponent.new(story:, sprint:, max_position:)) %> + <% end %> + <% end %> + <% end %> +<% end %> diff --git a/modules/backlogs/app/components/backlogs/sprint_component.rb b/modules/backlogs/app/components/backlogs/sprint_component.rb new file mode 100644 index 00000000000..2f251d23e8b --- /dev/null +++ b/modules/backlogs/app/components/backlogs/sprint_component.rb @@ -0,0 +1,92 @@ +# 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 + class SprintComponent < ApplicationComponent + include Primer::AttributesHelper + include OpTurbo::Streamable + include RbCommonHelper + + attr_reader :sprint, :current_user + + delegate :project, to: :sprint + + def initialize(sprint:, current_user: User.current, **system_arguments) + super() + + @sprint = sprint + @current_user = current_user + + @system_arguments = system_arguments + @system_arguments[:id] = dom_id(sprint) + @system_arguments[:list_id] = "#{@system_arguments[:id]}-list" + @system_arguments[:padding] = :condensed + @system_arguments[:data] = merge_data( + @system_arguments, + { data: drop_target_config } + ) + end + + def stories + @sprint.work_packages + end + + def wrapper_uniq_by + @sprint.id + end + + private + + def folded? + current_user.backlogs_preference(:versions_default_fold_state) == "closed" + end + + def max_position + stories.filter_map(&:position).max + end + + def drop_target_config + { + generic_drag_and_drop_target: "container", + target_container_accessor: ":scope > ul", + target_id: @sprint.id, + target_allowed_drag_type: "story" + } + end + + def draggable_item_config(story) + { + draggable_id: story.id, + draggable_type: "story", + drop_url: move_backlogs_project_sprint_story_path(project, sprint, story) + } + end + end +end diff --git a/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb new file mode 100644 index 00000000000..834246a6c5f --- /dev/null +++ b/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb @@ -0,0 +1,90 @@ +<%# -- 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. + +++# %> + +<%= component_wrapper(tag: :header) do %> + <% if show? %> + <%= grid_layout("op-backlogs-header", tag: :div) do |grid| %> + <% grid.with_area(:collapsible) do %> + <%= + render( + Backlogs::CollapsibleComponent.new( + collapsible_id: "#{dom_id(sprint)}-list", + toggle_label: t(".label_toggle_backlog", name: sprint.name), + collapsed: + ) + ) do |collapsible| + collapsible.with_title { sprint.name } + collapsible.with_count( + scheme: :default, + count: story_count, + round: true, + aria: { + label: t(".label_story_count", count: story_count), + live: "polite" + } + ) + collapsible.with_description(role: "group") do + format_date_range(date_range) + end + end + %> + <% end %> + + <% grid.with_area(:points) do %> + <%= + render( + Primer::Beta::Text.new( + color: :subtle, + classes: "velocity", + aria: { live: "polite" } + ) + ) do + %> + <%= story_points %> + <%= t(:"backlogs.points_label", count: story_points) %> + <% end %> + <% end %> + + <% grid.with_area(:menu) do %> + <%= render(Backlogs::SprintMenuComponent.new(sprint:, project:)) %> + <% end %> + <% end %> + <% else %> + <%= + primer_form_with( + url: backlogs_project_sprint_path(project, sprint), + model: sprint, + method: :patch, + class: "op-backlogs-header-form" + ) do |f| + render(Backlogs::BacklogHeaderForm.new(f, cancel_path: show_name_backlogs_project_sprint_path(project, sprint))) + end + %> + <% end %> +<% end %> diff --git a/modules/backlogs/app/components/backlogs/sprint_header_component.rb b/modules/backlogs/app/components/backlogs/sprint_header_component.rb new file mode 100644 index 00000000000..7f80ce5521d --- /dev/null +++ b/modules/backlogs/app/components/backlogs/sprint_header_component.rb @@ -0,0 +1,84 @@ +# 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 + class SprintHeaderComponent < ApplicationComponent + include OpPrimer::ComponentHelpers + include OpTurbo::Streamable + include Primer::FetchOrFallbackHelper + include Redmine::I18n + include RbCommonHelper + + STATE_DEFAULT = :show + STATE_OPTIONS = [STATE_DEFAULT, :edit].freeze + + attr_reader :sprint, :state, :collapsed, :current_user + + delegate :project, to: :sprint + delegate :name, to: :sprint, prefix: :sprint + delegate :edit?, :show?, to: :state + + def initialize( + sprint:, + state: STATE_DEFAULT, + folded: false, + current_user: User.current + ) + super() + + @sprint = sprint + @state = ActiveSupport::StringInquirer.new(fetch_or_fallback(STATE_OPTIONS, state, STATE_DEFAULT).to_s) + @collapsed = folded + @current_user = current_user + end + + def wrapper_uniq_by + sprint.id + end + + def stories + @sprint.work_packages + end + + private + + def story_points + @story_points ||= stories.sum { |story| story.story_points || 0 } + end + + def story_count + @story_count ||= stories.size + end + + def date_range + [sprint.start_date, sprint.finish_date] + end + end +end diff --git a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb new file mode 100644 index 00000000000..20956ae2d85 --- /dev/null +++ b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb @@ -0,0 +1,113 @@ +<%# -- 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::ActionMenu.new(anchor_align: :end, classes: "hide-when-print")) do |menu| + menu.with_show_button( + scheme: :invisible, + icon: :"kebab-horizontal", + "aria-label": t(".label_actions"), + tooltip_direction: :se + ) + + # TODO render sprint dialog in edit mode + if user_allowed?(:update_sprints) + menu.with_item( + label: t(".action_menu.edit_sprint"), + href: edit_dialog_project_sprint_path(project, sprint), + content_arguments: { data: { controller: "async-dialog" } } + ) do |item| + item.with_leading_visual_icon(icon: :pencil) + end + end + + if user_allowed?(:add_work_packages) + menu.with_item( + label: t(".action_menu.new_story"), + href: new_project_work_packages_dialog_path( + project, + sprint_id: sprint.id, + type_id: available_story_types.first + ), + content_arguments: { data: { turbo_stream: true } } + ) do |item| + item.with_leading_visual_icon(icon: :compose) + end + end + + if user_allowed?(:update_sprints) || user_allowed?(:add_work_packages) + menu.with_divider + end + + menu.with_item( + # TODO: sprint_id filter does not exist for work packages. Add? + scheme: :danger, + label: t(".action_menu.stories_tasks"), + tag: :a, + href: project_work_packages_path(project, sprint_id: sprint.id) + ) do |item| + item.with_leading_visual_icon(icon: :"op-view-list") + end + + if user_allowed?(:view_taskboards) + menu.with_item( + # TODO: what to do with the task board? + scheme: :danger, + label: t(".action_menu.task_board"), + tag: :a, + href: backlogs_project_sprint_taskboard_path(project, sprint) + ) do |item| + item.with_leading_visual_icon(icon: :"op-view-cards") + end + end + + menu.with_item( + # TODO: what to do with the burndown chart? + scheme: :danger, + label: t(".action_menu.burndown_chart"), + tag: :a, + href: backlogs_project_sprint_burndown_chart_path(project, sprint), + disabled: !sprint.has_burndown? + ) do |item| + item.with_leading_visual_icon(icon: :graph) + end + + if project.module_enabled? "wiki" + menu.with_item( + # TODO: will we keep the association between sprints and wiki pages? + scheme: :danger, + label: t(".action_menu.wiki"), + tag: :a, + href: edit_backlogs_project_sprint_wiki_path(project, sprint) + ) do |item| + item.with_leading_visual_icon(icon: :book) + end + end + end +%> diff --git a/modules/backlogs/app/components/backlogs/sprint_menu_component.rb b/modules/backlogs/app/components/backlogs/sprint_menu_component.rb new file mode 100644 index 00000000000..386b8c6e376 --- /dev/null +++ b/modules/backlogs/app/components/backlogs/sprint_menu_component.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 Backlogs + class SprintMenuComponent < ApplicationComponent + include RbCommonHelper + + attr_reader :sprint, :project, :current_user + + def initialize(sprint:, project:, current_user: User.current) + super() + + @sprint = sprint + @project = project + @current_user = current_user + end + + def stories + @sprint.work_packages + end + + private + + def user_allowed?(permission) + current_user.allowed_in_project?(permission, project) + end + + def available_story_types + @available_story_types ||= story_types & project.types + end + end +end diff --git a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb index dd6838e553b..ed71f696749 100644 --- a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb +++ b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb @@ -35,6 +35,8 @@ class RbMasterBacklogsController < RbApplicationController before_action :load_backlogs, only: :index + helper_method :scrum_projects_enabled? + def index if turbo_frame_request? render partial: "list", layout: false @@ -58,6 +60,15 @@ class RbMasterBacklogsController < RbApplicationController def load_backlogs @owner_backlogs = Backlog.owner_backlogs(@project) - @sprint_backlogs = Backlog.sprint_backlogs(@project) + + if scrum_projects_enabled? + @sprints = @project.sprints.open.order_by_date + else + @sprint_backlogs = Backlog.sprint_backlogs(@project) + end + end + + def scrum_projects_enabled? + OpenProject::FeatureDecisions.scrum_projects_active? end end diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index bd44fcf3f0d..6c0ee8aa90d 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -31,7 +31,7 @@ class RbSprintsController < RbApplicationController include OpTurbo::ComponentStream - NEW_SPRINT_ACTIONS = %i[new_dialog create refresh_form].freeze + NEW_SPRINT_ACTIONS = %i[new_dialog edit_dialog create refresh_form].freeze skip_before_action :load_sprint_and_project, only: NEW_SPRINT_ACTIONS @@ -49,6 +49,13 @@ class RbSprintsController < RbApplicationController respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: call.result) end + def edit_dialog + # TODO: visible-scope? + @sprint = Agile::Sprint.find(params[:id]) + + respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint) + end + def refresh_form call = Sprints::SetAttributesService.new( user: current_user, @@ -75,6 +82,11 @@ class RbSprintsController < RbApplicationController respond_with_turbo_streams end + # Called like this due to `update` being taken by legacy sprints. + def update_agile_sprint + # TODO: implement + end + def edit_name update_header_component_via_turbo_stream(state: :edit) respond_with_turbo_streams diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 788534c4062..5ca8c0c33f8 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -39,6 +39,10 @@ module Agile has_many :work_packages, dependent: :nullify scope :for_project, ->(project) { where(project:) } + scope :open, -> { !completed } + scope :order_by_date, -> do + reorder(Arel.sql("start_date ASC NULLS LAST, finish_date ASC NULLS LAST")) + end enum :status, { @@ -82,6 +86,8 @@ module Agile Day.working.from_range(from: start_date, to: finish_date).count end + def has_burndown? = false + private # TODO: consider moving this validation to the database level to ensure data integrity. diff --git a/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb b/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb index 636b3d4b36f..7dca3d004af 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb @@ -1,5 +1,5 @@ - <% if @owner_backlogs.empty? && @sprint_backlogs.empty? %> + <% if @owner_backlogs.empty? && @sprint_backlogs.empty? # TODO: add feature flag condition here? %> <%= render(Primer::Beta::Blankslate.new(border: true, spacious: true)) do |blankslate| blankslate.with_visual_icon(icon: :versions) @@ -13,7 +13,11 @@ <% else %>
- <%= render(Backlogs::BacklogComponent.with_collection(@sprint_backlogs, project: @project)) %> + <% if scrum_projects_enabled? %> + <%= render(Backlogs::SprintComponent.with_collection(@sprints, project: @project)) %> + <% else %> + <%= render(Backlogs::BacklogComponent.with_collection(@sprint_backlogs, project: @project)) %> + <% end %>
<%= render(Backlogs::BacklogComponent.with_collection(@owner_backlogs, project: @project)) %> diff --git a/modules/backlogs/config/routes.rb b/modules/backlogs/config/routes.rb index bc6aab34b71..25c9eb65019 100644 --- a/modules/backlogs/config/routes.rb +++ b/modules/backlogs/config/routes.rb @@ -30,11 +30,15 @@ Rails.application.routes.draw do # Routes for the new Agile::Sprint # Scoped under projects for permissions: resources :projects, only: [] do - resources :sprints, controller: :rb_sprints, only: %i[] do + resources :sprints, controller: :rb_sprints, only: %i[create] do collection do get :new_dialog get :refresh_form - post :create + end + + member do + get :edit_dialog + put :update_agile_sprint end end end From f7a86fc44d1d32627c1a40cedec7bbeeea2d6398 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 2 Mar 2026 10:21:45 +0100 Subject: [PATCH 183/334] [#71250] Copy list partial --- .../rb_master_backlogs_controller.rb | 12 ++--- .../backlogs/app/helpers/rb_common_helper.rb | 6 ++- .../rb_master_backlogs/_agile_list.html.erb | 52 +++++++++++++++++++ .../views/rb_master_backlogs/_list.html.erb | 37 ++++++++++--- 4 files changed, 93 insertions(+), 14 deletions(-) create mode 100644 modules/backlogs/app/views/rb_master_backlogs/_agile_list.html.erb diff --git a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb index ed71f696749..caf9c7714dc 100644 --- a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb +++ b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb @@ -35,11 +35,13 @@ class RbMasterBacklogsController < RbApplicationController before_action :load_backlogs, only: :index - helper_method :scrum_projects_enabled? - def index if turbo_frame_request? - render partial: "list", layout: false + if scrum_projects_enabled? + render partial: "agile_list", layout: false + else + render partial: "list", layout: false + end else render :index end @@ -67,8 +69,4 @@ class RbMasterBacklogsController < RbApplicationController @sprint_backlogs = Backlog.sprint_backlogs(@project) end end - - def scrum_projects_enabled? - OpenProject::FeatureDecisions.scrum_projects_active? - end end diff --git a/modules/backlogs/app/helpers/rb_common_helper.rb b/modules/backlogs/app/helpers/rb_common_helper.rb index 0d34f47fd53..6a18216a1ed 100644 --- a/modules/backlogs/app/helpers/rb_common_helper.rb +++ b/modules/backlogs/app/helpers/rb_common_helper.rb @@ -132,8 +132,12 @@ module RbCommonHelper item.remaining_hours.blank? || item.remaining_hours == 0 ? "" : item.remaining_hours end + def scrum_projects_enabled? + OpenProject::FeatureDecisions.scrum_projects_active? + end + def allow_sprint_creation?(project) - OpenProject::FeatureDecisions.scrum_projects_active? && User.current.allowed_in_project?(:create_sprints, project) + scrum_projects_enabled? && User.current.allowed_in_project?(:create_sprints, project) end private diff --git a/modules/backlogs/app/views/rb_master_backlogs/_agile_list.html.erb b/modules/backlogs/app/views/rb_master_backlogs/_agile_list.html.erb new file mode 100644 index 00000000000..4e83ad1090a --- /dev/null +++ b/modules/backlogs/app/views/rb_master_backlogs/_agile_list.html.erb @@ -0,0 +1,52 @@ +<%# -- 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. + +++# %> + + + <% if @owner_backlogs.empty? && @sprints.empty? %> + <%= + render(Primer::Beta::Blankslate.new(border: true, spacious: true)) do |blankslate| + blankslate.with_visual_icon(icon: :versions) + blankslate.with_heading(tag: :h2).with_content(t(:backlogs_empty_title)) + + if current_user.allowed_in_project?(:manage_versions, @project) + blankslate.with_description_content(t(:backlogs_empty_action_text)) + end + end + %> + <% else %> +
+
+ <%= render(Backlogs::SprintComponent.with_collection(@sprints, project: @project)) %> +
+
+ <%= render(Backlogs::BacklogComponent.with_collection(@owner_backlogs, project: @project)) %> +
+
+ <% end %> +
diff --git a/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb b/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb index 7dca3d004af..8a76655c9e4 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb @@ -1,5 +1,34 @@ +<%# -- 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. + +++# %> + - <% if @owner_backlogs.empty? && @sprint_backlogs.empty? # TODO: add feature flag condition here? %> + <% if @owner_backlogs.empty? && @sprint_backlogs.empty? %> <%= render(Primer::Beta::Blankslate.new(border: true, spacious: true)) do |blankslate| blankslate.with_visual_icon(icon: :versions) @@ -13,11 +42,7 @@ <% else %>
- <% if scrum_projects_enabled? %> - <%= render(Backlogs::SprintComponent.with_collection(@sprints, project: @project)) %> - <% else %> - <%= render(Backlogs::BacklogComponent.with_collection(@sprint_backlogs, project: @project)) %> - <% end %> + <%= render(Backlogs::BacklogComponent.with_collection(@sprint_backlogs, project: @project)) %>
<%= render(Backlogs::BacklogComponent.with_collection(@owner_backlogs, project: @project)) %> From 8db1f736f096b60dade5109bf62b8c8be4b323a0 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 2 Mar 2026 10:33:16 +0100 Subject: [PATCH 184/334] [#71250] Copy index view --- .../rb_master_backlogs_controller.rb | 16 +++- .../rb_master_backlogs/agile_index.html.erb | 95 +++++++++++++++++++ 2 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb diff --git a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb index caf9c7714dc..bfaa29b6673 100644 --- a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb +++ b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb @@ -36,14 +36,20 @@ class RbMasterBacklogsController < RbApplicationController before_action :load_backlogs, only: :index def index - if turbo_frame_request? - if scrum_projects_enabled? + if OpenProject::FeatureDecisions.scrum_projects_active? + # Feature flag is active, render the new views + if turbo_frame_request? render partial: "agile_list", layout: false else - render partial: "list", layout: false + render :agile_index end else - render :index + # Feature flag is not active, render legacy views + if turbo_frame_request? # rubocop:disable Style/IfInsideElse + render partial: "list", layout: false + else + render :index + end end end @@ -63,7 +69,7 @@ class RbMasterBacklogsController < RbApplicationController def load_backlogs @owner_backlogs = Backlog.owner_backlogs(@project) - if scrum_projects_enabled? + if OpenProject::FeatureDecisions.scrum_projects_active? @sprints = @project.sprints.open.order_by_date else @sprint_backlogs = Backlog.sprint_backlogs(@project) diff --git a/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb new file mode 100644 index 00000000000..16194aa9c77 --- /dev/null +++ b/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb @@ -0,0 +1,95 @@ +<%#-- 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_backlogs) %> + +<% content_controller "backlogs", + "backlogs-list-url-value": backlogs_project_backlogs_path(@project), + "backlogs-backlogs--story-outlet": "li[data-story]" %> + +<% content_for :content_header do %> + <%= + render Primer::OpenProject::PageHeader.new do |header| + header.with_title { t(:label_backlogs) } + header.with_breadcrumbs( + [{ href: project_overview_path(@project), text: @project.name }, + t(:label_backlogs)] + ) + end + %> + + <%= + render(Primer::OpenProject::SubHeader.new) do |subheader| + if allow_sprint_creation?(@project) + # Scrum sprints are available, show an action menu to create Sprints and Versions + subheader.with_action_menu( + leading_icon: :plus, + trailing_icon: :"triangle-down", + label: t(:button_create), + button_arguments: { scheme: :primary } + ) do |menu| + menu.with_item( + label: Version.human_model_name, + href: new_project_version_path(@project) + ) + + menu.with_item( + label: Agile::Sprint.human_model_name, + href: new_dialog_project_sprints_path(@project), + content_arguments: { + data: { + controller: "async-dialog", + test_selector: "op-sprints--new-sprint-button" + } + } + ) + end + else + # No scrum sprints, we only show a "+ Version" button + subheader.with_action_button( + scheme: :primary, + leading_icon: :plus, + label: I18n.t(:label_version_new), + tag: :a, + href: new_project_version_path(@project) + ) do + Version.human_model_name + end + end + end + %> +<% end %> + +<% content_for :content_body do %> + <%= render partial: "agile_list" %> +<% end %> + +<% content_for :content_body_right do %> + <%= render(split_view_instance) if render_work_package_split_view? %> +<% end %> From 84a7df99ba82e6a60b0d07f0a5fae66edfbc86f0 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Tue, 3 Mar 2026 14:31:02 +0100 Subject: [PATCH 185/334] [#71250] Edit sprint via dialog --- .../new_sprint_dialog_component.html.erb | 4 +- .../backlogs/new_sprint_dialog_component.rb | 17 ++++++- .../backlogs/new_sprint_form_component.rb | 3 +- .../backlogs/sprint_menu_component.html.erb | 1 - .../app/contracts/sprints/update_contract.rb | 45 +++++++++++++++++++ .../app/controllers/rb_sprints_controller.rb | 42 +++++++++++++++-- .../forms/backlogs/sprints/details_form.rb | 2 + .../app/services/sprints/update_service.rb | 35 +++++++++++++++ modules/backlogs/config/locales/en.yml | 1 + .../lib/open_project/backlogs/engine.rb | 2 +- 10 files changed, 141 insertions(+), 11 deletions(-) create mode 100644 modules/backlogs/app/contracts/sprints/update_contract.rb create mode 100644 modules/backlogs/app/services/sprints/update_service.rb diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb index e98032f0613..b56a66a937a 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.html.erb @@ -30,7 +30,7 @@ See COPYRIGHT and LICENSE files for more details. <%= render( Primer::Alpha::Dialog.new( - title: t(:label_sprint_new), + title:, size: :large, id: DIALOG_ID ) @@ -61,7 +61,7 @@ See COPYRIGHT and LICENSE files for more details. type: :submit ) ) do - t("button_create") + button_caption end end end diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb index e8e8d1456db..1ad652b178c 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb @@ -37,10 +37,25 @@ module Backlogs FORM_ID = "new-sprint-dialog-form" FOOTER_ID = "new-sprint-dialog-footer" - def initialize(sprint:) + def initialize(sprint:, state: :create) super @sprint = sprint + @state = state + end + + private + + def state_create? = @state == :create + + def state_edit? = @state == :edit + + def title + state_create? ? t(:label_sprint_new) : t(:label_sprint_edit) + end + + def button_caption + state_create? ? t(:button_create) : t(:button_save) end end end diff --git a/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb b/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb index a66dd3998e8..1b8532e6add 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb +++ b/modules/backlogs/app/components/backlogs/new_sprint_form_component.rb @@ -53,8 +53,7 @@ module Backlogs if @sprint.new_record? project_sprints_path(@sprint.project_id) else - # TODO: update path - "" + update_agile_sprint_project_sprint_path(@sprint.project_id, @sprint.id) end end diff --git a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb index 20956ae2d85..80746ff375e 100644 --- a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb @@ -36,7 +36,6 @@ See COPYRIGHT and LICENSE files for more details. tooltip_direction: :se ) - # TODO render sprint dialog in edit mode if user_allowed?(:update_sprints) menu.with_item( label: t(".action_menu.edit_sprint"), diff --git a/modules/backlogs/app/contracts/sprints/update_contract.rb b/modules/backlogs/app/contracts/sprints/update_contract.rb new file mode 100644 index 00000000000..7e0f9ff8321 --- /dev/null +++ b/modules/backlogs/app/contracts/sprints/update_contract.rb @@ -0,0 +1,45 @@ +# 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 Sprints + class UpdateContract < BaseContract + validate :user_allowed_to_update + + private + + def user_allowed_to_update + return if model.project.nil? + + unless user.allowed_in_project?(:update_sprints, model.project) + errors.add :base, :error_unauthorized + end + end + end +end diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index 6c0ee8aa90d..a333871929d 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -31,7 +31,11 @@ class RbSprintsController < RbApplicationController include OpTurbo::ComponentStream - NEW_SPRINT_ACTIONS = %i[new_dialog edit_dialog create refresh_form].freeze + NEW_SPRINT_ACTIONS = %i[new_dialog + edit_dialog + create + refresh_form + update_agile_sprint].freeze skip_before_action :load_sprint_and_project, only: NEW_SPRINT_ACTIONS @@ -53,13 +57,16 @@ class RbSprintsController < RbApplicationController # TODO: visible-scope? @sprint = Agile::Sprint.find(params[:id]) - respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint) + respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint, state: :edit) end def refresh_form + id = edit_agile_sprint_params[:sprint][:id] + sprint = id.present? ? Agile::Sprint.find(id) : Agile::Sprint.new + call = Sprints::SetAttributesService.new( user: current_user, - model: Agile::Sprint.new, + model: sprint, contract_class: EmptyContract ).call(attributes: converted_agile_sprint_params) @@ -84,7 +91,21 @@ class RbSprintsController < RbApplicationController # Called like this due to `update` being taken by legacy sprints. def update_agile_sprint - # TODO: implement + # TODO: visible-scope? + @sprint = Agile::Sprint.find(params[:id]) + + call = Sprints::UpdateService + .new(user: current_user, model: @sprint) + .call(attributes: agile_sprint_params[:sprint]) + + if call.success? + render_success_flash_message_via_turbo_stream(message: I18n.t(:notice_successful_update)) + update_sprint_header_component_via_turbo_stream(sprint: call.result, state: :show) + else + update_new_sprint_form_component_via_turbo_stream(sprint: call.result, base_errors: call.errors[:base]) + end + + respond_with_turbo_streams end def edit_name @@ -133,6 +154,15 @@ class RbSprintsController < RbApplicationController ) end + def update_sprint_header_component_via_turbo_stream(sprint:, state: :show) + update_via_turbo_stream( + component: Backlogs::SprintHeaderComponent.new( + sprint:, + state: + ) + ) + end + def update_new_sprint_form_component_via_turbo_stream(sprint:, base_errors: nil) update_via_turbo_stream( component: Backlogs::NewSprintFormComponent.new( @@ -161,6 +191,10 @@ class RbSprintsController < RbApplicationController params.permit(sprint: %i[name start_date finish_date]) end + def edit_agile_sprint_params + params.permit(sprint: %i[id name start_date finish_date]) + end + def converted_agile_sprint_params # Do some preprocessing to make the params easier to use converted_sprint_params = agile_sprint_params[:sprint].to_h diff --git a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb index 9830e375582..d49b9ccc3c2 100644 --- a/modules/backlogs/app/forms/backlogs/sprints/details_form.rb +++ b/modules/backlogs/app/forms/backlogs/sprints/details_form.rb @@ -32,6 +32,8 @@ module Backlogs module Sprints class DetailsForm < ApplicationForm form do |f| + f.hidden(name: :id) + f.text_field( label: attribute_name(:name), name: :name, diff --git a/modules/backlogs/app/services/sprints/update_service.rb b/modules/backlogs/app/services/sprints/update_service.rb new file mode 100644 index 00000000000..d6f618cc6e1 --- /dev/null +++ b/modules/backlogs/app/services/sprints/update_service.rb @@ -0,0 +1,35 @@ +# 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. +#++ + +class Sprints::UpdateService < BaseServices::Update + def instance_class + Agile::Sprint + end +end diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index 0ed1b8c5043..28ed181cbd3 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -151,6 +151,7 @@ en: label_column_in_backlog: "Column in backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index f20567b2f0c..f259da89eeb 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -86,7 +86,7 @@ module OpenProject::Backlogs require: :member permission :create_sprints, - { rb_sprints: %i[new_dialog refresh_form create edit_name update], + { rb_sprints: %i[new_dialog refresh_form create edit_name update edit_dialog update_agile_sprint], rb_wikis: %i[edit update] }, permissible_on: :project, require: :member, From 1fac61444ca852c825755bf7217dcb272a9a3694 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 4 Mar 2026 10:56:27 +0100 Subject: [PATCH 186/334] [#71250] Refresh page after sprint creation --- .../app/controllers/rb_sprints_controller.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index a333871929d..60f670de24d 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -82,6 +82,7 @@ class RbSprintsController < RbApplicationController if call.success? render_success_flash_message_via_turbo_stream(message: I18n.t(:notice_successful_create)) + replace_backlogs_container_via_turbo_stream else update_new_sprint_form_component_via_turbo_stream(sprint: call.result, base_errors: call.errors[:base]) end @@ -173,6 +174,18 @@ class RbSprintsController < RbApplicationController ) end + # This is usually done by the RbMasterBacklogsController, it feels wrong to have this here + def replace_backlogs_container_via_turbo_stream + @owner_backlogs = Backlog.owner_backlogs(@project) + @sprints = @project.sprints.open.order_by_date + + turbo_streams << OpTurbo::StreamComponent.new( + action: :replace, + target: "backlogs_container", + template: render_to_string(partial: "rb_master_backlogs/agile_list", layout: false) + ).render_in(view_context) + end + # Overrides load_sprint_and_project to load the sprint from :id instead of :sprint_id def load_sprint_and_project @sprint = Sprint.visible.find(params[:id]) From 36019bc80808ec6be68a2608f15d7c29c9785dd3 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 4 Mar 2026 12:42:36 +0100 Subject: [PATCH 187/334] [#71250] Fix merge conflict leftovers in copied views --- .../backlogs/sprint_menu_component.html.erb | 22 +++++++++---------- .../app/contracts/sprints/update_contract.rb | 2 +- .../rb_sprints_controller_permissions_spec.rb | 4 ++-- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb index 80746ff375e..6c2ef6862f3 100644 --- a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb @@ -36,7 +36,7 @@ See COPYRIGHT and LICENSE files for more details. tooltip_direction: :se ) - if user_allowed?(:update_sprints) + if user_allowed?(:create_sprints) menu.with_item( label: t(".action_menu.edit_sprint"), href: edit_dialog_project_sprint_path(project, sprint), @@ -60,7 +60,7 @@ See COPYRIGHT and LICENSE files for more details. end end - if user_allowed?(:update_sprints) || user_allowed?(:add_work_packages) + if user_allowed?(:create_sprints) || user_allowed?(:add_work_packages) menu.with_divider end @@ -74,16 +74,14 @@ See COPYRIGHT and LICENSE files for more details. item.with_leading_visual_icon(icon: :"op-view-list") end - if user_allowed?(:view_taskboards) - menu.with_item( - # TODO: what to do with the task board? - scheme: :danger, - label: t(".action_menu.task_board"), - tag: :a, - href: backlogs_project_sprint_taskboard_path(project, sprint) - ) do |item| - item.with_leading_visual_icon(icon: :"op-view-cards") - end + menu.with_item( + # TODO: what to do with the task board? + scheme: :danger, + label: t(".action_menu.task_board"), + tag: :a, + href: backlogs_project_sprint_taskboard_path(project, sprint) + ) do |item| + item.with_leading_visual_icon(icon: :"op-view-cards") end menu.with_item( diff --git a/modules/backlogs/app/contracts/sprints/update_contract.rb b/modules/backlogs/app/contracts/sprints/update_contract.rb index 7e0f9ff8321..e2f922d79a9 100644 --- a/modules/backlogs/app/contracts/sprints/update_contract.rb +++ b/modules/backlogs/app/contracts/sprints/update_contract.rb @@ -37,7 +37,7 @@ module Sprints def user_allowed_to_update return if model.project.nil? - unless user.allowed_in_project?(:update_sprints, model.project) + unless user.allowed_in_project?(:create_sprints, model.project) errors.add :base, :error_unauthorized end end diff --git a/modules/backlogs/spec/controllers/rb_sprints_controller_permissions_spec.rb b/modules/backlogs/spec/controllers/rb_sprints_controller_permissions_spec.rb index e0a372b0f3c..d415deb0221 100644 --- a/modules/backlogs/spec/controllers/rb_sprints_controller_permissions_spec.rb +++ b/modules/backlogs/spec/controllers/rb_sprints_controller_permissions_spec.rb @@ -39,7 +39,7 @@ RSpec.describe RbSprintsController, "permissions" do create(:project, enabled_module_names: %w[work_package_tracking backlogs]).tap do |p| create(:member, user: current_user, - roles: [create(:project_role, permissions: [:update_sprints])], + roles: [create(:project_role, permissions: [:create_sprints])], project: p) end end @@ -80,7 +80,7 @@ RSpec.describe RbSprintsController, "permissions" do before do create(:member, user: current_user, - roles: [create(:project_role, permissions: %i[view_work_packages view_versions update_sprints])], + roles: [create(:project_role, permissions: %i[view_work_packages view_versions create_sprints])], project: sprint_project) end From 230943ebe9a6311bacc8d36381f8b596bc0c543b Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 4 Mar 2026 13:11:50 +0100 Subject: [PATCH 188/334] [#71250] Redirect after sprint creation instead of morphing Since the target turbo frame and view reside in a different controller, it should not be updated here. Instead, we redirect to keep the coupling between both controllers a bit looser. --- .../app/controllers/rb_sprints_controller.rb | 19 +++---------------- .../controllers/rb_sprints_controller_spec.rb | 8 +++++--- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index 60f670de24d..58b50b6fcb5 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -81,13 +81,12 @@ class RbSprintsController < RbApplicationController .call(attributes: converted_agile_sprint_params) if call.success? - render_success_flash_message_via_turbo_stream(message: I18n.t(:notice_successful_create)) - replace_backlogs_container_via_turbo_stream + flash[:notice] = I18n.t(:notice_successful_create) + render turbo_stream: turbo_stream.redirect_to(backlogs_project_backlogs_path(@project)) else update_new_sprint_form_component_via_turbo_stream(sprint: call.result, base_errors: call.errors[:base]) + respond_with_turbo_streams end - - respond_with_turbo_streams end # Called like this due to `update` being taken by legacy sprints. @@ -174,18 +173,6 @@ class RbSprintsController < RbApplicationController ) end - # This is usually done by the RbMasterBacklogsController, it feels wrong to have this here - def replace_backlogs_container_via_turbo_stream - @owner_backlogs = Backlog.owner_backlogs(@project) - @sprints = @project.sprints.open.order_by_date - - turbo_streams << OpTurbo::StreamComponent.new( - action: :replace, - target: "backlogs_container", - template: render_to_string(partial: "rb_master_backlogs/agile_list", layout: false) - ).render_in(view_context) - end - # Overrides load_sprint_and_project to load the sprint from :id instead of :sprint_id def load_sprint_and_project @sprint = Sprint.visible.find(params[:id]) diff --git a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb index cf28fac7e7a..ea48d189e48 100644 --- a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb @@ -102,14 +102,16 @@ RSpec.describe RbSprintsController do } end - it "responds with success and creates a sprint", :aggregate_failures do + it "responds with success, creates a sprint, and redirects to backlogs", :aggregate_failures do post :create, format: :turbo_stream, params: params expect(response).to be_successful expect(response).to have_http_status :ok - expect(response).to have_turbo_stream action: "flash" - # See feature spec for detailed expectations on the created sprint and rendered components + expect(response.body).to include("turbo-stream") + expect(response.body).to include("action=\"redirect_to\"") + expect(response.body).to include(backlogs_project_backlogs_path(project)) expect(project.reload.sprints.last.name).to eq("My Sprint") + expect(flash[:notice]).to eq(I18n.t(:notice_successful_create)) end context "without the 'create_sprints' permission" do From 444dd2f31b6e601063f5e4de1821f72a09585ea5 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 4 Mar 2026 16:17:10 +0100 Subject: [PATCH 189/334] [#71250] Remove menu entry for wiki --- .../backlogs/sprint_menu_component.html.erb | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb index 6c2ef6862f3..c3784b8b416 100644 --- a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb @@ -94,17 +94,5 @@ See COPYRIGHT and LICENSE files for more details. ) do |item| item.with_leading_visual_icon(icon: :graph) end - - if project.module_enabled? "wiki" - menu.with_item( - # TODO: will we keep the association between sprints and wiki pages? - scheme: :danger, - label: t(".action_menu.wiki"), - tag: :a, - href: edit_backlogs_project_sprint_wiki_path(project, sprint) - ) do |item| - item.with_leading_visual_icon(icon: :book) - end - end end %> From 890e021b47e33b6258336c1c6d12b03ec2d2ef4f Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 4 Mar 2026 17:01:49 +0100 Subject: [PATCH 190/334] [#71250] Provide localization for copied components --- modules/backlogs/config/locales/en.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index 28ed181cbd3..ff60e9f7cb3 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -98,6 +98,10 @@ en: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." + backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: @@ -105,6 +109,13 @@ en: one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" + backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -116,6 +127,15 @@ en: wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" + story_component: label_drag_story: "Move %{name}" From a6e5f5bde12a93e3c8aea01ad8e6018c4448f11a Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 4 Mar 2026 18:37:49 +0100 Subject: [PATCH 191/334] [#71250] Controller specs for the new actions --- .../controllers/rb_sprints_controller_spec.rb | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb index ea48d189e48..1f65f3c2b8a 100644 --- a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb @@ -84,6 +84,42 @@ RSpec.describe RbSprintsController do end end + describe "GET #edit_dialog" do + let!(:sprint) { create(:agile_sprint, project:) } + + context "with the feature flag inactive" do + it "responds with forbidden" do + get :edit_dialog, params: { project_id: project.id, id: sprint.id }, format: :turbo_stream + + expect(response).not_to be_successful + expect(response).to have_http_status :forbidden + end + end + + context "with the feature flag active", with_flag: { scrum_projects: true } do + it "responds with success", :aggregate_failures do + get :edit_dialog, params: { project_id: project.id, id: sprint.id }, format: :turbo_stream + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response).to have_turbo_stream action: "dialog", target: "backlogs-new-sprint-dialog-component" + expect(assigns(:project)).to eq(project) + expect(assigns(:sprint)).to eq(sprint) + end + + context "without the 'create_sprints' permission" do + let(:permissions) { all_permissions - [:create_sprints] } + + it "responds with forbidden", :aggregate_failures do + get :edit_dialog, params: { project_id: project.id, id: sprint.id }, format: :turbo_stream + + expect(response).not_to be_successful + expect(response).to have_http_status :forbidden + end + end + end + end + describe "POST #create" do context "with the feature flag inactive" do it "responds with forbidden" do @@ -127,6 +163,49 @@ RSpec.describe RbSprintsController do end end + describe "PUT #update_agile_sprint" do + let!(:sprint) { create(:agile_sprint, name: "Original sprint name", project:) } + + context "with the feature flag inactive" do + it "responds with forbidden" do + put :update_agile_sprint, params: { id: sprint.id, project_id: project.id }, format: :turbo_stream + + expect(response).not_to be_successful + expect(response).to have_http_status :forbidden + end + end + + context "with the feature flag active", with_flag: { scrum_projects: true } do + let(:params) do + { + id: sprint.id, + project_id: project.id, + sprint: { name: "Changed sprint name" } + } + end + + it "responds with success", :aggregate_failures do + put :update_agile_sprint, format: :turbo_stream, params: params + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response.body).to have_turbo_stream action: "flash" + expect(sprint.reload.name).to eq("Changed sprint name") + end + + context "without the 'create_sprints' permission" do + let(:permissions) { all_permissions - [:create_sprints] } + + it "responds with forbidden", :aggregate_failures do + put :update_agile_sprint, format: :turbo_stream, params: params + + expect(response).not_to be_successful + expect(response).to have_http_status :forbidden + end + end + end + end + describe "GET #refresh_form" do context "with the feature flag inactive" do it "responds with forbidden" do @@ -151,6 +230,7 @@ RSpec.describe RbSprintsController do expect(response).to be_successful expect(response).to have_http_status :ok expect(response).to have_turbo_stream action: "update", target: "backlogs-new-sprint-form-component" + expect(assigns(:sprint)).to be_nil end context "without the 'create_sprints' permission" do @@ -163,6 +243,24 @@ RSpec.describe RbSprintsController do expect(response).to have_http_status :forbidden end end + + context "when refreshing the form in edit mode by passing a sprint id" do + let!(:sprint) { create(:agile_sprint, project:) } + let(:params) do + { + project_id: project.id, + sprint: { id: sprint.id, name: "My Sprint", start_date: "2025-10-05", finish_date: "2025-10-15" } + } + end + + it "responds with success", :aggregate_failures do + get :refresh_form, format: :turbo_stream, params: params + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response).to have_turbo_stream action: "update", target: "backlogs-new-sprint-form-component" + end + end end end end From abd1b8347e45e2c39303dd0b3a95c60665c109bd Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 4 Mar 2026 18:58:53 +0100 Subject: [PATCH 192/334] [#71250] Test if created sprint is rendered --- .../spec/features/sprints/create_spec.rb | 39 +++++++++++++------ .../backlogs/spec/support/pages/backlogs.rb | 14 +++++++ 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/modules/backlogs/spec/features/sprints/create_spec.rb b/modules/backlogs/spec/features/sprints/create_spec.rb index 3b060defa45..cdde3cf69ff 100644 --- a/modules/backlogs/spec/features/sprints/create_spec.rb +++ b/modules/backlogs/spec/features/sprints/create_spec.rb @@ -40,6 +40,14 @@ RSpec.describe "Create", :js do end let(:backlogs_page) { Pages::Backlogs.new(project) } + let!(:initial_sprint) do + create(:agile_sprint, + project:, + name: "Initial sprint", + start_date: Date.new(2025, 9, 5), + finish_date: Date.new(2025, 9, 15)) + end + let(:story_type) do create(:type_feature) end @@ -77,34 +85,37 @@ RSpec.describe "Create", :js do context "with the feature flag active", with_flag: { scrum_projects: true } do context "with the 'create_sprints' permissions" do - before do - click_on "Create" - new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") - new_sprint_button&.click - end - let(:start_date) { Date.new(2025, 10, 5) } let(:start_date_fmt) { start_date.strftime("%Y-%m-%d") } let(:finish_date) { Date.new(2025, 10, 20) } let(:finish_date_fmt) { finish_date.strftime("%Y-%m-%d") } it "allows creating a new sprint" do + backlogs_page.expect_sprint_names_in_order(initial_sprint.name) + + backlogs_page.open_create_sprint_dialog + within_dialog "New sprint" do - page.fill_in "Sprint name", with: "My first sprint" + page.fill_in "Sprint name", with: "Created sprint" page.fill_in "Start date", with: start_date_fmt page.fill_in "Finish date", with: finish_date_fmt click_on "Create" end + wait_for_reload + backlogs_page.expect_sprint_names_in_order(initial_sprint.name, "Created sprint") + sprint = project.reload.sprints.last expect(sprint).to be_present - expect(sprint.name).to eq "My first sprint" + expect(sprint.name).to eq "Created sprint" expect(sprint.start_date).to eq start_date expect(sprint.finish_date).to eq finish_date end it "previews the sprint duration when changing the dates" do + backlogs_page.open_create_sprint_dialog + within_dialog "New sprint" do expect(page).to have_field "Duration", with: "", readonly: true @@ -119,6 +130,8 @@ RSpec.describe "Create", :js do let(:too_early_finish_date) { start_date - 1.day } it "validates required fields are present" do + backlogs_page.open_create_sprint_dialog + within_dialog "New sprint" do page.fill_in "Sprint name", with: "" @@ -131,6 +144,8 @@ RSpec.describe "Create", :js do end it "validates finish date is not before start date" do + backlogs_page.open_create_sprint_dialog + within_dialog "New sprint" do page.fill_in "Start date", with: start_date_fmt page.fill_in "Finish date", with: too_early_finish_date.strftime("%Y-%m-%d") @@ -147,7 +162,11 @@ RSpec.describe "Create", :js do end describe "proposed sprint names" do + let!(:initial_sprint) { nil } # override so that initial sprint is not present + it "prefilled with 'Sprint 1' if there are no previous sprints" do + backlogs_page.open_create_sprint_dialog + within_dialog "New sprint" do expect(page).to have_field "Sprint name *", with: "Sprint 1", required: true, focused: true end @@ -158,9 +177,7 @@ RSpec.describe "Create", :js do create(:agile_sprint, name: "Be ambitious 42", project:) backlogs_page.visit! - click_on "Create" - new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") - new_sprint_button.click + backlogs_page.open_create_sprint_dialog end it "offers the next sprint name with a number increment" do diff --git a/modules/backlogs/spec/support/pages/backlogs.rb b/modules/backlogs/spec/support/pages/backlogs.rb index a269ba432d4..b90598d44b7 100644 --- a/modules/backlogs/spec/support/pages/backlogs.rb +++ b/modules/backlogs/spec/support/pages/backlogs.rb @@ -119,6 +119,14 @@ module Pages end end + def sprint_names_in_order + page.find_all("#sprint_backlogs_container > section .op-backlogs-collapsible--title").map(&:text) + end + + def expect_sprint_names_in_order(*sprint_names) + expect(sprint_names_in_order).to match_array(sprint_names) + end + def expect_sprint(sprint) expect(page) .to have_css("#sprint_backlogs_container #{backlog_selector(sprint)}") @@ -196,6 +204,12 @@ module Pages yield details_view end + def open_create_sprint_dialog + click_on "Create" + new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") + new_sprint_button&.click + end + private def within_story(story, &) From 097a056ae4a294566d81709c7a82317086e5f3bc Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 5 Mar 2026 11:48:14 +0100 Subject: [PATCH 193/334] [#71250] Resolve name conflict in Sprint scope --- .../backlogs/app/controllers/rb_master_backlogs_controller.rb | 2 +- modules/backlogs/app/models/agile/sprint.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb index bfaa29b6673..dbb046039d4 100644 --- a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb +++ b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb @@ -70,7 +70,7 @@ class RbMasterBacklogsController < RbApplicationController @owner_backlogs = Backlog.owner_backlogs(@project) if OpenProject::FeatureDecisions.scrum_projects_active? - @sprints = @project.sprints.open.order_by_date + @sprints = @project.sprints.not_completed.order_by_date else @sprint_backlogs = Backlog.sprint_backlogs(@project) end diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 5ca8c0c33f8..61a672752d6 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -39,7 +39,7 @@ module Agile has_many :work_packages, dependent: :nullify scope :for_project, ->(project) { where(project:) } - scope :open, -> { !completed } + scope :not_completed, -> { !completed } scope :order_by_date, -> do reorder(Arel.sql("start_date ASC NULLS LAST, finish_date ASC NULLS LAST")) end From 39ed4853b05a8a05d9a0e73b5a40927c0fe06924 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 5 Mar 2026 15:46:33 +0100 Subject: [PATCH 194/334] [#71250] Add specs for editing sprints and adding work packages --- .../spec/features/sprints/edit_spec.rb | 196 ++++++++++++++++++ .../backlogs/spec/support/pages/backlogs.rb | 60 +++++- 2 files changed, 250 insertions(+), 6 deletions(-) create mode 100644 modules/backlogs/spec/features/sprints/edit_spec.rb diff --git a/modules/backlogs/spec/features/sprints/edit_spec.rb b/modules/backlogs/spec/features/sprints/edit_spec.rb new file mode 100644 index 00000000000..c4e78b08afd --- /dev/null +++ b/modules/backlogs/spec/features/sprints/edit_spec.rb @@ -0,0 +1,196 @@ +# 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_relative "../../support/pages/backlogs" + +RSpec.describe "Edit", :js do + let(:project) { create(:project) } + let(:all_permissions) { %i[view_sprints add_work_packages view_work_packages create_sprints] } + let(:permissions) { all_permissions } + let(:user) do + create(:user, member_with_permissions: { project => permissions }) + end + let(:backlogs_page) { Pages::Backlogs.new(project) } + + let(:story_type) do + create(:type_feature) + end + let(:story_type2) do + type = create(:type) + + project.types << type + + type + end + let(:inactive_story_type) do + create(:type) + end + + let(:task_type) do + type = create(:type_task) + project.types << type + + type + end + + let!(:closed_sprint) do + create(:agile_sprint, + project:, + status: "completed", + start_date: Date.new(2025, 8, 25), + finish_date: Date.new(2025, 9, 4)) + end + + let!(:first_sprint) do + create(:agile_sprint, + project:, + start_date: Date.new(2025, 9, 5), + finish_date: Date.new(2025, 9, 15)) + end + + let!(:second_sprint) do + create(:agile_sprint, + project:, + start_date: Date.new(2025, 9, 16), + finish_date: Date.new(2025, 9, 26)) + end + + let!(:work_package) do + create(:work_package, subject: "First work package", project:, sprint: first_sprint, type: story_type) + end + + # Necessary so that work packages can be created via dialog + shared_let(:default_status) { create(:default_status) } + shared_let(:default_priority) { create(:default_priority) } + + before do + login_as(user) + + # Legacy backlogs module requires type configuration + allow(Setting) + .to receive(:plugin_openproject_backlogs) + .and_return("story_types" => [story_type.id.to_s, + story_type2.id.to_s, + inactive_story_type.id.to_s], + "task_type" => task_type.id.to_s) + + backlogs_page.visit! + end + + context "with the feature flag active", with_flag: { scrum_projects: true } do + it "lists all open sprints" do + backlogs_page.expect_sprint_names_in_order(first_sprint.name, second_sprint.name) + + backlogs_page.expect_story_in_sprint(work_package, first_sprint) + backlogs_page.expect_story_not_in_sprint(work_package, second_sprint) + end + + it "adds a work package to a sprint" do + backlogs_page.click_in_sprint_menu(first_sprint, "New story") + backlogs_page.expect_create_work_package_dialog + + page.within("#create-work-package-dialog") do + page.fill_in "Subject", with: "Story created in sprint" + + click_on "Create" + end + + wait_for_reload + + expect_and_dismiss_flash type: :success, message: "New work package created and added as a child" + created_wp = first_sprint.reload.work_packages.last + expect(created_wp.subject).to eq("Story created in sprint") + backlogs_page.expect_story_in_sprint(created_wp, first_sprint) + end + + context "with the 'create_sprints' permissions" do + context "when editing a sprint" do + it "displays all menu entries" do + backlogs_page.within_sprint_menu(first_sprint) do |menu| + expect(menu).to have_selector :menuitem, count: 4 + expect(menu).to have_selector :menuitem, "Edit sprint" + expect(menu).to have_selector :menuitem, "New story" + expect(menu).to have_selector :menuitem, "Stories/Tasks" + expect(menu).to have_selector :menuitem, "Task board" + expect(menu).to have_selector :menuitem, "Burndown chart", disabled: true # disabled item does not count + end + end + + it "edits the sprint name" do + backlogs_page.expect_sprint_names_in_order(first_sprint.name, second_sprint.name) + + backlogs_page.click_in_sprint_menu(first_sprint, "Edit sprint") + backlogs_page.expect_sprint_dialog + + within_dialog "Edit sprint" do + page.fill_in "Sprint name", with: "Changed name" + page.click_button "Save" + end + + wait_for_reload + backlogs_page.expect_sprint_names_in_order("Changed name", second_sprint.name) + end + + context "when lacking the 'add_work_packages' permission" do + let(:permissions) { all_permissions - %i[add_work_packages] } + + it "has no menu entry for creating a new story" do + backlogs_page.within_sprint_menu(first_sprint) do |menu| + expect(menu).to have_selector :menuitem, count: 3 + expect(menu).to have_selector :menuitem, "Edit sprint" + expect(menu).to have_selector :menuitem, "Stories/Tasks" + expect(menu).to have_selector :menuitem, "Task board" + expect(menu).to have_selector :menuitem, "Burndown chart", disabled: true + + expect(menu).to have_no_selector :menuitem, "New story" + end + end + end + end + end + + context "without the necessary permissions" do + let(:permissions) { all_permissions - [:create_sprints] } + + it "is missing the 'new sprint' button" do + expect(page).to have_no_button "Create" + expect(page).not_to have_test_selector("op-sprints--new-sprint-button") + end + + it "has no menu entry for editing a sprint" do + backlogs_page.within_sprint_menu(first_sprint) do |menu| + expect(menu).to have_selector :menuitem, "Stories/Tasks" + expect(menu).to have_no_selector :menuitem, "Edit sprint" + end + end + end + end +end diff --git a/modules/backlogs/spec/support/pages/backlogs.rb b/modules/backlogs/spec/support/pages/backlogs.rb index b90598d44b7..59453af7b32 100644 --- a/modules/backlogs/spec/support/pages/backlogs.rb +++ b/modules/backlogs/spec/support/pages/backlogs.rb @@ -100,6 +100,12 @@ module Pages end end + def click_in_sprint_menu(sprint, item_name) + within_sprint_menu(sprint) do |menu| + menu.find(:menuitem, text: item_name).click + end + end + def click_in_story_menu(story, item_name) within_story_menu(story) do |menu| menu.find(:menuitem, text: item_name).click @@ -138,16 +144,30 @@ module Pages end def expect_story_in_sprint(story, sprint) - within_backlog(sprint) do - expect(page) - .to have_selector(story_selector(story).to_s) + if sprint.is_a?(Agile::Sprint) + within_sprint(sprint) do + expect(page) + .to have_selector(work_package_selector(story).to_s) + end + else + within_backlog(sprint) do + expect(page) + .to have_selector(story_selector(story).to_s) + end end end def expect_story_not_in_sprint(story, sprint) - within_backlog(sprint) do - expect(page) - .to have_no_selector(story_selector(story).to_s) + if sprint.is_a?(Agile::Sprint) + within_sprint(sprint) do + expect(page) + .to have_no_selector(work_package_selector(story).to_s) + end + else + within_backlog(sprint) do + expect(page) + .to have_no_selector(story_selector(story).to_s) + end end end @@ -210,6 +230,22 @@ module Pages new_sprint_button&.click end + def expect_sprint_dialog + expect(page).to have_css("#new-sprint-dialog") + end + + def expect_create_work_package_dialog + expect(page).to have_css("#create-work-package-dialog") + end + + def within_sprint_menu(backlog, &) + within_sprint(backlog) do + find(:button, accessible_name: "Sprint actions").click + + within(:menu, &) + end + end + private def within_story(story, &) @@ -220,6 +256,14 @@ module Pages within(backlog_selector(backlog), &) end + def within_sprint(sprint, &) + within(sprint_selector(sprint), &) + end + + def sprint_selector(sprint) + "#agile_sprint_#{sprint.id}" + end + def backlog_selector(backlog) "#backlog_#{backlog.id}" end @@ -227,5 +271,9 @@ module Pages def story_selector(story) "#story_#{story.id}" end + + def work_package_selector(story) + "#work_package_#{story.id}" + end end end From 86a186d18c9626a108fdbfa97423c3547674c33d Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 5 Mar 2026 18:09:38 +0100 Subject: [PATCH 195/334] [#71250] Version settings: used as backlog "checkbox" --- app/forms/versions/form.rb | 46 +++++++++++++++++++++----- modules/backlogs/config/locales/en.yml | 1 + 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/app/forms/versions/form.rb b/app/forms/versions/form.rb index a1b17760550..4297fa02f8c 100644 --- a/app/forms/versions/form.rb +++ b/app/forms/versions/form.rb @@ -113,14 +113,44 @@ module Versions if backlogs_enabled? setting = version_setting_for_project - f.select_list( - name: "version[version_settings_attributes][][display]", - scope_name_to_model: false, - label: I18n.t(:label_column_in_backlog), - input_width: :small - ) do |list| - position_display_options.each do |label, value| - list.option(label:, value:, selected: setting.display == value) + if OpenProject::FeatureDecisions.scrum_projects_active? + # We originally planned to render a check_box here. But since this changes the way Rails will submit the parameters, + # this would require changing the controller or services, too. With a feature flag in place, this adds quite a + # lot of complexity. + # To circumvent this, we will use a select list with two options for now. This will not require any changes to + # controllers or services. We can fix this once the feature flag has been removed. + f.select_list( + name: "version[version_settings_attributes][][display]", + scope_name_to_model: false, + label: I18n.t(:label_used_as_backlog), + input_width: :small + ) do |list| + # Maintain the current setting for the sake of migrating sprints to versions later on + current_display_setting = setting.display + value_for_no = if current_display_setting == VersionSetting::DISPLAY_RIGHT || current_display_setting.nil? + VersionSetting::DISPLAY_NONE + else + current_display_setting + end + + list.option(label: I18n.t(:general_text_no), + value: value_for_no, + selected: setting.display != VersionSetting::DISPLAY_RIGHT) + + list.option(label: I18n.t(:general_text_yes), + value: VersionSetting::DISPLAY_RIGHT, + selected: setting.display == VersionSetting::DISPLAY_RIGHT) + end + else + f.select_list( + name: "version[version_settings_attributes][][display]", + scope_name_to_model: false, + label: I18n.t(:label_column_in_backlog), + input_width: :small + ) do |list| + position_display_options.each do |label, value| + list.option(label:, value:, selected: setting.display == value) + end end end diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index ff60e9f7cb3..9e58970b397 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -169,6 +169,7 @@ en: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" label_sprint_edit: "Edit sprint" From d12ec030a1b2a2f25fe0197a7b5d8a5a9b5761d9 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 6 Mar 2026 12:44:15 +0100 Subject: [PATCH 196/334] [#71250] Adapt view to changes from Collapsile refactor See #22166 --- .../components/backlogs/sprint_header_component.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb index 834246a6c5f..d74a10893ec 100644 --- a/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb @@ -33,10 +33,10 @@ See COPYRIGHT and LICENSE files for more details. <% grid.with_area(:collapsible) do %> <%= render( - Backlogs::CollapsibleComponent.new( + Primer::OpenProject::BorderBox::CollapsibleHeader.new( collapsible_id: "#{dom_id(sprint)}-list", - toggle_label: t(".label_toggle_backlog", name: sprint.name), - collapsed: + collapsed:, + multi_line: false ) ) do |collapsible| collapsible.with_title { sprint.name } From 52feac54ba8fc34d906f6707d9784407ac70d8dc Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 6 Mar 2026 13:19:29 +0100 Subject: [PATCH 197/334] [#71250] Use StringInquirer to determine the state in the sprint dialog --- .../backlogs/new_sprint_dialog_component.rb | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb index 1ad652b178c..99432014903 100644 --- a/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb +++ b/modules/backlogs/app/components/backlogs/new_sprint_dialog_component.rb @@ -32,30 +32,34 @@ module Backlogs class NewSprintDialogComponent < ApplicationComponent include OpTurbo::Streamable include OpPrimer::ComponentHelpers + include Primer::FetchOrFallbackHelper DIALOG_ID = "new-sprint-dialog" FORM_ID = "new-sprint-dialog-form" FOOTER_ID = "new-sprint-dialog-footer" - def initialize(sprint:, state: :create) + STATE_DEFAULT = :create + STATE_OPTIONS = [STATE_DEFAULT, :edit].freeze + + attr_reader :sprint, :state + + delegate :create?, :edit?, to: :state + + def initialize(sprint:, state: STATE_DEFAULT) super @sprint = sprint - @state = state + @state = ActiveSupport::StringInquirer.new(fetch_or_fallback(STATE_OPTIONS, state, STATE_DEFAULT).to_s) end private - def state_create? = @state == :create - - def state_edit? = @state == :edit - def title - state_create? ? t(:label_sprint_new) : t(:label_sprint_edit) + create? ? t(:label_sprint_new) : t(:label_sprint_edit) end def button_caption - state_create? ? t(:button_create) : t(:button_save) + create? ? t(:button_create) : t(:button_save) end end end From ba6d608558db6c22c813c9cfc66e166ead5de7e7 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 6 Mar 2026 13:30:53 +0100 Subject: [PATCH 198/334] [#71250] Rubocop disable :) --- modules/backlogs/app/controllers/rb_sprints_controller.rb | 4 ++-- modules/backlogs/app/helpers/rb_common_helper.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index 58b50b6fcb5..58c2f75b74e 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -75,7 +75,7 @@ class RbSprintsController < RbApplicationController respond_with_turbo_streams end - def create + def create # rubocop:disable Metrics/AbcSize call = Sprints::CreateService .new(user: current_user) .call(attributes: converted_agile_sprint_params) @@ -90,7 +90,7 @@ class RbSprintsController < RbApplicationController end # Called like this due to `update` being taken by legacy sprints. - def update_agile_sprint + def update_agile_sprint # rubocop:disable Metrics/AbcSize # TODO: visible-scope? @sprint = Agile::Sprint.find(params[:id]) diff --git a/modules/backlogs/app/helpers/rb_common_helper.rb b/modules/backlogs/app/helpers/rb_common_helper.rb index 6a18216a1ed..7b3dc947d54 100644 --- a/modules/backlogs/app/helpers/rb_common_helper.rb +++ b/modules/backlogs/app/helpers/rb_common_helper.rb @@ -137,7 +137,7 @@ module RbCommonHelper end def allow_sprint_creation?(project) - scrum_projects_enabled? && User.current.allowed_in_project?(:create_sprints, project) + scrum_projects_enabled? && current_user.allowed_in_project?(:create_sprints, project) end private From 87cdc42bc678074d9abe5c676b15fbf8f2dfa64e Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 6 Mar 2026 15:28:47 +0100 Subject: [PATCH 199/334] [#71250] Use Arel table over sql --- modules/backlogs/app/models/agile/sprint.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 61a672752d6..44ddb4498a1 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -41,7 +41,8 @@ module Agile scope :for_project, ->(project) { where(project:) } scope :not_completed, -> { !completed } scope :order_by_date, -> do - reorder(Arel.sql("start_date ASC NULLS LAST, finish_date ASC NULLS LAST")) + order(arel_table[:start_date].asc.nulls_last, + arel_table[:finish_date].asc.nulls_last) end enum :status, From 2a9369f031932d8904979947c6206f1879c50c5e Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 6 Mar 2026 15:35:57 +0100 Subject: [PATCH 200/334] [#71250] Expect flash message --- modules/backlogs/spec/features/sprints/create_spec.rb | 2 +- modules/backlogs/spec/support/pages/backlogs.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/spec/features/sprints/create_spec.rb b/modules/backlogs/spec/features/sprints/create_spec.rb index cdde3cf69ff..2a3b3a4de17 100644 --- a/modules/backlogs/spec/features/sprints/create_spec.rb +++ b/modules/backlogs/spec/features/sprints/create_spec.rb @@ -103,7 +103,7 @@ RSpec.describe "Create", :js do click_on "Create" end - wait_for_reload + expect_and_dismiss_flash(message: "Successful creation.") backlogs_page.expect_sprint_names_in_order(initial_sprint.name, "Created sprint") sprint = project.reload.sprints.last diff --git a/modules/backlogs/spec/support/pages/backlogs.rb b/modules/backlogs/spec/support/pages/backlogs.rb index 59453af7b32..8eca0adac1f 100644 --- a/modules/backlogs/spec/support/pages/backlogs.rb +++ b/modules/backlogs/spec/support/pages/backlogs.rb @@ -126,7 +126,7 @@ module Pages end def sprint_names_in_order - page.find_all("#sprint_backlogs_container > section .op-backlogs-collapsible--title").map(&:text) + page.find_all("#sprint_backlogs_container > section .CollapsibleHeader-title").map(&:text) end def expect_sprint_names_in_order(*sprint_names) From b713b15537610540ce2e2139eca0ffbd4519c026 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 6 Mar 2026 15:44:50 +0100 Subject: [PATCH 201/334] [#71250] Remove unneeded content controller call --- modules/backlogs/app/views/rb_master_backlogs/index.html.erb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb index 307ee717ba4..38c3420e410 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb @@ -29,10 +29,6 @@ See COPYRIGHT and LICENSE files for more details. <% html_title t(:label_backlogs) %> -<% content_controller "backlogs", - "backlogs-list-url-value": backlogs_project_backlogs_path(@project), - "backlogs-backlogs--story-outlet": "li[data-story]" %> - <% content_for :content_header do %> <%= render Primer::OpenProject::PageHeader.new do |header| From 20bc40e0bca8cd294a188c74950187f427d8bcbe Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 6 Mar 2026 15:59:39 +0100 Subject: [PATCH 202/334] [#71250] Use menu when creating sprint --- modules/backlogs/spec/support/pages/backlogs.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/backlogs/spec/support/pages/backlogs.rb b/modules/backlogs/spec/support/pages/backlogs.rb index 8eca0adac1f..1b0e3f6d239 100644 --- a/modules/backlogs/spec/support/pages/backlogs.rb +++ b/modules/backlogs/spec/support/pages/backlogs.rb @@ -225,9 +225,11 @@ module Pages end def open_create_sprint_dialog - click_on "Create" - new_sprint_button = page.find_test_selector("op-sprints--new-sprint-button") - new_sprint_button&.click + find(:button, accessible_name: "Create").click + + within(:menu) do |menu| + menu.find(:menuitem, "Sprint").click + end end def expect_sprint_dialog From f0fac80f6e28b9c8c14a79deee8da96c101c37dc Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 6 Mar 2026 16:35:16 +0100 Subject: [PATCH 203/334] [#71250] Check for flash message contents --- modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb index 1f65f3c2b8a..27835fce2bd 100644 --- a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb @@ -190,6 +190,7 @@ RSpec.describe RbSprintsController do expect(response).to be_successful expect(response).to have_http_status :ok expect(response.body).to have_turbo_stream action: "flash" + expect(response.body).to include("Successful update.") expect(sprint.reload.name).to eq("Changed sprint name") end From bdabc82d542481d63fa4e9318fc3be1026b17f95 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 6 Mar 2026 16:41:32 +0100 Subject: [PATCH 204/334] [#71250] Provide separate method for backlog/sprint --- .../features/backlogs_in_backlog_view_spec.rb | 8 ++-- .../spec/features/stories_in_backlog_spec.rb | 18 ++++----- .../backlogs/spec/support/pages/backlogs.rb | 40 +++++++++---------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb index a7edc67079e..d79c85f67f6 100644 --- a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb +++ b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb @@ -123,13 +123,13 @@ RSpec.describe "Backlogs in backlog view", :js do # Versions can be folded backlogs_page - .expect_story_in_sprint(sprint_story1, sprint) + .expect_story_in_backlog(sprint_story1, sprint) backlogs_page .fold_backlog(sprint) backlogs_page - .expect_story_not_in_sprint(sprint_story1, sprint) + .expect_story_not_in_backlog(sprint_story1, sprint) # The backlogs can be folded by default visit my_interface_path @@ -142,13 +142,13 @@ RSpec.describe "Backlogs in backlog view", :js do backlogs_page.visit! backlogs_page - .expect_story_not_in_sprint(sprint_story1, sprint) + .expect_story_not_in_backlog(sprint_story1, sprint) backlogs_page .fold_backlog(sprint) backlogs_page - .expect_story_in_sprint(sprint_story1, sprint) + .expect_story_in_backlog(sprint_story1, sprint) # Alter the attributes of the sprint sleep(0.5) diff --git a/modules/backlogs/spec/features/stories_in_backlog_spec.rb b/modules/backlogs/spec/features/stories_in_backlog_spec.rb index c16c986e5d0..80b77aa0ce5 100644 --- a/modules/backlogs/spec/features/stories_in_backlog_spec.rb +++ b/modules/backlogs/spec/features/stories_in_backlog_spec.rb @@ -144,22 +144,22 @@ RSpec.describe "Stories in backlog", :js, :settings_reset do it "displays stories in correct order, calculates velocity, and allows editing story points" do backlogs_page - .expect_story_in_sprint(sprint_story1, sprint) + .expect_story_in_backlog(sprint_story1, sprint) backlogs_page - .expect_story_in_sprint(sprint_story2, sprint) + .expect_story_in_backlog(sprint_story2, sprint) backlogs_page - .expect_story_in_sprint(backlog_story1, backlog) + .expect_story_in_backlog(backlog_story1, backlog) backlogs_page - .expect_story_not_in_sprint(sprint_story2_parent, sprint) + .expect_story_not_in_backlog(sprint_story2_parent, sprint) backlogs_page - .expect_story_not_in_sprint(sprint_story1_task, sprint) + .expect_story_not_in_backlog(sprint_story1_task, sprint) backlogs_page - .expect_story_not_in_sprint(sprint_story_in_other_project, sprint) + .expect_story_not_in_backlog(sprint_story_in_other_project, sprint) backlogs_page .expect_stories_in_order(sprint, sprint_story1, sprint_story2) @@ -182,14 +182,14 @@ RSpec.describe "Stories in backlog", :js, :settings_reset do backlogs_page .edit_story_in_details_view(sprint_story1, version: backlog) - backlogs_page.expect_story_not_in_sprint(sprint_story1, sprint) - backlogs_page.expect_story_in_sprint(sprint_story1, backlog) + backlogs_page.expect_story_not_in_backlog(sprint_story1, sprint) + backlogs_page.expect_story_in_backlog(sprint_story1, backlog) end it "removes story from sprint when type is changed to non-story type via details view" do backlogs_page .edit_story_in_details_view(sprint_story2, type: task.name) - backlogs_page.expect_story_not_in_sprint(sprint_story2, sprint) + backlogs_page.expect_story_not_in_backlog(sprint_story2, sprint) end end diff --git a/modules/backlogs/spec/support/pages/backlogs.rb b/modules/backlogs/spec/support/pages/backlogs.rb index 1b0e3f6d239..7652247ee0f 100644 --- a/modules/backlogs/spec/support/pages/backlogs.rb +++ b/modules/backlogs/spec/support/pages/backlogs.rb @@ -144,30 +144,30 @@ module Pages end def expect_story_in_sprint(story, sprint) - if sprint.is_a?(Agile::Sprint) - within_sprint(sprint) do - expect(page) - .to have_selector(work_package_selector(story).to_s) - end - else - within_backlog(sprint) do - expect(page) - .to have_selector(story_selector(story).to_s) - end + within_sprint(sprint) do + expect(page) + .to have_selector(work_package_selector(story).to_s) + end + end + + def expect_story_in_backlog(story, backlog) + within_backlog(backlog) do + expect(page) + .to have_selector(story_selector(story).to_s) end end def expect_story_not_in_sprint(story, sprint) - if sprint.is_a?(Agile::Sprint) - within_sprint(sprint) do - expect(page) - .to have_no_selector(work_package_selector(story).to_s) - end - else - within_backlog(sprint) do - expect(page) - .to have_no_selector(story_selector(story).to_s) - end + within_sprint(sprint) do + expect(page) + .to have_no_selector(work_package_selector(story).to_s) + end + end + + def expect_story_not_in_backlog(story, backlog) + within_backlog(backlog) do + expect(page) + .to have_no_selector(story_selector(story).to_s) end end From e475e1f15a1dc66eb71cff793d2a087f16c5f463 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 6 Mar 2026 18:00:28 +0100 Subject: [PATCH 205/334] [#71250] Revert "[#71250] Remove unneeded content controller call" This reverts commit b9ca9c297efaeba257d6c10ff1a499769c76b58b. --- modules/backlogs/app/views/rb_master_backlogs/index.html.erb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb index 38c3420e410..307ee717ba4 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb @@ -29,6 +29,10 @@ See COPYRIGHT and LICENSE files for more details. <% html_title t(:label_backlogs) %> +<% content_controller "backlogs", + "backlogs-list-url-value": backlogs_project_backlogs_path(@project), + "backlogs-backlogs--story-outlet": "li[data-story]" %> + <% content_for :content_header do %> <%= render Primer::OpenProject::PageHeader.new do |header| From 57fcc505f63c26b3fd3b70e7d57f5c8ead46306b Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Sat, 7 Mar 2026 13:25:37 +0100 Subject: [PATCH 206/334] [#71250] Add placeholder implementation for `visible` --- modules/backlogs/app/controllers/rb_sprints_controller.rb | 8 +++----- modules/backlogs/app/models/agile/sprint.rb | 2 ++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index 58c2f75b74e..f246aca8d6b 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -54,15 +54,14 @@ class RbSprintsController < RbApplicationController end def edit_dialog - # TODO: visible-scope? - @sprint = Agile::Sprint.find(params[:id]) + @sprint = Agile::Sprint.visible.find(params[:id]) respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint, state: :edit) end def refresh_form id = edit_agile_sprint_params[:sprint][:id] - sprint = id.present? ? Agile::Sprint.find(id) : Agile::Sprint.new + sprint = id.present? ? Agile::Sprint.visible.find(id) : Agile::Sprint.new call = Sprints::SetAttributesService.new( user: current_user, @@ -91,8 +90,7 @@ class RbSprintsController < RbApplicationController # Called like this due to `update` being taken by legacy sprints. def update_agile_sprint # rubocop:disable Metrics/AbcSize - # TODO: visible-scope? - @sprint = Agile::Sprint.find(params[:id]) + @sprint = Agile::Sprint.visible.find(params[:id]) call = Sprints::UpdateService .new(user: current_user, model: @sprint) diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 44ddb4498a1..1208a00f856 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -44,6 +44,8 @@ module Agile order(arel_table[:start_date].asc.nulls_last, arel_table[:finish_date].asc.nulls_last) end + # FIXME: replace this stub with a meaningful implementation. + scope :visible, -> { all } enum :status, { From 03f6dccc59c52f0a615c5c3d254f383173230b65 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Sat, 7 Mar 2026 13:26:08 +0100 Subject: [PATCH 207/334] [#71250] Collect all sprints for the current project Will not change anything now, but will be relevant with sharing implemented. --- .../backlogs/app/controllers/rb_master_backlogs_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb index dbb046039d4..52395a2543e 100644 --- a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb +++ b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb @@ -70,7 +70,7 @@ class RbMasterBacklogsController < RbApplicationController @owner_backlogs = Backlog.owner_backlogs(@project) if OpenProject::FeatureDecisions.scrum_projects_active? - @sprints = @project.sprints.not_completed.order_by_date + @sprints = Agile::Sprint.for_project(@project).not_completed.order_by_date else @sprint_backlogs = Backlog.sprint_backlogs(@project) end From 8f2a3c5af42aefa93a6863f9f699932b8c9c91c6 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Sun, 8 Mar 2026 11:18:27 +0100 Subject: [PATCH 208/334] [#71250] Check if sprint names are in order Good catch by Copilot -> match_array does not check the order of the elements. --- modules/backlogs/spec/support/pages/backlogs.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/backlogs/spec/support/pages/backlogs.rb b/modules/backlogs/spec/support/pages/backlogs.rb index 7652247ee0f..560d0ea6212 100644 --- a/modules/backlogs/spec/support/pages/backlogs.rb +++ b/modules/backlogs/spec/support/pages/backlogs.rb @@ -130,7 +130,7 @@ module Pages end def expect_sprint_names_in_order(*sprint_names) - expect(sprint_names_in_order).to match_array(sprint_names) + expect(sprint_names_in_order).to eq(sprint_names) end def expect_sprint(sprint) From d0d1b2f91036e711b88de743d36c227cb7dc3f6e Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Sun, 8 Mar 2026 11:30:24 +0100 Subject: [PATCH 209/334] [#71250] Refactor --- .../backlogs/app/components/backlogs/sprint_component.rb | 6 +++--- modules/backlogs/app/controllers/rb_sprints_controller.rb | 8 ++++---- .../app/views/rb_master_backlogs/_agile_list.html.erb | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/sprint_component.rb b/modules/backlogs/app/components/backlogs/sprint_component.rb index 2f251d23e8b..96dddd58110 100644 --- a/modules/backlogs/app/components/backlogs/sprint_component.rb +++ b/modules/backlogs/app/components/backlogs/sprint_component.rb @@ -55,11 +55,11 @@ module Backlogs end def stories - @sprint.work_packages + sprint.work_packages end def wrapper_uniq_by - @sprint.id + sprint.id end private @@ -76,7 +76,7 @@ module Backlogs { generic_drag_and_drop_target: "container", target_container_accessor: ":scope > ul", - target_id: @sprint.id, + target_id: sprint.id, target_allowed_drag_type: "story" } end diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index f246aca8d6b..a9abaa044e5 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -54,14 +54,14 @@ class RbSprintsController < RbApplicationController end def edit_dialog - @sprint = Agile::Sprint.visible.find(params[:id]) + @sprint = Agile::Sprint.for_project(@project).visible.find(params[:id]) respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint, state: :edit) end def refresh_form - id = edit_agile_sprint_params[:sprint][:id] - sprint = id.present? ? Agile::Sprint.visible.find(id) : Agile::Sprint.new + id = edit_agile_sprint_params.dig(:sprint, :id) + sprint = id.present? ? Agile::Sprint.for_project(@project).visible.find(id) : Agile::Sprint.new call = Sprints::SetAttributesService.new( user: current_user, @@ -90,7 +90,7 @@ class RbSprintsController < RbApplicationController # Called like this due to `update` being taken by legacy sprints. def update_agile_sprint # rubocop:disable Metrics/AbcSize - @sprint = Agile::Sprint.visible.find(params[:id]) + @sprint = Agile::Sprint.for_project(@project).visible.find(params[:id]) call = Sprints::UpdateService .new(user: current_user, model: @sprint) diff --git a/modules/backlogs/app/views/rb_master_backlogs/_agile_list.html.erb b/modules/backlogs/app/views/rb_master_backlogs/_agile_list.html.erb index 4e83ad1090a..412df5cf8ff 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/_agile_list.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/_agile_list.html.erb @@ -42,7 +42,7 @@ See COPYRIGHT and LICENSE files for more details. <% else %>
- <%= render(Backlogs::SprintComponent.with_collection(@sprints, project: @project)) %> + <%= render(Backlogs::SprintComponent.with_collection(@sprints)) %>
<%= render(Backlogs::BacklogComponent.with_collection(@owner_backlogs, project: @project)) %> From 85b700ca9bdbddef8ba5d41e06a0d7feae1c1c80 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Sun, 8 Mar 2026 11:43:50 +0100 Subject: [PATCH 210/334] [#71250] Add spec for permitted_params --- spec/models/permitted_params_spec.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/models/permitted_params_spec.rb b/spec/models/permitted_params_spec.rb index afdd270a5d5..a7fa32414c1 100644 --- a/spec/models/permitted_params_spec.rb +++ b/spec/models/permitted_params_spec.rb @@ -549,6 +549,12 @@ RSpec.describe PermittedParams do it_behaves_like "allows params" end + describe "sprint_id" do + let(:hash) { { "sprint_id" => "1" } } + + it_behaves_like "allows params" + end + describe "notes" do let(:hash) { { "journal_notes" => "blubs" } } From 26b573aeb9bf6c56f514a3fe82d3811f70b9401f Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Sun, 8 Mar 2026 11:44:51 +0100 Subject: [PATCH 211/334] [#71250] Remove superfluous Stimulus value --- .../backlogs/app/views/rb_master_backlogs/agile_index.html.erb | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb index 16194aa9c77..cbf6666d35b 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb @@ -30,7 +30,6 @@ See COPYRIGHT and LICENSE files for more details. <% html_title t(:label_backlogs) %> <% content_controller "backlogs", - "backlogs-list-url-value": backlogs_project_backlogs_path(@project), "backlogs-backlogs--story-outlet": "li[data-story]" %> <% content_for :content_header do %> From 5c73eb3098b0e88c1c7af1de54041edf1b80eeb0 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Sun, 8 Mar 2026 12:08:31 +0100 Subject: [PATCH 212/334] [#71250] Hide unused menu items --- .../backlogs/sprint_menu_component.html.erb | 38 +++++++++---------- modules/backlogs/app/models/agile/sprint.rb | 2 - 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb index c3784b8b416..4fbd3862b13 100644 --- a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb @@ -74,25 +74,23 @@ See COPYRIGHT and LICENSE files for more details. item.with_leading_visual_icon(icon: :"op-view-list") end - menu.with_item( - # TODO: what to do with the task board? - scheme: :danger, - label: t(".action_menu.task_board"), - tag: :a, - href: backlogs_project_sprint_taskboard_path(project, sprint) - ) do |item| - item.with_leading_visual_icon(icon: :"op-view-cards") - end - - menu.with_item( - # TODO: what to do with the burndown chart? - scheme: :danger, - label: t(".action_menu.burndown_chart"), - tag: :a, - href: backlogs_project_sprint_burndown_chart_path(project, sprint), - disabled: !sprint.has_burndown? - ) do |item| - item.with_leading_visual_icon(icon: :graph) - end + # menu.with_item( + # # TODO: what to do with the task board? + # label: t(".action_menu.task_board"), + # tag: :a, + # href: backlogs_project_sprint_taskboard_path(project, sprint) + # ) do |item| + # item.with_leading_visual_icon(icon: :"op-view-cards") + # end + # + # menu.with_item( + # # TODO: what to do with the burndown chart? + # label: t(".action_menu.burndown_chart"), + # tag: :a, + # href: backlogs_project_sprint_burndown_chart_path(project, sprint), + # disabled: !sprint.has_burndown? + # ) do |item| + # item.with_leading_visual_icon(icon: :graph) + # end end %> diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 1208a00f856..8905ffd709d 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -89,8 +89,6 @@ module Agile Day.working.from_range(from: start_date, to: finish_date).count end - def has_burndown? = false - private # TODO: consider moving this validation to the database level to ensure data integrity. From ba6e3a55d100794ad69792373bab79039ca35fb1 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Sun, 8 Mar 2026 12:14:25 +0100 Subject: [PATCH 213/334] [#71250] Consider feature flag for detail action --- .../app/controllers/rb_master_backlogs_controller.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb index 52395a2543e..c9062c36dae 100644 --- a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb +++ b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb @@ -58,7 +58,12 @@ class RbMasterBacklogsController < RbApplicationController render "work_packages/split_view", layout: false else load_backlogs - render :index + + if OpenProject::FeatureDecisions.scrum_projects_active? + render :agile_index + else + render :index + end end end From e809cde8211eec5bb7795a311826af39cca81d9f Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 9 Mar 2026 10:47:11 +0100 Subject: [PATCH 214/334] [#71250] Add specs for Sprint components This showed that the state and form for the header component was not used for sprints (since we use the modal for that), so we could delete this. --- .../backlogs/sprint_header_component.html.erb | 95 ++++------ .../backlogs/sprint_header_component.rb | 8 +- .../backlogs/sprint_menu_component.html.erb | 2 +- .../backlogs/sprint_component_spec.rb | 138 ++++++++++++++ .../backlogs/sprint_header_component_spec.rb | 178 ++++++++++++++++++ .../backlogs/sprint_menu_component_spec.rb | 114 +++++++++++ 6 files changed, 473 insertions(+), 62 deletions(-) create mode 100644 modules/backlogs/spec/components/backlogs/sprint_component_spec.rb create mode 100644 modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb create mode 100644 modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb diff --git a/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb index d74a10893ec..1c1b3f62326 100644 --- a/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprint_header_component.html.erb @@ -28,63 +28,50 @@ See COPYRIGHT and LICENSE files for more details. ++# %> <%= component_wrapper(tag: :header) do %> - <% if show? %> - <%= grid_layout("op-backlogs-header", tag: :div) do |grid| %> - <% grid.with_area(:collapsible) do %> - <%= - render( - Primer::OpenProject::BorderBox::CollapsibleHeader.new( - collapsible_id: "#{dom_id(sprint)}-list", - collapsed:, - multi_line: false - ) - ) do |collapsible| - collapsible.with_title { sprint.name } - collapsible.with_count( - scheme: :default, - count: story_count, - round: true, - aria: { - label: t(".label_story_count", count: story_count), - live: "polite" - } - ) - collapsible.with_description(role: "group") do - format_date_range(date_range) - end + <%= grid_layout("op-backlogs-header", tag: :div) do |grid| %> + <% grid.with_area(:collapsible) do %> + <%= + render( + Primer::OpenProject::BorderBox::CollapsibleHeader.new( + collapsible_id: "#{dom_id(sprint)}-list", + collapsed:, + multi_line: false + ) + ) do |collapsible| + collapsible.with_title { sprint.name } + collapsible.with_count( + scheme: :default, + count: story_count, + round: true, + aria: { + label: t(".label_story_count", count: story_count), + live: "polite" + } + ) + collapsible.with_description(role: "group") do + format_date_range(date_range) end - %> - <% end %> + end + %> + <% end %> - <% grid.with_area(:points) do %> - <%= - render( - Primer::Beta::Text.new( - color: :subtle, - classes: "velocity", - aria: { live: "polite" } - ) - ) do - %> - <%= story_points %> - <%= t(:"backlogs.points_label", count: story_points) %> - <% end %> - <% end %> - - <% grid.with_area(:menu) do %> - <%= render(Backlogs::SprintMenuComponent.new(sprint:, project:)) %> + <% grid.with_area(:points) do %> + <%= + render( + Primer::Beta::Text.new( + color: :subtle, + classes: "velocity", + aria: { live: "polite" } + ) + ) do + %> + <%= story_points %> + <%= t(:"backlogs.points_label", count: story_points) %> <% end %> <% end %> - <% else %> - <%= - primer_form_with( - url: backlogs_project_sprint_path(project, sprint), - model: sprint, - method: :patch, - class: "op-backlogs-header-form" - ) do |f| - render(Backlogs::BacklogHeaderForm.new(f, cancel_path: show_name_backlogs_project_sprint_path(project, sprint))) - end - %> + + <% grid.with_area(:menu) do %> + <%= render(Backlogs::SprintMenuComponent.new(sprint:, project:)) %> + <% end %> <% end %> <% end %> diff --git a/modules/backlogs/app/components/backlogs/sprint_header_component.rb b/modules/backlogs/app/components/backlogs/sprint_header_component.rb index 7f80ce5521d..968276e1d50 100644 --- a/modules/backlogs/app/components/backlogs/sprint_header_component.rb +++ b/modules/backlogs/app/components/backlogs/sprint_header_component.rb @@ -36,25 +36,19 @@ module Backlogs include Redmine::I18n include RbCommonHelper - STATE_DEFAULT = :show - STATE_OPTIONS = [STATE_DEFAULT, :edit].freeze - - attr_reader :sprint, :state, :collapsed, :current_user + attr_reader :sprint, :collapsed, :current_user delegate :project, to: :sprint delegate :name, to: :sprint, prefix: :sprint - delegate :edit?, :show?, to: :state def initialize( sprint:, - state: STATE_DEFAULT, folded: false, current_user: User.current ) super() @sprint = sprint - @state = ActiveSupport::StringInquirer.new(fetch_or_fallback(STATE_OPTIONS, state, STATE_DEFAULT).to_s) @collapsed = folded @current_user = current_user end diff --git a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb index 4fbd3862b13..a374f690bbb 100644 --- a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb @@ -46,7 +46,7 @@ See COPYRIGHT and LICENSE files for more details. end end - if user_allowed?(:add_work_packages) + if user_allowed?(:manage_sprint_items) menu.with_item( label: t(".action_menu.new_story"), href: new_project_work_packages_dialog_path( diff --git a/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb new file mode 100644 index 00000000000..03790fc01b1 --- /dev/null +++ b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb @@ -0,0 +1,138 @@ +# 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 Backlogs::SprintComponent, type: :component do + shared_let(:type_feature) { create(:type_feature) } + shared_let(:type_task) { create(:type_task) } + shared_let(:default_status) { create(:default_status) } + shared_let(:default_priority) { create(:default_priority) } + shared_let(:user) { create(:admin) } + current_user { user } + + let(:project) { create(:project, types: [type_feature, type_task]) } + let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) } + + before do + allow(Setting) + .to receive(:plugin_openproject_backlogs) + .and_return("story_types" => [type_feature.id.to_s], "task_type" => type_task.id.to_s) + + allow(user).to receive(:backlogs_preference).with(:versions_default_fold_state).and_return("open") + end + + def render_component + render_inline(described_class.new(sprint:, current_user: user)) + end + + describe "rendering" do + context "with stories" do + let!(:story1) do + create(:work_package, + project:, + type: type_feature, + status: default_status, + priority: default_priority, + story_points: 5, + position: 1, + sprint: sprint) + end + let!(:story2) do + create(:work_package, + project:, + type: type_feature, + status: default_status, + priority: default_priority, + story_points: 3, + position: 2, + sprint: sprint) + end + + it "renders a Primer::Beta::BorderBox" do + render_component + + expect(page).to have_css(".Box") + end + + it "has the sprint ID in the DOM id" do + render_component + + expect(page).to have_css(".Box#agile_sprint_#{sprint.id}") + end + + it "renders BacklogHeaderComponent in header" do + render_component + + expect(page).to have_css(".Box-header h3", text: "Sprint 1") + end + + it "renders StoryComponent for each story" do + render_component + + expect(page).to have_css(".Box-row", count: 2) # 2 stories + expect(page).to have_text(story1.subject) + expect(page).to have_text(story2.subject) + end + + it "has drop target data attributes" do + render_component + + box = page.find(".Box") + expect(box["data-target-id"]).to eq(sprint.id.to_s) + expect(box["data-target-allowed-drag-type"]).to eq("story") + end + + it "has draggable data attributes on story rows" do + render_component + + story_row = page.find(".Box-row[id='work_package_#{story1.id}']") + expect(story_row["data-draggable-id"]).to eq(story1.id.to_s) + expect(story_row["data-draggable-type"]).to eq("story") + expect(story_row["data-drop-url"]).to include("move") + end + + it "renders story rows with proper classes" do + render_component + + story_row = page.find(".Box-row[id='work_package_#{story1.id}']") + expect(story_row[:class]).to include("Box-row--hover-blue") + expect(story_row[:class]).to include("Box-row--focus-gray") + expect(story_row[:class]).to include("Box-row--clickable") + end + end + + context "without stories" do + let(:rendered_component) { render_component } + + it_behaves_like "rendering Blank Slate", heading: "Sprint 1 is empty" + end + end +end diff --git a/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb new file mode 100644 index 00000000000..dc72e4170dd --- /dev/null +++ b/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb @@ -0,0 +1,178 @@ +# 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 Backlogs::SprintHeaderComponent, type: :component do + shared_let(:type_feature) { create(:type_feature) } + shared_let(:type_task) { create(:type_task) } + shared_let(:default_status) { create(:default_status) } + shared_let(:default_priority) { create(:default_priority) } + shared_let(:user) { create(:admin) } + current_user { user } + + let(:project) { create(:project, types: [type_feature, type_task]) } + let(:start_date) { Date.new(2024, 1, 15) } + let(:finish_date) { Date.new(2024, 1, 29) } + let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date:, finish_date:) } + let(:state) { :show } + let(:folded) { false } + + before do + allow(Setting) + .to receive(:plugin_openproject_backlogs) + .and_return("story_types" => [type_feature.id.to_s], "task_type" => type_task.id.to_s) + end + + def render_component(folded: false) + render_inline(described_class.new(sprint:, folded:, current_user: user)) + end + + describe "show state (default)" do + context "with stories" do + let!(:story1) do + create(:story, + project:, + type: type_feature, + status: default_status, + priority: default_priority, + story_points: 5, + sprint:) + end + let!(:story2) do + create(:story, + project:, + type: type_feature, + status: default_status, + priority: default_priority, + story_points: 3, + sprint:) + end + let!(:story_with_nil_points) do + create(:story, + project:, + type: type_feature, + status: default_status, + priority: default_priority, + story_points: nil, + sprint:) + end + + it "displays sprint name in h4" do + render_component + + expect(page).to have_css("h3", text: "Sprint 1") + end + + it "shows story count via Primer::Beta::Counter" do + render_component + + expect(page).to have_css(".Counter", text: "3") + end + + it "shows formatted date range with time tags" do + render_component + + expect(page).to have_css("time[datetime='2024-01-15']") + expect(page).to have_css("time[datetime='2024-01-29']") + end + + it "shows story points total (nil treated as 0)" do + render_component + + # 5 + 3 + 0 = 8 points + expect(page).to have_text("8 points", normalize_ws: true) + end + + it "renders collapse/expand chevrons" do + render_component + + expect(page).to have_octicon(:"chevron-up", visible: :all) + expect(page).to have_octicon(:"chevron-down", visible: :all) + end + + it "renders BacklogMenuComponent" do + render_component + + expect(page).to have_css("action-menu") + end + end + + context "with no stories" do + let(:stories) { [] } + + it "shows 0 story count" do + render_component + + expect(page).to have_css(".Counter", text: "0") + end + + it "shows 0 points" do + render_component + + expect(page).to have_text("0 points", normalize_ws: true) + end + end + + context "when sprint has no dates" do + let(:sprint) { build_stubbed(:agile_sprint, project:, name: "Sprint 1", start_date: nil, finish_date: nil) } + + it "renders without date range" do + render_component + + expect(page).to have_no_css("time") + end + end + end + + describe "folded state" do + context "when folded is true" do + it "renders chevron-up hidden and chevron-down visible" do + render_component(folded: true) + + # When folded, chevron-up is hidden (has hidden attribute on svg) + # and chevron-down is visible (for expanding) + expect(page).to have_css("svg[hidden][data-target='collapsible-header.arrowUp']", visible: :hidden) + expect(page).to have_css("svg[data-target='collapsible-header.arrowDown']:not([hidden])", visible: :all) + end + end + + context "when folded is false" do + it "renders chevron-down hidden and chevron-up visible" do + render_component(folded: false) + + # When expanded, chevron-down is hidden (has hidden attribute) + # and chevron-up is visible (for collapsing) + expect(page).to have_css("svg[hidden][data-target='collapsible-header.arrowDown']", visible: :hidden) + expect(page).to have_css("svg[data-target='collapsible-header.arrowUp']:not([hidden])", visible: :all) + end + end + end +end diff --git a/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb new file mode 100644 index 00000000000..86fadec20d0 --- /dev/null +++ b/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb @@ -0,0 +1,114 @@ +# 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 Backlogs::SprintMenuComponent, type: :component do + shared_let(:type_feature) { create(:type_feature) } + shared_let(:type_task) { create(:type_task) } + + let(:project) { create(:project, types: [type_feature, type_task]) } + let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) } + let(:stories) { [] } + let(:user) { create(:user) } + let(:permissions) { [] } + + before do + allow(Setting) + .to receive(:plugin_openproject_backlogs) + .and_return("story_types" => [type_feature.id.to_s], "task_type" => type_task.id.to_s) + + # Set up user with specific permissions + create(:member, + project:, + principal: user, + roles: [create(:project_role, permissions:)]) + login_as(user) + end + + def render_component + render_inline(described_class.new(sprint:, project:, current_user: user)) + end + + describe "permission-based items" do + context "with :manage_sprint_items permission" do + let(:permissions) { %i[view_sprints manage_sprint_items] } + + it "shows Add new story item with compose icon" do + render_component + + expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.new_story")) + expect(page).to have_octicon(:compose) + end + end + + context "without :manage_sprint_items permission" do + let(:permissions) { [:view_sprints] } + + it "does not show Add new story item" do + render_component + + expect(page).to have_no_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.new_story")) + end + end + + context "with :create_sprints permission" do + let(:permissions) { %i[view_sprints create_sprints] } + + it "shows Edit item with pencil icon" do + render_component + + expect(page).to have_css("action-menu") + expect(page).to have_text(I18n.t("backlogs.backlog_menu_component.action_menu.edit_sprint")) + expect(page).to have_octicon(:pencil) + end + end + + context "without :create_sprints permission" do + let(:permissions) { [:view_sprints] } + + it "does not show Edit item" do + render_component + + expect(page).to have_no_text(I18n.t("backlogs.backlog_menu_component.action_menu.edit_sprint")) + end + end + end + + describe "always-visible items" do + let(:permissions) { [:view_sprints] } + + it "shows Stories/Tasks link" do + render_component + + expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.stories_tasks")) + end + end +end From 9e634a17a50fe7ae58803e5511a61dee53c017a7 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 9 Mar 2026 11:58:49 +0100 Subject: [PATCH 215/334] [#71250] Fix controller spec --- .../backlogs/app/controllers/rb_sprints_controller.rb | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index a9abaa044e5..9d2a8b50479 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -98,7 +98,7 @@ class RbSprintsController < RbApplicationController if call.success? render_success_flash_message_via_turbo_stream(message: I18n.t(:notice_successful_update)) - update_sprint_header_component_via_turbo_stream(sprint: call.result, state: :show) + update_sprint_header_component_via_turbo_stream(sprint: call.result) else update_new_sprint_form_component_via_turbo_stream(sprint: call.result, base_errors: call.errors[:base]) end @@ -152,13 +152,8 @@ class RbSprintsController < RbApplicationController ) end - def update_sprint_header_component_via_turbo_stream(sprint:, state: :show) - update_via_turbo_stream( - component: Backlogs::SprintHeaderComponent.new( - sprint:, - state: - ) - ) + def update_sprint_header_component_via_turbo_stream(sprint:) + update_via_turbo_stream(component: Backlogs::SprintHeaderComponent.new(sprint:)) end def update_new_sprint_form_component_via_turbo_stream(sprint:, base_errors: nil) From 739d8eb95fda4beafa7d35685dd94069b70b6971 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 9 Mar 2026 12:59:33 +0100 Subject: [PATCH 216/334] [#71250] Fix edit spec --- .../backlogs/spec/features/sprints/edit_spec.rb | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/modules/backlogs/spec/features/sprints/edit_spec.rb b/modules/backlogs/spec/features/sprints/edit_spec.rb index c4e78b08afd..a41ba4f2ff3 100644 --- a/modules/backlogs/spec/features/sprints/edit_spec.rb +++ b/modules/backlogs/spec/features/sprints/edit_spec.rb @@ -33,7 +33,7 @@ require_relative "../../support/pages/backlogs" RSpec.describe "Edit", :js do let(:project) { create(:project) } - let(:all_permissions) { %i[view_sprints add_work_packages view_work_packages create_sprints] } + let(:all_permissions) { %i[view_sprints add_work_packages view_work_packages create_sprints manage_sprint_items] } let(:permissions) { all_permissions } let(:user) do create(:user, member_with_permissions: { project => permissions }) @@ -135,12 +135,10 @@ RSpec.describe "Edit", :js do context "when editing a sprint" do it "displays all menu entries" do backlogs_page.within_sprint_menu(first_sprint) do |menu| - expect(menu).to have_selector :menuitem, count: 4 + expect(menu).to have_selector :menuitem, count: 3 expect(menu).to have_selector :menuitem, "Edit sprint" expect(menu).to have_selector :menuitem, "New story" expect(menu).to have_selector :menuitem, "Stories/Tasks" - expect(menu).to have_selector :menuitem, "Task board" - expect(menu).to have_selector :menuitem, "Burndown chart", disabled: true # disabled item does not count end end @@ -159,16 +157,14 @@ RSpec.describe "Edit", :js do backlogs_page.expect_sprint_names_in_order("Changed name", second_sprint.name) end - context "when lacking the 'add_work_packages' permission" do - let(:permissions) { all_permissions - %i[add_work_packages] } + context "when lacking the 'manage_sprint_items' permission" do + let(:permissions) { all_permissions - %i[manage_sprint_items] } it "has no menu entry for creating a new story" do backlogs_page.within_sprint_menu(first_sprint) do |menu| - expect(menu).to have_selector :menuitem, count: 3 + expect(menu).to have_selector :menuitem, count: 2 expect(menu).to have_selector :menuitem, "Edit sprint" expect(menu).to have_selector :menuitem, "Stories/Tasks" - expect(menu).to have_selector :menuitem, "Task board" - expect(menu).to have_selector :menuitem, "Burndown chart", disabled: true expect(menu).to have_no_selector :menuitem, "New story" end From fc4f17a840d0c5e96444b1e540a9f7aa43d651c2 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Mon, 9 Mar 2026 12:53:10 +0000 Subject: [PATCH 217/334] update locales from crowdin [ci skip] --- config/locales/crowdin/de.yml | 6 +-- config/locales/crowdin/uk.yml | 54 +++++++++---------- .../backlogs/config/locales/crowdin/af.yml | 19 +++++++ .../backlogs/config/locales/crowdin/ar.yml | 19 +++++++ .../backlogs/config/locales/crowdin/az.yml | 19 +++++++ .../backlogs/config/locales/crowdin/be.yml | 19 +++++++ .../backlogs/config/locales/crowdin/bg.yml | 19 +++++++ .../backlogs/config/locales/crowdin/ca.yml | 19 +++++++ .../config/locales/crowdin/ckb-IR.yml | 19 +++++++ .../backlogs/config/locales/crowdin/cs.yml | 19 +++++++ .../backlogs/config/locales/crowdin/da.yml | 19 +++++++ .../backlogs/config/locales/crowdin/de.yml | 27 ++++++++-- .../backlogs/config/locales/crowdin/el.yml | 19 +++++++ .../backlogs/config/locales/crowdin/eo.yml | 19 +++++++ .../backlogs/config/locales/crowdin/es.yml | 21 +++++++- .../backlogs/config/locales/crowdin/et.yml | 19 +++++++ .../backlogs/config/locales/crowdin/eu.yml | 19 +++++++ .../backlogs/config/locales/crowdin/fa.yml | 19 +++++++ .../backlogs/config/locales/crowdin/fi.yml | 19 +++++++ .../backlogs/config/locales/crowdin/fil.yml | 19 +++++++ .../backlogs/config/locales/crowdin/fr.yml | 19 +++++++ .../backlogs/config/locales/crowdin/he.yml | 19 +++++++ .../backlogs/config/locales/crowdin/hi.yml | 19 +++++++ .../backlogs/config/locales/crowdin/hr.yml | 19 +++++++ .../backlogs/config/locales/crowdin/hu.yml | 19 +++++++ .../backlogs/config/locales/crowdin/id.yml | 19 +++++++ .../backlogs/config/locales/crowdin/it.yml | 19 +++++++ .../backlogs/config/locales/crowdin/ja.yml | 19 +++++++ .../backlogs/config/locales/crowdin/ka.yml | 19 +++++++ .../backlogs/config/locales/crowdin/kk.yml | 19 +++++++ .../backlogs/config/locales/crowdin/ko.yml | 19 +++++++ .../backlogs/config/locales/crowdin/lt.yml | 19 +++++++ .../backlogs/config/locales/crowdin/lv.yml | 19 +++++++ .../backlogs/config/locales/crowdin/mn.yml | 19 +++++++ .../backlogs/config/locales/crowdin/ms.yml | 19 +++++++ .../backlogs/config/locales/crowdin/ne.yml | 19 +++++++ .../backlogs/config/locales/crowdin/nl.yml | 19 +++++++ .../backlogs/config/locales/crowdin/no.yml | 19 +++++++ .../backlogs/config/locales/crowdin/pl.yml | 19 +++++++ .../backlogs/config/locales/crowdin/pt-BR.yml | 19 +++++++ .../backlogs/config/locales/crowdin/pt-PT.yml | 19 +++++++ .../backlogs/config/locales/crowdin/ro.yml | 19 +++++++ .../backlogs/config/locales/crowdin/ru.yml | 19 +++++++ .../backlogs/config/locales/crowdin/rw.yml | 19 +++++++ .../backlogs/config/locales/crowdin/si.yml | 19 +++++++ .../backlogs/config/locales/crowdin/sk.yml | 19 +++++++ .../backlogs/config/locales/crowdin/sl.yml | 19 +++++++ .../backlogs/config/locales/crowdin/sr.yml | 19 +++++++ .../backlogs/config/locales/crowdin/sv.yml | 19 +++++++ .../backlogs/config/locales/crowdin/th.yml | 19 +++++++ .../backlogs/config/locales/crowdin/tr.yml | 19 +++++++ .../backlogs/config/locales/crowdin/uk.yml | 19 +++++++ .../backlogs/config/locales/crowdin/uz.yml | 19 +++++++ .../backlogs/config/locales/crowdin/vi.yml | 19 +++++++ .../backlogs/config/locales/crowdin/zh-CN.yml | 19 +++++++ .../backlogs/config/locales/crowdin/zh-TW.yml | 19 +++++++ modules/meeting/config/locales/crowdin/uk.yml | 2 +- 57 files changed, 1062 insertions(+), 36 deletions(-) diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 82576e664ce..b531a43030a 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -2673,7 +2673,7 @@ de: gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP-Benutzer- und Gruppensynchronisation mcp_server: Model Context Protocol (MCP) - meeting_templates: Reusable meeting templates + meeting_templates: Wiederverwendbare Besprechungs-Vorlagen nextcloud_sso: Single Sign-On für Nextcloud-Speicher one_drive_sharepoint_file_storage: OneDrive/SharePoint-Datei-Speicher placeholder_users: Platzhalter-Benutzer @@ -3071,8 +3071,8 @@ de: line_0: AI workflows with a secure MCP server (Professional plan and higher) line_1: Improved project home page with new widget for budgets and improved accessibility line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments. - line_4: PDF export enhancements + line_3: Bessere Transparenz durch Kommentare zu Projektattributen. + line_4: Verbesserungen beim PDF-Export line_5: Increased security for external links (Premium plan and higher) line_6: UI/UX improvements in the Backlogs module line_7: Harmonized custom field forms diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index 19e274587ec..64a9ca71bc2 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -255,11 +255,11 @@ uk: label_progress: "Отримання даних із Jira…" elements: relations: "Зв’язки між проблемами" - workflows: "Project-level workflows" + workflows: "Робочі процеси на рівні проєктів" users: "Користувачі" sprints: "Спринти" schemes: "Схеми" - permissions: "User, group and project permissions" + permissions: "Дозволи для користувачів, груп і проєктів" confirm_import: title: "Імпортуйте дані" caption: "Перегляньте налаштування імпорту й запустіть його" @@ -287,19 +287,19 @@ uk: revert_dialog: title: "Остаточно скасувати цей імпорт?" description: "Буде видалено всі імпортовані об’єкти (зокрема цілі проєкти), навіть якщо користувачі виконували з ними дії в OpenProject після імпорту." - confirm: "I understand that this reversion will delete data permanently" + confirm: "Я розумію, що скасування внесених змін призведе до остаточного видалення даних" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + title: "Завершити цей імпорт?" + description: "Якщо ви завершите цей імпорт, то більше не зможете його скасувати. Усі імпортовані дані буде остаточно збережено в системі." + confirm: "Я розумію, що цю дію не можна відмінити" + confirm_button: "Зрозуміло" select_projects: - title: "Select projects" + title: "Виберіть проєкти" 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." resources_heading: "Ресурси" - resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_description: "OpenProject реалізує наведені нижче ресурси. Кожен із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися більше, ознайомтеся з [документацією щодо ресурсів MCP] (docs_url)." resources_submit: "Оновити ресурси" tools_heading: "Інструменти" tools_description: "OpenProject реалізує наведені нижче інструменти. Кожен із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися більше, ознайомтеся з [документацією щодо інструментів MCP] (docs_url)." @@ -308,9 +308,9 @@ uk: success: "Конфігурації MCP оновлено." server_form: description_caption: "Опис сервера MCP для інших додатків, які підключаються до нього." - title_caption: "A short title shown to applications that connect to the MCP server." - tool_response_format: "Tool response format" - tool_response_format_content_only_label: "Content only" + title_caption: "Короткий заголовок, який відображається для додатків, що підключаються до сервера MCP." + tool_response_format: "Формат відповіді інструмента" + tool_response_format_content_only_label: "Лише вміст" tool_response_format_content_only_caption: > Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. tool_response_format_full_label: "Full" @@ -585,8 +585,8 @@ uk: all: "eg. ^[A-Z0-9]+$" project: "eg. ^[A-Z0-9]+$" min_max: - all: "0 means no restriction" - project: "0 means no restriction" + all: "0 означає відсутність обмежень" + project: "0 означає відсутність обмежень" has_comment: project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." tab: @@ -608,7 +608,7 @@ uk: mcp_configurations: server_url_component: caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." - label: "Server URL" + label: "URL-адреса сервера" op_dry_validation: or: "або" errors: @@ -1384,11 +1384,11 @@ uk: activerecord: attributes: jira_import: - projects: "Projects" + projects: "Проєкти" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Назва екземпляра Jira" + url: "URL-адреса екземпляра Jira" + personal_access_token: "Персональний маркер доступу" announcements: show_until: "Показувати до" attachment: @@ -1763,7 +1763,7 @@ uk: not_available: "– недоступно через налаштування системи." not_deletable: "не можна видалити." not_current_user: "не поточний користувач." - only_one_active_sprint_allowed: "only one active sprint is allowed per project." + only_one_active_sprint_allowed: "дозволяється лише один активний спринт для кожного проєкту." not_found: "не знайдено." not_a_date: "не є дійсною датою." not_a_datetime: "не є дійсним датою." @@ -1873,7 +1873,7 @@ uk: meeting: error_conflict: "Не вдалося зберегти, тому що зустріч була оновлена кимось іншим в цей час. Будь ласка, перезавантажте сторінку." message: - cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." + cannot_move_message_to_forum_of_different_project: "Повідомлення не можна перенести на форум іншого проєкту." notifications: at_least_one_channel: "Необхідно вказати принаймні один канал для надсилання сповіщень." attributes: @@ -2132,7 +2132,7 @@ uk: in_use: "Це ім’я маркера вже використовується; виберіть інше" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "Укажіть дійсний протокол (http або https)" template: body: "Перевірте наступні поля:" header: @@ -2157,7 +2157,7 @@ uk: comment: "Коментар" custom_action: "Спеціальні дії" custom_field: "Користувацьке поле" - customized: "Customized" + customized: "Персоналізовано" "doorkeeper/application": "Програма OAuth" enterprise_token: one: "Маркер Enterprise" @@ -2373,7 +2373,7 @@ uk: role: "роль" roles: "Роль" search: "Пошук" - sprint: "Sprint" + sprint: "Спринт" start_date: "Початок" status: "Статус" state: "Стан" @@ -2785,7 +2785,7 @@ uk: gantt_pdf_export: Експорт діаграми Ґантта в PDF ldap_groups: Синхронізація користувачів і груп LDAP mcp_server: Model Context Protocol (MCP) - meeting_templates: Reusable meeting templates + meeting_templates: Шаблони нарад, які можна використовувати повторно nextcloud_sso: Єдиний вхід для сховища Nextcloud one_drive_sharepoint_file_storage: Сховище файлів OneDrive / SharePoint placeholder_users: Прототипи користувачів @@ -3185,7 +3185,7 @@ uk: line_0: AI workflows with a secure MCP server (Professional plan and higher) line_1: Improved project home page with new widget for budgets and improved accessibility line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments. + line_3: Більша прозорість завдяки коментарям до атрибутів проєктів. line_4: PDF export enhancements line_5: Increased security for external links (Premium plan and higher) line_6: Покращення UI/UX у модулі беклогів @@ -3210,7 +3210,7 @@ uk: budget_deleted: "Budget has been deleted" dates_changed: "Дати змінено" default_attribute_written: "Атрибути лише для читання записано" - import: "Imported" + import: "Імпортовано" progress_mode_changed_to_status_based: "Обчислення прогресу оновлено" status_changed: "Статус «%{status_name}»" system_update: "Оновлення системи OpenProject" diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml index 0c9d44ea08c..f8f6e8da8bb 100644 --- a/modules/backlogs/config/locales/crowdin/af.yml +++ b/modules/backlogs/config/locales/crowdin/af.yml @@ -83,12 +83,21 @@ af: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ af: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ af: label_backlogs_unconfigured: "Jy het nog nie Agterstandes opgestel nie. Gaan asseblief na %{administration} > %{plugins}, klik dan op die %{configure}-skakel vir hierdie plugin. Sodra jy die velde gestel het, kom terug na hierdie bladsy om die instrument te begin gebruik." label_blocks_ids: "ID's van geblokkeerde werkspakkette" label_column_in_backlog: "Kolom in agterstand" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Af" label_points_burn_up: "Op" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint belemmerings" label_sprint_new: "New sprint" label_task_board: "Taak bord" diff --git a/modules/backlogs/config/locales/crowdin/ar.yml b/modules/backlogs/config/locales/crowdin/ar.yml index cfb5ad40f89..56be1c41c56 100644 --- a/modules/backlogs/config/locales/crowdin/ar.yml +++ b/modules/backlogs/config/locales/crowdin/ar.yml @@ -91,12 +91,21 @@ ar: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -107,6 +116,14 @@ ar: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -134,8 +151,10 @@ ar: label_backlogs_unconfigured: "لم تقم بإنشاء الأعمال المتراكمة غير المنجزة بعد. من فضلك اذهب إلى %{administration} > %{plugins}، ثم اضغط على رابط %{configure} لهذا البرنامج المساعد. عندما تنتهي من تعيين الحقول، ارجع إلى هذه الصفحة لتبدأ باستخدام الأداة." label_blocks_ids: "الهويات المعرِّفة لمجموعات العمل المحظورة" label_column_in_backlog: "عمود في العمل المتراكم غير المنجز" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "الأسفل" label_points_burn_up: "الأعلى" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "عوائق السباق" label_sprint_new: "New sprint" label_task_board: "لوحة المهمة" diff --git a/modules/backlogs/config/locales/crowdin/az.yml b/modules/backlogs/config/locales/crowdin/az.yml index 730442d3672..a616dc69c88 100644 --- a/modules/backlogs/config/locales/crowdin/az.yml +++ b/modules/backlogs/config/locales/crowdin/az.yml @@ -83,12 +83,21 @@ az: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ az: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ az: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/be.yml b/modules/backlogs/config/locales/crowdin/be.yml index 191fb2b82c2..472cde886d2 100644 --- a/modules/backlogs/config/locales/crowdin/be.yml +++ b/modules/backlogs/config/locales/crowdin/be.yml @@ -87,12 +87,21 @@ be: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -103,6 +112,14 @@ be: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -130,8 +147,10 @@ be: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/bg.yml b/modules/backlogs/config/locales/crowdin/bg.yml index 40eef1c70e8..de31fae2f5d 100644 --- a/modules/backlogs/config/locales/crowdin/bg.yml +++ b/modules/backlogs/config/locales/crowdin/bg.yml @@ -83,12 +83,21 @@ bg: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ bg: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ bg: label_backlogs_unconfigured: "Все още не сте конфигурирали Неизпълнени задачи. Моля, отидете на %{administration} > %{plugins}, след което щракнете върху връзката %{configure} за този плъгин. След като зададете полетата, върнете се на тази страница, за да започнете да използвате инструмента." label_blocks_ids: "ID на блокирани работни пакети" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Надолу" label_points_burn_up: "Нагоре" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Пречки за спринт" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/ca.yml b/modules/backlogs/config/locales/crowdin/ca.yml index 66a3b78a698..3c544aa84ed 100644 --- a/modules/backlogs/config/locales/crowdin/ca.yml +++ b/modules/backlogs/config/locales/crowdin/ca.yml @@ -83,12 +83,21 @@ ca: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ ca: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ ca: label_backlogs_unconfigured: "No has configurat les llistes de pendents encara. Si us plau, ves a %{administration} > %{plugins}, a continuació, fes clic a l'enllaç de %{configure} per a aquest plugin. Una vegada hagis omplert els camps, torna a aquesta pàgina per començar a utilitzar l'eina." label_blocks_ids: "Identificadors dels paquets de treball bloquejats" label_column_in_backlog: "Columna al backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "A baix" label_points_burn_up: "Amunt" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Impediments de sprint" label_sprint_new: "New sprint" label_task_board: "Tauler de tasques" diff --git a/modules/backlogs/config/locales/crowdin/ckb-IR.yml b/modules/backlogs/config/locales/crowdin/ckb-IR.yml index 75d995148d6..c3051591071 100644 --- a/modules/backlogs/config/locales/crowdin/ckb-IR.yml +++ b/modules/backlogs/config/locales/crowdin/ckb-IR.yml @@ -83,12 +83,21 @@ ckb-IR: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ ckb-IR: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ ckb-IR: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml index 7db06c435cb..5bec8d49ea3 100644 --- a/modules/backlogs/config/locales/crowdin/cs.yml +++ b/modules/backlogs/config/locales/crowdin/cs.yml @@ -87,12 +87,21 @@ cs: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -103,6 +112,14 @@ cs: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -130,8 +147,10 @@ cs: label_backlogs_unconfigured: "Zatím nemáte nakonfigurované nevyřízené záznamy. Přejděte na %{administration} > %{plugins}a poté klikněte na odkaz %{configure} pro tento plugin. Jakmile nastavíte pole, vraťte se na tuto stránku a začněte používat nástroj." label_blocks_ids: "ID blokovaných pracovních balíčků" label_column_in_backlog: "Sloupec v nevyřízené pozici" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Dolů" label_points_burn_up: "Nahoru" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Běh impedimenty" label_sprint_new: "New sprint" label_task_board: "Tabule úkolů" diff --git a/modules/backlogs/config/locales/crowdin/da.yml b/modules/backlogs/config/locales/crowdin/da.yml index 27fe6a906cf..6672ec9c913 100644 --- a/modules/backlogs/config/locales/crowdin/da.yml +++ b/modules/backlogs/config/locales/crowdin/da.yml @@ -83,12 +83,21 @@ da: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ da: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ da: label_backlogs_unconfigured: "Man har ikke opsat Backlogs endnu. Gå til %{administration} > %{plugins}, og klik dernæst på linket %{configure} til dette plugin. Når man har indstillet feltindhold, vend tilbage til denne side for at begynde at bruge værktøjet." label_blocks_ids: "ID'er for blokerede arbejdspakker" label_column_in_backlog: "Kolonne i backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Ned" label_points_burn_up: "Op" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint-hindringer" label_sprint_new: "New sprint" label_task_board: "Opgaveoversigt" diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 8addb34611f..34f5a9d153c 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -83,12 +83,21 @@ de: backlog_component: blankslate_title: "%{name} ist leer" blankslate_description: "Noch keine Arbeitspakete geplant. Ziehen Sie Arbeitspakete hierher, um sie hinzuzufügen." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "%{name} ein-/ausklappen" label_story_count: zero: "Keine Arbeitspakete im Backlog" one: "%{count} Arbeitspakete im Backlog" other: "%{count} Geschichten im Backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog-Aktionen" action_menu: @@ -99,6 +108,14 @@ de: burndown_chart: "Burndown-Diagramm" wiki: "Wiki" properties: "Eigenschaften" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "%{name} verschieben" story_menu_component: @@ -126,17 +143,19 @@ de: label_backlogs_unconfigured: "Sie haben noch keine Backlogs konfiguriert. Bitte gehen Sie auf %{administration} > %{plugins}, klicken Sie dann auf den %{configure} Link für dieses Plugin. Kommen Sie hierher zurück, sobald sie die Felder konfiguriert haben." label_blocks_ids: "IDs der blockierten Arbeitspakete" label_column_in_backlog: "Spalte im Backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Runter" label_points_burn_up: "Hoch" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Hindernisse" label_sprint_new: "Neuer Sprint" label_task_board: "Taskboard" permission_create_sprints: "Sprints erstellen" - permission_manage_sprint_items: "Manage sprint items" + permission_manage_sprint_items: "Sprint-Elemente verwalten" permission_select_done_statuses: "Abgeschlossene Status auswählen" - permission_share_sprint: "Share sprint" - permission_start_complete_sprint: "Start/complete sprint" - permission_view_sprints: "View sprints" + permission_share_sprint: "Sprint teilen" + permission_start_complete_sprint: "Sprint starten/abschließen" + permission_view_sprints: "Sprints sehen" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/el.yml b/modules/backlogs/config/locales/crowdin/el.yml index 09944224b96..7e3ecb7389b 100644 --- a/modules/backlogs/config/locales/crowdin/el.yml +++ b/modules/backlogs/config/locales/crowdin/el.yml @@ -83,12 +83,21 @@ el: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ el: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ el: label_backlogs_unconfigured: "Δεν έχετε διαμορφώσει τα Backlogs ακόμη. Παρακαλούμε πηγαίνετε στο %{administration} > %{plugins}, έπειτα κάντε κλικ στον σύνδεσμο %{configure} για αυτό το πρόσθετο. Μόλις έχετε ορίσει τα πεδία, επιστρέψτε σε αυτή την σελίδα για να αρχίσετε να χρησιμοποιείτε το εργαλείο." label_blocks_ids: "Ταυτότητες μπλοκαρισμένων πακέτων εργασίας" label_column_in_backlog: "Στήλη στο backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Κάτω" label_points_burn_up: "Πάνω" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Εμπόδια Sprint" label_sprint_new: "New sprint" label_task_board: "Πίνακας εργασιών" diff --git a/modules/backlogs/config/locales/crowdin/eo.yml b/modules/backlogs/config/locales/crowdin/eo.yml index e416e859712..02993d81e08 100644 --- a/modules/backlogs/config/locales/crowdin/eo.yml +++ b/modules/backlogs/config/locales/crowdin/eo.yml @@ -83,12 +83,21 @@ eo: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ eo: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ eo: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "ID de baritaj laborpakaĵoj" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Malsupren" label_points_burn_up: "Supren" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index bbdeeec2e77..996d73f762b 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -83,12 +83,21 @@ es: backlog_component: blankslate_title: "%{name} está vacío" blankslate_description: "Aún no hay elementos previstos. Arrastre los elementos aquí para añadirlos." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Contraer/expandir %{name}" label_story_count: zero: "No hay historias en backlog" one: "%{count} historia en backlog" other: "%{count} historias en backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Acciones de backlog" action_menu: @@ -96,9 +105,17 @@ es: new_story: "Nueva historia" stories_tasks: "Historias/tareas" task_board: "Panel de tareas" - burndown_chart: "Burndown chart" + burndown_chart: "Diagrama Burndown" wiki: "Wiki" properties: "Propiedades" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Mover %{name}" story_menu_component: @@ -126,8 +143,10 @@ es: label_backlogs_unconfigured: "Todavía no ha configurado backlogs. Por favor, visite %{administration} > %{plugins}, luego haga clic en el enlace de %{configure} para esta extensión. Cuando haya establecido los campos, vuelva a esta página para empezar a usar la herramienta." label_blocks_ids: "ID de los paquetes de trabajo bloqueados" label_column_in_backlog: "Columna en backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Abajo" label_points_burn_up: "Arriba" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Impedimentos de sprint" label_sprint_new: "Nuevo sprint" label_task_board: "Tablero de tareas" diff --git a/modules/backlogs/config/locales/crowdin/et.yml b/modules/backlogs/config/locales/crowdin/et.yml index 5ff66db95d4..8699002c53c 100644 --- a/modules/backlogs/config/locales/crowdin/et.yml +++ b/modules/backlogs/config/locales/crowdin/et.yml @@ -83,12 +83,21 @@ et: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ et: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ et: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Alla" label_points_burn_up: "Üles" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/eu.yml b/modules/backlogs/config/locales/crowdin/eu.yml index c548ffda646..5619b2d95e5 100644 --- a/modules/backlogs/config/locales/crowdin/eu.yml +++ b/modules/backlogs/config/locales/crowdin/eu.yml @@ -83,12 +83,21 @@ eu: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ eu: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ eu: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Behera" label_points_burn_up: "Gora" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/fa.yml b/modules/backlogs/config/locales/crowdin/fa.yml index 35a29990d82..9b3097effa6 100644 --- a/modules/backlogs/config/locales/crowdin/fa.yml +++ b/modules/backlogs/config/locales/crowdin/fa.yml @@ -83,12 +83,21 @@ fa: backlog_component: blankslate_title: "%{name} خالی است" blankslate_description: "هنوز موردی برنامه ریزی نشده است. موارد را برای اضافه کردن به اینجا بکشید." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "جمع کردن/باز کردن %{name}" label_story_count: zero: "هیچ داستانی در لیست انتظار نیست" one: "%{count} داستان در لیست کار های عقب افتاده" other: "%{count} داستان های در لیست کارهای عقب افتاده" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "اقدامات عقب افتاده" action_menu: @@ -99,6 +108,14 @@ fa: burndown_chart: "نمودار خلاصه" wiki: "ویکی" properties: "ویژگی ها" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "انتقال %{name}" story_menu_component: @@ -126,8 +143,10 @@ fa: label_backlogs_unconfigured: "شما هنوز پس‌افت‌ها را پیکربندی نکرده‌اید. لطفاً به %{administration} > %{plugins} بروید، سپس برای این افزونه روی %{configure} کلیک کنید. وقتی همۀ قسمت‌ها را تکمیل کردید، برای استفاده از این ابزار به همین صفحه برگردید. " label_blocks_ids: "شناسه‌های مسدود کاربسته‌ها" label_column_in_backlog: "ستون در پس‌افت" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "پایین" label_points_burn_up: "بالا" + label_sprint_edit: "Edit sprint" label_sprint_impediments: " موانع تاخت" label_sprint_new: "New sprint" label_task_board: "تابلوی وظیفه" diff --git a/modules/backlogs/config/locales/crowdin/fi.yml b/modules/backlogs/config/locales/crowdin/fi.yml index fd5a0e94a53..552964d1060 100644 --- a/modules/backlogs/config/locales/crowdin/fi.yml +++ b/modules/backlogs/config/locales/crowdin/fi.yml @@ -83,12 +83,21 @@ fi: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ fi: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ fi: label_backlogs_unconfigured: "Et ole määrittänyt vielä työjonoja. Siirry menuun %{administration} > %{plugins}, sitten klikkaa %{configure} linkkiä tälle liitännäiselle. Kun olet määrittänyt kentät, tule takaisin tälle sivulle aloittaaksesi työkalun käytön." label_blocks_ids: "Estettyjen työpakettien tunnukset" label_column_in_backlog: "Sarake työjonossa" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Alas" label_points_burn_up: "Ylös" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprintin esteet" label_sprint_new: "New sprint" label_task_board: "Tehtävätaulu" diff --git a/modules/backlogs/config/locales/crowdin/fil.yml b/modules/backlogs/config/locales/crowdin/fil.yml index d2d8fbde51b..ce0ac497154 100644 --- a/modules/backlogs/config/locales/crowdin/fil.yml +++ b/modules/backlogs/config/locales/crowdin/fil.yml @@ -83,12 +83,21 @@ fil: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ fil: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ fil: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "Mga ID ng naka-block na mga pakete sa gumagawa" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index 5f9f4ab47b7..b0ca3a3eab3 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -83,12 +83,21 @@ fr: backlog_component: blankslate_title: "%{name} est vide" blankslate_description: "Aucun élément n'a encore été planifié. Faites glisser les éléments ici pour les ajouter." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Réduire/développer %{name}" label_story_count: zero: "Aucune histoire dans le backlog" one: "%{count} histoire dans le backlog" other: "%{count} histoires dans le backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Actions dans le backlog" action_menu: @@ -99,6 +108,14 @@ fr: burndown_chart: "Graphique burndown" wiki: "Wiki" properties: "Propriétés" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Déplacer %{name}" story_menu_component: @@ -126,8 +143,10 @@ fr: label_backlogs_unconfigured: "Vous n'avez pas encore configuré Backlogs. Veuillez vous rendre dans %{administration} > %{plugins}, puis cliquer sur le lien %{configure} pour ce plugin. Une fois que vous avez défini les champs, revenez sur cette page pour commencer à utiliser l'outil." label_blocks_ids: "ID des lots de travaux bloqués" label_column_in_backlog: "Colonne dans le backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Vers le bas" label_points_burn_up: "Vers le haut" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Obstacles de sprint" label_sprint_new: "Nouveau sprint" label_task_board: "Tableau des tâches" diff --git a/modules/backlogs/config/locales/crowdin/he.yml b/modules/backlogs/config/locales/crowdin/he.yml index eb56d12ac73..25c02876e0e 100644 --- a/modules/backlogs/config/locales/crowdin/he.yml +++ b/modules/backlogs/config/locales/crowdin/he.yml @@ -87,12 +87,21 @@ he: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -103,6 +112,14 @@ he: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -130,8 +147,10 @@ he: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "המזהים של חבילות עבודה חסומים" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/hi.yml b/modules/backlogs/config/locales/crowdin/hi.yml index 74e073e254d..a5ad913b84f 100644 --- a/modules/backlogs/config/locales/crowdin/hi.yml +++ b/modules/backlogs/config/locales/crowdin/hi.yml @@ -83,12 +83,21 @@ hi: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ hi: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ hi: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/hr.yml b/modules/backlogs/config/locales/crowdin/hr.yml index 1e50067fe6d..025b3adcdb4 100644 --- a/modules/backlogs/config/locales/crowdin/hr.yml +++ b/modules/backlogs/config/locales/crowdin/hr.yml @@ -85,12 +85,21 @@ hr: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -101,6 +110,14 @@ hr: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -128,8 +145,10 @@ hr: label_backlogs_unconfigured: "Niste još konfigurirali Backlog. Za konfiguraciju odaberite %{administration}>%{plugins}, zatim %{configure} Backlog dodatak. Nakon što ste uredili potrebna polja, vratite se na ovu stranicu da biste započeli s korištenjem ovog alata." label_blocks_ids: "ID blokiranih radnih paketa" label_column_in_backlog: "Stupac u backlogu" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Dolje" label_points_burn_up: "Gore" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Prepreke perioda razvoja" label_sprint_new: "New sprint" label_task_board: "Upravitelj zadatcima" diff --git a/modules/backlogs/config/locales/crowdin/hu.yml b/modules/backlogs/config/locales/crowdin/hu.yml index ab4df893e01..47f6f76d91e 100644 --- a/modules/backlogs/config/locales/crowdin/hu.yml +++ b/modules/backlogs/config/locales/crowdin/hu.yml @@ -83,12 +83,21 @@ hu: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ hu: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ hu: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Le" label_points_burn_up: "Fel" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint akadályai" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/id.yml b/modules/backlogs/config/locales/crowdin/id.yml index dd7ef7600b8..f2ee1742832 100644 --- a/modules/backlogs/config/locales/crowdin/id.yml +++ b/modules/backlogs/config/locales/crowdin/id.yml @@ -81,12 +81,21 @@ id: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -97,6 +106,14 @@ id: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -124,8 +141,10 @@ id: label_backlogs_unconfigured: "Anda belum mengkonfigurasi Backlogs. Silakan masuk ke %{administration}> %{plugins}, lalu klik pada link %{configure} untuk plugin ini. Setelah Anda menyetel bidang, kembali ke halaman ini untuk mulai menggunakan alat ini." label_blocks_ids: "ID dari paket pekerjaan yang diblokir" label_column_in_backlog: "Kolom di backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Menurun" label_points_burn_up: "Naik" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Hanbatan kekuatan" label_sprint_new: "New sprint" label_task_board: "Papan tugas" diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml index 0bc0a7cb99c..880e49c1d2f 100644 --- a/modules/backlogs/config/locales/crowdin/it.yml +++ b/modules/backlogs/config/locales/crowdin/it.yml @@ -83,12 +83,21 @@ it: backlog_component: blankslate_title: "%{name} è vuoto" blankslate_description: "Nessun elemento pianificato ancora. Trascina gli elementi qui per aggiungerli." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Comprimi/Espandi %{name}" label_story_count: zero: "Nessuna story nel backlog" one: "%{count} story nel backlog" other: "%{count} story nel backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Azioni nel backlog" action_menu: @@ -99,6 +108,14 @@ it: burndown_chart: "Grafico Burndown" wiki: "Wiki" properties: "Proprietà" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Sposta %{name}" story_menu_component: @@ -126,8 +143,10 @@ it: label_backlogs_unconfigured: "Non hai ancora configurato i Backlog. Vai su %{administration} > %{plugins}, quindi fai clic sul link %{configure} per il plugin. Dopo aver impostato i campi, torna su questa pagina per iniziare a utilizzare lo strumento." label_blocks_ids: "ID dei pacchetti di lavoro bloccati" label_column_in_backlog: "Colonna nel backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Verso il basso" label_points_burn_up: "Verso l'alto" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Impedimenti allo sprint" label_sprint_new: "Nuovo sprint" label_task_board: "Pannello delle attività" diff --git a/modules/backlogs/config/locales/crowdin/ja.yml b/modules/backlogs/config/locales/crowdin/ja.yml index 674f36c4984..ed63a9f9f33 100644 --- a/modules/backlogs/config/locales/crowdin/ja.yml +++ b/modules/backlogs/config/locales/crowdin/ja.yml @@ -81,12 +81,21 @@ ja: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -97,6 +106,14 @@ ja: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -124,8 +141,10 @@ ja: label_backlogs_unconfigured: "バックログは未設定です。%{administration} > %{plugins}をアクセスして、このプラグインの%{configure}リンクをクリックしてください。フィールドを設定した後、このページに戻ってツールを使用開始してください。" label_blocks_ids: "ブロックされているワークパッケージのID" label_column_in_backlog: "バックログの列" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "ダウン" label_points_burn_up: "アップ" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "スプリント障害事項" label_sprint_new: "New sprint" label_task_board: "かんばん" diff --git a/modules/backlogs/config/locales/crowdin/ka.yml b/modules/backlogs/config/locales/crowdin/ka.yml index 8c1392c756f..8b3f18a203e 100644 --- a/modules/backlogs/config/locales/crowdin/ka.yml +++ b/modules/backlogs/config/locales/crowdin/ka.yml @@ -83,12 +83,21 @@ ka: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ ka: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ ka: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "ქვემოთ" label_points_burn_up: "ზემოთ" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "ამოცანების დაფა" diff --git a/modules/backlogs/config/locales/crowdin/kk.yml b/modules/backlogs/config/locales/crowdin/kk.yml index 7a3cd70aadb..11946d9011a 100644 --- a/modules/backlogs/config/locales/crowdin/kk.yml +++ b/modules/backlogs/config/locales/crowdin/kk.yml @@ -83,12 +83,21 @@ kk: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ kk: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ kk: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index af6250238d6..d78afe60f47 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -81,12 +81,21 @@ ko: backlog_component: blankslate_title: "%{name}이(가) 비어 있습니다" blankslate_description: "아직 계획된 항목이 없습니다. 항목을 추가하려면 여기로 드래그하세요." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "%{name} 축소/확장" label_story_count: zero: "백로그에 스토리 없음" one: "백로그의 %{count}개 스토리" other: "백로그의 %{count}개 스토리" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "백로그 작업" action_menu: @@ -97,6 +106,14 @@ ko: burndown_chart: "번다운 차트" wiki: "위키" properties: "속성" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "%{name} 이동" story_menu_component: @@ -124,8 +141,10 @@ ko: label_backlogs_unconfigured: "백로그를 아직 구성하지 않았습니다. %{administration} > %{plugins}(으)로 이동한 다음 이 플러그인의 %{configure} 링크를 클릭하세요. 필드를 설정한 후 이 페이지로 돌아가서 해당 도구 사용을 시작하세요." label_blocks_ids: "차단된 작업 패키지의 ID" label_column_in_backlog: "백로그의 열" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "아래" label_points_burn_up: "위" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "스프린트 제한" label_sprint_new: "새로운 스프린트" label_task_board: "작업 보드" diff --git a/modules/backlogs/config/locales/crowdin/lt.yml b/modules/backlogs/config/locales/crowdin/lt.yml index 33aa6c34663..11960b470eb 100644 --- a/modules/backlogs/config/locales/crowdin/lt.yml +++ b/modules/backlogs/config/locales/crowdin/lt.yml @@ -87,12 +87,21 @@ lt: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -103,6 +112,14 @@ lt: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -130,8 +147,10 @@ lt: label_backlogs_unconfigured: "Jūs dar nesukonfigūravote Darbų sąrašų. Prašome eiti į %{administration} > %{plugins}, tada nuspausti ant %{configure} nuorodos šiam įskiepiui. Kai nustatysite laukus, grįžkite čia ir pradėkite naudoti instrumentą." label_blocks_ids: "Blokuotų darbų paketų ID reikšmės" label_column_in_backlog: "Stulpelis darbų sąraše" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Žemyn" label_points_burn_up: "Aukštyn" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprinto trukdžiai" label_sprint_new: "New sprint" label_task_board: "Užduočių lenta" diff --git a/modules/backlogs/config/locales/crowdin/lv.yml b/modules/backlogs/config/locales/crowdin/lv.yml index b458568e439..eee7672958f 100644 --- a/modules/backlogs/config/locales/crowdin/lv.yml +++ b/modules/backlogs/config/locales/crowdin/lv.yml @@ -85,12 +85,21 @@ lv: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -101,6 +110,14 @@ lv: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -128,8 +145,10 @@ lv: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Atlikušo darbu backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Lejup" label_points_burn_up: "Augšup" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprinta šķēršļi" label_sprint_new: "New sprint" label_task_board: "Pieteikumu tāfele" diff --git a/modules/backlogs/config/locales/crowdin/mn.yml b/modules/backlogs/config/locales/crowdin/mn.yml index 17c1eee55ba..272e06455e7 100644 --- a/modules/backlogs/config/locales/crowdin/mn.yml +++ b/modules/backlogs/config/locales/crowdin/mn.yml @@ -83,12 +83,21 @@ mn: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ mn: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ mn: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/ms.yml b/modules/backlogs/config/locales/crowdin/ms.yml index 8147f33eb62..96c39f6c261 100644 --- a/modules/backlogs/config/locales/crowdin/ms.yml +++ b/modules/backlogs/config/locales/crowdin/ms.yml @@ -81,12 +81,21 @@ ms: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -97,6 +106,14 @@ ms: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -124,8 +141,10 @@ ms: label_backlogs_unconfigured: "Anda masih belum mengkonfigurasi tunggakan. Sila pergi ke %{administration} > %{plugins}, kemudian klik pautan %{configure} untuk plugin ini. Setelah anda menetapkan ruangan, kembali ke halaman ini untuk mula menggunakan alat ini." label_blocks_ids: "ID pakej kerja yang disekat" label_column_in_backlog: "Kolum dalam tunggakan" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Bawah" label_points_burn_up: "Atas" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Halangan Pecutan" label_sprint_new: "New sprint" label_task_board: "Papan tugasan" diff --git a/modules/backlogs/config/locales/crowdin/ne.yml b/modules/backlogs/config/locales/crowdin/ne.yml index 27bcdc9112b..b0f93c354ff 100644 --- a/modules/backlogs/config/locales/crowdin/ne.yml +++ b/modules/backlogs/config/locales/crowdin/ne.yml @@ -83,12 +83,21 @@ ne: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ ne: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ ne: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml index c3bb46d19e3..441ca57beb9 100644 --- a/modules/backlogs/config/locales/crowdin/nl.yml +++ b/modules/backlogs/config/locales/crowdin/nl.yml @@ -83,12 +83,21 @@ nl: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ nl: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ nl: label_backlogs_unconfigured: "Je hebt Backlogs nog niet geconfigureerd. Ga naar %{administration} >%{plugins}, en klik op de %{configure} voor deze plug-in. Kom hier terug nadat u de velden hebt geconfigureerd." label_blocks_ids: "ID's van geblokkeerde werkpakketten" label_column_in_backlog: "Kolom in achterstand" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Omlaag" label_points_burn_up: "Omhoog" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Obstakels" label_sprint_new: "New sprint" label_task_board: "Taakbord" diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index c7fbbae7275..73a3c716987 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -83,12 +83,21 @@ backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ label_backlogs_unconfigured: "Du har ikke konfigurert Forsinkelser enda. Gå til %{administration} > %{plugins}og klikk deretter på %{configure} lenken for denne utvidelsen. Når du har angitt felter, går du tilbake til denne siden for å begynne å bruke verktøyet." label_blocks_ids: "ID'er for blokkerte arbeidspakker" label_column_in_backlog: "Kolonne i forsinkelse" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Ned" label_points_burn_up: "Opp" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Hindring i etappe" label_sprint_new: "New sprint" label_task_board: "Oppgavetavle" diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index 05a52cdafcc..e83f6ad6dbe 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -87,12 +87,21 @@ pl: backlog_component: blankslate_title: "Element %{name} jest pusty" blankslate_description: "Nie zaplanowano jeszcze żadnych punktów. Przeciągnij punkty tutaj, aby je dodać." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Zwiń/rozwiń %{name}" label_story_count: zero: "Brak historii w backlogu" one: "%{count} historia w backlogu" other: "Liczba historii w backlogu: %{count}" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Działania backlogu" action_menu: @@ -103,6 +112,14 @@ pl: burndown_chart: "Wykres spalania (burndown)" wiki: "Wiki" properties: "Właściwości" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Przenieś %{name}" story_menu_component: @@ -130,8 +147,10 @@ pl: label_backlogs_unconfigured: "Jeszcze nie skonfigurowałeś backlogów. Przejdź do %{administration} > %{plugins}, następnie kliknij link %{configure} dla otrzymania tego dodatku. Po ustawieniu pól, wróć na tę stronę, aby zacząć korzystanie z narzędzia." label_blocks_ids: "Identyfikatory zablokowanych pakietów prac" label_column_in_backlog: "Kolumna w backlogu" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "W dół" label_points_burn_up: "W górę" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Przeszkody sprintu" label_sprint_new: "Nowy sprint" label_task_board: "Panel zadań" diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index 261aeec5670..075fa92e5d9 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -83,12 +83,21 @@ pt-BR: backlog_component: blankslate_title: "%{name} está vazio" blankslate_description: "Ainda não há itens planejados. Arraste os itens para este espaço para adicioná-los." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Recolher/Expandir %{name}" label_story_count: zero: "Nenhuma história no backlog" one: "%{count} história no backlog" other: "%{count} histórias no backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Ações do backlog" action_menu: @@ -99,6 +108,14 @@ pt-BR: burndown_chart: "Gráfico de burndown" wiki: "Wiki" properties: "Propriedades" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Mover %{name}" story_menu_component: @@ -126,8 +143,10 @@ pt-BR: label_backlogs_unconfigured: "Você ainda não configurou o Backlog. Por favor, vá para %{administration} > %{plugins} e, em seguida, clique em %{configure} o link para este plugin. Uma vez que você definiu os campos, volte a esta página para começar a usar a ferramenta." label_blocks_ids: "IDs dos pacotes de trabalho bloqueados" label_column_in_backlog: "Coluna no backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Abaixo" label_points_burn_up: "Acima" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Impedimentos da Sprint" label_sprint_new: "Nova sprint" label_task_board: "Quadro de tarefas" diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml index f35a747f3fa..404abc6e518 100644 --- a/modules/backlogs/config/locales/crowdin/pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml @@ -83,12 +83,21 @@ pt-PT: backlog_component: blankslate_title: "%{name} está vazio" blankslate_description: "Ainda não existem elementos planeados. Arraste elementos para aqui para os adicionar." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Recolher/expandir %{name}" label_story_count: zero: "Não há histórias no backlog" one: "%{count} história no backlog" other: "%{count} histórias no backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Ações de backlog" action_menu: @@ -99,6 +108,14 @@ pt-PT: burndown_chart: "Gráfico de burndown" wiki: "Wiki" properties: "Propriedades" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Mover %{name}" story_menu_component: @@ -126,8 +143,10 @@ pt-PT: label_backlogs_unconfigured: "Ainda não configurou os backlogs. Vá a %{administration} > %{plugins}, e depois clique no link %{configure} para este plugin. Após definir os campos, volte a esta página para começar a utilizar a ferramenta." label_blocks_ids: "Identificações de pacotes de trabalho bloqueados" label_column_in_backlog: "Coluna no backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Abaixo" label_points_burn_up: "Acima" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Impedimentos de Sprint" label_sprint_new: "Novo sprint" label_task_board: "Quadro de tarefas" diff --git a/modules/backlogs/config/locales/crowdin/ro.yml b/modules/backlogs/config/locales/crowdin/ro.yml index 631f4e9115b..32ca7c8f9dc 100644 --- a/modules/backlogs/config/locales/crowdin/ro.yml +++ b/modules/backlogs/config/locales/crowdin/ro.yml @@ -85,12 +85,21 @@ ro: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -101,6 +110,14 @@ ro: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -128,8 +145,10 @@ ro: label_backlogs_unconfigured: "Nu ai configurat încă Backlogs. Te rog să mergi la %{administration} > %{plugins}, apoi dă clic pe link-ul %{configure} pentru acest plugin. După ce ai configurat câmpurile, revino la această pagină pentru a începe să utilizezi instrumentul." label_blocks_ids: "ID-urile pachetelor de lucru blocate" label_column_in_backlog: "Coloană în backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Jos" label_points_burn_up: "Sus" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Impedimentele Sprint" label_sprint_new: "New sprint" label_task_board: "Tablă de sarcini" diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index 869d3c7f0a2..ec436209df3 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -87,12 +87,21 @@ ru: backlog_component: blankslate_title: "%{name} пустой" blankslate_description: "Пока ничего не запланировано. Перетащите элементы сюда, чтобы добавить их." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Свернуть/Развернуть %{name}" label_story_count: zero: "Нет историй в бэклоге" one: "%{count} история в бэклоге" other: "%{count} историй в бэклоге" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Действия в рамках бэклога" action_menu: @@ -103,6 +112,14 @@ ru: burndown_chart: "Сводная таблица" wiki: "Wiki" properties: "Свойства" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Переместить %{name}" story_menu_component: @@ -130,8 +147,10 @@ ru: label_backlogs_unconfigured: "Вы еще не настроили Невыполненные работы. Перейдите на страницу %{administration} > %{plugins}, а затем нажмите на ссылку %{configure} для получения этого дополнения. После того как вы настроите поля, возвратитесь на эту страницу, чтобы начать пользоваться инструментом." label_blocks_ids: "Идентификаторы заблокированных рабочих пакетов" label_column_in_backlog: "Колонка в бэклоге" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Вниз" label_points_burn_up: "Вверх" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Препятствия спринта" label_sprint_new: "Новый спринт" label_task_board: "Панель задач" diff --git a/modules/backlogs/config/locales/crowdin/rw.yml b/modules/backlogs/config/locales/crowdin/rw.yml index 8f8d4c09528..84977e8f10f 100644 --- a/modules/backlogs/config/locales/crowdin/rw.yml +++ b/modules/backlogs/config/locales/crowdin/rw.yml @@ -83,12 +83,21 @@ rw: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ rw: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ rw: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/si.yml b/modules/backlogs/config/locales/crowdin/si.yml index 710dc1f7777..af720b892d4 100644 --- a/modules/backlogs/config/locales/crowdin/si.yml +++ b/modules/backlogs/config/locales/crowdin/si.yml @@ -83,12 +83,21 @@ si: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ si: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ si: label_backlogs_unconfigured: "ඔබ තවමත් Backlogs වින්යාස කර නැත. කරුණාකර යන්න %{administration} > %{plugins}, ඉන්පසු මෙම ප්ලගිනය සඳහා %{configure} සබැඳිය ක්ලික් කරන්න. ඔබ ක්ෂේත්ර සකස් කළ පසු, මෙවලම භාවිතා කිරීම ආරම්භ කිරීමට මෙම පිටුවට නැවත එන්න." label_blocks_ids: "අවහිර කරන ලද වැඩ පැකේජ වල IDS" label_column_in_backlog: "පසුබිම තුළ තීරුව" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "පහළට" label_points_burn_up: "ඉහළට" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "ස්ප්රින්ට් බාධාවන්" label_sprint_new: "New sprint" label_task_board: "කාර්ය මණ්ඩලය" diff --git a/modules/backlogs/config/locales/crowdin/sk.yml b/modules/backlogs/config/locales/crowdin/sk.yml index 582de6ef58e..9cbf4ebee8b 100644 --- a/modules/backlogs/config/locales/crowdin/sk.yml +++ b/modules/backlogs/config/locales/crowdin/sk.yml @@ -87,12 +87,21 @@ sk: backlog_component: blankslate_title: "%{name} je prázdne" blankslate_description: "Zatiaľ nie sú plánované žiadne položky. Ak chcete pridať položky, potiahnite ich sem." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Zbaliť/rozšíriť %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -103,6 +112,14 @@ sk: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -130,8 +147,10 @@ sk: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "Identifikátory blokovaných pracovných balíkov" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Nadol" label_points_burn_up: "Nahor" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/sl.yml b/modules/backlogs/config/locales/crowdin/sl.yml index 7f31c3f53a8..012cd93ea8e 100644 --- a/modules/backlogs/config/locales/crowdin/sl.yml +++ b/modules/backlogs/config/locales/crowdin/sl.yml @@ -87,12 +87,21 @@ sl: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -103,6 +112,14 @@ sl: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -130,8 +147,10 @@ sl: label_backlogs_unconfigured: "Zaostankov še niste konfigurirali. Pojdite na %{administration} > %{plugins}, nato kliknite povezavo %{configure} za ta vtičnik. Ko nastavite polja, se vrnite na to stran, da začnete uporabljati orodje." label_blocks_ids: "ID blokiranih delovnih paketov" label_column_in_backlog: "Stolpec v zaostanku" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Navzdol" label_points_burn_up: "Navzgor" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Motnje sprinta" label_sprint_new: "New sprint" label_task_board: "Tabla opravil" diff --git a/modules/backlogs/config/locales/crowdin/sr.yml b/modules/backlogs/config/locales/crowdin/sr.yml index 4108f9cd9ce..be7866c9dd0 100644 --- a/modules/backlogs/config/locales/crowdin/sr.yml +++ b/modules/backlogs/config/locales/crowdin/sr.yml @@ -85,12 +85,21 @@ sr: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -101,6 +110,14 @@ sr: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -128,8 +145,10 @@ sr: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/sv.yml b/modules/backlogs/config/locales/crowdin/sv.yml index 954a85a3d5d..f0c7feab075 100644 --- a/modules/backlogs/config/locales/crowdin/sv.yml +++ b/modules/backlogs/config/locales/crowdin/sv.yml @@ -83,12 +83,21 @@ sv: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ sv: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ sv: label_backlogs_unconfigured: "Du har inte konfigurerat backloggar ännu. Gå till %{administration} > %{plugins}, klicka på %{configure} länken för denna plugin. När du har ställt in fälten, kan du komma tillbaka till denna sida för att börja använda verktyget." label_blocks_ids: "ID:n för blockerade arbetspaket" label_column_in_backlog: "Kolumn i backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Ner" label_points_burn_up: "Upp" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint hinder" label_sprint_new: "New sprint" label_task_board: "Aktivitetstavla" diff --git a/modules/backlogs/config/locales/crowdin/th.yml b/modules/backlogs/config/locales/crowdin/th.yml index 2bac72be0f4..4b8ca25454a 100644 --- a/modules/backlogs/config/locales/crowdin/th.yml +++ b/modules/backlogs/config/locales/crowdin/th.yml @@ -81,12 +81,21 @@ th: backlog_component: blankslate_title: "%{name} ว่างอยู่" blankslate_description: "ยังไม่มีรายการที่วางแผนไว้ ลากรายการมาวางที่นี่เพื่อเพิ่ม" + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "พับ/ขยาย %{name}" label_story_count: zero: "ไม่มีสตอรี่ในรายการงานคงค้าง" one: "%{count} สตอรี่ในรายการงานคงค้าง" other: "%{count} สตอรี่ในรายการงานคงค้าง" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "การจัดการรายการงานคงค้าง" action_menu: @@ -97,6 +106,14 @@ th: burndown_chart: "กราฟติดตามงาน (Burndown)" wiki: "วิกิ" properties: "คุณสมบัติ" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "ย้าย %{name}" story_menu_component: @@ -124,8 +141,10 @@ th: label_backlogs_unconfigured: "คุณยังไม่ได้ตั้งค่ารายการงานคงค้าง กรุณาไปที่ %{administration} > %{plugins} จากนั้นคลิกที่ลิงก์ %{configure} ของปลั๊กอินนี้ เมื่อคุณตั้งค่าฟิลด์ต่าง ๆ เรียบร้อยแล้ว ให้กลับมาที่หน้านี้เพื่อเริ่มใช้งานเครื่องมือ" label_blocks_ids: "Id ของแพคเกจการทำงานที่ถูกบล็อก" label_column_in_backlog: "คอลัมน์ในรายการงานคงค้าง" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "ลง" label_points_burn_up: "ขึ้น" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "อุปสรรคของสปรินท์" label_sprint_new: "สปรินท์ใหม่" label_task_board: "กระดานงาน" diff --git a/modules/backlogs/config/locales/crowdin/tr.yml b/modules/backlogs/config/locales/crowdin/tr.yml index 93e912f1a7a..d05622f4299 100644 --- a/modules/backlogs/config/locales/crowdin/tr.yml +++ b/modules/backlogs/config/locales/crowdin/tr.yml @@ -83,12 +83,21 @@ tr: backlog_component: blankslate_title: "%{name} boş" blankslate_description: "Henüz planlanan öğe yok. Eklemek için öğeleri buraya sürükleyin." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Daralt/Genişlet %{name}" label_story_count: zero: "Kuyrukta hikaye yok" one: "%{count} kuyruktaki hikaye" other: "%{count} kuyruktaki hikayeler" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Kuyruk eylemleri" action_menu: @@ -99,6 +108,14 @@ tr: burndown_chart: "Burndown grafiği" wiki: "Wiki" properties: "Özellikler" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Taşı %{name}" story_menu_component: @@ -126,8 +143,10 @@ tr: label_backlogs_unconfigured: "Backlog'ları henüz yapılandırmadınız. Lütfen% %{administration}> %{plugins} adresine gidin, ardından bu eklenti için %{configure} bağlantısını tıklayın. Alanları belirledikten sonra, aracı kullanmaya başlamak için bu sayfaya geri dönün." label_blocks_ids: "Bloke iş paketleri kimlikleri" label_column_in_backlog: "Sütununda birikim var" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Aşağı" label_points_burn_up: "Yukarı" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Engelleri" label_sprint_new: "New sprint" label_task_board: "Görev panosu" diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml index f0b57ebd599..71f23f836d5 100644 --- a/modules/backlogs/config/locales/crowdin/uk.yml +++ b/modules/backlogs/config/locales/crowdin/uk.yml @@ -87,12 +87,21 @@ uk: backlog_component: blankslate_title: "%{name} нічого не містить" blankslate_description: "Ще нічого не заплановано. Перетягніть елементи сюди, щоб додати їх." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Згорнути/розгорнути %{name}" label_story_count: zero: "Немає історій у беклозі" one: "%{count} історія в беклозі" other: "%{count} історії(-й) у беклозі" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Дії беклогу" action_menu: @@ -103,6 +112,14 @@ uk: burndown_chart: "Діаграма згорання завдань" wiki: "Wiki" properties: "Властивості" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Перемістити %{name}" story_menu_component: @@ -130,8 +147,10 @@ uk: label_backlogs_unconfigured: "Ви ще не настроїли Backlogs. Перейдіть на %{administration}>%{plugins}, потім натисніть посилання %{configure} для цього плагіна. Після того, як ви встановите поля, поверніться на цю сторінку, щоб розпочати використання інструмента." label_blocks_ids: "Ідентифікатори заблокованих робочих пакетів" label_column_in_backlog: "Стовпець у backlog-у" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Вниз" label_points_burn_up: "Вгору" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Перешкоди спринту" label_sprint_new: "Новий спринт" label_task_board: "Дошка завдань" diff --git a/modules/backlogs/config/locales/crowdin/uz.yml b/modules/backlogs/config/locales/crowdin/uz.yml index 76829c5a58b..bbe87465454 100644 --- a/modules/backlogs/config/locales/crowdin/uz.yml +++ b/modules/backlogs/config/locales/crowdin/uz.yml @@ -83,12 +83,21 @@ uz: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -99,6 +108,14 @@ uz: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -126,8 +143,10 @@ uz: label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." label_blocks_ids: "IDs of blocked work packages" label_column_in_backlog: "Column in backlog" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Down" label_points_burn_up: "Up" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Sprint Impediments" label_sprint_new: "New sprint" label_task_board: "Task board" diff --git a/modules/backlogs/config/locales/crowdin/vi.yml b/modules/backlogs/config/locales/crowdin/vi.yml index a670ec2b207..27dbb107171 100644 --- a/modules/backlogs/config/locales/crowdin/vi.yml +++ b/modules/backlogs/config/locales/crowdin/vi.yml @@ -81,12 +81,21 @@ vi: backlog_component: blankslate_title: "%{name} is empty" blankslate_description: "No items planned yet. Drag items here to add them." + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "Collapse/Expand %{name}" label_story_count: zero: "No stories in backlog" one: "%{count} story in backlog" other: "%{count} stories in backlog" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "Backlog actions" action_menu: @@ -97,6 +106,14 @@ vi: burndown_chart: "Burndown chart" wiki: "Wiki" properties: "Properties" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "Move %{name}" story_menu_component: @@ -124,8 +141,10 @@ vi: label_backlogs_unconfigured: "Bạn chưa cấu hình Bảng nhiệm vụ tồn đọng. Vui lòng vào %{administration} > %{plugins}, sau đó nhấp vào liên kết %{configure} cho gắn thêm này. Khi bạn đã thiết lập các trường, quay lại trang này để bắt đầu sử dụng công cụ." label_blocks_ids: "ID của các work package bị chặn" label_column_in_backlog: "Cột tồn đọng" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "Xuống" label_points_burn_up: "lên" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "Trở ngại nước rút" label_sprint_new: "New sprint" label_task_board: "Bảng nhiệm vụ" diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index d06c965edbd..2803dea6486 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -81,12 +81,21 @@ zh-CN: backlog_component: blankslate_title: "%{name} 为空" blankslate_description: "尚未计划条目。请将条目拖到此处以添加。" + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "折叠/展开 %{name}" label_story_count: zero: "积压工作中没有故事" one: "积压工作中有 %{count} 个故事" other: "积压工作中有 %{count} 个故事" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "积压工作操作" action_menu: @@ -97,6 +106,14 @@ zh-CN: burndown_chart: "燃尽图" wiki: "维基" properties: "属性" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "移动 %{name}" story_menu_component: @@ -124,8 +141,10 @@ zh-CN: label_backlogs_unconfigured: "您尚未配置待办清单。请转到“%{administration} > %{plugins}”,然后单击此插件的 %{configure} 链接。设置字段后,返回到此页面开始使用工具。" label_blocks_ids: "被阻止的工作包 ID" label_column_in_backlog: "待办清单中的列" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "减少" label_points_burn_up: "增加" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "冲刺 (sprint) 障碍" label_sprint_new: "新冲刺" label_task_board: "任务板" diff --git a/modules/backlogs/config/locales/crowdin/zh-TW.yml b/modules/backlogs/config/locales/crowdin/zh-TW.yml index 8f9ba7fc53f..b189f405e3d 100644 --- a/modules/backlogs/config/locales/crowdin/zh-TW.yml +++ b/modules/backlogs/config/locales/crowdin/zh-TW.yml @@ -81,12 +81,21 @@ zh-TW: backlog_component: blankslate_title: "%{name} 為空" blankslate_description: "尚未規劃任何項目。將項目拖曳至此即可新增。" + sprint_component: + blankslate_title: "%{name} is empty" + blankslate_description: "No items planned yet. Drag items here to add them." backlog_header_component: label_toggle_backlog: "折疊/展開 %{name}" label_story_count: zero: "目前沒有待辦故事" one: "待辦清單中有 %{count} 個故事" other: "待辦清單中有 %{count} 個故事" + sprint_header_component: + label_toggle_backlog: "Collapse/Expand %{name}" + label_story_count: + zero: "No stories in sprint" + one: "%{count} story in sprint" + other: "%{count} stories in sprint" backlog_menu_component: label_actions: "待辦清單操作" action_menu: @@ -97,6 +106,14 @@ zh-TW: burndown_chart: "燃盡圖" wiki: "維基" properties: "屬性" + sprint_menu_component: + label_actions: "Sprint actions" + action_menu: + edit_sprint: "Edit sprint" + new_story: "New story" + stories_tasks: "Stories/Tasks" + task_board: "Task board" + burndown_chart: "Burndown chart" story_component: label_drag_story: "移動 %{name}" story_menu_component: @@ -124,8 +141,10 @@ zh-TW: label_backlogs_unconfigured: "您尚未設定待辦事項。請前往 '%{administration} -> %{plugins}' 然後在 %{configure} 連結上按一下。當你設定欄位後,再返回這個頁面使用這個工具。" label_blocks_ids: "被禁止的工作套件 IDs" label_column_in_backlog: "待辦事項的欄位" + label_used_as_backlog: "Used as backlog" label_points_burn_down: "減少" label_points_burn_up: "增加" + label_sprint_edit: "Edit sprint" label_sprint_impediments: "進度阻礙" label_sprint_new: "New sprint" label_task_board: "任務看板" diff --git a/modules/meeting/config/locales/crowdin/uk.yml b/modules/meeting/config/locales/crowdin/uk.yml index 1fde93aaf69..1f113933574 100644 --- a/modules/meeting/config/locales/crowdin/uk.yml +++ b/modules/meeting/config/locales/crowdin/uk.yml @@ -629,7 +629,7 @@ uk: text_meeting_draft_banner: "Зараз ви працюєте в режимі чернетки: оновлення або запрошення з календаря не надсилатимуться щодо цієї наради, навіть якщо змінити її дані або додати/видалити учасників." text_onetime_meeting_template_banner: "Ви редагуєте шаблон наради. Цей шаблон можна використовувати для створення одноразових нарад із заздалегідь визначеним порядком денним. Зміни не вплинуть на вже створені наради." text_onetime_meeting_template_empty_heading: "Цей шаблон наради порожній" - text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." + text_onetime_meeting_template_empty_description: "Сюди можна додавати пункти порядку денного, розділи й вкладення. Їх буде включено в кожну зустріч, створену з використанням цього шаблону." text_exit_draft_mode_dialog_title: "Відкрити цю нараду й надіслати запрошення?" text_exit_draft_mode_dialog_subtitle: "Запланувавши нараду, не можна повернутися в режим чернетки." text_exit_draft_mode_dialog_template_title: "Відкрити першу нараду цієї серії?" From 07b9e2f5d1709eccbc3ceac0efa92b90dbf7f2c7 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 9 Mar 2026 15:02:50 +0100 Subject: [PATCH 218/334] Readd Stimulus value that was mistakenly removed --- .../backlogs/app/views/rb_master_backlogs/agile_index.html.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb index cbf6666d35b..16194aa9c77 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb @@ -30,6 +30,7 @@ See COPYRIGHT and LICENSE files for more details. <% html_title t(:label_backlogs) %> <% content_controller "backlogs", + "backlogs-list-url-value": backlogs_project_backlogs_path(@project), "backlogs-backlogs--story-outlet": "li[data-story]" %> <% content_for :content_header do %> From 2ec380fa865e9300ed16e5bbc94954958fdd0744 Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Mon, 19 Jan 2026 17:04:03 -0300 Subject: [PATCH 219/334] [#70778] Primerize Backlogs Project Settings https://community.openproject.org/work_packages/70778 --- .../projects/settings/backlogs_controller.rb | 11 +-- .../settings/backlogs_settings_form.rb} | 65 +++++++------ .../projects/settings/backlogs/show.html.erb | 92 ++++++------------ modules/backlogs/config/locales/en.yml | 1 + .../projects/backlogs_settings_spec.rb | 96 +++++++++++++++++++ 5 files changed, 163 insertions(+), 102 deletions(-) rename modules/backlogs/{spec/features/resolved_status_spec.rb => app/forms/projects/settings/backlogs_settings_form.rb} (54%) create mode 100644 modules/backlogs/spec/features/projects/backlogs_settings_spec.rb diff --git a/modules/backlogs/app/controllers/projects/settings/backlogs_controller.rb b/modules/backlogs/app/controllers/projects/settings/backlogs_controller.rb index b53f8be524b..a59b335f055 100644 --- a/modules/backlogs/app/controllers/projects/settings/backlogs_controller.rb +++ b/modules/backlogs/app/controllers/projects/settings/backlogs_controller.rb @@ -31,17 +31,10 @@ class Projects::Settings::BacklogsController < Projects::SettingsController menu_item :settings_backlogs - def show - @statuses_done_for_project = @project.done_statuses.pluck(:id) - end + def show; end def update - selected_statuses = (params[:statuses] || []).filter_map do |work_package_status| - Status.find(work_package_status[:status_id].to_i) - end - - @project.done_statuses = selected_statuses - @project.save! + @project.update!(params.expect(project: { done_status_ids: [] })) flash[:notice] = I18n.t(:notice_successful_update) diff --git a/modules/backlogs/spec/features/resolved_status_spec.rb b/modules/backlogs/app/forms/projects/settings/backlogs_settings_form.rb similarity index 54% rename from modules/backlogs/spec/features/resolved_status_spec.rb rename to modules/backlogs/app/forms/projects/settings/backlogs_settings_form.rb index e2dd860eff3..316380b7529 100644 --- a/modules/backlogs/spec/features/resolved_status_spec.rb +++ b/modules/backlogs/app/forms/projects/settings/backlogs_settings_form.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + #-- copyright # OpenProject is an open source project management software. # Copyright (C) the OpenProject GmbH @@ -26,38 +28,43 @@ # See COPYRIGHT and LICENSE files for more details. #++ -require "spec_helper" -require_relative "../support/pages/projects/settings/backlogs" +module Projects + module Settings + class BacklogsSettingsForm < ApplicationForm + form do |f| + f.autocompleter( + name: :done_status_ids, + label: I18n.t(:"backlogs.definition_of_done"), + caption: I18n.t(:"backlogs.definition_of_done_caption"), + autocomplete_options: { + multiple: true, + closeOnSelect: false, + clearable: false, + decorated: true, + data: { + test_selector: "done_status_ids_autocomplete" + } + } + ) do |list| + available_statuses.each do |label, value| + active = value.in?(model.done_status_ids) -RSpec.describe "Resolved status" do - let!(:project) do - create(:project, - enabled_module_names: %w(backlogs)) - end - let!(:status) { create(:status, is_default: true) } - let(:role) do - create(:project_role, - permissions: %i[select_done_statuses view_sprints]) - end - let!(:current_user) do - create(:user, - member_with_roles: { project => role }) - end - let(:settings_page) { Pages::Projects::Settings::Backlogs.new(project) } + list.option( + label:, + value:, + selected: active + ) + end + end - before do - login_as current_user - end + f.submit(scheme: :primary, name: :apply, label: I18n.t(:button_save)) + end - it "allows setting a status as done although it is not closed" do - settings_page.visit! + private - check status.name - click_button "Save" - - expect_flash(type: :success, message: "Successful update") - - expect(page) - .to have_checked_field(status.name) + def available_statuses + Status.pluck(:name, :id) + end + end end end diff --git a/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb b/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb index bb32c332dbf..11ac6fb8e62 100644 --- a/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb +++ b/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb @@ -29,75 +29,39 @@ See COPYRIGHT and LICENSE files for more details. <%= render Primer::OpenProject::PageHeader.new do |header| - header.with_title { t("backlogs.definition_of_done") } + header.with_title { t(:label_backlogs) } + header.with_breadcrumbs( [{ href: project_overview_path(@project), text: @project.name }, { href: project_settings_general_path(@project), text: I18n.t(:label_project_settings) }, - t("backlogs.definition_of_done")] + t(:label_backlogs)] ) + + header.with_action_menu( + menu_arguments: { anchor_align: :end }, + button_arguments: { + icon: :"kebab-horizontal", + "aria-label": t(:label_more) + } + ) do |menu| + menu.with_item( + tag: :button, + href: rebuild_positions_project_settings_backlogs_path(@project), + label: t(:"backlogs.rebuild_positions"), + form_arguments: { method: :post } + ) do |item| + item.with_leading_visual_icon(icon: :sync) + end + end end %> -<%= styled_form_tag( - project_settings_backlogs_path(@project), - method: :patch, - id: "edit_project_#{@project.id}" - ) do %> - -
-
- - - - - - - - - - - - - <% for status in (Status.all || []) %> - - - - - <% end %> - -
-
-
- - <%= Status.model_name.human %> - -
-
-
-
-
- - <%= t("backlogs.work_package_is_closed") %> - -
-
-
- <%= status.name %> - - <% checkbox_id = status.name.parameterize.underscore %> - <%= styled_label_tag checkbox_id, t("backlogs.label_is_done_status", status_name: status.name), class: "sr-only" %> - <%= (styled_check_box_tag "statuses[][status_id]", status.id.to_s, @statuses_done_for_project.include?(status.id), id: checkbox_id) %> -
-
-
-
- <%= styled_button_tag t(:button_save), class: "-primary -with-icon icon-checkmark" %> -
- -<% end %> - -

<%= t("backlogs.rebuild_positions") %>

- -<%= styled_form_tag(controller: "/projects/settings/backlogs", action: "rebuild_positions", id: @project) do %> -

<%= styled_button_tag t("backlogs.rebuild"), class: "-primary" %>

+<%= + settings_primer_form_with( + url: project_settings_backlogs_path(@project), + model: @project, + method: :patch + ) do |f| +%> + <%= render Projects::Settings::BacklogsSettingsForm.new(f) %> <% end %> diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index 9e58970b397..3d26e704927 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -69,6 +69,7 @@ en: any: "any" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/spec/features/projects/backlogs_settings_spec.rb b/modules/backlogs/spec/features/projects/backlogs_settings_spec.rb new file mode 100644 index 00000000000..32e090f3137 --- /dev/null +++ b/modules/backlogs/spec/features/projects/backlogs_settings_spec.rb @@ -0,0 +1,96 @@ +# 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_relative "../../support/pages/projects/settings/backlogs" + +RSpec.describe "Backlogs Project Settings", :js do + let!(:project) do + create(:project, + enabled_module_names: %w(backlogs)) + end + let!(:closed_status) { create(:status, name: "Closed", is_closed: true) } + let!(:closed_like_status) { create(:status, name: "Sorta kinda Finished", is_default: true) } + let(:role) do + create(:project_role, + permissions: %i[select_done_statuses]) + end + let!(:current_user) do + create(:user, + member_with_roles: { project => role }) + end + let(:settings_page) { Pages::Projects::Settings::Backlogs.new(project) } + let(:done_status_ids_autocompleter) { FormFields::Primerized::AutocompleteField.new("story_types", selector: "[data-test-selector='done_status_ids_autocomplete']") } + + before do + login_as current_user + end + + it "allows setting a status as done although it is not closed" do + settings_page.visit! + + expect(page).to have_heading "Backlogs" + + wait_for_network_idle + wait_for_autocompleter_options_to_be_loaded + + done_status_ids_autocompleter.expect_blank + done_status_ids_autocompleter.select_option "Closed" + done_status_ids_autocompleter.select_option "Sorta kinda Finished" + + done_status_ids_autocompleter.expect_selected "Closed" + done_status_ids_autocompleter.expect_selected "Sorta kinda Finished" + done_status_ids_autocompleter.expect_not_disabled "Definition of Done" + + done_status_ids_autocompleter.close_autocompleter + + click_button "Save" + + expect_flash(type: :success, message: "Successful update") + + wait_for_network_idle + wait_for_autocompleter_options_to_be_loaded + + done_status_ids_autocompleter.expect_selected "Closed" + done_status_ids_autocompleter.expect_selected "Sorta kinda Finished" + + done_status_ids_autocompleter.deselect_option "Sorta kinda Finished" + + click_button "Save" + + wait_for_network_idle + wait_for_autocompleter_options_to_be_loaded + + expect_flash(type: :success, message: "Successful update") + + done_status_ids_autocompleter.expect_selected "Closed" + done_status_ids_autocompleter.expect_not_selected "Sorta kinda Finished" + end +end From c15bd2d4a3b1a7bb4002a96d2d5181f1d6d9d04c Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Mon, 9 Mar 2026 14:49:04 -0300 Subject: [PATCH 220/334] Fix eslint unsafe return --- .../edit/field-types/multi-select-edit-field.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/shared/components/fields/edit/field-types/multi-select-edit-field.component.ts b/frontend/src/app/shared/components/fields/edit/field-types/multi-select-edit-field.component.ts index 58262b7d6e4..079ef05844d 100644 --- a/frontend/src/app/shared/components/fields/edit/field-types/multi-select-edit-field.component.ts +++ b/frontend/src/app/shared/components/fields/edit/field-types/multi-select-edit-field.component.ts @@ -204,7 +204,7 @@ export class MultiSelectEditFieldComponent extends EditFieldComponent implements if (Array.isArray(allowedValues)) { this.setValues(allowedValues); } else if (this.schema.allowedValues) { - return this.schema.allowedValues.$load().then((values:CollectionResource) => { + return (this.schema.allowedValues.$load() as Promise).then((values:CollectionResource) => { // The select options of the project shall be sorted if (values.count > 0 && (values.elements[0] as any)._type === 'Project') { this.setValues(values.elements, true); From 08e0eadf3bb8b704254976a8b1bbaad5470174b7 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 10 Mar 2026 03:50:24 +0000 Subject: [PATCH 221/334] update locales from crowdin [ci skip] --- config/locales/crowdin/de.yml | 9656 +++++++---------- config/locales/crowdin/es.yml | 9587 +++++++--------- config/locales/crowdin/fr.yml | 12 +- config/locales/crowdin/it.yml | 12 +- config/locales/crowdin/ko.yml | 8146 +++++++------- config/locales/crowdin/pl.yml | 12 +- config/locales/crowdin/pt-BR.yml | 12 +- config/locales/crowdin/pt-PT.yml | 12 +- config/locales/crowdin/uk.yml | 9598 +++++++--------- config/locales/crowdin/zh-CN.yml | 12 +- .../backlogs/config/locales/crowdin/de.yml | 28 +- .../backlogs/config/locales/crowdin/es.yml | 28 +- .../backlogs/config/locales/crowdin/fr.yml | 28 +- .../backlogs/config/locales/crowdin/it.yml | 28 +- .../backlogs/config/locales/crowdin/js-uk.yml | 4 +- .../backlogs/config/locales/crowdin/ko.yml | 28 +- .../backlogs/config/locales/crowdin/pl.yml | 28 +- .../backlogs/config/locales/crowdin/pt-BR.yml | 28 +- .../backlogs/config/locales/crowdin/pt-PT.yml | 28 +- .../backlogs/config/locales/crowdin/uk.yml | 40 +- .../backlogs/config/locales/crowdin/zh-CN.yml | 28 +- modules/budgets/config/locales/crowdin/de.yml | 24 +- modules/budgets/config/locales/crowdin/es.yml | 196 +- modules/budgets/config/locales/crowdin/fr.yml | 24 +- modules/budgets/config/locales/crowdin/it.yml | 24 +- modules/budgets/config/locales/crowdin/ko.yml | 186 +- modules/budgets/config/locales/crowdin/pl.yml | 24 +- .../budgets/config/locales/crowdin/pt-BR.yml | 24 +- .../budgets/config/locales/crowdin/pt-PT.yml | 24 +- modules/budgets/config/locales/crowdin/uk.yml | 188 +- .../budgets/config/locales/crowdin/zh-CN.yml | 24 +- modules/costs/config/locales/crowdin/uk.yml | 2 +- .../grids/config/locales/crowdin/js-uk.yml | 4 +- modules/meeting/config/locales/crowdin/de.yml | 16 +- modules/meeting/config/locales/crowdin/es.yml | 12 +- modules/meeting/config/locales/crowdin/fr.yml | 12 +- modules/meeting/config/locales/crowdin/it.yml | 12 +- modules/meeting/config/locales/crowdin/ko.yml | 12 +- modules/meeting/config/locales/crowdin/pl.yml | 16 +- .../meeting/config/locales/crowdin/pt-BR.yml | 12 +- .../meeting/config/locales/crowdin/pt-PT.yml | 16 +- modules/meeting/config/locales/crowdin/uk.yml | 32 +- .../meeting/config/locales/crowdin/zh-CN.yml | 12 +- 43 files changed, 16891 insertions(+), 21360 deletions(-) diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index cb065aa28f1..996f5ef6d00 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -1,516 +1,426 @@ ---- +#-- 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. +#++ de: no_results_title_text: Es gibt derzeit nichts anzuzeigen. activities: index: - no_results_title_text: Innerhalb dieses Zeitraums haben keine Aktivitäten in - dem Projekt stattgefunden. + no_results_title_text: Innerhalb dieses Zeitraums haben keine Aktivitäten in dem Projekt stattgefunden. work_packages: activity_tab: no_results_title_text: Keine Aktivität anzuzeigen - no_results_description_text: Wählen Sie "Alles anzeigen", um alle Aktivitäten - und Kommentare anzuzeigen. - label_activity_show_all: Alles anzeigen - label_activity_show_only_comments: Nur Kommentare anzeigen - label_activity_show_only_changes: Nur Änderungen anzeigen - label_sort_asc: Neueste unten - label_sort_desc: Neueste oben - label_type_to_comment: Einen Kommentar hinzufügen. @ tippen, um Personen zu - benachrichtigen. - label_submit_comment: Kommentar absenden + no_results_description_text: 'Wählen Sie "Alles anzeigen", um alle Aktivitäten und Kommentare anzuzeigen.' + label_activity_show_all: "Alles anzeigen" + label_activity_show_only_comments: "Nur Kommentare anzeigen" + label_activity_show_only_changes: "Nur Änderungen anzeigen" + label_sort_asc: "Neueste unten" + label_sort_desc: "Neueste oben" + label_type_to_comment: "Einen Kommentar hinzufügen. @ tippen, um Personen zu benachrichtigen." + label_submit_comment: "Kommentar absenden" label_who: Wer? - changed_on: geändert am - created_on: erstellte dies am - changed: geändert - created: erstellt - commented: kommentiert + changed_on: "geändert am" + created_on: "erstellte dies am" + changed: "geändert" + created: "erstellt" + commented: "kommentiert" internal_comment: Interner Kommentar - internal_journal: Interne Kommentare sind nur für eine einschränkbare Gruppe - von Mitgliedern sichtbar. - unsaved_changes_confirmation_message: Sie haben ungespeicherte Änderungen. - Sind Sie sicher, dass Sie den Editor schließen möchten? + internal_journal: Interne Kommentare sind nur für eine einschränkbare Gruppe von Mitgliedern sichtbar. + unsaved_changes_confirmation_message: Sie haben ungespeicherte Änderungen. Sind Sie sicher, dass Sie den Editor schließen möchten? internal_comment_confirmation: - title: Diesen Kommentar öffentlich machen? - heading: Diesen Kommentar öffentlich machen? - description: Ihr Kommentar wird für jeden sichtbar, der dieses Arbeitspaket - sehen kann. Sind Sie sicher, dass Sie dies tun möchten? - confirm_button_text: Veröffentlichen + title: "Diesen Kommentar öffentlich machen?" + heading: "Diesen Kommentar öffentlich machen?" + description: "Ihr Kommentar wird für jeden sichtbar, der dieses Arbeitspaket sehen kann. Sind Sie sicher, dass Sie dies tun möchten?" + confirm_button_text: "Veröffentlichen" admin: 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. + no_results_content_text: Weitere Informationen finden Sie auf unserer Seite für Integrationen und Plugins. custom_styles: - color_theme: Farbschema + color_theme: "Farbschema" color_theme_custom: "(Benutzerdefiniert)" - tab_interface: Benutzeroberfläche - tab_branding: Branding - tab_pdf_export_styles: PDF-Exportstile - tab_pdf_export_font: Schriftart für den PDF-Export + tab_interface: "Benutzeroberfläche" + tab_branding: "Branding" + tab_pdf_export_styles: "PDF-Exportstile" + tab_pdf_export_font: "Schriftart für den PDF-Export" fonts: - file_too_large: ist zu groß (maximale Größe ist %{count} MB). - file_is_invalid: ist keine gültige TTF-Schriftdatei. + file_too_large: "ist zu groß (maximale Größe ist %{count} MB)." + file_is_invalid: "ist keine gültige TTF-Schriftdatei." colors: - primary-button-color: Primäre Schaltfläche - accent-color: Akzent - header-bg-color: Hintergrund der Kopfzeile - main-menu-bg-color: Hintergrundfarbe des Hauptmenüs - main-menu-bg-selected-background: Hintergrundfarbe des Hauptmenüs bei Auswahl - custom_colors: Benutzerdefinierte Farben - manage_colors: Farbauswahloptionen bearbeiten + primary-button-color: "Primäre Schaltfläche" + accent-color: "Akzent" + header-bg-color: "Hintergrund der Kopfzeile" + main-menu-bg-color: "Hintergrundfarbe des Hauptmenüs" + main-menu-bg-selected-background: "Hintergrundfarbe des Hauptmenüs bei Auswahl" + custom_colors: "Benutzerdefinierte Farben" + manage_colors: "Farbauswahloptionen bearbeiten" instructions: - primary-button-color: Starke Akzentfarbe, die für die wichtigste Schaltfläche - auf einem Bildschirm verwendet wird. - accent-color: Farbe für Links und andere dezent hervorgehobene Elemente. - main-menu-bg-color: Hintergrundfarbe des Menüs in der linken Seitenleiste. - theme_warning: Das Ändern des Themes wird Ihr benutzerdefiniertes Design überschreiben. - Alle Änderungen werden dann verloren gehen. Sind Sie sicher, dass Sie fortfahren - möchten? + primary-button-color: "Starke Akzentfarbe, die für die wichtigste Schaltfläche auf einem Bildschirm verwendet wird." + accent-color: "Farbe für Links und andere dezent hervorgehobene Elemente." + main-menu-bg-color: "Hintergrundfarbe des Menüs in der linken Seitenleiste." + theme_warning: Das Ändern des Themes wird Ihr benutzerdefiniertes Design überschreiben. Alle Änderungen werden dann verloren gehen. Sind Sie sicher, dass Sie fortfahren möchten? enterprise: delete_dialog: - title: Enterprise-Token löschen - heading: Diesen Enterprise-Token löschen? - confirmation: Sind Sie sicher, dass Sie diesen Enterprise-Edition Support-Token - löschen möchten? + title: "Enterprise-Token löschen" + heading: "Diesen Enterprise-Token löschen?" + confirmation: "Sind Sie sicher, dass Sie diesen Enterprise-Edition Support-Token löschen möchten?" create_dialog: - title: Enterprise-Token hinzufügen - type_token_text: Ihr Enterprise-Token-Text - token_placeholder: Enterprise-Token Text hier einfügen - token_caption: Weitere Informationen über die Aktivierung der Enterprise Edition - finden Sie in unserer [Dokumentation](docs_url). - add_token: Enterprise edition Support Token hochladen - replace_token: Aktuellen Enterprise edition Support Token ersetzen - order: Enterprise on-premises bestellen - paste: Enterprise edition Support Token hier einfügen - required_for_feature: Dieses Add-on ist nur mit einem aktiven Enterprise edition - Support-Token verfügbar. - enterprise_link: Klicken Sie hier für weitere Informationen. - start_trial: Kostenlose Testversion starten - book_now: Jetzt buchen - get_quote: Angebot anfordern + title: "Enterprise-Token hinzufügen" + type_token_text: "Ihr Enterprise-Token-Text" + token_placeholder: "Enterprise-Token Text hier einfügen" + token_caption: "Weitere Informationen über die Aktivierung der Enterprise Edition finden Sie in unserer [Dokumentation](docs_url)." + add_token: "Enterprise edition Support Token hochladen" + replace_token: "Aktuellen Enterprise edition Support Token ersetzen" + order: "Enterprise on-premises bestellen" + paste: "Enterprise edition Support Token hier einfügen" + required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise edition Support-Token verfügbar." + enterprise_link: "Klicken Sie hier für weitere Informationen." + start_trial: "Kostenlose Testversion starten" + book_now: "Jetzt buchen" + get_quote: "Angebot anfordern" buttons: - upgrade: Jetzt Upgrade durchführen - contact: Kontaktieren Sie uns für eine Demo + upgrade: "Jetzt Upgrade durchführen" + contact: "Kontaktieren Sie uns für eine Demo" status: - expired: Abgelaufen - expiring_soon: Läuft bald ab - in_grace_period: In der Kulanzzeit - invalid_domain: Ungültige Domain - not_active: Nicht aktiv - trial: Probezeitraum + expired: "Abgelaufen" + expiring_soon: "Läuft bald ab" + in_grace_period: "In der Kulanzzeit" + invalid_domain: "Ungültige Domain" + not_active: "Nicht aktiv" + trial: "Probezeitraum" jemalloc_allocator: Jemalloc Speicher allocator journal_aggregation: explanation: - text: Individuelle Aktionen eines Benutzers (z.B. ein Arbeitspaket zweimal - aktualisieren) werden zu einer einzigen Aktion zusammengefasst, wenn ihr - Altersunterschied kleiner ist als der angegebene Zeitraum. Sie werden als - eine einzige Aktion innerhalb der Anwendung angezeigt. Dadurch werden Benachrichtigungen - um die gleiche Zeit verzögert, wodurch die Anzahl der gesendeten E-Mails - verringert wird. Dies wirkt sich auch auf die Verzögerung von %{webhook_link} - aus. - link: Webhook + text: "Individuelle Aktionen eines Benutzers (z.B. ein Arbeitspaket zweimal aktualisieren) werden zu einer einzigen Aktion zusammengefasst, wenn ihr Altersunterschied kleiner ist als der angegebene Zeitraum. Sie werden als eine einzige Aktion innerhalb der Anwendung angezeigt. Dadurch werden Benachrichtigungen um die gleiche Zeit verzögert, wodurch die Anzahl der gesendeten E-Mails verringert wird. Dies wirkt sich auch auf die Verzögerung von %{webhook_link} aus." + link: "Webhook" import: - title: Import + title: "Import" jira: - title: Jira Import - description: Verwenden Sie dieses Tool, um Daten aus Ihrer Jira-Instanz zu importieren. - Sie können mehrere Jira-Hosts konfigurieren und auswählen, was bei jedem Importlauf - importiert werden soll. + title: "Jira Import" + description: "Verwenden Sie dieses Tool, um Daten aus Ihrer Jira-Instanz zu importieren. Sie können mehrere Jira-Hosts konfigurieren und auswählen, was bei jedem Importlauf importiert werden soll." errors: - cannot_delete_with_imports: Jira-Hosts mit laufenden Importen können nicht - gelöscht werden + cannot_delete_with_imports: "Jira-Hosts mit laufenden Importen können nicht gelöscht werden" 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. + 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." configuration: - title: Jira-Konfiguration - new: Neue Konfiguration + title: "Jira-Konfiguration" + new: "Neue Konfiguration" banner: - title: Begrenzter Import - description: 'Dieses Importtool befindet sich derzeit in der Betaphase und - kann nur grundlegende Daten importieren: Projekte, Tickets (Name, Titel, - Beschreibung, Anhänge), Nutzer (Name, E-Mail, Projektmitgliedschaft), Status - und Typen. Es kann keine Workflows, benutzerdefinierten Felder, Ticketbeziehungen - oder Berechtigungen importieren. Wir unterstützen derzeit nur die Jira Server/Data - Center Versionen 10.x und 11.x. Cloud-Instanzen werden derzeit nicht unterstützt.' + title: "Begrenzter Import" + description: "Dieses Importtool befindet sich derzeit in der Betaphase und kann nur grundlegende Daten importieren: Projekte, Tickets (Name, Titel, Beschreibung, Anhänge), Nutzer (Name, E-Mail, Projektmitgliedschaft), Status und Typen. Es kann keine Workflows, benutzerdefinierten Felder, Ticketbeziehungen oder Berechtigungen importieren. Wir unterstützen derzeit nur die Jira Server/Data Center Versionen 10.x und 11.x. Cloud-Instanzen werden derzeit nicht unterstützt." form: fields: - name: Name - url: Jira Server/Datencenter URL - personal_access_token: Persönlicher Zugangs-Token - button_add: Konfiguration hinzufügen - button_save: Konfiguration speichern - button_test: Konfiguration testen - button_delete_token: Token löschen - delete_token_confirm: Sind Sie sicher, dass Sie das Token löschen möchten? - Dies wird die Verbindung zu Jira deaktivieren. - label_testing: Teste Konfiguration... - token_deleted: Token wurde erfolgreich gelöscht. + name: "Name" + url: "Jira Server/Datencenter URL" + personal_access_token: "Persönlicher Zugangs-Token" + button_add: "Konfiguration hinzufügen" + button_save: "Konfiguration speichern" + button_test: "Konfiguration testen" + button_delete_token: "Token löschen" + delete_token_confirm: "Sind Sie sicher, dass Sie das Token löschen möchten? Dies wird die Verbindung zu Jira deaktivieren." + label_testing: "Teste Konfiguration..." + token_deleted: "Token wurde erfolgreich gelöscht." test: - success: Erfolgreich verbunden mit %{server} (Version %{version}) - failed: 'Verbindung fehlgeschlagen: Serverinformationen können nicht abgerufen - werden' - error: Beim Testen der Verbindung ist ein unerwarteter Fehler aufgetreten - connection_error: 'Verbindungsfehler: %{message}' - parse_error: Die Antwort des Servers konnte nicht gelesen werden. Der Server - ist möglicherweise keine gültige Jira-Instanz. - api_error: Jira API hat den Fehlerstatus %{status} zurückgegeben. Bitte überprüfen - Sie die URL Ihrer Jira-Instanz und Ihr API-Token. - token_error: Ungültiger API-Token. Bitte überprüfen Sie Ihre Zugangsdaten - in der Konfiguration. - missing_credentials: Bitte geben Sie sowohl URL als auch Persönliches Zugangs-Token - an, um die Verbindung zu testen - invalid_url: Bitte eine gültige URL eingeben + success: "Erfolgreich verbunden mit %{server} (Version %{version})" + failed: "Verbindung fehlgeschlagen: Serverinformationen können nicht abgerufen werden" + error: "Beim Testen der Verbindung ist ein unerwarteter Fehler aufgetreten" + connection_error: "Verbindungsfehler: %{message}" + parse_error: "Die Antwort des Servers konnte nicht gelesen werden. Der Server ist möglicherweise keine gültige Jira-Instanz." + api_error: "Jira API hat den Fehlerstatus %{status} zurückgegeben. Bitte überprüfen Sie die URL Ihrer Jira-Instanz und Ihr API-Token." + token_error: "Ungültiger API-Token. Bitte überprüfen Sie Ihre Zugangsdaten in der Konfiguration." + missing_credentials: "Bitte geben Sie sowohl URL als auch Persönliches Zugangs-Token an, um die Verbindung zu testen" + invalid_url: "Bitte eine gültige URL eingeben" client: - connection_error: 'Verbindung zum Jira-Server fehlgeschlagen: %{message}' - connection_timeout: 'Die Verbindung zum Jira-Server wurde unterbrochen: %{message}' - parse_error: 'Die Jira API-Antwort konnte nicht gelesen werden: %{message}' - api_error: Jira API hat den Fehlerstatus %{status} zurückgegeben + connection_error: "Verbindung zum Jira-Server fehlgeschlagen: %{message}" + connection_timeout: "Die Verbindung zum Jira-Server wurde unterbrochen: %{message}" + parse_error: "Die Jira API-Antwort konnte nicht gelesen werden: %{message}" + api_error: "Jira API hat den Fehlerstatus %{status} zurückgegeben" columns: - projects: Projekte - last_change: Letzte Änderung - added: Hinzugefügt - label_ago: Vor %{amount} + projects: "Projekte" + last_change: "Letzte Änderung" + added: "Hinzugefügt" + label_ago: "Vor %{amount}" run: - title: Importlauf - history: Historie - remove_error: Ein Jira-Import kann nicht entfernt werden während er läuft - import_blocked_error: Ein anderer Jira-Importlauf wird gerade durchgeführt - oder wartet auf die Überprüfung. Bitte schließen Sie ihn ab oder machen - Sie ihn rückgängig, bevor Sie einen neuen Import starten. + title: "Importlauf" + history: "Historie" + remove_error: "Ein Jira-Import kann nicht entfernt werden während er läuft" + import_blocked_error: "Ein anderer Jira-Importlauf wird gerade durchgeführt oder wartet auf die Überprüfung. Bitte schließen Sie ihn ab oder machen Sie ihn rückgängig, bevor Sie einen neuen Import starten." blank: - title: Noch keine Importläufe eingerichtet - description: Erstellen Sie einen Importlauf, um den Import von Informationen - aus dieser Jira-Instanz zu starten + title: "Noch keine Importläufe eingerichtet" + description: "Erstellen Sie einen Importlauf, um den Import von Informationen aus dieser Jira-Instanz zu starten" index: - description: Sie können bei jedem Importlauf verschiedene Datensätze importieren. - Es ist möglich, einen Importlauf unmittelbar danach rückgängig zu machen, - aber nicht nach dem Abschluss-Schritt. - button_import_run: Importlauf - button_edit_configuration: Konfiguration bearbeiten + description: "Sie können bei jedem Importlauf verschiedene Datensätze importieren. Es ist möglich, einen Importlauf unmittelbar danach rückgängig zu machen, aber nicht nach dem Abschluss-Schritt." + button_import_run: "Importlauf" + button_edit_configuration: "Konfiguration bearbeiten" status: - initial: Start - instance_meta_fetching: Abrufen von Metadaten - instance_meta_error: Fehler beim Abrufen von Metadaten - instance_meta_done: Metadaten abgerufen - configuring: Umfang auswählen - projects_meta_fetching: Abrufen von Projektdaten - projects_meta_error: Fehler beim Abrufen von Projektdaten - projects_meta_done: Daten erfasst - importing: In Durchführung - import_error: Fehler beim Importieren - imported: Überprüfungsmodus - reverting: Rückgängig machen - revert_error: Fehler beim Revertieren - reverted: Rückgängig gemacht - completed: Abgeschlossen + initial: "Start" + instance_meta_fetching: "Abrufen von Metadaten" + instance_meta_error: "Fehler beim Abrufen von Metadaten" + instance_meta_done: "Metadaten abgerufen" + configuring: "Umfang auswählen" + projects_meta_fetching: "Abrufen von Projektdaten" + projects_meta_error: "Fehler beim Abrufen von Projektdaten" + projects_meta_done: "Daten erfasst" + importing: "In Durchführung" + import_error: "Fehler beim Importieren" + imported: "Überprüfungsmodus" + reverting: "Rückgängig machen" + revert_error: "Fehler beim Revertieren" + reverted: "Rückgängig gemacht" + completed: "Abgeschlossen" wizard: - button_retry: Erneut versuchen + button_retry: "Erneut versuchen" parts: projects: - one: 1 Projekt + one: "1 Projekt" other: "%{count} Projekte" issues: - one: 1 Ticket + one: "1 Ticket" other: "%{count} Tickets" work_packages: - one: 1 Arbeitspaket + one: "1 Arbeitspaket" other: "%{count} Arbeitspakete" types: - one: 1 Typ + one: "1 Typ" other: "%{count} Typen" statuses: - one: 1 Status + one: "1 Status" other: "%{count} Statusse" users: - one: 1 Konto + one: "1 Konto" other: "%{count} Konten" groups: fetch: - title: Basisdaten abrufen + title: "Basisdaten abrufen" groups_and_users: - title: Gruppen und Benutzer + title: "Gruppen und Benutzer" configuration: - title: Import konfigurieren + title: "Import konfigurieren" confirming: - title: Bestätigen und importieren + title: "Bestätigen und importieren" review: - title: Import überprüfen + title: "Import überprüfen" sections: fetch_data: - title: Metadaten der Instanz abrufen - caption_done: Abgeschlossen - description: Prüfen Sie, welche Daten in der Host-Jira-Instanz zum Import - verfügbar sind. - button_fetch: Verfügbare Daten prüfen - label_progress: Abrufen von Daten aus Jira... + title: "Metadaten der Instanz abrufen" + caption_done: "Abgeschlossen" + description: "Prüfen Sie, welche Daten in der Host-Jira-Instanz zum Import verfügbar sind." + button_fetch: "Verfügbare Daten prüfen" + label_progress: "Abrufen von Daten aus Jira..." groups_and_users: - title: Gruppen und Benutzer + title: "Gruppen und Benutzer" import_scope: - title: Umfang des Imports - caption: Wählen Sie, was Sie in OpenProject importieren möchten - caption_done: Abgeschlossen - label_info: Bitte beachten Sie, dass dieses Import-Tool in der Beta - ist und nicht alle Arten von Daten importieren kann. Hier ist eine - Zusammenfassung dessen, was die Jira Instanz für den Import bietet - und was dieses Tool gerade importieren kann. - description: Wählen Sie aus den verfügbaren Daten, die Sie aus der Host-Jira-Instanz - abrufen, die Daten aus, die Sie importieren möchten. - label_available_data: Verfügbare Daten - label_not_available_data: Nicht verfügbar für den Import - button_select_projects: Projekte zum Importieren auswählen - button_continue: Fortfahren - label_import: Wählen Sie die Projekte aus, die Sie importieren möchten. - button_select: Projekte auswählen - label_selected_data: Ausgewählte Daten für den Import - label_progress: Abrufen von Daten aus Jira... + title: "Umfang des Imports" + caption: "Wählen Sie, was Sie in OpenProject importieren möchten" + caption_done: "Abgeschlossen" + label_info: "Bitte beachten Sie, dass dieses Import-Tool in der Beta ist und nicht alle Arten von Daten importieren kann. Hier ist eine Zusammenfassung dessen, was die Jira Instanz für den Import bietet und was dieses Tool gerade importieren kann." + description: "Wählen Sie aus den verfügbaren Daten, die Sie aus der Host-Jira-Instanz abrufen, die Daten aus, die Sie importieren möchten." + label_available_data: "Verfügbare Daten" + label_not_available_data: "Nicht verfügbar für den Import" + button_select_projects: "Projekte zum Importieren auswählen" + button_continue: "Fortfahren" + label_import: "Wählen Sie die Projekte aus, die Sie importieren möchten." + button_select: "Projekte auswählen" + label_selected_data: "Ausgewählte Daten für den Import" + label_progress: "Abrufen von Daten aus Jira..." elements: - relations: Beziehungen zwischen Tickets - workflows: Workflows auf Projektebene - users: Accounts - sprints: Sprints - schemes: Schemas - permissions: Benutzer-, Gruppen- und Projektberechtigungen + relations: "Beziehungen zwischen Tickets" + workflows: "Workflows auf Projektebene" + users: "Accounts" + sprints: "Sprints" + schemes: "Schemas" + permissions: "Benutzer-, Gruppen- und Projektberechtigungen" confirm_import: - title: Daten importieren - caption: Überprüfen Sie Ihre Importeinstellungen und starten Sie den - Import - caption_done: Abgeschlossen - label_available_data: Verfügbare Daten zum Importieren - button_start: Import starten - description: Sie sind dabei, einen Import mit den folgenden Einstellungen - zu starten. - label_progress: Import läuft... - label_import_data: Wird gerade importiert + title: "Daten importieren" + caption: "Überprüfen Sie Ihre Importeinstellungen und starten Sie den Import" + caption_done: "Abgeschlossen" + label_available_data: "Verfügbare Daten zum Importieren" + button_start: "Import starten" + description: "Sie sind dabei, einen Import mit den folgenden Einstellungen zu starten." + label_progress: "Import läuft..." + label_import_data: "Wird gerade importiert" import_result: - title: Importlauf-Ergebnisse - caption: Importlauf überprüfen oder Import rückgängig machen - info: Import erfolgreich ausgeführt. - label_results: Importiert - label_revert: Import rückgängig machen - button_revert: Import rückgängig machen - button_done: Import abschließen - preview_description: Die importierten Daten befinden sich derzeit im - Überprüfungsmodus. Klicken Sie auf "Import abschließen", um den Import - dauerhaft zu machen, oder auf "Import rückgängig machen", um alle - in diesem Importlauf vorgenommenen Änderungen rückgängig zu machen. - label_finalizing_progress: Import wird abgeschlossen... - label_finalized: Import abgeschlossen. - label_revert_progress: Import wird rückgängig gemacht... - label_reverted: Import rückgängig gemacht. + title: "Importlauf-Ergebnisse" + caption: "Importlauf überprüfen oder Import rückgängig machen" + info: "Import erfolgreich ausgeführt." + label_results: "Importiert" + label_revert: "Import rückgängig machen" + button_revert: "Import rückgängig machen" + button_done: "Import abschließen" + preview_description: 'Die importierten Daten befinden sich derzeit im Überprüfungsmodus. Klicken Sie auf "Import abschließen", um den Import dauerhaft zu machen, oder auf "Import rückgängig machen", um alle in diesem Importlauf vorgenommenen Änderungen rückgängig zu machen.' + label_finalizing_progress: "Import wird abgeschlossen..." + label_finalized: "Import abgeschlossen." + label_revert_progress: "Import wird rückgängig gemacht..." + label_reverted: "Import rückgängig gemacht." select_dialog: - filter_projects: Nach Text filtern + filter_projects: "Nach Text filtern" import_dialog: - title: Diesen Import starten? - confirm_button: Import starten - description: 'Dieser Importer ist eine Alpha-Funktion. Er ist noch nicht - in der Lage, alle Daten aus Jira zu importieren und könnte unvollständige - Daten auf dieser OpenProject-Instanz hinterlassen. Verwenden Sie - keine Produktionsumgebung und erstellen Sie vor dem Start eine Sicherungskopie - Ihrer OpenProject-Daten. - - ' - confirm: Ich habe verstanden und die notwendigen Vorbereitungen getroffen + title: "Diesen Import starten?" + confirm_button: "Import starten" + description: > + Dieser Importer ist eine Alpha-Funktion. Er ist noch nicht in der Lage, alle Daten aus Jira zu importieren und könnte unvollständige Daten auf dieser OpenProject-Instanz hinterlassen. Verwenden Sie keine Produktionsumgebung und erstellen Sie vor dem Start eine Sicherungskopie Ihrer OpenProject-Daten. + confirm: "Ich habe verstanden und die notwendigen Vorbereitungen getroffen" revert_dialog: - title: Diesen Import dauerhaft rückgängig machen? - description: Dadurch werden alle importierten Objekte (einschließlich - ganzer Projekte) gelöscht, auch wenn es nach dem Import in OpenProject - Nutzeraktivitäten in diesen Projekten gab. - confirm: Mir ist bewusst, dass diese Rückgängigmachung die Daten dauerhaft - löscht + title: "Diesen Import dauerhaft rückgängig machen?" + description: "Dadurch werden alle importierten Objekte (einschließlich ganzer Projekte) gelöscht, auch wenn es nach dem Import in OpenProject Nutzeraktivitäten in diesen Projekten gab." + confirm: "Mir ist bewusst, dass diese Rückgängigmachung die Daten dauerhaft löscht" finalize_dialog: - title: Diesen Import abschließen? - description: Sobald dieser Import abgeschlossen ist, kann er nicht mehr - rückgängig gemacht werden. Alle importierten Daten werden dann dauerhaft - importiert. - confirm: Ich verstehe, dass diese Aktion nicht rückgängig gemacht werden - kann - confirm_button: Verstanden + title: "Diesen Import abschließen?" + description: "Sobald dieser Import abgeschlossen ist, kann er nicht mehr rückgängig gemacht werden. Alle importierten Daten werden dann dauerhaft importiert." + confirm: "Ich verstehe, dass diese Aktion nicht rückgängig gemacht werden kann" + confirm_button: "Verstanden" select_projects: - title: Projekte auswählen + title: "Projekte auswählen" 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. - resources_heading: Ressourcen - resources_description: OpenProject stellt die folgenden Ressourcen bereit. - Jede Ressource kann nach Wunsch aktiviert, umbenannt und beschrieben werden. - Weitere Informationen finden sich in der [Dokumentation zu MCP-Ressourcen](docs_url). - resources_submit: Ressourcen aktualisieren - tools_heading: Tools - tools_description: OpenProject stellt die folgenden Tools bereit. Jedes Tool - kann nach Wunsch aktiviert, umbenannt und beschrieben werden. Weitere Informationen - finden sich in der [Dokumentation zu MCP-Ressourcen](docs_url). - tools_submit: Tools aktualisieren + description: "Das Model Context Protocol ermöglicht es KI-Agenten, ihren Nutzern Tools und Ressourcen bereitzustellen, die diese OpenProject-Instanz zur Verfügung stellt. Die Funktion befindet sich noch in der Beta-Phase." + resources_heading: "Ressourcen" + resources_description: "OpenProject stellt die folgenden Ressourcen bereit. Jede Ressource kann nach Wunsch aktiviert, umbenannt und beschrieben werden. Weitere Informationen finden sich in der [Dokumentation zu MCP-Ressourcen](docs_url)." + resources_submit: "Ressourcen aktualisieren" + tools_heading: "Tools" + tools_description: "OpenProject stellt die folgenden Tools bereit. Jedes Tool kann nach Wunsch aktiviert, umbenannt und beschrieben werden. Weitere Informationen finden sich in der [Dokumentation zu MCP-Ressourcen](docs_url)." + tools_submit: "Tools aktualisieren" multi_update: - success: MCP-Konfigurationen wurden erfolgreich aktualisiert. + success: "MCP-Konfigurationen wurden erfolgreich aktualisiert." server_form: - description_caption: Wie der MCP-Server gegenüber anderen Anwendungen beschrieben - wird, die sich damit verbinden. - title_caption: Ein kurzer Titel, der Anwendungen angezeigt wird, die sich - mit dem MCP-Server verbinden. - tool_response_format: Antwortformat des Tools - tool_response_format_content_only_label: Nur Inhalt - tool_response_format_content_only_caption: 'Wählen Sie diese Option, wenn - MCP-Clients, die sich mit dieser Instanz verbinden, keine strukturierten - Inhalte unterstützen. Die Antworten des Tools enthalten dann nur den reinen - Textinhalt und lassen die strukturierte Inhalte aus. - - ' - tool_response_format_full_label: Vollständig - tool_response_format_full_caption: 'Die kompatibelste Option. Die Antworten - des Tools enthalten sowohl reguläre als auch strukturierte Inhalte, so dass - MCP-Clients wählen können, welches Format sie lesen möchten. Dies kann die - Anzahl der Token erhöhen, die das Sprachmodell verarbeiten muss, was die - Kosten erhöhen und die Leistung verringern kann. - - ' - tool_response_format_structured_only_label: Nur strukturierte Inhalte - tool_response_format_structured_only_caption: 'Wählen Sie diese Option, wenn - Sie sicher sind, dass MCP-Clients, die sich mit dieser Instanz verbinden, - strukturierte Inhalte unterstützen. Die Antworten des Tools enthalten dann - nur strukturierte Inhalte und nicht deren Textdarstellung. - - ' + description_caption: "Wie der MCP-Server gegenüber anderen Anwendungen beschrieben wird, die sich damit verbinden." + title_caption: "Ein kurzer Titel, der Anwendungen angezeigt wird, die sich mit dem MCP-Server verbinden." + tool_response_format: "Antwortformat des Tools" + tool_response_format_content_only_label: "Nur Inhalt" + tool_response_format_content_only_caption: > + Wählen Sie diese Option, wenn MCP-Clients, die sich mit dieser Instanz verbinden, keine strukturierten Inhalte unterstützen. Die Antworten des Tools enthalten dann nur den reinen Textinhalt und lassen die strukturierte Inhalte aus. + tool_response_format_full_label: "Vollständig" + tool_response_format_full_caption: > + Die kompatibelste Option. Die Antworten des Tools enthalten sowohl reguläre als auch strukturierte Inhalte, so dass MCP-Clients wählen können, welches Format sie lesen möchten. Dies kann die Anzahl der Token erhöhen, die das Sprachmodell verarbeiten muss, was die Kosten erhöhen und die Leistung verringern kann. + tool_response_format_structured_only_label: "Nur strukturierte Inhalte" + tool_response_format_structured_only_caption: > + Wählen Sie diese Option, wenn Sie sicher sind, dass MCP-Clients, die sich mit dieser Instanz verbinden, strukturierte Inhalte unterstützen. Die Antworten des Tools enthalten dann nur strukturierte Inhalte und nicht deren Textdarstellung. update: - failure: Die MCP-Konfiguration konnte nicht aktualisiert werden. - success: Die MCP-Konfiguration wurde erfolgreich aktualisiert. + failure: "Die MCP-Konfiguration konnte nicht aktualisiert werden." + success: "Die MCP-Konfiguration wurde erfolgreich aktualisiert." scim_clients: authentication_methods: - sso: JWT vom Identitätsanbieter - oauth2_client: OAuth 2.0 Client-Anmeldeinformationen - oauth2_token: Statisches Zugriffstoken + sso: "JWT vom Identitätsanbieter" + oauth2_client: "OAuth 2.0 Client-Anmeldeinformationen" + oauth2_token: "Statisches Zugriffstoken" created_client_credentials_dialog_component: - title: Client-Zugangsdaten erstellt - heading: Client-Zugangsdaten wurden generiert - one_time_hint: Dies ist das einzige Mal, dass dieses Token angezeigt wird. - Stellen Sie sicher, dass Sie es jetzt kopieren. + title: "Client-Zugangsdaten erstellt" + heading: "Client-Zugangsdaten wurden generiert" + one_time_hint: "Dies ist das einzige Mal, dass dieses Token angezeigt wird. Stellen Sie sicher, dass Sie es jetzt kopieren." created_token_dialog_component: - title: Token erstellt - heading: Ein Token wurde generiert - label_token: Token - one_time_hint: Dies ist das einzige Mal, dass dieses Token angezeigt wird. - Stellen Sie sicher, dass Sie es jetzt kopieren. + title: "Token erstellt" + heading: "Ein Token wurde generiert" + label_token: "Token" + one_time_hint: "Dies ist das einzige Mal, dass dieses Token angezeigt wird. Stellen Sie sicher, dass Sie es jetzt kopieren." delete_scim_client_dialog_component: - title: SCIM-Client löschen - heading: Sind Sie sicher, dass Sie diesen SCIM-Client löschen möchten? - description: Von diesem SCIM-Client verwaltete Benutzer können nicht mehr - von ihm aktualisiert werden. + title: "SCIM-Client löschen" + heading: "Sind Sie sicher, dass Sie diesen SCIM-Client löschen möchten?" + description: "Von diesem SCIM-Client verwaltete Benutzer können nicht mehr von ihm aktualisiert werden." edit: - label_delete_scim_client: SCIM-Client löschen + label_delete_scim_client: "SCIM-Client löschen" form: - auth_provider_description: Dies ist der Dienst, den die vom SCIM-Anbieter - hinzugefügten Benutzer für die Authentifizierung in OpenProject verwenden - werden. - authentication_method_description_html: So authentifiziert sich der SCIM-Client - bei OpenProject. Bitte stellen Sie sicher, dass OAuth Tokens den scim_v2 - Scope enthalten. - description: Mehr Informationen zu den folgenden Einstellungen können in [unserer - Dokumentation](docs_url) gefunden werden. - jwt_sub_description: Beispielsweise für Keycloak ist dies die UUID des Service-Accounts - der zum SCIM-Client gehört. Weitere Informationen finden Sie in [unserer - Dokumentation](docs_url). - name_description: Wählen Sie einen Namen, der anderen Administratoren hilft, - besser zu verstehen, warum dieser Client konfiguriert wurde. + auth_provider_description: "Dies ist der Dienst, den die vom SCIM-Anbieter hinzugefügten Benutzer für die Authentifizierung in OpenProject verwenden werden." + authentication_method_description_html: "So authentifiziert sich der SCIM-Client bei OpenProject. Bitte stellen Sie sicher, dass OAuth Tokens den scim_v2 Scope enthalten." + description: "Mehr Informationen zu den folgenden Einstellungen können in [unserer Dokumentation](docs_url) gefunden werden." + jwt_sub_description: "Beispielsweise für Keycloak ist dies die UUID des Service-Accounts der zum SCIM-Client gehört. Weitere Informationen finden Sie in [unserer Dokumentation](docs_url)." + name_description: "Wählen Sie einen Namen, der anderen Administratoren hilft, besser zu verstehen, warum dieser Client konfiguriert wurde." index: - description: SCIM-Clients, die hier konfiguriert werden, können mit der OpenProject - SCIM-Server-API interagieren, um Benutzerkonten und Gruppen zu erstellen, - zu aktualisieren und zu entfernen. - label_create_button: SCIM-Client hinzufügen + description: "SCIM-Clients, die hier konfiguriert werden, können mit der OpenProject SCIM-Server-API interagieren, um Benutzerkonten und Gruppen zu erstellen, zu aktualisieren und zu entfernen." + label_create_button: "SCIM-Client hinzufügen" new: - title: Neuer SCIM-Client + title: "Neuer SCIM-Client" revoke_static_token_dialog_component: - confirm_button: Widerrufen - title: Statisches Token widerrufen - heading: Sind Sie sicher, dass Sie dieses Token widerrufen möchten? - description: Der SCIM-Client, der dieses Token verwendet, kann nicht mehr - auf die SCIM-Server-API von OpenProject zugreifen. + confirm_button: "Widerrufen" + title: "Statisches Token widerrufen" + heading: "Sind Sie sicher, dass Sie dieses Token widerrufen möchten?" + description: "Der SCIM-Client, der dieses Token verwendet, kann nicht mehr auf die SCIM-Server-API von OpenProject zugreifen." table_component: blank_slate: - title: Noch keine SCIM-Clients konfiguriert - description: Clients hinzufügen, um sie hier zu sehen - user_count: Benutzer + title: "Noch keine SCIM-Clients konfiguriert" + description: "Clients hinzufügen, um sie hier zu sehen" + user_count: "Benutzer" token_list_component: - description: Die Token, die Sie hier erzeugen, können von einem SCIM-Client - weitergegeben werden, um auf die OpenProject SCIM-API zuzugreifen. - heading: Token - label_add_token: Token - label_aria_add_token: Token hinzufügen + description: "Die Token, die Sie hier erzeugen, können von einem SCIM-Client weitergegeben werden, um auf die OpenProject SCIM-API zuzugreifen." + heading: "Token" + label_add_token: "Token" + label_aria_add_token: "Token hinzufügen" token_table_component: blank_slate: - title: Es sind noch keine Token erstellt worden - description: Sie können jetzt eins erstellen - expired: Abgelaufen am %{date} - revoked: Widerrufen am %{date} - title: Zugangs-Token Tabelle + title: "Es sind noch keine Token erstellt worden" + description: "Sie können jetzt eins erstellen" + expired: "Abgelaufen am %{date}" + revoked: "Widerrufen am %{date}" + title: "Zugangs-Token Tabelle" settings: new_project: - project_creation: Erstellung von Projekten - notification_text_default: "

Hallo,

Ein neues Projekt wurde erstellt: - projectValue:name

Vielen Dank

\n" + project_creation: "Erstellung von Projekten" + notification_text_default: > +

Hallo,

Ein neues Projekt wurde erstellt: projectValue:name

Vielen Dank

workflows: tabs: - default_transitions: Standard-Übergänge - user_author: Benutzer ist Autor - user_assignee: Benutzer ist zugewiesen + default_transitions: "Standard-Übergänge" + user_author: "Benutzer ist Autor" + user_assignee: "Benutzer ist zugewiesen" authentication: - login_and_registration: Anmeldung und Registrierung + login_and_registration: "Anmeldung und Registrierung" announcements: show_until: Anzeigen bis is_active: derzeit angezeigt is_inactive: derzeit nicht angezeigt antivirus_scan: - not_processed_yet_message: Das Herunterladen ist blockiert, da die Datei noch - nicht auf Viren gescannt wurde. Bitte versuchen Sie es später noch einmal. - quarantined_message: In der Datei '%{filename}' wurde ein Virus entdeckt. Sie - wurde unter Quarantäne gestellt und kann nicht heruntergeladen werden. - deleted_message: In der Datei '%{filename}' wurde ein Virus entdeckt. Die Datei - wurde gelöscht. - deleted_by_admin: Die unter Quarantäne gestellte Datei '%{filename}' wurde von - einem Administrator gelöscht. - overridden_by_admin: Die Quarantäne für die Datei '%{filename}' wurde von %{user} - entfernt. Auf die Datei kann nun zugegriffen werden. + not_processed_yet_message: "Das Herunterladen ist blockiert, da die Datei noch nicht auf Viren gescannt wurde. Bitte versuchen Sie es später noch einmal." + quarantined_message: "In der Datei '%{filename}' wurde ein Virus entdeckt. Sie wurde unter Quarantäne gestellt und kann nicht heruntergeladen werden." + deleted_message: "In der Datei '%{filename}' wurde ein Virus entdeckt. Die Datei wurde gelöscht." + deleted_by_admin: "Die unter Quarantäne gestellte Datei '%{filename}' wurde von einem Administrator gelöscht." + overridden_by_admin: "Die Quarantäne für die Datei '%{filename}' wurde von %{user} entfernt. Auf die Datei kann nun zugegriffen werden." quarantined_attachments: - container: Container - delete: Unter Quarantäne gestellte Datei löschen - title: Unter Quarantäne gestellte Anhänge - error_cannot_act_self: Sie können keine Aktionen für Ihre eigenen hochgeladenen - Dateien durchführen. + container: "Container" + delete: "Unter Quarantäne gestellte Datei löschen" + title: "Unter Quarantäne gestellte Anhänge" + error_cannot_act_self: "Sie können keine Aktionen für Ihre eigenen hochgeladenen Dateien durchführen." attribute_help_texts: - caption: Diese Kurzversion wird als Untertitel des Attributs angezeigt. - note_public: Alle Texte und Bilder, die Sie diesem Feld hinzufügen, sind öffentlich - für angemeldete Benutzer sichtbar. - text_overview: In dieser Ansicht können Sie benutzerdefinierte Hilfe-Texte für - Attribute definieren. Für Attribute mit hinterlegtem Text können diese über - ein kleines Hilfe-Icon neben dem Attribut angezeigt werden. - show_preview: Vorschau des Hilfe-Textes - add_new: Hilfe-Text hinzufügen - edit_field_name: Hilfe-Text für %{attribute_field_name} bearbeiten + caption: "Diese Kurzversion wird als Untertitel des Attributs angezeigt." + note_public: "Alle Texte und Bilder, die Sie diesem Feld hinzufügen, sind öffentlich für angemeldete Benutzer sichtbar." + text_overview: "In dieser Ansicht können Sie benutzerdefinierte Hilfe-Texte für Attribute definieren. Für Attribute mit hinterlegtem Text können diese über ein kleines Hilfe-Icon neben dem Attribut angezeigt werden." + show_preview: "Vorschau des Hilfe-Textes" + add_new: "Hilfe-Text hinzufügen" + edit_field_name: "Hilfe-Text für %{attribute_field_name} bearbeiten" background_jobs: status: - error_requeue: 'Der Job ist mit einem Fehler fehlgeschlagen, wird aber erneut - eingestellt. Der Fehler war: %{message}' - cancelled_due_to: 'Job wurde aufgrund eines Fehlers abgebrochen: %{message}' + error_requeue: "Der Job ist mit einem Fehler fehlgeschlagen, wird aber erneut eingestellt. Der Fehler war: %{message}" + cancelled_due_to: "Job wurde aufgrund eines Fehlers abgebrochen: %{message}" ldap_auth_sources: - ldap_error: 'LDAP-Fehler: %{error_message}' - ldap_auth_failed: Die Authentifizierung gegenüber des LDAP-Servers ist fehlgeschlagen. - sync_failed: 'Fehler beim Synchronisieren von LDAP: %{message}.' - back_to_index: Klicken Sie hier, um zur Liste der Verbindungen zurückzukehren. + ldap_error: "LDAP-Fehler: %{error_message}" + ldap_auth_failed: "Die Authentifizierung gegenüber des LDAP-Servers ist fehlgeschlagen." + sync_failed: "Fehler beim Synchronisieren von LDAP: %{message}." + back_to_index: "Klicken Sie hier, um zur Liste der Verbindungen zurückzukehren." technical_warning: | Dieses LDAP-Formular erfordert technische Kenntnisse über Ihre LDAP/Active Directory-Einrichtung. [Bitte besuchen Sie unsere Dokumentation für detaillierte Anweisungen](docs_url). attribute_texts: name: Beliebiger Name der LDAP-Verbindung host: LDAP-Hostname oder IP-Adresse - login_map: Der Attributschlüssel in LDAP, der benutzt wird, um die eindeutige - Benutzeranmeldung zu identifizieren. Normalerweise ist das `uid` oder `samAccountName`. - generic_map: Der Attributschlüssel in LDAP, der dem OpenProject `%{attribute}` - Attribut zugeordnet ist - admin_map_html: "Optional: Der Attributschlüssel in LDAP der, falls - vorhanden, den OpenProject-Nutzer als einen Administrator markiert. - \nIm Zweifel leer lassen." + login_map: Der Attributschlüssel in LDAP, der benutzt wird, um die eindeutige Benutzeranmeldung zu identifizieren. Normalerweise ist das `uid` oder `samAccountName`. + generic_map: Der Attributschlüssel in LDAP, der dem OpenProject `%{attribute}` Attribut zugeordnet ist + admin_map_html: "Optional: Der Attributschlüssel in LDAP der, falls vorhanden, den OpenProject-Nutzer als einen Administrator markiert. \nIm Zweifel leer lassen." system_user_dn_html: | Geben Sie den DN des Systembenutzers ein, der für schreibgeschützten Zugriff verwendet wird.
@@ -520,59 +430,38 @@ de: Geben Sie den Basis-DN des Unterbaums in LDAP ein, in dem OpenProject nach Benutzern und Gruppen suchen soll. OpenProject filtert nur nach angegebenen Benutzernamen in diesem Unterbaum. Beispiel: ou=users,dc=example,dc=com - filter_string: 'Fügen Sie einen optionalen RFC4515 Filter hinzu, um die zu findenden - Benutzer im LDAP weiter einschränken zu können. Dieser Fillter wird für die - Authentifizierung und Gruppensynchronisierung verwendet. - - ' + filter_string: | + Fügen Sie einen optionalen RFC4515 Filter hinzu, um die zu findenden Benutzer im LDAP weiter einschränken zu können. Dieser Fillter wird für die Authentifizierung und Gruppensynchronisierung verwendet. filter_string_concat: | OpenProject filtert immer nach dem Login-Attribut des Benutzers, um einen LDAP-Eintrag zu identifizieren. Wenn Sie hier einen Filter angeben, wird mit einem 'UND' verbunden. Standardmäßig wird ein Catch-All-Filter (objectClass=*) verwendet. onthefly_register: | Wenn Sie dieses Häkchen setzen, erstellt OpenProject automatisch neue Benutzer aus ihren zugehörigen LDAP-Einträgen, wenn sie sich zuerst mit OpenProject anmelden. Lassen Sie sie deaktiviert, um nur existierenden Konten in OpenProject die Authentifizierung über LDAP zu ermöglichen! - connection_encryption: Verbindungsverschlüsselung - encryption_details: LDAPS / STARTTLS Optionen - system_account: Systemkonto + connection_encryption: "Verbindungsverschlüsselung" + encryption_details: "LDAPS / STARTTLS Optionen" + system_account: "Systemkonto" system_account_legend: | OpenProject benötigt lesenden Zugriff über ein LDAP-Systemkonto, um Benutzer und Gruppen in Ihrem LDAP-Baum zu suchen. Bitte geben Sie die Anmeldedaten für den Systembenutzer im folgenden Abschnitt an. - ldap_details: LDAP-Details - user_settings: Zuordnen von Attributen - user_settings_legend: 'Die folgenden Felder beziehen sich darauf, wie Benutzer - in OpenProject aus LDAP-Einträgen erstellt werden und welche LDAP-Attribute - verwendet werden, um die Attribute eines OpenProject-Benutzers (Attributzuordnung) - zu definieren. - - ' + ldap_details: "LDAP-Details" + user_settings: "Zuordnen von Attributen" + user_settings_legend: | + Die folgenden Felder beziehen sich darauf, wie Benutzer in OpenProject aus LDAP-Einträgen erstellt werden und welche LDAP-Attribute verwendet werden, um die Attribute eines OpenProject-Benutzers (Attributzuordnung) zu definieren. tls_mode: - plain: keine - simple_tls: LDAPS - start_tls: STARTTLS - plain_description: Öffnet eine unverschlüsselte Verbindung zum LDAP-Server. - Wird für Produktionsumgebungen nicht empfohlen. - simple_tls_description: LDAPS verwenden. Benötigt einen separaten Port auf dem - LDAP-Server. Dieser Modus ist oft veraltet, wir empfehlen STARTTLS zu verwenden, - wann immer dies möglich ist. - start_tls_description: Sendet einen STARTTLS-Befehl nach der Verbindung zum - Standard-LDAP-Port. Empfohlen für verschlüsselte Verbindungen. - section_more_info_link_html: 'Dieser Abschnitt betrifft die Verbindungssicherheit - dieser LDAP-Authentifizierungsquelle. Besuchen Sie für weitere Informationen - die Net::LDAP Dokumentation. - - ' + plain: "keine" + simple_tls: "LDAPS" + start_tls: "STARTTLS" + plain_description: "Öffnet eine unverschlüsselte Verbindung zum LDAP-Server. Wird für Produktionsumgebungen nicht empfohlen." + simple_tls_description: "LDAPS verwenden. Benötigt einen separaten Port auf dem LDAP-Server. Dieser Modus ist oft veraltet, wir empfehlen STARTTLS zu verwenden, wann immer dies möglich ist." + start_tls_description: "Sendet einen STARTTLS-Befehl nach der Verbindung zum Standard-LDAP-Port. Empfohlen für verschlüsselte Verbindungen." + section_more_info_link_html: > + Dieser Abschnitt betrifft die Verbindungssicherheit dieser LDAP-Authentifizierungsquelle. Besuchen Sie für weitere Informationen die Net::LDAP Dokumentation. tls_options: - verify_peer: SSL-Zertifikat überprüfen - verify_peer_description_html: 'Aktiviert die strikte SSL-Überprüfung der vertrauenswürdigen - Zertifikatskette.
Warnung: Ausstellen dieser Option - deaktiviert die SSL-Überprüfung des LDAP-Serverzertifikats. Ihre Verbindung - wird anfällig für Man-In-The-Middle (MITM) Angriffe. - - ' - tls_certificate_description: Wenn sich das LDAP-Server-Zertifikat nicht in den - vertrauenswürdigen Quellen dieses Systems befindet, können Sie es hier manuell - hinzufügen. Fügen Sie an dieser Stelle ein oder mehrere PEM X509 Zertifkate - ein. + verify_peer: "SSL-Zertifikat überprüfen" + verify_peer_description_html: > + Aktiviert die strikte SSL-Überprüfung der vertrauenswürdigen Zertifikatskette.
Warnung: Ausstellen dieser Option deaktiviert die SSL-Überprüfung des LDAP-Serverzertifikats. Ihre Verbindung wird anfällig für Man-In-The-Middle (MITM) Angriffe. + tls_certificate_description: "Wenn sich das LDAP-Server-Zertifikat nicht in den vertrauenswürdigen Quellen dieses Systems befindet, können Sie es hier manuell hinzufügen. Fügen Sie an dieser Stelle ein oder mehrere PEM X509 Zertifkate ein." forums: show: no_results_title_text: Zur Zeit existieren keine Forumseinträge für dieses Forum. @@ -580,66 +469,54 @@ de: index: no_results_title_text: Derzeit gibt es keine Farben. no_results_content_text: Neue Farbe anlegen - label_new_color: Neue Farbe + label_new_color: "Neue Farbe" new: - label_new_color: Neue Farbe + label_new_color: "Neue Farbe" edit: - label_edit_color: Farbe bearbeiten + label_edit_color: "Farbe bearbeiten" form: - label_new_color: Neue Farbe - label_edit_color: Farbe bearbeiten - label_no_color: Keine Farbe - label_properties: Eigenschaften - label_really_delete_color: 'Möchten Sie die folgende Farbe wirklich löschen? Typen, - die diese Farbe verwenden, bleiben erhalten. - - ' + label_new_color: "Neue Farbe" + label_edit_color: "Farbe bearbeiten" + label_no_color: "Keine Farbe" + label_properties: "Eigenschaften" + label_really_delete_color: > + Möchten Sie die folgende Farbe wirklich löschen? Typen, die diese Farbe verwenden, bleiben erhalten. custom_actions: actions: - name: Aktionen - add: Aktion hinzufügen + name: "Aktionen" + add: "Aktion hinzufügen" assigned_to: executing_user_value: "(An ausführenden Nutzer zuweisen)" - conditions: Bedingungen - plural: Benutzerdefinierte Aktionen - new: Benutzerdefinierte Aktion hinzufügen - edit: Benutzerdefinierte Aktion %{name} bearbeiten + conditions: "Bedingungen" + plural: "Benutzerdefinierte Aktionen" + new: "Benutzerdefinierte Aktion hinzufügen" + edit: "Benutzerdefinierte Aktion %{name} bearbeiten" execute: "%{name} ausführen" custom_fields: admin: custom_field_projects: is_for_all_blank_slate: heading: Für alle Projekte - description: Dieses Projekt-Attribut ist in allen Projekten aktiviert, da - die Option "Für alle Projekte" aktiviert ist. Es kann nicht für einzelne - Projekte deaktiviert werden. + description: Dieses Projekt-Attribut ist in allen Projekten aktiviert, da die Option "Für alle Projekte" aktiviert ist. Es kann nicht für einzelne Projekte deaktiviert werden. items: - actions: Aktionen + actions: "Aktionen" blankslate: root: - title: Ihre Liste der Elemente ist leer - description: Beginnen Sie mit dem Hinzufügen von Elementen in das benutzerdefinierte - Feld der Typ-Hierarchie. Jedes Element kann verwendet werden, um eine - Hierarchie darunter zu erstellen. Um Unterelemente innerhalb einer Hierarchie - zu navigieren und zu erstellen, klicken Sie auf das erstellte Element. + title: "Ihre Liste der Elemente ist leer" + description: "Beginnen Sie mit dem Hinzufügen von Elementen in das benutzerdefinierte Feld der Typ-Hierarchie. Jedes Element kann verwendet werden, um eine Hierarchie darunter zu erstellen. Um Unterelemente innerhalb einer Hierarchie zu navigieren und zu erstellen, klicken Sie auf das erstellte Element." item: title: Dieses Element hat keine untergeordnete Hierarchieebene - description: Füge Elemente zu dieser Liste hinzu, um Unterelemente innerhalb - eines anderen zu erstellen + description: Füge Elemente zu dieser Liste hinzu, um Unterelemente innerhalb eines anderen zu erstellen delete_dialog: - title: Benutzerdefiniertes Feldelement löschen - heading: Benutzerdefiniertes Feldelement löschen? - description: Mit dieser Aktion werden das Element und alle seine Unterelemente - unwiderruflich entfernt. Alle zugewiesenen Werte werden endgültig gelöscht. - Wenn dieses Feld erforderlich ist, kann das Entfernen von Elementen dazu - führen, dass bestehende Arbeitspakete ungültig werden. + title: "Benutzerdefiniertes Feldelement löschen" + heading: "Benutzerdefiniertes Feldelement löschen?" + description: "Mit dieser Aktion werden das Element und alle seine Unterelemente unwiderruflich entfernt. Alle zugewiesenen Werte werden endgültig gelöscht. Wenn dieses Feld erforderlich ist, kann das Entfernen von Elementen dazu führen, dass bestehende Arbeitspakete ungültig werden." placeholder: - label: Elementbezeichnung - short: Kurzname - weight: Gewichtung + label: "Elementbezeichnung" + short: "Kurzname" + weight: "Gewichtung" notice: - remember_items_and_projects: Denken Sie daran, Einträge und Projekte in den - jeweiligen Registerkarten für dieses benutzerdefinierte Feld festzulegen. + remember_items_and_projects: "Denken Sie daran, Einträge und Projekte in den jeweiligen Registerkarten für dieses benutzerdefinierte Feld festzulegen." hierarchy: subitems: zero: keine Unterelemente @@ -647,188 +524,145 @@ de: other: "%{count} Unterelemente" role_assignment: title: Rollenzuweisung - description: Sie können jedem Benutzer, dem dieses Projektattribut zugewiesen - wurde, automatisch eine bestimmte Projektrolle zuweisen, unabhängig von - der ursprünglichen Rolle dieses Benutzers in diesem Projekt. - warning: Je nach der unten ausgewählten Rolle kann der Benutzer, der diesem - Projektattribut zugewiesen ist, wesentlich mehr Berechtigungen erhalten, - als er zuvor hatte. Dies könnte bedeuten, dass er seine eigene Rolle und - verknüpfte Berechtigungen ausweitet. - role_field_label: Projektrolle - role_field_caption: Diese Projektrolle wird automatisch jedem Benutzer zugewiesen, - der diesem Projektattribut zugeordnet ist - review_hint: 'Es gibt %{user_count}, die diesem Projektattribut bereits in - verschiedenen Projekten zugewiesen sind. Sie könnten zusätzliche Berechtigungen - erhalten und zu Projekten als Mitglied hinzugefügt werden, auf die sie vorher - keinen Zugriff hatten. - - ' + description: Sie können jedem Benutzer, dem dieses Projektattribut zugewiesen wurde, automatisch eine bestimmte Projektrolle zuweisen, unabhängig von der ursprünglichen Rolle dieses Benutzers in diesem Projekt. + warning: Je nach der unten ausgewählten Rolle kann der Benutzer, der diesem Projektattribut zugewiesen ist, wesentlich mehr Berechtigungen erhalten, als er zuvor hatte. Dies könnte bedeuten, dass er seine eigene Rolle und verknüpfte Berechtigungen ausweitet. + role_field_label: "Projektrolle" + role_field_caption: Diese Projektrolle wird automatisch jedem Benutzer zugewiesen, der diesem Projektattribut zugeordnet ist + review_hint: > + Es gibt %{user_count}, die diesem Projektattribut bereits in verschiedenen Projekten zugewiesen sind. Sie könnten zusätzliche Berechtigungen erhalten und zu Projekten als Mitglied hinzugefügt werden, auf die sie vorher keinen Zugriff hatten. review_button: Benutzer und Berechtigungen prüfen dialog: - title: Übersicht über Benutzer und Berechtigungen + title: "Übersicht über Benutzer und Berechtigungen" change: Ändern changes: new_member: Wird als Mitglied hinzugefügt remove_member: Wird als Mitglied entfernt - gain_and_lose_role: Wird die Rolle '%{old_role}' verlieren und die Rolle - '%{new_role}' erhalten + gain_and_lose_role: Wird die Rolle '%{old_role}' verlieren und die Rolle '%{new_role}' erhalten gain_role: Wird die Rolle '%{new_role}' erhalten lose_role: Wird die Rolle '%{old_role}' verlieren no_change: Keine Änderungen - text_add_new_custom_field: 'Um neue benutzerdefinierte Felder einem Projekt zuzuweisen, - müssen Sie diese erst global erstellen, um Sie dann an dieser Stelle aktivieren - zu können. - - ' - is_enabled_globally: Für alle Projekte aktiviert - enabled_in_project: Im Projekt aktiviert - contained_in_type: In Typ enthalten - confirm_destroy_option: Löschen eines Werts entfernt alle bereits gesetzten Werte - (z.B. bei Arbeitspaketen). Sind Sie sicher, dass Sie den Wert löschen möchten? - reorder_alphabetical: Alphabetisch umsortieren - reorder_confirmation: 'Warnung: Die aktuelle Reihenfolge der verfügbaren Werte - sowie alle nicht gespeicherten Werte gehen verloren. Sind Sie sicher, dass Sie - fortfahren möchten?' - placeholder_version_select: Zunächst muss ein Arbeitspaket oder ein Projekt ausgewählt - werden - calculated_field_not_editable: Nicht editierbares Attribut. Dieser Wert wird automatisch - berechnet. - no_role_assigment: Keine Rollenzuweisung + text_add_new_custom_field: > + Um neue benutzerdefinierte Felder einem Projekt zuzuweisen, müssen Sie diese erst global erstellen, um Sie dann an dieser Stelle aktivieren zu können. + is_enabled_globally: "Für alle Projekte aktiviert" + enabled_in_project: "Im Projekt aktiviert" + contained_in_type: "In Typ enthalten" + confirm_destroy_option: "Löschen eines Werts entfernt alle bereits gesetzten Werte (z.B. bei Arbeitspaketen). Sind Sie sicher, dass Sie den Wert löschen möchten?" + reorder_alphabetical: "Alphabetisch umsortieren" + reorder_confirmation: "Warnung: Die aktuelle Reihenfolge der verfügbaren Werte sowie alle nicht gespeicherten Werte gehen verloren. Sind Sie sicher, dass Sie fortfahren möchten?" + placeholder_version_select: "Zunächst muss ein Arbeitspaket oder ein Projekt ausgewählt werden" + calculated_field_not_editable: "Nicht editierbares Attribut. Dieser Wert wird automatisch berechnet." + no_role_assigment: "Keine Rollenzuweisung" instructions: is_required: - all: Markieren Sie das benutzerdefinierte Feld als erforderlich. Dadurch wird - das Ausfüllen des Feldes bei der Erstellung neuer Ressourcen obligatorisch. - Bei der Aktualisierung bestehender Felder wird kein Wert benötigt. - project: Erforderliche Attribute müssen vom Benutzer bei der Projekterstellung - ausgefüllt werden, wenn das Feld aktiv ist ("Für alle Projekte" aktiviert - oder beim Kopieren eines Projekts/Templates, in dem das Feld aktiv ist). - Vorhandene Projekte benötigen keinen Wert, wenn sie aktualisiert werden. + all: "Markieren Sie das benutzerdefinierte Feld als erforderlich. Dadurch wird das Ausfüllen des Feldes bei der Erstellung neuer Ressourcen obligatorisch. Bei der Aktualisierung bestehender Felder wird kein Wert benötigt." + project: "Erforderliche Attribute müssen vom Benutzer bei der Projekterstellung ausgefüllt werden, wenn das Feld aktiv ist (\"Für alle Projekte\" aktiviert oder beim Kopieren eines Projekts/Templates, in dem das Feld aktiv ist). Vorhandene Projekte benötigen keinen Wert, wenn sie aktualisiert werden." is_for_all: - all: Markiert das benutzerdefinierte Feld als verfügbar in allen bestehenden - und neuen Projekten. - project: Markiert das benutzerdefinierte Feld als verfügbar in allen bestehenden - und neuen Projekten. + all: "Markiert das benutzerdefinierte Feld als verfügbar in allen bestehenden und neuen Projekten." + project: "Markiert das benutzerdefinierte Feld als verfügbar in allen bestehenden und neuen Projekten." multi_select: - all: Ermöglicht dem Benutzer, diesem benutzerdefinierten Feld mehrere Werte - zuzuweisen. - project: Ermöglicht dem Benutzer, diesem benutzerdefinierten Feld mehrere - Werte zuzuweisen. + all: "Ermöglicht dem Benutzer, diesem benutzerdefinierten Feld mehrere Werte zuzuweisen." + project: "Ermöglicht dem Benutzer, diesem benutzerdefinierten Feld mehrere Werte zuzuweisen." searchable: - all: Inkludiert die Werte des Feldes in die globale Suche. - project: Das Attribut kann als Filter in Projektlisten ausgewählt werden. + all: "Inkludiert die Werte des Feldes in die globale Suche." + project: "Das Attribut kann als Filter in Projektlisten ausgewählt werden." editable: - all: Feld darf von Benutzern ohne Administratorrechte bearbeitet werden. + all: "Feld darf von Benutzern ohne Administratorrechte bearbeitet werden." admin_only: - all: Das Attribut ist nur für Administratoren sichtbar. Nutzer ohne Adminrechte - können dieses Attribut nicht sehen oder bearbeiten. - project: Das Attribut ist nur für Administratoren sichtbar. Nutzer ohne Adminrechte - können dieses Attribut nicht sehen oder bearbeiten. + all: "Das Attribut ist nur für Administratoren sichtbar. Nutzer ohne Adminrechte können dieses Attribut nicht sehen oder bearbeiten." + project: "Das Attribut ist nur für Administratoren sichtbar. Nutzer ohne Adminrechte können dieses Attribut nicht sehen oder bearbeiten." is_filter: - all: 'Erlaubt das benutzerdefinierte Feld in einem Filter in der Arbeitspaket-Ansicht - zu verwenden. Beachten Sie, dass, nur wenn "Für alle Projekte" ausgewählt - ist, das benutzerdefinierte Feld in globalen Ansichten angezeigt wird. - - ' + all: > + Erlaubt das benutzerdefinierte Feld in einem Filter in der Arbeitspaket-Ansicht zu verwenden. Beachten Sie, dass, nur wenn "Für alle Projekte" ausgewählt ist, das benutzerdefinierte Feld in globalen Ansichten angezeigt wird. formula: - project: Fügen Sie numerische Werte hinzu oder geben Sie / ein, um nach einem - Attribut oder einem mathematischen Operator zu suchen. + project: "Fügen Sie numerische Werte hinzu oder geben Sie / ein, um nach einem Attribut oder einem mathematischen Operator zu suchen." regexp: - all: z. B. ^[A-Z0-9]+$ - project: z. B. ^[A-Z0-9]+$ + all: "z. B. ^[A-Z0-9]+$" + project: "z. B. ^[A-Z0-9]+$" min_max: - all: 0 heißt keine Beschränkung - project: 0 heißt keine Beschränkung + all: "0 heißt keine Beschränkung" + project: "0 heißt keine Beschränkung" has_comment: - project: Ermöglicht es dem Benutzer, zusätzlich einen Kommentar zum Projektattribut - hinzuzufügen, wenn der Wert in der Projektübersicht ausgewählt wird. + project: "Ermöglicht es dem Benutzer, zusätzlich einen Kommentar zum Projektattribut hinzuzufügen, wenn der Wert in der Projektübersicht ausgewählt wird." tab: no_results_title_text: Zur Zeit existieren keine benutzerdefinierten Felder. no_results_content_text: Neues benutzerdefiniertes Feld anlegen calculated_values: error_dialog: - title: Fehler in Berechnetem Wert + title: "Fehler in Berechnetem Wert" errors: - unknown: Ein unbekannter Fehler ist aufgetreten. Bitte überprüfen Sie die Formel - für diesen Berechneten Wert. - mathematical: Die mathematische Formel führt zu einem Fehler. Bitte überprüfen - Sie das Attribut der Projektberechnung und versuchen Sie es erneut. - missing_value: Das Attribut "%{custom_field_name}" wird für diesen Berechneten - Wert benötigt, ist aber leer. - disabled_value: Das Attribut "%{custom_field_name}" wird für diesen Berechneten - Wert benötigt, ist aber leer. + unknown: "Ein unbekannter Fehler ist aufgetreten. Bitte überprüfen Sie die Formel für diesen Berechneten Wert." + mathematical: "Die mathematische Formel führt zu einem Fehler. Bitte überprüfen Sie das Attribut der Projektberechnung und versuchen Sie es erneut." + missing_value: Das Attribut "%{custom_field_name}" wird für diesen Berechneten Wert benötigt, ist aber leer. + disabled_value: Das Attribut "%{custom_field_name}" wird für diesen Berechneten Wert benötigt, ist aber leer. concatenation: - single: oder + single: "oder" danger_dialog: - confirmation_live_message_checked: Die Schaltfläche zum Fortfahren ist nun aktiv. - confirmation_live_message_unchecked: Die Schaltfläche zum Fortfahren ist inaktiv. - Sie müssen das Kontrollkästchen ankreuzen, um fortzufahren. + confirmation_live_message_checked: "Die Schaltfläche zum Fortfahren ist nun aktiv." + confirmation_live_message_unchecked: "Die Schaltfläche zum Fortfahren ist inaktiv. Sie müssen das Kontrollkästchen ankreuzen, um fortzufahren." mcp_configurations: server_url_component: - caption: Die URL, unter der der OpenProject MCP-Server erreichbar sein wird. - Erforderlich für die Einrichtung von MCP-Clients. - label: Server URL + caption: "Die URL, unter der der OpenProject MCP-Server erreichbar sein wird. Erforderlich für die Einrichtung von MCP-Clients." + label: "Server URL" op_dry_validation: - or: oder + or: "oder" errors: - array?: muss ein Array sein. - decimal?: muss eine Dezimalzahl sein. - defined: darf nicht definiert werden. - eql?: muss gleich %{left} sein. - filled?: muss ausgefüllt werden. - greater_or_equal_zero: muss größer oder gleich 0 sein. - gteq?: muss größer oder gleich %{num} sein. - hash?: muss ein Hash sein. + array?: "muss ein Array sein." + decimal?: "muss eine Dezimalzahl sein." + defined: "darf nicht definiert werden." + eql?: "muss gleich %{left} sein." + filled?: "muss ausgefüllt werden." + greater_or_equal_zero: "muss größer oder gleich 0 sein." + gteq?: "muss größer oder gleich %{num} sein." + hash?: "muss ein Hash sein." included_in?: arg: - default: 'muss einer von: %{list} sein.' - range: 'muss einer von: %{list_left} - %{list_right} sein.' - int?: muss eine ganze Zahl sein. - key?: fehlt. - not_found: nicht gefunden. - respond_to?: die erforderliche Methode nicht implementiert. + default: "muss einer von: %{list} sein." + range: "muss einer von: %{list_left} - %{list_right} sein." + int?: "muss eine ganze Zahl sein." + key?: "fehlt." + not_found: "nicht gefunden." + respond_to?: "die erforderliche Methode nicht implementiert." rules: copy_workflow_from: - workflow_missing: hat keinen eigenen Workflow. + workflow_missing: "hat keinen eigenen Workflow." custom_field: - format_not_supported: format '%{field_format}' wird nicht unterstützt. + format_not_supported: "format '%{field_format}' wird nicht unterstützt." item: - root_item: kann keine Hierarchiewurzel sein. - not_persisted: muss ein bereits vorhandenes Element sein. + root_item: "kann keine Hierarchiewurzel sein." + not_persisted: "muss ein bereits vorhandenes Element sein." label: - not_unique: muss innerhalb der gleichen Hierarchieebene eindeutig sein. + not_unique: "muss innerhalb der gleichen Hierarchieebene eindeutig sein." short: - not_unique: muss innerhalb der gleichen Hierarchieebene eindeutig sein. + not_unique: "muss innerhalb der gleichen Hierarchieebene eindeutig sein." parent: - not_descendant: muss ein Unterelement der Hierarchiewurzel sein. - str?: muss eine Zeichenkette sein. - type?: muss %{type} sein. + not_descendant: "muss ein Unterelement der Hierarchiewurzel sein." + str?: "muss eine Zeichenkette sein." + type?: "muss %{type} sein." rules: - copy_workflow_from: Typ für Workflow-Kopie - enabled: Aktiviert - depth: Tiefe - item: Element - label: Bezeichnung - weight: Gewichtung - short: Kurzname - parent: Übergeordnetes Arbeitspaket - blueprint: Blaupause für Muster + copy_workflow_from: "Typ für Workflow-Kopie" + enabled: "Aktiviert" + depth: "Tiefe" + item: "Element" + label: "Bezeichnung" + weight: "Gewichtung" + short: "Kurzname" + parent: "Übergeordnetes Arbeitspaket" + blueprint: "Blaupause für Muster" global_search: title: - all_projects: Suche nach "%{search_term}" in allen Projekten - current_project: Suche nach "%{search_term}" in %{project_name} - project_and_subprojects: Suche nach "%{search_term}" in %{project_name} und - allen Unterprojekten - placeholder: Suche in %{app_title} + all_projects: 'Suche nach "%{search_term}" in allen Projekten' + current_project: 'Suche nach "%{search_term}" in %{project_name}' + project_and_subprojects: 'Suche nach "%{search_term}" in %{project_name} und allen Unterprojekten' + placeholder: "Suche in %{app_title}" overwritten_tabs: - all: Alle - messages: Forum - wiki_pages: Wiki + all: "Alle" + messages: "Forum" + wiki_pages: "Wiki" groups: edit: - synchronized_groups: Synchronisierte Gruppen + synchronized_groups: "Synchronisierte Gruppen" index: - description: Durch die Gruppierung von Benutzern können Sie diese den gleichen - globalen Rollen oder den gleichen Projekten als Mitglieder zuweisen. + description: Durch die Gruppierung von Benutzern können Sie diese den gleichen globalen Rollen oder den gleichen Projekten als Mitglieder zuweisen. table_component: blank_slate: description: Sie können Gruppen von Benutzern mit eigenen Berechtigungen erstellen. @@ -841,17 +675,11 @@ de: synchronized_groups: blankslate: action: Authentifizierungseinstellungen - description: Wenn diese Gruppe automatisch mit Gruppen in einem Identitätsanbieter - wie beispielsweise OpenID Connect synchronisiert wird, dann taucht diese - Verknüpfung hier auf. Dies können Sie in den Authentifizierungseinstellungen - verwalten. + description: Wenn diese Gruppe automatisch mit Gruppen in einem Identitätsanbieter wie beispielsweise OpenID Connect synchronisiert wird, dann taucht diese Verknüpfung hier auf. Dies können Sie in den Authentifizierungseinstellungen verwalten. title: Noch keine synchronisierten Gruppen incoming_mails: - ignore_filenames: 'Geben Sie eine Liste von Dateinamen an, die beim Verarbeiten - von Anhängen für eingehende Mails (z.B. Signaturen oder Symbole) ignoriert werden - sollen. Geben Sie einen Dateinamen pro Zeile ein. - - ' + ignore_filenames: > + Geben Sie eine Liste von Dateinamen an, die beim Verarbeiten von Anhängen für eingehende Mails (z.B. Signaturen oder Symbole) ignoriert werden sollen. Geben Sie einen Dateinamen pro Zeile ein. portfolios: index: search: @@ -861,54 +689,52 @@ de: one: "1 Unterelement" other: "%{count} Unterelemente" lists: - active: Aktive Portfolios - my: Meine Portfolios - favorited: Favorisierte Portfolios - archived: Archivierte Portfolios + active: "Aktive Portfolios" + my: "Meine Portfolios" + favorited: "Favorisierte Portfolios" + archived: "Archivierte Portfolios" projects: copy: - members: Projektmitglieder - overviews: Projektübersicht - queries: 'Arbeitspakete: gespeicherte Ansichten' - wiki_page_attachments: 'Wiki-Seiten: Anhänge' - work_package_attachments: 'Arbeitspakete: Anhänge' - work_package_categories: 'Arbeitspakete: Kategorien' - work_package_file_links: 'Arbeitspakete: Datei-Links' - work_package_shares: 'Arbeitspakete: Geteilte Zugriffe' + #Contains custom strings for options when copying a project that cannot be found elsewhere. + members: "Projektmitglieder" + overviews: "Projektübersicht" + queries: "Arbeitspakete: gespeicherte Ansichten" + wiki_page_attachments: "Wiki-Seiten: Anhänge" + work_package_attachments: "Arbeitspakete: Anhänge" + work_package_categories: "Arbeitspakete: Kategorien" + work_package_file_links: "Arbeitspakete: Datei-Links" + work_package_shares: "Arbeitspakete: Geteilte Zugriffe" create: - notification_email_subject: Das Projekt '%{project_name}' wurde erstellt - complete_wizard_link: Vervollständigen Sie den %{artefact_name} + notification_email_subject: "Das Projekt '%{project_name}' wurde erstellt" + complete_wizard_link: "Vervollständigen Sie den %{artefact_name}" delete: - scheduled: Die Löschung wurde geplant und wird im Hintergrund durchgeführt. - Sie werden über das Ergebnis informiert. - schedule_failed: 'Projekt kann nicht gelöscht werden: %{errors}' - failed: Löschen des Projekts %{name} ist fehlgeschlagen - failed_text: Die Anfrage zum Löschen des Projekts %{name} ist fehlgeschlagen. - Das Projekt wurde archiviert. - completed: Löschen des Projekts %{name} abgeschlossen - completed_text: Die Anfrage zum Löschen des Projekts '%{name}' wurde abgeschlossen. - completed_text_children: 'Zusätzlich wurden folgende Unterprojekte gelöscht:' + scheduled: "Die Löschung wurde geplant und wird im Hintergrund durchgeführt. Sie werden über das Ergebnis informiert." + schedule_failed: "Projekt kann nicht gelöscht werden: %{errors}" + failed: "Löschen des Projekts %{name} ist fehlgeschlagen" + failed_text: "Die Anfrage zum Löschen des Projekts %{name} ist fehlgeschlagen. Das Projekt wurde archiviert." + completed: "Löschen des Projekts %{name} abgeschlossen" + completed_text: "Die Anfrage zum Löschen des Projekts '%{name}' wurde abgeschlossen." + completed_text_children: "Zusätzlich wurden folgende Unterprojekte gelöscht:" index: - open_as_gantt: Als Gantt-Ansicht öffnen + open_as_gantt: "Als Gantt-Ansicht öffnen" no_results_title_text: Es gibt aktuell keine Projekte no_results_content_text: Neues Projekt erstellen search: label: Filter nach Projektname placeholder: Suche nach Projektname lists: - active: Aktive Projekte - my: Meine Projekte - favorited: Favorisierte Projekte - archived: Archivierte Projekte - shared: Geteilte Projektlisten - my_lists: Meine Projektlisten + active: "Aktive Projekte" + my: "Meine Projekte" + favorited: "Favorisierte Projekte" + archived: "Archivierte Projekte" + shared: "Geteilte Projektlisten" + my_lists: "Meine Projektlisten" new: - placeholder: Neue Projektliste + placeholder: "Neue Projektliste" delete_modal: - title: Projektliste löschen - heading: Diese Projektliste löschen? - text: Diese Aktion löscht keine Projekte, die in der Liste enthalten sind. - Sind Sie sicher, dass Sie diese Projektliste löschen möchten? + title: "Projektliste löschen" + heading: "Diese Projektliste löschen?" + 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_status: Status @@ -916,63 +742,38 @@ de: button_update_details: Einstellungen aktualisieren button_update_status_description: Statusbeschreibung aktualisieren button_update_parent_project: Elternprojekt aktualisieren - public_warning: 'Dieses Projekt ist öffentlich. Nutzer mit Zugriff auf diese - Instanz können dieses Projekt sehen und abhängig der ihnen zugewiesenen Rollen - und Berechtigungen damit interagieren. Unterprojekte haben ihre eigenen Einstellungen - zur Sichtbarkeit und erben nicht diese Einstellung. - - ' + public_warning: > + Dieses Projekt ist öffentlich. Nutzer mit Zugriff auf diese Instanz können dieses Projekt sehen und abhängig der ihnen zugewiesenen Rollen und Berechtigungen damit interagieren. Unterprojekte haben ihre eigenen Einstellungen zur Sichtbarkeit und erben nicht diese Einstellung. public_confirmation: - checkbox: Mir ist bewusst, dass diese Aktion bisher als privat markierte Inhalte - öffentlich machen wird - title: Dieses Projekt öffentlich machen? - description: 'Die Sichtbarkeit dieses Projekts wird auf öffentlich geändert. - Nutzer mit Zugriff auf diese Instanz können dieses Projekt sehen und abhängig - der ihnen zugewiesenen Rollen und Berechtigungen damit interagieren. Unterprojekte - haben ihre eigenen Einstellungen zur Sichtbarkeit und erben nicht diese - Einstellung. - - ' + checkbox: "Mir ist bewusst, dass diese Aktion bisher als privat markierte Inhalte öffentlich machen wird" + title: "Dieses Projekt öffentlich machen?" + description: > + Die Sichtbarkeit dieses Projekts wird auf öffentlich geändert. Nutzer mit Zugriff auf diese Instanz können dieses Projekt sehen und abhängig der ihnen zugewiesenen Rollen und Berechtigungen damit interagieren. Unterprojekte haben ihre eigenen Einstellungen zur Sichtbarkeit und erben nicht diese Einstellung. private_confirmation: - checkbox: Mir ist bewusst, dass diese Aktion bisher als öffentlich markierte - Inhalte privat machen wird. - title: Dieses Projekt privat machen? - description: 'Das Projekt wird nur für Projektmitglieder sichtbar sein, abhängig - von ihrer Rolle und den zugehörigen Berechtigungen. Unterprojekte haben - ihre eigenen Einstellungen zur Sichtbarkeit und erben nicht diese Einstellung. - - ' + checkbox: "Mir ist bewusst, dass diese Aktion bisher als öffentlich markierte Inhalte privat machen wird." + title: "Dieses Projekt privat machen?" + description: > + Das Projekt wird nur für Projektmitglieder sichtbar sein, abhängig von ihrer Rolle und den zugehörigen Berechtigungen. Unterprojekte haben ihre eigenen Einstellungen zur Sichtbarkeit und erben nicht diese Einstellung. change_identifier: Kennung ändern subitems: - template_section: 'Wählen Sie Vorlagen aus, die bei der Erstellung neuer Unterelemente - verwendet werden sollen. - - ' - project_template_label: Vorlage für Projekte - project_template_caption: Wählen Sie eine Projektvorlage, die als Standard - für neue Unterprojekte verwendet werden soll. - program_template_label: Vorlage für Programme - program_template_caption: Wählen Sie eine Programmvorlage, die als Standard - für neue Programme in diesem Portfolio verwendet werden soll. - no_template: Keine vordefinierte Vorlage + template_section: > + Wählen Sie Vorlagen aus, die bei der Erstellung neuer Unterelemente verwendet werden sollen. + project_template_label: "Vorlage für Projekte" + project_template_caption: "Wählen Sie eine Projektvorlage, die als Standard für neue Unterprojekte verwendet werden soll." + program_template_label: "Vorlage für Programme" + program_template_caption: "Wählen Sie eine Programmvorlage, die als Standard für neue Programme in diesem Portfolio verwendet werden soll." + no_template: "Keine vordefinierte Vorlage" template: - menu_title: Vorlage - title: Einstellungen der Vorlage - enable_failed: Das Projekt konnte nicht als Vorlage aktiviert werden. + menu_title: "Vorlage" + title: "Einstellungen der Vorlage" + enable_failed: "Das Projekt konnte nicht als Vorlage aktiviert werden." members: - excluded_roles_label: Rollen, die bei der Anwendung der Vorlage ausgeschlossen - werden sollen - excluded_roles_caption: 'Wenn Sie ein neues Projekt mit dieser Vorlage erstellen, - werden die oben ausgewählten Rollen nicht mit in das neue Projekt übernommen. - Auf diese Weise können Sie auswählen, welche Mitglieder aufgrund ihrer - Projektrollen ausgeschlossen werden sollen. Die Benutzer können dann zu - Ansichtszwecken auf die Vorlage zugreifen, ohne dass sie Zugriff auf neue - Projekte erhalten, die mit dieser Vorlage erstellt werden. - - ' + excluded_roles_label: "Rollen, die bei der Anwendung der Vorlage ausgeschlossen werden sollen" + excluded_roles_caption: > + Wenn Sie ein neues Projekt mit dieser Vorlage erstellen, werden die oben ausgewählten Rollen nicht mit in das neue Projekt übernommen. Auf diese Weise können Sie auswählen, welche Mitglieder aufgrund ihrer Projektrollen ausgeschlossen werden sollen. Die Benutzer können dann zu Ansichtszwecken auf die Vorlage zugreifen, ohne dass sie Zugriff auf neue Projekte erhalten, die mit dieser Vorlage erstellt werden. actions: - label_enable_all: Alles aktivieren - label_disable_all: Alles deaktivieren + label_enable_all: "Alles aktivieren" + label_disable_all: "Alles deaktivieren" activities: no_results_title_text: Zur Zeit stehen keine Aktivitäten zur Verfügung. forums: @@ -982,190 +783,130 @@ de: no_results_title_text: Derzeit gibt es keine Arbeitspaket-Kategorien. no_results_content_text: Neue Arbeitspaket-Kategorie erstellen custom_fields: - no_results_title_text: Derzeit stehen keine benutzerdefinierten Felder zur - Verfügung. + no_results_title_text: Derzeit stehen keine benutzerdefinierten Felder zur Verfügung. life_cycle: header: - title: Projekt-Lebenszyklus - description_html: Die aktiven Projektphasen definieren den Lebenszyklus - dieses Projekts und sind in den Administrationseinstellungendefiniert. - Aktivierte Phasen werden in Ihrer Projektübersicht - angezeigt. - non_defined: Derzeit sind keine Phasen definiert. - section_header: Phasen + title: "Projekt-Lebenszyklus" + description_html: 'Die aktiven Projektphasen definieren den Lebenszyklus dieses Projekts und sind in den Administrationseinstellungendefiniert. Aktivierte Phasen werden in Ihrer Projektübersicht angezeigt.' + non_defined: "Derzeit sind keine Phasen definiert." + section_header: "Phasen" step: use_in_project: "%{step} in diesem Projekt verwenden" filter: - label: Projektphase suchen + label: "Projektphase suchen" project_custom_fields: header: - title: Projektattribute - description_html: 'Diese Projektattribute werden auf Ihrer Projektübersichtsseite in den jeweiligen Abschnitten - angezeigt. Sie können einzelne Attribute aktivieren oder deaktivieren. - Projektattribute und -abschnitte werden in den Administrationseinstellungen durch den Administrator - der Instanz definiert. ' + title: "Projektattribute" + description_html: 'Diese Projektattribute werden auf Ihrer Projektübersichtsseite in den jeweiligen Abschnitten angezeigt. Sie können einzelne Attribute aktivieren oder deaktivieren. Projektattribute und -abschnitte werden in den Administrationseinstellungen durch den Administrator der Instanz definiert. ' filter: - label: Projektattribut suchen + label: "Projektattribut suchen" actions: - label_enable_single: In diesem Projekt aktiv, zum Deaktivieren anklicken - label_disable_single: In diesem Projekt inaktiv, zum Aktivieren anklicken - remove_from_project: Aus dem Projekt entfernen + label_enable_single: "In diesem Projekt aktiv, zum Deaktivieren anklicken" + label_disable_single: "In diesem Projekt inaktiv, zum Aktivieren anklicken" + remove_from_project: "Aus dem Projekt entfernen" is_for_all_blank_slate: heading: Für alle Projekte - description: Dieses Projekt-Attribut ist in allen Projekten aktiviert, da - die Option "Für alle Projekte" aktiviert ist. Es kann nicht für einzelne - Projekte deaktiviert werden. - enabled_via_assignee_when_submitted_html: Dieses Projektattribut kann nicht - deaktiviert werden, da es bei Projektinitiierungsanträgen als Zuweisung bei Einreichung verwendet wird. + description: Dieses Projekt-Attribut ist in allen Projekten aktiviert, da die Option "Für alle Projekte" aktiviert ist. Es kann nicht für einzelne Projekte deaktiviert werden. + enabled_via_assignee_when_submitted_html: Dieses Projektattribut kann nicht deaktiviert werden, da es bei Projektinitiierungsanträgen als Zuweisung bei Einreichung verwendet wird. types: no_results_title_text: Derzeit stehen keine Typen zur Verfügung. form: - enable_type_in_project: Typ "%{type}" aktivieren + enable_type_in_project: 'Typ "%{type}" aktivieren' versions: no_results_title_text: Derzeit gibt es keine Versionen für das Projekt. no_results_content_text: Neue Version erstellen work_packages_graph: Arbeitspaket-Graph show_work_packages: Arbeitspakete anzeigen storage: - no_results_title_text: Durch dieses Projekt wird kein zusätzlicher erfasster - Speicherplatz verbraucht. + no_results_title_text: Durch dieses Projekt wird kein zusätzlicher erfasster Speicherplatz verbraucht. work_package_priorities: - new_label: Neue Priorität + new_label: "Neue Priorität" creation_wizard: errors: - no_work_package_type: Die Anfrage zur Projektinitiierung konnte nicht aktiviert - werden, da dafür mindestens ein aktiver Arbeitspaket-Typ erforderlich - ist und dieses Projekt keinen hat. Bitte fügen Sie diesem Projekt mindestens - einen Arbeitspaket-Typ hinzu. - no_status_when_submitted: Der Antrag auf Projektinitiierung konnte nicht - aktiviert werden, da für den Arbeitspaket-Typ %{type} mindestens ein Status - erforderlich ist, der mit ihm verknüpft ist. Bitte aktivieren Sie mindestens - einen Status-Workflow für diesen Arbeitspaket-Typ. + no_work_package_type: "Die Anfrage zur Projektinitiierung konnte nicht aktiviert werden, da dafür mindestens ein aktiver Arbeitspaket-Typ erforderlich ist und dieses Projekt keinen hat. Bitte fügen Sie diesem Projekt mindestens einen Arbeitspaket-Typ hinzu." + no_status_when_submitted: "Der Antrag auf Projektinitiierung konnte nicht aktiviert werden, da für den Arbeitspaket-Typ %{type} mindestens ein Status erforderlich ist, der mit ihm verknüpft ist. Bitte aktivieren Sie mindestens einen Status-Workflow für diesen Arbeitspaket-Typ." export: - description_attachment_export: Das erzeugte Artefakt wird als PDF-Anhang - zum erstellten Arbeitspaket gespeichert. - description_file_link_export: Das erstellte Arbeitspaket enthält einen Dateilink - zu einer PDF-Datei, die in einem externen Dateispeicher gespeichert ist. - Erfordert einen aktiven Dateispeicher mit automatisch verwalteten Projektordnern. - Im Moment werden nur Nextcloud-Dateispeicher unterstützt. - description_file_storage_selection: Wählen Sie, welcher der konfigurierten - externen Dateispeicher verwendet werden soll. - external_file_storage: Externe Dateispeicher - label_artifact_export: Artefakt-Export - label_attachment_export: Als Dateianhang des Arbeitspakets speichern - label_file_link_export: Datei in externen Dateispeicher hochladen und Dateilink - zum Arbeitspaket hinzufügen - pdf_file_storage: PDF-Datei-Speicherort - unavailable: nicht verfügbar - label_request_submission: Einreichung des Antrags - project_attributes_description: 'Wählen Sie aus, welche Attribute in den Projektinitiierungsantrag - aufgenommen werden sollen. Diese Liste zeigt nur [Projektattribute](project_attributes_url), - die für dieses Projekt aktiviert sind. - - ' - enabled_because_required_html: Dieses Projektattribut kann für diesen Projektinitiierungsantrag - nicht deaktiviert werden, da es als erforderlich definiert ist. Dies kann - in den Administrationseinstellungen - vom Administrator der Instanz geändert werden. + description_attachment_export: "Das erzeugte Artefakt wird als PDF-Anhang zum erstellten Arbeitspaket gespeichert." + description_file_link_export: "Das erstellte Arbeitspaket enthält einen Dateilink zu einer PDF-Datei, die in einem externen Dateispeicher gespeichert ist. Erfordert einen aktiven Dateispeicher mit automatisch verwalteten Projektordnern. Im Moment werden nur Nextcloud-Dateispeicher unterstützt." + description_file_storage_selection: "Wählen Sie, welcher der konfigurierten externen Dateispeicher verwendet werden soll." + external_file_storage: "Externe Dateispeicher" + label_artifact_export: "Artefakt-Export" + label_attachment_export: "Als Dateianhang des Arbeitspakets speichern" + label_file_link_export: "Datei in externen Dateispeicher hochladen und Dateilink zum Arbeitspaket hinzufügen" + pdf_file_storage: "PDF-Datei-Speicherort" + unavailable: "nicht verfügbar" + label_request_submission: "Einreichung des Antrags" + project_attributes_description: > + Wählen Sie aus, welche Attribute in den Projektinitiierungsantrag aufgenommen werden sollen. Diese Liste zeigt nur [Projektattribute](project_attributes_url), die für dieses Projekt aktiviert sind. + enabled_because_required_html: Dieses Projektattribut kann für diesen Projektinitiierungsantrag nicht deaktiviert werden, da es als erforderlich definiert ist. Dies kann in den Administrationseinstellungen vom Administrator der Instanz geändert werden. status: button_edit: Status bearbeiten wizard: - sidebar_content_title: Inhalt - sections: Abschnitte - title: Projektinitiierungsantrag - no_help_text: Für dieses Feld ist kein Hilfetext definiert. - success: Projektattribute gespeichert und Artefakt der Anfrage als Arbeitspaket - erstellt. + sidebar_content_title: "Inhalt" + sections: "Abschnitte" + title: "Projektinitiierungsantrag" + no_help_text: "Für dieses Feld ist kein Hilfetext definiert." + success: "Projektattribute gespeichert und Artefakt der Anfrage als Arbeitspaket erstellt." progress_label: "%{current} von %{total}" - create_artifact_work_package_error: Arbeitspaket für das Artefakt der Anfrage - konnte nicht erstellt werden - create_artifact_storage_error: Artefakt konnte nicht im Dateispeicher gespeichert - werden + create_artifact_work_package_error: "Arbeitspaket für das Artefakt der Anfrage konnte nicht erstellt werden" + create_artifact_storage_error: "Artefakt konnte nicht im Dateispeicher gespeichert werden" lists: create: - success: Die geänderte Liste wurde als neue Liste gespeichert - failure: 'Die geänderte Liste kann nicht gespeichert werden: %{errors}' + success: "Die geänderte Liste wurde als neue Liste gespeichert" + failure: "Die geänderte Liste kann nicht gespeichert werden: %{errors}" update: - success: Die geänderte Liste wurde gespeichert - failure: 'Die geänderte Liste kann nicht gespeichert werden: %{errors}' + success: "Die geänderte Liste wurde gespeichert" + failure: "Die geänderte Liste kann nicht gespeichert werden: %{errors}" publish: - success: Die Liste wurde veröffentlicht - failure: 'Die Liste kann nicht veröffentlicht werden: %{errors}' + success: "Die Liste wurde veröffentlicht" + failure: "Die Liste kann nicht veröffentlicht werden: %{errors}" unpublish: - success: Diese Liste wurde auf privat gestellt - failure: 'Die Liste kann nicht auf privat gestellt werden: %{errors}' - can_be_saved: 'Liste geändert:' - can_be_saved_as: 'Die Änderungen können nur in einer neuen Liste gespeichert werden:' + success: "Diese Liste wurde auf privat gestellt" + failure: "Die Liste kann nicht auf privat gestellt werden: %{errors}" + can_be_saved: "Liste geändert:" + can_be_saved_as: "Die Änderungen können nur in einer neuen Liste gespeichert werden:" members: index: no_results_title_text: Zur Zeit hat dieses Projekt keine Mitglieder. no_results_content_text: Mitglied zum Projekt hinzufügen - invite_by_mail: Einladung an %{mail} senden - send_invite_to: Einladung senden an + invite_by_mail: "Einladung an %{mail} senden" + send_invite_to: "Einladung senden an" columns: - shared: Geteilt + shared: "Geteilt" filters: - all_shares: Alle Freigaben + all_shares: "Alle Freigaben" menu: - all: Alle - invited: Eingeladen - locked: Gesperrt - project_roles: Projektrollen - wp_shares: Arbeitspaket-Freigaben - groups: Gruppen + all: "Alle" + invited: "Eingeladen" + locked: "Gesperrt" + project_roles: "Projektrollen" + wp_shares: "Arbeitspaket-Freigaben" + groups: "Gruppen" delete_member_dialog: - title: Mitglied entfernen - will_remove_the_users_role: Dadurch wird die Rolle des Benutzers aus diesem - Projekt entfernt. - will_remove_the_groups_role: Dadurch wird die Gruppenrolle von diesem Projekt - entfernt. + title: "Mitglied entfernen" + will_remove_the_users_role: "Dadurch wird die Rolle des Benutzers aus diesem Projekt entfernt." + will_remove_the_groups_role: "Dadurch wird die Gruppenrolle von diesem Projekt entfernt." however_work_packages_shared_with_user_html: - one: Allerdings wurde %{shared_work_packages_link} auch mit diesem Benutzer - geteilt. - other: Allerdings wurden auch %{shared_work_packages_link} mit diesem Benutzer - geteilt. + one: "Allerdings wurde %{shared_work_packages_link} auch mit diesem Benutzer geteilt." + other: "Allerdings wurden auch %{shared_work_packages_link} mit diesem Benutzer geteilt." however_work_packages_shared_with_group_html: - one: Allerdings wurde %{shared_work_packages_link} auch mit dieser Gruppe - geteilt. - other: Allerdings wurden %{shared_work_packages_link} auch mit dieser Gruppe - geteilt. - remove_work_packages_shared_with_user_too: Ein Benutzer, der als Mitglied entfernt - wurde, kann immer noch auf gemeinsame Arbeitspakete zugreifen. Möchten Sie - auch die Freigaben entfernen? - remove_work_packages_shared_with_group_too: Eine Gruppe, die als Mitglied entfernt - wurde, kann immer noch auf mit ihr geteilte Arbeitspakete zugreifen. Möchten - Sie auch den Zugriff auf diese geteilten Arbeitspakete entfernen? - will_not_affect_inherited_shares: "(Dies hat keine Auswirkungen auf Arbeitspakete, - die mit ihrer Gruppe geteilt werden)." - can_remove_direct_but_not_shared_roles: Sie können diesen Benutzer als direktes - Projektmitglied entfernen. Eine Gruppe, in der dieser Benutzer Mitglied ist, - ist auch Mitglied dieses Projekts, so dass er weiterhin über die Gruppe Mitglied - bleibt. + one: "Allerdings wurde %{shared_work_packages_link} auch mit dieser Gruppe geteilt." + other: "Allerdings wurden %{shared_work_packages_link} auch mit dieser Gruppe geteilt." + remove_work_packages_shared_with_user_too: "Ein Benutzer, der als Mitglied entfernt wurde, kann immer noch auf gemeinsame Arbeitspakete zugreifen. Möchten Sie auch die Freigaben entfernen?" + remove_work_packages_shared_with_group_too: "Eine Gruppe, die als Mitglied entfernt wurde, kann immer noch auf mit ihr geteilte Arbeitspakete zugreifen. Möchten Sie auch den Zugriff auf diese geteilten Arbeitspakete entfernen?" + will_not_affect_inherited_shares: "(Dies hat keine Auswirkungen auf Arbeitspakete, die mit ihrer Gruppe geteilt werden)." + can_remove_direct_but_not_shared_roles: "Sie können diesen Benutzer als direktes Projektmitglied entfernen. Eine Gruppe, in der dieser Benutzer Mitglied ist, ist auch Mitglied dieses Projekts, so dass er weiterhin über die Gruppe Mitglied bleibt." also_work_packages_shared_with_user_html: - one: Außerdem wurde %{shared_work_packages_link} mit diesem Benutzer geteilt. - other: Außerdem wurden %{shared_work_packages_link} mit diesem Benutzer geteilt. - remove_project_membership_or_work_package_shares_too: Möchten Sie nur den Benutzer - als direktes Mitglied entfernen (und die damit geteilten Arbeitspakete behalten) - oder auch alle Zugänge zu geteilten Arbeitspaketen entfernen? - will_remove_all_user_access_priveleges: Wenn Sie dieses Mitglied löschen, werden - alle Zugriffsrechte des Benutzers auf das Projekt entfernt. Der Benutzer bleibt - als Teil der Instanz erhalten. - will_remove_all_group_access_priveleges: Wenn Sie dieses Mitglied löschen, werden - alle Zugriffsrechte der Gruppe auf das Projekt entfernt. Die Gruppe bleibt - als Teil der Instanz bestehen. - cannot_delete_inherited_membership: Sie können dieses Mitglied nicht löschen, - da es zu einer Gruppe gehört, die selbst Mitglied dieses Projekts ist. - cannot_delete_inherited_membership_note_admin_html: Sie können entweder die - Gruppe als Mitglied des Projekts oder dieses bestimmte Mitglied aus der Gruppe - in der %{administration_settings_link}entfernen. - cannot_delete_inherited_membership_note_non_admin: Sie können entweder die Gruppe - als Mitglied des Projekts entfernen oder sich an Ihren Administrator wenden, - um dieses spezielle Mitglied aus der Gruppe zu entfernen. + one: "Außerdem wurde %{shared_work_packages_link} mit diesem Benutzer geteilt." + other: "Außerdem wurden %{shared_work_packages_link} mit diesem Benutzer geteilt." + remove_project_membership_or_work_package_shares_too: "Möchten Sie nur den Benutzer als direktes Mitglied entfernen (und die damit geteilten Arbeitspakete behalten) oder auch alle Zugänge zu geteilten Arbeitspaketen entfernen?" + will_remove_all_user_access_priveleges: "Wenn Sie dieses Mitglied löschen, werden alle Zugriffsrechte des Benutzers auf das Projekt entfernt. Der Benutzer bleibt als Teil der Instanz erhalten." + will_remove_all_group_access_priveleges: "Wenn Sie dieses Mitglied löschen, werden alle Zugriffsrechte der Gruppe auf das Projekt entfernt. Die Gruppe bleibt als Teil der Instanz bestehen." + cannot_delete_inherited_membership: "Sie können dieses Mitglied nicht löschen, da es zu einer Gruppe gehört, die selbst Mitglied dieses Projekts ist." + cannot_delete_inherited_membership_note_admin_html: "Sie können entweder die Gruppe als Mitglied des Projekts oder dieses bestimmte Mitglied aus der Gruppe in der %{administration_settings_link}entfernen." + cannot_delete_inherited_membership_note_non_admin: "Sie können entweder die Gruppe als Mitglied des Projekts entfernen oder sich an Ihren Administrator wenden, um dieses spezielle Mitglied aus der Gruppe zu entfernen." delete_work_package_shares_dialog: - title: Arbeitspaket-Freigaben wiederrufen + title: "Arbeitspaket-Freigaben wiederrufen" shared_with_this_user_html: one: "%{all_shared_work_packages_link} wurde mit diesem Benutzer geteilt." other: "%{all_shared_work_packages_link} wurden mit diesem Benutzer geteilt." @@ -1173,216 +914,160 @@ de: one: "%{all_shared_work_packages_link} wurde mit dieser Gruppe geteilt." other: "%{all_shared_work_packages_link} wurden mit dieser Gruppe geteilt." shared_with_permission_html: - one: Nur %{shared_work_packages_link} wurde mit den Berechtigungen %{shared_role_name} - geteilt. - other: Nur %{shared_work_packages_link} wurde mit den Berechtigungen %{shared_role_name} - geteilt. - revoke_all_or_with_role: Möchten Sie den Zugriff auf alle gemeinsamen Arbeitspakete - widerrufen oder nur diejenigen mit %{shared_role_name}-Berechtigungen? - will_not_affect_inherited_shares: "(Dies hat keine Auswirkungen auf Arbeitspakete, - die mit ihrer Gruppe geteilt werden)." - cannot_remove_inherited: Die über Gruppen geteilten Arbeitspakete können nicht - entfernt werden. - cannot_remove_inherited_with_role: Die mit der Rolle %{shared_role_name} geteilten - Arbeitspakete werden über Gruppen geteilt und können nicht entfernt werden. - cannot_remove_inherited_note_admin_html: Sie können entweder die Freigabe für - die Gruppe widerrufen oder dieses bestimmte Mitglied aus der Gruppe unter - %{administration_settings_link} entfernen. - cannot_remove_inherited_note_non_admin: Sie können entweder die das geteilte - Arbeitspaket für die Gruppe entfernen oder sich an Ihren Administrator wenden, - um das betreffende Mitglied aus der Gruppe zu entfernen. - will_revoke_directly_granted_access: Diese Aktion entzieht den gesamten Zugriff - auf alle außer die durch eine Gruppenmitgliedschaft geteilten Arbeitspakete. - will_revoke_access_to_all: Mit dieser Aktion wird der Zugriff auf alle diese - Arbeitspakete entfernt. + one: "Nur %{shared_work_packages_link} wurde mit den Berechtigungen %{shared_role_name} geteilt." + other: "Nur %{shared_work_packages_link} wurde mit den Berechtigungen %{shared_role_name} geteilt." + revoke_all_or_with_role: "Möchten Sie den Zugriff auf alle gemeinsamen Arbeitspakete widerrufen oder nur diejenigen mit %{shared_role_name}-Berechtigungen?" + will_not_affect_inherited_shares: "(Dies hat keine Auswirkungen auf Arbeitspakete, die mit ihrer Gruppe geteilt werden)." + cannot_remove_inherited: "Die über Gruppen geteilten Arbeitspakete können nicht entfernt werden." + cannot_remove_inherited_with_role: "Die mit der Rolle %{shared_role_name} geteilten Arbeitspakete werden über Gruppen geteilt und können nicht entfernt werden." + cannot_remove_inherited_note_admin_html: "Sie können entweder die Freigabe für die Gruppe widerrufen oder dieses bestimmte Mitglied aus der Gruppe unter %{administration_settings_link} entfernen." + cannot_remove_inherited_note_non_admin: "Sie können entweder die das geteilte Arbeitspaket für die Gruppe entfernen oder sich an Ihren Administrator wenden, um das betreffende Mitglied aus der Gruppe zu entfernen." + will_revoke_directly_granted_access: "Diese Aktion entzieht den gesamten Zugriff auf alle außer die durch eine Gruppenmitgliedschaft geteilten Arbeitspakete." + will_revoke_access_to_all: "Mit dieser Aktion wird der Zugriff auf alle diese Arbeitspakete entfernt." my: access_token: dialog: token/api: - dialog_title: Einen API-Token erstellen - attention_text: Behandeln Sie API-Tokens wie Passwörter. Jeder, der über - diesen Link verfügt, hat Zugang zu den Informationen dieser Instanz. - dialog_body: Dieses Token ermöglicht es Anwendungen von Drittanbietern, - mit Ihrer Instanz zu kommunizieren. Um das neue API-Token zu unterscheiden, - geben Sie ihm bitte einen Namen. - create_button: Anlegen - name_label: Token-Name + dialog_title: "Einen API-Token erstellen" + attention_text: "Behandeln Sie API-Tokens wie Passwörter. Jeder, der über diesen Link verfügt, hat Zugang zu den Informationen dieser Instanz." + dialog_body: "Dieses Token ermöglicht es Anwendungen von Drittanbietern, mit Ihrer Instanz zu kommunizieren. Um das neue API-Token zu unterscheiden, geben Sie ihm bitte einen Namen." + create_button: "Anlegen" + name_label: "Token-Name" created_dialog: - one_time_warning: Dies ist das einzige Mal, dass dieses Token angezeigt wird. - Stellen Sie sicher, dass Sie es jetzt kopieren. + one_time_warning: "Dies ist das einzige Mal, dass dieses Token angezeigt wird. Stellen Sie sicher, dass Sie es jetzt kopieren." token/api: - title: Der API-Token wurde generiert + title: "Der API-Token wurde generiert" token/rss: - title: Das RSS-Token wurde generiert - failed_to_reset_token: 'Zusatztoken konnte nicht zurückgesetzt werden: %{error}' - failed_to_create_token: 'Zugriffstoken konnte nicht erstellt werden: %{error}' - failed_to_revoke_token: 'Zugriffstoken kann nicht widerrufen werden: %{error}' - notice_reset_token: 'Ein neuer %{type} Token wurde generiert. Der Zutrittstoken - lautet:' - token_value_warning: 'Hinweis: Dieser Token ist nur einmal sichtbar, der Token - kann jetzt kopiert werden.' - no_results_title_text: Zur Zeit stehen keine Zugangs-Tokens zur Verfügung. - notice_api_token_revoked: 'Das API-Token wurde gelöscht. Nutzen Sie bitte den - Knopf in der API-Sektion für die Erstellung eines neues Token. ' - notice_rss_token_revoked: Der RSS-Token wurde gelöscht. Um ein neues Token zu - erstellen, benutzen Sie bitte den Link im RSS-Bereich. - notice_ical_token_revoked: iCalendar-Token „%{token_name}“ für Kalender „%{calendar_name}“ - des Projekts „%{project_name}“ wurde widerrufen. Die iCal-URL mit diesem Token - ist jetzt ungültig. + title: "Das RSS-Token wurde generiert" + failed_to_reset_token: "Zusatztoken konnte nicht zurückgesetzt werden: %{error}" + failed_to_create_token: "Zugriffstoken konnte nicht erstellt werden: %{error}" + failed_to_revoke_token: "Zugriffstoken kann nicht widerrufen werden: %{error}" + notice_reset_token: "Ein neuer %{type} Token wurde generiert. Der Zutrittstoken lautet:" + token_value_warning: "Hinweis: Dieser Token ist nur einmal sichtbar, der Token kann jetzt kopiert werden." + no_results_title_text: "Zur Zeit stehen keine Zugangs-Tokens zur Verfügung." + notice_api_token_revoked: "Das API-Token wurde gelöscht. Nutzen Sie bitte den Knopf in der API-Sektion für die Erstellung eines neues Token. " + notice_rss_token_revoked: "Der RSS-Token wurde gelöscht. Um ein neues Token zu erstellen, benutzen Sie bitte den Link im RSS-Bereich." + notice_ical_token_revoked: 'iCalendar-Token „%{token_name}“ für Kalender „%{calendar_name}“ des Projekts „%{project_name}“ wurde widerrufen. Die iCal-URL mit diesem Token ist jetzt ungültig.' password_confirmation_dialog: - confirmation_required: Sie müssen Ihr Passwort eingeben, um diese Änderung zu - bestätigen. - title: Bestätigen Sie Ihr Passwort um fortzufahren + confirmation_required: "Sie müssen Ihr Passwort eingeben, um diese Änderung zu bestätigen." + title: "Bestätigen Sie Ihr Passwort um fortzufahren" news: index: no_results_title_text: Es gibt aktuell keine Neuigkeiten. no_results_content_text: Neuigkeit hinzufügen roles: permissions: - section_check_all_label: Alle %{module} Berechtigungen zuweisen - section_uncheck_all_label: Alle %{module} Berechtigungen zuweisen + section_check_all_label: "Alle %{module} Berechtigungen zuweisen" + section_uncheck_all_label: "Alle %{module} Berechtigungen zuweisen" report: - matrix_caption: Berechtigungsmatrix für das Modul %{module} - matrix_checkbox_label: Berechtigung '%{permission}' der Rolle '%{role}' Rolle - zuweisen - matrix_check_all_label: Alle %{module} Berechtigungen zuweisen - matrix_uncheck_all_label: Alle %{module} Berechtigungen entfernen - matrix_check_uncheck_all_in_row_label_html: Umschalten von %{permission} - Berechtigung für alle Rollen - matrix_check_uncheck_all_in_col_label_html: Umschalten aller %{module} Berechtigungen - für die Rolle %{role} + matrix_caption: "Berechtigungsmatrix für das Modul %{module}" + matrix_checkbox_label: "Berechtigung '%{permission}' der Rolle '%{role}' Rolle zuweisen" + matrix_check_all_label: "Alle %{module} Berechtigungen zuweisen" + matrix_uncheck_all_label: "Alle %{module} Berechtigungen entfernen" + matrix_check_uncheck_all_in_row_label_html: "Umschalten von %{permission} Berechtigung für alle Rollen" + matrix_check_uncheck_all_in_col_label_html: "Umschalten aller %{module} Berechtigungen für die Rolle %{role}" users: autologins: prompt: "%{num_days} lang angemeldet bleiben" sessions: session_name: "%{browser_name} %{browser_version} unter %{os_name}" - browser: Browser - expires: Läuft aus - last_connection: Letzte Anmeldung - device: Gerät / Betriebssystem - unknown_browser: unbekannter Browser - unknown_os: unbekanntes Betriebssystem + browser: "Browser" + expires: "Läuft aus" + last_connection: "Letzte Anmeldung" + device: "Gerät / Betriebssystem" + unknown_browser: "unbekannter Browser" + unknown_os: "unbekanntes Betriebssystem" unknown: "(unbekannt)" browser_session: "(Browser-Sitzung)" - current: Aktuell (dieses Gerät) - title: Sitzungsverwaltung - instructions: Sie sind über die folgenden Geräte bei Ihrem Konto angemeldet. - Widerrufen Sie Sitzungen, die Sie nicht kennen oder von Geräten, die Sie nicht - kontrollieren. - may_not_delete_current: Sie können Ihre aktuelle Sitzung nicht löschen. - deletion_warning: Sind Sie sicher, dass Sie diese Sitzung widerrufen möchten? - Sie werden auf diesem Gerät abgemeldet. + current: "Aktuell (dieses Gerät)" + title: "Sitzungsverwaltung" + instructions: "Sie sind über die folgenden Geräte bei Ihrem Konto angemeldet. Widerrufen Sie Sitzungen, die Sie nicht kennen oder von Geräten, die Sie nicht kontrollieren." + may_not_delete_current: "Sie können Ihre aktuelle Sitzung nicht löschen." + deletion_warning: "Sind Sie sicher, dass Sie diese Sitzung widerrufen möchten? Sie werden auf diesem Gerät abgemeldet." groups: - member_in_these_groups: 'Dieser Benutzer ist Mitglied der folgenden Gruppen:' + member_in_these_groups: "Dieser Benutzer ist Mitglied der folgenden Gruppen:" no_results_title_text: Dieser Benutzer ist derzeit kein Mitglied in einer Gruppe. summary_with_more: Mitglied von %{names} und %{count_link}. more: "%{count} weitere" summary: Mitglied von %{names}. memberships: no_results_title_text: Dieser Nutzer ist derzeit in keinem Projekt Mitglied. - open_profile: Profil öffnen + open_profile: "Profil öffnen" invite_user_modal: - invite: Einladen + invite: "Einladen" title: - invite: Nutzer einladen + invite: "Nutzer einladen" invite_to_project: "%{type} zu %{project} einladen" invite_principal_to_project: "%{principal} zu %{project} einladen" project: - label: Projekt - required: Bitte wählen Sie ein Projekt - next_button: Weiter - no_results: Keine Projekte gefunden - no_invite_rights: Sie dürfen keine Mitglieder zu diesem Projekt hinzufügen + label: "Projekt" + required: "Bitte wählen Sie ein Projekt" + next_button: "Weiter" + no_results: "Keine Projekte gefunden" + no_invite_rights: "Sie dürfen keine Mitglieder zu diesem Projekt hinzufügen" type: - required: Bitte wählen Sie die Benutzer-Typen aus, die eingeladen werden sollen + required: "Bitte wählen Sie die Benutzer-Typen aus, die eingeladen werden sollen" user: - title: Benutzer zu %{project_name} einladen - description: Berechtigungen basierend auf der zugewiesenen Rolle im ausgewählten - Projekt + title: "Benutzer zu %{project_name} einladen" + description: "Berechtigungen basierend auf der zugewiesenen Rolle im ausgewählten Projekt" group: - title: Gruppe zu %{project_name} hinzufügen - description: Berechtigungen basierend auf der zugewiesenen Rolle im ausgewählten - Projekt + title: "Gruppe zu %{project_name} hinzufügen" + description: "Berechtigungen basierend auf der zugewiesenen Rolle im ausgewählten Projekt" placeholder_user: - title: Platzhalterbenutzer zu %{project_name} hinzufügen - title_no_ee: Platzhalter-Benutzer (Enterprise Edition Add-on) - description: Hat keinen Zugriff auf das Projekt und es werden keine E-Mails - verschickt. - already_member_message: Bereits ein Mitglied von %{project} + title: "Platzhalterbenutzer zu %{project_name} hinzufügen" + title_no_ee: "Platzhalter-Benutzer (Enterprise Edition Add-on)" + description: "Hat keinen Zugriff auf das Projekt und es werden keine E-Mails verschickt." + already_member_message: "Bereits ein Mitglied von %{project}" principal: - no_results_user: Keine Benutzer gefunden - invite_user: 'Einladen:' - no_results_placeholder: Keine Platzhalter-Benutzer gefunden. - create_new_placeholder: 'Erstelle neuen Platzhalter:' - no_results_group: Es wurden keine Gruppen gefunden. - invite_to_project: Zu %{project_name} einladen + no_results_user: "Keine Benutzer gefunden" + invite_user: "Einladen:" + no_results_placeholder: "Keine Platzhalter-Benutzer gefunden." + create_new_placeholder: "Erstelle neuen Platzhalter:" + no_results_group: "Es wurden keine Gruppen gefunden." + invite_to_project: "Zu %{project_name} einladen" required: - user: Bitte einen Benutzer auswählen - placeholder: Bitte einen Platzhalter auswählen - group: Bitte eine Gruppe auswählen + user: "Bitte einen Benutzer auswählen" + placeholder: "Bitte einen Platzhalter auswählen" + group: "Bitte eine Gruppe auswählen" role: - label: Rolle in %{project} - no_roles_found: Keine Rollen gefunden - description: 'Dies ist die Rolle, die der Nutzer beim Beitritt zum Projekt - erhält. Die Rolle legt fest, welche Aktionen er durchführen darf und welche - Informationen er sehen darf. [Erfahren Sie mehr über Rollen und Berechtigungen](docs_url) - - ' - required: Bitte eine Rolle auswählen + label: "Rolle in %{project}" + no_roles_found: "Keine Rollen gefunden" + description: > + Dies ist die Rolle, die der Nutzer beim Beitritt zum Projekt erhält. Die Rolle legt fest, welche Aktionen er durchführen darf und welche Informationen er sehen darf. [Erfahren Sie mehr über Rollen und Berechtigungen](docs_url) + required: "Bitte eine Rolle auswählen" message: - label: Einladungsnachricht - description: Wir werden eine E-Mail an den Benutzer senden, zu der Sie hier - eine persönliche Nachricht hinzufügen können. Eine Erklärung für die Einladung - könnte nützlich sein oder vielleicht ein paar Informationen über das Projekt, - um den Start zu erleichtern. + label: "Einladungsnachricht" + description: "Wir werden eine E-Mail an den Benutzer senden, zu der Sie hier eine persönliche Nachricht hinzufügen können. Eine Erklärung für die Einladung könnte nützlich sein oder vielleicht ein paar Informationen über das Projekt, um den Start zu erleichtern." summary: - next_button: Einladung senden + next_button: "Einladung senden" success_message: - user: Der Benutzer kann sich jetzt anmelden, um auf %{project} zuzugreifen. - In der Zwischenzeit können Sie bereits mit diesem Benutzer planen und beispielsweise - Arbeitspakete zuweisen. - placeholder_user: Der Platzhalter kann jetzt in %{project} verwendet werden. - In der Zwischenzeit können Sie bereits mit diesem Benutzer planen und beispielsweise - Arbeitspakete zuweisen. - group: Die Gruppe ist nun %{project} zugewiesen. In der Zwischenzeit können - Sie bereits mit dieser Gruppe planen und ihr zum Beispiel Arbeitspakete - zuweisen. + user: "Der Benutzer kann sich jetzt anmelden, um auf %{project} zuzugreifen. In der Zwischenzeit können Sie bereits mit diesem Benutzer planen und beispielsweise Arbeitspakete zuweisen." + placeholder_user: "Der Platzhalter kann jetzt in %{project} verwendet werden. In der Zwischenzeit können Sie bereits mit diesem Benutzer planen und beispielsweise Arbeitspakete zuweisen." + group: "Die Gruppe ist nun %{project} zugewiesen. In der Zwischenzeit können Sie bereits mit dieser Gruppe planen und ihr zum Beispiel Arbeitspakete zuweisen." page: - text: Text + text: "Text" placeholder_users: - right_to_manage_members_missing: 'Sie sind nicht berechtigt, diesen Platzhalter - zu löschen. Sie haben nicht das Recht, Mitglieder für alle Projekte zu verwalten, - in denen der Platzhalter Mitglied ist. - - ' - delete_tooltip: Platzhalter löschen + right_to_manage_members_missing: > + Sie sind nicht berechtigt, diesen Platzhalter zu löschen. Sie haben nicht das Recht, Mitglieder für alle Projekte zu verwalten, in denen der Platzhalter Mitglied ist. + delete_tooltip: "Platzhalter löschen" deletion_info: - heading: Platzhalter-Benutzer %{name} löschen - data_consequences: 'Alle Vorkommnisse des Platzhalter-Benutzers (z.B. als zugewiesene - Person, Verantwortlicher oder andere Benutzerwerte) werden einem Konto mit - dem Namen "Gelöschter Benutzer" zugewiesen. Da die Daten jedes gelöschten - Kontos diesem Konto zugewiesen werden, wird es nicht möglich sein, die Daten - dieses Benutzers von den Daten eines anderen gelöschten Kontos zu unterscheiden. - - ' - irreversible: Dieser Vorgang kann nicht rückgängig gemacht werden - confirmation: Geben Sie den Namen des Platzhalter-Benutzers %{name} ein, um - die Löschung zu bestätigen. + heading: "Platzhalter-Benutzer %{name} löschen" + data_consequences: > + Alle Vorkommnisse des Platzhalter-Benutzers (z.B. als zugewiesene Person, Verantwortlicher oder andere Benutzerwerte) werden einem Konto mit dem Namen "Gelöschter Benutzer" zugewiesen. Da die Daten jedes gelöschten Kontos diesem Konto zugewiesen werden, wird es nicht möglich sein, die Daten dieses Benutzers von den Daten eines anderen gelöschten Kontos zu unterscheiden. + irreversible: "Dieser Vorgang kann nicht rückgängig gemacht werden" + confirmation: "Geben Sie den Namen des Platzhalter-Benutzers %{name} ein, um die Löschung zu bestätigen." priorities: edit: - priority_color_text: 'Klicken zum Zuweisen einer Farbe für diesen Prioritätswert. - Diese wird für die Hervorhebung von Arbeitspaketen in Tabellen verwendet. - - ' + priority_color_text: | + Klicken zum Zuweisen einer Farbe für diesen Prioritätswert. Diese wird für die Hervorhebung von Arbeitspaketen in Tabellen verwendet. admin: default: - caption: Wird diese Priorität als Standard gesetzt, überschreibt das den vorherhigen - Standardwert. + caption: Wird diese Priorität als Standard gesetzt, überschreibt das den vorherhigen Standardwert. reactions: - action_title: Reagieren - add_reaction: Reaktion hinzufügen - react_with: Mit %{reaction} reagieren - and_user: und %{user} + action_title: "Reagieren" + add_reaction: "Reaktion hinzufügen" + react_with: "Mit %{reaction} reagieren" + and_user: "und %{user}" and_others: one: und ein weiterer other: und %{count} weitere @@ -1393,15 +1078,12 @@ de: no_results_content_text: Statusbericht hinzufügen statuses: edit: - status_color_text: 'Klicken zum Zuweisen einer Farbe für diesen Status. Diese - wird für die Hervorhebung von Arbeitspaketen in Tabellen verwendet. - - ' - status_default_text: Neue Arbeitspakete werden standardmäßig auf diesen Typ - gesetzt. Er kann nicht schreibgeschützt sein. - status_excluded_from_totals_text: Aktivieren Sie diese Option, um Arbeitspakete - mit diesem Status aus den Summen von Aufwand, Verbleibender Aufwand und % - Abgeschlossen in Hierarchien auszuschließen. + status_color_text: | + Klicken zum Zuweisen einer Farbe für diesen Status. Diese wird für die Hervorhebung von Arbeitspaketen in Tabellen verwendet. + status_default_text: |- + Neue Arbeitspakete werden standardmäßig auf diesen Typ gesetzt. Er kann nicht schreibgeschützt sein. + status_excluded_from_totals_text: |- + Aktivieren Sie diese Option, um Arbeitspakete mit diesem Status aus den Summen von Aufwand, Verbleibender Aufwand und % Abgeschlossen in Hierarchien auszuschließen. status_percent_complete_text: |- Im statusbasierten Fortschrittsberechnungsmodus wird der % abgeschlossen Wert eines Arbeitspakets automatisch auf diesen Wert gesetzt, wenn dieser Status ausgewählt wird. Im aufwandsbezogenem Modus hat dieser Wert keine Relevanz. @@ -1414,91 +1096,75 @@ de: no_results_title_text: Derzeit gibt es keine Arbeitspaket-Status. no_results_content_text: Neuen Status hinzufügen headers: - is_default: Standard - is_closed: Erledigt - is_readonly: Schreibgeschützt - excluded_from_totals: Von Gesamtsumme auschließen + is_default: "Standard" + is_closed: "Erledigt" + is_readonly: "Schreibgeschützt" + excluded_from_totals: "Von Gesamtsumme auschließen" themes: - dark: Dunkel - light: Hell - sync_with_os: Automatisch (entsprechend dem OS-Farbschema) + dark: "Dunkel" + light: "Hell" + sync_with_os: "Automatisch (entsprechend dem OS-Farbschema)" types: index: no_results_title_text: Derzeit gibt es keine Typen. no_results_content_text: Neuen Typ erstellen edit: form_configuration: - tab: Formularkonfiguration + tab: "Formularkonfiguration" projects: tab: Projekte enable_all: Für alle Projekte aktivieren select_projects: Projekt auswählen - select_projects_description: Wählen Sie die Projekte aus, in denen Sie diesen - Typ verwenden möchten. + select_projects_description: Wählen Sie die Projekte aus, in denen Sie diesen Typ verwenden möchten. settings: - tab: Einstellungen - type_color_text: |- - Die ausgewählte Farbe unterscheidet verschiedene Typen - in Gantt-Diagrammen und Arbeitspakettabellen. Es wird daher empfohlen, gut unterscheidbare Farben zu verwenden. + tab: "Einstellungen" + type_color_text: "Die ausgewählte Farbe unterscheidet verschiedene Typen\nin Gantt-Diagrammen und Arbeitspakettabellen. Es wird daher empfohlen, gut unterscheidbare Farben zu verwenden." subject_configuration: - tab: Titel konfigurieren + tab: "Titel konfigurieren" manually_editable_subjects: - label: Manuell bearbeitbare Titel - caption: Benutzer können die Titel der Arbeitspakete ohne Einschränkungen - manuell eingeben und bearbeiten. + label: "Manuell bearbeitbare Titel" + caption: "Benutzer können die Titel der Arbeitspakete ohne Einschränkungen manuell eingeben und bearbeiten." automatically_generated_subjects: - label: Automatisch generierte Titel - caption: Definieren Sie ein Schema aus referenzierten Attributen und Freitext - für die automatische Generierung von Arbeitspakettiteln. Nutzer können - diese nicht manuell editieren. + label: "Automatisch generierte Titel" + caption: "Definieren Sie ein Schema aus referenzierten Attributen und Freitext für die automatische Generierung von Arbeitspakettiteln. Nutzer können diese nicht manuell editieren." token: label_with_context: "%{attribute_context}: %{attribute_label}" context: - work_package: Arbeitspaket - parent: Übergeordnetes Arbeitspaket - project: Projekt + work_package: "Arbeitspaket" + parent: "Übergeordnetes Arbeitspaket" + project: "Projekt" pattern: - label: Titel-Schema - caption: Das Schema kann durch Hinzufügen von Text erzeugt werden. Geben - Sie "/" ein, um nach [unterstützten Attributen](attributes_url) zu suchen. + label: "Titel-Schema" + caption: Das Schema kann durch Hinzufügen von Text erzeugt werden. Geben Sie "/" ein, um nach [unterstützten Attributen](attributes_url) zu suchen. insert_as_text: 'Keine Attribute gefunden. Als Text hinzufügen: "%{word}"' export_configuration: - tab: PDF generieren - intro: Wählen Sie aus den verfügbaren Vorlagen diejenige aus, die Sie für - diesen Typ aktivieren möchten. Die Vorlage bestimmt das Design und die Attribute, - die in der exportierten PDF-Datei eines Arbeitspakets mit diesem Typ sichtbar - sind. Die erste Vorlage in der Liste ist standardmäßig ausgewählt. + tab: "PDF generieren" + intro: "Wählen Sie aus den verfügbaren Vorlagen diejenige aus, die Sie für diesen Typ aktivieren möchten. Die Vorlage bestimmt das Design und die Attribute, die in der exportierten PDF-Datei eines Arbeitspakets mit diesem Typ sichtbar sind. Die erste Vorlage in der Liste ist standardmäßig ausgewählt." pdf_export_templates: - label: PDF-Exportvorlagen + label: "PDF-Exportvorlagen" actions: - label_enable_all: Alles aktivieren - label_disable_all: Alles deaktivieren + label_enable_all: "Alles aktivieren" + label_disable_all: "Alles deaktivieren" versions: overview: - work_packages_in_archived_projects: Die Version wird mit archivierten Projekten - geteilt, die immer noch Arbeitspakete auf diese Version zugewiesen haben. - Die Arbeitspakete werden beim Zählen berücksichtigt, erscheinen aber nicht - in den verknüpften Ansichten. + work_packages_in_archived_projects: "Die Version wird mit archivierten Projekten geteilt, die immer noch Arbeitspakete auf diese Version zugewiesen haben. Die Arbeitspakete werden beim Zählen berücksichtigt, erscheinen aber nicht in den verknüpften Ansichten." no_results_title_text: Derzeit sind keine Arbeitspakete dieser Version zugewiesen. wiki: - page_not_editable_index: Die angeforderte Seite existiert (noch) nicht. Sie wurden - auf die Übersichtseite der Wiki-Seiten weitergeleitet. + page_not_editable_index: Die angeforderte Seite existiert (noch) nicht. Sie wurden auf die Übersichtseite der Wiki-Seiten weitergeleitet. no_results_title_text: Derzeit gibt es keine Wikiseiten. print_hint: Damit wird der Inhalt dieser Wiki-Seite ohne Navigationsleisten gedruckt. index: no_results_content_text: Neue Wikiseite hinzufügen workflows: form: - matrix_caption: Workflow-Matrix - matrix_caption_assignee: Workflow-Matrix für Zugewiesene - matrix_caption_author: Workflow-Matrix für den Autor - matrix_checkbox_label: Übergang von %{old_status} zu %{new_status} erlauben - matrix_check_all_label: Alle Übergänge zulassen - matrix_uncheck_all_label: Alle Übergänge verbieten - matrix_check_uncheck_all_in_row_label_html: Übergänge von %{old_status} - auf alle neuen Status umschalten - matrix_check_uncheck_all_in_col_label_html: Übergänge von allen alten Status - zu %{new_status} umschalten + matrix_caption: "Workflow-Matrix" + matrix_caption_assignee: "Workflow-Matrix für Zugewiesene" + matrix_caption_author: "Workflow-Matrix für den Autor" + matrix_checkbox_label: "Übergang von %{old_status} zu %{new_status} erlauben" + matrix_check_all_label: "Alle Übergänge zulassen" + matrix_uncheck_all_label: "Alle Übergänge verbieten" + matrix_check_uncheck_all_in_row_label_html: "Übergänge von %{old_status} auf alle neuen Status umschalten" + matrix_check_uncheck_all_in_col_label_html: "Übergänge von allen alten Status zu %{new_status} umschalten" work_flows: index: no_results_title_text: Derzeit gibt es keine Workflows. @@ -1506,94 +1172,68 @@ de: datepicker_modal: banner: description: - automatic_mobile: Anfangstermin abgeleitet. - click_on_show_relations_to_open_gantt: Klicken Sie auf "%{button_name}" - für Gantt-Ansicht. - manual_mobile: Beziehungen werden ignoriert. - manual_gap_between_predecessors: Es gibt eine Verzögerung zu allen Vorgängern. - manual_overlap_with_predecessors: Überlappt mit mindestens einem Vorgänger. - manual_with_children: Hat Unteraufgaben aber ihre Startdaten werden ignoriert. + automatic_mobile: "Anfangstermin abgeleitet." + click_on_show_relations_to_open_gantt: 'Klicken Sie auf "%{button_name}" für Gantt-Ansicht.' + manual_mobile: "Beziehungen werden ignoriert." + manual_gap_between_predecessors: "Es gibt eine Verzögerung zu allen Vorgängern." + manual_overlap_with_predecessors: "Überlappt mit mindestens einem Vorgänger." + manual_with_children: "Hat Unteraufgaben aber ihre Startdaten werden ignoriert." title: - automatic_mobile: Automatisch geplant. - automatic_with_children: Die Termine sind durch untergeordnete Arbeitspakete - bestimmt. - automatic_with_predecessor: Der Anfangstermin wird von einem Vorgänger festgelegt. - manual_mobile: Manuell geplant. - manually_scheduled: Manuell geplant – Daten unabhängig von Beziehungen. + automatic_mobile: "Automatisch geplant." + automatic_with_children: "Die Termine sind durch untergeordnete Arbeitspakete bestimmt." + automatic_with_predecessor: "Der Anfangstermin wird von einem Vorgänger festgelegt." + manual_mobile: "Manuell geplant." + manually_scheduled: "Manuell geplant – Daten unabhängig von Beziehungen." blankslate: - title: Keine Vorgänger - description: Um die automatische Planung zu aktivieren, muss dieses Arbeitspaket - mindestens einen Vorgänger haben. Es wird dann automatisch so eingeplant, - dass es nach dem nächstgelegenen Vorgänger beginnt. + title: "Keine Vorgänger" + description: "Um die automatische Planung zu aktivieren, muss dieses Arbeitspaket mindestens einen Vorgänger haben. Es wird dann automatisch so eingeplant, dass es nach dem nächstgelegenen Vorgänger beginnt." ignore_non_working_days: - title: Nur Werktage + title: "Nur Werktage" mode: - title: Planungsmodus - automatic: Automatisch - manual: Manuell - show_relations: Beziehungen anzeigen - update_inputs_aria_live_message: Datumsauswahl aktualisiert. %{message} + title: "Planungsmodus" + automatic: "Automatisch" + manual: "Manuell" + show_relations: "Beziehungen anzeigen" + update_inputs_aria_live_message: "Datumsauswahl aktualisiert. %{message}" tabs: - aria_label: Datumsauswahl Reiter - children: Unteraufgaben - dates: Daten - predecessors: Vorgänger - successors: Nachfolger + aria_label: "Datumsauswahl Reiter" + children: "Unteraufgaben" + dates: "Daten" + predecessors: "Vorgänger" + successors: "Nachfolger" blankslate: predecessors: - title: Keine Vorgänger - description: Dieses Arbeitspaket hat noch keine Vorgänger. + title: "Keine Vorgänger" + description: "Dieses Arbeitspaket hat noch keine Vorgänger." successors: - title: Keine Nachfolger - description: Dieses Arbeitspaket hat noch keine Nachfolger. + title: "Keine Nachfolger" + description: "Dieses Arbeitspaket hat noch keine Nachfolger." children: - title: Keine Unteraufgaben - description: Dieses Arbeitspaket hat noch keine Unteraufgaben. + title: "Keine Unteraufgaben" + description: "Dieses Arbeitspaket hat noch keine Unteraufgaben." x_descendants: - one: Ein untergeordnetes Arbeitspaket + one: "Ein untergeordnetes Arbeitspaket" other: "%{count} untergeordnete Arbeitspakete" bulk: - copy_failed: Die Arbeitspakete konnten nicht kopiert werden. - move_failed: Die Arbeitspakete konnten nicht verschoben werden. - could_not_be_saved: 'Die folgenden Arbeitspakete konnten nicht gespeichert werden:' - none_could_be_saved: Keines der %{total} Arbeitspakete konnte aktualisiert werden. - x_out_of_y_could_be_saved: "%{failing} von %{total} Arbeitspaketen konnten nicht - aktualisiert werden, aber %{success} wurden aktualisiert." - selected_because_descendants: Obwohl nur %{selected} Arbeitspakete ausgewählt - wurden, sind inklusive untergeordneter Arbeitspakete insgesamt %{total} Arbeitspakete - betroffen. - descendant: untergeordnetes Arbeitspaket eines ausgewählten Arbeitspaketes + copy_failed: "Die Arbeitspakete konnten nicht kopiert werden." + move_failed: "Die Arbeitspakete konnten nicht verschoben werden." + could_not_be_saved: "Die folgenden Arbeitspakete konnten nicht gespeichert werden:" + none_could_be_saved: "Keines der %{total} Arbeitspakete konnte aktualisiert werden." + x_out_of_y_could_be_saved: "%{failing} von %{total} Arbeitspaketen konnten nicht aktualisiert werden, aber %{success} wurden aktualisiert." + selected_because_descendants: "Obwohl nur %{selected} Arbeitspakete ausgewählt wurden, sind inklusive untergeordneter Arbeitspakete insgesamt %{total} Arbeitspakete betroffen." + descendant: "untergeordnetes Arbeitspaket eines ausgewählten Arbeitspaketes" move: - no_common_statuses_exists: Es gibt keine gemeinsamen Status für die ausgewählten - Arbeitspakete. Ihr Status kann daher nicht verändert werden. - unsupported_for_multiple_projects: Verschieben / Kopieren nicht unterstützt - für Arbeitspakete in verschiedenen Projekten - current_type_not_available_in_target_project: 'Der aktuelle Typ der Arbeitspakete - ist im Zielprojekt nicht aktiviert. Bitte aktivieren Sie diesen Typ im Zielprojekt, - wenn Sie möchten, dass sie unverändert bleiben. Andernfalls wird der Typ des - Arbeitspakets automatisch neu zugewiesen, was zu Datenverlust führen kann. - - ' - bulk_current_type_not_available_in_target_project: 'Der aktuelle Typ der Arbeitspakete - ist im Zielprojekt nicht aktiviert. Bitte aktivieren Sie diesen Typ im Zielprojekt, - wenn Sie möchten, dass sie unverändert bleiben. Andernfalls wird der Typ des - Arbeitspakets automatisch neu zugewiesen, was zu Datenverlust führen kann. - - ' + no_common_statuses_exists: "Es gibt keine gemeinsamen Status für die ausgewählten Arbeitspakete. Ihr Status kann daher nicht verändert werden." + unsupported_for_multiple_projects: "Verschieben / Kopieren nicht unterstützt für Arbeitspakete in verschiedenen Projekten" + current_type_not_available_in_target_project: > + Der aktuelle Typ der Arbeitspakete ist im Zielprojekt nicht aktiviert. Bitte aktivieren Sie diesen Typ im Zielprojekt, wenn Sie möchten, dass sie unverändert bleiben. Andernfalls wird der Typ des Arbeitspakets automatisch neu zugewiesen, was zu Datenverlust führen kann. + bulk_current_type_not_available_in_target_project: > + Der aktuelle Typ der Arbeitspakete ist im Zielprojekt nicht aktiviert. Bitte aktivieren Sie diesen Typ im Zielprojekt, wenn Sie möchten, dass sie unverändert bleiben. Andernfalls wird der Typ des Arbeitspakets automatisch neu zugewiesen, was zu Datenverlust führen kann. sharing: missing_workflow_warning: - title: Der Workflow für das Teilen von Arbeitspaketen fehlt - message: Es ist kein Workflow für die Rolle ‚Work package editor‘ konfiguriert. - Nur mit einem solchen Workflow können Benutzer, mit denen ein Arbeitspaket - geteilt wurde, den Status des Arbeitspakets ändern. Workflows lassen sich - einfach kopieren. Wählen Sie dazu einen Quell-Typ (z. B. ‚Task‘) und eine - Quell-Rolle (z. B. 'Member') aus. Wählen Sie dann die Ziel-Typen aus. Als - ersten Schritt können Sie alle Typen als Ziel-Typen auswählen. Danach wählen - Sie die Ziel-Rolle ‚Work package editor‘ aus und drücken Sie auf den Knopf - ‚Kopieren‘. Nachdem Sie hiermit eine Grundlage geschaffen haben, können - Sie danach diese Workflows weiter anpassen, ganz genau wie Sie es für jede - andere Rolle bereits getan haben. - link_message: Konfigurieren Sie die Workflows in der Administration. + title: "Der Workflow für das Teilen von Arbeitspaketen fehlt" + message: "Es ist kein Workflow für die Rolle ‚Work package editor‘ konfiguriert. Nur mit einem solchen Workflow können Benutzer, mit denen ein Arbeitspaket geteilt wurde, den Status des Arbeitspakets ändern. Workflows lassen sich einfach kopieren. Wählen Sie dazu einen Quell-Typ (z. B. ‚Task‘) und eine Quell-Rolle (z. B. 'Member') aus. Wählen Sie dann die Ziel-Typen aus. Als ersten Schritt können Sie alle Typen als Ziel-Typen auswählen. Danach wählen Sie die Ziel-Rolle ‚Work package editor‘ aus und drücken Sie auf den Knopf ‚Kopieren‘. Nachdem Sie hiermit eine Grundlage geschaffen haben, können Sie danach diese Workflows weiter anpassen, ganz genau wie Sie es für jede andere Rolle bereits getan haben." + link_message: "Konfigurieren Sie die Workflows in der Administration." summary: reports: category: @@ -1612,1112 +1252,957 @@ de: no_results_title_text: Derzeit sind keine Versionen verfügbar. work_package_relations_tab: index: - action_bar_title: Fügen Sie eine Beziehung mit einem anderen Arbeitspaket hinzu, - um eine Verbindung zwischen ihnen herzustellen. + action_bar_title: "Fügen Sie eine Beziehung mit einem anderen Arbeitspaket hinzu, um eine Verbindung zwischen ihnen herzustellen." no_results_title_text: Derzeit sind keine Beziehungen verfügbar. - blankslate_heading: Keine Beziehungen - blankslate_description: Dieses Arbeitspaket hat noch keine Beziehungen. - label_add_child_button: Unteraufgabe + blankslate_heading: "Keine Beziehungen" + blankslate_description: "Dieses Arbeitspaket hat noch keine Beziehungen." + label_add_child_button: "Unteraufgabe" label_add_x: "%{x} hinzufügen" label_edit_x: "%{x} editieren" - label_add_description: Beschreibung hinzufügen + label_add_description: "Beschreibung hinzufügen" lag: - subject: Verzögerung - caption: Die minimale Anzahl von Arbeitstagen zwischen den zwei Arbeitspaketen; - kann auch negativ sein. + subject: "Verzögerung" + caption: |- + Die minimale Anzahl von Arbeitstagen zwischen den zwei Arbeitspaketen; kann auch negativ sein. relations: - label_new_child_created: Neues Arbeitspaket erstellt und als Unteraufgabe hinzugefügt - label_relates_singular: Verwandt mit - label_relates_plural: Verwandt mit - label_relates_to_singular: Verwandt mit - label_relates_to_plural: Verwandt mit - relates_description: Erstellt eine sichtbare Beziehung zwischen den zwei Arbeitspaketen - ohne weitere Auswirkungen - relates_to_description: Erstellt eine sichtbare Beziehung zwischen den zwei - Arbeitspaketen ohne weitere Auswirkungen - label_precedes_singular: Nachfolger - label_precedes_plural: Nachfolger - precedes_description: Das verknüpfte Arbeitspaket kann erst nach dem Ende dieses - Arbeitspakets starten - label_follows_singular: Vorgänger - label_follows_plural: Vorgänger - follows_description: Das verknüpfte Arbeitspaket muss beendet sein bevor dieses - Arbeitspaket starten kann - label_child_singular: Unteraufgabe - label_child_plural: Unteraufgaben - new_child: Neue Unteraufgabe - new_child_description: Erstellt ein zugehöriges Arbeitspaket als Unteraufgabe - des aktuellen (übergeordneten) Arbeitspakets - child: Kind - child_description: Macht das zugehörige Arbeitspaket zu einer Unteraufgabe des - aktuellen (übergeordneten) Arbeitspakets - parent: Übergeordnetes Arbeitspaket - parent_description: Wandelt das verknüpfte in ein übergeordnetes Arbeitspaket - dieses Arbeitspakets um - label_closest: Am nächsten - label_blocks_singular: Blockiert - label_blocks_plural: Blockiert - blocks_description: Das verknüpfte Arbeitspaket kann erst geschlossen werden, - wenn dieses Arbeitspaket geschlossen ist - label_blocked_singular: Blockiert durch - label_blocked_plural: Blockiert durch - label_blocked_by_singular: Blockiert durch - label_blocked__by_plural: Blockiert durch - blocked_description: Dieses Arbeitspaket kann erst geschlossen werden, nachdem - das verknüpfte Arbeitspaket geschlossen wurde - blocked_by_description: Dieses Arbeitspaket kann erst geschlossen werden, nachdem - das verknüpfte Arbeitspaket geschlossen wurde - label_duplicates_singular: Duplikat von - label_duplicates_plural: Duplikat von - duplicates_description: Dies ist eine Kopie des verknüpften Arbeitspakets - label_duplicated_singular: Dupliziert durch - label_duplicated_plural: Dupliziert durch - label_duplicated_by_singular: Dupliziert durch - label_duplicated_by_plural: Dupliziert durch - duplicated_by_description: Das zugehörige Arbeitspaket ist eine Kopie dieses - Arbeitspakets - duplicated_description: Das zugehörige Arbeitspaket ist eine Kopie dieses Arbeitspakets - label_includes_singular: enthält - label_includes_plural: enthält - includes_description: Das verknüpfte Arbeitspaket beinhaltet dieses Arbeitspaket, - ohne dass dies zusätzliche Auswirkungen hat - label_partof_singular: enthalten in - label_partof_plural: enthalten in - label_part_of_singular: enthalten in - label_part_of_plural: enthalten in - partof_description: Dieses Arbeitspaket enthält das verknüpfte Arbeitspaket, - ohne dass dies zusätzliche Auswirkungen hat - part_of_description: Dieses Arbeitspaket enthält das verknüpfte Arbeitspaket, - ohne dass dies zusätzliche Auswirkungen hat - label_requires_singular: benötigt - label_requires_plural: benötigt - requires_description: Markiert dieses Arbeitspaket als Voraussetzung für das - verknüpfte Arbeitspaket - label_required_singular: die benötigt werden von - label_required_plural: die benötigt werden von - required_description: Markiert dieses Arbeitspaket als Voraussetzung für das - verknüpfte Arbeitspaket - label_parent_singular: Übergeordnete Arbeitspakete - label_parent_plural: Übergeordnetes Arbeitspaket - label_other_relations: Andere Beziehungen - ghost_relation_title: Zugehöriges Arbeitspaket - ghost_relation_description: Dies ist für Sie aufgrund von Berechtigungen nicht - sichtbar. + label_new_child_created: "Neues Arbeitspaket erstellt und als Unteraufgabe hinzugefügt" + label_relates_singular: "Verwandt mit" + label_relates_plural: "Verwandt mit" + label_relates_to_singular: "Verwandt mit" + label_relates_to_plural: "Verwandt mit" + relates_description: "Erstellt eine sichtbare Beziehung zwischen den zwei Arbeitspaketen ohne weitere Auswirkungen" + relates_to_description: "Erstellt eine sichtbare Beziehung zwischen den zwei Arbeitspaketen ohne weitere Auswirkungen" + label_precedes_singular: "Nachfolger" + label_precedes_plural: "Nachfolger" + precedes_description: "Das verknüpfte Arbeitspaket kann erst nach dem Ende dieses Arbeitspakets starten" + label_follows_singular: "Vorgänger" + label_follows_plural: "Vorgänger" + follows_description: "Das verknüpfte Arbeitspaket muss beendet sein bevor dieses Arbeitspaket starten kann" + label_child_singular: "Unteraufgabe" + label_child_plural: "Unteraufgaben" + new_child: "Neue Unteraufgabe" + new_child_description: "Erstellt ein zugehöriges Arbeitspaket als Unteraufgabe des aktuellen (übergeordneten) Arbeitspakets" + child: "Kind" + child_description: "Macht das zugehörige Arbeitspaket zu einer Unteraufgabe des aktuellen (übergeordneten) Arbeitspakets" + parent: "Übergeordnetes Arbeitspaket" + parent_description: "Wandelt das verknüpfte in ein übergeordnetes Arbeitspaket dieses Arbeitspakets um" + label_closest: "Am nächsten" + label_blocks_singular: "Blockiert" + label_blocks_plural: "Blockiert" + blocks_description: "Das verknüpfte Arbeitspaket kann erst geschlossen werden, wenn dieses Arbeitspaket geschlossen ist" + label_blocked_singular: "Blockiert durch" + label_blocked_plural: "Blockiert durch" + label_blocked_by_singular: "Blockiert durch" + label_blocked__by_plural: "Blockiert durch" + blocked_description: "Dieses Arbeitspaket kann erst geschlossen werden, nachdem das verknüpfte Arbeitspaket geschlossen wurde" + blocked_by_description: "Dieses Arbeitspaket kann erst geschlossen werden, nachdem das verknüpfte Arbeitspaket geschlossen wurde" + label_duplicates_singular: "Duplikat von" + label_duplicates_plural: "Duplikat von" + duplicates_description: "Dies ist eine Kopie des verknüpften Arbeitspakets" + label_duplicated_singular: "Dupliziert durch" + label_duplicated_plural: "Dupliziert durch" + label_duplicated_by_singular: "Dupliziert durch" + label_duplicated_by_plural: "Dupliziert durch" + duplicated_by_description: "Das zugehörige Arbeitspaket ist eine Kopie dieses Arbeitspakets" + duplicated_description: "Das zugehörige Arbeitspaket ist eine Kopie dieses Arbeitspakets" + label_includes_singular: "enthält" + label_includes_plural: "enthält" + includes_description: "Das verknüpfte Arbeitspaket beinhaltet dieses Arbeitspaket, ohne dass dies zusätzliche Auswirkungen hat" + label_partof_singular: "enthalten in" + label_partof_plural: "enthalten in" + label_part_of_singular: "enthalten in" + label_part_of_plural: "enthalten in" + partof_description: "Dieses Arbeitspaket enthält das verknüpfte Arbeitspaket, ohne dass dies zusätzliche Auswirkungen hat" + part_of_description: "Dieses Arbeitspaket enthält das verknüpfte Arbeitspaket, ohne dass dies zusätzliche Auswirkungen hat" + label_requires_singular: "benötigt" + label_requires_plural: "benötigt" + requires_description: "Markiert dieses Arbeitspaket als Voraussetzung für das verknüpfte Arbeitspaket" + label_required_singular: "die benötigt werden von" + label_required_plural: "die benötigt werden von" + required_description: "Markiert dieses Arbeitspaket als Voraussetzung für das verknüpfte Arbeitspaket" + label_parent_singular: "Übergeordnete Arbeitspakete" + label_parent_plural: "Übergeordnetes Arbeitspaket" + label_other_relations: "Andere Beziehungen" + ghost_relation_title: "Zugehöriges Arbeitspaket" + ghost_relation_description: "Dies ist für Sie aufgrund von Berechtigungen nicht sichtbar." label_invitation: Einladung account: - delete: Konto löschen - delete_confirmation: Sind Sie sicher, dass Sie das Konto löschen wollen? - deletion_pending: Das Konto wurde Löschung vorgesehen. Beachten Sie, dass dieser - Vorgang im Hintergrund abläuft. Es kann ein paar Momente dauern, bis der Benutzer - vollständig gelöscht ist. + delete: "Konto löschen" + delete_confirmation: "Sind Sie sicher, dass Sie das Konto löschen wollen?" + deletion_pending: "Das Konto wurde Löschung vorgesehen. Beachten Sie, dass dieser Vorgang im Hintergrund abläuft. Es kann ein paar Momente dauern, bis der Benutzer vollständig gelöscht ist." deletion_info: data_consequences: - other: Alle benutzerspezifischen Daten werden gelöscht. Die Aktivitäten des - Benutzers in gemeinsamen Ansichten wie Arbeitspaketen und Besprechungen - werden nicht gelöscht, sondern mit einem generischen "Gelöschten Benutzer" - verknüpft, der nicht mit dem ursprünglichen Konto verknüpft werden kann. - self: Alle benutzerspezifischen Daten werden gelöscht. Ihre Aktivitäten in - gemeinsamen Ansichten wie Arbeitspaketen und Besprechungen werden nicht - gelöscht, sondern mit einem allgemeinen "Gelöschten Benutzer" verbunden, - der nicht mit Ihrem ursprünglichen Konto verknüpft werden kann. - heading: Konto von %{name} löschen? + other: "Alle benutzerspezifischen Daten werden gelöscht. Die Aktivitäten des Benutzers in gemeinsamen Ansichten wie Arbeitspaketen und Besprechungen werden nicht gelöscht, sondern mit einem generischen \"Gelöschten Benutzer\" verknüpft, der nicht mit dem ursprünglichen Konto verknüpft werden kann." + self: "Alle benutzerspezifischen Daten werden gelöscht. Ihre Aktivitäten in gemeinsamen Ansichten wie Arbeitspaketen und Besprechungen werden nicht gelöscht, sondern mit einem allgemeinen \"Gelöschten Benutzer\" verbunden, der nicht mit Ihrem ursprünglichen Konto verknüpft werden kann." + heading: "Konto von %{name} löschen?" login_consequences: - other: Dieses Konto wird sofort aus dem System entfernt und der Benutzer kann - sich nicht mehr mit seinen Anmeldedaten anmelden. - self: Ihr Konto wird sofort aus dem System entfernt und Sie können sich nicht - mehr mit Ihren Anmeldedaten anmelden. - error_inactive_activation_by_mail: 'Ihr Konto wurde noch nicht aktiviert. Zur - Aktivierung folgen Sie bitte dem Link, der Ihnen bei der Registrierung per E-Mail - zugeschickt wurde. - - ' - error_inactive_manual_activation: 'Ihr Konto wurde noch nicht aktiviert. Bitte - warten Sie auf die Aktivierung Ihres Kontos durch einen Administrator. - - ' - error_self_registration_disabled: 'Auf diesem System ist die Nutzerregistierung - deaktiviert. Bitte fragen Sie einen Administrator nach einem Nutzerkonto. - - ' - error_self_registration_limited_provider: 'Die Benutzerregistrierung ist für den - Single Sign-On Provider ''%{name}'' eingeschränkt. Bitten Sie einen Administrator, - das Konto für Sie zu aktivieren oder die Konfiguration der Selbstregistrierung - für diesen Anbieter zu ändern. - - ' - login_with_auth_provider: oder melden Sie sich mit einem bestehenden Konto an - signup_with_auth_provider: oder authentifizieren Sie sich mit - auth_source_login: Bitte melden Sie sich als %{login} an um Ihr Konto - zu aktivieren. + other: "Dieses Konto wird sofort aus dem System entfernt und der Benutzer kann sich nicht mehr mit seinen Anmeldedaten anmelden." + self: "Ihr Konto wird sofort aus dem System entfernt und Sie können sich nicht mehr mit Ihren Anmeldedaten anmelden." + error_inactive_activation_by_mail: > + Ihr Konto wurde noch nicht aktiviert. Zur Aktivierung folgen Sie bitte dem Link, der Ihnen bei der Registrierung per E-Mail zugeschickt wurde. + error_inactive_manual_activation: > + Ihr Konto wurde noch nicht aktiviert. Bitte warten Sie auf die Aktivierung Ihres Kontos durch einen Administrator. + error_self_registration_disabled: > + Auf diesem System ist die Nutzerregistierung deaktiviert. Bitte fragen Sie einen Administrator nach einem Nutzerkonto. + error_self_registration_limited_provider: > + Die Benutzerregistrierung ist für den Single Sign-On Provider '%{name}' eingeschränkt. Bitten Sie einen Administrator, das Konto für Sie zu aktivieren oder die Konfiguration der Selbstregistrierung für diesen Anbieter zu ändern. + login_with_auth_provider: "oder melden Sie sich mit einem bestehenden Konto an" + signup_with_auth_provider: "oder authentifizieren Sie sich mit" + auth_source_login: Bitte melden Sie sich als %{login} an um Ihr Konto zu aktivieren. omniauth_login: Bitte loggen Sie sich ein um Ihr Konto zu aktivieren. - actionview_instancetag_blank_option: Bitte auswählen + actionview_instancetag_blank_option: "Bitte auswählen" activemodel: attributes: projects/copy_options: - dependencies: Abhängigkeiten + dependencies: "Abhängigkeiten" activerecord: attributes: jira_import: - projects: Projekte - import/jira: - name: Name der Jira-Instanz - url: URL der Jira-Instanz - personal_access_token: Persönlicher Zugangs-Token + projects: "Projekte" + "import/jira": + name: "Name der Jira-Instanz" + url: "URL der Jira-Instanz" + personal_access_token: "Persönlicher Zugangs-Token" announcements: - show_until: Anzeigen bis + show_until: "Anzeigen bis" attachment: - attachment_content: Inhalt des Anhangs - attachment_file_name: Dateiname des Anhangs - content_type: Medien-Typ - downloads: Downloads - file: Datei - filename: Datei - filesize: Größe + attachment_content: "Inhalt des Anhangs" + attachment_file_name: "Dateiname des Anhangs" + content_type: "Medien-Typ" + downloads: "Downloads" + file: "Datei" + filename: "Datei" + filesize: "Größe" attribute_help_text: - attribute_name: Attribut - help_text: Hilfe-Text - caption: Untertitel + attribute_name: "Attribut" + help_text: "Hilfe-Text" + caption: "Untertitel" auth_provider: - scim_clients: SCIM-Clients + scim_clients: "SCIM-Clients" calculated_value_error: - error_code: Fehlercode - customized_id: Benutzerdefinierte ID - customized_type: Benutzerdefinierter typ + error_code: "Fehlercode" + customized_id: "Benutzerdefinierte ID" + customized_type: "Benutzerdefinierter typ" capability: - context: Kontext + context: "Kontext" changeset: - repository: Projektarchiv + repository: "Projektarchiv" comment: - commented: Kommentiert + commented: "Kommentiert" #an object that this comment belongs to custom_action: - actions: Aktionen + actions: "Aktionen" custom_field: - allow_non_open_versions: Erlaube nicht-offene Versionen - default_value: Standardwert - editable: Bearbeitbar - field_format: Format - formula: Formel - is_filter: Als Filter benutzen - is_for_all: Für alle Projekte - is_required: Erforderlich - max_length: Maximale Länge - min_length: Minimale Länge - content_right_to_left: Linksläufiger Inhalt - multi_value: Mehrfachauswahl zulassen - possible_values: Mögliche Werte - regexp: Regulärer Ausdruck - searchable: Durchsuchbar - admin_only: Nur für Administratoren - has_comment: Ein Kommentarfeld hinzufügen + allow_non_open_versions: "Erlaube nicht-offene Versionen" + default_value: "Standardwert" + editable: "Bearbeitbar" + field_format: "Format" + formula: "Formel" + is_filter: "Als Filter benutzen" + is_for_all: "Für alle Projekte" + is_required: "Erforderlich" + max_length: "Maximale Länge" + min_length: "Minimale Länge" + content_right_to_left: "Linksläufiger Inhalt" + multi_value: "Mehrfachauswahl zulassen" + possible_values: "Mögliche Werte" + regexp: "Regulärer Ausdruck" + searchable: "Durchsuchbar" + admin_only: "Nur für Administratoren" + has_comment: "Ein Kommentarfeld hinzufügen" custom_value: - value: Wert + value: "Wert" design_color: - variable: Variable + variable: "Variable" doorkeeper/application: - uid: Client-ID - secret: Clientschlüssel - owner: Besitzer - builtin: Intern - enabled: Aktiv - redirect_uri: Redirect URI - client_credentials_user_id: Client Credentials User-ID - scopes: Geltungsbereiche - confidential: Vertraulich + uid: "Client-ID" + secret: "Clientschlüssel" + owner: "Besitzer" + builtin: "Intern" + enabled: "Aktiv" + redirect_uri: "Redirect URI" + client_credentials_user_id: "Client Credentials User-ID" + scopes: "Geltungsbereiche" + confidential: "Vertraulich" emoji_reaction: - reactable: Reagiert am + reactable: "Reagiert am" enterprise_token: - starts_at: Aktiv seit - subscriber: Abonnent - subscription: Abonnement - plan: Plan - encoded_token: Enterprise edition Support Token - active_user_count_restriction: Aktive Nutzer + starts_at: "Aktiv seit" + subscriber: "Abonnent" + subscription: "Abonnement" + plan: "Plan" + encoded_token: "Enterprise edition Support Token" + active_user_count_restriction: "Aktive Nutzer" enterprise_trial: - company: Unternehmen + company: "Unternehmen" favorite: - favorited: Favorisiert + favorited: "Favorisiert" grids/grid: - page: Seite - row_count: Anzahl der Zeilen - column_count: Anzahl der Spalten - widgets: Widgets + page: "Seite" + row_count: "Anzahl der Zeilen" + column_count: "Anzahl der Spalten" + widgets: "Widgets" journal: - notes: Kommentare - cause_type: Ursachen-Typ + notes: "Kommentare" + cause_type: "Ursachen-Typ" ldap_auth_source: - account: Konto - attr_firstname: Attribut für Vorname - attr_lastname: Attribut für Nachname - attr_login: Attribut für Benutzername - attr_mail: Attribut für E-Mail - filter_string: Zeichenketten filtern - admin: Administrator - base_dn: Basis-DN - host: Host - onthefly: Benutzer automatisch erzeugen - port: Port - tls_certificate_string: LDAP-Server SSL-Zertifikat + account: "Konto" + attr_firstname: "Attribut für Vorname" + attr_lastname: "Attribut für Nachname" + attr_login: "Attribut für Benutzername" + attr_mail: "Attribut für E-Mail" + filter_string: "Zeichenketten filtern" + admin: "Administrator" + base_dn: "Basis-DN" + host: "Host" + onthefly: "Benutzer automatisch erzeugen" + port: "Port" + tls_certificate_string: "LDAP-Server SSL-Zertifikat" mcp_configuration: enabled: Aktiviert title: Titel description: Beschreibung member: - roles: Rollen + roles: "Rollen" notification: - read_ian: In-App lesen - resource: Ressource + read_ian: "In-App lesen" + resource: "Ressource" oauth_client: - client: Client-ID + client: "Client-ID" project: active_value: - true: nicht archiviert - false: archiviert - attribute_groups: Attributgruppen - description: Beschreibung - enabled_modules: Aktivierte Module - identifier: Kennung - latest_activity_at: Letzte Aktivität am - parent: Unterprojekt von - project_creation_wizard_enabled: Projektinitiierungsantrag + true: "nicht archiviert" + false: "archiviert" + attribute_groups: "Attributgruppen" + description: "Beschreibung" + enabled_modules: "Aktivierte Module" + identifier: "Kennung" + latest_activity_at: "Letzte Aktivität am" + parent: "Unterprojekt von" + project_creation_wizard_enabled: "Projektinitiierungsantrag" public_value: - title: Sichtbarkeit - true: öffentlich - false: privat - queries: Abfragen - status_code: Status - status_explanation: Statusbeschreibung + title: "Sichtbarkeit" + true: "öffentlich" + false: "privat" + queries: "Abfragen" + status_code: "Status" + status_explanation: "Statusbeschreibung" status_codes: - not_started: Nicht gestartet - on_track: Planmäßig - at_risk: Gefährdet - off_track: Unplanmäßig - finished: Abgeschlossen - discontinued: Eingestellt - project_creation_wizard_assignee_custom_field: Zuweisung bei Einreichung - project_creation_wizard_notification_text: Benachrichtigungstext - project_creation_wizard_send_confirmation_email: Bestätigungs-E-Mail - project_creation_wizard_status_when_submitted: Status bei Einreichung - project_creation_wizard_work_package_comment: Arbeitspaket-Kommentar - project_creation_wizard_work_package_type: Arbeitspaket-Typ - template: Vorlage - templated: Projektvorlage + not_started: "Nicht gestartet" + on_track: "Planmäßig" + at_risk: "Gefährdet" + off_track: "Unplanmäßig" + finished: "Abgeschlossen" + discontinued: "Eingestellt" + project_creation_wizard_assignee_custom_field: "Zuweisung bei Einreichung" + project_creation_wizard_notification_text: "Benachrichtigungstext" + project_creation_wizard_send_confirmation_email: "Bestätigungs-E-Mail" + project_creation_wizard_status_when_submitted: "Status bei Einreichung" + project_creation_wizard_work_package_comment: "Arbeitspaket-Kommentar" + project_creation_wizard_work_package_type: "Arbeitspaket-Typ" + template: "Vorlage" + templated: "Projektvorlage" templated_value: - true: als Vorlage markiert - false: als Vorlage nicht markiert - types: Typen - versions: Versionen - work_packages: Arbeitspakete - workspace_type: Arbeitsbereichstyp + true: "als Vorlage markiert" + false: "als Vorlage nicht markiert" + types: "Typen" + versions: "Versionen" + work_packages: "Arbeitspakete" + workspace_type: "Arbeitsbereichstyp" project_custom_field: custom_field_section: Abschnitt subproject_template_assignment: - workspace_type: Arbeitsbereichstyp + workspace_type: "Arbeitsbereichstyp" project/phase: - date_range: Zeitraum - definition: Definition - duration: Dauer - start_date: Anfangstermin - start_date_caption: Folgt der vorherigen Phase. - finish_date: Endtermin + date_range: "Zeitraum" + definition: "Definition" + duration: "Dauer" + start_date: "Anfangstermin" + start_date_caption: "Folgt der vorherigen Phase." + finish_date: "Endtermin" project/phase_definition: - name: Name - color: Farbe - start_gate: Phasen-Gate zum Beginn - start_gate_name: Name des Phasen-Gates zum Beginn - finish_gate: Phasen-Gate zum Ende - finish_gate_name: Name des Phasen-Gates zum Ende + name: "Name" + color: "Farbe" + start_gate: "Phasen-Gate zum Beginn" + start_gate_name: "Name des Phasen-Gates zum Beginn" + finish_gate: "Phasen-Gate zum Ende" + finish_gate_name: "Name des Phasen-Gates zum Ende" query: - sums: Summen - columns: Spalten - column_names: Spalten - relations_to_type_column: Beziehungen zu %{type} - relations_of_type_column: 'Beziehungen der Art: %{type}' - child_work_packages: Kinder - group_by: Gruppiere Ergebnisse nach - sort_by: Ergebnisse sortieren nach - filters: Filter - timeline_labels: Timeline-Beschriftungen - timeline_visible: Gantt-Diagramm zeigen - timeline_zoom_level: Gantt Diagramm Zoomstufe - timestamps: Baseline Zeitstempel - sort_criteria: Sortierkriterien - highlighted_attributes: Hervorgehobene Attribute - highlighting_mode: Hervorhebung - display_representation: Anzeigemodus - show_hierarchies: Anzeigemodus - starred: Favorit - hidden: Ausgeblendet - manual_sorting: Manuelle Sortierung - ordered_work_packages: Reihenfolge der Arbeitspakete - include_subprojects: Unterprojekte einbeziehen - results: Ergebnisse + sums: "Summen" + columns: "Spalten" + column_names: "Spalten" + relations_to_type_column: "Beziehungen zu %{type}" + relations_of_type_column: "Beziehungen der Art: %{type}" + child_work_packages: "Kinder" + group_by: "Gruppiere Ergebnisse nach" + sort_by: "Ergebnisse sortieren nach" + filters: "Filter" + timeline_labels: "Timeline-Beschriftungen" + timeline_visible: "Gantt-Diagramm zeigen" + timeline_zoom_level: "Gantt Diagramm Zoomstufe" + timestamps: "Baseline Zeitstempel" + sort_criteria: "Sortierkriterien" + highlighted_attributes: "Hervorgehobene Attribute" + highlighting_mode: "Hervorhebung" + display_representation: "Anzeigemodus" + show_hierarchies: "Anzeigemodus" + starred: "Favorit" + hidden: "Ausgeblendet" + manual_sorting: "Manuelle Sortierung" + ordered_work_packages: "Reihenfolge der Arbeitspakete" + include_subprojects: "Unterprojekte einbeziehen" + results: "Ergebnisse" relation: - lag: Verzögerung - from: Zugehöriges Arbeitspaket - to: Zugehöriges Arbeitspaket - relation_type: Relationstyp + lag: "Verzögerung" + from: "Zugehöriges Arbeitspaket" + to: "Zugehöriges Arbeitspaket" + relation_type: "Relationstyp" reminder: - remindable: Objekt der Erinnerung - remind_at: Erinnerung am - remind_at_date: Datum - remind_at_time: Zeit + remindable: "Objekt der Erinnerung" + remind_at: "Erinnerung am" + remind_at_date: "Datum" + remind_at_time: "Zeit" reminder_notification: - notification: Benachrichtigung + notification: "Benachrichtigung" repository: - url: URL + url: "URL" role: - permissions: Berechtigungen + permissions: "Berechtigungen" scim_client: - authentication_method: Authentifizierungsmethode - jwt_sub: Subject claim + authentication_method: "Authentifizierungsmethode" + jwt_sub: "Subject claim" status: - is_closed: Arbeitspaket geschlossen - is_readonly: Arbeitspakete schreibgeschützt - excluded_from_totals: Von der Berechnung der Gesamtsumme in der Hierarchie - ausschließen + is_closed: "Arbeitspaket geschlossen" + is_readonly: "Arbeitspakete schreibgeschützt" + excluded_from_totals: "Von der Berechnung der Gesamtsumme in der Hierarchie ausschließen" default_done_ratio: "% abgeschlossen" token/named: - token_name: Tokenname + token_name: "Tokenname" token/ical: - calendar: Kalender - ical_token_query_assignment: Zuordnung der Abfrage + calendar: "Kalender" + ical_token_query_assignment: "Zuordnung der Abfrage" time_entry: - activity: Aktivität - hours: Stunden - spent_on: Datum - type: Art - ongoing: Fortlaufend + activity: "Aktivität" + hours: "Stunden" + spent_on: "Datum" + type: "Art" + ongoing: "Fortlaufend" type: - description: Standardtext für Beschreibung - attribute_groups: Formularkonfiguration - is_in_roadmap: In Roadmap standardmäßig angezeigt - is_default: Typ für neue Projekte standardmäßig aktiviert - is_milestone: Ist ein Meilenstein - color: Farbe - patterns: Muster + description: "Standardtext für Beschreibung" + attribute_groups: "Formularkonfiguration" + is_in_roadmap: "In Roadmap standardmäßig angezeigt" + is_default: "Typ für neue Projekte standardmäßig aktiviert" + is_milestone: "Ist ein Meilenstein" + color: "Farbe" + patterns: "Muster" remote_identity: - auth_source: Authentizifierungsquelle - integration: Integration - user: Benutzer + auth_source: "Authentizifierungsquelle" + integration: "Integration" + user: "Benutzer" user: - admin: Administrator - auth_source: Authentifizierungsquelle - ldap_auth_source: LDAP-Verbindung - identity_url: Identity URL - current_password: Aktuelles Passwort - force_password_change: Erzwinge Passwortwechsel beim nächsten Login - language: Sprache - last_login_on: Letzte Anmeldung - failed_login_count: Fehlgeschlagene Anmeldeversuche - first_name: Vorname - last_name: Nachname - first_login: Erste Anmeldung - new_password: Neues Kennwort - password_confirmation: Bestätigung - consented_at: Eingewilligt am + admin: "Administrator" + auth_source: "Authentifizierungsquelle" + ldap_auth_source: "LDAP-Verbindung" + identity_url: "Identity URL" + current_password: "Aktuelles Passwort" + force_password_change: "Erzwinge Passwortwechsel beim nächsten Login" + language: "Sprache" + last_login_on: "Letzte Anmeldung" + failed_login_count: "Fehlgeschlagene Anmeldeversuche" + first_name: "Vorname" + last_name: "Nachname" + first_login: "Erste Anmeldung" + new_password: "Neues Kennwort" + password_confirmation: "Bestätigung" + consented_at: "Eingewilligt am" group: - identity_url: Identity URL + identity_url: "Identity URL" user_preference: - header_look_and_feel: Erscheinungsbild und Bedienverhalten - header_alerts: Warnmeldungen - button_update_look_and_feel: Erscheinungsbild und Bedienverhalten aktualisieren - button_update_alerts: Warnmeldungen aktualisieren - button_update_user_information: Profil aktualisieren - comments_sorting: Arbeits­paket­aktivität anzeigen, sortiert nach - disable_keyboard_shortcuts: Tastaturkürzel deaktivieren - disable_keyboard_shortcuts_caption_html: Sie können die standardmäßigen Tastenkombinationen deaktivieren, wenn Sie einen Screenreader - verwenden oder unbeabsichtigtes Auslösen einer Aktion durch eine Tastenkombination - vermeiden möchten. - dismissed_enterprise_banners: Ausgeblendete Unternehmensbanner - impaired: Für die barrierefreie Nutzung optimierte Oberfläche - auto_hide_popups: Erfolgsbannern automatisch ausblenden - auto_hide_popups_caption: Wenn diese Funktion aktiviert ist, verschwinden - die grünen Erfolgsbanner automatisch nach 5 Sekunden. - warn_on_leaving_unsaved: Beim Verlassen einer Arbeitspaket-Seite mit ungespeichertem - Text warnen - increase_theme_contrast: Kontrast erhöhen - increase_contrast: Kontrast erhöhen - increase_contrast_caption: Aktiviere hohen Kontrast für den gewählten Farbmodus. - force_light_theme_contrast: Hohen Kontrast im Hell-Modus erzwingen - force_dark_theme_contrast: Hohen Kontrast im Dunkel-Modus erzwingen - force_light_theme_contrast_caption: Verwendet die kontrastreiche Version des - Hell-Modus, wenn der automatische Farbmodus ausgewählt ist. - force_dark_theme_contrast_caption: Verwendet die kontrastreiche Version des - Dunkel-Modus, wenn der automatische Farbmodus ausgewählt ist. - theme: Farbmodus - time_zone: Zeitzone - mode_guideline: Einige Modi überschreiben benutzerdefinierte Theme-Farben - zur Verbesserung von Barrierefreiheit und Lesbarkeit. Bitte wählen Sie den - Hellmodus für die vollständige Unterstützung Ihres benutzerdefinierten Themes. - daily_reminders: Tägliche Erinnerungen - workdays: Arbeitstage + header_look_and_feel: "Erscheinungsbild und Bedienverhalten" + header_alerts: "Warnmeldungen" + button_update_look_and_feel: "Erscheinungsbild und Bedienverhalten aktualisieren" + button_update_alerts: "Warnmeldungen aktualisieren" + button_update_user_information: "Profil aktualisieren" + comments_sorting: "Arbeits­paket­aktivität anzeigen, sortiert nach" + disable_keyboard_shortcuts: "Tastaturkürzel deaktivieren" + disable_keyboard_shortcuts_caption_html: |- + Sie können die standardmäßigen Tastenkombinationen deaktivieren, wenn Sie einen Screenreader verwenden oder unbeabsichtigtes Auslösen einer Aktion durch eine Tastenkombination vermeiden möchten. + dismissed_enterprise_banners: "Ausgeblendete Unternehmensbanner" + impaired: "Für die barrierefreie Nutzung optimierte Oberfläche" + auto_hide_popups: "Erfolgsbannern automatisch ausblenden" + auto_hide_popups_caption: "Wenn diese Funktion aktiviert ist, verschwinden die grünen Erfolgsbanner automatisch nach 5 Sekunden." + warn_on_leaving_unsaved: "Beim Verlassen einer Arbeitspaket-Seite mit ungespeichertem Text warnen" + increase_theme_contrast: "Kontrast erhöhen" + increase_contrast: "Kontrast erhöhen" + increase_contrast_caption: "Aktiviere hohen Kontrast für den gewählten Farbmodus." + force_light_theme_contrast: "Hohen Kontrast im Hell-Modus erzwingen" + force_dark_theme_contrast: "Hohen Kontrast im Dunkel-Modus erzwingen" + force_light_theme_contrast_caption: "Verwendet die kontrastreiche Version des Hell-Modus, wenn der automatische Farbmodus ausgewählt ist." + force_dark_theme_contrast_caption: "Verwendet die kontrastreiche Version des Dunkel-Modus, wenn der automatische Farbmodus ausgewählt ist." + theme: "Farbmodus" + time_zone: "Zeitzone" + mode_guideline: "Einige Modi überschreiben benutzerdefinierte Theme-Farben zur Verbesserung von Barrierefreiheit und Lesbarkeit. Bitte wählen Sie den Hellmodus für die vollständige Unterstützung Ihres benutzerdefinierten Themes." + daily_reminders: "Tägliche Erinnerungen" + workdays: "Arbeitstage" users/invitation/form_model: - principal_type: Art der Einladung - id_or_email: Name oder E-Mail-Adresse + principal_type: "Art der Einladung" + id_or_email: "Name oder E-Mail-Adresse" version: - effective_date: Endtermin - sharing: Gemeinsame Verwendung + effective_date: "Endtermin" + sharing: "Gemeinsame Verwendung" wiki_content: - text: Text + text: "Text" wiki_page: - parent_title: Übergeordnete Seite - redirect_existing_links: Existierende Links umleiten - text: Seiteninhalt + parent_title: "Übergeordnete Seite" + redirect_existing_links: "Existierende Links umleiten" + text: "Seiteninhalt" work_package: - ancestor: Nachkommen von - begin_insertion: Beginn der Einfügung - begin_deletion: Beginn des Löschvorgangs - children: Unteraufgaben - derived_done_ratio: Insgesamt % abgeschlossen - derived_remaining_hours: Verbleibende Arbeit insgesamt - derived_remaining_time: Verbleibende Arbeit insgesamt + ancestor: "Nachkommen von" #used for filtering of work packages that are descendants of a given work package + begin_insertion: "Beginn der Einfügung" + begin_deletion: "Beginn des Löschvorgangs" + children: "Unteraufgaben" + derived_done_ratio: "Insgesamt % abgeschlossen" + derived_remaining_hours: "Verbleibende Arbeit insgesamt" + derived_remaining_time: "Verbleibende Arbeit insgesamt" done_ratio: "% abgeschlossen" - duration: Dauer - end_insertion: Ende der Einfügung - end_deletion: Ende des Löschvorgangs - ignore_non_working_days: Nicht-Arbeitstage ignorieren + duration: "Dauer" + end_insertion: "Ende der Einfügung" + end_deletion: "Ende des Löschvorgangs" + ignore_non_working_days: "Nicht-Arbeitstage ignorieren" include_non_working_days: - title: Werktage - false: Nur Werktage - true: Mit Wochenenden + title: "Werktage" + false: "Nur Werktage" + true: "Mit Wochenenden" journal_internal: Internes Journal - notify: Benachrichtigung - parent: Übergeordnetes Arbeitspaket - parent_issue: Übergeordnetes Arbeitspaket - parent_work_package: Übergeordnetes Arbeitspaket - priority: Priorität + notify: "Benachrichtigung" #used in custom actions + parent: "Übergeordnetes Arbeitspaket" + parent_issue: "Übergeordnetes Arbeitspaket" + parent_work_package: "Übergeordnetes Arbeitspaket" + priority: "Priorität" progress: "% abgeschlossen" - readonly: Nur Lesezugriff - remaining_hours: Verbleibender Aufwand - remaining_time: Verbleibender Aufwand - shared_with_users: Geteilt mit - schedule_manually: Manuelle Planung - spent_hours: Aufgewendete Zeit - spent_time: Aufgewendete Zeit - subproject: Unterprojekt - time_entries: Zeit buchen - type: Typ - version: Version - watcher: Beobachter + readonly: "Nur Lesezugriff" + remaining_hours: "Verbleibender Aufwand" + remaining_time: "Verbleibender Aufwand" + shared_with_users: "Geteilt mit" + schedule_manually: "Manuelle Planung" + spent_hours: "Aufgewendete Zeit" + spent_time: "Aufgewendete Zeit" + subproject: "Unterprojekt" + time_entries: "Zeit buchen" + type: "Typ" + version: "Version" + watcher: "Beobachter" errors: messages: - accepted: muss akzeptiert werden. - after: muss nach %{date} sein. - after_today: muss in der Zukunft liegen. - after_or_equal_to: muss nach oder gleich %{date} sein. - before: muss vor %{date} sein. - before_or_equal_to: muss vor oder gleich %{date} sein. - blank: muss ausgefüllt werden. - 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. + accepted: "muss akzeptiert werden." + after: "muss nach %{date} sein." + after_today: "muss in der Zukunft liegen." + after_or_equal_to: "muss nach oder gleich %{date} sein." + before: "muss vor %{date} sein." + before_or_equal_to: "muss vor oder gleich %{date} sein." + blank: "muss ausgefüllt werden." + 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." - does_not_exist: existiert nicht. - 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. - error_conflict: Die Informationen wurde zwischenzeitlich durch andere Benutzer - geändert. - error_not_found: nicht gefunden. - email: ist keine gültige E-Mail-Adresse. - empty: muss ausgefüllt werden. - enterprise_plan_required: benötigt mindestens %{plan_name}. - even: muss gerade sein. - exclusion: ist nicht verfügbar. + does_not_exist: "existiert nicht." + 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." + error_conflict: "Die Informationen wurde zwischenzeitlich durch andere Benutzer geändert." + error_not_found: "nicht gefunden." + email: "ist keine gültige E-Mail-Adresse." + empty: "muss ausgefüllt werden." + enterprise_plan_required: "benötigt mindestens %{plan_name}." + even: "muss gerade sein." + exclusion: "ist nicht verfügbar." feature_disabled: ist nicht verfügbar. feature_disabled_for_project: ist für dieses Projekt deaktiviert. - file_too_large: ist zu groß (nicht mehr als %{count} Bytes erlaubt). - filter_does_not_exist: Filter existiert nicht. - format: stimmt nicht mit dem erwarteten Format '%{expected} ' überein. - format_nested: stimmt nicht mit dem erwarteten Format '%{expected} ' im Pfad - '%{path}' überein. - greater_than: muss größer als %{count} sein. - 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. - 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_url: ist keine gültige URL. - invalid_url_scheme: 'ist kein unterstütztes Protokoll (erlaubt: %{allowed_schemes}).' - less_than_or_equal_to: muss kleiner oder gleich %{count} sein. - not_available: ist aufgrund einer Systemkonfiguration nicht verfügbar. - not_deletable: kann nicht entfernt werden. - not_current_user: ist nicht der aktuelle Benutzer. - only_one_active_sprint_allowed: pro Projekt ist nur ein aktiver Sprint erlaubt. - 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. - 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. - 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. - taken: ist bereits vergeben. - too_long: ist zu lang (nicht mehr als %{count} Zeichen). - too_short: ist zu kurz (nicht weniger als %{count} Zeichen). - type_mismatch: ist nicht vom Typ '%{type}' - type_mismatch_nested: ist nicht vom Typ '%{type}' im Pfad '%{path}' - unchangeable: kann nicht geändert werden. - unknown_property: ist kein bekanntes Attribut. - unknown_property_nested: hat den unerwarteten Pfad '%{path}'. - unremovable: kann nicht entfernt werden. - url_not_secure_context: 'stellt keinen "Secure Context" zur Verfügung: Benutzen - Sie entweder HTTPS oder eine Loopback-Adresse, wie z.B. localhost. - - ' - wrong_length: hat die falsche Länge (muss genau %{count} Zeichen haben). + file_too_large: "ist zu groß (nicht mehr als %{count} Bytes erlaubt)." + filter_does_not_exist: "Filter existiert nicht." + format: "stimmt nicht mit dem erwarteten Format '%{expected} ' überein." + format_nested: "stimmt nicht mit dem erwarteten Format '%{expected} ' im Pfad '%{path}' überein." + greater_than: "muss größer als %{count} sein." + 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." + 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_url: "ist keine gültige URL." + invalid_url_scheme: "ist kein unterstütztes Protokoll (erlaubt: %{allowed_schemes})." + less_than_or_equal_to: "muss kleiner oder gleich %{count} sein." + not_available: "ist aufgrund einer Systemkonfiguration nicht verfügbar." + not_deletable: "kann nicht entfernt werden." + not_current_user: "ist nicht der aktuelle Benutzer." + only_one_active_sprint_allowed: "pro Projekt ist nur ein aktiver Sprint erlaubt." + 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." + 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." + 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." + taken: "ist bereits vergeben." + too_long: "ist zu lang (nicht mehr als %{count} Zeichen)." + too_short: "ist zu kurz (nicht weniger als %{count} Zeichen)." + type_mismatch: "ist nicht vom Typ '%{type}'" + type_mismatch_nested: "ist nicht vom Typ '%{type}' im Pfad '%{path}'" + unchangeable: "kann nicht geändert werden." + unknown_property: "ist kein bekanntes Attribut." + unknown_property_nested: "hat den unerwarteten Pfad '%{path}'." + unremovable: "kann nicht entfernt werden." + url_not_secure_context: > + stellt keinen "Secure Context" zur Verfügung: Benutzen Sie entweder HTTPS oder eine Loopback-Adresse, wie z.B. localhost. + wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)." models: ldap_auth_source: attributes: tls_certificate_string: - invalid_certificate: 'Das angegebene SSL-Zertifikat ist ungültig: %{additional_message}' + invalid_certificate: "Das angegebene SSL-Zertifikat ist ungültig: %{additional_message}" format: "%{message}" attachment: attributes: content_type: - blank: Der Content-Type der Datei darf nicht leer sein. - not_allowlisted: Die Datei wurde von einem automatischen Filter abgelehnt. - ‚%{value}‘ ist für den Upload nicht zulässig. + blank: "Der Content-Type der Datei darf nicht leer sein." + not_allowlisted: "Die Datei wurde von einem automatischen Filter abgelehnt. ‚%{value}‘ ist für den Upload nicht zulässig." format: "%{message}" capability: context: - global: Global + global: "Global" query: filters: - minimum: müssen mindestens einen Filter für Principal, Kontext oder - ID mit dem '=' Operator enthalten. + minimum: "müssen mindestens einen Filter für Principal, Kontext oder ID mit dem '=' Operator enthalten." custom_field: - at_least_one_custom_option: Mindestens ein Wert muss verfügbar sein. - previous_custom_field_recalculation_unprocessed: Die Neuberechnung früherer - Änderungen für dieses benutzerdefinierte Feld wurde noch nicht durchgeführt. - Bitte versuchen Sie es in ein paar Minuten erneut. + at_least_one_custom_option: "Mindestens ein Wert muss verfügbar sein." + previous_custom_field_recalculation_unprocessed: "Die Neuberechnung früherer Änderungen für dieses benutzerdefinierte Feld wurde noch nicht durchgeführt. Bitte versuchen Sie es in ein paar Minuten erneut." referenced_in_other_fields_html: - one: "%{name} wird bei der Berechnung eines Projektattributs verwendet - %{links}." - other: "%{name} wird bei der Berechnung von Projektattribute verwendet - %{links}." + one: "%{name} wird bei der Berechnung eines Projektattributs verwendet %{links}." + other: "%{name} wird bei der Berechnung von Projektattribute verwendet %{links}." attributes: formula: - blank: Die Formel kann nicht leer sein. - invalid: Die Formel ist ungültig. - invalid_characters: Nur numerische Werte, mathematische Operatoren und - Projektattribute vom Typ Integer, Float, Berechneter Wert und Gewichtete - Liste sind erlaubt. - not_allowed_custom_fields_referenced: Das Attribut %{custom_fields} - kann nicht verwendet werden, da es zu einem Zirkelbezug führt; ein - Attribut hängt vom anderen ab. + blank: "Die Formel kann nicht leer sein." + invalid: "Die Formel ist ungültig." + invalid_characters: "Nur numerische Werte, mathematische Operatoren und Projektattribute vom Typ Integer, Float, Berechneter Wert und Gewichtete Liste sind erlaubt." + not_allowed_custom_fields_referenced: "Das Attribut %{custom_fields} kann nicht verwendet werden, da es zu einem Zirkelbezug führt; ein Attribut hängt vom anderen ab." format: "%{message}" required: - cannot_be_true: kann nicht auf 'wahr' gesetzt werden. + cannot_be_true: "kann nicht auf 'wahr' gesetzt werden." custom_fields_project: attributes: project_ids: - blank: Bitte wählen Sie ein Projekt aus. + blank: "Bitte wählen Sie ein Projekt aus." custom_actions: only_one_allowed: "(%{name}) nur ein Wert ist zulässig." empty: "(%{name}) Wert darf nicht leer sein." inclusion: "(%{name}) ist nicht auf einen erlaubten Wert gesetzt." - not_logged_in: "(%{name}) Wert kann nicht gesetzt werden, da Sie nicht eingeloggt - sind." + not_logged_in: "(%{name}) Wert kann nicht gesetzt werden, da Sie nicht eingeloggt sind." not_an_integer: "(%{name}) ist keine Ganzzahl." - smaller_than_or_equal_to: "(%{name}) muss kleiner als oder gleich %{count} - sein." - greater_than_or_equal_to: "(%{name}) muss größer als oder gleich %{count} - sein." + smaller_than_or_equal_to: "(%{name}) muss kleiner als oder gleich %{count} sein." + greater_than_or_equal_to: "(%{name}) muss größer als oder gleich %{count} sein." format: "%{message}" doorkeeper/application: attributes: redirect_uri: - fragment_present: kann kein Fragment enthalten. - invalid_uri: muss eine gültige URI sein. - relative_uri: muss eine absolute URI sein. - secured_uri: 'stellt keinen "Secure Context" zur Verfügung: Benutzen - Sie entweder HTTPS oder eine Loopback-Adresse, wie z.B. localhost.' - forbidden_uri: ist vom Server nicht erlaubt. + fragment_present: "kann kein Fragment enthalten." + invalid_uri: "muss eine gültige URI sein." + relative_uri: "muss eine absolute URI sein." + secured_uri: 'stellt keinen "Secure Context" zur Verfügung: Benutzen Sie entweder HTTPS oder eine Loopback-Adresse, wie z.B. localhost.' + forbidden_uri: "ist vom Server nicht erlaubt." scopes: - not_match_configured: stimmt nicht mit verfügbaren Geltungsbereichen - überein. + not_match_configured: "stimmt nicht mit verfügbaren Geltungsbereichen überein." enterprise_trial: - already_used: wurde bereits verwendet, um eine Testversion zu erstellen. - failed_to_create: Testversion konnte nicht erstellt werden (%{status}) - general_consent: Bitte akzeptieren Sie die Nutzungs- und Vertragsbedingungen. + already_used: "wurde bereits verwendet, um eine Testversion zu erstellen." + failed_to_create: "Testversion konnte nicht erstellt werden (%{status})" + general_consent: "Bitte akzeptieren Sie die Nutzungs- und Vertragsbedingungen." enterprise_token: - only_one_trial: Es kann nur ein Test-Token aktiv sein. Bitte löschen Sie - den vorherigen Test-Token, bevor Sie einen weiteren hinzufügen. - unreadable: kann nicht gelesen werden. Ist dies ein Enterprise edition Support - Token? - already_added: Dieser Token wurde bereits hinzugefügt. + only_one_trial: "Es kann nur ein Test-Token aktiv sein. Bitte löschen Sie den vorherigen Test-Token, bevor Sie einen weiteren hinzufügen." + unreadable: "kann nicht gelesen werden. Ist dies ein Enterprise edition Support Token?" + already_added: "Dieser Token wurde bereits hinzugefügt." favorite: - already_favorited: wurde bereits favorisiert. + already_favorited: "wurde bereits favorisiert." grids/grid: - overlaps: überlappen. - outside: ist außerhalb des Rasters. - end_before_start: der Endwert muss größer sein als der Startwert. + overlaps: "überlappen." + outside: "ist außerhalb des Rasters." + end_before_start: "der Endwert muss größer sein als der Startwert." ical_token_query_assignment: attributes: name: - blank: ist obligatorisch. Bitte wählen Sie einen Namen aus. - not_unique: ist bereits in Gebrauch. Bitte wählen Sie einen anderen - Namen aus. + blank: "ist obligatorisch. Bitte wählen Sie einen Namen aus." + not_unique: "ist bereits in Gebrauch. Bitte wählen Sie einen anderen Namen aus." meeting: - error_conflict: Das Speichern ist nicht möglich, da die Besprechung in der - Zwischenzeit von einem anderen Benutzer aktualisiert wurde. Bitte laden - Sie die Seite neu. + error_conflict: "Das Speichern ist nicht möglich, da die Besprechung in der Zwischenzeit von einem anderen Benutzer aktualisiert wurde. Bitte laden Sie die Seite neu." message: - cannot_move_message_to_forum_of_different_project: Eine Nachricht kann nicht - in ein Forum eines anderen Projekts verschoben werden. + cannot_move_message_to_forum_of_different_project: "Eine Nachricht kann nicht in ein Forum eines anderen Projekts verschoben werden." notifications: - at_least_one_channel: Mindestens ein Kanal zum Senden von Benachrichtigungen - muss angegeben werden. + at_least_one_channel: "Mindestens ein Kanal zum Senden von Benachrichtigungen muss angegeben werden." attributes: read_ian: - read_on_creation: kann bei der Erstellung von Benachrichtigungen nicht - auf true gesetzt werden. + read_on_creation: "kann bei der Erstellung von Benachrichtigungen nicht auf true gesetzt werden." mail_reminder_sent: - set_on_creation: kann bei der Erstellung von Benachrichtigungen nicht - auf true gesetzt werden. + set_on_creation: "kann bei der Erstellung von Benachrichtigungen nicht auf true gesetzt werden." reason: - no_notification_reason: kann nicht leer sein, da In-App-Benachrichtigung - als Kanal ausgewählt ist. + no_notification_reason: "kann nicht leer sein, da In-App-Benachrichtigung als Kanal ausgewählt ist." reason_mail_digest: - no_notification_reason: darf nicht leer sein, da tägliche E-Mail-Übersicht - als Kanal ausgewählt ist. + no_notification_reason: "darf nicht leer sein, da tägliche E-Mail-Übersicht als Kanal ausgewählt ist." non_working_day: attributes: date: - taken: Für %{value} existiert bereits ein arbeitsfreier Tag. + taken: "Für %{value} existiert bereits ein arbeitsfreier Tag." format: "%{message}" parse_schema_filter_params_service: attributes: base: - unsupported_operator: Der Operator wird nicht unterstützt. - invalid_values: Ein Wert ist ungültig. - id_filter_required: Ein "Id" Filter ist erforderlich. + unsupported_operator: "Der Operator wird nicht unterstützt." + invalid_values: "Ein Wert ist ungültig." + id_filter_required: "Ein \"Id\" Filter ist erforderlich." project: - archived_ancestor: Das Projekt hat einen archivierten Vorgänger. - foreign_wps_reference_version: Arbeitspakete in nicht verknüpften Projekten - verweisen auf Versionen des Projekts oder seiner verknüpften Projekte. - cannot_be_assigned_to_artifact_work_package: Der gewählte Nutzer darf im - Arbeitspaket nicht zugewiesen werden. + archived_ancestor: "Das Projekt hat einen archivierten Vorgänger." + foreign_wps_reference_version: "Arbeitspakete in nicht verknüpften Projekten verweisen auf Versionen des Projekts oder seiner verknüpften Projekte." + cannot_be_assigned_to_artifact_work_package: "Der gewählte Nutzer darf im Arbeitspaket nicht zugewiesen werden." attributes: base: - archive_permission_missing_on_subprojects: Sie haben nicht die erforderlichen - Berechtigungen, um alle Unterprojekte zu archivieren. Bitte kontaktieren - Sie einen Administrator. - project_initiation_request_disabled: Die Anfrage zur Projektinitiierung - ist deaktiviert. Sie muss aktiviert sein, um das Artefakt-Arbeitspaket - zu erstellen. + archive_permission_missing_on_subprojects: "Sie haben nicht die erforderlichen Berechtigungen, um alle Unterprojekte zu archivieren. Bitte kontaktieren Sie einen Administrator." + project_initiation_request_disabled: "Die Anfrage zur Projektinitiierung ist deaktiviert. Sie muss aktiviert sein, um das Artefakt-Arbeitspaket zu erstellen." types: - in_use_by_work_packages: 'wird noch genutzt von folgenden Arbeitspaketen: - %{types}' + in_use_by_work_packages: "wird noch genutzt von folgenden Arbeitspaketen: %{types}" enabled_modules: - dependency_missing: Das Modul "%{dependency}" muss ebenfalls aktiviert - sein, da das Modul "%{module}" dieses benötigt. + dependency_missing: "Das Modul \"%{dependency}\" muss ebenfalls aktiviert sein, da das Modul \"%{module}\" dieses benötigt." format: "%{message}" project_custom_field_project_mapping: attributes: project_ids: - blank: Bitte wählen Sie ein Projekt aus. + blank: "Bitte wählen Sie ein Projekt aus." project/phase: attributes: start_date: - must_be_before_finish_date: muss vor dem Enddatum liegen. - non_continuous_dates: kann nicht vor dem Enddatum der vorherigen Phase - liegen. + must_be_before_finish_date: "muss vor dem Enddatum liegen." + non_continuous_dates: "kann nicht vor dem Enddatum der vorherigen Phase liegen." finish_date: - must_be_after_start_date: muss nach dem Startdatum liegen. - cannot_be_a_non_working_day: kann kein arbeitsfreier Tag sein. + must_be_after_start_date: "muss nach dem Startdatum liegen." + cannot_be_a_non_working_day: "kann kein arbeitsfreier Tag sein." query: attributes: public: - error_unauthorized: "- Der Nutzer hat nicht die Berechtigung öffentliche - Ansichten zu erstellen." + error_unauthorized: "- Der Nutzer hat nicht die Berechtigung öffentliche Ansichten zu erstellen." group_by: - invalid: 'Kann nicht gruppieren nach: %{value}' + invalid: "Kann nicht gruppieren nach: %{value}" format: "%{message}" column_names: - invalid: 'Ungültige Filter-Spalte: %{value}' + invalid: "Ungültige Filter-Spalte: %{value}" format: "%{message}" sort_criteria: - invalid: 'Kann nicht nach Spalte sortieren: %{value}' + invalid: "Kann nicht nach Spalte sortieren: %{value}" format: "%{message}" timestamps: - invalid: 'Zeitstempel enthalten ungültige Werte: %{values}' - forbidden: 'Zeitstempel enthalten ungültige Werte: %{values}' + invalid: "Zeitstempel enthalten ungültige Werte: %{values}" + forbidden: "Zeitstempel enthalten ungültige Werte: %{values}" format: "%{message}" selects: - name_not_included: Die Spalte ‚Name‘ muss enthalten sein - nonexistent: Die Spalte ‚%{column}‘ existiert nicht. + name_not_included: "Die Spalte ‚Name‘ muss enthalten sein" + nonexistent: "Die Spalte ‚%{column}‘ existiert nicht." format: "%{message}" - group_by_hierarchies_exclusive: schließt sich gegenseitig mit der Gruppierung - nach "%{group_by}" aus. Beide können nicht zeitgleich aktiv sein. - can_only_be_modified_by_owner: Die Abfrage kann nur vom Besitzer geändert - werden - need_permission_to_modify_public_query: Du kannst eine öffentliche Abfrage - nicht ändern. + group_by_hierarchies_exclusive: "schließt sich gegenseitig mit der Gruppierung nach \"%{group_by}\" aus. Beide können nicht zeitgleich aktiv sein." + can_only_be_modified_by_owner: "Die Abfrage kann nur vom Besitzer geändert werden" + need_permission_to_modify_public_query: "Du kannst eine öffentliche Abfrage nicht ändern." filters: custom_fields: - inexistent: Es existiert kein benutzerdefiniertes Feld für diesen Filter. + inexistent: "Es existiert kein benutzerdefiniertes Feld für diesen Filter." queries/filters/base: attributes: values: - inclusion: Filter enthält ungültige Werte. + inclusion: "Filter enthält ungültige Werte." format: "%{message}" queries/principals/filters/internal_mentionable_on_work_package_filter: attributes: values: - single_value_requirement: muss ein einzelnes Arbeitspaket sein + single_value_requirement: "muss ein einzelnes Arbeitspaket sein" relation: typed_dag: - circular_dependency: Die Beziehung erzeugt eine zirkuläre Abhängigkeit. + circular_dependency: "Die Beziehung erzeugt eine zirkuläre Abhängigkeit." attributes: base: - error_not_deletable: Diese Beziehung kann nicht gelöscht werden, da - Sie keine Bearbeitungsberechtigung für das ausgewählte Arbeitspaket - haben. - error_not_editable: Diese Beziehung kann nicht bearbeitet werden, da - Sie keine Bearbeitungsrechte für das ausgewählte Arbeitspaket haben. + error_not_deletable: "Diese Beziehung kann nicht gelöscht werden, da Sie keine Bearbeitungsberechtigung für das ausgewählte Arbeitspaket haben." + error_not_editable: "Diese Beziehung kann nicht bearbeitet werden, da Sie keine Bearbeitungsrechte für das ausgewählte Arbeitspaket haben." to_id: - format: Das ausgewählte Arbeitspaket %{message} - error_not_found: konnte nicht gefunden werden. - error_readonly: kann für bestehende Beziehungen nicht geändert werden. - error_not_manageable: kann nicht hinzugefügt werden, da Sie keine Bearbeitungsberechtigung - für das ausgewählte Arbeitspaket haben. + format: "Das ausgewählte Arbeitspaket %{message}" + error_not_found: "konnte nicht gefunden werden." + error_readonly: "kann für bestehende Beziehungen nicht geändert werden." + error_not_manageable: "kann nicht hinzugefügt werden, da Sie keine Bearbeitungsberechtigung für das ausgewählte Arbeitspaket haben." from_id: - format: Das ausgewählte Arbeitspaket %{message} - error_not_found: konnte nicht gefunden werden. - error_readonly: kann für bestehende Beziehungen nicht geändert werden. - error_not_manageable: kann nicht hinzugefügt werden, da Sie keine Bearbeitungsberechtigung - für das ausgewählte Arbeitspaket haben. + format: "Das ausgewählte Arbeitspaket %{message}" + error_not_found: "konnte nicht gefunden werden." + error_readonly: "kann für bestehende Beziehungen nicht geändert werden." + error_not_manageable: "kann nicht hinzugefügt werden, da Sie keine Bearbeitungsberechtigung für das ausgewählte Arbeitspaket haben." repository: - not_available: SCM-Anbieter ist nicht verfügbar - not_whitelisted: wird durch die Konfiguration nicht erlaubt. - invalid_url: ist keine gültige URL oder Pfad zum Projektarchiv. - must_not_be_ssh: darf keine SSH-URL sein. - no_directory: ist kein Verzeichnis. + not_available: "SCM-Anbieter ist nicht verfügbar" + not_whitelisted: "wird durch die Konfiguration nicht erlaubt." + invalid_url: "ist keine gültige URL oder Pfad zum Projektarchiv." + must_not_be_ssh: "darf keine SSH-URL sein." + no_directory: "ist kein Verzeichnis." role: attributes: permissions: - dependency_missing: muss auch '%{dependency}' enthalten, da '%{permission}' - ausgewählt ist. + dependency_missing: "muss auch '%{dependency}' enthalten, da '%{permission}' ausgewählt ist." setting: attributes: base: - working_days_are_missing: Mindestens ein Wochentag muss als Arbeitstag - definiert werden. - previous_working_day_changes_unprocessed: Die vorherigen Änderungen - an der Konfiguration der Arbeitstage wurden noch nicht angewendet. - hours_per_day_are_missing: Die Anzahl der Stunden pro Tag muss festgelegt - werden. - durations_are_not_positive_numbers: Die Dauer muss positiv sein - hours_per_day_is_out_of_bounds: Die Anzahl der Stunden pro Tag darf - 24 nicht überschreiten. + working_days_are_missing: "Mindestens ein Wochentag muss als Arbeitstag definiert werden." + previous_working_day_changes_unprocessed: "Die vorherigen Änderungen an der Konfiguration der Arbeitstage wurden noch nicht angewendet." + hours_per_day_are_missing: "Die Anzahl der Stunden pro Tag muss festgelegt werden." + durations_are_not_positive_numbers: "Die Dauer muss positiv sein" + hours_per_day_is_out_of_bounds: "Die Anzahl der Stunden pro Tag darf 24 nicht überschreiten." status: attributes: default_done_ratio: - inclusion: muss zwischen 0 und 100 liegen. - readonly_default_exlusive: kann nicht für einen Status aktiviert werden, - der als Standard markiert ist. + inclusion: "muss zwischen 0 und 100 liegen." + readonly_default_exlusive: "kann nicht für einen Status aktiviert werden, der als Standard markiert ist." time_entry: attributes: hours: - day_limit: ist zu hoch, da maximal 24 Stunden pro Tag protokolliert - werden können. + day_limit: "ist zu hoch, da maximal 24 Stunden pro Tag protokolliert werden können." user_preference: attributes: pause_reminders: - invalid_range: kann nur ein gültiger Datumsbereich sein. + invalid_range: "kann nur ein gültiger Datumsbereich sein." daily_reminders: - full_hour: kann nur in vollen Stunden konfiguriert werden. + full_hour: "kann nur in vollen Stunden konfiguriert werden." notification_settings: - only_one_global_setting: Es darf nur eine globale Benachrichtigungseinstellung - geben. - email_alerts_global: Die E-Mail-Benachrichtigungseinstellungen können - nur global gesetzt werden. + only_one_global_setting: "Es darf nur eine globale Benachrichtigungseinstellung geben." + email_alerts_global: "Die E-Mail-Benachrichtigungseinstellungen können nur global gesetzt werden." format: "%{message}" - wrong_date: Falscher Wert für Startdatum, Fälligkeitsdatum oder Überfälligkeit. + wrong_date: "Falscher Wert für Startdatum, Fälligkeitsdatum oder Überfälligkeit." watcher: attributes: user_id: - not_allowed_to_view: darf diese Ressource nicht sehen. - locked: ist gesperrt. + not_allowed_to_view: "darf diese Ressource nicht sehen." + locked: "ist gesperrt." wiki_page: - error_conflict: Die Wiki-Seite wurde von jemand anderem während der Bearbeitung - aktualisiert. + error_conflict: "Die Wiki-Seite wurde von jemand anderem während der Bearbeitung aktualisiert." attributes: slug: - undeducible: Kann nicht aus dem Titel abgeleitet werden '%{title}'. + undeducible: "Kann nicht aus dem Titel abgeleitet werden '%{title}'." work_package: - is_not_a_valid_target_for_time_entries: 'Arbeitspaket #%{id} ist kein gültiges - Ziel für die Zuordnung der Zeiterfassungseinträge.' + is_not_a_valid_target_for_time_entries: "Arbeitspaket #%{id} ist kein gültiges Ziel für die Zuordnung der Zeiterfassungseinträge." attributes: id: format: "%{message}" - 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. + 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." assigned_to: format: "%{message}" done_ratio: - does_not_match_work_and_remaining_work: stimmt nicht mit Aufwand und - Verbleibender Aufwand überein - cannot_be_set_when_work_is_zero: kann nicht eingestellt werden, wenn - Aufwand gleich Null ist - must_be_set_when_remaining_work_is_set: Ist erforderlich, wenn Verbleibender - Aufwand gesetzt ist. - must_be_set_when_work_and_remaining_work_are_set: Ist erforderlich, - wenn Aufwand und Verbleibender Aufwand gesetzt ist. - inclusion: muss zwischen 0 und 100 liegen. + does_not_match_work_and_remaining_work: "stimmt nicht mit Aufwand und Verbleibender Aufwand überein" + cannot_be_set_when_work_is_zero: "kann nicht eingestellt werden, wenn Aufwand gleich Null ist" + must_be_set_when_remaining_work_is_set: "Ist erforderlich, wenn Verbleibender Aufwand gesetzt ist." + must_be_set_when_work_and_remaining_work_are_set: "Ist erforderlich, wenn Aufwand und Verbleibender Aufwand gesetzt ist." + inclusion: "muss zwischen 0 und 100 liegen." due_date: - not_start_date: ist nicht identisch mit dem Startdatum, obwohl dies - bei Meilensteinen Pflicht ist. - cannot_be_null: kann nicht auf Null gesetzt werden, da Startdatum und - Dauer bekannt sind. + not_start_date: "ist nicht identisch mit dem Startdatum, obwohl dies bei Meilensteinen Pflicht ist." + cannot_be_null: "kann nicht auf Null gesetzt werden, da Startdatum und Dauer bekannt sind." duration: - larger_than_dates: ist größer als das Intervall zwischen dem Start- - und dem Enddatum. - smaller_than_dates: ist kleiner als das Intervall zwischen Start und - Enddatum. - not_available_for_milestones: ist nicht für Meilenstein-typisierte Arbeitspakete - verfügbar. - cannot_be_null: kann nicht auf Null gesetzt werden, als Start- und Enddatum - bekannt sind. - not_an_integer: ist keine gültige Dauer. + larger_than_dates: "ist größer als das Intervall zwischen dem Start- und dem Enddatum." + smaller_than_dates: "ist kleiner als das Intervall zwischen Start und Enddatum." + not_available_for_milestones: "ist nicht für Meilenstein-typisierte Arbeitspakete verfügbar." + cannot_be_null: "kann nicht auf Null gesetzt werden, als Start- und Enddatum bekannt sind." + not_an_integer: "ist keine gültige Dauer." parent: - cannot_be_milestone: darf kein Meilenstein sein. - cannot_be_self_assigned: kann nicht selbst zugewiesen werden. - cannot_be_in_another_project: darf nicht in einem anderen Projekt sein. - not_a_valid_parent: ist ungültig. + cannot_be_milestone: "darf kein Meilenstein sein." + cannot_be_self_assigned: "kann nicht selbst zugewiesen werden." + cannot_be_in_another_project: "darf nicht in einem anderen Projekt sein." + not_a_valid_parent: "ist ungültig." schedule_manually: - cannot_be_automatically_scheduled: kann nicht auf false gesetzt werden - (automatisch geplant), da es keine Vorgänger oder Unteraufgaben hat. + cannot_be_automatically_scheduled: "kann nicht auf false gesetzt werden (automatisch geplant), da es keine Vorgänger oder Unteraufgaben hat." start_date: - violates_relationships: muss mindestens auf %{soonest_start} gesetzt - werden, um Beziehungen zu anderen Arbeitspaketen nicht zu verletzten. - cannot_be_null: kann nicht auf Null gesetzt werden, als Enddatum und - Dauer bekannt sind. + violates_relationships: "muss mindestens auf %{soonest_start} gesetzt werden, um Beziehungen zu anderen Arbeitspaketen nicht zu verletzten." + cannot_be_null: "kann nicht auf Null gesetzt werden, als Enddatum und Dauer bekannt sind." status_id: - status_transition_invalid: ist ungültig, da kein valider Übergang vom - alten zum neuen Status für die aktuelle Rolle des Nutzers existiert. - status_invalid_in_type: ist ungültig, da der aktuelle Status nicht in - diesem Typ vorhanden ist. + status_transition_invalid: "ist ungültig, da kein valider Übergang vom alten zum neuen Status für die aktuelle Rolle des Nutzers existiert." + status_invalid_in_type: "ist ungültig, da der aktuelle Status nicht in diesem Typ vorhanden ist." type: - cannot_be_milestone_due_to_children: kann kein Meilenstein werden, da - dieses Arbeitspaket Unterelemente besitzt. + cannot_be_milestone_due_to_children: "kann kein Meilenstein werden, da dieses Arbeitspaket Unterelemente besitzt." priority_id: - only_active_priorities_allowed: muss aktiv sein. + only_active_priorities_allowed: "muss aktiv sein." category: - only_same_project_categories_allowed: Ein Arbeitpaket und seine Kategorie - müssen im selben Projekt sein. - does_not_exist: Die angegebene Kategorie existiert nicht. + only_same_project_categories_allowed: "Ein Arbeitpaket und seine Kategorie müssen im selben Projekt sein." + does_not_exist: "Die angegebene Kategorie existiert nicht." estimated_hours: - not_a_number: ist keine gültige Dauer. - cant_be_inferior_to_remaining_work: Kann nicht kleiner sein als Verbleibender - Aufwand. - must_be_set_when_remaining_work_and_percent_complete_are_set: ist erforderlich, - wenn Verbleibender Aufwand und % abgeschlossen eingestellt sind. + not_a_number: "ist keine gültige Dauer." + cant_be_inferior_to_remaining_work: "Kann nicht kleiner sein als Verbleibender Aufwand." + must_be_set_when_remaining_work_and_percent_complete_are_set: "ist erforderlich, wenn Verbleibender Aufwand und % abgeschlossen eingestellt sind." remaining_hours: - not_a_number: ist keine gültige Dauer. - cant_exceed_work: Kann nicht größer als der Aufwand sein. - must_be_set_when_work_is_set: Ist erforderlich, wenn Aufwand gesetzt - ist. - must_be_set_when_work_and_percent_complete_are_set: ist erforderlich, - wenn Aufwand und % abgeschlossen eingestellt sind. - must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: muss - 0h sein, wenn Aufwand gesetzt und % abgeschlossen 100% ist. - must_be_empty_when_work_is_empty_and_percent_complete_is_100p: muss - leer bleiben, wenn Aufwand gesetzt und % abgeschlossen 100% ist. - readonly_status: Das Arbeitspaket befindet sich in einem schreibgeschützten - Status, so dass seine Attribute nicht geändert werden können. + not_a_number: "ist keine gültige Dauer." + cant_exceed_work: "Kann nicht größer als der Aufwand sein." + must_be_set_when_work_is_set: "Ist erforderlich, wenn Aufwand gesetzt ist." + must_be_set_when_work_and_percent_complete_are_set: "ist erforderlich, wenn Aufwand und % abgeschlossen eingestellt sind." + must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: muss 0h sein, wenn Aufwand gesetzt und % abgeschlossen 100% ist. + must_be_empty_when_work_is_empty_and_percent_complete_is_100p: >- + muss leer bleiben, wenn Aufwand gesetzt und % abgeschlossen 100% ist. + readonly_status: "Das Arbeitspaket befindet sich in einem schreibgeschützten Status, so dass seine Attribute nicht geändert werden können." type: attributes: attribute_groups: - attribute_unknown: Ungültige Arbeitspaket-Attribute verwendet. - attribute_unknown_name: 'Ungültige Arbeitspaket-Attribute verwendet: - %{attribute}' - duplicate_group: Der Gruppen-Name %{group} wird mehr als einmal verwendet. - Gruppen-Namen müssen eindeutig sein. - query_invalid: 'Die eingebettete Ansicht ''%{group}'' ist ungültig: - %{details}' - group_without_name: Unbenannte Gruppen sind nicht erlaubt. + attribute_unknown: "Ungültige Arbeitspaket-Attribute verwendet." + attribute_unknown_name: "Ungültige Arbeitspaket-Attribute verwendet: %{attribute}" + duplicate_group: "Der Gruppen-Name %{group} wird mehr als einmal verwendet. Gruppen-Namen müssen eindeutig sein." + query_invalid: "Die eingebettete Ansicht '%{group}' ist ungültig: %{details}" + group_without_name: "Unbenannte Gruppen sind nicht erlaubt." patterns: - invalid_tokens: Ein oder mehrere Attribute des Feldes sind ungültig. - Bitte korrigieren Sie die Attribute vor dem Speichern. + invalid_tokens: "Ein oder mehrere Attribute des Feldes sind ungültig. Bitte korrigieren Sie die Attribute vor dem Speichern." user: attributes: base: - user_limit_reached: Benutzerlimit erreicht. Für den aktuellen Plan können - keine weiteren Benutzerkonten erstellt werden. - one_must_be_active: Dieser Admin-Benutzer kann nicht gesperrt oder entfernt - werden. Mindestens ein Admin muss aktiv sein. + user_limit_reached: "Benutzerlimit erreicht. Für den aktuellen Plan können keine weiteren Benutzerkonten erstellt werden." + one_must_be_active: "Dieser Admin-Benutzer kann nicht gesperrt oder entfernt werden. Mindestens ein Admin muss aktiv sein." password_confirmation: - confirmation: Passwort und Bestätigung stimmt nicht überein. + confirmation: "Passwort und Bestätigung stimmt nicht überein." format: "%{message}" password: - weak: 'muss Zeichen aus folgenden Klassen beinhalten (mindestens %{min_count} - von %{all_count}): %{rules}.' - lowercase: Kleinbuchstaben (z.B. 'a') - uppercase: Großbuchstaben (z.B. 'A') - numeric: Ziffern (z.B. '1') - special: Sonderzeichen (z.B. '%') + weak: "muss Zeichen aus folgenden Klassen beinhalten (mindestens %{min_count} von %{all_count}): %{rules}." + lowercase: "Kleinbuchstaben (z.B. 'a')" + uppercase: "Großbuchstaben (z.B. 'A')" + numeric: "Ziffern (z.B. '1')" + special: "Sonderzeichen (z.B. '%')" reused: - one: wurde schon benutzt. Bitte wählen Sie ein Passwort, das sich - von dem letzten unterscheidet. - other: wurde bereits verwendet. Bitte wählen Sie eines, das sich von - Ihren letzten %{count} unterscheidet. + one: "wurde schon benutzt. Bitte wählen Sie ein Passwort, das sich von dem letzten unterscheidet." + other: "wurde bereits verwendet. Bitte wählen Sie eines, das sich von Ihren letzten %{count} unterscheidet." match: - confirm: Neues Kennwort bestätigen. - description: '"Kennwortbestätigung" sollte mit "Neues Kennwort" übereinstimmen.' + confirm: "Neues Kennwort bestätigen." + description: "\"Kennwortbestätigung\" sollte mit \"Neues Kennwort\" übereinstimmen." status: - invalid_on_create: ist kein gültiger Status für neue Benutzer. + invalid_on_create: "ist kein gültiger Status für neue Benutzer." member: - principal_blank: Bitte wählen Sie mindestens einen Benutzer oder eine Gruppe. - role_blank: muss zugeordnet werden. + principal_blank: "Bitte wählen Sie mindestens einen Benutzer oder eine Gruppe." + role_blank: "muss zugeordnet werden." attributes: roles: - ungrantable: hat eine nicht zuweisbare Rolle. - more_than_one: hat mehr als eine Rolle. + ungrantable: "hat eine nicht zuweisbare Rolle." + more_than_one: "hat mehr als eine Rolle." principal: - unassignable: kann keinem Projekt zugeordnet werden. + unassignable: "kann keinem Projekt zugeordnet werden." version: - undeletable_archived_projects: Die Version kann nicht gelöscht werden, da - sie Arbeitspakete enthält, die an sie angeschlossen sind. - undeletable_work_packages_attached: Die Version kann nicht gelöscht werden, - da sie Arbeitspakete enthält, die an sie angeschlossen sind. + undeletable_archived_projects: "Die Version kann nicht gelöscht werden, da sie Arbeitspakete enthält, die an sie angeschlossen sind." + undeletable_work_packages_attached: "Die Version kann nicht gelöscht werden, da sie Arbeitspakete enthält, die an sie angeschlossen sind." token/named: attributes: token_name: - blank: Bitte geben Sie einen Namen für den Token an - in_use: Dieser Token-Name ist bereits in Verwendung, bitte wählen Sie - einen anderen + blank: "Bitte geben Sie einen Namen für den Token an" + in_use: "Dieser Token-Name ist bereits in Verwendung, bitte wählen Sie einen anderen" format: "%{message}" jira: - invalid_protocol: Bitte geben Sie ein gültiges Protokoll an (http oder https) + invalid_protocol: "Bitte geben Sie ein gültiges Protokoll an (http oder https)" template: - body: 'Bitte überprüfen Sie die folgenden Felder:' + body: "Bitte überprüfen Sie die folgenden Felder:" header: - one: 'Dieses %{model}-Objekt konnte nicht gespeichert werden: 1 Fehler.' + one: "Dieses %{model}-Objekt konnte nicht gespeichert werden: 1 Fehler." other: "%{count} Fehler haben das Speichern dieses %{model} verhindert" models: - attachment: Datei + attachment: "Datei" attribute_help_text: - one: Hilfe-Text für Attribute - other: Hilfe-Texte für Attribute + one: "Hilfe-Text für Attribute" + other: "Hilfe-Texte für Attribute" auth_provider: - one: Authentifizierungsanbieter - other: Authentifizierungsanbieter - category: Kategorie - color: Farbe - comment: Kommentar - custom_action: Benutzerdefinierte Aktion - custom_field: Benutzerdefiniertes Feld - customized: Benutzerdefiniert - doorkeeper/application: OAuth-Anwendung + one: "Authentifizierungsanbieter" + other: "Authentifizierungsanbieter" + category: "Kategorie" + color: "Farbe" + comment: "Kommentar" + custom_action: "Benutzerdefinierte Aktion" + custom_field: "Benutzerdefiniertes Feld" + customized: "Benutzerdefiniert" + "doorkeeper/application": "OAuth-Anwendung" enterprise_token: - one: Enterprise-Token - other: Enterprise-Tokens - forum: Forum - global_role: Globale Rolle - group: Gruppe + one: "Enterprise-Token" + other: "Enterprise-Tokens" + forum: "Forum" + global_role: "Globale Rolle" + group: "Gruppe" issue_priority: - one: Priorität - other: Prioritäten - meeting_participant: Besprechungsteilnehmer - member: Mitglied - news: Neuigkeiten + one: "Priorität" + other: "Prioritäten" + meeting_participant: "Besprechungsteilnehmer" + member: "Mitglied" + news: "Neuigkeiten" notification: - one: Benachrichtigung - other: Benachrichtigungen - placeholder_user: Platzhalter-Benutzer + one: "Benachrichtigung" + other: "Benachrichtigungen" + placeholder_user: "Platzhalter-Benutzer" project: - one: Projekt - other: Projekte + one: "Projekt" + other: "Projekte" project_query: - one: Projektlisten - other: Projektlisten - query: Benutzerdefinierte Abfrage - reminder: Erinnerung + one: "Projektlisten" + other: "Projektlisten" + query: "Benutzerdefinierte Abfrage" + reminder: "Erinnerung" role: - one: Rolle - other: Rollen + one: "Rolle" + other: "Rollen" scim_client: - one: SCIM-Client - other: SCIM-clients + one: "SCIM-Client" + other: "SCIM-clients" jira: - one: Jira - other: Jira - status: Arbeitspaket-Status + one: "Jira" + other: "Jira" + status: "Arbeitspaket-Status" token/api: one: Zugangs-Token other: Zugangs-Token token/rss: - one: RSS-Token - other: RSS-Token + one: "RSS-Token" + other: "RSS-Token" type: - one: Typ - other: Typen - user: Benutzer - version: Version - workflow: Workflow - work_package: Arbeitspaket - wiki: Wiki - wiki_page: Wiki-Seite + one: "Typ" + other: "Typen" + user: "Benutzer" + version: "Version" + workflow: "Workflow" + work_package: "Arbeitspaket" + wiki: "Wiki" + wiki_page: "Wiki-Seite" errors: header_invalid_fields: - one: 'Bei dem folgenden Feld traten Fehler auf:' - other: 'Bei den folgenden Feldern traten Fehler auf:' + one: "Bei dem folgenden Feld traten Fehler auf:" + other: "Bei den folgenden Feldern traten Fehler auf:" header_additional_invalid_fields: - one: 'Zusätzlich gab es ein Problem mit dem folgenden Feld:' - other: 'Zusätzlich gab es ein Problem mit den folgenden Feldern:' - field_erroneous_label: "Dieses Feld ist ungültig: %{full_errors} \nBitte geben - Sie einen gültigen Wert ein." + one: "Zusätzlich gab es ein Problem mit dem folgenden Feld:" + other: "Zusätzlich gab es ein Problem mit den folgenden Feldern:" + field_erroneous_label: "Dieses Feld ist ungültig: %{full_errors} \nBitte geben Sie einen gültigen Wert ein." messages: - must_be_template: muss eine Vorlage sein - 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. + must_be_template: "muss eine Vorlage sein" + 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." activity: item: - created_by_on: erstellt von %{user} am %{datetime} - created_by_on_time_entry: gebucht von %{user} am %{datetime} - created_on: erstellt am %{datetime} - created_on_time_entry: gebucht am %{datetime} - updated_by_on: aktualisiert von %{user} am %{datetime} - updated_by_on_time_entry: Zeitbuchung aktualisiert durch %{user} am %{datetime} - updated_on: aktualisiert am %{datetime} - updated_on_time_entry: Zeitbuchung aktualisiert am %{datetime} - deleted_on: gelöscht am %{datetime} - deleted_by_on: gelöscht von %{user} am %{datetime} - added_on: hinzugefügt am %{datetime} - added_by_on: hinzugefügt von %{user} am %{datetime} - removed_on: entfernt am %{datetime} - removed_by_on: entfernt von %{user} an %{datetime} - parent_without_of: Unterprojekt - parent_no_longer: Nicht mehr Unterprojekt von + created_by_on: "erstellt von %{user} am %{datetime}" + created_by_on_time_entry: "gebucht von %{user} am %{datetime}" + created_on: "erstellt am %{datetime}" + created_on_time_entry: "gebucht am %{datetime}" + updated_by_on: "aktualisiert von %{user} am %{datetime}" + updated_by_on_time_entry: "Zeitbuchung aktualisiert durch %{user} am %{datetime}" + updated_on: "aktualisiert am %{datetime}" + updated_on_time_entry: "Zeitbuchung aktualisiert am %{datetime}" + deleted_on: "gelöscht am %{datetime}" + deleted_by_on: "gelöscht von %{user} am %{datetime}" + added_on: "hinzugefügt am %{datetime}" + added_by_on: "hinzugefügt von %{user} am %{datetime}" + removed_on: "entfernt am %{datetime}" + removed_by_on: "entfernt von %{user} an %{datetime}" + parent_without_of: "Unterprojekt" + parent_no_longer: "Nicht mehr Unterprojekt von" time_entry: hour: one: "%{count} Stunde" @@ -2725,489 +2210,458 @@ de: hour_html: one: "%{count} Stunde" other: "%{count} Stunden" - updated: geändert von %{old_value} zu %{value} - logged_for: Gebucht für + updated: "geändert von %{old_value} zu %{value}" + logged_for: "Gebucht für" filter: - changeset: Änderungssätze - message: Foren - news: Neuigkeiten - project_details: Projektdetails - subproject: Unterprojekte einbeziehen - time_entry: Aufgewendete Zeit - wiki_edit: Wiki - work_package: Arbeitspakete + changeset: "Änderungssätze" + message: "Foren" + news: "Neuigkeiten" + project_details: "Projektdetails" + subproject: "Unterprojekte einbeziehen" + time_entry: "Aufgewendete Zeit" + wiki_edit: "Wiki" + work_package: "Arbeitspakete" project_phase: - activated: aktiviert - added_date: auf %{date} festlegen - changed_date: von %{from} zu %{to} geändert - deactivated: deaktiviert - deleted_project_phase: Gelöschte Projektphase + activated: "aktiviert" + added_date: "auf %{date} festlegen" + changed_date: "von %{from} zu %{to} geändert" + deactivated: "deaktiviert" + deleted_project_phase: "Gelöschte Projektphase" phase_and_both_gates: "%{phase_message}. %{start_gate_message} und %{finish_gate_message}" phase_and_one_gate: "%{phase_message}. %{gate_message}" - removed_date: Datum gelöscht %{date} + removed_date: "Datum gelöscht %{date}" + #common attributes of all models attributes: - active: Aktiv - assigned_to: Zugewiesen an - assignee: Zugewiesen an - attachments: Anhänge - actor: Ausführender Benutzer - action: Aktion - api_key: API-Schlüssel - author: Autor - avatar: Profilfoto - base: 'Allgemeiner Fehler:' - body: Body - blocks_ids: IDs der blockierten Arbeitspakete - category: Kategorie - comment: Kommentar - comments: Kommentar - content: Inhalt - color: Farbe - creator: Erstellt - created_at: Erstellt - custom_field: Benutzerdefiniertes Feld - custom_options: Mögliche Werte - custom_values: Benutzerdefinierte Felder - date: Datum - dates_interval: Datumsbereich - default_columns: Standard-Spalten - description: Beschreibung - derived_due_date: Aggregierter Endtermin - derived_estimated_hours: Arbeit insgesamt - derived_start_date: Aggregierter Starttermin - direction: Richtung - display_sums: Summen anzeigen - domain: Domain - due_date: Endtermin - estimated_hours: Aufwand - estimated_time: Aufwand - email: E-Mail - entity_type: Entität - expires_at: Verfällt am - firstname: Vorname - filter: Filter - group: Gruppe - groups: Gruppen - hexcode: Fabcode (Hex) - id: ID - is_default: Standardwert - is_for_all: Für alle Projekte - public: Öffentlich - principal: Benutzer oder Gruppe - issue: Arbeitspaket - journal: Änderung - journal_notes: Kommentar - lastname: Nachname - login: Benutzername - lock_version: Objektversion - mail: E-Mail - name: Name - note: Hinweis - notes: Notizen - number: Nummer - options: Optionen - operator: Operator - password: Kennwort - priority: Priorität - project: Projekt - project_ids: Projekt IDs - project_phase: Projektphase - project_phase_definition: Projektphase - reason: Grund - responsible: Verantwortlich - required: Erforderlich - recipient: Empfänger - role: Rollen - roles: Rollen - search: Suche - sprint: Sprint - start_date: Anfangstermin - status: Status - state: Status - subject: Thema - slug: Slug - summary: Zusammenfassung - template: Vorlage - time_zone: Zeitzone - text: Text - title: Titel - type: Typ - typeahead: Autovervollständigung - uid: Eindeutige Kennung - updated_at: Aktualisiert am - updated_on: Aktualisiert am - uploader: Bereitgestellt von - user: Benutzer - username: Benutzername - unit: Stück - value: Wert - values: Werte - version: Version - visible: Sichtbar - work_package: Arbeitspaket - work_package_id: Arbeitspaket + active: "Aktiv" + assigned_to: "Zugewiesen an" + assignee: "Zugewiesen an" + attachments: "Anhänge" + actor: "Ausführender Benutzer" + action: "Aktion" + api_key: "API-Schlüssel" + author: "Autor" + avatar: "Profilfoto" + base: "Allgemeiner Fehler:" + body: "Body" + blocks_ids: "IDs der blockierten Arbeitspakete" + category: "Kategorie" + comment: "Kommentar" + comments: "Kommentar" + content: "Inhalt" + color: "Farbe" + creator: "Erstellt" + created_at: "Erstellt" + custom_field: "Benutzerdefiniertes Feld" + custom_options: "Mögliche Werte" + custom_values: "Benutzerdefinierte Felder" + date: "Datum" + dates_interval: "Datumsbereich" + default_columns: "Standard-Spalten" + description: "Beschreibung" + derived_due_date: "Aggregierter Endtermin" + derived_estimated_hours: "Arbeit insgesamt" + derived_start_date: "Aggregierter Starttermin" + direction: "Richtung" + display_sums: "Summen anzeigen" + domain: "Domain" + due_date: "Endtermin" + estimated_hours: "Aufwand" + estimated_time: "Aufwand" + email: "E-Mail" + entity_type: "Entität" + expires_at: "Verfällt am" + firstname: "Vorname" + filter: "Filter" + group: "Gruppe" + groups: "Gruppen" + hexcode: "Fabcode (Hex)" + id: "ID" + is_default: "Standardwert" + is_for_all: "Für alle Projekte" + public: "Öffentlich" + principal: "Benutzer oder Gruppe" + #kept for backwards compatibility + issue: "Arbeitspaket" + journal: "Änderung" + journal_notes: "Kommentar" + lastname: "Nachname" + login: "Benutzername" + lock_version: "Objektversion" + mail: "E-Mail" + name: "Name" + note: "Hinweis" + notes: "Notizen" + number: "Nummer" + options: "Optionen" + operator: "Operator" + password: "Kennwort" + priority: "Priorität" + project: "Projekt" + project_ids: "Projekt IDs" + project_phase: "Projektphase" + project_phase_definition: "Projektphase" + reason: "Grund" + responsible: "Verantwortlich" + required: "Erforderlich" + recipient: "Empfänger" + role: "Rollen" + roles: "Rollen" + search: "Suche" + sprint: "Sprint" + start_date: "Anfangstermin" + status: "Status" + state: "Status" + subject: "Thema" + slug: "Slug" + summary: "Zusammenfassung" + template: "Vorlage" + time_zone: "Zeitzone" + text: "Text" + title: "Titel" + type: "Typ" + typeahead: "Autovervollständigung" + uid: "Eindeutige Kennung" + updated_at: "Aktualisiert am" + updated_on: "Aktualisiert am" + uploader: "Bereitgestellt von" + user: "Benutzer" + username: "Benutzername" + unit: "Stück" + value: "Wert" + values: "Werte" + version: "Version" + visible: "Sichtbar" + work_package: "Arbeitspaket" + work_package_id: "Arbeitspaket" backup: - failed: Backup fehlgeschlagen - label_backup_token: Backup-Token - label_create_token: Backup-Token erstellen - label_delete_token: Backup-Token löschen - label_reset_token: Backup-Token zurücksetzen - label_token_users: Folgende Benutzer haben aktive Backup-Token + failed: "Backup fehlgeschlagen" + label_backup_token: "Backup-Token" + label_create_token: "Backup-Token erstellen" + label_delete_token: "Backup-Token löschen" + label_reset_token: "Backup-Token zurücksetzen" + label_token_users: "Folgende Benutzer haben aktive Backup-Token" reset_token: action_create: Erstellen action_reset: Zurücksetzen - heading_reset: Backup-Token zurücksetzen - heading_create: Backup-Token erstellen - implications: 'Das Aktivieren von Backups erlaubt jedem Benutzer mit den erforderlichen - Berechtigungen und diesem Backup-Token ein Backup herunterzuladen, das alle - Daten dieser OpenProject-Installation enthält. Dies schließt die Daten aller - anderen Benutzer ein. - - ' - info: 'Sie müssen einen Backup-Token generieren, um ein Backup erstellen zu - können. Jedes Mal, wenn Sie ein Backup anfordern möchten, müssen Sie diesen - Token zur Verfügung stellen. Sie können den Backup-Token löschen, um Backups - für diesen Benutzer zu deaktivieren. - - ' - verification: 'Geben Sie %{word} ein, um zu bestätigen, dass Sie den Backup-Token - %{action} möchten. - - ' + heading_reset: "Backup-Token zurücksetzen" + heading_create: "Backup-Token erstellen" + implications: > + Das Aktivieren von Backups erlaubt jedem Benutzer mit den erforderlichen Berechtigungen und diesem Backup-Token ein Backup herunterzuladen, das alle Daten dieser OpenProject-Installation enthält. Dies schließt die Daten aller anderen Benutzer ein. + info: > + Sie müssen einen Backup-Token generieren, um ein Backup erstellen zu können. Jedes Mal, wenn Sie ein Backup anfordern möchten, müssen Sie diesen Token zur Verfügung stellen. Sie können den Backup-Token löschen, um Backups für diesen Benutzer zu deaktivieren. + verification: > + Geben Sie %{word} ein, um zu bestätigen, dass Sie den Backup-Token %{action} möchten. verification_word_reset: zurücksetzen verification_word_create: erstellen - warning: 'Wenn Sie ein neues Token erstellen, dürfen Sie erst nach 24 Stunden - ein Backup anfordern. Dies ist eine Sicherheitsmaßnahme. Danach können Sie - jederzeit ein Backup mit diesem Token anfordern. - - ' + warning: > + Wenn Sie ein neues Token erstellen, dürfen Sie erst nach 24 Stunden ein Backup anfordern. Dies ist eine Sicherheitsmaßnahme. Danach können Sie jederzeit ein Backup mit diesem Token anfordern. text_token_deleted: Backup-Token gelöscht. Backups sind jetzt deaktiviert. error: invalid_token: Ungültiger oder fehlender Backup-Token token_cooldown: Der Backup-Token ist in %{hours} Stunden gültig. backup_pending: Es wird bereits ein Backup bearbeitet. limit_reached: Sie können nur %{limit} Backups pro Tag durchführen. - button_actions: Aktionen - button_add: Hinzufügen - button_add_comment: Kommentar hinzufügen - button_add_item_above: Element oben hinzufügen - button_add_item_below: Element unten hinzufügen - button_add_sub_item: Unterelement hinzufügen + button_actions: "Aktionen" + button_add: "Hinzufügen" + button_add_comment: "Kommentar hinzufügen" + button_add_item_above: "Element oben hinzufügen" + button_add_item_below: "Element unten hinzufügen" + button_add_sub_item: "Unterelement hinzufügen" button_add_member: Mitglied hinzufügen - button_add_watcher: Beobachter hinzufügen - button_annotate: Kommentieren - button_apply: Anwenden - button_apply_changes: Änderungen anwenden - button_archive: Archivieren - button_back: Zurück - button_cancel: Abbrechen - button_change: Wechseln - button_change_parent_page: Übergeordnete Seite ändern - button_change_password: Kennwort ändern - button_check_all: Alle auswählen - button_clear: Zurücksetzen - button_click_to_reveal: Klicke, um anzuzeigen - button_close: Schließen - button_collapse_all: Alle zuklappen - button_confirm: Bestätigen - button_configure: Konfigurieren - button_continue: Fortfahren - button_complete: Fertigstellen - button_copy: Kopieren - button_copy_to_clipboard: In Zwischenablage kopieren - button_copy_link_to_clipboard: Link in Zwischenablage kopieren - button_create: Anlegen - button_create_and_continue: Anlegen und weiter - button_decline: Ablehnen - button_delete: Löschen - button_delete_permanently: Endgültig löschen - button_delete_watcher: Lösche Beobachter %{name} - button_download: Download - button_disable: Deaktivieren - button_duplicate: Duplizieren - button_duplicate_and_follow: Duplizieren und folgen - button_edit: Bearbeiten - button_enable: Aktivieren - button_edit_associated_wikipage: 'Zugehörige Wikiseite bearbeiten: %{page_title}' - button_expand_all: Alle ausklappen - button_favorite: Zu Favoriten hinzufügen - button_filter: Filter - button_finish_setup: Einrichtung abschließen - button_generate: Generieren - button_list: Liste - button_lock: Sperren - button_login: Anmelden - button_move: Verschieben - button_move_and_follow: Verschieben und Arbeitspaket anzeigen - button_print: Drucken - button_quote: Zitieren + button_add_watcher: "Beobachter hinzufügen" + button_annotate: "Kommentieren" + button_apply: "Anwenden" + button_apply_changes: "Änderungen anwenden" + button_archive: "Archivieren" + button_back: "Zurück" + button_cancel: "Abbrechen" + button_change: "Wechseln" + button_change_parent_page: "Übergeordnete Seite ändern" + button_change_password: "Kennwort ändern" + button_check_all: "Alle auswählen" + button_clear: "Zurücksetzen" + button_click_to_reveal: "Klicke, um anzuzeigen" + button_close: "Schließen" + button_collapse_all: "Alle zuklappen" + button_confirm: "Bestätigen" + button_configure: "Konfigurieren" + button_continue: "Fortfahren" + button_complete: "Fertigstellen" + button_copy: "Kopieren" + button_copy_to_clipboard: "In Zwischenablage kopieren" + button_copy_link_to_clipboard: "Link in Zwischenablage kopieren" + button_create: "Anlegen" + button_create_and_continue: "Anlegen und weiter" + button_decline: "Ablehnen" + button_delete: "Löschen" + button_delete_permanently: "Endgültig löschen" + button_delete_watcher: "Lösche Beobachter %{name}" + button_download: "Download" + button_disable: "Deaktivieren" + button_duplicate: "Duplizieren" + button_duplicate_and_follow: "Duplizieren und folgen" + button_edit: "Bearbeiten" + button_enable: "Aktivieren" + button_edit_associated_wikipage: "Zugehörige Wikiseite bearbeiten: %{page_title}" + button_expand_all: "Alle ausklappen" + button_favorite: "Zu Favoriten hinzufügen" + button_filter: "Filter" + button_finish_setup: "Einrichtung abschließen" + button_generate: "Generieren" + button_list: "Liste" + button_lock: "Sperren" + button_login: "Anmelden" + button_move: "Verschieben" + button_move_and_follow: "Verschieben und Arbeitspaket anzeigen" + button_print: "Drucken" + button_quote: "Zitieren" button_remove: Entfernen - button_remove_permanently: Endgültig löschen - button_remove_reminder: Erinnerung entfernen - button_rename: Umbenennen - button_replace: Ersetzen - button_revoke: Widerrufen - button_reply: Antworten - button_reset: Zurücksetzen - button_rollback: Auf diese Version zurücksetzen - button_save: Speichern - button_save_as: Speichern unter - button_save_back: Speichern und zurück - button_select: Auswählen - button_set_reminder: Erinnerung einrichten - button_show: Anzeigen - button_sort: Sortierung - button_submit: OK - button_test: Testen - button_unarchive: Entarchivieren - button_uncheck_all: Alle abwählen - button_unlock: Entsperren - button_unfavorite: Aus Favoriten entfernen - button_unwatch: Nicht beobachten - button_update: Aktualisieren - button_upgrade: Upgraden - button_buy_now: Jetzt kaufen - button_upload: Hochladen - button_view: Anzeigen - button_watch: Beobachten - button_manage_menu_entry: Menüpunkt konfigurieren - button_add_menu_entry: Menüpunkt hinzufügen - button_configure_menu_entry: Menüpunkt konfigurieren - button_delete_menu_entry: Menüpunkt entfernen - button_view_shared_work_packages: Gemeinsame Arbeitspakete ansehen - button_manage_roles: Rollen verwalten - button_remove_member: Mitglied entfernen - button_remove_member_and_shares: Mitglied und Freigaben entfernen - button_revoke_work_package_shares: Arbeitspaket-Freigaben wiederrufen - button_revoke_access: Zugang widerrufen - button_revoke_all: Alles widerrufen - button_revoke_only: Nur %{shared_role_name} widerrufen - button_publish: Veröffentlichen - button_unpublish: Als Privat festlegen + button_remove_permanently: "Endgültig löschen" + button_remove_reminder: "Erinnerung entfernen" + button_rename: "Umbenennen" + button_replace: "Ersetzen" + button_revoke: "Widerrufen" + button_reply: "Antworten" + button_reset: "Zurücksetzen" + button_rollback: "Auf diese Version zurücksetzen" + button_save: "Speichern" + button_save_as: "Speichern unter" + button_save_back: "Speichern und zurück" + button_select: "Auswählen" + button_set_reminder: "Erinnerung einrichten" + button_show: "Anzeigen" + button_sort: "Sortierung" + button_submit: "OK" + button_test: "Testen" + button_unarchive: "Entarchivieren" + button_uncheck_all: "Alle abwählen" + button_unlock: "Entsperren" + button_unfavorite: "Aus Favoriten entfernen" + button_unwatch: "Nicht beobachten" + button_update: "Aktualisieren" + button_upgrade: "Upgraden" + button_buy_now: "Jetzt kaufen" + button_upload: "Hochladen" + button_view: "Anzeigen" + button_watch: "Beobachten" + button_manage_menu_entry: "Menüpunkt konfigurieren" + button_add_menu_entry: "Menüpunkt hinzufügen" + button_configure_menu_entry: "Menüpunkt konfigurieren" + button_delete_menu_entry: "Menüpunkt entfernen" + button_view_shared_work_packages: "Gemeinsame Arbeitspakete ansehen" + button_manage_roles: "Rollen verwalten" + button_remove_member: "Mitglied entfernen" + button_remove_member_and_shares: "Mitglied und Freigaben entfernen" + button_revoke_work_package_shares: "Arbeitspaket-Freigaben wiederrufen" + button_revoke_access: "Zugang widerrufen" + button_revoke_all: "Alles widerrufen" + button_revoke_only: "Nur %{shared_role_name} widerrufen" + button_publish: "Veröffentlichen" + button_unpublish: "Als Privat festlegen" consent: - checkbox_label: Ich habe die obigen Angaben zur Kenntnis genommen und erkläre - mich einverstanden. + checkbox_label: Ich habe die obigen Angaben zur Kenntnis genommen und erkläre mich einverstanden. failure_message: Einwilligung fehlgeschlagen, kann nicht fortfahren. title: Nutzer-Einwilligung - decline_warning_message: Sie haben die Einwilligung abgelehnt und wurden deshalb - abgemeldet. - user_has_consented: Der Benutzer hat Ihrem [konfigurierten Einwilligungstext](consent_settings) - zugestimmt. - not_yet_consented: Der Benutzer hat seine Einwilligung zu Ihrem [konfigurierten - Einwilligungstext](consent_settings) noch nicht gegeben. Er wird bei der nächsten - Anmeldung daran erinnert werden. - contact_mail_instructions: Definieren Sie die E-Mail-Adresse, über die Benutzer - einen Daten-Controller erreichen können, um Anfragen zu Datenänderung oder -löschung - einzureichen. - contact_your_administrator: Bitte kontaktieren Sie Ihren Administrator um bspw. - eine Löschung Ihres Accounts zu beantragen. - contact_this_mail_address: 'Bitte kontaktieren Sie für Datenänderungs- oder Löschanfragen - Ihren Administrator unter: %{mail_address}.' - text_update_consent_time: Aktivieren Sie dieses Häkchen, um Benutzer erneut zur - Einwilligung einer Datenschutz- oder Nutzungserklärung aufzufordern. Aktivieren - Sie es immer dann, wenn Sie rechtliche Aspekte der Zustimmung verändert haben. - update_consent_last_time: 'Letzte Änderung der Einwilligungsinformationen: %{update_time}' + decline_warning_message: Sie haben die Einwilligung abgelehnt und wurden deshalb abgemeldet. + user_has_consented: Der Benutzer hat Ihrem [konfigurierten Einwilligungstext](consent_settings) zugestimmt. + not_yet_consented: Der Benutzer hat seine Einwilligung zu Ihrem [konfigurierten Einwilligungstext](consent_settings) noch nicht gegeben. Er wird bei der nächsten Anmeldung daran erinnert werden. + contact_mail_instructions: Definieren Sie die E-Mail-Adresse, über die Benutzer einen Daten-Controller erreichen können, um Anfragen zu Datenänderung oder -löschung einzureichen. + contact_your_administrator: Bitte kontaktieren Sie Ihren Administrator um bspw. eine Löschung Ihres Accounts zu beantragen. + contact_this_mail_address: 'Bitte kontaktieren Sie für Datenänderungs- oder Löschanfragen Ihren Administrator unter: %{mail_address}.' + text_update_consent_time: Aktivieren Sie dieses Häkchen, um Benutzer erneut zur Einwilligung einer Datenschutz- oder Nutzungserklärung aufzufordern. Aktivieren Sie es immer dann, wenn Sie rechtliche Aspekte der Zustimmung verändert haben. + update_consent_last_time: "Letzte Änderung der Einwilligungsinformationen: %{update_time}" copy_project: - title: Projekt "%{source_project_name} " kopieren - started: Das Kopieren des Projekts "%{source_project_name}" nach "%{target_project_name}" - wurde gestartet. Sie werden per Mail benachrichtigt, sobald "%{target_project_name}" - zur Verfügung steht. - failed: Das Projekt %{source_project_name} konnte nicht kopiert werden - failed_internal: Kopieren fehlgeschlagen aufgrund eines internen Fehlers. - succeeded: Das Projekt %{target_project_name} wurde erstellt - errors: Fehler - project_custom_fields: Benutzerdefinierte Felder des Projekts + title: 'Projekt "%{source_project_name} " kopieren' + started: 'Das Kopieren des Projekts "%{source_project_name}" nach "%{target_project_name}" wurde gestartet. Sie werden per Mail benachrichtigt, sobald "%{target_project_name}" zur Verfügung steht.' + failed: "Das Projekt %{source_project_name} konnte nicht kopiert werden" + failed_internal: "Kopieren fehlgeschlagen aufgrund eines internen Fehlers." + succeeded: "Das Projekt %{target_project_name} wurde erstellt" + errors: "Fehler" + project_custom_fields: "Benutzerdefinierte Felder des Projekts" x_objects_of_this_type: - zero: Kein Inhalt dieser Art. - one: Ein Objekt dieses Typs - other: '"%{count}" Ein Objekt dieses Typs' + zero: "Kein Inhalt dieser Art." + one: "Ein Objekt dieses Typs" + other: "\"%{count}\" Ein Objekt dieses Typs" text: - failed: Das Projekt "%{source_project_name}" konnte nicht nach "%{target_project_name}" - kopiert werden. - succeeded: Das Projekt "%{source_project_name}" wurde nach "%{target_project_name}" - kopiert. - source_project_label: Projekt kopiert + failed: 'Das Projekt "%{source_project_name}" konnte nicht nach "%{target_project_name}" kopiert werden.' + succeeded: 'Das Projekt "%{source_project_name}" wurde nach "%{target_project_name}" kopiert.' + source_project_label: "Projekt kopiert" copy_options: - dependencies_label: Projekt kopieren + dependencies_label: "Projekt kopieren" create_project: - attributes_heading: Füllen Sie diese Pflichtangaben aus, um das Projekt anzulegen. - template_label: Vorlage verwenden - template_heading: Wählen Sie eine Projektvorlage, um mit den gängigsten Projektmanagementmethoden - zu arbeiten, oder erstellen Sie ein leeres Projekt. + attributes_heading: "Füllen Sie diese Pflichtangaben aus, um das Projekt anzulegen." + template_label: "Vorlage verwenden" + template_heading: "Wählen Sie eine Projektvorlage, um mit den gängigsten Projektmanagementmethoden zu arbeiten, oder erstellen Sie ein leeres Projekt." copy_options: - dependencies_label: Aus Vorlage erstellen + dependencies_label: "Aus Vorlage erstellen" blank_template: - label: Leeres Projekt - description: Bei Null anfangen. Projektattribute, Mitglieder und Module manuell - hinzufügen. + label: "Leeres Projekt" + description: Bei Null anfangen. Projektattribute, Mitglieder und Module manuell hinzufügen. blank_description: Keine Beschreibung angegeben. create_portfolio: - template_heading: Wählen Sie eine Portfoliovorlage, um mit den gängigsten Projektmanagementmethoden - zu arbeiten, oder erstellen Sie ein leeres Portfolio. + template_heading: "Wählen Sie eine Portfoliovorlage, um mit den gängigsten Projektmanagementmethoden zu arbeiten, oder erstellen Sie ein leeres Portfolio." blank_template: - label: Leeres Portfolio - description: Beginnen Sie bei Null. Fügen Sie Portfolioattribute, Mitglieder - und Module manuell hinzu. + label: "Leeres Portfolio" + description: Beginnen Sie bei Null. Fügen Sie Portfolioattribute, Mitglieder und Module manuell hinzu. create_program: - template_heading: Wählen Sie eine Programmvorlage, um mit den gängigsten Projektmanagementmethoden - zu arbeiten, oder erstellen Sie ein Programm von Grund auf neu. + template_heading: "Wählen Sie eine Programmvorlage, um mit den gängigsten Projektmanagementmethoden zu arbeiten, oder erstellen Sie ein Programm von Grund auf neu." blank_template: - label: Leeres Programm - description: Bei Null anfangen. Programmattribute, Mitglieder und Module manuell - hinzufügen. - create_wiki_page: Neue Wikiseite anlegen - create_wiki_page_button: Wiki-Seite + label: "Leeres Programm" + description: Bei Null anfangen. Programmattribute, Mitglieder und Module manuell hinzufügen. + create_wiki_page: "Neue Wikiseite anlegen" + create_wiki_page_button: "Wiki-Seite" date: abbr_day_names: - - So - - Mo - - Di - - Mi - - Do - - Fr - - Sa + - "So" + - "Mo" + - "Di" + - "Mi" + - "Do" + - "Fr" + - "Sa" abbr_month_names: - - - - Jan - - Feb - - Mär - - Apr - - Mai - - Jun - - Jul - - Aug - - Sep - - Okt - - Nov - - Dez - abbr_week: KW + - null + - "Jan" + - "Feb" + - "Mär" + - "Apr" + - "Mai" + - "Jun" + - "Jul" + - "Aug" + - "Sep" + - "Okt" + - "Nov" + - "Dez" + abbr_week: "KW" day_names: - - Sonntag - - Montag - - Dienstag - - Mittwoch - - Donnerstag - - Freitag - - Samstag + - "Sonntag" + - "Montag" + - "Dienstag" + - "Mittwoch" + - "Donnerstag" + - "Freitag" + - "Samstag" formats: + #Use the strftime parameters for formats. + #When no format has been given, it uses default. + #You can provide other formats here if you like! default: "%d.%m.%Y" long: "%d. %B %Y" short: "%d. %b" - month_names: - - - - Januar - - Februar - - März - - April - - Mai - - Juni - - Juli - - August - - September - - Oktober - - November - - Dezember + #Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: #Used in date_select and datetime_select. + - null + - "Januar" + - "Februar" + - "März" + - "April" + - "Mai" + - "Juni" + - "Juli" + - "August" + - "September" + - "Oktober" + - "November" + - "Dezember" order: - - :day - - :month - - :year + - :day + - :month + - :year datetime: distance_in_words: about_x_hours: - one: etwa 1 Stunde - other: etwa %{count} Stunden + one: "etwa 1 Stunde" + other: "etwa %{count} Stunden" about_x_months: - one: etwa 1 Monat - other: etwa %{count} Monate + one: "etwa 1 Monat" + other: "etwa %{count} Monate" about_x_years: - one: etwa 1 Jahr - other: etwa %{count} Jahre + one: "etwa 1 Jahr" + other: "etwa %{count} Jahre" almost_x_years: - one: fast 1 Jahr - other: fast %{count} Jahre - half_a_minute: eine halbe Minute + one: "fast 1 Jahr" + other: "fast %{count} Jahre" + half_a_minute: "eine halbe Minute" less_than_x_minutes: - one: weniger als 1 Minute - other: weniger als %{count} Minuten + one: "weniger als 1 Minute" + other: "weniger als %{count} Minuten" less_than_x_seconds: - one: weniger als eine Sekunde - other: weniger als %{count} Sekunden + one: "weniger als eine Sekunde" + other: "weniger als %{count} Sekunden" over_x_years: - one: mehr als ein Jahr - other: mehr als %{count} Jahre + one: "mehr als ein Jahr" + other: "mehr als %{count} Jahre" x_days: - one: 1 Tag + one: "1 Tag" other: "%{count} Tage" x_minutes: - one: 1 Minute + one: "1 Minute" other: "%{count} Minuten" x_minutes_abbreviated: - one: 1 Min. + one: "1 Min." other: "%{count} Min." x_hours: - one: 1 Stunde + one: "1 Stunde" other: "%{count} Stunden" x_hours_abbreviated: - one: 1 Std. + one: "1 Std." other: "%{count} Std." x_weeks: - one: 1 Woche + one: "1 Woche" other: "%{count} Wochen" x_months: - one: 1 Monat + one: "1 Monat" other: "%{count} Monate" x_years: - one: 1 Jahr + one: "1 Jahr" other: "%{count} Jahre" x_seconds: - one: 1 Sekunde + one: "1 Sekunde" other: "%{count} Sekunden" x_seconds_abbreviated: - one: 1 Sek. + one: "1 Sek." other: "%{count} Sek." units: minute_abbreviated: - one: Min. - other: Min + one: "Min." + other: "Min" hour: - one: Stunde - other: Stunde + one: "Stunde" + other: "Stunde" day: - one: Tag - other: Tagen - description_active: Aktiv? - description_attachment_toggle: Dateien ein-/ausblenden - description_autocomplete: 'Dieses Feld unterstützt Autovervollständigung. Bei Eingabe - eines Arbeitspaket-Titels erhalten Sie ein Liste möglicher Arbeitspakete angezeigt. - Wählen Sie mit den Pfeiltasten den gewünschten Eintrag und bestätigen Sie mit - Tab oder Enter. Alternativ können Sie die Arbeitspaketnummer direkt eingeben. - - ' - description_available_columns: Verfügbare Spalten - description_choose_project: Projekte - description_compare_from: Vergleiche von - description_compare_to: Vergleiche mit - description_current_position: 'Du bist hier: ' - description_date_from: Startdatum eintragen - description_date_to: Enddatum eintragen - description_enter_number: Zahl eingeben - description_enter_text: Text eingeben - description_filter: Filter - description_filter_toggle: Filter ein-/ausblenden - description_category_reassign: Neue Kategorie wählen - description_message_content: Nachrichteninhalt - description_my_project: Sie sind Mitglied - description_notes: Kommentare - description_parent_work_package: Übergeordnetes Arbeitspaket - description_project_scope: Suchbereich - description_query_sort_criteria_attribute: Sortierattribut - description_query_sort_criteria_direction: Sortierrichtung - description_search: Suchfeld - description_select_work_package: Arbeitspaket auswählen - description_selected_columns: Ausgewählte Spalten - description_sub_work_package: Untergeordnetes Arbeitspaket - description_toc_toggle: Inhaltsverzeichnis ein-/ausblenden - description_wiki_subpages_reassign: Neue Elternseite wählen + one: "Tag" + other: "Tagen" + description_active: "Aktiv?" + description_attachment_toggle: "Dateien ein-/ausblenden" + description_autocomplete: > + Dieses Feld unterstützt Autovervollständigung. Bei Eingabe eines Arbeitspaket-Titels erhalten Sie ein Liste möglicher Arbeitspakete angezeigt. Wählen Sie mit den Pfeiltasten den gewünschten Eintrag und bestätigen Sie mit Tab oder Enter. Alternativ können Sie die Arbeitspaketnummer direkt eingeben. + description_available_columns: "Verfügbare Spalten" + description_choose_project: "Projekte" + description_compare_from: "Vergleiche von" + description_compare_to: "Vergleiche mit" + description_current_position: "Du bist hier: " + description_date_from: "Startdatum eintragen" + description_date_to: "Enddatum eintragen" + description_enter_number: "Zahl eingeben" + description_enter_text: "Text eingeben" + description_filter: "Filter" + description_filter_toggle: "Filter ein-/ausblenden" + description_category_reassign: "Neue Kategorie wählen" + description_message_content: "Nachrichteninhalt" + description_my_project: "Sie sind Mitglied" + description_notes: "Kommentare" + description_parent_work_package: "Übergeordnetes Arbeitspaket" + description_project_scope: "Suchbereich" + description_query_sort_criteria_attribute: "Sortierattribut" + description_query_sort_criteria_direction: "Sortierrichtung" + description_search: "Suchfeld" + description_select_work_package: "Arbeitspaket auswählen" + description_selected_columns: "Ausgewählte Spalten" + description_sub_work_package: "Untergeordnetes Arbeitspaket" + description_toc_toggle: "Inhaltsverzeichnis ein-/ausblenden" + description_wiki_subpages_reassign: "Neue Elternseite wählen" + #Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) direction: ltr ee: features: @@ -3242,444 +2696,324 @@ de: work_package_sharing: Teilen von Arbeitspaketen mit externen Nutzer:innen work_package_subject_generation: Arbeitspaket-Betreff Generierung upsell: - buy_now_button: Jetzt kaufen - plans_title: Enterprise-Plan - title: Enterprise Add-on - plan_title: Enterprise %{plan} Add-on + buy_now_button: "Jetzt kaufen" + plans_title: "Enterprise-Plan" + title: "Enterprise Add-on" + plan_title: "Enterprise %{plan} Add-on" plan_name: "%{plan} Enterprise Plan" - plan_text_html: Beginnend mit dem %{plan_name} verfügbar. - unlimited: Unbegrenzt - already_have_token: 'Haben Sie bereits ein Token? Fügen Sie es über den Button - unten hinzu, um zum gebuchten Enterprise-Plan zu wechseln. - - ' - hide_banner: Dieses Banner ausblenden - homescreen_description: 'Enterprise-Pläne erweitern die Community-Edition von - OpenProject um zusätzliche [Enterprise Add-Ons](enterprise_url) und professionellen - Support, ideal für Unternehmen, die OpenProject in einer geschäftskritischen - Umgebung einsetzen. - - ' + plan_text_html: "Beginnend mit dem %{plan_name} verfügbar." + unlimited: "Unbegrenzt" + already_have_token: > + Haben Sie bereits ein Token? Fügen Sie es über den Button unten hinzu, um zum gebuchten Enterprise-Plan zu wechseln. + hide_banner: "Dieses Banner ausblenden" + homescreen_description: > + Enterprise-Pläne erweitern die Community-Edition von OpenProject um zusätzliche [Enterprise Add-Ons](enterprise_url) und professionellen Support, ideal für Unternehmen, die OpenProject in einer geschäftskritischen Umgebung einsetzen. homescreen_subline: Durch ein Upgrade unterstützen Sie zudem ein Open-Source-Projekt. baseline_comparison: - description: An dieser Liste vorgenommene Änderungen seit einem beliebigen - Zeitpunkt in der Vergangenheit hervorheben. + description: An dieser Liste vorgenommene Änderungen seit einem beliebigen Zeitpunkt in der Vergangenheit hervorheben. benefits: - description: Was sind die Vorteile von Enterprise on-premises? - high_security: Weitere Sicherheitsfunktionen - high_security_text: Single Sign on (SAML, OpenID Connect, CAS), LDAP Gruppen. - installation: Installations-Support - installation_text: Erfahrene Software-Ingenieure führen Sie durch den gesamten - Installations- und Einrichtungsprozess in Ihrer eigenen Infrastruktur. - premium_features: Enterprise Add-ons - premium_features_text: Agile Boards, benutzerdefinierte Farben und Logo, Graphen, - intelligente Workflows mit benutzerdefinierten Aktionen, Volltextsuche für - Anhänge von Arbeitspaketen und Mehrfachauswahl benutzerdefinierter Felder. - professional_support: Professionelle Unterstützung - professional_support_text: Sie bekommen zuverlässigen und persönlichen Support - von Experten, die sich mit dem Einsatz von OpenProject in geschäftskritischen - Umgebungen auskennen. + description: "Was sind die Vorteile von Enterprise on-premises?" + high_security: "Weitere Sicherheitsfunktionen" + high_security_text: "Single Sign on (SAML, OpenID Connect, CAS), LDAP Gruppen." + installation: "Installations-Support" + installation_text: "Erfahrene Software-Ingenieure führen Sie durch den gesamten Installations- und Einrichtungsprozess in Ihrer eigenen Infrastruktur." + premium_features: "Enterprise Add-ons" + premium_features_text: "Agile Boards, benutzerdefinierte Farben und Logo, Graphen, intelligente Workflows mit benutzerdefinierten Aktionen, Volltextsuche für Anhänge von Arbeitspaketen und Mehrfachauswahl benutzerdefinierter Felder." + professional_support: "Professionelle Unterstützung" + professional_support_text: "Sie bekommen zuverlässigen und persönlichen Support von Experten, die sich mit dem Einsatz von OpenProject in geschäftskritischen Umgebungen auskennen." work_package_subject_generation: - description: Erstellen Sie automatisch generierte Betreffe mit referenzierten - Attributen und Text. + description: "Erstellen Sie automatisch generierte Betreffe mit referenzierten Attributen und Text." customize_life_cycle: - description: Erstellen und organisieren Sie von PM2 abweichende Projektlebenszyklen. + description: "Erstellen und organisieren Sie von PM2 abweichende Projektlebenszyklen." capture_external_links: - description: Verhindern Sie Social-Engineering-Angriffe, indem Sie externe - Links erfassen und davor warnen, bevor Benutzer sie besuchen. + description: "Verhindern Sie Social-Engineering-Angriffe, indem Sie externe Links erfassen und davor warnen, bevor Benutzer sie besuchen." work_package_query_relation_columns: - description: Möchten Sie Beziehungen oder Unteraufgaben als Spalten in der - Arbeitspaketliste sehen können? + description: "Möchten Sie Beziehungen oder Unteraufgaben als Spalten in der Arbeitspaketliste sehen können?" edit_attribute_groups: - description: 'Anpassen der Form-Konfiguration mit diesen zusätzlichen Add-ons:' + description: "Anpassen der Form-Konfiguration mit diesen zusätzlichen Add-ons:" features: - groups: Neue Attributgruppen hinzufügen - rename: Attributgruppen umbenennen - related: Tabelle mit zugehörigen Arbeitspaketen hinzufügen + groups: "Neue Attributgruppen hinzufügen" + rename: "Attributgruppen umbenennen" + related: "Tabelle mit zugehörigen Arbeitspaketen hinzufügen" readonly_work_packages: - description: Arbeitspakete in bestimmten Status als schreibgeschützt markieren. + description: "Arbeitspakete in bestimmten Status als schreibgeschützt markieren." custom_field_hierarchies: - description: Benutzerdefinierte Felder vom Typ Hierarchie erlauben es, hierarchische - Strukturen in Arbeitspaketen und Projekten zu organisieren, indem sie mehrstufige - Auswahllisten nutzen. + description: "Benutzerdefinierte Felder vom Typ Hierarchie erlauben es, hierarchische Strukturen in Arbeitspaketen und Projekten zu organisieren, indem sie mehrstufige Auswahllisten nutzen." date_alerts: - description: Mit Datums-Erinnerungen werden Sie über bevorstehende Start- - oder Endtermine informiert, so dass Sie nie einen wichtigen Termin verpassen - oder übersehen. + description: "Mit Datums-Erinnerungen werden Sie über bevorstehende Start- oder Endtermine informiert, so dass Sie nie einen wichtigen Termin verpassen oder übersehen." weighted_item_lists: - description: Mit Gewichteten Listen können Sie eine Liste erstellen, die mit - numerischen Werten verknüpft ist. + description: "Mit Gewichteten Listen können Sie eine Liste erstellen, die mit numerischen Werten verknüpft ist." work_package_sharing: - description: Teilen Sie Arbeitspakete mit Benutzern, die nicht Mitglieder - des Projekts sind. + description: "Teilen Sie Arbeitspakete mit Benutzern, die nicht Mitglieder des Projekts sind." project_list_sharing: - description: Projektlisten mit einzelnen Benutzern und Gruppen teilen. + description: "Projektlisten mit einzelnen Benutzern und Gruppen teilen." calculated_values: - description: Mit Berechneten Werten können Sie ein auf einer mathematischen - Formel basierendes Attribut erstellen, in das numerische Werte und anderen - Projektattributen und benutzerdefinierten Feldern einfließen. + description: "Mit Berechneten Werten können Sie ein auf einer mathematischen Formel basierendes Attribut erstellen, in das numerische Werte und anderen Projektattributen und benutzerdefinierten Feldern einfließen." define_custom_style: - title: Selbstdefiniertes Farbthema und Logo - more_info: 'Hinweis: Das verwendete Logo wird öffentlich zugänglich sein.' - description: Passen Sie Ihre OpenProject Installation mit Ihrem eigenen Logo - und eigenen Farben an. + title: "Selbstdefiniertes Farbthema und Logo" + more_info: "Hinweis: Das verwendete Logo wird öffentlich zugänglich sein." + description: Passen Sie Ihre OpenProject Installation mit Ihrem eigenen Logo und eigenen Farben an. custom_actions: - title: Benutzerdefinierte Aktionen - description: Selbstdefinierte Aktionen sind Verknüpfungen zu einer Reihe von - vordefinierten Aktionen, die Sie für bestimmte Arbeitspakete je nach Status, - Rolle, Typ oder Projekt mit nur einem Klick auf einen Button auslösen. + title: "Benutzerdefinierte Aktionen" + description: "Selbstdefinierte Aktionen sind Verknüpfungen zu einer Reihe von vordefinierten Aktionen, die Sie für bestimmte Arbeitspakete je nach Status, Rolle, Typ oder Projekt mit nur einem Klick auf einen Button auslösen." mcp_server: - description: Bring OpenProject into your AI workflows with a secure MCP server. + description: "Integrieren Sie OpenProject mittels eines sicheren MCP-Servers in Ihren KI-Workflows." meeting_templates: - description: Define meeting templates with a set agenda structure and save - time by reusing them when creating new meetings. + description: "Definieren Sie Besprechungsvorlagen mit einer festen Agenda-Struktur und sparen Sie Zeit, indem Sie sie bei der Erstellung neuer Besprechungen wiederverwenden." nextcloud_sso: - title: Single Sign-On für Nextcloud-Speicher - description: Aktivieren Sie nahtlose und sichere Authentifizierung für Ihren - Nextcloud-Speicher mit Single Sign-On. Vereinfachen Sie das Zugriffsmanagement - und erhöhen Sie den Benutzerkomfort. + title: "Single Sign-On für Nextcloud-Speicher" + description: "Aktivieren Sie nahtlose und sichere Authentifizierung für Ihren Nextcloud-Speicher mit Single Sign-On. Vereinfachen Sie das Zugriffsmanagement und erhöhen Sie den Benutzerkomfort." scim_api: - title: SCIM-Clients - description: Automatisieren Sie die Benutzerverwaltung in OpenProject durch - nahtlose Integration externer Identitätsdienste wie Microsoft Entra oder - Keycloak über unsere SCIM Server API. Verfügbar ab dem Enterprise Corporate - Plan. + title: "SCIM-Clients" + description: "Automatisieren Sie die Benutzerverwaltung in OpenProject durch nahtlose Integration externer Identitätsdienste wie Microsoft Entra oder Keycloak über unsere SCIM Server API. Verfügbar ab dem Enterprise Corporate Plan." sso_auth_providers: - title: Single Sign-On (SSO) - description: Ermöglichen Sie es Benutzern, sich über externe SSO-Anbieter - mit SAML oder OpenID Connect anzumelden, um einen nahtlosen Zugriff und - die Integration mit bestehenden Identitätssystemen zu ermöglichen. + title: "Single Sign-On (SSO)" + description: "Ermöglichen Sie es Benutzern, sich über externe SSO-Anbieter mit SAML oder OpenID Connect anzumelden, um einen nahtlosen Zugriff und die Integration mit bestehenden Identitätssystemen zu ermöglichen." virus_scanning: - description: Stellen Sie sicher, dass hochgeladene Dateien in OpenProject - auf Viren gescannt werden, bevor sie für andere Benutzer zugänglich sind. + description: "Stellen Sie sicher, dass hochgeladene Dateien in OpenProject auf Viren gescannt werden, bevor sie für andere Benutzer zugänglich sind." project_creation_wizard: - description: Generieren Sie einen Schritt-für-Schritt-Assistenten, um Projektmanagern - dabei zu helfen, einen Projektinitiierungsantrag auszufüllen. + description: "Generieren Sie einen Schritt-für-Schritt-Assistenten, um Projektmanagern dabei zu helfen, einen Projektinitiierungsantrag auszufüllen." placeholder_users: title: Platzhalter-Konten - description: 'Platzhalter-Benutzer bieten Ihnen die Möglichkeit, einem Arbeitspaket - Nutzer zuzuweisen, die nicht Teil Ihres Projekts sind. Sie können in einer - Reihe von Szenarien nützlich sein; zum Beispiel, wenn Sie Aufgaben für eine - noch nicht benannte oder verfügbare Ressource verfolgen müssen oder wenn - Sie dieser Person keinen Zugriff auf OpenProject gewähren wollen, aber trotzdem - Aufgaben verfolgen wollen, die diesem Nutzer zugewiesen sind. - - ' + description: > + Platzhalter-Benutzer bieten Ihnen die Möglichkeit, einem Arbeitspaket Nutzer zuzuweisen, die nicht Teil Ihres Projekts sind. Sie können in einer Reihe von Szenarien nützlich sein; zum Beispiel, wenn Sie Aufgaben für eine noch nicht benannte oder verfügbare Ressource verfolgen müssen oder wenn Sie dieser Person keinen Zugriff auf OpenProject gewähren wollen, aber trotzdem Aufgaben verfolgen wollen, die diesem Nutzer zugewiesen sind. internal_comments: title: Interne Kommentare - description: Interne Kommentare erlauben es einem internen Team privat zu - kommunizieren. Diese sind nur für bestimmte Projektrollen sichtbar und werden - nie öffentlich sichtbar sein. + description: "Interne Kommentare erlauben es einem internen Team privat zu kommunizieren. Diese sind nur für bestimmte Projektrollen sichtbar und werden nie öffentlich sichtbar sein." internal_comments_inline: - title: Interne Kommentare schreiben, die nur für ausgewählte Mitglieder sichtbar - ist. + title: "Interne Kommentare schreiben, die nur für ausgewählte Mitglieder sichtbar ist." description: " " portfolio_management: - description: Richten Sie Ihre Projekte an Ihren strategischen Zielen aus, - indem Sie sie in Portfolios und Programmen organisieren. + description: Richten Sie Ihre Projekte an Ihren strategischen Zielen aus, indem Sie sie in Portfolios und Programmen organisieren. teaser: title: - one: Ein Tag des %{trial_plan} Test-Token verbleibend + one: "Ein Tag des %{trial_plan} Test-Token verbleibend" other: "%{count} verbleibende Tage des %{trial_plan} Test-Tokens" - description: Sie haben Zugriff auf alle Funktionen von %{trial_plan}. + description: "Sie haben Zugriff auf alle Funktionen von %{trial_plan}." trial: - not_found: Sie haben einen Test-Token angefordert, aber diese Anfrage ist nicht - mehr abrufbar. Bitte versuchen Sie es erneut. - wait_for_confirmation: Wir haben Ihnen eine E-Mail zur Bestätigung geschickt, - um den Token der Testversion abzurufen. - already_retrieved: 'Ihr Test-Enterprise-Token wurde bereits abgerufen. Bitte - überprüfen Sie Ihre E-Mails auf das beigefügte Enterprise-Token. Bitte wenden - Sie sich an unser Support-Team, wenn Sie Hilfe benötigen. - - ' - successfully_saved: Ihr Enterprise-Token der Testversion wurde erfolgreich abgerufen. - token_sent: Testversion-Token angefordert - request_again: Anfrage wiederholen - resend_action: Bestätigungsmail erneut senden - welcome_title: Kurze Funktionsübersicht - welcome_description: Erhalten Sie einen schnellen Überblick über Projektmanagement - und Teamzusammenarbeit mit der OpenProject Enterprise edition. - confirmation_info: 'Wir haben Ihnen eine E-Mail am %{date} an die Adresse %{email} - mit Informationen geschickt, um die kostenlose Testversion von OpenProject - Enterprise zu starten. Bitte überprüfen Sie Ihren Posteingang und klicken - Sie auf den Bestätigungslink, um Ihre 14 Tage kostenlose Testversion zu starten. - - ' - confirmation_subline: 'Bitte überprüfen Sie Ihren E-Mail-Posteingang und folgen - Sie den Schritten, um Ihre 14-tägige kostenlose Testversion zu starten. - - ' - domain_caption: Das Token wird für den aktuell konfigurierten Hostnamen gültig - sein. - receive_newsletter_html: 'Ich möchte den OpenProject Newsletter - erhalten. - - ' - consent_html: 'Ich stimme den - und den Datenschutzrichtlinien - zu. - - ' + not_found: "Sie haben einen Test-Token angefordert, aber diese Anfrage ist nicht mehr abrufbar. Bitte versuchen Sie es erneut." + wait_for_confirmation: "Wir haben Ihnen eine E-Mail zur Bestätigung geschickt, um den Token der Testversion abzurufen." + already_retrieved: > + Ihr Test-Enterprise-Token wurde bereits abgerufen. Bitte überprüfen Sie Ihre E-Mails auf das beigefügte Enterprise-Token. Bitte wenden Sie sich an unser Support-Team, wenn Sie Hilfe benötigen. + successfully_saved: "Ihr Enterprise-Token der Testversion wurde erfolgreich abgerufen." + token_sent: "Testversion-Token angefordert" + request_again: "Anfrage wiederholen" + resend_action: "Bestätigungsmail erneut senden" + welcome_title: "Kurze Funktionsübersicht" + welcome_description: "Erhalten Sie einen schnellen Überblick über Projektmanagement und Teamzusammenarbeit mit der OpenProject Enterprise edition." + confirmation_info: > + Wir haben Ihnen eine E-Mail am %{date} an die Adresse %{email} mit Informationen geschickt, um die kostenlose Testversion von OpenProject Enterprise zu starten. Bitte überprüfen Sie Ihren Posteingang und klicken Sie auf den Bestätigungslink, um Ihre 14 Tage kostenlose Testversion zu starten. + confirmation_subline: > + Bitte überprüfen Sie Ihren E-Mail-Posteingang und folgen Sie den Schritten, um Ihre 14-tägige kostenlose Testversion zu starten. + domain_caption: Das Token wird für den aktuell konfigurierten Hostnamen gültig sein. + receive_newsletter_html: > + Ich möchte den OpenProject Newsletter erhalten. + consent_html: > + Ich stimme den und den Datenschutzrichtlinien zu. email_calendar_updates: state: - disabled: Deaktiviert. - enabled: Aktiviert. + disabled: "Deaktiviert." + enabled: "Aktiviert." button: - disabled: Aktivieren - enabled: Deaktivieren - enumeration_activities: Aktivitäten für Zeiterfassung - enumeration_work_package_priorities: Arbeitspaket-Prioritäten - enumeration_reported_project_statuses: Gemeldeter Status - enumeration_caption_order_changed: Reihenfolge erfolgreich geändert. - enumeration_could_not_be_moved: Aufzählung konnte nicht verschoben werden. + disabled: "Aktivieren" + enabled: "Deaktivieren" + enumeration_activities: "Aktivitäten für Zeiterfassung" + enumeration_work_package_priorities: "Arbeitspaket-Prioritäten" + enumeration_reported_project_statuses: "Gemeldeter Status" + enumeration_caption_order_changed: "Reihenfolge erfolgreich geändert." + enumeration_could_not_be_moved: "Aufzählung konnte nicht verschoben werden." enterprise_trials: dialog_component: title: Enterprise Testversion - error_auth_source_sso_failed: Single Sign-On (SSO) für Nutzer '%{value}' fehlgeschlagen - error_can_not_archive_project: 'Dieses Projekt kann nicht archiviert werden: %{errors}' - error_can_not_delete_entry: Eintrag kann nicht gelöscht werden - error_can_not_delete_custom_field: Benutzerdefiniertes Feld kann nicht gelöscht - werden. - error_can_not_delete_in_use_archived_undisclosed: Es gibt auch Arbeitspakete in - archivierten Projekten. Sie müssen einen Administrator bitten, die Löschung durchzuführen, - um zu sehen, welche Projekte betroffen sind. - error_can_not_delete_in_use_archived_work_packages: 'Es gibt zudem Arbeitspakete - in archivierten Projekten. Sie müssen zuerst die folgenden Projekte reaktivieren, - bevor Sie den Typ der entsprechenden Arbeitspakete ändern können: %{archived_projects_urls}' + error_auth_source_sso_failed: "Single Sign-On (SSO) für Nutzer '%{value}' fehlgeschlagen" + error_can_not_archive_project: "Dieses Projekt kann nicht archiviert werden: %{errors}" + error_can_not_delete_entry: "Eintrag kann nicht gelöscht werden" + error_can_not_delete_custom_field: "Benutzerdefiniertes Feld kann nicht gelöscht werden." + error_can_not_delete_in_use_archived_undisclosed: "Es gibt auch Arbeitspakete in archivierten Projekten. Sie müssen einen Administrator bitten, die Löschung durchzuführen, um zu sehen, welche Projekte betroffen sind." + error_can_not_delete_in_use_archived_work_packages: "Es gibt zudem Arbeitspakete in archivierten Projekten. Sie müssen zuerst die folgenden Projekte reaktivieren, bevor Sie den Typ der entsprechenden Arbeitspakete ändern können: %{archived_projects_urls}" error_can_not_delete_type: - explanation: Dieser Typ enthält Arbeitspakete und kann nicht gelöscht werden. - Sie können alle betroffenen Arbeitspakete in - dieser Ansicht sehen. - error_can_not_delete_standard_type: Standardtypen können nicht gelöscht werden. - error_can_not_invite_user: Versand der Einland an Nutzer ist fehlgeschlagen. - error_can_not_remove_role: Diese Rolle wird verwendet und kann nicht gelöscht werden. - error_can_not_reopen_work_package_on_closed_version: Das Arbeitspaket ist einer - abgeschlossenen Version zugeordnet und kann daher nicht wieder geöffnet werden. - error_can_not_find_all_resources: Konnte nicht alle verwandten Ressourcen für diese - Anfrage finden. - error_can_not_unarchive_project: 'Dieses Projekt kann nicht ent-archiviert werden: - %{errors}' - error_check_user_and_role: Bitte wählen Sie einen Nutzer und eine Rolle. - error_code: Fehler %{code} - error_color_could_not_be_saved: Farbe konnte nicht gespeichert werden - error_cookie_missing: Das OpenProject Cookie fehlt. Bitte stellen Sie sicher, dass - Cookies aktiviert sind, da diese Applikation ohne aktivierte Cookies nicht korrekt - funktioniert. - error_custom_option_not_found: Option ist nicht vorhanden. - error_enterprise_plan_needed: Sie benötigen den Enterprise-Plan %{plan}, um diese - Aktion durchzuführen. - error_enterprise_activation_user_limit: Ihr Konto konnte nicht aktiviert werden - (Nutzerlimit erreicht). Bitte kontaktieren Sie Ihren Administrator um Zugriff - zu erhalten. - error_enterprise_token_invalid_domain: Die Enterprise edition ist nicht aktiv. Die - aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected}). - error_failed_to_delete_entry: Fehler beim Löschen dieses Eintrags. - error_in_dependent: 'Fehler beim Versuch, abhängiges Objekt zu ändern: %{dependent_class} - #%{related_id} - %{related_subject}: %{error}' - error_in_new_dependent: 'Fehler beim Versuch, abhängiges Objekt zu erstellen: %{dependent_class} - - %{related_subject}: %{error}' - error_invalid_selected_value: Ausgewählter Wert ist ungültig. - error_journal_attribute_not_present: Journal enthält Attribut %{attribute} nicht. - error_pdf_export_too_many_columns: Zu viele Spalten für PDF-Export ausgewählt. Bitte - reduzieren Sie die Anzahl der ausgewählten Spalten. - error_pdf_date_range_too_long: Der ausgewählte Datumsbereich des Arbeitspakets überschreitet - die zulässige Grenze für den PDF-Export. Bitte beschränken Sie den Bereich auf - maximal %{years} Jahre. - error_pdf_failed_to_export: 'Der PDF-Export konnte nicht gespeichert werden: %{error}' - error_token_authenticity: Das Cross-Site Request Forgery Token konnte nicht verfiziert - werden. Wenn Sie versucht haben, Daten auf mehreren Tabs oder Browsern abzuspeichern, - schließen sie diese und laden diese Seite erneut um den Vorgang zu wiederholen. - error_reminder_not_found: Die Erinnerung wurde nicht gefunden oder wurde bereits - benachrichtigt. - error_work_package_not_found_in_project: Das Arbeitspaket wurde nicht gefunden oder - gehört nicht zu diesem Projekt. - error_work_package_id_not_found: Das Arbeitspaket wurde nicht gefunden. - error_must_be_project_member: muss Mitglied des Projekts sein - error_migrations_are_pending: Ihre OpenProject-Installation hat noch ausstehende - Datenbankmigrationen. Sie haben wahrscheinlich die Migration für Ihr letztes Upgrade - nicht durchgeführt. Bitte überprüfen Sie die Upgrade-Anleitung, um Ihre Installation - korrekt zu aktualisieren. - error_migrations_visit_upgrade_guides: Bitte besuchen Sie unsere Dokumentation zur - Aktualisierung von OpenProject - error_no_default_work_package_status: Es ist kein Status als Standard definiert. - Bitte überprüfen Sie Ihre Konfiguration (unter "Administration -> Arbeitspaket-Status"). - error_no_type_in_project: Diesem Projekt ist kein Typ zugeordnet. Bitte überprüfen - Sie die Projekteinstellungen. - error_omniauth_registration_timed_out: Die Registrierung über einen externen Authentifizierungsprovider - ist fehlgeschlagen. Bitte versuchen Sie es erneut. - error_omniauth_invalid_auth: Die vom Identity Provider zurückgegebenen Authentifizierungsdaten - sind ungültig. Bitte kontaktieren Sie Ihren Adminstrator für weitere Hilfe. - error_password_change_failed: Beim Ändern des Passworts ist ein Fehler aufgetreten. - error_scm_command_failed: 'Beim Zugriff auf das Projektarchiv ist ein Fehler aufgetreten: - %{value}' - error_scm_not_found: Eintrag und/oder Revision existiert nicht im Projektarchiv. - error_type_could_not_be_saved: Typ konnte nicht gespeichert werden. - error_unable_delete_status: Der Arbeitspaket-Status kann nicht gelöscht werden, - da er von mindestens einem Arbeitspaket genutzt wird. - error_unable_delete_default_status: Der Standardstatus für neue Arbeitspakete kann - nicht gelöscht werden. Bitte wählen Sie einen anderen Standardstatus, bevor Sie - diesen Status löschen. - error_unable_to_connect: Fehler beim Verbinden (%{value}) - error_unable_delete_wiki: Wiki-Seite kann nicht gelöscht werden. - error_unable_update_wiki: Wiki-Seite kann nicht aktualisiert werden. - error_workflow_copy_source: Bitte wählen Sie einen Ausgangs-Typ und eine Ausgangs-Rolle. - error_workflow_copy_target: Bitte wählen den/die Ziel-Typ(en) und -Rolle(n). + explanation: 'Dieser Typ enthält Arbeitspakete und kann nicht gelöscht werden. Sie können alle betroffenen Arbeitspakete in dieser Ansicht sehen.' + error_can_not_delete_standard_type: "Standardtypen können nicht gelöscht werden." + error_can_not_invite_user: "Versand der Einland an Nutzer ist fehlgeschlagen." + error_can_not_remove_role: "Diese Rolle wird verwendet und kann nicht gelöscht werden." + error_can_not_reopen_work_package_on_closed_version: "Das Arbeitspaket ist einer abgeschlossenen Version zugeordnet und kann daher nicht wieder geöffnet werden." + error_can_not_find_all_resources: "Konnte nicht alle verwandten Ressourcen für diese Anfrage finden." + error_can_not_unarchive_project: "Dieses Projekt kann nicht ent-archiviert werden: %{errors}" + error_check_user_and_role: "Bitte wählen Sie einen Nutzer und eine Rolle." + error_code: "Fehler %{code}" + error_color_could_not_be_saved: "Farbe konnte nicht gespeichert werden" + error_cookie_missing: "Das OpenProject Cookie fehlt. Bitte stellen Sie sicher, dass Cookies aktiviert sind, da diese Applikation ohne aktivierte Cookies nicht korrekt funktioniert." + error_custom_option_not_found: "Option ist nicht vorhanden." + error_enterprise_plan_needed: "Sie benötigen den Enterprise-Plan %{plan}, um diese Aktion durchzuführen." + error_enterprise_activation_user_limit: "Ihr Konto konnte nicht aktiviert werden (Nutzerlimit erreicht). Bitte kontaktieren Sie Ihren Administrator um Zugriff zu erhalten." + error_enterprise_token_invalid_domain: "Die Enterprise edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected})." + error_failed_to_delete_entry: "Fehler beim Löschen dieses Eintrags." + error_in_dependent: "Fehler beim Versuch, abhängiges Objekt zu ändern: %{dependent_class} #%{related_id} - %{related_subject}: %{error}" + error_in_new_dependent: "Fehler beim Versuch, abhängiges Objekt zu erstellen: %{dependent_class} - %{related_subject}: %{error}" + error_invalid_selected_value: "Ausgewählter Wert ist ungültig." + error_journal_attribute_not_present: "Journal enthält Attribut %{attribute} nicht." + error_pdf_export_too_many_columns: "Zu viele Spalten für PDF-Export ausgewählt. Bitte reduzieren Sie die Anzahl der ausgewählten Spalten." + error_pdf_date_range_too_long: "Der ausgewählte Datumsbereich des Arbeitspakets überschreitet die zulässige Grenze für den PDF-Export. Bitte beschränken Sie den Bereich auf maximal %{years} Jahre." + error_pdf_failed_to_export: "Der PDF-Export konnte nicht gespeichert werden: %{error}" + error_token_authenticity: "Das Cross-Site Request Forgery Token konnte nicht verfiziert werden. Wenn Sie versucht haben, Daten auf mehreren Tabs oder Browsern abzuspeichern, schließen sie diese und laden diese Seite erneut um den Vorgang zu wiederholen." + error_reminder_not_found: "Die Erinnerung wurde nicht gefunden oder wurde bereits benachrichtigt." + error_work_package_not_found_in_project: "Das Arbeitspaket wurde nicht gefunden oder gehört nicht zu diesem Projekt." + error_work_package_id_not_found: "Das Arbeitspaket wurde nicht gefunden." + error_must_be_project_member: "muss Mitglied des Projekts sein" + error_migrations_are_pending: "Ihre OpenProject-Installation hat noch ausstehende Datenbankmigrationen. Sie haben wahrscheinlich die Migration für Ihr letztes Upgrade nicht durchgeführt. Bitte überprüfen Sie die Upgrade-Anleitung, um Ihre Installation korrekt zu aktualisieren." + error_migrations_visit_upgrade_guides: "Bitte besuchen Sie unsere Dokumentation zur Aktualisierung von OpenProject" + error_no_default_work_package_status: 'Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter "Administration -> Arbeitspaket-Status").' + error_no_type_in_project: "Diesem Projekt ist kein Typ zugeordnet. Bitte überprüfen Sie die Projekteinstellungen." + error_omniauth_registration_timed_out: "Die Registrierung über einen externen Authentifizierungsprovider ist fehlgeschlagen. Bitte versuchen Sie es erneut." + error_omniauth_invalid_auth: "Die vom Identity Provider zurückgegebenen Authentifizierungsdaten sind ungültig. Bitte kontaktieren Sie Ihren Adminstrator für weitere Hilfe." + error_password_change_failed: "Beim Ändern des Passworts ist ein Fehler aufgetreten." + error_scm_command_failed: "Beim Zugriff auf das Projektarchiv ist ein Fehler aufgetreten: %{value}" + error_scm_not_found: "Eintrag und/oder Revision existiert nicht im Projektarchiv." + error_type_could_not_be_saved: "Typ konnte nicht gespeichert werden." + error_unable_delete_status: "Der Arbeitspaket-Status kann nicht gelöscht werden, da er von mindestens einem Arbeitspaket genutzt wird." + error_unable_delete_default_status: "Der Standardstatus für neue Arbeitspakete kann nicht gelöscht werden. Bitte wählen Sie einen anderen Standardstatus, bevor Sie diesen Status löschen." + error_unable_to_connect: "Fehler beim Verbinden (%{value})" + error_unable_delete_wiki: "Wiki-Seite kann nicht gelöscht werden." + error_unable_update_wiki: "Wiki-Seite kann nicht aktualisiert werden." + error_workflow_copy_source: "Bitte wählen Sie einen Ausgangs-Typ und eine Ausgangs-Rolle." + error_workflow_copy_target: "Bitte wählen den/die Ziel-Typ(en) und -Rolle(n)." error_menu_item_not_created: Menüpunkt konnte nicht hinzugefügt werden. error_menu_item_not_saved: Menüpunkt konnte nicht aktualisiert werden. - error_wiki_root_menu_item_conflict: 'Kann "%{old_name}" nicht in "%{new_name}" umbenennen, - weil es mit dem bestehenden Menüeintrag "%{existing_caption}" (%{existing_identifier}) - kollidiert. - - ' - error_external_authentication_failed_message: 'Die externe Authentifizierung ist - fehlgeschlagen: %{message}' - error_attribute_not_highlightable: 'Nicht hervorhebbare Attribut(e): %{attributes}' + error_wiki_root_menu_item_conflict: > + Kann "%{old_name}" nicht in "%{new_name}" umbenennen, weil es mit dem bestehenden Menüeintrag "%{existing_caption}" (%{existing_identifier}) kollidiert. + error_external_authentication_failed_message: "Die externe Authentifizierung ist fehlgeschlagen: %{message}" + error_attribute_not_highlightable: "Nicht hervorhebbare Attribut(e): %{attributes}" events: - changeset: Projektarchiv-Änderung bearbeitet + changeset: "Projektarchiv-Änderung bearbeitet" message: Nachricht bearbeitet news: Neuigkeiten - project_details: Projektdetails bearbeitet - project: Projekt bearbeitet - projects: Projekt bearbeitet + project_details: "Projektdetails bearbeitet" + project: "Projekt bearbeitet" + projects: "Projekt bearbeitet" reply: Antwort erstellt - time_entry: Zeiterfassungseintrag bearbeitet - wiki_page: Wiki-Seite bearbeitet - work_package_closed: Arbeitspaket geschlossen - work_package_edit: Arbeitspaket bearbeitet - work_package_note: Arbeitspaket kommentiert + time_entry: "Zeiterfassungseintrag bearbeitet" + wiki_page: "Wiki-Seite bearbeitet" + work_package_closed: "Arbeitspaket geschlossen" + work_package_edit: "Arbeitspaket bearbeitet" + work_package_note: "Arbeitspaket kommentiert" title: - project: 'Projekt: %{name}' - subproject: 'Unterprojekt: %{name}' + project: "Projekt: %{name}" + subproject: "Unterprojekt: %{name}" export: dialog: - title: Exportieren - submit: Exportieren + title: "Exportieren" + submit: "Exportieren" save_export_settings: - label: Einstellungen speichern + label: "Einstellungen speichern" format: - label: Dateiformat + label: "Dateiformat" options: csv: - label: CSV + label: "CSV" pdf: - label: PDF + label: "PDF" xls: - label: XLS + label: "XLS" columns: - input_label_report: Spalten zur Attributtabelle hinzufügen - input_caption_report: Standardmäßig sind alle Attribute, die als Spalten in - der Arbeitspaketliste hinzugefügt wurden, ausgewählt. Langtextfelder sind - in der Attributtabelle nicht verfügbar, können aber unterhalb der Tabelle - angezeigt werden. - input_caption_table: Standardmäßig sind alle Attribute, die als Spalten in - der Arbeitspaketliste hinzugefügt wurden, ausgewählt. Textfelder sind in - tabellenbasierten Exporten nicht verfügbar. - input_caption_required: Es ist nicht möglich, die Ansicht ohne jede Spalte - zu exportieren. Bitte fügen Sie mindestens eine Spalte hinzu. + input_label_report: "Spalten zur Attributtabelle hinzufügen" + input_caption_report: "Standardmäßig sind alle Attribute, die als Spalten in der Arbeitspaketliste hinzugefügt wurden, ausgewählt. Langtextfelder sind in der Attributtabelle nicht verfügbar, können aber unterhalb der Tabelle angezeigt werden." + input_caption_table: "Standardmäßig sind alle Attribute, die als Spalten in der Arbeitspaketliste hinzugefügt wurden, ausgewählt. Textfelder sind in tabellenbasierten Exporten nicht verfügbar." + input_caption_required: "Es ist nicht möglich, die Ansicht ohne jede Spalte zu exportieren. Bitte fügen Sie mindestens eine Spalte hinzu." pdf: export_type: - label: PDF-Exporttyp + label: "PDF-Exporttyp" options: table: - label: Tabelle - caption: Exportieren Sie die Liste der Arbeitspakete in eine Tabelle - mit den gewünschten Spalten. + label: "Tabelle" + caption: "Exportieren Sie die Liste der Arbeitspakete in eine Tabelle mit den gewünschten Spalten." report: - label: Report - caption: Exportieren Sie das Arbeitspaket in einen detaillierten Bericht - über alle Arbeitspakete in der Liste. + label: "Report" + caption: "Exportieren Sie das Arbeitspaket in einen detaillierten Bericht über alle Arbeitspakete in der Liste." gantt: - label: Gantt-Diagramm - caption: Exportieren Sie die Liste der Arbeitspakete in einer Gantt-Diagramm-Ansicht. + label: "Gantt-Diagramm" + caption: "Exportieren Sie die Liste der Arbeitspakete in einer Gantt-Diagramm-Ansicht." include_images: - label: Bilder inkludieren - caption: Schließen Sie Bilder aus, um die Größe des PDF-Exports zu reduzieren. + label: "Bilder inkludieren" + caption: "Schließen Sie Bilder aus, um die Größe des PDF-Exports zu reduzieren." gantt_zoom_levels: - label: Zoomstufe - caption: Wählen Sie die Zoomstufe für die im Diagramm angezeigten Daten. + label: "Zoomstufe" + caption: "Wählen Sie die Zoomstufe für die im Diagramm angezeigten Daten." options: - days: Tage - weeks: Wochen - months: Monate - quarters: Quartale + days: "Tage" + weeks: "Wochen" + months: "Monate" + quarters: "Quartale" column_width: - label: Breite der Tabellenspalten + label: "Breite der Tabellenspalten" options: - narrow: Schmal - medium: Mittel - wide: Breit - very_wide: Sehr breit + narrow: "Schmal" + medium: "Mittel" + wide: "Breit" + very_wide: "Sehr breit" paper_size: - label: Papierformat - caption: Je nach Größe des Diagramms besteht der Export aus einer oder auch - aus mehreren Seiten. + label: "Papierformat" + caption: "Je nach Größe des Diagramms besteht der Export aus einer oder auch aus mehreren Seiten." long_text_fields: - input_caption: Standardmäßig sind alle Langtextfelder ausgewählt. - input_label: Langtextfelder hinzufügen - input_placeholder: Nach Textfeldern suchen - drag_area_label: Textfelder hinzufügen + input_caption: "Standardmäßig sind alle Langtextfelder ausgewählt." + input_label: "Langtextfelder hinzufügen" + input_placeholder: "Nach Textfeldern suchen" + drag_area_label: "Textfelder hinzufügen" xls: include_relations: - label: Beziehungen inkludieren - caption: Jedes Arbeitspakets, mit dem eine Beziehung mit dem exportierten - Arbeitspaket besteht, als zusätzliche Zeile einfügen. + label: "Beziehungen inkludieren" + caption: "Jedes Arbeitspakets, mit dem eine Beziehung mit dem exportierten Arbeitspaket besteht, als zusätzliche Zeile einfügen." include_descriptions: - label: Beschreibungen inkludieren - caption: Mit dieser Option wird die Beschreibungs-Spalte im Rohformat hinzugefügt. - your_work_packages_export: Arbeitspakete werden exportiert - your_projects_export: Projekte werden exportiert - succeeded: Export abgeschlossen - failed: 'Beim Versuch, die Arbeitspakete zu exportieren, ist ein Fehler aufgetreten: - %{message}' + label: "Beschreibungen inkludieren" + caption: "Mit dieser Option wird die Beschreibungs-Spalte im Rohformat hinzugefügt." + your_work_packages_export: "Arbeitspakete werden exportiert" + your_projects_export: "Projekte werden exportiert" + succeeded: "Export abgeschlossen" + failed: "Beim Versuch, die Arbeitspakete zu exportieren, ist ein Fehler aufgetreten: %{message}" demo: - heading: Demo-PDF - footer: Von OpenProject generiert + heading: "Demo-PDF" + footer: "Von OpenProject generiert" button_text: Demo-PDF generieren errors: - embedded_table_with_too_many_columns: Diese eingebettete Arbeitspakettabelle - passte nicht auf die Seite. Bitte reduzieren Sie die Anzahl der Spalten. + embedded_table_with_too_many_columns: "Diese eingebettete Arbeitspakettabelle passte nicht auf die Seite. Bitte reduzieren Sie die Anzahl der Spalten." format: - atom: Atom - csv: CSV - pdf: PDF - pdf_overview_table: PDF-Tabelle - pdf_report_with_images: PDF-Bericht mit Bildern - pdf_report: PDF-Bericht - pdf_gantt: PDF Gantt + atom: "Atom" + csv: "CSV" + pdf: "PDF" + pdf_overview_table: "PDF-Tabelle" + pdf_report_with_images: "PDF-Bericht mit Bildern" + pdf_report: "PDF-Bericht" + pdf_gantt: "PDF Gantt" image: - omitted: Bild nicht exportiert. + omitted: "Bild nicht exportiert." macro: - error: Makrofehler, %{message} - attribute_not_found: 'Attribut nicht gefunden: %{attribute}' - model_not_found: 'ungültiges Attributmodell: %{model}' - resource_not_found: 'Ressource nicht gefunden: %{resource}' - nested_rich_text_unsupported: Rich-Text-Einbettung wird derzeit beim Export - nicht unterstützt + error: "Makrofehler, %{message}" + attribute_not_found: "Attribut nicht gefunden: %{attribute}" + model_not_found: "ungültiges Attributmodell: %{model}" + resource_not_found: "Ressource nicht gefunden: %{resource}" + nested_rich_text_unsupported: "Rich-Text-Einbettung wird derzeit beim Export nicht unterstützt" units: hours: h days: d pdf_generator: - page_nr_footer: Seite %{page} von %{total} + page_nr_footer: "Seite %{page} von %{total}" template_attributes: - label: Attribute und Beschreibung - caption: Alle Attribute, die in der aktuellen Formularkonfiguration mit der - Standardvorlage vorhanden sind. + label: "Attribute und Beschreibung" + caption: Alle Attribute, die in der aktuellen Formularkonfiguration mit der Standardvorlage vorhanden sind. template_contract: - label: Vertrag + label: "Vertrag" caption: Details des Arbeitspakets im Format der deutschen Standardvertragsform. dialog: title: PDF generieren submit: Download templates: - label: Vorlage - none_enabled: Für diesen Arbeitspakettyp ist keine Vorlage aktiv + label: "Vorlage" + none_enabled: "Für diesen Arbeitspakettyp ist keine Vorlage aktiv" footer_center: label: Text in der Fußzeile caption: Dieser Text wird auf jeder Seite in der Mitte der Fußzeile angezeigt. footer_right: label: Text in der Fußzeile - caption: Dieser Text wird auf jeder Seite in der rechten Ecke der Fußzeile - angezeigt. + caption: Dieser Text wird auf jeder Seite in der rechten Ecke der Fußzeile angezeigt. hyphenation: label: Silbentrennung caption: Silbentrennung zwischen Wörtern zur besseren Anordnung und Ausrichtung. @@ -3693,95 +3027,91 @@ de: landscape: Querformat extraction: available: - pdftotext: Pdftotext verfügbar (optional) - unrtf: Unrtf verfügbar (optional) - catdoc: Catdoc verfügbar (optional) - xls2csv: Xls2csv verfügbar (optional) - catppt: Catppt verfügbar (optional) - tesseract: Tesseract verfügbar (optional) + pdftotext: "Pdftotext verfügbar (optional)" + unrtf: "Unrtf verfügbar (optional)" + catdoc: "Catdoc verfügbar (optional)" + xls2csv: "Xls2csv verfügbar (optional)" + catppt: "Catppt verfügbar (optional)" + tesseract: "Tesseract verfügbar (optional)" filterable_tree_view: filter_mode: - all: Alle - label: Filtermodus - selected: Ausgewählt - include_sub_items: Unterelemente einbeziehen - no_results_text: Keine Ergebnisse + all: "Alle" + label: "Filtermodus" + selected: "Ausgewählt" + include_sub_items: "Unterelemente einbeziehen" + no_results_text: "Keine Ergebnisse" toggle_switch: - label_on: Ein - label_off: Aus + label_on: "Ein" + label_off: "Aus" general_csv_decimal_separator: "," - general_csv_encoding: UTF-8 + general_csv_encoding: "UTF-8" general_csv_separator: "," - general_first_day_of_week: '1' - general_pdf_encoding: ISO-8859-1 - general_text_no: nein - general_text_yes: ja - general_text_No: Nein - general_text_Yes: Ja - general_text_true: ja - general_text_false: falsch - gui_validation_error: 1 Fehler + general_first_day_of_week: "1" + general_pdf_encoding: "ISO-8859-1" + general_text_no: "nein" + general_text_yes: "ja" + general_text_No: "Nein" + general_text_Yes: "Ja" + general_text_true: "ja" + general_text_false: "falsch" + gui_validation_error: "1 Fehler" gui_validation_error_plural: "%{count} Fehler" homescreen: additional: - projects: Neueste sichtbare Projekte in dieser Instanz. - no_visible_projects: Es gibt keine sichtbaren Projekte in dieser OpenProject-Umgebung. - users: Neueste registrierte Benutzer in dieser Instanz. + projects: "Neueste sichtbare Projekte in dieser Instanz." + no_visible_projects: "Es gibt keine sichtbaren Projekte in dieser OpenProject-Umgebung." + users: "Neueste registrierte Benutzer in dieser Instanz." blocks: - community: OpenProject Community + community: "OpenProject Community" upsell: - title: Auf Enterprise Edition upgraden + title: "Auf Enterprise Edition upgraden" new_features: - header: Lesen Sie über neue Funktionen und Updates. - learn_about: Erfahren Sie mehr über die neuen Funktionen - missing: Es gibt noch keine hervorgehobenen Funktionen. - '17_2': - new_features_title: 'The release contains various new features and improvements, - such as: - - ' + header: "Lesen Sie über neue Funktionen und Updates." + learn_about: "Erfahren Sie mehr über die neuen Funktionen" + missing: "Es gibt noch keine hervorgehobenen Funktionen." + #We need to include the version to invalidate outdated translations in other locales + "17_2": + new_features_title: > + Dieses Release enthält verschiedene neue Funktionen und Verbesserungen, wie z. B: new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved - accessibility - line_2: 'Meetings: Meeting templates (Basic plan and higher)' - line_3: Bessere Transparenz durch Kommentare zu Projektattributen. + line_0: KI-Workflows mit einem sicheren MCP-Server (Professional-Plan und höher) + line_1: Verbesserte Projekt-Startseite mit neuem Widget für Budgets und verbesserter Barrierefreiheit + line_2: "Besprechungen: Besprechungsvorlagen (Basisplan und höher)" + line_3: Bessere Transparenz durch Kommentare zu Projektattributen line_4: Verbesserungen beim PDF-Export - line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module - line_7: Harmonized custom field forms + line_5: Erhöhte Sicherheit für externe Links (Premium Plan und höher) + line_6: UI/UX Verbesserungen im Backlogs-Modul + line_7: Harmonisierte Formulare für benutzerdefinierte Felder links: - upgrade_enterprise_edition: Auf Enterprise Edition upgraden - postgres_migration: Migration Ihrer Installation zu PostgreSQL - user_guides: Nutzungshandbuch - faq: Häufig gestellte Fragen - impressum: Impressum - glossary: Glossar - shortcuts: Tastaturkürzel - blog: OpenProject Blog - forums: Community Forum - security_alerts: Sicherheitswarnungen - newsletter: Newsletter + upgrade_enterprise_edition: "Auf Enterprise Edition upgraden" + postgres_migration: "Migration Ihrer Installation zu PostgreSQL" + user_guides: "Nutzungshandbuch" + faq: "Häufig gestellte Fragen" + impressum: "Impressum" + glossary: "Glossar" + shortcuts: "Tastaturkürzel" + blog: "OpenProject Blog" + forums: "Community Forum" + security_alerts: "Sicherheitswarnungen" + newsletter: "Newsletter" image_conversion: - imagemagick: ImageMagick + imagemagick: "ImageMagick" journals: - changes_retracted: Die Änderungen wurden zurückgezogen. + changes_retracted: "Die Änderungen wurden zurückgezogen." caused_changes: - budget_deleted: Budget has been deleted - dates_changed: Datum geändert - default_attribute_written: Nur-Lese-Attribute wurde geschrieben - import: Importiert - progress_mode_changed_to_status_based: Fortschrittsberechnung aktualisiert - status_changed: Status '%{status_name}' - system_update: 'OpenProject-Systemaktualisierung:' - work_package_duplicate_closed: 'Dupliziertes Arbeitspaket aktualisiert:' - total_percent_complete_mode_changed_to_work_weighted_average: Die Berechnung - der Gesamtwerte für % abgeschlossen wird jetzt nach Aufwand gewichtet. - total_percent_complete_mode_changed_to_simple_average: Die Berechnung der Gesamtwerte - für % abgeschlossen basiert jetzt auf dem einfachen Durchschnitt der % abgeschlossen-Werte. + budget_deleted: "Budget wurde gelöscht" + dates_changed: "Datum geändert" + default_attribute_written: "Nur-Lese-Attribute wurde geschrieben" + import: "Importiert" + progress_mode_changed_to_status_based: "Fortschrittsberechnung aktualisiert" + status_changed: "Status '%{status_name}'" + system_update: "OpenProject-Systemaktualisierung:" + work_package_duplicate_closed: "Dupliziertes Arbeitspaket aktualisiert:" + total_percent_complete_mode_changed_to_work_weighted_average: "Die Berechnung der Gesamtwerte für % abgeschlossen wird jetzt nach Aufwand gewichtet." + total_percent_complete_mode_changed_to_simple_average: "Die Berechnung der Gesamtwerte für % abgeschlossen basiert jetzt auf dem einfachen Durchschnitt der % abgeschlossen-Werte." cause_descriptions: import: - header: Änderungen durch %{author} + header: "Änderungen durch %{author}" field_changed: "%{field} geändert von %{old_value} zu %{new_value}" field_set: "%{field} auf %{value} gesetzt" field_removed: "%{field} entfernt" @@ -3790,1231 +3120,1107 @@ de: changed_with_diff: "%{field} geändert (%{link})" set_with_diff: "%{field} gesetzt (%{link})" work_package_predecessor_changed_times: durch Änderungen am Vorgänger %{link} - work_package_parent_changed_times: durch Änderungen am übergeordneten Arbeitspaket - %{link} + work_package_parent_changed_times: durch Änderungen am übergeordneten Arbeitspaket %{link} work_package_children_changed_times: durch Änderungen an Unteraufgabe %{link} - work_package_related_changed_times: durch Änderungen an verwandtem Arbeitspaket - %{link} - work_package_duplicate_closed: Der Status wurde automatisch durch das als Duplikat - markierte Arbeitspaket %{link} aktualisiert + work_package_related_changed_times: durch Änderungen an verwandtem Arbeitspaket %{link} + work_package_duplicate_closed: Der Status wurde automatisch durch das als Duplikat markierte Arbeitspaket %{link} aktualisiert unaccessable_work_package_changed: nach Änderungen an einem zugehörigen Arbeitspaket - budget_deleted: Budget has been deleted + budget_deleted: Budget wurde gelöscht working_days_changed: - changed: Durch Änderungen an Werktagen (%{changes}) + changed: "Durch Änderungen an Werktagen (%{changes})" days: working: "%{day} ist jetzt ein Arbeitstag" non_working: "%{day} ist jetzt kein Arbeitstag" dates: working: "%{date} ist jetzt ein Arbeitstag" non_working: "%{date} ist jetzt ein arbeitsfreier Tag" - progress_mode_changed_to_status_based: Fortschrittberechnung wurde auf Status-basiert - gesetzt - status_excluded_from_totals_set_to_false_message: jetzt in den Gesamtwerten - der Hierarchie enthalten - status_excluded_from_totals_set_to_true_message: jetzt von den Hierarchie-Gesamtwerten - ausgeschlossen - status_percent_complete_changed: "% abgeschlossen von %{old_value}% auf %{new_value} - % geändert" + progress_mode_changed_to_status_based: Fortschrittberechnung wurde auf Status-basiert gesetzt + status_excluded_from_totals_set_to_false_message: jetzt in den Gesamtwerten der Hierarchie enthalten + status_excluded_from_totals_set_to_true_message: jetzt von den Hierarchie-Gesamtwerten ausgeschlossen + status_percent_complete_changed: "% abgeschlossen von %{old_value}% auf %{new_value} % geändert" system_update: - file_links_journal: 'Ab sofort erscheinen hier Aktivitäten, die sich auf Datei-Links - beziehen (Dateien in externen Speichermedien) auf der Registerkarte Aktivität. - Folgende Aktivitäten betreffen bereits existierende Links: - - ' - progress_calculation_adjusted_from_disabled_mode: Die Fortschrittsberechnung - wurde automatisch auf den aufwandsbezogenen - Modus gesetzt und durch das Systemupdate angepasst. - progress_calculation_adjusted: Die Fortschrittsberechnung wurde automatisch durch das Systemupdate angepasst. - scheduling_mode_adjusted: Planungsmodus wird beim Versionsupdate automatisch - angepasst. - totals_removed_from_childless_work_packages: Arbeits- und Fortschrittssummen - werden bei der Versionsaktualisierung - automatisch für nicht übergeordnete Arbeitspakete entfernt. Diese Änderung - entstand durch ein Upgrade und kann ignoriert werden. - total_percent_complete_mode_changed_to_work_weighted_average: Unteraufgaben - ohne Arbeit werden ignoriert. - total_percent_complete_mode_changed_to_simple_average: Arbeitswerte von Unteraufgaben - werden ignoriert. + file_links_journal: > + Ab sofort erscheinen hier Aktivitäten, die sich auf Datei-Links beziehen (Dateien in externen Speichermedien) auf der Registerkarte Aktivität. Folgende Aktivitäten betreffen bereits existierende Links: + progress_calculation_adjusted_from_disabled_mode: >- + Die Fortschrittsberechnung wurde automatisch auf den aufwandsbezogenen Modus gesetzt und durch das Systemupdate angepasst. + progress_calculation_adjusted: >- + Die Fortschrittsberechnung wurde automatisch durch das Systemupdate angepasst. + scheduling_mode_adjusted: >- + Planungsmodus wird beim Versionsupdate automatisch angepasst. + totals_removed_from_childless_work_packages: >- + Arbeits- und Fortschrittssummen werden bei der Versionsaktualisierung automatisch für nicht übergeordnete Arbeitspakete entfernt. Diese Änderung entstand durch ein Upgrade und kann ignoriert werden. + total_percent_complete_mode_changed_to_work_weighted_average: >- + Unteraufgaben ohne Arbeit werden ignoriert. + total_percent_complete_mode_changed_to_simple_average: >- + Arbeitswerte von Unteraufgaben werden ignoriert. links: - configuration_guide: Konfigurationsanleitung - get_in_touch: Sie haben Fragen? Nehmen Sie Kontakt mit uns auf. - instructions_after_registration: Sie können sich anmelden, sobald Ihr Konto aktiviert - wurde, indem Sie auf %{signin} klicken. - instructions_after_logout: Sie können wieder anmelden indem Sie auf %{signin} klicken. - instructions_after_error: Sie können versuchen sich erneut anzumelden indem Sie - auf %{signin} klicken. Wenn der Fehler weiterhin auftritt, fragen Sie Ihren Administrator - um Hilfe. + configuration_guide: "Konfigurationsanleitung" + get_in_touch: "Sie haben Fragen? Nehmen Sie Kontakt mit uns auf." + instructions_after_registration: "Sie können sich anmelden, sobald Ihr Konto aktiviert wurde, indem Sie auf %{signin} klicken." + instructions_after_logout: "Sie können wieder anmelden indem Sie auf %{signin} klicken." + instructions_after_error: "Sie können versuchen sich erneut anzumelden indem Sie auf %{signin} klicken. Wenn der Fehler weiterhin auftritt, fragen Sie Ihren Administrator um Hilfe." menus: admin: - ai: Künstliche Intelligenz (AI) - aggregation: Zusammenfassungen - api_and_webhooks: API und Webhooks - mail_notification: Mailbenachrichtigung - mails_and_notifications: E-Mails und Benachrichtigungen - mcp_configurations: Model Context Protocol (MCP) + ai: "Künstliche Intelligenz (AI)" + aggregation: "Zusammenfassungen" + api_and_webhooks: "API und Webhooks" + mail_notification: "Mailbenachrichtigung" + mails_and_notifications: "E-Mails und Benachrichtigungen" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: - label: Hinzufügen… + label: "Hinzufügen…" my_account: access_tokens: - description: Provider-Tokens werden von OpenProject ausgestellt und ermöglichen - anderen Anwendungen den Zugriff darauf. Client-Tokens werden von anderen Anwendungen - ausgestellt und ermöglichen OpenProject den Zugriff auf sie. + description: "Provider-Tokens werden von OpenProject ausgestellt und ermöglichen anderen Anwendungen den Zugriff darauf. Client-Tokens werden von anderen Anwendungen ausgestellt und ermöglichen OpenProject den Zugriff auf sie." no_results: - title: Kein Zugangs-Token kann angezeigt werden - description: Alle wurden deaktiviert. Sie können im Administrations-Menü wieder - aktiviert werden. - access_tokens: Zugriffstokens + title: "Kein Zugangs-Token kann angezeigt werden" + description: "Alle wurden deaktiviert. Sie können im Administrations-Menü wieder aktiviert werden." + access_tokens: "Zugriffstokens" headers: - action: Aktion - expiration: Läuft aus - indefinite_expiration: Nie - simple_revoke_confirmation: Sind Sie sicher, dass Sie dieses Token widerrufen - möchten? + action: "Aktion" + expiration: "Läuft aus" + indefinite_expiration: "Nie" + simple_revoke_confirmation: "Sind Sie sicher, dass Sie dieses Token widerrufen möchten?" tabs: client: - title: Client-Tokens + title: "Client-Tokens" provider: - title: Provider-Tokens + title: "Provider-Tokens" token/api: - blank_description: Es gibt noch kein API-Token. Sie können eines erstellen, - indem Sie auf die Schaltfläche unten klicken. - blank_title: Kein API-Token - title: Schnittstelle (API) - table_title: API-Token - text_hint: API-Token erlauben es Drittanbieter-Anwendungen, mit dieser OpenProject-Instanz - über REST-APIs zu kommunizieren. - static_token_name: API-Token - disabled_text: API-Token sind vom Administrator nicht aktiviert. Bitte kontaktieren - Sie Ihren Administrator, um diese Funktion zu nutzen. - add_button: API-Token + blank_description: "Es gibt noch kein API-Token. Sie können eines erstellen, indem Sie auf die Schaltfläche unten klicken." + blank_title: "Kein API-Token" + title: "Schnittstelle (API)" + table_title: "API-Token" + text_hint: "API-Token erlauben es Drittanbieter-Anwendungen, mit dieser OpenProject-Instanz über REST-APIs zu kommunizieren." + static_token_name: "API-Token" + disabled_text: "API-Token sind vom Administrator nicht aktiviert. Bitte kontaktieren Sie Ihren Administrator, um diese Funktion zu nutzen." + add_button: "API-Token" ical: - blank_description: Um einen iCalendar-Token hinzuzufügen, abonnieren Sie einen - neuen oder bestehenden Kalender innerhalb des Kalender-Moduls eines Projekts. - Sie müssen über die erforderlichen Berechtigungen verfügen. - blank_title: Kein iCalendar-Token - title: iCalendar - table_title: iCalendar-Token - text_hint_link: iCalendar-Token ermöglichen es Benutzern, [OpenProject-Kalender - zu abonnieren](docs_url) und aktuelle Arbeitspaketinformationen in externen - Anwendungen anzuzeigen. - disabled_text: iCalendar Abonnements sind vom Administrator nicht aktiviert. - Bitte kontaktieren Sie Ihren Administrator, um diese Funktion zu nutzen. + blank_description: "Um einen iCalendar-Token hinzuzufügen, abonnieren Sie einen neuen oder bestehenden Kalender innerhalb des Kalender-Moduls eines Projekts. Sie müssen über die erforderlichen Berechtigungen verfügen." + blank_title: "Kein iCalendar-Token" + title: "iCalendar" + table_title: "iCalendar-Token" + text_hint_link: "iCalendar-Token ermöglichen es Benutzern, [OpenProject-Kalender zu abonnieren](docs_url) und aktuelle Arbeitspaketinformationen in externen Anwendungen anzuzeigen." + disabled_text: "iCalendar Abonnements sind vom Administrator nicht aktiviert. Bitte kontaktieren Sie Ihren Administrator, um diese Funktion zu nutzen." oauth_application: - active_tokens: Aktive Token - blank_description: Für Sie ist kein Zugriff auf Anwendungen von Drittanbietern - konfiguriert und aktiv. - blank_title: Kein OAuth-Anwendungs-Token - last_refreshed_at: Zuletzt aktualisiert um - title: OAuth - table_title: OAuth-Anwendungs-Tokens - text_hint: OAuth-Tokens erlauben es Drittanbieter-Anwendungen, sich mit dieser - OpenProject Instanz zu verbinden. + active_tokens: "Aktive Token" + blank_description: "Für Sie ist kein Zugriff auf Anwendungen von Drittanbietern konfiguriert und aktiv." + blank_title: "Kein OAuth-Anwendungs-Token" + last_refreshed_at: "Zuletzt aktualisiert um" + title: "OAuth" + table_title: "OAuth-Anwendungs-Tokens" + text_hint: "OAuth-Tokens erlauben es Drittanbieter-Anwendungen, sich mit dieser OpenProject Instanz zu verbinden." oauth_client: - blank_description: Es gibt noch keine OAuth-Client-Tokens. - blank_title: Keine OAuth-Client-Tokens - failed: Ein Fehler ist aufgetreten und das Token konnte nicht entfernt werden. - Bitte versuchen Sie es später erneut. - integration_type: Integrations-Typ - table_title: Keine OAuth-Client-Tokens - text_hint: OAuth-Client-Tokens ermöglichen es dieser OpenProject-Instanz, - sich mit externen Anwendungen zu verbinden, z. B. mit Dateispeichern. - title: OAuth - remove_token: Möchten Sie dieses Token wirklich entfernen? Sie müssen sich - erneut bei %{integration} anmelden. - removed: OAuth-Client-Token erfolgreich entfernt - unknown_integration: Unbekannt + blank_description: "Es gibt noch keine OAuth-Client-Tokens." + blank_title: "Keine OAuth-Client-Tokens" + failed: "Ein Fehler ist aufgetreten und das Token konnte nicht entfernt werden. Bitte versuchen Sie es später erneut." + integration_type: "Integrations-Typ" + table_title: "Keine OAuth-Client-Tokens" + text_hint: "OAuth-Client-Tokens ermöglichen es dieser OpenProject-Instanz, sich mit externen Anwendungen zu verbinden, z. B. mit Dateispeichern." + title: "OAuth" + remove_token: "Möchten Sie dieses Token wirklich entfernen? Sie müssen sich erneut bei %{integration} anmelden." + removed: "OAuth-Client-Token erfolgreich entfernt" + unknown_integration: "Unbekannt" token/rss: - add_button: RSS-Token - blank_description: Es gibt noch kein RSS-Token. Sie können eines erstellen, - indem Sie auf die Schaltfläche unten klicken. - blank_title: Kein RSS-Token - title: RSS - table_title: RSS-Token - text_hint: RSS-Token erlauben es Benutzern über einen externen RSS-Reader - auf dem Laufenden zu bleiben. - static_token_name: RSS-Token - disabled_text: RSS-Token sind vom Administrator nicht aktiviert. Bitte kontaktieren - Sie Ihren Administrator, um diese Funktion zu nutzen. + add_button: "RSS-Token" + blank_description: "Es gibt noch kein RSS-Token. Sie können eines erstellen, indem Sie auf die Schaltfläche unten klicken." + blank_title: "Kein RSS-Token" + title: "RSS" + table_title: "RSS-Token" + text_hint: "RSS-Token erlauben es Benutzern über einen externen RSS-Reader auf dem Laufenden zu bleiben." + static_token_name: "RSS-Token" + disabled_text: "RSS-Token sind vom Administrator nicht aktiviert. Bitte kontaktieren Sie Ihren Administrator, um diese Funktion zu nutzen." storages: - unknown_storage: Unbekannter Speicher + unknown_storage: "Unbekannter Speicher" notifications: reasons: - assigned: Zugewiesen an - dateAlert: Datumsalarm - mentioned: Erwähnt - responsible: Verantwortlich - shared: Geteilt - watched: Beobachter - reminder: Erinnerung + assigned: "Zugewiesen an" + dateAlert: "Datumsalarm" + mentioned: "Erwähnt" + responsible: "Verantwortlich" + shared: "Geteilt" + watched: "Beobachter" + reminder: "Erinnerung" facets: - unread: Ungelesen - unread_title: Ungelesene anzeigen - all: Alle - all_title: Alle anzeigen + unread: "Ungelesen" + unread_title: "Ungelesene anzeigen" + all: "Alle" + all_title: "Alle anzeigen" menu: - by_project: Ungelesen pro Projekt - by_reason: Grund - inbox: Eingang - send_notifications: Sende Benachrichtigungen für diese Aktion + by_project: "Ungelesen pro Projekt" + by_reason: "Grund" + inbox: "Eingang" + send_notifications: "Sende Benachrichtigungen für diese Aktion" work_packages: subject: - created: Das Arbeitspaket wurde erstellt. - assigned: Ihnen wurde %{work_package} zugewiesen - subscribed: Sie haben %{work_package} abonniert - mentioned: Sie wurden in %{work_package} erwähnt - responsible: Sie sind für %{work_package} verantwortlich - watched: Du beobachtest %{work_package} + created: "Das Arbeitspaket wurde erstellt." + assigned: "Ihnen wurde %{work_package} zugewiesen" + subscribed: "Sie haben %{work_package} abonniert" + mentioned: "Sie wurden in %{work_package} erwähnt" + responsible: "Sie sind für %{work_package} verantwortlich" + watched: "Du beobachtest %{work_package}" query: - invalid_filter: Ungültiger Benachrichtigungsfilter - label_accessibility: Barrierefreiheit - label_account: Konto - label_active: Aktiv - label_activate_user: Benutzer aktivieren - label_active_in_new_projects: Aktiv in neuen Projekten - label_activity: Aktivität - label_add_edit_translations: Hinzufügen und Bearbeiten von Übersetzungen - label_add_another_file: Eine weitere Datei hinzufügen - label_add_columns: Ausgewählte Spalten hinzufügen - label_add_note: Kommentar hinzufügen - label_add_projects: Projekte hinzufügen - label_add_related_work_packages: Zugehöriges Arbeitspaket hinzufügen - label_add_subtask: Unteraufgabe hinzufügen - label_added: hinzugefügt - label_added_by: Von %{author} hinzugefügt - label_added_by_on: Hinzugefügt von %{author} am %{date} - label_added_time_by: Von %{author} vor %{age} hinzugefügt - label_additional_workflow_transitions_for_assignee: Zusätzliche Workflow-Übergänge - für den Nutzer, dem ein Arbeitspaket zugewiesen ist - label_additional_workflow_transitions_for_author: Zusätzliche Workflow-Übergänge - wenn der Nutzer der Autor des Arbeitspakets ist - label_administration: Administration - label_interface_colors: Farben der Benutzeroberfläche - label_interface_colors_description: 'Diese Farben bestimmen, wie die Anwendung aussieht. - Änderungen dieser Farben wirken sich auf das Design aus, aber wir können dadurch - nicht mehr garantieren, dass die Mindestanforderungen an die Barrierefreiheit - (WCAG 2.1) eingehalten werden. ' - label_age: Geändert vor - label_ago: vor (Tage) - label_all: alle - label_all_time: gesamter Zeitraum - label_all_words: Alle Wörter - label_all_open_wps: Alle offenen - label_always_visible: Immer angezeigt - label_announcement: Ankündigung - label_angular: AngularJS + invalid_filter: "Ungültiger Benachrichtigungsfilter" + label_accessibility: "Barrierefreiheit" + label_account: "Konto" + label_active: "Aktiv" + label_activate_user: "Benutzer aktivieren" + label_active_in_new_projects: "Aktiv in neuen Projekten" + label_activity: "Aktivität" + label_add_edit_translations: "Hinzufügen und Bearbeiten von Übersetzungen" + label_add_another_file: "Eine weitere Datei hinzufügen" + label_add_columns: "Ausgewählte Spalten hinzufügen" + label_add_note: "Kommentar hinzufügen" + label_add_projects: "Projekte hinzufügen" + label_add_related_work_packages: "Zugehöriges Arbeitspaket hinzufügen" + label_add_subtask: "Unteraufgabe hinzufügen" + label_added: "hinzugefügt" + label_added_by: "Von %{author} hinzugefügt" + label_added_by_on: "Hinzugefügt von %{author} am %{date}" + label_added_time_by: "Von %{author} vor %{age} hinzugefügt" + label_additional_workflow_transitions_for_assignee: "Zusätzliche Workflow-Übergänge für den Nutzer, dem ein Arbeitspaket zugewiesen ist" + label_additional_workflow_transitions_for_author: "Zusätzliche Workflow-Übergänge wenn der Nutzer der Autor des Arbeitspakets ist" + label_administration: "Administration" + label_interface_colors: "Farben der Benutzeroberfläche" + label_interface_colors_description: "Diese Farben bestimmen, wie die Anwendung aussieht. Änderungen dieser Farben wirken sich auf das Design aus, aber wir können dadurch nicht mehr garantieren, dass die Mindestanforderungen an die Barrierefreiheit (WCAG 2.1) eingehalten werden. " + label_age: "Geändert vor" + label_ago: "vor (Tage)" + label_all: "alle" + label_all_time: "gesamter Zeitraum" + label_all_words: "Alle Wörter" + label_all_open_wps: "Alle offenen" + label_always_visible: "Immer angezeigt" + label_announcement: "Ankündigung" + label_angular: "AngularJS" label_app_modules: "%{app_title} Module" - label_api_access_key: API-Zugriffsschlüssel - label_api_access_key_created_on: Der API-Zugriffsschlüssel wurde vor %{value} erstellt - label_api_access_key_type: Schnittstelle (API) + label_api_access_key: "API-Zugriffsschlüssel" + label_api_access_key_created_on: "Der API-Zugriffsschlüssel wurde vor %{value} erstellt" + label_api_access_key_type: "Schnittstelle (API)" label_auto_option: "(automatisch)" - label_ical_access_key_type: iCalendar - label_ical_access_key_description: iCalendar-Token „%{token_name}“ für „%{calendar_name}“ - in „%{project_name}“ - label_ical_access_key_not_present: iCalendar-Token(s) nicht vorhanden. - label_ical_access_key_generation_hint: Wird automatisch generiert, wenn ein Kalender - abonniert wird. - label_ical_access_key_latest: neueste - label_ical_access_key_revoke: Widerrufen - label_add_column: Spalte hinzufügen - label_applied_status: Zugewiesener Status - label_archive_project: Projekt archivieren - label_ascending: Aufsteigend - label_assigned_to_me_work_packages: Mir zugewiesene Arbeitspakete - label_associated_revisions: Zugehörige Revisionen - label_attachment_plural: Anhänge - label_attribute: Attribut - label_attribute_plural: Attribute - label_ldap_auth_source_new: Neue LDAP-Verbindung - label_ldap_auth_source: LDAP-Verbindung - label_ldap_auth_source_plural: LDAP-Verbindungen - label_attribute_expand_text: Der vollständige Text für '%{attribute}' - label_authentication: Authentifizierung - label_available_custom_fields_projects: Verfügbare benutzerdefinierte Felder in - Projekten - label_available_global_roles: Verfügbare globale Rollen - label_available_project_attributes: Verfügbare Projektattribute - label_available_project_forums: Verfügbare Foren - label_available_project_repositories: Verfügbare Projektarchive - label_available_project_versions: Verfügbare Versionen - label_available_project_work_package_categories: Verfügbare Arbeitspaket-Kategorien - label_available_project_work_package_types: Verfügbare Arbeitspaket-Typen - label_available_projects: Verfügbare Projekte - label_api_doc: API-Dokumentation - label_backup: Backup - label_backup_code: Backupcode - label_basic_details: Allgemeine Informationen - label_between: zwischen - label_blocked_by: Blockiert durch - label_blocks: Blockiert - label_blog: Blog - label_forums_locked: Gesperrt - label_forum_new: Neues Forum - label_forum_plural: Foren - label_forum_sticky: Angepinnt - label_boolean: Boolesch - label_board_plural: Boards - label_branch: Zweig - label_browse: Codebrowser - label_builtin: Eingebaut - label_bulk_edit_selected_work_packages: Alle ausgewählten Arbeitspakete bearbeiten + label_ical_access_key_type: "iCalendar" + label_ical_access_key_description: 'iCalendar-Token „%{token_name}“ für „%{calendar_name}“ in „%{project_name}“' + label_ical_access_key_not_present: "iCalendar-Token(s) nicht vorhanden." + label_ical_access_key_generation_hint: "Wird automatisch generiert, wenn ein Kalender abonniert wird." + label_ical_access_key_latest: "neueste" + label_ical_access_key_revoke: "Widerrufen" + label_add_column: "Spalte hinzufügen" + label_applied_status: "Zugewiesener Status" + label_archive_project: "Projekt archivieren" + label_ascending: "Aufsteigend" + label_assigned_to_me_work_packages: "Mir zugewiesene Arbeitspakete" + label_associated_revisions: "Zugehörige Revisionen" + label_attachment_plural: "Anhänge" + label_attribute: "Attribut" + label_attribute_plural: "Attribute" + label_ldap_auth_source_new: "Neue LDAP-Verbindung" + label_ldap_auth_source: "LDAP-Verbindung" + label_ldap_auth_source_plural: "LDAP-Verbindungen" + label_attribute_expand_text: "Der vollständige Text für '%{attribute}'" + label_authentication: "Authentifizierung" + label_available_custom_fields_projects: "Verfügbare benutzerdefinierte Felder in Projekten" + label_available_global_roles: "Verfügbare globale Rollen" + label_available_project_attributes: "Verfügbare Projektattribute" + label_available_project_forums: "Verfügbare Foren" + label_available_project_repositories: "Verfügbare Projektarchive" + label_available_project_versions: "Verfügbare Versionen" + label_available_project_work_package_categories: "Verfügbare Arbeitspaket-Kategorien" + label_available_project_work_package_types: "Verfügbare Arbeitspaket-Typen" + label_available_projects: "Verfügbare Projekte" + label_api_doc: "API-Dokumentation" + label_backup: "Backup" + label_backup_code: "Backupcode" + label_basic_details: "Allgemeine Informationen" + label_between: "zwischen" + label_blocked_by: "Blockiert durch" + label_blocks: "Blockiert" + label_blog: "Blog" + label_forums_locked: "Gesperrt" + label_forum_new: "Neues Forum" + label_forum_plural: "Foren" + label_forum_sticky: "Angepinnt" + label_boolean: "Boolesch" + label_board_plural: "Boards" + label_branch: "Zweig" + label_browse: "Codebrowser" + label_builtin: "Eingebaut" + label_bulk_edit_selected_work_packages: "Alle ausgewählten Arbeitspakete bearbeiten" label_bundled: "(Gebündelt)" - label_calendar: Kalender - label_calendars_and_dates: Kalender und Datum - label_calendar_show: Kalender anzeigen - label_category: Kategorie + label_calendar: "Kalender" + label_calendars_and_dates: "Kalender und Datum" + label_calendar_show: "Kalender anzeigen" + label_category: "Kategorie" label_completed: Abgeschlossen - label_consent_settings: Nutzer-Einwilligung + label_consent_settings: "Nutzer-Einwilligung" label_wiki_menu_item: Wiki Menüpunkt label_select_main_menu_item: Neuen Hauptmenüpunkt auwählen - label_required_disk_storage: Erforderlicher Festplattenspeicher + label_required_disk_storage: "Erforderlicher Festplattenspeicher" label_send_invitation: Einladung senden - label_calculated_value: Berechneter Wert - label_change_parent: Übergeordnetes Arbeitspaket ändern - label_change_plural: Änderungen - label_change_properties: Eigenschaften ändern - label_change_status: Statuswechsel - label_change_status_of_user: 'Status des #{username} ändern' - label_change_view_all: Alle Änderungen anzeigen - label_changes_details: Details aller Änderungen - label_changeset: Revision - label_changeset_id: Revisionsnummer - label_changeset_plural: Projektarchiv-Änderungen - label_checked: ausgewählt - label_check_uncheck_all_in_column: Alle in Spalte an/abwählen - label_check_uncheck_all_in_row: Alle in Zeile an/abwählen - label_child_element: Kind-Element - label_choices: Auswahlmöglichkeiten - label_close_versions: Abgeschlossene Versionen schließen - label_closed_work_packages: Geschlossen - label_collapse: Zuklappen - label_collapsed_click_to_show: Ausgeblendet. Klicken Sie zum Anzeigen + label_calculated_value: "Berechneter Wert" + label_change_parent: "Übergeordnetes Arbeitspaket ändern" + label_change_plural: "Änderungen" + label_change_properties: "Eigenschaften ändern" + label_change_status: "Statuswechsel" + label_change_status_of_user: "Status des #{username} ändern" + label_change_view_all: "Alle Änderungen anzeigen" + label_changes_details: "Details aller Änderungen" + label_changeset: "Revision" + label_changeset_id: "Revisionsnummer" + label_changeset_plural: "Projektarchiv-Änderungen" + label_checked: "ausgewählt" + label_check_uncheck_all_in_column: "Alle in Spalte an/abwählen" + label_check_uncheck_all_in_row: "Alle in Zeile an/abwählen" + label_child_element: "Kind-Element" + label_choices: "Auswahlmöglichkeiten" + label_close_versions: "Abgeschlossene Versionen schließen" + label_closed_work_packages: "Geschlossen" + label_collapse: "Zuklappen" + label_collapsed_click_to_show: "Ausgeblendet. Klicken Sie zum Anzeigen" label_configuration: Konfiguration - label_comment_add: Kommentar hinzufügen - label_comment_added: Kommentar hinzugefügt - label_comment_delete: Kommentar löschen - label_comment_plural: Kommentare - label_commits_per_author: Übertragungen pro Autor - label_commits_per_month: Übertragungen pro Monat - label_confirmation: Bestätigung - label_contains: enthält - label_content: Inhalt - label_color_plural: Farben - label_copied: kopiert - label_copy_same_as_target: So wie das Ziel - label_copy_source: Quelle - label_copy_target: Ziel - label_copy_workflow_from: Workflow kopieren von - label_copy_project: Projekt kopieren - label_core_version: Core Version - label_core_build: Core-Buildinformation - label_created_by: Erstellt von %{user} - label_current_status: Gegenwärtiger Status - label_current_version: Gegenwärtige Version - label_custom_field_add_no_type: Dieses Feld zu einem Arbeitspaket-Typ hinzufügen - label_custom_field_new: Neues benutzerdefiniertes Feld - label_custom_field_plural: Benutzerdefinierte Felder - label_custom_field_default_type: Leerer Typ - label_custom_style: Design - label_custom_style_description: Wählen Sie über Design und Farben aus, wie die OpenProject - Benutzeroberfläche und Exporte aussehen sollen. - label_dashboard: Dashboard - label_database_version: PostgreSQL-Version - label_date: Datum - label_dates: Daten - label_date_and_time: Datum und Zeit - label_date_format: Datumsformat - label_date_from: Von - label_date_from_to: von %{start} bis %{end} - label_date_to: Bis - label_day_plural: Tagen - label_default: Standard - label_delete_user: Benutzer löschen - label_delete_project: Projekt löschen - label_delete: Löschen - label_deleted: gelöscht + label_comment_add: "Kommentar hinzufügen" + label_comment_added: "Kommentar hinzugefügt" + label_comment_delete: "Kommentar löschen" + label_comment_plural: "Kommentare" + label_commits_per_author: "Übertragungen pro Autor" + label_commits_per_month: "Übertragungen pro Monat" + label_confirmation: "Bestätigung" + label_contains: "enthält" + label_content: "Inhalt" + label_color_plural: "Farben" + label_copied: "kopiert" + label_copy_same_as_target: "So wie das Ziel" + label_copy_source: "Quelle" + label_copy_target: "Ziel" + label_copy_workflow_from: "Workflow kopieren von" + label_copy_project: "Projekt kopieren" + label_core_version: "Core Version" + label_core_build: "Core-Buildinformation" + label_created_by: "Erstellt von %{user}" + label_current_status: "Gegenwärtiger Status" + label_current_version: "Gegenwärtige Version" + label_custom_field_add_no_type: "Dieses Feld zu einem Arbeitspaket-Typ hinzufügen" + label_custom_field_new: "Neues benutzerdefiniertes Feld" + label_custom_field_plural: "Benutzerdefinierte Felder" + label_custom_field_default_type: "Leerer Typ" + label_custom_style: "Design" + label_custom_style_description: "Wählen Sie über Design und Farben aus, wie die OpenProject Benutzeroberfläche und Exporte aussehen sollen." + label_dashboard: "Dashboard" + label_database_version: "PostgreSQL-Version" + label_date: "Datum" + label_dates: "Daten" + label_date_and_time: "Datum und Zeit" + label_date_format: "Datumsformat" + label_date_from: "Von" + label_date_from_to: "von %{start} bis %{end}" + label_date_to: "Bis" + label_day_plural: "Tagen" + label_default: "Standard" + label_delete_user: "Benutzer löschen" + label_delete_project: "Projekt löschen" + label_delete: "Löschen" + label_deleted: "gelöscht" label_deleted_custom_field: "(gelöschtes benutzerdefiniertes Feld)" label_deleted_custom_item: "(gelöschter Eintrag)" label_deleted_custom_option: "(gelöschte Option)" label_empty_element: "(leer)" - label_go_back: Eine Menüebene zurückgehen - label_go_forward: Öffne %{module} Untermenü + label_go_back: "Eine Menüebene zurückgehen" + label_go_forward: "Öffne %{module} Untermenü" label_missing_or_hidden_custom_option: "(Fehlender Wert oder fehlende Zugriffsberechtigungen)" - label_descending: Absteigend - label_details: Details - label_defaults: Standardwerte - label_development_roadmap: Entwicklungs-Roadmap - label_diff: diff - label_diff_inline: einspaltig - label_diff_side_by_side: nebeneinander - label_digital_accessibility: Erklärung zur digitalen Barrierefreiheit - label_disabled: deaktiviert - label_disabled_uppercase: Deaktiviert - label_display: Anzeige - label_display_per_page: 'Pro Seite: %{value}' - label_display_used_statuses_only: Zeige nur Status an, die von diesem Typ verwendet - werden + label_descending: "Absteigend" + label_details: "Details" + label_defaults: "Standardwerte" + label_development_roadmap: "Entwicklungs-Roadmap" + label_diff: "diff" + label_diff_inline: "einspaltig" + label_diff_side_by_side: "nebeneinander" + label_digital_accessibility: "Erklärung zur digitalen Barrierefreiheit" + label_disabled: "deaktiviert" + label_disabled_uppercase: "Deaktiviert" + label_display: "Anzeige" + label_display_per_page: "Pro Seite: %{value}" + label_display_used_statuses_only: "Zeige nur Status an, die von diesem Typ verwendet werden" label_download: "%{count} Download" label_download_plural: "%{count} Downloads" - label_downloads_abbr: D/L - label_duplicated_by: Dupliziert durch - label_duplicate: Duplikat - label_duplicates: Duplikat von - label_edit: Bearbeiten - label_edit_x: 'Bearbeiten: %{x}' - label_view_x: 'Ansicht: %{x}' - label_enable_multi_select: Mehrfachauswahl umschalten - label_enabled_project_custom_fields: Aktivierte benutzerdefinierte Felder - label_enabled_project_modules: Aktivierte Module - label_enabled_project_activities: Aktivierte Aktivitäten für Zeiterfassung - label_end_to_end: Ende - Ende - label_end_to_start: Ende - Anfang - label_enumeration_new: Neuer Aufzählungswert - label_enumeration_value: Aufzählungswert - label_enumerations: Aufzählungen - label_enterprise: Enterprise + label_downloads_abbr: "D/L" + label_duplicated_by: "Dupliziert durch" + label_duplicate: "Duplikat" + label_duplicates: "Duplikat von" + label_edit: "Bearbeiten" + label_edit_x: "Bearbeiten: %{x}" + label_view_x: "Ansicht: %{x}" + label_enable_multi_select: "Mehrfachauswahl umschalten" + label_enabled_project_custom_fields: "Aktivierte benutzerdefinierte Felder" + label_enabled_project_modules: "Aktivierte Module" + label_enabled_project_activities: "Aktivierte Aktivitäten für Zeiterfassung" + label_end_to_end: "Ende - Ende" + label_end_to_start: "Ende - Anfang" + label_enumeration_new: "Neuer Aufzählungswert" + label_enumeration_value: "Aufzählungswert" + label_enumerations: "Aufzählungen" + label_enterprise: "Enterprise" label_enterprise_active_users: "%{current}/%{limit} gebuchte aktive Nutzer" - label_enterprise_edition: Enterprise edition - label_enterprise_support: Enterprise Support - label_environment: Umgebung - label_estimates_and_progress: Schätzungen und Fortschritt - label_equals: ist - label_equals_with_descendants: 'ist (ODER) inkl. Unterelementen ' - label_everywhere: überall - label_example: Beispiel - label_experimental: Experimentell - label_i_am_member: Ich bin Mitglied - label_ifc_viewer: IFC-Viewer - label_ifc_model_plural: IFC-Modelle - label_import: Import - label_export_to: 'Auch abrufbar als:' - label_expand: Aufklappen - label_expanded_click_to_collapse: Erweitert. Klicken Sie zum Ausblenden + label_enterprise_edition: "Enterprise edition" + label_enterprise_support: "Enterprise Support" + label_environment: "Umgebung" + label_estimates_and_progress: "Schätzungen und Fortschritt" + label_equals: "ist" + label_equals_with_descendants: "ist (ODER) inkl. Unterelementen " + label_everywhere: "überall" + label_example: "Beispiel" + label_experimental: "Experimentell" + label_i_am_member: "Ich bin Mitglied" + label_ifc_viewer: "IFC-Viewer" + label_ifc_model_plural: "IFC-Modelle" + label_import: "Import" + label_export_to: "Auch abrufbar als:" + label_expand: "Aufklappen" + label_expanded_click_to_collapse: "Erweitert. Klicken Sie zum Ausblenden" label_f_hour: "%{value} Stunde" label_f_hour_plural: "%{value} Stunden" - label_favorite: Favorit - label_feed_plural: Feeds - label_feeds_access_key: RSS-Zugriffsschlüssel - label_feeds_access_key_created_on: Atom-Zugriffsschlüssel vor %{value} erstellt - label_feeds_access_key_type: RSS - label_file_plural: Dateien - label_filter: Filter - label_filter_add: Filter hinzufügen - label_filter_by: Filtern nach - label_filter_any_name_attribute: Namensattribute - label_filter_plural: Filter - label_filters_toggle: Filter ein-/ausblenden - label_float: Gleitkommazahl - label_folder: Ordner - label_follows: folgt - label_force_user_language_to_default: Setze Sprache für Nutzer, die eine nicht erlaubte - Sprache gewählt haben, auf die Standard-Sprache - label_form_configuration: Formularkonfiguration - label_formula: Formel - label_gantt_chart: Gantt-Diagramm - label_gantt_chart_plural: Gantt Diagramme - label_general: Allgemein - label_generate_key: Schlüssel generieren - label_global_modules: Globale Module - label_global_roles: Globale Rollen - label_git_path: Pfad zum .git-Verzeichnis + label_favorite: "Favorit" + label_feed_plural: "Feeds" + label_feeds_access_key: "RSS-Zugriffsschlüssel" + label_feeds_access_key_created_on: "Atom-Zugriffsschlüssel vor %{value} erstellt" + label_feeds_access_key_type: "RSS" + label_file_plural: "Dateien" + label_filter: "Filter" + label_filter_add: "Filter hinzufügen" + label_filter_by: "Filtern nach" + label_filter_any_name_attribute: "Namensattribute" + label_filter_plural: "Filter" + label_filters_toggle: "Filter ein-/ausblenden" + label_float: "Gleitkommazahl" + label_folder: "Ordner" + label_follows: "folgt" + label_force_user_language_to_default: "Setze Sprache für Nutzer, die eine nicht erlaubte Sprache gewählt haben, auf die Standard-Sprache" + label_form_configuration: "Formularkonfiguration" + label_formula: "Formel" + label_gantt_chart: "Gantt-Diagramm" + label_gantt_chart_plural: "Gantt Diagramme" + label_general: "Allgemein" + label_generate_key: "Schlüssel generieren" + label_global_modules: "Globale Module" + label_global_roles: "Globale Rollen" + label_git_path: "Pfad zum .git-Verzeichnis" label_greater_or_equal: ">=" - label_group_by: Gruppieren nach - label_group_new: Neue Gruppe - label_group: Gruppe - label_group_named: Gruppe %{name} - label_group_plural: Gruppen - label_help: Hilfe + label_group_by: "Gruppieren nach" + label_group_new: "Neue Gruppe" + label_group: "Gruppe" + label_group_named: "Gruppe %{name}" + label_group_plural: "Gruppen" + label_help: "Hilfe" label_here: hier - label_hide: Verbergen - label_history: Historie - label_hierarchy: Hierarchie - label_hierarchy_leaf: Hierarchie-Blatt - label_home: Hauptseite - label_subject_or_id: Titel oder ID - label_calendar_subscriptions: Kalenderabonnements - label_identifier: Kennung - label_in: an - label_in_less_than: in weniger als - label_in_more_than: in mehr als - label_inactive: Inaktiv - label_incoming_emails: Eingehende E-Mails - label_includes: enthält + label_hide: "Verbergen" + label_history: "Historie" + label_hierarchy: "Hierarchie" + label_hierarchy_leaf: "Hierarchie-Blatt" + label_home: "Hauptseite" + label_subject_or_id: "Titel oder ID" + label_calendar_subscriptions: "Kalenderabonnements" + label_identifier: "Kennung" + label_in: "an" + label_in_less_than: "in weniger als" + label_in_more_than: "in mehr als" + label_inactive: "Inaktiv" + label_incoming_emails: "Eingehende E-Mails" + label_includes: "enthält" label_incomplete: Unvollständig label_include_sub_projects: Unterprojekte einbeziehen - label_index_by_date: Seiten nach Datum - label_index_by_title: Seiten nach Titel - label_information: Information - label_information_plural: Information - label_installation_guides: Installationsanleitungen - label_integer: Zahl - label_interface: Benutzeroberfläche - label_internal: Intern - label_introduction_video: Einführungsvideo - label_invite_user: Nutzer einladen - label_item: Element - label_item_plural: Elemente - label_weighted_item_list: Gewichtete Listen - label_share: Teilen - label_share_project_list: Projektliste teilen - label_share_work_package: Arbeitspaket teilen - label_show_all_registered_users: Alle registrierten Benutzer anzeigen - label_show_less: Weniger anzeigen - label_show_more: Mehr anzeigen - label_journal: Änderungen - label_journal_diff: Beschreibungsvergleich - label_language: Sprache - label_languages: Sprachen - label_external_links: Externe Links - label_locale: Sprache und Region - label_jump_to_a_project: Zu einem Projekt springen... - label_jira_import: Jira Import - label_keyword_plural: Schlüsselwörter - label_language_based: Sprachabhängig - label_last_activity: Letzte Aktivität - label_last_change_on: Letzte Änderung am + label_index_by_date: "Seiten nach Datum" + label_index_by_title: "Seiten nach Titel" + label_information: "Information" + label_information_plural: "Information" + label_installation_guides: "Installationsanleitungen" + label_integer: "Zahl" + label_interface: "Benutzeroberfläche" + label_internal: "Intern" + label_introduction_video: "Einführungsvideo" + label_invite_user: "Nutzer einladen" + label_item: "Element" + label_item_plural: "Elemente" + label_weighted_item_list: "Gewichtete Listen" + label_share: "Teilen" + label_share_project_list: "Projektliste teilen" + label_share_work_package: "Arbeitspaket teilen" + label_show_all_registered_users: "Alle registrierten Benutzer anzeigen" + label_show_less: "Weniger anzeigen" + label_show_more: "Mehr anzeigen" + label_journal: "Änderungen" + label_journal_diff: "Beschreibungsvergleich" + label_language: "Sprache" + label_languages: "Sprachen" + label_external_links: "Externe Links" + label_locale: "Sprache und Region" + label_jump_to_a_project: "Zu einem Projekt springen..." + label_jira_import: "Jira Import" + label_keyword_plural: "Schlüsselwörter" + label_language_based: "Sprachabhängig" + label_last_activity: "Letzte Aktivität" + label_last_change_on: "Letzte Änderung am" label_last_changes: "%{count} letzte Änderungen" - label_last_login: Letzte Anmeldung - label_last_month: voriger Monat - label_last_n_days: die letzten %{count} Tage - label_last_week: vorige Woche - label_latest_revision: Aktuellste Revision - label_latest_revision_plural: Aktuellste Revisionen - label_ldap_authentication: LDAP-Authentifizierung - label_learn_more: Mehr erfahren + label_last_login: "Letzte Anmeldung" + label_last_month: "voriger Monat" + label_last_n_days: "die letzten %{count} Tage" + label_last_week: "vorige Woche" + label_latest_revision: "Aktuellste Revision" + label_latest_revision_plural: "Aktuellste Revisionen" + label_ldap_authentication: "LDAP-Authentifizierung" + label_learn_more: "Mehr erfahren" label_less_or_equal: "<=" - label_less_than_ago: vor weniger als (Tage) - label_link_url: Link (URL) - label_list: Liste - label_loading: Lade... - label_locked: gesperrt - label_lock_user: Benutzer sperren - label_logged_as: Angemeldet als - label_login: Anmelden + label_less_than_ago: "vor weniger als (Tage)" + label_link_url: "Link (URL)" + label_list: "Liste" + label_loading: "Lade..." + label_locked: "gesperrt" + label_lock_user: "Benutzer sperren" + label_logged_as: "Angemeldet als" + label_login: "Anmelden" label_custom_comment: "%{name} Kommentar" - label_custom_logo: Benutzerdefiniertes Logo Desktop - label_custom_logo_mobile: Benutzerdefiniertes Logo Mobilgerät - label_custom_export_logo: Selbstdefiniertes Logo für PDF-Export - label_custom_export_cover: Hintergrund für Export Cover - label_custom_export_footer: Selbstdefiniertes Fußzeilen-Bild für PDF-Export - label_custom_export_font_regular: Normal - label_custom_export_font_bold: Fett - label_custom_export_font_italic: Kursiv - label_custom_export_font_bold_italic: Fett Kursiv - label_custom_export_cover_overlay: Eigenes Deckblatt für Export - label_custom_export_cover_text_color: Textfarbe - label_custom_pdf_export_settings: Benutzerdefinierte PDF-Export-Einstellungen - label_custom_favicon: Benutzerdefiniertes Favicon - label_custom_touch_icon: Benutzerdefiniertes Touch-Icon - label_logout: Abmelden - label_mapping_for: 'Zuordnung für: %{attribute}' - label_main_menu: Nebenmenü - label_manage: Verwalten - label_manage_groups: Gruppen verwalten - label_managed_repositories_vendor: Verwaltete %{vendor} Projektarchive - label_mathematical_operators: Mathematische Operatoren - label_max_size: Maximale Größe - label_me: ich - label_member_new: Neues Mitglied + label_custom_logo: "Benutzerdefiniertes Logo Desktop" + label_custom_logo_mobile: "Benutzerdefiniertes Logo Mobilgerät" + label_custom_export_logo: "Selbstdefiniertes Logo für PDF-Export" + label_custom_export_cover: "Hintergrund für Export Cover" + label_custom_export_footer: "Selbstdefiniertes Fußzeilen-Bild für PDF-Export" + label_custom_export_font_regular: "Normal" + label_custom_export_font_bold: "Fett" + label_custom_export_font_italic: "Kursiv" + label_custom_export_font_bold_italic: "Fett Kursiv" + label_custom_export_cover_overlay: "Eigenes Deckblatt für Export" + label_custom_export_cover_text_color: "Textfarbe" + label_custom_pdf_export_settings: "Benutzerdefinierte PDF-Export-Einstellungen" + label_custom_favicon: "Benutzerdefiniertes Favicon" + label_custom_touch_icon: "Benutzerdefiniertes Touch-Icon" + label_logout: "Abmelden" + label_mapping_for: "Zuordnung für: %{attribute}" + label_main_menu: "Nebenmenü" + label_manage: "Verwalten" + label_manage_groups: "Gruppen verwalten" + label_managed_repositories_vendor: "Verwaltete %{vendor} Projektarchive" + label_mathematical_operators: "Mathematische Operatoren" + label_max_size: "Maximale Größe" + label_me: "ich" + label_member_new: "Neues Mitglied" label_member_all_admin: "(Alle Rollen, da Administrator)" - label_member_plural: Mitglieder - label_membership_plural: Mitgliedschaften - label_membership_added: Mitglied hinzugefügt - label_membership_updated: Mitglied aktualisiert - label_menu: Menü + label_member_plural: "Mitglieder" + label_membership_plural: "Mitgliedschaften" + label_membership_added: "Mitglied hinzugefügt" + label_membership_updated: "Mitglied aktualisiert" + label_menu: "Menü" label_menu_badge: - pre_alpha: pre-alpha - alpha: alpha - beta: beta - label_menu_item_name: Name des Menüpunktes - label_message: Nachricht - label_message_last: Letzter Forenbeitrag - label_message_new: Neues Thema - label_message_plural: Forenbeiträge - label_message_posted: Forenbeitrag hinzugefügt - label_min_max_length: Länge (Min. - Max.) - label_minute_plural: Minuten - label_missing_api_access_key: Fehlender API Zugriffsschlüssel - label_missing_feeds_access_key: Fehlender RSS Zugriffsschlüssel + pre_alpha: "pre-alpha" + alpha: "alpha" + beta: "beta" + label_menu_item_name: "Name des Menüpunktes" + label_message: "Nachricht" + label_message_last: "Letzter Forenbeitrag" + label_message_new: "Neues Thema" + label_message_plural: "Forenbeiträge" + label_message_posted: "Forenbeitrag hinzugefügt" + label_min_max_length: "Länge (Min. - Max.)" + label_minute_plural: "Minuten" + label_missing_api_access_key: "Fehlender API Zugriffsschlüssel" + label_missing_feeds_access_key: "Fehlender RSS Zugriffsschlüssel" label_modification: "%{count} Änderung" - label_modified: geändert - label_module_plural: Module - label_modules: Module - label_months_from: Monate ab - label_more: Mehr - label_more_information: Weitere Informationen - label_more_than_ago: vor mehr als (Tage) - label_move_column_left: Spalte nach links - label_move_column_right: Spalte nach rechts - label_move_work_package: Arbeitspaket verschieben - label_my_account: Kontoeinstellungen - label_my_activity: Meine Aktivität - label_my_account_data: Meine Kontodaten - label_my_avatar: Mein Avatar - label_my_queries: Meine Berichte - label_name: Name - label_never: Nie - label_new: Neu - label_new_features: Neue Funktionen - label_new_statuses_allowed: Neuer Status - label_news_singular: Neuigkeit - label_news_added: Neuigkeit hinzugefügt - label_news_comment_added: Kommentar einer Nachricht hinzugefügt - label_news_latest: Aktuellste Neuigkeiten - label_news_new: Nachricht hinzufügen - label_news_edit: Nachricht bearbeiten - label_news_plural: Neuigkeiten - label_news_view_all: Alle Neuigkeiten anzeigen - label_next: Weiter - label_next_week: Woche vor + label_modified: "geändert" + label_module_plural: "Module" + label_modules: "Module" + label_months_from: "Monate ab" + label_more: "Mehr" + label_more_information: "Weitere Informationen" + label_more_than_ago: "vor mehr als (Tage)" + label_move_column_left: "Spalte nach links" + label_move_column_right: "Spalte nach rechts" + label_move_work_package: "Arbeitspaket verschieben" + label_my_account: "Kontoeinstellungen" + label_my_activity: "Meine Aktivität" + label_my_account_data: "Meine Kontodaten" + label_my_avatar: "Mein Avatar" + label_my_queries: "Meine Berichte" + label_name: "Name" + label_never: "Nie" + label_new: "Neu" + label_new_features: "Neue Funktionen" + label_new_statuses_allowed: "Neuer Status" + label_news_singular: "Neuigkeit" + label_news_added: "Neuigkeit hinzugefügt" + label_news_comment_added: "Kommentar einer Nachricht hinzugefügt" + label_news_latest: "Aktuellste Neuigkeiten" + label_news_new: "Nachricht hinzufügen" + label_news_edit: "Nachricht bearbeiten" + label_news_plural: "Neuigkeiten" + label_news_view_all: "Alle Neuigkeiten anzeigen" + label_next: "Weiter" + label_next_week: "Woche vor" label_no_change_option: "(Keine Änderung)" - label_no_data: Es sind keine Daten vorhanden - label_no_due_date: kein Endtermin - label_no_start_date: kein Startdatum - label_no_parent_page: Keine übergeordnete Seite - label_notification_center_plural: Benachrichtigungen - label_nothing_display: Nichts anzuzeigen - label_nobody: Niemand - label_not_configured: Nicht konfiguriert - label_not_found: nicht gefunden - label_none: keine + label_no_data: "Es sind keine Daten vorhanden" + label_no_due_date: "kein Endtermin" + label_no_start_date: "kein Startdatum" + label_no_parent_page: "Keine übergeordnete Seite" + label_notification_center_plural: "Benachrichtigungen" + label_nothing_display: "Nichts anzuzeigen" + label_nobody: "Niemand" + label_not_configured: "Nicht konfiguriert" + label_not_found: "nicht gefunden" + label_none: "keine" label_none_parentheses: "(keiner)" - label_not_contains: enthält nicht - label_not_equals: ist nicht - label_life_cycle_step_plural: Projekt-Lebenszyklus - label_on: am - label_operator_all: ist nicht leer - label_operator_none: ist leer - label_operator_equals_or: ist (ODER) - label_operator_equals_all: ist (UND) - label_operator_shared_with_user_any: beliebig - label_open: Offen - label_closed: Geschlossen - label_open_menu: Menü öffnen - label_open_work_packages: Offen - label_open_work_packages_plural: offen - label_openproject_website: OpenProject Webseite - label_optional_description: Beschreibung - label_options: Optionen - label_other: Andere - label_overall_activity: Aktivität aller Projekte anzeigen - label_overview: Übersicht - label_page_title: Seitentitel - label_part_of: enthalten in - label_password_lost: Kennwort vergessen? - label_password_rule_lowercase: Kleinbuchstaben - label_password_rule_numeric: Ziffern - label_password_rule_special: Sonderzeichen - label_password_rule_uppercase: Großbuchstaben - label_path_encoding: Path encoding - label_per_page: 'Pro Seite:' - label_people: Personen - label_permissions: Berechtigungen - label_permissions_report: Berechtigungsübersicht - label_personalize_page: Diese Seite anpassen - label_placeholder_user: Platzhalter-Benutzer - label_placeholder_user_new: Neuer Platzhalter-Benutzer - label_placeholder_user_plural: Platzhalter-Benutzer - label_planning: Terminplanung - label_please_login: Anmelden - label_plugins: Plugins - label_portfolio_plural: Portfolios - label_modules_and_plugins: Module und Plugins - label_precedes: Vorgänger von - label_preferences: Präferenzen - label_preview: Vorschau - label_preview_not_available: Vorschau nicht verfügbar - label_previous: Zurück - label_previous_week: Woche zurück + label_not_contains: "enthält nicht" + label_not_equals: "ist nicht" + label_life_cycle_step_plural: "Projekt-Lebenszyklus" + label_on: "am" + label_operator_all: "ist nicht leer" + label_operator_none: "ist leer" + label_operator_equals_or: "ist (ODER)" + label_operator_equals_all: "ist (UND)" + label_operator_shared_with_user_any: "beliebig" + label_open: "Offen" + label_closed: "Geschlossen" + label_open_menu: "Menü öffnen" + label_open_work_packages: "Offen" + label_open_work_packages_plural: "offen" + label_openproject_website: "OpenProject Webseite" + label_optional_description: "Beschreibung" + label_options: "Optionen" + label_other: "Andere" + label_overall_activity: "Aktivität aller Projekte anzeigen" + label_overview: "Übersicht" + label_page_title: "Seitentitel" + label_part_of: "enthalten in" + label_password_lost: "Kennwort vergessen?" + label_password_rule_lowercase: "Kleinbuchstaben" + label_password_rule_numeric: "Ziffern" + label_password_rule_special: "Sonderzeichen" + label_password_rule_uppercase: "Großbuchstaben" + label_path_encoding: "Path encoding" + label_per_page: "Pro Seite:" + label_people: "Personen" + label_permissions: "Berechtigungen" + label_permissions_report: "Berechtigungsübersicht" + label_personalize_page: "Diese Seite anpassen" + label_placeholder_user: "Platzhalter-Benutzer" + label_placeholder_user_new: "Neuer Platzhalter-Benutzer" + label_placeholder_user_plural: "Platzhalter-Benutzer" + label_planning: "Terminplanung" + label_please_login: "Anmelden" + label_plugins: "Plugins" + label_portfolio_plural: "Portfolios" + label_modules_and_plugins: "Module und Plugins" + label_precedes: "Vorgänger von" + label_preferences: "Präferenzen" + label_preview: "Vorschau" + label_preview_not_available: "Vorschau nicht verfügbar" + label_previous: "Zurück" + label_previous_week: "Woche zurück" label_principal_invite_via_email: " oder Nutzer per E-Mail einladen" - label_principal_search: Vorhandene Benutzer / Gruppen hinzufügen - label_privacy_policy: Datenschutz- und Sicherheitsrichtlinien - label_product_version: Produktversion - label_profile: Profil + label_principal_search: "Vorhandene Benutzer / Gruppen hinzufügen" + label_privacy_policy: "Datenschutz- und Sicherheitsrichtlinien" + label_product_version: "Produktversion" + label_profile: "Profil" label_percent_complete: "% abgeschlossen" - label_progress_tracking: Fortschrittsverfolgung - label_project: Projekt - label_project_activity: Projektaktivität - label_project_attribute_plural: Projekt-Attribute - label_project_attribute_manage_link: Projektattribute verwalten - label_project_count: Gesamtzahl der Projekte - label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des - Projekts. - label_project_initiation_export_pdf: PDF-Export für %{project_creation_name} - label_project_latest: Neueste Projekte - label_project_default_type: Erlaube leere Typen - label_project_hierarchy: Projekthierarchie - label_project_mappings: Projekte - label_project_new: Neues Projekt - label_project_plural: Projekte - label_project_list_plural: Projektlisten - label_project_life_cycle: Projekt-Lebenszyklus - label_project_attributes_plural: Projektattribute - label_project_custom_field_plural: Projektattribute - label_project_settings: Projektkonfiguration - label_project_attributes_settings: Einstellungen für Projektattribute - label_project_storage_plural: Dateispeicher - label_project_storage_project_folder: 'Dateispeicher: Projektordner' - label_projects_disk_usage_information: "%{count} Projekte, die %{used_disk_space} - Speicherplatz belegen" - label_project_view_all: Alle Projekte anzeigen - label_project_show_details: Projektdetails anzeigen - label_project_hide_details: Projektdetails verstecken - label_portfolio: Portfolio - label_portfolio_new: Neues Portfolio - label_program: Programm - label_program_new: Neues Programm - label_public_projects: Öffentliche Projekte - label_query_new: Neuer Bericht - label_query_plural: Benutzerdefinierte Berichte - label_read: Lesen ... - label_read_documentation: Dokumentation lesen - label_register: Neues Konto erstellen - label_register_with_developer: Als Entwickler anmelden - label_registered_on: Angemeldet am - label_related_work_packages: Zugehörige Arbeitspakete - label_relates: Verwandt mit - label_relates_to: Verwandt mit - label_relation: Beziehung - label_relation_actions: Beziehungsaktionen - label_relation_delete: Beziehung löschen - label_relation_edit: Beziehung bearbeiten - label_relation_new: Neue Beziehung - label_release_notes: Release Notes - label_remaining_work: Verbleibender Aufwand - label_remove_column: Spalte entfernen - label_remove_columns: Ausgewählte Spalten entfernen - label_renamed: umbenannt - label_reply_plural: Antworten - label_report: Report - label_report_bug: Fehler melden - label_report_plural: Berichte - label_reported_work_packages: Gemeldete Arbeitspakete - label_reporting: Statusbericht - label_reporting_plural: Statusberichte - label_repository: Projektarchiv - label_repository_remove: Projektarchiv entfernen - label_repository_root: Stammverzeichnis des Projektarchivs - label_repository_plural: Projektarchive - label_request_submission: Einreichung des Antrags - label_required: benötigt von - label_requires: benötigt - label_result_plural: Ergebnisse - label_revision: Revision - label_revision_id: Revision %{value} - label_revision_plural: Revisionen - label_roadmap: Roadmap - label_roadmap_edit: Roadmap %{name} editieren - label_roadmap_due_in: Fällig in %{value} - label_roadmap_no_work_packages: Keine Arbeitspakete für diese Version + label_progress_tracking: "Fortschrittsverfolgung" + label_project: "Projekt" + label_project_activity: "Projektaktivität" + label_project_attribute_plural: "Projekt-Attribute" + label_project_attribute_manage_link: "Projektattribute verwalten" + label_project_count: "Gesamtzahl der Projekte" + label_project_copy_notifications: "Sende Mailbenachrichtigungen beim Kopieren des Projekts." + label_project_initiation_export_pdf: "PDF-Export für %{project_creation_name}" + label_project_latest: "Neueste Projekte" + label_project_default_type: "Erlaube leere Typen" + label_project_hierarchy: "Projekthierarchie" + label_project_mappings: "Projekte" + label_project_new: "Neues Projekt" + label_project_plural: "Projekte" + label_project_list_plural: "Projektlisten" + label_project_life_cycle: "Projekt-Lebenszyklus" + label_project_attributes_plural: "Projektattribute" + label_project_custom_field_plural: "Projektattribute" + label_project_settings: "Projektkonfiguration" + label_project_attributes_settings: "Einstellungen für Projektattribute" + label_project_storage_plural: "Dateispeicher" + label_project_storage_project_folder: "Dateispeicher: Projektordner" + label_projects_disk_usage_information: "%{count} Projekte, die %{used_disk_space} Speicherplatz belegen" + label_project_view_all: "Alle Projekte anzeigen" + label_project_show_details: "Projektdetails anzeigen" + label_project_hide_details: "Projektdetails verstecken" + label_portfolio: "Portfolio" + label_portfolio_new: "Neues Portfolio" + label_program: "Programm" + label_program_new: "Neues Programm" + label_public_projects: "Öffentliche Projekte" + label_query_new: "Neuer Bericht" + label_query_plural: "Benutzerdefinierte Berichte" + label_read: "Lesen ..." + label_read_documentation: "Dokumentation lesen" + label_register: "Neues Konto erstellen" + label_register_with_developer: "Als Entwickler anmelden" + label_registered_on: "Angemeldet am" + label_related_work_packages: "Zugehörige Arbeitspakete" + label_relates: "Verwandt mit" + label_relates_to: "Verwandt mit" + label_relation: "Beziehung" + label_relation_actions: "Beziehungsaktionen" + label_relation_delete: "Beziehung löschen" + label_relation_edit: "Beziehung bearbeiten" + label_relation_new: "Neue Beziehung" + label_release_notes: "Release Notes" + label_remaining_work: "Verbleibender Aufwand" + label_remove_column: "Spalte entfernen" + label_remove_columns: "Ausgewählte Spalten entfernen" + label_renamed: "umbenannt" + label_reply_plural: "Antworten" + label_report: "Report" + label_report_bug: "Fehler melden" + label_report_plural: "Berichte" + label_reported_work_packages: "Gemeldete Arbeitspakete" + label_reporting: "Statusbericht" + label_reporting_plural: "Statusberichte" + label_repository: "Projektarchiv" + label_repository_remove: "Projektarchiv entfernen" + label_repository_root: "Stammverzeichnis des Projektarchivs" + label_repository_plural: "Projektarchive" + label_request_submission: "Einreichung des Antrags" + label_required: "benötigt von" + label_requires: "benötigt" + label_result_plural: "Ergebnisse" + label_revision: "Revision" + label_revision_id: "Revision %{value}" + label_revision_plural: "Revisionen" + label_roadmap: "Roadmap" + label_roadmap_edit: "Roadmap %{name} editieren" + label_roadmap_due_in: "Fällig in %{value}" + label_roadmap_no_work_packages: "Keine Arbeitspakete für diese Version" label_roadmap_overdue: "%{value} verspätet" - label_role_and_permissions: Rollen und Rechte - label_role_new: Neue Rolle - label_role_grantable: Zuweisbare Rolle - label_role_plural: Rollen - label_role_search: Rolle für neue Mitglieder zuweisen - label_scm: Versionskontrollsystem - label_scroll_left: Nach links scrollen - label_scroll_right: Nach rechts scrollen - label_search: Suche - label_search_by_name: Nach Name suchen - label_send_information: Neue Anmeldeinformationen an den Benutzer senden - label_send_test_email: Test-E-Mail senden - label_session: Sitzung - label_setting_plural: Einstellungen - label_system_settings: Systemkonfiguration - label_show_completed_versions: Abgeschlossene Versionen anzeigen - label_columns: Spalten - label_sort: Sortierung - label_sort_ascending: Sortiere aufsteigend - label_sort_by: Sortiere nach %{value} - label_sorted_by: sortiert nach %{value} - label_sort_descending: Sortiere absteigend - label_sort_higher: Eins höher - label_sort_highest: An den Anfang - label_sort_lower: Eins tiefer - label_sort_lowest: Ans Ende - label_spent_time: Aufgewendete Zeit - label_start_to_end: Anfang bis Ende - label_start_to_start: Anfang bis Anfang - label_statistics: Statistiken - label_status: Status - label_storage_free_space: Verbleibender Speicherplatz - label_storage_used_space: Verwendeter Speicherplatz - label_storage_group: Speicher-Dateisystem %{identifier} - label_storage_for: Umfasst Speicher für - label_string: Text - label_subproject: Unterprojekt - label_subproject_new: Neues Unterprojekt - label_subproject_plural: Unterprojekte - label_subitems: Unterelemente - label_subtask_plural: Unteraufgaben - label_summary: Zusammenfassung - label_system: System - label_system_storage: Speicherinformation - label_table_of_contents: Inhaltsverzeichnis - label_tag: Markierung - label_team_planner: Teamplaner - label_template: Vorlage - label_templates: Vorlagen - label_text: Langer Text - label_this_month: aktueller Monat - label_this_week: aktuelle Woche - label_this_year: aktuelles Jahr - label_time: Zeit - label_time_entry_plural: Aufgewendete Zeit - label_time_entry_activity_plural: Zeitbuchung-Aktivität - label_title: Titel - label_projects_menu: Projekte - label_today: heute - label_token_version: Token-Version - label_today_as_start_date: Heute als Startdatum wählen. - label_today_as_due_date: Heute als Enddatum wählen. - label_today_as_date: Heute als Datum wählen. - label_top_menu: Hauptmenü - label_topic_plural: Themen - label_total: Gesamtzahl - label_type_new: Neuer Typ - label_type_plural: Typen - label_ui: Nutzeroberfläche - label_updated_time: Vor %{value} aktualisiert + label_role_and_permissions: "Rollen und Rechte" + label_role_new: "Neue Rolle" + label_role_grantable: "Zuweisbare Rolle" + label_role_plural: "Rollen" + label_role_search: "Rolle für neue Mitglieder zuweisen" + label_scm: "Versionskontrollsystem" + label_scroll_left: "Nach links scrollen" + label_scroll_right: "Nach rechts scrollen" + label_search: "Suche" + label_search_by_name: "Nach Name suchen" + label_send_information: "Neue Anmeldeinformationen an den Benutzer senden" + label_send_test_email: "Test-E-Mail senden" + label_session: "Sitzung" + label_setting_plural: "Einstellungen" + label_system_settings: "Systemkonfiguration" + label_show_completed_versions: "Abgeschlossene Versionen anzeigen" + label_columns: "Spalten" + label_sort: "Sortierung" + label_sort_ascending: "Sortiere aufsteigend" + label_sort_by: "Sortiere nach %{value}" + label_sorted_by: "sortiert nach %{value}" + label_sort_descending: "Sortiere absteigend" + label_sort_higher: "Eins höher" + label_sort_highest: "An den Anfang" + label_sort_lower: "Eins tiefer" + label_sort_lowest: "Ans Ende" + label_spent_time: "Aufgewendete Zeit" + label_start_to_end: "Anfang bis Ende" + label_start_to_start: "Anfang bis Anfang" + label_statistics: "Statistiken" + label_status: "Status" + label_storage_free_space: "Verbleibender Speicherplatz" + label_storage_used_space: "Verwendeter Speicherplatz" + label_storage_group: "Speicher-Dateisystem %{identifier}" + label_storage_for: "Umfasst Speicher für" + label_string: "Text" + label_subproject: "Unterprojekt" + label_subproject_new: "Neues Unterprojekt" + label_subproject_plural: "Unterprojekte" + label_subitems: "Unterelemente" + label_subtask_plural: "Unteraufgaben" + label_summary: "Zusammenfassung" + label_system: "System" + label_system_storage: "Speicherinformation" + label_table_of_contents: "Inhaltsverzeichnis" + label_tag: "Markierung" + label_team_planner: "Teamplaner" + label_template: "Vorlage" + label_templates: "Vorlagen" + label_text: "Langer Text" + label_this_month: "aktueller Monat" + label_this_week: "aktuelle Woche" + label_this_year: "aktuelles Jahr" + label_time: "Zeit" + label_time_entry_plural: "Aufgewendete Zeit" + label_time_entry_activity_plural: "Zeitbuchung-Aktivität" + label_title: "Titel" + label_projects_menu: "Projekte" + label_today: "heute" + label_token_version: "Token-Version" + label_today_as_start_date: "Heute als Startdatum wählen." + label_today_as_due_date: "Heute als Enddatum wählen." + label_today_as_date: "Heute als Datum wählen." + label_top_menu: "Hauptmenü" + label_topic_plural: "Themen" + label_total: "Gesamtzahl" + label_type_new: "Neuer Typ" + label_type_plural: "Typen" + label_ui: "Nutzeroberfläche" + label_updated_time: "Vor %{value} aktualisiert" label_updated_time_at: "%{author} %{age}" - label_updated_time_by: Von %{author} vor %{age} aktualisiert - label_upgrade_guides: Upgrade-Anleitungen - label_used_by: Benutzt von - label_used_by_types: Verwendet von Typen - label_used_in_projects: Verwendet in Projekten - label_user: Benutzer - label_user_and_permission: Benutzer und Berechtigungen - label_user_named: Benutzer %{name} - label_user_activity: Aktivität von %{value} - label_user_anonymous: Anonym - label_user_mail_option_all: Für alle Ereignisse in all meinen Projekten - label_user_mail_option_none: Für keine Ereignisse - label_user_mail_option_only_assigned: Nur für Aufgaben, für die ich zuständig bin. - label_user_mail_option_only_my_events: Nur für Aufgaben, die ich beobachte oder - an welchen ich mitarbeite - label_user_mail_option_only_owner: Nur für Aufgaben, die ich angelegt habe - label_user_mail_option_selected: Für alle Ereignisse in den ausgewählten Projekten - label_user_menu: Benutzermenü - label_user_new: Neuer Benutzer - label_user_plural: Benutzer - label_user_search: Nach Benutzer suchen - label_user_settings: Benutzereinstellungen - label_users_settings: Benutzereinstellungen - label_value_x: 'Wert: %{x}' - label_version_new: Neue Version - label_version_edit: Version bearbeiten - label_version_plural: Versionen - label_version_sharing_descendants: Mit Unterprojekten - label_version_sharing_hierarchy: Mit Projekthierarchie - label_version_sharing_none: Nicht gemeinsam verwenden - label_version_sharing_system: Mit allen Projekten - label_version_sharing_tree: Mit Projektbaum - label_videos: Videos - label_view_all_revisions: Alle Revisionen anzeigen - label_view_diff: Unterschiede anzeigen - label_view_revisions: Revisionen anzeigen - label_watched_work_packages: Beobachtete Arbeitspakete - label_what_is_this: Was ist das? - label_week: Woche - label_widget: Widget - label_widget_new: Neues Widget - label_wiki_content_added: Die Wiki-Seite wurde erfolgreich hinzugefügt. - label_wiki_content_updated: Die Wiki-Seite wurde erfolgreich aktualisiert. - label_wiki_toc: Inhaltsverzeichnis - label_wiki_toc_empty: Inhaltsverzeichnis ist leer, da keine Überschriften vorhanden - sind. - label_wiki_dont_show_menu_item: Wikiseite nicht in der Projektnavigation anzeigen - label_wiki_edit: Wiki-Bearbeitung - label_wiki_edit_plural: Wiki-Bearbeitungen - label_wiki_page_attachments: Anhänge der Wiki-Seite - label_wiki_page_id: ID der Wikiseite - label_wiki_navigation: Wiki-Navigation - label_wiki_page: Wiki-Seite - label_wiki_page_plural: Wiki-Seiten + label_updated_time_by: "Von %{author} vor %{age} aktualisiert" + label_upgrade_guides: "Upgrade-Anleitungen" + label_used_by: "Benutzt von" + label_used_by_types: "Verwendet von Typen" + label_used_in_projects: "Verwendet in Projekten" + label_user: "Benutzer" + label_user_and_permission: "Benutzer und Berechtigungen" + label_user_named: "Benutzer %{name}" + label_user_activity: "Aktivität von %{value}" + label_user_anonymous: "Anonym" + label_user_mail_option_all: "Für alle Ereignisse in all meinen Projekten" + label_user_mail_option_none: "Für keine Ereignisse" + label_user_mail_option_only_assigned: "Nur für Aufgaben, für die ich zuständig bin." + label_user_mail_option_only_my_events: "Nur für Aufgaben, die ich beobachte oder an welchen ich mitarbeite" + label_user_mail_option_only_owner: "Nur für Aufgaben, die ich angelegt habe" + label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten" + label_user_menu: "Benutzermenü" + label_user_new: "Neuer Benutzer" + label_user_plural: "Benutzer" + label_user_search: "Nach Benutzer suchen" + label_user_settings: "Benutzereinstellungen" + label_users_settings: "Benutzereinstellungen" + label_value_x: "Wert: %{x}" + label_version_new: "Neue Version" + label_version_edit: "Version bearbeiten" + label_version_plural: "Versionen" + label_version_sharing_descendants: "Mit Unterprojekten" + label_version_sharing_hierarchy: "Mit Projekthierarchie" + label_version_sharing_none: "Nicht gemeinsam verwenden" + label_version_sharing_system: "Mit allen Projekten" + label_version_sharing_tree: "Mit Projektbaum" + label_videos: "Videos" + label_view_all_revisions: "Alle Revisionen anzeigen" + label_view_diff: "Unterschiede anzeigen" + label_view_revisions: "Revisionen anzeigen" + label_watched_work_packages: "Beobachtete Arbeitspakete" + label_what_is_this: "Was ist das?" + label_week: "Woche" + label_widget: "Widget" + label_widget_new: "Neues Widget" + label_wiki_content_added: "Die Wiki-Seite wurde erfolgreich hinzugefügt." + label_wiki_content_updated: "Die Wiki-Seite wurde erfolgreich aktualisiert." + label_wiki_toc: "Inhaltsverzeichnis" + label_wiki_toc_empty: "Inhaltsverzeichnis ist leer, da keine Überschriften vorhanden sind." + label_wiki_dont_show_menu_item: "Wikiseite nicht in der Projektnavigation anzeigen" + label_wiki_edit: "Wiki-Bearbeitung" + label_wiki_edit_plural: "Wiki-Bearbeitungen" + label_wiki_page_attachments: "Anhänge der Wiki-Seite" + label_wiki_page_id: "ID der Wikiseite" + label_wiki_navigation: "Wiki-Navigation" + label_wiki_page: "Wiki-Seite" + label_wiki_page_plural: "Wiki-Seiten" label_wiki_show_index_page_link: "'Inhaltsverzeichnis' Link als Untermenüpunkt anzeigen" - label_wiki_show_menu_item: als Menüpunkt in der Projektnavigation anzeigen - label_wiki_show_new_page_link: "'Neue Unterseite anlegen' Link als Untermenüpunkt - anzeigen" - label_wiki_show_submenu_item: 'als Untermenüpunkt anzeigen von ' - label_wiki_start: Hauptseite - label_work: Aufwand - label_work_package: Arbeitspaket - label_work_package_attachments: Anhänge des Arbeitspakets - label_work_package_category_new: Neue Kategorie - label_work_package_category_plural: Arbeitspaket-Kategorien - label_work_package_comments: Arbeitspaket-Kommentare - label_work_package_hierarchy: Arbeitspakethierarchie - label_work_package_new: Neues Arbeitspaket - label_work_package_edit: Arbeitspaket %{name} editieren - label_work_package_plural: Arbeitspakete - label_work_package_status: Arbeitspaket-Status - label_work_package_status_new: Neuer Status - label_work_package_status_plural: Arbeitspaket-Status - label_work_package_types: Arbeitspaket-Typen - label_work_package_tracking: Arbeitspakete-Verfolgung - label_work_package_view_all: Alle Arbeitspakete anzeigen - label_workflow: Workflow - label_workflow_copy: Arbeitsablauf kopieren - label_workflow_plural: Workflows - label_workflow_summary: Zusammenfassung - label_working_days_and_hours: Arbeitstage und -stunden + label_wiki_show_menu_item: "als Menüpunkt in der Projektnavigation anzeigen" + label_wiki_show_new_page_link: "'Neue Unterseite anlegen' Link als Untermenüpunkt anzeigen" + label_wiki_show_submenu_item: "als Untermenüpunkt anzeigen von " + label_wiki_start: "Hauptseite" + label_work: "Aufwand" + label_work_package: "Arbeitspaket" + label_work_package_attachments: "Anhänge des Arbeitspakets" + label_work_package_category_new: "Neue Kategorie" + label_work_package_category_plural: "Arbeitspaket-Kategorien" + label_work_package_comments: "Arbeitspaket-Kommentare" + label_work_package_hierarchy: "Arbeitspakethierarchie" + label_work_package_new: "Neues Arbeitspaket" + label_work_package_edit: "Arbeitspaket %{name} editieren" + label_work_package_plural: "Arbeitspakete" + label_work_package_status: "Arbeitspaket-Status" + label_work_package_status_new: "Neuer Status" + label_work_package_status_plural: "Arbeitspaket-Status" + label_work_package_types: "Arbeitspaket-Typen" + label_work_package_tracking: "Arbeitspakete-Verfolgung" + label_work_package_view_all: "Alle Arbeitspakete anzeigen" + label_workflow: "Workflow" + label_workflow_copy: "Arbeitsablauf kopieren" + label_workflow_plural: "Workflows" + label_workflow_summary: "Zusammenfassung" + label_working_days_and_hours: "Arbeitstage und -stunden" label_x_closed_work_packages_abbr: - one: 1 geschlossen + one: "1 geschlossen" other: "%{count} geschlossen" - zero: keine geschlossen + zero: "keine geschlossen" label_x_comments: - one: Ein Kommentar + one: "Ein Kommentar" other: "%{count} Kommentare" - zero: Keine Kommentare + zero: "Keine Kommentare" label_x_open_work_packages_abbr: - one: 1 offen + one: "1 offen" other: "%{count} offen" - zero: Keine offenen + zero: "Keine offenen" label_x_work_packages: - one: 1 Arbeitspaket + one: "1 Arbeitspaket" other: "%{count} Arbeitspakete" - zero: Keine Arbeitspakete + zero: "Keine Arbeitspakete" label_x_projects: - one: Ein Projekt + one: "Ein Projekt" other: "%{count} Projekte" - zero: Keine Projekte + zero: "Keine Projekte" label_x_files: - one: 1 Datei + one: "1 Datei" other: "%{count} Dateien" - zero: keine Dateien - label_yesterday: gestern - label_zen_mode: Zen-Modus - label_role_type: Typ - label_member_role: Projektrolle - label_global_role: Globale Rolle + zero: "keine Dateien" + label_yesterday: "gestern" + label_zen_mode: "Zen-Modus" + label_role_type: "Typ" + label_member_role: "Projektrolle" + label_global_role: "Globale Rolle" label_not_changeable: "(nicht veränderbar)" - label_global: Global - label_seeded_from_env_warning: Dieser Datensatz wurde durch eine Umgebungsvariable - Konfiguration erstellt. Er kann nicht über die Benutzeroberfläche bearbeitet werden. - macro_execution_error: Fehler beim Ausführen des Makros %{macro_name} - macro_unavailable: Das Makro %{macro_name} kann nicht angezeigt werden. + label_global: "Global" + label_seeded_from_env_warning: Dieser Datensatz wurde durch eine Umgebungsvariable Konfiguration erstellt. Er kann nicht über die Benutzeroberfläche bearbeitet werden. + macro_execution_error: "Fehler beim Ausführen des Makros %{macro_name}" + macro_unavailable: "Das Makro %{macro_name} kann nicht angezeigt werden." macros: placeholder: "[Placeholder] Makro %{macro_name}" errors: - missing_or_invalid_parameter: Fehlende oder ungültige Makro-Parameter. + missing_or_invalid_parameter: "Fehlende oder ungültige Makro-Parameter." legacy_warning: - timeline: Das alte Timeline-Makro wurde entfernt und steht nicht mehr zur Verfügung. - Verwenden Sie stattdessen das eingebettete Arbeitspaket-Tabellen-Makro, um - eine Gantt Ansicht zu erzeugen. + timeline: "Das alte Timeline-Makro wurde entfernt und steht nicht mehr zur Verfügung. Verwenden Sie stattdessen das eingebettete Arbeitspaket-Tabellen-Makro, um eine Gantt Ansicht zu erzeugen." include_wiki_page: - removed: Das Makro existiert nicht mehr. + removed: "Das Makro existiert nicht mehr." wiki_child_pages: errors: - page_not_found: Die Wiki-Seite '%{name}' konnte nicht gefunden werden. + page_not_found: "Die Wiki-Seite '%{name}' konnte nicht gefunden werden." create_work_package_link: errors: - no_project_context: Rufe create_work_link Makro aus externen Projekt auf. - invalid_type: Es konnte kein Typ namens '%{type}' im Projekt '%{project}' - gefunden werden. - link_name: Neues Arbeitspaket - link_name_type: Neu %{type_name} + no_project_context: "Rufe create_work_link Makro aus externen Projekt auf." + invalid_type: "Es konnte kein Typ namens '%{type}' im Projekt '%{project}' gefunden werden." + link_name: "Neues Arbeitspaket" + link_name_type: "Neu %{type_name}" mail: - actions: Aktionen + actions: "Aktionen" digests: - including_mention_singular: mit einer Erwähnung - including_mention_plural: einschließlich %{number_mentioned} Erwähnungen - unread_notification_singular: 1 ungelesene Benachrichtigung + including_mention_singular: "mit einer Erwähnung" + including_mention_plural: "einschließlich %{number_mentioned} Erwähnungen" + unread_notification_singular: "1 ungelesene Benachrichtigung" unread_notification_plural: "%{number_unread} ungelesene Benachrichtigungen" - you_have: Sie haben - logo_alt_text: Logo + you_have: "Sie haben" + logo_alt_text: "Logo" mention: subject: "%{user_name} erwähnte Sie in #%{id} - %{subject}" notification: - center: Zur Benachrichtigungszentrale - see_in_center: Kommentar in Benachrichtigungszentrale öffnen - settings: E-Mail-Einstellungen ändern - salutation: Hallo %{user} - salutation_full_name: Vollständiger Name + center: "Zur Benachrichtigungszentrale" + see_in_center: "Kommentar in Benachrichtigungszentrale öffnen" + settings: "E-Mail-Einstellungen ändern" + salutation: "Hallo %{user}" + salutation_full_name: "Vollständiger Name" work_packages: - created_at: 'Erstellt %{timestamp} von %{user} ' - login_to_see_all: Melden Sie sich an, um alle Benachrichtigungen zu sehen. - mentioned: Sie wurden in einem Kommentar erwähnt + created_at: "Erstellt %{timestamp} von %{user} " + login_to_see_all: "Melden Sie sich an, um alle Benachrichtigungen zu sehen." + mentioned: "Sie wurden in einem Kommentar erwähnt" mentioned_by: "%{user} hat Sie in einem Kommentar erwähnt" more_to_see: - one: Es gibt ein weiteres Arbeitspaket mit Benachrichtigungen. - other: Es gibt %{count} weitere Arbeitspakete mit Benachrichtigungen. - open_in_browser: Im Browser öffnen + one: "Es gibt ein weiteres Arbeitspaket mit Benachrichtigungen." + other: "Es gibt %{count} weitere Arbeitspakete mit Benachrichtigungen." + open_in_browser: "Im Browser öffnen" reason: - watched: Beobachtet - assigned: Zugewiesen - responsible: Verantwortlich - mentioned: Erwähnt - shared: Geteilt - subscribed: alle - prefix: 'Erhalten aufgrund Benachrichtigungseinstellung: %{reason}' - date_alert_start_date: Datums-Erinnerung - date_alert_due_date: Datums-Erinnerung - reminder: Erinnerung - see_all: Alle anzeigen - updated_at: 'Aktualisiert %{timestamp} von %{user} ' + watched: "Beobachtet" + assigned: "Zugewiesen" + responsible: "Verantwortlich" + mentioned: "Erwähnt" + shared: "Geteilt" + subscribed: "alle" + prefix: "Erhalten aufgrund Benachrichtigungseinstellung: %{reason}" + date_alert_start_date: "Datums-Erinnerung" + date_alert_due_date: "Datums-Erinnerung" + reminder: "Erinnerung" + see_all: "Alle anzeigen" + updated_at: "Aktualisiert %{timestamp} von %{user} " reminder_notifications: - subject: 'Erinnerung: %{note}' - heading: Sie haben eine neue Erinnerung - note: 'Anmerkung: „%{note}“' + subject: "Erinnerung: %{note}" + heading: "Sie haben eine neue Erinnerung" + note: "Anmerkung: „%{note}“" sharing: work_packages: - allowed_actions: 'Sie haben auf diesem Arbeitspakte folgende Berechtigungen: - %{allowed_actions}. Dies kann sich je nach Ihrer Projektrolle und Berechtigungen - ändern.' - create_account: Um auf dieses Arbeitspaket zuzugreifen, müssen Sie ein Konto - für %{instance} erstellen und aktivieren. - open_work_package: Arbeitspaket öffnen - subject: 'Arbeitspaket #%{id} wurde mit Ihnen geteilt' - enterprise_text: Teilen Sie Arbeitspakete mit Benutzern, die nicht Mitglieder - des Projekts sind. + allowed_actions: "Sie haben auf diesem Arbeitspakte folgende Berechtigungen: %{allowed_actions}. Dies kann sich je nach Ihrer Projektrolle und Berechtigungen ändern." + create_account: "Um auf dieses Arbeitspaket zuzugreifen, müssen Sie ein Konto für %{instance} erstellen und aktivieren." + open_work_package: "Arbeitspaket öffnen" + subject: "Arbeitspaket #%{id} wurde mit Ihnen geteilt" + enterprise_text: "Teilen Sie Arbeitspakete mit Benutzern, die nicht Mitglieder des Projekts sind." summary: user: "%{user} hat Ihnen ein Arbeitspaket mit %{role_rights} Rechten geteilt" - group: "%{user} hat ein Arbeitspaket mit der Gruppe %{group} geteilt, in - der Sie Mitglied sind" + group: "%{user} hat ein Arbeitspaket mit der Gruppe %{group} geteilt, in der Sie Mitglied sind" storages: health: plaintext: - storage: Speicherung + storage: "Speicherung" healthy: - summary: Gute Nachrichten! Der Status Ihres Speichers, %{storage_name}, - wird derzeit als „Gesund“ angezeigt. - error-solved-on: Gelöst am - recommendation: Wir werden das System weiterhin überwachen, um sicherzustellen, - dass es in gutem Zustand bleibt. Im Falle von Unstimmigkeiten werden - wir Sie benachrichtigen. - details: Für weitere Einzelheiten oder um notwendige Änderungen vorzunehmen, - können Sie Ihre Speicherkonfiguration aufrufen + summary: 'Gute Nachrichten! Der Status Ihres Speichers, %{storage_name}, wird derzeit als „Gesund“ angezeigt.' + error-solved-on: "Gelöst am" + recommendation: "Wir werden das System weiterhin überwachen, um sicherzustellen, dass es in gutem Zustand bleibt. Im Falle von Unstimmigkeiten werden wir Sie benachrichtigen." + details: "Für weitere Einzelheiten oder um notwendige Änderungen vorzunehmen, können Sie Ihre Speicherkonfiguration aufrufen" unhealthy: - summary: Der Status Ihres Speichers, %{storage_name}, wird derzeit als - „Fehler“ angezeigt. Wir haben ein Problem festgestellt, das möglicherweise - Ihre Aufmerksamkeit erfordert. - error-details: Fehlerdetails - error-message: Fehlermeldung - error-occurred-on: Aufgetreten am - recommendation: Wir empfehlen, die Speicherkonfigurationsseite aufzurufen, - um dieses Problem zu lösen - unsubscribe: Wenn Sie diese Benachrichtigungen nicht mehr erhalten möchten, - können Sie sie jederzeit abbestellen. Um sich abzumelden, folgen Sie - bitte den Anweisungen auf dieser Seite - email_notification_settings: Einstellungen für E-Mail-Benachrichtigungen zur - Speicherung - see_storage_settings: Siehe Speicherungseinstellungen + summary: 'Der Status Ihres Speichers, %{storage_name}, wird derzeit als „Fehler“ angezeigt. Wir haben ein Problem festgestellt, das möglicherweise Ihre Aufmerksamkeit erfordert.' + error-details: "Fehlerdetails" + error-message: "Fehlermeldung" + error-occurred-on: "Aufgetreten am" + recommendation: "Wir empfehlen, die Speicherkonfigurationsseite aufzurufen, um dieses Problem zu lösen" + unsubscribe: "Wenn Sie diese Benachrichtigungen nicht mehr erhalten möchten, können Sie sie jederzeit abbestellen. Um sich abzumelden, folgen Sie bitte den Anweisungen auf dieser Seite" + email_notification_settings: "Einstellungen für E-Mail-Benachrichtigungen zur Speicherung" + see_storage_settings: "Siehe Speicherungseinstellungen" healthy: - subject: Der Speicher „%{name}“ ist jetzt gesund! - solved_at: gelöst am - summary: Das Problem mit Ihrer %{storage_name}-Speicherintegration ist nun - gelöst + subject: 'Der Speicher „%{name}“ ist jetzt gesund!' + solved_at: "gelöst am" + summary: "Das Problem mit Ihrer %{storage_name}-Speicherintegration ist nun gelöst" unhealthy: - subject: Der Speicher „%{name}“ ist ungesund! - since: seit - summary: Es gibt ein Problem mit Ihrer %{storage_name}-Speicherintegration + subject: 'Der Speicher „%{name}“ ist ungesund!' + since: "seit" + summary: "Es gibt ein Problem mit Ihrer %{storage_name}-Speicherintegration" troubleshooting: - text: Weitere Informationen finden Sie unter Dateispeicher - link_text: Dokumentation zur Fehlersuche - mail_body_account_activation_request: 'Ein neuer Benutzer (%{value}) hat sich registriert. - Sein Konto wartet auf Ihre Genehmigung:' - mail_body_account_information: Ihre Konto-Informationen - mail_body_account_information_external: Sie können sich mit Ihrem Konto %{value} - anmelden. - mail_body_backup_ready: 'Ihr gewünschtes Backup ist bereit. Sie können es hier herunterladen:' - mail_body_backup_token_reset_admin_info: Der Backup-Token für Benutzer '%{user}' - wurde zurückgesetzt. + text: "Weitere Informationen finden Sie unter Dateispeicher" + link_text: "Dokumentation zur Fehlersuche" + mail_body_account_activation_request: "Ein neuer Benutzer (%{value}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:" + mail_body_account_information: "Ihre Konto-Informationen" + mail_body_account_information_external: "Sie können sich mit Ihrem Konto %{value} anmelden." + mail_body_backup_ready: "Ihr gewünschtes Backup ist bereit. Sie können es hier herunterladen:" + mail_body_backup_token_reset_admin_info: Der Backup-Token für Benutzer '%{user}' wurde zurückgesetzt. mail_body_backup_token_reset_user_info: Ihr Backup-Token wurde zurückgesetzt. mail_body_backup_token_info: Der vorherige Token ist nicht mehr gültig. mail_body_backup_waiting_period: Der neue Token wird in %{hours} Stunden aktiviert. - mail_body_backup_token_warning: Wenn Sie dies nicht waren, melden Sie sich sofort - bei OpenProject an und setzen Sie es erneut zurück. - mail_body_incoming_email_error: Die E-Mail, die Sie an OpenProject gesendet haben, - konnte nicht verarbeitet werden. - mail_body_incoming_email_error_in_reply_to: Am %{received_at} schrieb %{from_email} - mail_body_incoming_email_error_logs: Logs - mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:' + mail_body_backup_token_warning: Wenn Sie dies nicht waren, melden Sie sich sofort bei OpenProject an und setzen Sie es erneut zurück. + mail_body_incoming_email_error: Die E-Mail, die Sie an OpenProject gesendet haben, konnte nicht verarbeitet werden. + mail_body_incoming_email_error_in_reply_to: "Am %{received_at} schrieb %{from_email}" + mail_body_incoming_email_error_logs: "Logs" + mail_body_lost_password: "Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:" mail_password_change_not_possible: - title: Passwortänderung nicht möglich - body: Ihr Konto bei %{app_title} ist mit einem externen Authentifizierungsanbieter - (%{name}) verbunden. - subtext: Passwörter für externe Konten können in der Anwendung nicht geändert - werden. Bitte verwenden Sie die Passwort-verloren-Funktion Ihres Authentifizierungsanbieters. - mail_body_register: 'Willkommen zu %{app_title}. Bitte aktivieren Sie Ihr Konto, - indem Sie auf diesen Link klicken:' - mail_body_register_header_title: Einladung als Projektmitglied - mail_body_register_user: Hallo %{name}, + title: "Passwortänderung nicht möglich" + body: "Ihr Konto bei %{app_title} ist mit einem externen Authentifizierungsanbieter (%{name}) verbunden." + subtext: "Passwörter für externe Konten können in der Anwendung nicht geändert werden. Bitte verwenden Sie die Passwort-verloren-Funktion Ihres Authentifizierungsanbieters." + mail_body_register: "Willkommen zu %{app_title}. Bitte aktivieren Sie Ihr Konto, indem Sie auf diesen Link klicken:" + mail_body_register_header_title: "Einladung als Projektmitglied" + mail_body_register_user: "Hallo %{name}," mail_body_register_links_html: | Bitte besuchen Sie unseren YouTube-Kanal (%{youtube_link}), in dem wir Webinare (%{webinar_link}) und "Erste-Schritte"-Videos (%{get_started_link}) bereitstellen, um Ihre ersten Schritte in OpenProject so einfach wie möglich zu machen.
Wenn Sie weitere Fragen haben, finden Sie Hilfe in unserer Dokumentation (%{documentation_link}) oder kontaktieren Sie Ihren Administrator. - mail_body_register_closing: Ihr OpenProject Team - mail_body_register_ending: Wir freuen uns auf Ihre Rückmeldung! Herzlichen Dank, - mail_body_reminder: "%{count} Arbeitspakete, die Ihnen zugewiesen sind, müssen in - den nächsten %{days} Tagen abgegeben werden:" - mail_body_group_reminder: '%{count} Arbeitspaket(e), die der Gruppe "%{group}" zugewiesen - sind, müssen in den nächsten %{days} Tagen abgegeben werden:' - mail_body_wiki_page_added: Die Wiki-Seite '%{id}' wurde von %{author} hinzugefügt. - mail_body_wiki_page_updated: Die Wiki-Seite '%{id}' wurde von %{author} aktualisiert. - mail_subject_account_activation_request: Antrag auf %{value} Kontoaktivierung - mail_subject_backup_ready: Ihr Backup steht bereit - mail_subject_backup_token_reset: Backup-Token zurücksetzen - mail_subject_incoming_email_error: Eine E-Mail, die Sie an OpenProject gesendet - haben, konnte nicht verarbeitet werden - mail_subject_lost_password: Ihr %{value} Kennwort - mail_subject_register: Ihre %{value} Kontoaktivierung - mail_subject_wiki_content_added: Wiki-Seite '%{id}' hinzugefügt - mail_subject_wiki_content_updated: Wiki-Seite '%{id}' erfolgreich aktualisiert + mail_body_register_closing: "Ihr OpenProject Team" + mail_body_register_ending: "Wir freuen uns auf Ihre Rückmeldung! Herzlichen Dank," + mail_body_reminder: "%{count} Arbeitspakete, die Ihnen zugewiesen sind, müssen in den nächsten %{days} Tagen abgegeben werden:" + mail_body_group_reminder: '%{count} Arbeitspaket(e), die der Gruppe "%{group}" zugewiesen sind, müssen in den nächsten %{days} Tagen abgegeben werden:' + mail_body_wiki_page_added: "Die Wiki-Seite '%{id}' wurde von %{author} hinzugefügt." + mail_body_wiki_page_updated: "Die Wiki-Seite '%{id}' wurde von %{author} aktualisiert." + mail_subject_account_activation_request: "Antrag auf %{value} Kontoaktivierung" + mail_subject_backup_ready: "Ihr Backup steht bereit" + mail_subject_backup_token_reset: "Backup-Token zurücksetzen" + mail_subject_incoming_email_error: "Eine E-Mail, die Sie an OpenProject gesendet haben, konnte nicht verarbeitet werden" + mail_subject_lost_password: "Ihr %{value} Kennwort" + mail_subject_register: "Ihre %{value} Kontoaktivierung" + mail_subject_wiki_content_added: "Wiki-Seite '%{id}' hinzugefügt" + mail_subject_wiki_content_updated: "Wiki-Seite '%{id}' erfolgreich aktualisiert" mail_member_added_project: subject: "%{project} - Sie wurden als Mitglied hinzugefügt" body: added_by: without_message: "%{user} hat Sie als Mitglied zum Projekt '%{project} ' hinzugefügt." with_message: "%{user} hat Sie als Mitglied zum Projekt '%{project} ' hinzugefügt." - roles: 'Sie haben folgende Rollen:' + roles: "Sie haben folgende Rollen:" mail_member_updated_project: subject: "%{project} - Ihre Rollen wurden aktualisiert" body: updated_by: - without_message: "%{user} aktualisierte die Rollen, die Sie im Projekt '%{project} - ' haben." - with_message: "%{user} aktualisierte die Rollen, die Sie im Projekt '%{project} - ' haben." - roles: 'Sie haben jetzt folgende Rollen:' + without_message: "%{user} aktualisierte die Rollen, die Sie im Projekt '%{project} ' haben." + with_message: "%{user} aktualisierte die Rollen, die Sie im Projekt '%{project} ' haben." + roles: "Sie haben jetzt folgende Rollen:" mail_member_updated_global: - subject: Ihre globalen Berechtigungen wurden aktualisiert + subject: "Ihre globalen Berechtigungen wurden aktualisiert" body: updated_by: without_message: "%{user} aktualisierte die Rollen, die Sie global haben." with_message: "%{user} aktualisierte die Rollen, die Sie global haben." - roles: 'Sie haben jetzt folgende Rollen:' + roles: "Sie haben jetzt folgende Rollen:" mail_user_activation_limit_reached: subject: Nutzer aktivierungs Limit erreicht message: | Ein neuer Nutzer (%{email}) versuchte einen Account auf dem von ihnen Verwalteten OpenProject System (%{host}) zu erstellen. Der Nutzer kann seinen Account aufgrund des Nutzer Limits nicht aktivieren. steps: - label: 'Folgendes kannst du tuen um dem Nutzer das einloggen zu ermöglichen: ' - a: Upgraden Sie Ihren Zahlungsplan ([here](upgrade_url)) - b: Sprerren oder löschen eines bestehenden Nutzers ([here](users_url)) - more_actions: Weitere Funktionen - noscript_description: Sie müssen JavaScript aktiveren, um OpenProject nutzen zu - können! - noscript_heading: JavaScript deaktiviert - noscript_learn_more: Weitere Informationen - notice_accessibility_mode: Die für die barrierefreie Nutzung optimierte Oberfläche - kann in Ihren [Kontoeinstellungen](url) aktiviert werden. - notice_account_activated: Ihr Konto ist aktiviert. Sie können sich jetzt anmelden. + label: "Folgendes kannst du tuen um dem Nutzer das einloggen zu ermöglichen: " + a: "Upgraden Sie Ihren Zahlungsplan ([here](upgrade_url))" #here turned into a link + b: "Sprerren oder löschen eines bestehenden Nutzers ([here](users_url))" #here turned into a link + more_actions: "Weitere Funktionen" + noscript_description: "Sie müssen JavaScript aktiveren, um OpenProject nutzen zu können!" + noscript_heading: "JavaScript deaktiviert" + noscript_learn_more: "Weitere Informationen" + notice_accessibility_mode: Die für die barrierefreie Nutzung optimierte Oberfläche kann in Ihren [Kontoeinstellungen](url) aktiviert werden. + notice_account_activated: "Ihr Konto ist aktiviert. Sie können sich jetzt anmelden." notice_account_already_activated: Dieses Benutzerkonto wurde bereits aktiviert. notice_account_invalid_token: Ungültiger Aktivierungs-Token - notice_account_invalid_credentials: Benutzer oder Kennwort ist ungültig. - notice_account_invalid_credentials_or_blocked: Benutzer oder Kennwort ist ungültig - oder der Account wurde wegen mehrfacher Falscheingabe temporär gesperrt, in diesem - Fall wird er in Kürze automatisch wieder freigeschaltet. - notice_account_lost_email_sent: Eine E-Mail mit Anweisungen, wie ein neues Kennwort - gewählt wird, wurde Ihnen zugeschickt. - notice_account_new_password_forced: Ein neues Passwort muss gesetzt werden. - notice_account_password_expired: Ihr Passwort ist nach %{days} Tagen abgelaufen. - Bitte setzen Sie ein neues. - notice_account_password_updated: Kennwort wurde erfolgreich aktualisiert. - notice_account_pending: Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung - durch den Administrator. - notice_account_register_done: Konto wurde erfolgreich angelegt. Zur Aktivierung - folgen Sie dem Link, der Ihnen per E-Mail zugeschickt wurde. - notice_account_unknown_email: Unbekannter Benutzer. - notice_account_update_failed: Konto konnte nicht aktualisiert werden. Bitte besuchen - Sie ihre Profilseite und überprüfen Sie die Einstellungen. - notice_account_updated: Konto wurde erfolgreich aktualisiert. - notice_account_other_session_expired: Alle anderen Sitzungen, die mit Ihrem Konto - verbunden sind, wurden beendet. - notice_account_wrong_password: Falsches Kennwort. - notice_account_registered_and_logged_in: Willkommen, ihr Benutzerkonto wurde aktiviert. - Sie sind nun angemeldet. + notice_account_invalid_credentials: "Benutzer oder Kennwort ist ungültig." + notice_account_invalid_credentials_or_blocked: "Benutzer oder Kennwort ist ungültig oder der Account wurde wegen mehrfacher Falscheingabe temporär gesperrt, in diesem Fall wird er in Kürze automatisch wieder freigeschaltet." + notice_account_lost_email_sent: "Eine E-Mail mit Anweisungen, wie ein neues Kennwort gewählt wird, wurde Ihnen zugeschickt." + notice_account_new_password_forced: "Ein neues Passwort muss gesetzt werden." + notice_account_password_expired: "Ihr Passwort ist nach %{days} Tagen abgelaufen. Bitte setzen Sie ein neues." + notice_account_password_updated: "Kennwort wurde erfolgreich aktualisiert." + notice_account_pending: "Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung durch den Administrator." + notice_account_register_done: "Konto wurde erfolgreich angelegt. Zur Aktivierung folgen Sie dem Link, der Ihnen per E-Mail zugeschickt wurde." + notice_account_unknown_email: "Unbekannter Benutzer." + notice_account_update_failed: "Konto konnte nicht aktualisiert werden. Bitte besuchen Sie ihre Profilseite und überprüfen Sie die Einstellungen." + notice_account_updated: "Konto wurde erfolgreich aktualisiert." + notice_account_other_session_expired: "Alle anderen Sitzungen, die mit Ihrem Konto verbunden sind, wurden beendet." + notice_account_wrong_password: "Falsches Kennwort." + notice_account_registered_and_logged_in: "Willkommen, ihr Benutzerkonto wurde aktiviert. Sie sind nun angemeldet." notice_activation_failed: Das Konto konnte nicht aktiviert werden. - notice_auth_stage_verification_error: Konnte Stufe "%{stage}" nicht verifizieren. - notice_auth_stage_wrong_stage: Erwartet Authentifizierungs-Stufe "%{expected}" zu - beenden, aber "%{actual}" zurückgegeben. - notice_auth_stage_error: Authentifizierungs-Stufe "%{stage}" gescheitert. - notice_can_t_change_password: Dieses Konto verwendet eine externe Authentifizierungs-Quelle; - das Kennwort kann nicht geändert werden. - notice_custom_options_deleted: Option "%{option_value}" und ihre %{num_deleted} - Vorkommen wurden gelöscht. - notice_email_error: Beim Senden einer E-Mail ist ein Fehler aufgetreten (%{value}). - notice_email_sent: Eine E-Mail wurde an %{value} gesendet. - notice_failed_to_save_work_packages: "%{count} von %{total} ausgewählten Arbeitspaketen - konnte(n) nicht gespeichert werden: %{ids}." - notice_failed_to_save_members: 'Benutzer konnte(n) nicht gespeichert werden: %{errors}.' - notice_deletion_scheduled: Die Löschung wurde geplant und wird asynchron durchgeführt. - notice_file_not_found: Die von Ihnen aufgerufene Seite existiert nicht oder ist - verschoben worden. - notice_forced_logout: Nach %{ttl_time} Minuten Inaktivität wurden Sie automatisch - ausgeloggt. - notice_internal_server_error: Auf der von Ihnen aufgerufenen Seite ist ein Fehler - aufgetreten. Kontaktieren Sie bitte Ihren %{app_title} Administrator, wenn Sie - wiederholt Probleme mit dem Aufrufen der Seite haben. - notice_locking_conflict: Die Informationen wurde zwischenzeitlich von einem anderen - Benutzer geändert. - notice_locking_conflict_additional_information: Die Änderung(en) wurde(n) durchgeführt - von %{users}. - notice_locking_conflict_reload_page: Bitte laden Sie die Seite neu, prüfen Sie die - Anpassungen und geben Sie Ihre Änderungen noch einmal ein. - notice_locking_conflict_warning: Diese Seite wurde von jemand anderem aktualisiert. - Um Ihre Änderungen nicht zu verlieren, kopieren Sie sie lokal und laden Sie sie - erneut, um die aktualisierte Version anzuzeigen. - notice_locking_conflict_danger: Ihre Änderungen konnten wegen in Konflikt stehender - Änderungen nicht gespeichert werden. Um Ihre Änderungen nicht zu verlieren, kopieren - Sie sie lokal und laden Sie sie erneut, um die aktualisierte Version anzuzeigen. - notice_locking_conflict_action_button: Änderungen verwerfen und neu laden - notice_member_added: "%{name} zum Projekt hinzugefügt." - notice_members_added: "%{number} Benutzer zum Projekt hinzugefügt." + notice_auth_stage_verification_error: "Konnte Stufe \"%{stage}\" nicht verifizieren." + notice_auth_stage_wrong_stage: "Erwartet Authentifizierungs-Stufe \"%{expected}\" zu beenden, aber \"%{actual}\" zurückgegeben." + notice_auth_stage_error: "Authentifizierungs-Stufe \"%{stage}\" gescheitert." + notice_can_t_change_password: "Dieses Konto verwendet eine externe Authentifizierungs-Quelle; das Kennwort kann nicht geändert werden." + notice_custom_options_deleted: "Option \"%{option_value}\" und ihre %{num_deleted} Vorkommen wurden gelöscht." + notice_email_error: "Beim Senden einer E-Mail ist ein Fehler aufgetreten (%{value})." + notice_email_sent: "Eine E-Mail wurde an %{value} gesendet." + notice_failed_to_save_work_packages: "%{count} von %{total} ausgewählten Arbeitspaketen konnte(n) nicht gespeichert werden: %{ids}." + notice_failed_to_save_members: "Benutzer konnte(n) nicht gespeichert werden: %{errors}." + notice_deletion_scheduled: "Die Löschung wurde geplant und wird asynchron durchgeführt." + notice_file_not_found: "Die von Ihnen aufgerufene Seite existiert nicht oder ist verschoben worden." + notice_forced_logout: "Nach %{ttl_time} Minuten Inaktivität wurden Sie automatisch ausgeloggt." + notice_internal_server_error: "Auf der von Ihnen aufgerufenen Seite ist ein Fehler aufgetreten. Kontaktieren Sie bitte Ihren %{app_title} Administrator, wenn Sie wiederholt Probleme mit dem Aufrufen der Seite haben." + notice_locking_conflict: "Die Informationen wurde zwischenzeitlich von einem anderen Benutzer geändert." + notice_locking_conflict_additional_information: "Die Änderung(en) wurde(n) durchgeführt von %{users}." + notice_locking_conflict_reload_page: "Bitte laden Sie die Seite neu, prüfen Sie die Anpassungen und geben Sie Ihre Änderungen noch einmal ein." + notice_locking_conflict_warning: "Diese Seite wurde von jemand anderem aktualisiert. Um Ihre Änderungen nicht zu verlieren, kopieren Sie sie lokal und laden Sie sie erneut, um die aktualisierte Version anzuzeigen." + notice_locking_conflict_danger: "Ihre Änderungen konnten wegen in Konflikt stehender Änderungen nicht gespeichert werden. Um Ihre Änderungen nicht zu verlieren, kopieren Sie sie lokal und laden Sie sie erneut, um die aktualisierte Version anzuzeigen." + notice_locking_conflict_action_button: "Änderungen verwerfen und neu laden" + notice_member_added: '%{name} zum Projekt hinzugefügt.' + notice_members_added: '%{number} Benutzer zum Projekt hinzugefügt.' notice_member_removed: "%{user} aus dem Projekt entfernt." notice_member_deleted: "%{user} wurde aus dem Projekt entfernt und gelöscht." - notice_no_principals_found: Keine Treffer gefunden. - notice_bad_request: Fehlerhafte Anfrage. - notice_not_authorized: Sie sind nicht berechtigt, auf diese Seite zuzugreifen. - notice_not_authorized_archived_project: Das Projekt wurde archiviert und ist daher - nicht verfügbar. - notice_requires_enterprise_token: Kein Enterprise-Token vorhanden oder das vorhandene - Token erlaubt keinen Zugriff auf diese Seite. - notice_password_confirmation_failed: Das eingegebene Passwort ist nicht korrekt. - notice_principals_found_multiple: |- - Es wurden %{number} Ergebnisse gefunden. - Drücke Tab um das erste Ergebnis zu fokussieren. - notice_principals_found_single: |- - Es wurde ein Ergebnis gefunden. - Drücke Tab um es zu fokussieren. - notice_parent_item_not_found: Übergeordnetes Element nicht gefunden. - notice_project_not_deleted: Das Projekt wurde nicht gelöscht. - notice_project_not_found: Projekt nicht gefunden. - notice_successful_connection: Verbindung erfolgreich. - notice_successful_create: Erfolgreich angelegt. - notice_successful_delete: Erfolgreich gelöscht. - notice_successful_cancel: Erfolgreiche Absage. - notice_successful_update: Erfolgreich aktualisiert. - notice_successful_move: Erfolgreich von %{from} nach %{to} verschoben. - notice_unsuccessful_create: Erstellung fehlgeschlagen. - notice_unsuccessful_create_with_reason: 'Erstellung fehlgeschlagen: %{reason}' - notice_unsuccessful_update: Aktualisierung fehlgeschlagen. - notice_unsuccessful_update_with_reason: 'Aktualisierung fehlgeschlagen: %{reason}' + notice_no_principals_found: "Keine Treffer gefunden." + notice_bad_request: "Fehlerhafte Anfrage." + notice_not_authorized: "Sie sind nicht berechtigt, auf diese Seite zuzugreifen." + notice_not_authorized_archived_project: "Das Projekt wurde archiviert und ist daher nicht verfügbar." + notice_requires_enterprise_token: "Kein Enterprise-Token vorhanden oder das vorhandene Token erlaubt keinen Zugriff auf diese Seite." + notice_password_confirmation_failed: "Das eingegebene Passwort ist nicht korrekt." + notice_principals_found_multiple: "Es wurden %{number} Ergebnisse gefunden.\nDrücke Tab um das erste Ergebnis zu fokussieren." + notice_principals_found_single: "Es wurde ein Ergebnis gefunden.\nDrücke Tab um es zu fokussieren." + notice_parent_item_not_found: "Übergeordnetes Element nicht gefunden." + notice_project_not_deleted: "Das Projekt wurde nicht gelöscht." + notice_project_not_found: "Projekt nicht gefunden." + notice_successful_connection: "Verbindung erfolgreich." + notice_successful_create: "Erfolgreich angelegt." + notice_successful_delete: "Erfolgreich gelöscht." + notice_successful_cancel: "Erfolgreiche Absage." + notice_successful_update: "Erfolgreich aktualisiert." + notice_successful_move: "Erfolgreich von %{from} nach %{to} verschoben." + notice_unsuccessful_create: "Erstellung fehlgeschlagen." + notice_unsuccessful_create_with_reason: "Erstellung fehlgeschlagen: %{reason}" + notice_unsuccessful_update: "Aktualisierung fehlgeschlagen." + notice_unsuccessful_update_with_reason: "Aktualisierung fehlgeschlagen: %{reason}" notice_successful_update_custom_fields_added_to_project: | Erfolgreich aktualisiert. Die benutzerdefinierten Felder der aktivierten Typen werden automatisch im Arbeitspaket-Formular aktiviert. Siehe mehr. - notice_to_many_principals_to_display: |- - Es gibt zu viele Treffer. - Bitte engen Sie die Suche ein, indem sie den Namen der Person (oder der Gruppe) eingeben. - notice_user_missing_authentication_method: Benutzer muss noch ein Passwort oder - eine andere Authentifizierungsmethode wählen. + notice_to_many_principals_to_display: "Es gibt zu viele Treffer.\nBitte engen Sie die Suche ein, indem sie den Namen der Person (oder der Gruppe) eingeben." + notice_user_missing_authentication_method: Benutzer muss noch ein Passwort oder eine andere Authentifizierungsmethode wählen. notice_user_invitation_resent: Eine Einladung wurde an %{email} gesendet. - present_access_key_value: 'Ihr %{key_name} ist: %{value}' - notice_automatic_set_of_standard_type: Der Standard-Typ wurde automatisch gesetzt. - notice_logged_out: Sie wurden ausgeloggt. - notice_wont_delete_auth_source: Die LDAP-Verbindung kann nicht gelöscht werden, - solange es noch Benutzer gibt, die diese verwenden. - notice_project_cannot_update_custom_fields: 'Sie können die benutzerdefinierten - Felder dieses Projekts nicht aktualisieren. Das Projekt ist ungültig: %{errors}' - notice_attachment_migration_wiki_page: 'Diese Seite wurde automatisch während der - Aktualisierung von OpenProject generiert. Es enthält alle Anhänge, die zuvor innerhalb - %{container_type} "%{container_name}" zugeordnet waren. - - ' + present_access_key_value: "Ihr %{key_name} ist: %{value}" + notice_automatic_set_of_standard_type: "Der Standard-Typ wurde automatisch gesetzt." + notice_logged_out: "Sie wurden ausgeloggt." + notice_wont_delete_auth_source: Die LDAP-Verbindung kann nicht gelöscht werden, solange es noch Benutzer gibt, die diese verwenden. + notice_project_cannot_update_custom_fields: "Sie können die benutzerdefinierten Felder dieses Projekts nicht aktualisieren. Das Projekt ist ungültig: %{errors}" + notice_attachment_migration_wiki_page: > + Diese Seite wurde automatisch während der Aktualisierung von OpenProject generiert. Es enthält alle Anhänge, die zuvor innerhalb %{container_type} "%{container_name}" zugeordnet waren. + #Default format for numbers number: format: delimiter: "." @@ -5022,253 +4228,221 @@ de: separator: "," human: format: - delimiter: '' + delimiter: "" precision: 1 storage_units: format: "%n %u" units: byte: - one: Byte - other: Bytes - gb: GB - kb: kB - mb: MB - tb: TB + one: "Byte" + other: "Bytes" + gb: "GB" + kb: "kB" + mb: "MB" + tb: "TB" onboarding: - heading_getting_started: Erhalten Sie einen Überblick - text_getting_started_description: Erhalten Sie einen schnellen Überblick über - die Projektverwaltung und die Zusammenarbeit mit OpenProject. Sie können dieses - Video über das Hilfe-Menü neu starten. - welcome: Willkommen zu %{app_title} - select_language: Bitte wählen Sie Ihre Sprache - permission_add_work_package_comments: Kommentare hinzufügen - permission_add_work_packages: Arbeitspakete hinzufügen - permission_add_messages: Forenbeiträge hinzufügen - permission_add_project: Projekte erstellen - permission_add_portfolios: Portfolios erstellen - permission_add_programs: Programme erstellen - permission_add_work_package_attachments: Anhänge hinzufügen - permission_add_work_package_attachments_explanation: Erlaubt das Hinzufügen von - Anhängen ohne die Berechtigung, das Arbeitspaket selbst zu bearbeiten - permission_add_internal_comments: Interne Kommentare schreiben - permission_archive_project: Projekt archivieren - permission_create_user: Benutzer erstellen - permission_manage_user: Benutzer bearbeiten - permission_manage_placeholder_user: Platzhalter-Benutzer erstellen, bearbeiten und - löschen - permission_add_subprojects: Unterprojekte erstellen - permission_add_work_package_watchers: Beobachter hinzufügen - permission_assign_versions: Versionen zuweisen - permission_browse_repository: Lesezugriff auf Projektarchiv (in OpenProject und - Checkout) - permission_change_wiki_parent_page: Übergeordnete Wiki-Seite ändern - permission_change_work_package_status: Arbeitspaket-Status ändern - permission_change_work_package_status_explanation: Ermöglicht das Ändern des Status - ohne Berechtigung Arbeitspakete zu bearbeiten - permission_comment_news: Nachricht kommentieren - permission_commit_access: Lese- und Schreibzugriff auf Projektarchiv (Commit) - permission_copy_projects: Projekte kopieren - permission_copy_projects_explanation: 'Bei Vorlagenprojekten hat diese Berechtigung - eine weitere Funktion: Sie ermöglicht die Erstellung neuer Projekte, die von der - Vorlage abgeleitet sind.' - permission_copy_work_packages: Arbeitspakete duplizieren - permission_create_backup: Backups erstellen - permission_delete_work_package_watchers: Beobachter löschen - permission_delete_work_packages: Arbeitspakete löschen - permission_delete_messages: Forenbeiträge löschen - permission_delete_own_messages: Eigene Forenbeiträge löschen - permission_delete_reportings: Statusberichte löschen - permission_delete_timelines: Zeitplan-Reporte löschen - permission_delete_wiki_pages: Wiki-Seiten löschen - permission_delete_wiki_pages_attachments: Anhänge löschen - permission_edit_work_package_comments: Kommentare moderieren - permission_edit_work_package_comments_explanation: 'Achtung: Benutzer mit dieser - Berechtigung können den Kommentar eines anderen Benutzers bearbeiten.' - permission_edit_work_packages: Arbeitspakete bearbeiten - permission_edit_messages: Forenbeiträge bearbeiten - permission_edit_own_internal_comments: Eigene interne Kommentare bearbeiten - permission_edit_own_work_package_comments: Eigene Kommentare bearbeiten - permission_edit_own_messages: Eigene Forenbeiträge bearbeiten - permission_edit_own_time_entries: Selbstgebuchte Aufwände bearbeiten - permission_edit_others_internal_comments: Interne Kommentare moderieren - permission_edit_others_internal_comments_explanation: 'Achtung: Benutzer mit dieser - Berechtigung können den Kommentar anderer Benutzer bearbeiten.' - permission_edit_project: Projekt bearbeiten - permission_edit_project_attributes: Projektattribute bearbeiten - permission_edit_project_phases: Projektphasen bearbeiten - permission_edit_reportings: Statusberichte bearbeiten - permission_edit_time_entries: Zeitaufwand für andere Benutzer bearbeiten - permission_edit_timelines: Zeitplan-Reporte bearbeiten - permission_edit_wiki_pages: Wiki-Seiten bearbeiten - permission_export_work_packages: Arbeitspakete exportieren - permission_export_projects: Projekte exportieren - permission_export_wiki_pages: Wiki-Seiten exportieren - permission_invite_members_by_email: Mitglieder per E-Mail einladen - permission_invite_members_by_email_explanation: 'Ermöglicht es Benutzern, neue Mitglieder - per E-Mail einzuladen. Eingeladene Benutzer erhalten eine E-Mail mit einem Link, - über den sie ihr Passwort festlegen und ihr Konto aktivieren können. Abhängig - von der Berechtigung zur Mitgliederverwaltung - - ' - permission_list_attachments: Anhänge auflisten - permission_log_own_time: Eigenen Zeitaufwand verbuchen - permission_log_time: Zeitaufwand für andere Benutzer verbuchen - permission_manage_forums: Foren verwalten - permission_manage_categories: Arbeitspaket-Kategorien verwalten - permission_manage_dashboards: Dashboards verwalten - permission_manage_work_package_relations: Arbeitspaket-Beziehungen verwalten - permission_manage_members: Mitglieder verwalten - permission_manage_news: Nachricht verwalten - permission_manage_project_activities: Aktivitäten (Zeiterfassung) verwalten - permission_manage_public_queries: Öffentliche Ansichten verwalten - permission_manage_repository: Projektarchiv verwalten - permission_manage_subtasks: Arbeitspaket-Hierarchien verwalten - permission_manage_versions: Versionen verwalten - permission_manage_wiki: Wiki verwalten - permission_manage_wiki_menu: Wiki-Menü verwalten - permission_move_work_packages: Arbeitspakete verschieben - permission_protect_wiki_pages: Wiki-Seiten schützen - permission_rename_wiki_pages: Wiki-Seiten umbenennen - permission_save_queries: Ansichten speichern - permission_search_project: Projekt suchen - permission_select_custom_fields: Benutzerdefinierte Felder verwalten - permission_select_project_custom_fields: Projektattribute auswählen - permission_select_project_phases: Projektphase auswählen - permission_select_project_phases_explanation: "(De-)Aktivieren der Projektphasen. - Erlaubt dem Nutzer die Auswahl des passenden Lebenszyklus-Modells da definierte, - aber inaktive Phasen weder auf der Projekt-Übersichtsseite noch in der Projektliste - sichtbar sind." - permission_select_project_modules: Projektmodule auswählen - permission_share_work_packages: Arbeitspakete teilen - permission_manage_types: Typen auswählen - permission_manage_own_reminders: Eigene Erinnerungen erstellen - permission_view_all_principals: Alle Benutzer und Gruppen anzeigen - permission_view_all_principals_explanation: 'Ermöglicht es Benutzern, alle Benutzer - und Gruppen im System zu sehen, auch wenn sie nicht gemeinsamen Projekten oder - Gruppen angehören. - - ' - permission_view_project: Projekt anzeigen - permission_view_changesets: Revisionen des Projektarchivs in OpenProject ansehen - permission_view_internal_comments: Interne Kommentare ansehen - permission_view_commit_author_statistics: Commit Autor Statistiken ansehen - permission_view_dashboards: Dashboard anzeigen - permission_view_work_package_watchers: Liste der Beobachter ansehen - permission_view_work_packages: Arbeitspakete anzeigen - permission_view_messages: Forenbeiträge ansehen - permission_view_news: News anzeigen - permission_view_members: Mitglieder ansehen - permission_view_reportings: Statusberichte ansehen - permission_view_shared_work_packages: Arbeitspaket-Freigaben sehen - permission_view_time_entries: Gebuchte Aufwände ansehen - permission_view_timelines: Zeitplan-Reporte anzeigen - permission_view_user_email: E-Mail-Adressen der Benutzer anzeigen - permission_view_wiki_edits: Wiki-Versionsgeschichte ansehen - permission_view_wiki_pages: Wiki ansehen - permission_work_package_assigned: Zugewiesener/Verantwortlicher werden - permission_work_package_assigned_explanation: Arbeitspakete können Benutzern und - Gruppen im Besitz dieser Rolle in dem jeweiligen Projekt zugeordnet werden - permission_view_project_activity: Projektaktivität anzeigen - permission_view_project_attributes: Projektattribute ansehen - permission_view_project_phases: Projektphasen sehen - permission_save_bcf_queries: BCF-Abfragen speichern - permission_manage_public_bcf_queries: Öffentliche BCF-Abfragen verwalten - permission_edit_attribute_help_texts: Attribut-Hilfetxt bearbeiten - permission_manage_public_project_queries: Öffentliche Projektlisten verwalten - permission_view_project_query: Projektabfrage anzeigen - permission_edit_project_query: Projektabfrage bearbeiten + heading_getting_started: "Erhalten Sie einen Überblick" + text_getting_started_description: "Erhalten Sie einen schnellen Überblick über die Projektverwaltung und die Zusammenarbeit mit OpenProject. Sie können dieses Video über das Hilfe-Menü neu starten." + welcome: "Willkommen zu %{app_title}" + select_language: "Bitte wählen Sie Ihre Sprache" + permission_add_work_package_comments: "Kommentare hinzufügen" + permission_add_work_packages: "Arbeitspakete hinzufügen" + permission_add_messages: "Forenbeiträge hinzufügen" + permission_add_project: "Projekte erstellen" + permission_add_portfolios: "Portfolios erstellen" + permission_add_programs: "Programme erstellen" + permission_add_work_package_attachments: "Anhänge hinzufügen" + permission_add_work_package_attachments_explanation: "Erlaubt das Hinzufügen von Anhängen ohne die Berechtigung, das Arbeitspaket selbst zu bearbeiten" + permission_add_internal_comments: "Interne Kommentare schreiben" + permission_archive_project: "Projekt archivieren" + permission_create_user: "Benutzer erstellen" + permission_manage_user: "Benutzer bearbeiten" + permission_manage_placeholder_user: "Platzhalter-Benutzer erstellen, bearbeiten und löschen" + permission_add_subprojects: "Unterprojekte erstellen" + permission_add_work_package_watchers: "Beobachter hinzufügen" + permission_assign_versions: "Versionen zuweisen" + permission_browse_repository: "Lesezugriff auf Projektarchiv (in OpenProject und Checkout)" + permission_change_wiki_parent_page: "Übergeordnete Wiki-Seite ändern" + permission_change_work_package_status: "Arbeitspaket-Status ändern" + permission_change_work_package_status_explanation: "Ermöglicht das Ändern des Status ohne Berechtigung Arbeitspakete zu bearbeiten" + permission_comment_news: "Nachricht kommentieren" + permission_commit_access: "Lese- und Schreibzugriff auf Projektarchiv (Commit)" + permission_copy_projects: "Projekte kopieren" + permission_copy_projects_explanation: "Bei Vorlagenprojekten hat diese Berechtigung eine weitere Funktion: Sie ermöglicht die Erstellung neuer Projekte, die von der Vorlage abgeleitet sind." + permission_copy_work_packages: "Arbeitspakete duplizieren" + permission_create_backup: "Backups erstellen" + permission_delete_work_package_watchers: "Beobachter löschen" + permission_delete_work_packages: "Arbeitspakete löschen" + permission_delete_messages: "Forenbeiträge löschen" + permission_delete_own_messages: "Eigene Forenbeiträge löschen" + permission_delete_reportings: "Statusberichte löschen" + permission_delete_timelines: "Zeitplan-Reporte löschen" + permission_delete_wiki_pages: "Wiki-Seiten löschen" + permission_delete_wiki_pages_attachments: "Anhänge löschen" + permission_edit_work_package_comments: "Kommentare moderieren" + permission_edit_work_package_comments_explanation: "Achtung: Benutzer mit dieser Berechtigung können den Kommentar eines anderen Benutzers bearbeiten." + permission_edit_work_packages: "Arbeitspakete bearbeiten" + permission_edit_messages: "Forenbeiträge bearbeiten" + permission_edit_own_internal_comments: "Eigene interne Kommentare bearbeiten" + permission_edit_own_work_package_comments: "Eigene Kommentare bearbeiten" + permission_edit_own_messages: "Eigene Forenbeiträge bearbeiten" + permission_edit_own_time_entries: "Selbstgebuchte Aufwände bearbeiten" + permission_edit_others_internal_comments: "Interne Kommentare moderieren" + permission_edit_others_internal_comments_explanation: "Achtung: Benutzer mit dieser Berechtigung können den Kommentar anderer Benutzer bearbeiten." + permission_edit_project: "Projekt bearbeiten" + permission_edit_project_attributes: "Projektattribute bearbeiten" + permission_edit_project_phases: "Projektphasen bearbeiten" + permission_edit_reportings: "Statusberichte bearbeiten" + permission_edit_time_entries: "Zeitaufwand für andere Benutzer bearbeiten" + permission_edit_timelines: "Zeitplan-Reporte bearbeiten" + permission_edit_wiki_pages: "Wiki-Seiten bearbeiten" + permission_export_work_packages: "Arbeitspakete exportieren" + permission_export_projects: "Projekte exportieren" + permission_export_wiki_pages: "Wiki-Seiten exportieren" + permission_invite_members_by_email: "Mitglieder per E-Mail einladen" + permission_invite_members_by_email_explanation: > + Ermöglicht es Benutzern, neue Mitglieder per E-Mail einzuladen. Eingeladene Benutzer erhalten eine E-Mail mit einem Link, über den sie ihr Passwort festlegen und ihr Konto aktivieren können. Abhängig von der Berechtigung zur Mitgliederverwaltung + permission_list_attachments: "Anhänge auflisten" + permission_log_own_time: "Eigenen Zeitaufwand verbuchen" + permission_log_time: "Zeitaufwand für andere Benutzer verbuchen" + permission_manage_forums: "Foren verwalten" + permission_manage_categories: "Arbeitspaket-Kategorien verwalten" + permission_manage_dashboards: "Dashboards verwalten" + permission_manage_work_package_relations: "Arbeitspaket-Beziehungen verwalten" + permission_manage_members: "Mitglieder verwalten" + permission_manage_news: "Nachricht verwalten" + permission_manage_project_activities: "Aktivitäten (Zeiterfassung) verwalten" + permission_manage_public_queries: "Öffentliche Ansichten verwalten" + permission_manage_repository: "Projektarchiv verwalten" + permission_manage_subtasks: "Arbeitspaket-Hierarchien verwalten" + permission_manage_versions: "Versionen verwalten" + permission_manage_wiki: "Wiki verwalten" + permission_manage_wiki_menu: "Wiki-Menü verwalten" + permission_move_work_packages: "Arbeitspakete verschieben" + permission_protect_wiki_pages: "Wiki-Seiten schützen" + permission_rename_wiki_pages: "Wiki-Seiten umbenennen" + permission_save_queries: "Ansichten speichern" + permission_search_project: "Projekt suchen" + permission_select_custom_fields: "Benutzerdefinierte Felder verwalten" + permission_select_project_custom_fields: "Projektattribute auswählen" + permission_select_project_phases: "Projektphase auswählen" + permission_select_project_phases_explanation: "(De-)Aktivieren der Projektphasen. Erlaubt dem Nutzer die Auswahl des passenden Lebenszyklus-Modells da definierte, aber inaktive Phasen weder auf der Projekt-Übersichtsseite noch in der Projektliste sichtbar sind." + permission_select_project_modules: "Projektmodule auswählen" + permission_share_work_packages: "Arbeitspakete teilen" + permission_manage_types: "Typen auswählen" + permission_manage_own_reminders: "Eigene Erinnerungen erstellen" + permission_view_all_principals: "Alle Benutzer und Gruppen anzeigen" + permission_view_all_principals_explanation: > + Ermöglicht es Benutzern, alle Benutzer und Gruppen im System zu sehen, auch wenn sie nicht gemeinsamen Projekten oder Gruppen angehören. + permission_view_project: "Projekt anzeigen" + permission_view_changesets: "Revisionen des Projektarchivs in OpenProject ansehen" + permission_view_internal_comments: "Interne Kommentare ansehen" + permission_view_commit_author_statistics: "Commit Autor Statistiken ansehen" + permission_view_dashboards: "Dashboard anzeigen" + permission_view_work_package_watchers: "Liste der Beobachter ansehen" + permission_view_work_packages: "Arbeitspakete anzeigen" + permission_view_messages: "Forenbeiträge ansehen" + permission_view_news: "News anzeigen" + permission_view_members: "Mitglieder ansehen" + permission_view_reportings: "Statusberichte ansehen" + permission_view_shared_work_packages: "Arbeitspaket-Freigaben sehen" + permission_view_time_entries: "Gebuchte Aufwände ansehen" + permission_view_timelines: "Zeitplan-Reporte anzeigen" + permission_view_user_email: "E-Mail-Adressen der Benutzer anzeigen" + permission_view_wiki_edits: "Wiki-Versionsgeschichte ansehen" + permission_view_wiki_pages: "Wiki ansehen" + permission_work_package_assigned: "Zugewiesener/Verantwortlicher werden" + permission_work_package_assigned_explanation: "Arbeitspakete können Benutzern und Gruppen im Besitz dieser Rolle in dem jeweiligen Projekt zugeordnet werden" + permission_view_project_activity: "Projektaktivität anzeigen" + permission_view_project_attributes: "Projektattribute ansehen" + permission_view_project_phases: "Projektphasen sehen" + permission_save_bcf_queries: "BCF-Abfragen speichern" + permission_manage_public_bcf_queries: "Öffentliche BCF-Abfragen verwalten" + permission_edit_attribute_help_texts: "Attribut-Hilfetxt bearbeiten" + permission_manage_public_project_queries: "Öffentliche Projektlisten verwalten" + permission_view_project_query: "Projektabfrage anzeigen" + permission_edit_project_query: "Projektabfrage bearbeiten" placeholders: default: "-" templated_hint: Automatisch durch den Typ %{type} erzeugt portfolio: count: - zero: Keine Portfolios - one: Ein Portfolio + zero: "Keine Portfolios" + one: "Ein Portfolio" other: "%{count} Portfolios" program: count: - zero: 0 Programme - one: 1 Programm + zero: "0 Programme" + one: "1 Programm" other: "%{count} Programme" project: archive: - title: Projekt archivieren - are_you_sure: Sind Sie sicher, dass Sie das Projekt '%{name}' archivieren wollen? - archived: Archiviert + title: "Projekt archivieren" + are_you_sure: "Sind Sie sicher, dass Sie das Projekt '%{name}' archivieren wollen?" + archived: "Archiviert" count: - zero: 0 Projekte - one: 1 Projekt + zero: "0 Projekte" + one: "1 Projekt" other: "%{count} Projekte" destroy: - title: Projekt löschen - heading: Dieses Projekt unwiderruflich löschen? + title: "Projekt löschen" + heading: "Dieses Projekt unwiderruflich löschen?" confirmation_message_for_subprojects_html: - zero: 'Sie sind dabei, alle Daten im Zusammenhang mit dem Projekt %{name} - dauerhaft zu löschen. - - ' - one: 'Sie sind dabei, alle Daten im Zusammenhang mit dem Projekt %{name} - und diesem Unterprojekt dauerhaft zu löschen: - - ' - other: 'Sie sind dabei, alle Daten im Zusammenhang mit dem Projekt %{name} - und diesen Unterprojekten dauerhaft zu löschen: - - ' + zero: > + Sie sind dabei, alle Daten im Zusammenhang mit dem Projekt %{name} dauerhaft zu löschen. + one: > + Sie sind dabei, alle Daten im Zusammenhang mit dem Projekt %{name} und diesem Unterprojekt dauerhaft zu löschen: + other: > + Sie sind dabei, alle Daten im Zusammenhang mit dem Projekt %{name} und diesen Unterprojekten dauerhaft zu löschen: filters: - project_phase: 'Projektphase: %{phase}' - project_phase_any: 'Projektphase: Alle' - project_phase_gate: 'Projektphasen-Gate: %{gate}' + project_phase: "Projektphase: %{phase}" + project_phase_any: "Projektphase: Alle" + project_phase_gate: "Projektphasen-Gate: %{gate}" identifier: warning_one: Projektmitglieder müssen die Projektarchive des Projekts umziehen. warning_two: Bestehende Projekt-Links werden nicht mehr funktionieren. title: Projektkennung ändern - not_available: Projekt N/A + not_available: "Projekt N/A" template: - copying_title: Vorlage anwenden - copying: 'Ihr Projekt wird aus der ausgewählten Vorlage erstellt. Sie werden - per E-Mail benachrichtigt, sobald das Projekt verfügbar ist. - - ' - use_template: Projektvorlage verwenden - make_template: Als Vorlage speichern - remove_from_templates: Aus Projektvorlagen entfernen - project_module_activity: Aktivität - project_module_forums: Foren - project_module_work_package_tracking: Arbeitspakete - project_module_news: Neuigkeiten - project_module_repository: Projektarchiv - project_module_wiki: Wiki - permission_header_for_project_module_work_package_tracking: Arbeitspakete und Gantt-Diagramme + copying_title: "Vorlage anwenden" + copying: > + Ihr Projekt wird aus der ausgewählten Vorlage erstellt. Sie werden per E-Mail benachrichtigt, sobald das Projekt verfügbar ist. + use_template: "Projektvorlage verwenden" + make_template: "Als Vorlage speichern" + remove_from_templates: "Aus Projektvorlagen entfernen" + project_module_activity: "Aktivität" + project_module_forums: "Foren" + project_module_work_package_tracking: "Arbeitspakete" + project_module_news: "Neuigkeiten" + project_module_repository: "Projektarchiv" + project_module_wiki: "Wiki" + permission_header_for_project_module_work_package_tracking: "Arbeitspakete und Gantt-Diagramme" query: attribute_and_direction: "%{attribute} (%{direction})" + #possible query parameters (e.g. issue queries), + #which are not attributes of an AR-Model. query_fields: - active_or_archived: Aktiv oder archiviert - assigned_to_role: Rolle der zugewiesenen Person - assignee_or_group: Zugewiesen an Nutzer oder dessen Gruppe - member_of_group: Gruppe der zugewiesenen Person - name_or_identifier: Name oder Kennung - only_subproject_id: Nur Unterprojekt - shared_with_user: Geteilt mit Benutzern - shared_with_me: Mit mir geteilt - subproject_id: Einschließlich Unterprojekt + active_or_archived: "Aktiv oder archiviert" + assigned_to_role: "Rolle der zugewiesenen Person" + assignee_or_group: "Zugewiesen an Nutzer oder dessen Gruppe" + member_of_group: "Gruppe der zugewiesenen Person" + name_or_identifier: "Name oder Kennung" + only_subproject_id: "Nur Unterprojekt" + shared_with_user: "Geteilt mit Benutzern" + shared_with_me: "Mit mir geteilt" + subproject_id: "Einschließlich Unterprojekt" repositories: - at_identifier: auf %{identifier} - atom_revision_feed: Revisionen als Atom Feed - autofetch_information: |- - Wählen Sie diese Option um das Projektarchiv beim Zugriff auf die Projektarchiv-Modul-Seite automatisch zu aktualisieren. - Dies umfasst das Abrufen von Commits aus dem Projektarchiv und die Aktualisierung des erforderliche Festplattenspeichers. + at_identifier: "auf %{identifier}" + atom_revision_feed: "Revisionen als Atom Feed" + autofetch_information: "Wählen Sie diese Option um das Projektarchiv beim Zugriff auf die Projektarchiv-Modul-Seite automatisch zu aktualisieren.\nDies umfasst das Abrufen von Commits aus dem Projektarchiv und die Aktualisierung des erforderliche Festplattenspeichers." checkout: access: - readwrite: Lese- und Schreibzugriff - read: Nur Lesezugriff - none: Keine Checkout-Berechtigung. Sie können das Projektarchiv nur über diese - Applikation betrachten. - access_permission: Ihre Berechtigungen für dieses Projektarchiv - url: Checkout-URL - base_url_text: |- - Der URL-Präfix, der für die Generierung von Checkout-URLs verwendet wird (z.B. https://myserver.example.org/repos). - Hinweis: Dieser URL-Präfix wird nur zum Umschreiben von verwalteten Projektarchiven verwendet. Die URLs anderer Projektarchive werden nicht verändert. + readwrite: "Lese- und Schreibzugriff" + read: "Nur Lesezugriff" + none: "Keine Checkout-Berechtigung. Sie können das Projektarchiv nur über diese Applikation betrachten." + access_permission: "Ihre Berechtigungen für dieses Projektarchiv" + url: "Checkout-URL" + base_url_text: "Der URL-Präfix, der für die Generierung von Checkout-URLs verwendet wird (z.B. https://myserver.example.org/repos).\nHinweis: Dieser URL-Präfix wird nur zum Umschreiben von verwalteten Projektarchiven verwendet. Die URLs anderer Projektarchive werden nicht verändert." default_instructions: git: |- Die Daten in diesem Projektarchiv können mittels Git auf Ihren Computer übertragen werden. @@ -5276,901 +4450,564 @@ de: subversion: |- Die Daten in diesem Projektarchiv können mittels Subversion auf Ihren Computer übertragen werden. Weitere Informationen zu dem Auschecken von Projektarchiven und verfügbare Client-Softwares erhalten Sie in der Dokumentation von Subversion. - enable_instructions_text: Zeige die nachstehenden Checkout-Anweisungen auf allen - Seiten im Projektarchiv-Modul an. - instructions: Checkout-Anweisungen - show_instructions: Zeige Checkout-Anweisungen - text_instructions: Dieser Text wird dem Nutzer zusammen mit der Checkout-URL - als zusätzliche Hilfestellung für den Checkout von Projektarchiven angezeigt. - not_available: Für dieses Projektarchiv sind keine Checkout-Anweisungen definiert. - Kontaktieren Sie einen Administrator zur Aktivierung der Checkout-Anweisungen. - create_managed_delay: 'Bitte beachten Sie: Das Projektarchiv wird in OpenProject - verwaltet. Es wird asynchron auf dem Datenträger erstellt und wird in Kürze - verfügbar sein.' - create_successful: Das Projektarchiv wurde registriert. - delete_sucessful: Das Projektarchiv wurde gelöscht. + enable_instructions_text: "Zeige die nachstehenden Checkout-Anweisungen auf allen Seiten im Projektarchiv-Modul an." + instructions: "Checkout-Anweisungen" + show_instructions: "Zeige Checkout-Anweisungen" + text_instructions: "Dieser Text wird dem Nutzer zusammen mit der Checkout-URL als zusätzliche Hilfestellung für den Checkout von Projektarchiven angezeigt." + not_available: "Für dieses Projektarchiv sind keine Checkout-Anweisungen definiert. Kontaktieren Sie einen Administrator zur Aktivierung der Checkout-Anweisungen." + create_managed_delay: "Bitte beachten Sie: Das Projektarchiv wird in OpenProject verwaltet. Es wird asynchron auf dem Datenträger erstellt und wird in Kürze verfügbar sein." + create_successful: "Das Projektarchiv wurde registriert." + delete_sucessful: "Das Projektarchiv wurde gelöscht." destroy: - confirmation: Wenn Sie fortfahren, wird das verwaltete Projektarchiv dauerhaft - gelöscht. - info: Die Löschung des Projektarchivs kann nicht rückgängig gemacht werden. - info_not_managed: 'Hinweis: Der Inhalt des Projektarchivs wird nicht gelöscht, - da es sich um ein externes Projektarchiv handelt.' - managed_path_note: 'Das folgende Verzeichnis wird gelöscht werden: %{path}' - repository_verification: Geben Sie die Projektkennung %{identifier} ein, um - die Löschung des Projektarchivs zu bestätigen. - subtitle: Wollen Sie wirklich das %{repository_type} des Projekts %{project_name} - löschen? - subtitle_not_managed: Wollen Sie wirklich die verknüpfte %{repository_type}-%{url} - aus dem Projekt %{project_name} entfernen? + confirmation: "Wenn Sie fortfahren, wird das verwaltete Projektarchiv dauerhaft gelöscht." + info: "Die Löschung des Projektarchivs kann nicht rückgängig gemacht werden." + info_not_managed: "Hinweis: Der Inhalt des Projektarchivs wird nicht gelöscht, da es sich um ein externes Projektarchiv handelt." + managed_path_note: "Das folgende Verzeichnis wird gelöscht werden: %{path}" + repository_verification: "Geben Sie die Projektkennung %{identifier} ein, um die Löschung des Projektarchivs zu bestätigen." + subtitle: "Wollen Sie wirklich das %{repository_type} des Projekts %{project_name} löschen?" + subtitle_not_managed: "Wollen Sie wirklich die verknüpfte %{repository_type}-%{url} aus dem Projekt %{project_name} entfernen?" title: "%{repository_type} löschen" - title_not_managed: Verknüpftes %{repository_type} löschen? + title_not_managed: "Verknüpftes %{repository_type} löschen?" errors: - build_failed: Projektarchiv mit der gewählten Konfiguration konnte nicht erstellt - werden. %{reason} - managed_delete: Löschen des verwalteten Projektarchivs nicht möglich. - managed_delete_local: 'Löschen des lokalen Projektarchivs auf Dateisystem ''%{path}'': - %{error_message} nicht möglich' - empty_repository: Das Projektarchiv existiert, ist aber leer. Es enthält noch - keine Änderungen. - exists_on_filesystem: Das Projektarchiv-Verzeichnis existiert bereits in dem - Dateisystem. - filesystem_access_failed: 'Fehler beim Zugriff des Projektarchivs in dem Dateisystem: - %{message}' - not_manageable: Dieser Projektarchiv-Anbieter kann nicht von OpenProject verwaltet - werden. - path_permission_failed: 'Ein Fehler ist aufgetreten beim Erstellen des folgenden - Pfads: %{path}. Bitte stellen Sie sicher, dass OpenProject in diesen Ordner - schreiben darf.' - unauthorized: Sie sind nicht berechtigt auf das Projektarchiv zuzugreifen oder - die Anmeldeinformationen sind ungültig. - unavailable: Das Projektarchiv ist nicht verfügbar. - exception_title: 'Kann nicht auf das Projektarchiv zugreifen: %{message}' - disabled_or_unknown_type: Der gewählte Typ %{type} ist deaktiviert oder nicht - mehr verfügbar für den Versionskontroll-Anbieter %{vendor}. - disabled_or_unknown_vendor: Der Versionskontrollsystem-Anbieter %{vendor} ist - deaktiviert oder nicht mehr verfügbar. - remote_call_failed: 'Aufruf des verwalteten Projektarchivs mit Fehlermeldung - "%{message}" gescheitert (Code: %{code})' - remote_invalid_response: Ungültige Antwort vom verwalteten Projektarchiv erhalten. - remote_save_failed: Speicherung des Projektarchivs mit den Parametern der Remote-Verbindung - nicht möglich. + build_failed: "Projektarchiv mit der gewählten Konfiguration konnte nicht erstellt werden. %{reason}" + managed_delete: "Löschen des verwalteten Projektarchivs nicht möglich." + managed_delete_local: "Löschen des lokalen Projektarchivs auf Dateisystem '%{path}': %{error_message} nicht möglich" + empty_repository: "Das Projektarchiv existiert, ist aber leer. Es enthält noch keine Änderungen." + exists_on_filesystem: "Das Projektarchiv-Verzeichnis existiert bereits in dem Dateisystem." + filesystem_access_failed: "Fehler beim Zugriff des Projektarchivs in dem Dateisystem: %{message}" + not_manageable: "Dieser Projektarchiv-Anbieter kann nicht von OpenProject verwaltet werden." + path_permission_failed: "Ein Fehler ist aufgetreten beim Erstellen des folgenden Pfads: %{path}. Bitte stellen Sie sicher, dass OpenProject in diesen Ordner schreiben darf." + unauthorized: "Sie sind nicht berechtigt auf das Projektarchiv zuzugreifen oder die Anmeldeinformationen sind ungültig." + unavailable: "Das Projektarchiv ist nicht verfügbar." + exception_title: "Kann nicht auf das Projektarchiv zugreifen: %{message}" + disabled_or_unknown_type: "Der gewählte Typ %{type} ist deaktiviert oder nicht mehr verfügbar für den Versionskontroll-Anbieter %{vendor}." + disabled_or_unknown_vendor: "Der Versionskontrollsystem-Anbieter %{vendor} ist deaktiviert oder nicht mehr verfügbar." + remote_call_failed: "Aufruf des verwalteten Projektarchivs mit Fehlermeldung \"%{message}\" gescheitert (Code: %{code})" + remote_invalid_response: "Ungültige Antwort vom verwalteten Projektarchiv erhalten." + remote_save_failed: "Speicherung des Projektarchivs mit den Parametern der Remote-Verbindung nicht möglich." git: instructions: - managed_url: Dies ist die URL des verwalteten (lokalen) Git Verzeichnis. - path: Geben Sie den Pfad zu Ihrem lokalen Git-Repository ein (z. B. %{example_path}). - Sie können auch Remote Repositories nutzen, die zu einer lokalen Kopie geklont - werden, mithilfe eines Wertes beginnend mit http(s) :// oder file://. - path_encoding: 'Überschreibe Git Pfad-Codierung (Standard: UTF-8)' - local_title: Verknüpfen von vorhandenem lokalen Git Verzeichnis - local_url: Lokale URL - local_introduction: Wenn Sie ein lokales Git Verzeichnis haben, können Sie es - mit OpenProject verknüpfen um von innerhalb der Anwendung auf dieses zuzugreifen. - managed_introduction: Lassen Sie OpenProject automatisch ein lokales Git Verzeichnis - erstellen und integrieren. - managed_title: Git Verzeichnis in OpenProject integriert - managed_url: Verwaltete URL - path: Pfad zum Git Verzeichnis - path_encoding: Path encoding - go_to_revision: Gehe zu Revision - managed_remote: Die verwalteten Projektarchive dieses Anbieters werden remote - gehandhabt. - managed_remote_note: Informationen bezüglich URL und Pfad sind erst nach der Erstellung - des Projektarchivs verfügbar. - managed_url: Verwaltete URL + managed_url: "Dies ist die URL des verwalteten (lokalen) Git Verzeichnis." + path: >- + Geben Sie den Pfad zu Ihrem lokalen Git-Repository ein (z. B. %{example_path}). Sie können auch Remote Repositories nutzen, die zu einer lokalen Kopie geklont werden, mithilfe eines Wertes beginnend mit http(s) :// oder file://. + path_encoding: "Überschreibe Git Pfad-Codierung (Standard: UTF-8)" + local_title: "Verknüpfen von vorhandenem lokalen Git Verzeichnis" + local_url: "Lokale URL" + local_introduction: "Wenn Sie ein lokales Git Verzeichnis haben, können Sie es mit OpenProject verknüpfen um von innerhalb der Anwendung auf dieses zuzugreifen." + managed_introduction: "Lassen Sie OpenProject automatisch ein lokales Git Verzeichnis erstellen und integrieren." + managed_title: "Git Verzeichnis in OpenProject integriert" + managed_url: "Verwaltete URL" + path: "Pfad zum Git Verzeichnis" + path_encoding: "Path encoding" + go_to_revision: "Gehe zu Revision" + managed_remote: "Die verwalteten Projektarchive dieses Anbieters werden remote gehandhabt." + managed_remote_note: "Informationen bezüglich URL und Pfad sind erst nach der Erstellung des Projektarchivs verfügbar." + managed_url: "Verwaltete URL" settings: - automatic_managed_repos_disabled: Automatische Erstellung deaktivieren - automatic_managed_repos: Automatische Erstellung verwalteter Projektarchive - automatic_managed_repos_text: Durch Festlegung eines Anbieters erhalten neu - erstellte Projekte automatisch ein verwaltetes Projektarchiv dieses Anbieters. - scm_vendor: Quellcode-Verwaltungssystem - scm_type: Projektarchiv-Typ + automatic_managed_repos_disabled: "Automatische Erstellung deaktivieren" + automatic_managed_repos: "Automatische Erstellung verwalteter Projektarchive" + automatic_managed_repos_text: "Durch Festlegung eines Anbieters erhalten neu erstellte Projekte automatisch ein verwaltetes Projektarchiv dieses Anbieters." + scm_vendor: "Quellcode-Verwaltungssystem" + scm_type: "Projektarchiv-Typ" scm_types: - local: Verknüpfen von vorhandenem lokalen Projektarchiv - existing: Verknüpfung eines existierenden Projektarchivs - managed: Neues Projektarchiv in OpenProject erstellen + local: "Verknüpfen von vorhandenem lokalen Projektarchiv" + existing: "Verknüpfung eines existierenden Projektarchivs" + managed: "Neues Projektarchiv in OpenProject erstellen" storage: - not_available: Genutzter Festplattenspeicher ist nicht für dieses Projektarchiv - verfügbar. - update_timeout: |- - Speichere die Informationen bzgl. des genutzten Festplattenspeichers eines Projektarchivs für N Minuten. - Erhöhen Sie diesen Wert zur Verbesserung der Performance, da die Erfassung des genutzten Festplattenspeichers Ressourcen-intensiv ist. - oauth_application_details: 'Der Client Geheimcode wird nach dem Schließen dieses - Fensters nicht mehr zugänglich sein. Bitte kopieren Sie diese Werte in die - Nextcloud OpenProject Integrationseinstellungen:' - oauth_application_details_link_text: Zu den Einstellungen gehen - setup_documentation_details: 'Wenn Sie Hilfe bei der Konfiguration eines neuen - Datei-Speichers benötigen, konsultieren Sie bitte die Dokumentation: ' - setup_documentation_details_link_text: Dateispeicher einrichten - show_warning_details: Um diesen Dateispeicher nutzen zu können, müssen Sie das - Modul und den spezifischen Speicher in den Projekteinstellungen jedes gewünschten - Projekts aktivieren. + not_available: "Genutzter Festplattenspeicher ist nicht für dieses Projektarchiv verfügbar." + update_timeout: "Speichere die Informationen bzgl. des genutzten Festplattenspeichers eines Projektarchivs für N Minuten.\nErhöhen Sie diesen Wert zur Verbesserung der Performance, da die Erfassung des genutzten Festplattenspeichers Ressourcen-intensiv ist." + oauth_application_details: "Der Client Geheimcode wird nach dem Schließen dieses Fensters nicht mehr zugänglich sein. Bitte kopieren Sie diese Werte in die Nextcloud OpenProject Integrationseinstellungen:" + oauth_application_details_link_text: "Zu den Einstellungen gehen" + setup_documentation_details: "Wenn Sie Hilfe bei der Konfiguration eines neuen Datei-Speichers benötigen, konsultieren Sie bitte die Dokumentation: " + setup_documentation_details_link_text: "Dateispeicher einrichten" + show_warning_details: "Um diesen Dateispeicher nutzen zu können, müssen Sie das Modul und den spezifischen Speicher in den Projekteinstellungen jedes gewünschten Projekts aktivieren." subversion: - existing_title: Vorhandenes Subversion Projektarchiv - existing_introduction: Wenn Sie ein lokales Subversion Verzeichnis haben, können - Sie es mit OpenProject verknüpfen um von innerhalb der Anwendung auf dieses - zuzugreifen. - existing_url: Bestehende URL + existing_title: "Vorhandenes Subversion Projektarchiv" + existing_introduction: "Wenn Sie ein lokales Subversion Verzeichnis haben, können Sie es mit OpenProject verknüpfen um von innerhalb der Anwendung auf dieses zuzugreifen." + existing_url: "Bestehende URL" instructions: - managed_url: Dies ist die URL des verwalteten (lokalen) Subversion Projektarchivs. - url: 'Geben Sie die URL des Projektarchivs ein. Dies kann entweder ein lokales - Projektarchiv (beginnend mit %{local_proto}) oder ein externes Projektarchiv - sein. Die folgenden URL-Schemata werden unterstützt:' - managed_title: Subversion Projektarchiv in OpenProject integriert - managed_introduction: Lassen Sie OpenProject automatisch ein lokales Subversion - Projektarchiv erstellen und integrieren. - managed_url: Verwaltete URL - password: Projektarchiv-Passwort - username: Projektarchiv-Nutzername - truncated: Dieses Projektarchiv musste limitiert werden auf %{limit} Dateien. - %{truncated} Einträge wurden von der Liste weggelassen. + managed_url: "Dies ist die URL des verwalteten (lokalen) Subversion Projektarchivs." + url: "Geben Sie die URL des Projektarchivs ein. Dies kann entweder ein lokales Projektarchiv (beginnend mit %{local_proto}) oder ein externes Projektarchiv sein. Die folgenden URL-Schemata werden unterstützt:" + managed_title: "Subversion Projektarchiv in OpenProject integriert" + managed_introduction: "Lassen Sie OpenProject automatisch ein lokales Subversion Projektarchiv erstellen und integrieren." + managed_url: "Verwaltete URL" + password: "Projektarchiv-Passwort" + username: "Projektarchiv-Nutzername" + truncated: "Dieses Projektarchiv musste limitiert werden auf %{limit} Dateien. %{truncated} Einträge wurden von der Liste weggelassen." named_repository: "%{vendor_name} Projektarchiv" - update_settings_successful: Die Einstellungen wurden erfolgreich gespeichert. - url: URL zum Projektarchiv + update_settings_successful: "Die Einstellungen wurden erfolgreich gespeichert." + url: "URL zum Projektarchiv" warnings: - cannot_annotate: Diese Datei kann nicht kommentiert werden. + cannot_annotate: "Diese Datei kann nicht kommentiert werden." scheduling: - manual: auf Manuell setzen - automatic: auf Automatisch setzen - search_input_placeholder: Suchen ... - setting_allowed_link_protocols: Erlaubte Link-Protokolle - setting_allowed_link_protocols_text_html: Erlauben Sie es, diese Protokolle als - Links in Arbeitspaket-Beschreibungen, langen Textfeldern und Kommentaren darzustellen. - Zum Beispiel %{tel_code} oder %{element_code}. Geben Sie ein Protokoll pro Zeile - ein.
Protokolle %{http_code}, %{https_code} und %{mailto_code} sind immer - erlaubt. - setting_capture_external_links: Externe Links abfangen - setting_capture_external_links_text: 'Wenn diese Funktion aktiviert ist, werden - alle externen Links in formatiertem Text auf eine vor dem Link warnende Seite - in der Applikation umgeleitet, bevor sie die Anwendung verlassen. Dies hilft, - Benutzer vor potenziell bösartigen externen Websites zu schützen. - - ' - setting_capture_external_links_require_login: Benutzer müssen angemeldet sein - setting_capture_external_links_require_login_text: 'Wenn aktiviert, müssen Benutzer - angemeldet sein, um externe Links anklicken und fortfahren zu können. - - ' - setting_after_first_login_redirect_url: Weiterleitung nach erster Anmeldung - setting_after_first_login_redirect_url_text_html: 'Legen Sie einen Pfad fest, an - den Nutzer:innen nach der ersten Anmeldung weitergeleitet werden. Wenn leer, führt - er auf die Startseite des Onboarding-Tours.
Beispiel: /meine/seite - - ' - setting_after_login_default_redirect_url: Weiterleitung nach Anmeldung - setting_after_login_default_redirect_url_text_html: 'Legen Sie einen Standardpfad - für die Weiterleitung von Benutzern nach der Anmeldung fest, wenn kein Back-Link - angegeben wurde. Falls nicht gesetzt, wird der Nutzer auf die Startseite geleitet. -
Beispiel: /my/page - - ' - setting_apiv3_cors_title: Cross-Origin Resource Sharing (CORS) - setting_apiv3_cors_enabled: CORS aktivieren - setting_apiv3_cors_origins: API V3 Cross-Origin Resource Sharing (CORS) erlaubte - Origins - setting_apiv3_cors_origins_text_html: 'Wenn CORS aktiviert ist, sind dies die Origins, - die auf die OpenProject API zugreifen dürfen.
Bitte überprüfen Sie die Dokumentation über den Origin Header, - wie die Werte anzugeben sind. - - ' - setting_apiv3_write_readonly_attributes: Schreibzugriff auf schreibgeschützte Attribute - setting_apiv3_write_readonly_attributes_instructions: 'Wenn diese Option aktiviert - ist, erlaubt die API Administratoren, bei der Erstellung statische schreibgeschützte - Attribute wie createdAt und author zu schreiben. - - ' - setting_apiv3_write_readonly_attributes_warning: 'Diese Einstellung ist z.B. für - den Import von Daten nützlich, ermöglicht es aber auch Administratoren, sich bei - der Erstellung von Artikeln als andere Benutzer auszugeben. Alle Erstellungsanfragen - werden jedoch mit dem wahren Autor protokolliert. - - ' - setting_apiv3_write_readonly_attributes_additional: 'Weitere Informationen zu Attributen - und unterstützten Ressourcen finden Sie unter %{api_documentation_link}. - - ' - setting_apiv3_max_page_size: Maximale API-Seitengröße - setting_apiv3_max_page_size_instructions: 'Legen Sie die maximale Anzahl von Ressourcen - fest, mit der die API antworten wird. API-Anfragen werden nie mehr Ressourcen - auf einer einzigen Seite zurückgeben. - - ' - setting_apiv3_max_page_size_warning: 'Bitte ändern Sie diesen Wert nur, wenn Sie - sich sicher sind, warum Sie ihn benötigen. Ein hoher Wert führt zu erheblichen - Leistungseinbußen, während ein Wert, der niedriger als die Ressourcen pro Seite - ist, zu Fehlern in paginierten Ansichten führt. - - ' - setting_apiv3_docs: Dokumentation - setting_apiv3_docs_enabled: Dokumentationsseite aktivieren - setting_apiv3_docs_enabled_instructions_html: 'Wenn die Dokumentationsseite aktiviert - ist, sehen Sie eine interaktive APIv3 Dokumentation unter %{link}. - - ' - setting_apiv3_docs_enabled_instructions_warning: 'Bitte beachten Sie, dass die Aktivierung - der API-Dokumente auf einem Produktivsystem sensible Informationen preisgeben - oder zu einem versehentlichen Datenverlust führen kann, wenn Sie nicht vorsichtig - sind. Wir empfehlen, diese Einstellung nur für Entwicklungszwecke zu aktivieren. - - ' - setting_attachment_whitelist: Positivliste für Dateiuploads - setting_email_delivery_method: E-Mail Zustellungsoption - setting_emails_salutation: Anrede der Benutzer in E-Mails - setting_oauth_allow_remapping_of_existing_users: Neuzuordnung von Authentifizierungsprovidern - der Benutzer erlauben - setting_sendmail_location: Systempfad zu sendmail - setting_sendmail_arguments: Befehlszeilenargumente für sendmail - setting_smtp_enable_starttls_auto: Automatisch STARTTLS verwenden, falls vorhanden - setting_smtp_ssl: Benutzen Sie eine SSL-Verbindung - setting_smtp_address: SMTP-Server - setting_smtp_port: SMTP-Port - setting_smtp_authentication: SMTP-Authentifizierung - setting_smtp_user_name: SMTP Benutzername - setting_smtp_password: SMTP Passwort - setting_smtp_domain: SMTP HELO-Domain - setting_activity_days_default: Anzahl Tage pro Seite der Projekt-Aktivität - setting_api_tokens_enabled: API-Tokens aktivieren - setting_api_tokens_enabled_caption: 'Entscheiden Sie, ob Benutzer in ihren Kontoeinstellungen - persönliche API-Tokens erstellen können. Diese Token können für den Zugriff auf - die verschiedenen APIs von OpenProject, wie APIv3 und MCP, verwendet werden. - - ' - setting_app_subtitle: Applikations-Untertitel - setting_app_title: Applikations-Titel - setting_attachment_max_size: Max. Dateigröße - setting_show_work_package_attachments: Anhänge standardmäßig auf dem Tab Dateien - anzeigen - setting_antivirus_scan_mode: Scanmodus - setting_antivirus_scan_action: Aktion für infizierte Datei - setting_autofetch_changesets: Automatisches Abrufen von Projektarchiv-Änderungen - setting_autologin: Automatische Anmeldung - setting_available_languages: Verfügbare Sprachen - setting_bcc_recipients: E-Mails als Blindkopie (BCC) senden - setting_brute_force_block_after_failed_logins: Sperre Benutzer nach dieser Anzahl - fehlgeschlagener Loginversuche - setting_brute_force_block_minutes: Sperre Benutzer für Dauer von - setting_cache_formatted_text: Formatierten Text im Cache speichern - setting_use_wysiwyg_description: Aktivieren, um den CKEditor5 WYSIWYG-Editor für - alle Nutzer zu aktivieren. CKEditor hat aktuell eingeschränkte Formatierungsfunktionen - für Markdown. - setting_column_options: Standard-Arbeitspaket listet Spalten auf - setting_commit_fix_keywords: Schlüsselwörter (Status) - setting_commit_logs_encoding: Codierung der Commit-Log-Meldungen - setting_commit_logtime_activity_id: Aktivität für die Zeiterfassung - setting_commit_logtime_enabled: Aktiviere Zeiterfassung - setting_commit_ref_keywords: Schlüsselwörter (Beziehungen) - setting_consent_time: Zeitpunkt der Einwilligung - setting_consent_info: Informationen zur Einwilligung - 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_first_week_of_year: Die erste Woche im Jahr enthält - setting_date_format: Datum - setting_default_language: Standard-Sprache - setting_default_projects_modules: Standardmäßig aktivierte Module für neue Projekte - setting_default_projects_public: Neue Projekte sind standardmäßig öffentlich - setting_disable_password_login: Passwort-Authentifizierung deaktivieren - setting_diff_max_lines_displayed: Maximale Anzahl anzuzeigender Diff-Zeilen - setting_omniauth_direct_login_provider: SSO-Anbieter für direkte Anmeldung - setting_display_subprojects_work_packages: Arbeitspakete von Unterprojekten im Hauptprojekt - anzeigen - setting_duration_format: Anzeige der Dauer - setting_duration_format_hours_only: Nur Stunden - setting_duration_format_days_and_hours: Tage und Stunden - setting_duration_format_instructions: Hierüber wird festgelegt, wie die Aufwand, - verbleibender Aufwand und aufgewendete Zeit angezeigt wird. - setting_emails_footer: E-Mail-Fußzeile - setting_emails_header: E-Mail-Kopfzeile - setting_email_login: E-Mail als Benutzername verwenden - setting_enabled_scm: Aktivierte Versionskontrollsysteme - setting_enabled_projects_columns: Standardmäßig angezeigte Spalten in einer Projektliste - setting_feeds_enabled: Feeds aktiviert - setting_ical_enabled: iCalendar-Abonnements aktivieren - setting_feeds_limit: Max. Anzahl Einträge pro Atom-Feed - setting_file_max_size_displayed: Maximale Größe inline angezeigter Textdateien - setting_host_name: Hostname - setting_collaborative_editing_hocuspocus_url: Hokuspokus-Server-URL - setting_collaborative_editing_hocuspocus_secret: Hokuspokus-Server-Schlüssel - setting_hours_per_day: Stunden pro Tag - setting_hours_per_day_explanation: 'Dies legt fest, was als "Tag" angesehen wird, - wenn eine zeitliche Dauer angezeigt werden (zum Beispiel: Wenn die Länge eines - Tages 8 Stunden beträgt, wird eine Eingabe von 32 Stunden als 4 Tage angezeigt).' - setting_invitation_expiration_days: Aktivierungs-Mail läuft ab nach - setting_invitation_expiration_days_caption: Anzahl der Tage, nach denen die Aktivierungs-E-Mail - abläuft. - setting_work_package_done_ratio: Modus der Fortschrittsberechnung - setting_work_package_done_ratio_field: Aufwandsbezogen - setting_work_package_done_ratio_field_caption_html: "% abgeschlossen kann - auf jeden beliebigen Wert gesetzt werden. Wenn Sie optional einen Wert für Aufwand - eingeben, wird verbleibender Aufwand automatisch abgeleitet." - setting_work_package_done_ratio_status: Statusbezogen - setting_work_package_done_ratio_status_caption_html: Jeder Status ist mit einem - Wert für % abgeschlossen verbunden. Wenn Sie den Status ändern, ändert - sich auch % abgeschlossen. - setting_work_package_done_ratio_explanation_html: 'Im aufwandsbezogenen Modus - ist % abgeschlossen frei wählbar. Falls Sie einen Wert für Aufwand angeben, wird - Verbleibender Aufand automatisch abgeleitet. Im statusbasierten Modus ist - jedem Status ein Wert für % abgeschlossen zugeordnet. Wenn Sie den Status ändern, - ändert sich % abgeschlossen. - - ' - 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_journal_aggregation_time_minutes: Benutzeraktionen aggregiert innerhalb - setting_log_requesting_user: Logge Benutzer Login, Name und Mailadresse für alle - Anfragen - setting_login_required: Authentifizierung erforderlich - setting_login_required_caption: Wenn aktiviert, müssen alle Anfragen an die Anwendung - authentifiziert werden. - setting_lost_password: Passwort-Reset erlauben - setting_lost_password_caption: Wenn aktiviert, erlauben Sie Benutzern, ihre eigenen - Passwörter zurückzusetzen. - setting_mail_from: E-Mail-Absender - setting_mail_handler_api_key: API-Schlüssel - setting_mail_handler_body_delimiters: Schneide E-Mails nach einer dieser Zeilen - ab - setting_mail_handler_body_delimiter_regex: Schneide E-Mails nach Zeile ab, die diesem - regulären Ausdruck entspricht - setting_mail_handler_ignore_filenames: Ignorierte E-Mail-Anhänge - setting_new_project_user_role_id: Rolle, die einem Nicht-Administrator zugeordnet - wird, der ein Projekt erstellt - setting_new_project_send_confirmation_email: Benachrichtigung an den Autor senden, - wenn ein neues Projekt erstellt wird - setting_new_project_notification_text: Benachrichtigungstext - setting_password_active_rules: Aktive Zeichenklassen - setting_password_count_former_banned: Anzahl zuletzt benutzter Passwörter, die nicht - wiederverwendet werden dürfen - setting_password_days_valid: Anzahl von Tagen, nach denen ein Passwortwechsel erzwungen - wird - setting_password_min_length: Minimale Länge - setting_password_min_adhered_rules: Mindestanzahl zu verwendender Zeichenklassen - setting_per_page_options: Objekte pro Seite - setting_percent_complete_on_status_closed: "% abgeschlossen, wenn der Status geschlossen - ist" - setting_percent_complete_on_status_closed_no_change: Keine Änderung - setting_percent_complete_on_status_closed_no_change_caption_html: Der Wert von % - abgeschlossen ändert sich nicht, auch wenn ein Arbeitspaket geschlossen wird. - setting_percent_complete_on_status_closed_set_100p: Automatisch auf 100 % eingestellt - setting_percent_complete_on_status_closed_set_100p_caption: Ein Arbeitspaket mit - geschlossenem Status wird als vollständig betrachtet. - setting_plain_text_mail: Nur reinen Text (kein HTML) senden - setting_protocol: Protokoll - setting_project_gantt_query: Projekt-Portfolioübersicht - setting_project_gantt_query_text: Sie können die Ansicht konfigurieren, die verwendet - wird, um Gantt-Diagramm von der Projektliste zu erzeugen. - setting_security_badge_displayed: Plakette zur Update-Sicherheit anzeigen - setting_registration_footer: Fußzeile der Registrierung-Ansicht - setting_registration_footer_caption: Dieser Text wird am Ende der Registrierungsseite - angezeigt. Verwenden Sie den HTML-Editor, um den Text für jede ausgewählte Sprache - zu definieren. - setting_repositories_automatic_managed_vendor: Automatisch genutzter Projektarchiv - Anbieter-Typ - setting_repositories_encodings: Codierungen der Projektarchive - setting_repository_storage_cache_minutes: Speicher-Dauer der abgerufenen Festplattengröße - setting_repository_checkout_display: Zeige Checkout-Anweisungen - setting_repository_checkout_base_url: Checkout URL-Präfix - setting_repository_checkout_text: Hilfetext für Checkout-Anweisung - setting_repository_log_display_limit: Maximale Anzahl anzuzeigender Revisionen in - der Historie einer Datei - setting_repository_truncate_at: Maximale Anzahl Dateien im Projektarchiv-Browser - angezeigt - setting_self_registration: Selbstregistrierung - setting_self_registration_caption: 'Wählen Sie die Option zur Selbstregistrierung - für die Benutzer. Bitte beachten Sie: Einige Optionen ermöglichen Benutzern, ihre - eigenen Konten auf dieser Instanz zu aktivieren. - - ' - setting_self_registration_warning: 'Mit dieser Einstellung sind Benutzer in der - Lage, eigene Konten zu erstellen und zu aktivieren. Bitte beachten Sie, dass diese - dadurch Zugriff auf alle öffentlichen Projekte und deren Inhalte erhalten. Bitte - stellen Sie sicher, dass in öffentlichen Projekten keine sensiblen oder privaten - Daten gespeichert werden. - - ' - setting_self_registration_disabled: Deaktiviert - setting_self_registration_disabled_caption: 'Es können keine Konten selbst erzeugt - werden. Nur Administratoren und Benutzer mit der globalen Berechtigung zum Erstellen - neuer Benutzer können neue Konten erstellen. - - ' - setting_self_registration_activation_by_email: Kontoaktivierung durch E-Mail - setting_self_registration_activation_by_email_caption: 'Benutzer können sich selbst - registrieren und ihr Konto nach Bestätigung ihrer E-Mail-Adresse aktivieren. Administratoren - haben keine Kontrolle über den Aktivierungsprozess. - - ' - setting_self_registration_automatic_activation: Automatische Kontoaktivierung - setting_self_registration_automatic_activation_caption: 'Benutzer können sich selbst - registrieren. Ihre Konten sind sofort ohne weitere Interaktion aktiviert. Administratoren - haben keine Kontrolle über den Aktivierungsprozess. - - ' - setting_self_registration_manual_activation: Manuelle Kontoaktivierung - setting_self_registration_manual_activation_caption: 'Benutzer können sich selbst - anmelden. Ihre Konten sind noch nicht zugänglich, bis ein Administrator oder Benutzer - mit der globalen Berechtigung zur Erstellung oder Verwaltung von Benutzern diese - aktiviert. - - ' - setting_session_ttl: Session-Ablaufzeit nach Inaktivität - setting_session_ttl_hint: Wert kleiner 5 wirkt wie ausgeschaltet - setting_session_ttl_enabled: Session läuft ab - setting_start_of_week: Wochenanfang am - setting_sys_api_enabled: Den Web-Service zur Projektarchiv-Verwaltung aktivieren - setting_sys_api_description: Der Web-Service für Projektarchiv-Verwaltung erlaubt - Integration und Nutzer-Autorisierung für den Zugriff auf Projektarchive. - setting_time_format: Zeit - setting_total_percent_complete_mode: Berechnung des Gesamtwerts % abgeschlossen - in Hierarchien - setting_total_percent_complete_mode_work_weighted_average: Nach Aufwand gewichtet - setting_total_percent_complete_mode_work_weighted_average_caption_html: Der Gesamtwert - % abgeschlossen wird gegen den Aufwand der einzelnen Arbeitspakete - in der Hierarchie gewichtet. Arbeitspakete ohne Aufwand werden ignoriert. - setting_total_percent_complete_mode_simple_average: Einfacher Durchschnitt - setting_total_percent_complete_mode_simple_average_caption_html: Der Aufwand - wird ignoriert und der Gesamtwert % abgeschlossen ist der einfache Durchschnitt - der % abgeschlossen Werte der Arbeitspakete in der Hierarchie. - setting_accessibility_mode_for_anonymous: Barrierefreien Modus für nicht angemeldete - Nutzer aktivieren - setting_user_format: Format des Benutzernamens - setting_user_default_timezone: Standard-Zeitzone für Benutzer - setting_users_deletable_by_admins: Admins können Nutzeraccounts löschen - setting_users_deletable_by_self: Nutzer können ihren Account löschen - setting_welcome_text: Text für Willkommens-Block - setting_welcome_title: Titel des Willkommens-Block - setting_welcome_on_homescreen: Willkommens-Block auf Startseite anzeigen - setting_work_package_list_default_highlighting_mode: Standard Hervorhebung - setting_work_package_list_default_highlighted_attributes: Voreinstellung Inline - Hervorherbung - setting_working_days: Arbeitstage + manual: "auf Manuell setzen" + automatic: "auf Automatisch setzen" + search_input_placeholder: "Suchen ..." + setting_allowed_link_protocols: "Erlaubte Link-Protokolle" + setting_allowed_link_protocols_text_html: >- + Erlauben Sie es, diese Protokolle als Links in Arbeitspaket-Beschreibungen, langen Textfeldern und Kommentaren darzustellen. Zum Beispiel %{tel_code} oder %{element_code}. Geben Sie ein Protokoll pro Zeile ein.
Protokolle %{http_code}, %{https_code} und %{mailto_code} sind immer erlaubt. + setting_capture_external_links: "Externe Links abfangen" + setting_capture_external_links_text: > + Wenn diese Funktion aktiviert ist, werden alle externen Links in formatiertem Text auf eine vor dem Link warnende Seite in der Applikation umgeleitet, bevor sie die Anwendung verlassen. Dies hilft, Benutzer vor potenziell bösartigen externen Websites zu schützen. + setting_capture_external_links_require_login: "Benutzer müssen angemeldet sein" + setting_capture_external_links_require_login_text: > + Wenn aktiviert, müssen Benutzer angemeldet sein, um externe Links anklicken und fortfahren zu können. + setting_after_first_login_redirect_url: "Weiterleitung nach erster Anmeldung" + setting_after_first_login_redirect_url_text_html: > + Legen Sie einen Pfad fest, an den Nutzer:innen nach der ersten Anmeldung weitergeleitet werden. Wenn leer, führt er auf die Startseite des Onboarding-Tours.
Beispiel: /meine/seite + setting_after_login_default_redirect_url: "Weiterleitung nach Anmeldung" + setting_after_login_default_redirect_url_text_html: > + Legen Sie einen Standardpfad für die Weiterleitung von Benutzern nach der Anmeldung fest, wenn kein Back-Link angegeben wurde. Falls nicht gesetzt, wird der Nutzer auf die Startseite geleitet.
Beispiel: /my/page + setting_apiv3_cors_title: "Cross-Origin Resource Sharing (CORS)" + setting_apiv3_cors_enabled: "CORS aktivieren" + setting_apiv3_cors_origins: "API V3 Cross-Origin Resource Sharing (CORS) erlaubte Origins" + setting_apiv3_cors_origins_text_html: > + Wenn CORS aktiviert ist, sind dies die Origins, die auf die OpenProject API zugreifen dürfen.
Bitte überprüfen Sie die Dokumentation über den Origin Header, wie die Werte anzugeben sind. + setting_apiv3_write_readonly_attributes: "Schreibzugriff auf schreibgeschützte Attribute" + setting_apiv3_write_readonly_attributes_instructions: > + Wenn diese Option aktiviert ist, erlaubt die API Administratoren, bei der Erstellung statische schreibgeschützte Attribute wie createdAt und author zu schreiben. + setting_apiv3_write_readonly_attributes_warning: > + Diese Einstellung ist z.B. für den Import von Daten nützlich, ermöglicht es aber auch Administratoren, sich bei der Erstellung von Artikeln als andere Benutzer auszugeben. Alle Erstellungsanfragen werden jedoch mit dem wahren Autor protokolliert. + setting_apiv3_write_readonly_attributes_additional: > + Weitere Informationen zu Attributen und unterstützten Ressourcen finden Sie unter %{api_documentation_link}. + setting_apiv3_max_page_size: "Maximale API-Seitengröße" + setting_apiv3_max_page_size_instructions: > + Legen Sie die maximale Anzahl von Ressourcen fest, mit der die API antworten wird. API-Anfragen werden nie mehr Ressourcen auf einer einzigen Seite zurückgeben. + setting_apiv3_max_page_size_warning: > + Bitte ändern Sie diesen Wert nur, wenn Sie sich sicher sind, warum Sie ihn benötigen. Ein hoher Wert führt zu erheblichen Leistungseinbußen, während ein Wert, der niedriger als die Ressourcen pro Seite ist, zu Fehlern in paginierten Ansichten führt. + setting_apiv3_docs: "Dokumentation" + setting_apiv3_docs_enabled: "Dokumentationsseite aktivieren" + setting_apiv3_docs_enabled_instructions_html: > + Wenn die Dokumentationsseite aktiviert ist, sehen Sie eine interaktive APIv3 Dokumentation unter %{link}. + setting_apiv3_docs_enabled_instructions_warning: > + Bitte beachten Sie, dass die Aktivierung der API-Dokumente auf einem Produktivsystem sensible Informationen preisgeben oder zu einem versehentlichen Datenverlust führen kann, wenn Sie nicht vorsichtig sind. Wir empfehlen, diese Einstellung nur für Entwicklungszwecke zu aktivieren. + setting_attachment_whitelist: "Positivliste für Dateiuploads" + setting_email_delivery_method: "E-Mail Zustellungsoption" + setting_emails_salutation: "Anrede der Benutzer in E-Mails" + setting_oauth_allow_remapping_of_existing_users: "Neuzuordnung von Authentifizierungsprovidern der Benutzer erlauben" + setting_sendmail_location: "Systempfad zu sendmail" + setting_sendmail_arguments: "Befehlszeilenargumente für sendmail" + setting_smtp_enable_starttls_auto: "Automatisch STARTTLS verwenden, falls vorhanden" + setting_smtp_ssl: "Benutzen Sie eine SSL-Verbindung" + setting_smtp_address: "SMTP-Server" + setting_smtp_port: "SMTP-Port" + setting_smtp_authentication: "SMTP-Authentifizierung" + setting_smtp_user_name: "SMTP Benutzername" + setting_smtp_password: "SMTP Passwort" + setting_smtp_domain: "SMTP HELO-Domain" + setting_activity_days_default: "Anzahl Tage pro Seite der Projekt-Aktivität" + setting_api_tokens_enabled: "API-Tokens aktivieren" + setting_api_tokens_enabled_caption: > + Entscheiden Sie, ob Benutzer in ihren Kontoeinstellungen persönliche API-Tokens erstellen können. Diese Token können für den Zugriff auf die verschiedenen APIs von OpenProject, wie APIv3 und MCP, verwendet werden. + setting_app_subtitle: "Applikations-Untertitel" + setting_app_title: "Applikations-Titel" + setting_attachment_max_size: "Max. Dateigröße" + setting_show_work_package_attachments: "Anhänge standardmäßig auf dem Tab Dateien anzeigen" + setting_antivirus_scan_mode: "Scanmodus" + setting_antivirus_scan_action: "Aktion für infizierte Datei" + setting_autofetch_changesets: "Automatisches Abrufen von Projektarchiv-Änderungen" + setting_autologin: "Automatische Anmeldung" + setting_available_languages: "Verfügbare Sprachen" + setting_bcc_recipients: "E-Mails als Blindkopie (BCC) senden" + setting_brute_force_block_after_failed_logins: "Sperre Benutzer nach dieser Anzahl fehlgeschlagener Loginversuche" + setting_brute_force_block_minutes: "Sperre Benutzer für Dauer von" + setting_cache_formatted_text: "Formatierten Text im Cache speichern" + setting_use_wysiwyg_description: "Aktivieren, um den CKEditor5 WYSIWYG-Editor für alle Nutzer zu aktivieren. CKEditor hat aktuell eingeschränkte Formatierungsfunktionen für Markdown." + setting_column_options: "Standard-Arbeitspaket listet Spalten auf" + setting_commit_fix_keywords: "Schlüsselwörter (Status)" + setting_commit_logs_encoding: "Codierung der Commit-Log-Meldungen" + setting_commit_logtime_activity_id: "Aktivität für die Zeiterfassung" + setting_commit_logtime_enabled: "Aktiviere Zeiterfassung" + setting_commit_ref_keywords: "Schlüsselwörter (Beziehungen)" + setting_consent_time: "Zeitpunkt der Einwilligung" + setting_consent_info: "Informationen zur Einwilligung" + 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_first_week_of_year: "Die erste Woche im Jahr enthält" + setting_date_format: "Datum" + setting_default_language: "Standard-Sprache" + setting_default_projects_modules: "Standardmäßig aktivierte Module für neue Projekte" + setting_default_projects_public: "Neue Projekte sind standardmäßig öffentlich" + setting_disable_password_login: "Passwort-Authentifizierung deaktivieren" + setting_diff_max_lines_displayed: "Maximale Anzahl anzuzeigender Diff-Zeilen" + setting_omniauth_direct_login_provider: "SSO-Anbieter für direkte Anmeldung" + setting_display_subprojects_work_packages: "Arbeitspakete von Unterprojekten im Hauptprojekt anzeigen" + setting_duration_format: "Anzeige der Dauer" + setting_duration_format_hours_only: "Nur Stunden" + setting_duration_format_days_and_hours: "Tage und Stunden" + setting_duration_format_instructions: "Hierüber wird festgelegt, wie die Aufwand, verbleibender Aufwand und aufgewendete Zeit angezeigt wird." + setting_emails_footer: "E-Mail-Fußzeile" + setting_emails_header: "E-Mail-Kopfzeile" + setting_email_login: "E-Mail als Benutzername verwenden" + setting_enabled_scm: "Aktivierte Versionskontrollsysteme" + setting_enabled_projects_columns: "Standardmäßig angezeigte Spalten in einer Projektliste" + setting_feeds_enabled: "Feeds aktiviert" + setting_ical_enabled: "iCalendar-Abonnements aktivieren" + setting_feeds_limit: "Max. Anzahl Einträge pro Atom-Feed" + setting_file_max_size_displayed: "Maximale Größe inline angezeigter Textdateien" + setting_host_name: "Hostname" + setting_collaborative_editing_hocuspocus_url: "Hokuspokus-Server-URL" + setting_collaborative_editing_hocuspocus_secret: "Hokuspokus-Server-Schlüssel" + setting_hours_per_day: "Stunden pro Tag" + setting_hours_per_day_explanation: >- + Dies legt fest, was als "Tag" angesehen wird, wenn eine zeitliche Dauer angezeigt werden (zum Beispiel: Wenn die Länge eines Tages 8 Stunden beträgt, wird eine Eingabe von 32 Stunden als 4 Tage angezeigt). + setting_invitation_expiration_days: "Aktivierungs-Mail läuft ab nach" + setting_invitation_expiration_days_caption: "Anzahl der Tage, nach denen die Aktivierungs-E-Mail abläuft." + setting_work_package_done_ratio: "Modus der Fortschrittsberechnung" + setting_work_package_done_ratio_field: "Aufwandsbezogen" + setting_work_package_done_ratio_field_caption_html: >- + % abgeschlossen kann auf jeden beliebigen Wert gesetzt werden. Wenn Sie optional einen Wert für Aufwand eingeben, wird verbleibender Aufwand automatisch abgeleitet. + setting_work_package_done_ratio_status: "Statusbezogen" + setting_work_package_done_ratio_status_caption_html: >- + Jeder Status ist mit einem Wert für % abgeschlossen verbunden. Wenn Sie den Status ändern, ändert sich auch % abgeschlossen. + setting_work_package_done_ratio_explanation_html: > + Im aufwandsbezogenen Modus ist % abgeschlossen frei wählbar. Falls Sie einen Wert für Aufwand angeben, wird Verbleibender Aufand automatisch abgeleitet. Im statusbasierten Modus ist jedem Status ein Wert für % abgeschlossen zugeordnet. Wenn Sie den Status ändern, ändert sich % abgeschlossen. + 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_journal_aggregation_time_minutes: "Benutzeraktionen aggregiert innerhalb" + setting_log_requesting_user: "Logge Benutzer Login, Name und Mailadresse für alle Anfragen" + setting_login_required: "Authentifizierung erforderlich" + setting_login_required_caption: "Wenn aktiviert, müssen alle Anfragen an die Anwendung authentifiziert werden." + setting_lost_password: "Passwort-Reset erlauben" + setting_lost_password_caption: "Wenn aktiviert, erlauben Sie Benutzern, ihre eigenen Passwörter zurückzusetzen." + setting_mail_from: "E-Mail-Absender" + setting_mail_handler_api_key: "API-Schlüssel" + setting_mail_handler_body_delimiters: "Schneide E-Mails nach einer dieser Zeilen ab" + setting_mail_handler_body_delimiter_regex: "Schneide E-Mails nach Zeile ab, die diesem regulären Ausdruck entspricht" + setting_mail_handler_ignore_filenames: "Ignorierte E-Mail-Anhänge" + setting_new_project_user_role_id: "Rolle, die einem Nicht-Administrator zugeordnet wird, der ein Projekt erstellt" + setting_new_project_send_confirmation_email: "Benachrichtigung an den Autor senden, wenn ein neues Projekt erstellt wird" + setting_new_project_notification_text: "Benachrichtigungstext" + setting_password_active_rules: "Aktive Zeichenklassen" + setting_password_count_former_banned: "Anzahl zuletzt benutzter Passwörter, die nicht wiederverwendet werden dürfen" + setting_password_days_valid: "Anzahl von Tagen, nach denen ein Passwortwechsel erzwungen wird" + setting_password_min_length: "Minimale Länge" + setting_password_min_adhered_rules: "Mindestanzahl zu verwendender Zeichenklassen" + setting_per_page_options: "Objekte pro Seite" + setting_percent_complete_on_status_closed: "% abgeschlossen, wenn der Status geschlossen ist" + setting_percent_complete_on_status_closed_no_change: "Keine Änderung" + setting_percent_complete_on_status_closed_no_change_caption_html: >- + Der Wert von % abgeschlossen ändert sich nicht, auch wenn ein Arbeitspaket geschlossen wird. + setting_percent_complete_on_status_closed_set_100p: "Automatisch auf 100 % eingestellt" + setting_percent_complete_on_status_closed_set_100p_caption: >- + Ein Arbeitspaket mit geschlossenem Status wird als vollständig betrachtet. + setting_plain_text_mail: "Nur reinen Text (kein HTML) senden" + setting_protocol: "Protokoll" + setting_project_gantt_query: "Projekt-Portfolioübersicht" + setting_project_gantt_query_text: "Sie können die Ansicht konfigurieren, die verwendet wird, um Gantt-Diagramm von der Projektliste zu erzeugen." + setting_security_badge_displayed: "Plakette zur Update-Sicherheit anzeigen" + setting_registration_footer: "Fußzeile der Registrierung-Ansicht" + setting_registration_footer_caption: "Dieser Text wird am Ende der Registrierungsseite angezeigt. Verwenden Sie den HTML-Editor, um den Text für jede ausgewählte Sprache zu definieren." + setting_repositories_automatic_managed_vendor: "Automatisch genutzter Projektarchiv Anbieter-Typ" + setting_repositories_encodings: "Codierungen der Projektarchive" + setting_repository_storage_cache_minutes: "Speicher-Dauer der abgerufenen Festplattengröße" + setting_repository_checkout_display: "Zeige Checkout-Anweisungen" + setting_repository_checkout_base_url: "Checkout URL-Präfix" + setting_repository_checkout_text: "Hilfetext für Checkout-Anweisung" + setting_repository_log_display_limit: "Maximale Anzahl anzuzeigender Revisionen in der Historie einer Datei" + setting_repository_truncate_at: "Maximale Anzahl Dateien im Projektarchiv-Browser angezeigt" + setting_self_registration: "Selbstregistrierung" + setting_self_registration_caption: > + Wählen Sie die Option zur Selbstregistrierung für die Benutzer. Bitte beachten Sie: Einige Optionen ermöglichen Benutzern, ihre eigenen Konten auf dieser Instanz zu aktivieren. + setting_self_registration_warning: > + Mit dieser Einstellung sind Benutzer in der Lage, eigene Konten zu erstellen und zu aktivieren. Bitte beachten Sie, dass diese dadurch Zugriff auf alle öffentlichen Projekte und deren Inhalte erhalten. Bitte stellen Sie sicher, dass in öffentlichen Projekten keine sensiblen oder privaten Daten gespeichert werden. + setting_self_registration_disabled: "Deaktiviert" + setting_self_registration_disabled_caption: > + Es können keine Konten selbst erzeugt werden. Nur Administratoren und Benutzer mit der globalen Berechtigung zum Erstellen neuer Benutzer können neue Konten erstellen. + setting_self_registration_activation_by_email: "Kontoaktivierung durch E-Mail" + setting_self_registration_activation_by_email_caption: > + Benutzer können sich selbst registrieren und ihr Konto nach Bestätigung ihrer E-Mail-Adresse aktivieren. Administratoren haben keine Kontrolle über den Aktivierungsprozess. + setting_self_registration_automatic_activation: "Automatische Kontoaktivierung" + setting_self_registration_automatic_activation_caption: > + Benutzer können sich selbst registrieren. Ihre Konten sind sofort ohne weitere Interaktion aktiviert. Administratoren haben keine Kontrolle über den Aktivierungsprozess. + setting_self_registration_manual_activation: "Manuelle Kontoaktivierung" + setting_self_registration_manual_activation_caption: > + Benutzer können sich selbst anmelden. Ihre Konten sind noch nicht zugänglich, bis ein Administrator oder Benutzer mit der globalen Berechtigung zur Erstellung oder Verwaltung von Benutzern diese aktiviert. + setting_session_ttl: "Session-Ablaufzeit nach Inaktivität" + setting_session_ttl_hint: "Wert kleiner 5 wirkt wie ausgeschaltet" + setting_session_ttl_enabled: "Session läuft ab" + setting_start_of_week: "Wochenanfang am" + setting_sys_api_enabled: "Den Web-Service zur Projektarchiv-Verwaltung aktivieren" + setting_sys_api_description: "Der Web-Service für Projektarchiv-Verwaltung erlaubt Integration und Nutzer-Autorisierung für den Zugriff auf Projektarchive." + setting_time_format: "Zeit" + setting_total_percent_complete_mode: "Berechnung des Gesamtwerts % abgeschlossen in Hierarchien" + setting_total_percent_complete_mode_work_weighted_average: "Nach Aufwand gewichtet" + setting_total_percent_complete_mode_work_weighted_average_caption_html: >- + Der Gesamtwert % abgeschlossen wird gegen den Aufwand der einzelnen Arbeitspakete in der Hierarchie gewichtet. Arbeitspakete ohne Aufwand werden ignoriert. + setting_total_percent_complete_mode_simple_average: "Einfacher Durchschnitt" + setting_total_percent_complete_mode_simple_average_caption_html: >- + Der Aufwand wird ignoriert und der Gesamtwert % abgeschlossen ist der einfache Durchschnitt der % abgeschlossen Werte der Arbeitspakete in der Hierarchie. + setting_accessibility_mode_for_anonymous: "Barrierefreien Modus für nicht angemeldete Nutzer aktivieren" + setting_user_format: "Format des Benutzernamens" + setting_user_default_timezone: "Standard-Zeitzone für Benutzer" + setting_users_deletable_by_admins: "Admins können Nutzeraccounts löschen" + setting_users_deletable_by_self: "Nutzer können ihren Account löschen" + setting_welcome_text: "Text für Willkommens-Block" + setting_welcome_title: "Titel des Willkommens-Block" + setting_welcome_on_homescreen: "Willkommens-Block auf Startseite anzeigen" + setting_work_package_list_default_highlighting_mode: "Standard Hervorhebung" + setting_work_package_list_default_highlighted_attributes: "Voreinstellung Inline Hervorherbung" + setting_working_days: "Arbeitstage" settings: errors: - not_writable: Diese Einstellung ist nicht schreibbar und kann nur außerhalb - der Anwendung von einem Systemadministrator geändert werden. - failed_to_update: 'Die Einstellung ''%{name}'' konnte nicht aktualisiert werden: - %{message}' + not_writable: "Diese Einstellung ist nicht schreibbar und kann nur außerhalb der Anwendung von einem Systemadministrator geändert werden." + failed_to_update: "Die Einstellung '%{name}' konnte nicht aktualisiert werden: %{message}" authentication: - login: Anmelden - registration: Registrierung - sso: Single Sign-On (SSO) - omniauth_direct_login_hint_html: 'Wenn diese Option aktiviert ist, werden die - Anmeldeanfragen an den konfigurierten SSO-Anbieter weitergeleitet. Das Login-Dropdown - und die Anmeldeseite sind dann deaktiviert.
Hinweis: - Sofern Sie nicht auch die Passwortanmeldung deaktivieren, können sich Benutzer - bei aktivierter Option immer noch intern anmelden, indem sie die interne Anmeldeseite - %{internal_path} verwenden. - - ' - remapping_existing_users_hint: 'Wenn diese Option aktiviert ist, kann jeder - konfigurierte Identitätsanbieter bestehende Benutzer anhand ihrer E-Mail-Adresse - oder Login erzeugen, auch wenn sich der Benutzer noch nie über diesen Anbieter - angemeldet hat. Dies kann bei der Migration der OpenProject-Instanz zu einem - neuen SSO-Anbieter nützlich sein, wird aber nicht empfohlen, wenn Sie einen - Anbieter verwenden, dem nicht alle Benutzer Ihrer Instanz vertrauen. - - ' + login: "Anmelden" + registration: "Registrierung" + sso: "Single Sign-On (SSO)" + omniauth_direct_login_hint_html: > + Wenn diese Option aktiviert ist, werden die Anmeldeanfragen an den konfigurierten SSO-Anbieter weitergeleitet. Das Login-Dropdown und die Anmeldeseite sind dann deaktiviert.
Hinweis: Sofern Sie nicht auch die Passwortanmeldung deaktivieren, können sich Benutzer bei aktivierter Option immer noch intern anmelden, indem sie die interne Anmeldeseite %{internal_path} verwenden. + remapping_existing_users_hint: > + Wenn diese Option aktiviert ist, kann jeder konfigurierte Identitätsanbieter bestehende Benutzer anhand ihrer E-Mail-Adresse oder Login erzeugen, auch wenn sich der Benutzer noch nie über diesen Anbieter angemeldet hat. Dies kann bei der Migration der OpenProject-Instanz zu einem neuen SSO-Anbieter nützlich sein, wird aber nicht empfohlen, wenn Sie einen Anbieter verwenden, dem nicht alle Benutzer Ihrer Instanz vertrauen. attachments: - whitelist_text_html: 'Legen Sie eine Liste gültiger Dateierweiterungen und/oder - Mime-Typen für hochgeladene Dateien fest.
Dateierweiterungen (z. B. - %{ext_example}) oder Mime-Typen (z. ., %{mime_example}). -
Lassen Sie diese Liste leer, um das Hochladen beliebiger Dateitypen - zu erlauben. Mehrere Werte erlaubt (eine Zeile pro Wert). - - ' - show_work_package_attachments: 'Wenn Sie diese Option deaktivieren, wird die - Liste der Anhänge auf dem Dateien Tab von Arbeitspaketen für neue Projekte - ausgeblendet. Die Dateien, die in der Beschreibung eines Arbeitspakets angehängt - sind, werden weiterhin in den internen Speicher für Anhänge hochgeladen. - - ' + whitelist_text_html: > + Legen Sie eine Liste gültiger Dateierweiterungen und/oder Mime-Typen für hochgeladene Dateien fest.
Dateierweiterungen (z. B. %{ext_example}) oder Mime-Typen (z. ., %{mime_example}).
Lassen Sie diese Liste leer, um das Hochladen beliebiger Dateitypen zu erlauben. Mehrere Werte erlaubt (eine Zeile pro Wert). + show_work_package_attachments: > + Wenn Sie diese Option deaktivieren, wird die Liste der Anhänge auf dem Dateien Tab von Arbeitspaketen für neue Projekte ausgeblendet. Die Dateien, die in der Beschreibung eines Arbeitspakets angehängt sind, werden weiterhin in den internen Speicher für Anhänge hochgeladen. antivirus: - title: Virenscan - clamav_ping_failed: Die Verbindung zum ClamAV-Daemon konnte nicht hergestellt - werden. Überprüfen Sie die Konfiguration und versuchen Sie es erneut. - remaining_quarantined_files_html: 'Die Virenprüfung wurde deaktiviert. %{file_count} - verbleiben in Quarantäne. Um die unter Quarantäne gestellten Dateien zu überprüfen, - besuchen Sie bitte diesen Link: %{link} - - ' - remaining_scan_complete_html: 'Die verbleibenden Dateien wurden gescannt. Es - befinden sich %{file_count} unter Quarantäne. Sie werden zur Quarantäneseite - weitergeleitet. Auf dieser Seite können Sie unter Quarantäne gestellte Dateien - löschen oder überschreiben. - - ' - remaining_rescanned_files: 'Die Virenprüfung wurde erfolgreich aktiviert. Es - gibt %{file_count} , die bis zum aktuellen Zeitpunkt hochgeladen wurden und - noch gescannt werden müssen. Dieser Vorgang wird im Hintergrund ausgeführt. - Die Dateien bleiben während des Scans zugänglich. - - ' + title: "Virenscan" + clamav_ping_failed: "Die Verbindung zum ClamAV-Daemon konnte nicht hergestellt werden. Überprüfen Sie die Konfiguration und versuchen Sie es erneut." + remaining_quarantined_files_html: > + Die Virenprüfung wurde deaktiviert. %{file_count} verbleiben in Quarantäne. Um die unter Quarantäne gestellten Dateien zu überprüfen, besuchen Sie bitte diesen Link: %{link} + remaining_scan_complete_html: > + Die verbleibenden Dateien wurden gescannt. Es befinden sich %{file_count} unter Quarantäne. Sie werden zur Quarantäneseite weitergeleitet. Auf dieser Seite können Sie unter Quarantäne gestellte Dateien löschen oder überschreiben. + remaining_rescanned_files: > + Die Virenprüfung wurde erfolgreich aktiviert. Es gibt %{file_count} , die bis zum aktuellen Zeitpunkt hochgeladen wurden und noch gescannt werden müssen. Dieser Vorgang wird im Hintergrund ausgeführt. Die Dateien bleiben während des Scans zugänglich. actions: - delete: Datei löschen - quarantine: Datei unter Quarantäne stellen - instructions_html: 'Wählen Sie die Aktion aus, die für Dateien durchgeführt - werden soll, in denen ein Virus erkannt wurde:
  • %{quarantine_option}: - Die Datei unter Quarantäne stellen, sodass Benutzer nicht darauf zugreifen - können. Administratoren können die unter Quarantäne gestellten Dateien in - der Administration überprüfen und löschen.
  • %{delete_option}: - Die Datei sofort löschen.
- - ' + delete: "Datei löschen" + quarantine: "Datei unter Quarantäne stellen" + instructions_html: > + Wählen Sie die Aktion aus, die für Dateien durchgeführt werden soll, in denen ein Virus erkannt wurde:
  • %{quarantine_option}: Die Datei unter Quarantäne stellen, sodass Benutzer nicht darauf zugreifen können. Administratoren können die unter Quarantäne gestellten Dateien in der Administration überprüfen und löschen.
  • %{delete_option}: Die Datei sofort löschen.
modes: clamav_socket_html: Geben Sie den Socket für den clamd-Daemon ein, z.B. %{example} - clamav_host_html: 'Geben Sie den Hostnamen und den Port des clamd Daemons - ein, getrennt durch einen Doppelpunkt. z.B.: %{example}' - description_html: 'Wählen Sie den Betriebsmodus für die Integration des Antiviren-Scanners - aus.
  • %{disabled_option}: Hochgeladene Dateien - werden nicht auf Viren gescannt.
  • %{socket_option}: - Sie haben ClamAV auf demselben Server wie OpenProject eingerichtet und der - Scan-Daemon clamd läuft im Hintergrund
  • %{host_option}: - Sie streamen Dateien an einen externen Virenscanner.
- - ' - brute_force_prevention: Automatisches Sperren von Benutzern + clamav_host_html: 'Geben Sie den Hostnamen und den Port des clamd Daemons ein, getrennt durch einen Doppelpunkt. z.B.: %{example}' + description_html: > + Wählen Sie den Betriebsmodus für die Integration des Antiviren-Scanners aus.
  • %{disabled_option}: Hochgeladene Dateien werden nicht auf Viren gescannt.
  • %{socket_option}: Sie haben ClamAV auf demselben Server wie OpenProject eingerichtet und der Scan-Daemon clamd läuft im Hintergrund
  • %{host_option}: Sie streamen Dateien an einen externen Virenscanner.
+ brute_force_prevention: "Automatisches Sperren von Benutzern" date_format: - first_date_of_week_and_year_set: 'Wenn beide Optionen "%{day_of_week_setting_name}" - oder "%{first_week_setting_name}" gesetzt sind der andere muss ebenfalls gesetzt - werden, um die Darstellung konsistent zu halten. - - ' - first_week_of_year_text_html: 'Wählen Sie das Datum aus dem Monat Januar, das - in der ersten Woche des Jahres enthalten ist. Dieser Wert zusammen mit dem - ersten Wochentag bestimmt die Gesamtzahl der Wochen in einem Jahr. Weitere - Informationen finden Sie in unserer Dokumentation - zu diesem Thema. - - ' + first_date_of_week_and_year_set: > + Wenn beide Optionen "%{day_of_week_setting_name}" oder "%{first_week_setting_name}" gesetzt sind der andere muss ebenfalls gesetzt werden, um die Darstellung konsistent zu halten. + first_week_of_year_text_html: > + Wählen Sie das Datum aus dem Monat Januar, das in der ersten Woche des Jahres enthalten ist. Dieser Wert zusammen mit dem ersten Wochentag bestimmt die Gesamtzahl der Wochen in einem Jahr. Weitere Informationen finden Sie in unserer Dokumentation zu diesem Thema. experimental: - save_confirmation: Achtung! Risiko für Datenverlust! Aktivieren Sie diese experimentelle - Funktionen nur, wenn diese Instanz zu Testzwecken verwendet wird und Datenverlust - oder -korruption akzeptiert wird. - warning_toast: Feature Flags sind Einstellungen, die Funktionen aktivieren, - die noch in Entwicklung sind. Sie werden nur für Testzwecke verwendet. Sie - sollten niemals in OpenProject Installationen aktiviert werden, die produktive - Daten enthalten. Diese Funktionen werden sehr wahrscheinlich Ihre Daten beschädigen. - Verwenden Sie diese Optionen auf eigene Gefahr. + save_confirmation: Achtung! Risiko für Datenverlust! Aktivieren Sie diese experimentelle Funktionen nur, wenn diese Instanz zu Testzwecken verwendet wird und Datenverlust oder -korruption akzeptiert wird. + warning_toast: Feature Flags sind Einstellungen, die Funktionen aktivieren, die noch in Entwicklung sind. Sie werden nur für Testzwecke verwendet. Sie sollten niemals in OpenProject Installationen aktiviert werden, die produktive Daten enthalten. Diese Funktionen werden sehr wahrscheinlich Ihre Daten beschädigen. Verwenden Sie diese Optionen auf eigene Gefahr. feature_flags: Feature Flags - general: Allgemein + general: "Allgemein" highlighting: mode_long: - inline: Inline hervorgehobene Attribute - none: Keine Hervorhebung - status: Ganze Zeile nach Status - type: Ganze Zeile nach Typ - priority: Ganze Zeile nach Priorität + inline: "Inline hervorgehobene Attribute" + none: "Keine Hervorhebung" + status: "Ganze Zeile nach Status" + type: "Ganze Zeile nach Typ" + priority: "Ganze Zeile nach Priorität" icalendar: - enable_subscriptions_text_html: Ermöglicht Benutzern mit den erforderlichen - Berechtigungen das Abonnieren von OpenProject-Kalendern und den Zugriff auf - Arbeitspaketinformationen über einen externen Kalender-Client. Hinweis: - Bitte lesen Sie die Informationen über iCalendar-Abonnements, - um mögliche Sicherheitsrisiken zu verstehen, bevor Sie dies aktivieren. + enable_subscriptions_text_html: Ermöglicht Benutzern mit den erforderlichen Berechtigungen das Abonnieren von OpenProject-Kalendern und den Zugriff auf Arbeitspaketinformationen über einen externen Kalender-Client. Hinweis: Bitte lesen Sie die Informationen über iCalendar-Abonnements, um mögliche Sicherheitsrisiken zu verstehen, bevor Sie dies aktivieren. language_name_being_default: "%{language_name} (Standard)" notifications: - events_explanation: Bestimmt, für welche Ereignisse eine E-Mail verschickt wird. - Arbeitspakete sind von dieser Liste ausgeschlossen, da die Benachrichtigungen - hierfür pro Benutzer konfiguriert werden können. - delay_minutes_explanation: Das Senden von E-Mails kann verzögert werden, damit - Benutzer über In-App-Benachrichtigungen benachrichtigt werden können, bevor - eine E-Mail versendet wird. Benutzer, die eine Benachrichtigung innerhalb - der Anwendung lesen, erhalten keine separate E-Mail. - other: Andere - passwords: Passwörter + events_explanation: "Bestimmt, für welche Ereignisse eine E-Mail verschickt wird. Arbeitspakete sind von dieser Liste ausgeschlossen, da die Benachrichtigungen hierfür pro Benutzer konfiguriert werden können." + delay_minutes_explanation: "Das Senden von E-Mails kann verzögert werden, damit Benutzer über In-App-Benachrichtigungen benachrichtigt werden können, bevor eine E-Mail versendet wird. Benutzer, die eine Benachrichtigung innerhalb der Anwendung lesen, erhalten keine separate E-Mail." + other: "Andere" + passwords: "Passwörter" project_attributes: - heading: Projektattribute - label_for_all_projects: Alle Projekte - label_new_attribute: Projektattribut - label_new_section: Abschnitt - label_edit_section: Titel bearbeiten - label_section_actions: Abschnittsoptionen - heading_description: Diese Projektattribute erscheinen auf der Übersichtsseite - eines jeden Projekts. Sie können neue Attribute hinzufügen, sie in Abschnitte - gruppieren und sie nach Belieben neu anordnen. Diese Attribute können aktiviert - oder deaktiviert werden, aber nicht auf Projektebene neu geordnet werden. - label_project_custom_field_actions: Aktionen für Projektattribute - label_no_project_custom_fields: In diesem Abschnitt sind keine Projektattribute - definiert + heading: "Projektattribute" + label_for_all_projects: "Alle Projekte" + label_new_attribute: "Projektattribut" + label_new_section: "Abschnitt" + label_edit_section: "Titel bearbeiten" + label_section_actions: "Abschnittsoptionen" + heading_description: "Diese Projektattribute erscheinen auf der Übersichtsseite eines jeden Projekts. Sie können neue Attribute hinzufügen, sie in Abschnitte gruppieren und sie nach Belieben neu anordnen. Diese Attribute können aktiviert oder deaktiviert werden, aber nicht auf Projektebene neu geordnet werden." + label_project_custom_field_actions: "Aktionen für Projektattribute" + label_no_project_custom_fields: "In diesem Abschnitt sind keine Projektattribute definiert" edit: - description: Änderungen an diesem Projektattribut werden in allen Projekten - übernommen, in denen es aktiviert ist. Erforderliche Attribute können nicht - projektweise deaktiviert werden. + description: "Änderungen an diesem Projektattribut werden in allen Projekten übernommen, in denen es aktiviert ist. Erforderliche Attribute können nicht projektweise deaktiviert werden." new: - heading: Neues Attribut - description: Änderungen an diesem Projektattribut werden in allen Projekten - übernommen, in denen es aktiviert ist. Erforderliche Attribute können nicht - projektweise deaktiviert werden. + heading: "Neues Attribut" + description: "Änderungen an diesem Projektattribut werden in allen Projekten übernommen, in denen es aktiviert ist. Erforderliche Attribute können nicht projektweise deaktiviert werden." sections: display_representation: overview: - label: 'Projektattribut angezeigt in:' + label: "Projektattribut angezeigt in:" main_area: - label: Hauptbereich - description: Fügen Sie alle Projektattribute als einzelne Widgets in - den Hauptbereich der Projektübersicht ein. + label: "Hauptbereich" + description: "Fügen Sie alle Projektattribute als einzelne Widgets in den Hauptbereich der Projektübersicht ein." side_panel: - label: Seitenleiste - description: Fügen Sie alle Projektattribute in einem Abschnitt in der - rechten Seitenleiste der Projektübersicht hinzu. + label: "Seitenleiste" + description: "Fügen Sie alle Projektattribute in einem Abschnitt in der rechten Seitenleiste der Projektübersicht hinzu." project_initiation_request: - header_description: 'OpenProject kann einen Schritt-für-Schritt-Assistenten - erstellen, der beim Ausfüllen eines Projektinitiierungsantrags unterstützt. - Sie können die abgefragten Projektattribute wählen und ein Artefakt als Ergebnis - erzeugen lassen. - - ' + header_description: > + OpenProject kann einen Schritt-für-Schritt-Assistenten erstellen, der beim Ausfüllen eines Projektinitiierungsantrags unterstützt. Sie können die abgefragten Projektattribute wählen und ein Artefakt als Ergebnis erzeugen lassen. status: submitted: "%{wizard_name} wurde eingereicht" - submitted_description: Klicken Sie auf die Schaltfläche unten, um zum Arbeitspaket - für den Einreichungsprozess zu gelangen. - submitted_button: Einreichungsantrag öffnen + submitted_description: "Klicken Sie auf die Schaltfläche unten, um zum Arbeitspaket für den Einreichungsprozess zu gelangen." + submitted_button: "Einreichungsantrag öffnen" not_completed: "%{wizard_name} ist noch nicht abgeschlossen" - not_completed_description: Geben Sie die erforderlichen Informationen an, - indem Sie die Formularschritte ausfüllen, und starten Sie das Projekt. + not_completed_description: "Geben Sie die erforderlichen Informationen an, indem Sie die Formularschritte ausfüllen, und starten Sie das Projekt." wizard_status_button: - project_initiation_request: Projektinitiierungsantrag öffnen - project_creation_wizard: Projekterstellungs-Assistent öffnen - project_mandate: Projektmandat öffnen + project_initiation_request: "Projektinitiierungsantrag öffnen" + project_creation_wizard: "Projekterstellungs-Assistent öffnen" + project_mandate: "Projektmandat öffnen" blankslate: - title: Initiierungsanfrage nicht aktiviert - description: OpenProject kann einen Schritt-für-Schritt-Assistenten erstellen, - der beim Ausfüllen eines Projektinitiierungsantrags unterstützt. Sie können - die abgefragten Projektattribute wählen und ein Artefakt als Ergebnis erzeugen - lassen. Aktivieren Sie ihn hier, um den Assistenten zu konfigurieren. + title: "Initiierungsanfrage nicht aktiviert" + description: "OpenProject kann einen Schritt-für-Schritt-Assistenten erstellen, der beim Ausfüllen eines Projektinitiierungsantrags unterstützt. Sie können die abgefragten Projektattribute wählen und ein Artefakt als Ergebnis erzeugen lassen. Aktivieren Sie ihn hier, um den Assistenten zu konfigurieren." disable_dialog: - title: Projektinitiierungsantrag deaktivieren - heading: Diesen Projektinitiationsantrag deaktivieren? - confirmation_message: Der Projektinitiierungsantrag wird für neue Projekte, - die auf dieser Vorlage basieren, nicht mehr verfügbar sein. Projektmanager - und Projektverantwortliche müssen die entsprechenden Informationen in der - Projektübersicht manuell konfigurieren und ausfüllen. - checkbox_message: Ich verstehe, dass diese Aktion nicht rückgängig gemacht - werden kann + title: "Projektinitiierungsantrag deaktivieren" + heading: "Diesen Projektinitiationsantrag deaktivieren?" + confirmation_message: "Der Projektinitiierungsantrag wird für neue Projekte, die auf dieser Vorlage basieren, nicht mehr verfügbar sein. Projektmanager und Projektverantwortliche müssen die entsprechenden Informationen in der Projektübersicht manuell konfigurieren und ausfüllen." + checkbox_message: "Ich verstehe, dass diese Aktion nicht rückgängig gemacht werden kann" name: - artifact_name: Name des Artefakts - artifact_name_caption: Wählen Sie den Namen für dieses Artefakt, passend zu - Ihrer Projektmanagement-Methodik. + artifact_name: "Name des Artefakts" + artifact_name_caption: "Wählen Sie den Namen für dieses Artefakt, passend zu Ihrer Projektmanagement-Methodik." options: - project_initiation_request: Projektinitiierungsantrag - project_creation_wizard: Projekterstellungs-Assistent - project_mandate: Projektmandat + project_initiation_request: "Projektinitiierungsantrag" + project_creation_wizard: "Projekterstellungs-Assistent" + project_mandate: "Projektmandat" submission: - description_template: "**Dieses Arbeitspaket wurde automatisch nach Abschluss - des %{wizard_name} Workflows erstellt.** Ein PDF-Artefakt mit allen eingereichten - Informationen wurde generiert und zu Referenz- und Prüfzwecken an dieses - Arbeitspaket angehängt. Wenn Sie die Einleitungsschritte aktualisieren oder - erneut ausführen müssen, können Sie den Assistenten jederzeit über den unten - stehenden Link erneut öffnen:\n" - description: Wenn ein Benutzer eine Anfrage zur Projektinitiierung einreicht, - wird ein neues Arbeitspaket erstellt, an das ein Artefakt der Anfrage als - PDF-Datei angehängt wird. Die folgenden Einstellungen definieren den Typ, - den Status und den Empfänger für dieses neue Arbeitspaket. - work_package_type: Arbeitspaket-Typ - work_package_type_caption: Der Arbeitspaket-Typ, der zum Speichern des Artefakts - verwendet wird. - status_when_submitted: Status bei Einreichung - status_when_submitted_caption: Der Status, in den das erstellte Arbeitspaket - übergeht, sobald der Antrag eingereicht wird. - send_confirmation_email: Senden Sie eine Bestätigungs-E-Mail an den Benutzer, - der den Projektinitiierungsantrag gestellt hat - assignee: Zuweisung bei Einreichung - assignee_caption_html: Der Benutzer oder die Gruppe, die diesem Projektattribut - zugewiesen ist, wird auch der Zugewiesene des neuen Arbeitspakets. Diese - Liste enthält nur aktive Projektattribute vom Typ Benutzer. - confirmation_email_text: Text der Bestätigungs-E-Mail - confirmation_email_default: |- - Hallo, - - Sie haben einen Antrag auf Projektinitiierung für **%{project_name}** eingereicht. Dieser wartet nun auf seine Überprüfung. - Klicken Sie auf den untenstehenden Link, um das Arbeitspaket mit Ihrem Antrag aufzurufen. - work_package_comment: Arbeitspaket-Kommentar - work_package_comment_caption: Der oben ausgewählte Empfänger wird automatisch - in dem Kommentar @erwähnt. - work_package_comment_default: Ein Antrag auf Projektinitiierung für **%{project_name}** - wurde eingereicht und wartet auf seine Prüfung. + description_template: > + **Dieses Arbeitspaket wurde automatisch nach Abschluss des %{wizard_name} Workflows erstellt.** + Ein PDF-Artefakt mit allen eingereichten Informationen wurde generiert und zu Referenz- und Prüfzwecken an dieses Arbeitspaket angehängt. + Wenn Sie die Einleitungsschritte aktualisieren oder erneut ausführen müssen, können Sie den Assistenten jederzeit über den unten stehenden Link erneut öffnen: + description: "Wenn ein Benutzer eine Anfrage zur Projektinitiierung einreicht, wird ein neues Arbeitspaket erstellt, an das ein Artefakt der Anfrage als PDF-Datei angehängt wird. Die folgenden Einstellungen definieren den Typ, den Status und den Empfänger für dieses neue Arbeitspaket." + work_package_type: "Arbeitspaket-Typ" + work_package_type_caption: "Der Arbeitspaket-Typ, der zum Speichern des Artefakts verwendet wird." + status_when_submitted: "Status bei Einreichung" + status_when_submitted_caption: "Der Status, in den das erstellte Arbeitspaket übergeht, sobald der Antrag eingereicht wird." + send_confirmation_email: "Senden Sie eine Bestätigungs-E-Mail an den Benutzer, der den Projektinitiierungsantrag gestellt hat" + assignee: "Zuweisung bei Einreichung" + assignee_caption_html: "Der Benutzer oder die Gruppe, die diesem Projektattribut zugewiesen ist, wird auch der Zugewiesene des neuen Arbeitspakets. Diese Liste enthält nur aktive Projektattribute vom Typ Benutzer." + confirmation_email_text: "Text der Bestätigungs-E-Mail" + confirmation_email_default: "Hallo,\n\nSie haben einen Antrag auf Projektinitiierung für **%{project_name}** eingereicht. Dieser wartet nun auf seine Überprüfung.\nKlicken Sie auf den untenstehenden Link, um das Arbeitspaket mit Ihrem Antrag aufzurufen." + work_package_comment: "Arbeitspaket-Kommentar" + work_package_comment_caption: "Der oben ausgewählte Empfänger wird automatisch in dem Kommentar @erwähnt." + work_package_comment_default: "Ein Antrag auf Projektinitiierung für **%{project_name}** wurde eingereicht und wartet auf seine Prüfung." project_phase_definitions: - heading: Projekt-Lebenszyklus - heading_description: Der Projekt-Lebenszyklus definiert die Projektphasen, die - für Ihre Projektplanung verwendet werden können und auf der Übersichtsseite - jedes Projekts erscheinen. Diese Attribute können aktiviert oder deaktiviert - werden, aber nicht auf Projektebene neu geordnet werden. - label_add: Hinzufügen - label_add_description: Neue Projektphase definieren + heading: "Projekt-Lebenszyklus" + heading_description: "Der Projekt-Lebenszyklus definiert die Projektphasen, die für Ihre Projektplanung verwendet werden können und auf der Übersichtsseite jedes Projekts erscheinen. Diese Attribute können aktiviert oder deaktiviert werden, aber nicht auf Projektebene neu geordnet werden." + label_add: "Hinzufügen" + label_add_description: "Neue Projektphase definieren" filter: - label: Projektphase durchsuchen - section_header: Phasen - non_defined: Derzeit sind keine Phasen definiert. - phase_gates: Phasen Gates + label: "Projektphase durchsuchen" + section_header: "Phasen" + non_defined: "Derzeit sind keine Phasen definiert." + phase_gates: "Phasen Gates" new: - description: Änderungen an dieser Projekt-Phase werden in allen sie verwendenden - Projekten sichtbar. - heading: Neue Phase - both_gate: Gate zum Beginn und zum Ende - no_gate: Kein Gate - start_gate: Gate zum Beginn - start_gate_caption: Fügen Sie ein Gate zum Beginn der Phase hinzu - finish_gate: Gate zum Ende - finish_gate_caption: Fügen Sie ein Gate zum Ende der Phase hinzu + description: "Änderungen an dieser Projekt-Phase werden in allen sie verwendenden Projekten sichtbar." + heading: "Neue Phase" + both_gate: "Gate zum Beginn und zum Ende" + no_gate: "Kein Gate" + start_gate: "Gate zum Beginn" + start_gate_caption: "Fügen Sie ein Gate zum Beginn der Phase hinzu" + finish_gate: "Gate zum Ende" + finish_gate_caption: "Fügen Sie ein Gate zum Ende der Phase hinzu" projects: - missing_dependencies: Projektmodul %{module} wurde aktiviert, hängt aber ab - von %{dependencies}. Sie müssen diese Module ebenfalls aktivieren. - section_new_projects: Einstellungen für neue Projekte - section_project_overview: Einstellungen für Projektlisten - session: Sitzung + missing_dependencies: "Projektmodul %{module} wurde aktiviert, hängt aber ab von %{dependencies}. Sie müssen diese Module ebenfalls aktivieren." + section_new_projects: "Einstellungen für neue Projekte" + section_project_overview: "Einstellungen für Projektlisten" + session: "Sitzung" user: - default_preferences: Standardeinstellungen - display_format: Anzeigeformat - deletion: Löschen + default_preferences: "Standardeinstellungen" + display_format: "Anzeigeformat" + deletion: "Löschen" working_days: - section_work_week: Arbeitswoche - section_holidays_and_closures: Feiertage und Schließungen + section_work_week: "Arbeitswoche" + section_holidays_and_closures: "Feiertage und Schließungen" work_packages: - not_allowed_text: Sie haben nicht die notwendigen Rechte, um diese Seite zu - sehen. + not_allowed_text: "Sie haben nicht die notwendigen Rechte, um diese Seite zu sehen." activities: - enable_internal_comments: Interne Kommentare aktivieren - helper_text: Interne Kommentare erlauben es einem internen Team privat zu - kommunizieren. Diese sind nur für bestimmte Projektrollen sichtbar und werden - nie öffentlich sichtbar sein. %{link} + enable_internal_comments: "Interne Kommentare aktivieren" + helper_text: "Interne Kommentare erlauben es einem internen Team privat zu kommunizieren. Diese sind nur für bestimmte Projektrollen sichtbar und werden nie öffentlich sichtbar sein. %{link}" text_formatting: - markdown: Markdown - plain: Reiner Text - status_active: aktiv - status_archived: archiviert - status_blocked: blockiert + markdown: "Markdown" + plain: "Reiner Text" + status_active: "aktiv" + status_archived: "archiviert" + status_blocked: "blockiert" status_invited: eingeladen status_locked: gesperrt status_registered: angemeldet status_deleted: gelöscht + #Used in array.to_sentence. support: array: - sentence_connector: und - skip_last_comma: 'true' - text_accessibility_hint: Der barrierefreie Modus richtet sich an Benutzer, die motorisch - eingeschränkt, blind oder sehbehindert sind. Für letztere werden selektierte Elemente - mit einem Rahmen hervorgehoben. Bitte beachten Sie, dass das Backlog-Modul bei - aktiviertem barrierefreien Modus nicht verfügbar ist. - text_access_token_hint: Zugangs-Tokens erlauben es externen Applikationen Zugriff - auf OpenProject zu erhalten. - text_analyze: 'Weiter analysieren: %{subject}' - text_are_you_sure: Sind Sie sicher? - open_link_in_a_new_tab: Link in neuem Tab öffnen - text_are_you_sure_continue: Sind Sie sicher, dass Sie fortfahren möchten? - text_are_you_sure_with_children: Lösche Aufgabe und alle Unteraufgaben? - text_are_you_sure_with_project_custom_fields: Wenn Sie dieses Attribut löschen, - werden auch dessen Werte in allen Projekten gelöscht. Sind Sie sicher, dass Sie - dies tun möchten? - text_are_you_sure_with_project_life_cycle_step: Das Entfernen dieser Projektphase - entfernt sie auch aus allen Projekten, in denen sie bisher Verwendung fand. Sind - Sie sicher, dass sie dies möchten? - text_assign_to_project: Dem Projekt zuweisen - text_form_configuration: 'Sie können anpassen, welche Felder in den Arbeitspaket-Formularen - angezeigt werden. Sie können die Felder entsprechend Ihren Bedürfnissen frei gruppieren. - - ' - text_form_configuration_required_attribute: Attribut ist erforderlich und deshalb - immer angezeigt - text_caracters_maximum: Max. %{count} Zeichen. - text_caracters_minimum: Muss mindestens %{count} Zeichen lang sein. - text_comma_separated: Mehrere Werte erlaubt (durch Komma getrennt). - text_comment_wiki_page: 'Kommentar zu Wiki-Seite: %{page}' - text_custom_field_possible_values_info: Eine Zeile pro Wert - text_custom_field_hint_activate_per_project: 'Wenn Sie benutzerdefinierte Felder - verwenden: Bitte beachten, dass diese auch pro Projekt aktiviert werden müssen. - - ' - text_custom_field_hint_activate_per_project_and_type: 'Benutzerdefinierte Felder - müssen jeweils in Arbeitspaket-Typ und Projekt aktiviert werden. - - ' - text_project_custom_field_html: 'Die Enterprise Edition fügt diese zusätzlichen - Add-ons für die benutzerdefinierten Felder der Projekte hinzu:
  • Fügt - benutzerdefinierte Felder für Projekte zu Ihrer Projektliste hinzu, um eine Portfolioansicht - zu erstellen
- - ' - text_custom_logo_instructions: 'Das Logo passt sich automatisch an die Kopfzeile - an. Die besten Ergebnisse erzielen Sie, wenn Sie ein weißes Logo auf ein transparentes - 130×47px großes Bild hochladen. Sie können innerhalb des Bildes so viel Abstand - einfügen, wie Sie möchten. - - ' - text_custom_logo_mobile_instructions: 'Das Logo passt sich automatisch an die Kopfzeile - an. Die besten Ergebnisse erzielen Sie, wenn Sie ein weißes Logo auf ein transparentes - 130×33px großes Bild hochladen. Sie können innerhalb des Bildes so viel Abstand - einfügen, wie Sie möchten. - - ' - text_custom_export_logo_instructions: 'Dies ist das Logo, das in Ihren PDF-Exporten - erscheint. Es muss eine PNG- oder JPEG-Bilddatei sein. Ein schwarzes oder farbiges - Logo auf transparentem oder weißem Hintergrund wird empfohlen. - - ' - text_custom_export_cover_instructions: 'Dies ist das Bild, das im Hintergrund einer - Cover-Seite in Ihren PDF-Exporten erscheint. Es muss eine etwa 800px breite und - 500px hohe PNG- oder JPEG-Bilddatei sein. - - ' - text_custom_export_footer_instructions: 'Ein grafisches Element für PDF-Exporte, - das links neben der Fußzeile positioniert wird. Dieses Bild muss eine PNG- oder - JPEG-Datei mit etwa 200 Pixeln Breite sein. - - ' - label_custom_export_font_instructions: 'Laden Sie benutzerdefinierte TrueType-Schriften - (.ttf), für PDF-Exporte hoch. Die besten Ergebnisse erzielen Sie, wenn Sie passende - Dateien aus der gleichen Schriftfamilie verwenden. Wenn keine Schriftart angegeben - wird, wird die Standardschriftart NotoSans verwendet. - - ' - label_custom_export_images_instructions: 'Laden Sie benutzerdefinierte Bilddateien - für Ihre PDF-Exporte hoch. - - ' - text_custom_export_font_regular_instructions: 'Dies ist die Schriftartdatei für - normalen Text. Sie muss im TTF-Format vorliegen und ist erforderlich. - - ' - text_custom_export_font_bold_instructions: 'Dies ist die Schriftdatei für fetten - Text. Sie ist optional. Wenn angegeben, muss sie im TTF-Format vorliegen. - - ' - text_custom_export_font_italic_instructions: 'Dies ist die Schriftdatei für kursiven - Text. Sie ist optional. Wenn angegeben, muss sie im TTF-Format vorliegen. - - ' - text_custom_export_font_bold_italic_instructions: 'Dies ist die Schriftdatei für - fett-kursiven Text. Sie ist optional. Wenn angegeben, muss sie im TTF-Format vorliegen. - - ' - text_custom_favicon_instructions: 'Dies ist das kleine Symbol, das in Ihrem Browser-Fenster/Tab - neben dem Seitentitel angezeigt wird. Es muss ein quadratisches 32 x 32 Pixel - großes PNG mit transparentem Hintergrund sein. - - ' - text_custom_touch_icon_instructions: 'Dieses Symbol wird auf Ihrem Mobilgerät oder - Tablet angezeigt, wenn Sie ein Lesezeichen dieser OpenProject-Instanz erstellen. - Es muss ein quadratisches 180 x 180 Pixel großes PNG sein. Der Hintergrund sollte - nicht transparent sein, da dies auf iOS-Geräten nicht optimal dargestellt wird. - - ' - text_database_allows_tsv: Datenbank unterstützt TSVector (optional) - text_default_administrator_account_changed: Administrator-Kennwort geändert - text_default_encoding: 'Default: UTF-8' - text_destroy: Löschen - text_destroy_with_associated: 'Es sind weitere Datenobjekte mit den bzw. dem zu - löschenden Arbeitpaket(en) verbunden. Es handelt sich dabei um Objekte der folgenden - Typen:' - text_destroy_what_to_do: Was soll mit den Objekten geschehen? - text_diff_truncated: "... Dieser Diff wurde abgeschnitten, weil er die maximale - Anzahl anzuzeigender Zeilen überschreitet." - text_email_delivery_not_configured: |- - E-Mail-Zustellung ist nicht konfiguriert und Benachrichtigungen sind deaktiviert. - Konfigurieren Sie Ihren SMTP-Server, um sie zu aktivieren. - text_enumeration_category_reassign_to: 'Die Objekte stattdessen diesem Wert zuordnen:' + sentence_connector: "und" + skip_last_comma: "true" + text_accessibility_hint: "Der barrierefreie Modus richtet sich an Benutzer, die motorisch eingeschränkt, blind oder sehbehindert sind. Für letztere werden selektierte Elemente mit einem Rahmen hervorgehoben. Bitte beachten Sie, dass das Backlog-Modul bei aktiviertem barrierefreien Modus nicht verfügbar ist." + text_access_token_hint: "Zugangs-Tokens erlauben es externen Applikationen Zugriff auf OpenProject zu erhalten." + text_analyze: "Weiter analysieren: %{subject}" + text_are_you_sure: "Sind Sie sicher?" + open_link_in_a_new_tab: "Link in neuem Tab öffnen" + text_are_you_sure_continue: "Sind Sie sicher, dass Sie fortfahren möchten?" + text_are_you_sure_with_children: "Lösche Aufgabe und alle Unteraufgaben?" + text_are_you_sure_with_project_custom_fields: "Wenn Sie dieses Attribut löschen, werden auch dessen Werte in allen Projekten gelöscht. Sind Sie sicher, dass Sie dies tun möchten?" + text_are_you_sure_with_project_life_cycle_step: "Das Entfernen dieser Projektphase entfernt sie auch aus allen Projekten, in denen sie bisher Verwendung fand. Sind Sie sicher, dass sie dies möchten?" + text_assign_to_project: "Dem Projekt zuweisen" + text_form_configuration: > + Sie können anpassen, welche Felder in den Arbeitspaket-Formularen angezeigt werden. Sie können die Felder entsprechend Ihren Bedürfnissen frei gruppieren. + text_form_configuration_required_attribute: "Attribut ist erforderlich und deshalb immer angezeigt" + text_caracters_maximum: "Max. %{count} Zeichen." + text_caracters_minimum: "Muss mindestens %{count} Zeichen lang sein." + text_comma_separated: "Mehrere Werte erlaubt (durch Komma getrennt)." + text_comment_wiki_page: "Kommentar zu Wiki-Seite: %{page}" + text_custom_field_possible_values_info: "Eine Zeile pro Wert" + text_custom_field_hint_activate_per_project: > + Wenn Sie benutzerdefinierte Felder verwenden: Bitte beachten, dass diese auch pro Projekt aktiviert werden müssen. + text_custom_field_hint_activate_per_project_and_type: > + Benutzerdefinierte Felder müssen jeweils in Arbeitspaket-Typ und Projekt aktiviert werden. + text_project_custom_field_html: > + Die Enterprise Edition fügt diese zusätzlichen Add-ons für die benutzerdefinierten Felder der Projekte hinzu:
  • Fügt benutzerdefinierte Felder für Projekte zu Ihrer Projektliste hinzu, um eine Portfolioansicht zu erstellen
+ text_custom_logo_instructions: > + Das Logo passt sich automatisch an die Kopfzeile an. Die besten Ergebnisse erzielen Sie, wenn Sie ein weißes Logo auf ein transparentes 130×47px großes Bild hochladen. Sie können innerhalb des Bildes so viel Abstand einfügen, wie Sie möchten. + text_custom_logo_mobile_instructions: > + Das Logo passt sich automatisch an die Kopfzeile an. Die besten Ergebnisse erzielen Sie, wenn Sie ein weißes Logo auf ein transparentes 130×33px großes Bild hochladen. Sie können innerhalb des Bildes so viel Abstand einfügen, wie Sie möchten. + text_custom_export_logo_instructions: > + Dies ist das Logo, das in Ihren PDF-Exporten erscheint. Es muss eine PNG- oder JPEG-Bilddatei sein. Ein schwarzes oder farbiges Logo auf transparentem oder weißem Hintergrund wird empfohlen. + text_custom_export_cover_instructions: > + Dies ist das Bild, das im Hintergrund einer Cover-Seite in Ihren PDF-Exporten erscheint. Es muss eine etwa 800px breite und 500px hohe PNG- oder JPEG-Bilddatei sein. + text_custom_export_footer_instructions: > + Ein grafisches Element für PDF-Exporte, das links neben der Fußzeile positioniert wird. Dieses Bild muss eine PNG- oder JPEG-Datei mit etwa 200 Pixeln Breite sein. + label_custom_export_font_instructions: > + Laden Sie benutzerdefinierte TrueType-Schriften (.ttf), für PDF-Exporte hoch. Die besten Ergebnisse erzielen Sie, wenn Sie passende Dateien aus der gleichen Schriftfamilie verwenden. Wenn keine Schriftart angegeben wird, wird die Standardschriftart NotoSans verwendet. + label_custom_export_images_instructions: > + Laden Sie benutzerdefinierte Bilddateien für Ihre PDF-Exporte hoch. + text_custom_export_font_regular_instructions: > + Dies ist die Schriftartdatei für normalen Text. Sie muss im TTF-Format vorliegen und ist erforderlich. + text_custom_export_font_bold_instructions: > + Dies ist die Schriftdatei für fetten Text. Sie ist optional. Wenn angegeben, muss sie im TTF-Format vorliegen. + text_custom_export_font_italic_instructions: > + Dies ist die Schriftdatei für kursiven Text. Sie ist optional. Wenn angegeben, muss sie im TTF-Format vorliegen. + text_custom_export_font_bold_italic_instructions: > + Dies ist die Schriftdatei für fett-kursiven Text. Sie ist optional. Wenn angegeben, muss sie im TTF-Format vorliegen. + text_custom_favicon_instructions: > + Dies ist das kleine Symbol, das in Ihrem Browser-Fenster/Tab neben dem Seitentitel angezeigt wird. Es muss ein quadratisches 32 x 32 Pixel großes PNG mit transparentem Hintergrund sein. + text_custom_touch_icon_instructions: > + Dieses Symbol wird auf Ihrem Mobilgerät oder Tablet angezeigt, wenn Sie ein Lesezeichen dieser OpenProject-Instanz erstellen. Es muss ein quadratisches 180 x 180 Pixel großes PNG sein. Der Hintergrund sollte nicht transparent sein, da dies auf iOS-Geräten nicht optimal dargestellt wird. + text_database_allows_tsv: "Datenbank unterstützt TSVector (optional)" + text_default_administrator_account_changed: "Administrator-Kennwort geändert" + text_default_encoding: "Default: UTF-8" + text_destroy: "Löschen" + text_destroy_with_associated: "Es sind weitere Datenobjekte mit den bzw. dem zu löschenden Arbeitpaket(en) verbunden. Es handelt sich dabei um Objekte der folgenden Typen:" + text_destroy_what_to_do: "Was soll mit den Objekten geschehen?" + text_diff_truncated: "... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet." + text_email_delivery_not_configured: "E-Mail-Zustellung ist nicht konfiguriert und Benachrichtigungen sind deaktiviert.\nKonfigurieren Sie Ihren SMTP-Server, um sie zu aktivieren." + text_enumeration_category_reassign_to: "Die Objekte stattdessen diesem Wert zuordnen:" text_enumeration_destroy_question: "%{count} Objekte sind diesem Wert zugeordnet." - text_file_repository_writable: Verzeichnis für Dateien beschreibbar - text_git_repo_example: ein freigegebenes, lokales Projektarchiv (z.B. /gitrepo, - c:\gitrepo) - text_hint_date_format: Geben Sie ein Datum im Format JJJJ-MM-TT ein. Andere Formate - können zu einem falschen Datum führen. - text_hint_disable_with_0: 'Hinweis: Deaktivieren mit 0' - text_hours_between: Zwischen %{min} und %{max} Stunden. - text_work_package_added: Arbeitspaket %{id} wurde erstellt von %{author}. - text_work_package_category_destroy_assignments: Kategorie-Zuordnung entfernen - text_work_package_category_destroy_question: Einige Arbeitspakete (%{count}) sind - dieser Kategorie zugeordnet. Was möchten Sie tun? - text_work_package_category_reassign_to: Arbeitspakete dieser Kategorie zuordnen - text_work_package_updated: Arbeitspaket %{id} wurde aktualisiert von %{author}. - text_work_package_watcher_added: Sie wurden von %{watcher_changer} als Beobachter - für das Arbeitspaket %{id} eingetragen. - text_work_package_watcher_removed: Sie wurden von den Beobachtern des Arbeitspakets - %{id} von %{watcher_changer} entfernt. - text_work_packages_destroy_confirmation: Sind Sie sicher, dass Sie die ausgewählten - Arbeitspakete löschen möchten? - text_work_packages_ref_in_commit_messages: Arbeitspaket-Beziehungen und -Status - in Commit-Log-Meldungen + text_file_repository_writable: "Verzeichnis für Dateien beschreibbar" + text_git_repo_example: "ein freigegebenes, lokales Projektarchiv (z.B. /gitrepo, c:\\gitrepo)" + text_hint_date_format: "Geben Sie ein Datum im Format JJJJ-MM-TT ein. Andere Formate können zu einem falschen Datum führen." + text_hint_disable_with_0: "Hinweis: Deaktivieren mit 0" + text_hours_between: "Zwischen %{min} und %{max} Stunden." + text_work_package_added: "Arbeitspaket %{id} wurde erstellt von %{author}." + text_work_package_category_destroy_assignments: "Kategorie-Zuordnung entfernen" + text_work_package_category_destroy_question: "Einige Arbeitspakete (%{count}) sind dieser Kategorie zugeordnet. Was möchten Sie tun?" + text_work_package_category_reassign_to: "Arbeitspakete dieser Kategorie zuordnen" + text_work_package_updated: "Arbeitspaket %{id} wurde aktualisiert von %{author}." + text_work_package_watcher_added: "Sie wurden von %{watcher_changer} als Beobachter für das Arbeitspaket %{id} eingetragen." + text_work_package_watcher_removed: "Sie wurden von den Beobachtern des Arbeitspakets %{id} von %{watcher_changer} entfernt." + text_work_packages_destroy_confirmation: "Sind Sie sicher, dass Sie die ausgewählten Arbeitspakete löschen möchten?" + text_work_packages_ref_in_commit_messages: "Arbeitspaket-Beziehungen und -Status in Commit-Log-Meldungen" text_journal_added: "%{label} %{value} wurde hinzugefügt" text_journal_attachment_added: "%{label} %{value} als Anhang hinzugefügt" text_journal_attachment_deleted: "%{label} %{old} als Anhang entfernt" @@ -6186,413 +5023,278 @@ de: text_journal_set_to: "%{label} wurde auf %{value} gesetzt" text_journal_set_with_diff: "%{label} gesetzt (%{link})" text_journal_label_value: "%{label} %{value}" - text_latest_note: 'Der letzte Kommentar ist: %{note}' - text_length_between: Länge zwischen %{min} und %{max} Zeichen. - text_line_separated: Mehrere Werte sind erlaubt (eine Zeile pro Wert). - text_load_default_configuration: Standard-Konfiguration laden + text_latest_note: "Der letzte Kommentar ist: %{note}" + text_length_between: "Länge zwischen %{min} und %{max} Zeichen." + text_line_separated: "Mehrere Werte sind erlaubt (eine Zeile pro Wert)." + text_load_default_configuration: "Standard-Konfiguration laden" text_no_roles_defined: Es wurden keine Rollen definiert. - text_no_access_tokens_configurable: Es existieren keine Zugangs-Tokens, die konfiguriert - werden können. - text_no_configuration_data: Rollen, Typen, Arbeitspaket-Status und Workflows wurden - noch nicht konfiguriert. Es wird empfohlen die Standard-Konfiguration zu laden. - Sobald die Konfiguration geladen ist, kann diese geändert werden. - text_no_notes: Es sind keine Kommentare für dieses Arbeitspaket vorhanden. - text_notice_too_many_values_are_inperformant: 'Achtung: Das Anzeigen von mehr als - 100 Objekten pro Seite kann die Seitenladezeiten erhöhen.' - text_notice_security_badge_displayed_html: 'Hinweis: Wenn aktiviert, wird dies eine - Plakette mit dem Status Ihrer Installation in der %{information_panel_label} - unter Administration und auf der Startseite anzeigen. Es wird nur Administratoren - gezeigt.
Die Plakette überprüft Ihre aktuelle OpenProject-Version gegen - die offizielle Release Datenbank, um Sie über Updates oder bekannten Sicherheitslücken - zu informieren. Für die Überprüfung der Version werden Daten benötigt, um verfügbare - Updates für Ihre Umgebung zurückzugeben. Für mehr Informationen über die Plakette, - welche Daten sie benötigt und wie Sie diese Überprüfung deaktivieren können, besuchen - Sie bitte die Konfigurationsdokumentation. - - ' - text_own_membership_delete_confirmation: |- - Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen. - Sind Sie sicher, dass Sie dies tun möchten? - text_permanent_delete_confirmation_checkbox_label: Ich verstehe, dass diese Löschung - nicht rückgängig gemacht werden kann - text_permanent_remove_confirmation_checkbox_label: Ich verstehe, dass diese Löschung - nicht rückgängig gemacht werden kann - text_plugin_assets_writable: Verzeichnis für Plugin-Assets beschreibbar - text_powered_by: Powered by %{link} - text_project_identifier_info: Kleinbuchstaben (a-z), Ziffern, Binde- und Unterstriche - erlaubt. Muss mit einem Kleinbuchstaben beginnen. - text_reassign: 'Zuweisung zu Arbeitspaket:' - text_regexp_multiline: Der reguläre Ausdruck wird in einem mehrzeiligen Modus angewandt, - z.B. ^---\s+ - text_repository_usernames_mapping: |- - Bitte legen Sie die Zuordnung der OpenProject-Benutzer zu den Benutzernamen der Commit-Log-Meldungen des Projektarchivs fest. - Benutzer mit identischen OpenProject- und Projektarchiv-Benutzernamen oder -E-Mail-Adressen werden automatisch zugeordnet. - text_status_changed_by_changeset: Status geändert durch Projektarchiv-Änderung %{value}. - text_table_difference_description: Diese Tabelle zeigt einzelne %{entries} des Projektarchivs. - Sie können über die Checkboxen zwei Einträge markieren und über den Schalter unter - der Tabelle die Unterschiede zwischen den zwei markierten Einträgen anzeigen lassen. - text_time_logged_by_changeset: Status geändert durch Projektarchiv-Änderung %{value}. - text_tip_work_package_begin_day: Arbeitspaket, das an diesem Tag beginnt - text_tip_work_package_begin_end_day: Arbeitspaket, das an diesem Tag beginnt und - endet - text_tip_work_package_end_day: Arbeitspaket, das an diesem Tag endet - text_type_no_workflow: Kein Workflow für diesen Typ definiert. - text_unallowed_characters: Nicht erlaubte Zeichen + text_no_access_tokens_configurable: "Es existieren keine Zugangs-Tokens, die konfiguriert werden können." + text_no_configuration_data: "Rollen, Typen, Arbeitspaket-Status und Workflows wurden noch nicht konfiguriert. Es wird empfohlen die Standard-Konfiguration zu laden. Sobald die Konfiguration geladen ist, kann diese geändert werden." + text_no_notes: "Es sind keine Kommentare für dieses Arbeitspaket vorhanden." + text_notice_too_many_values_are_inperformant: "Achtung: Das Anzeigen von mehr als 100 Objekten pro Seite kann die Seitenladezeiten erhöhen." + text_notice_security_badge_displayed_html: > + Hinweis: Wenn aktiviert, wird dies eine Plakette mit dem Status Ihrer Installation in der %{information_panel_label} unter Administration und auf der Startseite anzeigen. Es wird nur Administratoren gezeigt.
Die Plakette überprüft Ihre aktuelle OpenProject-Version gegen die offizielle Release Datenbank, um Sie über Updates oder bekannten Sicherheitslücken zu informieren. Für die Überprüfung der Version werden Daten benötigt, um verfügbare Updates für Ihre Umgebung zurückzugeben. Für mehr Informationen über die Plakette, welche Daten sie benötigt und wie Sie diese Überprüfung deaktivieren können, besuchen Sie bitte die Konfigurationsdokumentation. + text_own_membership_delete_confirmation: "Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.\nSind Sie sicher, dass Sie dies tun möchten?" + text_permanent_delete_confirmation_checkbox_label: "Ich verstehe, dass diese Löschung nicht rückgängig gemacht werden kann" + text_permanent_remove_confirmation_checkbox_label: "Ich verstehe, dass diese Löschung nicht rückgängig gemacht werden kann" + text_plugin_assets_writable: "Verzeichnis für Plugin-Assets beschreibbar" + text_powered_by: "Powered by %{link}" + text_project_identifier_info: "Kleinbuchstaben (a-z), Ziffern, Binde- und Unterstriche erlaubt. Muss mit einem Kleinbuchstaben beginnen." + text_reassign: "Zuweisung zu Arbeitspaket:" + text_regexp_multiline: 'Der reguläre Ausdruck wird in einem mehrzeiligen Modus angewandt, z.B. ^---\s+' + text_repository_usernames_mapping: "Bitte legen Sie die Zuordnung der OpenProject-Benutzer zu den Benutzernamen der Commit-Log-Meldungen des Projektarchivs fest.\nBenutzer mit identischen OpenProject- und Projektarchiv-Benutzernamen oder -E-Mail-Adressen werden automatisch zugeordnet." + text_status_changed_by_changeset: "Status geändert durch Projektarchiv-Änderung %{value}." + text_table_difference_description: "Diese Tabelle zeigt einzelne %{entries} des Projektarchivs. Sie können über die Checkboxen zwei Einträge markieren und über den Schalter unter der Tabelle die Unterschiede zwischen den zwei markierten Einträgen anzeigen lassen." + text_time_logged_by_changeset: "Status geändert durch Projektarchiv-Änderung %{value}." + text_tip_work_package_begin_day: "Arbeitspaket, das an diesem Tag beginnt" + text_tip_work_package_begin_end_day: "Arbeitspaket, das an diesem Tag beginnt und endet" + text_tip_work_package_end_day: "Arbeitspaket, das an diesem Tag endet" + text_type_no_workflow: "Kein Workflow für diesen Typ definiert." + text_unallowed_characters: "Nicht erlaubte Zeichen" text_user_invited: Der Nutzer ist eingeladen worden und wartet auf Registrierung. text_user_wrote: "%{value} schrieb:" - text_wrote: schrieb - text_warn_on_leaving_unsaved: Das Arbeitspaket enthält ungespeicherten Text, der - verloren geht wenn Sie die Seite verlassen. - text_what_did_you_change_click_to_add_comment: Was haben Sie geändert? Klicken, - um einen Kommentar hinzufügen - text_wiki_destroy_confirmation: Sind Sie sicher, dass Sie dieses Wiki mit sämtlichem - Inhalt löschen möchten? - text_wiki_page_destroy_children: Lösche alle Unterseiten - text_wiki_page_destroy_question: Diese Seite hat %{descendants} Unterseite(n). Was - möchten Sie tun? - text_wiki_page_nullify_children: Verschiebe die Unterseiten auf die oberste Ebene - text_wiki_page_reassign_children: Ordne die Unterseiten dieser Seite zu - text_workflow_edit: Wählen Sie eine Rolle und eine Typ zur Bearbeitung des Workflows - aus - text_zoom_in: Mehr Details - text_zoom_out: Weniger Details - text_setup_mail_configuration: Konfigurieren Sie Ihren E-Mail-Provider + text_wrote: "schrieb" + text_warn_on_leaving_unsaved: "Das Arbeitspaket enthält ungespeicherten Text, der verloren geht wenn Sie die Seite verlassen." + text_what_did_you_change_click_to_add_comment: "Was haben Sie geändert? Klicken, um einen Kommentar hinzufügen" + text_wiki_destroy_confirmation: "Sind Sie sicher, dass Sie dieses Wiki mit sämtlichem Inhalt löschen möchten?" + text_wiki_page_destroy_children: "Lösche alle Unterseiten" + text_wiki_page_destroy_question: "Diese Seite hat %{descendants} Unterseite(n). Was möchten Sie tun?" + text_wiki_page_nullify_children: "Verschiebe die Unterseiten auf die oberste Ebene" + text_wiki_page_reassign_children: "Ordne die Unterseiten dieser Seite zu" + text_workflow_edit: "Wählen Sie eine Rolle und eine Typ zur Bearbeitung des Workflows aus" + text_zoom_in: "Mehr Details" + text_zoom_out: "Weniger Details" + text_setup_mail_configuration: "Konfigurieren Sie Ihren E-Mail-Provider" help_texts: views: - project: "%{plural} sind immer einem Projekt zugeordnet. Sie können hier nur - Projekte auswählen, bei denen das %{plural} -Modul aktiv ist. Nach dem Erstellen - eines %{singular} können Sie Arbeitspakete aus anderen Projekten hinzufügen.\n" - public: Veröffentlichen Sie diese Ansicht und erlauben Sie anderen Benutzern, - auf sie zuzugreifen. Benutzer mit der Berechtigung "Öffentliche Ansichten - verwalten" können öffentliche Abfragen ändern oder entfernen. Dies hat keinen - Einfluss auf die Sichtbarkeit von Arbeitspaketen in dieser Ansicht und je - nach Berechtigung, können Benutzer unterschiedliche Ergebnisse sehen. - favoured: Markiert diese Ansicht als Favorit und fügt sie der linken Seitenleiste - hinzu. + project: > + %{plural} sind immer einem Projekt zugeordnet. Sie können hier nur Projekte auswählen, bei denen das %{plural} -Modul aktiv ist. Nach dem Erstellen eines %{singular} können Sie Arbeitspakete aus anderen Projekten hinzufügen. + public: "Veröffentlichen Sie diese Ansicht und erlauben Sie anderen Benutzern, auf sie zuzugreifen. Benutzer mit der Berechtigung \"Öffentliche Ansichten verwalten\" können öffentliche Abfragen ändern oder entfernen. Dies hat keinen Einfluss auf die Sichtbarkeit von Arbeitspaketen in dieser Ansicht und je nach Berechtigung, können Benutzer unterschiedliche Ergebnisse sehen." + favoured: "Markiert diese Ansicht als Favorit und fügt sie der linken Seitenleiste hinzu." time: - am: vormittags + am: "vormittags" formats: default: "%d.%m.%Y %H:%M" long: "%A, %e. %B %Y, %H:%M Uhr" short: "%e. %b %H:%M" time: "%H:%M" - pm: nachmittags + pm: "nachmittags" timeframe: - show: Zeitausschnitt anzeigen - end: bis - start: von - title_remove_and_delete_user: Den eingeladenen Benutzer aus dem Projekt entfernen - und löschen. - title_enterprise_upgrade: Upgraden um weitere Nutzer freizuschalten. - tooltip_user_default_timezone: 'Die Standardzeitzone für neue Benutzer. Kann in - den Einstellungen jedes Benutzers geändert werden. - - ' - tooltip_resend_invitation: 'Sendet eine weitere Einladungs-Email mit einem neuen - Token für den Fall, dass das alte Token abgelaufen ist oder der Benutzer nicht - die ursprüngliche Email erhalten hat. Dies kann auch für aktive Nutzer genutzt - werden um eine neue Authentifizierungsmethode zu wählen. Wenn dies bei einem aktiven - Benutzern verwendet wird, wird der Status zu "eingeladen" geändert. - - ' + show: "Zeitausschnitt anzeigen" + end: "bis" + start: "von" + title_remove_and_delete_user: Den eingeladenen Benutzer aus dem Projekt entfernen und löschen. + title_enterprise_upgrade: "Upgraden um weitere Nutzer freizuschalten." + tooltip_user_default_timezone: > + Die Standardzeitzone für neue Benutzer. Kann in den Einstellungen jedes Benutzers geändert werden. + tooltip_resend_invitation: > + Sendet eine weitere Einladungs-Email mit einem neuen Token für den Fall, dass das alte Token abgelaufen ist oder der Benutzer nicht die ursprüngliche Email erhalten hat. Dies kann auch für aktive Nutzer genutzt werden um eine neue Authentifizierungsmethode zu wählen. Wenn dies bei einem aktiven Benutzern verwendet wird, wird der Status zu "eingeladen" geändert. tooltip: - setting_email_login: 'Wenn aktiviert, kann ein Nutzer seinen Benutzernamen bei - der Registrierung nicht selbst wählen. Stattdessen wird dessen E-Mail-Adresse - als Benutzername verwendet. Ein Administrator kann unabhängig davon den Benutzernamen - weiterhin ändern. - - ' + setting_email_login: > + Wenn aktiviert, kann ein Nutzer seinen Benutzernamen bei der Registrierung nicht selbst wählen. Stattdessen wird dessen E-Mail-Adresse als Benutzername verwendet. Ein Administrator kann unabhängig davon den Benutzernamen weiterhin ändern. queries: apply_filter: vorkonfigurierten Filter anwenden configure_view: heading: Ansicht konfigurieren columns: - input_label: Spalten hinzufügen - input_placeholder: Spalte auswählen - drag_area_label: Spalten verwalten und neu anordnen + input_label: "Spalten hinzufügen" + input_placeholder: "Spalte auswählen" + drag_area_label: "Spalten verwalten und neu anordnen" sort_by: automatic: - heading: Automatisch - description: Ordnen Sie %{plural} nach einem oder mehreren Sortierkriterien. - Die vorherige Sortierung geht dabei verloren. + heading: "Automatisch" + description: "Ordnen Sie %{plural} nach einem oder mehreren Sortierkriterien. Die vorherige Sortierung geht dabei verloren." top_menu: - additional_resources: Weitere Ressourcen - getting_started: Erste Schritte - help_and_support: Hilfe und Support - total_progress: Gesamtfortschritt + additional_resources: "Weitere Ressourcen" + getting_started: "Erste Schritte" + help_and_support: "Hilfe und Support" + total_progress: "Gesamtfortschritt" user: - all: alle - active: aktiv - activate: Aktiviere - activate_and_reset_failed_logins: Aktivieren und fehlgeschlagene Logins zurücksetzen - authentication_provider: Authentifizierungsprovider - identity_url_text: Die interne eindeutige Kennung, der vom Authentifizierungsanbieter - bereitgestellt wird. - authentication_settings_disabled_due_to_external_authentication: 'Dieser Nutzer - authentifiziert sich über einen externen Authentifizierungsprovider, so dass - das Passwort über OpenProject nicht geändert werden kann. - - ' - authorization_rejected: Sie dürfen sich nicht einloggen. - assign_random_password: Zufälliges Passwort zuweisen (wird dem Nutzer per E-Mail - geschickt) - blocked: temporär gesperrt + all: "alle" + active: "aktiv" + activate: "Aktiviere" + activate_and_reset_failed_logins: "Aktivieren und fehlgeschlagene Logins zurücksetzen" + authentication_provider: "Authentifizierungsprovider" + identity_url_text: "Die interne eindeutige Kennung, der vom Authentifizierungsanbieter bereitgestellt wird." + authentication_settings_disabled_due_to_external_authentication: > + Dieser Nutzer authentifiziert sich über einen externen Authentifizierungsprovider, so dass das Passwort über OpenProject nicht geändert werden kann. + authorization_rejected: "Sie dürfen sich nicht einloggen." + assign_random_password: "Zufälliges Passwort zuweisen (wird dem Nutzer per E-Mail geschickt)" + blocked: "temporär gesperrt" blocked_num_failed_logins: - one: temporär gesperrt (ein fehlgeschlagener Loginversuch) - other: temporär gesperrt (%{count} fehlgeschlagene Loginversuche) - confirm_status_change: Sie sind dabei den Status von '%{name}' zu ändern. Möchten - Sie wirklich fortfahren? - deleted: Gelöschter Nutzer - error_status_change_self: Sie können Ihren eigenen Benutzerstatus nicht ändern. - error_admin_change_on_non_admin: Nur Administratoren können den Status von Administratorbenutzern - ändern. - error_status_change_failed: 'Der Nutzerstatus konnte nicht geändert werden aufgrund - folgender Fehler: %{errors}' + one: "temporär gesperrt (ein fehlgeschlagener Loginversuch)" + other: "temporär gesperrt (%{count} fehlgeschlagene Loginversuche)" + confirm_status_change: "Sie sind dabei den Status von '%{name}' zu ändern. Möchten Sie wirklich fortfahren?" + deleted: "Gelöschter Nutzer" + error_status_change_self: "Sie können Ihren eigenen Benutzerstatus nicht ändern." + error_admin_change_on_non_admin: "Nur Administratoren können den Status von Administratorbenutzern ändern." + error_status_change_failed: "Der Nutzerstatus konnte nicht geändert werden aufgrund folgender Fehler: %{errors}" invite: Nutzer via E-Mail einladen invited: eingeladen - lock: Dauerhaft sperren - locked: dauerhaft gesperrt - no_login: Dieser Nutzer wird per Passwort authentifiziert. Er kann sich jedoch - nicht einloggen, da Login per Passwort deaktiviert ist. + lock: "Dauerhaft sperren" + locked: "dauerhaft gesperrt" + no_login: "Dieser Nutzer wird per Passwort authentifiziert. Er kann sich jedoch nicht einloggen, da Login per Passwort deaktiviert ist." password_change_unsupported: Passwortänderung wird nicht unterstützt - registered: angemeldet - reset_failed_logins: Fehlgeschlagene Logins zurücksetzen + registered: "angemeldet" + reset_failed_logins: "Fehlgeschlagene Logins zurücksetzen" status_user_and_brute_force: "%{user} und %{brute_force}" - status_change: Status geändert - text_change_disabled_for_provider_login: Der Login-Anbieter legt den Namen und - die E-Mail-Adresse fest. Daher können sie nicht geändert werden. - unlock: Entsperren - unlock_and_reset_failed_logins: Entsperren und fehlgeschlagene Logins zurücksetzen - error_cannot_delete_user: Benutzer kann nicht gelöscht werden - version_status_closed: geschlossen - version_status_locked: gesperrt - version_status_open: offen + status_change: "Status geändert" + text_change_disabled_for_provider_login: "Der Login-Anbieter legt den Namen und die E-Mail-Adresse fest. Daher können sie nicht geändert werden." + unlock: "Entsperren" + unlock_and_reset_failed_logins: "Entsperren und fehlgeschlagene Logins zurücksetzen" + error_cannot_delete_user: "Benutzer kann nicht gelöscht werden" + version_status_closed: "geschlossen" + version_status_locked: "gesperrt" + version_status_open: "offen" note: Hinweis - note_password_login_disabled: Der Passwort-Login wurde per %{configuration} deaktiviert. + note_password_login_disabled: "Der Passwort-Login wurde per %{configuration} deaktiviert." warning: Warnung warning_attachments_not_saved: "%{count} Datei(en) konnten nicht gespeichert werden." - warning_imminent_user_limit: 'Sie haben mehr Nutzer eingeladen, als Ihr momentaner - Plan zulässt. Eingeladene Nutzer können Ihrem OpenProject möglicherweise nicht - beitreten. Bitte upgraden Sie Ihren Tarif oder blockieren - Sie vorhandene Mitglieder, um den eingeladenen und registrierten Nutzern die Möglichkeit - zu bieten, Ihrem Projekt beizutreten. + warning_imminent_user_limit: > + Sie haben mehr Nutzer eingeladen, als Ihr momentaner Plan zulässt. Eingeladene Nutzer können Ihrem OpenProject möglicherweise nicht beitreten. Bitte upgraden Sie Ihren Tarif oder blockieren Sie vorhandene Mitglieder, um den eingeladenen und registrierten Nutzern die Möglichkeit zu bieten, Ihrem Projekt beizutreten. + warning_registration_token_expired: | + E-Mail mit dem Aktivierungslink ist abgelaufen. Wir haben Ihnen ein neues zu %{email} geschickt. Bitte aktivieren Sie Ihr Konto über den Link in dieser E-Mail. + warning_user_limit_reached: > + Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte kontaktieren Sie einen Administrator, um sicherzustellen, dass externe Benutzer auf diese Instanz zugreifen können. + warning_user_limit_reached_admin: > + Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte aktualisieren Sie Ihr Abonnement um sicherzustellen, dass externe Benutzer auf diese Instanz zugreifen können. + warning_user_limit_reached_instructions: > + Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise edition Plan upzugraden und weitere Nutzer hinzuzufügen. + warning_protocol_mismatch_html: > - ' - warning_registration_token_expired: 'E-Mail mit dem Aktivierungslink ist abgelaufen. - Wir haben Ihnen ein neues zu %{email} geschickt. Bitte aktivieren Sie Ihr Konto - über den Link in dieser E-Mail. - - ' - warning_user_limit_reached: 'Das Hinzufügen zusätzlicher Benutzer überschreitet - das aktuelle Benutzerlimit. Bitte kontaktieren Sie einen Administrator, um sicherzustellen, - dass externe Benutzer auf diese Instanz zugreifen können. - - ' - warning_user_limit_reached_admin: 'Das Hinzufügen zusätzlicher Benutzer überschreitet - das aktuelle Benutzerlimit. Bitte aktualisieren Sie Ihr - Abonnement um sicherzustellen, dass externe Benutzer auf diese Instanz zugreifen - können. - - ' - warning_user_limit_reached_instructions: 'Du hast dein Nutzerlimit erreicht (%{current}/%{max} - active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise edition - Plan upzugraden und weitere Nutzer hinzuzufügen. - - ' - warning_protocol_mismatch_html: '' warning_bar: https_mismatch: - title: HTTPS-Modus Setup stimmt nicht überein - text_html: 'Ihre Anwendung läuft mit dem HTTPS-Modus auf %{set_protocol}, - aber die Anfrage ist eine %{actual_protocol} Anfrage. Dies führt - zu Fehlern! Sie müssen folgenden Konfigurationswert setzen: %{setting_value}. - Bitte lesen Sie in der die Installationsdokumentation - , wie Sie diese Konfiguration einstellen. - - ' + title: "HTTPS-Modus Setup stimmt nicht überein" + text_html: > + Ihre Anwendung läuft mit dem HTTPS-Modus auf %{set_protocol}, aber die Anfrage ist eine %{actual_protocol} Anfrage. Dies führt zu Fehlern! Sie müssen folgenden Konfigurationswert setzen: %{setting_value}. Bitte lesen Sie in der die Installationsdokumentation , wie Sie diese Konfiguration einstellen. hostname_mismatch: - title: Einstellung des Hostnamens stimmt nicht überein - text_html: 'Ihre Anwendung läuft mit Hostname %{set_hostname}, - aber laut Anfrage ist der Hostname %{actual_hostname}. Dies führt - zu Fehlern! Gehen Sie zu Systemeinstellungen - und ändern Sie die Einstellung "Hostname" um dies zu korrigieren. - - ' - menu_item: Menüpunkt - menu_item_setting: Sichtbarkeit - wiki_menu_item_for: Menüpunkt für die Wikiseite "%{title}" - wiki_menu_item_setting: Sichtbarkeit - wiki_menu_item_new_main_item_explanation: 'Der einzige Wiki-Hauptmenüpunkt wird - gelöscht. Sie müssen nun eine Wikiseite auswählen, für die ein neuer Menüpunkt - erzeugt wird. Um das Wiki zu entfernen kann das Wiki Modul durch Projektadministratoren - deaktiviert werden. - - ' - wiki_menu_item_delete_not_permitted: Der Wiki-Menüpunkt der einzigen Wiki-Seite - kann nicht gelöscht werden. + title: "Einstellung des Hostnamens stimmt nicht überein" + text_html: > + Ihre Anwendung läuft mit Hostname %{set_hostname}, aber laut Anfrage ist der Hostname %{actual_hostname}. Dies führt zu Fehlern! Gehen Sie zu Systemeinstellungen und ändern Sie die Einstellung "Hostname" um dies zu korrigieren. + menu_item: "Menüpunkt" + menu_item_setting: "Sichtbarkeit" + wiki_menu_item_for: 'Menüpunkt für die Wikiseite "%{title}"' + wiki_menu_item_setting: "Sichtbarkeit" + wiki_menu_item_new_main_item_explanation: > + Der einzige Wiki-Hauptmenüpunkt wird gelöscht. Sie müssen nun eine Wikiseite auswählen, für die ein neuer Menüpunkt erzeugt wird. Um das Wiki zu entfernen kann das Wiki Modul durch Projektadministratoren deaktiviert werden. + wiki_menu_item_delete_not_permitted: Der Wiki-Menüpunkt der einzigen Wiki-Seite kann nicht gelöscht werden. + #TODO: merge with work_packages top level key work_package: - updated_automatically_by_child_changes: '_Automatisch durch die Änderungen in - Unteraufgabe %{child} aktualisiert_ - - ' + updated_automatically_by_child_changes: | + _Automatisch durch die Änderungen in Unteraufgabe %{child} aktualisiert_ destroy: - info: Die Löschung des Arbeitspakets kann nicht rückgängig gemacht werden. - title: Arbeitspaket löschen + info: "Die Löschung des Arbeitspakets kann nicht rückgängig gemacht werden." + title: "Arbeitspaket löschen" progress: - label_note: 'Hinweis:' + label_note: "Hinweis:" modal: - work_based_help_text: Jedes Feld wird, wenn möglich, automatisch aus den beiden - anderen berechnet. - status_based_help_text: "% Abgeschlossen wird durch den Status des Arbeitspakets - festgelegt." - migration_warning_text: Im aufwandsbezogenen Modus, kann % Fertig nicht manuell - eingegeben werden und ist immer an den Aufwand gebunden. Der vorhandene - Wert wurde beibehalten, kann aber nicht bearbeitet werden. Bitte geben Sie - zuerst den Wert für Aufwand ein. + work_based_help_text: "Jedes Feld wird, wenn möglich, automatisch aus den beiden anderen berechnet." + status_based_help_text: "% Abgeschlossen wird durch den Status des Arbeitspakets festgelegt." + migration_warning_text: "Im aufwandsbezogenen Modus, kann % Fertig nicht manuell eingegeben werden und ist immer an den Aufwand gebunden. Der vorhandene Wert wurde beibehalten, kann aber nicht bearbeitet werden. Bitte geben Sie zuerst den Wert für Aufwand ein." derivation_hints: done_ratio: - cleared_because_remaining_work_is_empty: Gelöscht, weil Verbleibender Aufwand - leer ist. - cleared_because_work_is_0h: Gelöscht, weil Aufwand 0h beträgt. - derived: Von Aufwand und Verbleibendem Aufwand abgeleitet. + cleared_because_remaining_work_is_empty: "Gelöscht, weil Verbleibender Aufwand leer ist." + cleared_because_work_is_0h: "Gelöscht, weil Aufwand 0h beträgt." + derived: "Von Aufwand und Verbleibendem Aufwand abgeleitet." estimated_hours: - cleared_because_remaining_work_is_empty: Gelöscht, weil Verbleibender Aufwand - leer ist. - derived: Von Aufwand und % abgeschlossen abgeleitet. - same_as_remaining_work: Auf denselben Wert wie Verbleibender Aufwand gesetzt. + cleared_because_remaining_work_is_empty: "Gelöscht, weil Verbleibender Aufwand leer ist." + derived: "Von Aufwand und % abgeschlossen abgeleitet." + same_as_remaining_work: "Auf denselben Wert wie Verbleibender Aufwand gesetzt." remaining_hours: - cleared_because_work_is_empty: Gelöscht, weil Aufwand leer ist. - cleared_because_percent_complete_is_empty: Gelöscht, da % abgeschlossen - leer ist. - decreased_by_delta_like_work: Verringert um %{delta}, entsprechend der Reduzierung - des Aufwands. - derived: Abgeleitet von Aufwand und % abgeschlossen. - increased_by_delta_like_work: Erhöht um %{delta}, was dem Anstieg bei Aufwand - entspricht. - same_as_work: Auf denselben Wert wie Aufwand gesetzt. + cleared_because_work_is_empty: "Gelöscht, weil Aufwand leer ist." + cleared_because_percent_complete_is_empty: "Gelöscht, da % abgeschlossen leer ist." + decreased_by_delta_like_work: "Verringert um %{delta}, entsprechend der Reduzierung des Aufwands." + derived: "Abgeleitet von Aufwand und % abgeschlossen." + increased_by_delta_like_work: "Erhöht um %{delta}, was dem Anstieg bei Aufwand entspricht." + same_as_work: "Auf denselben Wert wie Aufwand gesetzt." permissions: - comment: Kommentar - comment_description: Kann dieses Arbeitspaket anzeigen und kommentieren. - edit: Bearbeiten - edit_description: Kann dieses Arbeitspaket ansehen, kommentieren und editieren. - view: Ansicht - view_description: Kann dieses Arbeitspaket ansehen. + comment: "Kommentar" + comment_description: "Kann dieses Arbeitspaket anzeigen und kommentieren." + edit: "Bearbeiten" + edit_description: "Kann dieses Arbeitspaket ansehen, kommentieren und editieren." + view: "Ansicht" + view_description: "Kann dieses Arbeitspaket ansehen." reminders: - label_remind_at: Datum - note_placeholder: Warum richten Sie diese Erinnerung ein? - create_success_message: Erinnerung erfolgreich gesetzt. Sie erhalten eine Benachrichtigung - für dieses Arbeitspaket %{reminder_time}. - success_update_message: Erinnerung aktualisiert erfolgreich. - success_deletion_message: Erinnerung erfolgreich gelöscht. + label_remind_at: "Datum" + note_placeholder: "Warum richten Sie diese Erinnerung ein?" + create_success_message: "Erinnerung erfolgreich gesetzt. Sie erhalten eine Benachrichtigung für dieses Arbeitspaket %{reminder_time}." + success_update_message: "Erinnerung aktualisiert erfolgreich." + success_deletion_message: "Erinnerung erfolgreich gelöscht." sharing: count: - zero: 0 Benutzer - one: 1 Benutzer + zero: "0 Benutzer" + one: "1 Benutzer" other: "%{count} Benutzer" filter: - project_member: Projektmitglied - not_project_member: Kein Projektmitglied - project_group: Projektgruppe - not_project_group: Keine Projektgruppe - user: Benutzer - group: Gruppe - role: Rolle - type: Typ - denied: Sie haben keine Berechtigung, %{entities} zu teilen. - label_search: Suche nach einzuladenden Benutzern - label_search_placeholder: Suche nach Benutzer oder E-Mail-Adresse - label_toggle_all: Alle Freigaben umschalten - remove: Entfernen - share: Teilen - text_empty_search_description: Es gibt keine Benutzer mit den aktuellen Filterkriterien. - text_empty_search_header: Keine passenden Ergebnisse gefunden. + project_member: "Projektmitglied" + not_project_member: "Kein Projektmitglied" + project_group: "Projektgruppe" + not_project_group: "Keine Projektgruppe" + user: "Benutzer" + group: "Gruppe" + role: "Rolle" + type: "Typ" + denied: "Sie haben keine Berechtigung, %{entities} zu teilen." + label_search: "Suche nach einzuladenden Benutzern" + label_search_placeholder: "Suche nach Benutzer oder E-Mail-Adresse" + label_toggle_all: "Alle Freigaben umschalten" + remove: "Entfernen" + share: "Teilen" + text_empty_search_description: "Es gibt keine Benutzer mit den aktuellen Filterkriterien." + text_empty_search_header: "Keine passenden Ergebnisse gefunden." text_empty_state_description: "%{entity} wurde noch nicht geteilt." - text_empty_state_header: Nicht geteilt - text_user_limit_reached: Das Hinzufügen zusätzlicher Benutzer überschreitet das - aktuelle Benutzerlimit. Bitte kontaktieren Sie einen Administrator, um sicherzustellen, - dass externe Benutzer auf dieses %{entity} zugreifen können. - text_user_limit_reached_admins: Das Hinzufügen zusätzlicher Benutzer überschreitet - das aktuelle Benutzerlimit. Bitte aktualisieren Sie - Ihr Abonnement um sicherzustellen, dass externe Benutzer auf diese Instanz - zugreifen können. - warning_user_limit_reached: 'Das Hinzufügen zusätzlicher Benutzer überschreitet - das aktuelle Benutzerlimit. Bitte kontaktieren Sie einen Administrator, um sicherzustellen, - dass externe Benutzer auf dieses %{entity} zugreifen können. - - ' - warning_user_limit_reached_admin: 'Das Hinzufügen zusätzlicher Benutzer überschreitet - das aktuelle Benutzerlimit. Bitte aktualisieren Sie - Ihr Abonnement um sicherzustellen, dass externe Benutzer auf diese %{entity} - zugreifen können. - - ' - warning_no_selected_user: Bitte wählen Sie Benutzer aus, mit denen diese %{entity} - geteilt werden soll - warning_locked_user: Der Benutzer %{user} ist gesperrt und mit ihm kann nicht - geteilt werden + text_empty_state_header: "Nicht geteilt" + text_user_limit_reached: "Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte kontaktieren Sie einen Administrator, um sicherzustellen, dass externe Benutzer auf dieses %{entity} zugreifen können." + text_user_limit_reached_admins: 'Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte aktualisieren Sie Ihr Abonnement um sicherzustellen, dass externe Benutzer auf diese Instanz zugreifen können.' + warning_user_limit_reached: > + Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte kontaktieren Sie einen Administrator, um sicherzustellen, dass externe Benutzer auf dieses %{entity} zugreifen können. + warning_user_limit_reached_admin: > + Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte aktualisieren Sie Ihr Abonnement um sicherzustellen, dass externe Benutzer auf diese %{entity} zugreifen können. + warning_no_selected_user: "Bitte wählen Sie Benutzer aus, mit denen diese %{entity} geteilt werden soll" + warning_locked_user: "Der Benutzer %{user} ist gesperrt und mit ihm kann nicht geteilt werden" user_details: - locked: Gesperrter Benutzer - invited: 'Einladung gesendet. ' - resend_invite: Erneut senden. - invite_resent: Einladung wurde erneut gesendet - not_project_member: Kein Projektmitglied - project_group: Gruppenmitglieder haben möglicherweise zusätzliche Berechtigungen - (als Projektmitglieder) - not_project_group: Gruppe (Teilen mit allen Mitgliedern) - additional_privileges_project: hat möglicherweise zusätzliche Berechtigungen - (als Projektmitglied) - additional_privileges_group: hat möglicherweise zusätzliche Berechtigungen (als - Gruppenmitglied) - additional_privileges_project_or_group: hat möglicherweise zusätzliche Berechtigungen - (als Projekt- oder Gruppenmitglied) + locked: "Gesperrter Benutzer" + invited: "Einladung gesendet. " + resend_invite: "Erneut senden." + invite_resent: "Einladung wurde erneut gesendet" + not_project_member: "Kein Projektmitglied" + project_group: "Gruppenmitglieder haben möglicherweise zusätzliche Berechtigungen (als Projektmitglieder)" + not_project_group: "Gruppe (Teilen mit allen Mitgliedern)" + additional_privileges_project: "hat möglicherweise zusätzliche Berechtigungen (als Projektmitglied)" + additional_privileges_group: "hat möglicherweise zusätzliche Berechtigungen (als Gruppenmitglied)" + additional_privileges_project_or_group: "hat möglicherweise zusätzliche Berechtigungen (als Projekt- oder Gruppenmitglied)" project_queries: - publishing_denied: Ihnen fehlt die Berechtigung Projektlisten zu veröffentlichen. - access_warning: Die Nutzer:innen sehen nur die Projekte, auf welche sie Zugriff - haben. Die gemeinsame Nutzung von Projektlisten hat keine Auswirkungen auf - die Berechtigungen für einzelne Projekte. + publishing_denied: "Ihnen fehlt die Berechtigung Projektlisten zu veröffentlichen." + access_warning: "Die Nutzer:innen sehen nur die Projekte, auf welche sie Zugriff haben. Die gemeinsame Nutzung von Projektlisten hat keine Auswirkungen auf die Berechtigungen für einzelne Projekte." user_details: - owner: Besitzer der Liste - can_view_because_public: Kann die Liste bereits sehen da die Liste mit allen - Nutzer:innen geteilt wird. - can_manage_public_lists: Kann die Liste aufgrund globaler Rechte modifizieren + owner: "Besitzer der Liste" + can_view_because_public: "Kann die Liste bereits sehen da die Liste mit allen Nutzer:innen geteilt wird." + can_manage_public_lists: "Kann die Liste aufgrund globaler Rechte modifizieren" public_flag: - label: Mit allen Nutzer:innen von %{instance_name} teilen - caption: Alle Nutzer:innen können diese Projektliste sehen. Diejenigen mit - dem globalen Recht “Projektlisten bearbeiten” können diese Projektlisten - bearbeiten. + label: "Mit allen Nutzer:innen von %{instance_name} teilen" + caption: "Alle Nutzer:innen können diese Projektliste sehen. Diejenigen mit dem globalen Recht “Projektlisten bearbeiten” können diese Projektlisten bearbeiten." blank_state: public: - header: Mit allen Nutzer:innen teilen - description: Alle Nutzer:innen können die Projektliste sehen. Sie können - einzelne Nutzer:innen mit zusätzlichen Rechten hinzufügen. + header: "Mit allen Nutzer:innen teilen" + description: "Alle Nutzer:innen können die Projektliste sehen. Sie können einzelne Nutzer:innen mit zusätzlichen Rechten hinzufügen." private: - header: 'Nicht geteilt: Privat' - description: Diese Projektliste wird derzeit mit niemandem geteilt. Nur - Sie haben Zugriff. + header: "Nicht geteilt: Privat" + description: "Diese Projektliste wird derzeit mit niemandem geteilt. Nur Sie haben Zugriff." permissions: - view: Anzeigen - view_description: Kann diese Projektliste ansehen. - edit: Bearbeiten - edit_description: Kann diese Projektliste anzeigen, teilen und bearbeiten. + view: "Anzeigen" + view_description: "Kann diese Projektliste ansehen." + edit: "Bearbeiten" + edit_description: "Kann diese Projektliste anzeigen, teilen und bearbeiten." upsell: - message: Das Teilen von Projektlisten mit einzelnen Nutzern ist ein Enterprise - Add-on + message: "Das Teilen von Projektlisten mit einzelnen Nutzern ist ein Enterprise Add-on" working_days: - info: 'Tage, die nicht ausgewählt sind, werden bei der Planung von Arbeitspaketen - und Projektphasen übersprungen (und bei der Tageszählung nicht berücksichtigt). - Diese können auf Arbeitspaket-Ebene überschrieben werden. - - ' - instance_wide_info: 'Daten, die der Liste unten hinzugefügt werden, gelten als - arbeitsfrei und werden bei der Planung von Arbeitspaketen übersprungen. - - ' - change_button: Arbeitstage ändern - warning: '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. - - ' + info: > + Tage, die nicht ausgewählt sind, werden bei der Planung von Arbeitspaketen und Projektphasen übersprungen (und bei der Tageszählung nicht berücksichtigt). Diese können auf Arbeitspaket-Ebene überschrieben werden. + instance_wide_info: > + Daten, die der Liste unten hinzugefügt werden, gelten als arbeitsfrei und werden bei der Planung von Arbeitspaketen übersprungen. + change_button: "Arbeitstage ändern" + warning: > + 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. journal_note: changed: _**Arbeitstage** geändert (%{changes})._ days: @@ -6601,328 +5303,236 @@ de: dates: working: "%{date} ist jetzt ein Arbeitstag" non_working: "%{date} ist jetzt ein arbeitsfreier Tag" - nothing_to_preview: Keine Vorschau verfügbar + nothing_to_preview: "Keine Vorschau verfügbar" api_v3: attributes: - property: Eigenschaft + property: "Eigenschaft" errors: - code_400: 'Ungültige Anfrage: %{message}' - code_401: Sie müssen sich authentifizieren, um auf die Ressource zugreifen zu - können. - code_401_wrong_credentials: Die von Ihnen benutzten Zugangsdaten sind nicht - korrekt. - code_403: Sie sind nicht berechtigt auf diese Ressource zuzugreifen. - code_404: Die angeforderte Ressource konnte nicht gefunden werden. - code_409: Die Ressource konnte wegen parallelen Zugriffs nicht aktualisiert - werden. - code_429: Zu viele Anfragen. Bitte versuchen Sie es später erneut. - code_500: Ein interner Fehler ist aufgetreten. - code_500_outbound_request_failure: Eine ausgehende Anfrage an eine andere Ressource - ist mit dem Statuscode %{status_code} fehlgeschlagen. - code_500_missing_enterprise_token: Die Anfrage kann wegen ungültigem oder fehlenden - Enterprise Token nicht bearbeitet werden. + code_400: "Ungültige Anfrage: %{message}" + code_401: "Sie müssen sich authentifizieren, um auf die Ressource zugreifen zu können." + code_401_wrong_credentials: "Die von Ihnen benutzten Zugangsdaten sind nicht korrekt." + code_403: "Sie sind nicht berechtigt auf diese Ressource zuzugreifen." + code_404: "Die angeforderte Ressource konnte nicht gefunden werden." + code_409: "Die Ressource konnte wegen parallelen Zugriffs nicht aktualisiert werden." + code_429: "Zu viele Anfragen. Bitte versuchen Sie es später erneut." + code_500: "Ein interner Fehler ist aufgetreten." + code_500_outbound_request_failure: "Eine ausgehende Anfrage an eine andere Ressource ist mit dem Statuscode %{status_code} fehlgeschlagen." + code_500_missing_enterprise_token: "Die Anfrage kann wegen ungültigem oder fehlenden Enterprise Token nicht bearbeitet werden." bad_request: - emoji_reactions_activity_type_not_supported: Dieser Aktivitätstyp unterstützt - keine Emoji-Reaktionen. - invalid_link: Der Link unter dem Schlüssel '%{key}' ist nicht gültig. - links_not_an_object: _links muss ein JSON-Objekt sein. + emoji_reactions_activity_type_not_supported: "Dieser Aktivitätstyp unterstützt keine Emoji-Reaktionen." + invalid_link: "Der Link unter dem Schlüssel '%{key}' ist nicht gültig." + links_not_an_object: "_links muss ein JSON-Objekt sein." conflict: - multiple_reminders_not_allowed: Sie können nur eine Erinnerung gleichzeitig - für ein Arbeitspaket festlegen. Bitte löschen oder aktualisieren Sie die - bestehende Erinnerung. + multiple_reminders_not_allowed: |- + Sie können nur eine Erinnerung gleichzeitig für ein Arbeitspaket festlegen. Bitte löschen oder aktualisieren Sie die bestehende Erinnerung. not_found: - work_package: Das von Ihnen gesuchte Arbeitspaket konnte nicht gefunden werden - oder wurde gelöscht. - reminder: Die Erinnerung konnte nicht gefunden werden oder wurde gelöscht. + work_package: "Das von Ihnen gesuchte Arbeitspaket konnte nicht gefunden werden oder wurde gelöscht." + reminder: "Die Erinnerung konnte nicht gefunden werden oder wurde gelöscht." expected: - date: YYYY-MM-DD (Datum nach ISO 8601) - datetime: JJJJ-MM-TTThh:mm:ss[.lll][+hh:mm] (kompatible ISO 8601-Datum) - duration: ISO 8601 Zeitspanne - invalid_content_type: Es wird der CONTENT-TYPE '%{content_type}' erwartet, es - wurde aber der CONTENT-TYP '%{actual}' gesandt. - invalid_format: 'Ungültiges Format für Eigenschaft ''%{property}'': Ein Format - der Art ''%{expected_format}'' wurde erwartet, aber ''%{actual}'' wurde übergeben.' - invalid_json: Die Anfrage konnte nicht als JSON geparsed werden. - invalid_relation: Die Beziehung ist ungültig. - invalid_resource: Für die Eigenschaft '%{property}' wird ein Link wie '%{expected}' - erwartet. Gesandt wurde '%{actual}'. + date: "YYYY-MM-DD (Datum nach ISO 8601)" + datetime: "JJJJ-MM-TTThh:mm:ss[.lll][+hh:mm] (kompatible ISO 8601-Datum)" + duration: "ISO 8601 Zeitspanne" + invalid_content_type: "Es wird der CONTENT-TYPE '%{content_type}' erwartet, es wurde aber der CONTENT-TYP '%{actual}' gesandt." + invalid_format: "Ungültiges Format für Eigenschaft '%{property}': Ein Format der Art '%{expected_format}' wurde erwartet, aber '%{actual}' wurde übergeben." + invalid_json: "Die Anfrage konnte nicht als JSON geparsed werden." + invalid_relation: "Die Beziehung ist ungültig." + invalid_resource: "Für die Eigenschaft '%{property}' wird ein Link wie '%{expected}' erwartet. Gesandt wurde '%{actual}'." invalid_signal: - embed: Die angeforderte Auswahl von %{invalid} wird nicht unterstützt. Unterstützte - Auswahlen sind %{supported}. - select: Die angeforderte Auswahl von %{invalid} wird nicht unterstützt. Unterstützte - Auswahlen sind %{supported}. - invalid_user_status_transition: Für diesen Nutzeraccount ist die angeforderte - Statusänderung nicht zulässig. - missing_content_type: nicht angegeben - missing_property: Fehlende Eigenschaft '%{property}'. - missing_request_body: Die Abfrage enthielt keinen Inhalt. - missing_or_malformed_parameter: Der Query-Parameter "%{parameter}" fehlt oder - ist fehlerhaft. - multipart_body_error: Die Anfrage enthielt nicht die erwarteten mehrteiligen - Abschnitte. - multiple_errors: Einschränkungen für mehrere Felder wurden verletzt. - unable_to_create_attachment: Der Anhang konnte nicht erstellt werden - unable_to_create_attachment_permissions: Der Anhang konnte aufgrund fehlender - Dateisystemberechtigungen nicht gespeichert werden + embed: "Die angeforderte Auswahl von %{invalid} wird nicht unterstützt. Unterstützte Auswahlen sind %{supported}." + select: "Die angeforderte Auswahl von %{invalid} wird nicht unterstützt. Unterstützte Auswahlen sind %{supported}." + invalid_user_status_transition: "Für diesen Nutzeraccount ist die angeforderte Statusänderung nicht zulässig." + missing_content_type: "nicht angegeben" + missing_property: "Fehlende Eigenschaft '%{property}'." + missing_request_body: "Die Abfrage enthielt keinen Inhalt." + missing_or_malformed_parameter: "Der Query-Parameter \"%{parameter}\" fehlt oder ist fehlerhaft." + multipart_body_error: "Die Anfrage enthielt nicht die erwarteten mehrteiligen Abschnitte." + multiple_errors: "Einschränkungen für mehrere Felder wurden verletzt." + unable_to_create_attachment: "Der Anhang konnte nicht erstellt werden" + unable_to_create_attachment_permissions: "Der Anhang konnte aufgrund fehlender Dateisystemberechtigungen nicht gespeichert werden" user: - name_readonly: Das Attribut 'name' ist schreibgeschützt. Änderungen können - über die Attribute firstname und lastname geschrieben werden. + name_readonly: "Das Attribut 'name' ist schreibgeschützt. Änderungen können über die Attribute firstname und lastname geschrieben werden." render: - context_not_parsable: Der übergebene Kontext ist kein Link zu einer Ressource. - unsupported_context: Die übergebene Ressource wird nicht als Kontext unterstützt. - context_object_not_found: Die als Kontext übergebene Ressource konnte nicht - gefunden werden. + context_not_parsable: "Der übergebene Kontext ist kein Link zu einer Ressource." + unsupported_context: "Die übergebene Ressource wird nicht als Kontext unterstützt." + context_object_not_found: "Die als Kontext übergebene Ressource konnte nicht gefunden werden." validation: - due_date: Der Endtermin kann für Eltern-Arbeitspakete nicht gesetzt werden. - invalid_user_assigned_to_work_package: Der gewählte Nutzer darf dem Arbeitspaket - nicht als '%{property}' zugewiesen werden. - start_date: Das Startdatum kann für Eltern-Arbeitspakete nicht gesetzt werden. + due_date: "Der Endtermin kann für Eltern-Arbeitspakete nicht gesetzt werden." + invalid_user_assigned_to_work_package: "Der gewählte Nutzer darf dem Arbeitspaket nicht als '%{property}' zugewiesen werden." + start_date: "Das Startdatum kann für Eltern-Arbeitspakete nicht gesetzt werden." eprops: - invalid_gzip: 'ist ungültiges gzip-Archiv: %{message}' - invalid_json: 'ist ungültiges JSON: %{message}' + invalid_gzip: "ist ungültiges gzip-Archiv: %{message}" + invalid_json: "ist ungültiges JSON: %{message}" resources: - schema: Schema + schema: "Schema" undisclosed: - parent: Unbekannt - Das übergeordnete Element ist wegen fehlender Berechtigungen - nicht sichtbar. + parent: Unbekannt - Das übergeordnete Element ist wegen fehlender Berechtigungen nicht sichtbar. project: Unbekannt - Das Projekt ist wegen fehlender Berechtigungen nicht sichtbar. - ancestor: Unbekannt - Das übergeordnete Element ist wegen fehlender Berechtigungen - nicht sichtbar. - definingProject: Unbekannt - Das Projekt ist wegen fehlender Berechtigungen - nicht sichtbar. + ancestor: Unbekannt - Das übergeordnete Element ist wegen fehlender Berechtigungen nicht sichtbar. + definingProject: Unbekannt - Das Projekt ist wegen fehlender Berechtigungen nicht sichtbar. doorkeeper: pre_authorization: - status: Vorab-Autorisierung - auth_url: Auth-URL - access_token_url: Zugangs-Token URL + status: "Vorab-Autorisierung" + auth_url: "Auth-URL" + access_token_url: "Zugangs-Token URL" errors: messages: + #Common error messages invalid_request: - unknown: Der Anfrage fehlt ein benötigten Parameter, enthält einen nicht - unterstützten Parameter oder ist anderweitig fehlerhaft. - missing_param: 'Erforderlicher Parameter fehlt: %{value}.' - request_not_authorized: Anfrage muss autorisiert werden. Benötigter Parameter - für die Autorisierung der Anfrage fehlt oder ist ungültig. - invalid_redirect_uri: Der angeforderte Redirect-URI ist fehlerhaft. - unauthorized_client: Der Client ist nicht berechtigt, einen Request mit dieser - Methode durchzuführen. - access_denied: Der Autorisierungsserver verweigerte die Anfrage. - invalid_scope: Der angeforderte Geltungsbereich ist ungültig, unbekannt oder - fehlerhaft. - invalid_code_challenge_method: Die Code-Challenge-Methode muss PLAIN oder - S256 sein. - server_error: Der Autorisierungsserver kann den Request aufgrund eines Fehlers - nicht beantworten. - temporarily_unavailable: Der Autorisierungsserver kann die Anfrage derzeit - aufgrund einer temporären Überlastung oder Wartung des Servers nicht bearbeiten. - credential_flow_not_configured: Resource Owner Password Credentials flow fehlgeschlagen, - da Doorkeeper.configure.resource_owner_from_account nicht konfiguriert ist. - resource_owner_authenticator_not_configured: Resource Owner Password Credentials - flow fehlgeschlagen, da Doorkeeper.configure.resource_owner_authenticator - nicht konfiguriert ist. - admin_authenticator_not_configured: Der Zugriff auf das Admin-Panel ist verboten, - da Doorkeeper.configure.admin_authenticator nicht konfiguriert ist. - unsupported_response_type: Der Autorisierungsserver unterstützt diesen Antworttyp - nicht. - unsupported_response_mode: Der Autorisierungsserver unterstützt diesen Antworttyp - nicht. - invalid_client: Die Client-Authentifizierung ist aufgrund eines unbekannten - Clients oder einer nicht unterstützten Anfrage fehlgeschlagen. - invalid_grant: Die bereitgestellte Genehmigung ist ungültig, abgelaufen, widerrufen, - entspricht nicht der Redirect-URI, die in der Autorisierungsanfrage verwendet - wird oder wurde an einen anderen Client ausgegeben. - unsupported_grant_type: Der Autorisierungs-Grant-Typ wird vom Autorisierungsserver - nicht unterstützt. + unknown: "Der Anfrage fehlt ein benötigten Parameter, enthält einen nicht unterstützten Parameter oder ist anderweitig fehlerhaft." + missing_param: "Erforderlicher Parameter fehlt: %{value}." + request_not_authorized: "Anfrage muss autorisiert werden. Benötigter Parameter für die Autorisierung der Anfrage fehlt oder ist ungültig." + invalid_redirect_uri: "Der angeforderte Redirect-URI ist fehlerhaft." + unauthorized_client: "Der Client ist nicht berechtigt, einen Request mit dieser Methode durchzuführen." + access_denied: "Der Autorisierungsserver verweigerte die Anfrage." + invalid_scope: "Der angeforderte Geltungsbereich ist ungültig, unbekannt oder fehlerhaft." + invalid_code_challenge_method: "Die Code-Challenge-Methode muss PLAIN oder S256 sein." + server_error: "Der Autorisierungsserver kann den Request aufgrund eines Fehlers nicht beantworten." + temporarily_unavailable: "Der Autorisierungsserver kann die Anfrage derzeit aufgrund einer temporären Überlastung oder Wartung des Servers nicht bearbeiten." + #Configuration error messages + credential_flow_not_configured: "Resource Owner Password Credentials flow fehlgeschlagen, da Doorkeeper.configure.resource_owner_from_account nicht konfiguriert ist." + resource_owner_authenticator_not_configured: "Resource Owner Password Credentials flow fehlgeschlagen, da Doorkeeper.configure.resource_owner_authenticator nicht konfiguriert ist." + admin_authenticator_not_configured: "Der Zugriff auf das Admin-Panel ist verboten, da Doorkeeper.configure.admin_authenticator nicht konfiguriert ist." + #Access grant errors + unsupported_response_type: "Der Autorisierungsserver unterstützt diesen Antworttyp nicht." + unsupported_response_mode: "Der Autorisierungsserver unterstützt diesen Antworttyp nicht." + #Access token errors + invalid_client: "Die Client-Authentifizierung ist aufgrund eines unbekannten Clients oder einer nicht unterstützten Anfrage fehlgeschlagen." + invalid_grant: "Die bereitgestellte Genehmigung ist ungültig, abgelaufen, widerrufen, entspricht nicht der Redirect-URI, die in der Autorisierungsanfrage verwendet wird oder wurde an einen anderen Client ausgegeben." + unsupported_grant_type: "Der Autorisierungs-Grant-Typ wird vom Autorisierungsserver nicht unterstützt." invalid_token: - revoked: Das Zugangstoken wurde widerrufen - expired: Der Zugangstoken ist abgelaufen - unknown: Das Zugangstoken ist ungültig + revoked: "Das Zugangstoken wurde widerrufen" + expired: "Der Zugangstoken ist abgelaufen" + unknown: "Das Zugangstoken ist ungültig" revoke: - unauthorized: Sie sind nicht berechtigt, diesen Token zu widerrufen. + unauthorized: "Sie sind nicht berechtigt, diesen Token zu widerrufen." forbidden_token: - missing_scope: Der Zugriff auf diese Ressource erfordert den Scope "%{oauth_scopes}". + missing_scope: 'Der Zugriff auf diese Ressource erfordert den Scope "%{oauth_scopes}".' unsupported_browser: - title: Ihr Browser ist veraltet und nicht unterstützt. - message: Sie werden deshalb auf dieser Seite eventuell Fehler feststellen oder - Ihr Benutzererlebnis wird eingeschränkt sein. - update_message: Bitte aktualisieren Sie Ihren Browser. - close_warning: Diese Warnung ignorieren. + title: "Ihr Browser ist veraltet und nicht unterstützt." + message: "Sie werden deshalb auf dieser Seite eventuell Fehler feststellen oder Ihr Benutzererlebnis wird eingeschränkt sein." + update_message: "Bitte aktualisieren Sie Ihren Browser." + close_warning: "Diese Warnung ignorieren." oauth: application: builtin: Interne Anwendung für diese Instanz confidential: Vertraulich - singular: OAuth-Anwendung - scopes: Geltungsbereiche - client_credentials: Anmeldeinformationen des Clients - plural: OAuth-Anwendungen - named: OAuth-Anwendung '%{name}' - new: Neue OAuth-Anwendung + singular: "OAuth-Anwendung" + scopes: "Geltungsbereiche" + client_credentials: "Anmeldeinformationen des Clients" + plural: "OAuth-Anwendungen" + named: "OAuth-Anwendung '%{name}'" + new: "Neue OAuth-Anwendung" non_confidential: Nicht vertraulich default_scopes: "(Voreingestellte Geltungsbereiche)" instructions: - enabled: Aktivieren Sie diese Anwendung, so dass Benutzer mit ihr Autorisierungen - vornehmen können. - name: Der Name Ihrer OAuth-Anwendung. Dieser wird anderen Benutzern bei der - Autorisierung angezeigt. - redirect_uri_html: 'Die erlaubten URLs auf welche autorisierte Benutzer weitergeleitet - werden können. Ein Eintrag pro Zeile.
Wenn Sie eine Desktop-Anwendung - registrieren, verwenden Sie die folgende URL. - - ' - confidential: Überprüfen Sie, ob die Anwendung verwendet wird, wo das Client-Geheimnis - vertraulich gehalten werden kann. Native mobile Apps und Single Page Apps - sind nicht vertraulich. - scopes: Überprüfen Sie die Bereiche, auf die die Anwendung Zugriff gewähren - soll. Wenn kein Geltungsbereich ausgewählt ist, wird api_v3 angenommen. - client_credential_user_id: Optionaler Nutzer, der bei der Nutzung dieser Anwendung - verkörpert wird. Leer lassen, um nur öffentlichen Zugriff zu erlauben - register_intro: Wenn Sie eine OAuth API-Client-Anwendung für OpenProject entwickeln, - können Sie es mit diesem Formular für alle Benutzer registrieren. - default_scopes: '' + enabled: "Aktivieren Sie diese Anwendung, so dass Benutzer mit ihr Autorisierungen vornehmen können." + name: "Der Name Ihrer OAuth-Anwendung. Dieser wird anderen Benutzern bei der Autorisierung angezeigt." + redirect_uri_html: > + Die erlaubten URLs auf welche autorisierte Benutzer weitergeleitet werden können. Ein Eintrag pro Zeile.
Wenn Sie eine Desktop-Anwendung registrieren, verwenden Sie die folgende URL. + confidential: "Überprüfen Sie, ob die Anwendung verwendet wird, wo das Client-Geheimnis vertraulich gehalten werden kann. Native mobile Apps und Single Page Apps sind nicht vertraulich." + scopes: "Überprüfen Sie die Bereiche, auf die die Anwendung Zugriff gewähren soll. Wenn kein Geltungsbereich ausgewählt ist, wird api_v3 angenommen." + client_credential_user_id: "Optionaler Nutzer, der bei der Nutzung dieser Anwendung verkörpert wird. Leer lassen, um nur öffentlichen Zugriff zu erlauben" + register_intro: "Wenn Sie eine OAuth API-Client-Anwendung für OpenProject entwickeln, können Sie es mit diesem Formular für alle Benutzer registrieren." + default_scopes: "" header: builtin_applications: Eingebaute OAuth-Anwendungen other_applications: Andere OAuth-Anwendungen empty_application_lists: Es wurden noch keine OAuth-Anwendungen registriert. - client_id: Client-ID - client_secret_notice: 'Dies ist das einzige Mal, dass wir das Client-Geheimnis - anzeigen können. Bitte speichern Sie es ab und halten Sie es sicher. Es sollte - als Passwort behandelt werden und kann später nicht mehr von OpenProject abgerufen - werden. - - ' + client_id: "Client-ID" + client_secret_notice: > + Dies ist das einzige Mal, dass wir das Client-Geheimnis anzeigen können. Bitte speichern Sie es ab und halten Sie es sicher. Es sollte als Passwort behandelt werden und kann später nicht mehr von OpenProject abgerufen werden. authorization_dialog: - authorize: Autorisieren - cancel: Autorisierung abbrechen und verweigern. - prompt_html: Zugriff auf den Account %{login} durch %{application_name} - gewähren? - title: Autorisiere %{application_name} - wants_to_access_html: 'Diese Anwendung bittet um Zugriff auf Ihr OpenProject-Konto. -
Es hat folgende Berechtigungen angefordert: - - ' + authorize: "Autorisieren" + cancel: "Autorisierung abbrechen und verweigern." + prompt_html: "Zugriff auf den Account %{login} durch %{application_name} gewähren?" + title: "Autorisiere %{application_name}" + wants_to_access_html: > + Diese Anwendung bittet um Zugriff auf Ihr OpenProject-Konto.
Es hat folgende Berechtigungen angefordert: scopes: - api_v3: Vollständiger API(v3)-Zugriff - api_v3_text: Die Anwendung erhält vollen Lese- und Schreibzugriff auf die OpenProject - API v3, um Aktionen in Ihrem Namen durchzuführen. + api_v3: "Vollständiger API(v3)-Zugriff" + api_v3_text: "Die Anwendung erhält vollen Lese- und Schreibzugriff auf die OpenProject API v3, um Aktionen in Ihrem Namen durchzuführen." grants: - created_date: Genehmigt - scopes: Berechtigungen - successful_application_revocation: Widerrufen von %{application_name} erfolgreich. - none_given: Keine OAuth-Anwendung erhalten Zugriff auf Ihr Benutzerkonto. + created_date: "Genehmigt" + scopes: "Berechtigungen" + successful_application_revocation: "Widerrufen von %{application_name} erfolgreich." + none_given: "Keine OAuth-Anwendung erhalten Zugriff auf Ihr Benutzerkonto." x_active_tokens: - one: ein aktiver Token + one: "ein aktiver Token" other: "%{count} aktive Token" flows: - authorization_code: Autorisierungs-Code Anmeldefluss - client_credentials: Client credentials Anmeldefluss - client_credentials: Benutzer für Client-Credentials Anmeldefluss - client_credentials_impersonation_set_to: Client Credentials User-ID gesetzt auf - client_credentials_impersonation_warning: 'Hinweis: Clients, die den ''Client-Credentials'' - Anmeldefluss in dieser Anwendung verwenden, erhalten die Rechte dieses Benutzers' - client_credentials_impersonation_html: 'Standardmäßig bietet OpenProject OAuth - 2.0 Autorisierung via %{authorization_code_flow_link}. Sie können optional %{client_credentials_flow_link} - aktivieren, aber Sie müssen einen Benutzer angeben, in dessen Namen Anfragen - ausgeführt werden. - - ' - authorization_error: Ein Autorisierungsfehler ist aufgetreten. - revoke_my_application_confirmation: Möchten Sie diese Anwendung wirklich entfernen? - Dies wird %{token_count} aktive Token widerrufen. - my_registered_applications: Registrierte OAuth-Anwendungen + authorization_code: "Autorisierungs-Code Anmeldefluss" + client_credentials: "Client credentials Anmeldefluss" + client_credentials: "Benutzer für Client-Credentials Anmeldefluss" + client_credentials_impersonation_set_to: "Client Credentials User-ID gesetzt auf" + client_credentials_impersonation_warning: "Hinweis: Clients, die den 'Client-Credentials' Anmeldefluss in dieser Anwendung verwenden, erhalten die Rechte dieses Benutzers" + client_credentials_impersonation_html: > + Standardmäßig bietet OpenProject OAuth 2.0 Autorisierung via %{authorization_code_flow_link}. Sie können optional %{client_credentials_flow_link} aktivieren, aber Sie müssen einen Benutzer angeben, in dessen Namen Anfragen ausgeführt werden. + authorization_error: "Ein Autorisierungsfehler ist aufgetreten." + revoke_my_application_confirmation: "Möchten Sie diese Anwendung wirklich entfernen? Dies wird %{token_count} aktive Token widerrufen." + my_registered_applications: "Registrierte OAuth-Anwendungen" oauth_client: urn_connection_status: - connected: Verbindung hergestellt - error: Fehler - failed_authorization: Autorisierung fehlgeschlagen - not_connected: Nicht verbunden + connected: "Verbindung hergestellt" + error: "Fehler" + failed_authorization: "Autorisierung fehlgeschlagen" + not_connected: "Nicht verbunden" labels: - label_oauth_integration: OAuth2 Integration - label_redirect_uri: URI umleiten - label_request_token: Token anfordern - label_refresh_token: Token aktualisieren + label_oauth_integration: "OAuth2 Integration" + label_redirect_uri: "URI umleiten" + label_request_token: "Token anfordern" + label_refresh_token: "Token aktualisieren" errors: - oauth_authorization_code_grant_had_errors: OAuth2 Autorisierung fehlgeschlagen - oauth_reported: OAuth2-Anbieter meldete - oauth_returned_error: OAuth2 hat einen Fehler zurückgemeldet - oauth_returned_json_error: OAuth2 meldet einen JSON-Fehler zurück - oauth_returned_http_error: OAuth2 meldet einen Netzwerkfehler zurück - oauth_returned_standard_error: OAuth2 meldet einen internen Fehler zurück - wrong_token_type_returned: OAuth2 hat einen Fehler zurückgemeldet. Es wurde - der falsche Tokentyp benutzt. Der richtige Tokentyp ist AccessToken::Bearer - oauth_issue_contact_admin: OAuth2 meldet einen Fehler zurück. Bitte kontaktieren - Sie den System-Administrator. - oauth_client_not_found: OAuth2-Client nicht im 'callback' Endpunkt gefunden - (redirect_uri). - refresh_token_called_without_existing_token: 'Interner Fehler: refresh_token - ohne ein zuvor vorhandenes Token aufgerufen. - - ' - refresh_token_updated_failed: Fehler beim Update von OAuthClientToken - oauth_client_not_found_explanation: 'Dieser Fehler tritt auf, nachdem Sie die - client_id und client_secret in OpenProject aktualisiert haben, aber das Feld - ''Return URI'' im OAuth2-Provider nicht aktualisiert haben. - - ' - oauth_code_not_present: OAuth2 'code' nicht im 'callback' Endpunkt gefunden - (redirect_uri). - oauth_code_not_present_explanation: 'Dieser Fehler tritt auf, wenn Sie den falschen - response_type im OAuth2-Provider ausgewählt haben. Response_type sollte ''code'' - oder ähnlich sein. - - ' - oauth_state_not_present: OAuth2 'state' nicht im 'callback' Endpunkt gefunden - (redirect_uri). - oauth_state_not_present_explanation: 'Der ''state'' wird verwendet, um OpenProject - anzuzeigen, wo nach einer erfolgreichen OAuth2-Autorisierung fortgesetzt werden - soll. Ein fehlender ''state'' ist ein interner Fehler, der während der Einrichtung - auftreten kann. Bitte kontaktieren Sie Ihren Systemadministrator. - - ' + oauth_authorization_code_grant_had_errors: "OAuth2 Autorisierung fehlgeschlagen" + oauth_reported: "OAuth2-Anbieter meldete" + oauth_returned_error: "OAuth2 hat einen Fehler zurückgemeldet" + oauth_returned_json_error: "OAuth2 meldet einen JSON-Fehler zurück" + oauth_returned_http_error: "OAuth2 meldet einen Netzwerkfehler zurück" + oauth_returned_standard_error: "OAuth2 meldet einen internen Fehler zurück" + wrong_token_type_returned: "OAuth2 hat einen Fehler zurückgemeldet. Es wurde der falsche Tokentyp benutzt. Der richtige Tokentyp ist AccessToken::Bearer" + oauth_issue_contact_admin: "OAuth2 meldet einen Fehler zurück. Bitte kontaktieren Sie den System-Administrator." + oauth_client_not_found: "OAuth2-Client nicht im 'callback' Endpunkt gefunden (redirect_uri)." + refresh_token_called_without_existing_token: > + Interner Fehler: refresh_token ohne ein zuvor vorhandenes Token aufgerufen. + refresh_token_updated_failed: "Fehler beim Update von OAuthClientToken" + oauth_client_not_found_explanation: > + Dieser Fehler tritt auf, nachdem Sie die client_id und client_secret in OpenProject aktualisiert haben, aber das Feld 'Return URI' im OAuth2-Provider nicht aktualisiert haben. + oauth_code_not_present: "OAuth2 'code' nicht im 'callback' Endpunkt gefunden (redirect_uri)." + oauth_code_not_present_explanation: > + Dieser Fehler tritt auf, wenn Sie den falschen response_type im OAuth2-Provider ausgewählt haben. Response_type sollte 'code' oder ähnlich sein. + oauth_state_not_present: "OAuth2 'state' nicht im 'callback' Endpunkt gefunden (redirect_uri)." + oauth_state_not_present_explanation: > + Der 'state' wird verwendet, um OpenProject anzuzeigen, wo nach einer erfolgreichen OAuth2-Autorisierung fortgesetzt werden soll. Ein fehlender 'state' ist ein interner Fehler, der während der Einrichtung auftreten kann. Bitte kontaktieren Sie Ihren Systemadministrator. rack_oauth2: - client_secret_invalid: Client Geheimcode ist ungültig (client_secret_invalid) - invalid_request: 'Der OAuth2 Authorization Server hat mit ''invalid_request'' - geantwortet. Dieser Fehler tritt auf, wenn Sie mehrmals versuchen zu autorisieren - oder technische Probleme auftreten. - - ' - invalid_response: OAuth2 Authorization Server hat eine ungültige Antwort gegeben - (invalid_response) - invalid_grant: Der OAuth2 Authorization Server bittet Sie um Reautorisierung - (invalid_grant). - invalid_client: Der OAuth2 Authorization Server erkennt OpenProject nicht - (invalid_client). - unauthorized_client: Der OAuth2 Authorization Server lehnt den Grant-Typ (unauthorized_client) - ab - unsupported_grant_type: Der OAuth2 Authorization Server bittet Sie um Reautorisierung - (unsupported_grant_type). - invalid_scope: Sie sind nicht berechtigt, auf die angeforderte Ressource zuzugreifen - (invalid_scope). + client_secret_invalid: "Client Geheimcode ist ungültig (client_secret_invalid)" + invalid_request: > + Der OAuth2 Authorization Server hat mit 'invalid_request' geantwortet. Dieser Fehler tritt auf, wenn Sie mehrmals versuchen zu autorisieren oder technische Probleme auftreten. + invalid_response: "OAuth2 Authorization Server hat eine ungültige Antwort gegeben (invalid_response)" + invalid_grant: "Der OAuth2 Authorization Server bittet Sie um Reautorisierung (invalid_grant)." + invalid_client: "Der OAuth2 Authorization Server erkennt OpenProject nicht (invalid_client)." + unauthorized_client: "Der OAuth2 Authorization Server lehnt den Grant-Typ (unauthorized_client) ab" + unsupported_grant_type: "Der OAuth2 Authorization Server bittet Sie um Reautorisierung (unsupported_grant_type)." + invalid_scope: "Sie sind nicht berechtigt, auf die angeforderte Ressource zuzugreifen (invalid_scope)." http: request: - failed_authorization: Die serverseitige Anfrage konnte sich nicht autorisieren. - missing_authorization: Die serverseitige Anfrage ist aufgrund fehlender Berechtigungsinformationen - fehlgeschlagen. + failed_authorization: "Die serverseitige Anfrage konnte sich nicht autorisieren." + missing_authorization: "Die serverseitige Anfrage ist aufgrund fehlender Berechtigungsinformationen fehlgeschlagen." response: - unexpected: Unerwartete Antwort erhalten. + unexpected: "Unerwartete Antwort erhalten." you: Sie link: Link plugin_openproject_auth_plugins: - name: OpenProject Auth Plugins - description: Integration von externen Authentifizierungsanbietern in OpenProject. + name: "OpenProject Auth Plugins" + description: "Integration von externen Authentifizierungsanbietern in OpenProject." plugin_openproject_auth_saml: - name: OmniAuth SAML / Single-Sign An - description: Fügt den OmniAuth SAML-Anbieter zu OpenProject hinzu + name: "OmniAuth SAML / Single-Sign An" + description: "Fügt den OmniAuth SAML-Anbieter zu OpenProject hinzu" enterprise_plans: - legacy_enterprise: Enterprise Plan + legacy_enterprise: "Enterprise Plan" token: hashed_token: display_value_placeholder: "***" external_link_warning: - title: OpenProject verlassen - warning_message: Sie sind im Begriff, die OpenProject Anwendung zu verlassen und - eine externe Website zu besuchen. Bitte beachten Sie, dass die externen Websites - nicht unter unserer Kontrolle stehen und möglicherweise andere Datenschutz- - und Sicherheitsrichtlinien haben. - continue_message: Sind Sie sicher, dass Sie zu dem folgenden externen Link fortfahren - möchten? - continue_button: Zur externen Webseite fortfahren + title: "OpenProject verlassen" + warning_message: "Sie sind im Begriff, die OpenProject Anwendung zu verlassen und eine externe Website zu besuchen. Bitte beachten Sie, dass die externen Websites nicht unter unserer Kontrolle stehen und möglicherweise andere Datenschutz- und Sicherheitsrichtlinien haben." + continue_message: "Sind Sie sicher, dass Sie zu dem folgenden externen Link fortfahren möchten?" + continue_button: "Zur externen Webseite fortfahren" diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index a3137204a83..ae83f28b539 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -1,508 +1,426 @@ ---- +#-- 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. +#++ es: no_results_title_text: No hay nada que mostrar. activities: index: - no_results_title_text: No se ha producido ninguna actividad en el proyecto en - este período de tiempo. + no_results_title_text: No se ha producido ninguna actividad en el proyecto en este período de tiempo. work_packages: activity_tab: no_results_title_text: No hay actividad que mostrar - no_results_description_text: Elija «Mostrar todo» para mostrar toda la actividad - y los comentarios - label_activity_show_all: Mostrar todo - label_activity_show_only_comments: Mostrar solo los comentarios - label_activity_show_only_changes: Mostrar solo los cambios - label_sort_asc: Lo más reciente en la parte inferior - label_sort_desc: Lo más reciente en la parte superior - label_type_to_comment: Añada un comentario. Escriba @ para notificar a personas. - label_submit_comment: Enviar comentario - label_who: "¿Quién?" - changed_on: cambiado el - created_on: creó esto el - changed: cambiado - created: creado - commented: comentado + no_results_description_text: 'Elija «Mostrar todo» para mostrar toda la actividad y los comentarios' + label_activity_show_all: "Mostrar todo" + label_activity_show_only_comments: "Mostrar solo los comentarios" + label_activity_show_only_changes: "Mostrar solo los cambios" + label_sort_asc: "Lo más reciente en la parte inferior" + label_sort_desc: "Lo más reciente en la parte superior" + label_type_to_comment: "Añada un comentario. Escriba @ para notificar a personas." + label_submit_comment: "Enviar comentario" + label_who: '¿Quién?' + changed_on: "cambiado el" + created_on: "creó esto el" + changed: "cambiado" + created: "creado" + commented: "comentado" internal_comment: Comentario interno - internal_journal: Los comentarios internos son visibles para un grupo limitado - de miembros. - unsaved_changes_confirmation_message: Tiene cambios sin guardar. ¿Seguro que - desea cerrar el editor? + internal_journal: Los comentarios internos son visibles para un grupo limitado de miembros. + unsaved_changes_confirmation_message: Tiene cambios sin guardar. ¿Seguro que desea cerrar el editor? internal_comment_confirmation: title: "¿Hacer público este comentario?" heading: "¿Hacer público este comentario?" - description: Su comentario será visible para cualquier persona que pueda - acceder a este paquete de trabajo. ¿Seguro que desea hacerlo? - confirm_button_text: Hacer pública + description: "Su comentario será visible para cualquier persona que pueda acceder a este paquete de trabajo. ¿Seguro que desea hacerlo?" + confirm_button_text: "Hacer pública" admin: plugins: no_results_title_text: Actualmente no hay ningún plugin instalado. - no_results_content_text: Consulte nuestra página de integraciones y plugins - para obtener más información. + no_results_content_text: Consulte nuestra página de integraciones y plugins para obtener más información. custom_styles: - color_theme: Tema de color + color_theme: "Tema de color" color_theme_custom: "(Personalizado)" - tab_interface: Interfaz - tab_branding: Personalización de marca - tab_pdf_export_styles: Estilos de exportación PDF - tab_pdf_export_font: Fuente de exportación PDF + tab_interface: "Interfaz" + tab_branding: "Personalización de marca" + tab_pdf_export_styles: "Estilos de exportación PDF" + tab_pdf_export_font: "Fuente de exportación PDF" fonts: - file_too_large: es demasiado grande (el tamaño máximo es de %{count} MB). - file_is_invalid: no es un archivo de fuente TTF válido. + file_too_large: "es demasiado grande (el tamaño máximo es de %{count} MB)." + file_is_invalid: "no es un archivo de fuente TTF válido." colors: - primary-button-color: Botón primario - accent-color: Acento - header-bg-color: Fondo de encabezado - main-menu-bg-color: Fondo del menú principal - main-menu-bg-selected-background: Menú principal seleccionado - custom_colors: Colores personalizados - manage_colors: Editar opciones de selección de colores + primary-button-color: "Botón primario" + accent-color: "Acento" + header-bg-color: "Fondo de encabezado" + main-menu-bg-color: "Fondo del menú principal" + main-menu-bg-selected-background: "Menú principal seleccionado" + custom_colors: "Colores personalizados" + manage_colors: "Editar opciones de selección de colores" instructions: - primary-button-color: Color de acento fuerte, utilizado para el botón más - importante de una pantalla. - accent-color: Color para los enlaces y otros elementos resaltados decentemente. - main-menu-bg-color: Color de fondo del menú lateral izquierdo. - theme_warning: Al cambiar el tema, se sobrescribirá su estilo personalizado - y, como consecuencia, se perderá el diseño. ¿Seguro que quiere continuar? + primary-button-color: "Color de acento fuerte, utilizado para el botón más importante de una pantalla." + accent-color: "Color para los enlaces y otros elementos resaltados decentemente." + main-menu-bg-color: "Color de fondo del menú lateral izquierdo." + theme_warning: Al cambiar el tema, se sobrescribirá su estilo personalizado y, como consecuencia, se perderá el diseño. ¿Seguro que quiere continuar? enterprise: delete_dialog: - title: Eliminar token de Enterprise + title: "Eliminar token de Enterprise" heading: "¿Eliminar este token de Enterprise?" - confirmation: "¿Seguro que desea eliminar este token de soporte de la edición - Enterprise?" + confirmation: "¿Seguro que desea eliminar este token de soporte de la edición Enterprise?" create_dialog: - title: Añadir token de Enterprise - type_token_text: El texto de su Enterprise token - token_placeholder: Pegue su token de soporte de la edición Enterprise aquí - token_caption: Para obtener más información sobre cómo activar la edición - Enterprise, consulte nuestra [documentación](docs_url). - add_token: Cargue el token de soporte de Enterprise - replace_token: Reemplace su token de soporte actual - order: Solicitar Enterprise On-Premises - paste: Pegue su token de soporte de Enterprise - required_for_feature: Esta extensión solo está disponible con un token de soporte - activo de Enterprise. - enterprise_link: Para obtener más información, haga clic aquí. - start_trial: Iniciar prueba gratuita - book_now: Reservar ahora - get_quote: Solicitar presupuesto + title: "Añadir token de Enterprise" + type_token_text: "El texto de su Enterprise token" + token_placeholder: "Pegue su token de soporte de la edición Enterprise aquí" + token_caption: "Para obtener más información sobre cómo activar la edición Enterprise, consulte nuestra [documentación](docs_url)." + add_token: "Cargue el token de soporte de Enterprise" + replace_token: "Reemplace su token de soporte actual" + order: "Solicitar Enterprise On-Premises" + paste: "Pegue su token de soporte de Enterprise" + required_for_feature: "Esta extensión solo está disponible con un token de soporte activo de Enterprise." + enterprise_link: "Para obtener más información, haga clic aquí." + start_trial: "Iniciar prueba gratuita" + book_now: "Reservar ahora" + get_quote: "Solicitar presupuesto" buttons: - upgrade: Actualizar ahora - contact: Contáctenos para una demostración + upgrade: "Actualizar ahora" + contact: "Contáctenos para una demostración" status: - expired: Caducado - expiring_soon: Caduca pronto - in_grace_period: En periodo de gracia - invalid_domain: Dominio no válido - not_active: No activo - trial: Prueba + expired: "Caducado" + expiring_soon: "Caduca pronto" + in_grace_period: "En periodo de gracia" + invalid_domain: "Dominio no válido" + not_active: "No activo" + trial: "Prueba" jemalloc_allocator: Asignador de memoria Jemalloc journal_aggregation: explanation: - text: Las acciones individuales de un usuario (como actualizar dos veces un - paquete de trabajo) se combinan en una sola acción si la diferencia de antigüedad - es inferior al intervalo de tiempo especificado. Se mostrarán como una sola - acción en la aplicación. También se retrasarán las notificaciones por la - misma cantidad de tiempo, lo que reducirá el número de correos electrónicos - enviados y causará también que se retrase el %{webhook_link}. - link: webhook + text: "Las acciones individuales de un usuario (como actualizar dos veces un paquete de trabajo) se combinan en una sola acción si la diferencia de antigüedad es inferior al intervalo de tiempo especificado. Se mostrarán como una sola acción en la aplicación. También se retrasarán las notificaciones por la misma cantidad de tiempo, lo que reducirá el número de correos electrónicos enviados y causará también que se retrase el %{webhook_link}." + link: "webhook" import: - title: Importar + title: "Importar" jira: - title: Importación desde Jira - description: Utilice esta herramienta para importar datos desde su instancia - de Jira. Puede configurar varios hosts de Jira y elegir qué importar en cada - ejecución de importación. + title: "Importación desde Jira" + description: "Utilice esta herramienta para importar datos desde su instancia de Jira. Puede configurar varios hosts de Jira y elegir qué importar en cada ejecución de importación." errors: - cannot_delete_with_imports: No se puede eliminar el host de Jira con importaciones - existentes + cannot_delete_with_imports: "No se puede eliminar el host de Jira con importaciones existentes" blank: - title: Aún no se han configurado los hosts de Jira - description: Configure un host de Jira para comenzar a importar elementos - desde Jira a esta instancia de OpenProject. + title: "Aún no se han configurado los hosts de Jira" + description: "Configure un host de Jira para comenzar a importar elementos desde Jira a esta instancia de OpenProject." configuration: - title: Configuración de Jira - new: Nueva configuración + title: "Configuración de Jira" + new: "Nueva configuración" banner: - title: Importación limitada - description: 'Esta herramienta de importación se encuentra actualmente en - fase beta y solo puede importar datos básicos: proyectos, incidencias (nombre, - título, descripción, archivos adjuntos), usuarios (nombre, correo electrónico, - pertenencia a proyectos), estados y tipos. No puede importar flujos de trabajo, - campos personalizados, relaciones entre incidencias ni permisos. Actualmente - solo es compatible con las versiones 10.x y 11.x de Jira Server/Data Center. - Por el momento, no es compatible con instancias en la nube.' + title: "Importación limitada" + description: "Esta herramienta de importación se encuentra actualmente en fase beta y solo puede importar datos básicos: proyectos, incidencias (nombre, título, descripción, archivos adjuntos), usuarios (nombre, correo electrónico, pertenencia a proyectos), estados y tipos. No puede importar flujos de trabajo, campos personalizados, relaciones entre incidencias ni permisos. Actualmente solo es compatible con las versiones 10.x y 11.x de Jira Server/Data Center. Por el momento, no es compatible con instancias en la nube." form: fields: - name: Nombre - url: URL del servidor/Jira Data Center - personal_access_token: Token de acceso personal - button_add: Agregar configuración - button_save: Guardar configuración - button_test: Probar configuración - button_delete_token: Eliminar token - delete_token_confirm: "¿Seguro que desea eliminar el token? Esto desactivará - la conexión a Jira." - label_testing: Probando la configuración... - token_deleted: Token eliminado correctamente. + name: "Nombre" + url: "URL del servidor/Jira Data Center" + personal_access_token: "Token de acceso personal" + button_add: "Agregar configuración" + button_save: "Guardar configuración" + button_test: "Probar configuración" + button_delete_token: "Eliminar token" + delete_token_confirm: "¿Seguro que desea eliminar el token? Esto desactivará la conexión a Jira." + label_testing: "Probando la configuración..." + token_deleted: "Token eliminado correctamente." test: - success: Se ha conectado con éxito a %{server} (versión %{version}) - failed: 'Error de conexión: no se ha podido recuperar la información del servidor' - error: Se ha producido un error inesperado al probar la conexión - connection_error: 'Error de conexión: %{message}' - parse_error: Error al analizar la respuesta del servidor. Puede que el servidor - no sea una instancia válida de Jira. - api_error: La API de Jira ha devuelto el estado de error %{status}. Compruebe - la URL de su instancia de Jira y el token de la API. - token_error: Token API no válido. Compruebe sus credenciales en la configuración. - missing_credentials: Proporcione la URL y el token de acceso personal para - probar la conexión - invalid_url: Proporcione una URL válida + success: "Se ha conectado con éxito a %{server} (versión %{version})" + failed: "Error de conexión: no se ha podido recuperar la información del servidor" + error: "Se ha producido un error inesperado al probar la conexión" + connection_error: "Error de conexión: %{message}" + parse_error: "Error al analizar la respuesta del servidor. Puede que el servidor no sea una instancia válida de Jira." + api_error: "La API de Jira ha devuelto el estado de error %{status}. Compruebe la URL de su instancia de Jira y el token de la API." + token_error: "Token API no válido. Compruebe sus credenciales en la configuración." + missing_credentials: "Proporcione la URL y el token de acceso personal para probar la conexión" + invalid_url: "Proporcione una URL válida" client: - connection_error: 'No se pudo conectar al servidor de Jira: %{message}' - connection_timeout: 'La conexión con el servidor de Jira ha expirado: %{message}' - parse_error: 'Error al analizar la respuesta de la API de Jira: %{message}' - api_error: La API de Jira ha devuelto el estado de error %{status} + connection_error: "No se pudo conectar al servidor de Jira: %{message}" + connection_timeout: "La conexión con el servidor de Jira ha expirado: %{message}" + parse_error: "Error al analizar la respuesta de la API de Jira: %{message}" + api_error: "La API de Jira ha devuelto el estado de error %{status}" columns: - projects: Proyectos - last_change: Última modificación - added: Añadido - label_ago: Hace %{amount} + projects: "Proyectos" + last_change: "Última modificación" + added: "Añadido" + label_ago: "Hace %{amount}" run: - title: Importar ejecución - history: Historial - remove_error: No se puede eliminar una importación de Jira mientras se está - ejecutando - import_blocked_error: Actualmente hay otra importación de Jira en curso o - pendiente de revisión. Complétela o revierta antes de iniciar una nueva - importación. + title: "Importar ejecución" + history: "Historial" + remove_error: "No se puede eliminar una importación de Jira mientras se está ejecutando" + import_blocked_error: "Actualmente hay otra importación de Jira en curso o pendiente de revisión. Complétela o revierta antes de iniciar una nueva importación." blank: - title: Aún no se han configurado ejecuciones de importación - description: Cree una ejecución de importación para comenzar a importar - información de esta instancia de Jira + title: "Aún no se han configurado ejecuciones de importación" + description: "Cree una ejecución de importación para comenzar a importar información de esta instancia de Jira" index: - description: Puede importar diferentes conjuntos de datos con cada ejecución - de importación. Se puede deshacer una ejecución de importación inmediatamente - después en el modo de revisión, pero no después de finalizarla. - button_import_run: Importar ejecución - button_edit_configuration: Editar configuración + description: "Puede importar diferentes conjuntos de datos con cada ejecución de importación. Se puede deshacer una ejecución de importación inmediatamente después en el modo de revisión, pero no después de finalizarla." + button_import_run: "Importar ejecución" + button_edit_configuration: "Editar configuración" status: - initial: Inicio - instance_meta_fetching: Obteniendo metadatos - instance_meta_error: Error al obtener metadatos - instance_meta_done: Metadatos obtenidos - configuring: Seleccionar ámbito - projects_meta_fetching: Obteniendo datos del proyecto - projects_meta_error: Error al obtener los datos del proyecto - projects_meta_done: Información recopilada - importing: En curso - import_error: Error durante la importación - imported: Modo de revisión - reverting: Revirtiendo - revert_error: Error durante la reversión - reverted: Revertido - completed: Completado + initial: "Inicio" + instance_meta_fetching: "Obteniendo metadatos" + instance_meta_error: "Error al obtener metadatos" + instance_meta_done: "Metadatos obtenidos" + configuring: "Seleccionar ámbito" + projects_meta_fetching: "Obteniendo datos del proyecto" + projects_meta_error: "Error al obtener los datos del proyecto" + projects_meta_done: "Información recopilada" + importing: "En curso" + import_error: "Error durante la importación" + imported: "Modo de revisión" + reverting: "Revirtiendo" + revert_error: "Error durante la reversión" + reverted: "Revertido" + completed: "Completado" wizard: - button_retry: Reintentar + button_retry: "Reintentar" parts: projects: - one: 1 proyecto + one: "1 proyecto" other: "%{count} projectos" issues: - one: 1 incidencia + one: "1 incidencia" other: "%{count} incidencias" work_packages: - one: 1 paquete de trabajo + one: "1 paquete de trabajo" other: "%{count} paquetes de trabajo" types: - one: 1 tipo + one: "1 tipo" other: "%{count} tipos" statuses: - one: 1 estado + one: "1 estado" other: "%{count} estados" users: - one: 1 usuario + one: "1 usuario" other: "%{count} usuarios" groups: fetch: - title: Obtener datos base + title: "Obtener datos base" groups_and_users: - title: Grupos y usuarios + title: "Grupos y usuarios" configuration: - title: Configurar importación + title: "Configurar importación" confirming: - title: Confirmar e importar + title: "Confirmar e importar" review: - title: Revisar importación + title: "Revisar importación" sections: fetch_data: - title: Obtener metadatos de instancia - caption_done: Completado - description: Compruebe qué datos están disponibles para importar en - la instancia de Jira host. - button_fetch: Compruebe los datos disponibles - label_progress: Obteniendo datos de Jira... + title: "Obtener metadatos de instancia" + caption_done: "Completado" + description: "Compruebe qué datos están disponibles para importar en la instancia de Jira host." + button_fetch: "Compruebe los datos disponibles" + label_progress: "Obteniendo datos de Jira..." groups_and_users: - title: Grupos y usuarios + title: "Grupos y usuarios" import_scope: - title: Ámbito de importación - caption: Elija lo que desea importar en OpenProject - caption_done: Completado - label_info: Tenga en cuenta que esta herramienta de importación se encuentra - en fase beta y no puede importar todos los tipos de datos. A continuación - se ofrece un resumen de lo que la URL de la instancia de host de Jira - ofrece para importar y lo que esta herramienta puede importar en este - momento. - description: Seleccione los datos que desea importar de entre los datos - disponibles obtenidos de la instancia de host de Jira. - label_available_data: Datos disponibles - label_not_available_data: No disponible para la importación - button_select_projects: Seleccionar proyectos para importar - button_continue: Continuar - label_import: Seleccione los proyectos que desea importar. - button_select: Seleccionar proyectos - label_selected_data: Datos seleccionados para la importación - label_progress: Obteniendo datos de Jira... + title: "Ámbito de importación" + caption: "Elija lo que desea importar en OpenProject" + caption_done: "Completado" + label_info: "Tenga en cuenta que esta herramienta de importación se encuentra en fase beta y no puede importar todos los tipos de datos. A continuación se ofrece un resumen de lo que la instancia de host de Jira ofrece para importar y lo que esta herramienta puede importar en este momento." + description: "Seleccione los datos que desea importar de entre los datos disponibles obtenidos de la instancia de host de Jira." + label_available_data: "Datos disponibles" + label_not_available_data: "No disponible para la importación" + button_select_projects: "Seleccionar proyectos para importar" + button_continue: "Continuar" + label_import: "Seleccione los proyectos que desea importar." + button_select: "Seleccionar proyectos" + label_selected_data: "Datos seleccionados para la importación" + label_progress: "Obteniendo datos de Jira..." elements: - relations: Relaciones entre incidencias - workflows: Flujos de trabajo a nivel de proyecto - users: Usuarios - sprints: Sprints - schemes: Esquemas - permissions: Permisos de usuario, grupo y proyecto + relations: "Relaciones entre incidencias" + workflows: "Flujos de trabajo a nivel de proyecto" + users: "Usuarios" + sprints: "Sprints" + schemes: "Esquemas" + permissions: "Permisos de usuario, grupo y proyecto" confirm_import: - title: Importar datos - caption: Revise la configuración de importación y comience la importación - caption_done: Completado - label_available_data: Datos disponibles para importar - button_start: Iniciar importación - description: Está a punto de iniciar una importación con la siguiente - configuración. - label_progress: Importando... - label_import_data: Importando + title: "Importar datos" + caption: "Revise la configuración de importación y comience la importación" + caption_done: "Completado" + label_available_data: "Datos disponibles para importar" + button_start: "Iniciar importación" + description: "Está a punto de iniciar una importación con la siguiente configuración." + label_progress: "Importando..." + label_import_data: "Importando" import_result: - title: Importar resultados de ejecución - caption: Revise o revierta la importación - info: Importación ejecutada con éxito. - label_results: Importado - label_revert: Revertir importación - button_revert: Revertir importación - button_done: Finalizar importación - preview_description: Los datos importados se encuentran actualmente - en modo de revisión. Haga clic en «Finalizar importación» para que - la importación sea permanente o en «Revertir importación» para deshacer - todos los cambios realizados en esta importación. - label_finalizing_progress: Finalizando importación... - label_finalized: Importación finalizada. - label_revert_progress: Revirtiendo importación... - label_reverted: Importación revertida. + title: "Importar resultados de ejecución" + caption: "Revise o revierta la importación" + info: "Importación ejecutada con éxito." + label_results: "Importado" + label_revert: "Revertir importación" + button_revert: "Revertir importación" + button_done: "Finalizar importación" + preview_description: 'Los datos importados se encuentran actualmente en modo de revisión. Haga clic en «Finalizar importación» para que la importación sea permanente o en «Revertir importación» para deshacer todos los cambios realizados en esta importación.' + label_finalizing_progress: "Finalizando importación..." + label_finalized: "Importación finalizada." + label_revert_progress: "Revirtiendo importación..." + label_reverted: "Importación revertida." select_dialog: - filter_projects: Filtrar por texto + filter_projects: "Filtrar por texto" + import_dialog: + title: "¿Iniciar esta importación?" + confirm_button: "Iniciar importación" + description: > + Este importador es una función alfa. Todavía no es capaz de importar todos los datos de Jira y puede dejar datos incompletos en esta instancia de OpenProject. No utilice un entorno de producción y cree una copia de seguridad de sus datos de OpenProject antes de comenzar. + confirm: "Comprendo y he hecho los preparativos necesarios" revert_dialog: title: "¿Revertir esta importación de forma permanente?" - description: Esto eliminará todos los objetos importados (incluidos proyectos - completos) incluso si hubo actividad de usuario en esos proyectos después - de la importación en OpenProject. - confirm: Entiendo que esta reversión eliminará los datos de forma permanente + description: "Esto eliminará todos los objetos importados (incluidos proyectos completos) incluso si hubo actividad de usuario en esos proyectos después de la importación en OpenProject." + confirm: "Entiendo que esta reversión eliminará los datos de forma permanente" finalize_dialog: title: "¿Finalizar esta importación?" - description: Una vez finalizada, esta importación ya no se podrá revertir. - Todos los datos importados se importarán de forma permanente. - confirm: Entiendo que esta acción no se puede deshacer - confirm_button: Entendido + description: "Una vez finalizada, esta importación ya no se podrá revertir. Todos los datos importados se importarán de forma permanente." + confirm: "Entiendo que esta acción no se puede deshacer" + confirm_button: "Entendido" select_projects: - title: Seleccione los proyectos - import_dialog: - title: Start this import? - confirm_button: Start import - description: 'This importer is an alpha feature. It is not yet able to - import all data from Jira and might leave incomplete data on this OpenProject - instance. Do not use a production environment and create a backup - of your OpenProject data before starting. - - ' - confirm: I understand and made the necessary preparations + title: "Seleccione los proyectos" mcp_configurations: index: - description: El protocolo de contexto de modelo (MCP, por sus siglas en inglés) - permite a los agentes de IA proporcionar a sus usuarios herramientas y recursos - expuestos por esta instancia de OpenProject. Esta función aún se encuentra - en fase beta. - resources_heading: Recursos - resources_description: OpenProject implementa los siguientes recursos. Cada - uno de ellos puede habilitarse, renombrarse y describirse como usted desee. - Para más información, consulte la [documentación sobre recursos del MCP](docs_url). - resources_submit: Actualizar recursos - tools_heading: Herramientas - tools_description: OpenProject implementa las siguientes herramientas. Cada - una de ellas puede habilitarse, renombrarse y describirse como usted desee. - Para más información, consulte la [documentación sobre herramientas del - MCP](docs_url). - tools_submit: Actualizar herramientas + description: "El protocolo de contexto de modelo (MCP, por sus siglas en inglés) permite a los agentes de IA proporcionar a sus usuarios herramientas y recursos expuestos por esta instancia de OpenProject. Esta función aún se encuentra en fase beta." + resources_heading: "Recursos" + resources_description: "OpenProject implementa los siguientes recursos. Cada uno de ellos puede habilitarse, renombrarse y describirse como usted desee. Para más información, consulte la [documentación sobre recursos del MCP](docs_url)." + resources_submit: "Actualizar recursos" + tools_heading: "Herramientas" + tools_description: "OpenProject implementa las siguientes herramientas. Cada una de ellas puede habilitarse, renombrarse y describirse como usted desee. Para más información, consulte la [documentación sobre herramientas del MCP](docs_url)." + tools_submit: "Actualizar herramientas" multi_update: - success: Las configuraciones del MCP se actualizaron correctamente. + success: "Las configuraciones del MCP se actualizaron correctamente." server_form: - description_caption: Cómo se describirá el servidor del MCP a otras aplicaciones - que se conecten a él. - title_caption: Un título corto que se muestra a las aplicaciones que se conectan - al servidor del MCP. - tool_response_format: Formato de respuesta de la herramienta - tool_response_format_content_only_label: Solo contenido - tool_response_format_content_only_caption: 'Seleccione esta opción si los - clientes de MCP que se conectan a esta instancia no admiten contenido estructurado. - Las respuestas de la herramienta solo contendrán contenido de texto sin - formato y omitirán la versión estructurada. - - ' - tool_response_format_full_label: Completo - tool_response_format_full_caption: 'La opción más compatible. Las respuestas - de la herramienta incluirán tanto contenido regular como estructurado, lo - que permitirá a los clientes de MCP elegir el formato que desean leer. Esto - puede aumentar el número de tokens que el modelo de lenguaje tiene que procesar, - lo que podría incrementar el coste y reducir el rendimiento. - - ' - tool_response_format_structured_only_label: Solo contenido estructurado - tool_response_format_structured_only_caption: 'Seleccione esta opción si sabe - con certeza que los clientes MCP que se conectan a esta instancia admiten - contenido estructurado. Las respuestas de la herramienta solo incluirán - contenido estructurado y omitirán su representación textual. - - ' + description_caption: "Cómo se describirá el servidor del MCP a otras aplicaciones que se conecten a él." + title_caption: "Un título corto que se muestra a las aplicaciones que se conectan al servidor del MCP." + tool_response_format: "Formato de respuesta de la herramienta" + tool_response_format_content_only_label: "Solo contenido" + tool_response_format_content_only_caption: > + Seleccione esta opción si los clientes de MCP que se conectan a esta instancia no admiten contenido estructurado. Las respuestas de la herramienta solo contendrán contenido de texto sin formato y omitirán la versión estructurada. + tool_response_format_full_label: "Completo" + tool_response_format_full_caption: > + La opción más compatible. Las respuestas de la herramienta incluirán tanto contenido regular como estructurado, lo que permitirá a los clientes de MCP elegir el formato que desean leer. Esto puede aumentar el número de tokens que el modelo de lenguaje tiene que procesar, lo que podría incrementar el coste y reducir el rendimiento. + tool_response_format_structured_only_label: "Solo contenido estructurado" + tool_response_format_structured_only_caption: > + Seleccione esta opción si sabe con certeza que los clientes MCP que se conectan a esta instancia admiten contenido estructurado. Las respuestas de la herramienta solo incluirán contenido estructurado y omitirán su representación textual. update: - failure: No se ha podido actualizar la configuración del MCP. - success: La configuración del MCP se ha actualizado correctamente. + failure: "No se ha podido actualizar la configuración del MCP." + success: "La configuración del MCP se ha actualizado correctamente." scim_clients: authentication_methods: - sso: JWT del proveedor de identidad - oauth2_client: Credenciales de cliente OAuth 2.0 - oauth2_token: Token de acceso estático + sso: "JWT del proveedor de identidad" + oauth2_client: "Credenciales de cliente OAuth 2.0" + oauth2_token: "Token de acceso estático" created_client_credentials_dialog_component: - title: Credenciales del cliente creadas - heading: Se han generado las credenciales del cliente - one_time_hint: Esta es la única vez que verá el secreto del cliente. Asegúrese - de copiarlo ahora. + title: "Credenciales del cliente creadas" + heading: "Se han generado las credenciales del cliente" + one_time_hint: "Esta es la única vez que verá el secreto del cliente. Asegúrese de copiarlo ahora." created_token_dialog_component: - title: Token creado - heading: Se ha generado un token - label_token: Token - one_time_hint: Esta es la única vez que verá este token. Asegúrese de copiarlo - ahora. + title: "Token creado" + heading: "Se ha generado un token" + label_token: "Token" + one_time_hint: "Esta es la única vez que verá este token. Asegúrese de copiarlo ahora." delete_scim_client_dialog_component: - title: Eliminar cliente SCIM + title: "Eliminar cliente SCIM" heading: "¿Seguro que desea eliminar este cliente SCIM?" - description: Los usuarios gestionados por este cliente SCIM ya no pueden ser - actualizados por él. + description: "Los usuarios gestionados por este cliente SCIM ya no pueden ser actualizados por él." edit: - label_delete_scim_client: Eliminar cliente SCIM + label_delete_scim_client: "Eliminar cliente SCIM" form: - auth_provider_description: Este es el servicio que los usuarios añadidos por - el proveedor SCIM utilizarán para autenticarse en OpenProject. - authentication_method_description_html: Así es como el cliente SCIM se autentica - en OpenProject. Asegúrese de que los tokens OAuth incluyen el ámbito scim_v2. - description: Consulte nuestra [documentación sobre la configuración de clientes - SCIM](docs_url) para obtener más información sobre estas opciones de configuración. - jwt_sub_description: Por ejemplo, para Keycloak, se trata del UUID de la cuenta - de servicio asociada al cliente SCIM. Consulte [nuestra documentación](docs_url) - para saber cómo encontrar la reclamación del asunto para su caso de uso. - name_description: Elija un nombre que ayude a otros administradores a entender - mejor por qué se configuró este cliente. + auth_provider_description: "Este es el servicio que los usuarios añadidos por el proveedor SCIM utilizarán para autenticarse en OpenProject." + authentication_method_description_html: "Así es como el cliente SCIM se autentica en OpenProject. Asegúrese de que los tokens OAuth incluyen el ámbito scim_v2." + description: "Consulte nuestra [documentación sobre la configuración de clientes SCIM](docs_url) para obtener más información sobre estas opciones de configuración." + jwt_sub_description: "Por ejemplo, para Keycloak, se trata del UUID de la cuenta de servicio asociada al cliente SCIM. Consulte [nuestra documentación](docs_url) para saber cómo encontrar la reclamación del asunto para su caso de uso." + name_description: "Elija un nombre que ayude a otros administradores a entender mejor por qué se configuró este cliente." index: - description: Los clientes SCIM configurados aquí pueden interactuar con la - API del servidor SCIM de OpenProject para aprovisionar, actualizar y desaprovisionar - cuentas y grupos de usuarios. - label_create_button: Añadir cliente SCIM + description: "Los clientes SCIM configurados aquí pueden interactuar con la API del servidor SCIM de OpenProject para aprovisionar, actualizar y desaprovisionar cuentas y grupos de usuarios." + label_create_button: "Añadir cliente SCIM" new: - title: Nuevo cliente SCIM + title: "Nuevo cliente SCIM" revoke_static_token_dialog_component: - confirm_button: Revocar - title: Revocar token estático + confirm_button: "Revocar" + title: "Revocar token estático" heading: "¿Seguro que desea revocar este token?" - description: El cliente SCIM que utilice este token ya no podrá acceder a - la API del servidor SCIM de OpenProject. + description: "El cliente SCIM que utilice este token ya no podrá acceder a la API del servidor SCIM de OpenProject." table_component: blank_slate: - title: Aún no se ha configurado ningún cliente SCIM - description: Añada clientes para verlos aquí - user_count: Usuarios + title: "Aún no se ha configurado ningún cliente SCIM" + description: "Añada clientes para verlos aquí" + user_count: "Usuarios" token_list_component: - description: Los tokens que genere aquí pueden ser pasados por un cliente - SCIM para acceder a la API SCIM de OpenProject. - heading: Tokens - label_add_token: Token - label_aria_add_token: Añadir token + description: "Los tokens que genere aquí pueden ser pasados por un cliente SCIM para acceder a la API SCIM de OpenProject." + heading: "Tokens" + label_add_token: "Token" + label_aria_add_token: "Añadir token" token_table_component: blank_slate: - title: Aún no se ha creado ningún token - description: Puede crear uno ahora - expired: Caducó el %{date} - revoked: Revocado el %{date} - title: Tabla de tokens de acceso + title: "Aún no se ha creado ningún token" + description: "Puede crear uno ahora" + expired: "Caducó el %{date}" + revoked: "Revocado el %{date}" + title: "Tabla de tokens de acceso" settings: new_project: - project_creation: Creación de proyecto - notification_text_default: "

Hola,

Se ha creado un nuevo proyecto: - projectValue:name

Muchas gracias

\n" + project_creation: "Creación de proyecto" + notification_text_default: > +

Hola,

Se ha creado un nuevo proyecto: projectValue:name

Muchas gracias

workflows: tabs: - default_transitions: Transiciones predeterminadas - user_author: Usuario es autor - user_assignee: Usuario es asignado + default_transitions: "Transiciones predeterminadas" + user_author: "Usuario es autor" + user_assignee: "Usuario es asignado" authentication: - login_and_registration: Inicio de sesión y registro + login_and_registration: "Inicio de sesión y registro" announcements: show_until: Muestran hasta is_active: mostrado actualmente is_inactive: no mostrado actualmente antivirus_scan: - not_processed_yet_message: La descarga está bloqueada, ya que el archivo aún no - ha sido analizado en busca de virus. Inténtelo de nuevo más tarde. - quarantined_message: Se ha detectado un virus en el archivo «%{filename}». Se - ha puesto en cuarentena y no está disponible para su descarga. - deleted_message: Se ha detectado un virus en el archivo «%{filename}». El archivo - ha sido eliminado. - deleted_by_admin: El archivo en cuarentena «%{filename}» ha sido eliminado por - un administrador. - overridden_by_admin: La cuarentena para el archivo «%{filename}» ha sido eliminada - por %{user}. Ahora se puede acceder al archivo. + not_processed_yet_message: "La descarga está bloqueada, ya que el archivo aún no ha sido analizado en busca de virus. Inténtelo de nuevo más tarde." + quarantined_message: "Se ha detectado un virus en el archivo «%{filename}». Se ha puesto en cuarentena y no está disponible para su descarga." + deleted_message: "Se ha detectado un virus en el archivo «%{filename}». El archivo ha sido eliminado." + deleted_by_admin: "El archivo en cuarentena «%{filename}» ha sido eliminado por un administrador." + overridden_by_admin: "La cuarentena para el archivo «%{filename}» ha sido eliminada por %{user}. Ahora se puede acceder al archivo." quarantined_attachments: - container: Contenedor - delete: Eliminar el archivo en cuarentena - title: Adjuntos en cuarentena - error_cannot_act_self: No puede realizar acciones en sus propios archivos cargados. + container: "Contenedor" + delete: "Eliminar el archivo en cuarentena" + title: "Adjuntos en cuarentena" + error_cannot_act_self: "No puede realizar acciones en sus propios archivos cargados." attribute_help_texts: - caption: Esta versión corta se mostrará como título del atributo. - note_public: Todos los usuarios que hayan iniciado sesión podrán ver el texto - o las imágenes que añada en este campo. - text_overview: En esta vista, puede crear textos de ayuda personalizados para - la vista de atributos. Después de definir estos textos, se pueden mostrar al - hacer clic en el icono de ayuda junto al atributo al que pertenezcan. - show_preview: Vista previa del texto - add_new: Agregar texto de ayuda - edit_field_name: Editar texto de ayuda para %{attribute_field_name} + caption: "Esta versión corta se mostrará como título del atributo." + note_public: "Todos los usuarios que hayan iniciado sesión podrán ver el texto o las imágenes que añada en este campo." + text_overview: "En esta vista, puede crear textos de ayuda personalizados para la vista de atributos. Después de definir estos textos, se pueden mostrar al hacer clic en el icono de ayuda junto al atributo al que pertenezcan." + show_preview: "Vista previa del texto" + add_new: "Agregar texto de ayuda" + edit_field_name: "Editar texto de ayuda para %{attribute_field_name}" background_jobs: status: - error_requeue: 'El trabajo experimentó un error pero se está reintentando. El - error fue: %{message}' - cancelled_due_to: 'El trabajo ha sido cancelado debido al error: %{message}' + error_requeue: "El trabajo experimentó un error pero se está reintentando. El error fue: %{message}" + cancelled_due_to: "El trabajo ha sido cancelado debido al error: %{message}" ldap_auth_sources: - ldap_error: 'Error de LDAP: %{error_message}' - ldap_auth_failed: No puede autenticarse en el servidor LDAP. - sync_failed: 'Error al sincronizar desde LDAP: %{message}.' - back_to_index: Haga clic aquí para volver a la lista de conexión. + ldap_error: "Error de LDAP: %{error_message}" + ldap_auth_failed: "No puede autenticarse en el servidor LDAP." + sync_failed: "Error al sincronizar desde LDAP: %{message}." + back_to_index: "Haga clic aquí para volver a la lista de conexión." technical_warning: | Este formulario LDAP requiere conocimientos técnicos de su configuración LDAP/Active Directory. [Visite nuestra documentación para obtener instrucciones detalladas](docs_url). attribute_texts: name: Nombre arbitrario de la conexión LDAP host: Nombre del host LDAP o dirección IP - login_map: La clave de atributo en LDAP que se utiliza para identificar el inicio - de sesión único del usuario. Por lo general, esto será `uid` o`samAccountName`. - generic_map: La clave de atributo en LDAP que está asignada al proyecto abierto - `%{attribute}` atributo - admin_map_html: 'Opcional: la clave de atributo en LDAP que si esta - presente marca al usuario del proyecto abierto como administrador. - Deje en blanco cuando tenga dudas.' + login_map: La clave de atributo en LDAP que se utiliza para identificar el inicio de sesión único del usuario. Por lo general, esto será `uid` o`samAccountName`. + generic_map: La clave de atributo en LDAP que está asignada al proyecto abierto `%{attribute}` atributo + admin_map_html: "Opcional: la clave de atributo en LDAP que si esta presente marca al usuario del proyecto abierto como administrador. Deje en blanco cuando tenga dudas." system_user_dn_html: | Introduzca el ND del usuario del sistema utilizado para el acceso de solo lectura.
@@ -521,47 +439,30 @@ es: onthefly_register: | Si marca esta casilla, el proyecto abierto creará automáticamente nuevos usuarios a partir de sus entradas LDAP cuando se autentican por primera vez con el proyecto abierto. ¡Deje esto sin marcar para permitir que solo las cuentas existentes en el proyecto abierto se autentiquen a través de LDAP! - connection_encryption: Cifrado de conexión - encryption_details: Opciones LDAPS / STARTTLS - system_account: Cuenta del sistema + connection_encryption: "Cifrado de conexión" + encryption_details: "Opciones LDAPS / STARTTLS" + system_account: "Cuenta del sistema" system_account_legend: | El proyecto abierto requiere acceso de solo lectura a través de una cuenta del sistema para buscar usuarios y grupos en su árbol LDAP. Especifique las credenciales de enlace para ese usuario del sistema en la siguiente sección. - ldap_details: LDAP detalles - user_settings: Mapeo de atributos - user_settings_legend: 'Los siguientes campos están relacionados con cómo se crean - los usuarios en el proyecto abierto a partir de entradas LDAP y qué atributos - LDAP se utilizan para definir los atributos de un usuario del proyecto abierto - (asignación de atributos). - - ' + ldap_details: "LDAP detalles" + user_settings: "Mapeo de atributos" + user_settings_legend: | + Los siguientes campos están relacionados con cómo se crean los usuarios en el proyecto abierto a partir de entradas LDAP y qué atributos LDAP se utilizan para definir los atributos de un usuario del proyecto abierto (asignación de atributos). tls_mode: - plain: ninguno - simple_tls: LDAPS - start_tls: STARTTLS - plain_description: Abre una conexión sin cifrado al servidor LDAP. No se recomienda - para producción. - simple_tls_description: Usar LDAPS. Se requiere un puerto separado en el servidor - LDAP. Este modo suele ser obsoleto, recomendamos usar STARTTLS siempre que - sea posible. - start_tls_description: Envía un comando STARTTLS después de conectarse al puerto - estándar LDAP. Recomendado para conexiones cifradas. - section_more_info_link_html: 'Esta sección es concerniente a la seguridad de - conexión de esta fuente de autentificación de LDAP. Para más información, - visita la documentación Red::LDAP. - - ' + plain: "ninguno" + simple_tls: "LDAPS" + start_tls: "STARTTLS" + plain_description: "Abre una conexión sin cifrado al servidor LDAP. No se recomienda para producción." + simple_tls_description: "Usar LDAPS. Se requiere un puerto separado en el servidor LDAP. Este modo suele ser obsoleto, recomendamos usar STARTTLS siempre que sea posible." + start_tls_description: "Envía un comando STARTTLS después de conectarse al puerto estándar LDAP. Recomendado para conexiones cifradas." + section_more_info_link_html: > + Esta sección es concerniente a la seguridad de conexión de esta fuente de autentificación de LDAP. Para más información, visita la documentación Red::LDAP. tls_options: - verify_peer: Verificar certificado SSL - verify_peer_description_html: 'Permite la verificación estricta SSL de la cadena - de confianza del certificado.
Advertencia: Desmarcar - esta opción desactiva la verificación SSL del certificado del servidor LDAP. - Esto expone tu conexión a los ataques de intermediario. - - ' - tls_certificate_description: Si el certificado de servidor LDAP no está en las - fuentes de confianza de este sistema, puede añadirlo manualmente aquí. Introduzca - una cadena de certificación PEM X509. + verify_peer: "Verificar certificado SSL" + verify_peer_description_html: > + Permite la verificación estricta SSL de la cadena de confianza del certificado.
Advertencia: Desmarcar esta opción desactiva la verificación SSL del certificado del servidor LDAP. Esto expone tu conexión a los ataques de intermediario. + tls_certificate_description: "Si el certificado de servidor LDAP no está en las fuentes de confianza de este sistema, puede añadirlo manualmente aquí. Introduzca una cadena de certificación PEM X509." forums: show: no_results_title_text: Actualmente no hay publicaciones en el foro. @@ -569,64 +470,54 @@ es: index: no_results_title_text: No existen colores por el momento. no_results_content_text: Crear un nuevo color - label_new_color: Nuevo color + label_new_color: "Nuevo color" new: - label_new_color: Nuevo color + label_new_color: "Nuevo color" edit: - label_edit_color: Editar color + label_edit_color: "Editar color" form: - label_new_color: Nuevo color - label_edit_color: Editar color - label_no_color: Sin color - label_properties: Propiedades - label_really_delete_color: "¿Seguro que desea eliminar el siguiente color? Los - tipos que usan este color no se eliminarán.\n" + label_new_color: "Nuevo color" + label_edit_color: "Editar color" + label_no_color: "Sin color" + label_properties: "Propiedades" + label_really_delete_color: > + ¿Seguro que desea eliminar el siguiente color? Los tipos que usan este color no se eliminarán. custom_actions: actions: - name: Acciones - add: Añadir Acción + name: "Acciones" + add: "Añadir Acción" assigned_to: executing_user_value: "(Asignar al usuario que ejecuta)" - conditions: Condiciones - plural: Acciones personalizadas - new: Nueva Acción personalizada - edit: Editar Accion Personalizada %{name} - execute: Ejecutar %{name} + conditions: "Condiciones" + plural: "Acciones personalizadas" + new: "Nueva Acción personalizada" + edit: "Editar Accion Personalizada %{name}" + execute: "Ejecutar %{name}" custom_fields: admin: custom_field_projects: is_for_all_blank_slate: heading: Para todos los proyectos - description: Este campo personalizado está activado en todos los proyectos, - ya que la opción «Para todos los proyectos» está marcada. No puede desactivarse - para proyectos individuales. + description: Este campo personalizado está activado en todos los proyectos, ya que la opción «Para todos los proyectos» está marcada. No puede desactivarse para proyectos individuales. items: - actions: Acciones del elemento + actions: "Acciones del elemento" blankslate: root: - title: Su lista de artículos está vacía - description: Comience añadiendo elementos al campo personalizado de tipo - jerarquía. Cada elemento puede utilizarse para crear una jerarquía debajo - de él. Para navegar y crear subelementos dentro de una jerarquía, haga - clic en el elemento creado. + title: "Su lista de artículos está vacía" + description: "Comience añadiendo elementos al campo personalizado de tipo jerarquía. Cada elemento puede utilizarse para crear una jerarquía debajo de él. Para navegar y crear subelementos dentro de una jerarquía, haga clic en el elemento creado." item: title: Este elemento no tiene ningún nivel de jerarquía inferior - description: Añada elementos a esta lista para crear subelementos dentro - de otra + description: Añada elementos a esta lista para crear subelementos dentro de otra delete_dialog: - title: Eliminar elemento de campo personalizado + title: "Eliminar elemento de campo personalizado" heading: "¿Eliminar elemento de campo personalizado?" - description: Esta acción eliminará de forma irreversible el elemento y todos - sus subelementos. Cualquier valor asignado se eliminará de forma permanente. - Si este campo es obligatorio, la eliminación de elementos puede hacer - que los paquetes de trabajo existentes dejen de ser válidos. + description: "Esta acción eliminará de forma irreversible el elemento y todos sus subelementos. Cualquier valor asignado se eliminará de forma permanente. Si este campo es obligatorio, la eliminación de elementos puede hacer que los paquetes de trabajo existentes dejen de ser válidos." placeholder: - label: Etiqueta del elemento - short: Nombre corto - weight: Peso + label: "Etiqueta del elemento" + short: "Nombre corto" + weight: "Peso" notice: - remember_items_and_projects: Recuerde configurar los artículos y proyectos - en las pestañas respectivas para este campo personalizado. + remember_items_and_projects: "Recuerde configurar los artículos y proyectos en las pestañas respectivas para este campo personalizado." hierarchy: subitems: zero: ningún subelemento @@ -634,24 +525,15 @@ es: other: "%{count} subelementos" role_assignment: title: Asignación de roles - description: Puede conceder automáticamente un determinado rol de proyecto - a cualquier usuario asignado a este atributo de proyecto, independientemente - del rol original de ese usuario en ese proyecto. - warning: En función de la función seleccionada a continuación, el usuario - asignado a este atributo del proyecto podría obtener muchos más permisos - de los que tenía anteriormente, incluida la capacidad de añadir nuevos miembros - y elevar su rol. - role_field_label: Rol de proyecto - role_field_caption: Este rol de proyecto se concederá automáticamente a cualquier - usuario asignado a este atributo de proyecto - review_hint: 'Hay %{user_count} que ya tienen asignado este atributo en varios - proyectos. Podrían obtener permisos adicionales y ser añadidos a proyectos - a los que antes no tenían acceso. - - ' + description: Puede conceder automáticamente un determinado rol de proyecto a cualquier usuario asignado a este atributo de proyecto, independientemente del rol original de ese usuario en ese proyecto. + warning: En función de la función seleccionada a continuación, el usuario asignado a este atributo del proyecto podría obtener muchos más permisos de los que tenía anteriormente, incluida la capacidad de añadir nuevos miembros y elevar su rol. + role_field_label: "Rol de proyecto" + role_field_caption: Este rol de proyecto se concederá automáticamente a cualquier usuario asignado a este atributo de proyecto + review_hint: > + Hay %{user_count} que ya tienen asignado este atributo en varios proyectos. Podrían obtener permisos adicionales y ser añadidos a proyectos a los que antes no tenían acceso. review_button: Revisar usuarios y permisos dialog: - title: Visión general de usuarios y permisos + title: "Visión general de usuarios y permisos" change: Cambiar changes: new_member: Se añadirá como miembro @@ -660,182 +542,145 @@ es: gain_role: Recibirá el rol «%{new_role}» lose_role: Perderá el rol «%{old_role}» no_change: Sin cambios - text_add_new_custom_field: 'Para agregar nuevos campos personalizados a un proyecto, - primero debe crearlos, y luego añadirlos a este proyecto. - - ' - is_enabled_globally: Está activado a nivel global - enabled_in_project: Activado en el proyecto - contained_in_type: Incluido en el tipo - confirm_destroy_option: Al eliminar una opción, se eliminarán todas las repeticiones - (por ejemplo, en paquetes de trabajo). ¿Está seguro de que desea eliminarla? - reorder_alphabetical: Ordenar los valores alfabéticamente - reorder_confirmation: 'Advertencia: Se perderá el orden actual de los valores - disponibles, así como todos los valores no guardados. ¿Seguro que desea continuar?' - placeholder_version_select: Primero debe seleccionar el paquete de trabajo o el - proyecto - calculated_field_not_editable: Atributo no editable. Este valor se calcula automáticamente. - no_role_assigment: Sin asignación de roles + text_add_new_custom_field: > + Para agregar nuevos campos personalizados a un proyecto, primero debe crearlos, y luego añadirlos a este proyecto. + is_enabled_globally: "Está activado a nivel global" + enabled_in_project: "Activado en el proyecto" + contained_in_type: "Incluido en el tipo" + confirm_destroy_option: "Al eliminar una opción, se eliminarán todas las repeticiones (por ejemplo, en paquetes de trabajo). ¿Está seguro de que desea eliminarla?" + reorder_alphabetical: "Ordenar los valores alfabéticamente" + reorder_confirmation: "Advertencia: Se perderá el orden actual de los valores disponibles, así como todos los valores no guardados. ¿Seguro que desea continuar?" + placeholder_version_select: "Primero debe seleccionar el paquete de trabajo o el proyecto" + calculated_field_not_editable: "Atributo no editable. Este valor se calcula automáticamente." + no_role_assigment: "Sin asignación de roles" instructions: is_required: - all: Marca el campo personalizado como obligatorio. De este modo, será obligatorio - rellenar el campo al crear nuevos recursos. Los recursos existentes no requerirán - un valor al actualizarse. - project: Los atributos obligatorios deben ser completados por el usuario al - crear el proyecto si el campo está activo (configurado como «Para todos - los proyectos» o copiado de un proyecto/plantilla en el que el campo está - activo). Los proyectos existentes no requerirán un valor al actualizarse. + all: "Marca el campo personalizado como obligatorio. De este modo, será obligatorio rellenar el campo al crear nuevos recursos. Los recursos existentes no requerirán un valor al actualizarse." + project: "Los atributos obligatorios deben ser completados por el usuario al crear el proyecto si el campo está activo (configurado como «Para todos los proyectos» o copiado de un proyecto/plantilla en el que el campo está activo). Los proyectos existentes no requerirán un valor al actualizarse." is_for_all: - all: Marque el campo personalizado como disponible en todos los proyectos - existentes y nuevos. - project: Marque el atributo como disponible en todos los proyectos existentes - y nuevos. + all: "Marque el campo personalizado como disponible en todos los proyectos existentes y nuevos." + project: "Marque el atributo como disponible en todos los proyectos existentes y nuevos." multi_select: - all: Permite al usuario asignar varios valores a este campo personalizado. - project: Permite al usuario asignar varios valores a este atributo. + all: "Permite al usuario asignar varios valores a este campo personalizado." + project: "Permite al usuario asignar varios valores a este atributo." searchable: - all: Incluye los valores de los campos al usar la funcionalidad de búsqueda - global. - project: Marque esta casilla para que este atributo esté disponible como filtro - en las listas de proyectos. + all: "Incluye los valores de los campos al usar la funcionalidad de búsqueda global." + project: "Marque esta casilla para que este atributo esté disponible como filtro en las listas de proyectos." editable: - all: Permitir que el campo sea editable por los propios usuarios. + all: "Permitir que el campo sea editable por los propios usuarios." admin_only: - all: Marque para que este campo personalizado solo sea visible para los administradores. - Los usuarios sin derechos de administrador no podrán verlo ni editarlo. - project: Marque esta casilla para que este atributo solo sea visible para - los administradores. Los usuarios sin derechos de administrador no podrán - verlo ni editarlo. + all: "Marque para que este campo personalizado solo sea visible para los administradores. Los usuarios sin derechos de administrador no podrán verlo ni editarlo." + project: "Marque esta casilla para que este atributo solo sea visible para los administradores. Los usuarios sin derechos de administrador no podrán verlo ni editarlo." is_filter: - all: 'Permitir que el campo personalizado se utilice como filtro en las vistas - de paquetes de trabajo. Tenga en cuenta que solo ''Para todos los proyectos'' - seleccionados, el campo personalizado se mostrará en vistas globales. - - ' + all: > + Permitir que el campo personalizado se utilice como filtro en las vistas de paquetes de trabajo. Tenga en cuenta que solo 'Para todos los proyectos' seleccionados, el campo personalizado se mostrará en vistas globales. formula: - project: Añada valores numéricos o escriba/para buscar un atributo o un operador - matemático. + project: "Añada valores numéricos o escriba/para buscar un atributo o un operador matemático." regexp: - all: ej. ^[A-Z0-9]+$ - project: ej. ^[A-Z0-9]+$ + all: "ej. ^[A-Z0-9]+$" + project: "ej. ^[A-Z0-9]+$" min_max: - all: 0 significa sin restricción - project: 0 significa sin restricción + all: "0 significa sin restricción" + project: "0 significa sin restricción" has_comment: - project: Permite al usuario añadir un comentario relacionado con el atributo - del proyecto al seleccionar el valor en la descripción general del proyecto. + project: "Permite al usuario añadir un comentario relacionado con el atributo del proyecto al seleccionar el valor en la descripción general del proyecto." tab: no_results_title_text: Actualmente no hay campos personalizados. no_results_content_text: Crear un nuevo campo personalizado calculated_values: error_dialog: - title: Error en el valor calculado + title: "Error en el valor calculado" errors: - unknown: Se ha producido un error desconocido. Revise la fórmula de este Valor - calculado. - mathematical: La fórmula matemática da lugar a un error. Revisa el atributo - de cálculo del proyecto y vuelve a intentarlo. - missing_value: El atributo «%{custom_field_name}» es obligatorio para este Valor - calculado, pero está vacío. - disabled_value: El atributo «%{custom_field_name}» es obligatorio para este - Valor calculado, pero está desactivado para el proyecto. + unknown: "Se ha producido un error desconocido. Revise la fórmula de este Valor calculado." + mathematical: "La fórmula matemática da lugar a un error. Revisa el atributo de cálculo del proyecto y vuelve a intentarlo." + missing_value: El atributo «%{custom_field_name}» es obligatorio para este Valor calculado, pero está vacío. + disabled_value: El atributo «%{custom_field_name}» es obligatorio para este Valor calculado, pero está desactivado para el proyecto. concatenation: - single: o bien + single: "o bien" danger_dialog: - confirmation_live_message_checked: El botón para continuar ya está activo. - confirmation_live_message_unchecked: El botón para continuar ya está inactivo. - Debe marcar la casilla para continuar. + confirmation_live_message_checked: "El botón para continuar ya está activo." + confirmation_live_message_unchecked: "El botón para continuar ya está inactivo. Debe marcar la casilla para continuar." mcp_configurations: server_url_component: - caption: La URL en la que se podrá acceder al servidor OpenProject MCP. Es necesaria - para configurar los clientes de MCP. - label: URL del servidor + caption: "La URL en la que se podrá acceder al servidor OpenProject MCP. Es necesaria para configurar los clientes de MCP." + label: "URL del servidor" op_dry_validation: - or: o + or: "o" errors: - array?: debe ser una matriz. - decimal?: debe ser un número decimal. - defined: no debe definirse. - eql?: debe ser igual a %{left}. - filled?: debe rellenarse. - greater_or_equal_zero: debe ser mayor o igual a 0. - gteq?: debe ser mayor o igual a %{num}. - hash?: debe ser un hash. + array?: "debe ser una matriz." + decimal?: "debe ser un número decimal." + defined: "no debe definirse." + eql?: "debe ser igual a %{left}." + filled?: "debe rellenarse." + greater_or_equal_zero: "debe ser mayor o igual a 0." + gteq?: "debe ser mayor o igual a %{num}." + hash?: "debe ser un hash." included_in?: arg: - default: 'debe ser uno de los siguientes: %{list}.' - range: 'debe ser uno de: %{list_left} - %{list_right}.' - int?: debe ser un número entero. - key?: falta. - not_found: no encontrado. - respond_to?: no implementa el método requerido. + default: "debe ser uno de los siguientes: %{list}." + range: "debe ser uno de: %{list_left} - %{list_right}." + int?: "debe ser un número entero." + key?: "falta." + not_found: "no encontrado." + respond_to?: "no implementa el método requerido." rules: copy_workflow_from: - workflow_missing: no tiene flujo de trabajo propio. + workflow_missing: "no tiene flujo de trabajo propio." custom_field: - format_not_supported: el formato «%{field_format}» no es compatible. + format_not_supported: "el formato «%{field_format}» no es compatible." item: - root_item: no puede ser un elemento raíz. - not_persisted: debe ser un elemento ya existente. + root_item: "no puede ser un elemento raíz." + not_persisted: "debe ser un elemento ya existente." label: - not_unique: debe ser único dentro del mismo nivel de jerarquía. + not_unique: "debe ser único dentro del mismo nivel de jerarquía." short: - not_unique: debe ser único dentro del mismo nivel de jerarquía. + not_unique: "debe ser único dentro del mismo nivel de jerarquía." parent: - not_descendant: debe ser descendiente de la raíz de la jerarquía. - str?: debe ser una cadena. - type?: debe ser %{type}. + not_descendant: "debe ser descendiente de la raíz de la jerarquía." + str?: "debe ser una cadena." + type?: "debe ser %{type}." rules: - copy_workflow_from: Tipo para la copia del flujo de trabajo - enabled: Habilitado - depth: Profundidad - item: Elemento - label: Etiqueta - weight: Peso - short: Nombre corto - parent: Principal - blueprint: Plano de patrón + copy_workflow_from: "Tipo para la copia del flujo de trabajo" + enabled: "Habilitado" + depth: "Profundidad" + item: "Elemento" + label: "Etiqueta" + weight: "Peso" + short: "Nombre corto" + parent: "Principal" + blueprint: "Plano de patrón" global_search: title: - all_projects: Buscar «%{search_term}» en todos los proyectos - current_project: Buscar «%{search_term}» en %{project_name} - project_and_subprojects: Buscar «%{search_term}» en %{project_name} y en todos - los subproyectos - placeholder: Buscar en %{app_title} + all_projects: 'Buscar «%{search_term}» en todos los proyectos' + current_project: 'Buscar «%{search_term}» en %{project_name}' + project_and_subprojects: 'Buscar «%{search_term}» en %{project_name} y en todos los subproyectos' + placeholder: "Buscar en %{app_title}" overwritten_tabs: - all: Todos - messages: Foro - wiki_pages: Wiki + all: "Todos" + messages: "Foro" + wiki_pages: "Wiki" groups: edit: - synchronized_groups: Grupos sincronizados + synchronized_groups: "Grupos sincronizados" index: - description: Al agrupar a los usuarios, puede añadirlos como miembros a los - mismos proyectos o asignarles los mismos roles globales. + description: Al agrupar a los usuarios, puede añadirlos como miembros a los mismos proyectos o asignarles los mismos roles globales. table_component: blank_slate: description: Puede definir grupos de usuarios con nombre y permisos específicos. title: Aún no hay grupos configurados user_count: Número de usuarios users: - no_results_title_text: Actualmente no hay usuarios que formen parte de este - grupo. + no_results_title_text: Actualmente no hay usuarios que formen parte de este grupo. memberships: - no_results_title_text: Actualmente no hay proyectos que formen parte de este - grupo. + no_results_title_text: Actualmente no hay proyectos que formen parte de este grupo. synchronized_groups: blankslate: action: Ajustes de autenticación - description: Cuando este grupo se sincronice automáticamente con grupos de - proveedores de identidad externos como OpenID, aparecerán aquí. Puede configurar - esto en sus ajustes de autenticación. + description: Cuando este grupo se sincronice automáticamente con grupos de proveedores de identidad externos como OpenID, aparecerán aquí. Puede configurar esto en sus ajustes de autenticación. title: Aún no hay grupos sincronizados incoming_mails: - ignore_filenames: 'Especifica una lista de nombres a ignorar al procesar archivos - adjuntos de emails entrantes (por ejemplo, firmas o iconos). Introduce un nombre - de archivo por línea. - - ' + ignore_filenames: > + Especifica una lista de nombres a ignorar al procesar archivos adjuntos de emails entrantes (por ejemplo, firmas o iconos). Introduce un nombre de archivo por línea. portfolios: index: search: @@ -845,55 +690,52 @@ es: one: "1 subelemento" other: "%{count} subelementos" lists: - active: Carteras activas - my: Mis carteras - favorited: Carteras favoritas - archived: Carteras archivadas + active: "Carteras activas" + my: "Mis carteras" + favorited: "Carteras favoritas" + archived: "Carteras archivadas" projects: copy: - members: Miembros del proyecto - overviews: Visión general del proyecto - queries: 'Paquetes de trabajo: vistas guardadas' - wiki_page_attachments: 'Páginas wiki: archivos adjuntos' - work_package_attachments: 'Paquetes de trabajo: archivos adjuntos' - work_package_categories: 'Paquetes de trabajo: categorías' - work_package_file_links: 'Paquetes de trabajo: enlaces de archivos' - work_package_shares: 'Paquetes de trabajo: comparticiones' + #Contains custom strings for options when copying a project that cannot be found elsewhere. + members: "Miembros del proyecto" + overviews: "Visión general del proyecto" + queries: "Paquetes de trabajo: vistas guardadas" + wiki_page_attachments: "Páginas wiki: archivos adjuntos" + work_package_attachments: "Paquetes de trabajo: archivos adjuntos" + work_package_categories: "Paquetes de trabajo: categorías" + work_package_file_links: "Paquetes de trabajo: enlaces de archivos" + work_package_shares: "Paquetes de trabajo: comparticiones" create: - notification_email_subject: Se ha creado el proyecto «%{project_name}» - complete_wizard_link: Completar el %{artefact_name} + notification_email_subject: "Se ha creado el proyecto «%{project_name}»" + complete_wizard_link: "Completar el %{artefact_name}" delete: - scheduled: Se ha programado la eliminación y se ejecutará en segundo plano. - Recibirá una notificación con el resultado. - schedule_failed: 'El proyecto no puede ser eliminado: %{errors}' - failed: Se ha producido un error al eliminar el proyecto «%{name}» - failed_text: La solicitud para eliminar el proyecto «%{name}» ha fallado. El - proyecto se ha archivado. - completed: Eliminación del proyecto «%{name}» completada - completed_text: La petición para borrar el proyecto '%{name}' se ha completado. - completed_text_children: 'Adicionalmente, los siguientes subproyectos han sido - eliminados:' + scheduled: "Se ha programado la eliminación y se ejecutará en segundo plano. Recibirá una notificación con el resultado." + schedule_failed: "El proyecto no puede ser eliminado: %{errors}" + failed: "Se ha producido un error al eliminar el proyecto «%{name}»" + failed_text: "La solicitud para eliminar el proyecto «%{name}» ha fallado. El proyecto se ha archivado." + completed: "Eliminación del proyecto «%{name}» completada" + completed_text: "La petición para borrar el proyecto '%{name}' se ha completado." + completed_text_children: "Adicionalmente, los siguientes subproyectos han sido eliminados:" index: - open_as_gantt: Abrir como diagrama de Gantt + open_as_gantt: "Abrir como diagrama de Gantt" no_results_title_text: No hay proyectos por el momento no_results_content_text: Crear un nuevo proyecto search: label: Filtro de nombre de proyecto placeholder: Buscar por nombre de proyecto lists: - active: Proyectos activos - my: Mis proyectos - favorited: Proyectos favoritos - archived: Proyectos archivados - shared: Listas de proyectos compartidas - my_lists: Mis listas de proyectos + active: "Proyectos activos" + my: "Mis proyectos" + favorited: "Proyectos favoritos" + archived: "Proyectos archivados" + shared: "Listas de proyectos compartidas" + my_lists: "Mis listas de proyectos" new: - placeholder: Nueva lista de proyectos + placeholder: "Nueva lista de proyectos" delete_modal: - title: Eliminar lista de proyectos + title: "Eliminar lista de proyectos" heading: "¿Eliminar esta lista de proyectos?" - text: Esta acción no eliminará ningún proyecto que contenga la lista. ¿Seguro - que desea eliminar esta lista de proyectos? + text: "Esta acción no eliminará ningún proyecto que contenga la lista. ¿Seguro que desea eliminar esta lista de proyectos?" settings: header_details: Detalles básicos header_status: Estado @@ -901,59 +743,38 @@ es: button_update_details: Actualizar detalles button_update_status_description: Actualizar descripción del estado button_update_parent_project: Actualizar proyecto principal - public_warning: 'Este proyecto es público. Cualquier persona que tenga acceso - a esta instancia podrá ver e interactuar con este proyecto en función de su - rol y los permisos asociados. Los subproyectos no se ven afectados y tienen - sus propios ajustes. - - ' + public_warning: > + Este proyecto es público. Cualquier persona que tenga acceso a esta instancia podrá ver e interactuar con este proyecto en función de su rol y los permisos asociados. Los subproyectos no se ven afectados y tienen sus propios ajustes. public_confirmation: - checkbox: Entiendo que esto hará público el contenido que antes era privado + checkbox: "Entiendo que esto hará público el contenido que antes era privado" title: "¿Hacer público este proyecto?" - description: 'Cualquier persona que tenga acceso a esta instancia podrá ver - e interactuar con este proyecto en función de su rol y configuración de - autenticación. Los subproyectos no se ven afectados y tienen su propios - ajustes. - - ' + description: > + Cualquier persona que tenga acceso a esta instancia podrá ver e interactuar con este proyecto en función de su rol y configuración de autenticación. Los subproyectos no se ven afectados y tienen su propios ajustes. private_confirmation: - checkbox: Entiendo que esto hará que el contenido que antes era público pase - a ser privado. + checkbox: "Entiendo que esto hará que el contenido que antes era público pase a ser privado." title: "¿Hacer privado este proyecto?" - description: 'El proyecto solo será visible para los miembros del proyecto - en función de su rol y los permisos asociados. Los subproyectos no se ven - afectados y tienen sus propios ajustes. - - ' + description: > + El proyecto solo será visible para los miembros del proyecto en función de su rol y los permisos asociados. Los subproyectos no se ven afectados y tienen sus propios ajustes. change_identifier: Cambiar identificador subitems: - template_section: 'Selecciona las plantillas que se utilizarán al crear nuevos - subelementos. - - ' - project_template_label: Plantilla de proyectos - project_template_caption: Selecciona un proyecto de plantilla que se utilizará - por defecto para los nuevos subelementos de este tipo. - program_template_label: Plantilla de programas - program_template_caption: Selecciona un programa de plantilla que se utilizará - por defecto para los nuevos subelementos de este tipo. - no_template: Sin plantilla predefinida + template_section: > + Selecciona las plantillas que se utilizarán al crear nuevos subelementos. + project_template_label: "Plantilla de proyectos" + project_template_caption: "Selecciona un proyecto de plantilla que se utilizará por defecto para los nuevos subelementos de este tipo." + program_template_label: "Plantilla de programas" + program_template_caption: "Selecciona un programa de plantilla que se utilizará por defecto para los nuevos subelementos de este tipo." + no_template: "Sin plantilla predefinida" template: - menu_title: Plantilla - title: Ajustes de plantilla - enable_failed: Error al activar el modo de plantilla. + menu_title: "Plantilla" + title: "Ajustes de plantilla" + enable_failed: "Error al activar el modo de plantilla." members: - excluded_roles_label: Roles a excluir cuando se aplica la plantilla - excluded_roles_caption: 'Al crear un nuevo proyecto a partir de esta plantilla, - se omitirán los roles seleccionados anteriormente. Esto te permite seleccionar - qué miembros se excluirán en función de sus roles en el proyecto. Los - usuarios podrán acceder a la plantilla para verla sin que se les conceda - acceso a los nuevos proyectos creados a partir de ella. - - ' + excluded_roles_label: "Roles a excluir cuando se aplica la plantilla" + excluded_roles_caption: > + Al crear un nuevo proyecto a partir de esta plantilla, se omitirán los roles seleccionados anteriormente. Esto te permite seleccionar qué miembros se excluirán en función de sus roles en el proyecto. Los usuarios podrán acceder a la plantilla para verla sin que se les conceda acceso a los nuevos proyectos creados a partir de ella. actions: - label_enable_all: Activar todo - label_disable_all: Desactivar todo + label_enable_all: "Activar todo" + label_disable_all: "Desactivar todo" activities: no_results_title_text: Actualmente no hay actividades disponibles. forums: @@ -966,186 +787,127 @@ es: no_results_title_text: Actualmente no hay campos personalizados disponibles. life_cycle: header: - title: Ciclo de vida del proyecto - description_html: Las fases activas del proyecto definen el ciclo de vida - de este proyecto y se definen en los ajustes - de administración. Las fases habilitadas se mostrarán en su resumen del proyecto. - non_defined: Actualmente no hay fases definidas. - section_header: Fases + title: "Ciclo de vida del proyecto" + description_html: 'Las fases activas del proyecto definen el ciclo de vida de este proyecto y se definen en los ajustes de administración. Las fases habilitadas se mostrarán en su resumen del proyecto.' + non_defined: "Actualmente no hay fases definidas." + section_header: "Fases" step: - use_in_project: Usar %{step} en este proyecto + use_in_project: "Usar %{step} en este proyecto" filter: - label: Buscar fase del proyecto + label: "Buscar fase del proyecto" project_custom_fields: header: - title: Atributos del proyecto - description_html: 'Estos atributos del proyecto se mostrarán en su página de resumen del proyecto bajo sus respectivas - secciones. Puede activar o desactivar atributos individuales. Los atributos - y secciones del proyecto son definidos en los ajustes de administración por el administrador de - la instancia. ' + title: "Atributos del proyecto" + description_html: 'Estos atributos del proyecto se mostrarán en su página de resumen del proyecto bajo sus respectivas secciones. Puede activar o desactivar atributos individuales. Los atributos y secciones del proyecto son definidos en los ajustes de administración por el administrador de la instancia. ' filter: - label: Buscar atributo de proyecto + label: "Buscar atributo de proyecto" actions: - label_enable_single: Activo en este proyecto, pulse para desactivarlo - label_disable_single: Inactivo en este proyecto, pulse para activarlo - remove_from_project: Quitar del proyecto + label_enable_single: "Activo en este proyecto, pulse para desactivarlo" + label_disable_single: "Inactivo en este proyecto, pulse para activarlo" + remove_from_project: "Quitar del proyecto" is_for_all_blank_slate: heading: Para todos los proyectos - description: Este atributo de proyecto está activado en todos los proyectos, - ya que la opción «Para todos los proyectos» está marcada. No puede desactivarse - para proyectos individuales. - enabled_via_assignee_when_submitted_html: Este atributo del proyecto no se - puede desactivar, ya que está configurado como asignado al enviarlo para las solicitudes de inicio - de proyectos. + description: Este atributo de proyecto está activado en todos los proyectos, ya que la opción «Para todos los proyectos» está marcada. No puede desactivarse para proyectos individuales. + enabled_via_assignee_when_submitted_html: Este atributo del proyecto no se puede desactivar, ya que está configurado como asignado al enviarlo para las solicitudes de inicio de proyectos. types: no_results_title_text: Actualmente no hay tipos disponibles. form: - enable_type_in_project: Habilitar tipo «%{type}» + enable_type_in_project: 'Habilitar tipo «%{type}»' versions: no_results_title_text: Actualmente no hay versiones para este proyecto. no_results_content_text: Crear un nueva versión work_packages_graph: Gráfico de paquetes de trabajo show_work_packages: Mostrar los paquetes de trabajo storage: - no_results_title_text: No se ha registrado el uso de espacio en disco adicional - por este proyecto. + no_results_title_text: No se ha registrado el uso de espacio en disco adicional por este proyecto. work_package_priorities: - new_label: Nueva prioridad + new_label: "Nueva prioridad" creation_wizard: errors: - no_work_package_type: No se ha podido habilitar la solicitud de inicio del - proyecto porque requiere al menos un tipo de paquete de trabajo activo - y este proyecto no tiene ninguno. Añada al menos un tipo de paquete de - trabajo a este proyecto. - no_status_when_submitted: No se ha podido habilitar la solicitud de inicio - del proyecto porque el tipo de paquete de trabajo %{type} requiere al - menos un estado asociado. Habilite al menos un flujo de trabajo de estado - para este tipo de paquete de trabajo. + no_work_package_type: "No se ha podido habilitar la solicitud de inicio del proyecto porque requiere al menos un tipo de paquete de trabajo activo y este proyecto no tiene ninguno. Añada al menos un tipo de paquete de trabajo a este proyecto." + no_status_when_submitted: "No se ha podido habilitar la solicitud de inicio del proyecto porque el tipo de paquete de trabajo %{type} requiere al menos un estado asociado. Habilite al menos un flujo de trabajo de estado para este tipo de paquete de trabajo." export: - description_attachment_export: El artefacto generado se guardará como PDF - adjunto al paquete de trabajo del artefacto. - description_file_link_export: El paquete de trabajo de artefactos tendrá - un enlace de archivo a un PDF almacenado en un almacenamiento de archivos - externo. Requiere un almacenamiento de archivos de trabajo con carpetas - de proyecto gestionadas automáticamente para este proyecto. Por el momento - sólo son compatibles los almacenamientos de archivos Nextcloud. - description_file_storage_selection: Selecciona cuál de los almacenamientos - de archivos externos configurados se debe utilizar. - external_file_storage: Almacenamiento de archivos externo - label_artifact_export: Exportación de artefactos - label_attachment_export: Guardar como archivo adjunto del paquete de trabajo - label_file_link_export: Sube el archivo a un almacenamiento externo y añade - el enlace al paquete de trabajo - pdf_file_storage: Almacenamiento de archivos PDF - unavailable: no disponible - label_request_submission: Envío de la solicitud - project_attributes_description: 'Selecciona los atributos del proyecto que - deben incluirse en la solicitud de inicio del proyecto. Esta lista solo - incluye los [atributos del proyecto](project_attributes_url) habilitados - para este proyecto. - - ' - enabled_because_required_html: Este atributo del proyecto no se puede desactivar - para esta solicitud de inicio de proyecto, ya que está definido como obligatorio. - El administrador de la instancia puede cambiarlo en la configuración de administración. + description_attachment_export: "El artefacto generado se guardará como PDF adjunto al paquete de trabajo del artefacto." + description_file_link_export: "El paquete de trabajo de artefactos tendrá un enlace de archivo a un PDF almacenado en un almacenamiento de archivos externo. Requiere un almacenamiento de archivos de trabajo con carpetas de proyecto gestionadas automáticamente para este proyecto. Por el momento sólo son compatibles los almacenamientos de archivos Nextcloud." + description_file_storage_selection: "Selecciona cuál de los almacenamientos de archivos externos configurados se debe utilizar." + external_file_storage: "Almacenamiento de archivos externo" + label_artifact_export: "Exportación de artefactos" + label_attachment_export: "Guardar como archivo adjunto del paquete de trabajo" + label_file_link_export: "Sube el archivo a un almacenamiento externo y añade el enlace al paquete de trabajo" + pdf_file_storage: "Almacenamiento de archivos PDF" + unavailable: "no disponible" + label_request_submission: "Envío de la solicitud" + project_attributes_description: > + Selecciona los atributos del proyecto que deben incluirse en la solicitud de inicio del proyecto. Esta lista solo incluye los [atributos del proyecto](project_attributes_url) habilitados para este proyecto. + enabled_because_required_html: Este atributo del proyecto no se puede desactivar para esta solicitud de inicio de proyecto, ya que está definido como obligatorio. El administrador de la instancia puede cambiarlo en la configuración de administración. status: button_edit: Editar estado wizard: - sidebar_content_title: Contenido - sections: Secciones - title: Solicitud de inicio de proyecto - no_help_text: Este atributo no tiene texto de ayuda definido. - success: Atributos del proyecto guardados y paquete de trabajo de artefactos - creado correctamente. + sidebar_content_title: "Contenido" + sections: "Secciones" + title: "Solicitud de inicio de proyecto" + no_help_text: "Este atributo no tiene texto de ayuda definido." + success: "Atributos del proyecto guardados y paquete de trabajo de artefactos creado correctamente." progress_label: "%{current} de %{total}" - create_artifact_work_package_error: No se ha podido crear el paquete de trabajo - de artefactos - create_artifact_storage_error: No se ha podido almacenar el artefacto en el - almacenamiento de archivos + create_artifact_work_package_error: "No se ha podido crear el paquete de trabajo de artefactos" + create_artifact_storage_error: "No se ha podido almacenar el artefacto en el almacenamiento de archivos" lists: create: - success: La lista modificada se ha guardado como una nueva lista - failure: 'La lista modificada no se puede guardar: %{errors}' + success: "La lista modificada se ha guardado como una nueva lista" + failure: "La lista modificada no se puede guardar: %{errors}" update: - success: La lista modificada se ha guardado - failure: 'La lista modificada no se puede guardar: %{errors}' + success: "La lista modificada se ha guardado" + failure: "La lista modificada no se puede guardar: %{errors}" publish: - success: La lista se ha hecho pública - failure: 'La lista no puede hacerse pública: %{errors}' + success: "La lista se ha hecho pública" + failure: "La lista no puede hacerse pública: %{errors}" unpublish: - success: La lista se ha hecho privada - failure: 'La lista no puede hacerse privada: %{errors}' - can_be_saved: 'Lista modificada:' - can_be_saved_as: 'Las modificaciones solo pueden guardarse en una lista nueva:' + success: "La lista se ha hecho privada" + failure: "La lista no puede hacerse privada: %{errors}" + can_be_saved: "Lista modificada:" + can_be_saved_as: "Las modificaciones solo pueden guardarse en una lista nueva:" members: index: - no_results_title_text: Actualmente no hay miembros que formen parte de este - proyecto. + no_results_title_text: Actualmente no hay miembros que formen parte de este proyecto. no_results_content_text: Añadir un miembro a este proyecto - invite_by_mail: Enviar invitación a %{mail} - send_invite_to: Enviar invitación a + invite_by_mail: "Enviar invitación a %{mail}" + send_invite_to: "Enviar invitación a" columns: - shared: Compartido + shared: "Compartido" filters: - all_shares: Todos los compartidos + all_shares: "Todos los compartidos" menu: - all: Todos - invited: Invitado - locked: Bloqueado - project_roles: Roles de proyecto - wp_shares: Comparticiones de paquete de trabajo - groups: Grupos + all: "Todos" + invited: "Invitado" + locked: "Bloqueado" + project_roles: "Roles de proyecto" + wp_shares: "Comparticiones de paquete de trabajo" + groups: "Grupos" delete_member_dialog: - title: Borrar miembro - will_remove_the_users_role: Esto borrará el rol del usuario de este proyecto. - will_remove_the_groups_role: Esto borrará el rol del grupo de este proyecto. + title: "Borrar miembro" + will_remove_the_users_role: "Esto borrará el rol del usuario de este proyecto." + will_remove_the_groups_role: "Esto borrará el rol del grupo de este proyecto." however_work_packages_shared_with_user_html: - one: Sin embargo, %{shared_work_packages_link} también se han compartido con - este usuario. - other: Sin embargo, %{shared_work_packages_link} también se han compartido - con este usuario. + one: "Sin embargo, %{shared_work_packages_link} también se han compartido con este usuario." + other: "Sin embargo, %{shared_work_packages_link} también se han compartido con este usuario." however_work_packages_shared_with_group_html: - one: Sin embargo, %{shared_work_packages_link} también se ha compartido con - este grupo. - other: Sin embargo, %{shared_work_packages_link} también se han compartido - con este grupo. - remove_work_packages_shared_with_user_too: Un usuario que ha sido eliminado - como miembro puede seguir accediendo a los paquetes de trabajo compartidos. - ¿Desea eliminar también los compartidos? - remove_work_packages_shared_with_group_too: Un grupo que ha sido eliminado como - miembro puede seguir accediendo a los paquetes de trabajo compartidos. ¿Desea - eliminar también los compartidos? - will_not_affect_inherited_shares: "(Esto no afectará a los paquetes de trabajo - compartidos con su grupo)." - can_remove_direct_but_not_shared_roles: Puede eliminar a este usuario como miembro - directo del proyecto, pero el grupo en el que se encuentra también es miembro - de este proyecto, por lo que seguirá siendo miembro a través del grupo. + one: "Sin embargo, %{shared_work_packages_link} también se ha compartido con este grupo." + other: "Sin embargo, %{shared_work_packages_link} también se han compartido con este grupo." + remove_work_packages_shared_with_user_too: "Un usuario que ha sido eliminado como miembro puede seguir accediendo a los paquetes de trabajo compartidos. ¿Desea eliminar también los compartidos?" + remove_work_packages_shared_with_group_too: "Un grupo que ha sido eliminado como miembro puede seguir accediendo a los paquetes de trabajo compartidos. ¿Desea eliminar también los compartidos?" + will_not_affect_inherited_shares: "(Esto no afectará a los paquetes de trabajo compartidos con su grupo)." + can_remove_direct_but_not_shared_roles: "Puede eliminar a este usuario como miembro directo del proyecto, pero el grupo en el que se encuentra también es miembro de este proyecto, por lo que seguirá siendo miembro a través del grupo." also_work_packages_shared_with_user_html: - one: Además, %{shared_work_packages_link} se ha compartido con este usuario. - other: Además, %{shared_work_packages_link} se han compartido con este usuario. - remove_project_membership_or_work_package_shares_too: "¿Desea eliminar solo - al usuario como miembro directo (y conservar las comparticiones) o eliminar - también las comparticiones del paquete de trabajo?" - will_remove_all_user_access_priveleges: La eliminación de este miembro eliminará - todos los privilegios de acceso del usuario al proyecto. El usuario seguirá - existiendo como parte de la instancia. - will_remove_all_group_access_priveleges: La eliminación de este miembro eliminará - todos los privilegios de acceso del grupo al proyecto. El grupo seguirá existiendo - como parte de la instancia. - cannot_delete_inherited_membership: No puede eliminar a este miembro porque - pertenece a un grupo que a su vez es miembro de este proyecto. - cannot_delete_inherited_membership_note_admin_html: Puede eliminar el grupo - como miembro del proyecto o este miembro concreto del grupo en el enlace %{administration_settings_link}. - cannot_delete_inherited_membership_note_non_admin: Puede eliminarlo como miembro - del proyecto o ponerse en contacto con su administrador para que elimine a - este miembro concreto del grupo. + one: "Además, %{shared_work_packages_link} se ha compartido con este usuario." + other: "Además, %{shared_work_packages_link} se han compartido con este usuario." + remove_project_membership_or_work_package_shares_too: "¿Desea eliminar solo al usuario como miembro directo (y conservar las comparticiones) o eliminar también las comparticiones del paquete de trabajo?" + will_remove_all_user_access_priveleges: "La eliminación de este miembro eliminará todos los privilegios de acceso del usuario al proyecto. El usuario seguirá existiendo como parte de la instancia." + will_remove_all_group_access_priveleges: "La eliminación de este miembro eliminará todos los privilegios de acceso del grupo al proyecto. El grupo seguirá existiendo como parte de la instancia." + cannot_delete_inherited_membership: "No puede eliminar a este miembro porque pertenece a un grupo que a su vez es miembro de este proyecto." + cannot_delete_inherited_membership_note_admin_html: "Puede eliminar el grupo como miembro del proyecto o este miembro concreto del grupo en el enlace %{administration_settings_link}." + cannot_delete_inherited_membership_note_non_admin: "Puede eliminarlo como miembro del proyecto o ponerse en contacto con su administrador para que elimine a este miembro concreto del grupo." delete_work_package_shares_dialog: - title: Revocar los elementos compartidos del paquete de trabajo + title: "Revocar los elementos compartidos del paquete de trabajo" shared_with_this_user_html: one: "%{all_shared_work_packages_link} se ha compartido con este usuario." other: "%{all_shared_work_packages_link} se han compartido con este usuario." @@ -1153,193 +915,148 @@ es: one: "%{all_shared_work_packages_link} se ha compartido con este grupo." other: "%{all_shared_work_packages_link} se han compartido con este grupo." shared_with_permission_html: - one: Solo %{shared_work_packages_link} se ha compartido con los permisos de - %{shared_role_name}. - other: Solo %{shared_work_packages_link} se han compartido con los permisos - de %{shared_role_name}. - revoke_all_or_with_role: "¿Desea revocar el acceso a todos los paquetes de trabajo - compartidos o solo a aquellos con permisos %{shared_role_name}?" - will_not_affect_inherited_shares: "(Esto no afectará a los paquetes de trabajo - compartidos con su grupo)." - cannot_remove_inherited: Los paquetes de trabajo compartidos a través de grupos - no pueden eliminarse. - cannot_remove_inherited_with_role: Los paquetes de trabajo compartidos con el - rol %{shared_role_name} se comparten a través de grupos y no se pueden eliminar. - cannot_remove_inherited_note_admin_html: Puede revocar la participación al grupo - o eliminar a este miembro concreto del grupo en el enlace %{administration_settings_link}. - cannot_remove_inherited_note_non_admin: Puede revocar la participación al grupo - o ponerse en contacto con su administrador para eliminar a este miembro concreto - del grupo. - will_revoke_directly_granted_access: Esta acción revocará su acceso a todos - ellos, pero a los paquetes de trabajo compartidos con un grupo. - will_revoke_access_to_all: Esta acción revocará su acceso a todos ellos. + one: "Solo %{shared_work_packages_link} se ha compartido con los permisos de %{shared_role_name}." + other: "Solo %{shared_work_packages_link} se han compartido con los permisos de %{shared_role_name}." + revoke_all_or_with_role: "¿Desea revocar el acceso a todos los paquetes de trabajo compartidos o solo a aquellos con permisos %{shared_role_name}?" + will_not_affect_inherited_shares: "(Esto no afectará a los paquetes de trabajo compartidos con su grupo)." + cannot_remove_inherited: "Los paquetes de trabajo compartidos a través de grupos no pueden eliminarse." + cannot_remove_inherited_with_role: "Los paquetes de trabajo compartidos con el rol %{shared_role_name} se comparten a través de grupos y no se pueden eliminar." + cannot_remove_inherited_note_admin_html: "Puede revocar la participación al grupo o eliminar a este miembro concreto del grupo en el enlace %{administration_settings_link}." + cannot_remove_inherited_note_non_admin: "Puede revocar la participación al grupo o ponerse en contacto con su administrador para eliminar a este miembro concreto del grupo." + will_revoke_directly_granted_access: "Esta acción revocará su acceso a todos ellos, pero a los paquetes de trabajo compartidos con un grupo." + will_revoke_access_to_all: "Esta acción revocará su acceso a todos ellos." my: access_token: dialog: token/api: - dialog_title: Crear nuevo token API - attention_text: Trate los tokens API como contraseñas. Cualquier persona - con este token tendrá acceso a la información de esta instancia, compártala - solo con usuarios de confianza. - dialog_body: Este token permitirá a las aplicaciones de terceros comunicarse - con su instancia. Para diferenciar el nuevo token de API, asígnele un - nombre. - create_button: Crear - name_label: Nombre del token + dialog_title: "Crear nuevo token API" + attention_text: "Trate los tokens API como contraseñas. Cualquier persona con este token tendrá acceso a la información de esta instancia, compártala solo con usuarios de confianza." + dialog_body: "Este token permitirá a las aplicaciones de terceros comunicarse con su instancia. Para diferenciar el nuevo token de API, asígnele un nombre." + create_button: "Crear" + name_label: "Nombre del token" created_dialog: - one_time_warning: Esta es la única vez que verá este token. Asegúrese de copiarlo - ahora. + one_time_warning: "Esta es la única vez que verá este token. Asegúrese de copiarlo ahora." token/api: - title: Se ha generado el token de API + title: "Se ha generado el token de API" token/rss: - title: Se ha generado el token de RSS - failed_to_reset_token: 'No se pudo restablecer el token de acceso: %{error}' - failed_to_create_token: 'Error al crear el token de acceso: %{error}' - failed_to_revoke_token: 'Fallo al revocar el token de acceso: %{error}' - notice_reset_token: 'Se generó un nuevo token de acceso del tipo %{type}. Su - token de acceso es:' - token_value_warning: 'Nota: Esta es la única vez que le mostraremos este token, - asegúrese de copiarlo ahora.' - no_results_title_text: Actualmente no hay tokens de acceso disponibles. - notice_api_token_revoked: Se ha eliminado el token de la API. Para crear un - nuevo token, utilice el botón de la sección API. - notice_rss_token_revoked: Se ha eliminado el token RSS. Para crear un nuevo - token, utilice el enlace de la sección RSS. - notice_ical_token_revoked: Se ha revocado el token de iCalendar «%{token_name}» - para el calendario «%{calendar_name}» del proyecto «%{project_name}». La URL - de iCalendar con este token ya no es válida. + title: "Se ha generado el token de RSS" + failed_to_reset_token: "No se pudo restablecer el token de acceso: %{error}" + failed_to_create_token: "Error al crear el token de acceso: %{error}" + failed_to_revoke_token: "Fallo al revocar el token de acceso: %{error}" + notice_reset_token: "Se generó un nuevo token de acceso del tipo %{type}. Su token de acceso es:" + token_value_warning: "Nota: Esta es la única vez que le mostraremos este token, asegúrese de copiarlo ahora." + no_results_title_text: "Actualmente no hay tokens de acceso disponibles." + notice_api_token_revoked: "Se ha eliminado el token de la API. Para crear un nuevo token, utilice el botón de la sección API." + notice_rss_token_revoked: "Se ha eliminado el token RSS. Para crear un nuevo token, utilice el enlace de la sección RSS." + notice_ical_token_revoked: 'Se ha revocado el token de iCalendar «%{token_name}» para el calendario «%{calendar_name}» del proyecto «%{project_name}». La URL de iCalendar con este token ya no es válida.' password_confirmation_dialog: - confirmation_required: Necesitas introducir la contraseña de tu cuenta para - confirmar este cambio. - title: Confirma tu contraseña para continuar + confirmation_required: "Necesitas introducir la contraseña de tu cuenta para confirmar este cambio." + title: "Confirma tu contraseña para continuar" news: index: no_results_title_text: No hay noticias sobre las que informar por el momento. no_results_content_text: Añadir un elemento de noticias roles: permissions: - section_check_all_label: Asignar todos los permisos de %{module} - section_uncheck_all_label: Quitar todos los permisos de %{module} + section_check_all_label: "Asignar todos los permisos de %{module}" + section_uncheck_all_label: "Quitar todos los permisos de %{module}" report: - matrix_caption: Matriz de permisos para el módulo %{module} - matrix_checkbox_label: Asignar el permiso de %{permission} al rol %{role} - matrix_check_all_label: Asignar los permisos de %{module} para todos los roles - matrix_uncheck_all_label: Quitar todos los permisos de %{module} de todos los - roles - matrix_check_uncheck_all_in_row_label_html: Conmutar el permiso de %{permission} - para todos los roles - matrix_check_uncheck_all_in_col_label_html: Conmutar todos los permisos de %{module} - para %{role} rol + matrix_caption: "Matriz de permisos para el módulo %{module}" + matrix_checkbox_label: "Asignar el permiso de %{permission} al rol %{role}" + matrix_check_all_label: "Asignar los permisos de %{module} para todos los roles" + matrix_uncheck_all_label: "Quitar todos los permisos de %{module} de todos los roles" + matrix_check_uncheck_all_in_row_label_html: "Conmutar el permiso de %{permission} para todos los roles" + matrix_check_uncheck_all_in_col_label_html: "Conmutar todos los permisos de %{module} para %{role} rol" users: autologins: - prompt: Permanecer conectado para %{num_days} + prompt: "Permanecer conectado para %{num_days}" sessions: session_name: "%{browser_name} %{browser_version} en %{os_name}" - browser: Navegador - expires: Expira - last_connection: Última conexión - device: Dispositivo / SO - unknown_browser: navegador desconocido - unknown_os: sistema operativo desconocido + browser: "Navegador" + expires: "Expira" + last_connection: "Última conexión" + device: "Dispositivo / SO" + unknown_browser: "navegador desconocido" + unknown_os: "sistema operativo desconocido" unknown: "(desconocido)" browser_session: "(Sesión del navegador)" - current: Actual (este dispositivo) - title: Administración de sesiones - instructions: Ha iniciado sesión en su cuenta desde los siguientes dispositivos. - Revoque las sesiones que no reconozca o que provengan de dispositivos que - no controle. - may_not_delete_current: No puede eliminar su sesión actual. - deletion_warning: "¿Seguro que desea revocar esta sesión? Se cerrará la sesión - en este dispositivo." + current: "Actual (este dispositivo)" + title: "Administración de sesiones" + instructions: "Ha iniciado sesión en su cuenta desde los siguientes dispositivos. Revoque las sesiones que no reconozca o que provengan de dispositivos que no controle." + may_not_delete_current: "No puede eliminar su sesión actual." + deletion_warning: "¿Seguro que desea revocar esta sesión? Se cerrará la sesión en este dispositivo." groups: - member_in_these_groups: 'Este usuario es miembro actualmente de los grupos siguientes:' + member_in_these_groups: "Este usuario es miembro actualmente de los grupos siguientes:" no_results_title_text: Este usuario no es miembro actualmente de ningún grupo. summary_with_more: Miembro de %{names} y %{count_link}. more: "%{count} más" summary: Miembro de %{names}. memberships: no_results_title_text: El usuario no es actualmente un miembro del proyecto. - open_profile: Abrir perfil + open_profile: "Abrir perfil" invite_user_modal: - invite: Invitar + invite: "Invitar" title: - invite: Invitar usuario - invite_to_project: Invitar a %{type} a %{project} - invite_principal_to_project: Invitar a %{principal} a %{project} + invite: "Invitar usuario" + invite_to_project: "Invitar a %{type} a %{project}" + invite_principal_to_project: "Invitar a %{principal} a %{project}" project: - label: Proyecto - required: Por favor, seleccione un proyecto - next_button: Siguiente - no_results: No se encontraron proyectos - no_invite_rights: No tiene permiso para invitar a miembros a este proyecto + label: "Proyecto" + required: "Por favor, seleccione un proyecto" + next_button: "Siguiente" + no_results: "No se encontraron proyectos" + no_invite_rights: "No tiene permiso para invitar a miembros a este proyecto" type: - required: Por favor, seleccione el tipo de miembro al que invitará + required: "Por favor, seleccione el tipo de miembro al que invitará" user: - title: Invitar usuario %{project_name} - description: Permisos basados en el rol asignado en el proyecto seleccionado + title: "Invitar usuario %{project_name}" + description: "Permisos basados en el rol asignado en el proyecto seleccionado" group: - title: Invitar grupo a %{project_name} - description: Permisos basados en el rol asignado en el proyecto seleccionado + title: "Invitar grupo a %{project_name}" + description: "Permisos basados en el rol asignado en el proyecto seleccionado" placeholder_user: - title: Añadir usuario de marcador de posición a %{project_name} - title_no_ee: Usuario de marcador de posición (extensión solo para Enterprise) - description: No tiene acceso al proyecto y no se enviarán correos electrónicos. - already_member_message: Ya es miembro de %{project} + title: "Añadir usuario de marcador de posición a %{project_name}" + title_no_ee: "Usuario de marcador de posición (extensión solo para Enterprise)" + description: "No tiene acceso al proyecto y no se enviarán correos electrónicos." + already_member_message: "Ya es miembro de %{project}" principal: - no_results_user: No se encontraron usuarios - invite_user: 'Invitar:' - no_results_placeholder: No se encontraron marcadores de posición - create_new_placeholder: 'Crear marcador de posición:' - no_results_group: No se encontraron grupos - invite_to_project: Invitar a %{project_name} + no_results_user: "No se encontraron usuarios" + invite_user: "Invitar:" + no_results_placeholder: "No se encontraron marcadores de posición" + create_new_placeholder: "Crear marcador de posición:" + no_results_group: "No se encontraron grupos" + invite_to_project: "Invitar a %{project_name}" required: - user: Seleccione un usuario - placeholder: Seleccione un marcador de posición - group: Por favor, seleccione un grupo + user: "Seleccione un usuario" + placeholder: "Seleccione un marcador de posición" + group: "Por favor, seleccione un grupo" role: - label: Rol en %{project} - no_roles_found: No se encontraron roles - description: 'Este es el rol que el usuario recibirá al unirse al proyecto. - El rol define las acciones que puede realizar y la información que pueden - ver. [Obtenga más información sobre roles y permisos.](docs_url) - - ' - required: Por favor, seleccione un rol + label: "Rol en %{project}" + no_roles_found: "No se encontraron roles" + description: > + Este es el rol que el usuario recibirá al unirse al proyecto. El rol define las acciones que puede realizar y la información que pueden ver. [Obtenga más información sobre roles y permisos.](docs_url) + required: "Por favor, seleccione un rol" message: - label: Mensaje de invitación - description: Enviaremos un correo electrónico al usuario, al cual puede añadir - un mensaje personal aquí. Una explicación sobre la invitación podría ser - útil, o bien información básica sobre el proyecto para ayudarles a empezar. + label: "Mensaje de invitación" + description: "Enviaremos un correo electrónico al usuario, al cual puede añadir un mensaje personal aquí. Una explicación sobre la invitación podría ser útil, o bien información básica sobre el proyecto para ayudarles a empezar." summary: - next_button: Enviar invitación + next_button: "Enviar invitación" success_message: - user: El usuario ya puede iniciar sesión para acceder a %{project}. Mientras - tanto, puede crear planes con ese usuario y asignarle paquetes de trabajo. - placeholder_user: El marcador de posición ya puede usarse en %{project}. Mientras - tanto, puede crear planes con ese usuario y asignarle paquetes de trabajo. - group: El grupo ya forma parte de %{project}. Mientras tanto, puede crear - planes con ese grupo y asignar paquetes de trabajo a este. + user: "El usuario ya puede iniciar sesión para acceder a %{project}. Mientras tanto, puede crear planes con ese usuario y asignarle paquetes de trabajo." + placeholder_user: "El marcador de posición ya puede usarse en %{project}. Mientras tanto, puede crear planes con ese usuario y asignarle paquetes de trabajo." + group: "El grupo ya forma parte de %{project}. Mientras tanto, puede crear planes con ese grupo y asignar paquetes de trabajo a este." page: - text: Texto + text: "Texto" placeholder_users: - right_to_manage_members_missing: 'No puede eliminar el usuario de marcador de - posición. No tiene permiso para administrar miembros en todos los proyectos - al que pertenece el usuario de marcador de posición. - - ' - delete_tooltip: Eliminar usuario de marcador de posición + right_to_manage_members_missing: > + No puede eliminar el usuario de marcador de posición. No tiene permiso para administrar miembros en todos los proyectos al que pertenece el usuario de marcador de posición. + delete_tooltip: "Eliminar usuario de marcador de posición" deletion_info: - heading: Eliminar usuario de marcador de posición %{name} - data_consequences: 'Todas las repeticiones del usuario de marcador de posición - (por ejemplo, como asignado, responsable u otros valores de usuario) se reasignarán - a una cuenta denominada «Usuario eliminado». Como los datos de todas las cuentas - eliminadas se reasignarán a esta cuenta, no podrán distinguirse los datos - del usuario de los datos creados con cualquier otra cuenta eliminada. - - ' - irreversible: Esta acción no se puede deshacer - confirmation: Escriba el nombre de usuario de marcador de posición %{name} para - confirmar la eliminación. + heading: "Eliminar usuario de marcador de posición %{name}" + data_consequences: > + Todas las repeticiones del usuario de marcador de posición (por ejemplo, como asignado, responsable u otros valores de usuario) se reasignarán a una cuenta denominada «Usuario eliminado». Como los datos de todas las cuentas eliminadas se reasignarán a esta cuenta, no podrán distinguirse los datos del usuario de los datos creados con cualquier otra cuenta eliminada. + irreversible: "Esta acción no se puede deshacer" + confirmation: "Escriba el nombre de usuario de marcador de posición %{name} para confirmar la eliminación." priorities: edit: priority_color_text: | @@ -1347,13 +1064,12 @@ es: Puede usarse para resaltar paquetes de trabajo en la tabla. admin: default: - caption: Si establece esta prioridad como predeterminada, anulará la prioridad - predeterminada anterior. + caption: Si establece esta prioridad como predeterminada, anulará la prioridad predeterminada anterior. reactions: - action_title: Reaccionar - add_reaction: Añadir reacción - react_with: Reaccionar con %{reaction} - and_user: y %{user} + action_title: "Reaccionar" + add_reaction: "Añadir reacción" + react_with: "Reaccionar con %{reaction}" + and_user: "y %{user}" and_others: one: y 1 más other: y %{count} más @@ -1367,8 +1083,8 @@ es: status_color_text: | Haga clic para asignar o cambiar el color de este estado. Se muestra en el botón de estado y puede usarse para resaltar paquetes de trabajo en la tabla. - status_default_text: Los nuevos paquetes de trabajo se establecen por defecto - en este tipo. No pueden ser de solo lectura. + status_default_text: |- + Los nuevos paquetes de trabajo se establecen por defecto en este tipo. No pueden ser de solo lectura. status_excluded_from_totals_text: |- Marque esta opción para excluir los paquetes de trabajo con este estado de los totales de Trabajo, Trabajo restante y % completado en una jerarquía. @@ -1385,92 +1101,75 @@ es: no_results_title_text: Actualmente no hay estados de paquetes de trabajo. no_results_content_text: Añadir un nuevo estado headers: - is_default: Por defecto - is_closed: Cerrado - is_readonly: Solo lectura - excluded_from_totals: Excluido de totales + is_default: "Por defecto" + is_closed: "Cerrado" + is_readonly: "Solo lectura" + excluded_from_totals: "Excluido de totales" themes: - dark: Oscuro - light: Claro - sync_with_os: Automático (coincide con el modo de color del SO) + dark: "Oscuro" + light: "Claro" + sync_with_os: "Automático (coincide con el modo de color del SO)" types: index: no_results_title_text: Actualmente no existen tipos. no_results_content_text: Crear un nuevo tipo edit: form_configuration: - tab: Configuración del formulario + tab: "Configuración del formulario" projects: tab: Proyectos enable_all: Habilitar en todos los proyectos select_projects: Seleccionar proyectos - select_projects_description: Seleccione los proyectos en los que desea utilizar - este tipo. + select_projects_description: Seleccione los proyectos en los que desea utilizar este tipo. settings: - tab: Ajustes - type_color_text: El color seleccionado distingue distintos tipos en los diagramas - de Gantt o en las tablas de paquetes de trabajo. Por lo tanto, se recomienda - usar un color intenso. + tab: "Ajustes" + type_color_text: El color seleccionado distingue distintos tipos en los diagramas de Gantt o en las tablas de paquetes de trabajo. Por lo tanto, se recomienda usar un color intenso. subject_configuration: - tab: Configuración del asunto + tab: "Configuración del asunto" manually_editable_subjects: - label: Asuntos editables manualmente - caption: Los usuarios pueden introducir y editar manualmente los asuntos - de los paquetes de trabajo sin restricciones. + label: "Asuntos editables manualmente" + caption: "Los usuarios pueden introducir y editar manualmente los asuntos de los paquetes de trabajo sin restricciones." automatically_generated_subjects: - label: Asuntos generados automáticamente - caption: Defina un patrón utilizando atributos referenciados y texto para - generar automáticamente asuntos de paquetes de trabajo. Los usuarios no - podrán editar manualmente los asuntos. + label: "Asuntos generados automáticamente" + caption: "Defina un patrón utilizando atributos referenciados y texto para generar automáticamente asuntos de paquetes de trabajo. Los usuarios no podrán editar manualmente los asuntos." token: label_with_context: "%{attribute_context}: %{attribute_label}" context: - work_package: Paquete de trabajo - parent: Principal - project: Proyecto + work_package: "Paquete de trabajo" + parent: "Principal" + project: "Proyecto" pattern: - label: Patrón del asunto - caption: Cree patrones añadiendo texto o escriba «/» para buscar [atributos - admitidos](attributes_url). + label: "Patrón del asunto" + caption: Cree patrones añadiendo texto o escriba «/» para buscar [atributos admitidos](attributes_url). insert_as_text: 'No se encontraron atributos. Añadir como texto: «%{word}»' export_configuration: - tab: Generar PDF - intro: Seleccione qué plantillas de las disponibles desea habilitar para este - tipo. La plantilla determina el diseño y los atributos visibles en el PDF - exportado de un paquete de trabajo que utilice este tipo. La primera plantilla - de la lista se selecciona por defecto. + tab: "Generar PDF" + intro: "Seleccione qué plantillas de las disponibles desea habilitar para este tipo. La plantilla determina el diseño y los atributos visibles en el PDF exportado de un paquete de trabajo que utilice este tipo. La primera plantilla de la lista se selecciona por defecto." pdf_export_templates: - label: Plantillas de exportación PDF + label: "Plantillas de exportación PDF" actions: - label_enable_all: Activar todo - label_disable_all: Desactivar todo + label_enable_all: "Activar todo" + label_disable_all: "Desactivar todo" versions: overview: - work_packages_in_archived_projects: La versión se comparte con proyectos archivados - que aún tienen paquetes de trabajo asignados a esta versión. Estos se contabilizan, - pero no aparecerán en las vistas vinculadas. - no_results_title_text: Actualmente no hay paquetes de trabajo asignados a esta - versión. + work_packages_in_archived_projects: "La versión se comparte con proyectos archivados que aún tienen paquetes de trabajo asignados a esta versión. Estos se contabilizan, pero no aparecerán en las vistas vinculadas." + no_results_title_text: Actualmente no hay paquetes de trabajo asignados a esta versión. wiki: - page_not_editable_index: La página solicitada no existe (todavía). Has sido redirigido - al inicio las páginas de la wiki. + page_not_editable_index: La página solicitada no existe (todavía). Has sido redirigido al inicio las páginas de la wiki. no_results_title_text: Actualmente no hay paginas de wiki. - print_hint: Esto imprimirá el contenido de esta página wiki sin ninguna barra - de navegación. + print_hint: Esto imprimirá el contenido de esta página wiki sin ninguna barra de navegación. index: no_results_content_text: Añadir una nueva página wiki workflows: form: - matrix_caption: Matriz de flujo de trabajo - matrix_caption_assignee: Matriz de flujo de trabajo para el asignado - matrix_caption_author: Matriz de flujo de trabajo para el autor - matrix_checkbox_label: Permitir la transición de %{old_status} a %{new_status} - matrix_check_all_label: Permitir todas las transiciones - matrix_uncheck_all_label: No permitir todas las transiciones - matrix_check_uncheck_all_in_row_label_html: Conmutar transiciones de %{old_status} - a todos los nuevos estados - matrix_check_uncheck_all_in_col_label_html: Conmutar transiciones de todos los - estados antiguos a %{new_status} + matrix_caption: "Matriz de flujo de trabajo" + matrix_caption_assignee: "Matriz de flujo de trabajo para el asignado" + matrix_caption_author: "Matriz de flujo de trabajo para el autor" + matrix_checkbox_label: "Permitir la transición de %{old_status} a %{new_status}" + matrix_check_all_label: "Permitir todas las transiciones" + matrix_uncheck_all_label: "No permitir todas las transiciones" + matrix_check_uncheck_all_in_row_label_html: "Conmutar transiciones de %{old_status} a todos los nuevos estados" + matrix_check_uncheck_all_in_col_label_html: "Conmutar transiciones de todos los estados antiguos a %{new_status}" work_flows: index: no_results_title_text: Actualmente no existen flujos de trabajo. @@ -1478,108 +1177,78 @@ es: datepicker_modal: banner: description: - automatic_mobile: Fecha de inicio derivada. - click_on_show_relations_to_open_gantt: Haga clic en «%{button_name}» para - una vista de Gantt. - manual_mobile: Ignorar las relaciones. - manual_gap_between_predecessors: Existe una brecha entre este y todos los - predecesores. - manual_overlap_with_predecessors: Se solapa con al menos un predecesor. - manual_with_children: Tiene paquetes de trabajo secundarios, pero se ignoran - sus fechas de inicio. + automatic_mobile: "Fecha de inicio derivada." + click_on_show_relations_to_open_gantt: 'Haga clic en «%{button_name}» para una vista de Gantt.' + manual_mobile: "Ignorar las relaciones." + manual_gap_between_predecessors: "Existe una brecha entre este y todos los predecesores." + manual_overlap_with_predecessors: "Se solapa con al menos un predecesor." + manual_with_children: "Tiene paquetes de trabajo secundarios, pero se ignoran sus fechas de inicio." title: - automatic_mobile: Programado automáticamente. - automatic_with_children: Fechas determinadas por paquetes de trabajo secundarios. - automatic_with_predecessor: La fecha de inicio la fija un predecesor. - manual_mobile: Programado manualmente. - manually_scheduled: Programado manualmente. Fechas no afectadas por relaciones. + automatic_mobile: "Programado automáticamente." + automatic_with_children: "Fechas determinadas por paquetes de trabajo secundarios." + automatic_with_predecessor: "La fecha de inicio la fija un predecesor." + manual_mobile: "Programado manualmente." + manually_scheduled: "Programado manualmente. Fechas no afectadas por relaciones." blankslate: - title: Sin predecesores - description: Para activar la programación automática, este paquete de trabajo - debe tener al menos un predecesor. Entonces se programará automáticamente - para que comience después del predecesor más cercano. + title: "Sin predecesores" + description: "Para activar la programación automática, este paquete de trabajo debe tener al menos un predecesor. Entonces se programará automáticamente para que comience después del predecesor más cercano." ignore_non_working_days: - title: Solo días laborables + title: "Solo días laborables" mode: - title: Modo de programación - automatic: Automático - manual: Manual - show_relations: Mostrar relaciones - update_inputs_aria_live_message: Selector de fecha actualizado. %{message} + title: "Modo de programación" + automatic: "Automático" + manual: "Manual" + show_relations: "Mostrar relaciones" + update_inputs_aria_live_message: "Selector de fecha actualizado. %{message}" tabs: - aria_label: Pestañas del selector de fechas - children: Elementos secundarios - dates: Fechas - predecessors: Predecesores - successors: Sucesores + aria_label: "Pestañas del selector de fechas" + children: "Elementos secundarios" + dates: "Fechas" + predecessors: "Predecesores" + successors: "Sucesores" blankslate: predecessors: - title: Sin predecesores - description: Este paquete de trabajo no tiene predecesores. + title: "Sin predecesores" + description: "Este paquete de trabajo no tiene predecesores." successors: - title: Sin sucesores - description: Este paquete de trabajo no tiene sucesores. + title: "Sin sucesores" + description: "Este paquete de trabajo no tiene sucesores." children: - title: Sin secundarios - description: Este paquete de trabajo no tiene ningún secundario. + title: "Sin secundarios" + description: "Este paquete de trabajo no tiene ningún secundario." x_descendants: - one: Un paquete de trabajo descendiente + one: "Un paquete de trabajo descendiente" other: "%{count} paquetes de trabajo descendientes" bulk: - copy_failed: No se pudieron copiar los paquetes de trabajo. - move_failed: No se pudieron mover los paquetes de trabajo. - could_not_be_saved: 'Los siguientes paquetes de trabajo no pudieron guardarse:' - none_could_be_saved: Ninguno de los %{total} paquetes de trabajo pudo ser actualizado. - x_out_of_y_could_be_saved: "%{failing} de %{total} paquetes de trabajo no pudieron - ser actualizados mientras que %{success} pudieron." - selected_because_descendants: Si bien se seleccionaron %{selected} paquetes - de trabajo, en total se ven afectados %{total} paquetes de trabajo que incluyen - a los descendientes. - descendant: descendiente seleccionado + copy_failed: "No se pudieron copiar los paquetes de trabajo." + move_failed: "No se pudieron mover los paquetes de trabajo." + could_not_be_saved: "Los siguientes paquetes de trabajo no pudieron guardarse:" + none_could_be_saved: "Ninguno de los %{total} paquetes de trabajo pudo ser actualizado." + x_out_of_y_could_be_saved: "%{failing} de %{total} paquetes de trabajo no pudieron ser actualizados mientras que %{success} pudieron." + selected_because_descendants: "Si bien se seleccionaron %{selected} paquetes de trabajo, en total se ven afectados %{total} paquetes de trabajo que incluyen a los descendientes." + descendant: "descendiente seleccionado" move: - no_common_statuses_exists: No hay ningún estado disponible para todos los paquetes - de trabajo seleccionados. Su estado no se puede cambiar. - unsupported_for_multiple_projects: Mover o copiar por lotes no esta soportado - para paquetes de trabajo de múltiples proyectos - current_type_not_available_in_target_project: 'El tipo actual del paquete de - trabajo no está habilitado en el proyecto de destino. Por favor, habilite - el tipo en el proyecto destino si desea que permanezca sin cambios. De lo - contrario, seleccione de la lista un tipo disponible en el proyecto de destino. - - ' - bulk_current_type_not_available_in_target_project: 'Los tipos actuales de los - paquetes de trabajo no están habilitados en el proyecto de destino. Por favor, - habilite los tipos en el proyecto destino si desea que permanezcan sin cambios. - De lo contrario, seleccione de la lista un tipo disponible en el proyecto - de destino. - - ' + no_common_statuses_exists: "No hay ningún estado disponible para todos los paquetes de trabajo seleccionados. Su estado no se puede cambiar." + unsupported_for_multiple_projects: "Mover o copiar por lotes no esta soportado para paquetes de trabajo de múltiples proyectos" + current_type_not_available_in_target_project: > + El tipo actual del paquete de trabajo no está habilitado en el proyecto de destino. Por favor, habilite el tipo en el proyecto destino si desea que permanezca sin cambios. De lo contrario, seleccione de la lista un tipo disponible en el proyecto de destino. + bulk_current_type_not_available_in_target_project: > + Los tipos actuales de los paquetes de trabajo no están habilitados en el proyecto de destino. Por favor, habilite los tipos en el proyecto destino si desea que permanezcan sin cambios. De lo contrario, seleccione de la lista un tipo disponible en el proyecto de destino. sharing: missing_workflow_warning: - title: Falta el flujo de trabajo para compartir paquetes de trabajo - message: Ningún flujo de trabajo está configurado para el rol 'Editor de paquetes - de trabajo'. Sin un flujo de trabajo, el usuario compartido no puede alterar - el estado del paquete de trabajo. Los flujos de trabajo pueden ser copiados. - Seleccione un tipo de base (por ejemplo, 'Tarea') y el rol de base (por - ejemplo, 'Miembro'). Luego seleccione los tipos de destino. Para empezar, - puede seleccionar todos los tipos como objetivos. Por último, seleccione - el papel de "Editor de paquetes de trabajo" como objetivo y presione "Copiar". - Después de haber creado así los valores predeterminados, ajuste los flujos - de trabajo como lo hace para cualquier otro rol. - link_message: Configure un flujo de trabajo en la administración. + title: "Falta el flujo de trabajo para compartir paquetes de trabajo" + message: "Ningún flujo de trabajo está configurado para el rol 'Editor de paquetes de trabajo'. Sin un flujo de trabajo, el usuario compartido no puede alterar el estado del paquete de trabajo. Los flujos de trabajo pueden ser copiados. Seleccione un tipo de base (por ejemplo, 'Tarea') y el rol de base (por ejemplo, 'Miembro'). Luego seleccione los tipos de destino. Para empezar, puede seleccionar todos los tipos como objetivos. Por último, seleccione el papel de \"Editor de paquetes de trabajo\" como objetivo y presione \"Copiar\". Después de haber creado así los valores predeterminados, ajuste los flujos de trabajo como lo hace para cualquier otro rol." + link_message: "Configure un flujo de trabajo en la administración." summary: reports: category: no_results_title_text: No hay categorias disponibles por el momento. assigned_to: - no_results_title_text: Actualmente no hay miembros que formen parte de este - proyecto. + no_results_title_text: Actualmente no hay miembros que formen parte de este proyecto. responsible: - no_results_title_text: Actualmente no hay miembros que formen parte de este - proyecto. + no_results_title_text: Actualmente no hay miembros que formen parte de este proyecto. author: - no_results_title_text: Actualmente no hay miembros que formen parte de este - proyecto. + no_results_title_text: Actualmente no hay miembros que formen parte de este proyecto. priority: no_results_title_text: No hay prioridades disponibles por el momento. type: @@ -1588,633 +1257,563 @@ es: no_results_title_text: No hay versiones disponibles por el momento. work_package_relations_tab: index: - action_bar_title: Añada relaciones a otros paquetes de trabajo para crear un - vínculo entre ellos. + action_bar_title: "Añada relaciones a otros paquetes de trabajo para crear un vínculo entre ellos." no_results_title_text: No hay relaciones disponibles por el momento. - blankslate_heading: Sin relaciones - blankslate_description: Este paquete de trabajo aún no tiene relaciones. - label_add_child_button: Secundario - label_add_x: Añadir %{x} - label_edit_x: Editar %{x} - label_add_description: Añadir descripción + blankslate_heading: "Sin relaciones" + blankslate_description: "Este paquete de trabajo aún no tiene relaciones." + label_add_child_button: "Secundario" + label_add_x: "Añadir %{x}" + label_edit_x: "Editar %{x}" + label_add_description: "Añadir descripción" lag: - subject: Retraso - caption: El número mínimo de días laborables que debe haber entre los dos paquetes - de trabajo. También puede ser un valor negativo. + subject: "Retraso" + caption: |- + El número mínimo de días laborables que debe haber entre los dos paquetes de trabajo. También puede ser un valor negativo. relations: - label_new_child_created: Nuevo paquete de trabajo creado y añadido como secundario - label_relates_singular: relacionado con - label_relates_plural: relacionado con - label_relates_to_singular: relacionado con - label_relates_to_plural: relacionado con - relates_description: Crea un vínculo visible entre los dos paquetes de trabajo - sin ningún efecto adicional - relates_to_description: Crea un vínculo visible entre los dos paquetes de trabajo - sin ningún efecto adicional - label_precedes_singular: sucesor (después) - label_precedes_plural: sucesores (después) - precedes_description: El paquete de trabajo relacionado tiene que empezar necesariamente - después de que termine este - label_follows_singular: predecesor (antes) - label_follows_plural: predecesores (antes) - follows_description: El paquete de trabajo relacionado tiene que terminar necesariamente - antes de que este pueda empezar - label_child_singular: secundario - label_child_plural: secundarios - new_child: Crear nuevo elemento secundario - new_child_description: Crea un paquete de trabajo relacionado como un subelemento - del paquete de trabajo actual (principal) - child: Elemento secundario - child_description: Hace que el paquete de trabajo relacionado sea un subelemento - del paquete de trabajo actual (principal) - parent: Principal - parent_description: Hace que el paquete de trabajo relacionado sea el paquete - de trabajo principal del paquete de trabajo actual (secundario) - label_closest: Más cercano - label_blocks_singular: bloquea - label_blocks_plural: bloques - blocks_description: El paquete de trabajo relacionado no puede cerrarse hasta - que este se cierre primero - label_blocked_singular: bloqueado por - label_blocked_plural: bloqueado por - label_blocked_by_singular: bloqueado por - label_blocked__by_plural: bloqueado por - blocked_description: Este paquete de trabajo no puede cerrarse hasta que el - relacionado se cierre primero - blocked_by_description: Este paquete de trabajo no puede cerrarse hasta que - el relacionado se cierre primero - label_duplicates_singular: duplicados - label_duplicates_plural: duplicados - duplicates_description: Esta es una copia del paquete de trabajo relacionado - label_duplicated_singular: duplicado por - label_duplicated_plural: duplicado por - label_duplicated_by_singular: duplicado por - label_duplicated_by_plural: duplicado por - duplicated_by_description: El paquete de trabajo relacionado es una copia de - este - duplicated_description: El paquete de trabajo relacionado es una copia de este - label_includes_singular: incluye - label_includes_plural: incluye - includes_description: Marca el paquete de trabajo relacionado como incluido - este sin ningún efecto adicional - label_partof_singular: parte de - label_partof_plural: parte de - label_part_of_singular: parte de - label_part_of_plural: parte de - partof_description: Marca el paquete de trabajo relacionado como parte de este - sin ningún efecto adicional - part_of_description: Marca el paquete de trabajo relacionado como parte de este - sin ningún efecto adicional - label_requires_singular: requiere - label_requires_plural: requiere - requires_description: Marca el paquete de trabajo relacionado como requisito - de este - label_required_singular: requerido por - label_required_plural: requerido por - required_description: Marca este paquete de trabajo como requisito del relacionado - label_parent_singular: principal - label_parent_plural: principal - label_other_relations: Otras relaciones - ghost_relation_title: Paquete de trabajo relacionado - ghost_relation_description: No tiene los permisos necesarios para ver esto. + label_new_child_created: "Nuevo paquete de trabajo creado y añadido como secundario" + label_relates_singular: "relacionado con" + label_relates_plural: "relacionado con" + label_relates_to_singular: "relacionado con" + label_relates_to_plural: "relacionado con" + relates_description: "Crea un vínculo visible entre los dos paquetes de trabajo sin ningún efecto adicional" + relates_to_description: "Crea un vínculo visible entre los dos paquetes de trabajo sin ningún efecto adicional" + label_precedes_singular: "sucesor (después)" + label_precedes_plural: "sucesores (después)" + precedes_description: "El paquete de trabajo relacionado tiene que empezar necesariamente después de que termine este" + label_follows_singular: "predecesor (antes)" + label_follows_plural: "predecesores (antes)" + follows_description: "El paquete de trabajo relacionado tiene que terminar necesariamente antes de que este pueda empezar" + label_child_singular: "secundario" + label_child_plural: "secundarios" + new_child: "Crear nuevo elemento secundario" + new_child_description: "Crea un paquete de trabajo relacionado como un subelemento del paquete de trabajo actual (principal)" + child: "Elemento secundario" + child_description: "Hace que el paquete de trabajo relacionado sea un subelemento del paquete de trabajo actual (principal)" + parent: "Principal" + parent_description: "Hace que el paquete de trabajo relacionado sea el paquete de trabajo principal del paquete de trabajo actual (secundario)" + label_closest: "Más cercano" + label_blocks_singular: "bloquea" + label_blocks_plural: "bloques" + blocks_description: "El paquete de trabajo relacionado no puede cerrarse hasta que este se cierre primero" + label_blocked_singular: "bloqueado por" + label_blocked_plural: "bloqueado por" + label_blocked_by_singular: "bloqueado por" + label_blocked__by_plural: "bloqueado por" + blocked_description: "Este paquete de trabajo no puede cerrarse hasta que el relacionado se cierre primero" + blocked_by_description: "Este paquete de trabajo no puede cerrarse hasta que el relacionado se cierre primero" + label_duplicates_singular: "duplicados" + label_duplicates_plural: "duplicados" + duplicates_description: "Esta es una copia del paquete de trabajo relacionado" + label_duplicated_singular: "duplicado por" + label_duplicated_plural: "duplicado por" + label_duplicated_by_singular: "duplicado por" + label_duplicated_by_plural: "duplicado por" + duplicated_by_description: "El paquete de trabajo relacionado es una copia de este" + duplicated_description: "El paquete de trabajo relacionado es una copia de este" + label_includes_singular: "incluye" + label_includes_plural: "incluye" + includes_description: "Marca el paquete de trabajo relacionado como incluido este sin ningún efecto adicional" + label_partof_singular: "parte de" + label_partof_plural: "parte de" + label_part_of_singular: "parte de" + label_part_of_plural: "parte de" + partof_description: "Marca el paquete de trabajo relacionado como parte de este sin ningún efecto adicional" + part_of_description: "Marca el paquete de trabajo relacionado como parte de este sin ningún efecto adicional" + label_requires_singular: "requiere" + label_requires_plural: "requiere" + requires_description: "Marca el paquete de trabajo relacionado como requisito de este" + label_required_singular: "requerido por" + label_required_plural: "requerido por" + required_description: "Marca este paquete de trabajo como requisito del relacionado" + label_parent_singular: "principal" + label_parent_plural: "principal" + label_other_relations: "Otras relaciones" + ghost_relation_title: "Paquete de trabajo relacionado" + ghost_relation_description: "No tiene los permisos necesarios para ver esto." label_invitation: Invitación account: - delete: Borrar cuenta + delete: "Borrar cuenta" delete_confirmation: "¿Está seguro que desea eliminar la cuenta?" - deletion_pending: La cuenta está programada para su eliminación. Tenga en cuenta - que este proceso tiene lugar en segundo plano. Puede tardar un tiempo hasta - que el usuario se borre por completo. + deletion_pending: "La cuenta está programada para su eliminación. Tenga en cuenta que este proceso tiene lugar en segundo plano. Puede tardar un tiempo hasta que el usuario se borre por completo." deletion_info: data_consequences: - other: Se eliminarán todos los datos específicos del usuario. La actividad - del usuario en vistas compartidas, como paquetes de trabajo y reuniones, - no se eliminará, sino que se asociará a un «usuario eliminado» genérico - que no se puede vincular a la cuenta original. - self: Se eliminarán todos los datos específicos del usuario. Tu actividad - en vistas compartidas, como paquetes de trabajo y reuniones, no se eliminará, - sino que se asociará a un «usuario eliminado» genérico que no se podrá vincular - a tu cuenta original. + other: "Se eliminarán todos los datos específicos del usuario. La actividad del usuario en vistas compartidas, como paquetes de trabajo y reuniones, no se eliminará, sino que se asociará a un «usuario eliminado» genérico que no se puede vincular a la cuenta original." + self: "Se eliminarán todos los datos específicos del usuario. Tu actividad en vistas compartidas, como paquetes de trabajo y reuniones, no se eliminará, sino que se asociará a un «usuario eliminado» genérico que no se podrá vincular a tu cuenta original." heading: "¿Eliminar la cuenta de %{name}?" login_consequences: - other: Esta cuenta se eliminará inmediatamente del sistema y el usuario ya - no podrá iniciar sesión con sus credenciales. - self: Tu cuenta se eliminará inmediatamente del sistema y ya no podrás iniciar - sesión con tus credenciales. - error_inactive_activation_by_mail: 'Su cuenta aún no está activada. Para activar - su cuenta, haga clic en el enlace que fue enviado a su correo electrónico. - - ' - error_inactive_manual_activation: 'Su cuenta aún no está activada. Por favor, - espere a que el administrador active su cuenta. - - ' - error_self_registration_disabled: 'El registro de usuarios está deshabilitado - en este sistema. Por favor pida a un administrador que cree una cuenta para - usted. - - ' - error_self_registration_limited_provider: 'El registro de usuarios está limitado - para el proveedor de inicio de sesión único ''%{name}''. Por favor, pida a un - administrador que active la cuenta para usted o cambie el límite de auto-registro - para este proveedor. - - ' - login_with_auth_provider: o inicie sesión con su cuenta existente - signup_with_auth_provider: o regístrate usando - auth_source_login: Por favor, inicia sesión como %{login} para activar - tu cuenta. + other: "Esta cuenta se eliminará inmediatamente del sistema y el usuario ya no podrá iniciar sesión con sus credenciales." + self: "Tu cuenta se eliminará inmediatamente del sistema y ya no podrás iniciar sesión con tus credenciales." + error_inactive_activation_by_mail: > + Su cuenta aún no está activada. Para activar su cuenta, haga clic en el enlace que fue enviado a su correo electrónico. + error_inactive_manual_activation: > + Su cuenta aún no está activada. Por favor, espere a que el administrador active su cuenta. + error_self_registration_disabled: > + El registro de usuarios está deshabilitado en este sistema. Por favor pida a un administrador que cree una cuenta para usted. + error_self_registration_limited_provider: > + El registro de usuarios está limitado para el proveedor de inicio de sesión único '%{name}'. Por favor, pida a un administrador que active la cuenta para usted o cambie el límite de auto-registro para este proveedor. + login_with_auth_provider: "o inicie sesión con su cuenta existente" + signup_with_auth_provider: "o regístrate usando" + auth_source_login: Por favor, inicia sesión como %{login} para activar tu cuenta. omniauth_login: Por favor inicie sesión para activar su cuenta. - actionview_instancetag_blank_option: Por favor, elija + actionview_instancetag_blank_option: "Por favor, elija" activemodel: attributes: projects/copy_options: - dependencies: Dependencias + dependencies: "Dependencias" activerecord: attributes: jira_import: - projects: Proyectos - import/jira: - name: Nombre de instancia de Jira - url: URL de instancia de Jira - personal_access_token: Token de acceso personal + projects: "Proyectos" + "import/jira": + name: "Nombre de instancia de Jira" + url: "URL de instancia de Jira" + personal_access_token: "Token de acceso personal" announcements: - show_until: Mostrar hasta + show_until: "Mostrar hasta" attachment: - attachment_content: Contenido del archivo adjunto - attachment_file_name: Nombre de archivo adjunto - content_type: Tipo de contenido - downloads: Descargas - file: Archivo - filename: Archivo - filesize: Tamaño + attachment_content: "Contenido del archivo adjunto" + attachment_file_name: "Nombre de archivo adjunto" + content_type: "Tipo de contenido" + downloads: "Descargas" + file: "Archivo" + filename: "Archivo" + filesize: "Tamaño" attribute_help_text: - attribute_name: Atributo - help_text: Texto de ayuda - caption: Título + attribute_name: "Atributo" + help_text: "Texto de ayuda" + caption: "Título" auth_provider: - scim_clients: Clientes SCIM + scim_clients: "Clientes SCIM" calculated_value_error: - error_code: Codigo de error - customized_id: ID personalizado - customized_type: Tipo personalizado + error_code: "Codigo de error" + customized_id: "ID personalizado" + customized_type: "Tipo personalizado" capability: - context: Contexto + context: "Contexto" changeset: - repository: Repositorio + repository: "Repositorio" comment: - commented: Comentado + commented: "Comentado" #an object that this comment belongs to custom_action: - actions: Acciones + actions: "Acciones" custom_field: - allow_non_open_versions: Permitir versiones no abiertas - default_value: Valor predeterminado - editable: Editable - field_format: Formato - formula: Fórmula - is_filter: Usado como filtro - is_for_all: Para todos los proyectos - is_required: Obligatorio - max_length: Longitud máxima - min_length: Longitud mínima - content_right_to_left: Contenido de derecha a izquierda - multi_value: Permitir selección múltiple - possible_values: Valores posibles - regexp: Expresión regular - searchable: Buscable - admin_only: Solo administradores - has_comment: Añadir un campo de texto de comentario + allow_non_open_versions: "Permitir versiones no abiertas" + default_value: "Valor predeterminado" + editable: "Editable" + field_format: "Formato" + formula: "Fórmula" + is_filter: "Usado como filtro" + is_for_all: "Para todos los proyectos" + is_required: "Obligatorio" + max_length: "Longitud máxima" + min_length: "Longitud mínima" + content_right_to_left: "Contenido de derecha a izquierda" + multi_value: "Permitir selección múltiple" + possible_values: "Valores posibles" + regexp: "Expresión regular" + searchable: "Buscable" + admin_only: "Solo administradores" + has_comment: "Añadir un campo de texto de comentario" custom_value: - value: Valor + value: "Valor" design_color: - variable: Variable + variable: "Variable" doorkeeper/application: - uid: ID de cliente - secret: Clave de cliente secreta - owner: Propietario - builtin: Incorporado - enabled: Activo - redirect_uri: Redireccionar URI - client_credentials_user_id: ID de Usuario de Credenciales del Cliente - scopes: Ámbitos - confidential: Confidencial + uid: "ID de cliente" + secret: "Clave de cliente secreta" + owner: "Propietario" + builtin: "Incorporado" + enabled: "Activo" + redirect_uri: "Redireccionar URI" + client_credentials_user_id: "ID de Usuario de Credenciales del Cliente" + scopes: "Ámbitos" + confidential: "Confidencial" emoji_reaction: - reactable: Reaccionó el + reactable: "Reaccionó el" enterprise_token: - starts_at: Válido desde - subscriber: Suscriptor - subscription: Suscripción - plan: Plan - encoded_token: Token de soporte de Enterprise - active_user_count_restriction: Usuarios activos + starts_at: "Válido desde" + subscriber: "Suscriptor" + subscription: "Suscripción" + plan: "Plan" + encoded_token: "Token de soporte de Enterprise" + active_user_count_restriction: "Usuarios activos" enterprise_trial: - company: Empresa + company: "Empresa" favorite: - favorited: Elemento + favorited: "Elemento" grids/grid: - page: Página - row_count: Número de filas - column_count: Número de columnas - widgets: Widgets + page: "Página" + row_count: "Número de filas" + column_count: "Número de columnas" + widgets: "Widgets" journal: - notes: Notas - cause_type: Tipo de causa + notes: "Notas" + cause_type: "Tipo de causa" ldap_auth_source: - account: Cuenta - attr_firstname: Atributo Nombre - attr_lastname: Atributo Apellido - attr_login: Atributo Nombre de usuario - attr_mail: Atributo Correo electrónico - filter_string: Texto del filtro - admin: Administrador - base_dn: Base DN - host: Host - onthefly: Creación automática de usuarios - port: Puerto - tls_certificate_string: Certificado SSL del servidor LDAP + account: "Cuenta" + attr_firstname: "Atributo Nombre" + attr_lastname: "Atributo Apellido" + attr_login: "Atributo Nombre de usuario" + attr_mail: "Atributo Correo electrónico" + filter_string: "Texto del filtro" + admin: "Administrador" + base_dn: "Base DN" + host: "Host" + onthefly: "Creación automática de usuarios" + port: "Puerto" + tls_certificate_string: "Certificado SSL del servidor LDAP" mcp_configuration: enabled: Habilitado title: Título description: Descripción member: - roles: Perfiles + roles: "Perfiles" notification: - read_ian: Leer dentro de la aplicación - resource: Recurso + read_ian: "Leer dentro de la aplicación" + resource: "Recurso" oauth_client: - client: ID de cliente + client: "ID de cliente" project: active_value: - true: desarchivado - false: archivado - attribute_groups: Grupos de atributos - description: Descripción - enabled_modules: Módulos activados - identifier: Identificador - latest_activity_at: Última actividad en - parent: Subproyecto de - project_creation_wizard_enabled: Solicitud de inicio de proyecto + true: "desarchivado" + false: "archivado" + attribute_groups: "Grupos de atributos" + description: "Descripción" + enabled_modules: "Módulos activados" + identifier: "Identificador" + latest_activity_at: "Última actividad en" + parent: "Subproyecto de" + project_creation_wizard_enabled: "Solicitud de inicio de proyecto" public_value: - title: Visibilidad - true: público - false: privado - queries: Consultas - status_code: Estado - status_explanation: Descripción del estado + title: "Visibilidad" + true: "público" + false: "privado" + queries: "Consultas" + status_code: "Estado" + status_explanation: "Descripción del estado" status_codes: - not_started: No iniciado - on_track: Según lo previsto - at_risk: En riesgo - off_track: Fuera de lo previsto - finished: Terminado - discontinued: Interrumpido - project_creation_wizard_assignee_custom_field: Asignado cuando se envía - project_creation_wizard_notification_text: Texto de la notificación - project_creation_wizard_send_confirmation_email: Email de confirmación - project_creation_wizard_status_when_submitted: Estado al enviar - project_creation_wizard_work_package_comment: Comentario del paquete de trabajo - project_creation_wizard_work_package_type: Tipo de paquete de trabajo - template: Plantilla - templated: Plantilla del proyecto + not_started: "No iniciado" + on_track: "Según lo previsto" + at_risk: "En riesgo" + off_track: "Fuera de lo previsto" + finished: "Terminado" + discontinued: "Interrumpido" + project_creation_wizard_assignee_custom_field: "Asignado cuando se envía" + project_creation_wizard_notification_text: "Texto de la notificación" + project_creation_wizard_send_confirmation_email: "Email de confirmación" + project_creation_wizard_status_when_submitted: "Estado al enviar" + project_creation_wizard_work_package_comment: "Comentario del paquete de trabajo" + project_creation_wizard_work_package_type: "Tipo de paquete de trabajo" + template: "Plantilla" + templated: "Plantilla del proyecto" templated_value: - true: marcar como plantilla - false: desmarcar como plantilla - types: Tipos - versions: Versiones - work_packages: Paquetes de trabajo - workspace_type: Tipo de área de trabajo + true: "marcar como plantilla" + false: "desmarcar como plantilla" + types: "Tipos" + versions: "Versiones" + work_packages: "Paquetes de trabajo" + workspace_type: "Tipo de área de trabajo" project_custom_field: custom_field_section: Sección subproject_template_assignment: - workspace_type: Tipo de área de trabajo + workspace_type: "Tipo de área de trabajo" project/phase: - date_range: Intervalo de fechas - definition: Definición - duration: Duración - start_date: Fecha de inicio - start_date_caption: Sigue a la fase anterior. - finish_date: Fecha de finalización + date_range: "Intervalo de fechas" + definition: "Definición" + duration: "Duración" + start_date: "Fecha de inicio" + start_date_caption: "Sigue a la fase anterior." + finish_date: "Fecha de finalización" project/phase_definition: - name: Nombre - color: Color - start_gate: Puerta de fase inicial - start_gate_name: Nombre de la puerta de fase inicial - finish_gate: Puerta de fase final - finish_gate_name: Nombre de la puerta de fase final + name: "Nombre" + color: "Color" + start_gate: "Puerta de fase inicial" + start_gate_name: "Nombre de la puerta de fase inicial" + finish_gate: "Puerta de fase final" + finish_gate_name: "Nombre de la puerta de fase final" query: - sums: Sumas - columns: Columnas - column_names: Columnas - relations_to_type_column: Relaciones con %{type} - relations_of_type_column: Relaciones de %{type} - child_work_packages: Paquetes de trabajo secundarios - group_by: Resultados de grupo por - sort_by: Ordenar resultados por - filters: Filtros - timeline_labels: Etiquetas de cronograma - timeline_visible: Mostrar diagrama de Gantt - timeline_zoom_level: Nivel de zoom del diagrama de Gantt - timestamps: Marcas de tiempo de referencia - sort_criteria: Criterios de clasificación - highlighted_attributes: Atributos destacados - highlighting_mode: Modo resaltado - display_representation: Modo de visualización - show_hierarchies: Modo de visualización - starred: Favorito - hidden: Oculto - manual_sorting: Orden de clasificación manual - ordered_work_packages: Orden de paquetes de trabajo - include_subprojects: Incluir subproyectos - results: Resultados + sums: "Sumas" + columns: "Columnas" + column_names: "Columnas" + relations_to_type_column: "Relaciones con %{type}" + relations_of_type_column: "Relaciones de %{type}" + child_work_packages: "Paquetes de trabajo secundarios" + group_by: "Resultados de grupo por" + sort_by: "Ordenar resultados por" + filters: "Filtros" + timeline_labels: "Etiquetas de cronograma" + timeline_visible: "Mostrar diagrama de Gantt" + timeline_zoom_level: "Nivel de zoom del diagrama de Gantt" + timestamps: "Marcas de tiempo de referencia" + sort_criteria: "Criterios de clasificación" + highlighted_attributes: "Atributos destacados" + highlighting_mode: "Modo resaltado" + display_representation: "Modo de visualización" + show_hierarchies: "Modo de visualización" + starred: "Favorito" + hidden: "Oculto" + manual_sorting: "Orden de clasificación manual" + ordered_work_packages: "Orden de paquetes de trabajo" + include_subprojects: "Incluir subproyectos" + results: "Resultados" relation: - lag: Retraso - from: Paquete de trabajo relacionado - to: Paquete de trabajo relacionado - relation_type: Tipo de relación + lag: "Retraso" + from: "Paquete de trabajo relacionado" + to: "Paquete de trabajo relacionado" + relation_type: "Tipo de relación" reminder: - remindable: Objeto recordado - remind_at: Recordar a las - remind_at_date: Fecha - remind_at_time: Hora + remindable: "Objeto recordado" + remind_at: "Recordar a las" + remind_at_date: "Fecha" + remind_at_time: "Hora" reminder_notification: - notification: Notificación + notification: "Notificación" repository: - url: URL + url: "URL" role: - permissions: Permisos + permissions: "Permisos" scim_client: - authentication_method: Método de autenticación - jwt_sub: Reclamación de asunto + authentication_method: "Método de autenticación" + jwt_sub: "Reclamación de asunto" status: - is_closed: Paquete de trabajo cerrado - is_readonly: Paquete de trabajo de solo lectura - excluded_from_totals: Excluir del cálculo de totales en la jerarquía + is_closed: "Paquete de trabajo cerrado" + is_readonly: "Paquete de trabajo de solo lectura" + excluded_from_totals: "Excluir del cálculo de totales en la jerarquía" default_done_ratio: "% compleado" token/named: - token_name: Nombre del token + token_name: "Nombre del token" token/ical: - calendar: Calendario - ical_token_query_assignment: Asignación de consultas + calendar: "Calendario" + ical_token_query_assignment: "Asignación de consultas" time_entry: - activity: Actividad - hours: Horas - spent_on: Fecha - type: Tipo - ongoing: En curso + activity: "Actividad" + hours: "Horas" + spent_on: "Fecha" + type: "Tipo" + ongoing: "En curso" type: - description: Texto predeterminado para descripción - attribute_groups: Configuración del formulario - is_in_roadmap: Mostrado en la hoja de ruta de forma predeterminada - is_default: Activado para nuevos proyectos de forma predeterminada - is_milestone: Es un hito - color: Color - patterns: Patrones + description: "Texto predeterminado para descripción" + attribute_groups: "Configuración del formulario" + is_in_roadmap: "Mostrado en la hoja de ruta de forma predeterminada" + is_default: "Activado para nuevos proyectos de forma predeterminada" + is_milestone: "Es un hito" + color: "Color" + patterns: "Patrones" remote_identity: - auth_source: Fuente de autenticación - integration: Integración - user: Usuario + auth_source: "Fuente de autenticación" + integration: "Integración" + user: "Usuario" user: - admin: Administrador - auth_source: Fuente de autentificación - ldap_auth_source: Conexión LDAP - identity_url: URL de identidad - current_password: Contraseña actual - force_password_change: Aplicar el cambio de contraseña en el proximo inicio - de sesión - language: Idioma - last_login_on: Ultimó acceso - failed_login_count: Intentos de inicio de sesión fallidos - first_name: Nombre - last_name: Apellidos - first_login: Primer inicio de sesión - new_password: Nueva contraseña - password_confirmation: Confirmación - consented_at: Consentido en + admin: "Administrador" + auth_source: "Fuente de autentificación" + ldap_auth_source: "Conexión LDAP" + identity_url: "URL de identidad" + current_password: "Contraseña actual" + force_password_change: "Aplicar el cambio de contraseña en el proximo inicio de sesión" + language: "Idioma" + last_login_on: "Ultimó acceso" + failed_login_count: "Intentos de inicio de sesión fallidos" + first_name: "Nombre" + last_name: "Apellidos" + first_login: "Primer inicio de sesión" + new_password: "Nueva contraseña" + password_confirmation: "Confirmación" + consented_at: "Consentido en" group: - identity_url: URL de identidad + identity_url: "URL de identidad" user_preference: - header_look_and_feel: Apariencia - header_alerts: Alertas - button_update_look_and_feel: Actualizar apariencia - button_update_alerts: Actualizar alertas - button_update_user_information: Actualizar perfil - comments_sorting: Mostrar la actividad del paquete de trabajo ordenada por - disable_keyboard_shortcuts: Deshabilitar atajos de teclado - disable_keyboard_shortcuts_caption_html: Puede optar por deshabilitar los - atajos de teclado predeterminados si utiliza un lector - de pantalla o desea evitar activar accidentalmente una acción con un atajo. - dismissed_enterprise_banners: Banners empresariales ocultos - impaired: Modo de accesibilidad - auto_hide_popups: Ocultar automáticamente los banners de éxito - auto_hide_popups_caption: Si se habilitan, los banners verdes de éxito desaparecerán - automáticamente al cabo de 5 segundos. - warn_on_leaving_unsaved: Avisarme cuando salga de un paquete de trabajo con - cambios sin guardar - increase_theme_contrast: Aumentar el contraste del tema - increase_contrast: Aumentar contraste - increase_contrast_caption: Activa el modo de alto contraste para el modo de - color seleccionado. - force_light_theme_contrast: Forzar alto contraste en modo claro - force_dark_theme_contrast: Forzar alto contraste en modo oscuro - force_light_theme_contrast_caption: Utiliza la versión de alto contraste del - modo claro cuando se selecciona el modo de color automático. - force_dark_theme_contrast_caption: Utiliza la versión de alto contraste del - modo oscuro cuando se selecciona el modo de color automático. - theme: Modo de color - time_zone: Zona horaria - mode_guideline: Algunos modos sobrescribirán los colores de los temas personalizados - por motivos de accesibilidad y legibilidad. Seleccione el modo Claro para - obtener una compatibilidad total con los temas personalizados. - daily_reminders: Recordatorios diarios - workdays: Días laborables + header_look_and_feel: "Apariencia" + header_alerts: "Alertas" + button_update_look_and_feel: "Actualizar apariencia" + button_update_alerts: "Actualizar alertas" + button_update_user_information: "Actualizar perfil" + comments_sorting: "Mostrar la actividad del paquete de trabajo ordenada por" + disable_keyboard_shortcuts: "Deshabilitar atajos de teclado" + disable_keyboard_shortcuts_caption_html: |- + Puede optar por deshabilitar los atajos de teclado predeterminados si utiliza un lector de pantalla o desea evitar activar accidentalmente una acción con un atajo. + dismissed_enterprise_banners: "Banners empresariales ocultos" + impaired: "Modo de accesibilidad" + auto_hide_popups: "Ocultar automáticamente los banners de éxito" + auto_hide_popups_caption: "Si se habilitan, los banners verdes de éxito desaparecerán automáticamente al cabo de 5 segundos." + warn_on_leaving_unsaved: "Avisarme cuando salga de un paquete de trabajo con cambios sin guardar" + increase_theme_contrast: "Aumentar el contraste del tema" + increase_contrast: "Aumentar contraste" + increase_contrast_caption: "Activa el modo de alto contraste para el modo de color seleccionado." + force_light_theme_contrast: "Forzar alto contraste en modo claro" + force_dark_theme_contrast: "Forzar alto contraste en modo oscuro" + force_light_theme_contrast_caption: "Utiliza la versión de alto contraste del modo claro cuando se selecciona el modo de color automático." + force_dark_theme_contrast_caption: "Utiliza la versión de alto contraste del modo oscuro cuando se selecciona el modo de color automático." + theme: "Modo de color" + time_zone: "Zona horaria" + mode_guideline: "Algunos modos sobrescribirán los colores de los temas personalizados por motivos de accesibilidad y legibilidad. Seleccione el modo Claro para obtener una compatibilidad total con los temas personalizados." + daily_reminders: "Recordatorios diarios" + workdays: "Días laborables" users/invitation/form_model: - principal_type: Tipo de invitación - id_or_email: Nombre o dirección de correo electrónico + principal_type: "Tipo de invitación" + id_or_email: "Nombre o dirección de correo electrónico" version: - effective_date: Fecha de finalización - sharing: Compartiendo + effective_date: "Fecha de finalización" + sharing: "Compartiendo" wiki_content: - text: Texto + text: "Texto" wiki_page: - parent_title: Página Padre - redirect_existing_links: Redirigir los enlaces existentes - text: Contenido de la página + parent_title: "Página Padre" + redirect_existing_links: "Redirigir los enlaces existentes" + text: "Contenido de la página" work_package: - ancestor: Descendientes de - begin_insertion: Inicio de la inserción - begin_deletion: Inicio de la eliminación - children: Subelementos + ancestor: "Descendientes de" #used for filtering of work packages that are descendants of a given work package + begin_insertion: "Inicio de la inserción" + begin_deletion: "Inicio de la eliminación" + children: "Subelementos" derived_done_ratio: "% total completado" - derived_remaining_hours: Trabajo restante total - derived_remaining_time: Trabajo restante total + derived_remaining_hours: "Trabajo restante total" + derived_remaining_time: "Trabajo restante total" done_ratio: "% Completado" - duration: Duración - end_insertion: Final de la inserción - end_deletion: Final de la eliminación - ignore_non_working_days: Ignorar días festivos + duration: "Duración" + end_insertion: "Final de la inserción" + end_deletion: "Final de la eliminación" + ignore_non_working_days: "Ignorar días festivos" include_non_working_days: - title: Días laborables - false: solo días laborables - true: incluir días no laborables + title: "Días laborables" + false: "solo días laborables" + true: "incluir días no laborables" journal_internal: Diario interno - notify: Notificar - parent: Padre - parent_issue: Padre - parent_work_package: Padre - priority: Prioridad + notify: "Notificar" #used in custom actions + parent: "Padre" + parent_issue: "Padre" + parent_work_package: "Padre" + priority: "Prioridad" progress: "% Completado" - readonly: Solo lectura - remaining_hours: Trabajo restante - remaining_time: Trabajo restante - shared_with_users: Compartido con - schedule_manually: Programación manual - spent_hours: Tiempo invertido - spent_time: Tiempo invertido - subproject: Subproyecto - time_entries: Registro de tiempo - type: Tipo - version: Versión - watcher: Observador + readonly: "Solo lectura" + remaining_hours: "Trabajo restante" + remaining_time: "Trabajo restante" + shared_with_users: "Compartido con" + schedule_manually: "Programación manual" + spent_hours: "Tiempo invertido" + spent_time: "Tiempo invertido" + subproject: "Subproyecto" + time_entries: "Registro de tiempo" + type: "Tipo" + version: "Versión" + watcher: "Observador" errors: messages: - accepted: debe ser aceptado. - after: debe ser después de %{date}. - after_today: debe ser en el futuro. - after_or_equal_to: debe ser después de o igual a %{date}. - before: debe ser antes de %{date}. - before_or_equal_to: debe ser antes o igual a %{date}. - blank: no puede estar en blanco. - 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}. + accepted: "debe ser aceptado." + after: "debe ser después de %{date}." + after_today: "debe ser en el futuro." + after_or_equal_to: "debe ser después de o igual a %{date}." + before: "debe ser antes de %{date}." + before_or_equal_to: "debe ser antes o igual a %{date}." + blank: "no puede estar en blanco." + 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)." - does_not_exist: no existe. + does_not_exist: "no existe." 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. - error_conflict: La información ha sido actualizada por al menos otro usuario - mientras tanto. - error_not_found: no encontrado. - email: no es una dirección de correo válida. - empty: No puede estar vacío. - enterprise_plan_required: requiere al menos el plan %{plan_name}. - even: debe ser incluido. - exclusion: está reservado. + error_unauthorized: "no se puede acceder." + error_readonly: "se intentó escribir pero no se puede escribir." + error_conflict: "La información ha sido actualizada por al menos otro usuario mientras tanto." + error_not_found: "no encontrado." + email: "no es una dirección de correo válida." + empty: "No puede estar vacío." + enterprise_plan_required: "requiere al menos el plan %{plan_name}." + even: "debe ser incluido." + exclusion: "está reservado." feature_disabled: no está disponible. feature_disabled_for_project: está desactivado para este proyecto. - file_too_large: es demasiado grande (el tamaño máximo es de %{count} Bytes). - filter_does_not_exist: el filtro no existe. - format: no coincide con el formato esperado '%{expected}'. - format_nested: no coincide con el formato esperado '%{expected}' en la ruta - '%{path}'. - greater_than: debe ser mayor que %{count}. - 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. - 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_url: no es una URL válida. - invalid_url_scheme: 'no es un protocolo admitido (permitidos: %{allowed_schemes}).' - 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_deletable: no se puede eliminar. - not_current_user: no es el usuario actual. - only_one_active_sprint_allowed: solo se permite un sprint activo por proyecto. - 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. - 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. - 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. - 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}). - type_mismatch: no es del tipo «%{type}» - type_mismatch_nested: no es del tipo «%{type}» en la ruta «%{path}» - unchangeable: no se puede cambiar. - unknown_property: no es una propiedad conocida. - unknown_property_nested: tiene la ruta de acceso desconocida «%{path}». - unremovable: no puede ser eliminado. - url_not_secure_context: 'no está proveyendo un "Contexto Seguro". Utiliza - HTTPS o una dirección loopack, como un localhost. - - ' - wrong_length: la longitud es incorrecta (debe ser %{count} caracteres). + file_too_large: "es demasiado grande (el tamaño máximo es de %{count} Bytes)." + filter_does_not_exist: "el filtro no existe." + format: "no coincide con el formato esperado '%{expected}'." + format_nested: "no coincide con el formato esperado '%{expected}' en la ruta '%{path}'." + greater_than: "debe ser mayor que %{count}." + 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." + 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_url: "no es una URL válida." + invalid_url_scheme: "no es un protocolo admitido (permitidos: %{allowed_schemes})." + 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_deletable: "no se puede eliminar." + not_current_user: "no es el usuario actual." + only_one_active_sprint_allowed: "solo se permite un sprint activo por proyecto." + 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." + 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." + 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." + 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})." + type_mismatch: "no es del tipo «%{type}»" + type_mismatch_nested: "no es del tipo «%{type}» en la ruta «%{path}»" + unchangeable: "no se puede cambiar." + unknown_property: "no es una propiedad conocida." + unknown_property_nested: "tiene la ruta de acceso desconocida «%{path}»." + unremovable: "no puede ser eliminado." + url_not_secure_context: > + no está proveyendo un "Contexto Seguro". Utiliza HTTPS o una dirección loopack, como un localhost. + wrong_length: "la longitud es incorrecta (debe ser %{count} caracteres)." models: ldap_auth_source: attributes: tls_certificate_string: - invalid_certificate: 'El certificado SSL proporcionado no es válido: - %{additional_message}' + invalid_certificate: "El certificado SSL proporcionado no es válido: %{additional_message}" format: "%{message}" attachment: attributes: content_type: - blank: El tipo de contenido del archivo no puede estar en blanco. - not_allowlisted: Un filtro automático ha rechazado el archivo. No se - permite «%{value}» en la carga. + blank: "El tipo de contenido del archivo no puede estar en blanco." + not_allowlisted: "Un filtro automático ha rechazado el archivo. No se permite «%{value}» en la carga." format: "%{message}" capability: context: - global: Global + global: "Global" query: filters: - minimum: necesita incluir como mínimo un filtro de entidad de seguridad, - contexto o identificador con el operador «=». + minimum: "necesita incluir como mínimo un filtro de entidad de seguridad, contexto o identificador con el operador «=»." custom_field: - at_least_one_custom_option: Como mínimo, tiene que estar disponible una - opción. - previous_custom_field_recalculation_unprocessed: El recálculo de los cambios - anteriores para este campo personalizado aún no se ha aplicado. Inténtalo - de nuevo en unos minutos. + at_least_one_custom_option: "Como mínimo, tiene que estar disponible una opción." + previous_custom_field_recalculation_unprocessed: "El recálculo de los cambios anteriores para este campo personalizado aún no se ha aplicado. Inténtalo de nuevo en unos minutos." referenced_in_other_fields_html: one: "%{name} se utiliza en el cálculo de atributos del proyecto %{links}." - other: "%{name} se utiliza en los cálculos de atributos del proyecto: - %{links}." + other: "%{name} se utiliza en los cálculos de atributos del proyecto: %{links}." attributes: formula: - blank: La fórmula no puede estar en blanco. - invalid: La fórmula no es válida. - invalid_characters: Solo se permiten valores numéricos, operadores matemáticos - y atributos de proyecto de tipo entero, flotante, valor calculado - y lista ponderada. - not_allowed_custom_fields_referenced: El atributo %{custom_fields} no - se puede usar porque conduce a una referencia circular; un atributo - depende del otro. + blank: "La fórmula no puede estar en blanco." + invalid: "La fórmula no es válida." + invalid_characters: "Solo se permiten valores numéricos, operadores matemáticos y atributos de proyecto de tipo entero, flotante, valor calculado y lista ponderada." + not_allowed_custom_fields_referenced: "El atributo %{custom_fields} no se puede usar porque conduce a una referencia circular; un atributo depende del otro." format: "%{message}" required: - cannot_be_true: no se puede establecer como verdadero. + cannot_be_true: "no se puede establecer como verdadero." custom_fields_project: attributes: project_ids: - blank: Seleccione un proyecto. + blank: "Seleccione un proyecto." custom_actions: - only_one_allowed: Solo se permite un valor (%{name}). - empty: El valor (%{name}) no puede estar vacío. - inclusion: El valor (%{name}) no se ha establecido en uno de los valores - permitidos. - not_logged_in: "(%{name}) el valor no se puede establecer porque no inició - la sesión." + only_one_allowed: "Solo se permite un valor (%{name})." + empty: "El valor (%{name}) no puede estar vacío." + inclusion: "El valor (%{name}) no se ha establecido en uno de los valores permitidos." + not_logged_in: "(%{name}) el valor no se puede establecer porque no inició la sesión." not_an_integer: "(%{name}) no es un número entero." smaller_than_or_equal_to: "(%{name}) debe ser menor o igual que %{count}." greater_than_or_equal_to: "(%{name}) debe ser mayor o igual que %{count}." @@ -2222,467 +1821,393 @@ es: doorkeeper/application: attributes: redirect_uri: - fragment_present: no puede contener un fragmento. - invalid_uri: debe ser una URI válida. - relative_uri: debe ser un URI absoluto. - secured_uri: no está proveyendo un "Contexto Seguro". Utiliza HTTPS - o una dirección loopack, como un localhost. - forbidden_uri: está prohibida por el servidor. + fragment_present: "no puede contener un fragmento." + invalid_uri: "debe ser una URI válida." + relative_uri: "debe ser un URI absoluto." + secured_uri: 'no está proveyendo un "Contexto Seguro". Utiliza HTTPS o una dirección loopack, como un localhost.' + forbidden_uri: "está prohibida por el servidor." scopes: - not_match_configured: no coincide con los ámbitos disponibles. + not_match_configured: "no coincide con los ámbitos disponibles." enterprise_trial: - already_used: ya se utilizó para crear una prueba. - failed_to_create: No se ha podido crear la prueba (%{status}) - general_consent: Acepte los términos y condiciones. + already_used: "ya se utilizó para crear una prueba." + failed_to_create: "No se ha podido crear la prueba (%{status})" + general_consent: "Acepte los términos y condiciones." enterprise_token: - only_one_trial: Solo puede haber un token de prueba activo. Elimine el token - de prueba anterior antes de añadir otro. - unreadable: no se puede leer. ¿Seguro que es un token de soporte? - already_added: Este token ya se ha añadido. + only_one_trial: "Solo puede haber un token de prueba activo. Elimine el token de prueba anterior antes de añadir otro." + unreadable: "no se puede leer. ¿Seguro que es un token de soporte?" + already_added: "Este token ya se ha añadido." favorite: - already_favorited: ya se ha marcado como favorito. + already_favorited: "ya se ha marcado como favorito." grids/grid: - overlaps: superpuesto. - outside: está fuera de la red. - end_before_start: el valor final necesita ser mayor que el valor inicial. + overlaps: "superpuesto." + outside: "está fuera de la red." + end_before_start: "el valor final necesita ser mayor que el valor inicial." ical_token_query_assignment: attributes: name: - blank: es obligatorio. Por favor, seleccione un nombre. - not_unique: ya está en uso. Por favor, seleccione otro nombre. + blank: "es obligatorio. Por favor, seleccione un nombre." + not_unique: "ya está en uso. Por favor, seleccione otro nombre." meeting: - error_conflict: No se ha podido guardar porque otra persona ha actualizado - la reunión mientras tanto. Vuelva a cargar la página. + error_conflict: "No se ha podido guardar porque otra persona ha actualizado la reunión mientras tanto. Vuelva a cargar la página." message: - cannot_move_message_to_forum_of_different_project: No se puede mover un - mensaje a un foro de un proyecto diferente. + cannot_move_message_to_forum_of_different_project: "No se puede mover un mensaje a un foro de un proyecto diferente." notifications: - at_least_one_channel: Debe especificarse al menos un canal para enviar notificaciones. + at_least_one_channel: "Debe especificarse al menos un canal para enviar notificaciones." attributes: read_ian: - read_on_creation: no puede establecerse a verdadero en la creación de - notificaciones. + read_on_creation: "no puede establecerse a verdadero en la creación de notificaciones." mail_reminder_sent: - set_on_creation: no puede establecerse al valor verdadero en la creación - de notificaciones. + set_on_creation: "no puede establecerse al valor verdadero en la creación de notificaciones." reason: - no_notification_reason: no puede estar en blanco, ya que se han elegido - las notificaciones en la aplicación como un canal. + no_notification_reason: "no puede estar en blanco, ya que se han elegido las notificaciones en la aplicación como un canal." reason_mail_digest: - no_notification_reason: no puede estar en blanco, ya que se ha elegido - el resumen de correo como un canal. + no_notification_reason: "no puede estar en blanco, ya que se ha elegido el resumen de correo como un canal." non_working_day: attributes: date: - taken: Ya existe un día no laboral para %{value}. + taken: "Ya existe un día no laboral para %{value}." format: "%{message}" parse_schema_filter_params_service: attributes: base: - unsupported_operator: Este operador no es compatible. - invalid_values: El valor no es válido. - id_filter_required: Se requiere el filtro 'id'. + unsupported_operator: "Este operador no es compatible." + invalid_values: "El valor no es válido." + id_filter_required: "Se requiere el filtro 'id'." project: - archived_ancestor: El proyecto tiene un antecesor archivado. - foreign_wps_reference_version: Los paquetes de trabajo en los proyectos - no descendientes hacen referencia a versiones del proyecto o a sus descendientes. - cannot_be_assigned_to_artifact_work_package: El usuario elegido no se puede - asignar a paquetes de trabajo. + archived_ancestor: "El proyecto tiene un antecesor archivado." + foreign_wps_reference_version: "Los paquetes de trabajo en los proyectos no descendientes hacen referencia a versiones del proyecto o a sus descendientes." + cannot_be_assigned_to_artifact_work_package: "El usuario elegido no se puede asignar a paquetes de trabajo." attributes: base: - archive_permission_missing_on_subprojects: No tiene los permisos necesarios - para archivar todos los subproyectos. Por favor, póngase en contacto - con un administrador. - project_initiation_request_disabled: La solicitud de inicio de proyecto - está desactivada. Debe estar activada para crear el paquete de trabajo - de artefactos. + archive_permission_missing_on_subprojects: "No tiene los permisos necesarios para archivar todos los subproyectos. Por favor, póngase en contacto con un administrador." + project_initiation_request_disabled: "La solicitud de inicio de proyecto está desactivada. Debe estar activada para crear el paquete de trabajo de artefactos." types: - in_use_by_work_packages: 'todavia en uso por los paquetes de trabajo: - %{types}' + in_use_by_work_packages: "todavia en uso por los paquetes de trabajo: %{types}" enabled_modules: - dependency_missing: El módulo «%{dependency}» debe habilitarse también, - ya que el módulo «%{module}» depende de este. + dependency_missing: "El módulo «%{dependency}» debe habilitarse también, ya que el módulo «%{module}» depende de este." format: "%{message}" project_custom_field_project_mapping: attributes: project_ids: - blank: Por favor, selecciona un proyecto. + blank: "Por favor, selecciona un proyecto." project/phase: attributes: start_date: - must_be_before_finish_date: debe ser anterior a la fecha de finalización. - non_continuous_dates: no puede ser anterior a la fecha de finalización - de la fase anterior. + must_be_before_finish_date: "debe ser anterior a la fecha de finalización." + non_continuous_dates: "no puede ser anterior a la fecha de finalización de la fase anterior." finish_date: - must_be_after_start_date: debe ser posterior a la fecha de inicio. - cannot_be_a_non_working_day: no puede ser un día no laborable. + must_be_after_start_date: "debe ser posterior a la fecha de inicio." + cannot_be_a_non_working_day: "no puede ser un día no laborable." query: attributes: public: - error_unauthorized: "- El usuario no tiene permiso para crear vistas - públicas." + error_unauthorized: "- El usuario no tiene permiso para crear vistas públicas." group_by: - invalid: 'No se puede agrupar por: %{value}' + invalid: "No se puede agrupar por: %{value}" format: "%{message}" column_names: - invalid: 'Columna no válida en la solicitud: %{value}' + invalid: "Columna no válida en la solicitud: %{value}" format: "%{message}" sort_criteria: - invalid: 'No se puede ordenar por la columna: %{value}' + invalid: "No se puede ordenar por la columna: %{value}" format: "%{message}" timestamps: - invalid: 'Las marcas de tiempo contienen valores no válidos: %{values}' - forbidden: 'Las marcas de tiempo contienen valores prohibidos: %{values}' + invalid: "Las marcas de tiempo contienen valores no válidos: %{values}" + forbidden: "Las marcas de tiempo contienen valores prohibidos: %{values}" format: "%{message}" selects: - name_not_included: Es necesario incluir la columna «Nombre» - nonexistent: La columna «%{column}» no existe. + name_not_included: "Es necesario incluir la columna «Nombre»" + nonexistent: "La columna «%{column}» no existe." format: "%{message}" - group_by_hierarchies_exclusive: es mutuamente exclusivo con el grupo '%{group_by}'. - No puede activar ambos. - can_only_be_modified_by_owner: La vista sólo puede ser modificada por su - propietario. - need_permission_to_modify_public_query: No puede modificar una vista pública. + group_by_hierarchies_exclusive: "es mutuamente exclusivo con el grupo '%{group_by}'. No puede activar ambos." + can_only_be_modified_by_owner: "La vista sólo puede ser modificada por su propietario." + need_permission_to_modify_public_query: "No puede modificar una vista pública." filters: custom_fields: - inexistent: No hay ningún campo personalizado para el filtro. + inexistent: "No hay ningún campo personalizado para el filtro." queries/filters/base: attributes: values: - inclusion: El filtro tiene valores inválidos. + inclusion: "El filtro tiene valores inválidos." format: "%{message}" queries/principals/filters/internal_mentionable_on_work_package_filter: attributes: values: - single_value_requirement: debe ser un único paquete de trabajo + single_value_requirement: "debe ser un único paquete de trabajo" relation: typed_dag: - circular_dependency: La relación crea un bucle de relaciones. + circular_dependency: "La relación crea un bucle de relaciones." attributes: base: - error_not_deletable: Esta relación no se puede eliminar porque no tiene - permisos de edición para el paquete de trabajo seleccionado. - error_not_editable: Esta relación no se puede editar porque no tiene - permisos de edición para el paquete de trabajo seleccionado. + error_not_deletable: "Esta relación no se puede eliminar porque no tiene permisos de edición para el paquete de trabajo seleccionado." + error_not_editable: "Esta relación no se puede editar porque no tiene permisos de edición para el paquete de trabajo seleccionado." to_id: - format: El paquete de trabajo seleccionado %{message} - error_not_found: no se pudo encontrar. - error_readonly: no se puede cambiar para las relaciones existentes. - error_not_manageable: no se puede añadir porque no tiene permisos de - edición para el paquete de trabajo seleccionado. + format: "El paquete de trabajo seleccionado %{message}" + error_not_found: "no se pudo encontrar." + error_readonly: "no se puede cambiar para las relaciones existentes." + error_not_manageable: "no se puede añadir porque no tiene permisos de edición para el paquete de trabajo seleccionado." from_id: - format: El paquete de trabajo seleccionado %{message} - error_not_found: no se pudo encontrar. - error_readonly: no se puede cambiar para las relaciones existentes. - error_not_manageable: no se puede añadir porque no tiene permisos de - edición para el paquete de trabajo seleccionado. + format: "El paquete de trabajo seleccionado %{message}" + error_not_found: "no se pudo encontrar." + error_readonly: "no se puede cambiar para las relaciones existentes." + error_not_manageable: "no se puede añadir porque no tiene permisos de edición para el paquete de trabajo seleccionado." repository: - not_available: El proveedor SMC no está disponible - not_whitelisted: no está permitido por la configuración. - invalid_url: no es una dirección URL o ruta válida para un repositorio. - must_not_be_ssh: no debe usarse una URL de SSH. - no_directory: no es un directorio. + not_available: "El proveedor SMC no está disponible" + not_whitelisted: "no está permitido por la configuración." + invalid_url: "no es una dirección URL o ruta válida para un repositorio." + must_not_be_ssh: "no debe usarse una URL de SSH." + no_directory: "no es un directorio." role: attributes: permissions: - dependency_missing: también es necesario incluir «%{dependency}», ya - que está seleccionada la opción «%{permission}». + dependency_missing: "también es necesario incluir «%{dependency}», ya que está seleccionada la opción «%{permission}»." setting: attributes: base: - working_days_are_missing: Al menos un día de la semana debe definirse - como laboral. - previous_working_day_changes_unprocessed: Los cambios anteriores en - la configuración de días laborables no se han aplicado aún. - hours_per_day_are_missing: Debe definirse el número de horas diarias. - durations_are_not_positive_numbers: Las duraciones deben ser números - positivos. - hours_per_day_is_out_of_bounds: Las horas al día no pueden ser más de - 24 + working_days_are_missing: "Al menos un día de la semana debe definirse como laboral." + previous_working_day_changes_unprocessed: "Los cambios anteriores en la configuración de días laborables no se han aplicado aún." + hours_per_day_are_missing: "Debe definirse el número de horas diarias." + durations_are_not_positive_numbers: "Las duraciones deben ser números positivos." + hours_per_day_is_out_of_bounds: "Las horas al día no pueden ser más de 24" status: attributes: default_done_ratio: - inclusion: debe estar entre 0 y 100. - readonly_default_exlusive: no se puede activar para los estados marcados - como predeterminados. + inclusion: "debe estar entre 0 y 100." + readonly_default_exlusive: "no se puede activar para los estados marcados como predeterminados." time_entry: attributes: hours: - day_limit: es demasiado alto, ya que solo puede registrarse un máximo - de 24 horas por fecha. + day_limit: "es demasiado alto, ya que solo puede registrarse un máximo de 24 horas por fecha." user_preference: attributes: pause_reminders: - invalid_range: solo puede ser un intervalo de fechas válido. + invalid_range: "solo puede ser un intervalo de fechas válido." daily_reminders: - full_hour: solo se puede configurar para la entrega en una hora completa. + full_hour: "solo se puede configurar para la entrega en una hora completa." notification_settings: - only_one_global_setting: Solo puede haber una configuración global de - notificaciones. - email_alerts_global: La configuración de notificaciones por correo electrónico - solo se puede establecer globalmente. + only_one_global_setting: "Solo puede haber una configuración global de notificaciones." + email_alerts_global: "La configuración de notificaciones por correo electrónico solo se puede establecer globalmente." format: "%{message}" - wrong_date: Valor incorrecto para Fecha de inicio, Fecha final o Vencido. + wrong_date: "Valor incorrecto para Fecha de inicio, Fecha final o Vencido." watcher: attributes: user_id: - not_allowed_to_view: no tiene permiso para ver este recurso. - locked: está bloqueado. + not_allowed_to_view: "no tiene permiso para ver este recurso." + locked: "está bloqueado." wiki_page: - error_conflict: La página wiki ha sido actualizada por otra persona mientras - la editaba. + error_conflict: "La página wiki ha sido actualizada por otra persona mientras la editaba." attributes: slug: - undeducible: no se puede deducir a partir del título «%{title}». + undeducible: "no se puede deducir a partir del título «%{title}»." work_package: - is_not_a_valid_target_for_time_entries: 'Paquete de trabajo #%{id} no es - un objetivo válido para reasignar las entradas de tiempo.' + is_not_a_valid_target_for_time_entries: "Paquete de trabajo #%{id} no es un objetivo válido para reasignar las entradas de tiempo." attributes: id: format: "%{message}" - cannot_add_child_because_of_lack_of_permission: No se puede añadir un - secundario porque no tiene permisos para editar el paquete de trabajo - seleccionado. - blank: El ID no puede estar en blanco. + cannot_add_child_because_of_lack_of_permission: "No se puede añadir un secundario porque no tiene permisos para editar el paquete de trabajo seleccionado." + blank: "El ID no puede estar en blanco." assigned_to: format: "%{message}" done_ratio: - does_not_match_work_and_remaining_work: no coincide el trabajo y el - trabajo restante - cannot_be_set_when_work_is_zero: no puede fijarse cuando el trabajo - es cero - must_be_set_when_remaining_work_is_set: obligatorio cuando se fija el - Trabajo restante. - must_be_set_when_work_and_remaining_work_are_set: obligatorio cuando - se fijan Trabajo y Trabajo restante. - inclusion: debe estar entre 0 y 100. + does_not_match_work_and_remaining_work: "no coincide el trabajo y el trabajo restante" + cannot_be_set_when_work_is_zero: "no puede fijarse cuando el trabajo es cero" + must_be_set_when_remaining_work_is_set: "obligatorio cuando se fija el Trabajo restante." + must_be_set_when_work_and_remaining_work_are_set: "obligatorio cuando se fijan Trabajo y Trabajo restante." + inclusion: "debe estar entre 0 y 100." due_date: - not_start_date: no es en fecha de inicio, aunque esto es necesario para - hitos. - cannot_be_null: no puede establecerse como nulo, ya que la fecha de - inicio y la duración son conocidas. + not_start_date: "no es en fecha de inicio, aunque esto es necesario para hitos." + cannot_be_null: "no puede establecerse como nulo, ya que la fecha de inicio y la duración son conocidas." duration: - larger_than_dates: es más largo que el intervalo entre la fecha de inicio - y la final. - smaller_than_dates: es más corto que el intervalo entre la fecha de - inicio y la final. - not_available_for_milestones: no está disponible para paquetes de trabajo - con estilo hitos. - cannot_be_null: no puede establecerse como nulo, ya que la fecha de - inicio y final son conocidas. - not_an_integer: no es una duración válida. + larger_than_dates: "es más largo que el intervalo entre la fecha de inicio y la final." + smaller_than_dates: "es más corto que el intervalo entre la fecha de inicio y la final." + not_available_for_milestones: "no está disponible para paquetes de trabajo con estilo hitos." + cannot_be_null: "no puede establecerse como nulo, ya que la fecha de inicio y final son conocidas." + not_an_integer: "no es una duración válida." parent: - cannot_be_milestone: no puede ser un hito. - cannot_be_self_assigned: no se puede asignar a su propio usuario. - cannot_be_in_another_project: no puede estar en otro proyecto. - not_a_valid_parent: no es válido. + cannot_be_milestone: "no puede ser un hito." + cannot_be_self_assigned: "no se puede asignar a su propio usuario." + cannot_be_in_another_project: "no puede estar en otro proyecto." + not_a_valid_parent: "no es válido." schedule_manually: - cannot_be_automatically_scheduled: no puede establecerse en falso (programado - automáticamente) ya que no tiene predecesores ni elementos secundarios. + cannot_be_automatically_scheduled: "no puede establecerse en falso (programado automáticamente) ya que no tiene predecesores ni elementos secundarios." start_date: - violates_relationships: sólo se puede establecer a %{soonest_start} - o posterior para que no se violen las relaciones de los paquetes de - trabajo. - cannot_be_null: no puede establecerse como nulo, ya que la fecha final - y la duración son conocidas. + violates_relationships: "sólo se puede establecer a %{soonest_start} o posterior para que no se violen las relaciones de los paquetes de trabajo." + cannot_be_null: "no puede establecerse como nulo, ya que la fecha final y la duración son conocidas." status_id: - status_transition_invalid: no es válido porque no existe ninguna transición - desde el estado antiguo al nuevo para los roles del usuario actual. - status_invalid_in_type: no es válido porque el estado actual no existe - en este tipo. + status_transition_invalid: "no es válido porque no existe ninguna transición desde el estado antiguo al nuevo para los roles del usuario actual." + status_invalid_in_type: "no es válido porque el estado actual no existe en este tipo." type: - cannot_be_milestone_due_to_children: no puede ser un hito porque este - paquete de trabajo tiene elementos secundarios. + cannot_be_milestone_due_to_children: "no puede ser un hito porque este paquete de trabajo tiene elementos secundarios." priority_id: - only_active_priorities_allowed: debe estar activo. + only_active_priorities_allowed: "debe estar activo." category: - only_same_project_categories_allowed: La categoría de un paquete de - trabajo debe estar en el mismo proyecto que el paquete de trabajo. - does_not_exist: La categoría especificada no existe. + only_same_project_categories_allowed: "La categoría de un paquete de trabajo debe estar en el mismo proyecto que el paquete de trabajo." + does_not_exist: "La categoría especificada no existe." estimated_hours: - not_a_number: no es una duración válida. - cant_be_inferior_to_remaining_work: no puede ser inferior al Trabajo - restante. - must_be_set_when_remaining_work_and_percent_complete_are_set: obligatorio - cuando se fijan Trabajo restante y % completado. + not_a_number: "no es una duración válida." + cant_be_inferior_to_remaining_work: "no puede ser inferior al Trabajo restante." + must_be_set_when_remaining_work_and_percent_complete_are_set: "obligatorio cuando se fijan Trabajo restante y % completado." remaining_hours: - not_a_number: no es una duración válida. - cant_exceed_work: no puede ser superior a Trabajo. - must_be_set_when_work_is_set: obligatorio cuando Trabajo está establecido. - must_be_set_when_work_and_percent_complete_are_set: obligatorio cuando - se fijan Trabajo y % completado. - must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: ">- - debe ser igual a 0 horas si se selecciona la opción «Trabajo» y el - atributo «% completado» es 100 %." - must_be_empty_when_work_is_empty_and_percent_complete_is_100p: debe - estar vacío cuando Trabajo está vacío y % completado es 100 %. - readonly_status: El paquete de trabajo está en un estado de sólo lectura - por lo que sus atributos no se pueden cambiar. + not_a_number: "no es una duración válida." + cant_exceed_work: "no puede ser superior a Trabajo." + must_be_set_when_work_is_set: "obligatorio cuando Trabajo está establecido." + must_be_set_when_work_and_percent_complete_are_set: "obligatorio cuando se fijan Trabajo y % completado." + must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: '>- debe ser igual a 0 horas si se selecciona la opción «Trabajo» y el atributo «% completado» es 100 %.' + must_be_empty_when_work_is_empty_and_percent_complete_is_100p: >- + debe estar vacío cuando Trabajo está vacío y % completado es 100 %. + readonly_status: "El paquete de trabajo está en un estado de sólo lectura por lo que sus atributos no se pueden cambiar." type: attributes: attribute_groups: - attribute_unknown: Se ha usado un atributo de paquete de trabajo no - válido. - attribute_unknown_name: 'Se ha utilizado un atributo de paquete de trabajo - no válido: %{attribute}' - duplicate_group: El nombre de grupo “%{group}” se usó más de una vez. - Los nombres de grupo tienen que ser únicos. - query_invalid: 'La consulta insertada “%{group}” no es válida: %{details}' - group_without_name: No se permiten grupos sin nombre. + attribute_unknown: "Se ha usado un atributo de paquete de trabajo no válido." + attribute_unknown_name: "Se ha utilizado un atributo de paquete de trabajo no válido: %{attribute}" + duplicate_group: "El nombre de grupo “%{group}” se usó más de una vez. Los nombres de grupo tienen que ser únicos." + query_invalid: "La consulta insertada “%{group}” no es válida: %{details}" + group_without_name: "No se permiten grupos sin nombre." patterns: - invalid_tokens: Uno o más atributos dentro del campo no son válidos. - Corrija los atributos antes de guardar. + invalid_tokens: "Uno o más atributos dentro del campo no son válidos. Corrija los atributos antes de guardar." user: attributes: base: - user_limit_reached: El límite de usuarios ha sido alcanzado. No se pueden - crear más cuentas en el plan actual. - one_must_be_active: El administrador no puede ser bloqueado/eliminado. - Al menos un administrador debe estar activo. + user_limit_reached: "El límite de usuarios ha sido alcanzado. No se pueden crear más cuentas en el plan actual." + one_must_be_active: "El administrador no puede ser bloqueado/eliminado. Al menos un administrador debe estar activo." password_confirmation: - confirmation: La confirmación de contraseña no coincide con la contraseña. + confirmation: "La confirmación de contraseña no coincide con la contraseña." format: "%{message}" password: - weak: 'Debe contener caracteres de las siguientes clases (al menos %{min_count} - a %{all_count}): %{rules}' - lowercase: en minúsculas (por ejemplo 'a') - uppercase: en mayúsculas (por ejemplo ' A') - numeric: numérico (por ejemplo, ' 1') - special: especial (por ejemplo, ' %') + weak: "Debe contener caracteres de las siguientes clases (al menos %{min_count} a %{all_count}): %{rules}" + lowercase: "en minúsculas (por ejemplo 'a')" + uppercase: "en mayúsculas (por ejemplo ' A')" + numeric: "numérico (por ejemplo, ' 1')" + special: "especial (por ejemplo, ' %')" reused: - one: ha sido utilizado antes. Por favor, especifique uno distinto - al usado por última vez. - other: ha sido utilizado antes. Por favor, especifique uno distinto - a los %{count} últimos usados. + one: "ha sido utilizado antes. Por favor, especifique uno distinto al usado por última vez." + other: "ha sido utilizado antes. Por favor, especifique uno distinto a los %{count} últimos usados." match: - confirm: Confirmar Nueva Contraseña. - description: "'La confirmación de la contraseña' debe coincidir con - la ingresada en el campo 'Nueva contraseña'." + confirm: "Confirmar Nueva Contraseña." + description: "'La confirmación de la contraseña' debe coincidir con la ingresada en el campo 'Nueva contraseña'." status: - invalid_on_create: no es un estado válido para nuevos usuarios. + invalid_on_create: "no es un estado válido para nuevos usuarios." member: - principal_blank: Por favor seleccione al menos un usuario o grupo. - role_blank: necesita ser asignado. + principal_blank: "Por favor seleccione al menos un usuario o grupo." + role_blank: "necesita ser asignado." attributes: roles: - ungrantable: tiene un rol no asignable. - more_than_one: tiene más de un rol. + ungrantable: "tiene un rol no asignable." + more_than_one: "tiene más de un rol." principal: - unassignable: no puede ser asignado a un proyecto. + unassignable: "no puede ser asignado a un proyecto." version: - undeletable_archived_projects: La versión no puede borrarse cuando tiene - paquetes de trabajos adjuntos. - undeletable_work_packages_attached: La versión no puede borrarse cuando - tiene paquetes de trabajos adjuntos. + undeletable_archived_projects: "La versión no puede borrarse cuando tiene paquetes de trabajos adjuntos." + undeletable_work_packages_attached: "La versión no puede borrarse cuando tiene paquetes de trabajos adjuntos." token/named: attributes: token_name: - blank: Proporcione un nombre de token - in_use: Este nombre de token ya está en uso; seleccione uno diferente + blank: "Proporcione un nombre de token" + in_use: "Este nombre de token ya está en uso; seleccione uno diferente" format: "%{message}" jira: - invalid_protocol: Proporcione un protocolo válido (http o https) + invalid_protocol: "Proporcione un protocolo válido (http o https)" template: - body: 'Por favor revise los siguientes campos:' + body: "Por favor revise los siguientes campos:" header: - one: Un error impide guardar este %{model} + one: "Un error impide guardar este %{model}" other: "%{count} errores impiden guardar este %{model}" models: - attachment: Archivo + attachment: "Archivo" attribute_help_text: - one: Texto de ayuda para atributo - other: Textos de ayuda para atributos + one: "Texto de ayuda para atributo" + other: "Textos de ayuda para atributos" auth_provider: - one: Proveedor de autenticación - other: Proveedores de autenticación - category: Categoría - color: Color - comment: Comentario - custom_action: Acción personalizada - custom_field: Campo personalizado - customized: Personalizado - doorkeeper/application: Aplicación OAuth + one: "Proveedor de autenticación" + other: "Proveedores de autenticación" + category: "Categoría" + color: "Color" + comment: "Comentario" + custom_action: "Acción personalizada" + custom_field: "Campo personalizado" + customized: "Personalizado" + "doorkeeper/application": "Aplicación OAuth" enterprise_token: - one: Token de Enterprise - other: Tokens de Enterprise - forum: Foro - global_role: Rol global - group: Grupo + one: "Token de Enterprise" + other: "Tokens de Enterprise" + forum: "Foro" + global_role: "Rol global" + group: "Grupo" issue_priority: - one: Prioridad - other: Prioridades - meeting_participant: Participante de la reunión - member: Miembro - news: Noticias + one: "Prioridad" + other: "Prioridades" + meeting_participant: "Participante de la reunión" + member: "Miembro" + news: "Noticias" notification: - one: Notificación - other: Notificaciones - placeholder_user: Usuario de marcador de posición + one: "Notificación" + other: "Notificaciones" + placeholder_user: "Usuario de marcador de posición" project: - one: Proyecto - other: Proyectos + one: "Proyecto" + other: "Proyectos" project_query: - one: Lista de proyectos - other: Listas de proyectos - query: Consulta personalizada - reminder: Recordatorio + one: "Lista de proyectos" + other: "Listas de proyectos" + query: "Consulta personalizada" + reminder: "Recordatorio" role: - one: Rol - other: Roles + one: "Rol" + other: "Roles" scim_client: - one: Cliente SCIM - other: Clientes SCIM + one: "Cliente SCIM" + other: "Clientes SCIM" jira: - one: Jira - other: Jira - status: Estado del paquete de trabajo + one: "Jira" + other: "Jira" + status: "Estado del paquete de trabajo" token/api: one: Token de acceso other: Tokens de acceso token/rss: - one: Token RSS - other: Tokens RSS + one: "Token RSS" + other: "Tokens RSS" type: - one: Tipo - other: Tipos - user: Usuario - version: Versión - workflow: Flujo de trabajo - work_package: Paquete de trabajo - wiki: Wiki - wiki_page: Página wiki + one: "Tipo" + other: "Tipos" + user: "Usuario" + version: "Versión" + workflow: "Flujo de trabajo" + work_package: "Paquete de trabajo" + wiki: "Wiki" + wiki_page: "Página wiki" errors: header_invalid_fields: - one: 'Se encontró un problema con el siguiente campo:' - other: 'Se encontraron problemas con los siguientes campos:' + one: "Se encontró un problema con el siguiente campo:" + other: "Se encontraron problemas con los siguientes campos:" header_additional_invalid_fields: - one: 'Además, hubo un problema con el siguiente campo:' - other: 'Además, hubo problemas con los siguientes campos:' - field_erroneous_label: 'Este campo es inválido: %{full_errors} por favor, ingrese - un valor válido.' + one: "Además, hubo un problema con el siguiente campo:" + other: "Además, hubo problemas con los siguientes campos:" + field_erroneous_label: "Este campo es inválido: %{full_errors} por favor, ingrese un valor válido." messages: - must_be_template: debe ser plantilla - unsupported_storage_type: no es un tipo de almacenamiento compatible. - storage_error: Se ha producido un error en la conexión de almacenamiento. - invalid_input: La entrada no es válida. + must_be_template: "debe ser plantilla" + unsupported_storage_type: "no es un tipo de almacenamiento compatible." + storage_error: "Se ha producido un error en la conexión de almacenamiento." + invalid_input: "La entrada no es válida." activity: item: - created_by_on: creado por %{user} el %{datetime} - created_by_on_time_entry: hora registrada por %{user} el %{datetime} - created_on: creado el %{datetime} - created_on_time_entry: hora registrada en %{datetime} - updated_by_on: actualizado por %{user} el %{datetime} - updated_by_on_time_entry: hora registrada actualizada por %{user} en %{datetime} - updated_on: actualizado el %{datetime} - updated_on_time_entry: hora registrada actualizada el %{datetime} - deleted_on: eliminado el %{datetime} - deleted_by_on: eliminado por %{user} el %{datetime} - added_on: añadido el %{datetime} - added_by_on: añadido por %{user} el %{datetime} - removed_on: eliminado el %{datetime} - removed_by_on: eliminado por %{user} el %{datetime} - parent_without_of: Subproyecto - parent_no_longer: Ya no es subproyecto de + created_by_on: "creado por %{user} el %{datetime}" + created_by_on_time_entry: "hora registrada por %{user} el %{datetime}" + created_on: "creado el %{datetime}" + created_on_time_entry: "hora registrada en %{datetime}" + updated_by_on: "actualizado por %{user} el %{datetime}" + updated_by_on_time_entry: "hora registrada actualizada por %{user} en %{datetime}" + updated_on: "actualizado el %{datetime}" + updated_on_time_entry: "hora registrada actualizada el %{datetime}" + deleted_on: "eliminado el %{datetime}" + deleted_by_on: "eliminado por %{user} el %{datetime}" + added_on: "añadido el %{datetime}" + added_by_on: "añadido por %{user} el %{datetime}" + removed_on: "eliminado el %{datetime}" + removed_by_on: "eliminado por %{user} el %{datetime}" + parent_without_of: "Subproyecto" + parent_no_longer: "Ya no es subproyecto de" time_entry: hour: one: "%{count} hora" @@ -2690,489 +2215,458 @@ es: hour_html: one: "%{count} hora" other: "%{count} horas" - updated: cambiado de %{old_value} a %{value} - logged_for: Registrado para + updated: "cambiado de %{old_value} a %{value}" + logged_for: "Registrado para" filter: - changeset: Conjuntos de cambios - message: Foros - news: Noticias - project_details: Detalles del proyecto - subproject: Incluir subproyectos - time_entry: Tiempo invertido - wiki_edit: Wiki - work_package: Paquetes de trabajo + changeset: "Conjuntos de cambios" + message: "Foros" + news: "Noticias" + project_details: "Detalles del proyecto" + subproject: "Incluir subproyectos" + time_entry: "Tiempo invertido" + wiki_edit: "Wiki" + work_package: "Paquetes de trabajo" project_phase: - activated: activado - added_date: establecido en %{date} - changed_date: cambiado de %{from} a %{to} - deactivated: desactivado - deleted_project_phase: Fase de proyecto eliminada + activated: "activado" + added_date: "establecido en %{date}" + changed_date: "cambiado de %{from} a %{to}" + deactivated: "desactivado" + deleted_project_phase: "Fase de proyecto eliminada" phase_and_both_gates: "%{phase_message}. %{start_gate_message} y %{finish_gate_message}" phase_and_one_gate: "%{phase_message}. %{gate_message}" - removed_date: fecha de eliminación %{date} + removed_date: "fecha de eliminación %{date}" + #common attributes of all models attributes: - active: Activo - assigned_to: Asignado a - assignee: Asignado a - attachments: Archivos adjuntos - actor: Actor - action: Acción - api_key: Clave API - author: Autor - avatar: Avatar - base: 'Error general:' - body: Cuerpo - blocks_ids: Identificadores de paquetes bloqueados - category: Categoría - comment: Comentario - comments: Comentario - content: Contenido - color: Color - creator: Creador - created_at: Creado en - custom_field: Campo personalizado - custom_options: Valores posibles - custom_values: Campos Personalizados - date: Fecha - dates_interval: Intervalo de fechas - default_columns: Columnas predeterminadas - description: Descripción - derived_due_date: Fecha final derivada - derived_estimated_hours: Trabajo total - derived_start_date: Fecha de comienzo deseada - direction: Dirección - display_sums: Mostrar sumas - domain: Dominio - due_date: Fecha de finalización - estimated_hours: Trabajo - estimated_time: Trabajo - email: Correo electrónico - entity_type: Entidad - expires_at: Caduca el - firstname: Nombre - filter: Filtro - group: Grupo - groups: Grupos - hexcode: Código hexadecimal - id: ID - is_default: Valor predeterminado - is_for_all: Para todos los proyectos - public: Público - principal: Usuario o grupo - issue: Paquete de trabajo - journal: Registro - journal_notes: Comentario - lastname: Apellido - login: Nombre usuario - lock_version: Bloquear versión - mail: Correo electrónico - name: Nombre - note: Nota - notes: Notas - number: Número - options: Opciones - operator: Operador - password: Contraseña - priority: Prioridad - project: Proyecto - project_ids: IDs de proyectos - project_phase: Fase del proyecto - project_phase_definition: Fase del proyecto - reason: Motivo - responsible: Responsable - required: Obligatorio - recipient: Destinatario - role: Perfil - roles: Roles - search: Buscar - sprint: Sprint - start_date: Fecha de inicio - status: Estado - state: Estado - subject: Asunto - slug: Slug - summary: Resumen - template: Plantilla - time_zone: Zona horaria - text: Texto - title: Título - type: Tipo - typeahead: Autocompletar - uid: Identificador único - updated_at: Actualizada el - updated_on: Actualizada el - uploader: Cargador - user: Usuario - username: Nombre de usuario - unit: Unidad - value: Valor - values: Valores - version: Versión - visible: Visible - work_package: Paquete de trabajo - work_package_id: Paquete de trabajo + active: "Activo" + assigned_to: "Asignado a" + assignee: "Asignado a" + attachments: "Archivos adjuntos" + actor: "Actor" + action: "Acción" + api_key: "Clave API" + author: "Autor" + avatar: "Avatar" + base: "Error general:" + body: "Cuerpo" + blocks_ids: "Identificadores de paquetes bloqueados" + category: "Categoría" + comment: "Comentario" + comments: "Comentario" + content: "Contenido" + color: "Color" + creator: "Creador" + created_at: "Creado en" + custom_field: "Campo personalizado" + custom_options: "Valores posibles" + custom_values: "Campos Personalizados" + date: "Fecha" + dates_interval: "Intervalo de fechas" + default_columns: "Columnas predeterminadas" + description: "Descripción" + derived_due_date: "Fecha final derivada" + derived_estimated_hours: "Trabajo total" + derived_start_date: "Fecha de comienzo deseada" + direction: "Dirección" + display_sums: "Mostrar sumas" + domain: "Dominio" + due_date: "Fecha de finalización" + estimated_hours: "Trabajo" + estimated_time: "Trabajo" + email: "Correo electrónico" + entity_type: "Entidad" + expires_at: "Caduca el" + firstname: "Nombre" + filter: "Filtro" + group: "Grupo" + groups: "Grupos" + hexcode: "Código hexadecimal" + id: "ID" + is_default: "Valor predeterminado" + is_for_all: "Para todos los proyectos" + public: "Público" + principal: "Usuario o grupo" + #kept for backwards compatibility + issue: "Paquete de trabajo" + journal: "Registro" + journal_notes: "Comentario" + lastname: "Apellido" + login: "Nombre usuario" + lock_version: "Bloquear versión" + mail: "Correo electrónico" + name: "Nombre" + note: "Nota" + notes: "Notas" + number: "Número" + options: "Opciones" + operator: "Operador" + password: "Contraseña" + priority: "Prioridad" + project: "Proyecto" + project_ids: "IDs de proyectos" + project_phase: "Fase del proyecto" + project_phase_definition: "Fase del proyecto" + reason: "Motivo" + responsible: "Responsable" + required: "Obligatorio" + recipient: "Destinatario" + role: "Perfil" + roles: "Roles" + search: "Buscar" + sprint: "Sprint" + start_date: "Fecha de inicio" + status: "Estado" + state: "Estado" + subject: "Asunto" + slug: "Slug" + summary: "Resumen" + template: "Plantilla" + time_zone: "Zona horaria" + text: "Texto" + title: "Título" + type: "Tipo" + typeahead: "Autocompletar" + uid: "Identificador único" + updated_at: "Actualizada el" + updated_on: "Actualizada el" + uploader: "Cargador" + user: "Usuario" + username: "Nombre de usuario" + unit: "Unidad" + value: "Valor" + values: "Valores" + version: "Versión" + visible: "Visible" + work_package: "Paquete de trabajo" + work_package_id: "Paquete de trabajo" backup: - failed: La copia de seguridad ha fallado - label_backup_token: Token de copias de seguridad - label_create_token: Crear token de copias de seguridad - label_delete_token: Eliminar token de copias de seguridad - label_reset_token: Restablecer token de copias de seguridad - label_token_users: Los siguientes usuarios tienen tokens de copia de seguridad - activos + failed: "La copia de seguridad ha fallado" + label_backup_token: "Token de copias de seguridad" + label_create_token: "Crear token de copias de seguridad" + label_delete_token: "Eliminar token de copias de seguridad" + label_reset_token: "Restablecer token de copias de seguridad" + label_token_users: "Los siguientes usuarios tienen tokens de copia de seguridad activos" reset_token: action_create: Crear action_reset: Reiniciar - heading_reset: Restablecer token de copias de seguridad - heading_create: Crear token de copias de seguridad - implications: 'Al habilitar las copias de seguridad, cualquier usuario con los - permisos necesarios y este token de copias de seguridad podrá descargar una - copia de seguridad que contenga todos los datos de esta instalación de OpenProject, - incluidos los datos del resto de los usuarios. - - ' - info: 'Para crear una copia de seguridad, necesita generar un token de copias - de seguridad. Cada vez que quiera solicitar una copia de seguridad, tendrá - que especificar este token. Puede eliminar el token de copias de seguridad - para deshabilitar las copias de seguridad para este usuario. - - ' - verification: 'Escriba %{word} para confirmar que quiere %{action} el token - de copias de seguridad. - - ' + heading_reset: "Restablecer token de copias de seguridad" + heading_create: "Crear token de copias de seguridad" + implications: > + Al habilitar las copias de seguridad, cualquier usuario con los permisos necesarios y este token de copias de seguridad podrá descargar una copia de seguridad que contenga todos los datos de esta instalación de OpenProject, incluidos los datos del resto de los usuarios. + info: > + Para crear una copia de seguridad, necesita generar un token de copias de seguridad. Cada vez que quiera solicitar una copia de seguridad, tendrá que especificar este token. Puede eliminar el token de copias de seguridad para deshabilitar las copias de seguridad para este usuario. + verification: > + Escriba %{word} para confirmar que quiere %{action} el token de copias de seguridad. verification_word_reset: restablecer verification_word_create: crear - warning: 'Como medida de seguridad, deberá esperar 24 horas después de crear - un token para solicitar una copia de seguridad. Después de ese período, podrá - solicitar una copia de seguridad en cualquier momento usando ese token. - - ' - text_token_deleted: Se eliminó el token de copias de seguridad. Se han deshabilitado - las copias de seguridad. + warning: > + Como medida de seguridad, deberá esperar 24 horas después de crear un token para solicitar una copia de seguridad. Después de ese período, podrá solicitar una copia de seguridad en cualquier momento usando ese token. + text_token_deleted: Se eliminó el token de copias de seguridad. Se han deshabilitado las copias de seguridad. error: invalid_token: Token de copias de seguridad no válido o no encontrado token_cooldown: El token de copias de seguridad será válido en %{hours} horas. backup_pending: Ya hay una copia de seguridad pendiente. limit_reached: Solo puede ejecutar %{limit} copias de seguridad al día. - button_actions: Acciones - button_add: Añadir - button_add_comment: Añadir comentario - button_add_item_above: Añadir elemento arriba - button_add_item_below: Añadir elemento debajo - button_add_sub_item: Añadir subelemento + button_actions: "Acciones" + button_add: "Añadir" + button_add_comment: "Añadir comentario" + button_add_item_above: "Añadir elemento arriba" + button_add_item_below: "Añadir elemento debajo" + button_add_sub_item: "Añadir subelemento" button_add_member: Añadir miembro - button_add_watcher: Añadir observador - button_annotate: Anotar - button_apply: Aplicar - button_apply_changes: Aplicar cambios - button_archive: Archivar - button_back: Atrás - button_cancel: Cancelar - button_change: Cambiar - button_change_parent_page: Página principal de cambio - button_change_password: Cambiar contraseña - button_check_all: Seleccionar Todos - button_clear: Eliminar - button_click_to_reveal: Haz Click para ver - button_close: Cerrar - button_collapse_all: Colapsar todo - button_confirm: Confirmar - button_configure: Configurar - button_continue: Continuar - button_complete: Completar - button_copy: Copiar - button_copy_to_clipboard: Copiar en el portapapeles - button_copy_link_to_clipboard: Copiar enlace al portapapeles - button_create: Crear - button_create_and_continue: Crear y continuar - button_decline: Declinar - button_delete: Borrar - button_delete_permanently: Eliminar permanentemente - button_delete_watcher: Eliminar observador %{name} - button_download: Descargar - button_disable: Deshabilitar - button_duplicate: Duplicar - button_duplicate_and_follow: Duplicar y seguir - button_edit: Editar - button_enable: Habilitar - button_edit_associated_wikipage: 'Editar página wiki asociada: %{page_title}' - button_expand_all: Expandir todos - button_favorite: Añadir a favoritos - button_filter: Filtro - button_finish_setup: Finalizar configuración - button_generate: Generar - button_list: Lista - button_lock: Bloquear - button_login: Iniciar sesión - button_move: Mover - button_move_and_follow: Mover y seguir - button_print: Imprimir - button_quote: Comentario + button_add_watcher: "Añadir observador" + button_annotate: "Anotar" + button_apply: "Aplicar" + button_apply_changes: "Aplicar cambios" + button_archive: "Archivar" + button_back: "Atrás" + button_cancel: "Cancelar" + button_change: "Cambiar" + button_change_parent_page: "Página principal de cambio" + button_change_password: "Cambiar contraseña" + button_check_all: "Seleccionar Todos" + button_clear: "Eliminar" + button_click_to_reveal: "Haz Click para ver" + button_close: "Cerrar" + button_collapse_all: "Colapsar todo" + button_confirm: "Confirmar" + button_configure: "Configurar" + button_continue: "Continuar" + button_complete: "Completar" + button_copy: "Copiar" + button_copy_to_clipboard: "Copiar en el portapapeles" + button_copy_link_to_clipboard: "Copiar enlace al portapapeles" + button_create: "Crear" + button_create_and_continue: "Crear y continuar" + button_decline: "Declinar" + button_delete: "Borrar" + button_delete_permanently: "Eliminar permanentemente" + button_delete_watcher: "Eliminar observador %{name}" + button_download: "Descargar" + button_disable: "Deshabilitar" + button_duplicate: "Duplicar" + button_duplicate_and_follow: "Duplicar y seguir" + button_edit: "Editar" + button_enable: "Habilitar" + button_edit_associated_wikipage: "Editar página wiki asociada: %{page_title}" + button_expand_all: "Expandir todos" + button_favorite: "Añadir a favoritos" + button_filter: "Filtro" + button_finish_setup: "Finalizar configuración" + button_generate: "Generar" + button_list: "Lista" + button_lock: "Bloquear" + button_login: "Iniciar sesión" + button_move: "Mover" + button_move_and_follow: "Mover y seguir" + button_print: "Imprimir" + button_quote: "Comentario" button_remove: Eliminar - button_remove_permanently: Eliminar permanentemente - button_remove_reminder: Eliminar recordatorio - button_rename: Cambiar el nombre - button_replace: Sustituir - button_revoke: Revocar - button_reply: Respuesta - button_reset: Reiniciar - button_rollback: Volver a esta versión - button_save: Guardar - button_save_as: Guardar como - button_save_back: Guardar y volver - button_select: Seleccionar - button_set_reminder: Establecer recordatorio - button_show: Mostrar - button_sort: Ordenar - button_submit: Enviar - button_test: Prueba - button_unarchive: Desarchivar - button_uncheck_all: Deseleccionar todos - button_unlock: Desbloquear - button_unfavorite: Eliminar de favoritos - button_unwatch: No controlar más - button_update: Actualizar - button_upgrade: Mejorar - button_buy_now: Comprar ahora - button_upload: Cargar - button_view: Ver - button_watch: Controlar - button_manage_menu_entry: Configurar el menú - button_add_menu_entry: Agregar el elemento de menú - button_configure_menu_entry: Configurar elemento del menú - button_delete_menu_entry: Eliminar el elemento del menú - button_view_shared_work_packages: Ver paquetes de trabajo compartidos - button_manage_roles: Gestionar roles - button_remove_member: Borrar miembro - button_remove_member_and_shares: Borrar miembro y elementos compartidos - button_revoke_work_package_shares: Revocar los elementos compartidos del paquete - de trabajo - button_revoke_access: Revocar acceso - button_revoke_all: Revocar todos - button_revoke_only: Revocar solo %{shared_role_name} - button_publish: Hacer pública - button_unpublish: Hacer privada + button_remove_permanently: "Eliminar permanentemente" + button_remove_reminder: "Eliminar recordatorio" + button_rename: "Cambiar el nombre" + button_replace: "Sustituir" + button_revoke: "Revocar" + button_reply: "Respuesta" + button_reset: "Reiniciar" + button_rollback: "Volver a esta versión" + button_save: "Guardar" + button_save_as: "Guardar como" + button_save_back: "Guardar y volver" + button_select: "Seleccionar" + button_set_reminder: "Establecer recordatorio" + button_show: "Mostrar" + button_sort: "Ordenar" + button_submit: "Enviar" + button_test: "Prueba" + button_unarchive: "Desarchivar" + button_uncheck_all: "Deseleccionar todos" + button_unlock: "Desbloquear" + button_unfavorite: "Eliminar de favoritos" + button_unwatch: "No controlar más" + button_update: "Actualizar" + button_upgrade: "Mejorar" + button_buy_now: "Comprar ahora" + button_upload: "Cargar" + button_view: "Ver" + button_watch: "Controlar" + button_manage_menu_entry: "Configurar el menú" + button_add_menu_entry: "Agregar el elemento de menú" + button_configure_menu_entry: "Configurar elemento del menú" + button_delete_menu_entry: "Eliminar el elemento del menú" + button_view_shared_work_packages: "Ver paquetes de trabajo compartidos" + button_manage_roles: "Gestionar roles" + button_remove_member: "Borrar miembro" + button_remove_member_and_shares: "Borrar miembro y elementos compartidos" + button_revoke_work_package_shares: "Revocar los elementos compartidos del paquete de trabajo" + button_revoke_access: "Revocar acceso" + button_revoke_all: "Revocar todos" + button_revoke_only: "Revocar solo %{shared_role_name}" + button_publish: "Hacer pública" + button_unpublish: "Hacer privada" consent: checkbox_label: He notado y doy mi consentimiento a lo anterior. failure_message: Consentimiento fallido, no puede continuar. title: Consentimiento del usuario decline_warning_message: Usted ha declinado consentir y ha sido desconectado. - user_has_consented: El usuario ha dado su consentimiento a su [texto de información - de consentimiento configurado](consent_settings). - not_yet_consented: El usuario aún no ha dado su consentimiento a su [texto de - información de consentimiento configurado](consent_settings). Se le recordará - la próxima vez que se conecte. - contact_mail_instructions: Defina la dirección de correo a la que los usuarios - pueden acceder a un controlador de datos a fin de realizar cambios de datos - o solicitudes de eliminación. - contact_your_administrator: Por favor, contacte su administrador si desea eliminar - su cuenta. - contact_this_mail_address: Por favor, contacte con %{mail_address} para eliminar - su cuenta. - text_update_consent_time: Marque esta casilla para estimular a los usuarios a - dar, nuevamente, su consentimiento. Habilite cuando haya cambiado el aspecto - legal de la información relativa al mencionado consentimiento. - update_consent_last_time: 'Última actualización de consentimiento: %{update_time}' + user_has_consented: El usuario ha dado su consentimiento a su [texto de información de consentimiento configurado](consent_settings). + not_yet_consented: El usuario aún no ha dado su consentimiento a su [texto de información de consentimiento configurado](consent_settings). Se le recordará la próxima vez que se conecte. + contact_mail_instructions: Defina la dirección de correo a la que los usuarios pueden acceder a un controlador de datos a fin de realizar cambios de datos o solicitudes de eliminación. + contact_your_administrator: Por favor, contacte su administrador si desea eliminar su cuenta. + contact_this_mail_address: Por favor, contacte con %{mail_address} para eliminar su cuenta. + text_update_consent_time: Marque esta casilla para estimular a los usuarios a dar, nuevamente, su consentimiento. Habilite cuando haya cambiado el aspecto legal de la información relativa al mencionado consentimiento. + update_consent_last_time: "Última actualización de consentimiento: %{update_time}" copy_project: - title: Copiar proyecto «%{source_project_name}» - started: Comenzó la copia del proyecto '%{source_project_name}' a "%{target_project_name}". - Se le informará por correo tan pronto como esté disponible el proyecto "%{target_project_name}". - failed: No se puede copiar proyecto %{source_project_name} - failed_internal: Copia fallida debido a un error interno. - succeeded: Proyecto creado %{target_project_name} - errors: Error - project_custom_fields: Campos personalizados del proyecto + title: 'Copiar proyecto «%{source_project_name}»' + started: 'Comenzó la copia del proyecto ''%{source_project_name}'' a "%{target_project_name}". Se le informará por correo tan pronto como esté disponible el proyecto "%{target_project_name}".' + failed: "No se puede copiar proyecto %{source_project_name}" + failed_internal: "Copia fallida debido a un error interno." + succeeded: "Proyecto creado %{target_project_name}" + errors: "Error" + project_custom_fields: "Campos personalizados del proyecto" x_objects_of_this_type: - zero: No hay objetos de este tipo - one: Un objeto de este tipo + zero: "No hay objetos de este tipo" + one: "Un objeto de este tipo" other: "%{count} objetos de este tipo" text: - failed: No se pudo copiar el proyecto "%{source_project_name}" al proyecto "%{target_project_name}". - succeeded: Proyecto copiado de "%{source_project_name}" a "%{target_project_name}". - source_project_label: Proyecto copiado + failed: 'No se pudo copiar el proyecto "%{source_project_name}" al proyecto "%{target_project_name}".' + succeeded: 'Proyecto copiado de "%{source_project_name}" a "%{target_project_name}".' + source_project_label: "Proyecto copiado" copy_options: - dependencies_label: Copiar desde el proyecto + dependencies_label: "Copiar desde el proyecto" create_project: - attributes_heading: Rellena esta información obligatoria para trabajar en tus - proyectos. - template_label: Usar plantilla - template_heading: Selecciona una plantilla de proyecto para trabajar con los métodos - de gestión de proyectos más comunes o crea un proyecto desde cero. + attributes_heading: "Rellena esta información obligatoria para trabajar en tus proyectos." + template_label: "Usar plantilla" + template_heading: "Selecciona una plantilla de proyecto para trabajar con los métodos de gestión de proyectos más comunes o crea un proyecto desde cero." copy_options: - dependencies_label: Copiar desde la plantilla + dependencies_label: "Copiar desde la plantilla" blank_template: - label: Proyecto en blanco - description: Empieza desde cero. Añade manualmente los atributos, miembros y - módulos del proyecto. + label: "Proyecto en blanco" + description: Empieza desde cero. Añade manualmente los atributos, miembros y módulos del proyecto. blank_description: No hay descripción. create_portfolio: - template_heading: Selecciona una plantilla de cartera para trabajar con los métodos - de gestión de proyectos más comunes o crea una cartera desde cero. + template_heading: "Selecciona una plantilla de cartera para trabajar con los métodos de gestión de proyectos más comunes o crea una cartera desde cero." blank_template: - label: Cartera en blanco - description: Empieza desde cero. Añade manualmente los atributos, miembros y - módulos de la cartera. + label: "Cartera en blanco" + description: Empieza desde cero. Añade manualmente los atributos, miembros y módulos de la cartera. create_program: - template_heading: Selecciona una plantilla de programa para trabajar con los métodos - de gestión de proyectos más comunes o crea un programa desde cero. + template_heading: "Selecciona una plantilla de programa para trabajar con los métodos de gestión de proyectos más comunes o crea un programa desde cero." blank_template: - label: Programa en blanco - description: Empieza desde cero. Añade manualmente los atributos, miembros y - módulos del programa. - create_wiki_page: Crear una nueva página wiki - create_wiki_page_button: Página wiki + label: "Programa en blanco" + description: Empieza desde cero. Añade manualmente los atributos, miembros y módulos del programa. + create_wiki_page: "Crear una nueva página wiki" + create_wiki_page_button: "Página wiki" date: abbr_day_names: - - Dom - - Lun - - Mar - - Mie - - Jue - - Vie - - Sab + - "Dom" + - "Lun" + - "Mar" + - "Mie" + - "Jue" + - "Vie" + - "Sab" abbr_month_names: - - - - Ene - - Feb - - Mar - - Abr - - May - - Jun - - Jul - - Ago - - Sep - - Oct - - Nov - - Dec - abbr_week: Sem + - null + - "Ene" + - "Feb" + - "Mar" + - "Abr" + - "May" + - "Jun" + - "Jul" + - "Ago" + - "Sep" + - "Oct" + - "Nov" + - "Dec" + abbr_week: "Sem" day_names: - - Domingo - - Lunes - - Martes - - Miércoles - - Jueves - - Viernes - - Sábado + - "Domingo" + - "Lunes" + - "Martes" + - "Miércoles" + - "Jueves" + - "Viernes" + - "Sábado" formats: + #Use the strftime parameters for formats. + #When no format has been given, it uses default. + #You can provide other formats here if you like! default: "%d.%m.%Y" long: "%B %d, %Y" short: "%b %d" - month_names: - - - - Enero - - Febrero - - Marzo - - Abril - - May - - Junio - - Julio - - Agosto - - Septiembre - - Octubre - - Noviembre - - Diciembre + #Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: #Used in date_select and datetime_select. + - null + - "Enero" + - "Febrero" + - "Marzo" + - "Abril" + - "May" + - "Junio" + - "Julio" + - "Agosto" + - "Septiembre" + - "Octubre" + - "Noviembre" + - "Diciembre" order: - - ":año" - - :mes - - ":día" + - ':año' + - :mes + - ':día' datetime: distance_in_words: about_x_hours: - one: alrededor de 1 hora - other: alrededor de %{count} horas + one: "alrededor de 1 hora" + other: "alrededor de %{count} horas" about_x_months: - one: alrededor de un mes - other: alrededor de %{count} meses + one: "alrededor de un mes" + other: "alrededor de %{count} meses" about_x_years: - one: alrededor de un año - other: alrededor de %{count} años + one: "alrededor de un año" + other: "alrededor de %{count} años" almost_x_years: - one: casi un año - other: casi %{count} años - half_a_minute: medio minuto + one: "casi un año" + other: "casi %{count} años" + half_a_minute: "medio minuto" less_than_x_minutes: - one: menos de un minuto - other: menos de %{count} minutos + one: "menos de un minuto" + other: "menos de %{count} minutos" less_than_x_seconds: - one: menos de un segundo - other: menos de %{count} segundos + one: "menos de un segundo" + other: "menos de %{count} segundos" over_x_years: - one: mas de un año - other: mas de %{count} años + one: "mas de un año" + other: "mas de %{count} años" x_days: - one: 1 día + one: "1 día" other: "%{count} días" x_minutes: - one: un minuto + one: "un minuto" other: "%{count} minutos" x_minutes_abbreviated: - one: 1 min + one: "1 min" other: "%{count} minutos" x_hours: - one: 1 hora + one: "1 hora" other: "%{count} horas" x_hours_abbreviated: - one: 1 h + one: "1 h" other: "%{count} horas" x_weeks: - one: 1 semana + one: "1 semana" other: "%{count} semanas" x_months: - one: 1 mes + one: "1 mes" other: "%{count} meses" x_years: - one: 1 año + one: "1 año" other: "%{count} años" x_seconds: - one: un segundo + one: "un segundo" other: "%{count} segundos" x_seconds_abbreviated: - one: 1 s + one: "1 s" other: "%{count} segundos" units: minute_abbreviated: - one: min - other: mins + one: "min" + other: "mins" hour: - one: una hora - other: hora + one: "una hora" + other: "hora" day: - one: día - other: días - description_active: Activo? - description_attachment_toggle: Mostrar/ocultar archivos adjuntos - description_autocomplete: 'Este campo utiliza Autocompletar. Mientras se escribe - el título de un paquete de trabajo recibirá una lista de posibles candidatos. - Elija uno usando las teclas de flecha arriba y abajo y selecciónelo con el tabulador - o enter. Alternativamente usted puede ingresar el número del paquete de trabajo - directamente. - - ' - description_available_columns: Columnas disponibles - description_choose_project: Proyectos - description_compare_from: Comparar desde - description_compare_to: Comparar con - description_current_position: 'Usted está aquí: ' - description_date_from: Introduzca la fecha de inicio - description_date_to: Introduzca la fecha de finalización - description_enter_number: Ingrese número - description_enter_text: Ingrese texto - description_filter: Filtro - description_filter_toggle: Mostrar/Ocultar filtro - description_category_reassign: Elegir categoría - description_message_content: Contenido del mensaje - description_my_project: Usted es miembro - description_notes: Notas - description_parent_work_package: Paquete de trabajo primario actual - description_project_scope: Ámbito de búsqueda - description_query_sort_criteria_attribute: Ordenar atributos - description_query_sort_criteria_direction: Ordenar por dirección - description_search: Campo de búsqueda - description_select_work_package: Seleccione el paquete de trabajo - description_selected_columns: Columnas seleccionadas - description_sub_work_package: Subpaquetes de trabajo actuales - description_toc_toggle: Mostrar/ocultar tabla de contenidos - description_wiki_subpages_reassign: Elija nueva página principal + one: "día" + other: "días" + description_active: "Activo?" + description_attachment_toggle: "Mostrar/ocultar archivos adjuntos" + description_autocomplete: > + Este campo utiliza Autocompletar. Mientras se escribe el título de un paquete de trabajo recibirá una lista de posibles candidatos. Elija uno usando las teclas de flecha arriba y abajo y selecciónelo con el tabulador o enter. Alternativamente usted puede ingresar el número del paquete de trabajo directamente. + description_available_columns: "Columnas disponibles" + description_choose_project: "Proyectos" + description_compare_from: "Comparar desde" + description_compare_to: "Comparar con" + description_current_position: "Usted está aquí: " + description_date_from: "Introduzca la fecha de inicio" + description_date_to: "Introduzca la fecha de finalización" + description_enter_number: "Ingrese número" + description_enter_text: "Ingrese texto" + description_filter: "Filtro" + description_filter_toggle: "Mostrar/Ocultar filtro" + description_category_reassign: "Elegir categoría" + description_message_content: "Contenido del mensaje" + description_my_project: "Usted es miembro" + description_notes: "Notas" + description_parent_work_package: "Paquete de trabajo primario actual" + description_project_scope: "Ámbito de búsqueda" + description_query_sort_criteria_attribute: "Ordenar atributos" + description_query_sort_criteria_direction: "Ordenar por dirección" + description_search: "Campo de búsqueda" + description_select_work_package: "Seleccione el paquete de trabajo" + description_selected_columns: "Columnas seleccionadas" + description_sub_work_package: "Subpaquetes de trabajo actuales" + description_toc_toggle: "Mostrar/ocultar tabla de contenidos" + description_wiki_subpages_reassign: "Elija nueva página principal" + #Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) direction: iad (ltr) ee: features: @@ -3203,446 +2697,322 @@ es: team_planner_view: Vista del planificador de equipo virus_scanning: Análisis de antivirus weighted_item_lists: Listas ponderadas de artículos - work_package_query_relation_columns: Columnas de relación de consulta de paquetes - de trabajo + work_package_query_relation_columns: Columnas de relación de consulta de paquetes de trabajo work_package_sharing: Compartir paquetes de trabajo con usuarios externos work_package_subject_generation: Generación de temas del paquete de trabajo upsell: - buy_now_button: Comprar ahora - plans_title: Planes Enterprise - title: Extensión Enterprise - plan_title: Extensión Enterprise de %{plan} - plan_name: Plan Enterprise %{plan} - plan_text_html: Disponible a partir del %{plan_name}. - unlimited: Ilimitado - already_have_token: "¿Ya tiene un token? Añádalo utilizando el botón de abajo - para actualizar al plan Enterprise reservado.\n" - hide_banner: Ocultar este banner - homescreen_description: 'Los planes Enterprise amplían la edición Community - de OpenProject con [extensiones Enterprise](enterprise_url) adicionales y - asistencia profesional, ideales para organizaciones que ejecutan OpenProject - en un entorno de misión crítica. - - ' - homescreen_subline: Al mejorar su plan, también estará apoyando un proyecto - de código abierto. + buy_now_button: "Comprar ahora" + plans_title: "Planes Enterprise" + title: "Extensión Enterprise" + plan_title: "Extensión Enterprise de %{plan}" + plan_name: "Plan Enterprise %{plan}" + plan_text_html: "Disponible a partir del %{plan_name}." + unlimited: "Ilimitado" + already_have_token: > + ¿Ya tiene un token? Añádalo utilizando el botón de abajo para actualizar al plan Enterprise reservado. + hide_banner: "Ocultar este banner" + homescreen_description: > + Los planes Enterprise amplían la edición Community de OpenProject con [extensiones Enterprise](enterprise_url) adicionales y asistencia profesional, ideales para organizaciones que ejecutan OpenProject en un entorno de misión crítica. + homescreen_subline: Al mejorar su plan, también estará apoyando un proyecto de código abierto. baseline_comparison: - description: Resalte los cambios realizados en esta lista desde cualquier - momento en el pasado. + description: Resalte los cambios realizados en esta lista desde cualquier momento en el pasado. benefits: description: "¿Cuáles son las ventajas de Enterprise On-Premises?" - high_security: Funciones de seguridad - high_security_text: Inicio de sesión único (SAML, OpenID Connect, CAS), grupos - LDAP. - installation: Soporte de instalación - installation_text: Nuestros experimentados ingenieros de software le guiarán - en todo el proceso de instalación y configuración en su propia infraestructura. - premium_features: Extensiones Enterprise - premium_features_text: Tableros Agile, tema y logotipo personalizados, gráficos, - flujos de trabajo inteligentes con acciones personalizadas, búsqueda de - texto completo en archivos adjuntos de paquetes de trabajo y campos personalizados - de selección múltiple. - professional_support: Soporte profesional - professional_support_text: Obtenga ayuda rápida y de confianza de nuestros - agentes de soporte con conocimientos especializados sobre cómo ejecutar - OpenProject en entornos empresariales críticos. + high_security: "Funciones de seguridad" + high_security_text: "Inicio de sesión único (SAML, OpenID Connect, CAS), grupos LDAP." + installation: "Soporte de instalación" + installation_text: "Nuestros experimentados ingenieros de software le guiarán en todo el proceso de instalación y configuración en su propia infraestructura." + premium_features: "Extensiones Enterprise" + premium_features_text: "Tableros Agile, tema y logotipo personalizados, gráficos, flujos de trabajo inteligentes con acciones personalizadas, búsqueda de texto completo en archivos adjuntos de paquetes de trabajo y campos personalizados de selección múltiple." + professional_support: "Soporte profesional" + professional_support_text: "Obtenga ayuda rápida y de confianza de nuestros agentes de soporte con conocimientos especializados sobre cómo ejecutar OpenProject en entornos empresariales críticos." work_package_subject_generation: - description: Cree asuntos generados automáticamente utilizando atributos y - texto referenciados. + description: "Cree asuntos generados automáticamente utilizando atributos y texto referenciados." customize_life_cycle: - description: Cree y organice fases de proyecto diferentes a las previstas - en la planificación del ciclo del proyecto PM2. + description: "Cree y organice fases de proyecto diferentes a las previstas en la planificación del ciclo del proyecto PM2." capture_external_links: - description: Prevenga los ataques de ingeniería social detectando y advirtiendo - sobre los enlaces externos antes de que los usuarios los visiten. + description: "Prevenga los ataques de ingeniería social detectando y advirtiendo sobre los enlaces externos antes de que los usuarios los visiten." work_package_query_relation_columns: - description: "¿Necesita ver relaciones o elementos secundarios en la lista - de paquetes de trabajo?" + description: "¿Necesita ver relaciones o elementos secundarios en la lista de paquetes de trabajo?" edit_attribute_groups: - description: 'Personalice la configuración del formulario con estas extensiones:' + description: "Personalice la configuración del formulario con estas extensiones:" features: - groups: Añadir nuevos grupos de atributos - rename: Cambiar nombre de grupos de atributos - related: Añadir una tabla de paquetes de trabajo relacionados + groups: "Añadir nuevos grupos de atributos" + rename: "Cambiar nombre de grupos de atributos" + related: "Añadir una tabla de paquetes de trabajo relacionados" readonly_work_packages: - description: Marque los paquetes de trabajo como de solo lectura para estados - específicos. + description: "Marque los paquetes de trabajo como de solo lectura para estados específicos." custom_field_hierarchies: - description: Los campos personalizados de jerarquía permiten organizar estructuras - jerárquicas en paquetes de trabajo y proyectos haciendo uso de listas de - selección de varios niveles. + description: "Los campos personalizados de jerarquía permiten organizar estructuras jerárquicas en paquetes de trabajo y proyectos haciendo uso de listas de selección de varios niveles." date_alerts: - description: Con las alertas de fecha, recibirá notificaciones de próximas - fechas de inicio o finalización para que nunca olvide una fecha límite importante. + description: "Con las alertas de fecha, recibirá notificaciones de próximas fechas de inicio o finalización para que nunca olvide una fecha límite importante." weighted_item_lists: - description: Las listas de elementos ponderados te permiten crear una lista - con valores numéricos asociados. + description: "Las listas de elementos ponderados te permiten crear una lista con valores numéricos asociados." work_package_sharing: - description: Compartir paquetes de trabajo con usuarios que no son miembros - del proyecto. + description: "Compartir paquetes de trabajo con usuarios que no son miembros del proyecto." project_list_sharing: - description: Comparta listas de proyectos con usuarios individuales. + description: "Comparta listas de proyectos con usuarios individuales." calculated_values: - description: Los valores calculados le permiten crear un atributo basado en - fórmulas matemáticas utilizando valores numéricos y otros atributos del - proyecto y campos personalizados. + description: "Los valores calculados le permiten crear un atributo basado en fórmulas matemáticas utilizando valores numéricos y otros atributos del proyecto y campos personalizados." define_custom_style: - title: Tema de color y logotipo personalizados - more_info: 'Nota: El logotipo utilizado será de acceso público.' + title: "Tema de color y logotipo personalizados" + more_info: "Nota: El logotipo utilizado será de acceso público." description: Personalice su instalación de OpenProject con su logotipo y colores. custom_actions: - title: Acciones personalizadas - description: Las acciones personalizadas son accesos directos con un solo - clic a un conjunto de acciones predefinidas que puede mostrar en determinados - paquetes de trabajo según el estado, rol, tipo o proyecto. + title: "Acciones personalizadas" + description: "Las acciones personalizadas son accesos directos con un solo clic a un conjunto de acciones predefinidas que puede mostrar en determinados paquetes de trabajo según el estado, rol, tipo o proyecto." mcp_server: - description: Incorpore OpenProject a sus flujos de trabajo de IA con un servidor - MCP seguro. + description: "Incorpore OpenProject a sus flujos de trabajo de IA con un servidor MCP seguro." meeting_templates: - description: Defina plantillas de reuniones con una estructura de orden del - día fija y ahorre tiempo reutilizándolas al crear nuevas reuniones. + description: "Defina plantillas de reuniones con una estructura de orden del día fija y ahorre tiempo reutilizándolas al crear nuevas reuniones." nextcloud_sso: - title: Inicio de sesión único para almacenamiento en la nube - description: Habilite una autenticación fluida y segura para su almacenamiento - Nextcloud con el inicio de sesión único. Simplifique la gestión del acceso - y mejore la comodidad de los usuarios. + title: "Inicio de sesión único para almacenamiento en la nube" + description: "Habilite una autenticación fluida y segura para su almacenamiento Nextcloud con el inicio de sesión único. Simplifique la gestión del acceso y mejore la comodidad de los usuarios." scim_api: - title: Clientes SCIM - description: Automatice la gestión de usuarios en OpenProject integrando a - la perfección servicios de identidad externos como Microsoft Entra o Keycloak - a través de nuestra API del servidor SCIM. Disponible a partir del plan - corporativo Enterprise. + title: "Clientes SCIM" + description: "Automatice la gestión de usuarios en OpenProject integrando a la perfección servicios de identidad externos como Microsoft Entra o Keycloak a través de nuestra API del servidor SCIM. Disponible a partir del plan corporativo Enterprise." sso_auth_providers: - title: Inicio de sesión único (SSO) - description: Permite a los usuarios iniciar sesión a través de proveedores - externos de SSO usando SAML u OpenID Connect para un acceso fluido y una - integración perfecta con los sistemas de identidad existentes. + title: "Inicio de sesión único (SSO)" + description: "Permite a los usuarios iniciar sesión a través de proveedores externos de SSO usando SAML u OpenID Connect para un acceso fluido y una integración perfecta con los sistemas de identidad existentes." virus_scanning: - description: Asegúrese de que los archivos cargados en OpenProject se analizan - en busca de virus antes de que otros usuarios puedan acceder a ellos. + description: "Asegúrese de que los archivos cargados en OpenProject se analizan en busca de virus antes de que otros usuarios puedan acceder a ellos." project_creation_wizard: - description: Genere un asistente paso a paso para ayudar a los gestores de - proyectos a completar una solicitud de inicio de proyecto. + description: "Genere un asistente paso a paso para ayudar a los gestores de proyectos a completar una solicitud de inicio de proyecto." placeholder_users: title: Usuarios de marcador de posición - description: 'Los usuarios de marcadores de posición son una forma de asignar - paquetes de trabajo a usuarios que no son parte de su proyecto. Pueden ser - útiles en múltiples escenarios; por ejemplo, si necesita rastrear las tareas - de un recurso que aún no está nombrado o disponible, o si no quieres dar - acceso a esa persona a OpenProject pero quieres seguir las tareas que se - le han asignado. - - ' + description: > + Los usuarios de marcadores de posición son una forma de asignar paquetes de trabajo a usuarios que no son parte de su proyecto. Pueden ser útiles en múltiples escenarios; por ejemplo, si necesita rastrear las tareas de un recurso que aún no está nombrado o disponible, o si no quieres dar acceso a esa persona a OpenProject pero quieres seguir las tareas que se le han asignado. internal_comments: title: Comentarios internos - description: Los comentarios internos permiten a un equipo interno comunicarse - entre sí de forma privada. Solo son visibles para determinados roles del - proyecto y nunca serán visibles públicamente. + description: "Los comentarios internos permiten a un equipo interno comunicarse entre sí de forma privada. Solo son visibles para determinados roles del proyecto y nunca serán visibles públicamente." internal_comments_inline: - title: Escriba comentarios internos que solo un pequeño grupo pueda ver + title: "Escriba comentarios internos que solo un pequeño grupo pueda ver" description: " " portfolio_management: - description: Alinea tus proyectos con tus objetivos estratégicos organizándolos - en carteras y programas. + description: Alinea tus proyectos con tus objetivos estratégicos organizándolos en carteras y programas. teaser: title: - one: Queda un día del token de prueba de %{trial_plan} - other: Quedan %{count} días del token de prueba de %{trial_plan} - description: Tiene acceso a todas las funciones de %{trial_plan}. + one: "Queda un día del token de prueba de %{trial_plan}" + other: "Quedan %{count} días del token de prueba de %{trial_plan}" + description: "Tiene acceso a todas las funciones de %{trial_plan}." trial: - not_found: Ha solicitado un token de prueba, pero esa solicitud ya no está disponible. - Inténtelo de nuevo. - wait_for_confirmation: Le hemos enviado un correo electrónico para que confirme - su dirección con el fin de recuperar un token de prueba. - already_retrieved: 'Su token de prueba de Enterprise ya se ha recuperado. Busque - en sus correos electrónicos el token adjuntado. Póngase en contacto con nuestro - equipo de Soporte si necesita uno nuevo. - - ' - successfully_saved: Su token de prueba de Enterprise se ha recuperado correctamente. - token_sent: Token de prueba solicitado - request_again: Solicitar de nuevo - resend_action: Reenviar correo electrónico de confirmación - welcome_title: Resumen rápido de funciones - welcome_description: Obtenga un resumen rápido de la gestión de proyectos y - la colaboración en equipo con Enterprise Edition de OpenProject. - confirmation_info: 'Le enviamos un correo electrónico el %{date} a la dirección - %{email} con toda la información para iniciar la prueba gratuita de OpenProject - Enterprise. Revise su bandeja de entrada y haga clic en el enlace de confirmación - proporcionado para iniciar su prueba gratuita de 14 días. - - ' - confirmation_subline: 'Revise su bandeja de entrada y siga los pasos para iniciar - su prueba gratuita de 14 días. - - ' + not_found: "Ha solicitado un token de prueba, pero esa solicitud ya no está disponible. Inténtelo de nuevo." + wait_for_confirmation: "Le hemos enviado un correo electrónico para que confirme su dirección con el fin de recuperar un token de prueba." + already_retrieved: > + Su token de prueba de Enterprise ya se ha recuperado. Busque en sus correos electrónicos el token adjuntado. Póngase en contacto con nuestro equipo de Soporte si necesita uno nuevo. + successfully_saved: "Su token de prueba de Enterprise se ha recuperado correctamente." + token_sent: "Token de prueba solicitado" + request_again: "Solicitar de nuevo" + resend_action: "Reenviar correo electrónico de confirmación" + welcome_title: "Resumen rápido de funciones" + welcome_description: "Obtenga un resumen rápido de la gestión de proyectos y la colaboración en equipo con Enterprise Edition de OpenProject." + confirmation_info: > + Le enviamos un correo electrónico el %{date} a la dirección %{email} con toda la información para iniciar la prueba gratuita de OpenProject Enterprise. Revise su bandeja de entrada y haga clic en el enlace de confirmación proporcionado para iniciar su prueba gratuita de 14 días. + confirmation_subline: > + Revise su bandeja de entrada y siga los pasos para iniciar su prueba gratuita de 14 días. domain_caption: El token será válido para su nombre de host configurado actualmente. - receive_newsletter_html: 'Quiero recibir el boletín - de OpenProject. - - ' - consent_html: 'Acepto los términos - del servicio y la política - de privacidad. - - ' + receive_newsletter_html: > + Quiero recibir el boletín de OpenProject. + consent_html: > + Acepto los términos del servicio y la política de privacidad. email_calendar_updates: state: - disabled: Deshabilitado. - enabled: Habilitado. + disabled: "Deshabilitado." + enabled: "Habilitado." button: - disabled: Habilitar - enabled: Deshabilitar - enumeration_activities: Actividades de seguimiento del tiempo - enumeration_work_package_priorities: Prioridades del paquete de trabajo - enumeration_reported_project_statuses: Estado notificado - enumeration_caption_order_changed: Orden cambiado con éxito. - enumeration_could_not_be_moved: No se ha podido mover la enumeración. + disabled: "Habilitar" + enabled: "Deshabilitar" + enumeration_activities: "Actividades de seguimiento del tiempo" + enumeration_work_package_priorities: "Prioridades del paquete de trabajo" + enumeration_reported_project_statuses: "Estado notificado" + enumeration_caption_order_changed: "Orden cambiado con éxito." + enumeration_could_not_be_moved: "No se ha podido mover la enumeración." enterprise_trials: dialog_component: title: Prueba Enterprise - error_auth_source_sso_failed: El intento de inicio de sesión único (SSO) para el - usuario “%{value}” falló - error_can_not_archive_project: 'Este proyecto no se puede archivar: %{errors}' - error_can_not_delete_entry: No se puede eliminar la entrada - error_can_not_delete_custom_field: Imposible eliminar el campo seleccionado - error_can_not_delete_in_use_archived_undisclosed: También hay paquetes de trabajo - en proyectos archivados. Debe pedir a un administrador que realice la eliminación - para ver qué proyectos se ven afectados. - error_can_not_delete_in_use_archived_work_packages: 'Hay paquetes de trabajo en - los proyectos archivados. Necesita reactivar los proyectos siguientes para cambiar - el atributo de los paquetes de trabajo correspondientes: %{archived_projects_urls}' + error_auth_source_sso_failed: "El intento de inicio de sesión único (SSO) para el usuario “%{value}” falló" + error_can_not_archive_project: "Este proyecto no se puede archivar: %{errors}" + error_can_not_delete_entry: "No se puede eliminar la entrada" + error_can_not_delete_custom_field: "Imposible eliminar el campo seleccionado" + error_can_not_delete_in_use_archived_undisclosed: "También hay paquetes de trabajo en proyectos archivados. Debe pedir a un administrador que realice la eliminación para ver qué proyectos se ven afectados." + error_can_not_delete_in_use_archived_work_packages: "Hay paquetes de trabajo en los proyectos archivados. Necesita reactivar los proyectos siguientes para cambiar el atributo de los paquetes de trabajo correspondientes: %{archived_projects_urls}" error_can_not_delete_type: - explanation: Este tipo contiene paquetes de trabajo y no se puede eliminar. Puede - ver todos los paquetes de trabajo afectados en esta - vista. - error_can_not_delete_standard_type: Tipos estándar no se pueden borrar. - error_can_not_invite_user: Error al enviar la invitación al usuario. - error_can_not_remove_role: Este rol esta en uso y no puede ser eliminado - error_can_not_reopen_work_package_on_closed_version: No se puede volver a abrir - un paquete de trabajo asignado a una versión cerrada - error_can_not_find_all_resources: No se encontraron todos los recursos relacionados - con esta solicitud. - error_can_not_unarchive_project: 'Este proyecto no se puede recuperar: %{errors}' - error_check_user_and_role: Por favor elige un usuario y un rol. - error_code: Error %{code} - error_color_could_not_be_saved: No se pudo guardar el color - error_cookie_missing: No se encuentra la cookie de OpenProject. Por favor asegúrese - de que las cookies están habilitadas, ya que sin ellas esta aplicación no funcionará - correctamente. - error_custom_option_not_found: Esta opción no existe. - error_enterprise_plan_needed: Necesita el plan Enterprise %{plan} para realizar - esta acción. - error_enterprise_activation_user_limit: Su cuenta no puede ser activada (se alcanzó - el límite del usuario). Por favor, contacte su administrador para obtener acceso. - error_enterprise_token_invalid_domain: Enterprise no está activo. Su dominio del - token de Enterprise (%{actual}) no coincide con el nombre de host del sistema - (%{expected}). - error_failed_to_delete_entry: No se puede eliminar esta entrada. - error_in_dependent: 'Error al intentar alterar el objeto dependiente: %{dependent_class} - #%{related_id} - %{related_subject}: %{error}' - error_in_new_dependent: 'Error al crear el objeto dependiente: %{dependent_class} - - %{related_subject}: %{error}' - error_invalid_selected_value: El valor seleccionado no es válido. - error_journal_attribute_not_present: El diario no contiene el atributo %{attribute}. - error_pdf_export_too_many_columns: Demasiadas columnas seleccionadas para la exportación - de PDF. Reduzca el número de columnas. - error_pdf_date_range_too_long: El intervalo de fechas del paquete de trabajo seleccionado - supera el límite permitido para la exportación a PDF. Reduzca el intervalo a un - máximo de %{years} años. - error_pdf_failed_to_export: 'No se ha podido guardar la exportación PDF: %{error}' - error_token_authenticity: No se puede verificar el token de falsificación de solicitud - entre sitios. ¿Intentó enviar datos en varios navegadores o pestañas? Cierre de - todas las pestañas y vuelva a intentarlo. - error_reminder_not_found: No se ha encontrado el recordatorio o ya se ha notificado. - error_work_package_not_found_in_project: El paquete de trabajo no se ha encontrado - o no pertenece a este proyecto - error_work_package_id_not_found: No se ha encontrado el paquete de trabajo. - error_must_be_project_member: debe ser miembro del proyecto - error_migrations_are_pending: Su instalación de OpenProject tiene migraciones de - bases de datos pendientes. Es probable que haya pasado por alto la ejecución de - las migraciones en la última actualización. Consulte la guía de actualización - para actualizar correctamente su instalación. - error_migrations_visit_upgrade_guides: Visite la documentación de la Guía de actualización - error_no_default_work_package_status: Ningún estado del paquete trabajo predeterminado - está definido. Por favor, compruebe su configuración (ir a "Administración-> Situación - del paquete de trabajo"). - error_no_type_in_project: Ningún tipo se asocia a este proyecto. Por favor, Compruebe - la configuración del proyecto. - error_omniauth_registration_timed_out: El registro mediante un proveedor de autenticación - externa expiró. Por favor inténtelo nuevamente. - error_omniauth_invalid_auth: La información de autenticación proporcionada por el - proveedor de identidades no era válida. Póngase en contacto con el administrador - para obtener ayuda. - error_password_change_failed: Se produjo un error al intentar cambiar la contraseña. - error_scm_command_failed: 'Se produjo un error al intentar acceder al repositorio: - %{value}' - error_scm_not_found: La entrada o la revisión no se encontró en el repositorio. - error_type_could_not_be_saved: No se pudo guardar el tipo - error_unable_delete_status: El estado del paquete de trabajo no se puede eliminar - ya que esta siendo utilizado por al menos un paquete de trabajo. - error_unable_delete_default_status: No se puede eliminar el estado del paquete trabajo - por defecto. Por favor, seleccione otro estado de trabajo predeterminado antes - de eliminar el actual. - error_unable_to_connect: No se puede conectar (%{value}) - error_unable_delete_wiki: No se puede eliminar la página wiki. - error_unable_update_wiki: No se puede actualizar la página wiki. - error_workflow_copy_source: Por favor, seleccione un tipo de fuente o rol - error_workflow_copy_target: Por favor, seleccione tipo(s) de objetivos y role(s) + explanation: 'Este tipo contiene paquetes de trabajo y no se puede eliminar. Puede ver todos los paquetes de trabajo afectados en esta vista.' + error_can_not_delete_standard_type: "Tipos estándar no se pueden borrar." + error_can_not_invite_user: "Error al enviar la invitación al usuario." + error_can_not_remove_role: "Este rol esta en uso y no puede ser eliminado" + error_can_not_reopen_work_package_on_closed_version: "No se puede volver a abrir un paquete de trabajo asignado a una versión cerrada" + error_can_not_find_all_resources: "No se encontraron todos los recursos relacionados con esta solicitud." + error_can_not_unarchive_project: "Este proyecto no se puede recuperar: %{errors}" + error_check_user_and_role: "Por favor elige un usuario y un rol." + error_code: "Error %{code}" + error_color_could_not_be_saved: "No se pudo guardar el color" + error_cookie_missing: "No se encuentra la cookie de OpenProject. Por favor asegúrese de que las cookies están habilitadas, ya que sin ellas esta aplicación no funcionará correctamente." + error_custom_option_not_found: "Esta opción no existe." + error_enterprise_plan_needed: "Necesita el plan Enterprise %{plan} para realizar esta acción." + error_enterprise_activation_user_limit: "Su cuenta no puede ser activada (se alcanzó el límite del usuario). Por favor, contacte su administrador para obtener acceso." + error_enterprise_token_invalid_domain: "Enterprise no está activo. Su dominio del token de Enterprise (%{actual}) no coincide con el nombre de host del sistema (%{expected})." + error_failed_to_delete_entry: "No se puede eliminar esta entrada." + error_in_dependent: "Error al intentar alterar el objeto dependiente: %{dependent_class} #%{related_id} - %{related_subject}: %{error}" + error_in_new_dependent: "Error al crear el objeto dependiente: %{dependent_class} - %{related_subject}: %{error}" + error_invalid_selected_value: "El valor seleccionado no es válido." + error_journal_attribute_not_present: "El diario no contiene el atributo %{attribute}." + error_pdf_export_too_many_columns: "Demasiadas columnas seleccionadas para la exportación de PDF. Reduzca el número de columnas." + error_pdf_date_range_too_long: "El intervalo de fechas del paquete de trabajo seleccionado supera el límite permitido para la exportación a PDF. Reduzca el intervalo a un máximo de %{years} años." + error_pdf_failed_to_export: "No se ha podido guardar la exportación PDF: %{error}" + error_token_authenticity: "No se puede verificar el token de falsificación de solicitud entre sitios. ¿Intentó enviar datos en varios navegadores o pestañas? Cierre de todas las pestañas y vuelva a intentarlo." + error_reminder_not_found: "No se ha encontrado el recordatorio o ya se ha notificado." + error_work_package_not_found_in_project: "El paquete de trabajo no se ha encontrado o no pertenece a este proyecto" + error_work_package_id_not_found: "No se ha encontrado el paquete de trabajo." + error_must_be_project_member: "debe ser miembro del proyecto" + error_migrations_are_pending: "Su instalación de OpenProject tiene migraciones de bases de datos pendientes. Es probable que haya pasado por alto la ejecución de las migraciones en la última actualización. Consulte la guía de actualización para actualizar correctamente su instalación." + error_migrations_visit_upgrade_guides: "Visite la documentación de la Guía de actualización" + error_no_default_work_package_status: 'Ningún estado del paquete trabajo predeterminado está definido. Por favor, compruebe su configuración (ir a "Administración-> Situación del paquete de trabajo").' + error_no_type_in_project: "Ningún tipo se asocia a este proyecto. Por favor, Compruebe la configuración del proyecto." + error_omniauth_registration_timed_out: "El registro mediante un proveedor de autenticación externa expiró. Por favor inténtelo nuevamente." + error_omniauth_invalid_auth: "La información de autenticación proporcionada por el proveedor de identidades no era válida. Póngase en contacto con el administrador para obtener ayuda." + error_password_change_failed: "Se produjo un error al intentar cambiar la contraseña." + error_scm_command_failed: "Se produjo un error al intentar acceder al repositorio: %{value}" + error_scm_not_found: "La entrada o la revisión no se encontró en el repositorio." + error_type_could_not_be_saved: "No se pudo guardar el tipo" + error_unable_delete_status: "El estado del paquete de trabajo no se puede eliminar ya que esta siendo utilizado por al menos un paquete de trabajo." + error_unable_delete_default_status: "No se puede eliminar el estado del paquete trabajo por defecto. Por favor, seleccione otro estado de trabajo predeterminado antes de eliminar el actual." + error_unable_to_connect: "No se puede conectar (%{value})" + error_unable_delete_wiki: "No se puede eliminar la página wiki." + error_unable_update_wiki: "No se puede actualizar la página wiki." + error_workflow_copy_source: "Por favor, seleccione un tipo de fuente o rol" + error_workflow_copy_target: "Por favor, seleccione tipo(s) de objetivos y role(s)" error_menu_item_not_created: No se pudo agregar el elemento de menú error_menu_item_not_saved: Elemento de menú no podría ser guardado - error_wiki_root_menu_item_conflict: 'No se puede renombrar "%{old_name}" a "%{new_name}" - debido a un conflicto en el elemento de menú resultante con el elemento de menú - existente "%{existing_caption}" (%{existing_identifier}). - - ' - error_external_authentication_failed_message: 'Se ha producido un error durante - la autenticación externa: %{message}' - error_attribute_not_highlightable: 'Atributos que no pueden resaltarse: %{attributes}' + error_wiki_root_menu_item_conflict: > + No se puede renombrar "%{old_name}" a "%{new_name}" debido a un conflicto en el elemento de menú resultante con el elemento de menú existente "%{existing_caption}" (%{existing_identifier}). + error_external_authentication_failed_message: "Se ha producido un error durante la autenticación externa: %{message}" + error_attribute_not_highlightable: "Atributos que no pueden resaltarse: %{attributes}" events: - changeset: Set de cambios editado + changeset: "Set de cambios editado" message: Mensaje editado news: Noticias - project_details: Detalles del proyecto editados - project: Proyecto editado - projects: Proyecto editado + project_details: "Detalles del proyecto editados" + project: "Proyecto editado" + projects: "Proyecto editado" reply: Respondió - time_entry: Tiempo de ingreso editado - wiki_page: Página wiki editada - work_package_closed: Paquete de trabajo cerrada - work_package_edit: Paquete de trabajo editado - work_package_note: Nota de paquete de trabajo añadido + time_entry: "Tiempo de ingreso editado" + wiki_page: "Página wiki editada" + work_package_closed: "Paquete de trabajo cerrada" + work_package_edit: "Paquete de trabajo editado" + work_package_note: "Nota de paquete de trabajo añadido" title: - project: 'Proyecto: %{name}' - subproject: 'Subproyecto: %{name}' + project: "Proyecto: %{name}" + subproject: "Subproyecto: %{name}" export: dialog: - title: Exportar - submit: Exportar + title: "Exportar" + submit: "Exportar" save_export_settings: - label: Guardar ajustes + label: "Guardar ajustes" format: - label: Formato del archivo + label: "Formato del archivo" options: csv: - label: CSV + label: "CSV" pdf: - label: PDF + label: "PDF" xls: - label: XLS + label: "XLS" columns: - input_label_report: Añadir columnas a la tabla de atributos - input_caption_report: Por defecto se seleccionan todos los atributos añadidos - como columnas en la lista de paquetes de trabajo. Los campos de texto largo - no están disponibles en la tabla de atributos, pero pueden mostrarse debajo - de ella. - input_caption_table: Por defecto se seleccionan todos los atributos añadidos - como columnas en la lista de paquetes de trabajo. Los campos de texto largo - no están disponibles en las exportaciones basadas en tablas. - input_caption_required: No es posible exportar la vista sin ninguna columna. - Añada al menos una columna. + input_label_report: "Añadir columnas a la tabla de atributos" + input_caption_report: "Por defecto se seleccionan todos los atributos añadidos como columnas en la lista de paquetes de trabajo. Los campos de texto largo no están disponibles en la tabla de atributos, pero pueden mostrarse debajo de ella." + input_caption_table: "Por defecto se seleccionan todos los atributos añadidos como columnas en la lista de paquetes de trabajo. Los campos de texto largo no están disponibles en las exportaciones basadas en tablas." + input_caption_required: "No es posible exportar la vista sin ninguna columna. Añada al menos una columna." pdf: export_type: - label: Tipo de exportación PDF + label: "Tipo de exportación PDF" options: table: - label: Tabla - caption: Exportar la lista de paquetes de trabajo en una tabla con las - columnas deseadas. + label: "Tabla" + caption: "Exportar la lista de paquetes de trabajo en una tabla con las columnas deseadas." report: - label: Informe - caption: Exportar el paquete de trabajo en un informe detallado de todos - los paquetes de trabajo de la lista. + label: "Informe" + caption: "Exportar el paquete de trabajo en un informe detallado de todos los paquetes de trabajo de la lista." gantt: - label: Diagrama de Gantt - caption: Exportar la lista de paquetes de trabajo en una vista de diagrama - de Gantt. + label: "Diagrama de Gantt" + caption: "Exportar la lista de paquetes de trabajo en una vista de diagrama de Gantt." include_images: - label: Incluir imágenes - caption: Excluir las imágenes para reducir el tamaño de la exportación a - PDF. + label: "Incluir imágenes" + caption: "Excluir las imágenes para reducir el tamaño de la exportación a PDF." gantt_zoom_levels: - label: Niveles de Zoom - caption: Seleccionar cuál es el nivel de zoom para las fechas que aparecen - en el gráfico. + label: "Niveles de Zoom" + caption: "Seleccionar cuál es el nivel de zoom para las fechas que aparecen en el gráfico." options: - days: Días - weeks: Semanas - months: Meses - quarters: Trimestres + days: "Días" + weeks: "Semanas" + months: "Meses" + quarters: "Trimestres" column_width: - label: Ancho de columna de la tabla + label: "Ancho de columna de la tabla" options: - narrow: Estrecho - medium: Mediano - wide: Ancho - very_wide: Muy ancho + narrow: "Estrecho" + medium: "Mediano" + wide: "Ancho" + very_wide: "Muy ancho" paper_size: - label: Tamaño del papel - caption: En función del tamaño del gráfico, es posible que se exporte más - de una página. + label: "Tamaño del papel" + caption: "En función del tamaño del gráfico, es posible que se exporte más de una página." long_text_fields: - input_caption: Por defecto se seleccionan todos los campos de texto largo. - input_label: Añadir campos de texto largo - input_placeholder: Buscar campos de texto largo - drag_area_label: Gestionar campos de texto largo + input_caption: "Por defecto se seleccionan todos los campos de texto largo." + input_label: "Añadir campos de texto largo" + input_placeholder: "Buscar campos de texto largo" + drag_area_label: "Gestionar campos de texto largo" xls: include_relations: - label: Incluir relaciones - caption: Esta opción creará un duplicado de cada paquete de trabajo por - cada relación que este tenga con otro paquete de trabajo. + label: "Incluir relaciones" + caption: "Esta opción creará un duplicado de cada paquete de trabajo por cada relación que este tenga con otro paquete de trabajo." include_descriptions: - label: Incluir descripciones - caption: Esta opción añadirá una columna de descripción en formato bruto. - your_work_packages_export: Se están exportando paquetes de trabajo - your_projects_export: Se están exportando proyectos - succeeded: Exportación completada - failed: 'Se ha producido un error al intentar exportar los paquetes de trabajo: - %{message}' + label: "Incluir descripciones" + caption: "Esta opción añadirá una columna de descripción en formato bruto." + your_work_packages_export: "Se están exportando paquetes de trabajo" + your_projects_export: "Se están exportando proyectos" + succeeded: "Exportación completada" + failed: "Se ha producido un error al intentar exportar los paquetes de trabajo: %{message}" demo: - heading: PDF de demostración - footer: Generado por OpenProject + heading: "PDF de demostración" + footer: "Generado por OpenProject" button_text: Generar PDF de demostración errors: - embedded_table_with_too_many_columns: Esta tabla de paquetes de trabajo incrustada - no cabía en la página, reduzca el número de columnas. + embedded_table_with_too_many_columns: "Esta tabla de paquetes de trabajo incrustada no cabía en la página, reduzca el número de columnas." format: - atom: Atomo - csv: CSV - pdf: PDF - pdf_overview_table: Tabla PDF - pdf_report_with_images: Informe PDF con imágenes - pdf_report: Informe PDF - pdf_gantt: PDF Gantt + atom: "Atomo" + csv: "CSV" + pdf: "PDF" + pdf_overview_table: "Tabla PDF" + pdf_report_with_images: "Informe PDF con imágenes" + pdf_report: "Informe PDF" + pdf_gantt: "PDF Gantt" image: - omitted: Imagen no exportada. + omitted: "Imagen no exportada." macro: - error: Error de macro, %{message} - attribute_not_found: 'atributo no encontrado: %{attribute}' - model_not_found: 'modelo de atributo no válido: %{model}' - resource_not_found: 'recurso no encontrado: %{resource}' - nested_rich_text_unsupported: Actualmente no se admite la incrustación de texto - enriquecido anidado en la exportación + error: "Error de macro, %{message}" + attribute_not_found: "atributo no encontrado: %{attribute}" + model_not_found: "modelo de atributo no válido: %{model}" + resource_not_found: "recurso no encontrado: %{resource}" + nested_rich_text_unsupported: "Actualmente no se admite la incrustación de texto enriquecido anidado en la exportación" units: hours: h days: d pdf_generator: - page_nr_footer: Página %{page} de %{total} + page_nr_footer: "Página %{page} de %{total}" template_attributes: - label: Atributos y descripción - caption: Todos los atributos presentes en la configuración actual del formulario - utilizando la plantilla por defecto. + label: "Atributos y descripción" + caption: Todos los atributos presentes en la configuración actual del formulario utilizando la plantilla por defecto. template_contract: - label: Contrato - caption: Detalles del paquete de trabajo formateados según el formulario de - contrato estándar alemán. + label: "Contrato" + caption: Detalles del paquete de trabajo formateados según el formulario de contrato estándar alemán. dialog: title: Generar PDF submit: Descargar templates: - label: Plantilla - none_enabled: No se ha habilitado ninguna plantilla para este tipo de paquete - de trabajo + label: "Plantilla" + none_enabled: "No se ha habilitado ninguna plantilla para este tipo de paquete de trabajo" footer_center: label: Texto a pie de página caption: Este texto aparecerá en cada página en el centro del pie de página. @@ -3662,98 +3032,91 @@ es: landscape: Horizontal extraction: available: - pdftotext: Pdftotext disponible (opcional) - unrtf: Unrtf disponible (opcional) - catdoc: Catdoc disponible (opcional) - xls2csv: Xls2csv disponible (opcional) - catppt: Catppt disponible (opcional) - tesseract: Tesseract disponible (opcional) + pdftotext: "Pdftotext disponible (opcional)" + unrtf: "Unrtf disponible (opcional)" + catdoc: "Catdoc disponible (opcional)" + xls2csv: "Xls2csv disponible (opcional)" + catppt: "Catppt disponible (opcional)" + tesseract: "Tesseract disponible (opcional)" filterable_tree_view: filter_mode: - all: Todos - label: Modo de filtro - selected: Seleccionado - include_sub_items: Incluir subelementos - no_results_text: No hay resultados + all: "Todos" + label: "Modo de filtro" + selected: "Seleccionado" + include_sub_items: "Incluir subelementos" + no_results_text: "No hay resultados" toggle_switch: - label_on: Encendido - label_off: Apagado + label_on: "Encendido" + label_off: "Apagado" general_csv_decimal_separator: "." - general_csv_encoding: UTF-8 + general_csv_encoding: "UTF-8" general_csv_separator: "," - general_first_day_of_week: '7' - general_pdf_encoding: ISO-8859-1 - general_text_no: 'no' - general_text_yes: sí - general_text_No: 'No' - general_text_Yes: Sí - general_text_true: verdadero - general_text_false: falso - gui_validation_error: 1 error - gui_validation_error_plural: errores %{count} + general_first_day_of_week: "7" + general_pdf_encoding: "ISO-8859-1" + general_text_no: "no" + general_text_yes: "sí" + general_text_No: "No" + general_text_Yes: "Sí" + general_text_true: "verdadero" + general_text_false: "falso" + gui_validation_error: "1 error" + gui_validation_error_plural: "errores %{count}" homescreen: additional: - projects: Projectos visibles mas recientes en esta instancia. - no_visible_projects: No hay ningún proyecto visible en esta instancia. - users: Usuarios registrados mas recientes en esta instancia. + projects: "Projectos visibles mas recientes en esta instancia." + no_visible_projects: "No hay ningún proyecto visible en esta instancia." + users: "Usuarios registrados mas recientes en esta instancia." blocks: - community: OpenProject Community + community: "OpenProject Community" upsell: - title: Actualizar a la edición Enterprise + title: "Actualizar a la edición Enterprise" new_features: - header: Obtenga información sobre nuevas funciones y actualizaciones de productos. - learn_about: Más información sobre todas las nuevas funciones - missing: Aún no hay funciones destacadas. - '17_2': - new_features_title: 'El lanzamiento incluye varias funciones nuevas y mejoras, - tales como: - - ' + header: "Obtenga información sobre nuevas funciones y actualizaciones de productos." + learn_about: "Más información sobre todas las nuevas funciones" + missing: "Aún no hay funciones destacadas." + #We need to include the version to invalidate outdated translations in other locales + "17_2": + new_features_title: > + El lanzamiento incluye varias funciones nuevas y mejoras, tales como: new_features_list: - line_0: Flujos de trabajo de IA con un servidor MCP seguro (plan Professional - y superiores) - line_1: Página de inicio del proyecto mejorada con un nuevo widget para - presupuestos y accesibilidad mejorada - line_2: 'Reuniones: plantillas de reuniones (plan Basic y superiores)' - line_3: Mayor transparencia con los comentarios sobre los atributos del - proyecto + line_0: Flujos de trabajo de IA con un servidor MCP seguro (plan Professional y superiores) + line_1: Página de inicio del proyecto mejorada con un nuevo widget para presupuestos y accesibilidad mejorada + line_2: "Reuniones: plantillas de reuniones (plan Basic y superiores)" + line_3: Mayor transparencia con los comentarios sobre los atributos del proyecto line_4: Mejoras en la exportación a PDF line_5: Mayor seguridad para los enlaces externos (plan Premium y superiores) line_6: Mejoras en UI/UX en el módulo de backlogs line_7: Formularios de campos personalizados armonizados links: - upgrade_enterprise_edition: Actualizar a Enterprise - postgres_migration: Migrando su instalación a PostgreSQL - user_guides: Guia de usuario - faq: Preguntas Frecuentes - impressum: Aviso legal - glossary: Glosario - shortcuts: Accesos directos - blog: Blog de OpenProject - forums: Foro de Community - security_alerts: Alertas de seguridad - newsletter: Boletín de noticias + upgrade_enterprise_edition: "Actualizar a Enterprise" + postgres_migration: "Migrando su instalación a PostgreSQL" + user_guides: "Guia de usuario" + faq: "Preguntas Frecuentes" + impressum: "Aviso legal" + glossary: "Glosario" + shortcuts: "Accesos directos" + blog: "Blog de OpenProject" + forums: "Foro de Community" + security_alerts: "Alertas de seguridad" + newsletter: "Boletín de noticias" image_conversion: - imagemagick: Imagemagick + imagemagick: "Imagemagick" journals: - changes_retracted: Se deshicieron los cambios. + changes_retracted: "Se deshicieron los cambios." caused_changes: - budget_deleted: Se ha eliminado el presupuesto - dates_changed: Cambio de fechas - default_attribute_written: Atributos de solo lectura escritos - import: Importado - progress_mode_changed_to_status_based: Cálculo del progreso actualizado - status_changed: Estado «%{status_name}» - system_update: 'Actualización del sistema OpenProject:' - work_package_duplicate_closed: 'Paquete de trabajo duplicado actualizado:' - total_percent_complete_mode_changed_to_work_weighted_average: El cálculo de - los totales de % completado ahora se pondera por Trabajo. - total_percent_complete_mode_changed_to_simple_average: El cálculo de los totales - de % completado se basa ahora en una media simple de solo los valores de % - completado. + budget_deleted: "Se ha eliminado el presupuesto" + dates_changed: "Cambio de fechas" + default_attribute_written: "Atributos de solo lectura escritos" + import: "Importado" + progress_mode_changed_to_status_based: "Cálculo del progreso actualizado" + status_changed: "Estado «%{status_name}»" + system_update: "Actualización del sistema OpenProject:" + work_package_duplicate_closed: "Paquete de trabajo duplicado actualizado:" + total_percent_complete_mode_changed_to_work_weighted_average: "El cálculo de los totales de % completado ahora se pondera por Trabajo." + total_percent_complete_mode_changed_to_simple_average: "El cálculo de los totales de % completado se basa ahora en una media simple de solo los valores de % completado." cause_descriptions: import: - header: cambios de %{author} + header: "cambios de %{author}" field_changed: "%{field} ha cambiado de %{old_value} a %{new_value}" field_set: "%{field} configurado a %{value}" field_removed: "%{field} eliminado" @@ -3765,1075 +3128,991 @@ es: work_package_parent_changed_times: por cambios al %{link} principal work_package_children_changed_times: por cambios en el secundario %{link} work_package_related_changed_times: por cambios en los %{link} relacionados - work_package_duplicate_closed: El estado fue actualizado automáticamente por - el paquete de trabajo duplicado %{link} + work_package_duplicate_closed: El estado fue actualizado automáticamente por el paquete de trabajo duplicado %{link} unaccessable_work_package_changed: por cambios en un paquete de trabajo relacionado budget_deleted: Se ha eliminado el presupuesto working_days_changed: - changed: por cambios en días laborables (%{changes}) + changed: "por cambios en días laborables (%{changes})" days: working: "%{day} es ahora laboral" non_working: "%{day} es ahora no laboral" dates: working: "%{date} es ahora laboral" non_working: "%{date} es ahora no laboral" - progress_mode_changed_to_status_based: Modo de cálculo del progreso establecido - como basado en el estado - status_excluded_from_totals_set_to_false_message: ahora incluido en totales - de jerarquía - status_excluded_from_totals_set_to_true_message: ahora excluido de los totales - de la jerarquía - status_percent_complete_changed: "% completado cambiado de %{old_value} % a - %{new_value} %" + progress_mode_changed_to_status_based: Modo de cálculo del progreso establecido como basado en el estado + status_excluded_from_totals_set_to_false_message: ahora incluido en totales de jerarquía + status_excluded_from_totals_set_to_true_message: ahora excluido de los totales de la jerarquía + status_percent_complete_changed: "% completado cambiado de %{old_value} % a %{new_value} %" system_update: - file_links_journal: 'A partir de ahora, la actividad relacionada con los enlaces - de archivos (archivos almacenados en almacenamiento externo) aparecerá aquí - en la pestaña Actividad. La siguiente representa la actividad relativa a - los enlaces que ya existían: - - ' - progress_calculation_adjusted_from_disabled_mode: Cálculo de progreso automático - establecido en modo de trabajo y ajustado - con la actualización de versión. - progress_calculation_adjusted: Cálculo de progreso automático ajustado con la actualización de versión. - scheduling_mode_adjusted: El modo de programación se ajusta automáticamente - con la actualización de la versión. - totals_removed_from_childless_work_packages: Los totales de trabajo y progreso - se eliminan automáticamente para los paquetes de trabajo no padres con la - actualización de la versión. Se trata - de una tarea de mantenimiento y puede ignorarse con seguridad. - total_percent_complete_mode_changed_to_work_weighted_average: Los paquetes de - trabajo para niños sin Trabajo se ignoran. - total_percent_complete_mode_changed_to_simple_average: Se ignoran los valores - de trabajo de los paquetes de trabajo secundarios. + file_links_journal: > + A partir de ahora, la actividad relacionada con los enlaces de archivos (archivos almacenados en almacenamiento externo) aparecerá aquí en la pestaña Actividad. La siguiente representa la actividad relativa a los enlaces que ya existían: + progress_calculation_adjusted_from_disabled_mode: >- + Cálculo de progreso automático establecido en modo de trabajo y ajustado con la actualización de versión. + progress_calculation_adjusted: >- + Cálculo de progreso automático ajustado con la actualización de versión. + scheduling_mode_adjusted: >- + El modo de programación se ajusta automáticamente con la actualización de la versión. + totals_removed_from_childless_work_packages: >- + Los totales de trabajo y progreso se eliminan automáticamente para los paquetes de trabajo no padres con la actualización de la versión. Se trata de una tarea de mantenimiento y puede ignorarse con seguridad. + total_percent_complete_mode_changed_to_work_weighted_average: >- + Los paquetes de trabajo para niños sin Trabajo se ignoran. + total_percent_complete_mode_changed_to_simple_average: >- + Se ignoran los valores de trabajo de los paquetes de trabajo secundarios. links: - configuration_guide: Guía de configuración + configuration_guide: "Guía de configuración" get_in_touch: "¿Tiene alguna pregunta? Póngase en contacto con nosotros." - instructions_after_registration: Podras entrar tan pronto como tu cuenta halla sido - activada haciendo clic sobre %{signin}. - instructions_after_logout: Puedes entrar nuevamente haciendo clic sobre %{signin}. - instructions_after_error: Puedes intentar entrar nuevamente haciendo clic sobre - %{signin}. Si el error persiste, contacta a tu administrador para que te ayude. + instructions_after_registration: "Podras entrar tan pronto como tu cuenta halla sido activada haciendo clic sobre %{signin}." + instructions_after_logout: "Puedes entrar nuevamente haciendo clic sobre %{signin}." + instructions_after_error: "Puedes intentar entrar nuevamente haciendo clic sobre %{signin}. Si el error persiste, contacta a tu administrador para que te ayude." menus: admin: - ai: Inteligencia artificial (IA) - aggregation: Agregación - api_and_webhooks: API y webhooks - mail_notification: Notificaciones de correo electrónico - mails_and_notifications: Correos electrónicos y notificaciones - mcp_configurations: Protocolo de contexto de modelo (MCP) + ai: "Inteligencia artificial (IA)" + aggregation: "Agregación" + api_and_webhooks: "API y webhooks" + mail_notification: "Notificaciones de correo electrónico" + mails_and_notifications: "Correos electrónicos y notificaciones" + mcp_configurations: "Protocolo de contexto de modelo (MCP)" quick_add: - label: Añadir… + label: "Añadir…" my_account: access_tokens: - description: Los tokens de proveedor son emitidos por OpenProject y permiten - a otras aplicaciones acceder a él. Los tokens de cliente son emitidos por - otras aplicaciones y permiten a OpenProject acceder a ellos. + description: "Los tokens de proveedor son emitidos por OpenProject y permiten a otras aplicaciones acceder a él. Los tokens de cliente son emitidos por otras aplicaciones y permiten a OpenProject acceder a ellos." no_results: - title: Ningún token de acceso que mostrar - description: Todos ellos han sido desabilitados. Pueden ser rehabilitados - en el menú de administración. - access_tokens: Tokens de acceso + title: "Ningún token de acceso que mostrar" + description: "Todos ellos han sido desabilitados. Pueden ser rehabilitados en el menú de administración." + access_tokens: "Tokens de acceso" headers: - action: Acción - expiration: Expira - indefinite_expiration: Nunca + action: "Acción" + expiration: "Expira" + indefinite_expiration: "Nunca" simple_revoke_confirmation: "¿Seguro que desea revocar este token?" tabs: client: - title: Tokens de cliente + title: "Tokens de cliente" provider: - title: Tokens de proveedor + title: "Tokens de proveedor" token/api: - blank_description: Aún no hay tokens API. Puede crear uno utilizando el botón - de abajo. - blank_title: No hay tokens API - title: API - table_title: Tokens API - text_hint: Los tokens API permiten a las aplicaciones de terceros comunicarse - con esta instancia de OpenProject a través de las API REST. - static_token_name: Token API - disabled_text: Los tokens API no están habilitados por el administrador. Póngase - en contacto con su administrador para utilizar esta función. - add_button: Token API + blank_description: "Aún no hay tokens API. Puede crear uno utilizando el botón de abajo." + blank_title: "No hay tokens API" + title: "API" + table_title: "Tokens API" + text_hint: "Los tokens API permiten a las aplicaciones de terceros comunicarse con esta instancia de OpenProject a través de las API REST." + static_token_name: "Token API" + disabled_text: "Los tokens API no están habilitados por el administrador. Póngase en contacto con su administrador para utilizar esta función." + add_button: "Token API" ical: - blank_description: Para añadir un token de iCalendar, suscríbase a un calendario - nuevo o existente desde el módulo Calendario de un proyecto. Debe disponer - de los permisos necesarios. - blank_title: No hay token de iCalendar - title: iCalendar - table_title: Tokens de iCalendar - text_hint_link: Los tokens iCalendar permiten a los usuarios [suscribirse - a calendarios de OpenProject](docs_url) y ver la información actualizada - de los paquetes de trabajo des de clientes externos. - disabled_text: Las suscripciones a iCalendar no están habilitadas por el administrador. - Póngase en contacto con su administrador para utilizar esta función. + blank_description: "Para añadir un token de iCalendar, suscríbase a un calendario nuevo o existente desde el módulo Calendario de un proyecto. Debe disponer de los permisos necesarios." + blank_title: "No hay token de iCalendar" + title: "iCalendar" + table_title: "Tokens de iCalendar" + text_hint_link: "Los tokens iCalendar permiten a los usuarios [suscribirse a calendarios de OpenProject](docs_url) y ver la información actualizada de los paquetes de trabajo des de clientes externos." + disabled_text: "Las suscripciones a iCalendar no están habilitadas por el administrador. Póngase en contacto con su administrador para utilizar esta función." oauth_application: - active_tokens: Tokens activos - blank_description: No hay ningún acceso a aplicaciones de terceros configurado - y activo para usted. - blank_title: No hay token de aplicación OAuth - last_refreshed_at: Última actualización el - title: OAuth - table_title: Tokens de aplicación OAuth - text_hint: Los tokens de aplicación OAuth permiten a las aplicaciones de terceros - conectarse con esta instancia de OpenProject. + active_tokens: "Tokens activos" + blank_description: "No hay ningún acceso a aplicaciones de terceros configurado y activo para usted." + blank_title: "No hay token de aplicación OAuth" + last_refreshed_at: "Última actualización el" + title: "OAuth" + table_title: "Tokens de aplicación OAuth" + text_hint: "Los tokens de aplicación OAuth permiten a las aplicaciones de terceros conectarse con esta instancia de OpenProject." oauth_client: - blank_description: Aún no hay tokens de cliente de OAuth. - blank_title: No hay tokens de cliente de OAuth - failed: Se ha producido un error y no se ha podido eliminar el token. Inténtelo - de nuevo más tarde. - integration_type: Tipo de integración - table_title: Tokens de cliente de OAuth - text_hint: Los tokens de cliente de OAuth permiten a esta instancia de OpenProject - conectarse con aplicaciones externas, como almacenamientos de archivos. - title: OAuth - remove_token: "¿Seguro que desea eliminar este token? Tendrá que volver a - iniciar sesión en %{integration}." - removed: Token de cliente de OAuth eliminado con éxito - unknown_integration: Desconocido + blank_description: "Aún no hay tokens de cliente de OAuth." + blank_title: "No hay tokens de cliente de OAuth" + failed: "Se ha producido un error y no se ha podido eliminar el token. Inténtelo de nuevo más tarde." + integration_type: "Tipo de integración" + table_title: "Tokens de cliente de OAuth" + text_hint: "Los tokens de cliente de OAuth permiten a esta instancia de OpenProject conectarse con aplicaciones externas, como almacenamientos de archivos." + title: "OAuth" + remove_token: "¿Seguro que desea eliminar este token? Tendrá que volver a iniciar sesión en %{integration}." + removed: "Token de cliente de OAuth eliminado con éxito" + unknown_integration: "Desconocido" token/rss: - add_button: Token RSS - blank_description: Aún no hay tokens RSS. Puede crear uno utilizando el botón - de abajo. - blank_title: No hay tokens RSS - title: RSS - table_title: Tokens RSS - text_hint: Los tokens RSS permiten a los usuarios mantenerse al día con los - últimos cambios en esta instancia de OpenProject mediante un lector RSS - externo. - static_token_name: Token RSS - disabled_text: Los tokens RSS no están habilitados por el administrador. Póngase - en contacto con su administrador para utilizar esta función. + add_button: "Token RSS" + blank_description: "Aún no hay tokens RSS. Puede crear uno utilizando el botón de abajo." + blank_title: "No hay tokens RSS" + title: "RSS" + table_title: "Tokens RSS" + text_hint: "Los tokens RSS permiten a los usuarios mantenerse al día con los últimos cambios en esta instancia de OpenProject mediante un lector RSS externo." + static_token_name: "Token RSS" + disabled_text: "Los tokens RSS no están habilitados por el administrador. Póngase en contacto con su administrador para utilizar esta función." storages: - unknown_storage: Almacenamiento desconocido + unknown_storage: "Almacenamiento desconocido" notifications: reasons: - assigned: Asignado a - dateAlert: Alerta de fecha - mentioned: Mencionado - responsible: Responsable - shared: Compartido - watched: Observador - reminder: Recordatorio + assigned: "Asignado a" + dateAlert: "Alerta de fecha" + mentioned: "Mencionado" + responsible: "Responsable" + shared: "Compartido" + watched: "Observador" + reminder: "Recordatorio" facets: - unread: No leídas - unread_title: Mostrar no leídos - all: Todos - all_title: Mostrar todo + unread: "No leídas" + unread_title: "Mostrar no leídos" + all: "Todos" + all_title: "Mostrar todo" menu: - by_project: No leído por proyecto - by_reason: Motivo - inbox: Bandeja de entrada - send_notifications: Enviar notificaciones para esta acción + by_project: "No leído por proyecto" + by_reason: "Motivo" + inbox: "Bandeja de entrada" + send_notifications: "Enviar notificaciones para esta acción" work_packages: subject: - created: Se creó el paquete de trabajo. - assigned: Has sido asignado a %{work_package} - subscribed: Te has suscrito a %{work_package} - mentioned: Has sido mencionado en %{work_package} - responsible: Ahora es responsable de %{work_package} - watched: Estás viendo a %{work_package} + created: "Se creó el paquete de trabajo." + assigned: "Has sido asignado a %{work_package}" + subscribed: "Te has suscrito a %{work_package}" + mentioned: "Has sido mencionado en %{work_package}" + responsible: "Ahora es responsable de %{work_package}" + watched: "Estás viendo a %{work_package}" query: - invalid_filter: Filtro de notificación no válido - label_accessibility: Accesibilidad - label_account: Cuenta - label_active: Activo - label_activate_user: Activar usuario - label_active_in_new_projects: Activo en nuevos proyectos - label_activity: Actividad - label_add_edit_translations: Añadir y editar traducciones - label_add_another_file: Agregar otro archivo - label_add_columns: Agregar columnas seleccionadas - label_add_note: Añadir una nota - label_add_projects: Añadir proyectos - label_add_related_work_packages: Añadir paquetes de trabajo relacionados - label_add_subtask: Agregar subtarea - label_added: agregado - label_added_by: Añadido por %{author} - label_added_by_on: Añadido por %{author} el %{date} - label_added_time_by: Añadida por %{author} hace %{age} - label_additional_workflow_transitions_for_assignee: Transiciones adicionales permitidas - cuando el usuario es el asignado - label_additional_workflow_transitions_for_author: Transiciones adicionales permitidas - cuando el usuario es el autor - label_administration: Administración - label_interface_colors: Colores de la interfaz - label_interface_colors_description: 'Estos colores controlan el aspecto de la aplicación. - Si los modifica, el tema cambiará automáticamente a Tema personalizado, pero no - podemos asegurar el cumplimiento de los mínimos de contraste de accesibilidad - (WCAG 2.1). ' - label_age: Edad - label_ago: días antes - label_all: todos - label_all_time: todo el tiempo - label_all_words: Todas las palabras - label_all_open_wps: Todo abierto - label_always_visible: Siempre se muestra - label_announcement: Aviso - label_angular: AngularJS - label_app_modules: Módulos %{app_title} - label_api_access_key: Código de acceso API - label_api_access_key_created_on: Código de acceso API creado hace %{value} - label_api_access_key_type: API + invalid_filter: "Filtro de notificación no válido" + label_accessibility: "Accesibilidad" + label_account: "Cuenta" + label_active: "Activo" + label_activate_user: "Activar usuario" + label_active_in_new_projects: "Activo en nuevos proyectos" + label_activity: "Actividad" + label_add_edit_translations: "Añadir y editar traducciones" + label_add_another_file: "Agregar otro archivo" + label_add_columns: "Agregar columnas seleccionadas" + label_add_note: "Añadir una nota" + label_add_projects: "Añadir proyectos" + label_add_related_work_packages: "Añadir paquetes de trabajo relacionados" + label_add_subtask: "Agregar subtarea" + label_added: "agregado" + label_added_by: "Añadido por %{author}" + label_added_by_on: "Añadido por %{author} el %{date}" + label_added_time_by: "Añadida por %{author} hace %{age}" + label_additional_workflow_transitions_for_assignee: "Transiciones adicionales permitidas cuando el usuario es el asignado" + label_additional_workflow_transitions_for_author: "Transiciones adicionales permitidas cuando el usuario es el autor" + label_administration: "Administración" + label_interface_colors: "Colores de la interfaz" + label_interface_colors_description: "Estos colores controlan el aspecto de la aplicación. Si los modifica, el tema cambiará automáticamente a Tema personalizado, pero no podemos asegurar el cumplimiento de los mínimos de contraste de accesibilidad (WCAG 2.1). " + label_age: "Edad" + label_ago: "días antes" + label_all: "todos" + label_all_time: "todo el tiempo" + label_all_words: "Todas las palabras" + label_all_open_wps: "Todo abierto" + label_always_visible: "Siempre se muestra" + label_announcement: "Aviso" + label_angular: "AngularJS" + label_app_modules: "Módulos %{app_title}" + label_api_access_key: "Código de acceso API" + label_api_access_key_created_on: "Código de acceso API creado hace %{value}" + label_api_access_key_type: "API" label_auto_option: "(auto)" - label_ical_access_key_type: iCalendar - label_ical_access_key_description: Token de iCalendar «%{token_name}» para «%{calendar_name}» - en «%{project_name}» - label_ical_access_key_not_present: Token(s) de iCalendar no presente(s). - label_ical_access_key_generation_hint: Se genera automáticamente al suscribirse - a un calendario. - label_ical_access_key_latest: último - label_ical_access_key_revoke: Revocar - label_add_column: Añadir columna - label_applied_status: Estado aplicado - label_archive_project: Archivar proyecto - label_ascending: Ascendente - label_assigned_to_me_work_packages: Paquetes de trabajo asignados a mí - label_associated_revisions: Revisiones asociadas - label_attachment_plural: Archivos adjuntos - label_attribute: Atributo - label_attribute_plural: Atributos - label_ldap_auth_source_new: Nueva conexión LDAP - label_ldap_auth_source: Conexión LDAP - label_ldap_auth_source_plural: Conexiones LDAP - label_attribute_expand_text: El texto completo para «%{attribute}» - label_authentication: Autentificación - label_available_custom_fields_projects: Proyectos de campos personalizados disponibles - label_available_global_roles: Roles globales disponibles - label_available_project_attributes: Atributos del proyecto disponibles - label_available_project_forums: Foros disponibles - label_available_project_repositories: Repositorios disponibles - label_available_project_versions: Versiones disponibles - label_available_project_work_package_categories: Categorias de paquetes de trabjo - disponibles - label_available_project_work_package_types: Tipos de paquete de trabajo disponibles - label_available_projects: Proyectos disponibles - label_api_doc: Documentación de la API - label_backup: Copia de seguridad - label_backup_code: Código de copia de seguridad - label_basic_details: Detalles básicos - label_between: entre - label_blocked_by: bloqueado por - label_blocks: bloques - label_blog: Blog - label_forums_locked: Bloqueado - label_forum_new: Foro nuevo - label_forum_plural: Foros - label_forum_sticky: Fijo - label_boolean: Booleano - label_board_plural: Tableros - label_branch: Sucursal - label_browse: Explorar - label_builtin: Integrado - label_bulk_edit_selected_work_packages: Edición masiva de paquetes de trabajo + label_ical_access_key_type: "iCalendar" + label_ical_access_key_description: 'Token de iCalendar «%{token_name}» para «%{calendar_name}» en «%{project_name}»' + label_ical_access_key_not_present: "Token(s) de iCalendar no presente(s)." + label_ical_access_key_generation_hint: "Se genera automáticamente al suscribirse a un calendario." + label_ical_access_key_latest: "último" + label_ical_access_key_revoke: "Revocar" + label_add_column: "Añadir columna" + label_applied_status: "Estado aplicado" + label_archive_project: "Archivar proyecto" + label_ascending: "Ascendente" + label_assigned_to_me_work_packages: "Paquetes de trabajo asignados a mí" + label_associated_revisions: "Revisiones asociadas" + label_attachment_plural: "Archivos adjuntos" + label_attribute: "Atributo" + label_attribute_plural: "Atributos" + label_ldap_auth_source_new: "Nueva conexión LDAP" + label_ldap_auth_source: "Conexión LDAP" + label_ldap_auth_source_plural: "Conexiones LDAP" + label_attribute_expand_text: "El texto completo para «%{attribute}»" + label_authentication: "Autentificación" + label_available_custom_fields_projects: "Proyectos de campos personalizados disponibles" + label_available_global_roles: "Roles globales disponibles" + label_available_project_attributes: "Atributos del proyecto disponibles" + label_available_project_forums: "Foros disponibles" + label_available_project_repositories: "Repositorios disponibles" + label_available_project_versions: "Versiones disponibles" + label_available_project_work_package_categories: "Categorias de paquetes de trabjo disponibles" + label_available_project_work_package_types: "Tipos de paquete de trabajo disponibles" + label_available_projects: "Proyectos disponibles" + label_api_doc: "Documentación de la API" + label_backup: "Copia de seguridad" + label_backup_code: "Código de copia de seguridad" + label_basic_details: "Detalles básicos" + label_between: "entre" + label_blocked_by: "bloqueado por" + label_blocks: "bloques" + label_blog: "Blog" + label_forums_locked: "Bloqueado" + label_forum_new: "Foro nuevo" + label_forum_plural: "Foros" + label_forum_sticky: "Fijo" + label_boolean: "Booleano" + label_board_plural: "Tableros" + label_branch: "Sucursal" + label_browse: "Explorar" + label_builtin: "Integrado" + label_bulk_edit_selected_work_packages: "Edición masiva de paquetes de trabajo" label_bundled: "(Agrupado)" - label_calendar: Calendario - label_calendars_and_dates: Calendarios y fechas - label_calendar_show: Mostrar Calendario - label_category: Categoría + label_calendar: "Calendario" + label_calendars_and_dates: "Calendarios y fechas" + label_calendar_show: "Mostrar Calendario" + label_category: "Categoría" label_completed: Completado - label_consent_settings: Consentimiento del usuario + label_consent_settings: "Consentimiento del usuario" label_wiki_menu_item: Elemento de menú wiki label_select_main_menu_item: Seleccione nuevo elemento de menú principal - label_required_disk_storage: Almacenamiento en disco requerido + label_required_disk_storage: "Almacenamiento en disco requerido" label_send_invitation: Enviar invitación - label_calculated_value: Valor calculado - label_change_parent: Cambiar principal - label_change_plural: Cambios - label_change_properties: Cambiar propiedades - label_change_status: Cambiar estado - label_change_status_of_user: 'Cambiar estado de #{username}' - label_change_view_all: Ver todos los cambios - label_changes_details: Detalles de todos los cambios - label_changeset: Conjunto de cambios - label_changeset_id: Identificador del conjunto de cambios - label_changeset_plural: Conjuntos de cambios - label_checked: verificado - label_check_uncheck_all_in_column: Marcar/Desmarcar toda la columna - label_check_uncheck_all_in_row: Marcar/Desmarcar toda la fila - label_child_element: Elementos secundarios - label_choices: Opciones - label_close_versions: Cerrar versiones completadas - label_closed_work_packages: cerrado - label_collapse: Colapsar - label_collapsed_click_to_show: Contraído. Haga clic para mostrar + label_calculated_value: "Valor calculado" + label_change_parent: "Cambiar principal" + label_change_plural: "Cambios" + label_change_properties: "Cambiar propiedades" + label_change_status: "Cambiar estado" + label_change_status_of_user: "Cambiar estado de #{username}" + label_change_view_all: "Ver todos los cambios" + label_changes_details: "Detalles de todos los cambios" + label_changeset: "Conjunto de cambios" + label_changeset_id: "Identificador del conjunto de cambios" + label_changeset_plural: "Conjuntos de cambios" + label_checked: "verificado" + label_check_uncheck_all_in_column: "Marcar/Desmarcar toda la columna" + label_check_uncheck_all_in_row: "Marcar/Desmarcar toda la fila" + label_child_element: "Elementos secundarios" + label_choices: "Opciones" + label_close_versions: "Cerrar versiones completadas" + label_closed_work_packages: "cerrado" + label_collapse: "Colapsar" + label_collapsed_click_to_show: "Contraído. Haga clic para mostrar" label_configuration: configuracion - label_comment_add: Añadir un comentario - label_comment_added: Comentario añadido - label_comment_delete: Eliminar comentarios - label_comment_plural: Comentarios - label_commits_per_author: Compromisos por autor - label_commits_per_month: Compromisos por mes - label_confirmation: Confirmación - label_contains: contiene - label_content: Contenido - label_color_plural: Colores - label_copied: copiado - label_copy_same_as_target: Igual al destino - label_copy_source: Fuente - label_copy_target: Objetivo - label_copy_workflow_from: Copiar flujo de trabajo desde - label_copy_project: Copiar proyecto - label_core_version: Versión base - label_core_build: Núcleo base - label_created_by: Creado por %{user} - label_current_status: Estado actual - label_current_version: Version actual - label_custom_field_add_no_type: Agregue este campo a un tipo de paquete de trabajo - label_custom_field_new: Nuevo campo personalizado - label_custom_field_plural: Campos personalizados - label_custom_field_default_type: Tipo vacío - label_custom_style: Diseño - label_custom_style_description: Elija el aspecto que OpenProject le ofrece con los - temas, seleccione los colores predeterminados que desea utilizar en la aplicación - y el aspecto de las exportaciones. - label_dashboard: Paneles de control - label_database_version: Versión de PostgreSQL - label_date: Fecha - label_dates: Fechas - label_date_and_time: Fecha y hora - label_date_format: Formato de fecha - label_date_from: De - label_date_from_to: De %{start} al %{end} - label_date_to: Para - label_day_plural: días - label_default: Por defecto - label_delete_user: Eliminar usuario - label_delete_project: Eliminar proyecto - label_delete: Eliminar - label_deleted: borrado + label_comment_add: "Añadir un comentario" + label_comment_added: "Comentario añadido" + label_comment_delete: "Eliminar comentarios" + label_comment_plural: "Comentarios" + label_commits_per_author: "Compromisos por autor" + label_commits_per_month: "Compromisos por mes" + label_confirmation: "Confirmación" + label_contains: "contiene" + label_content: "Contenido" + label_color_plural: "Colores" + label_copied: "copiado" + label_copy_same_as_target: "Igual al destino" + label_copy_source: "Fuente" + label_copy_target: "Objetivo" + label_copy_workflow_from: "Copiar flujo de trabajo desde" + label_copy_project: "Copiar proyecto" + label_core_version: "Versión base" + label_core_build: "Núcleo base" + label_created_by: "Creado por %{user}" + label_current_status: "Estado actual" + label_current_version: "Version actual" + label_custom_field_add_no_type: "Agregue este campo a un tipo de paquete de trabajo" + label_custom_field_new: "Nuevo campo personalizado" + label_custom_field_plural: "Campos personalizados" + label_custom_field_default_type: "Tipo vacío" + label_custom_style: "Diseño" + label_custom_style_description: "Elija el aspecto que OpenProject le ofrece con los temas, seleccione los colores predeterminados que desea utilizar en la aplicación y el aspecto de las exportaciones." + label_dashboard: "Paneles de control" + label_database_version: "Versión de PostgreSQL" + label_date: "Fecha" + label_dates: "Fechas" + label_date_and_time: "Fecha y hora" + label_date_format: "Formato de fecha" + label_date_from: "De" + label_date_from_to: "De %{start} al %{end}" + label_date_to: "Para" + label_day_plural: "días" + label_default: "Por defecto" + label_delete_user: "Eliminar usuario" + label_delete_project: "Eliminar proyecto" + label_delete: "Eliminar" + label_deleted: "borrado" label_deleted_custom_field: "(campo personalizado borrado)" label_deleted_custom_item: "(elemento eliminado)" label_deleted_custom_option: "(opción eliminada)" label_empty_element: "(vacío)" - label_go_back: Retroceder un nivel de menú - label_go_forward: Abrir el submenú %{module} + label_go_back: "Retroceder un nivel de menú" + label_go_forward: "Abrir el submenú %{module}" label_missing_or_hidden_custom_option: "(faltan valores o permisos de acceso)" - label_descending: Descendente - label_details: Detalles - label_defaults: Por defecto - label_development_roadmap: Hoja de ruta de desarrollo - label_diff: diff - label_diff_inline: en línea - label_diff_side_by_side: lado a lado - label_digital_accessibility: Accesibilidad digital (DE) - label_disabled: deshabilitado - label_disabled_uppercase: Deshabilitado - label_display: Mostrar - label_display_per_page: 'Por página: %{value}' - label_display_used_statuses_only: Mostrar sólo los Estados utilizados por este tipo + label_descending: "Descendente" + label_details: "Detalles" + label_defaults: "Por defecto" + label_development_roadmap: "Hoja de ruta de desarrollo" + label_diff: "diff" + label_diff_inline: "en línea" + label_diff_side_by_side: "lado a lado" + label_digital_accessibility: "Accesibilidad digital (DE)" + label_disabled: "deshabilitado" + label_disabled_uppercase: "Deshabilitado" + label_display: "Mostrar" + label_display_per_page: "Por página: %{value}" + label_display_used_statuses_only: "Mostrar sólo los Estados utilizados por este tipo" label_download: "%{count} de descarga" label_download_plural: "%{count} de descargas" - label_downloads_abbr: D/L - label_duplicated_by: duplicado por - label_duplicate: duplicar - label_duplicates: duplicados - label_edit: Editar - label_edit_x: 'Editar: %{x}' - label_view_x: 'Ver: %{x}' - label_enable_multi_select: Selección multiple - label_enabled_project_custom_fields: Habilitar campos personalizados - label_enabled_project_modules: Habilitar módulos - label_enabled_project_activities: Habilitar actividades de registro de tiempos - label_end_to_end: de punta a punta - label_end_to_start: finalizar para comenzar - label_enumeration_new: Nuevo valor de enumeración - label_enumeration_value: Valor de enumeración - label_enumerations: Enumeraciones - label_enterprise: Empresa + label_downloads_abbr: "D/L" + label_duplicated_by: "duplicado por" + label_duplicate: "duplicar" + label_duplicates: "duplicados" + label_edit: "Editar" + label_edit_x: "Editar: %{x}" + label_view_x: "Ver: %{x}" + label_enable_multi_select: "Selección multiple" + label_enabled_project_custom_fields: "Habilitar campos personalizados" + label_enabled_project_modules: "Habilitar módulos" + label_enabled_project_activities: "Habilitar actividades de registro de tiempos" + label_end_to_end: "de punta a punta" + label_end_to_start: "finalizar para comenzar" + label_enumeration_new: "Nuevo valor de enumeración" + label_enumeration_value: "Valor de enumeración" + label_enumerations: "Enumeraciones" + label_enterprise: "Empresa" label_enterprise_active_users: "%{current}/%{limit} usuarios activos que han reservado" - label_enterprise_edition: Enterprise - label_enterprise_support: Soporte empresarial - label_environment: Entorno - label_estimates_and_progress: Estimaciones y progreso - label_equals: es - label_equals_with_descendants: es cualquiera con descendientes - label_everywhere: todo - label_example: Ejemplo - label_experimental: Experimental - label_i_am_member: Soy miembro - label_ifc_viewer: Visor de Ifc - label_ifc_model_plural: Modelos de Ifc - label_import: Importar - label_export_to: 'También disponible en:' - label_expand: Ampliar - label_expanded_click_to_collapse: Expandido. Haga clic para contraer + label_enterprise_edition: "Enterprise" + label_enterprise_support: "Soporte empresarial" + label_environment: "Entorno" + label_estimates_and_progress: "Estimaciones y progreso" + label_equals: "es" + label_equals_with_descendants: "es cualquiera con descendientes" + label_everywhere: "todo" + label_example: "Ejemplo" + label_experimental: "Experimental" + label_i_am_member: "Soy miembro" + label_ifc_viewer: "Visor de Ifc" + label_ifc_model_plural: "Modelos de Ifc" + label_import: "Importar" + label_export_to: "También disponible en:" + label_expand: "Ampliar" + label_expanded_click_to_collapse: "Expandido. Haga clic para contraer" label_f_hour: "%{value} hora" label_f_hour_plural: "%{value} horas" - label_favorite: Favorito - label_feed_plural: Flujos - label_feeds_access_key: Código de acceso RSS - label_feeds_access_key_created_on: Código de acceso RSS creado hace %{value} - label_feeds_access_key_type: RSS - label_file_plural: Archivos - label_filter: Filtros - label_filter_add: Añadir filtro - label_filter_by: Filtrar por - label_filter_any_name_attribute: Atributos de nombre - label_filter_plural: Filtros - label_filters_toggle: Mostrar/Ocultar filtros - label_float: Desprender - label_folder: Carpeta - label_follows: sigue - label_force_user_language_to_default: Configurar idioma de usuarios que tienen un - lenguaje no permitido por defecto - label_form_configuration: Configuración del formato - label_formula: Fórmula - label_gantt_chart: Diagrama de Gantt - label_gantt_chart_plural: Diagramas de Gantt - label_general: General - label_generate_key: Generar una contraseña - label_global_modules: Módulos globales - label_global_roles: Roles globales - label_git_path: Ruta al directorio .git + label_favorite: "Favorito" + label_feed_plural: "Flujos" + label_feeds_access_key: "Código de acceso RSS" + label_feeds_access_key_created_on: "Código de acceso RSS creado hace %{value}" + label_feeds_access_key_type: "RSS" + label_file_plural: "Archivos" + label_filter: "Filtros" + label_filter_add: "Añadir filtro" + label_filter_by: "Filtrar por" + label_filter_any_name_attribute: "Atributos de nombre" + label_filter_plural: "Filtros" + label_filters_toggle: "Mostrar/Ocultar filtros" + label_float: "Desprender" + label_folder: "Carpeta" + label_follows: "sigue" + label_force_user_language_to_default: "Configurar idioma de usuarios que tienen un lenguaje no permitido por defecto" + label_form_configuration: "Configuración del formato" + label_formula: "Fórmula" + label_gantt_chart: "Diagrama de Gantt" + label_gantt_chart_plural: "Diagramas de Gantt" + label_general: "General" + label_generate_key: "Generar una contraseña" + label_global_modules: "Módulos globales" + label_global_roles: "Roles globales" + label_git_path: "Ruta al directorio .git" label_greater_or_equal: ">=" - label_group_by: Agrupar por - label_group_new: Nuevo grupo - label_group: Grupo - label_group_named: Grupo %{name} - label_group_plural: Grupos - label_help: Ayuda + label_group_by: "Agrupar por" + label_group_new: "Nuevo grupo" + label_group: "Grupo" + label_group_named: "Grupo %{name}" + label_group_plural: "Grupos" + label_help: "Ayuda" label_here: aqui - label_hide: Ocultar - label_history: Historial - label_hierarchy: Jerarquía - label_hierarchy_leaf: Hoja de jerarquía - label_home: Inicio - label_subject_or_id: Asunto o ID - label_calendar_subscriptions: Suscripciones al calendario - label_identifier: Identificador - label_in: en - label_in_less_than: en menos de - label_in_more_than: en más de - label_inactive: Inactivo - label_incoming_emails: Correos electrónicos entrantes - label_includes: incluye + label_hide: "Ocultar" + label_history: "Historial" + label_hierarchy: "Jerarquía" + label_hierarchy_leaf: "Hoja de jerarquía" + label_home: "Inicio" + label_subject_or_id: "Asunto o ID" + label_calendar_subscriptions: "Suscripciones al calendario" + label_identifier: "Identificador" + label_in: "en" + label_in_less_than: "en menos de" + label_in_more_than: "en más de" + label_inactive: "Inactivo" + label_incoming_emails: "Correos electrónicos entrantes" + label_includes: "incluye" label_incomplete: Incompleto label_include_sub_projects: Incluir subproyectos - label_index_by_date: Índice por fecha - label_index_by_title: Índice por título - label_information: Información - label_information_plural: Información - label_installation_guides: Guías de instalación - label_integer: Número entero - label_interface: Interfaz - label_internal: Interno - label_introduction_video: Vídeo de primeros pasos - label_invite_user: Invitar usuario - label_item: Elemento - label_item_plural: Elementos - label_weighted_item_list: Lista ponderada de artículos - label_share: Compartir - label_share_project_list: Listas de proyectos compartidas - label_share_work_package: Compartir paquete de trabajo - label_show_all_registered_users: Mostrar todos los usuarios registrados - label_show_less: Mostrar menos - label_show_more: Mostra més - label_journal: Diario - label_journal_diff: Comparación de la descripción - label_language: Idioma - label_languages: Idiomas - label_external_links: Enlaces externos - label_locale: Idioma y región - label_jump_to_a_project: Saltar a un proyecto... - label_jira_import: Importación desde Jira - label_keyword_plural: Palabras clave - label_language_based: Basado en el idioma del usuario - label_last_activity: Última actividad - label_last_change_on: Último cambio en - label_last_changes: últimos cambios %{count} - label_last_login: Ultimó acceso - label_last_month: El mes pasado - label_last_n_days: últimos %{count} días - label_last_week: La semana pasada - label_latest_revision: Última revisión - label_latest_revision_plural: Últimas revisiones - label_ldap_authentication: Autenticación LDAP - label_learn_more: Más información + label_index_by_date: "Índice por fecha" + label_index_by_title: "Índice por título" + label_information: "Información" + label_information_plural: "Información" + label_installation_guides: "Guías de instalación" + label_integer: "Número entero" + label_interface: "Interfaz" + label_internal: "Interno" + label_introduction_video: "Vídeo de primeros pasos" + label_invite_user: "Invitar usuario" + label_item: "Elemento" + label_item_plural: "Elementos" + label_weighted_item_list: "Lista ponderada de artículos" + label_share: "Compartir" + label_share_project_list: "Listas de proyectos compartidas" + label_share_work_package: "Compartir paquete de trabajo" + label_show_all_registered_users: "Mostrar todos los usuarios registrados" + label_show_less: "Mostrar menos" + label_show_more: "Mostra més" + label_journal: "Diario" + label_journal_diff: "Comparación de la descripción" + label_language: "Idioma" + label_languages: "Idiomas" + label_external_links: "Enlaces externos" + label_locale: "Idioma y región" + label_jump_to_a_project: "Saltar a un proyecto..." + label_jira_import: "Importación desde Jira" + label_keyword_plural: "Palabras clave" + label_language_based: "Basado en el idioma del usuario" + label_last_activity: "Última actividad" + label_last_change_on: "Último cambio en" + label_last_changes: "últimos cambios %{count}" + label_last_login: "Ultimó acceso" + label_last_month: "El mes pasado" + label_last_n_days: "últimos %{count} días" + label_last_week: "La semana pasada" + label_latest_revision: "Última revisión" + label_latest_revision_plural: "Últimas revisiones" + label_ldap_authentication: "Autenticación LDAP" + label_learn_more: "Más información" label_less_or_equal: "<=" - label_less_than_ago: menos que hace días - label_link_url: Enlace (URL) - label_list: Lista - label_loading: Cargando... - label_locked: bloqueado - label_lock_user: Bloquear usuario - label_logged_as: Sesión iniciada como - label_login: Ingresar - label_custom_comment: Comentario de %{name} - label_custom_logo: Logotipo personalizado de sobremesa - label_custom_logo_mobile: Logotipo personalizado de móvil - label_custom_export_logo: Logotipo de exportación personalizado - label_custom_export_cover: Exportación personalizada de fondo de portada - label_custom_export_footer: Imagen personalizada del pie de página de exportación - label_custom_export_font_regular: Normal - label_custom_export_font_bold: Negrita - label_custom_export_font_italic: Cursiva - label_custom_export_font_bold_italic: Negrita cursiva - label_custom_export_cover_overlay: Fondo de portada (cobertura) de exportación personalizado - label_custom_export_cover_text_color: Color del texto - label_custom_pdf_export_settings: Ajustes personalizados de exportación PDF - label_custom_favicon: Icono de página personalizado - label_custom_touch_icon: Icono táctil personalizado - label_logout: Cerrar sesión - label_mapping_for: 'Asignación para: %{attribute}' - label_main_menu: Menú lateral - label_manage: Administrar - label_manage_groups: Administrar grupos - label_managed_repositories_vendor: Repositorios de %{vendor} administrados - label_mathematical_operators: Operadores aritméticos - label_max_size: Tamaño máximo - label_me: mi - label_member_new: Nuevo miembro + label_less_than_ago: "menos que hace días" + label_link_url: "Enlace (URL)" + label_list: "Lista" + label_loading: "Cargando..." + label_locked: "bloqueado" + label_lock_user: "Bloquear usuario" + label_logged_as: "Sesión iniciada como" + label_login: "Ingresar" + label_custom_comment: "Comentario de %{name}" + label_custom_logo: "Logotipo personalizado de sobremesa" + label_custom_logo_mobile: "Logotipo personalizado de móvil" + label_custom_export_logo: "Logotipo de exportación personalizado" + label_custom_export_cover: "Exportación personalizada de fondo de portada" + label_custom_export_footer: "Imagen personalizada del pie de página de exportación" + label_custom_export_font_regular: "Normal" + label_custom_export_font_bold: "Negrita" + label_custom_export_font_italic: "Cursiva" + label_custom_export_font_bold_italic: "Negrita cursiva" + label_custom_export_cover_overlay: "Fondo de portada (cobertura) de exportación personalizado" + label_custom_export_cover_text_color: "Color del texto" + label_custom_pdf_export_settings: "Ajustes personalizados de exportación PDF" + label_custom_favicon: "Icono de página personalizado" + label_custom_touch_icon: "Icono táctil personalizado" + label_logout: "Cerrar sesión" + label_mapping_for: "Asignación para: %{attribute}" + label_main_menu: "Menú lateral" + label_manage: "Administrar" + label_manage_groups: "Administrar grupos" + label_managed_repositories_vendor: "Repositorios de %{vendor} administrados" + label_mathematical_operators: "Operadores aritméticos" + label_max_size: "Tamaño máximo" + label_me: "mi" + label_member_new: "Nuevo miembro" label_member_all_admin: "(Todos los roles se deben al estado del administrador)" - label_member_plural: Miembros - label_membership_plural: Afiliaciones - label_membership_added: Miembro añadido - label_membership_updated: Miembro actualizado - label_menu: Menú + label_member_plural: "Miembros" + label_membership_plural: "Afiliaciones" + label_membership_added: "Miembro añadido" + label_membership_updated: "Miembro actualizado" + label_menu: "Menú" label_menu_badge: - pre_alpha: pre-alfa - alpha: alfa - beta: beta - label_menu_item_name: Nombre del elemento de menú - label_message: Mensaje - label_message_last: Último mensaje - label_message_new: Nuevo mensaje - label_message_plural: Mensajes - label_message_posted: Mensaje añadido - label_min_max_length: Tamaño mínimo-máximo - label_minute_plural: minutos - label_missing_api_access_key: Clave de acceso a la API no encontrada - label_missing_feeds_access_key: Clave de acceso a RSS no encontrada - label_modification: cambio de %{count} - label_modified: modificado - label_module_plural: Módulos - label_modules: Módulos - label_months_from: meses desde - label_more: Más - label_more_information: Más información - label_more_than_ago: más días atrás - label_move_column_left: Mover columna a la izquierda - label_move_column_right: Mover columna a la derecha - label_move_work_package: Mover el paquete de trabajo - label_my_account: Ajustes de la cuenta - label_my_activity: Mi actividad - label_my_account_data: Mis datos de cuenta - label_my_avatar: Mi avatar - label_my_queries: Mis consultas personalizadas - label_name: Nombre - label_never: Nunca - label_new: Nuevo - label_new_features: Nuevas función - label_new_statuses_allowed: Nuevos estados permitidos - label_news_singular: Noticias - label_news_added: Noticias añadidas - label_news_comment_added: Comentario añadido a una noticia - label_news_latest: Últimas noticias - label_news_new: Añadir noticias - label_news_edit: Editar noticias - label_news_plural: Noticias - label_news_view_all: Ver todas las noticias - label_next: Siguiente - label_next_week: La próxima semana + pre_alpha: "pre-alfa" + alpha: "alfa" + beta: "beta" + label_menu_item_name: "Nombre del elemento de menú" + label_message: "Mensaje" + label_message_last: "Último mensaje" + label_message_new: "Nuevo mensaje" + label_message_plural: "Mensajes" + label_message_posted: "Mensaje añadido" + label_min_max_length: "Tamaño mínimo-máximo" + label_minute_plural: "minutos" + label_missing_api_access_key: "Clave de acceso a la API no encontrada" + label_missing_feeds_access_key: "Clave de acceso a RSS no encontrada" + label_modification: "cambio de %{count}" + label_modified: "modificado" + label_module_plural: "Módulos" + label_modules: "Módulos" + label_months_from: "meses desde" + label_more: "Más" + label_more_information: "Más información" + label_more_than_ago: "más días atrás" + label_move_column_left: "Mover columna a la izquierda" + label_move_column_right: "Mover columna a la derecha" + label_move_work_package: "Mover el paquete de trabajo" + label_my_account: "Ajustes de la cuenta" + label_my_activity: "Mi actividad" + label_my_account_data: "Mis datos de cuenta" + label_my_avatar: "Mi avatar" + label_my_queries: "Mis consultas personalizadas" + label_name: "Nombre" + label_never: "Nunca" + label_new: "Nuevo" + label_new_features: "Nuevas función" + label_new_statuses_allowed: "Nuevos estados permitidos" + label_news_singular: "Noticias" + label_news_added: "Noticias añadidas" + label_news_comment_added: "Comentario añadido a una noticia" + label_news_latest: "Últimas noticias" + label_news_new: "Añadir noticias" + label_news_edit: "Editar noticias" + label_news_plural: "Noticias" + label_news_view_all: "Ver todas las noticias" + label_next: "Siguiente" + label_next_week: "La próxima semana" label_no_change_option: "(No hay cambios)" - label_no_data: No hay datos disponibles - label_no_due_date: sin fecha de finalización - label_no_start_date: sin fecha de inicio - label_no_parent_page: Sin página principal - label_notification_center_plural: Notificaciones - label_nothing_display: Nada que mostrar - label_nobody: nadie - label_not_configured: Sin configurar - label_not_found: no encontrado - label_none: ninguno + label_no_data: "No hay datos disponibles" + label_no_due_date: "sin fecha de finalización" + label_no_start_date: "sin fecha de inicio" + label_no_parent_page: "Sin página principal" + label_notification_center_plural: "Notificaciones" + label_nothing_display: "Nada que mostrar" + label_nobody: "nadie" + label_not_configured: "Sin configurar" + label_not_found: "no encontrado" + label_none: "ninguno" label_none_parentheses: "(ninguno)" - label_not_contains: no contiene - label_not_equals: no es - label_life_cycle_step_plural: Ciclo de vida del proyecto - label_on: en - label_operator_all: no está vacío - label_operator_none: está vacío - label_operator_equals_or: es (OR) - label_operator_equals_all: es (AND) - label_operator_shared_with_user_any: cualquiera - label_open: abierto - label_closed: cerrado - label_open_menu: Abrir menú - label_open_work_packages: abierto - label_open_work_packages_plural: abierto - label_openproject_website: Sitio web de OpenProject - label_optional_description: Descripción - label_options: Opciones - label_other: Otros - label_overall_activity: Actividad general - label_overview: Resumen - label_page_title: Título de la página - label_part_of: parte de - label_password_lost: Contraseña perdida - label_password_rule_lowercase: Minúscula - label_password_rule_numeric: Caracteres numéricos - label_password_rule_special: Caracteres especiales - label_password_rule_uppercase: Mayúscula - label_path_encoding: Ruta de codificación - label_per_page: 'Por página:' - label_people: Personas - label_permissions: Permisos - label_permissions_report: Informe de permisos - label_personalize_page: Personalizar esta página - label_placeholder_user: Usuario de marcador de posición - label_placeholder_user_new: Nuevo usuario de marcador de posición - label_placeholder_user_plural: Usuarios de marcador de posición - label_planning: Planificación - label_please_login: Por favor, identifíquese - label_plugins: Extensiones - label_portfolio_plural: Carteras - label_modules_and_plugins: Módulos y Extensiones - label_precedes: precede - label_preferences: Preferencias - label_preview: Vista preliminar - label_preview_not_available: Vista previa no disponible - label_previous: Anterior - label_previous_week: Semana anterior + label_not_contains: "no contiene" + label_not_equals: "no es" + label_life_cycle_step_plural: "Ciclo de vida del proyecto" + label_on: "en" + label_operator_all: "no está vacío" + label_operator_none: "está vacío" + label_operator_equals_or: "es (OR)" + label_operator_equals_all: "es (AND)" + label_operator_shared_with_user_any: "cualquiera" + label_open: "abierto" + label_closed: "cerrado" + label_open_menu: "Abrir menú" + label_open_work_packages: "abierto" + label_open_work_packages_plural: "abierto" + label_openproject_website: "Sitio web de OpenProject" + label_optional_description: "Descripción" + label_options: "Opciones" + label_other: "Otros" + label_overall_activity: "Actividad general" + label_overview: "Resumen" + label_page_title: "Título de la página" + label_part_of: "parte de" + label_password_lost: "Contraseña perdida" + label_password_rule_lowercase: "Minúscula" + label_password_rule_numeric: "Caracteres numéricos" + label_password_rule_special: "Caracteres especiales" + label_password_rule_uppercase: "Mayúscula" + label_path_encoding: "Ruta de codificación" + label_per_page: "Por página:" + label_people: "Personas" + label_permissions: "Permisos" + label_permissions_report: "Informe de permisos" + label_personalize_page: "Personalizar esta página" + label_placeholder_user: "Usuario de marcador de posición" + label_placeholder_user_new: "Nuevo usuario de marcador de posición" + label_placeholder_user_plural: "Usuarios de marcador de posición" + label_planning: "Planificación" + label_please_login: "Por favor, identifíquese" + label_plugins: "Extensiones" + label_portfolio_plural: "Carteras" + label_modules_and_plugins: "Módulos y Extensiones" + label_precedes: "precede" + label_preferences: "Preferencias" + label_preview: "Vista preliminar" + label_preview_not_available: "Vista previa no disponible" + label_previous: "Anterior" + label_previous_week: "Semana anterior" label_principal_invite_via_email: " o invitar nuevos usuarios vía email" - label_principal_search: Añadir usuarios o grupos existentes - label_privacy_policy: Política de privacidad y seguridad de datos - label_product_version: Versión del producto - label_profile: Perfil + label_principal_search: "Añadir usuarios o grupos existentes" + label_privacy_policy: "Política de privacidad y seguridad de datos" + label_product_version: "Versión del producto" + label_profile: "Perfil" label_percent_complete: "% compleado" - label_progress_tracking: Seguimiento del progreso - label_project: Proyecto - label_project_activity: Actividad del proyecto - label_project_attribute_plural: Atributos del proyecto - label_project_attribute_manage_link: Administrar atributos del proyecto - label_project_count: Número total de proyectos - label_project_copy_notifications: Enviar notificaciones por correo electrónico durante - la copia del proyecto - label_project_initiation_export_pdf: Exportar PDF para %{project_creation_name} - label_project_latest: Últimos proyectos - label_project_default_type: Permitir tipo vacio - label_project_hierarchy: Jerarquía del proyecto - label_project_mappings: Proyectos - label_project_new: Nuevo proyecto - label_project_plural: Proyectos - label_project_list_plural: Listas de proyectos - label_project_life_cycle: Ciclo de vida del proyecto - label_project_attributes_plural: Atributos del proyecto - label_project_custom_field_plural: Atributos del proyecto - label_project_settings: Configuración del proyecto - label_project_attributes_settings: Ajustes de los atributos del proyecto - label_project_storage_plural: Almacenamientos de archivos - label_project_storage_project_folder: 'Almacenamientos de archivos: Carpetas del - proyecto' - label_projects_disk_usage_information: "%{count} proyectos utilizando %{used_disk_space} - espacio de disco" - label_project_view_all: Ver todos los proyectos - label_project_show_details: Mostrar los detalles del proyecto - label_project_hide_details: Ocultar los detalles del proyecto - label_portfolio: Portafolio - label_portfolio_new: Nuevo portafolio - label_program: Programa - label_program_new: Nuevo programa - label_public_projects: Proyectos públicos - label_query_new: Nueva consulta - label_query_plural: Consultas personalizadas - label_read: Leer... - label_read_documentation: Leer documentación - label_register: Crear una nueva cuenta - label_register_with_developer: Registrarse como desarrollador - label_registered_on: Registrado en - label_related_work_packages: Paquetes de trabajo relacionados - label_relates: relacionado con - label_relates_to: relacionado con - label_relation: Relación - label_relation_actions: Acciones de relación - label_relation_delete: Eliminar relación - label_relation_edit: Editar relación - label_relation_new: Nueva relación - label_release_notes: Notas de lanzamiento - label_remaining_work: Trabajo restante - label_remove_column: Eliminar columna - label_remove_columns: Eliminar columnas seleccionadas - label_renamed: nombre cambiado - label_reply_plural: Respuestas - label_report: Informe - label_report_bug: Informa de un fallo - label_report_plural: Informes - label_reported_work_packages: Paquetes de trabajo reportados - label_reporting: Presentación de informe - label_reporting_plural: Presentacion de Informes - label_repository: Repositorio - label_repository_remove: Eliminar el repositorio - label_repository_root: Raiz del repositorio - label_repository_plural: Repositorios - label_request_submission: Envío de la solicitud - label_required: requerido - label_requires: requiere - label_result_plural: Resultados - label_revision: Revisión - label_revision_id: Revisión %{value} - label_revision_plural: Revisiones - label_roadmap: Hoja de ruta - label_roadmap_edit: Editar hoja de ruta %{name} - label_roadmap_due_in: Válido en %{value} - label_roadmap_no_work_packages: No hay paquetes de trabajo para esta versión + label_progress_tracking: "Seguimiento del progreso" + label_project: "Proyecto" + label_project_activity: "Actividad del proyecto" + label_project_attribute_plural: "Atributos del proyecto" + label_project_attribute_manage_link: "Administrar atributos del proyecto" + label_project_count: "Número total de proyectos" + label_project_copy_notifications: "Enviar notificaciones por correo electrónico durante la copia del proyecto" + label_project_initiation_export_pdf: "Exportar PDF para %{project_creation_name}" + label_project_latest: "Últimos proyectos" + label_project_default_type: "Permitir tipo vacio" + label_project_hierarchy: "Jerarquía del proyecto" + label_project_mappings: "Proyectos" + label_project_new: "Nuevo proyecto" + label_project_plural: "Proyectos" + label_project_list_plural: "Listas de proyectos" + label_project_life_cycle: "Ciclo de vida del proyecto" + label_project_attributes_plural: "Atributos del proyecto" + label_project_custom_field_plural: "Atributos del proyecto" + label_project_settings: "Configuración del proyecto" + label_project_attributes_settings: "Ajustes de los atributos del proyecto" + label_project_storage_plural: "Almacenamientos de archivos" + label_project_storage_project_folder: "Almacenamientos de archivos: Carpetas del proyecto" + label_projects_disk_usage_information: "%{count} proyectos utilizando %{used_disk_space} espacio de disco" + label_project_view_all: "Ver todos los proyectos" + label_project_show_details: "Mostrar los detalles del proyecto" + label_project_hide_details: "Ocultar los detalles del proyecto" + label_portfolio: "Portafolio" + label_portfolio_new: "Nuevo portafolio" + label_program: "Programa" + label_program_new: "Nuevo programa" + label_public_projects: "Proyectos públicos" + label_query_new: "Nueva consulta" + label_query_plural: "Consultas personalizadas" + label_read: "Leer..." + label_read_documentation: "Leer documentación" + label_register: "Crear una nueva cuenta" + label_register_with_developer: "Registrarse como desarrollador" + label_registered_on: "Registrado en" + label_related_work_packages: "Paquetes de trabajo relacionados" + label_relates: "relacionado con" + label_relates_to: "relacionado con" + label_relation: "Relación" + label_relation_actions: "Acciones de relación" + label_relation_delete: "Eliminar relación" + label_relation_edit: "Editar relación" + label_relation_new: "Nueva relación" + label_release_notes: "Notas de lanzamiento" + label_remaining_work: "Trabajo restante" + label_remove_column: "Eliminar columna" + label_remove_columns: "Eliminar columnas seleccionadas" + label_renamed: "nombre cambiado" + label_reply_plural: "Respuestas" + label_report: "Informe" + label_report_bug: "Informa de un fallo" + label_report_plural: "Informes" + label_reported_work_packages: "Paquetes de trabajo reportados" + label_reporting: "Presentación de informe" + label_reporting_plural: "Presentacion de Informes" + label_repository: "Repositorio" + label_repository_remove: "Eliminar el repositorio" + label_repository_root: "Raiz del repositorio" + label_repository_plural: "Repositorios" + label_request_submission: "Envío de la solicitud" + label_required: "requerido" + label_requires: "requiere" + label_result_plural: "Resultados" + label_revision: "Revisión" + label_revision_id: "Revisión %{value}" + label_revision_plural: "Revisiones" + label_roadmap: "Hoja de ruta" + label_roadmap_edit: "Editar hoja de ruta %{name}" + label_roadmap_due_in: "Válido en %{value}" + label_roadmap_no_work_packages: "No hay paquetes de trabajo para esta versión" label_roadmap_overdue: "%{value} tarde" - label_role_and_permissions: Roles y permisos - label_role_new: Nuevo rol - label_role_grantable: Rol otorgable - label_role_plural: Perfiles - label_role_search: Asignar rol a nuevos miembros - label_scm: SCM - label_scroll_left: Desplazar hacia la izquierda - label_scroll_right: Desplazar hacia la derecha - label_search: Buscar - label_search_by_name: Buscar por nombre - label_send_information: Enviar nuevas credenciales al usuario - label_send_test_email: Enviar un correo electrónico de prueba - label_session: Sesión - label_setting_plural: Configuración - label_system_settings: Ajustes de sistema - label_show_completed_versions: Mostrar versiones terminadas - label_columns: Columnas - label_sort: Ordenar - label_sort_ascending: Ordenar ascendente - label_sort_by: Ordenar por %{value} - label_sorted_by: ordenados por %{value} - label_sort_descending: Ordenar descendente - label_sort_higher: Mover hacia arriba - label_sort_highest: Arriba de todo - label_sort_lower: Mover hacia abajo - label_sort_lowest: Mover al final - label_spent_time: Tiempo invertido - label_start_to_end: de principio a fin - label_start_to_start: iniciar para iniciar - label_statistics: Estadísticas - label_status: Estado - label_storage_free_space: Espacio de disco restante - label_storage_used_space: Espacio de disco utilizado - label_storage_group: Sistema de archivos de almacenamiento %{identifier} - label_storage_for: Abarca almacenamiento para - label_string: Texto - label_subproject: Subproyecto - label_subproject_new: Subproyecto nuevo - label_subproject_plural: Subproyectos - label_subitems: Subelementos - label_subtask_plural: Subtareas - label_summary: Resumen - label_system: Sistema - label_system_storage: Información de almacenamiento - label_table_of_contents: Índice - label_tag: Etiqueta - label_team_planner: Planificador de equipos - label_template: Plantilla - label_templates: Plantillas - label_text: Texto largo - label_this_month: este mes - label_this_week: esta semana - label_this_year: este año - label_time: Hora - label_time_entry_plural: Tiempo invertido - label_time_entry_activity_plural: Actividades de tiempo invertido - label_title: Título - label_projects_menu: Proyectos - label_today: hoy - label_token_version: Versión del token - label_today_as_start_date: Seleccione hoy como fecha de inicio. - label_today_as_due_date: Seleccione hoy como fecha de finalización. - label_today_as_date: Seleccione hoy como fecha. - label_top_menu: Menú superior - label_topic_plural: Temas - label_total: Total - label_type_new: Nuevo tipo - label_type_plural: Tipos - label_ui: Interfaz de usuario + label_role_and_permissions: "Roles y permisos" + label_role_new: "Nuevo rol" + label_role_grantable: "Rol otorgable" + label_role_plural: "Perfiles" + label_role_search: "Asignar rol a nuevos miembros" + label_scm: "SCM" + label_scroll_left: "Desplazar hacia la izquierda" + label_scroll_right: "Desplazar hacia la derecha" + label_search: "Buscar" + label_search_by_name: "Buscar por nombre" + label_send_information: "Enviar nuevas credenciales al usuario" + label_send_test_email: "Enviar un correo electrónico de prueba" + label_session: "Sesión" + label_setting_plural: "Configuración" + label_system_settings: "Ajustes de sistema" + label_show_completed_versions: "Mostrar versiones terminadas" + label_columns: "Columnas" + label_sort: "Ordenar" + label_sort_ascending: "Ordenar ascendente" + label_sort_by: "Ordenar por %{value}" + label_sorted_by: "ordenados por %{value}" + label_sort_descending: "Ordenar descendente" + label_sort_higher: "Mover hacia arriba" + label_sort_highest: "Arriba de todo" + label_sort_lower: "Mover hacia abajo" + label_sort_lowest: "Mover al final" + label_spent_time: "Tiempo invertido" + label_start_to_end: "de principio a fin" + label_start_to_start: "iniciar para iniciar" + label_statistics: "Estadísticas" + label_status: "Estado" + label_storage_free_space: "Espacio de disco restante" + label_storage_used_space: "Espacio de disco utilizado" + label_storage_group: "Sistema de archivos de almacenamiento %{identifier}" + label_storage_for: "Abarca almacenamiento para" + label_string: "Texto" + label_subproject: "Subproyecto" + label_subproject_new: "Subproyecto nuevo" + label_subproject_plural: "Subproyectos" + label_subitems: "Subelementos" + label_subtask_plural: "Subtareas" + label_summary: "Resumen" + label_system: "Sistema" + label_system_storage: "Información de almacenamiento" + label_table_of_contents: "Índice" + label_tag: "Etiqueta" + label_team_planner: "Planificador de equipos" + label_template: "Plantilla" + label_templates: "Plantillas" + label_text: "Texto largo" + label_this_month: "este mes" + label_this_week: "esta semana" + label_this_year: "este año" + label_time: "Hora" + label_time_entry_plural: "Tiempo invertido" + label_time_entry_activity_plural: "Actividades de tiempo invertido" + label_title: "Título" + label_projects_menu: "Proyectos" + label_today: "hoy" + label_token_version: "Versión del token" + label_today_as_start_date: "Seleccione hoy como fecha de inicio." + label_today_as_due_date: "Seleccione hoy como fecha de finalización." + label_today_as_date: "Seleccione hoy como fecha." + label_top_menu: "Menú superior" + label_topic_plural: "Temas" + label_total: "Total" + label_type_new: "Nuevo tipo" + label_type_plural: "Tipos" + label_ui: "Interfaz de usuario" label_updated_time: "%{value} actualizado hace" label_updated_time_at: "%{author} %{age}" - label_updated_time_by: Actualizado por %{author} hace %{age} - label_upgrade_guides: Guías de actualización - label_used_by: Utilizado por - label_used_by_types: Utilizado por tipos - label_used_in_projects: Utilizado en proyectos - label_user: Usuario - label_user_and_permission: Usuarios y permisos - label_user_named: Usuario %{name} - label_user_activity: 'Actividad de %{value} ' - label_user_anonymous: Anónimo - label_user_mail_option_all: Para cualquier evento en todos mis proyectos - label_user_mail_option_none: No hay eventos - label_user_mail_option_only_assigned: Sólo para cosas asignadas a mí - label_user_mail_option_only_my_events: Sólo para cosas que controlo o en las que - participo - label_user_mail_option_only_owner: Sólo para cosas de las que soy el dueño - label_user_mail_option_selected: Únicamente para cualquier evento de los proyectos - seleccionados - label_user_menu: Menú de usuario - label_user_new: Nuevo usuario - label_user_plural: Usuarios - label_user_search: Búsqueda de usuario - label_user_settings: Configuración de usuario - label_users_settings: Ajustes de usuario - label_value_x: 'Valor: %{x}' - label_version_new: Nueva versión - label_version_edit: Editar versión - label_version_plural: Versiones - label_version_sharing_descendants: Con subproyectos - label_version_sharing_hierarchy: Con la jerarquía del proyecto - label_version_sharing_none: No compartido - label_version_sharing_system: Con todos los proyectos - label_version_sharing_tree: Con el árbol del proyecto - label_videos: Vídeos - label_view_all_revisions: Ver todas las revisiones - label_view_diff: Ver diferencias - label_view_revisions: Ver revisiones - label_watched_work_packages: Paquetes de trabajos seguidos + label_updated_time_by: "Actualizado por %{author} hace %{age}" + label_upgrade_guides: "Guías de actualización" + label_used_by: "Utilizado por" + label_used_by_types: "Utilizado por tipos" + label_used_in_projects: "Utilizado en proyectos" + label_user: "Usuario" + label_user_and_permission: "Usuarios y permisos" + label_user_named: "Usuario %{name}" + label_user_activity: "Actividad de %{value} " + label_user_anonymous: "Anónimo" + label_user_mail_option_all: "Para cualquier evento en todos mis proyectos" + label_user_mail_option_none: "No hay eventos" + label_user_mail_option_only_assigned: "Sólo para cosas asignadas a mí" + label_user_mail_option_only_my_events: "Sólo para cosas que controlo o en las que participo" + label_user_mail_option_only_owner: "Sólo para cosas de las que soy el dueño" + label_user_mail_option_selected: "Únicamente para cualquier evento de los proyectos seleccionados" + label_user_menu: "Menú de usuario" + label_user_new: "Nuevo usuario" + label_user_plural: "Usuarios" + label_user_search: "Búsqueda de usuario" + label_user_settings: "Configuración de usuario" + label_users_settings: "Ajustes de usuario" + label_value_x: "Valor: %{x}" + label_version_new: "Nueva versión" + label_version_edit: "Editar versión" + label_version_plural: "Versiones" + label_version_sharing_descendants: "Con subproyectos" + label_version_sharing_hierarchy: "Con la jerarquía del proyecto" + label_version_sharing_none: "No compartido" + label_version_sharing_system: "Con todos los proyectos" + label_version_sharing_tree: "Con el árbol del proyecto" + label_videos: "Vídeos" + label_view_all_revisions: "Ver todas las revisiones" + label_view_diff: "Ver diferencias" + label_view_revisions: "Ver revisiones" + label_watched_work_packages: "Paquetes de trabajos seguidos" label_what_is_this: "¿Qué es esto?" - label_week: Semana - label_widget: Widget - label_widget_new: Nuevo widget - label_wiki_content_added: Página wiki añadida - label_wiki_content_updated: Página wiki actualizada - label_wiki_toc: Tabla de contenidos - label_wiki_toc_empty: El índice está vacío porque no hay ningún encabezado. - label_wiki_dont_show_menu_item: No mostrar esta página wiki en la navegación del - proyecto - label_wiki_edit: Editar Wiki - label_wiki_edit_plural: Ediciones Wiki - label_wiki_page_attachments: Datos adjuntos de página wiki - label_wiki_page_id: ID de la página de Wiki - label_wiki_navigation: Navegación wiki - label_wiki_page: Página wiki - label_wiki_page_plural: Páginas Wiki - label_wiki_show_index_page_link: Mostrar el elemento de submenú 'Tabla de contenidos' - label_wiki_show_menu_item: Mostrar como elemento de menú de navegación de proyecto - label_wiki_show_new_page_link: Mostrar el elemento de submenú 'Crear nueva página - hija' - label_wiki_show_submenu_item: 'Mostrar como elemento de submenú de ' - label_wiki_start: Página de inicio - label_work: Trabajo - label_work_package: Paquete de trabajo - label_work_package_attachments: Datos adjuntos de paquete de trabajo - label_work_package_category_new: Nueva categoría - label_work_package_category_plural: Categorías de paquete de trabajo - label_work_package_comments: Comentarios del paquete de trabajo - label_work_package_hierarchy: Jerarquía del paquete de trabajo - label_work_package_new: Nuevo paquete de trabajo - label_work_package_edit: Editar paquete de trabajo %{name} - label_work_package_plural: Paquetes de trabajo - label_work_package_status: Estado del paquete de trabajo - label_work_package_status_new: Nuevo estatus - label_work_package_status_plural: Estatus del paquete de trabajo - label_work_package_types: Tipos de paquetes de trabajo - label_work_package_tracking: Seguimiento de paquetes de trabajo - label_work_package_view_all: Ver todos los paquetes de trabajo - label_workflow: Flujo de trabajo - label_workflow_copy: Copiar flujo de trabajo - label_workflow_plural: Flujos de trabajo - label_workflow_summary: Resumen - label_working_days_and_hours: Días y horas de trabajo + label_week: "Semana" + label_widget: "Widget" + label_widget_new: "Nuevo widget" + label_wiki_content_added: "Página wiki añadida" + label_wiki_content_updated: "Página wiki actualizada" + label_wiki_toc: "Tabla de contenidos" + label_wiki_toc_empty: "El índice está vacío porque no hay ningún encabezado." + label_wiki_dont_show_menu_item: "No mostrar esta página wiki en la navegación del proyecto" + label_wiki_edit: "Editar Wiki" + label_wiki_edit_plural: "Ediciones Wiki" + label_wiki_page_attachments: "Datos adjuntos de página wiki" + label_wiki_page_id: "ID de la página de Wiki" + label_wiki_navigation: "Navegación wiki" + label_wiki_page: "Página wiki" + label_wiki_page_plural: "Páginas Wiki" + label_wiki_show_index_page_link: "Mostrar el elemento de submenú 'Tabla de contenidos'" + label_wiki_show_menu_item: "Mostrar como elemento de menú de navegación de proyecto" + label_wiki_show_new_page_link: "Mostrar el elemento de submenú 'Crear nueva página hija'" + label_wiki_show_submenu_item: "Mostrar como elemento de submenú de " + label_wiki_start: "Página de inicio" + label_work: "Trabajo" + label_work_package: "Paquete de trabajo" + label_work_package_attachments: "Datos adjuntos de paquete de trabajo" + label_work_package_category_new: "Nueva categoría" + label_work_package_category_plural: "Categorías de paquete de trabajo" + label_work_package_comments: "Comentarios del paquete de trabajo" + label_work_package_hierarchy: "Jerarquía del paquete de trabajo" + label_work_package_new: "Nuevo paquete de trabajo" + label_work_package_edit: "Editar paquete de trabajo %{name}" + label_work_package_plural: "Paquetes de trabajo" + label_work_package_status: "Estado del paquete de trabajo" + label_work_package_status_new: "Nuevo estatus" + label_work_package_status_plural: "Estatus del paquete de trabajo" + label_work_package_types: "Tipos de paquetes de trabajo" + label_work_package_tracking: "Seguimiento de paquetes de trabajo" + label_work_package_view_all: "Ver todos los paquetes de trabajo" + label_workflow: "Flujo de trabajo" + label_workflow_copy: "Copiar flujo de trabajo" + label_workflow_plural: "Flujos de trabajo" + label_workflow_summary: "Resumen" + label_working_days_and_hours: "Días y horas de trabajo" label_x_closed_work_packages_abbr: - one: 1 cerrado + one: "1 cerrado" other: "%{count} cerrados" - zero: 0 cerrados + zero: "0 cerrados" label_x_comments: - one: 1 comentario + one: "1 comentario" other: "%{count} comentarios" - zero: sin comentarios + zero: "sin comentarios" label_x_open_work_packages_abbr: - one: 1 abierto + one: "1 abierto" other: "%{count} abiertos" - zero: 0 abiertos + zero: "0 abiertos" label_x_work_packages: - one: 1 paquete de trabajo + one: "1 paquete de trabajo" other: "%{count} paquetes de trabajo" - zero: Sin paquetes de trabajo + zero: "Sin paquetes de trabajo" label_x_projects: - one: 1 proyecto + one: "1 proyecto" other: "%{count} proyectos" - zero: sin proyectos + zero: "sin proyectos" label_x_files: - one: 1 archivo + one: "1 archivo" other: "%{count} archivos" - zero: sin archivos - label_yesterday: ayer - label_zen_mode: Modo zen - label_role_type: Tipo - label_member_role: Rol del proyecto - label_global_role: Rol global + zero: "sin archivos" + label_yesterday: "ayer" + label_zen_mode: "Modo zen" + label_role_type: "Tipo" + label_member_role: "Rol del proyecto" + label_global_role: "Rol global" label_not_changeable: "(no modificable)" - label_global: Global - label_seeded_from_env_warning: Este registro se ha creado a través de una variable - de entorno de configuración. No es editable a través de la interfaz de usuario. - macro_execution_error: Error ejecutando el macro %{macro_name} - macro_unavailable: Macro %{macro_name} no puede ser mostrado. + label_global: "Global" + label_seeded_from_env_warning: Este registro se ha creado a través de una variable de entorno de configuración. No es editable a través de la interfaz de usuario. + macro_execution_error: "Error ejecutando el macro %{macro_name}" + macro_unavailable: "Macro %{macro_name} no puede ser mostrado." macros: placeholder: "[Placeholder] Macro %{macro_name}" errors: - missing_or_invalid_parameter: Parámetro de macro no encontrado o no válido. + missing_or_invalid_parameter: "Parámetro de macro no encontrado o no válido." legacy_warning: - timeline: Esta macro de cronograma heredada se ha quitado y ya no está disponible. - Puede sustituir la función por una macro de tabla insertada. + timeline: "Esta macro de cronograma heredada se ha quitado y ya no está disponible. Puede sustituir la función por una macro de tabla insertada." include_wiki_page: - removed: La macro ya no existe. + removed: "La macro ya no existe." wiki_child_pages: errors: - page_not_found: No se encuentra la página wiki “%{name}”. + page_not_found: "No se encuentra la página wiki “%{name}”." create_work_package_link: errors: - no_project_context: Llamando a la macro create_work_package_link desde el - contexto externo del proyecto. - invalid_type: No se ha encontrado ningún tipo con nombre '%{type}' en el proyecto - '%{project}'. - link_name: Nuevo paquete de trabajo + no_project_context: "Llamando a la macro create_work_package_link desde el contexto externo del proyecto." + invalid_type: "No se ha encontrado ningún tipo con nombre '%{type}' en el proyecto '%{project}'." + link_name: "Nuevo paquete de trabajo" link_name_type: "%{type_name} nuevo" mail: - actions: Acciones + actions: "Acciones" digests: - including_mention_singular: incluyendo una mención - including_mention_plural: incluyendo %{number_mentioned} menciones - unread_notification_singular: 1 notificación sin leer + including_mention_singular: "incluyendo una mención" + including_mention_plural: "incluyendo %{number_mentioned} menciones" + unread_notification_singular: "1 notificación sin leer" unread_notification_plural: "%{number_unread} notificaciones sin leer" - you_have: Tiene - logo_alt_text: Logotipo + you_have: "Tiene" + logo_alt_text: "Logotipo" mention: subject: "%{user_name} le mencionó en %{id}: %{subject}" notification: - center: Al centro de notificaciones - see_in_center: Ver comentario en el centro de notificaciones - settings: Cambiar configuración de correo electrónico - salutation: Hola %{user} - salutation_full_name: Nombre completo + center: "Al centro de notificaciones" + see_in_center: "Ver comentario en el centro de notificaciones" + settings: "Cambiar configuración de correo electrónico" + salutation: "Hola %{user}" + salutation_full_name: "Nombre completo" work_packages: - created_at: 'Creado a las %{timestamp} por %{user} ' - login_to_see_all: Inicie sesión para ver todas las notificaciones. - mentioned: Le han mencionado en un comentario + created_at: "Creado a las %{timestamp} por %{user} " + login_to_see_all: "Inicie sesión para ver todas las notificaciones." + mentioned: "Le han mencionado en un comentario" mentioned_by: "%{user} le mencionó en un comentario" more_to_see: - one: Hay un paquete de trabajo más con notificaciones. - other: Hay %{count} paquetes de trabajo más con notificaciones. - open_in_browser: Abrir en el navegador + one: "Hay un paquete de trabajo más con notificaciones." + other: "Hay %{count} paquetes de trabajo más con notificaciones." + open_in_browser: "Abrir en el navegador" reason: - watched: Supervisado - assigned: Asignado - responsible: Responsable - mentioned: Mencionado - shared: Compartido - subscribed: todos - prefix: 'Recibido por la configuración de notificaciones: %{reason}' - date_alert_start_date: Alerta de fecha - date_alert_due_date: Alerta de fecha - reminder: Recordatorio - see_all: Ver todo - updated_at: Actualizado a las %{timestamp} por %{user} + watched: "Supervisado" + assigned: "Asignado" + responsible: "Responsable" + mentioned: "Mencionado" + shared: "Compartido" + subscribed: "todos" + prefix: "Recibido por la configuración de notificaciones: %{reason}" + date_alert_start_date: "Alerta de fecha" + date_alert_due_date: "Alerta de fecha" + reminder: "Recordatorio" + see_all: "Ver todo" + updated_at: "Actualizado a las %{timestamp} por %{user}" reminder_notifications: - subject: 'Recordatorio: %{note}' - heading: Tiene un nuevo recordatorio - note: 'Nota: «%{note}»' + subject: "Recordatorio: %{note}" + heading: "Tiene un nuevo recordatorio" + note: "Nota: «%{note}»" sharing: work_packages: - allowed_actions: Puede %{allowed_actions} este paquete de trabajo. Esto puede - cambiar dependiendo del rol y los permisos de su proyecto. - create_account: 'Para acceder a este paquete de trabajo necesitará crear y - activar una cuenta en %{instance}. ' - open_work_package: Abrir paquete de trabajo - subject: 'Paquete de trabajo #%{id} fue compartido contigo' - enterprise_text: Compartir paquetes de trabajo con usuarios que no son miembros - del proyecto. + allowed_actions: "Puede %{allowed_actions} este paquete de trabajo. Esto puede cambiar dependiendo del rol y los permisos de su proyecto." + create_account: "Para acceder a este paquete de trabajo necesitará crear y activar una cuenta en %{instance}. " + open_work_package: "Abrir paquete de trabajo" + subject: "Paquete de trabajo #%{id} fue compartido contigo" + enterprise_text: "Compartir paquetes de trabajo con usuarios que no son miembros del proyecto." summary: - user: "%{user} ha compartido un paquete de trabajo contigo con permisos - de %{role_rights}" - group: "%{user} ha compartido un paquete de trabajo con el grupo %{group} - del que eres miembro" + user: "%{user} ha compartido un paquete de trabajo contigo con permisos de %{role_rights}" + group: "%{user} ha compartido un paquete de trabajo con el grupo %{group} del que eres miembro" storages: health: plaintext: - storage: Almacenamiento + storage: "Almacenamiento" healthy: - summary: "¡Buenas noticias! El estado de su almacenamiento, %{storage_name}, - se muestra actualmente como «Sano»." - error-solved-on: Resuelto el - recommendation: Seguiremos supervisando el sistema para asegurarnos de - que sigue gozando de buena salud. En caso de discrepancias, se lo notificaremos. - details: Para más detalles o para realizar las modificaciones necesarias, - puede visitar su configuración de almacenamiento + summary: '¡Buenas noticias! El estado de su almacenamiento, %{storage_name}, se muestra actualmente como «Sano».' + error-solved-on: "Resuelto el" + recommendation: "Seguiremos supervisando el sistema para asegurarnos de que sigue gozando de buena salud. En caso de discrepancias, se lo notificaremos." + details: "Para más detalles o para realizar las modificaciones necesarias, puede visitar su configuración de almacenamiento" unhealthy: - summary: El estado de su almacenamiento, %{storage_name}, se muestra actualmente - como «Error». Hemos detectado un problema que podría requerir su atención. - error-details: Detalles del error - error-message: Mensaje de error - error-occurred-on: Ocurrido el - recommendation: Le recomendamos que se dirija a la página de configuración - del almacenamiento para solucionar este problema - unsubscribe: Si no desea seguir recibiendo estas notificaciones, puede - cancelar su suscripción en cualquier momento. Para cancelar su suscripción, - siga las instrucciones de esta página - email_notification_settings: Ajustes de notificación por correo electrónico - de almacenamiento - see_storage_settings: Ver ajustes de almacenamiento + summary: 'El estado de su almacenamiento, %{storage_name}, se muestra actualmente como «Error». Hemos detectado un problema que podría requerir su atención.' + error-details: "Detalles del error" + error-message: "Mensaje de error" + error-occurred-on: "Ocurrido el" + recommendation: "Le recomendamos que se dirija a la página de configuración del almacenamiento para solucionar este problema" + unsubscribe: "Si no desea seguir recibiendo estas notificaciones, puede cancelar su suscripción en cualquier momento. Para cancelar su suscripción, siga las instrucciones de esta página" + email_notification_settings: "Ajustes de notificación por correo electrónico de almacenamiento" + see_storage_settings: "Ver ajustes de almacenamiento" healthy: - subject: "¡El almacenamiento «%{name}» está ahora sano!" - solved_at: resuelto el - summary: El problema con la integración de su almacenamiento %{storage_name} - ya está resuelto + subject: '¡El almacenamiento «%{name}» está ahora sano!' + solved_at: "resuelto el" + summary: "El problema con la integración de su almacenamiento %{storage_name} ya está resuelto" unhealthy: - subject: "¡El almacenamiento «%{name}» no está sano!" - since: desde - summary: Hay un problema con la integración de su almacenamiento %{storage_name}. + subject: '¡El almacenamiento «%{name}» no está sano!' + since: "desde" + summary: "Hay un problema con la integración de su almacenamiento %{storage_name}." troubleshooting: - text: Para más información, consulte los almacenamientos de archivos - link_text: documentación para la solución de problemas - mail_body_account_activation_request: 'Ha registrado un nuevo usuario (%{value}). - La cuenta está pendiente de aprobación:' - mail_body_account_information: Información de su cuenta - mail_body_account_information_external: Puede usar su %{value} cuenta para ingresar. - mail_body_backup_ready: 'La copia de seguridad solicitada está preparada. Puede - descargarla desde aquí:' - mail_body_backup_token_reset_admin_info: Se ha restablecido el token de copias de - seguridad para el usuario «%{user}». - mail_body_backup_token_reset_user_info: Se ha restablecido su token de copias de - seguridad. + text: "Para más información, consulte los almacenamientos de archivos" + link_text: "documentación para la solución de problemas" + mail_body_account_activation_request: "Ha registrado un nuevo usuario (%{value}). La cuenta está pendiente de aprobación:" + mail_body_account_information: "Información de su cuenta" + mail_body_account_information_external: "Puede usar su %{value} cuenta para ingresar." + mail_body_backup_ready: "La copia de seguridad solicitada está preparada. Puede descargarla desde aquí:" + mail_body_backup_token_reset_admin_info: Se ha restablecido el token de copias de seguridad para el usuario «%{user}». + mail_body_backup_token_reset_user_info: Se ha restablecido su token de copias de seguridad. mail_body_backup_token_info: El token anterior ya no es válido. mail_body_backup_waiting_period: El nuevo token se habilitará en %{hours} horas. - mail_body_backup_token_warning: Si no lo ha solicitado, inicie sesión en OpenProject - de inmediato y vuelva a restablecerlo. - mail_body_incoming_email_error: El correo electrónico que enviaste a OpenProject - no pudo ser procesado. - mail_body_incoming_email_error_in_reply_to: El %{received_at} %{from_email} escribió - mail_body_incoming_email_error_logs: Registros - mail_body_lost_password: 'Para cambiar su contraseña, haga clic en el siguiente - enlace:' + mail_body_backup_token_warning: Si no lo ha solicitado, inicie sesión en OpenProject de inmediato y vuelva a restablecerlo. + mail_body_incoming_email_error: El correo electrónico que enviaste a OpenProject no pudo ser procesado. + mail_body_incoming_email_error_in_reply_to: "El %{received_at} %{from_email} escribió" + mail_body_incoming_email_error_logs: "Registros" + mail_body_lost_password: "Para cambiar su contraseña, haga clic en el siguiente enlace:" mail_password_change_not_possible: - title: No es posible cambiar la contraseña - body: Su cuenta en %{app_title} está conectada a un proveedor de autenticación - externo (%{name}). - subtext: Las contraseñas de las cuentas externas no pueden cambiarse en la aplicación. - Utilice la funcionalidad de pérdida de contraseña de su proveedor de autenticación. - mail_body_register: 'Bienvenido a %{app_title}. Por favor, active su cuenta haciendo - clic en este enlace:' - mail_body_register_header_title: Correo electrónico de invitación al miembro del - proyecto - mail_body_register_user: Estimado/a %{name}, + title: "No es posible cambiar la contraseña" + body: "Su cuenta en %{app_title} está conectada a un proveedor de autenticación externo (%{name})." + subtext: "Las contraseñas de las cuentas externas no pueden cambiarse en la aplicación. Utilice la funcionalidad de pérdida de contraseña de su proveedor de autenticación." + mail_body_register: "Bienvenido a %{app_title}. Por favor, active su cuenta haciendo clic en este enlace:" + mail_body_register_header_title: "Correo electrónico de invitación al miembro del proyecto" + mail_body_register_user: "Estimado/a %{name}," mail_body_register_links_html: | Le invitamos a explorar nuestro canal de YouTube (%{youtube_link}), donde encontrará un seminario web (%{webinar_link}) y vídeos de introducción (%{get_started_link}) para que empiece a usar OpenProject de la forma más fácil posible.
Si tiene alguna pregunta, consulte la documentación (%{documentation_link}) o póngase en contacto con el administrador. - mail_body_register_closing: Tu equipo de OpenProject + mail_body_register_closing: "Tu equipo de OpenProject" mail_body_register_ending: "¡Mantente conectado! Saludos," - mail_body_reminder: "%{count} paquete(s) de trabajo que le fueron asignados vencen - en los próximos %{days}:" - mail_body_group_reminder: "%{count} paquete(s) de trabajo asignado(s) al grupo “%{group}” - vencerán en los próximos %{days} días:" - mail_body_wiki_page_added: La página wiki "%{id}" ha sido añadida por %{author}. - mail_body_wiki_page_updated: La página wiki "%{id}" ha sido actualizada por %{author}. - mail_subject_account_activation_request: solicitud de activación de cuenta de %{value} - mail_subject_backup_ready: La copia de seguridad está preparada - mail_subject_backup_token_reset: Resetear token de respaldo - mail_subject_incoming_email_error: Un correo electrónico que enviaste a OpenProject - no pudo ser procesado. - mail_subject_lost_password: Su contraseña %{value} - mail_subject_register: La activación de la cuenta %{value} + mail_body_reminder: "%{count} paquete(s) de trabajo que le fueron asignados vencen en los próximos %{days}:" + mail_body_group_reminder: '%{count} paquete(s) de trabajo asignado(s) al grupo “%{group}” vencerán en los próximos %{days} días:' + mail_body_wiki_page_added: "La página wiki \"%{id}\" ha sido añadida por %{author}." + mail_body_wiki_page_updated: "La página wiki \"%{id}\" ha sido actualizada por %{author}." + mail_subject_account_activation_request: "solicitud de activación de cuenta de %{value}" + mail_subject_backup_ready: "La copia de seguridad está preparada" + mail_subject_backup_token_reset: "Resetear token de respaldo" + mail_subject_incoming_email_error: "Un correo electrónico que enviaste a OpenProject no pudo ser procesado." + mail_subject_lost_password: "Su contraseña %{value}" + mail_subject_register: "La activación de la cuenta %{value}" mail_subject_wiki_content_added: "'%{id}' wiki página ha sido agregada" mail_subject_wiki_content_updated: "'%{id}' wiki página ha sido actualizada" mail_member_added_project: @@ -4841,153 +4120,111 @@ es: body: added_by: without_message: "%{user} le añadió como miembro al proyecto «%{project}»." - with_message: "%{user} le añadió como miembro al proyecto «%{project}» con - el mensaje siguiente:" - roles: 'Tiene los roles siguientes:' + with_message: "%{user} le añadió como miembro al proyecto «%{project}» con el mensaje siguiente:" + roles: "Tiene los roles siguientes:" mail_member_updated_project: subject: "%{project}: se actualizaron sus roles" body: updated_by: without_message: "%{user} actualizó los roles que tiene en el proyecto «%{project}»." - with_message: "%{user} actualizó los roles que tiene en el proyecto «%{project}» - con el mensaje siguiente:" - roles: 'Tiene asignados los roles siguientes:' + with_message: "%{user} actualizó los roles que tiene en el proyecto «%{project}» con el mensaje siguiente:" + roles: "Tiene asignados los roles siguientes:" mail_member_updated_global: - subject: Se actualizaron sus permisos globales + subject: "Se actualizaron sus permisos globales" body: updated_by: without_message: "%{user} actualizó sus roles globales." with_message: "%{user} actualizó sus roles globales con el mensaje siguiente:" - roles: 'Tiene asignados los roles siguientes:' + roles: "Tiene asignados los roles siguientes:" mail_user_activation_limit_reached: subject: Se ha alcanzado el límite de activaciones del usuario message: | Un nuevo usuario (%{email}) intento crear una cuenta en el ambiente de Proyecto Abierto que usted administra (%{host}). El usuario no puede activar su cuenta debido a que el límite del usuario ha sido alcanzado. steps: - label: 'Para permitir al usuario ingresar, usted puede: ' - a: Mejore su plan de pago ([here](upgrade_url)) - b: Bloquear o eliminar un usuario existente ([here](users_url)) - more_actions: Más funciones - noscript_description: Necesita activar JavaScript para poder usar OpenProject! - noscript_heading: JavaScript desactivado - noscript_learn_more: Más información - notice_accessibility_mode: El modo de accesibilidad puede ser habilitado a través - de tu cuenta [settings](url). - notice_account_activated: Su cuenta ha sido activada. Ahora puede iniciar sesión. + label: "Para permitir al usuario ingresar, usted puede: " + a: "Mejore su plan de pago ([here](upgrade_url))" #here turned into a link + b: "Bloquear o eliminar un usuario existente ([here](users_url))" #here turned into a link + more_actions: "Más funciones" + noscript_description: "Necesita activar JavaScript para poder usar OpenProject!" + noscript_heading: "JavaScript desactivado" + noscript_learn_more: "Más información" + notice_accessibility_mode: El modo de accesibilidad puede ser habilitado a través de tu cuenta [settings](url). + notice_account_activated: "Su cuenta ha sido activada. Ahora puede iniciar sesión." notice_account_already_activated: La Cuenta ya había sido activada. notice_account_invalid_token: Token de activación no válido - notice_account_invalid_credentials: Usuario no válido o la contraseña - notice_account_invalid_credentials_or_blocked: Usuario no válido o la contraseña - o la cuenta está bloqueada debido a múltiples intentos de inicio de sesión fallidos. - Si es así, se desbloquea automáticamente en poco tiempo. - notice_account_lost_email_sent: Se le envió un correo electrónico con instrucciones - para elegir una nueva contraseña. - notice_account_new_password_forced: Se requiere una contraseña nueva. - notice_account_password_expired: Su contraseña expiró después de %{days} días. Por - favor seleccione uno nuevo. - notice_account_password_updated: Contraseña se actualizó correctamente. - notice_account_pending: Su cuenta fue creada y ahora está pendiente de aprobación - del administrador. - notice_account_register_done: Cuenta se ha creado correctamente. Para activar su - cuenta, haga clic en el enlace que fue enviado a su email. - notice_account_unknown_email: Usuario desconocido. - notice_account_update_failed: No se pudieron salvar los ajustes de la cuenta. Por - favor revise en la página de su cuenta. - notice_account_updated: Cuenta se actualizó correctamente. - notice_account_other_session_expired: Todas las sesiones ligadas a tu cuenta han - sido invalidadas. - notice_account_wrong_password: Contraseña incorrecta - notice_account_registered_and_logged_in: Bienvenido, tu cuenta ha sido activada. - Ahora estás logueado. + notice_account_invalid_credentials: "Usuario no válido o la contraseña" + notice_account_invalid_credentials_or_blocked: "Usuario no válido o la contraseña o la cuenta está bloqueada debido a múltiples intentos de inicio de sesión fallidos. Si es así, se desbloquea automáticamente en poco tiempo." + notice_account_lost_email_sent: "Se le envió un correo electrónico con instrucciones para elegir una nueva contraseña." + notice_account_new_password_forced: "Se requiere una contraseña nueva." + notice_account_password_expired: "Su contraseña expiró después de %{days} días. Por favor seleccione uno nuevo." + notice_account_password_updated: "Contraseña se actualizó correctamente." + notice_account_pending: "Su cuenta fue creada y ahora está pendiente de aprobación del administrador." + notice_account_register_done: "Cuenta se ha creado correctamente. Para activar su cuenta, haga clic en el enlace que fue enviado a su email." + notice_account_unknown_email: "Usuario desconocido." + notice_account_update_failed: "No se pudieron salvar los ajustes de la cuenta. Por favor revise en la página de su cuenta." + notice_account_updated: "Cuenta se actualizó correctamente." + notice_account_other_session_expired: "Todas las sesiones ligadas a tu cuenta han sido invalidadas." + notice_account_wrong_password: "Contraseña incorrecta" + notice_account_registered_and_logged_in: "Bienvenido, tu cuenta ha sido activada. Ahora estás logueado." notice_activation_failed: No se pudo activar la cuenta. - notice_auth_stage_verification_error: No se pudo verificar la etapa '%{stage}'. - notice_auth_stage_wrong_stage: Se esperaba que finalizara la fase de autenticación - '%{expected}', pero se devolvió '%{actual}'. - notice_auth_stage_error: La fase de autenticación '%{stage}' falló. - notice_can_t_change_password: Esta cuenta utiliza una fuente de autenticación externa. - Es imposible cambiar la contraseña. - notice_custom_options_deleted: Se ha eliminado la opción '%{option_value}' y sus - %{num_deleted} apariciones. - notice_email_error: Un error ha ocurrido mientras se enviaba el correo (%{value}) - notice_email_sent: Se ha enviado un email a %{value} - notice_failed_to_save_work_packages: 'Fallo al salvar %{count} paquete(s) de trabajo - en %{total} seleccionado: %{ids}.' - notice_failed_to_save_members: 'Fallo al salvar miembro(s): %{errors}.' - notice_deletion_scheduled: La eliminación se ha programado y se ejecutará de forma - asincrónica. - notice_file_not_found: La página que estaba intentando acceder no existe o ha sido - eliminada. - notice_forced_logout: Su sesión ha sido cerrada automáticamente después de %{ttl_time} - minutos de inactividad. - notice_internal_server_error: Ha ocurrido un error en la página que usted trato - de acceder. Si usted continua teniendo problemas por favor contacte su administrador - de %{app_title} para asistencia. - notice_locking_conflict: La información ha sido actualizada por al menos otro usuario - mientras tanto. - notice_locking_conflict_additional_information: La(s) actualización(es) hecha(s) - por %{users}. - notice_locking_conflict_reload_page: Por favor recargue la página, revise los cambios - y re-aplique las actualizaciones. - notice_locking_conflict_warning: Esta página ha sido actualizada por otra persona. - Para no perder sus ediciones, cópielas localmente y vuelva a cargarlas para ver - la versión actualizada. - notice_locking_conflict_danger: No se han podido guardar sus cambios debido a modificaciones - conflictivas. Para no perder sus ediciones, cópielas localmente y vuelva a cargarlas - para ver la versión actualizada. - notice_locking_conflict_action_button: Descartar los cambios y volver a cargar + notice_auth_stage_verification_error: "No se pudo verificar la etapa '%{stage}'." + notice_auth_stage_wrong_stage: "Se esperaba que finalizara la fase de autenticación '%{expected}', pero se devolvió '%{actual}'." + notice_auth_stage_error: "La fase de autenticación '%{stage}' falló." + notice_can_t_change_password: "Esta cuenta utiliza una fuente de autenticación externa. Es imposible cambiar la contraseña." + notice_custom_options_deleted: "Se ha eliminado la opción '%{option_value}' y sus %{num_deleted} apariciones." + notice_email_error: "Un error ha ocurrido mientras se enviaba el correo (%{value})" + notice_email_sent: "Se ha enviado un email a %{value}" + notice_failed_to_save_work_packages: "Fallo al salvar %{count} paquete(s) de trabajo en %{total} seleccionado: %{ids}." + notice_failed_to_save_members: "Fallo al salvar miembro(s): %{errors}." + notice_deletion_scheduled: "La eliminación se ha programado y se ejecutará de forma asincrónica." + notice_file_not_found: "La página que estaba intentando acceder no existe o ha sido eliminada." + notice_forced_logout: "Su sesión ha sido cerrada automáticamente después de %{ttl_time} minutos de inactividad." + notice_internal_server_error: "Ha ocurrido un error en la página que usted trato de acceder. Si usted continua teniendo problemas por favor contacte su administrador de %{app_title} para asistencia." + notice_locking_conflict: "La información ha sido actualizada por al menos otro usuario mientras tanto." + notice_locking_conflict_additional_information: "La(s) actualización(es) hecha(s) por %{users}." + notice_locking_conflict_reload_page: "Por favor recargue la página, revise los cambios y re-aplique las actualizaciones." + notice_locking_conflict_warning: "Esta página ha sido actualizada por otra persona. Para no perder sus ediciones, cópielas localmente y vuelva a cargarlas para ver la versión actualizada." + notice_locking_conflict_danger: "No se han podido guardar sus cambios debido a modificaciones conflictivas. Para no perder sus ediciones, cópielas localmente y vuelva a cargarlas para ver la versión actualizada." + notice_locking_conflict_action_button: "Descartar los cambios y volver a cargar" notice_member_added: Se añadio a %{name} al proyecto. notice_members_added: Añadidos %{number} usuarios al proyecto. - notice_member_removed: Se ha eliminado a %{user} del proyecto. - notice_member_deleted: El usuario %{user} ha sido borrado del proyecto y eliminado. - notice_no_principals_found: No se encontraron resultados. - notice_bad_request: Petición incorrecta. - notice_not_authorized: No está autorizado a acceder a esta página. - notice_not_authorized_archived_project: El proyecto que usted esta tratando de acceder - ha sido archivado. - notice_requires_enterprise_token: Falta el token de la empresa o no permite el acceso - a esta página. - notice_password_confirmation_failed: La contraseña introducida no es correcta. - notice_principals_found_multiple: "Hemos encontrado %{number} resultados. \n Pulse - TAB para ver el primer resultado." - notice_principals_found_single: "Se ha encontrado solo un resultado. \n Pulse TAB - para verlo." - notice_parent_item_not_found: Elemento padre no encontrado. - notice_project_not_deleted: El proyecto no fue eliminado. - notice_project_not_found: Proyecto no encontrado. - notice_successful_connection: Conexión exitosa. - notice_successful_create: Creación exitosa. - notice_successful_delete: Eliminado con éxito. - notice_successful_cancel: Cancelación exitosa. - notice_successful_update: Actualización correcta. - notice_successful_move: Traslado con éxito de %{from} a %{to}. - notice_unsuccessful_create: Error en la creación. - notice_unsuccessful_create_with_reason: 'Error en la creación: %{reason}' - notice_unsuccessful_update: Error al actualizar. - notice_unsuccessful_update_with_reason: 'Error en la actualización: %{reason}' - notice_successful_update_custom_fields_added_to_project: 'Actualización correcta. - Los campos personalizados de los tipos ya activados se activan automáticamente - en el formulario de paquete de trabajo. Ver más. - - ' - notice_to_many_principals_to_display: |- - Hay demasiados resultados. - Afine la búsqueda ingresando el nombre del nuevo miembro (o grupo). - notice_user_missing_authentication_method: El usuario todavía tiene que elegir una - contraseña u otra manera de iniciar sesión. + notice_member_removed: "Se ha eliminado a %{user} del proyecto." + notice_member_deleted: "El usuario %{user} ha sido borrado del proyecto y eliminado." + notice_no_principals_found: "No se encontraron resultados." + notice_bad_request: "Petición incorrecta." + notice_not_authorized: "No está autorizado a acceder a esta página." + notice_not_authorized_archived_project: "El proyecto que usted esta tratando de acceder ha sido archivado." + notice_requires_enterprise_token: "Falta el token de la empresa o no permite el acceso a esta página." + notice_password_confirmation_failed: "La contraseña introducida no es correcta." + notice_principals_found_multiple: "Hemos encontrado %{number} resultados. \n Pulse TAB para ver el primer resultado." + notice_principals_found_single: "Se ha encontrado solo un resultado. \n Pulse TAB para verlo." + notice_parent_item_not_found: "Elemento padre no encontrado." + notice_project_not_deleted: "El proyecto no fue eliminado." + notice_project_not_found: "Proyecto no encontrado." + notice_successful_connection: "Conexión exitosa." + notice_successful_create: "Creación exitosa." + notice_successful_delete: "Eliminado con éxito." + notice_successful_cancel: "Cancelación exitosa." + notice_successful_update: "Actualización correcta." + notice_successful_move: "Traslado con éxito de %{from} a %{to}." + notice_unsuccessful_create: "Error en la creación." + notice_unsuccessful_create_with_reason: "Error en la creación: %{reason}" + notice_unsuccessful_update: "Error al actualizar." + notice_unsuccessful_update_with_reason: "Error en la actualización: %{reason}" + notice_successful_update_custom_fields_added_to_project: | + Actualización correcta. Los campos personalizados de los tipos ya activados se activan automáticamente en el formulario de paquete de trabajo. Ver más. + notice_to_many_principals_to_display: "Hay demasiados resultados.\nAfine la búsqueda ingresando el nombre del nuevo miembro (o grupo)." + notice_user_missing_authentication_method: El usuario todavía tiene que elegir una contraseña u otra manera de iniciar sesión. notice_user_invitation_resent: Se envió una invitación a %{email}. - present_access_key_value: 'Su %{key_name} es: %{value}' - notice_automatic_set_of_standard_type: Establecer tipo estándar automáticamente. - notice_logged_out: Has cerrado la sesion. - notice_wont_delete_auth_source: La conexión LDAP no puede eliminarse mientras siga - habiendo usuarios que la utilicen. - notice_project_cannot_update_custom_fields: 'No se pueden actualizar campos personalizados - disponibles del proyecto. El proyecto es inválido: %{errors}' - notice_attachment_migration_wiki_page: 'Esta página se generó automáticamente al - actualizar OpenProject. Contiene todos los datos adjuntos que estaban asociados - anteriormente al %{container_type} "%{container_name}". - - ' + present_access_key_value: "Su %{key_name} es: %{value}" + notice_automatic_set_of_standard_type: "Establecer tipo estándar automáticamente." + notice_logged_out: "Has cerrado la sesion." + notice_wont_delete_auth_source: La conexión LDAP no puede eliminarse mientras siga habiendo usuarios que la utilicen. + notice_project_cannot_update_custom_fields: "No se pueden actualizar campos personalizados disponibles del proyecto. El proyecto es inválido: %{errors}" + notice_attachment_migration_wiki_page: > + Esta página se generó automáticamente al actualizar OpenProject. Contiene todos los datos adjuntos que estaban asociados anteriormente al %{container_type} "%{container_name}". + #Default format for numbers number: format: delimiter: "," @@ -4995,256 +4232,221 @@ es: separator: "." human: format: - delimiter: '' + delimiter: "" precision: 1 storage_units: format: "%n %u" units: byte: - one: Byte - other: Bytes - gb: GB - kb: kB - mb: MB - tb: TB + one: "Byte" + other: "Bytes" + gb: "GB" + kb: "kB" + mb: "MB" + tb: "TB" onboarding: - heading_getting_started: Obtener información general - text_getting_started_description: Obtenga un resumen rápido sobre la gestión de - proyectos y la colaboración en equipo con OpenProject. Puedes volver a ver este - video des del menú de ayuda. - welcome: Bienvenido a %{app_title} - select_language: Seleccione su idioma - permission_add_work_package_comments: Añadir comentarios - permission_add_work_packages: Añadir paquetes de trabajo - permission_add_messages: Publicar mensajes - permission_add_project: Crear proyectos - permission_add_portfolios: Crear portafolios - permission_add_programs: Crear programas - permission_add_work_package_attachments: Añadir archivos adjuntos - permission_add_work_package_attachments_explanation: Permite añadir archivos adjuntos - sin el permiso Editar paquetes de trabajo - permission_add_internal_comments: Escribir comentarios internos - permission_archive_project: Archivar proyecto - permission_create_user: Crear usuarios - permission_manage_user: Editar usuarios - permission_manage_placeholder_user: Crear, editar y eliminar usuarios de marcador - de posición - permission_add_subprojects: Crear subproyectos - permission_add_work_package_watchers: Agregar observadores - permission_assign_versions: Asignar versiones - permission_browse_repository: Permiso de solo lectura sobre el repositorio (Navegación - y checkout) - permission_change_wiki_parent_page: Cambiar wiki pagina madre - permission_change_work_package_status: Cambiar el estado del paquete de trabajo - permission_change_work_package_status_explanation: Permite cambiar el estado sin - el permiso Editar paquetes de trabajo - permission_comment_news: Comentar noticias - permission_commit_access: Permiso de escritura sobre el repositorio (commit) - permission_copy_projects: Copiar proyectos - permission_copy_projects_explanation: En los proyectos de plantilla, este permiso - tiene una función secundaria, permite la creación de nuevos proyectos derivados - de la plantilla. - permission_copy_work_packages: Duplicar paquetes de trabajo - permission_create_backup: Crear copias de seguridad - permission_delete_work_package_watchers: Eliminar los observadores - permission_delete_work_packages: Eliminar paquetes de trabajo - permission_delete_messages: Eliminar mensajes - permission_delete_own_messages: Borrar los mensajes propios - permission_delete_reportings: Eliminar reportes - permission_delete_timelines: Eliminar cronogramas - permission_delete_wiki_pages: Eliminar wiki página - permission_delete_wiki_pages_attachments: Eliminar adjuntos - permission_edit_work_package_comments: Moderar comentarios - permission_edit_work_package_comments_explanation: 'Precaución: Los usuarios con - este permiso pueden editar los comentarios de cualquier persona.' - permission_edit_work_packages: Editar paquetes de trabajo - permission_edit_messages: Editar mensajes - permission_edit_own_internal_comments: Editar comentarios internos propios - permission_edit_own_work_package_comments: Editar comentarios propios - permission_edit_own_messages: Editar mensajes propios - permission_edit_own_time_entries: Editar registros de tiempo propios - permission_edit_others_internal_comments: Moderar comentarios internos - permission_edit_others_internal_comments_explanation: 'Precaución: Los usuarios - con este permiso pueden editar los comentarios internos de otros usuarios.' - permission_edit_project: Editar proyecto - permission_edit_project_attributes: Editar atributos del proyecto - permission_edit_project_phases: Editar fases del proyecto - permission_edit_reportings: Editar reportes - permission_edit_time_entries: Editar registros de tiempo para otros usuarios - permission_edit_timelines: Editar cronogramas - permission_edit_wiki_pages: Editar wiki página - permission_export_work_packages: Exportar Paquetes de Trabajo - permission_export_projects: Exportar proyectos - permission_export_wiki_pages: Exportar wiki página - permission_invite_members_by_email: Invitar a miembros por correo electrónico - permission_invite_members_by_email_explanation: 'Permite a los usuarios invitar - a nuevos miembros por correo electrónico. Los usuarios invitados recibirán un - correo electrónico con un enlace para establecer su contraseña y activar su cuenta. - Depende del permiso para gestionar miembros - - ' - permission_list_attachments: Lista archivos adjuntos - permission_log_own_time: Registrar tiempo para uno mismo - permission_log_time: Registrar tiempo para otros usuarios - permission_manage_forums: Administrar foros - permission_manage_categories: Administrar categorías del paquete de trabajo - permission_manage_dashboards: Administrar tableros de control - permission_manage_work_package_relations: Gestionar las relaciones del paquete de - trabajo - permission_manage_members: Gestión de Miembros - permission_manage_news: Administrar noticias - permission_manage_project_activities: Gestionar actividades del proyecto - permission_manage_public_queries: Administrar vistas públicas - permission_manage_repository: Gestionar repositorio - permission_manage_subtasks: Administrar jerarquías de paquetes de trabajo - permission_manage_versions: Administrar versiones - permission_manage_wiki: Administrar wiki - permission_manage_wiki_menu: Administrar menú wiki - permission_move_work_packages: Mover paquetes de trabajo - permission_protect_wiki_pages: Proteger páginas wiki - permission_rename_wiki_pages: Renombrar páginas wiki - permission_save_queries: Guardar vistas - permission_search_project: Buscar proyecto - permission_select_custom_fields: Seleccionar campos personalizados - permission_select_project_custom_fields: Seleccione los atributos del proyecto - permission_select_project_phases: Seleccione las fases del proyecto - permission_select_project_phases_explanation: Activar/desactivar las fases de un - proyecto. Permite al usuario seleccionar el ciclo de vida adecuado para el proyecto, - ya que las fases inactivas no serán visibles en la página de resumen del proyecto - ni en la lista de proyectos. - permission_select_project_modules: Seleccionar módulos de proyecto - permission_share_work_packages: Compartir paquetes de trabajo - permission_manage_types: Seleccionar Tipos - permission_manage_own_reminders: Crear recordatorios propios - permission_view_all_principals: Ver todos los usuarios y grupos - permission_view_all_principals_explanation: 'Permite a los usuarios ver todos los - usuarios y grupos del sistema, incluso si no son miembros de ningún proyecto o - grupo al que se hayan unido. - - ' - permission_view_project: Ver proyectos - permission_view_changesets: Ver las revisiones del repositorio en OpenProject - permission_view_internal_comments: Ver comentarios internos - permission_view_commit_author_statistics: Ver estadísticas del commit del autor - permission_view_dashboards: Ver paneles de control - permission_view_work_package_watchers: Ver lista de observadores - permission_view_work_packages: Ver paquetes de trabajo - permission_view_messages: Ver mensajes - permission_view_news: Ver noticias - permission_view_members: Ver miembros - permission_view_reportings: Ver reportes - permission_view_shared_work_packages: Ver paquetes de trabajo compartidos - permission_view_time_entries: Ver tiempo invertido - permission_view_timelines: Ver cronogramas - permission_view_user_email: Ver las direcciones de correo de los usuarios - permission_view_wiki_edits: Ver historial wiki - permission_view_wiki_pages: Ver wiki - permission_work_package_assigned: Hazte asignado/responsable - permission_work_package_assigned_explanation: Los paquetes de trabajo se pueden - asignar a usuarios y grupos con este papel en los proyectos correspondientes - permission_view_project_activity: Ver la actividad del proyecto - permission_view_project_attributes: Ver atributos del proyecto - permission_view_project_phases: Ver las fases del proyecto - permission_save_bcf_queries: Guardar consultas BCF - permission_manage_public_bcf_queries: Administrar consultas BCF públicas - permission_edit_attribute_help_texts: Editar textos de ayuda de atributos - permission_manage_public_project_queries: Administrar listas públicas de proyectos - permission_view_project_query: Ver vistas de proyecto - permission_edit_project_query: Editar vistas de proyecto + heading_getting_started: "Obtener información general" + text_getting_started_description: "Obtenga un resumen rápido sobre la gestión de proyectos y la colaboración en equipo con OpenProject. Puedes volver a ver este video des del menú de ayuda." + welcome: "Bienvenido a %{app_title}" + select_language: "Seleccione su idioma" + permission_add_work_package_comments: "Añadir comentarios" + permission_add_work_packages: "Añadir paquetes de trabajo" + permission_add_messages: "Publicar mensajes" + permission_add_project: "Crear proyectos" + permission_add_portfolios: "Crear portafolios" + permission_add_programs: "Crear programas" + permission_add_work_package_attachments: "Añadir archivos adjuntos" + permission_add_work_package_attachments_explanation: "Permite añadir archivos adjuntos sin el permiso Editar paquetes de trabajo" + permission_add_internal_comments: "Escribir comentarios internos" + permission_archive_project: "Archivar proyecto" + permission_create_user: "Crear usuarios" + permission_manage_user: "Editar usuarios" + permission_manage_placeholder_user: "Crear, editar y eliminar usuarios de marcador de posición" + permission_add_subprojects: "Crear subproyectos" + permission_add_work_package_watchers: "Agregar observadores" + permission_assign_versions: "Asignar versiones" + permission_browse_repository: "Permiso de solo lectura sobre el repositorio (Navegación y checkout)" + permission_change_wiki_parent_page: "Cambiar wiki pagina madre" + permission_change_work_package_status: "Cambiar el estado del paquete de trabajo" + permission_change_work_package_status_explanation: "Permite cambiar el estado sin el permiso Editar paquetes de trabajo" + permission_comment_news: "Comentar noticias" + permission_commit_access: "Permiso de escritura sobre el repositorio (commit)" + permission_copy_projects: "Copiar proyectos" + permission_copy_projects_explanation: "En los proyectos de plantilla, este permiso tiene una función secundaria, permite la creación de nuevos proyectos derivados de la plantilla." + permission_copy_work_packages: "Duplicar paquetes de trabajo" + permission_create_backup: "Crear copias de seguridad" + permission_delete_work_package_watchers: "Eliminar los observadores" + permission_delete_work_packages: "Eliminar paquetes de trabajo" + permission_delete_messages: "Eliminar mensajes" + permission_delete_own_messages: "Borrar los mensajes propios" + permission_delete_reportings: "Eliminar reportes" + permission_delete_timelines: "Eliminar cronogramas" + permission_delete_wiki_pages: "Eliminar wiki página" + permission_delete_wiki_pages_attachments: "Eliminar adjuntos" + permission_edit_work_package_comments: "Moderar comentarios" + permission_edit_work_package_comments_explanation: "Precaución: Los usuarios con este permiso pueden editar los comentarios de cualquier persona." + permission_edit_work_packages: "Editar paquetes de trabajo" + permission_edit_messages: "Editar mensajes" + permission_edit_own_internal_comments: "Editar comentarios internos propios" + permission_edit_own_work_package_comments: "Editar comentarios propios" + permission_edit_own_messages: "Editar mensajes propios" + permission_edit_own_time_entries: "Editar registros de tiempo propios" + permission_edit_others_internal_comments: "Moderar comentarios internos" + permission_edit_others_internal_comments_explanation: "Precaución: Los usuarios con este permiso pueden editar los comentarios internos de otros usuarios." + permission_edit_project: "Editar proyecto" + permission_edit_project_attributes: "Editar atributos del proyecto" + permission_edit_project_phases: "Editar fases del proyecto" + permission_edit_reportings: "Editar reportes" + permission_edit_time_entries: "Editar registros de tiempo para otros usuarios" + permission_edit_timelines: "Editar cronogramas" + permission_edit_wiki_pages: "Editar wiki página" + permission_export_work_packages: "Exportar Paquetes de Trabajo" + permission_export_projects: "Exportar proyectos" + permission_export_wiki_pages: "Exportar wiki página" + permission_invite_members_by_email: "Invitar a miembros por correo electrónico" + permission_invite_members_by_email_explanation: > + Permite a los usuarios invitar a nuevos miembros por correo electrónico. Los usuarios invitados recibirán un correo electrónico con un enlace para establecer su contraseña y activar su cuenta. Depende del permiso para gestionar miembros + permission_list_attachments: "Lista archivos adjuntos" + permission_log_own_time: "Registrar tiempo para uno mismo" + permission_log_time: "Registrar tiempo para otros usuarios" + permission_manage_forums: "Administrar foros" + permission_manage_categories: "Administrar categorías del paquete de trabajo" + permission_manage_dashboards: "Administrar tableros de control" + permission_manage_work_package_relations: "Gestionar las relaciones del paquete de trabajo" + permission_manage_members: "Gestión de Miembros" + permission_manage_news: "Administrar noticias" + permission_manage_project_activities: "Gestionar actividades del proyecto" + permission_manage_public_queries: "Administrar vistas públicas" + permission_manage_repository: "Gestionar repositorio" + permission_manage_subtasks: "Administrar jerarquías de paquetes de trabajo" + permission_manage_versions: "Administrar versiones" + permission_manage_wiki: "Administrar wiki" + permission_manage_wiki_menu: "Administrar menú wiki" + permission_move_work_packages: "Mover paquetes de trabajo" + permission_protect_wiki_pages: "Proteger páginas wiki" + permission_rename_wiki_pages: "Renombrar páginas wiki" + permission_save_queries: "Guardar vistas" + permission_search_project: "Buscar proyecto" + permission_select_custom_fields: "Seleccionar campos personalizados" + permission_select_project_custom_fields: "Seleccione los atributos del proyecto" + permission_select_project_phases: "Seleccione las fases del proyecto" + permission_select_project_phases_explanation: "Activar/desactivar las fases de un proyecto. Permite al usuario seleccionar el ciclo de vida adecuado para el proyecto, ya que las fases inactivas no serán visibles en la página de resumen del proyecto ni en la lista de proyectos." + permission_select_project_modules: "Seleccionar módulos de proyecto" + permission_share_work_packages: "Compartir paquetes de trabajo" + permission_manage_types: "Seleccionar Tipos" + permission_manage_own_reminders: "Crear recordatorios propios" + permission_view_all_principals: "Ver todos los usuarios y grupos" + permission_view_all_principals_explanation: > + Permite a los usuarios ver todos los usuarios y grupos del sistema, incluso si no son miembros de ningún proyecto o grupo al que se hayan unido. + permission_view_project: "Ver proyectos" + permission_view_changesets: "Ver las revisiones del repositorio en OpenProject" + permission_view_internal_comments: "Ver comentarios internos" + permission_view_commit_author_statistics: "Ver estadísticas del commit del autor" + permission_view_dashboards: "Ver paneles de control" + permission_view_work_package_watchers: "Ver lista de observadores" + permission_view_work_packages: "Ver paquetes de trabajo" + permission_view_messages: "Ver mensajes" + permission_view_news: "Ver noticias" + permission_view_members: "Ver miembros" + permission_view_reportings: "Ver reportes" + permission_view_shared_work_packages: "Ver paquetes de trabajo compartidos" + permission_view_time_entries: "Ver tiempo invertido" + permission_view_timelines: "Ver cronogramas" + permission_view_user_email: "Ver las direcciones de correo de los usuarios" + permission_view_wiki_edits: "Ver historial wiki" + permission_view_wiki_pages: "Ver wiki" + permission_work_package_assigned: "Hazte asignado/responsable" + permission_work_package_assigned_explanation: "Los paquetes de trabajo se pueden asignar a usuarios y grupos con este papel en los proyectos correspondientes" + permission_view_project_activity: "Ver la actividad del proyecto" + permission_view_project_attributes: "Ver atributos del proyecto" + permission_view_project_phases: "Ver las fases del proyecto" + permission_save_bcf_queries: "Guardar consultas BCF" + permission_manage_public_bcf_queries: "Administrar consultas BCF públicas" + permission_edit_attribute_help_texts: "Editar textos de ayuda de atributos" + permission_manage_public_project_queries: "Administrar listas públicas de proyectos" + permission_view_project_query: "Ver vistas de proyecto" + permission_edit_project_query: "Editar vistas de proyecto" placeholders: default: "-" templated_hint: Generado automáticamente a través del tipo %{type} portfolio: count: - zero: 0 carteras - one: 1 cartera + zero: "0 carteras" + one: "1 cartera" other: "%{count} carteras" program: count: - zero: 0 programas - one: 1 programa + zero: "0 programas" + one: "1 programa" other: "%{count} programas" project: archive: - title: Archivar proyecto + title: "Archivar proyecto" are_you_sure: "¿Está seguro que desea archivar el proyecto '%{name}'?" - archived: Archivado + archived: "Archivado" count: - zero: 0 proyectos - one: 1 proyecto + zero: "0 proyectos" + one: "1 proyecto" other: "%{count} projectos" destroy: - title: Eliminar proyecto + title: "Eliminar proyecto" heading: "¿Eliminar este proyecto de forma permanente?" confirmation_message_for_subprojects_html: - zero: 'Está a punto de borrar de forma permanente todos los datos relativos - al proyecto %{name}. - - ' - one: 'Está a punto de borrar de forma permanente todos los datos relativos - al proyecto %{name} y este subproyecto: - - ' - other: 'Está a punto de borrar de forma permanente todos los datos relativos - al proyecto %{name} y estos subproyectos: - - ' + zero: > + Está a punto de borrar de forma permanente todos los datos relativos al proyecto %{name}. + one: > + Está a punto de borrar de forma permanente todos los datos relativos al proyecto %{name} y este subproyecto: + other: > + Está a punto de borrar de forma permanente todos los datos relativos al proyecto %{name} y estos subproyectos: filters: - project_phase: 'Fase del proyecto: %{phase}' - project_phase_any: 'Fase del proyecto: Cualquiera' - project_phase_gate: 'Puerta de la fase del proyecto: %{gate}' + project_phase: "Fase del proyecto: %{phase}" + project_phase_any: "Fase del proyecto: Cualquiera" + project_phase_gate: "Puerta de la fase del proyecto: %{gate}" identifier: warning_one: Los miembros del proyecto deberán migrar los repositorios del proyecto. warning_two: Los links al proyeto existentes dejarán de funcionar. title: Cambiar el identificador de proyecto - not_available: Proyecto N/D + not_available: "Proyecto N/D" template: - copying_title: Plantilla aplicada - copying: 'Tu proyecto está siendo creado a partir de la plantilla seleccionada. - Serás notificado por correo electrónico tan pronto como el proyecto esté disponible. - - ' - use_template: Usar plantilla - make_template: Establecer como plantilla - remove_from_templates: Eliminar de plantillas - project_module_activity: Actividad - project_module_forums: Foros - project_module_work_package_tracking: Paquetes de trabajo - project_module_news: Noticias - project_module_repository: Repositorio - project_module_wiki: Wiki - permission_header_for_project_module_work_package_tracking: Paquetes de trabajo - y diagramas de Gantt + copying_title: "Plantilla aplicada" + copying: > + Tu proyecto está siendo creado a partir de la plantilla seleccionada. Serás notificado por correo electrónico tan pronto como el proyecto esté disponible. + use_template: "Usar plantilla" + make_template: "Establecer como plantilla" + remove_from_templates: "Eliminar de plantillas" + project_module_activity: "Actividad" + project_module_forums: "Foros" + project_module_work_package_tracking: "Paquetes de trabajo" + project_module_news: "Noticias" + project_module_repository: "Repositorio" + project_module_wiki: "Wiki" + permission_header_for_project_module_work_package_tracking: "Paquetes de trabajo y diagramas de Gantt" query: attribute_and_direction: "%{attribute} (%{direction})" + #possible query parameters (e.g. issue queries), + #which are not attributes of an AR-Model. query_fields: - active_or_archived: Activo o archivado - assigned_to_role: Asignación de roles - assignee_or_group: Grupo al que pertenece o al que está asignado - member_of_group: Asignación de grupo - name_or_identifier: Nombre o identificador - only_subproject_id: Sólo subproyecto - shared_with_user: Compartido con usuarios - shared_with_me: Compartido conmigo - subproject_id: Incluyendo subproyecto + active_or_archived: "Activo o archivado" + assigned_to_role: "Asignación de roles" + assignee_or_group: "Grupo al que pertenece o al que está asignado" + member_of_group: "Asignación de grupo" + name_or_identifier: "Nombre o identificador" + only_subproject_id: "Sólo subproyecto" + shared_with_user: "Compartido con usuarios" + shared_with_me: "Compartido conmigo" + subproject_id: "Incluyendo subproyecto" repositories: - at_identifier: en %{identifier} - atom_revision_feed: Feed de revisión de Atom - autofetch_information: "Marque esta casilla si desea que los repositorios sean - actualizados automáticamente al acceder a la página del módulo del repositorio. - \nEsto abarca la recuperación de entregas del repositorio y actualizar el almacenamiento - en disco necesario." + at_identifier: "en %{identifier}" + atom_revision_feed: "Feed de revisión de Atom" + autofetch_information: "Marque esta casilla si desea que los repositorios sean actualizados automáticamente al acceder a la página del módulo del repositorio. \nEsto abarca la recuperación de entregas del repositorio y actualizar el almacenamiento en disco necesario." checkout: access: - readwrite: Lectura + Escritura - read: Solo lectura - none: No dispone de permisos para hacer checkout, a través de esta aplicación - solo puede ver el repositorio. - access_permission: Sus permisos sobre este repositorio - url: URL de Checkout - base_url_text: |- - La URL base para generar las URLs de checkout (ej: https://myserver.example.org/repos/). - Nota: La URL base solo se utiliza para sobreescribir las URLs de checkout en repositorios administrados. El resto de repositorios no son alterados. + readwrite: "Lectura + Escritura" + read: "Solo lectura" + none: "No dispone de permisos para hacer checkout, a través de esta aplicación solo puede ver el repositorio." + access_permission: "Sus permisos sobre este repositorio" + url: "URL de Checkout" + base_url_text: "La URL base para generar las URLs de checkout (ej: https://myserver.example.org/repos/).\nNota: La URL base solo se utiliza para sobreescribir las URLs de checkout en repositorios administrados. El resto de repositorios no son alterados." default_instructions: git: |- Los datos almacenados en este repositorio pueden ser descargados a su ordenador con Git. @@ -5252,905 +4454,562 @@ es: subversion: |- Los datos almacenados en este repositorio pueden ser descargados a su ordenador con Subversion. Por favor, consulte la documentación de Subversion si necesita mas información sobre el procedimiento de checkout y clientes disponibles. - enable_instructions_text: Muestra las instrucciones de checkout definidas mas - abajo sobre todas las páginas relacionadas con repositorios. - instructions: Instrucciones de checkout - show_instructions: Mostrar las instrucciones de checkout - text_instructions: Este texto es mostrado conjuntamente con la URL de checkout - para guiar en el proceso de checkout del repositorio. - not_available: Las instrucciones de Checkout para este repositorio no estan - definidas. Consulte con su administrador para habilitarlas en este proyecto - en la configuración del sistema. - create_managed_delay: 'Nota: el repositorio es administrado, se crea asincrónicamente - en el disco y estará disponible en breve.' - create_successful: El repositorio ha sido registrado. - delete_sucessful: El repositorio ha sido eliminado. + enable_instructions_text: "Muestra las instrucciones de checkout definidas mas abajo sobre todas las páginas relacionadas con repositorios." + instructions: "Instrucciones de checkout" + show_instructions: "Mostrar las instrucciones de checkout" + text_instructions: "Este texto es mostrado conjuntamente con la URL de checkout para guiar en el proceso de checkout del repositorio." + not_available: "Las instrucciones de Checkout para este repositorio no estan definidas. Consulte con su administrador para habilitarlas en este proyecto en la configuración del sistema." + create_managed_delay: "Nota: el repositorio es administrado, se crea asincrónicamente en el disco y estará disponible en breve." + create_successful: "El repositorio ha sido registrado." + delete_sucessful: "El repositorio ha sido eliminado." destroy: - confirmation: Si continúa, se borarrá definitivamente el repositorio gestionado. - info: La eliminación del repositorio no se puede deshacer. - info_not_managed: 'Nota: Esto NO borrará el contenido de este repositorio, ya - que no es gestionado por OpenProject.' - managed_path_note: 'Se borrará el directorio siguiente: %{path}' - repository_verification: Intruduzca el identificador del proyecto %{identifier} - para confirmar la eliminación de su repositorio. - subtitle: "¿Esta seguro de que desea eliminar el tipo %{repository_type} del - proyecto %{project_name}?" - subtitle_not_managed: "¿Esta seguro de que quiere eliminar la %{url} del %{repository_type} - del proyecto %{project_name}?" - title: Eliminar el %{repository_type} - title_not_managed: Eliminar el %{repository_type} linkado? + confirmation: "Si continúa, se borarrá definitivamente el repositorio gestionado." + info: "La eliminación del repositorio no se puede deshacer." + info_not_managed: "Nota: Esto NO borrará el contenido de este repositorio, ya que no es gestionado por OpenProject." + managed_path_note: "Se borrará el directorio siguiente: %{path}" + repository_verification: "Intruduzca el identificador del proyecto %{identifier} para confirmar la eliminación de su repositorio." + subtitle: "¿Esta seguro de que desea eliminar el tipo %{repository_type} del proyecto %{project_name}?" + subtitle_not_managed: "¿Esta seguro de que quiere eliminar la %{url} del %{repository_type} del proyecto %{project_name}?" + title: "Eliminar el %{repository_type}" + title_not_managed: "Eliminar el %{repository_type} linkado?" errors: - build_failed: No se puede crear el repositorio con la configuración seleccionada. - %{reason} - managed_delete: No fue posible eliminar el repositorio gestionado. - managed_delete_local: 'No se pudo eliminar el repositorio local del sistema - de ficheros ''%{path}'': %{error_message}' - empty_repository: El repositorio existe, pero está vacío. No contiene revisiones - aún. - exists_on_filesystem: El directorio del repositorio ya existe en el sistema - de ficheros. - filesystem_access_failed: 'Se produjo un error al acceder al repositorio en - el sistema de ficheros: %{message}' - not_manageable: Este proveedor de repositorios no puede ser gestionado por OpenProject. - path_permission_failed: 'Error al intentar crear la siguiente ruta: %{path}. - Por favor asegúrese de que OpenProject puede escribir en esa carpeta.' - unauthorized: Usted no está autorizado a acceder al repositorio o las credenciales - no son válidas. - unavailable: El repositorio no está disponible. - exception_title: 'No se puede acceder al repositorio: %{message}' - disabled_or_unknown_type: El tipo seleccionado %{type} es inválido o ya no está - disponible para el proveedor SCM %{vendor}. - disabled_or_unknown_vendor: El proveedor SCM %{vendor} es inválido o ya no está - disponible. - remote_call_failed: 'La llamada al remoto administrado falló con el siguiente - mensaje de respuesta ''%{message}'' (Código: %{code})' - remote_invalid_response: Recibida respuesta incorrecta recivida desde el remoto - administrado. - remote_save_failed: No se pudo guardar el repositorio con los parámetros obtenidos - desde el remoto. + build_failed: "No se puede crear el repositorio con la configuración seleccionada. %{reason}" + managed_delete: "No fue posible eliminar el repositorio gestionado." + managed_delete_local: "No se pudo eliminar el repositorio local del sistema de ficheros '%{path}': %{error_message}" + empty_repository: "El repositorio existe, pero está vacío. No contiene revisiones aún." + exists_on_filesystem: "El directorio del repositorio ya existe en el sistema de ficheros." + filesystem_access_failed: "Se produjo un error al acceder al repositorio en el sistema de ficheros: %{message}" + not_manageable: "Este proveedor de repositorios no puede ser gestionado por OpenProject." + path_permission_failed: "Error al intentar crear la siguiente ruta: %{path}. Por favor asegúrese de que OpenProject puede escribir en esa carpeta." + unauthorized: "Usted no está autorizado a acceder al repositorio o las credenciales no son válidas." + unavailable: "El repositorio no está disponible." + exception_title: "No se puede acceder al repositorio: %{message}" + disabled_or_unknown_type: "El tipo seleccionado %{type} es inválido o ya no está disponible para el proveedor SCM %{vendor}." + disabled_or_unknown_vendor: "El proveedor SCM %{vendor} es inválido o ya no está disponible." + remote_call_failed: "La llamada al remoto administrado falló con el siguiente mensaje de respuesta '%{message}' (Código: %{code})" + remote_invalid_response: "Recibida respuesta incorrecta recivida desde el remoto administrado." + remote_save_failed: "No se pudo guardar el repositorio con los parámetros obtenidos desde el remoto." git: instructions: - managed_url: Esta es la URL del repositorio Git (local) administrado. - path: Especifique la ruta de acceso al repositorio Git (por ejemplo, %{example_path}). - También puede usar repositorios remotos que se clonen en una copia local - con un valor que empiece por http(s):// o file://. - path_encoding: 'Reemplazar Git vía codificación (por defecto: UTF-8)' - local_title: Enlace de repositorio Git local existente - local_url: URL local - local_introduction: Si tienes un repositorio Git local existente, puede enlazarlo - con OpenProject para acceder a él desde dentro de la aplicación. - managed_introduction: Permitir que OpenProject cree e integre un repositorio - Git local automáticamente. - managed_title: Repositorios Git integrados en OpenProject - managed_url: URL Administrada - path: Ruta de acceso al repositorio Git - path_encoding: Ruta de codificación - go_to_revision: Ir a la revisión - managed_remote: Los repositorios administrados para este proveedor son gestionados - de forma remota. - managed_remote_note: La información sobre la URL y la ruta de este repositorio - no están disponibles antes de su creación. - managed_url: URL Administrada + managed_url: "Esta es la URL del repositorio Git (local) administrado." + path: >- + Especifique la ruta de acceso al repositorio Git (por ejemplo, %{example_path}). También puede usar repositorios remotos que se clonen en una copia local con un valor que empiece por http(s):// o file://. + path_encoding: "Reemplazar Git vía codificación (por defecto: UTF-8)" + local_title: "Enlace de repositorio Git local existente" + local_url: "URL local" + local_introduction: "Si tienes un repositorio Git local existente, puede enlazarlo con OpenProject para acceder a él desde dentro de la aplicación." + managed_introduction: "Permitir que OpenProject cree e integre un repositorio Git local automáticamente." + managed_title: "Repositorios Git integrados en OpenProject" + managed_url: "URL Administrada" + path: "Ruta de acceso al repositorio Git" + path_encoding: "Ruta de codificación" + go_to_revision: "Ir a la revisión" + managed_remote: "Los repositorios administrados para este proveedor son gestionados de forma remota." + managed_remote_note: "La información sobre la URL y la ruta de este repositorio no están disponibles antes de su creación." + managed_url: "URL Administrada" settings: - automatic_managed_repos_disabled: Desactivar la creación automática - automatic_managed_repos: Creación automática de repositorios gestionados - automatic_managed_repos_text: Al establecer un proveedor aquí, los proyectos - recién creados recibirán automáticamente un repositorio gestionado de este - proveedor. - scm_vendor: Sistema de gestión de control de fuente - scm_type: Tipo de repositorio + automatic_managed_repos_disabled: "Desactivar la creación automática" + automatic_managed_repos: "Creación automática de repositorios gestionados" + automatic_managed_repos_text: "Al establecer un proveedor aquí, los proyectos recién creados recibirán automáticamente un repositorio gestionado de este proveedor." + scm_vendor: "Sistema de gestión de control de fuente" + scm_type: "Tipo de repositorio" scm_types: - local: Enlazar repositorio local existente - existing: Enlazar repositorio existente - managed: Crear un nuevo repositorio en OpenProject + local: "Enlazar repositorio local existente" + existing: "Enlazar repositorio existente" + managed: "Crear un nuevo repositorio en OpenProject" storage: - not_available: Consumo de almacenamiento de disco no está disponible para este - repositorio. - update_timeout: Mantener la última información de espacio de disco requerida - para un repositorio de N minutos. Contar el espacio de disco requerido de - un repositorio puede ser costoso, aumente este valor para reducir el impacto - en el rendimiento. - oauth_application_details: 'La clave secreta de cliente no será accesible una - vez se cierre esta ventana. Por favor, copie estos valores en la configuración - de la integración de OpenProject en Nextcloud:' - oauth_application_details_link_text: Ir a la página de configuración - setup_documentation_details: 'Si necesita ayuda para configurar un nuevo almacenamiento - de archivos, compruebe la documentación: ' - setup_documentation_details_link_text: Configuración de almacenamiento de archivos - show_warning_details: Para utilizar este almacenamiento recuerde activar el - módulo y el almacenamiento específico en la configuración de cada proyecto - deseado. + not_available: "Consumo de almacenamiento de disco no está disponible para este repositorio." + update_timeout: "Mantener la última información de espacio de disco requerida para un repositorio de N minutos. Contar el espacio de disco requerido de un repositorio puede ser costoso, aumente este valor para reducir el impacto en el rendimiento." + oauth_application_details: "La clave secreta de cliente no será accesible una vez se cierre esta ventana. Por favor, copie estos valores en la configuración de la integración de OpenProject en Nextcloud:" + oauth_application_details_link_text: "Ir a la página de configuración" + setup_documentation_details: "Si necesita ayuda para configurar un nuevo almacenamiento de archivos, compruebe la documentación: " + setup_documentation_details_link_text: "Configuración de almacenamiento de archivos" + show_warning_details: "Para utilizar este almacenamiento recuerde activar el módulo y el almacenamiento específico en la configuración de cada proyecto deseado." subversion: - existing_title: Subversion existentes de repositorio - existing_introduction: Si tienes una Subversion de repositorio existente, puede - enlazarlo con OpenProject para acceder a él desde dentro de la aplicación. - existing_url: URL existente + existing_title: "Subversion existentes de repositorio" + existing_introduction: "Si tienes una Subversion de repositorio existente, puede enlazarlo con OpenProject para acceder a él desde dentro de la aplicación." + existing_url: "URL existente" instructions: - managed_url: Esta es la URL de las Subversion de repositorio administradas - (local). - url: "Introduzca la URL del repositorio. Esta puede apuntar ya sea un repositorio - local (a partir de %{local_proto}), o un repositorio remoto. \nLos siguientes - esquemas URL son compatibles:" - managed_title: Subversiones de repositorio integradas en OpenProject - managed_introduction: Permitir que OpenProject cree e integre una Subversion - de repositorio local automáticamente. - managed_url: URL Administrada - password: Contraseña del repositorio - username: Nombre de usuario del repositorio - truncated: Lo sentimos, pero hemos tenido que truncar este directorio hasta %{limit} - archivos. %{truncated} entradas de la lista han sido omitidas. - named_repository: Repositorio de %{vendor_name} - update_settings_successful: La configuración se guardó correctamente. - url: URL al repositorio + managed_url: "Esta es la URL de las Subversion de repositorio administradas (local)." + url: "Introduzca la URL del repositorio. Esta puede apuntar ya sea un repositorio local (a partir de %{local_proto}), o un repositorio remoto. \nLos siguientes esquemas URL son compatibles:" + managed_title: "Subversiones de repositorio integradas en OpenProject" + managed_introduction: "Permitir que OpenProject cree e integre una Subversion de repositorio local automáticamente." + managed_url: "URL Administrada" + password: "Contraseña del repositorio" + username: "Nombre de usuario del repositorio" + truncated: "Lo sentimos, pero hemos tenido que truncar este directorio hasta %{limit} archivos. %{truncated} entradas de la lista han sido omitidas." + named_repository: "Repositorio de %{vendor_name}" + update_settings_successful: "La configuración se guardó correctamente." + url: "URL al repositorio" warnings: - cannot_annotate: No se pueden realizar notas sobre este fichero. + cannot_annotate: "No se pueden realizar notas sobre este fichero." scheduling: - manual: establecer en Manual - automatic: establecer en Automático - search_input_placeholder: Buscar... - setting_allowed_link_protocols: Protocolos de enlace permitidos - setting_allowed_link_protocols_text_html: Permita que estos protocolos se muestren - como enlaces en las descripciones de los paquetes de trabajo, los campos de texto - largos y los comentarios. Por ejemplo, %{tel_code} o %{element_code}. Introduzca - un protocolo por línea.
Los protocolos %{http_code}, %{https_code} y %{mailto_code} - siempre están permitidos. - setting_capture_external_links: Detección de enlaces externos - setting_capture_external_links_text: 'Cuando esta función está habilitada, todos - los enlaces externos en texto formateado redirigirán a una página de advertencia - antes de salir de la aplicación. Esto ayuda a proteger a los usuarios de sitios - web externos potencialmente maliciosos. - - ' - setting_capture_external_links_require_login: Requerir que los usuarios inicien - sesión - setting_capture_external_links_require_login_text: 'Cuando esta función está habilitada, - los usuarios que deseen hacer clic en enlaces externos deben iniciar sesión antes - de poder continuar. - - ' - setting_after_first_login_redirect_url: Primera redirección de inicio de sesión - setting_after_first_login_redirect_url_text_html: 'Establezca una ruta para redirigir - a los usuarios tras su primer inicio de sesión. Si está vacía, redirige a la página - de inicio del recorrido de incorporación.
Ejemplo: /my/page - - ' - setting_after_login_default_redirect_url: Después de la redirección de inicio de - sesión - setting_after_login_default_redirect_url_text_html: 'Establezca una ruta por defecto - para redirigir a los usuarios tras el inicio de sesión, si no se ha proporcionado - un enlace de vuelta. Redirige a la página de inicio si no se establece.
- Ejemplo: /my/page - - ' - setting_apiv3_cors_title: Intercambio de recursos entre orígenes (CORS) - setting_apiv3_cors_enabled: Habilitar CORS - setting_apiv3_cors_origins: Orígenes permitidos de la API de CORS (uso compartido - de recursos entre orígenes) V3 - setting_apiv3_cors_origins_text_html: 'Si CORS está habilitado, estos son los orígenes - que tienen permiso para acceder a la API de OpenProject.
Consulte la documentación sobre el encabezado Origin - para obtener información sobre cómo especificar los valores esperados. - - ' - setting_apiv3_write_readonly_attributes: Acceso de escritura a atributos de solo - lectura - setting_apiv3_write_readonly_attributes_instructions: 'Si se activa, la API permitirá - a los administradores escribir atributos estáticos de solo lectura durante la - creación, como createdAt y author. - - ' - setting_apiv3_write_readonly_attributes_warning: 'Este ajuste tiene un caso de uso - para, por ejemplo, la importación de datos, pero permite a los administradores - suplantar la creación de elementos como otros usuarios. Sin embargo, todas las - solicitudes de creación se registran con el verdadero autor. - - ' - setting_apiv3_write_readonly_attributes_additional: 'Para obtener más información - sobre los atributos y los recursos admitidos, consulte el enlace %{api_documentation_link}. - - ' - setting_apiv3_max_page_size: Tamaño máximo de página API - setting_apiv3_max_page_size_instructions: 'Establezca el tamaño máximo de página - con el que responderá la API. No se podrán realizar solicitudes a la API que devuelvan - más valores en una sola página. - - ' - setting_apiv3_max_page_size_warning: 'Por favor, cambie este valor solo si sabe - con certeza por qué lo necesita. Un ajuste alto impactará significativamente el - rendimiento, mientras que un valor inferior a las opciones por página causará - errores en las vistas paginadas. - - ' - setting_apiv3_docs: Documentación - setting_apiv3_docs_enabled: Activar página de documentos - setting_apiv3_docs_enabled_instructions_html: 'Si la página de documentos está habilitada, - puede obtener una vista interactiva de la documentación de APIv3 en %{link}. - - ' - setting_apiv3_docs_enabled_instructions_warning: 'Ten en cuenta que habilitar la - documentación de la API en un sistema de producción puede exponer información - confidencial o provocar la pérdida accidental de datos si no se tiene cuidado. - Recomendamos habilitar esta configuración solo con fines de desarrollo. - - ' - setting_attachment_whitelist: Lista de permitidos de carga de archivos adjuntos - setting_email_delivery_method: Método de envío de correo electrónico - setting_emails_salutation: Dirigirse al usuario en los correos como - setting_oauth_allow_remapping_of_existing_users: Permitir la reasignación de usuarios - existentes - setting_sendmail_location: Ubicación del ejecutable de sendmail - setting_sendmail_arguments: Argumentos para sendmail - setting_smtp_enable_starttls_auto: Usar STARTTLS automáticamente si está disponible - setting_smtp_ssl: Usar conexión SSL - setting_smtp_address: Servidor SMTP - setting_smtp_port: Puerto SMTP - setting_smtp_authentication: Autenticación SMTP - setting_smtp_user_name: Nombre de usuario SMTP - setting_smtp_password: Contraseña SMTP - setting_smtp_domain: Dominio SMTP HELO - setting_activity_days_default: Días mostrados en actividad de proyecto - setting_api_tokens_enabled: Habilitar tokens API - setting_api_tokens_enabled_caption: 'Decida si los usuarios pueden crear tokens - API personales en la configuración de sus cuentas. Estos tokens se pueden utilizar - para acceder a las diferentes API de OpenProject, como APIv3 y MCP. - - ' - setting_app_subtitle: Subtítulo de aplicación - setting_app_title: Título de aplicación - setting_attachment_max_size: Tamaño máximo de adjunto - setting_show_work_package_attachments: Mostrar archivos adjuntos en la pestaña de - archivos por defecto - setting_antivirus_scan_mode: Modo de escaneo - setting_antivirus_scan_action: Acción del archivo infectado - setting_autofetch_changesets: Recopilación automática de cambios del repositorio - setting_autologin: Inicio de sesión automático - setting_available_languages: Idiomas disponibles - setting_bcc_recipients: Destinatarios con copia carbon oculta (cco) - setting_brute_force_block_after_failed_logins: Bloquear al usuario después de este - número de intentos de login fallidos - setting_brute_force_block_minutes: Tiempo que el usuario estará bloqueado - setting_cache_formatted_text: Texto formateado del cache - setting_use_wysiwyg_description: Seleccione esta opción para habilitar el editor - WYSIWYG de CKEditor 5 de forma predeterminada para todos los usuarios. CKEditor - tiene funciones limitadas para la versión GFM de Markdown. - setting_column_options: Columnas de listas del paquete de trabajo por defecto - setting_commit_fix_keywords: Reparando palabras clave - setting_commit_logs_encoding: Codificación de mensajes de compromiso - setting_commit_logtime_activity_id: Actividad para tiempo registrado - setting_commit_logtime_enabled: Activar registro de tiempo - setting_commit_ref_keywords: Referenciando palabras clave - setting_consent_time: Tiempo de consentimiento - setting_consent_info: Texto de información de consentimiento - setting_consent_required: Se requiere consentimiento - setting_consent_decline_mail: Consentimiento de la dirección de correo electrónico - setting_cross_project_work_package_relations: Permitir relaciones cruzadas en paquetes - de trabajo de proyecto - setting_first_week_of_year: La primera semana del año contiene - setting_date_format: Fecha - setting_default_language: Idioma predeterminado - setting_default_projects_modules: Modulos activados por defecto para nuevos proyectos - setting_default_projects_public: Nuevos proyectos son públicos por defecto - setting_disable_password_login: Desactivar la autenticación por contraseña - setting_diff_max_lines_displayed: Cantidad máxima de diferencias de lineas mostradas - setting_omniauth_direct_login_provider: Proveedor de SSO de inicio de sesión directo - setting_display_subprojects_work_packages: Mostrar paquetes de trabajo de subproyectos - en proyectos principales por defecto - setting_duration_format: Formato de la duración - setting_duration_format_hours_only: Sólo horas - setting_duration_format_days_and_hours: Días y horas - setting_duration_format_instructions: Define cómo se muestran las duraciones de - Trabajo, Trabajo restante y Tiempo empleado. - setting_emails_footer: Pie de correos electronicos - setting_emails_header: Encabezado de correos electrónicos - setting_email_login: Usar correo electrónico como nombre de usuario - setting_enabled_scm: SCM activado - setting_enabled_projects_columns: Columnas de una lista de proyectos mostradas por - defecto - setting_feeds_enabled: Activar Feeds - setting_ical_enabled: Habilitar las suscripciones a iCalendar - setting_feeds_limit: Limite de contenido de feed - setting_file_max_size_displayed: Tamaño máximo de archivos de texto mostrado en - linea - setting_host_name: Nombre de host - setting_collaborative_editing_hocuspocus_url: URL del servidor Hocuspocus - setting_collaborative_editing_hocuspocus_secret: Secreto del servidor Hocuspocus - setting_hours_per_day: Horas al día - setting_hours_per_day_explanation: Define lo que se considera un "día" cuando se - muestra la duración en días y horas (por ejemplo, si un día tiene 8 horas, 32 - horas serían 4 días). - setting_invitation_expiration_days: El correo electrónico de activación caduca después - de - setting_invitation_expiration_days_caption: Número de días tras los cuales caduca - el correo electrónico de activación. - setting_work_package_done_ratio: Modo de cálculo del progreso - setting_work_package_done_ratio_field: Basado en el trabajo - setting_work_package_done_ratio_field_caption_html: "% completado puede fijarse - libremente en cualquier valor. Si introduce opcionalmente un valor para Trabajo, - se derivará automáticamente Trabajo restante." - setting_work_package_done_ratio_status: Basado en el estado - setting_work_package_done_ratio_status_caption_html: Cada estado tiene asociado - un valor de % completado. El cambio de estado modificará el % completado. - setting_work_package_done_ratio_explanation_html: 'En el modo basado en trabajo, - el % completado puede fijarse libremente en cualquier valor. Si introduce opcionalmente - un valor para Trabajo, se derivará automáticamente Trabajo restante. En el modo - basado en estados, cada estado tiene asociado un valor de % completado. - Si cambia de estado, cambiará el % completado. - - ' - setting_work_package_properties: Propiedades de paquete de trabajo - setting_work_package_startdate_is_adddate: Usar fecha actual como fecha de inicio - para nuevos paquetes de trabajo - setting_work_packages_projects_export_limit: Fecha límite para exportar paquete - de trabajo o proyectos - setting_journal_aggregation_time_minutes: Acciones de usuario agregadas dentro de - setting_log_requesting_user: Registrar inicio de sesión de usuario, nombre, y dirección - de correo para todas las solicitudes - setting_login_required: Autentificación requerida - setting_login_required_caption: Cuando está marcada, todas las solicitudes a la - aplicación tienen que autentificarse. - setting_lost_password: Activar restablecimiento de contraseña - setting_lost_password_caption: Si está marcada, permite a los usuarios restablecer - sus propias contraseñas. - setting_mail_from: Dirección de correo electrónico de emision - setting_mail_handler_api_key: Clave API - setting_mail_handler_body_delimiters: Truncar los correos electrónicos después de - una de estas líneas - setting_mail_handler_body_delimiter_regex: Truncar correos que coincidan con esta - expresión regular - setting_mail_handler_ignore_filenames: Archivos adjuntos de email ignorados - setting_new_project_user_role_id: Papel ortorgado a usuario no administrador que - crea un proyecto - setting_new_project_send_confirmation_email: Enviar notificación al autor al crear - un nuevo proyecto - setting_new_project_notification_text: Texto de la notificación - setting_password_active_rules: Activar clases de personajes - setting_password_count_former_banned: Numero de contraseñas usadas mas recientemente - bloqueadas para re-uso - setting_password_days_valid: Número de días, después de que sea necesario imponer - un cambio de contraseña - setting_password_min_length: Longitud mínima - setting_password_min_adhered_rules: Numero mínimo de clases requeridas - setting_per_page_options: Objetos por página de opciones + manual: "establecer en Manual" + automatic: "establecer en Automático" + search_input_placeholder: "Buscar..." + setting_allowed_link_protocols: "Protocolos de enlace permitidos" + setting_allowed_link_protocols_text_html: >- + Permita que estos protocolos se muestren como enlaces en las descripciones de los paquetes de trabajo, los campos de texto largos y los comentarios. Por ejemplo, %{tel_code} o %{element_code}. Introduzca un protocolo por línea.
Los protocolos %{http_code}, %{https_code} y %{mailto_code} siempre están permitidos. + setting_capture_external_links: "Detección de enlaces externos" + setting_capture_external_links_text: > + Cuando esta función está habilitada, todos los enlaces externos en texto formateado redirigirán a una página de advertencia antes de salir de la aplicación. Esto ayuda a proteger a los usuarios de sitios web externos potencialmente maliciosos. + setting_capture_external_links_require_login: "Requerir que los usuarios inicien sesión" + setting_capture_external_links_require_login_text: > + Cuando esta función está habilitada, los usuarios que deseen hacer clic en enlaces externos deben iniciar sesión antes de poder continuar. + setting_after_first_login_redirect_url: "Primera redirección de inicio de sesión" + setting_after_first_login_redirect_url_text_html: > + Establezca una ruta para redirigir a los usuarios tras su primer inicio de sesión. Si está vacía, redirige a la página de inicio del recorrido de incorporación.
Ejemplo: /my/page + setting_after_login_default_redirect_url: "Después de la redirección de inicio de sesión" + setting_after_login_default_redirect_url_text_html: > + Establezca una ruta por defecto para redirigir a los usuarios tras el inicio de sesión, si no se ha proporcionado un enlace de vuelta. Redirige a la página de inicio si no se establece.
Ejemplo: /my/page + setting_apiv3_cors_title: "Intercambio de recursos entre orígenes (CORS)" + setting_apiv3_cors_enabled: "Habilitar CORS" + setting_apiv3_cors_origins: "Orígenes permitidos de la API de CORS (uso compartido de recursos entre orígenes) V3" + setting_apiv3_cors_origins_text_html: > + Si CORS está habilitado, estos son los orígenes que tienen permiso para acceder a la API de OpenProject.
Consulte la documentación sobre el encabezado Origin para obtener información sobre cómo especificar los valores esperados. + setting_apiv3_write_readonly_attributes: "Acceso de escritura a atributos de solo lectura" + setting_apiv3_write_readonly_attributes_instructions: > + Si se activa, la API permitirá a los administradores escribir atributos estáticos de solo lectura durante la creación, como createdAt y author. + setting_apiv3_write_readonly_attributes_warning: > + Este ajuste tiene un caso de uso para, por ejemplo, la importación de datos, pero permite a los administradores suplantar la creación de elementos como otros usuarios. Sin embargo, todas las solicitudes de creación se registran con el verdadero autor. + setting_apiv3_write_readonly_attributes_additional: > + Para obtener más información sobre los atributos y los recursos admitidos, consulte el enlace %{api_documentation_link}. + setting_apiv3_max_page_size: "Tamaño máximo de página API" + setting_apiv3_max_page_size_instructions: > + Establezca el tamaño máximo de página con el que responderá la API. No se podrán realizar solicitudes a la API que devuelvan más valores en una sola página. + setting_apiv3_max_page_size_warning: > + Por favor, cambie este valor solo si sabe con certeza por qué lo necesita. Un ajuste alto impactará significativamente el rendimiento, mientras que un valor inferior a las opciones por página causará errores en las vistas paginadas. + setting_apiv3_docs: "Documentación" + setting_apiv3_docs_enabled: "Activar página de documentos" + setting_apiv3_docs_enabled_instructions_html: > + Si la página de documentos está habilitada, puede obtener una vista interactiva de la documentación de APIv3 en %{link}. + setting_apiv3_docs_enabled_instructions_warning: > + Ten en cuenta que habilitar la documentación de la API en un sistema de producción puede exponer información confidencial o provocar la pérdida accidental de datos si no se tiene cuidado. Recomendamos habilitar esta configuración solo con fines de desarrollo. + setting_attachment_whitelist: "Lista de permitidos de carga de archivos adjuntos" + setting_email_delivery_method: "Método de envío de correo electrónico" + setting_emails_salutation: "Dirigirse al usuario en los correos como" + setting_oauth_allow_remapping_of_existing_users: "Permitir la reasignación de usuarios existentes" + setting_sendmail_location: "Ubicación del ejecutable de sendmail" + setting_sendmail_arguments: "Argumentos para sendmail" + setting_smtp_enable_starttls_auto: "Usar STARTTLS automáticamente si está disponible" + setting_smtp_ssl: "Usar conexión SSL" + setting_smtp_address: "Servidor SMTP" + setting_smtp_port: "Puerto SMTP" + setting_smtp_authentication: "Autenticación SMTP" + setting_smtp_user_name: "Nombre de usuario SMTP" + setting_smtp_password: "Contraseña SMTP" + setting_smtp_domain: "Dominio SMTP HELO" + setting_activity_days_default: "Días mostrados en actividad de proyecto" + setting_api_tokens_enabled: "Habilitar tokens API" + setting_api_tokens_enabled_caption: > + Decida si los usuarios pueden crear tokens API personales en la configuración de sus cuentas. Estos tokens se pueden utilizar para acceder a las diferentes API de OpenProject, como APIv3 y MCP. + setting_app_subtitle: "Subtítulo de aplicación" + setting_app_title: "Título de aplicación" + setting_attachment_max_size: "Tamaño máximo de adjunto" + setting_show_work_package_attachments: "Mostrar archivos adjuntos en la pestaña de archivos por defecto" + setting_antivirus_scan_mode: "Modo de escaneo" + setting_antivirus_scan_action: "Acción del archivo infectado" + setting_autofetch_changesets: "Recopilación automática de cambios del repositorio" + setting_autologin: "Inicio de sesión automático" + setting_available_languages: "Idiomas disponibles" + setting_bcc_recipients: "Destinatarios con copia carbon oculta (cco)" + setting_brute_force_block_after_failed_logins: "Bloquear al usuario después de este número de intentos de login fallidos" + setting_brute_force_block_minutes: "Tiempo que el usuario estará bloqueado" + setting_cache_formatted_text: "Texto formateado del cache" + setting_use_wysiwyg_description: "Seleccione esta opción para habilitar el editor WYSIWYG de CKEditor 5 de forma predeterminada para todos los usuarios. CKEditor tiene funciones limitadas para la versión GFM de Markdown." + setting_column_options: "Columnas de listas del paquete de trabajo por defecto" + setting_commit_fix_keywords: "Reparando palabras clave" + setting_commit_logs_encoding: "Codificación de mensajes de compromiso" + setting_commit_logtime_activity_id: "Actividad para tiempo registrado" + setting_commit_logtime_enabled: "Activar registro de tiempo" + setting_commit_ref_keywords: "Referenciando palabras clave" + setting_consent_time: "Tiempo de consentimiento" + setting_consent_info: "Texto de información de consentimiento" + setting_consent_required: "Se requiere consentimiento" + setting_consent_decline_mail: "Consentimiento de la dirección de correo electrónico" + setting_cross_project_work_package_relations: "Permitir relaciones cruzadas en paquetes de trabajo de proyecto" + setting_first_week_of_year: "La primera semana del año contiene" + setting_date_format: "Fecha" + setting_default_language: "Idioma predeterminado" + setting_default_projects_modules: "Modulos activados por defecto para nuevos proyectos" + setting_default_projects_public: "Nuevos proyectos son públicos por defecto" + setting_disable_password_login: "Desactivar la autenticación por contraseña" + setting_diff_max_lines_displayed: "Cantidad máxima de diferencias de lineas mostradas" + setting_omniauth_direct_login_provider: "Proveedor de SSO de inicio de sesión directo" + setting_display_subprojects_work_packages: "Mostrar paquetes de trabajo de subproyectos en proyectos principales por defecto" + setting_duration_format: "Formato de la duración" + setting_duration_format_hours_only: "Sólo horas" + setting_duration_format_days_and_hours: "Días y horas" + setting_duration_format_instructions: "Define cómo se muestran las duraciones de Trabajo, Trabajo restante y Tiempo empleado." + setting_emails_footer: "Pie de correos electronicos" + setting_emails_header: "Encabezado de correos electrónicos" + setting_email_login: "Usar correo electrónico como nombre de usuario" + setting_enabled_scm: "SCM activado" + setting_enabled_projects_columns: "Columnas de una lista de proyectos mostradas por defecto" + setting_feeds_enabled: "Activar Feeds" + setting_ical_enabled: "Habilitar las suscripciones a iCalendar" + setting_feeds_limit: "Limite de contenido de feed" + setting_file_max_size_displayed: "Tamaño máximo de archivos de texto mostrado en linea" + setting_host_name: "Nombre de host" + setting_collaborative_editing_hocuspocus_url: "URL del servidor Hocuspocus" + setting_collaborative_editing_hocuspocus_secret: "Secreto del servidor Hocuspocus" + setting_hours_per_day: "Horas al día" + setting_hours_per_day_explanation: >- + Define lo que se considera un "día" cuando se muestra la duración en días y horas (por ejemplo, si un día tiene 8 horas, 32 horas serían 4 días). + setting_invitation_expiration_days: "El correo electrónico de activación caduca después de" + setting_invitation_expiration_days_caption: "Número de días tras los cuales caduca el correo electrónico de activación." + setting_work_package_done_ratio: "Modo de cálculo del progreso" + setting_work_package_done_ratio_field: "Basado en el trabajo" + setting_work_package_done_ratio_field_caption_html: >- + % completado puede fijarse libremente en cualquier valor. Si introduce opcionalmente un valor para Trabajo, se derivará automáticamente Trabajo restante. + setting_work_package_done_ratio_status: "Basado en el estado" + setting_work_package_done_ratio_status_caption_html: >- + Cada estado tiene asociado un valor de % completado. El cambio de estado modificará el % completado. + setting_work_package_done_ratio_explanation_html: > + En el modo basado en trabajo, el % completado puede fijarse libremente en cualquier valor. Si introduce opcionalmente un valor para Trabajo, se derivará automáticamente Trabajo restante. En el modo basado en estados, cada estado tiene asociado un valor de % completado. Si cambia de estado, cambiará el % completado. + setting_work_package_properties: "Propiedades de paquete de trabajo" + setting_work_package_startdate_is_adddate: "Usar fecha actual como fecha de inicio para nuevos paquetes de trabajo" + setting_work_packages_projects_export_limit: "Fecha límite para exportar paquete de trabajo o proyectos" + setting_journal_aggregation_time_minutes: "Acciones de usuario agregadas dentro de" + setting_log_requesting_user: "Registrar inicio de sesión de usuario, nombre, y dirección de correo para todas las solicitudes" + setting_login_required: "Autentificación requerida" + setting_login_required_caption: "Cuando está marcada, todas las solicitudes a la aplicación tienen que autentificarse." + setting_lost_password: "Activar restablecimiento de contraseña" + setting_lost_password_caption: "Si está marcada, permite a los usuarios restablecer sus propias contraseñas." + setting_mail_from: "Dirección de correo electrónico de emision" + setting_mail_handler_api_key: "Clave API" + setting_mail_handler_body_delimiters: "Truncar los correos electrónicos después de una de estas líneas" + setting_mail_handler_body_delimiter_regex: "Truncar correos que coincidan con esta expresión regular" + setting_mail_handler_ignore_filenames: "Archivos adjuntos de email ignorados" + setting_new_project_user_role_id: "Papel ortorgado a usuario no administrador que crea un proyecto" + setting_new_project_send_confirmation_email: "Enviar notificación al autor al crear un nuevo proyecto" + setting_new_project_notification_text: "Texto de la notificación" + setting_password_active_rules: "Activar clases de personajes" + setting_password_count_former_banned: "Numero de contraseñas usadas mas recientemente bloqueadas para re-uso" + setting_password_days_valid: "Número de días, después de que sea necesario imponer un cambio de contraseña" + setting_password_min_length: "Longitud mínima" + setting_password_min_adhered_rules: "Numero mínimo de clases requeridas" + setting_per_page_options: "Objetos por página de opciones" setting_percent_complete_on_status_closed: "% completado cuando el estado es cerrado" - setting_percent_complete_on_status_closed_no_change: Sin cambios - setting_percent_complete_on_status_closed_no_change_caption_html: El valor de % - completado no cambiará aunque se cierre un paquete de trabajo. - setting_percent_complete_on_status_closed_set_100p: Ajustado automáticamente al - 100 % - setting_percent_complete_on_status_closed_set_100p_caption: Un paquete de trabajo - cerrado se considera completo. - setting_plain_text_mail: Correo en texto plano (sin HTML) - setting_protocol: Protocolo - setting_project_gantt_query: Diagrama de Gantt de la cartera de proyectos - setting_project_gantt_query_text: Puede modificar la consulta usada para mostrar - el diagrama de Gantt en la página de información general del proyecto. - setting_security_badge_displayed: Mostrar insignia de seguridad - setting_registration_footer: Pié de página de registro - setting_registration_footer_caption: Este texto aparece en el pie de página de la - página de registro. Utilice el editor HTML para dar formato al texto de cada idioma - seleccionado. - setting_repositories_automatic_managed_vendor: Tipo de proveedor de repositorio - automático - setting_repositories_encodings: Codificación de Repositorios - setting_repository_storage_cache_minutes: Tamaño de caché de disco del repositorio - setting_repository_checkout_display: Mostrar instrucciones de checkout - setting_repository_checkout_base_url: Hacer checkout de la URL base - setting_repository_checkout_text: Texto del checkout de la instrucción - setting_repository_log_display_limit: Numero máximo de revisiones mostradas en el - archivo de registro - setting_repository_truncate_at: El número máximo de archivos mostrados en el navegador - del repositorio - setting_self_registration: Auto-registro - setting_self_registration_caption: 'Elija el mecanismo de autorregistro para los - usuarios. Tenga cuidado con el ajuste que elija, ya que algunas opciones permiten - a los usuarios activar sus propias cuentas a esta instancia. - - ' - setting_self_registration_warning: 'El usuario podrá activar sus propias cuentas. - Tenga en cuenta que esto les dará acceso a todos los proyectos públicos y a su - contenido. Asegúrese de que no se exponen datos sensibles o privados en los proyectos - públicos. - - ' - setting_self_registration_disabled: Deshabilitado - setting_self_registration_disabled_caption: 'No se pueden registrar cuentas por - sí solas. Solo los administradores y los usuarios con permiso global para crear - nuevos usuarios pueden crear nuevas cuentas. - - ' - setting_self_registration_activation_by_email: Activación de cuenta por correo electrónico - setting_self_registration_activation_by_email_caption: 'Los usuarios pueden registrarse - por su cuenta y activar su cuenta tras confirmar su dirección de correo electrónico. - Los administradores no tienen control de moderación sobre el proceso de activación. - - ' - setting_self_registration_automatic_activation: Activación automática de la cuenta - setting_self_registration_automatic_activation_caption: 'Los usuarios pueden registrarse - por su cuenta. Sus cuentas se activan inmediatamente sin ninguna otra acción. - Los administradores no tienen control de moderación sobre el proceso de activación. - - ' - setting_self_registration_manual_activation: Activación manual de la cuenta - setting_self_registration_manual_activation_caption: 'Los usuarios pueden registrarse - por su cuenta. Sus cuentas están en estado pendiente hasta que un administrador - o un usuario con permiso global para crear o gestionar usuarios las activa. - - ' - setting_session_ttl: Tiempo de expiración de sesión por inactividad - setting_session_ttl_hint: Valor por debajo de 5 peticiones como desactivadas - setting_session_ttl_enabled: La sesión expira - setting_start_of_week: La semana empieza el - setting_sys_api_enabled: Habilitar el servicio web de administración de repositorios - setting_sys_api_description: El servicio web de administración de repositorios proporciona - integración y autorización de usuario para acceder a los repositorios. - setting_time_format: Hora - setting_total_percent_complete_mode: Cálculo de los totales de la jerarquía % completado - setting_total_percent_complete_mode_work_weighted_average: Ponderado por trabajo - setting_total_percent_complete_mode_work_weighted_average_caption_html: El % - total completado se ponderará con respecto al Trabajo de cada paquete - de trabajo de la jerarquía. Los paquetes de trabajo sin Trabajo se ignorarán. - setting_total_percent_complete_mode_simple_average: Media simple - setting_total_percent_complete_mode_simple_average_caption_html: "Trabajo - se ignora y el % total completado será una media simple de los valores - de % completado de los paquetes de trabajo de la jerarquía." - setting_accessibility_mode_for_anonymous: Activar el modo de accesibilidad para - usuarios anónimos - setting_user_format: Formato de nombre de usuarios - setting_user_default_timezone: Zona horaria por defecto de los usuarios - setting_users_deletable_by_admins: Cuentas de usuario eliminables por administradores - setting_users_deletable_by_self: Permitir a los usuarios eliminar sus propias cuentas - setting_welcome_text: Bloque de texto de bienvenida - setting_welcome_title: Título del bloque de bienvenida - setting_welcome_on_homescreen: Mostrar bloque de bienvenida en la pagina de inicio - setting_work_package_list_default_highlighting_mode: Modo de resaltado predeterminado - setting_work_package_list_default_highlighted_attributes: Atributos resaltados en - línea predeterminados - setting_working_days: Días laborables + setting_percent_complete_on_status_closed_no_change: "Sin cambios" + setting_percent_complete_on_status_closed_no_change_caption_html: >- + El valor de % completado no cambiará aunque se cierre un paquete de trabajo. + setting_percent_complete_on_status_closed_set_100p: "Ajustado automáticamente al 100 %" + setting_percent_complete_on_status_closed_set_100p_caption: >- + Un paquete de trabajo cerrado se considera completo. + setting_plain_text_mail: "Correo en texto plano (sin HTML)" + setting_protocol: "Protocolo" + setting_project_gantt_query: "Diagrama de Gantt de la cartera de proyectos" + setting_project_gantt_query_text: "Puede modificar la consulta usada para mostrar el diagrama de Gantt en la página de información general del proyecto." + setting_security_badge_displayed: "Mostrar insignia de seguridad" + setting_registration_footer: "Pié de página de registro" + setting_registration_footer_caption: "Este texto aparece en el pie de página de la página de registro. Utilice el editor HTML para dar formato al texto de cada idioma seleccionado." + setting_repositories_automatic_managed_vendor: "Tipo de proveedor de repositorio automático" + setting_repositories_encodings: "Codificación de Repositorios" + setting_repository_storage_cache_minutes: "Tamaño de caché de disco del repositorio" + setting_repository_checkout_display: "Mostrar instrucciones de checkout" + setting_repository_checkout_base_url: "Hacer checkout de la URL base" + setting_repository_checkout_text: "Texto del checkout de la instrucción" + setting_repository_log_display_limit: "Numero máximo de revisiones mostradas en el archivo de registro" + setting_repository_truncate_at: "El número máximo de archivos mostrados en el navegador del repositorio" + setting_self_registration: "Auto-registro" + setting_self_registration_caption: > + Elija el mecanismo de autorregistro para los usuarios. Tenga cuidado con el ajuste que elija, ya que algunas opciones permiten a los usuarios activar sus propias cuentas a esta instancia. + setting_self_registration_warning: > + El usuario podrá activar sus propias cuentas. Tenga en cuenta que esto les dará acceso a todos los proyectos públicos y a su contenido. Asegúrese de que no se exponen datos sensibles o privados en los proyectos públicos. + setting_self_registration_disabled: "Deshabilitado" + setting_self_registration_disabled_caption: > + No se pueden registrar cuentas por sí solas. Solo los administradores y los usuarios con permiso global para crear nuevos usuarios pueden crear nuevas cuentas. + setting_self_registration_activation_by_email: "Activación de cuenta por correo electrónico" + setting_self_registration_activation_by_email_caption: > + Los usuarios pueden registrarse por su cuenta y activar su cuenta tras confirmar su dirección de correo electrónico. Los administradores no tienen control de moderación sobre el proceso de activación. + setting_self_registration_automatic_activation: "Activación automática de la cuenta" + setting_self_registration_automatic_activation_caption: > + Los usuarios pueden registrarse por su cuenta. Sus cuentas se activan inmediatamente sin ninguna otra acción. Los administradores no tienen control de moderación sobre el proceso de activación. + setting_self_registration_manual_activation: "Activación manual de la cuenta" + setting_self_registration_manual_activation_caption: > + Los usuarios pueden registrarse por su cuenta. Sus cuentas están en estado pendiente hasta que un administrador o un usuario con permiso global para crear o gestionar usuarios las activa. + setting_session_ttl: "Tiempo de expiración de sesión por inactividad" + setting_session_ttl_hint: "Valor por debajo de 5 peticiones como desactivadas" + setting_session_ttl_enabled: "La sesión expira" + setting_start_of_week: "La semana empieza el" + setting_sys_api_enabled: "Habilitar el servicio web de administración de repositorios" + setting_sys_api_description: "El servicio web de administración de repositorios proporciona integración y autorización de usuario para acceder a los repositorios." + setting_time_format: "Hora" + setting_total_percent_complete_mode: "Cálculo de los totales de la jerarquía % completado" + setting_total_percent_complete_mode_work_weighted_average: "Ponderado por trabajo" + setting_total_percent_complete_mode_work_weighted_average_caption_html: >- + El % total completado se ponderará con respecto al Trabajo de cada paquete de trabajo de la jerarquía. Los paquetes de trabajo sin Trabajo se ignorarán. + setting_total_percent_complete_mode_simple_average: "Media simple" + setting_total_percent_complete_mode_simple_average_caption_html: >- + Trabajo se ignora y el % total completado será una media simple de los valores de % completado de los paquetes de trabajo de la jerarquía. + setting_accessibility_mode_for_anonymous: "Activar el modo de accesibilidad para usuarios anónimos" + setting_user_format: "Formato de nombre de usuarios" + setting_user_default_timezone: "Zona horaria por defecto de los usuarios" + setting_users_deletable_by_admins: "Cuentas de usuario eliminables por administradores" + setting_users_deletable_by_self: "Permitir a los usuarios eliminar sus propias cuentas" + setting_welcome_text: "Bloque de texto de bienvenida" + setting_welcome_title: "Título del bloque de bienvenida" + setting_welcome_on_homescreen: "Mostrar bloque de bienvenida en la pagina de inicio" + setting_work_package_list_default_highlighting_mode: "Modo de resaltado predeterminado" + setting_work_package_list_default_highlighted_attributes: "Atributos resaltados en línea predeterminados" + setting_working_days: "Días laborables" settings: errors: - not_writable: La configuración no es modificable y solo puede cambiarla un administrador - del sistema. - failed_to_update: 'No se pudo actualizar la configuración de «%{name}»: %{message}' + not_writable: "La configuración no es modificable y solo puede cambiarla un administrador del sistema." + failed_to_update: "No se pudo actualizar la configuración de «%{name}»: %{message}" authentication: - login: Iniciar sesión - registration: Registro - sso: Inicio de sesión único (SSO) - omniauth_direct_login_hint_html: 'Si esta opción está activa, las solicitudes - de inicio de sesión se redirigirán al proveedor omniauth configurado. El menú - desplegable de inicio de sesión y la página de inicio de sesión se desactivarán. -
Nota: A menos que también deshabilite los inicios de - sesión con contraseña, con esta opción activada, los usuarios podrán seguir - iniciando sesión internamente visitando la página de inicio de sesión %{internal_path}. - - ' - remapping_existing_users_hint: 'Si está habilitado, permite a cualquier proveedor - de identidad configurado iniciar sesión a los usuarios existentes basándose - en su nombre de usuario, incluso si el usuario nunca ha iniciado sesión a - través de ese proveedor anteriormente. Esto puede ser útil al migrar la instancia - de OpenProject a un nuevo proveedor de SSO, pero no se recomienda cuando se - usa un proveedor que no es confiable para todos los usuarios de su instancia. - - ' + login: "Iniciar sesión" + registration: "Registro" + sso: "Inicio de sesión único (SSO)" + omniauth_direct_login_hint_html: > + Si esta opción está activa, las solicitudes de inicio de sesión se redirigirán al proveedor omniauth configurado. El menú desplegable de inicio de sesión y la página de inicio de sesión se desactivarán.
Nota: A menos que también deshabilite los inicios de sesión con contraseña, con esta opción activada, los usuarios podrán seguir iniciando sesión internamente visitando la página de inicio de sesión %{internal_path}. + remapping_existing_users_hint: > + Si está habilitado, permite a cualquier proveedor de identidad configurado iniciar sesión a los usuarios existentes basándose en su nombre de usuario, incluso si el usuario nunca ha iniciado sesión a través de ese proveedor anteriormente. Esto puede ser útil al migrar la instancia de OpenProject a un nuevo proveedor de SSO, pero no se recomienda cuando se usa un proveedor que no es confiable para todos los usuarios de su instancia. attachments: - whitelist_text_html: 'Define una lista de extensiones de archivo válidas o tipos - MIME para los archivos cargados.
Escriba las extensiones de archivo - (por ejemplo, %{ext_example}) o tipos MIME (%{mime_example}). -
Deje vacío este campo para que pueda cargarse cualquier tipo de archivo. - Se permiten varios valores (una línea para cada valor). - - ' - show_work_package_attachments: 'Al desactivar esta opción se ocultará la lista - de archivos adjuntos en la pestaña de archivos de los paquetes de trabajo - para los nuevos proyectos. Los archivos adjuntos en la descripción de un paquete - de trabajo seguirán cargándose en el almacenamiento interno de archivos adjuntos. - - ' + whitelist_text_html: > + Define una lista de extensiones de archivo válidas o tipos MIME para los archivos cargados.
Escriba las extensiones de archivo (por ejemplo, %{ext_example}) o tipos MIME (%{mime_example}).
Deje vacío este campo para que pueda cargarse cualquier tipo de archivo. Se permiten varios valores (una línea para cada valor). + show_work_package_attachments: > + Al desactivar esta opción se ocultará la lista de archivos adjuntos en la pestaña de archivos de los paquetes de trabajo para los nuevos proyectos. Los archivos adjuntos en la descripción de un paquete de trabajo seguirán cargándose en el almacenamiento interno de archivos adjuntos. antivirus: - title: Escaneado de virus - clamav_ping_failed: Ha fallado la conexión con el daemon ClamAV. Vuelva a comprobar - la configuración e inténtelo de nuevo. - remaining_quarantined_files_html: 'Se ha desactivado el análisis de virus. %{file_count} - permanecen en cuarentena. Para revisar los archivos en cuarentena, visite - este enlace: %{link} - - ' - remaining_scan_complete_html: 'Se han analizado los archivos restantes. Hay - %{file_count} en cuarentena. Está siendo redirigido a la página de cuarentena. - Utilice esta página para eliminar o sobreescribir los archivos en cuarentena. - - ' - remaining_rescanned_files: 'El escaneado de virus se ha activado correctamente. - Hay %{file_count} que se cargaron anteriormente y aún deben ser escaneados. - Este proceso se ha programado en segundo plano. Los archivos permanecerán - accesibles durante el escaneado. - - ' + title: "Escaneado de virus" + clamav_ping_failed: "Ha fallado la conexión con el daemon ClamAV. Vuelva a comprobar la configuración e inténtelo de nuevo." + remaining_quarantined_files_html: > + Se ha desactivado el análisis de virus. %{file_count} permanecen en cuarentena. Para revisar los archivos en cuarentena, visite este enlace: %{link} + remaining_scan_complete_html: > + Se han analizado los archivos restantes. Hay %{file_count} en cuarentena. Está siendo redirigido a la página de cuarentena. Utilice esta página para eliminar o sobreescribir los archivos en cuarentena. + remaining_rescanned_files: > + El escaneado de virus se ha activado correctamente. Hay %{file_count} que se cargaron anteriormente y aún deben ser escaneados. Este proceso se ha programado en segundo plano. Los archivos permanecerán accesibles durante el escaneado. actions: - delete: Eliminar el archivo - quarantine: Ponga el archivo en cuarentena - instructions_html: 'Seleccione la acción a realizar para los archivos en los - que se ha detectado un virus:
  • %{quarantine_option}: - Poner en cuarentena el archivo, impidiendo que los usuarios accedan a él. - Los administradores pueden revisar y eliminar los archivos en cuarentena - en la administración.
  • %{delete_option}: Eliminar - el archivo inmediatamente.
- - ' + delete: "Eliminar el archivo" + quarantine: "Ponga el archivo en cuarentena" + instructions_html: > + Seleccione la acción a realizar para los archivos en los que se ha detectado un virus:
  • %{quarantine_option}: Poner en cuarentena el archivo, impidiendo que los usuarios accedan a él. Los administradores pueden revisar y eliminar los archivos en cuarentena en la administración.
  • %{delete_option}: Eliminar el archivo inmediatamente.
modes: clamav_socket_html: Introduzca el socket al daemon clamd, por ejemplo, %{example} - clamav_host_html: Introduzca el nombre de host y el puerto al daemon clamd - separados por dos puntos. Por ejemplo, %{example} - description_html: 'Seleccione el modo en el que debe funcionar la integración - del escáner antivirus.
  • %{disabled_option}: - Los archivos cargados no se analizan en busca de virus.
  • %{socket_option}: - Ha configurado ClamAV en el mismo servidor que OpenProject y el daemon de - análisis clamd se está ejecutando en segundo plano.
  • %{host_option}: - Está transmitiendo archivos a un host externo de análisis de virus.
  • -
- - ' - brute_force_prevention: Bloqueo automático de usuarios + clamav_host_html: Introduzca el nombre de host y el puerto al daemon clamd separados por dos puntos. Por ejemplo, %{example} + description_html: > + Seleccione el modo en el que debe funcionar la integración del escáner antivirus.
  • %{disabled_option}: Los archivos cargados no se analizan en busca de virus.
  • %{socket_option}: Ha configurado ClamAV en el mismo servidor que OpenProject y el daemon de análisis clamd se está ejecutando en segundo plano.
  • %{host_option}: Está transmitiendo archivos a un host externo de análisis de virus.
+ brute_force_prevention: "Bloqueo automático de usuarios" date_format: - first_date_of_week_and_year_set: 'Si se establece una de las opciones «%{day_of_week_setting_name}» - o «%{first_week_setting_name}», también debe establecerse la otra para evitar - incoherencias en el front-end. - - ' - first_week_of_year_text_html: 'Seleccione la fecha de enero contenida en la - primera semana del año. Este valor, junto con el primer día de la semana, - determina el número total de semanas de un año. Para más información, consulte - nuestra documentación sobre este tema. - - ' + first_date_of_week_and_year_set: > + Si se establece una de las opciones «%{day_of_week_setting_name}» o «%{first_week_setting_name}», también debe establecerse la otra para evitar incoherencias en el front-end. + first_week_of_year_text_html: > + Seleccione la fecha de enero contenida en la primera semana del año. Este valor, junto con el primer día de la semana, determina el número total de semanas de un año. Para más información, consulte nuestra documentación sobre este tema. experimental: - save_confirmation: "¡Precaución! ¡Riesgo de pérdida de datos! Active las funciones - experimentales solo si no le importa romper su instalación de OpenProject - y perder todos sus datos." - warning_toast: Las banderas de funciones son ajustes que activan características - que aún están en desarrollo. Solo se utilizarán con fines de prueba. Nunca - deberán activarse en instalaciones de OpenProject que contengan datos importantes. - Es muy probable que estas características corrompan sus datos. Utilícelas - bajo su propia responsabilidad. + save_confirmation: '¡Precaución! ¡Riesgo de pérdida de datos! Active las funciones experimentales solo si no le importa romper su instalación de OpenProject y perder todos sus datos.' + warning_toast: Las banderas de funciones son ajustes que activan características que aún están en desarrollo. Solo se utilizarán con fines de prueba. Nunca deberán activarse en instalaciones de OpenProject que contengan datos importantes. Es muy probable que estas características corrompan sus datos. Utilícelas bajo su propia responsabilidad. feature_flags: Banderas de características - general: General + general: "General" highlighting: mode_long: - inline: Resaltar atributos en línea - none: Sin resaltado - status: Toda la fila por estado - type: Toda la fila por tipo - priority: Toda la fila por prioridad + inline: "Resaltar atributos en línea" + none: "Sin resaltado" + status: "Toda la fila por estado" + type: "Toda la fila por tipo" + priority: "Toda la fila por prioridad" icalendar: - enable_subscriptions_text_html: Permite a los usuarios con los permisos necesarios - suscribirse a los calendarios de OpenProject y acceder a la información de - los paquetes de trabajo a través de un cliente de calendario externo. Nota: - Lea sobre suscripciones a iCalendar - para comprender los posibles riesgos de seguridad antes de habilitarlo. + enable_subscriptions_text_html: Permite a los usuarios con los permisos necesarios suscribirse a los calendarios de OpenProject y acceder a la información de los paquetes de trabajo a través de un cliente de calendario externo. Nota: Lea sobre suscripciones a iCalendar para comprender los posibles riesgos de seguridad antes de habilitarlo. language_name_being_default: "%{language_name} (por defecto)" notifications: - events_explanation: Controla para qué evento se envía un correo electrónico. - Los paquetes de trabajo se excluyen de esta lista, ya que las notificaciones - para estos se pueden configurar específicamente por usuario. - delay_minutes_explanation: El envío de correos electrónicos se puede retrasar - para permitir que los usuarios que reciban notificaciones en la aplicación - puedan confirmarlas desde la aplicación antes de que se envíe un correo. Los - usuarios que lean notificaciones en la aplicación no recibirán correos electrónicos - de las notificaciones ya leídas. - other: Otros - passwords: Contraseñas + events_explanation: "Controla para qué evento se envía un correo electrónico. Los paquetes de trabajo se excluyen de esta lista, ya que las notificaciones para estos se pueden configurar específicamente por usuario." + delay_minutes_explanation: "El envío de correos electrónicos se puede retrasar para permitir que los usuarios que reciban notificaciones en la aplicación puedan confirmarlas desde la aplicación antes de que se envíe un correo. Los usuarios que lean notificaciones en la aplicación no recibirán correos electrónicos de las notificaciones ya leídas." + other: "Otros" + passwords: "Contraseñas" project_attributes: - heading: Atributos del proyecto - label_for_all_projects: Todos los proyectos - label_new_attribute: Atributo del proyecto - label_new_section: Sección - label_edit_section: Editar título - label_section_actions: Acciones de sección - heading_description: Estos atributos del proyecto aparecen en la página de resumen - de cada proyecto. Puede añadir nuevos atributos, agruparlos en secciones y - reordenarlos a su gusto. Estos atributos pueden activarse o desactivarse, - pero no reordenarse a nivel de proyecto. - label_project_custom_field_actions: Acciones de atributos del proyecto - label_no_project_custom_fields: No hay atributos del proyecto definidos en esta - sección + heading: "Atributos del proyecto" + label_for_all_projects: "Todos los proyectos" + label_new_attribute: "Atributo del proyecto" + label_new_section: "Sección" + label_edit_section: "Editar título" + label_section_actions: "Acciones de sección" + heading_description: "Estos atributos del proyecto aparecen en la página de resumen de cada proyecto. Puede añadir nuevos atributos, agruparlos en secciones y reordenarlos a su gusto. Estos atributos pueden activarse o desactivarse, pero no reordenarse a nivel de proyecto." + label_project_custom_field_actions: "Acciones de atributos del proyecto" + label_no_project_custom_fields: "No hay atributos del proyecto definidos en esta sección" edit: - description: Los cambios en este atributo del proyecto se reflejarán en todos - los proyectos en los que esté habilitado. Los atributos obligatorios no - pueden desactivarse por proyecto. + description: "Los cambios en este atributo del proyecto se reflejarán en todos los proyectos en los que esté habilitado. Los atributos obligatorios no pueden desactivarse por proyecto." new: - heading: Nuevo atributo - description: Los cambios en este atributo del proyecto se reflejarán en todos - los proyectos en los que esté habilitado. Los atributos obligatorios no - pueden desactivarse por proyecto. + heading: "Nuevo atributo" + description: "Los cambios en este atributo del proyecto se reflejarán en todos los proyectos en los que esté habilitado. Los atributos obligatorios no pueden desactivarse por proyecto." sections: display_representation: overview: - label: 'Atributo del proyecto mostrado en:' + label: "Atributo del proyecto mostrado en:" main_area: - label: Área principal - description: Añadir todos los atributos del proyecto como widgets individuales - en la sección principal de la descripción general del proyecto. + label: "Área principal" + description: "Añadir todos los atributos del proyecto como widgets individuales en la sección principal de la descripción general del proyecto." side_panel: - label: Panel lateral - description: Añadir todos los atributos del proyecto en una sección - dentro del panel lateral derecho en la descripción del proyecto. + label: "Panel lateral" + description: "Añadir todos los atributos del proyecto en una sección dentro del panel lateral derecho en la descripción del proyecto." project_initiation_request: - header_description: 'OpenProject puede generar un asistente paso a paso para - ayudar a los gestores de proyectos a completar una solicitud de inicio de - proyecto. Puedes elegir qué atributos del proyecto deben incluirse y crear - un archivo PDF como resultado. - - ' + header_description: > + OpenProject puede generar un asistente paso a paso para ayudar a los gestores de proyectos a completar una solicitud de inicio de proyecto. Puedes elegir qué atributos del proyecto deben incluirse y crear un archivo PDF como resultado. status: - submitted: Se ha enviado %{wizard_name} - submitted_description: Haz clic en el botón de abajo para ir al paquete de - trabajo para el proceso de envío. - submitted_button: Abrir solicitud de envío - not_completed: Aún no se ha completado %{wizard_name} - not_completed_description: Proporciona la información necesaria rellenando - los atributos y lanza el proyecto. + submitted: "Se ha enviado %{wizard_name}" + submitted_description: "Haz clic en el botón de abajo para ir al paquete de trabajo para el proceso de envío." + submitted_button: "Abrir solicitud de envío" + not_completed: "Aún no se ha completado %{wizard_name}" + not_completed_description: "Proporciona la información necesaria rellenando los atributos y lanza el proyecto." wizard_status_button: - project_initiation_request: Abrir solicitud de inicio de proyecto - project_creation_wizard: Abrir el asistente de creación de proyectos - project_mandate: Abrir mandato del proyecto + project_initiation_request: "Abrir solicitud de inicio de proyecto" + project_creation_wizard: "Abrir el asistente de creación de proyectos" + project_mandate: "Abrir mandato del proyecto" blankslate: - title: Solicitud de inicio no habilitada - description: OpenProject puede generar un asistente paso a paso para ayudar - a los gestores de proyectos a completar una solicitud de inicio de proyecto. - Puedes elegir qué atributos del proyecto deben incluirse y qué hacer con - el documento resultante. Habilítalo aquí para comenzar a configurar el asistente. + title: "Solicitud de inicio no habilitada" + description: "OpenProject puede generar un asistente paso a paso para ayudar a los gestores de proyectos a completar una solicitud de inicio de proyecto. Puedes elegir qué atributos del proyecto deben incluirse y qué hacer con el documento resultante. Habilítalo aquí para comenzar a configurar el asistente." disable_dialog: - title: Desactivar solicitud de inicio de proyecto + title: "Desactivar solicitud de inicio de proyecto" heading: "¿Desactivar la solicitud de inicio de proyecto?" - confirmation_message: El asistente de solicitud de inicio ya no estará disponible - para los nuevos proyectos basados en esta plantilla. Los gestores y propietarios - de proyectos tendrán que configurar y rellenar manualmente la información - relevante en la descripción general del proyecto. - checkbox_message: Entiendo que esta acción es irreversible + confirmation_message: "El asistente de solicitud de inicio ya no estará disponible para los nuevos proyectos basados en esta plantilla. Los gestores y propietarios de proyectos tendrán que configurar y rellenar manualmente la información relevante en la descripción general del proyecto." + checkbox_message: "Entiendo que esta acción es irreversible" name: - artifact_name: Nombre del artefacto - artifact_name_caption: Elige el nombre para este artefacto que recomiende - tu marco de gestión de proyectos. + artifact_name: "Nombre del artefacto" + artifact_name_caption: "Elige el nombre para este artefacto que recomiende tu marco de gestión de proyectos." options: - project_initiation_request: Solicitud de inicio de proyecto - project_creation_wizard: Asistente de creación de proyectos - project_mandate: Mandato del proyecto + project_initiation_request: "Solicitud de inicio de proyecto" + project_creation_wizard: "Asistente de creación de proyectos" + project_mandate: "Mandato del proyecto" submission: - description_template: "**Este paquete de trabajo se ha creado automáticamente - al completar el flujo de trabajo %{wizard_name}.** Se ha generado un artefacto - en formato PDF con toda la información enviada y se ha adjuntado a este - paquete de trabajo para fines de referencia y auditoría. Si necesitas actualizar - o volver a ejecutar los pasos de inicio, puedes volver a abrir el asistente - en cualquier momento utilizando el siguiente enlace:\n" - description: Cuando un usuario envía una solicitud de inicio de proyecto, - se creará un nuevo paquete de trabajo con el artefacto de solicitud adjunto - como archivo PDF. La configuración siguiente define el tipo, el estado y - el asignado de este nuevo paquete de trabajo. - work_package_type: Tipo de paquete de trabajo - work_package_type_caption: El tipo de paquete de trabajo que debe utilizarse - para almacenar el artefacto completado. - status_when_submitted: Estado al enviar - status_when_submitted_caption: El estado al que pasará el paquete de trabajo - generado una vez enviada la solicitud. - send_confirmation_email: Enviar un correo electrónico de confirmación al usuario - que envió la solicitud de inicio del proyecto - assignee: Asignado cuando se envía - assignee_caption_html: El usuario o grupo asignado a este atributo del proyecto - también se convertirá en el responsable del nuevo paquete de trabajo. Esta - lista incluye solo atributos de proyecto activos de tipo Usuario. - confirmation_email_text: Texto del correo electrónico de confirmación - confirmation_email_default: |- - Hola: - - Has enviado una solicitud de inicio de proyecto para **%{project_name}**. Ahora está pendiente de revisión. - Haz clic en el enlace siguiente para acceder al paquete de trabajo con tu solicitud. - work_package_comment: Comentario del paquete de trabajo - work_package_comment_caption: La persona asignada seleccionada anteriormente - será @mencionada automáticamente en el comentario. - work_package_comment_default: Se ha enviado una solicitud de inicio de proyecto - para **%{project_name}** y está pendiente de revisión. + description_template: > + **Este paquete de trabajo se ha creado automáticamente al completar el flujo de trabajo %{wizard_name}.** Se ha generado un artefacto en formato PDF con toda la información enviada y se ha adjuntado a este paquete de trabajo para fines de referencia y auditoría. Si necesitas actualizar o volver a ejecutar los pasos de inicio, puedes volver a abrir el asistente en cualquier momento utilizando el siguiente enlace: + description: "Cuando un usuario envía una solicitud de inicio de proyecto, se creará un nuevo paquete de trabajo con el artefacto de solicitud adjunto como archivo PDF. La configuración siguiente define el tipo, el estado y el asignado de este nuevo paquete de trabajo." + work_package_type: "Tipo de paquete de trabajo" + work_package_type_caption: "El tipo de paquete de trabajo que debe utilizarse para almacenar el artefacto completado." + status_when_submitted: "Estado al enviar" + status_when_submitted_caption: "El estado al que pasará el paquete de trabajo generado una vez enviada la solicitud." + send_confirmation_email: "Enviar un correo electrónico de confirmación al usuario que envió la solicitud de inicio del proyecto" + assignee: "Asignado cuando se envía" + assignee_caption_html: "El usuario o grupo asignado a este atributo del proyecto también se convertirá en el responsable del nuevo paquete de trabajo. Esta lista incluye solo atributos de proyecto activos de tipo Usuario." + confirmation_email_text: "Texto del correo electrónico de confirmación" + confirmation_email_default: "Hola:\n\nHas enviado una solicitud de inicio de proyecto para **%{project_name}**. Ahora está pendiente de revisión.\nHaz clic en el enlace siguiente para acceder al paquete de trabajo con tu solicitud." + work_package_comment: "Comentario del paquete de trabajo" + work_package_comment_caption: "La persona asignada seleccionada anteriormente será @mencionada automáticamente en el comentario." + work_package_comment_default: "Se ha enviado una solicitud de inicio de proyecto para **%{project_name}** y está pendiente de revisión." project_phase_definitions: - heading: Ciclo de vida del proyecto - heading_description: El ciclo de vida del proyecto define las fases del proyecto - que pueden utilizarse para la planificación de su proyecto y que aparecerán - en la página de resumen de cada proyecto. Estos atributos pueden activarse - o desactivarse, pero no reordenarse a nivel de proyecto. - label_add: Añadir - label_add_description: Añadir definición de fase del proyecto + heading: "Ciclo de vida del proyecto" + heading_description: "El ciclo de vida del proyecto define las fases del proyecto que pueden utilizarse para la planificación de su proyecto y que aparecerán en la página de resumen de cada proyecto. Estos atributos pueden activarse o desactivarse, pero no reordenarse a nivel de proyecto." + label_add: "Añadir" + label_add_description: "Añadir definición de fase del proyecto" filter: - label: Buscar fase del proyecto - section_header: Fases - non_defined: Actualmente no hay fases definidas. - phase_gates: Puertas de fase + label: "Buscar fase del proyecto" + section_header: "Fases" + non_defined: "Actualmente no hay fases definidas." + phase_gates: "Puertas de fase" new: - description: Los cambios en esta fase del proyecto se reflejarán en todos - los proyectos en los que esté activada. - heading: Nueva fase - both_gate: Puerta inicial y final - no_gate: Sin puerta - start_gate: Puerta de inicio - start_gate_caption: Añada una puerta con la fecha de inicio de la fase - finish_gate: Puerta de finalización - finish_gate_caption: Añada una puerta con la fecha de finalización de la fase + description: "Los cambios en esta fase del proyecto se reflejarán en todos los proyectos en los que esté activada." + heading: "Nueva fase" + both_gate: "Puerta inicial y final" + no_gate: "Sin puerta" + start_gate: "Puerta de inicio" + start_gate_caption: "Añada una puerta con la fecha de inicio de la fase" + finish_gate: "Puerta de finalización" + finish_gate_caption: "Añada una puerta con la fecha de finalización de la fase" projects: - missing_dependencies: Se ha comprobado el módulo de proyecto %{module} que depende - de %{dependencies}. Necesitas comprobar estas dependencias también. - section_new_projects: Configuración para nuevos proyectos - section_project_overview: Configuración de las listas de proyectos - session: Sesión + missing_dependencies: "Se ha comprobado el módulo de proyecto %{module} que depende de %{dependencies}. Necesitas comprobar estas dependencias también." + section_new_projects: "Configuración para nuevos proyectos" + section_project_overview: "Configuración de las listas de proyectos" + session: "Sesión" user: - default_preferences: Preferencias predeterminadas - display_format: Formato de presentación - deletion: Eliminación + default_preferences: "Preferencias predeterminadas" + display_format: "Formato de presentación" + deletion: "Eliminación" working_days: - section_work_week: Semana de trabajo - section_holidays_and_closures: Vacaciones y cierres + section_work_week: "Semana de trabajo" + section_holidays_and_closures: "Vacaciones y cierres" work_packages: - not_allowed_text: No tiene los permisos necesarios para ver esta página. + not_allowed_text: "No tiene los permisos necesarios para ver esta página." activities: - enable_internal_comments: Habilitar comentarios internos - helper_text: Los comentarios internos permiten a un equipo interno comunicarse - entre sí de forma privada. Solo son visibles para los roles seleccionados - que tengan los permisos necesarios y no serán visibles públicamente. %{link} + enable_internal_comments: "Habilitar comentarios internos" + helper_text: "Los comentarios internos permiten a un equipo interno comunicarse entre sí de forma privada. Solo son visibles para los roles seleccionados que tengan los permisos necesarios y no serán visibles públicamente. %{link}" text_formatting: - markdown: Markdown - plain: Texto sin formato - status_active: activo - status_archived: archivado - status_blocked: bloqueado + markdown: "Markdown" + plain: "Texto sin formato" + status_active: "activo" + status_archived: "archivado" + status_blocked: "bloqueado" status_invited: invitado status_locked: bloqueado status_registered: Registrado status_deleted: eliminado + #Used in array.to_sentence. support: array: sentence_connector: "y" - skip_last_comma: falso - text_accessibility_hint: El modo de accesibilidad está diseñado para los usuarios - ciegos, con dificultades motoras o con la vista mala. Para estos últimos, los - elementos enfocados se destacan aún más. Tenga en cuenta que el módulo Backlog - no está disponible en este modo. - text_access_token_hint: Los tokens de acceso te permiten dar permisos de acceso - sobre los recursos de OpenProject a aplicaciones externas. - text_analyze: 'Análisis futuro: %{subject}' + skip_last_comma: "falso" + text_accessibility_hint: "El modo de accesibilidad está diseñado para los usuarios ciegos, con dificultades motoras o con la vista mala. Para estos últimos, los elementos enfocados se destacan aún más. Tenga en cuenta que el módulo Backlog no está disponible en este modo." + text_access_token_hint: "Los tokens de acceso te permiten dar permisos de acceso sobre los recursos de OpenProject a aplicaciones externas." + text_analyze: "Análisis futuro: %{subject}" text_are_you_sure: "¿Estás seguro?" - open_link_in_a_new_tab: Abrir vínculo en un nuevo panel + open_link_in_a_new_tab: "Abrir vínculo en un nuevo panel" text_are_you_sure_continue: "¿Seguro que quiere continuar?" - text_are_you_sure_with_children: "¿Eliminar el paquete de trabajo y todos sus paquetes - dependientes?" - text_are_you_sure_with_project_custom_fields: Al eliminar este atributo también - se eliminarán sus valores en todos los proyectos. ¿Seguro que desea hacerlo? - text_are_you_sure_with_project_life_cycle_step: Si elimina esta fase, también se - eliminarán sus usos en todos los proyectos. ¿Seguro que desea hacerlo? - text_assign_to_project: Asignar al proyecto - text_form_configuration: 'Puede personalizar los campos que se mostrarán en forma - de paquete de trabajo. Puede agrupar libremente los campos para adaptarlos a las - necesidades de su dominio. - - ' - text_form_configuration_required_attribute: El atributo está marcado como obligatorio - y, por lo tanto, siempre se muestra - text_caracters_maximum: máximo de %{count} caracteres. - text_caracters_minimum: Debe tener al menos %{count} caracteres de largo. - text_comma_separated: Permitir múltiples valores (separados por comas). - text_comment_wiki_page: 'Comentar a la página de wiki: %{page}' - text_custom_field_possible_values_info: Una línea para cada valor - text_custom_field_hint_activate_per_project: 'Si utiliza campos personalizados: - tenga en cuenta que los campos personalizados deben activarse también en cada - proyecto por separado. - - ' - text_custom_field_hint_activate_per_project_and_type: 'Los campos personalizados - se deben activar en cada tipo de paquete de trabajo y en cada proyecto por separado. - - ' - text_project_custom_field_html: 'Enterprise añadirá estas extensiones para los campos - personalizados de los proyectos:
  • Añadir campos personalizados - para proyectos a tu lista de proyectos para crear una vista porfolio de proyectos
  • -
- - ' - text_custom_logo_instructions: 'El logotipo se ajusta automáticamente al tamaño - del encabezado. Para obtener los mejores resultados, sube un logotipo blanco en - una imagen transparente de 130 × 47 píxeles. Puedes añadir todo el espacio que - desees dentro de esa imagen. - - ' - text_custom_logo_mobile_instructions: 'El logotipo se ajusta automáticamente al - tamaño del encabezado. Para obtener los mejores resultados, sube un logotipo blanco - en una imagen transparente de 130 × 33 píxeles. Puedes añadir todo el espacio - que desees dentro de esa imagen. - - ' - text_custom_export_logo_instructions: 'Este es el logotipo que aparece en sus exportaciones - PDF. Tiene que ser un archivo de imagen PNG o JPEG. Se recomienda un logotipo - negro o de color sobre fondo transparente o blanco. - - ' - text_custom_export_cover_instructions: 'Esta es la imagen que aparece en el fondo - de una página de portada en sus exportaciones PDF. Tiene que ser un archivo de - imagen PNG o JPEG de aproximadamente un ancho 800px por 500px de alto. - - ' - text_custom_export_footer_instructions: 'Las exportaciones en formato PDF incluirán - un elemento gráfico situado a la izquierda del pie de página. Esta imagen debe - ser un archivo PNG o JPEG con aproximadamente 200 píxeles de ancho. - - ' - label_custom_export_font_instructions: 'Cargue y administre fuentes TrueType (.ttf) - personalizadas utilizadas en sus exportaciones PDF. Para obtener los mejores resultados, - use archivos adaptados de la misma familia de fuentes. Si no se proporciona ninguna - fuente, se usará la fuente predeterminada NotoSans. - - ' - label_custom_export_images_instructions: 'Cargue y administre archivos de imagen - personalizados usados para exportar PDF. - - ' - text_custom_export_font_regular_instructions: 'Este es el archivo de fuente para - el texto normal. Debe estar en formato TTF y es obligatorio. - - ' - text_custom_export_font_bold_instructions: 'Este es el archivo de fuente para el - texto en negrita. Debe estar en formato TTF. - - ' - text_custom_export_font_italic_instructions: 'Este es el archivo de fuente para - el texto en cursiva. Debe estar en formato TTF. - - ' - text_custom_export_font_bold_italic_instructions: 'Este es el archivo de fuente - para el texto en negrita y cursiva. Debe estar en formato TTF. - - ' - text_custom_favicon_instructions: 'Es el icono diminuto que aparece en la ventana - o pestaña del navegador, junto al título de la página. Tiene que ser una imagen - PNG cuadrada de 32 × 32 píxeles con un fondo transparente. - - ' - text_custom_touch_icon_instructions: 'Es el icono que aparece en un móvil o tableta - al colocar un marcador en la pantalla de inicio. Debe ser un archivo de imagen - PNG cuadrado de 180 × 180 píxeles. Asegúrese de que el fondo de la imagen no sea - transparente, ya que tendrá una apariencia poco adecuada en iOS. - - ' - text_database_allows_tsv: La Base de datos permite TSVector (opcional) - text_default_administrator_account_changed: Se ha cambiado la cuenta de administrador - por defecto - text_default_encoding: 'Por defecto: UTF-8' - text_destroy: Borrar - text_destroy_with_associated: 'Hay objetos adicionales asociados a los paquetes - de trabajo que van a ser eliminados. Esos objetos son de los siguientes tipos:' + text_are_you_sure_with_children: "¿Eliminar el paquete de trabajo y todos sus paquetes dependientes?" + text_are_you_sure_with_project_custom_fields: "Al eliminar este atributo también se eliminarán sus valores en todos los proyectos. ¿Seguro que desea hacerlo?" + text_are_you_sure_with_project_life_cycle_step: "Si elimina esta fase, también se eliminarán sus usos en todos los proyectos. ¿Seguro que desea hacerlo?" + text_assign_to_project: "Asignar al proyecto" + text_form_configuration: > + Puede personalizar los campos que se mostrarán en forma de paquete de trabajo. Puede agrupar libremente los campos para adaptarlos a las necesidades de su dominio. + text_form_configuration_required_attribute: "El atributo está marcado como obligatorio y, por lo tanto, siempre se muestra" + text_caracters_maximum: "máximo de %{count} caracteres." + text_caracters_minimum: "Debe tener al menos %{count} caracteres de largo." + text_comma_separated: "Permitir múltiples valores (separados por comas)." + text_comment_wiki_page: "Comentar a la página de wiki: %{page}" + text_custom_field_possible_values_info: "Una línea para cada valor" + text_custom_field_hint_activate_per_project: > + Si utiliza campos personalizados: tenga en cuenta que los campos personalizados deben activarse también en cada proyecto por separado. + text_custom_field_hint_activate_per_project_and_type: > + Los campos personalizados se deben activar en cada tipo de paquete de trabajo y en cada proyecto por separado. + text_project_custom_field_html: > + Enterprise añadirá estas extensiones para los campos personalizados de los proyectos:
  • Añadir campos personalizados para proyectos a tu lista de proyectos para crear una vista porfolio de proyectos
+ text_custom_logo_instructions: > + El logotipo se ajusta automáticamente al tamaño del encabezado. Para obtener los mejores resultados, sube un logotipo blanco en una imagen transparente de 130 × 47 píxeles. Puedes añadir todo el espacio que desees dentro de esa imagen. + text_custom_logo_mobile_instructions: > + El logotipo se ajusta automáticamente al tamaño del encabezado. Para obtener los mejores resultados, sube un logotipo blanco en una imagen transparente de 130 × 33 píxeles. Puedes añadir todo el espacio que desees dentro de esa imagen. + text_custom_export_logo_instructions: > + Este es el logotipo que aparece en sus exportaciones PDF. Tiene que ser un archivo de imagen PNG o JPEG. Se recomienda un logotipo negro o de color sobre fondo transparente o blanco. + text_custom_export_cover_instructions: > + Esta es la imagen que aparece en el fondo de una página de portada en sus exportaciones PDF. Tiene que ser un archivo de imagen PNG o JPEG de aproximadamente un ancho 800px por 500px de alto. + text_custom_export_footer_instructions: > + Las exportaciones en formato PDF incluirán un elemento gráfico situado a la izquierda del pie de página. Esta imagen debe ser un archivo PNG o JPEG con aproximadamente 200 píxeles de ancho. + label_custom_export_font_instructions: > + Cargue y administre fuentes TrueType (.ttf) personalizadas utilizadas en sus exportaciones PDF. Para obtener los mejores resultados, use archivos adaptados de la misma familia de fuentes. Si no se proporciona ninguna fuente, se usará la fuente predeterminada NotoSans. + label_custom_export_images_instructions: > + Cargue y administre archivos de imagen personalizados usados para exportar PDF. + text_custom_export_font_regular_instructions: > + Este es el archivo de fuente para el texto normal. Debe estar en formato TTF y es obligatorio. + text_custom_export_font_bold_instructions: > + Este es el archivo de fuente para el texto en negrita. Debe estar en formato TTF. + text_custom_export_font_italic_instructions: > + Este es el archivo de fuente para el texto en cursiva. Debe estar en formato TTF. + text_custom_export_font_bold_italic_instructions: > + Este es el archivo de fuente para el texto en negrita y cursiva. Debe estar en formato TTF. + text_custom_favicon_instructions: > + Es el icono diminuto que aparece en la ventana o pestaña del navegador, junto al título de la página. Tiene que ser una imagen PNG cuadrada de 32 × 32 píxeles con un fondo transparente. + text_custom_touch_icon_instructions: > + Es el icono que aparece en un móvil o tableta al colocar un marcador en la pantalla de inicio. Debe ser un archivo de imagen PNG cuadrado de 180 × 180 píxeles. Asegúrese de que el fondo de la imagen no sea transparente, ya que tendrá una apariencia poco adecuada en iOS. + text_database_allows_tsv: "La Base de datos permite TSVector (opcional)" + text_default_administrator_account_changed: "Se ha cambiado la cuenta de administrador por defecto" + text_default_encoding: "Por defecto: UTF-8" + text_destroy: "Borrar" + text_destroy_with_associated: "Hay objetos adicionales asociados a los paquetes de trabajo que van a ser eliminados. Esos objetos son de los siguientes tipos:" text_destroy_what_to_do: "¿Qué quieres hacer?" - text_diff_truncated: "... Esta diferencia se truncó porque excede el tamaño máximo - que puede visualizarse." - text_email_delivery_not_configured: |- - No se ha configurado la entrega de correo electrónico y se han deshabilitado las notificaciones. - Configure el servidor SMTP para habilitarlas. - text_enumeration_category_reassign_to: 'Reasignarlos a este valor:' + text_diff_truncated: "... Esta diferencia se truncó porque excede el tamaño máximo que puede visualizarse." + text_email_delivery_not_configured: "No se ha configurado la entrega de correo electrónico y se han deshabilitado las notificaciones.\nConfigure el servidor SMTP para habilitarlas." + text_enumeration_category_reassign_to: "Reasignarlos a este valor:" text_enumeration_destroy_question: "%{count} objetos asignados a este valor." - text_file_repository_writable: Directorio de adjuntos escribible - text_git_repo_example: un repositorio local y vacío (por ejemplo /gitrepo, c:\gitrepo) - text_hint_date_format: Indique una fecha en el formato AAAA-MM-DD. Otros formatos - pueden dar lugar a que se interprete una fecha errónea. - text_hint_disable_with_0: 'Nota: Desactivar con 0' - text_hours_between: Entre %{min} y %{max} horas. - text_work_package_added: Los paquetes de trabajo %{id} han sido actualizados por - %{author}. - text_work_package_category_destroy_assignments: Remover asignaciones de categorias - text_work_package_category_destroy_question: Algunos paquetes de trabajo (%{count}) - están asignados a esta categoría. ¿Que desea hacer? - text_work_package_category_reassign_to: Resignando paquetes de trabajo a esta categoria - text_work_package_updated: Los paquetes de trabajo %{id} han sido actualizados por - %{author}. - text_work_package_watcher_added: "%{watcher_changer} le agregó como observador en - el paquete de trabajo %{id}." - text_work_package_watcher_removed: "%{watcher_changer} le ha quitado como observador - del paquete de trabajo %{id}." - text_work_packages_destroy_confirmation: "¿Esta usted seguro que desea eliminar - paquete(s) de trabajo seleccionado(s)?" - text_work_packages_ref_in_commit_messages: Referenciando y reparando paquetes de - trabajo en mensajes de commit + text_file_repository_writable: "Directorio de adjuntos escribible" + text_git_repo_example: "un repositorio local y vacío (por ejemplo /gitrepo, c:\\gitrepo)" + text_hint_date_format: "Indique una fecha en el formato AAAA-MM-DD. Otros formatos pueden dar lugar a que se interprete una fecha errónea." + text_hint_disable_with_0: "Nota: Desactivar con 0" + text_hours_between: "Entre %{min} y %{max} horas." + text_work_package_added: "Los paquetes de trabajo %{id} han sido actualizados por %{author}." + text_work_package_category_destroy_assignments: "Remover asignaciones de categorias" + text_work_package_category_destroy_question: "Algunos paquetes de trabajo (%{count}) están asignados a esta categoría. ¿Que desea hacer?" + text_work_package_category_reassign_to: "Resignando paquetes de trabajo a esta categoria" + text_work_package_updated: "Los paquetes de trabajo %{id} han sido actualizados por %{author}." + text_work_package_watcher_added: "%{watcher_changer} le agregó como observador en el paquete de trabajo %{id}." + text_work_package_watcher_removed: "%{watcher_changer} le ha quitado como observador del paquete de trabajo %{id}." + text_work_packages_destroy_confirmation: "¿Esta usted seguro que desea eliminar paquete(s) de trabajo seleccionado(s)?" + text_work_packages_ref_in_commit_messages: "Referenciando y reparando paquetes de trabajo en mensajes de commit" text_journal_added: "%{label} %{value} añadido" text_journal_attachment_added: "%{label} %{value} añadido como adjunto" text_journal_attachment_deleted: "%{label} %{old} eliminado como archivo adjunto" @@ -6161,413 +5020,283 @@ es: text_journal_deleted_subproject: "%{label} %{old}" text_journal_deleted_with_diff: "%{label} eliminado (%{link})" text_journal_file_link_added: "%{label} enlace a %{value} (%{storage}) añadido" - text_journal_file_link_deleted: Enlace %{label} a %{old} (%{storage}) eliminado + text_journal_file_link_deleted: "Enlace %{label} a %{old} (%{storage}) eliminado" text_journal_of: "%{label} %{value}" text_journal_set_to: "%{label} establecido al %{value}" text_journal_set_with_diff: "%{label} fijado (%{link})" text_journal_label_value: "%{label} %{value}" - text_latest_note: 'El último comentario es: %{note}' - text_length_between: Longitud entre %{min} y %{max} caracteres. - text_line_separated: Múltiples valores permitidos (una línea para cada valor). - text_load_default_configuration: Cargar la configuración predeterminada + text_latest_note: "El último comentario es: %{note}" + text_length_between: "Longitud entre %{min} y %{max} caracteres." + text_line_separated: "Múltiples valores permitidos (una línea para cada valor)." + text_load_default_configuration: "Cargar la configuración predeterminada" text_no_roles_defined: No hay ningun rol definido. - text_no_access_tokens_configurable: No hay ningun token de acceso que pueda ser - configurado. - text_no_configuration_data: Roles, tipos, estado de petición y flujo de trabajo - no han sido configurados. Se recomienda cargar la configuración por defecto. Podrá - modificarla cuando haya sido cargada. - text_no_notes: No hay comentarios disponibles para este paquete de trabajo. - text_notice_too_many_values_are_inperformant: 'Nota: Si se muestran más de 100 elementos - por página puede incrementar el tiempo de carga de la página.' - text_notice_security_badge_displayed_html: 'Nota: al activarse, se mostrará una - insignia con el estado de instalación en el %{information_panel_label} - panel de administración, y en la página principal. Solamente será visible para - administradores.
La insignia comprobará tu versión actual de OpenProject - comparada con la base de datos oficial de OpenProject para alertarte de cualquier - actualización o vulnerabilidad. Para más información sobre las funciones de la - comprobación, los datos necesarios para conseguir actualizaciones disponibles, - o para desactivar esta comprobación, por favor visita la - documentación de configuración. - - ' - text_own_membership_delete_confirmation: |- - Estás a punto de eliminar algunos o todos tus permisos, y podrías no poder volver a editar este proyecto. - ¿Estás seguro/a de que quieres continuar? - text_permanent_delete_confirmation_checkbox_label: Entiendo que esta eliminación - no se puede revertir - text_permanent_remove_confirmation_checkbox_label: Entiendo que esta eliminación - no se puede revertir - text_plugin_assets_writable: Directorio de extensiones activos escribible - text_powered_by: Con tecnología de %{link} - text_project_identifier_info: Se permiten sólo letras minúsculas (a-z), números, - guiones y guiones bajos, debe comenzar con una letra minúscula. - text_reassign: 'Reasignar al paquete de trabajo:' - text_regexp_multiline: La expresión regular se aplica en modo multilínea. Por ejemplo, - ^---\s+ - text_repository_usernames_mapping: Seleccione o actualize el usuario de OpenProject - asignado a cada nombre en el registro del repositorio. Los usuarios con el mismo - nombre o email serán mapeados automáticamente. - text_status_changed_by_changeset: Aplicado en el conjunto de cambios %{value}. - text_table_difference_description: En esta tabla, se muestran %{entries} individuales. - Puede ver la diferencia entre dos entradas cualesquiera seleccionando primero - los cuadros de verificación adecuados en la tabla. Al hacer clic en el botón bajo - la tabla, se muestran las diferencias. - text_time_logged_by_changeset: Aplicado en el conjunto de cambios %{value}. - text_tip_work_package_begin_day: paquete de trabajo comienza este día - text_tip_work_package_begin_end_day: paquete de trabajo comienza y termina este - día - text_tip_work_package_end_day: paquete de trabajo finalizado este día - text_type_no_workflow: No hay flujo de trabajo definido para este tipo - text_unallowed_characters: Caracteres no permitidos + text_no_access_tokens_configurable: "No hay ningun token de acceso que pueda ser configurado." + text_no_configuration_data: "Roles, tipos, estado de petición y flujo de trabajo no han sido configurados. Se recomienda cargar la configuración por defecto. Podrá modificarla cuando haya sido cargada." + text_no_notes: "No hay comentarios disponibles para este paquete de trabajo." + text_notice_too_many_values_are_inperformant: "Nota: Si se muestran más de 100 elementos por página puede incrementar el tiempo de carga de la página." + text_notice_security_badge_displayed_html: > + Nota: al activarse, se mostrará una insignia con el estado de instalación en el %{information_panel_label} panel de administración, y en la página principal. Solamente será visible para administradores.
La insignia comprobará tu versión actual de OpenProject comparada con la base de datos oficial de OpenProject para alertarte de cualquier actualización o vulnerabilidad. Para más información sobre las funciones de la comprobación, los datos necesarios para conseguir actualizaciones disponibles, o para desactivar esta comprobación, por favor visita la documentación de configuración. + text_own_membership_delete_confirmation: "Estás a punto de eliminar algunos o todos tus permisos, y podrías no poder volver a editar este proyecto.\n¿Estás seguro/a de que quieres continuar?" + text_permanent_delete_confirmation_checkbox_label: "Entiendo que esta eliminación no se puede revertir" + text_permanent_remove_confirmation_checkbox_label: "Entiendo que esta eliminación no se puede revertir" + text_plugin_assets_writable: "Directorio de extensiones activos escribible" + text_powered_by: "Con tecnología de %{link}" + text_project_identifier_info: "Se permiten sólo letras minúsculas (a-z), números, guiones y guiones bajos, debe comenzar con una letra minúscula." + text_reassign: "Reasignar al paquete de trabajo:" + text_regexp_multiline: 'La expresión regular se aplica en modo multilínea. Por ejemplo, ^---\s+' + text_repository_usernames_mapping: "Seleccione o actualize el usuario de OpenProject asignado a cada nombre en el registro del repositorio. Los usuarios con el mismo nombre o email serán mapeados automáticamente." + text_status_changed_by_changeset: "Aplicado en el conjunto de cambios %{value}." + text_table_difference_description: "En esta tabla, se muestran %{entries} individuales. Puede ver la diferencia entre dos entradas cualesquiera seleccionando primero los cuadros de verificación adecuados en la tabla. Al hacer clic en el botón bajo la tabla, se muestran las diferencias." + text_time_logged_by_changeset: "Aplicado en el conjunto de cambios %{value}." + text_tip_work_package_begin_day: "paquete de trabajo comienza este día" + text_tip_work_package_begin_end_day: "paquete de trabajo comienza y termina este día" + text_tip_work_package_end_day: "paquete de trabajo finalizado este día" + text_type_no_workflow: "No hay flujo de trabajo definido para este tipo" + text_unallowed_characters: "Caracteres no permitidos" text_user_invited: El usuario ha sido invitado y esta a la espera del registro. text_user_wrote: "%{value} escribió:" - text_wrote: escribió - text_warn_on_leaving_unsaved: El paquete de trabajo contiene texto no guardado que - se perderá en caso de abandonar esta página. - text_what_did_you_change_click_to_add_comment: "¿Qué cambió? Haga clic para agregar - un comentario" - text_wiki_destroy_confirmation: "¿Está seguro que desea eliminar este wiki y todo - su contenido?" - text_wiki_page_destroy_children: Eliminar páginas hijas y todos sus descendientes - text_wiki_page_destroy_question: Esta página tiene %{descendants} página(s) hijas - y descendiente(s). ¿Qué quiere hacer? - text_wiki_page_nullify_children: Guardar páginas hijas como páginas principales - text_wiki_page_reassign_children: Reasignar páginas hijas a esta página padre - text_workflow_edit: Seleccione un rol y un tipo para modificar el flujo de trabajo - text_zoom_in: Acercar - text_zoom_out: Alejar - text_setup_mail_configuration: Configurar su proveedor de correo electrónico + text_wrote: "escribió" + text_warn_on_leaving_unsaved: "El paquete de trabajo contiene texto no guardado que se perderá en caso de abandonar esta página." + text_what_did_you_change_click_to_add_comment: "¿Qué cambió? Haga clic para agregar un comentario" + text_wiki_destroy_confirmation: "¿Está seguro que desea eliminar este wiki y todo su contenido?" + text_wiki_page_destroy_children: "Eliminar páginas hijas y todos sus descendientes" + text_wiki_page_destroy_question: "Esta página tiene %{descendants} página(s) hijas y descendiente(s). ¿Qué quiere hacer?" + text_wiki_page_nullify_children: "Guardar páginas hijas como páginas principales" + text_wiki_page_reassign_children: "Reasignar páginas hijas a esta página padre" + text_workflow_edit: "Seleccione un rol y un tipo para modificar el flujo de trabajo" + text_zoom_in: "Acercar" + text_zoom_out: "Alejar" + text_setup_mail_configuration: "Configurar su proveedor de correo electrónico" help_texts: views: - project: "%{plural} siempre están unidos a un proyecto. Solo puede seleccionar - proyectos aquí donde el módulo %{plural} está activo. Después de crear un - %{singular} puedes añadir paquetes de trabajo de otros proyectos.\n" - public: Publique esta vista para que otros usuarios puedan acceder a esta. Los - usuarios con el permiso «Administrar vistas públicas» puede modificar o quitar - vistas públicas. Esto no afecta a la visibilidad de los resultados de paquetes - de trabajo en esa vista y, según sus permisos, los usuarios pueden ver resultados - distintos. - favoured: Marque esta vista como favorita y agréguela a la barra lateral de - vistas guardadas de la izquierda. + project: > + %{plural} siempre están unidos a un proyecto. Solo puede seleccionar proyectos aquí donde el módulo %{plural} está activo. Después de crear un %{singular} puedes añadir paquetes de trabajo de otros proyectos. + public: "Publique esta vista para que otros usuarios puedan acceder a esta. Los usuarios con el permiso «Administrar vistas públicas» puede modificar o quitar vistas públicas. Esto no afecta a la visibilidad de los resultados de paquetes de trabajo en esa vista y, según sus permisos, los usuarios pueden ver resultados distintos." + favoured: "Marque esta vista como favorita y agréguela a la barra lateral de vistas guardadas de la izquierda." time: - am: AM + am: "AM" formats: default: "%m/%d/%Y %I:%M %p" long: "%B %d, %Y %H:%M" short: "%d %b %H:%M" time: "%I:%M %p" - pm: pm + pm: "pm" timeframe: - show: Mostrar marco temporal - end: a - start: de + show: "Mostrar marco temporal" + end: "a" + start: "de" title_remove_and_delete_user: Eliminar al usurio invitado del proyecto y eliminarlo. - title_enterprise_upgrade: Mejora para desbloquear más usuarios. - tooltip_user_default_timezone: 'La zona horaria por defecto para los nuevos usuarios. - Puede ser modificada en la configuración del usuario. - - ' - tooltip_resend_invitation: 'Envía otro correo electrónico de invitación con un token - nuevo, en caso de que el antiguo esté caducado o el usuario no hubiera recibido - el primer correo. También se puede usar para usuarios activos con el fin de seleccionar - un nuevo método de autenticación. Al usarse con usuarios activos, su estado pasará - a ser ''invitado''. - - ' + title_enterprise_upgrade: "Mejora para desbloquear más usuarios." + tooltip_user_default_timezone: > + La zona horaria por defecto para los nuevos usuarios. Puede ser modificada en la configuración del usuario. + tooltip_resend_invitation: > + Envía otro correo electrónico de invitación con un token nuevo, en caso de que el antiguo esté caducado o el usuario no hubiera recibido el primer correo. También se puede usar para usuarios activos con el fin de seleccionar un nuevo método de autenticación. Al usarse con usuarios activos, su estado pasará a ser 'invitado'. tooltip: - setting_email_login: 'En caso de estar habilitado, el usuario no podrá elegir - el nombre de usuario durante el registro. En su lugar, deberá utilizar el correo - electrónico como nombre de usuario. No obstante, el administrador podría cambiar - el nombre de usuario por su cuenta. - - ' + setting_email_login: > + En caso de estar habilitado, el usuario no podrá elegir el nombre de usuario durante el registro. En su lugar, deberá utilizar el correo electrónico como nombre de usuario. No obstante, el administrador podría cambiar el nombre de usuario por su cuenta. queries: apply_filter: Aplicar filtro preconfigurado configure_view: heading: Configurar vista columns: - input_label: Añadir columnas - input_placeholder: Seleccionar una columna - drag_area_label: Gestionar y reordenar columnas + input_label: "Añadir columnas" + input_placeholder: "Seleccionar una columna" + drag_area_label: "Gestionar y reordenar columnas" sort_by: automatic: - heading: Automático - description: Ordene la %{plural} por uno o varios criterios de clasificación. - Perderá la ordenación anterior. + heading: "Automático" + description: "Ordene la %{plural} por uno o varios criterios de clasificación. Perderá la ordenación anterior." top_menu: - additional_resources: Recursos Adicionales - getting_started: Primeros pasos - help_and_support: Ayuda y soporte - total_progress: Progreso total + additional_resources: "Recursos Adicionales" + getting_started: "Primeros pasos" + help_and_support: "Ayuda y soporte" + total_progress: "Progreso total" user: - all: todos - active: activo - activate: Activar - activate_and_reset_failed_logins: Activar y restablecer los inicios de sesión - fallidos - authentication_provider: Proveedor de autenticación - identity_url_text: El identificador único interno proporcionado por el proveedor - de autenticación. - authentication_settings_disabled_due_to_external_authentication: 'Este usuario - se autentica mediante un proveedor de autenticación externa, así que no hay - ninguna contraseña en OpenProject para ser cambiada. - - ' - authorization_rejected: No tienes permitido iniciar sesion. - assign_random_password: Asignar contraseña aleatoria (Enviar al usuario vía email) - blocked: bloqueado temporalmente + all: "todos" + active: "activo" + activate: "Activar" + activate_and_reset_failed_logins: "Activar y restablecer los inicios de sesión fallidos" + authentication_provider: "Proveedor de autenticación" + identity_url_text: "El identificador único interno proporcionado por el proveedor de autenticación." + authentication_settings_disabled_due_to_external_authentication: > + Este usuario se autentica mediante un proveedor de autenticación externa, así que no hay ninguna contraseña en OpenProject para ser cambiada. + authorization_rejected: "No tienes permitido iniciar sesion." + assign_random_password: "Asignar contraseña aleatoria (Enviar al usuario vía email)" + blocked: "bloqueado temporalmente" blocked_num_failed_logins: - one: bloqueado temporalmente (un intento fallido de inicio de sesión) - other: bloqueada temporalmente (%{count} intentos fallidos de inicio de sesión) - confirm_status_change: Va a cambiar el estado de “%{name}”. ¿Está seguro de que - quiere continuar? - deleted: Usuarios Eliminados - error_status_change_self: No puede cambiar su propio estado de usuario. - error_admin_change_on_non_admin: Solo los administradores pueden cambiar el estado - de los usuarios administradores. - error_status_change_failed: 'Cambiar la condición de usuario falló debido a los - errores siguientes: %{errors}' + one: "bloqueado temporalmente (un intento fallido de inicio de sesión)" + other: "bloqueada temporalmente (%{count} intentos fallidos de inicio de sesión)" + confirm_status_change: "Va a cambiar el estado de “%{name}”. ¿Está seguro de que quiere continuar?" + deleted: "Usuarios Eliminados" + error_status_change_self: "No puede cambiar su propio estado de usuario." + error_admin_change_on_non_admin: "Solo los administradores pueden cambiar el estado de los usuarios administradores." + error_status_change_failed: "Cambiar la condición de usuario falló debido a los errores siguientes: %{errors}" invite: Invitar a un usuario por email invited: invitado - lock: Bloquear permanentemente - locked: bloqueado permanentemente - no_login: Este usuario se autentica a través de acceso por contraseña. Puesto - que está deshabilitado, no puede entrar. + lock: "Bloquear permanentemente" + locked: "bloqueado permanentemente" + no_login: "Este usuario se autentica a través de acceso por contraseña. Puesto que está deshabilitado, no puede entrar." password_change_unsupported: No se admite el cambio de contraseña. - registered: Registrado - reset_failed_logins: Resetear los inicios de sesión fallidos + registered: "Registrado" + reset_failed_logins: "Resetear los inicios de sesión fallidos" status_user_and_brute_force: "%{user} y %{brute_force}" - status_change: Cambio de estado - text_change_disabled_for_provider_login: El nombre y el correo electrónico los - configura su proveedor de inicio de sesión y no se pueden cambiar. - unlock: Desbloquear - unlock_and_reset_failed_logins: Desbloquear y resetear los inicios de sesión fallidos - error_cannot_delete_user: No se puede eliminar el usuario - version_status_closed: cerrado - version_status_locked: bloqueado - version_status_open: abierto + status_change: "Cambio de estado" + text_change_disabled_for_provider_login: "El nombre y el correo electrónico los configura su proveedor de inicio de sesión y no se pueden cambiar." + unlock: "Desbloquear" + unlock_and_reset_failed_logins: "Desbloquear y resetear los inicios de sesión fallidos" + error_cannot_delete_user: "No se puede eliminar el usuario" + version_status_closed: "cerrado" + version_status_locked: "bloqueado" + version_status_open: "abierto" note: Nota - note_password_login_disabled: El inicio de sesion por contraseña ha sido deshabilitado - por %{configuration}. + note_password_login_disabled: "El inicio de sesion por contraseña ha sido deshabilitado por %{configuration}." warning: Alerta warning_attachments_not_saved: "%{count} archivo(s) no podrán ser salvados." - warning_imminent_user_limit: 'Usted ha invitado a más usuarios de los que soporta - su plan actual. Es posible que los usuarios invitados no puedan unirse a su ambiente - de Proyecto Abierto. Por favor actualice su plan - o bloquee los usuarios existentes para permitir que los usuarios invitados y registrados - se unan. + warning_imminent_user_limit: > + Usted ha invitado a más usuarios de los que soporta su plan actual. Es posible que los usuarios invitados no puedan unirse a su ambiente de Proyecto Abierto. Por favor actualice su plan o bloquee los usuarios existentes para permitir que los usuarios invitados y registrados se unan. + warning_registration_token_expired: | + El e-mail de activación ha expirado. Le enviaremos uno nuevo a %{email}. Por favor haga click en el enlace incluido en el mismo para activar su cuenta. + warning_user_limit_reached: > + Añadir usuarios adicionales excederá el límite actual. Póngase en contacto con un administrador para aumentar el límite de usuario para asegurar que los usuarios externos puedan acceder a esta instancia. + warning_user_limit_reached_admin: > + Añadir usuarios adicionales excederá el límite actual. Por favor, actualice su plan para asegurar que los usuarios externos puedan acceder a esta instancia. + warning_user_limit_reached_instructions: > + Has alcanzado el límite de usuarios (%{current}/%{max} usuarios activos). Por favor, contacta con sales@openproject.com para mejorar tu plan de Enterprise y añadir usuarios adicionales. + warning_protocol_mismatch_html: > - ' - warning_registration_token_expired: 'El e-mail de activación ha expirado. Le enviaremos - uno nuevo a %{email}. Por favor haga click en el enlace incluido en el mismo para - activar su cuenta. - - ' - warning_user_limit_reached: 'Añadir usuarios adicionales excederá el límite actual. - Póngase en contacto con un administrador para aumentar el límite de usuario para - asegurar que los usuarios externos puedan acceder a esta instancia. - - ' - warning_user_limit_reached_admin: 'Añadir usuarios adicionales excederá el límite - actual. Por favor, actualice su plan para asegurar - que los usuarios externos puedan acceder a esta instancia. - - ' - warning_user_limit_reached_instructions: 'Has alcanzado el límite de usuarios (%{current}/%{max} - usuarios activos). Por favor, contacta con sales@openproject.com para mejorar - tu plan de Enterprise y añadir usuarios adicionales. - - ' - warning_protocol_mismatch_html: '' warning_bar: https_mismatch: - title: La configuración del modo HTTPS no coincide - text_html: 'Tu aplicación se está ejecutando con el modo HTTPS establecido en - %{set_protocol}, pero la solicitud es una solicitud %{actual_protocol} - . ¡Esto producirá errores! Necesitará establecer el siguiente valor de configuración: - %{setting_value}. Consulte la documentación - de instalación sobre cómo completar esta configuración. - - ' + title: "La configuración del modo HTTPS no coincide" + text_html: > + Tu aplicación se está ejecutando con el modo HTTPS establecido en %{set_protocol}, pero la solicitud es una solicitud %{actual_protocol} . ¡Esto producirá errores! Necesitará establecer el siguiente valor de configuración: %{setting_value}. Consulte la documentación de instalación sobre cómo completar esta configuración. hostname_mismatch: - title: Error de coincidencia de configuración de nombre de host - text_html: 'La aplicación se ejecuta con el nombre de host %{set_hostname}, - pero el nombre de host de la solicitud es %{actual_hostname}. - Se producirán errores. Vaya a Ajustes de sistema - y cambie la configuración de «Nombre de host» para corregir este problema. - - ' - menu_item: Elemento de menú - menu_item_setting: Visibilidad - wiki_menu_item_for: Elemento de menú para wiki '%{title}' - wiki_menu_item_setting: Visibilidad - wiki_menu_item_new_main_item_explanation: 'Usted esta eliminando el único elemento - de menú wiki principal. Ahora tiene que elegir un wiki para el cual un nuevo elemento - de menú principal será generado. Para eliminar el wiki, éste módulo puede ser - desactivado por los administradores del proyecto. - - ' - wiki_menu_item_delete_not_permitted: El único elemento de menú de la única página - wiki no puede ser eliminado. + title: "Error de coincidencia de configuración de nombre de host" + text_html: > + La aplicación se ejecuta con el nombre de host %{set_hostname}, pero el nombre de host de la solicitud es %{actual_hostname}. Se producirán errores. Vaya a Ajustes de sistema y cambie la configuración de «Nombre de host» para corregir este problema. + menu_item: "Elemento de menú" + menu_item_setting: "Visibilidad" + wiki_menu_item_for: 'Elemento de menú para wiki ''%{title}''' + wiki_menu_item_setting: "Visibilidad" + wiki_menu_item_new_main_item_explanation: > + Usted esta eliminando el único elemento de menú wiki principal. Ahora tiene que elegir un wiki para el cual un nuevo elemento de menú principal será generado. Para eliminar el wiki, éste módulo puede ser desactivado por los administradores del proyecto. + wiki_menu_item_delete_not_permitted: El único elemento de menú de la única página wiki no puede ser eliminado. + #TODO: merge with work_packages top level key work_package: - updated_automatically_by_child_changes: '_Actualizado automáticamente cambiando - los valores en el paquete de trabajo hijo %{child}_ - - ' + updated_automatically_by_child_changes: | + _Actualizado automáticamente cambiando los valores en el paquete de trabajo hijo %{child}_ destroy: - info: La eliminación del paquete de trabajo no se puede deshacer. - title: Eliminar el pauqete de trabajo + info: "La eliminación del paquete de trabajo no se puede deshacer." + title: "Eliminar el pauqete de trabajo" progress: - label_note: 'Nota:' + label_note: "Nota:" modal: - work_based_help_text: Cada campo se calcula automáticamente a partir de los - otros dos cuando es posible. - status_based_help_text: "% completado se establece por el estado del paquete - de trabajo." - migration_warning_text: En el modo de cálculo del progreso basado en el trabajo, - el % completado no puede fijarse manualmente y está vinculado al Trabajo. - El valor existente se mantiene, pero no puede editarse. Introduzca primero - el Trabajo. + work_based_help_text: "Cada campo se calcula automáticamente a partir de los otros dos cuando es posible." + status_based_help_text: "% completado se establece por el estado del paquete de trabajo." + migration_warning_text: "En el modo de cálculo del progreso basado en el trabajo, el % completado no puede fijarse manualmente y está vinculado al Trabajo. El valor existente se mantiene, pero no puede editarse. Introduzca primero el Trabajo." derivation_hints: done_ratio: - cleared_because_remaining_work_is_empty: Borrado porque el trabajo restante - está vacío. - cleared_because_work_is_0h: Borrado porque Trabajo es 0h. - derived: Derivado de Trabajo y de Trabajo restante. + cleared_because_remaining_work_is_empty: "Borrado porque el trabajo restante está vacío." + cleared_because_work_is_0h: "Borrado porque Trabajo es 0h." + derived: "Derivado de Trabajo y de Trabajo restante." estimated_hours: - cleared_because_remaining_work_is_empty: Borrado porque Trabajo restante - está vacío. - derived: Derivado del Trabajo restante y del % completado. - same_as_remaining_work: Ajustar al mismo valor que Trabajo restante. + cleared_because_remaining_work_is_empty: "Borrado porque Trabajo restante está vacío." + derived: "Derivado del Trabajo restante y del % completado." + same_as_remaining_work: "Ajustar al mismo valor que Trabajo restante." remaining_hours: - cleared_because_work_is_empty: Borrado porque Trabajo está vacío. - cleared_because_percent_complete_is_empty: Borrado porque % completado está - vacío. - decreased_by_delta_like_work: Disminuido en %{delta}, igualando la reducción - de Trabajo. - derived: Derivado de Trabajo y % completado. - increased_by_delta_like_work: Aumentado en %{delta}, igualando el aumento - de Trabajo. - same_as_work: Ajustar al mismo valor que Trabajo. + cleared_because_work_is_empty: "Borrado porque Trabajo está vacío." + cleared_because_percent_complete_is_empty: "Borrado porque % completado está vacío." + decreased_by_delta_like_work: "Disminuido en %{delta}, igualando la reducción de Trabajo." + derived: "Derivado de Trabajo y % completado." + increased_by_delta_like_work: "Aumentado en %{delta}, igualando el aumento de Trabajo." + same_as_work: "Ajustar al mismo valor que Trabajo." permissions: - comment: Comentario - comment_description: Puede ver y comentar este paquete de trabajo. - edit: Editar - edit_description: Puede ver, comentar y editar este paquete de trabajo. - view: Ver - view_description: Puede ver este paquete de trabajo. + comment: "Comentario" + comment_description: "Puede ver y comentar este paquete de trabajo." + edit: "Editar" + edit_description: "Puede ver, comentar y editar este paquete de trabajo." + view: "Ver" + view_description: "Puede ver este paquete de trabajo." reminders: - label_remind_at: Fecha + label_remind_at: "Fecha" note_placeholder: "¿Por qué establece este recordatorio?" - create_success_message: Recordatorio establecido correctamente. Recibirá una - notificación para este paquete de trabajo %{reminder_time}. - success_update_message: Recordatorio actualizado con éxito. - success_deletion_message: Recordatorio eliminado correctamente. + create_success_message: "Recordatorio establecido correctamente. Recibirá una notificación para este paquete de trabajo %{reminder_time}." + success_update_message: "Recordatorio actualizado con éxito." + success_deletion_message: "Recordatorio eliminado correctamente." sharing: count: - zero: 0 usuarios - one: 1 usuario + zero: "0 usuarios" + one: "1 usuario" other: "%{count} usuarios" filter: - project_member: Miembro del proyecto - not_project_member: No miembro del proyecto - project_group: Grupo del proyecto - not_project_group: No grupo del proyecto - user: Usuario - group: Grupo - role: Rol - type: Tipo - denied: No tiene permisos para compartir %{entities}. - label_search: Buscar usuarios para invitar - label_search_placeholder: Buscar por usuario o dirección de correo electrónico - label_toggle_all: Activar todas las comparticiones - remove: Eliminar - share: Compartir - text_empty_search_description: No hay usuarios con los criterios de filtro actuales. - text_empty_search_header: No pudimos encontrar ningún resultado coincidente. - text_empty_state_description: La %{entity} aún no se ha compartido con nadie. - text_empty_state_header: No compartido - text_user_limit_reached: Añadir usuarios adicionales excederá el límite actual. - Póngase en contacto con un administrador para aumentar el límite de usuario - para asegurar que los usuarios externos puedan acceder a esta %{entity}. - text_user_limit_reached_admins: Añadir usuarios adicionales excederá el límite - actual. Por favor, actualice su plan para poder - añadir más usuarios. - warning_user_limit_reached: 'Añadir usuarios adicionales excederá el límite actual. - Póngase en contacto con un administrador para aumentar el límite de usuario - para asegurar que los usuarios externos puedan acceder a esta %{entity}. - - ' - warning_user_limit_reached_admin: 'Añadir usuarios adicionales excederá el límite - actual. Por favor, actualice su plan para asegurar - que los usuarios externos puedan acceder a esta %{entity}. - - ' - warning_no_selected_user: Por favor, seleccione usuarios para compartir esta %{entity} - con - warning_locked_user: él usuario %{user} está bloqueado y no se puede compartir - con él + project_member: "Miembro del proyecto" + not_project_member: "No miembro del proyecto" + project_group: "Grupo del proyecto" + not_project_group: "No grupo del proyecto" + user: "Usuario" + group: "Grupo" + role: "Rol" + type: "Tipo" + denied: "No tiene permisos para compartir %{entities}." + label_search: "Buscar usuarios para invitar" + label_search_placeholder: "Buscar por usuario o dirección de correo electrónico" + label_toggle_all: "Activar todas las comparticiones" + remove: "Eliminar" + share: "Compartir" + text_empty_search_description: "No hay usuarios con los criterios de filtro actuales." + text_empty_search_header: "No pudimos encontrar ningún resultado coincidente." + text_empty_state_description: "La %{entity} aún no se ha compartido con nadie." + text_empty_state_header: "No compartido" + text_user_limit_reached: "Añadir usuarios adicionales excederá el límite actual. Póngase en contacto con un administrador para aumentar el límite de usuario para asegurar que los usuarios externos puedan acceder a esta %{entity}." + text_user_limit_reached_admins: 'Añadir usuarios adicionales excederá el límite actual. Por favor, actualice su plan para poder añadir más usuarios.' + warning_user_limit_reached: > + Añadir usuarios adicionales excederá el límite actual. Póngase en contacto con un administrador para aumentar el límite de usuario para asegurar que los usuarios externos puedan acceder a esta %{entity}. + warning_user_limit_reached_admin: > + Añadir usuarios adicionales excederá el límite actual. Por favor, actualice su plan para asegurar que los usuarios externos puedan acceder a esta %{entity}. + warning_no_selected_user: "Por favor, seleccione usuarios para compartir esta %{entity} con" + warning_locked_user: "él usuario %{user} está bloqueado y no se puede compartir con él" user_details: - locked: Usuario bloqueado - invited: 'Invitación enviada. ' - resend_invite: Reenviar. - invite_resent: La invitación ha sido reenviada - not_project_member: No miembro del proyecto - project_group: Los miembros del grupo pueden tener privilegios adicionales (como - miembros del proyecto) - not_project_group: Grupo (compartido con todos los miembros) - additional_privileges_project: Puede tener privilegios adicionales (como miembros - del proyecto) - additional_privileges_group: Puede tener privilegios adicionales (como miembros - de un grupo) - additional_privileges_project_or_group: Puede tener privilegios adicionales - (como miembros del proyecto o de un grupo) + locked: "Usuario bloqueado" + invited: "Invitación enviada. " + resend_invite: "Reenviar." + invite_resent: "La invitación ha sido reenviada" + not_project_member: "No miembro del proyecto" + project_group: "Los miembros del grupo pueden tener privilegios adicionales (como miembros del proyecto)" + not_project_group: "Grupo (compartido con todos los miembros)" + additional_privileges_project: "Puede tener privilegios adicionales (como miembros del proyecto)" + additional_privileges_group: "Puede tener privilegios adicionales (como miembros de un grupo)" + additional_privileges_project_or_group: "Puede tener privilegios adicionales (como miembros del proyecto o de un grupo)" project_queries: - publishing_denied: No tiene permiso para hacer públicas las listas de proyectos. - access_warning: Los usuarios sólo verán los proyectos a los que tienen acceso. - Compartir listas de proyectos no afecta a los permisos individuales del proyecto. + publishing_denied: "No tiene permiso para hacer públicas las listas de proyectos." + access_warning: "Los usuarios sólo verán los proyectos a los que tienen acceso. Compartir listas de proyectos no afecta a los permisos individuales del proyecto." user_details: - owner: Propietario de la lista - can_view_because_public: Ya puede verla porque la lista se comparte con todos - los usuarios - can_manage_public_lists: Puede editar debido a permisos globales + owner: "Propietario de la lista" + can_view_because_public: "Ya puede verla porque la lista se comparte con todos los usuarios" + can_manage_public_lists: "Puede editar debido a permisos globales" public_flag: - label: Compartir con todos en %{instance_name} - caption: Todo el mundo puede ver esta lista de proyectos. Aquellos con permisos - de edición global pueden modificarla. + label: "Compartir con todos en %{instance_name}" + caption: "Todo el mundo puede ver esta lista de proyectos. Aquellos con permisos de edición global pueden modificarla." blank_state: public: - header: Compartido con todos - description: Todo el mundo puede ver esta lista de proyectos. También puede - añadir usuarios individuales con permisos adicionales. + header: "Compartido con todos" + description: "Todo el mundo puede ver esta lista de proyectos. También puede añadir usuarios individuales con permisos adicionales." private: - header: 'No compartida: Privado' - description: Esta lista de proyectos aún no se ha compartido con nadie. - Sólo usted puede acceder a esta lista. + header: "No compartida: Privado" + description: "Esta lista de proyectos aún no se ha compartido con nadie. Sólo usted puede acceder a esta lista." permissions: - view: Ver - view_description: Puede ver esta lista de proyectos. - edit: Editar - edit_description: Puede ver, compartir y editar esta lista de proyectos. + view: "Ver" + view_description: "Puede ver esta lista de proyectos." + edit: "Editar" + edit_description: "Puede ver, compartir y editar esta lista de proyectos." upsell: - message: Compartir listas de proyectos con usuarios individuales es una extensión - Enterprise. + message: "Compartir listas de proyectos con usuarios individuales es una extensión Enterprise." working_days: - info: 'Los días no seleccionados se omiten al programar los paquetes de trabajo - y ciclos de vida de proyectos (y no se incluyen en el recuento de días). Esto - puede anularse a nivel de paquete de trabajo. - - ' - instance_wide_info: 'Las fechas añadidas a la lista siguiente se consideran no - laborables y se omiten al programar los paquetes de trabajo. - - ' - change_button: Cambiar los días laborables - warning: 'Cambiar qué días de la semana se consideran laborables y cuáles no, - puede afectar a las fechas de inicio y fin de todos los paquetes de trabajo - y ciclos de vida en todos los proyectos de esta instancia. - - ' + info: > + Los días no seleccionados se omiten al programar los paquetes de trabajo y ciclos de vida de proyectos (y no se incluyen en el recuento de días). Esto puede anularse a nivel de paquete de trabajo. + instance_wide_info: > + Las fechas añadidas a la lista siguiente se consideran no laborables y se omiten al programar los paquetes de trabajo. + change_button: "Cambiar los días laborables" + warning: > + Cambiar qué días de la semana se consideran laborables y cuáles no, puede afectar a las fechas de inicio y fin de todos los paquetes de trabajo y ciclos de vida en todos los proyectos de esta instancia. journal_note: changed: _**Días laborales** cambiados (%{changes})._ days: @@ -6576,328 +5305,236 @@ es: dates: working: "%{date} es ahora laboral" non_working: "%{date} es ahora no laboral" - nothing_to_preview: Nada para previsualizar + nothing_to_preview: "Nada para previsualizar" api_v3: attributes: - property: Propiedad + property: "Propiedad" errors: - code_400: 'Solicitud errónea: %{message}' - code_401: Tiene que estar autenticado para acceder a este recurso. - code_401_wrong_credentials: No se proporcionaron las credenciales correctas. - code_403: No está autorizado a acceder a este recurso. - code_404: No se pudo encontrar el recurso solicitado. - code_409: No se pudo actualizar el recurso debido a un conflicto de modificaciones. - code_429: Demasiadas solicitudes. Vuelva a intentarlo más tarde. - code_500: Ha ocurrido un error interno. - code_500_outbound_request_failure: Una solicitud de salida a otro recurso ha - fallado con el código de estado %{status_code}. - code_500_missing_enterprise_token: La solicitud no puede ser manejada debido - a un token Enterprise inválido o inexistente. + code_400: "Solicitud errónea: %{message}" + code_401: "Tiene que estar autenticado para acceder a este recurso." + code_401_wrong_credentials: "No se proporcionaron las credenciales correctas." + code_403: "No está autorizado a acceder a este recurso." + code_404: "No se pudo encontrar el recurso solicitado." + code_409: "No se pudo actualizar el recurso debido a un conflicto de modificaciones." + code_429: "Demasiadas solicitudes. Vuelva a intentarlo más tarde." + code_500: "Ha ocurrido un error interno." + code_500_outbound_request_failure: "Una solicitud de salida a otro recurso ha fallado con el código de estado %{status_code}." + code_500_missing_enterprise_token: "La solicitud no puede ser manejada debido a un token Enterprise inválido o inexistente." bad_request: - emoji_reactions_activity_type_not_supported: Este tipo de actividad no admite - reacciones emoji. - invalid_link: El enlace bajo la clave «%{key}» no es válido. - links_not_an_object: _links debe ser un objeto JSON. + emoji_reactions_activity_type_not_supported: "Este tipo de actividad no admite reacciones emoji." + invalid_link: "El enlace bajo la clave «%{key}» no es válido." + links_not_an_object: "_links debe ser un objeto JSON." conflict: - multiple_reminders_not_allowed: Solo puede establecer un recordatorio a la - vez en un paquete de trabajo. Elimine o actualice el recordatorio existente. + multiple_reminders_not_allowed: |- + Solo puede establecer un recordatorio a la vez en un paquete de trabajo. Elimine o actualice el recordatorio existente. not_found: - work_package: No se encuentra el paquete de trabajo que busca, o bien se ha - eliminado. - reminder: No se encuentra el recordatorio que busca, o bien se ha eliminado. + work_package: "No se encuentra el paquete de trabajo que busca, o bien se ha eliminado." + reminder: "No se encuentra el recordatorio que busca, o bien se ha eliminado." expected: - date: AAAA-MM-DD (ISO 8601 fecha solamente) - datetime: YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (cualquier valor de fecha/hora - compatible con el formato ISO 8601) - duration: Duración de la ISO 8601 - invalid_content_type: Se esperaba que el CONTENT-TYPE fuera '%{content_type}' - pero se obtuvo '%{actual}'. - invalid_format: 'Formato inválido para la propiedad ''%{property}'': Formato - esperado como ''%{expected_format}'', pero se recibió ''%{actual}''.' - invalid_json: La solicitud no se pudo analizar como JSON. - invalid_relation: La relación no es válida. - invalid_resource: Para la propiedad '%{property}' se espera un enlace como '%{expected}', - pero obtiene '%{actual}'. + date: "AAAA-MM-DD (ISO 8601 fecha solamente)" + datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (cualquier valor de fecha/hora compatible con el formato ISO 8601)" + duration: "Duración de la ISO 8601" + invalid_content_type: "Se esperaba que el CONTENT-TYPE fuera '%{content_type}' pero se obtuvo '%{actual}'." + invalid_format: "Formato inválido para la propiedad '%{property}': Formato esperado como '%{expected_format}', pero se recibió '%{actual}'." + invalid_json: "La solicitud no se pudo analizar como JSON." + invalid_relation: "La relación no es válida." + invalid_resource: "Para la propiedad '%{property}' se espera un enlace como '%{expected}', pero obtiene '%{actual}'." invalid_signal: - embed: 'No se admite la inserción solicitada de %{invalid}. Inserciones admitidas: - %{supported}' - select: 'No se admite la selección solicitada de %{invalid}. Selecciones admitidas: - %{supported}' - invalid_user_status_transition: El estado actual de la cuenta del usuario no - permite esta operación. - missing_content_type: sin especificar - missing_property: Falta la propiedad «%{property}». - missing_request_body: No hay cuerpo de la solicitud. - missing_or_malformed_parameter: Falta el parámetro '%{parameter}' de la solicitud - o es incorrecto. - multipart_body_error: El cuerpo de la solicitud no contiene las partes multiparts - previstas. - multiple_errors: Múltiples limitaciones de campo han sido violadas. - unable_to_create_attachment: No se pudo crear el adjunto - unable_to_create_attachment_permissions: No se pudo guardar el archivo adjunto - porque faltan permisos del sistema de archivos + embed: "No se admite la inserción solicitada de %{invalid}. Inserciones admitidas: %{supported}" + select: "No se admite la selección solicitada de %{invalid}. Selecciones admitidas: %{supported}" + invalid_user_status_transition: "El estado actual de la cuenta del usuario no permite esta operación." + missing_content_type: "sin especificar" + missing_property: "Falta la propiedad «%{property}»." + missing_request_body: "No hay cuerpo de la solicitud." + missing_or_malformed_parameter: "Falta el parámetro '%{parameter}' de la solicitud o es incorrecto." + multipart_body_error: "El cuerpo de la solicitud no contiene las partes multiparts previstas." + multiple_errors: "Múltiples limitaciones de campo han sido violadas." + unable_to_create_attachment: "No se pudo crear el adjunto" + unable_to_create_attachment_permissions: "No se pudo guardar el archivo adjunto porque faltan permisos del sistema de archivos" user: - name_readonly: El atributo «Nombre» es de solo lectura. Los cambios se pueden - escribir a través de los atributos «Nombre» y «Apellido». + name_readonly: "El atributo «Nombre» es de solo lectura. Los cambios se pueden escribir a través de los atributos «Nombre» y «Apellido»." render: - context_not_parsable: El contexto proporcionado no es un enlace a un recurso. - unsupported_context: El recurso dado no es soportado como contexto. - context_object_not_found: No se ha podido encontrar el recurso dado como el - contexto. + context_not_parsable: "El contexto proporcionado no es un enlace a un recurso." + unsupported_context: "El recurso dado no es soportado como contexto." + context_object_not_found: "No se ha podido encontrar el recurso dado como el contexto." validation: - due_date: La fecha de finalización no se puede establecer en los paquetes - de trabajo principales. - invalid_user_assigned_to_work_package: El usuario elegido no tiene permiso - para ser '%{property}' para este paquete de trabajo. - start_date: La fecha de inicio no puede ser establecida en paquetes de trabajo - padres. + due_date: "La fecha de finalización no se puede establecer en los paquetes de trabajo principales." + invalid_user_assigned_to_work_package: "El usuario elegido no tiene permiso para ser '%{property}' para este paquete de trabajo." + start_date: "La fecha de inicio no puede ser establecida en paquetes de trabajo padres." eprops: - invalid_gzip: 'es un archivo gzip no válido: %{message}' - invalid_json: 'es un archivo JSON no válido: %{message}' + invalid_gzip: "es un archivo gzip no válido: %{message}" + invalid_json: "es un archivo JSON no válido: %{message}" resources: - schema: Esquema + schema: "Esquema" undisclosed: - parent: 'Oculto: el elemento primario no se muestra porque no tiene los permisos - necesarios.' + parent: 'Oculto: el elemento primario no se muestra porque no tiene los permisos necesarios.' project: 'Oculto: el proyecto no se muestra porque no tiene los permisos necesarios.' ancestor: No revelado - El antepasado es invisible por falta de permisos. - definingProject: 'Oculto: el proyecto no se muestra porque no tiene los permisos - necesarios.' + definingProject: 'Oculto: el proyecto no se muestra porque no tiene los permisos necesarios.' doorkeeper: pre_authorization: - status: Pre-autorización - auth_url: URL de autenticación - access_token_url: URL del token de acceso + status: "Pre-autorización" + auth_url: "URL de autenticación" + access_token_url: "URL del token de acceso" errors: messages: + #Common error messages invalid_request: - unknown: Falta un parámetro necesario en la petición, un valor de parámetro - no compatible ha sido añadido, o se encuentra deformado. - missing_param: 'Falta el parámetro requerido: %{value}.' - request_not_authorized: La solicitud debe ser autorizada. El parámetro requerido - para autorizar la solicitud falta o no es válido. - invalid_redirect_uri: El URI de redirección solicitado tiene un formato incorrecto - o no coincide con el URI de redirección del cliente. - unauthorized_client: El cliente no está autorizado a realizar esta petición - usando este método. - access_denied: El propietario de este recurso o servidor de autorización ha - denegado la petición. - invalid_scope: El ámbito solicitado es inválido, desconocido, o está malformado. - invalid_code_challenge_method: El método de desafío del código debe ser simple - o S256. - server_error: El servidor de autorización se encontró con una condición inesperada - que impidió cumplir con la solicitud. - temporarily_unavailable: El servidor de autorización no puede manejar actualmente - la solicitud debido a una sobrecarga temporal o a mantenimiento del servidor. - credential_flow_not_configured: El Flujo de Credenciales de Contraseña para - el Propietario del Recurso ha fallado debido a la desconfiguración de Doorkeeper.configure.resource_owner_from_credentials. - resource_owner_authenticator_not_configured: Fallo al encontrar Propietario - del Recurso debido a la desconfiguración de Doorkeeper.configure.resource_owner_authenticator. - admin_authenticator_not_configured: El acceso al panel de administrador está - prohibido debido a la desconfiguración de Doorkeeper.configure.admin_authenticator. - unsupported_response_type: El servidor de autorización no es compatible con - este tipo de respuesta. - unsupported_response_mode: El servidor de autorización no es compatible con - este tipo de respuesta. - invalid_client: La certificación del cliente ha fallado debido a un cliente - desconocido, omisión del cliente, o un método de certificación no compatible. - invalid_grant: El permiso de autorización proporcionado es inválido, ha sido - revocado, no concuerda con la redirección URI usada en la petición de autorización, - o ha sido otorgada a otro cliente. - unsupported_grant_type: El tipo de permiso de autorización no es compatible - con el servidor de autorización. + unknown: "Falta un parámetro necesario en la petición, un valor de parámetro no compatible ha sido añadido, o se encuentra deformado." + missing_param: "Falta el parámetro requerido: %{value}." + request_not_authorized: "La solicitud debe ser autorizada. El parámetro requerido para autorizar la solicitud falta o no es válido." + invalid_redirect_uri: "El URI de redirección solicitado tiene un formato incorrecto o no coincide con el URI de redirección del cliente." + unauthorized_client: "El cliente no está autorizado a realizar esta petición usando este método." + access_denied: "El propietario de este recurso o servidor de autorización ha denegado la petición." + invalid_scope: "El ámbito solicitado es inválido, desconocido, o está malformado." + invalid_code_challenge_method: "El método de desafío del código debe ser simple o S256." + server_error: "El servidor de autorización se encontró con una condición inesperada que impidió cumplir con la solicitud." + temporarily_unavailable: "El servidor de autorización no puede manejar actualmente la solicitud debido a una sobrecarga temporal o a mantenimiento del servidor." + #Configuration error messages + credential_flow_not_configured: "El Flujo de Credenciales de Contraseña para el Propietario del Recurso ha fallado debido a la desconfiguración de Doorkeeper.configure.resource_owner_from_credentials." + resource_owner_authenticator_not_configured: "Fallo al encontrar Propietario del Recurso debido a la desconfiguración de Doorkeeper.configure.resource_owner_authenticator." + admin_authenticator_not_configured: "El acceso al panel de administrador está prohibido debido a la desconfiguración de Doorkeeper.configure.admin_authenticator." + #Access grant errors + unsupported_response_type: "El servidor de autorización no es compatible con este tipo de respuesta." + unsupported_response_mode: "El servidor de autorización no es compatible con este tipo de respuesta." + #Access token errors + invalid_client: "La certificación del cliente ha fallado debido a un cliente desconocido, omisión del cliente, o un método de certificación no compatible." + invalid_grant: "El permiso de autorización proporcionado es inválido, ha sido revocado, no concuerda con la redirección URI usada en la petición de autorización, o ha sido otorgada a otro cliente." + unsupported_grant_type: "El tipo de permiso de autorización no es compatible con el servidor de autorización." invalid_token: - revoked: El token de acceso ha sido revocado - expired: El token de acceso ha expirado - unknown: El token de acceso es inválido + revoked: "El token de acceso ha sido revocado" + expired: "El token de acceso ha expirado" + unknown: "El token de acceso es inválido" revoke: - unauthorized: No estás autorizado a revocar este token. + unauthorized: "No estás autorizado a revocar este token." forbidden_token: - missing_scope: El acceso a este recurso requiere competencia "%{oauth_scopes}". + missing_scope: 'El acceso a este recurso requiere competencia "%{oauth_scopes}".' unsupported_browser: - title: Tu explorador esta desactualizado y no es compatible. - message: Podrás experimentar errores y una experiencia de mala calidad en esta - página. - update_message: Por favor, actualiza tu navegador. - close_warning: Ignore esta advertencia. + title: "Tu explorador esta desactualizado y no es compatible." + message: "Podrás experimentar errores y una experiencia de mala calidad en esta página." + update_message: "Por favor, actualiza tu navegador." + close_warning: "Ignore esta advertencia." oauth: application: builtin: Aplicación de instancia incorporada confidential: Confidencial - singular: Aplicación OAuth - scopes: Ámbitos - client_credentials: Credenciales de cliente - plural: Aplicaciones OAuth - named: Aplicación OAuth '%{name}' - new: Nueva aplicación OAuth + singular: "Aplicación OAuth" + scopes: "Ámbitos" + client_credentials: "Credenciales de cliente" + plural: "Aplicaciones OAuth" + named: "Aplicación OAuth '%{name}'" + new: "Nueva aplicación OAuth" non_confidential: No confidencial default_scopes: "(Ámbitos por defecto)" instructions: - enabled: Habilite esta aplicación, permitiendo a los usuarios realizar concesiones - de autorización con ella. - name: El nombre de tu aplicación. Se mostrará a otros usuarios tras previa - autorización. - redirect_uri_html: 'Las URLs permitidas a las que los usuarios autorizados - serán redirigidos. Una entrada por línea.
Si estás registrando una - aplicación de escritorio, usa la siguiente URL. - - ' - confidential: Comprueba que la aplicación puede ser usada en donde la clave - de cliente secreta puede seguir siendo confidencial. Las aplicaciones nativas - del móvil y las aplicaciones de páginas particulares se consideran no confidenciales. - scopes: Marque los ámbitos a los que desea que la aplicación otorgue acceso. - Si no se verifica el alcance, api_v3 se supone. - client_credential_user_id: ID de usuario opcional para representar a clientes - que usan esta aplicación. No necesita rellenarse si permites un acceso público - register_intro: Si estás desarrollando una aplicación de cliente API de OAuth - para OpenProject, puedes registrarla usando este formulario para todos los - usuarios. - default_scopes: '' + enabled: "Habilite esta aplicación, permitiendo a los usuarios realizar concesiones de autorización con ella." + name: "El nombre de tu aplicación. Se mostrará a otros usuarios tras previa autorización." + redirect_uri_html: > + Las URLs permitidas a las que los usuarios autorizados serán redirigidos. Una entrada por línea.
Si estás registrando una aplicación de escritorio, usa la siguiente URL. + confidential: "Comprueba que la aplicación puede ser usada en donde la clave de cliente secreta puede seguir siendo confidencial. Las aplicaciones nativas del móvil y las aplicaciones de páginas particulares se consideran no confidenciales." + scopes: "Marque los ámbitos a los que desea que la aplicación otorgue acceso. Si no se verifica el alcance, api_v3 se supone." + client_credential_user_id: "ID de usuario opcional para representar a clientes que usan esta aplicación. No necesita rellenarse si permites un acceso público" + register_intro: "Si estás desarrollando una aplicación de cliente API de OAuth para OpenProject, puedes registrarla usando este formulario para todos los usuarios." + default_scopes: "" header: builtin_applications: Aplicaciones OAuth integradas other_applications: Otras aplicaciones OAuth empty_application_lists: No se ha registrado ninguna aplicación OAuth. - client_id: ID de cliente - client_secret_notice: 'Esta es la única vez que podremos imprimirte la clave de - cliente secreta, por favor apúntalo y mantenlo en un lugar seguro. Debe tratarse - como una contraseña y no puede ser recuperado de OpenProject más adelante. - - ' + client_id: "ID de cliente" + client_secret_notice: > + Esta es la única vez que podremos imprimirte la clave de cliente secreta, por favor apúntalo y mantenlo en un lugar seguro. Debe tratarse como una contraseña y no puede ser recuperado de OpenProject más adelante. authorization_dialog: - authorize: Autorizar - cancel: Cancelar y rechazar autorización. - prompt_html: "¿Quieres autorizar a %{application_name} para - usar tu cuenta %{login}?" - title: Autorizar %{application_name} - wants_to_access_html: 'Esta aplicación solicita acceso a tu cuenta OpenProject. -
Se han solicitado los siguientes permisos: - - ' + authorize: "Autorizar" + cancel: "Cancelar y rechazar autorización." + prompt_html: "¿Quieres autorizar a %{application_name} para usar tu cuenta %{login}?" + title: "Autorizar %{application_name}" + wants_to_access_html: > + Esta aplicación solicita acceso a tu cuenta OpenProject.
Se han solicitado los siguientes permisos: scopes: - api_v3: Acceso API v3 completo - api_v3_text: "La aplicación recibirá acceso completo de lectura y escritura - al Proyecto Abierto API v3 \npara realizar acciones en su nombre." + api_v3: "Acceso API v3 completo" + api_v3_text: "La aplicación recibirá acceso completo de lectura y escritura al Proyecto Abierto API v3 \npara realizar acciones en su nombre." grants: - created_date: Aprobado el - scopes: Permisos - successful_application_revocation: Revocación con éxito de la aplicación %{application_name}. - none_given: No se ha concedido el acceso a tu cuenta de usuario a las aplicaciones - OAuth. + created_date: "Aprobado el" + scopes: "Permisos" + successful_application_revocation: "Revocación con éxito de la aplicación %{application_name}." + none_given: "No se ha concedido el acceso a tu cuenta de usuario a las aplicaciones OAuth." x_active_tokens: - one: un token activo + one: "un token activo" other: "%{count} token/s activo/s" flows: - authorization_code: Flujo de código de autorización - client_credentials: Flujo de credenciales del Cliente - client_credentials: Usuario empleado para credenciales de Cliente - client_credentials_impersonation_set_to: Usuario de credenciales de Cliente establecido - como - client_credentials_impersonation_warning: 'Nota: los Clientes usando el flujo - ''credenciales de Cliente'' de esta aplicación tendrá los derechos de este usuario' - client_credentials_impersonation_html: 'Por defecto, OpenProject proporciona autorización - a OAuth 2.0 a través de %{authorization_code_flow_link}. Puedes activar %{client_credentials_flow_link} - de manera óptima, aunque necesitas aportar un usuario en cuya representación - se harán las peticiones. - - ' - authorization_error: Se ha generado un error de autorización. - revoke_my_application_confirmation: "¿Seguro que quieres eliminar esta aplicación? - Eso suspenderá %{token_count} activos para realizarse." - my_registered_applications: Aplicaciones OAuth Registradas + authorization_code: "Flujo de código de autorización" + client_credentials: "Flujo de credenciales del Cliente" + client_credentials: "Usuario empleado para credenciales de Cliente" + client_credentials_impersonation_set_to: "Usuario de credenciales de Cliente establecido como" + client_credentials_impersonation_warning: "Nota: los Clientes usando el flujo 'credenciales de Cliente' de esta aplicación tendrá los derechos de este usuario" + client_credentials_impersonation_html: > + Por defecto, OpenProject proporciona autorización a OAuth 2.0 a través de %{authorization_code_flow_link}. Puedes activar %{client_credentials_flow_link} de manera óptima, aunque necesitas aportar un usuario en cuya representación se harán las peticiones. + authorization_error: "Se ha generado un error de autorización." + revoke_my_application_confirmation: "¿Seguro que quieres eliminar esta aplicación? Eso suspenderá %{token_count} activos para realizarse." + my_registered_applications: "Aplicaciones OAuth Registradas" oauth_client: urn_connection_status: - connected: Conectado - error: Error - failed_authorization: Error en la autorización - not_connected: No conectado + connected: "Conectado" + error: "Error" + failed_authorization: "Error en la autorización" + not_connected: "No conectado" labels: - label_oauth_integration: Integración de OAuth2 - label_redirect_uri: Redirigir URI - label_request_token: Solicitar token - label_refresh_token: Regenerar token + label_oauth_integration: "Integración de OAuth2" + label_redirect_uri: "Redirigir URI" + label_request_token: "Solicitar token" + label_refresh_token: "Regenerar token" errors: - oauth_authorization_code_grant_had_errors: Error al conceder la autorización - de OAuth2 - oauth_reported: 'Proveedor reportado del OAuth2 ' - oauth_returned_error: 'Hay un error en el OAuth2 ' - oauth_returned_json_error: 'Hay un error de JSON en el OAuth2 ' - oauth_returned_http_error: 'Hay un error de red en el OAuth2 ' - oauth_returned_standard_error: 'Hay un error interno en el OAuth2 ' - wrong_token_type_returned: Tipo de token incorrecto en el OAuth2, se espera - un AccessToken::Bearer - oauth_issue_contact_admin: Hay un error en el OAuth2. Por favor, consulte con - el administrador del sistema. - oauth_client_not_found: Cliente del OAuth2 no encontrado en el punto final 'callback' - (redirect_uri). - refresh_token_called_without_existing_token: 'Error interno: Se ha solicitado - una regeneración del token sin haber un token existente. - - ' - refresh_token_updated_failed: Error durante la actualización del OAuthClientToken - oauth_client_not_found_explanation: 'Este error aparece después de haber actualizado - el client_id y el client_secret en OpenProject, pero no haber actualizado - el campo ''Return URI'' en el proveedor OAuth2. - - ' - oauth_code_not_present: "'Código' OAuth2 no encontrado en el punto final 'callback' - (redirect_uri)." - oauth_code_not_present_explanation: 'Este error aparece si se ha seleccionado - el response_type incorrecto en el proveedor OAuth2. El response_type debe - ser ''Código'' o similar. - - ' - oauth_state_not_present: El 'estado' del OAuth2 no encontrado en el punto final - 'callback' (redirect_uri). - oauth_state_not_present_explanation: 'El ''estado'' se utiliza para indicar - a OpenProject donde continuar después de autentificar correctamente el OAuth2. - Sin el ''estado'' es probable que se produzca un error durante la configuración. - Por favor, contacte con su administrador de sistema. - - ' + oauth_authorization_code_grant_had_errors: "Error al conceder la autorización de OAuth2" + oauth_reported: "Proveedor reportado del OAuth2 " + oauth_returned_error: "Hay un error en el OAuth2 " + oauth_returned_json_error: "Hay un error de JSON en el OAuth2 " + oauth_returned_http_error: "Hay un error de red en el OAuth2 " + oauth_returned_standard_error: "Hay un error interno en el OAuth2 " + wrong_token_type_returned: "Tipo de token incorrecto en el OAuth2, se espera un AccessToken::Bearer" + oauth_issue_contact_admin: "Hay un error en el OAuth2. Por favor, consulte con el administrador del sistema." + oauth_client_not_found: "Cliente del OAuth2 no encontrado en el punto final 'callback' (redirect_uri)." + refresh_token_called_without_existing_token: > + Error interno: Se ha solicitado una regeneración del token sin haber un token existente. + refresh_token_updated_failed: "Error durante la actualización del OAuthClientToken" + oauth_client_not_found_explanation: > + Este error aparece después de haber actualizado el client_id y el client_secret en OpenProject, pero no haber actualizado el campo 'Return URI' en el proveedor OAuth2. + oauth_code_not_present: "'Código' OAuth2 no encontrado en el punto final 'callback' (redirect_uri)." + oauth_code_not_present_explanation: > + Este error aparece si se ha seleccionado el response_type incorrecto en el proveedor OAuth2. El response_type debe ser 'Código' o similar. + oauth_state_not_present: "El 'estado' del OAuth2 no encontrado en el punto final 'callback' (redirect_uri)." + oauth_state_not_present_explanation: > + El 'estado' se utiliza para indicar a OpenProject donde continuar después de autentificar correctamente el OAuth2. Sin el 'estado' es probable que se produzca un error durante la configuración. Por favor, contacte con su administrador de sistema. rack_oauth2: - client_secret_invalid: La clave de cliente secreta no es válida (client_secret_invalid) - invalid_request: 'El servidor de autorización de OAuth2 respondió con ''invalid_request''. - Este error aparece si intenta autorizar varias veces o en caso de problemas - técnicos. - - ' - invalid_response: El servidor de autorización de OAuth2 respondió de forma - inválida (invalid_request) - invalid_grant: El servidor de autorización de OAuth2 necesita que se autorice - de nuevo (invalid_grant) - invalid_client: El servidor de autorización de OAuth2 no reconoce OpenProject - (invalid_client). - unauthorized_client: El servidor de autorización de OAuth2 no acepta el tipo - de garantía (unauthorized_client) - unsupported_grant_type: El servidor de autorización de OAuth2 pide que actualice - de nuevo (unsupported_grant_type) - invalid_scope: No tienes permisos para acceder a este recurso (invalid_scope). + client_secret_invalid: "La clave de cliente secreta no es válida (client_secret_invalid)" + invalid_request: > + El servidor de autorización de OAuth2 respondió con 'invalid_request'. Este error aparece si intenta autorizar varias veces o en caso de problemas técnicos. + invalid_response: "El servidor de autorización de OAuth2 respondió de forma inválida (invalid_request)" + invalid_grant: "El servidor de autorización de OAuth2 necesita que se autorice de nuevo (invalid_grant)" + invalid_client: "El servidor de autorización de OAuth2 no reconoce OpenProject (invalid_client)." + unauthorized_client: "El servidor de autorización de OAuth2 no acepta el tipo de garantía (unauthorized_client)" + unsupported_grant_type: "El servidor de autorización de OAuth2 pide que actualice de nuevo (unsupported_grant_type)" + invalid_scope: "No tienes permisos para acceder a este recurso (invalid_scope)." http: request: - failed_authorization: La solicitud por parte del servidor no se pudo autorizar - a sí misma. - missing_authorization: La solicitud por parte del servidor ha fallado debido - a la falta información de autorización. + failed_authorization: "La solicitud por parte del servidor no se pudo autorizar a sí misma." + missing_authorization: "La solicitud por parte del servidor ha fallado debido a la falta información de autorización." response: - unexpected: Se ha recibido una respuesta inesperada. + unexpected: "Se ha recibido una respuesta inesperada." you: su usuario link: enlace plugin_openproject_auth_plugins: - name: Plugins Auth de OpenProject - description: Integración de los proveedores de estrategia de OmniAuth para la - autentificación en OpenProject. + name: "Plugins Auth de OpenProject" + description: "Integración de los proveedores de estrategia de OmniAuth para la autentificación en OpenProject." plugin_openproject_auth_saml: - name: OmniAuth SAML / Inicio de sesión único - description: Añade el proveedor OmniAuth SAML a OpenProject + name: "OmniAuth SAML / Inicio de sesión único" + description: "Añade el proveedor OmniAuth SAML a OpenProject" enterprise_plans: - legacy_enterprise: Plan Enterprise + legacy_enterprise: "Plan Enterprise" token: hashed_token: display_value_placeholder: "***" external_link_warning: - title: Salir de OpenProject - warning_message: Está a punto de salir de OpenProject y visitar un sitio web externo. - Tenga en cuenta que los sitios web externos no están bajo nuestro control y - pueden tener políticas de privacidad y seguridad diferentes. + title: "Salir de OpenProject" + warning_message: "Está a punto de salir de OpenProject y visitar un sitio web externo. Tenga en cuenta que los sitios web externos no están bajo nuestro control y pueden tener políticas de privacidad y seguridad diferentes." continue_message: "¿Seguro que desea visitar el siguiente enlace externo?" - continue_button: Continuar al sitio web externo + continue_button: "Continuar al sitio web externo" diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 449c364eb7f..93b8567adff 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -231,7 +231,7 @@ fr: title: "Portée de l'importation" caption: "Choisissez ce que vous voulez importer dans OpenProject" caption_done: "Terminé" - 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." + label_info: "Veuillez noter que cet outil d'importation est en version bêta et qu'il ne peut pas importer tous les types de données. Voici un résumé de ce que l'instance Jira hôte offre pour l'importation et de ce que cet outil est capable d'importer pour le moment." description: "Sélectionnez les données que vous souhaitez importer parmi les données disponibles extraites de l'instance Jira hôte." label_available_data: "Données disponibles" label_not_available_data: "Indisponibles pour l'importation" @@ -273,11 +273,11 @@ fr: select_dialog: filter_projects: "Filtrer par texte" import_dialog: - title: "Start this import?" - confirm_button: "Start import" + title: "Commencer cette importation ?" + confirm_button: "Démarrer l'importation" description: > - This importer is an alpha feature. It is not yet able to import all data from Jira and might leave incomplete data on this OpenProject instance. Do not use a production environment and create a backup of your OpenProject data before starting. - confirm: "I understand and made the necessary preparations" + Cet importateur est une fonctionnalité alpha. Il n'est pas encore capable d'importer toutes les données de Jira et peut laisser des données incomplètes sur cette instance d'OpenProject. N'utilisez pas d'environnement de production et créez une sauvegarde de vos données OpenProject avant de commencer. + confirm: "Je comprends et j'ai fait les préparatifs nécessaires" revert_dialog: title: "Annuler définitivement cette importation ?" description: "Cette opération supprimera tous les objets importés (y compris les projets entiers), même s'il y a eu une activité de l'utilisateur dans ces projets après l'importation dans OpenProject." @@ -3083,7 +3083,7 @@ fr: line_0: Flux de travail d'IA avec un serveur MCP sécurisé (abonnements Professional et supérieurs) line_1: Amélioration de la page d'accueil du projet avec un nouveau widget pour les budgets et amélioration de l'accessibilité line_2: "Réunions : modèles de réunion (abonnements Basic et supérieurs)" - line_3: Better transparency with project attribute comments + line_3: Meilleure transparence avec les commentaires sur les attributs de projet line_4: Amélioration de l'exportation PDF line_5: Sécurité accrue pour les liens externes (à partir de l'abonnement Premium) line_6: Améliorations UI/UX dans le module Backlogs diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index a51b2309511..772c804f3a5 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -231,7 +231,7 @@ it: title: "Importa ambito" caption: "Scegli cosa vuoi importare in OpenProject" caption_done: "Completato" - 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." + label_info: "Tieni presente che questo strumento di importazione è in versione beta e non può importare tutti i tipi di dati. Ecco un riepilogo di ciò che l'istanza host di Jira offre per l'importazione e di ciò che questo strumento è in grado di importare al momento." description: "Seleziona i dati che desideri importare tra quelli disponibili recuperati dall'istanza host di Jira." label_available_data: "Dati disponibili" label_not_available_data: "Non disponibile per l'importazione" @@ -273,11 +273,11 @@ it: select_dialog: filter_projects: "Filtro testo" import_dialog: - title: "Start this import?" - confirm_button: "Start import" + title: "Iniziare questa importazione?" + confirm_button: "Avvia l'importazione" description: > - This importer is an alpha feature. It is not yet able to import all data from Jira and might leave incomplete data on this OpenProject instance. Do not use a production environment and create a backup of your OpenProject data before starting. - confirm: "I understand and made the necessary preparations" + Questa funzionalità di importazione è in versione alpha. Non è ancora in grado di importare tutti i dati da Jira e potrebbe lasciare dati incompleti su questa istanza di OpenProject. Non utilizzare un ambiente di produzione e crea un backup dei dati di OpenProject prima di iniziare. + confirm: "Ho capito e confermo di aver finalizzato i preparativi necessari" revert_dialog: title: "Annullare definitivamente questa importazione?" description: "Questa operazione eliminerà tutti gli oggetti importati (inclusi interi progetti), anche se è stata rilevata attività utente in tali progetti dopo l'importazione su OpenProject." @@ -3082,7 +3082,7 @@ it: line_0: Flussi di lavoro IA con un server MCP sicuro (piano Professional e superiori) line_1: Migliorata la home page del progetto con un nuovo widget per i budget e una migliore accessibilità line_2: "Riunioni: modelli di riunione (piano Basic e superiore)" - line_3: Better transparency with project attribute comments + line_3: Maggiore trasparenza con i commenti sugli attributi del progetto line_4: Miglioramenti all'esportazione di PDF line_5: Maggiore sicurezza per i link esterni (piano Premium e superiori) line_6: Miglioramenti UI/UX nel modulo Backlog diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 04928f3523f..fd3382ce9fb 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -1,4 +1,24 @@ ---- +#-- 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. +#++ ko: no_results_title_text: 표시할 내용이 없습니다. activities: @@ -7,14 +27,14 @@ ko: work_packages: activity_tab: no_results_title_text: 표시할 활동 없음 - no_results_description_text: 모든 활동과 코멘트를 표시하려면 '모두 표시'를 선택합니다 - label_activity_show_all: 모두 표시 - label_activity_show_only_comments: 코멘트만 표시 - label_activity_show_only_changes: 변경 사항만 표시 - label_sort_asc: 오래된 순 - label_sort_desc: 최신 순 - label_type_to_comment: 코멘트를 추가하세요. 사람들에게 알려주려면 @을 입력하세요. - label_submit_comment: 코멘트 제출 + no_results_description_text: '모든 활동과 코멘트를 표시하려면 ''모두 표시''를 선택합니다' + label_activity_show_all: "모두 표시" + label_activity_show_only_comments: "코멘트만 표시" + label_activity_show_only_changes: "변경 사항만 표시" + label_sort_asc: "오래된 순" + label_sort_desc: "최신 순" + label_type_to_comment: "코멘트를 추가하세요. 사람들에게 알려주려면 @을 입력하세요." + label_submit_comment: "코멘트 제출" label_who: 누구인가요? changed_on: "- 변경함:" created_on: "- 이 패키지를 생성함:" @@ -25,157 +45,149 @@ ko: internal_journal: 내부 코멘트는 제한된 멤버 그룹에게만 표시됩니다. unsaved_changes_confirmation_message: 저장하지 않은 변경 사항이 있습니다. 편집기를 닫으시겠습니까? internal_comment_confirmation: - title: 이 코멘트를 공개로 지정하시겠습니까? - heading: 이 코멘트를 공개로 지정하시겠습니까? - description: 이 작업 패키지에 액세스할 수 있는 모든 사용자에게 코멘트가 표시됩니다. 계속하시겠습니까? - confirm_button_text: 공개로 설정 + title: "이 코멘트를 공개로 지정하시겠습니까?" + heading: "이 코멘트를 공개로 지정하시겠습니까?" + description: "이 작업 패키지에 액세스할 수 있는 모든 사용자에게 코멘트가 표시됩니다. 계속하시겠습니까?" + confirm_button_text: "공개로 설정" admin: plugins: no_results_title_text: 현재 설치된 플러그인이 없습니다. no_results_content_text: 자세한 내용은 통합 및 플러그인 페이지를 참조하세요. custom_styles: - color_theme: 컬러 테마 + color_theme: "컬러 테마" color_theme_custom: "(사용자 지정)" - tab_interface: 인터페이스 - tab_branding: 브랜딩 - tab_pdf_export_styles: PDF 내보내기 스타일 - tab_pdf_export_font: PDF 내보내기 글꼴 + tab_interface: "인터페이스" + tab_branding: "브랜딩" + tab_pdf_export_styles: "PDF 내보내기 스타일" + tab_pdf_export_font: "PDF 내보내기 글꼴" fonts: file_too_large: "- 너무 큽니다(최대 크기 %{count}MB)." file_is_invalid: "- 유효한 TTF 글꼴 파일이 아닙니다." colors: - primary-button-color: 기본 버튼 - accent-color: 강조 색 - header-bg-color: 헤더 배경 - main-menu-bg-color: 기본 메뉴 배경 - main-menu-bg-selected-background: 선택할 때 기본 메뉴 - custom_colors: 사용자 정의 색상 - manage_colors: 색상 선택 옵션 편집 + primary-button-color: "기본 버튼" + accent-color: "강조 색" + header-bg-color: "헤더 배경" + main-menu-bg-color: "기본 메뉴 배경" + main-menu-bg-selected-background: "선택할 때 기본 메뉴" + custom_colors: "사용자 정의 색상" + manage_colors: "색상 선택 옵션 편집" instructions: - primary-button-color: 강한 강조 색은 화면의 가장 중요한 버튼에 사용됩니다. - accent-color: 링크 및 기타 적절하게 강조 표시된 요소의 색상을 지정하세요. - main-menu-bg-color: 왼쪽 메뉴의 배경색입니다. + primary-button-color: "강한 강조 색은 화면의 가장 중요한 버튼에 사용됩니다." + accent-color: "링크 및 기타 적절하게 강조 표시된 요소의 색상을 지정하세요." + main-menu-bg-color: "왼쪽 메뉴의 배경색입니다." theme_warning: 테마를 변경하면 사용자 정의 스타일을 덮어 씁니다. 그러면 디자인이 손실됩니다. 너 정말 계속하고 싶니? enterprise: delete_dialog: - title: Enterprise 토큰 삭제 - heading: 이 Enterprise 토큰을 삭제하시겠습니까? - confirmation: 이 Enterprise Edition 지원 토큰을 삭제하시겠습니까? + title: "Enterprise 토큰 삭제" + heading: "이 Enterprise 토큰을 삭제하시겠습니까?" + confirmation: "이 Enterprise Edition 지원 토큰을 삭제하시겠습니까?" create_dialog: - title: Enterprise 토큰 추가 - type_token_text: 내 Enterprise 토큰 텍스트 - token_placeholder: 여기에 Enterprise Edition 지원 토큰을 붙여넣으세요 - token_caption: Enterprise 버전을 활성화하는 방법에 대해 자세히 알아보려면 [설명서](docs_url )를 참조하세요. - add_token: Enterprise edition 지원 토큰을 업로드하세요. - replace_token: 당신의 현재 지원 토큰을 바꾸세요. - order: Enterprise on-premises edition 주문하기 - paste: Enterprise edition 지원 토큰을 붙여넣으세요. - required_for_feature: 이 기능은 활성화된 Enterprise edition 지원 토큰에서만 사용 가능합니다. - enterprise_link: 더 자세한 내용은 여기를 클릭하세요. - start_trial: 무료 평가판 시작 - book_now: 지금 예약 - get_quote: 견적 받기 + title: "Enterprise 토큰 추가" + type_token_text: "내 Enterprise 토큰 텍스트" + token_placeholder: "여기에 Enterprise Edition 지원 토큰을 붙여넣으세요" + token_caption: "Enterprise 버전을 활성화하는 방법에 대해 자세히 알아보려면 [설명서](docs_url )를 참조하세요." + add_token: "Enterprise edition 지원 토큰을 업로드하세요." + replace_token: "당신의 현재 지원 토큰을 바꾸세요." + order: "Enterprise on-premises edition 주문하기" + paste: "Enterprise edition 지원 토큰을 붙여넣으세요." + required_for_feature: "이 기능은 활성화된 Enterprise edition 지원 토큰에서만 사용 가능합니다." + enterprise_link: "더 자세한 내용은 여기를 클릭하세요." + start_trial: "무료 평가판 시작" + book_now: "지금 예약" + get_quote: "견적 받기" buttons: - upgrade: 지금 업그레이드 - contact: 당사에 데모 요청하기 + upgrade: "지금 업그레이드" + contact: "당사에 데모 요청하기" status: - expired: 만료됨 - expiring_soon: 곧 만료 예정 - in_grace_period: 유예 기간 중 - invalid_domain: 유효하지 않은 도메인 - not_active: 활성화되지 않음 - trial: 평가판 + expired: "만료됨" + expiring_soon: "곧 만료 예정" + in_grace_period: "유예 기간 중" + invalid_domain: "유효하지 않은 도메인" + not_active: "활성화되지 않음" + trial: "평가판" jemalloc_allocator: Jemalloc 메모리 할당기 journal_aggregation: explanation: - text: '사용자의 개별 작업(예: 작업 패키지를 두 번 업데이트)은 연령 차이가 지정된 기간 미만인 경우 단일 작업으로 집계됩니다. - 애플리케이션 내에서 단일 작업으로 표시됩니다. 또한 이는 전송되는 이메일 수를 줄이는 동일한 시간만큼 알림을 지연시키고 %{webhook_link} - 지연에도 영향을 미칩니다.' - link: webhook + text: "사용자의 개별 작업(예: 작업 패키지를 두 번 업데이트)은 연령 차이가 지정된 기간 미만인 경우 단일 작업으로 집계됩니다. 애플리케이션 내에서 단일 작업으로 표시됩니다. 또한 이는 전송되는 이메일 수를 줄이는 동일한 시간만큼 알림을 지연시키고 %{webhook_link} 지연에도 영향을 미칩니다." + link: "webhook" import: - title: 가져오기 + title: "가져오기" jira: - title: Jira 가져오기 - description: 이 도구를 사용하여 Jira 인스턴스에서 데이터를 가져옵니다. 여러 Jira 호스트를 구성하고 가져오기 실행 각각에서 - 가져올 항목을 선택할 수 있습니다. + title: "Jira 가져오기" + description: "이 도구를 사용하여 Jira 인스턴스에서 데이터를 가져옵니다. 여러 Jira 호스트를 구성하고 가져오기 실행 각각에서 가져올 항목을 선택할 수 있습니다." errors: - cannot_delete_with_imports: 기존 가져오기가 있는 Jira 호스트는 삭제할 수 없습니다 + cannot_delete_with_imports: "기존 가져오기가 있는 Jira 호스트는 삭제할 수 없습니다" blank: - title: 아직 구성된 Jira 호스트 없음 - description: Jira에서 이 OpenProject 인스턴스로 항목 가져오기를 시작하려면 Jira 호스트를 구성합니다. + title: "아직 구성된 Jira 호스트 없음" + description: "Jira에서 이 OpenProject 인스턴스로 항목 가져오기를 시작하려면 Jira 호스트를 구성합니다." configuration: - title: Jira 구성 - new: 새 구성 + title: "Jira 구성" + new: "새 구성" banner: - title: 제한된 가져오기 - description: 이 가져오기 도구는 현재 베타 버전이며 프로젝트, 이슈(이름, 제목, 설명, 첨부 파일), 사용자(이름, 이메일, - 프로젝트 멤버십), 상태 및 유형과 같은 기본 데이터만 가져올 수 있습니다. 워크플로, 사용자 지정 필드, 이슈 관계 또는 권한은 - 가져올 수 없습니다. Jira Server/Data Center 버전 10.x 및 11.x만 현재 지원합니다. 클라우드 인스턴스는 - 현재 지원되지 않습니다. + title: "제한된 가져오기" + description: "이 가져오기 도구는 현재 베타 버전이며 프로젝트, 이슈(이름, 제목, 설명, 첨부 파일), 사용자(이름, 이메일, 프로젝트 멤버십), 상태 및 유형과 같은 기본 데이터만 가져올 수 있습니다. 워크플로, 사용자 지정 필드, 이슈 관계 또는 권한은 가져올 수 없습니다. Jira Server/Data Center 버전 10.x 및 11.x만 현재 지원합니다. 클라우드 인스턴스는 현재 지원되지 않습니다." form: fields: - name: 이름 - url: Jira 서버/데이터 센터 URL - personal_access_token: 개인 액세스 토큰 - button_add: 구성 추가 - button_save: 구성 저장 - button_test: 구성 테스트 - button_delete_token: 토큰 삭제 - delete_token_confirm: 토큰을 삭제하시겠습니까? 그러면 Jira 연결이 비활성화됩니다. - label_testing: 구성 테스트 중... - token_deleted: 토큰이 삭제되었습니다. + name: "이름" + url: "Jira 서버/데이터 센터 URL" + personal_access_token: "개인 액세스 토큰" + button_add: "구성 추가" + button_save: "구성 저장" + button_test: "구성 테스트" + button_delete_token: "토큰 삭제" + delete_token_confirm: "토큰을 삭제하시겠습니까? 그러면 Jira 연결이 비활성화됩니다." + label_testing: "구성 테스트 중..." + token_deleted: "토큰이 삭제되었습니다." test: success: "%{server}(버전 %{version})에 연결되었습니다" - failed: '연결 실패: 서버 정보를 검색할 수 없습니다' - error: 연결을 테스트하는 동안 예기치 않은 오류가 발생했습니다 - connection_error: '연결 오류: %{message}' - parse_error: 서버에서 응답을 구문 분석하지 못했습니다. 서버가 유효한 Jira 인스턴스가 아닐 수 있습니다. - api_error: Jira API가 오류 상태 %{status}을(를) 반환했습니다. Jira 인스턴스 URL 및 API 토큰을 확인하세요. - token_error: 잘못된 API 토큰입니다. 구성에서 자격 증명을 확인하세요. - missing_credentials: URL과 개인 액세스 토큰을 모두 제공하여 연결을 테스트하세요 - invalid_url: 유효한 URL을 제공하세요 + failed: "연결 실패: 서버 정보를 검색할 수 없습니다" + error: "연결을 테스트하는 동안 예기치 않은 오류가 발생했습니다" + connection_error: "연결 오류: %{message}" + parse_error: "서버에서 응답을 구문 분석하지 못했습니다. 서버가 유효한 Jira 인스턴스가 아닐 수 있습니다." + api_error: "Jira API가 오류 상태 %{status}을(를) 반환했습니다. Jira 인스턴스 URL 및 API 토큰을 확인하세요." + token_error: "잘못된 API 토큰입니다. 구성에서 자격 증명을 확인하세요." + missing_credentials: "URL과 개인 액세스 토큰을 모두 제공하여 연결을 테스트하세요" + invalid_url: "유효한 URL을 제공하세요" client: - connection_error: 'Jira 서버에 연결하지 못했습니다: %{message}' - connection_timeout: 'Jira 서버에 연결이 시간 초과되었습니다: %{message}' - parse_error: 'Jira API 응답을 구문 분석하지 못했습니다: %{message}' - api_error: Jira API가 오류 상태 %{status}을(를) 반환했습니다 + connection_error: "Jira 서버에 연결하지 못했습니다: %{message}" + connection_timeout: "Jira 서버에 연결이 시간 초과되었습니다: %{message}" + parse_error: "Jira API 응답을 구문 분석하지 못했습니다: %{message}" + api_error: "Jira API가 오류 상태 %{status}을(를) 반환했습니다" columns: - projects: 프로젝트 - last_change: 마지막 변경 - added: 추가됨 + projects: "프로젝트" + last_change: "마지막 변경" + added: "추가됨" label_ago: "%{amount} 전" run: - title: 가져오기 실행 - history: 기록 - remove_error: Jira 가져오기는 실행되는 동안 제거할 수 없습니다 - import_blocked_error: 다른 Jira 가져오기 실행이 현재 진행 중이거나 검토를 기다리는 중입니다. 새 가져오기를 시작하기 - 전에 완료하거나 되돌리세요. + title: "가져오기 실행" + history: "기록" + remove_error: "Jira 가져오기는 실행되는 동안 제거할 수 없습니다" + import_blocked_error: "다른 Jira 가져오기 실행이 현재 진행 중이거나 검토를 기다리는 중입니다. 새 가져오기를 시작하기 전에 완료하거나 되돌리세요." blank: - title: 가져오기 실행이 아직 설정되지 않음 - description: 가져오기 실행을 만들어서 이 Jira 인스턴스에서 정보 가져오기를 시작하세요 + title: "가져오기 실행이 아직 설정되지 않음" + description: "가져오기 실행을 만들어서 이 Jira 인스턴스에서 정보 가져오기를 시작하세요" index: - description: 가져오기를 실행할 때마다 다른 데이터 세트를 가져올 수 있습니다. 검토 모드에서 가져오기 실행은 직후에 실행 - 취소할 수 있지만 완료한 후에는 실행 취소할 수 없습니다. - button_import_run: 가져오기 실행 - button_edit_configuration: 구성 편집 + description: "가져오기를 실행할 때마다 다른 데이터 세트를 가져올 수 있습니다. 검토 모드에서 가져오기 실행은 직후에 실행 취소할 수 있지만 완료한 후에는 실행 취소할 수 없습니다." + button_import_run: "가져오기 실행" + button_edit_configuration: "구성 편집" status: - initial: 시작 - instance_meta_fetching: 메타 데이터를 가져오는 중 - instance_meta_error: 메타 데이터를 가져오는 중에 오류 발생 - instance_meta_done: 메타 데이터 가져옴 - configuring: 범위 선택 - projects_meta_fetching: 프로젝트 데이터를 가져오는 중 - projects_meta_error: 프로젝트 데이터를 가져오는 중에 오류 발생 - projects_meta_done: 데이터 수집함 - importing: 진행 중 - import_error: 가져오는 중에 오류 발생 - imported: 검토 모드 - reverting: 되돌리는 중 - revert_error: 되돌리는 중에 오류 발생 - reverted: 되돌림 - completed: 완료됨 + initial: "시작" + instance_meta_fetching: "메타 데이터를 가져오는 중" + instance_meta_error: "메타 데이터를 가져오는 중에 오류 발생" + instance_meta_done: "메타 데이터 가져옴" + configuring: "범위 선택" + projects_meta_fetching: "프로젝트 데이터를 가져오는 중" + projects_meta_error: "프로젝트 데이터를 가져오는 중에 오류 발생" + projects_meta_done: "데이터 수집함" + importing: "진행 중" + import_error: "가져오는 중에 오류 발생" + imported: "검토 모드" + reverting: "되돌리는 중" + revert_error: "되돌리는 중에 오류 발생" + reverted: "되돌림" + completed: "완료됨" wizard: - button_retry: 다시 시도 + button_retry: "다시 시도" parts: projects: other: "%{count}개 프로젝트" @@ -191,234 +203,209 @@ ko: other: "%{count}명 사용자" groups: fetch: - title: 기본 데이터 가져오기 + title: "기본 데이터 가져오기" groups_and_users: - title: 그룹 및 사용자 + title: "그룹 및 사용자" configuration: - title: 가져오기 구성 + title: "가져오기 구성" confirming: - title: 확인 및 가져오기 + title: "확인 및 가져오기" review: - title: 가져오기 검토 + title: "가져오기 검토" sections: fetch_data: - title: 인스턴스 메타 데이터 가져오기 - caption_done: 완료됨 - description: 호스트 Jira 인스턴스에서 가져올 수 있는 데이터를 확인하세요. - button_fetch: 사용 가능한 데이터 확인 - label_progress: Jira에서 데이터를 가져오는 중... + title: "인스턴스 메타 데이터 가져오기" + caption_done: "완료됨" + description: "호스트 Jira 인스턴스에서 가져올 수 있는 데이터를 확인하세요." + button_fetch: "사용 가능한 데이터 확인" + label_progress: "Jira에서 데이터를 가져오는 중..." groups_and_users: - title: 그룹 및 사용자 + title: "그룹 및 사용자" import_scope: - title: 가져오기 범위 - caption: OpenProject로 가져올 항목을 선택합니다 - caption_done: 완료됨 - label_info: 이 가져오기 도구는 베타 버전이며 일부 유형의 데이터를 가져올 수 없다는 점에 유의하세요. 호스트 Jira - 인스턴스 URL에서 가져오기용으로 제공하는 항목과 이 도구에서 현재 가져올 수 있는 항목에 대한 요약은 다음과 같습니다. - description: 호스트 Jira 인스턴스에서 가져온 사용 가능한 데이터에서 가져올 데이터를 선택합니다. - label_available_data: 사용 가능한 데이터 - label_not_available_data: 가져오기에 사용할 수 없음 - button_select_projects: 가져올 프로젝트 선택 - button_continue: 계속 - label_import: 가져올 프로젝트를 선택합니다. - button_select: 프로젝트 선택 - label_selected_data: 가져올 데이터 선택함 - label_progress: Jira에서 데이터를 가져오는 중... + title: "가져오기 범위" + caption: "OpenProject로 가져올 항목을 선택합니다" + caption_done: "완료됨" + label_info: "이 가져오기 도구는 베타 버전이며 일부 유형의 데이터를 가져올 수 없다는 점에 유의하세요. 호스트 Jira 인스턴스에서 가져오기용으로 제공하는 항목과 이 도구에서 현재 가져올 수 있는 항목에 대한 요약은 다음과 같습니다." + description: "호스트 Jira 인스턴스에서 가져온 사용 가능한 데이터에서 가져올 데이터를 선택합니다." + label_available_data: "사용 가능한 데이터" + label_not_available_data: "가져오기에 사용할 수 없음" + button_select_projects: "가져올 프로젝트 선택" + button_continue: "계속" + label_import: "가져올 프로젝트를 선택합니다." + button_select: "프로젝트 선택" + label_selected_data: "가져올 데이터 선택함" + label_progress: "Jira에서 데이터를 가져오는 중..." elements: - relations: 이슈 간의 관계 - workflows: 프로젝트 수준 워크플로 - users: 사용자 - sprints: 스프린트 - schemes: 스키마 - permissions: 사용자, 그룹 및 프로젝트 권한 + relations: "이슈 간의 관계" + workflows: "프로젝트 수준 워크플로" + users: "사용자" + sprints: "스프린트" + schemes: "스키마" + permissions: "사용자, 그룹 및 프로젝트 권한" confirm_import: - title: 데이터 가져오기 - caption: 가져오기 설정을 검토하고 가져오기를 시작합니다 - caption_done: 완료됨 - label_available_data: 가져올 수 있는 데이터 - button_start: 가져오기 시작 - description: 다음 설정으로 가져오기 실행을 시작하려고 합니다. - label_progress: 가져오기 진행 중... - label_import_data: 현재 가져오는 중 + title: "데이터 가져오기" + caption: "가져오기 설정을 검토하고 가져오기를 시작합니다" + caption_done: "완료됨" + label_available_data: "가져올 수 있는 데이터" + button_start: "가져오기 시작" + description: "다음 설정으로 가져오기 실행을 시작하려고 합니다." + label_progress: "가져오기 진행 중..." + label_import_data: "현재 가져오는 중" import_result: - title: 가져오기 실행 결과 - caption: 가져오기 실행 검토 또는 가져오기 되돌리기 - info: 가져오기 실행에 성공했습니다. - label_results: 가져옴 - label_revert: 가져오기 되돌리기 - button_revert: 가져오기 되돌리기 - button_done: 가져오기 완료 - preview_description: 가져온 데이터는 현재 검토 모드에 있습니다. 가져오기를 영구적으로 적용하려면 "가져오기 - 완료"를 클릭하고, 가져오기 실행에서 변경된 모든 사항을 취소하려면 "가져오기 되돌리기"를 클릭합니다. - label_finalizing_progress: 가져오기를 완료하는 중... - label_finalized: 가져오기가 완료되었습니다. - label_revert_progress: 가져오기를 되돌리는 중... - label_reverted: 가져오기를 되돌렸습니다. + title: "가져오기 실행 결과" + caption: "가져오기 실행 검토 또는 가져오기 되돌리기" + info: "가져오기 실행에 성공했습니다." + label_results: "가져옴" + label_revert: "가져오기 되돌리기" + button_revert: "가져오기 되돌리기" + button_done: "가져오기 완료" + preview_description: '가져온 데이터는 현재 검토 모드에 있습니다. 가져오기를 영구적으로 적용하려면 "가져오기 완료"를 클릭하고, 가져오기 실행에서 변경된 모든 사항을 취소하려면 "가져오기 되돌리기"를 클릭합니다.' + label_finalizing_progress: "가져오기를 완료하는 중..." + label_finalized: "가져오기가 완료되었습니다." + label_revert_progress: "가져오기를 되돌리는 중..." + label_reverted: "가져오기를 되돌렸습니다." select_dialog: - filter_projects: 텍스트로 필터링 - revert_dialog: - title: 이 가져오기를 영구적으로 되돌리시겠습니까? - description: 이렇게 하면 OpenProject의 가져오기 후 해당 프로젝트에 사용자 활동이 있더라도 가져온 모든 개체(전체 - 프로젝트 포함)가 삭제됩니다. - confirm: 이 되돌리기를 통해 데이터가 영구적으로 삭제됨을 이해합니다 - finalize_dialog: - title: 이 가져오기를 완료하시겠습니까? - description: 가져오기가 완료되면 더 이상 되돌릴 수 없습니다. 가져온 모든 데이터는 영구적으로 가져오게 됩니다. - confirm: 이 작업을 취소할 수 없음을 이해합니다. - confirm_button: 이해함 - select_projects: - title: 프로젝트 선택 + filter_projects: "텍스트로 필터링" import_dialog: - title: Start this import? - confirm_button: Start import - description: 'This importer is an alpha feature. It is not yet able to - import all data from Jira and might leave incomplete data on this OpenProject - instance. Do not use a production environment and create a backup - of your OpenProject data before starting. - - ' - confirm: I understand and made the necessary preparations + title: "이 가져오기를 시작하시겠습니까?" + confirm_button: "가져오기 시작" + description: > + 이 가져오기 도구는 알파 기능입니다. 아직 Jira에서 일부 데이터를 가져올 수 없으며 이 OpenProject 인스턴스에 불완전한 데이터가 남을 수 있습니다. 프로덕션 환경을 사용하지 말고, 시작하기 전에 OpenProject 데이터의 백업을 만드세요. + confirm: "이해했으며 필요한 준비를 마쳤습니다" + revert_dialog: + title: "이 가져오기를 영구적으로 되돌리시겠습니까?" + description: "이렇게 하면 OpenProject의 가져오기 후 해당 프로젝트에 사용자 활동이 있더라도 가져온 모든 개체(전체 프로젝트 포함)가 삭제됩니다." + confirm: "이 되돌리기를 통해 데이터가 영구적으로 삭제됨을 이해합니다" + finalize_dialog: + title: "이 가져오기를 완료하시겠습니까?" + description: "가져오기가 완료되면 더 이상 되돌릴 수 없습니다. 가져온 모든 데이터는 영구적으로 가져오게 됩니다." + confirm: "이 작업을 취소할 수 없음을 이해합니다." + confirm_button: "이해함" + select_projects: + title: "프로젝트 선택" mcp_configurations: index: - description: 모델 컨텍스트 프로토콜을 통해 AI 에이전트는 이 OpenProject 인스턴스에 의해 노출된 도구와 리소스를 - 사용자에게 제공할 수 있습니다. 이 기능은 아직 베타 버전입니다. - resources_heading: 리소스 - resources_description: OpenProject는 다음 리소스를 구현합니다. 원하는 대로 각 도구를 활성화하고, 이름을 - 바꾸고, 설명할 수 있습니다. 자세한 내용은 [MCP 리소스의 문서](docs_url)를 참조하세요. - resources_submit: 리소스 업데이트 - tools_heading: 도구 - tools_description: OpenProject는 다음 도구를 구현합니다. 원하는 대로 각 도구를 활성화하고, 이름을 바꾸고, - 설명할 수 있습니다. 자세한 내용은 [MCP 도구의 문서](docs_url)를 참조하세요. - tools_submit: 도구 업데이트 + description: "모델 컨텍스트 프로토콜을 통해 AI 에이전트는 이 OpenProject 인스턴스에 의해 노출된 도구와 리소스를 사용자에게 제공할 수 있습니다. 이 기능은 아직 베타 버전입니다." + resources_heading: "리소스" + resources_description: "OpenProject는 다음 리소스를 구현합니다. 원하는 대로 각 도구를 활성화하고, 이름을 바꾸고, 설명할 수 있습니다. 자세한 내용은 [MCP 리소스의 문서](docs_url)를 참조하세요." + resources_submit: "리소스 업데이트" + tools_heading: "도구" + tools_description: "OpenProject는 다음 도구를 구현합니다. 원하는 대로 각 도구를 활성화하고, 이름을 바꾸고, 설명할 수 있습니다. 자세한 내용은 [MCP 도구의 문서](docs_url)를 참조하세요." + tools_submit: "도구 업데이트" multi_update: - success: MCP 구성이 업데이트되었습니다. + success: "MCP 구성이 업데이트되었습니다." server_form: - description_caption: MCP 서버에 연결하는 다른 애플리케이션에 대해 MCP 서버가 설명되는 방식입니다. - title_caption: MCP 서버에 연결하는 애플리케이션에 표시되는 짧은 제목입니다. - tool_response_format: 도구 응답 형식 - tool_response_format_content_only_label: 콘텐츠 전용 - tool_response_format_content_only_caption: '이 인스턴스에 연결하는 MCP 클라이언트가 구조화된 콘텐츠를 - 지원하지 않는 경우 이 옵션을 선택하세요. 도구 응답에는 일반 텍스트 콘텐츠만 포함되며 구조화된 버전은 제외됩니다. - - ' - tool_response_format_full_label: 전체 - tool_response_format_full_caption: '가장 호환성이 높은 옵션입니다. 도구 응답에는 일반 콘텐츠와 구조화된 - 콘텐츠가 모두 포함되므로, MCP 클라이언트가 원하는 형식을 선택할 수 있습니다. 이렇게 하면 언어 모델이 처리해야 하는 토큰 수가 - 증가하여, 잠재적으로 비용이 높아지고 성능이 저하될 수 있습니다. - - ' - tool_response_format_structured_only_label: 구조화된 콘텐츠 전용 - tool_response_format_structured_only_caption: '이 인스턴스에 연결하는 MCP 클라이언트가 구조화된 - 콘텐츠를 지원하는 것이 분명한 경우 이 옵션을 선택하세요. 도구 응답에는 구조화된 콘텐츠만 포함되며 텍스트 표현은 제외됩니다. - - ' + description_caption: "MCP 서버에 연결하는 다른 애플리케이션에 대해 MCP 서버가 설명되는 방식입니다." + title_caption: "MCP 서버에 연결하는 애플리케이션에 표시되는 짧은 제목입니다." + tool_response_format: "도구 응답 형식" + tool_response_format_content_only_label: "콘텐츠 전용" + tool_response_format_content_only_caption: > + 이 인스턴스에 연결하는 MCP 클라이언트가 구조화된 콘텐츠를 지원하지 않는 경우 이 옵션을 선택하세요. 도구 응답에는 일반 텍스트 콘텐츠만 포함되며 구조화된 버전은 제외됩니다. + tool_response_format_full_label: "전체" + tool_response_format_full_caption: > + 가장 호환성이 높은 옵션입니다. 도구 응답에는 일반 콘텐츠와 구조화된 콘텐츠가 모두 포함되므로, MCP 클라이언트가 원하는 형식을 선택할 수 있습니다. 이렇게 하면 언어 모델이 처리해야 하는 토큰 수가 증가하여, 잠재적으로 비용이 높아지고 성능이 저하될 수 있습니다. + tool_response_format_structured_only_label: "구조화된 콘텐츠 전용" + tool_response_format_structured_only_caption: > + 이 인스턴스에 연결하는 MCP 클라이언트가 구조화된 콘텐츠를 지원하는 것이 분명한 경우 이 옵션을 선택하세요. 도구 응답에는 구조화된 콘텐츠만 포함되며 텍스트 표현은 제외됩니다. update: - failure: MCP 구성을 업데이트할 수 없습니다. - success: MCP 구성이 업데이트되었습니다. + failure: "MCP 구성을 업데이트할 수 없습니다." + success: "MCP 구성이 업데이트되었습니다." scim_clients: authentication_methods: - sso: ID 공급자의 JWT - oauth2_client: OAuth 2.0 클라이언트 자격 증명 - oauth2_token: 정적 액세스 토큰 + sso: "ID 공급자의 JWT" + oauth2_client: "OAuth 2.0 클라이언트 자격 증명" + oauth2_token: "정적 액세스 토큰" created_client_credentials_dialog_component: - title: 클라이언트 자격 증명 생성됨 - heading: 클라이언트 자격 증명이 생성되었습니다 - one_time_hint: 이번에만 클라이언트 비밀번호가 표시됩니다. 지금 이 클라이언트 비밀번호를 복사해야 합니다. + title: "클라이언트 자격 증명 생성됨" + heading: "클라이언트 자격 증명이 생성되었습니다" + one_time_hint: "이번에만 클라이언트 비밀번호가 표시됩니다. 지금 이 클라이언트 비밀번호를 복사해야 합니다." created_token_dialog_component: - title: 토큰 생성됨 - heading: 토큰이 생성되었습니다 - label_token: 토큰 - one_time_hint: 이번에만 이 토큰이 표시됩니다. 지금 이 토큰을 복사해야 합니다. + title: "토큰 생성됨" + heading: "토큰이 생성되었습니다" + label_token: "토큰" + one_time_hint: "이번에만 이 토큰이 표시됩니다. 지금 이 토큰을 복사해야 합니다." delete_scim_client_dialog_component: - title: SCIM 클라이언트 삭제 - heading: 이 SCIM 클라이언트를 삭제하시겠습니까? - description: 이 SCIM 클라이언트에서 관리하는 사용자는 더 이상 업데이트할 수 없습니다. + title: "SCIM 클라이언트 삭제" + heading: "이 SCIM 클라이언트를 삭제하시겠습니까?" + description: "이 SCIM 클라이언트에서 관리하는 사용자는 더 이상 업데이트할 수 없습니다." edit: - label_delete_scim_client: SCIM 클라이언트 삭제 + label_delete_scim_client: "SCIM 클라이언트 삭제" form: - auth_provider_description: SCIM 공급자에 의해 추가된 사용자가 OpenProject에서 인증하는 데 사용하는 - 서비스입니다. - authentication_method_description_html: SCIM 클라이언트가 OpenProject에서 인증하는 방식입니다. - OAuth 토큰에 scim_v2 범위가 포함되어 있는지 확인하세요. - description: 이러한 구성 옵션에 대한 자세한 내용은 [SCIM 클라이언트 구성에 대한 설명서](docs_url)를 참조하세요. - jwt_sub_description: 예를 들어 Keycloak의 경우, 이것은 SCIM 클라이언트와 연결된 서비스 계정의 UUID입니다. - 사용 사례의 제목 클레임을 찾는 방법은 [설명서](docs_url)를 참조하세요. - name_description: 다른 관리자가 이 클라이언트가 구성된 이유를 보다 쉽게 이해하는 데 도움이 되는 이름을 선택하세요. + auth_provider_description: "SCIM 공급자에 의해 추가된 사용자가 OpenProject에서 인증하는 데 사용하는 서비스입니다." + authentication_method_description_html: "SCIM 클라이언트가 OpenProject에서 인증하는 방식입니다. OAuth 토큰에 scim_v2 범위가 포함되어 있는지 확인하세요." + description: "이러한 구성 옵션에 대한 자세한 내용은 [SCIM 클라이언트 구성에 대한 설명서](docs_url)를 참조하세요." + jwt_sub_description: "예를 들어 Keycloak의 경우, 이것은 SCIM 클라이언트와 연결된 서비스 계정의 UUID입니다. 사용 사례의 제목 클레임을 찾는 방법은 [설명서](docs_url)를 참조하세요." + name_description: "다른 관리자가 이 클라이언트가 구성된 이유를 보다 쉽게 이해하는 데 도움이 되는 이름을 선택하세요." index: - description: 여기에서 구성된 SCIM 클라이언트는 OpenProject SCIM 서버 API와 상호 작용하여 사용자 계정 - 및 그룹을 프로비저닝, 업데이트, 프로비저닝 해제할 수 있습니다. - label_create_button: SCIM 클라이언트 추가 + description: "여기에서 구성된 SCIM 클라이언트는 OpenProject SCIM 서버 API와 상호 작용하여 사용자 계정 및 그룹을 프로비저닝, 업데이트, 프로비저닝 해제할 수 있습니다." + label_create_button: "SCIM 클라이언트 추가" new: - title: 새로운 SCIM 클라이언트 + title: "새로운 SCIM 클라이언트" revoke_static_token_dialog_component: - confirm_button: 취소 - title: 정적 토큰 취소 - heading: 이 토큰을 취소하시겠습니까? - description: 이 토큰을 사용하는 SCIM 클라이언트는 더 이상 OpenProject의 SCIM 서버 API에 액세스할 수 - 없습니다. + confirm_button: "취소" + title: "정적 토큰 취소" + heading: "이 토큰을 취소하시겠습니까?" + description: "이 토큰을 사용하는 SCIM 클라이언트는 더 이상 OpenProject의 SCIM 서버 API에 액세스할 수 없습니다." table_component: blank_slate: - title: 아직 구성된 SCIM 클라이언트 없음 - description: 여기에서 보려는 클라이언트를 추가하세요 - user_count: 사용자 + title: "아직 구성된 SCIM 클라이언트 없음" + description: "여기에서 보려는 클라이언트를 추가하세요" + user_count: "사용자" token_list_component: - description: 여기서 생성하는 토큰은 OpenProject SCIM API에 액세스하기 위해 SCIM 클라이언트에 의해 전달될 - 수 있습니다. - heading: 토큰 - label_add_token: 토큰 - label_aria_add_token: 토큰 추가 + description: "여기서 생성하는 토큰은 OpenProject SCIM API에 액세스하기 위해 SCIM 클라이언트에 의해 전달될 수 있습니다." + heading: "토큰" + label_add_token: "토큰" + label_aria_add_token: "토큰 추가" token_table_component: blank_slate: - title: 아직 생성된 토큰이 없습니다 - description: 지금 생성할 수 있습니다 + title: "아직 생성된 토큰이 없습니다" + description: "지금 생성할 수 있습니다" expired: "%{date}에 만료됨" revoked: "%{date}에 취소됨" - title: 액세스 토큰 테이블 + title: "액세스 토큰 테이블" settings: new_project: - project_creation: 프로젝트 생성 - notification_text_default: "

안녕하세요,

새 프로젝트가 생성되었습니다: projectValue:name

-

감사합니다.

\n" + project_creation: "프로젝트 생성" + notification_text_default: > +

안녕하세요,

새 프로젝트가 생성되었습니다: projectValue:name

감사합니다.

workflows: tabs: - default_transitions: 기본 전환 - user_author: 사용자가 작성자입니다 - user_assignee: 사용자가 담당자입니다 + default_transitions: "기본 전환" + user_author: "사용자가 작성자입니다" + user_assignee: "사용자가 담당자입니다" authentication: - login_and_registration: 로그인 및 등록 + login_and_registration: "로그인 및 등록" announcements: show_until: 표시 기한 is_active: 현재 표시됨 is_inactive: 현재 표시 안 됨 antivirus_scan: - not_processed_yet_message: 아직 파일의 바이러스 검사가 수행되지 않았으므로 다운로드가 차단되었습니다. 나중에 다시 시도하세요. + not_processed_yet_message: "아직 파일의 바이러스 검사가 수행되지 않았으므로 다운로드가 차단되었습니다. 나중에 다시 시도하세요." quarantined_message: "'%{filename}' 파일에서 바이러스가 발견되었습니다. 이 파일은 격리되어 다운로드할 수 없습니다." deleted_message: "'%{filename}' 파일에서 바이러스가 발견되었습니다. 이 파일은 삭제되었습니다." - deleted_by_admin: 격리된 '%{filename}' 파일이 관리자에 의해 삭제되었습니다. - overridden_by_admin: "'%{filename}' 파일에 대한 격리가 %{user} 님에 의해 제거되었습니다. 이제 이 파일에 - 액세스할 수 있습니다." + deleted_by_admin: "격리된 '%{filename}' 파일이 관리자에 의해 삭제되었습니다." + overridden_by_admin: "'%{filename}' 파일에 대한 격리가 %{user} 님에 의해 제거되었습니다. 이제 이 파일에 액세스할 수 있습니다." quarantined_attachments: - container: 컨테이너 - delete: 격리된 파일 삭제 - title: 격리된 첨부 파일 - error_cannot_act_self: 고유한 업로드 파일에서는 작업을 수행할 수 없습니다. + container: "컨테이너" + delete: "격리된 파일 삭제" + title: "격리된 첨부 파일" + error_cannot_act_self: "고유한 업로드 파일에서는 작업을 수행할 수 없습니다." attribute_help_texts: - caption: 이 짧은 버전은 특성의 캡션으로 표시됩니다. - note_public: 이 필드에 추가하는 모든 텍스트와 이미지는 로그인한 모든 사용자에게 공개됩니다. - text_overview: 이 보기에서 특성 보기에 대한 사용자 지정 도움말 텍스트를 작성할 수 있습니다. 이 텍스트를 정의하면 속하는 특성 - 옆에 있는 도움말 아이콘을 클릭하여 표시할 수 있습니다. - show_preview: 미리 보기 텍스트 - add_new: 도움말 텍스트 추가 + caption: "이 짧은 버전은 특성의 캡션으로 표시됩니다." + note_public: "이 필드에 추가하는 모든 텍스트와 이미지는 로그인한 모든 사용자에게 공개됩니다." + text_overview: "이 보기에서 특성 보기에 대한 사용자 지정 도움말 텍스트를 작성할 수 있습니다. 이 텍스트를 정의하면 속하는 특성 옆에 있는 도움말 아이콘을 클릭하여 표시할 수 있습니다." + show_preview: "미리 보기 텍스트" + add_new: "도움말 텍스트 추가" edit_field_name: "%{attribute_field_name}에 대한 도움말 텍스트 편집" background_jobs: status: - error_requeue: '작업 중에 오류가 발생했지만 다시 시도 중입니다. 오류 메시지: %{message}' - cancelled_due_to: '오류로 인해 작업이 취소되었습니다: %{message}' + error_requeue: "작업 중에 오류가 발생했지만 다시 시도 중입니다. 오류 메시지: %{message}" + cancelled_due_to: "오류로 인해 작업이 취소되었습니다: %{message}" ldap_auth_sources: - ldap_error: 'LDAP 오류: %{error_message}' - ldap_auth_failed: LDAP 서버에서 인증할 수 없습니다. - sync_failed: 'LDAP에서 동기화하지 못했습니다: %{message}.' - back_to_index: 연결 목록으로 돌아가려면 여기를 클릭하세요. + ldap_error: "LDAP 오류: %{error_message}" + ldap_auth_failed: "LDAP 서버에서 인증할 수 없습니다." + sync_failed: "LDAP에서 동기화하지 못했습니다: %{message}." + back_to_index: "연결 목록으로 돌아가려면 여기를 클릭하세요." technical_warning: | 이 LDAP 양식에는 LDAP / Active Directory 설정에 대한 기술적 지식이 필요합니다. [자세한 지침은 설명서를 참조하세요](docs_url). @@ -427,8 +414,7 @@ ko: host: LDAP 호스트 이름 또는 IP 주소 login_map: 고유한 사용자 로그인을 식별하는 데 사용되는 LDAP의 특성 키입니다. 일반적으로 `uid` 또는 `samAccountName`입니다. generic_map: OpenProject `%{attribute}` 특성에 매핑되는 LDAP의 특성 키 - admin_map_html: '선택 사항: 있는 경우 LDAP의 속성 키는 OpenProject 사용자를 - 관리자로 표시합니다. 확실하지 않은 경우 비워 두세요.' + admin_map_html: "선택 사항: 있는 경우 LDAP의 속성 키는 OpenProject 사용자를 관리자로 표시합니다. 확실하지 않은 경우 비워 두세요." system_user_dn_html: | 읽기 전용 액세스에 사용되는 시스템 사용자의 DN을 입력하세요.
@@ -448,37 +434,31 @@ ko: 이 확인란을 선택하면 OpenProject로 처음 인증할 때 OpenProject가 LDAP 항목에서 자동으로 새 사용자를 만듭니다. OpenProject의 기존 계정만 LDAP를 통해 인증할 수 있게 하려면 이 확인란을 선택하지 마세요! - connection_encryption: 연결 암호화 - encryption_details: LDAPS / STARTTLS 옵션 - system_account: 시스템 계정 + connection_encryption: "연결 암호화" + encryption_details: "LDAPS / STARTTLS 옵션" + system_account: "시스템 계정" system_account_legend: | OpenProject는 LDAP 트리에서 사용자 및 그룹을 찾기 위해 시스템 계정을 통한 읽기 전용 액세스 권한을 필요로 합니다. 다음 섹션에서 해당 시스템 사용자의 바인딩 자격 증명을 지정하세요. - ldap_details: LDAP 세부 정보 - user_settings: 특성 매핑 + ldap_details: "LDAP 세부 정보" + user_settings: "특성 매핑" user_settings_legend: | 다음 필드는 LDAP 항목에서 OpenProject에 사용자를 생성하는 방법 및 OpenProject 사용자의 특성을 정의하기 위해 사용되는 LDAP 특성(특성 매핑)과 관련이 있습니다. tls_mode: - plain: 없음 - simple_tls: LDAPS - start_tls: STARTTLS - plain_description: LDAP 서버에 대한 암호화되지 않은 연결을 엽니다. 프로덕션에는 권장되지 않습니다. - simple_tls_description: LDAPS를 사용합니다. LDAP 서버에서 별도의 포트가 필요합니다. 이 모드는 더 이상 사용되지 - 않는 경우가 종종 있으므로 가능한 한 STARTTLS를 사용하는 것이 좋습니다. - start_tls_description: 표준 LDAP 포트에 연결한 후 STARTTLS 명령을 보냅니다. 암호화된 연결에 권장됩니다. - section_more_info_link_html: '본 섹션에서는 이 LDAP 인증 소스의 연결 보안에 대해 설명합니다. 자세한 내용은 - Net::LDAP 문서를 참조하십시오. - - ' + plain: "없음" + simple_tls: "LDAPS" + start_tls: "STARTTLS" + plain_description: "LDAP 서버에 대한 암호화되지 않은 연결을 엽니다. 프로덕션에는 권장되지 않습니다." + simple_tls_description: "LDAPS를 사용합니다. LDAP 서버에서 별도의 포트가 필요합니다. 이 모드는 더 이상 사용되지 않는 경우가 종종 있으므로 가능한 한 STARTTLS를 사용하는 것이 좋습니다." + start_tls_description: "표준 LDAP 포트에 연결한 후 STARTTLS 명령을 보냅니다. 암호화된 연결에 권장됩니다." + section_more_info_link_html: > + 본 섹션에서는 이 LDAP 인증 소스의 연결 보안에 대해 설명합니다. 자세한 내용은 Net::LDAP 문서를 참조하십시오. tls_options: - verify_peer: SSL 인증서 확인 - verify_peer_description_html: '인증서 신뢰 체인의 엄격한 SSL 인증을 활성화합니다.
경고: - 이 옵션을 선택 취소하면 LDAP 서버 인증서의 SSL 인증이 비활성화됩니다. 이렇게 하면 사용자의 연결이 중간자 공격에 노출됩니다. - - ' - tls_certificate_description: LDAP 서버 인증서가 이 시스템의 신뢰 소스에 없으면 여기에서 수동으로 추가할 수 - 있습니다. PEM X509 인증서 문자열을 입력하세요. + verify_peer: "SSL 인증서 확인" + verify_peer_description_html: > + 인증서 신뢰 체인의 엄격한 SSL 인증을 활성화합니다.
경고: 이 옵션을 선택 취소하면 LDAP 서버 인증서의 SSL 인증이 비활성화됩니다. 이렇게 하면 사용자의 연결이 중간자 공격에 노출됩니다. + tls_certificate_description: "LDAP 서버 인증서가 이 시스템의 신뢰 소스에 없으면 여기에서 수동으로 추가할 수 있습니다. PEM X509 인증서 문자열을 입력하세요." forums: show: no_results_title_text: 포럼에 대한 포스트가 현재 없습니다. @@ -486,157 +466,142 @@ ko: index: no_results_title_text: 색깔이 없습니다. no_results_content_text: 새 색깔 생성 - label_new_color: 새로운 색상 + label_new_color: "새로운 색상" new: - label_new_color: 새로운 색상 + label_new_color: "새로운 색상" edit: - label_edit_color: 색상 편집 + label_edit_color: "색상 편집" form: - label_new_color: 새로운 색상 - label_edit_color: 색상 편집 - label_no_color: 색상 없음 - label_properties: 속성 - label_really_delete_color: '다음 색상을 삭제하시겠습니까? 이 색상을 사용하는 유형은 삭제되지 않습니다. - - ' + label_new_color: "새로운 색상" + label_edit_color: "색상 편집" + label_no_color: "색상 없음" + label_properties: "속성" + label_really_delete_color: > + 다음 색상을 삭제하시겠습니까? 이 색상을 사용하는 유형은 삭제되지 않습니다. custom_actions: actions: - name: 작업 - add: 작업 추가 + name: "작업" + add: "작업 추가" assigned_to: executing_user_value: "(실행 사용자에게 할당)" - conditions: 조건 - plural: 사용자 지정 작업 - new: 새로운 사용자 지정 작업 - edit: 사용자 지정 작업 %{name} 편집 + conditions: "조건" + plural: "사용자 지정 작업" + new: "새로운 사용자 지정 작업" + edit: "사용자 지정 작업 %{name} 편집" execute: "%{name} 실행" custom_fields: admin: custom_field_projects: is_for_all_blank_slate: heading: 모든 프로젝트용 - description: '"모든 프로젝트용" 옵션이 선택되었으므로 모든 프로젝트에서 이 사용자 지정 필드가 활성화되었습니다. 개별 - 프로젝트에 대해 비활성화할 수 없습니다.' + description: '"모든 프로젝트용" 옵션이 선택되었으므로 모든 프로젝트에서 이 사용자 지정 필드가 활성화되었습니다. 개별 프로젝트에 대해 비활성화할 수 없습니다.' items: - actions: 항목 작업 + actions: "항목 작업" blankslate: root: - title: 항목 목록이 비어 있습니다 - description: 먼저 유형 계층의 사용자 지정 필드에 항목을 추가하여 시작하세요. 각 항목을 사용하여 그 아래에 계층을 - 만들 수 있습니다. 계층 내에서 탐색하고 하위 항목을 만들려면 생성된 항목을 클릭하세요. + title: "항목 목록이 비어 있습니다" + description: "먼저 유형 계층의 사용자 지정 필드에 항목을 추가하여 시작하세요. 각 항목을 사용하여 그 아래에 계층을 만들 수 있습니다. 계층 내에서 탐색하고 하위 항목을 만들려면 생성된 항목을 클릭하세요." item: title: 이 항목에는 아래 계층 수준이 없습니다 description: 이 목록에 항목을 추가하여 다른 목록 내에서 하위 항목을 만듭니다 delete_dialog: - title: 사용자 지정 필드 항목 삭제 - heading: 사용자 지정 필드 항목을 삭제하시겠습니까? - description: 이 작업을 수행하면 해당 항목과 모든 하위 항목이 제거되며 되돌릴 수 없습니다. 할당된 모든 값이 영구적으로 - 삭제됩니다. 이 필드가 필수인 경우 항목을 제거하면 기존 작업 패키지가 무효하게 될 수 있습니다. + title: "사용자 지정 필드 항목 삭제" + heading: "사용자 지정 필드 항목을 삭제하시겠습니까?" + description: "이 작업을 수행하면 해당 항목과 모든 하위 항목이 제거되며 되돌릴 수 없습니다. 할당된 모든 값이 영구적으로 삭제됩니다. 이 필드가 필수인 경우 항목을 제거하면 기존 작업 패키지가 무효하게 될 수 있습니다." placeholder: - label: 항목 레이블 - short: 짧은 이름 - weight: 가중치 + label: "항목 레이블" + short: "짧은 이름" + weight: "가중치" notice: - remember_items_and_projects: 이 사용자 지정 필드의 각 탭에서 항목과 프로젝트를 설정해야 합니다. + remember_items_and_projects: "이 사용자 지정 필드의 각 탭에서 항목과 프로젝트를 설정해야 합니다." hierarchy: subitems: zero: 하위 항목 없음 one: 하위 항목 1개 - other: 하위 항목 %{count}개 + other: "하위 항목 %{count}개" role_assignment: title: 역활 할당 - description: 이 프로젝트에서 해당 사용자의 원래 역할에 관계없이 이 프로젝트 특성에 할당된 모든 사용자에게 특정 프로젝트 - 역할을 자동으로 부여할 수 있습니다. - warning: 아래에서 선택한 역할에 따라 이 프로젝트 특성에 할당된 사용자는 새 멤버를 추가하고 해당 역할을 승격하는 기능을 포함하여 - 이전보다 훨씬 더 많은 권한을 갖게 될 수 있습니다. - role_field_label: 프로젝트 역할 + description: 이 프로젝트에서 해당 사용자의 원래 역할에 관계없이 이 프로젝트 특성에 할당된 모든 사용자에게 특정 프로젝트 역할을 자동으로 부여할 수 있습니다. + warning: 아래에서 선택한 역할에 따라 이 프로젝트 특성에 할당된 사용자는 새 멤버를 추가하고 해당 역할을 승격하는 기능을 포함하여 이전보다 훨씬 더 많은 권한을 갖게 될 수 있습니다. + role_field_label: "프로젝트 역할" role_field_caption: 이 프로젝트 역할은 해당 프로젝트 특성에 할당된 모든 사용자에게 자동으로 부여됩니다 - review_hint: '다양한 프로젝트에서 이 프로젝트 특성에 이미 할당된 %{user_count}명이 있습니다. 해당 사용자는 추가 - 권한이 부여되고 이전에 액세스할 수 없었던 프로젝트에 추가될 수 있습니다. - - ' + review_hint: > + 다양한 프로젝트에서 이 프로젝트 특성에 이미 할당된 %{user_count}명이 있습니다. 해당 사용자는 추가 권한이 부여되고 이전에 액세스할 수 없었던 프로젝트에 추가될 수 있습니다. review_button: 사용자 및 권한 검토 dialog: - title: 사용자 및 권한 개요 + title: "사용자 및 권한 개요" change: 변경 changes: new_member: 멤버로 추가됩니다 remove_member: 멤버에서 제거됩니다 - gain_and_lose_role: "'%{old_role}' 역할을 잃고 '%{new_role}' 역할을 얻습니다" - gain_role: "‘%{new_role}’ 역할을 얻습니다" - lose_role: "‘%{old_role}’ 역할을 잃습니다" + gain_and_lose_role: '''%{old_role}'' 역할을 잃고 ''%{new_role}'' 역할을 얻습니다' + gain_role: '‘%{new_role}’ 역할을 얻습니다' + lose_role: '‘%{old_role}’ 역할을 잃습니다' no_change: 변경 사항 없음 - text_add_new_custom_field: '프로젝트에 새 사용자 지정 필드를 추가하려면 먼저 해당 필드를 만들어야 합니다. 그래야 이 - 프로젝트에 해당 필드를 추가할 수 있습니다. - - ' - is_enabled_globally: 는 세계적으로 사용 가능합니다. - enabled_in_project: 프로젝트에 사용 가능함. - contained_in_type: 타입에 포함됨. - confirm_destroy_option: '옵션을 삭제하면 모든 해당 항목(예: 작업 패키지 내 모든 항목)이 삭제됩니다. 그래도 삭제하시겠습니까?' - reorder_alphabetical: 알파벳순으로 값 재정렬 - reorder_confirmation: '경고: 사용 가능한 값의 현재 순서 및 저장되지 않은 모든 값이 손실됩니다. 계속하시겠습니까?' - placeholder_version_select: 먼저 작업 패키지 또는 프로젝트를 선택해야 합니다 - calculated_field_not_editable: 편집할 수 없는 특성입니다. 이 값은 자동으로 계산됩니다. - no_role_assigment: 역할 할당 없음 + text_add_new_custom_field: > + 프로젝트에 새 사용자 지정 필드를 추가하려면 먼저 해당 필드를 만들어야 합니다. 그래야 이 프로젝트에 해당 필드를 추가할 수 있습니다. + is_enabled_globally: "는 세계적으로 사용 가능합니다." + enabled_in_project: "프로젝트에 사용 가능함." + contained_in_type: "타입에 포함됨." + confirm_destroy_option: "옵션을 삭제하면 모든 해당 항목(예: 작업 패키지 내 모든 항목)이 삭제됩니다. 그래도 삭제하시겠습니까?" + reorder_alphabetical: "알파벳순으로 값 재정렬" + reorder_confirmation: "경고: 사용 가능한 값의 현재 순서 및 저장되지 않은 모든 값이 손실됩니다. 계속하시겠습니까?" + placeholder_version_select: "먼저 작업 패키지 또는 프로젝트를 선택해야 합니다" + calculated_field_not_editable: "편집할 수 없는 특성입니다. 이 값은 자동으로 계산됩니다." + no_role_assigment: "역할 할당 없음" instructions: is_required: - all: 사용자 지정 필드를 필수로 표시합니다. 이렇게 하면 새 리소스를 만들 때 이 필드를 필수로 입력해야 합니다. 기존 리소스는 - 업데이트할 때 값이 필요하지 않습니다. - project: 해당 필드가 활성화된 경우('모든 프로젝트용' 설정 또는 필드가 활성화된 프로젝트/템플릿에서 복사) 프로젝트 생성 시 - 사용자가 필수 특성을 입력해야 합니다. 기존 프로젝트는 업데이트할 때 값이 필요하지 않습니다. + all: "사용자 지정 필드를 필수로 표시합니다. 이렇게 하면 새 리소스를 만들 때 이 필드를 필수로 입력해야 합니다. 기존 리소스는 업데이트할 때 값이 필요하지 않습니다." + project: "해당 필드가 활성화된 경우('모든 프로젝트용' 설정 또는 필드가 활성화된 프로젝트/템플릿에서 복사) 프로젝트 생성 시 사용자가 필수 특성을 입력해야 합니다. 기존 프로젝트는 업데이트할 때 값이 필요하지 않습니다." is_for_all: - all: 모든 기존 프로젝트와 새 프로젝트에서 사용자 지정 필드를 사용 가능으로 표시합니다. - project: 모든 기존 프로젝트와 새 프로젝트에서 특성을 사용 가능으로 표시합니다. + all: "모든 기존 프로젝트와 새 프로젝트에서 사용자 지정 필드를 사용 가능으로 표시합니다." + project: "모든 기존 프로젝트와 새 프로젝트에서 특성을 사용 가능으로 표시합니다." multi_select: - all: 사용자가 이 사용자 지정 필드에 여러 값을 할당할 수 있도록 허용합니다. - project: 사용자가 이 특성에 여러 값을 할당할 수 있도록 허용합니다. + all: "사용자가 이 사용자 지정 필드에 여러 값을 할당할 수 있도록 허용합니다." + project: "사용자가 이 특성에 여러 값을 할당할 수 있도록 허용합니다." searchable: - all: 글로벌 검색 기능을 사용할 때 필드 값을 포함합니다. - project: 프로젝트 목록에서 이 특성을 필터로 사용 가능하게 설정하려면 선택합니다. + all: "글로벌 검색 기능을 사용할 때 필드 값을 포함합니다." + project: "프로젝트 목록에서 이 특성을 필터로 사용 가능하게 설정하려면 선택합니다." editable: - all: 사용자가 필드를 편집할 수 있도록 허용합니다. + all: "사용자가 필드를 편집할 수 있도록 허용합니다." admin_only: - all: 이 사용자 지정 필드를 관리자에게만 표시하려면 선택합니다. 관리자 권한이 없는 사용자는 이 특성을 보거나 편집할 수 없습니다. - project: 이 특성을 관리자에게만 표시하려면 선택합니다. 관리자 권한이 없는 사용자는 이 특성을 보거나 편집할 수 없습니다. + all: "이 사용자 지정 필드를 관리자에게만 표시하려면 선택합니다. 관리자 권한이 없는 사용자는 이 특성을 보거나 편집할 수 없습니다." + project: "이 특성을 관리자에게만 표시하려면 선택합니다. 관리자 권한이 없는 사용자는 이 특성을 보거나 편집할 수 없습니다." is_filter: - all: '작업 패키지 보기의 필터에서 사용자 지정 필드를 사용할 수 있도록 허용합니다. ''모든 프로젝트용''을 선택한 경우에만 사용자 - 지정 필드가 글로벌 보기에 표시됩니다. - - ' + all: > + 작업 패키지 보기의 필터에서 사용자 지정 필드를 사용할 수 있도록 허용합니다. '모든 프로젝트용'을 선택한 경우에만 사용자 지정 필드가 글로벌 보기에 표시됩니다. formula: - project: 숫자 값을 추가하거나 /를 입력하여 특성 또는 수학 연산자를 검색합니다. + project: "숫자 값을 추가하거나 /를 입력하여 특성 또는 수학 연산자를 검색합니다." regexp: - all: '예: ^[A-Z0-9]+$' - project: '예: ^[A-Z0-9]+$' + all: "예: ^[A-Z0-9]+$" + project: "예: ^[A-Z0-9]+$" min_max: - all: 0은 제한이 없음을 의미합니다 - project: 0은 제한이 없음을 의미합니다 + all: "0은 제한이 없음을 의미합니다" + project: "0은 제한이 없음을 의미합니다" has_comment: - project: 사용자가 프로젝트 개요에서 값을 선택할 때 프로젝트 특성과 관련된 코멘트를 추가할 수 있습니다. + project: "사용자가 프로젝트 개요에서 값을 선택할 때 프로젝트 특성과 관련된 코멘트를 추가할 수 있습니다." tab: no_results_title_text: 사용자 필드가 없습니다. no_results_content_text: 새 사용자 필드 생성 calculated_values: error_dialog: - title: 계산된 값 오류 + title: "계산된 값 오류" errors: - unknown: 알 수 없는 오류가 발생했습니다. 이 계산된 값의 공식을 검토해 주세요. - mathematical: 수학 공식으로 인해 오류가 발생했습니다. 프로젝트 계산 특성을 검토한 후 다시 시도하세요. + unknown: "알 수 없는 오류가 발생했습니다. 이 계산된 값의 공식을 검토해 주세요." + mathematical: "수학 공식으로 인해 오류가 발생했습니다. 프로젝트 계산 특성을 검토한 후 다시 시도하세요." missing_value: '"%{custom_field_name}" 특성은 이 계산된 값에 필요하지만 비어 있습니다.' - disabled_value: '"%{custom_field_name}" 특성은 이 계산된 값에 필요하지만 해당 프로젝트에 대해 비활성화되어 - 있습니다.' + disabled_value: '"%{custom_field_name}" 특성은 이 계산된 값에 필요하지만 해당 프로젝트에 대해 비활성화되어 있습니다.' concatenation: - single: 또는 + single: "또는" danger_dialog: - confirmation_live_message_checked: 진행 버튼이 이제 활성화되었습니다. - confirmation_live_message_unchecked: 진행 버튼이 이제 비활성화되었습니다. 계속하려면 확인란을 선택해야 합니다. + confirmation_live_message_checked: "진행 버튼이 이제 활성화되었습니다." + confirmation_live_message_unchecked: "진행 버튼이 이제 비활성화되었습니다. 계속하려면 확인란을 선택해야 합니다." mcp_configurations: server_url_component: - caption: OpenProject MCP 서버에 연결할 수 있는 URL입니다. MCP 클라이언트를 설정하는 데 필요합니다. - label: 서버 URL + caption: "OpenProject MCP 서버에 연결할 수 있는 URL입니다. MCP 클라이언트를 설정하는 데 필요합니다." + label: "서버 URL" op_dry_validation: - or: 또는 + or: "또는" errors: array?: "- 배열이어야 합니다." decimal?: "- 소수여야 합니다." @@ -658,7 +623,7 @@ ko: copy_workflow_from: workflow_missing: "- 고유한 워크플로가 없습니다." custom_field: - format_not_supported: 형식 '%{field_format}'은(는) 지원되지 않습니다. + format_not_supported: "형식 '%{field_format}'은(는) 지원되지 않습니다." item: root_item: "- 루트 항목일 수 없습니다." not_persisted: "- 이미 존재하는 항목이어야 합니다." @@ -671,28 +636,28 @@ ko: str?: "- 문자열이어야 합니다." type?: "- %{type}이어야(여야) 합니다." rules: - copy_workflow_from: 워크플로 복사의 유형 - enabled: 활성화됨 - depth: 깊이 - item: 항목 - label: 레이블 - weight: 가중치 - short: 짧은 이름 - parent: 부모 - blueprint: 패턴 청사진 + copy_workflow_from: "워크플로 복사의 유형" + enabled: "활성화됨" + depth: "깊이" + item: "항목" + label: "레이블" + weight: "가중치" + short: "짧은 이름" + parent: "부모" + blueprint: "패턴 청사진" global_search: title: - all_projects: 모든 프로젝트에서 "%{search_term}" 검색 + all_projects: '모든 프로젝트에서 "%{search_term}" 검색' current_project: '%{project_name}에서 "%{search_term}" 검색' project_and_subprojects: '%{project_name} 및 모든 하위 프로젝트에서 "%{search_term}" 검색' placeholder: "%{app_title}에서 검색" overwritten_tabs: - all: 모두 - messages: 포럼 - wiki_pages: 위키 + all: "모두" + messages: "포럼" + wiki_pages: "위키" groups: edit: - synchronized_groups: 동기화된 그룹 + synchronized_groups: "동기화된 그룹" index: description: 사용자를 그룹화하여 동일한 프로젝트에 멤버로 추가하거나 동일한 글로벌 역할을 할당할 수 있습니다. table_component: @@ -707,14 +672,11 @@ ko: synchronized_groups: blankslate: action: 인증 설정 - description: 이 그룹이 OpenID와 같은 외부 ID 공급자의 그룹과 자동으로 동기화되면, 여기에 표시됩니다. 인증 설정에서 - 이 그룹을 설정할 수 있습니다. + description: 이 그룹이 OpenID와 같은 외부 ID 공급자의 그룹과 자동으로 동기화되면, 여기에 표시됩니다. 인증 설정에서 이 그룹을 설정할 수 있습니다. title: 아직 동기화된 그룹 없음 incoming_mails: - ignore_filenames: '받는 메일의 첨부 파일을 처리할 때 무시할 이름 목록을 지정하십시오(예: 서명 또는 아이콘). 라인 하나에 - 파일 이름 하나를 입력하십시오. - - ' + ignore_filenames: > + 받는 메일의 첨부 파일을 처리할 때 무시할 이름 목록을 지정하십시오(예: 서명 또는 아이콘). 라인 하나에 파일 이름 하나를 입력하십시오. portfolios: index: search: @@ -723,51 +685,52 @@ ko: sub_items_html: other: "%{count}개 하위 항목" lists: - active: 활성 포트폴리오 - my: 내 포트폴리오 - favorited: 즐겨 찾는 포트폴리오 - archived: 보관된 포트폴리오 + active: "활성 포트폴리오" + my: "내 포트폴리오" + favorited: "즐겨 찾는 포트폴리오" + archived: "보관된 포트폴리오" projects: copy: - members: 프로젝트 멤버 - overviews: 프로젝트 개요 - queries: '작업 패키지: 저장된 보기' - wiki_page_attachments: 'Wiki 페이지: 첨부 파일' - work_package_attachments: '작업 패키지: 첨부 파일' - work_package_categories: '작업 패키지: 카테고리' - work_package_file_links: '작업 패키지: 파일 링크' - work_package_shares: '작업 패키지: 공유' + #Contains custom strings for options when copying a project that cannot be found elsewhere. + members: "프로젝트 멤버" + overviews: "프로젝트 개요" + queries: "작업 패키지: 저장된 보기" + wiki_page_attachments: "Wiki 페이지: 첨부 파일" + work_package_attachments: "작업 패키지: 첨부 파일" + work_package_categories: "작업 패키지: 카테고리" + work_package_file_links: "작업 패키지: 파일 링크" + work_package_shares: "작업 패키지: 공유" create: notification_email_subject: "'%{project_name}' 프로젝트가 생성되었습니다" complete_wizard_link: "%{artefact_name} 완료" delete: - scheduled: 삭제가 예약되었으며 백그라운드에서 수행됩니다. 결과 알림이 제공될 것입니다. - schedule_failed: '프로젝트를 삭제할 수 없습니다: %{errors}' - failed: 프로젝트 '%{name}' 삭제가 실패했습니다 - failed_text: 프로젝트 '%{name}' 삭제 요청이 실패했습니다. 프로젝트가 보관되었습니다. - completed: 프로젝트 '%{name}' 삭제가 완료되었습니다 - completed_text: 프로젝트 '%{name}' 삭제 요청이 완료되었습니다. - completed_text_children: 또한 다음 하위 프로젝트가 삭제되었습니다. + scheduled: "삭제가 예약되었으며 백그라운드에서 수행됩니다. 결과 알림이 제공될 것입니다." + schedule_failed: "프로젝트를 삭제할 수 없습니다: %{errors}" + failed: "프로젝트 '%{name}' 삭제가 실패했습니다" + failed_text: "프로젝트 '%{name}' 삭제 요청이 실패했습니다. 프로젝트가 보관되었습니다." + completed: "프로젝트 '%{name}' 삭제가 완료되었습니다" + completed_text: "프로젝트 '%{name}' 삭제 요청이 완료되었습니다." + completed_text_children: "또한 다음 하위 프로젝트가 삭제되었습니다." index: - open_as_gantt: Gantt 보기로 열기 + open_as_gantt: "Gantt 보기로 열기" no_results_title_text: 프로젝트가 없습니다. no_results_content_text: 새 프로젝트 생성 search: label: 프로젝트 이름 필터 placeholder: 프로젝트 이름으로 검색 lists: - active: 활성 프로젝트 - my: 내 프로젝트 - favorited: 즐겨 찾는 프로젝트 - archived: 보관된 프로젝트 - shared: 공유된 프로젝트 목록 - my_lists: 내 프로젝트 목록 + active: "활성 프로젝트" + my: "내 프로젝트" + favorited: "즐겨 찾는 프로젝트" + archived: "보관된 프로젝트" + shared: "공유된 프로젝트 목록" + my_lists: "내 프로젝트 목록" new: - placeholder: 새 프로젝트 목록 + placeholder: "새 프로젝트 목록" delete_modal: - title: 프로젝트 목록 삭제 - heading: 이 프로젝트 목록을 삭제하시겠습니까? - text: 이 작업을 수행해도 목록에 포함된 프로젝트는 삭제되지 않습니다. 이 프로젝트 목록을 삭제하시겠습니까? + title: "프로젝트 목록 삭제" + heading: "이 프로젝트 목록을 삭제하시겠습니까?" + text: "이 작업을 수행해도 목록에 포함된 프로젝트는 삭제되지 않습니다. 이 프로젝트 목록을 삭제하시겠습니까?" settings: header_details: 기본 세부 정보 header_status: 상태 @@ -775,48 +738,38 @@ ko: button_update_details: 세부 정보 업데이트 button_update_status_description: 상태 설명 업데이트 button_update_parent_project: 부모 프로젝트 업데이트 - public_warning: '이 프로젝트는 공개 상태입니다. 해당 인스턴스에 액세스할 수 있는 모든 사용자는 자신의 역할 및 관련 권한에 - 따라 이 프로젝트를 보고 상호 작용할 수 있습니다. 하위 프로젝트는 영향을 받지 않으며 고유한 설정이 있습니다. - - ' + public_warning: > + 이 프로젝트는 공개 상태입니다. 해당 인스턴스에 액세스할 수 있는 모든 사용자는 자신의 역할 및 관련 권한에 따라 이 프로젝트를 보고 상호 작용할 수 있습니다. 하위 프로젝트는 영향을 받지 않으며 고유한 설정이 있습니다. public_confirmation: - checkbox: 본인은 이렇게 하면 이전 비공개 콘텐츠가 공개로 설정됨을 이해합니다 - title: 이 프로젝트를 공개로 지정하시겠습니까? - description: '해당 인스턴스에 액세스할 수 있는 모든 사용자는 자신의 역할 및 인증 설정에 따라 이 프로젝트를 보고 상호 - 작용할 수 있습니다. 하위 프로젝트는 영향을 받지 않으며 고유한 설정이 있습니다. - - ' + checkbox: "본인은 이렇게 하면 이전 비공개 콘텐츠가 공개로 설정됨을 이해합니다" + title: "이 프로젝트를 공개로 지정하시겠습니까?" + description: > + 해당 인스턴스에 액세스할 수 있는 모든 사용자는 자신의 역할 및 인증 설정에 따라 이 프로젝트를 보고 상호 작용할 수 있습니다. 하위 프로젝트는 영향을 받지 않으며 고유한 설정이 있습니다. private_confirmation: - checkbox: 본인은 이렇게 하면 이전 공개 콘텐츠가 비공개로 설정됨을 이해합니다. - title: 이 프로젝트를 비공개로 지정하시겠습니까? - description: '이 프로젝트는 해당 역할 및 관련 권한에 따라 프로젝트 멤버에게만 표시됩니다. 하위 프로젝트는 영향을 받지 - 않으며 고유한 설정이 있습니다. - - ' + checkbox: "본인은 이렇게 하면 이전 공개 콘텐츠가 비공개로 설정됨을 이해합니다." + title: "이 프로젝트를 비공개로 지정하시겠습니까?" + description: > + 이 프로젝트는 해당 역할 및 관련 권한에 따라 프로젝트 멤버에게만 표시됩니다. 하위 프로젝트는 영향을 받지 않으며 고유한 설정이 있습니다. change_identifier: 식별자 변경 subitems: - template_section: '새 하위 항목을 만들 때 사용할 템플릿을 선택합니다. - - ' - project_template_label: 프로젝트용 템플릿 - project_template_caption: 이 유형의 새 하위 항목에 대해 기본값으로 사용할 템플릿 프로젝트를 선택합니다. - program_template_label: 프로젝트용 템플릿 - program_template_caption: 이 유형의 새 하위 항목에 대해 기본값으로 사용할 템플릿 프로그램을 선택합니다. - no_template: 사전 정의된 템플릿 없음 + template_section: > + 새 하위 항목을 만들 때 사용할 템플릿을 선택합니다. + project_template_label: "프로젝트용 템플릿" + project_template_caption: "이 유형의 새 하위 항목에 대해 기본값으로 사용할 템플릿 프로젝트를 선택합니다." + program_template_label: "프로젝트용 템플릿" + program_template_caption: "이 유형의 새 하위 항목에 대해 기본값으로 사용할 템플릿 프로그램을 선택합니다." + no_template: "사전 정의된 템플릿 없음" template: - menu_title: 템플릿 - title: 템플릿 설정 - enable_failed: 템플릿 모드를 활성화하지 못했습니다. + menu_title: "템플릿" + title: "템플릿 설정" + enable_failed: "템플릿 모드를 활성화하지 못했습니다." members: - excluded_roles_label: 템플릿 적용 시 제외할 역할 - excluded_roles_caption: '이 템플릿에서 새 프로젝트를 만들 때 위에서 선택한 역할은 생략됩니다. 따라서 해당 - 프로젝트 역할에 따라 제외할 멤버를 선택할 수 있습니다. 그런 다음 사용자는 템플릿에서 만든 새 프로젝트에 대한 액세스 권한을 - 부여받지 않고 보기용으로 템플릿에 액세스할 수 있습니다. - - ' + excluded_roles_label: "템플릿 적용 시 제외할 역할" + excluded_roles_caption: > + 이 템플릿에서 새 프로젝트를 만들 때 위에서 선택한 역할은 생략됩니다. 따라서 해당 프로젝트 역할에 따라 제외할 멤버를 선택할 수 있습니다. 그런 다음 사용자는 템플릿에서 만든 새 프로젝트에 대한 액세스 권한을 부여받지 않고 보기용으로 템플릿에 액세스할 수 있습니다. actions: - label_enable_all: 모두 활성화 - label_disable_all: 모두 비활성화 + label_enable_all: "모두 활성화" + label_disable_all: "모두 비활성화" activities: no_results_title_text: 가능한 활동이 없습니다. forums: @@ -829,38 +782,32 @@ ko: no_results_title_text: 사용 가능한 사용자 필드가 없습니다. life_cycle: header: - title: 프로젝트 수명 주기 - description_html: 활성 프로젝트 단계는 이 프로젝트의 수명 주기를 정의하며 관리 설정에서 정의됩니다. 활성화된 단계는 프로젝트 - 개요에 표시됩니다. - non_defined: 현재 정의된 단계가 없습니다. - section_header: 단계 + title: "프로젝트 수명 주기" + description_html: '활성 프로젝트 단계는 이 프로젝트의 수명 주기를 정의하며 관리 설정에서 정의됩니다. 활성화된 단계는 프로젝트 개요에 표시됩니다.' + non_defined: "현재 정의된 단계가 없습니다." + section_header: "단계" step: - use_in_project: 이 프로젝트에서 %{step} 사용 + use_in_project: "이 프로젝트에서 %{step} 사용" filter: - label: 프로젝트 단계 검색 + label: "프로젝트 단계 검색" project_custom_fields: header: - title: 프로젝트 특성 - description_html: '이러한 프로젝트 특성은 해당 섹션 아래의 프로젝트 - 개요 페이지에 표시됩니다. 개별 특성을 활성화하거나 비활성화할 수 있습니다. 프로젝트 특성 및 섹션은 인스턴스 관리자가 - 관리 설정에서 정의합니다. ' + title: "프로젝트 특성" + description_html: '이러한 프로젝트 특성은 해당 섹션 아래의 프로젝트 개요 페이지에 표시됩니다. 개별 특성을 활성화하거나 비활성화할 수 있습니다. 프로젝트 특성 및 섹션은 인스턴스 관리자가 관리 설정에서 정의합니다. ' filter: - label: 프로젝트 특성 검색 + label: "프로젝트 특성 검색" actions: - label_enable_single: 이 프로젝트에서 활성화되어 있습니다. 비활성화하려면 클릭하세요. - label_disable_single: 이 프로젝트에서 비활성화되어 있습니다. 활성화하려면 클릭하세요. - remove_from_project: 프로젝트에서 제거 + label_enable_single: "이 프로젝트에서 활성화되어 있습니다. 비활성화하려면 클릭하세요." + label_disable_single: "이 프로젝트에서 비활성화되어 있습니다. 활성화하려면 클릭하세요." + remove_from_project: "프로젝트에서 제거" is_for_all_blank_slate: heading: 모든 프로젝트용 - description: '"모든 프로젝트용" 옵션이 선택되었으므로 모든 프로젝트에서 이 프로젝트 특성이 활성화되었습니다. 개별 프로젝트에 - 대해 비활성화할 수 없습니다.' - enabled_via_assignee_when_submitted_html: 이 프로젝트 특성은 프로젝트 시작 요청 제출 시 담당자로 설정되었으므로 비활성화할 수 없습니다. + description: '"모든 프로젝트용" 옵션이 선택되었으므로 모든 프로젝트에서 이 프로젝트 특성이 활성화되었습니다. 개별 프로젝트에 대해 비활성화할 수 없습니다.' + enabled_via_assignee_when_submitted_html: 이 프로젝트 특성은 프로젝트 시작 요청 제출 시 담당자로 설정되었으므로 비활성화할 수 없습니다. types: no_results_title_text: 사용 가능한 타입이 없습니다. form: - enable_type_in_project: 유형 "%{type}" 사용 + enable_type_in_project: '유형 "%{type}" 사용' versions: no_results_title_text: 프로젝트에 버전이 없습니다. no_results_content_text: 새 버전 생성 @@ -869,275 +816,236 @@ ko: storage: no_results_title_text: 이 프로젝트에서 사용하는 추가 기록 디스크 공간이 없습니다. work_package_priorities: - new_label: 새로운 우선 순위 + new_label: "새로운 우선 순위" creation_wizard: errors: - no_work_package_type: 프로젝트 시작 요청을 사용하려면 활성 작업 패키지 유형이 하나 이상 필요하지만 이 프로젝트에는 - 하나도 없기 때문에 프로젝트 시작 요청을 활성화하지 못했습니다. 이 프로젝트에 작업 패키지 유형을 하나 이상 추가하세요. - no_status_when_submitted: 작업 패키지 유형 %{type}에는 연결된 상태가 하나 이상 필요하므로 프로젝트 시작 - 요청을 활성화하지 못했습니다. 이 작업 패키지 유형에 대한 상태 워크플로를 하나 이상 활성화하세요. + no_work_package_type: "프로젝트 시작 요청을 사용하려면 활성 작업 패키지 유형이 하나 이상 필요하지만 이 프로젝트에는 하나도 없기 때문에 프로젝트 시작 요청을 활성화하지 못했습니다. 이 프로젝트에 작업 패키지 유형을 하나 이상 추가하세요." + no_status_when_submitted: "작업 패키지 유형 %{type}에는 연결된 상태가 하나 이상 필요하므로 프로젝트 시작 요청을 활성화하지 못했습니다. 이 작업 패키지 유형에 대한 상태 워크플로를 하나 이상 활성화하세요." export: - description_attachment_export: 생성된 아티팩트는 아티팩트 작업 패키지에 PDF 첨부 파일로 저장됩니다. - description_file_link_export: 아티팩트 작업 패키지에는 외부 파일 저장소에 저장된 PDF에 대한 파일 링크가 - 있습니다. 이 프로젝트에 대해 자동으로 관리되는 프로젝트 폴더가 있는 작업 파일 저장소가 필요합니다. 현재는 Nextcloud - 파일 저장소만 지원됩니다. - description_file_storage_selection: 구성된 외부 파일 저장소 중 어떤 저장소를 사용할지 선택합니다. - external_file_storage: 외부 파일 저장소 - label_artifact_export: 아티팩트 내보내기 - label_attachment_export: 작업 패키지 파일 첨부 파일로 저장 - label_file_link_export: 외부 파일 저장소에 파일을 업로드하고 작업 패키지에 파일 링크 추가 - pdf_file_storage: PDF 파일 저장소 - unavailable: 사용할 수 없음 - label_request_submission: 요청 제출 - project_attributes_description: '프로젝트 시작 요청에 포함해야 하는 프로젝트 특성을 선택합니다. 이 목록에는 - 해당 프로젝트에 대해 활성화된 [프로젝트 특성](project_attributes_url)만 포함됩니다. - - ' - enabled_because_required_html: 이 프로젝트 특성은 필수로 정의되어 있으므로 이 프로젝트 시작 요청에 대해 비활성화할 - 수 없습니다. 이 특성은 인스턴스의 관리자가 관리 - 설정에서 변경할 수 있습니다. + description_attachment_export: "생성된 아티팩트는 아티팩트 작업 패키지에 PDF 첨부 파일로 저장됩니다." + description_file_link_export: "아티팩트 작업 패키지에는 외부 파일 저장소에 저장된 PDF에 대한 파일 링크가 있습니다. 이 프로젝트에 대해 자동으로 관리되는 프로젝트 폴더가 있는 작업 파일 저장소가 필요합니다. 현재는 Nextcloud 파일 저장소만 지원됩니다." + description_file_storage_selection: "구성된 외부 파일 저장소 중 어떤 저장소를 사용할지 선택합니다." + external_file_storage: "외부 파일 저장소" + label_artifact_export: "아티팩트 내보내기" + label_attachment_export: "작업 패키지 파일 첨부 파일로 저장" + label_file_link_export: "외부 파일 저장소에 파일을 업로드하고 작업 패키지에 파일 링크 추가" + pdf_file_storage: "PDF 파일 저장소" + unavailable: "사용할 수 없음" + label_request_submission: "요청 제출" + project_attributes_description: > + 프로젝트 시작 요청에 포함해야 하는 프로젝트 특성을 선택합니다. 이 목록에는 해당 프로젝트에 대해 활성화된 [프로젝트 특성](project_attributes_url)만 포함됩니다. + enabled_because_required_html: 이 프로젝트 특성은 필수로 정의되어 있으므로 이 프로젝트 시작 요청에 대해 비활성화할 수 없습니다. 이 특성은 인스턴스의 관리자가 관리 설정에서 변경할 수 있습니다. status: button_edit: 상태 편집 wizard: - sidebar_content_title: 콘텐츠 - sections: 섹션 - title: 프로젝트 시작 요청 - no_help_text: 이 특성에는 정의된 도움말 텍스트가 없습니다. - success: 프로젝트 특성이 저장되고 아티팩트 작업 패키지가 생성되었습니다. + sidebar_content_title: "콘텐츠" + sections: "섹션" + title: "프로젝트 시작 요청" + no_help_text: "이 특성에는 정의된 도움말 텍스트가 없습니다." + success: "프로젝트 특성이 저장되고 아티팩트 작업 패키지가 생성되었습니다." progress_label: "%{current}/%{total}" - create_artifact_work_package_error: 아티팩트 작업 패키지를 만들지 못했습니다 - create_artifact_storage_error: 파일 저장소에 아티팩트를 저장하지 못했습니다 + create_artifact_work_package_error: "아티팩트 작업 패키지를 만들지 못했습니다" + create_artifact_storage_error: "파일 저장소에 아티팩트를 저장하지 못했습니다" lists: create: - success: 수정된 목록이 새 목록으로 저장되었습니다 - failure: '수정된 목록을 저장할 수 없습니다: %{errors}' + success: "수정된 목록이 새 목록으로 저장되었습니다" + failure: "수정된 목록을 저장할 수 없습니다: %{errors}" update: - success: 수정된 목록이 저장되었습니다 - failure: '수정된 목록을 저장할 수 없습니다: %{errors}' + success: "수정된 목록이 저장되었습니다" + failure: "수정된 목록을 저장할 수 없습니다: %{errors}" publish: - success: 이 목록이 공개로 설정되었습니다 - failure: '이 목록은 공개로 설정할 수 없습니다: %{errors}' + success: "이 목록이 공개로 설정되었습니다" + failure: "이 목록은 공개로 설정할 수 없습니다: %{errors}" unpublish: - success: 이 목록이 비공개로 설정되었습니다 - failure: '이 목록은 비공개로 설정할 수 없습니다: %{errors}' - can_be_saved: '목록이 수정되었습니다:' - can_be_saved_as: '수정 사항은 새 목록에만 저장할 수 있습니다:' + success: "이 목록이 비공개로 설정되었습니다" + failure: "이 목록은 비공개로 설정할 수 없습니다: %{errors}" + can_be_saved: "목록이 수정되었습니다:" + can_be_saved_as: "수정 사항은 새 목록에만 저장할 수 있습니다:" members: index: no_results_title_text: 프로젝트에 멤버 파트가 없습니다. no_results_content_text: 프로젝트에 새 멤버 추가 invite_by_mail: "%{mail}에 초대 보내기" - send_invite_to: '다음으로 초대장 보내기:' + send_invite_to: "다음으로 초대장 보내기:" columns: - shared: 공유됨 + shared: "공유됨" filters: - all_shares: 모든 공유 + all_shares: "모든 공유" menu: - all: 모두 - invited: 초대됨 - locked: 잠김 - project_roles: 프로젝트 역할 - wp_shares: 작업 패키지 공유 - groups: 그룹 + all: "모두" + invited: "초대됨" + locked: "잠김" + project_roles: "프로젝트 역할" + wp_shares: "작업 패키지 공유" + groups: "그룹" delete_member_dialog: - title: 멤버 제거 - will_remove_the_users_role: 이렇게 하면 이 프로젝트에서 사용자의 역할이 제거됩니다. - will_remove_the_groups_role: 이렇게 하면 이 프로젝트에서 그룹 역할이 제거됩니다. + title: "멤버 제거" + will_remove_the_users_role: "이렇게 하면 이 프로젝트에서 사용자의 역할이 제거됩니다." + will_remove_the_groups_role: "이렇게 하면 이 프로젝트에서 그룹 역할이 제거됩니다." however_work_packages_shared_with_user_html: - other: 하지만 %{shared_work_packages_link}도 이 사용자와 공유되었습니다. + other: "하지만 %{shared_work_packages_link}도 이 사용자와 공유되었습니다." however_work_packages_shared_with_group_html: - other: 하지만 %{shared_work_packages_link}도 이 그룹과 공유되었습니다. - remove_work_packages_shared_with_user_too: 멤버로 제거된 사용자가 공유 작업 패키지에 계속 액세스할 수 - 있습니다. 공유도 제거하시겠습니까? - remove_work_packages_shared_with_group_too: 멤버로 제거된 그룹이 공유 작업 패키지에 계속 액세스할 수 - 있습니다. 공유도 제거하시겠습니까? + other: "하지만 %{shared_work_packages_link}도 이 그룹과 공유되었습니다." + remove_work_packages_shared_with_user_too: "멤버로 제거된 사용자가 공유 작업 패키지에 계속 액세스할 수 있습니다. 공유도 제거하시겠습니까?" + remove_work_packages_shared_with_group_too: "멤버로 제거된 그룹이 공유 작업 패키지에 계속 액세스할 수 있습니다. 공유도 제거하시겠습니까?" will_not_affect_inherited_shares: "(해당 그룹과 공유된 작업 패키지에는 영향을 미치지 않습니다.)" - can_remove_direct_but_not_shared_roles: 이 사용자를 직접 프로젝트 멤버로 제거할 수 있지만 해당 사용자가 - 속한 그룹도 이 프로젝트의 멤버이므로 그룹을 통해 계속 멤버로 남게 됩니다. + can_remove_direct_but_not_shared_roles: "이 사용자를 직접 프로젝트 멤버로 제거할 수 있지만 해당 사용자가 속한 그룹도 이 프로젝트의 멤버이므로 그룹을 통해 계속 멤버로 남게 됩니다." also_work_packages_shared_with_user_html: - other: 또한 %{shared_work_packages_link}이(가) 이 사용자와 공유되었습니다. - remove_project_membership_or_work_package_shares_too: 직접 멤버인 사용자만 제거하고 공유는 유지하시겠습니까, - 아니면 작업 패키지 공유도 제거하시겠습니까? - will_remove_all_user_access_priveleges: 이 멤버를 삭제하면 프로젝트에 대한 사용자의 모든 액세스 권한이 - 제거됩니다. 이 사용자는 여전히 인스턴스의 일부로 존재하게 됩니다. - will_remove_all_group_access_priveleges: 이 멤버를 삭제하면 프로젝트에 대한 그룹의 모든 액세스 권한이 - 제거됩니다. 이 그룹은 여전히 인스턴스의 일부로 존재하게 됩니다. - cannot_delete_inherited_membership: 이 멤버는 해당 프로젝트의 멤버인 그룹에 속해 있으므로 삭제할 수 없습니다. - cannot_delete_inherited_membership_note_admin_html: 프로젝트의 멤버로서 그룹을 제거하거나 %{administration_settings_link}의 - 그룹에서 이 특정 멤버를 제거할 수 있습니다. - cannot_delete_inherited_membership_note_non_admin: 프로젝트의 멤버로서 그룹을 제거하거나 관리자에게 - 연락하여 이 특정 멤버를 그룹에서 제거할 수 있습니다. + other: "또한 %{shared_work_packages_link}이(가) 이 사용자와 공유되었습니다." + remove_project_membership_or_work_package_shares_too: "직접 멤버인 사용자만 제거하고 공유는 유지하시겠습니까, 아니면 작업 패키지 공유도 제거하시겠습니까?" + will_remove_all_user_access_priveleges: "이 멤버를 삭제하면 프로젝트에 대한 사용자의 모든 액세스 권한이 제거됩니다. 이 사용자는 여전히 인스턴스의 일부로 존재하게 됩니다." + will_remove_all_group_access_priveleges: "이 멤버를 삭제하면 프로젝트에 대한 그룹의 모든 액세스 권한이 제거됩니다. 이 그룹은 여전히 인스턴스의 일부로 존재하게 됩니다." + cannot_delete_inherited_membership: "이 멤버는 해당 프로젝트의 멤버인 그룹에 속해 있으므로 삭제할 수 없습니다." + cannot_delete_inherited_membership_note_admin_html: "프로젝트의 멤버로서 그룹을 제거하거나 %{administration_settings_link}의 그룹에서 이 특정 멤버를 제거할 수 있습니다." + cannot_delete_inherited_membership_note_non_admin: "프로젝트의 멤버로서 그룹을 제거하거나 관리자에게 연락하여 이 특정 멤버를 그룹에서 제거할 수 있습니다." delete_work_package_shares_dialog: - title: 작업 패키지 공유 취소 + title: "작업 패키지 공유 취소" shared_with_this_user_html: other: "%{all_shared_work_packages_link}이(가) 이 사용자와 공유되었습니다." shared_with_this_group_html: other: "%{all_shared_work_packages_link}이(가) 이 그룹과 공유되었습니다." shared_with_permission_html: other: "%{shared_role_name} 권한으로 %{shared_work_packages_link}만 공유되었습니다." - revoke_all_or_with_role: 모든 공유 작업 패키지에 대한 액세스 권한을 취소하시겠습니까, 아니면 %{shared_role_name} - 권한이 있는 것만 취소하시겠습니까? + revoke_all_or_with_role: "모든 공유 작업 패키지에 대한 액세스 권한을 취소하시겠습니까, 아니면 %{shared_role_name} 권한이 있는 것만 취소하시겠습니까?" will_not_affect_inherited_shares: "(해당 그룹과 공유된 작업 패키지에는 영향을 미치지 않습니다.)" - cannot_remove_inherited: 그룹을 통해 공유된 작업 패키지 공유는 제거할 수 없습니다. - cannot_remove_inherited_with_role: "%{shared_role_name} 역할이 있는 작업 패키지 공유는 그룹을 - 통해 공유되며 제거할 수 없습니다." - cannot_remove_inherited_note_admin_html: 그룹에 대한 공유를 취소하거나 %{administration_settings_link}의 - 그룹에서 이 특정 멤버를 제거할 수 있습니다. - cannot_remove_inherited_note_non_admin: 그룹에 대한 공유를 취소하거나 관리자에게 연락하여 이 특정 멤버를 - 그룹에서 제거할 수 있습니다. - will_revoke_directly_granted_access: 이 작업을 수행하면 그룹과 공유된 작업 패키지를 제외한 모든 작업 패키지에 - 대한 액세스 권한이 취소됩니다. - will_revoke_access_to_all: 이 작업을 수행하면 모두에 대한 액세스 권한이 취소됩니다. + cannot_remove_inherited: "그룹을 통해 공유된 작업 패키지 공유는 제거할 수 없습니다." + cannot_remove_inherited_with_role: "%{shared_role_name} 역할이 있는 작업 패키지 공유는 그룹을 통해 공유되며 제거할 수 없습니다." + cannot_remove_inherited_note_admin_html: "그룹에 대한 공유를 취소하거나 %{administration_settings_link}의 그룹에서 이 특정 멤버를 제거할 수 있습니다." + cannot_remove_inherited_note_non_admin: "그룹에 대한 공유를 취소하거나 관리자에게 연락하여 이 특정 멤버를 그룹에서 제거할 수 있습니다." + will_revoke_directly_granted_access: "이 작업을 수행하면 그룹과 공유된 작업 패키지를 제외한 모든 작업 패키지에 대한 액세스 권한이 취소됩니다." + will_revoke_access_to_all: "이 작업을 수행하면 모두에 대한 액세스 권한이 취소됩니다." my: access_token: dialog: token/api: - dialog_title: 새 API 토큰 만들기 - attention_text: API 토큰을 암호처럼 취급하세요. 이 토큰이 있으면 누구든지 이 인스턴스의 정보에 액세스할 수 있습니다. - 신뢰할 수 있는 사용자와만 공유하세요. - dialog_body: 이 토큰을 사용하면 타사 애플리케이션이 해당 인스턴스와 통신할 수 있습니다. 새 API 토큰을 구별하려면 - 이름을 지정하세요. - create_button: 만들기 - name_label: 토큰 이름 + dialog_title: "새 API 토큰 만들기" + attention_text: "API 토큰을 암호처럼 취급하세요. 이 토큰이 있으면 누구든지 이 인스턴스의 정보에 액세스할 수 있습니다. 신뢰할 수 있는 사용자와만 공유하세요." + dialog_body: "이 토큰을 사용하면 타사 애플리케이션이 해당 인스턴스와 통신할 수 있습니다. 새 API 토큰을 구별하려면 이름을 지정하세요." + create_button: "만들기" + name_label: "토큰 이름" created_dialog: - one_time_warning: 이번에만 이 토큰이 표시됩니다. 지금 이 토큰을 복사해야 합니다. + one_time_warning: "이번에만 이 토큰이 표시됩니다. 지금 이 토큰을 복사해야 합니다." token/api: - title: API 토큰이 생성되었습니다 + title: "API 토큰이 생성되었습니다" token/rss: - title: RSS 토큰이 생성되었습니다 - failed_to_reset_token: '액세스 토큰을 재설정하지 못함: %{error}' - failed_to_create_token: '액세스 토큰을 만들지 못했습니다: %{error}' - failed_to_revoke_token: '액세스 토큰을 취소하지 못했습니다: %{error}' - notice_reset_token: '새로운 %{type} 토큰이 생성되었습니다. 액세스 토큰:' - token_value_warning: '참고: 이번에만 이 토큰이 표시됩니다. 지금 이 토큰을 복사해야 합니다.' - no_results_title_text: 가능한 접근 토큰이 없습니다. - notice_api_token_revoked: API 토큰이 삭제되었습니다. 새 토큰을 만들려면 API 섹션의 버튼을 사용하세요. - notice_rss_token_revoked: RSS 토큰이 삭제되었습니다. 새 토큰을 만들려면 RSS 섹션의 링크를 사용하세요. - notice_ical_token_revoked: '"%{project_name}" 프로젝트의 "%{calendar_name}" 캘린더에 - 대한 iCalendar 토큰 "%{token_name}"이(가) 취소되었습니다. 이 토큰이 포함된 iCalendar URL이 이제 유효하지 - 않습니다.' + title: "RSS 토큰이 생성되었습니다" + failed_to_reset_token: "액세스 토큰을 재설정하지 못함: %{error}" + failed_to_create_token: "액세스 토큰을 만들지 못했습니다: %{error}" + failed_to_revoke_token: "액세스 토큰을 취소하지 못했습니다: %{error}" + notice_reset_token: "새로운 %{type} 토큰이 생성되었습니다. 액세스 토큰:" + token_value_warning: "참고: 이번에만 이 토큰이 표시됩니다. 지금 이 토큰을 복사해야 합니다." + no_results_title_text: "가능한 접근 토큰이 없습니다." + notice_api_token_revoked: "API 토큰이 삭제되었습니다. 새 토큰을 만들려면 API 섹션의 버튼을 사용하세요." + notice_rss_token_revoked: "RSS 토큰이 삭제되었습니다. 새 토큰을 만들려면 RSS 섹션의 링크를 사용하세요." + notice_ical_token_revoked: '"%{project_name}" 프로젝트의 "%{calendar_name}" 캘린더에 대한 iCalendar 토큰 "%{token_name}"이(가) 취소되었습니다. 이 토큰이 포함된 iCalendar URL이 이제 유효하지 않습니다.' password_confirmation_dialog: - confirmation_required: 이 변경 내용을 확인하려면 계정 암호를 입력해야 합니다. - title: 계속하려면 암호 확인 + confirmation_required: "이 변경 내용을 확인하려면 계정 암호를 입력해야 합니다." + title: "계속하려면 암호 확인" news: index: no_results_title_text: 보고할 소식이 없습니다. no_results_content_text: 소식 항목 추가 roles: permissions: - section_check_all_label: 모든 %{module} 권한 할당 - section_uncheck_all_label: 모든 %{module} 권한 할당 취소 + section_check_all_label: "모든 %{module} 권한 할당" + section_uncheck_all_label: "모든 %{module} 권한 할당 취소" report: matrix_caption: "%{module} 모듈에 대한 권한 매트릭스" matrix_checkbox_label: "%{role} 역할에 %{permission} 권한 할당" - matrix_check_all_label: 모든 역할에 모든 %{module} 권한 할당 - matrix_uncheck_all_label: 모든 역할에서 모든 %{module} 권한 할당 취소 - matrix_check_uncheck_all_in_row_label_html: 모든 역할에 대한 %{permission} - 권한 토글 - matrix_check_uncheck_all_in_col_label_html: "%{role} 역할에 대한 모든 %{module} - 권한 토글" + matrix_check_all_label: "모든 역할에 모든 %{module} 권한 할당" + matrix_uncheck_all_label: "모든 역할에서 모든 %{module} 권한 할당 취소" + matrix_check_uncheck_all_in_row_label_html: "모든 역할에 대한 %{permission} 권한 토글" + matrix_check_uncheck_all_in_col_label_html: "%{role} 역할에 대한 모든 %{module} 권한 토글" users: autologins: prompt: "%{num_days}일 동안 로그인 상태 유지" sessions: session_name: "%{os_name}의 %{browser_name} %{browser_version}" - browser: 브라우저 - expires: 만료 - last_connection: 마지막 연결 - device: 장치/OS - unknown_browser: 알 수 없는 브라우저 - unknown_os: 알 수 없는 운영 체제 + browser: "브라우저" + expires: "만료" + last_connection: "마지막 연결" + device: "장치/OS" + unknown_browser: "알 수 없는 브라우저" + unknown_os: "알 수 없는 운영 체제" unknown: "(알 수 없음)" browser_session: "(브라우저 세션)" - current: 현재(이 장치) - title: 세션 관리 - instructions: 다음 장치를 통해 계정에 로그인했습니다. 사용자가 알지 못하는 세션이나 제어하지 않는 장치에서 로그인한 세션은 - 취소하세요. - may_not_delete_current: 현재 세션을 삭제할 수 없습니다. - deletion_warning: 이 세션을 취소하시겠습니까? 이 장치에서 로그아웃됩니다. + current: "현재(이 장치)" + title: "세션 관리" + instructions: "다음 장치를 통해 계정에 로그인했습니다. 사용자가 알지 못하는 세션이나 제어하지 않는 장치에서 로그인한 세션은 취소하세요." + may_not_delete_current: "현재 세션을 삭제할 수 없습니다." + deletion_warning: "이 세션을 취소하시겠습니까? 이 장치에서 로그아웃됩니다." groups: - member_in_these_groups: '이 사용자는 현재 다음 그룹의 멤버입니다:' + member_in_these_groups: "이 사용자는 현재 다음 그룹의 멤버입니다:" no_results_title_text: 이 사용자는 현재 어떤 그룹의 멤버도 아닙니다. - summary_with_more: "%{names} 및 %{count_link}의 멤버입니다." + summary_with_more: '%{names} 및 %{count_link}의 멤버입니다.' more: "%{count}개 더 보기" - summary: "%{names}의 멤버입니다." + summary: '%{names}의 멤버입니다.' memberships: no_results_title_text: 이 사용자는 프로젝트의 멤버가 아닙니다. - open_profile: 프로필 열기 + open_profile: "프로필 열기" invite_user_modal: - invite: 초대 + invite: "초대" title: - invite: 사용자 초대 + invite: "사용자 초대" invite_to_project: "%{type}을(를) %{project}에 초대" invite_principal_to_project: "%{principal}을(를) %{project}에 초대" project: - label: 프로젝트 - required: 프로젝트를 선택하십시오 - next_button: 다음 - no_results: 프로젝트가 없습니다 - no_invite_rights: 이 프로젝트에 멤버를 초대할 권한이 없습니다 + label: "프로젝트" + required: "프로젝트를 선택하십시오" + next_button: "다음" + no_results: "프로젝트가 없습니다" + no_invite_rights: "이 프로젝트에 멤버를 초대할 권한이 없습니다" type: - required: 초대 유형을 선택해주십시오 + required: "초대 유형을 선택해주십시오" user: title: "%{project_name}에 사용자 초대" - description: 선택한 프로젝트 내 할당된 역할을 토대로 하는 권한 + description: "선택한 프로젝트 내 할당된 역할을 토대로 하는 권한" group: title: "%{project_name}에 그룹 초대" - description: 선택한 프로젝트 내 할당된 역할을 토대로 하는 권한 + description: "선택한 프로젝트 내 할당된 역할을 토대로 하는 권한" placeholder_user: title: "%{project_name}에 플레이스홀더 사용자 추가" - title_no_ee: 플레이스홀더 사용자(Enterprise Edition 전용 추가 기능) - description: 프로젝트에 대한 접근 권한이 없으며 이메일이 보내지지 않았습니다. - already_member_message: 이미 %{project}의 멤버입니다 + title_no_ee: "플레이스홀더 사용자(Enterprise Edition 전용 추가 기능)" + description: "프로젝트에 대한 접근 권한이 없으며 이메일이 보내지지 않았습니다." + already_member_message: "이미 %{project}의 멤버입니다" principal: - no_results_user: 사용자가 없습니다. - invite_user: '초대:' - no_results_placeholder: 플레이스홀더가 없습니다 - create_new_placeholder: '새 플레이스홀더 생성:' - no_results_group: 그룹이 없습니다 + no_results_user: "사용자가 없습니다." + invite_user: "초대:" + no_results_placeholder: "플레이스홀더가 없습니다" + create_new_placeholder: "새 플레이스홀더 생성:" + no_results_group: "그룹이 없습니다" invite_to_project: "%{project_name}에 초대" required: - user: 사용자를 선택하십시오 - placeholder: 플레이스홀더를 선택하십시오 - group: 그룹을 선택하십시오 + user: "사용자를 선택하십시오" + placeholder: "플레이스홀더를 선택하십시오" + group: "그룹을 선택하십시오" role: label: "%{project} 내 역할" - no_roles_found: 역할이 없습니다 - description: '사용자가 프로젝트에 참여할 때 부여되는 역할입니다. 역할에 따라 사용자가 수행할 수 있는 작업과 볼 수 있는 - 정보가 정의됩니다. [역할 및 권한에 대해 자세히 알아보세요.](docs_url) - - ' - required: 역할을 선택하십시오 + no_roles_found: "역할이 없습니다" + description: > + 사용자가 프로젝트에 참여할 때 부여되는 역할입니다. 역할에 따라 사용자가 수행할 수 있는 작업과 볼 수 있는 정보가 정의됩니다. [역할 및 권한에 대해 자세히 알아보세요.](docs_url) + required: "역할을 선택하십시오" message: - label: 초대 메시지 - description: 사용자에게 이메일이 전송됩니다. 여기에 개인 메시지를 추가할 수도 있습니다. 초대에 관한 유용한 설명을 넣거나, - 시작하는 데 도움이 되는 프로젝트 관련 정보를 넣을 수 있습니다. + label: "초대 메시지" + description: "사용자에게 이메일이 전송됩니다. 여기에 개인 메시지를 추가할 수도 있습니다. 초대에 관한 유용한 설명을 넣거나, 시작하는 데 도움이 되는 프로젝트 관련 정보를 넣을 수 있습니다." summary: - next_button: 초대장 보내기 + next_button: "초대장 보내기" success_message: - user: 사용자는 로그인하여 %{project}에 접근할 수 있게 되었습니다. 한편 당신은 해당 사용자에 대한 계획을 세우거나 작업 - 패키지를 할당할 수 있습니다. - placeholder_user: 이제 %{project}에서 이 플레이스홀더를 사용할 수 있게 되었습니다. 한편 당신은 해당 사용자에 - 대한 계획을 세우거나 작업 패키지를 할당할 수 있습니다. - group: 이제 이 그룹은 %{project}의 일부입니다. 한편 당신은 해당 사용자에 대한 계획을 세우거나 작업 패키지를 할당할 - 수 있습니다. + user: "사용자는 로그인하여 %{project}에 접근할 수 있게 되었습니다. 한편 당신은 해당 사용자에 대한 계획을 세우거나 작업 패키지를 할당할 수 있습니다." + placeholder_user: "이제 %{project}에서 이 플레이스홀더를 사용할 수 있게 되었습니다. 한편 당신은 해당 사용자에 대한 계획을 세우거나 작업 패키지를 할당할 수 있습니다." + group: "이제 이 그룹은 %{project}의 일부입니다. 한편 당신은 해당 사용자에 대한 계획을 세우거나 작업 패키지를 할당할 수 있습니다." page: - text: 텍스트 + text: "텍스트" placeholder_users: - right_to_manage_members_missing: '플레이스홀더 사용자를 삭제할 수 없습니다. 플레이스홀더 사용자가 멤버로 들어가 - 있는 모든 프로젝트의 구성원을 관리할 권한이 없습니다. - - ' - delete_tooltip: 플레이스홀더 사용자 삭제 + right_to_manage_members_missing: > + 플레이스홀더 사용자를 삭제할 수 없습니다. 플레이스홀더 사용자가 멤버로 들어가 있는 모든 프로젝트의 구성원을 관리할 권한이 없습니다. + delete_tooltip: "플레이스홀더 사용자 삭제" deletion_info: - heading: 플레이스홀더 사용자 %{name} 삭제 - data_consequences: '플레이스홀더 사용자의 모든 항목(예: 담당자, 책임자, 기타 사용자 값 등)은 "삭제된 사용자"라는 - 계정에 다시 할당됩니다. 삭제된 모든 계정의 데이터는 이 계정에 다시 할당되기 때문에 사용자가 생성한 데이터와 다른 삭제된 계정의 데이터를 - 구별할 수 없습니다. - - ' - irreversible: 이 작업은 취소할 수 없습니다 - confirmation: 삭제를 확인하려면 플레이스홀더 사용자 이름 %{name}(을)를 입력하세요. + heading: "플레이스홀더 사용자 %{name} 삭제" + data_consequences: > + 플레이스홀더 사용자의 모든 항목(예: 담당자, 책임자, 기타 사용자 값 등)은 "삭제된 사용자"라는 계정에 다시 할당됩니다. 삭제된 모든 계정의 데이터는 이 계정에 다시 할당되기 때문에 사용자가 생성한 데이터와 다른 삭제된 계정의 데이터를 구별할 수 없습니다. + irreversible: "이 작업은 취소할 수 없습니다" + confirmation: "삭제를 확인하려면 플레이스홀더 사용자 이름 %{name}(을)를 입력하세요." priorities: edit: priority_color_text: | @@ -1147,10 +1055,10 @@ ko: default: caption: 이 우선 순위를 기본값으로 설정하면 이전 기본 우선 순위가 재정의됩니다. reactions: - action_title: 반응 - add_reaction: 반응 추가 + action_title: "반응" + add_reaction: "반응 추가" react_with: "%{reaction}(으)로 반응" - and_user: 및 %{user} + and_user: "및 %{user}" and_others: other: 외 %{count}건 reaction_by: "%{reaction} -" @@ -1163,7 +1071,8 @@ ko: status_color_text: | 이 상태 색상을 할당하거나 변경하려면 클릭하세요. 상태 버튼에 표시되고 테이블의 작업 패키지를 강조 표시하는 데 사용할 수 있습니다. - status_default_text: 새 작업 패키지는 기본적으로 이 유형으로 설정됩니다. 읽기 전용으로 설정할 수 없습니다. + status_default_text: |- + 새 작업 패키지는 기본적으로 이 유형으로 설정됩니다. 읽기 전용으로 설정할 수 없습니다. status_excluded_from_totals_text: |- 계층의 총 작업, 남은 작업 및 완료 %에서 이 상태의 작업 패키지를 제외하려면 이 옵션을 선택하세요. @@ -1180,62 +1089,58 @@ ko: no_results_title_text: 작업 패키지 상태가 없습니다. no_results_content_text: 새 상태 추가 headers: - is_default: 기본 - is_closed: 닫음 - is_readonly: 읽기 전용 - excluded_from_totals: 합계에서 제외됨 + is_default: "기본" + is_closed: "닫음" + is_readonly: "읽기 전용" + excluded_from_totals: "합계에서 제외됨" themes: - dark: 다크 - light: 라이트 - sync_with_os: 자동(OS 색상 모드와 일치) + dark: "다크" + light: "라이트" + sync_with_os: "자동(OS 색상 모드와 일치)" types: index: no_results_title_text: 타입이 없습니다. no_results_content_text: 새 타입 생성 edit: form_configuration: - tab: 양식 구성 + tab: "양식 구성" projects: tab: 프로젝트 enable_all: 모든 프로젝트에 대해 활성화 select_projects: 프로젝트 선택 select_projects_description: 이 유형을 사용하려는 프로젝트를 선택합니다. settings: - tab: 설정 - type_color_text: 선택한 색상은 Gantt 차트 또는 작업 패키지 테이블에서 다양한 유형을 구분합니다. 따라서 진한 색상을 - 사용하는 것이 좋습니다. + tab: "설정" + type_color_text: 선택한 색상은 Gantt 차트 또는 작업 패키지 테이블에서 다양한 유형을 구분합니다. 따라서 진한 색상을 사용하는 것이 좋습니다. subject_configuration: - tab: 제목 구성 + tab: "제목 구성" manually_editable_subjects: - label: 수동으로 편집 가능한 제목 - caption: 사용자가 제한 없이 작업 패키지 제목을 수동으로 입력하고 편집할 수 있습니다. + label: "수동으로 편집 가능한 제목" + caption: "사용자가 제한 없이 작업 패키지 제목을 수동으로 입력하고 편집할 수 있습니다." automatically_generated_subjects: - label: 자동으로 생성되는 제목 - caption: 참조된 특성과 텍스트를 사용하여 패턴을 정의하고 작업 패키지 제목을 자동으로 생성하세요. 사용자는 제목을 수동으로 - 편집할 수 없습니다. + label: "자동으로 생성되는 제목" + caption: "참조된 특성과 텍스트를 사용하여 패턴을 정의하고 작업 패키지 제목을 자동으로 생성하세요. 사용자는 제목을 수동으로 편집할 수 없습니다." token: label_with_context: "%{attribute_context}: %{attribute_label}" context: - work_package: 작업 패키지 - parent: 부모 - project: 프로젝트 + work_package: "작업 패키지" + parent: "부모" + project: "프로젝트" pattern: - label: 제목 패턴 + label: "제목 패턴" caption: 텍스트를 추가하여 패턴을 만들거나 "/"를 입력하여 [지원되는 특성](attributes_url)을 검색합니다. insert_as_text: '특성을 찾지 못했습니다. 텍스트로 추가: "%{word}"' export_configuration: - tab: PDF 생성 - intro: 사용 가능한 템플릿 중에서 이 유형에 대해 활성화하려는 템플릿을 선택하세요. 템플릿은 이 유형을 사용하여 작업 패키지의 - 내보낸 PDF에서 표시되는 디자인과 특성을 결정합니다. 목록의 첫 번째 템플릿이 기본적으로 선택됩니다. + tab: "PDF 생성" + intro: "사용 가능한 템플릿 중에서 이 유형에 대해 활성화하려는 템플릿을 선택하세요. 템플릿은 이 유형을 사용하여 작업 패키지의 내보낸 PDF에서 표시되는 디자인과 특성을 결정합니다. 목록의 첫 번째 템플릿이 기본적으로 선택됩니다." pdf_export_templates: - label: PDF 내보내기 템플릿 + label: "PDF 내보내기 템플릿" actions: - label_enable_all: 모두 활성화 - label_disable_all: 모두 비활성화 + label_enable_all: "모두 활성화" + label_disable_all: "모두 비활성화" versions: overview: - work_packages_in_archived_projects: 해당 버전은 이 버전에 할당된 작업 패키지가 아직 있는 보관된 프로젝트와 - 공유됩니다. 이러한 버전은 카운트되지만, 링크된 보기에 나타나지는 않습니다. + work_packages_in_archived_projects: "해당 버전은 이 버전에 할당된 작업 패키지가 아직 있는 보관된 프로젝트와 공유됩니다. 이러한 버전은 카운트되지만, 링크된 보기에 나타나지는 않습니다." no_results_title_text: 이 버전에 할당된 작업 패키지가 없습니다. wiki: page_not_editable_index: 요청한 페이지가 (아직) 존재하지 않습니다. 모든 위키 페이지의 색인으로 리디렉션되었습니다. @@ -1245,16 +1150,14 @@ ko: no_results_content_text: 위키 페이지 추가 workflows: form: - matrix_caption: 워크플로 매트릭스 - matrix_caption_assignee: 담당자에 대한 워크플로 매트릭스 - matrix_caption_author: 작성자에 대한 워크플로 매트릭스 + matrix_caption: "워크플로 매트릭스" + matrix_caption_assignee: "담당자에 대한 워크플로 매트릭스" + matrix_caption_author: "작성자에 대한 워크플로 매트릭스" matrix_checkbox_label: "%{old_status}에서 %{new_status}(으)로 전환 허용" - matrix_check_all_label: 모든 전환 허용 - matrix_uncheck_all_label: 모든 전환 허용 안 함 - matrix_check_uncheck_all_in_row_label_html: "%{old_status}에서 모든 새로운 - 상태로 전환 토글" - matrix_check_uncheck_all_in_col_label_html: 모든 이전 상태에서 %{new_status}(으)로 - 전환 토글 + matrix_check_all_label: "모든 전환 허용" + matrix_uncheck_all_label: "모든 전환 허용 안 함" + matrix_check_uncheck_all_in_row_label_html: "%{old_status}에서 모든 새로운 상태로 전환 토글" + matrix_check_uncheck_all_in_col_label_html: "모든 이전 상태에서 %{new_status}(으)로 전환 토글" work_flows: index: no_results_title_text: 작업 흐름이 없습니다. @@ -1262,81 +1165,67 @@ ko: datepicker_modal: banner: description: - automatic_mobile: 시작 날짜가 파생되었습니다. - click_on_show_relations_to_open_gantt: Gantt 개요를 보려면 "%{button_name}" 클릭을 - 하세요. - manual_mobile: 관계를 무시합니다. - manual_gap_between_predecessors: 이것과 모든 선행 단계 사이에 간격이 있습니다. - manual_overlap_with_predecessors: 하나 이상의 선행 단계와 중복됩니다. - manual_with_children: 자식 작업 패키지가 있지만 시작 날짜는 무시됩니다. + automatic_mobile: "시작 날짜가 파생되었습니다." + click_on_show_relations_to_open_gantt: 'Gantt 개요를 보려면 "%{button_name}" 클릭을 하세요.' + manual_mobile: "관계를 무시합니다." + manual_gap_between_predecessors: "이것과 모든 선행 단계 사이에 간격이 있습니다." + manual_overlap_with_predecessors: "하나 이상의 선행 단계와 중복됩니다." + manual_with_children: "자식 작업 패키지가 있지만 시작 날짜는 무시됩니다." title: - automatic_mobile: 자동으로 스케줄링됩니다. - automatic_with_children: 날짜는 자식 작업 패키지에 의해 결정됩니다. - automatic_with_predecessor: 시작 날짜는 선행 단계에 의해 설정됩니다. - manual_mobile: 수동으로 스케줄링됩니다. - manually_scheduled: 수동으로 스케줄링됩니다. 날짜는 관계에 의해 영향을 받지 않습니다. + automatic_mobile: "자동으로 스케줄링됩니다." + automatic_with_children: "날짜는 자식 작업 패키지에 의해 결정됩니다." + automatic_with_predecessor: "시작 날짜는 선행 단계에 의해 설정됩니다." + manual_mobile: "수동으로 스케줄링됩니다." + manually_scheduled: "수동으로 스케줄링됩니다. 날짜는 관계에 의해 영향을 받지 않습니다." blankslate: - title: 선행 단계 없음 - description: 자동 스케줄링을 활성화하려면 이 작업 패키지에 하나 이상의 선행 단계가 있어야 합니다. 그러면 가장 가까운 선행 - 단계 후에 시작되도록 자동으로 스케줄링됩니다. + title: "선행 단계 없음" + description: "자동 스케줄링을 활성화하려면 이 작업 패키지에 하나 이상의 선행 단계가 있어야 합니다. 그러면 가장 가까운 선행 단계 후에 시작되도록 자동으로 스케줄링됩니다." ignore_non_working_days: - title: 근무일만 + title: "근무일만" mode: - title: 스케줄링 모드 - automatic: 자동 - manual: 수동 - show_relations: 관계 표시 - update_inputs_aria_live_message: 날짜 선택기가 업데이트되었습니다. %{message} + title: "스케줄링 모드" + automatic: "자동" + manual: "수동" + show_relations: "관계 표시" + update_inputs_aria_live_message: "날짜 선택기가 업데이트되었습니다. %{message}" tabs: - aria_label: 날짜 선택기 탭 - children: 하위 - dates: 날짜 - predecessors: 선행 단계 - successors: 후속 단계 + aria_label: "날짜 선택기 탭" + children: "하위" + dates: "날짜" + predecessors: "선행 단계" + successors: "후속 단계" blankslate: predecessors: - title: 선행 단계 없음 - description: 이 작업 패키지에는 선행 단계가 없습니다. + title: "선행 단계 없음" + description: "이 작업 패키지에는 선행 단계가 없습니다." successors: - title: 후속 단계 없음 - description: 이 작업 패키지에는 후속 단계가 없습니다. + title: "후속 단계 없음" + description: "이 작업 패키지에는 후속 단계가 없습니다." children: - title: 자식 없음 - description: 이 작업 패키지에는 자식이 없습니다. + title: "자식 없음" + description: "이 작업 패키지에는 자식이 없습니다." x_descendants: other: "%{count}개 작업 패키지 하위 항목" bulk: - copy_failed: 작업 패키지를 복사할 수 없습니다. - move_failed: 작업 패키지를 이동할 수 없습니다. - could_not_be_saved: '다음 작업 패키지를 저장할 수 없습니다:' + copy_failed: "작업 패키지를 복사할 수 없습니다." + move_failed: "작업 패키지를 이동할 수 없습니다." + could_not_be_saved: "다음 작업 패키지를 저장할 수 없습니다:" none_could_be_saved: "%{total}개 작업 패키지 중 아무것도 업데이트할 수 없습니다." - x_out_of_y_could_be_saved: "%{failing}/%{total}개 작업 패키지를 업데이트할 수 없지만 %{success}개는 - 성공했습니다." - selected_because_descendants: "%{selected}개 작업 패키지가 선택되었지만, 하위 작업 패키지를 포함하여 - 총 %{total}개 작업 패키지가 영향을 받았습니다." - descendant: 선택한 항목의 하위 작업 패키지 + x_out_of_y_could_be_saved: "%{failing}/%{total}개 작업 패키지를 업데이트할 수 없지만 %{success}개는 성공했습니다." + selected_because_descendants: "%{selected}개 작업 패키지가 선택되었지만, 하위 작업 패키지를 포함하여 총 %{total}개 작업 패키지가 영향을 받았습니다." + descendant: "선택한 항목의 하위 작업 패키지" move: - no_common_statuses_exists: 선택한 모든 작업 패키지에 사용 가능한 상태가 없습니다. 해당 상태를 변경할 수 없습니다. - unsupported_for_multiple_projects: 여러 프로젝트에서 작업 패키지 일괄 이동/복사는 지원되지 않습니다. - current_type_not_available_in_target_project: '현재 작업 패키지 유형이 대상 프로젝트에서 활성화되어 - 있지 않습니다. 유형을 변경하지 않으려면 대상 프로젝트에서 해당 유형을 활성화하세요. 그렇지 않으면 목록에서 대상 프로젝트의 사용 가능한 - 유형을 선택하세요. - - ' - bulk_current_type_not_available_in_target_project: '현재 작업 패키지 유형이 대상 프로젝트에서 - 활성화되어 있지 않습니다. 유형을 변경하지 않으려면 대상 프로젝트에서 해당 유형을 활성화하세요. 그렇지 않으면 목록에서 대상 프로젝트의 - 사용 가능한 유형을 선택하세요. - - ' + no_common_statuses_exists: "선택한 모든 작업 패키지에 사용 가능한 상태가 없습니다. 해당 상태를 변경할 수 없습니다." + unsupported_for_multiple_projects: "여러 프로젝트에서 작업 패키지 일괄 이동/복사는 지원되지 않습니다." + current_type_not_available_in_target_project: > + 현재 작업 패키지 유형이 대상 프로젝트에서 활성화되어 있지 않습니다. 유형을 변경하지 않으려면 대상 프로젝트에서 해당 유형을 활성화하세요. 그렇지 않으면 목록에서 대상 프로젝트의 사용 가능한 유형을 선택하세요. + bulk_current_type_not_available_in_target_project: > + 현재 작업 패키지 유형이 대상 프로젝트에서 활성화되어 있지 않습니다. 유형을 변경하지 않으려면 대상 프로젝트에서 해당 유형을 활성화하세요. 그렇지 않으면 목록에서 대상 프로젝트의 사용 가능한 유형을 선택하세요. sharing: missing_workflow_warning: - title: 작업 패키지 공유에 대한 워크플로 누락 - message: "'작업 패키지 편집자' 역할에 대해 구성된 워크플로가 없습니다. 워크플로가 없으면 사용자와 공유된 워크플로는 작업 - 패키지의 상태를 변경할 수 없습니다. 워크플로를 복사할 수는 있습니다. 소스 유형(예: '작업')과 소스 역할(예: '멤버')을 - 선택하세요. 그런 다음 대상 유형을 선택하세요. 시작하기 위해 모든 유형을 대상으로 선택할 수 있습니다. 마지막으로 '작업 패키지 - 편집자' 역할을 대상으로 선택하고 '복사'를 누르세요. 기본값을 생성한 후 다른 모든 역할에 대해 수행하는 것처럼 워크플로를 미세 - 조정하세요." - link_message: 관리에서 워크플로를 구성하세요. + title: "작업 패키지 공유에 대한 워크플로 누락" + message: "'작업 패키지 편집자' 역할에 대해 구성된 워크플로가 없습니다. 워크플로가 없으면 사용자와 공유된 워크플로는 작업 패키지의 상태를 변경할 수 없습니다. 워크플로를 복사할 수는 있습니다. 소스 유형(예: '작업')과 소스 역할(예: '멤버')을 선택하세요. 그런 다음 대상 유형을 선택하세요. 시작하기 위해 모든 유형을 대상으로 선택할 수 있습니다. 마지막으로 '작업 패키지 편집자' 역할을 대상으로 선택하고 '복사'를 누르세요. 기본값을 생성한 후 다른 모든 역할에 대해 수행하는 것처럼 워크플로를 미세 조정하세요." + link_message: "관리에서 워크플로를 구성하세요." summary: reports: category: @@ -1355,577 +1244,558 @@ ko: no_results_title_text: 현재 사용가능한 버전이 없습니다. work_package_relations_tab: index: - action_bar_title: 다른 작업 패키지에 관계를 추가하여 이러한 항목 간에 링크를 만드세요. + action_bar_title: "다른 작업 패키지에 관계를 추가하여 이러한 항목 간에 링크를 만드세요." no_results_title_text: 현재 사용 가능한 관계가 없습니다. - blankslate_heading: 관계 없음 - blankslate_description: 이 작업 패키지에는 아직 관계가 없습니다. - label_add_child_button: 자식 + blankslate_heading: "관계 없음" + blankslate_description: "이 작업 패키지에는 아직 관계가 없습니다." + label_add_child_button: "자식" label_add_x: "%{x} 추가" label_edit_x: "%{x} 편집" - label_add_description: 설명 추가 + label_add_description: "설명 추가" lag: - subject: 지연 + subject: "지연" caption: |- 두 작업 패키지 간에 유지할 최소 근무일 수입니다. 음수일 수도 있습니다. relations: - label_new_child_created: 새로운 작업 패키지를 만들고 자식으로 추가함 - label_relates_singular: 관련 항목 - label_relates_plural: 관련 항목 - label_relates_to_singular: 관련 항목 - label_relates_to_plural: 관련 항목 - relates_description: 추가 효과 없이 두 작업 패키지 간에 표시되는 링크를 만듭니다 - relates_to_description: 추가 효과 없이 두 작업 패키지 간에 표시되는 링크를 만듭니다 - label_precedes_singular: 후임자(이후) - label_precedes_plural: 후임자(이후) - precedes_description: 관련 작업 패키지는 반드시 이 패키지가 완료된 후에 시작되어야 합니다 - label_follows_singular: 선행 단계(이전) - label_follows_plural: 선행 단계(이전) - follows_description: 이 패키지를 시작하려면 관련 작업 패키지가 반드시 먼저 완료되어야 합니다 - label_child_singular: 자식 - label_child_plural: 자식 - new_child: 새 자식 만들기 - new_child_description: 관련 작업 패키지를 현재(부모) 작업 패키지의 하위 항목으로 만듭니다 - child: 자식 - child_description: 관련 작업 패키지를 현재(부모) 작업 패키지의 하위 항목으로 만듭니다 - parent: 부모 - parent_description: 관련 작업 패키지를 현재(자식) 작업 패키지의 부모로 만듭니다 - label_closest: 가장 가까운 대상 - label_blocks_singular: 블록 - label_blocks_plural: 블록 - blocks_description: 이 패키지가 먼저 종료될 때까지 관련 작업 패키지를 종료할 수 없습니다 - label_blocked_singular: 차단한 사용자 - label_blocked_plural: 차단한 사용자 - label_blocked_by_singular: 차단한 사용자 - label_blocked__by_plural: 차단한 사용자 - blocked_description: 관련 패키지가 먼저 종료될 때까지 이 작업 패키지를 종료할 수 없습니다 - blocked_by_description: 관련 패키지가 먼저 종료될 때까지 이 작업 패키지를 종료할 수 없습니다 - label_duplicates_singular: 중복 - label_duplicates_plural: 중복 - duplicates_description: 관련 작업 패키지의 사본입니다 - label_duplicated_singular: 복제한 사용자 - label_duplicated_plural: 복제한 사용자 - label_duplicated_by_singular: 복제한 사용자 - label_duplicated_by_plural: 복제한 사용자 - duplicated_by_description: '관련 작업 패키지는 다음의 사본입니다:' - duplicated_description: '관련 작업 패키지는 다음의 사본입니다:' - label_includes_singular: 포함 - label_includes_plural: 포함 - includes_description: 관련 작업 패키지를 추가 효과 없이 이 패키지 포함으로 표시합니다 - label_partof_singular: '다음의 일부:' - label_partof_plural: '다음의 일부:' - label_part_of_singular: '다음의 일부:' - label_part_of_plural: '다음의 일부:' - partof_description: 관련 작업 패키지를 추가 효과 없이 이 패키지의 일부로 표시합니다 - part_of_description: 관련 작업 패키지를 추가 효과 없이 이 패키지의 일부로 표시합니다 - label_requires_singular: 필수 - label_requires_plural: 필수 - requires_description: 관련 작업 패키지를 이 패키지에 대한 요구 사항으로 표시합니다 - label_required_singular: '다음에 의해 요구됨:' - label_required_plural: '다음에 의해 요구됨:' - required_description: 이 작업 패키지를 관련 패키지에 대한 요구 사항으로 표시합니다 - label_parent_singular: 부모 - label_parent_plural: 부모 - label_other_relations: 기타 관계 - ghost_relation_title: 관련 작업 패키지 - ghost_relation_description: 권한 문제로 인해 이 항목이 표시되지 않습니다. + label_new_child_created: "새로운 작업 패키지를 만들고 자식으로 추가함" + label_relates_singular: "관련 항목" + label_relates_plural: "관련 항목" + label_relates_to_singular: "관련 항목" + label_relates_to_plural: "관련 항목" + relates_description: "추가 효과 없이 두 작업 패키지 간에 표시되는 링크를 만듭니다" + relates_to_description: "추가 효과 없이 두 작업 패키지 간에 표시되는 링크를 만듭니다" + label_precedes_singular: "후임자(이후)" + label_precedes_plural: "후임자(이후)" + precedes_description: "관련 작업 패키지는 반드시 이 패키지가 완료된 후에 시작되어야 합니다" + label_follows_singular: "선행 단계(이전)" + label_follows_plural: "선행 단계(이전)" + follows_description: "이 패키지를 시작하려면 관련 작업 패키지가 반드시 먼저 완료되어야 합니다" + label_child_singular: "자식" + label_child_plural: "자식" + new_child: "새 자식 만들기" + new_child_description: "관련 작업 패키지를 현재(부모) 작업 패키지의 하위 항목으로 만듭니다" + child: "자식" + child_description: "관련 작업 패키지를 현재(부모) 작업 패키지의 하위 항목으로 만듭니다" + parent: "부모" + parent_description: "관련 작업 패키지를 현재(자식) 작업 패키지의 부모로 만듭니다" + label_closest: "가장 가까운 대상" + label_blocks_singular: "블록" + label_blocks_plural: "블록" + blocks_description: "이 패키지가 먼저 종료될 때까지 관련 작업 패키지를 종료할 수 없습니다" + label_blocked_singular: "차단한 사용자" + label_blocked_plural: "차단한 사용자" + label_blocked_by_singular: "차단한 사용자" + label_blocked__by_plural: "차단한 사용자" + blocked_description: "관련 패키지가 먼저 종료될 때까지 이 작업 패키지를 종료할 수 없습니다" + blocked_by_description: "관련 패키지가 먼저 종료될 때까지 이 작업 패키지를 종료할 수 없습니다" + label_duplicates_singular: "중복" + label_duplicates_plural: "중복" + duplicates_description: "관련 작업 패키지의 사본입니다" + label_duplicated_singular: "복제한 사용자" + label_duplicated_plural: "복제한 사용자" + label_duplicated_by_singular: "복제한 사용자" + label_duplicated_by_plural: "복제한 사용자" + duplicated_by_description: "관련 작업 패키지는 다음의 사본입니다:" + duplicated_description: "관련 작업 패키지는 다음의 사본입니다:" + label_includes_singular: "포함" + label_includes_plural: "포함" + includes_description: "관련 작업 패키지를 추가 효과 없이 이 패키지 포함으로 표시합니다" + label_partof_singular: "다음의 일부:" + label_partof_plural: "다음의 일부:" + label_part_of_singular: "다음의 일부:" + label_part_of_plural: "다음의 일부:" + partof_description: "관련 작업 패키지를 추가 효과 없이 이 패키지의 일부로 표시합니다" + part_of_description: "관련 작업 패키지를 추가 효과 없이 이 패키지의 일부로 표시합니다" + label_requires_singular: "필수" + label_requires_plural: "필수" + requires_description: "관련 작업 패키지를 이 패키지에 대한 요구 사항으로 표시합니다" + label_required_singular: "다음에 의해 요구됨:" + label_required_plural: "다음에 의해 요구됨:" + required_description: "이 작업 패키지를 관련 패키지에 대한 요구 사항으로 표시합니다" + label_parent_singular: "부모" + label_parent_plural: "부모" + label_other_relations: "기타 관계" + ghost_relation_title: "관련 작업 패키지" + ghost_relation_description: "권한 문제로 인해 이 항목이 표시되지 않습니다." label_invitation: 초대 account: - delete: 계정 삭제 - delete_confirmation: 이 계정을 정말로 삭제합니까? - deletion_pending: 계정 삭제가 예약되었습니다. 이 프로세스는 백그라운드에서 수행됩니다. 사용자가 완전히 삭제될 때까지 몇 분 - 정도 걸릴 수 있습니다. + delete: "계정 삭제" + delete_confirmation: "이 계정을 정말로 삭제합니까?" + deletion_pending: "계정 삭제가 예약되었습니다. 이 프로세스는 백그라운드에서 수행됩니다. 사용자가 완전히 삭제될 때까지 몇 분 정도 걸릴 수 있습니다." deletion_info: data_consequences: - other: 모든 사용자별 데이터가 삭제됩니다. 작업 패키지 및 미팅 등의 공유된 보기에서 사용자의 활동은 삭제되지 않고 원래 계정에 - 링크할 수 없는 일반 '삭제된 사용자'와 대신 연결됩니다. - self: 모든 사용자별 데이터가 삭제됩니다. 작업 패키지 및 미팅 등의 공유된 보기에서 내 활동은 삭제되지 않고 원래 계정에 링크할 - 수 없는 일반 '삭제된 사용자'와 대신 연결됩니다. + other: "모든 사용자별 데이터가 삭제됩니다. 작업 패키지 및 미팅 등의 공유된 보기에서 사용자의 활동은 삭제되지 않고 원래 계정에 링크할 수 없는 일반 '삭제된 사용자'와 대신 연결됩니다." + self: "모든 사용자별 데이터가 삭제됩니다. 작업 패키지 및 미팅 등의 공유된 보기에서 내 활동은 삭제되지 않고 원래 계정에 링크할 수 없는 일반 '삭제된 사용자'와 대신 연결됩니다." heading: "%{name} 님의 계정을 삭제하시겠습니까?" login_consequences: - other: 이 계정은 시스템에서 즉시 제거되며 사용자는 더 이상 해당 자격 증명으로 로그인할 수 없게 됩니다. - self: 내 계정은 시스템에서 즉시 제거되며 더 이상 내 자격 증명으로 로그인할 수 없게 됩니다. - error_inactive_activation_by_mail: '당신의 계정이 아직 활성화되지 않았습니다. 계정을 활성화하기 위해, 이메일로 - 전송된 링크를 클릭하십시오. - - ' - error_inactive_manual_activation: '당신의 계정이 아직 활성화되지 않았습니다. 관리자가 계정을 승인할때까지 기다려 - 주십시오. - - ' - error_self_registration_disabled: '사용자 등록은 이 시스템에서 비활성화되어 있습니다. 계정 생성을 원한다면 관리자에게 - 요청하십시오. - - ' - error_self_registration_limited_provider: 'Single Sign-On 공급자 ''%{name}''에 대한 - 사용자 등록이 제한되어 있습니다. 관리자에게 계정을 활성화해 달라고 요청하거나 이 공급자에 대한 자체 등록 제한을 변경하세요. - - ' - login_with_auth_provider: 또는 이미 있는 계정으로 로그인 - signup_with_auth_provider: 또는 사용 가입하기 - auth_source_login: "%{login} 계정을 활성화하려면 로그인하시기 바랍니다." + other: "이 계정은 시스템에서 즉시 제거되며 사용자는 더 이상 해당 자격 증명으로 로그인할 수 없게 됩니다." + self: "내 계정은 시스템에서 즉시 제거되며 더 이상 내 자격 증명으로 로그인할 수 없게 됩니다." + error_inactive_activation_by_mail: > + 당신의 계정이 아직 활성화되지 않았습니다. 계정을 활성화하기 위해, 이메일로 전송된 링크를 클릭하십시오. + error_inactive_manual_activation: > + 당신의 계정이 아직 활성화되지 않았습니다. 관리자가 계정을 승인할때까지 기다려 주십시오. + error_self_registration_disabled: > + 사용자 등록은 이 시스템에서 비활성화되어 있습니다. 계정 생성을 원한다면 관리자에게 요청하십시오. + error_self_registration_limited_provider: > + Single Sign-On 공급자 '%{name}'에 대한 사용자 등록이 제한되어 있습니다. 관리자에게 계정을 활성화해 달라고 요청하거나 이 공급자에 대한 자체 등록 제한을 변경하세요. + login_with_auth_provider: "또는 이미 있는 계정으로 로그인" + signup_with_auth_provider: "또는 사용 가입하기" + auth_source_login: %{login} 계정을 활성화하려면 로그인하시기 바랍니다. omniauth_login: 계정을 활성화하려면 로그인하시기 바랍니다. - actionview_instancetag_blank_option: 선택하십시오 + actionview_instancetag_blank_option: "선택하십시오" activemodel: attributes: projects/copy_options: - dependencies: 종속성 + dependencies: "종속성" activerecord: attributes: jira_import: - projects: 프로젝트 - import/jira: - name: Jira 인스턴스 이름 - url: Jira 인스턴스 URL - personal_access_token: 개인 액세스 토큰 + projects: "프로젝트" + "import/jira": + name: "Jira 인스턴스 이름" + url: "Jira 인스턴스 URL" + personal_access_token: "개인 액세스 토큰" announcements: - show_until: 표시 기한 + show_until: "표시 기한" attachment: - attachment_content: 첨부 파일 콘텐츠 - attachment_file_name: 첨부 파일 이름 - content_type: 콘텐츠 유형 - downloads: 다운로드 - file: 파일 - filename: 파일 - filesize: 크기 + attachment_content: "첨부 파일 콘텐츠" + attachment_file_name: "첨부 파일 이름" + content_type: "콘텐츠 유형" + downloads: "다운로드" + file: "파일" + filename: "파일" + filesize: "크기" attribute_help_text: - attribute_name: 특성 - help_text: 도움말 텍스트 - caption: 캡션 + attribute_name: "특성" + help_text: "도움말 텍스트" + caption: "캡션" auth_provider: - scim_clients: SCIM 클라이언트 + scim_clients: "SCIM 클라이언트" calculated_value_error: - error_code: 오류 코드 - customized_id: 사용자 지정된 ID - customized_type: 사용자 지정된 유형 + error_code: "오류 코드" + customized_id: "사용자 지정된 ID" + customized_type: "사용자 지정된 유형" capability: - context: 컨텍스트 + context: "컨텍스트" changeset: - repository: 리포지토리 + repository: "리포지토리" comment: - commented: 덧글을 달았습니다. + commented: "덧글을 달았습니다." #an object that this comment belongs to custom_action: - actions: 작업 + actions: "작업" custom_field: - allow_non_open_versions: 비공개 버전 허용 - default_value: 기본값 - editable: 편집 가능 - field_format: 형식 - formula: 공식 - is_filter: 필터사용 - is_for_all: 모든 프로젝트용 - is_required: 필수 - max_length: 최대 길이 - min_length: 최소 길이 - content_right_to_left: 오른쪽에서 왼쪽 콘텐츠 - multi_value: 다중 선택 허용 - possible_values: 가능한 값 - regexp: 정규 표현식 - searchable: 검색가능한 - admin_only: 관리자 전용 - has_comment: 코멘트 텍스트 필드 추가 + allow_non_open_versions: "비공개 버전 허용" + default_value: "기본값" + editable: "편집 가능" + field_format: "형식" + formula: "공식" + is_filter: "필터사용" + is_for_all: "모든 프로젝트용" + is_required: "필수" + max_length: "최대 길이" + min_length: "최소 길이" + content_right_to_left: "오른쪽에서 왼쪽 콘텐츠" + multi_value: "다중 선택 허용" + possible_values: "가능한 값" + regexp: "정규 표현식" + searchable: "검색가능한" + admin_only: "관리자 전용" + has_comment: "코멘트 텍스트 필드 추가" custom_value: - value: 값 + value: "값" design_color: - variable: 변수 + variable: "변수" doorkeeper/application: - uid: 고객 ID - secret: 클라이언트 비밀번호 - owner: 소유자 - builtin: 기본 제공 - enabled: 활성 - redirect_uri: 리디렉션 URI - client_credentials_user_id: 클라이언트 자격 증명 사용자 ID - scopes: 범위 - confidential: 기밀 + uid: "고객 ID" + secret: "클라이언트 비밀번호" + owner: "소유자" + builtin: "기본 제공" + enabled: "활성" + redirect_uri: "리디렉션 URI" + client_credentials_user_id: "클라이언트 자격 증명 사용자 ID" + scopes: "범위" + confidential: "기밀" emoji_reaction: - reactable: 반응 + reactable: "반응" enterprise_token: - starts_at: 이후로 유효함 - subscriber: 구독자 - subscription: 구독 - plan: 플랜 - encoded_token: 엔터프라이즈 지원 토큰 - active_user_count_restriction: 활성 사용자 + starts_at: "이후로 유효함" + subscriber: "구독자" + subscription: "구독" + plan: "플랜" + encoded_token: "엔터프라이즈 지원 토큰" + active_user_count_restriction: "활성 사용자" enterprise_trial: - company: 회사 + company: "회사" favorite: - favorited: 항목 + favorited: "항목" grids/grid: - page: 페이지 - row_count: 행 수 - column_count: 열 수 - widgets: 위젯 + page: "페이지" + row_count: "행 수" + column_count: "열 수" + widgets: "위젯" journal: - notes: 노트 - cause_type: 원인 유형 + notes: "노트" + cause_type: "원인 유형" ldap_auth_source: - account: 계정 - attr_firstname: 이름 특성 - attr_lastname: 성 특성 - attr_login: 사용자 이름 특성 - attr_mail: 이메일 특성 - filter_string: 필터 문자열 - admin: 관리자 - base_dn: 기본 DN - host: 호스트 - onthefly: 자동 사용자 생성 - port: 포트 - tls_certificate_string: LDAP 서버 SSL 인증서 + account: "계정" + attr_firstname: "이름 특성" + attr_lastname: "성 특성" + attr_login: "사용자 이름 특성" + attr_mail: "이메일 특성" + filter_string: "필터 문자열" + admin: "관리자" + base_dn: "기본 DN" + host: "호스트" + onthefly: "자동 사용자 생성" + port: "포트" + tls_certificate_string: "LDAP 서버 SSL 인증서" mcp_configuration: enabled: 활성화됨 title: 제목 description: 설명 member: - roles: 역할 + roles: "역할" notification: - read_ian: 인앱 읽기 - resource: 리소스 + read_ian: "인앱 읽기" + resource: "리소스" oauth_client: - client: 클라이언트 ID + client: "클라이언트 ID" project: active_value: - true: 보관 취소됨 - false: 보관됨 - attribute_groups: 특성 그룹 - description: 설명 - enabled_modules: 사용 가능한 모듈 - identifier: 식별자 - latest_activity_at: 다음의 최근 활동 - parent: 하위 프로젝트 - project_creation_wizard_enabled: 프로젝트 시작 요청 + true: "보관 취소됨" + false: "보관됨" + attribute_groups: "특성 그룹" + description: "설명" + enabled_modules: "사용 가능한 모듈" + identifier: "식별자" + latest_activity_at: "다음의 최근 활동" + parent: "하위 프로젝트" + project_creation_wizard_enabled: "프로젝트 시작 요청" public_value: - title: 표시 여부 - true: 공개 - false: 비공개 - queries: 쿼리 - status_code: 상태 - status_explanation: 상태 설명 + title: "표시 여부" + true: "공개" + false: "비공개" + queries: "쿼리" + status_code: "상태" + status_explanation: "상태 설명" status_codes: - not_started: 시작되지 않음 - on_track: 정상 상태 - at_risk: 위험 상태 - off_track: 비정상 상태 - finished: 마침 - discontinued: 중단됨 - project_creation_wizard_assignee_custom_field: 제출 시 담당자 - project_creation_wizard_notification_text: 알림 텍스트 - project_creation_wizard_send_confirmation_email: 확인 이메일 - project_creation_wizard_status_when_submitted: 제출 시 상태 - project_creation_wizard_work_package_comment: 작업 패키지 코멘트 - project_creation_wizard_work_package_type: 작업 패키지 유형 - template: 템플릿 - templated: 템플릿 프로젝트 + not_started: "시작되지 않음" + on_track: "정상 상태" + at_risk: "위험 상태" + off_track: "비정상 상태" + finished: "마침" + discontinued: "중단됨" + project_creation_wizard_assignee_custom_field: "제출 시 담당자" + project_creation_wizard_notification_text: "알림 텍스트" + project_creation_wizard_send_confirmation_email: "확인 이메일" + project_creation_wizard_status_when_submitted: "제출 시 상태" + project_creation_wizard_work_package_comment: "작업 패키지 코멘트" + project_creation_wizard_work_package_type: "작업 패키지 유형" + template: "템플릿" + templated: "템플릿 프로젝트" templated_value: - true: 템플릿으로 표시됨 - false: 템플릿으로 표시 취소됨 - types: 유형 - versions: 버전 - work_packages: 작업 패키지 - workspace_type: 워크스페이스 유형 + true: "템플릿으로 표시됨" + false: "템플릿으로 표시 취소됨" + types: "유형" + versions: "버전" + work_packages: "작업 패키지" + workspace_type: "워크스페이스 유형" project_custom_field: custom_field_section: 섹션 subproject_template_assignment: - workspace_type: 워크스페이스 유형 + workspace_type: "워크스페이스 유형" project/phase: - date_range: 날짜 범위 - definition: 정의 - duration: 기간 - start_date: 시작 날짜 - start_date_caption: 이전 단계를 따릅니다. - finish_date: 완료 날짜 + date_range: "날짜 범위" + definition: "정의" + duration: "기간" + start_date: "시작 날짜" + start_date_caption: "이전 단계를 따릅니다." + finish_date: "완료 날짜" project/phase_definition: - name: 이름 - color: 색상 - start_gate: 시작 단계 게이트 - start_gate_name: 시작 단계 게이트 이름 - finish_gate: 완료 단계 게이트 - finish_gate_name: 완료 단계 게이트 이름 + name: "이름" + color: "색상" + start_gate: "시작 단계 게이트" + start_gate_name: "시작 단계 게이트 이름" + finish_gate: "완료 단계 게이트" + finish_gate_name: "완료 단계 게이트 이름" query: - sums: 합계 - columns: 컬럼 - column_names: 컬럼 + sums: "합계" + columns: "컬럼" + column_names: "컬럼" relations_to_type_column: "%{type}에 대한 관계" relations_of_type_column: "%{type} 관계" - child_work_packages: 자식 작업 패키지 - group_by: 그룹 결과 - sort_by: 결과 정렬 기준 - filters: 필터 - timeline_labels: 타임라인 레이블 - timeline_visible: Gantt 차트 표시 - timeline_zoom_level: Gantt 차트 확대/축소 수준 - timestamps: 기준선 타임스탬프 - sort_criteria: 정렬 기준 - highlighted_attributes: 강조 표시된 특성 - highlighting_mode: 강조 표시 모드 - display_representation: 표시 모드 - show_hierarchies: 표시 모드 - starred: 즐겨찾기 - hidden: 숨김 - manual_sorting: 수동 정렬 순서 - ordered_work_packages: 작업 패키지 순서 - include_subprojects: 하위 프로젝트 포함 - results: 결과 + child_work_packages: "자식 작업 패키지" + group_by: "그룹 결과" + sort_by: "결과 정렬 기준" + filters: "필터" + timeline_labels: "타임라인 레이블" + timeline_visible: "Gantt 차트 표시" + timeline_zoom_level: "Gantt 차트 확대/축소 수준" + timestamps: "기준선 타임스탬프" + sort_criteria: "정렬 기준" + highlighted_attributes: "강조 표시된 특성" + highlighting_mode: "강조 표시 모드" + display_representation: "표시 모드" + show_hierarchies: "표시 모드" + starred: "즐겨찾기" + hidden: "숨김" + manual_sorting: "수동 정렬 순서" + ordered_work_packages: "작업 패키지 순서" + include_subprojects: "하위 프로젝트 포함" + results: "결과" relation: - lag: 지연 - from: 관련 작업 패키지 - to: 관련 패키지 - relation_type: 관계 유형 + lag: "지연" + from: "관련 작업 패키지" + to: "관련 패키지" + relation_type: "관계 유형" reminder: - remindable: 미리 알림 개체 - remind_at: '미리 알림:' - remind_at_date: 날짜 - remind_at_time: 시간 + remindable: "미리 알림 개체" + remind_at: "미리 알림:" + remind_at_date: "날짜" + remind_at_time: "시간" reminder_notification: - notification: 알림 + notification: "알림" repository: - url: 주소 + url: "주소" role: - permissions: 권한 + permissions: "권한" scim_client: - authentication_method: 인증 방법 - jwt_sub: 제목 클레임 + authentication_method: "인증 방법" + jwt_sub: "제목 클레임" status: - is_closed: 종료된 작업 패키지 - is_readonly: 읽기 전용 작업 패키지 - excluded_from_totals: 계층의 합계 계산에서 제외 - default_done_ratio: 완료 % + is_closed: "종료된 작업 패키지" + is_readonly: "읽기 전용 작업 패키지" + excluded_from_totals: "계층의 합계 계산에서 제외" + default_done_ratio: "완료 %" token/named: - token_name: 토큰 이름 + token_name: "토큰 이름" token/ical: - calendar: 달력 - ical_token_query_assignment: 쿼리 할당 + calendar: "달력" + ical_token_query_assignment: "쿼리 할당" time_entry: - activity: 활동 - hours: 시간 - spent_on: 날짜 - type: 타입 - ongoing: 진행 중 + activity: "활동" + hours: "시간" + spent_on: "날짜" + type: "타입" + ongoing: "진행 중" type: - description: 설명의 기본 텍스트 - attribute_groups: 양식 구성 - is_in_roadmap: 기본적으로 로드맵에 표시됨 - is_default: 새 프로젝트에 대해 기본적으로 활성화됨 - is_milestone: 마일스톤 - color: 색상 - patterns: 패턴 + description: "설명의 기본 텍스트" + attribute_groups: "양식 구성" + is_in_roadmap: "기본적으로 로드맵에 표시됨" + is_default: "새 프로젝트에 대해 기본적으로 활성화됨" + is_milestone: "마일스톤" + color: "색상" + patterns: "패턴" remote_identity: - auth_source: 인증 소스 - integration: 통합 - user: 사용자 + auth_source: "인증 소스" + integration: "통합" + user: "사용자" user: - admin: 관리자 - auth_source: 인증 소스 - ldap_auth_source: LDAP 연결 - identity_url: ID URL - current_password: 기존 비밀번호 - force_password_change: 다음 로그인 암호 변경 적용 - language: 언어 - last_login_on: 최종 로그인 - failed_login_count: 로그인 시도 실패 - first_name: 이름 - last_name: 성 - first_login: 첫 로그인 - new_password: 새로운 비밀번호 - password_confirmation: 확인 - consented_at: '동의함:' + admin: "관리자" + auth_source: "인증 소스" + ldap_auth_source: "LDAP 연결" + identity_url: "ID URL" + current_password: "기존 비밀번호" + force_password_change: "다음 로그인 암호 변경 적용" + language: "언어" + last_login_on: "최종 로그인" + failed_login_count: "로그인 시도 실패" + first_name: "이름" + last_name: "성" + first_login: "첫 로그인" + new_password: "새로운 비밀번호" + password_confirmation: "확인" + consented_at: "동의함:" group: - identity_url: ID URL + identity_url: "ID URL" user_preference: - header_look_and_feel: 모양 및 느낌 - header_alerts: 알림 - button_update_look_and_feel: 모양과 느낌 업데이트 - button_update_alerts: 업데이트 알림 - button_update_user_information: 프로필 업데이트 - comments_sorting: '다음을 기준으로 작업 패키지 활동을 정렬하여 표시:' - disable_keyboard_shortcuts: 키보드 바로 가기 비활성화 - disable_keyboard_shortcuts_caption_html: 화면 리더를 사용하는 경우나 바로 가기로 실수로 작업을 트리거하지 - 않게 방지하려는 경우 기본 키보드 바로 가기를 비활성화하도록 선택할 수 있습니다. - dismissed_enterprise_banners: 숨겨진 엔터프라이즈 배너 - impaired: 액세스 모드 - auto_hide_popups: 성공 배너 자동으로 숨기기 - auto_hide_popups_caption: 활성화하면 녹색 성공 배너가 5초 후에 자동으로 사라집니다. - warn_on_leaving_unsaved: 저장하지 않고 작업 패키지를 벗어날 때 알려주세요. - increase_theme_contrast: 테마 대비 증가 - increase_contrast: 대비 증가 - increase_contrast_caption: 선택한 색상 모드에 대한 고대비 모드를 활성화합니다. - force_light_theme_contrast: 라이트 모드에서 고대비 강제 적용 - force_dark_theme_contrast: 다크 모드에서 고대비 강제 적용 - force_light_theme_contrast_caption: 자동 색상 모드를 선택하면 라이트 모드의 고대비 버전이 사용됩니다. - force_dark_theme_contrast_caption: 자동 색상 모드를 선택하면 다크 모드의 고대비 버전이 사용됩니다. - theme: 색상 모드 - time_zone: 표준 시간대 - mode_guideline: 일부 모드에서는 접근성과 가독성을 위해 사용자 지정 테마 색상을 덮어씁니다. 전체 사용자 지정 테마 지원을 - 위해서는 라이트 모드를 선택하세요. - daily_reminders: 일일 미리 알림 - workdays: 근무일 + header_look_and_feel: "모양 및 느낌" + header_alerts: "알림" + button_update_look_and_feel: "모양과 느낌 업데이트" + button_update_alerts: "업데이트 알림" + button_update_user_information: "프로필 업데이트" + comments_sorting: "다음을 기준으로 작업 패키지 활동을 정렬하여 표시:" + disable_keyboard_shortcuts: "키보드 바로 가기 비활성화" + disable_keyboard_shortcuts_caption_html: |- + 화면 리더를 사용하는 경우나 바로 가기로 실수로 작업을 트리거하지 않게 방지하려는 경우 기본 키보드 바로 가기를 비활성화하도록 선택할 수 있습니다. + dismissed_enterprise_banners: "숨겨진 엔터프라이즈 배너" + impaired: "액세스 모드" + auto_hide_popups: "성공 배너 자동으로 숨기기" + auto_hide_popups_caption: "활성화하면 녹색 성공 배너가 5초 후에 자동으로 사라집니다." + warn_on_leaving_unsaved: "저장하지 않고 작업 패키지를 벗어날 때 알려주세요." + increase_theme_contrast: "테마 대비 증가" + increase_contrast: "대비 증가" + increase_contrast_caption: "선택한 색상 모드에 대한 고대비 모드를 활성화합니다." + force_light_theme_contrast: "라이트 모드에서 고대비 강제 적용" + force_dark_theme_contrast: "다크 모드에서 고대비 강제 적용" + force_light_theme_contrast_caption: "자동 색상 모드를 선택하면 라이트 모드의 고대비 버전이 사용됩니다." + force_dark_theme_contrast_caption: "자동 색상 모드를 선택하면 다크 모드의 고대비 버전이 사용됩니다." + theme: "색상 모드" + time_zone: "표준 시간대" + mode_guideline: "일부 모드에서는 접근성과 가독성을 위해 사용자 지정 테마 색상을 덮어씁니다. 전체 사용자 지정 테마 지원을 위해서는 라이트 모드를 선택하세요." + daily_reminders: "일일 미리 알림" + workdays: "근무일" users/invitation/form_model: - principal_type: 초대 유형 - id_or_email: 이름 또는 이메일 주소 + principal_type: "초대 유형" + id_or_email: "이름 또는 이메일 주소" version: - effective_date: 완료 날짜 - sharing: 공유 + effective_date: "완료 날짜" + sharing: "공유" wiki_content: - text: 텍스트 + text: "텍스트" wiki_page: - parent_title: 부모 페이지 - redirect_existing_links: 기존 링크 리디렉션 - text: 페이지 콘텐츠 + parent_title: "부모 페이지" + redirect_existing_links: "기존 링크 리디렉션" + text: "페이지 콘텐츠" work_package: - ancestor: 하위 항목 - begin_insertion: 삽입 시작 - begin_deletion: 삭제 시작 - children: 하위 요소 - derived_done_ratio: 총 완료 % - derived_remaining_hours: 총 남은 작업 - derived_remaining_time: 총 남은 작업 - done_ratio: 완료 % - duration: 기간 - end_insertion: 삽입 끝 - end_deletion: 삭제 끝 - ignore_non_working_days: 휴무일 무시 + ancestor: "하위 항목" #used for filtering of work packages that are descendants of a given work package + begin_insertion: "삽입 시작" + begin_deletion: "삭제 시작" + children: "하위 요소" + derived_done_ratio: "총 완료 %" + derived_remaining_hours: "총 남은 작업" + derived_remaining_time: "총 남은 작업" + done_ratio: "완료 %" + duration: "기간" + end_insertion: "삽입 끝" + end_deletion: "삭제 끝" + ignore_non_working_days: "휴무일 무시" include_non_working_days: - title: 근무일 - false: 근무일만 - true: 휴무일 포함 + title: "근무일" + false: "근무일만" + true: "휴무일 포함" journal_internal: 내부 저널 - notify: 알림 - parent: 부모 - parent_issue: 부모 - parent_work_package: 부모 - priority: 우선 순위 - progress: 완료 % - readonly: 읽기 전용 - remaining_hours: 남은 작업 - remaining_time: 남은 작업 - shared_with_users: 공유 대상 - schedule_manually: 수동 스케줄링 - spent_hours: 소비한 시간 - spent_time: 소비한 시간 - subproject: 하위 프로젝트 - time_entries: 작업시간 기록 - type: 타입 - version: 버전 - watcher: 주시자 + notify: "알림" #used in custom actions + parent: "부모" + parent_issue: "부모" + parent_work_package: "부모" + priority: "우선 순위" + progress: "완료 %" + readonly: "읽기 전용" + remaining_hours: "남은 작업" + remaining_time: "남은 작업" + shared_with_users: "공유 대상" + schedule_manually: "수동 스케줄링" + spent_hours: "소비한 시간" + spent_time: "소비한 시간" + subproject: "하위 프로젝트" + time_entries: "작업시간 기록" + type: "타입" + version: "버전" + watcher: "주시자" errors: messages: - accepted: 허용 되어야 합니다. - after: 은(는) %{date} 후이어야 합니다. + accepted: "허용 되어야 합니다." + after: "은(는) %{date} 후이어야 합니다." after_today: "- 미래여야 합니다." - after_or_equal_to: 은(는) %{date} 이후여야 합니다. - before: 은(는) %{date} 보다 전이어야 합니다. - before_or_equal_to: 은(는) %{date} 이전이어야 합니다. - blank: 내용을 입력해주세요 + after_or_equal_to: "은(는) %{date} 이후여야 합니다." + before: "은(는) %{date} 보다 전이어야 합니다." + before_or_equal_to: "은(는) %{date} 이전이어야 합니다." + blank: "내용을 입력해주세요" blank_nested: "- '%{property}' 속성이 설정되어 있어야 합니다." cannot_delete_mapping: "- 필수입니다. 삭제할 수 없습니다." is_for_all_cannot_modify: "- 모든 프로젝트용므로 수정할 수 없습니다." - cant_link_a_work_package_with_a_descendant: 작업 패키지는 하위 작업패키지들 중 하나에 연결 될 수 - 없습니다. - circular_dependency: 이 연계는 순환 종속관계를 만듭니다. + cant_link_a_work_package_with_a_descendant: "작업 패키지는 하위 작업패키지들 중 하나에 연결 될 수 없습니다." + circular_dependency: "이 연계는 순환 종속관계를 만듭니다." confirmation: "%{attribute} 속성에 부합하지 않습니다." could_not_be_copied: "%{dependency}을(를) (완전히) 복사할 수 없습니다." - does_not_exist: 존재하지 않음 - error_enterprise_only: "%{action}은(는) OpenProject Enterprise Edition에서만 사용할 - 수 있습니다." - error_unauthorized: 액세스하지 못할 수 있습니다. + does_not_exist: "존재하지 않음" + error_enterprise_only: "%{action}은(는) OpenProject Enterprise Edition에서만 사용할 수 있습니다." + error_unauthorized: "액세스하지 못할 수 있습니다." error_readonly: "- 쓰려고 했지만 쓸 수 없습니다." - error_conflict: 그 사이에 정보가 한 명 이상의 다른 사용자에 의해 업데이트되었습니다. + error_conflict: "그 사이에 정보가 한 명 이상의 다른 사용자에 의해 업데이트되었습니다." error_not_found: "- 찾을 수 없습니다." email: "- 유효한 이메일 주소가 아닙니다." - empty: 비워둘 수 없습니다. + empty: "비워둘 수 없습니다." enterprise_plan_required: "- %{plan_name} 이상이 필요합니다." - even: 에 짝수를 입력해 주세요 - exclusion: 예약됨 - feature_disabled: "- 사용할 수 없습니다." - feature_disabled_for_project: "- 이 프로젝트에서 비활성화되었습니다." - file_too_large: 은(는) 너무 큽니다. (최대 %{count} 바이트) - filter_does_not_exist: 필터가 존재하지 않습니다. + even: "에 짝수를 입력해 주세요" + exclusion: "예약됨" + feature_disabled: '- 사용할 수 없습니다.' + feature_disabled_for_project: '- 이 프로젝트에서 비활성화되었습니다.' + file_too_large: "은(는) 너무 큽니다. (최대 %{count} 바이트)" + filter_does_not_exist: "필터가 존재하지 않습니다." format: "- 필요한 형식 '%{expected}'과(와) 일치하지 않습니다." format_nested: "- 경로 '%{path}'에서 필요한 형식 '%{expected}'과(와) 일치하지 않습니다." - greater_than: 은(는) %{count}보다 커야 합니다 - greater_than_or_equal_to: 은(는) %{count}보다 크거야 같아야 합니다 - greater_than_or_equal_to_start_date: 은(는) 시작 날짜 이후이거나 같아야 합니다. - greater_than_start_date: 은(는) 시작 날짜 이후이어야 합니다. - inclusion: 은(는) 허용되는 값이 아닙니다. + greater_than: "은(는) %{count}보다 커야 합니다" + greater_than_or_equal_to: "은(는) %{count}보다 크거야 같아야 합니다" + greater_than_or_equal_to_start_date: "은(는) 시작 날짜 이후이거나 같아야 합니다." + greater_than_start_date: "은(는) 시작 날짜 이후이어야 합니다." + inclusion: "은(는) 허용되는 값이 아닙니다." inclusion_nested: "- 경로 '%{path}'에서 허용되는 값 중 하나로 설정되지 않았습니다." - invalid: 은(는) 올바르지 않은 값입니다 - invalid_url: 은(는) 올바른 URL이 아닙니다. - invalid_url_scheme: '은(는) 지원되는 프로토콜(허용: %{allowed_schemes})이 아닙니다.' - less_than_or_equal_to: 은(는) %{count} 보다 작거나 같아야 합니다 + invalid: "은(는) 올바르지 않은 값입니다" + invalid_url: "은(는) 올바른 URL이 아닙니다." + invalid_url_scheme: "은(는) 지원되는 프로토콜(허용: %{allowed_schemes})이 아닙니다." + less_than_or_equal_to: "은(는) %{count} 보다 작거나 같아야 합니다" not_available: "- 시스템 구성으로 인해 사용 가능하지 않습니다." not_deletable: "- 삭제할 수 없습니다." - not_current_user: 은(는) 현재 유효한 사용자가 아닙니다. - only_one_active_sprint_allowed: 프로젝트당 하나의 활성 스프린트만 허용됩니다. + not_current_user: "은(는) 현재 유효한 사용자가 아닙니다." + only_one_active_sprint_allowed: "프로젝트당 하나의 활성 스프린트만 허용됩니다." not_found: "- 찾을 수 없습니다." - not_a_date: 은(는) 유효한 날짜가 아닙니다. - not_a_datetime: 은(는) 유효한 날짜가 아닙니다. - not_a_number: 은(는) 숫자가 아닙니다. + not_a_date: "은(는) 유효한 날짜가 아닙니다." + not_a_datetime: "은(는) 유효한 날짜가 아닙니다." + not_a_number: "은(는) 숫자가 아닙니다." not_allowed: "- 사용 권한이 없어 유효하지 않습니다." not_json: "- JSON으로 구문 분석할 수 없습니다." not_json_object: "- JSON 개체가 아닙니다." - not_an_integer: 은(는) 정수가 아닙니다. - not_an_iso_date: '은(는) 유효한 날짜가 아닙니다. 필요한 형식: YYYY-MM-DD.' - not_same_project: 은(는) 동일한 프로젝트에 속하지 않습니다. + not_an_integer: "은(는) 정수가 아닙니다." + not_an_iso_date: "은(는) 유효한 날짜가 아닙니다. 필요한 형식: YYYY-MM-DD." + not_same_project: "은(는) 동일한 프로젝트에 속하지 않습니다." datetime_must_be_in_future: "- 미래여야 합니다." - odd: 에 홀수를 입력해 주세요 + odd: "에 홀수를 입력해 주세요" regex_match_failed: "%{expression} 정규 표현식과 일치하지 않습니다." - regex_invalid: 관련 정규 표현식으로 유효성을 확인할 수 없습니다. + regex_invalid: "관련 정규 표현식으로 유효성을 확인할 수 없습니다." regex_list_invalid: "%{invalid_lines} 라인을 정규 표현식으로 구문 분석할 수 없습니다." hexcode_invalid: "- 유효한 6자리 16진수 색상 코드가 아닙니다." - smaller_than_or_equal_to_max_length: 은(는) 최대 길이보다 같거나 작아야 합니다. - taken: 은(는) 이미 존재합니다. - too_long: 은(는) 너무 깁니다 (최대 %{count}자까지 가능합니다) - too_short: 은(는) 너무 짧습니다. (최소 %{count} 자 이상이어야 합니다) + smaller_than_or_equal_to_max_length: "은(는) 최대 길이보다 같거나 작아야 합니다." + taken: "은(는) 이미 존재합니다." + too_long: "은(는) 너무 깁니다 (최대 %{count}자까지 가능합니다)" + too_short: "은(는) 너무 짧습니다. (최소 %{count} 자 이상이어야 합니다)" type_mismatch: "- '%{type}' 유형이 아닙니다." type_mismatch_nested: "- 경로 '%{path}'에서 '%{type}' 유형이 아닙니다." unchangeable: "- 변경할 수 없습니다." unknown_property: "- 알려진 속성이 아닙니다." unknown_property_nested: "- 알 수 없는 경로 '%{path}'이(가) 있습니다." unremovable: "- 제거할 수 없습니다." - url_not_secure_context: '"보안 컨텍스트"를 제공하지 않습니다. HTTPS 또는 localhost 같은 루프백 주소를 - 사용하세요. - - ' - wrong_length: 너무 짧습니다 (최소 %{count} 자 이상이어야 합니다). + url_not_secure_context: > + "보안 컨텍스트"를 제공하지 않습니다. HTTPS 또는 localhost 같은 루프백 주소를 사용하세요. + wrong_length: "너무 짧습니다 (최소 %{count} 자 이상이어야 합니다)." models: ldap_auth_source: attributes: tls_certificate_string: - invalid_certificate: '제공된 SSL 인증서가 유효하지 않습니다: %{additional_message}' + invalid_certificate: "제공된 SSL 인증서가 유효하지 않습니다: %{additional_message}" format: "%{message}" attachment: attributes: content_type: - blank: 파일의 콘텐츠 유형은 비워둘 수 없습니다. - not_allowlisted: 파일이 자동 필터에 의해 거부되었습니다. '%{value}'은(는) 업로드가 허용되지 않습니다. + blank: "파일의 콘텐츠 유형은 비워둘 수 없습니다." + not_allowlisted: "파일이 자동 필터에 의해 거부되었습니다. '%{value}'은(는) 업로드가 허용되지 않습니다." format: "%{message}" capability: context: - global: 글로벌 + global: "글로벌" query: filters: minimum: "'=' 연산자를 사용하여 주체, 컨텍스트 또는 ID에 대해 하나 이상의 필터를 포함시켜야 합니다." custom_field: - at_least_one_custom_option: 하나 이상의 옵션을 사용할 수 있어야 합니다. - previous_custom_field_recalculation_unprocessed: 이 사용자 지정 필드에 대한 이전 변경 사항의 - 다시 계산이 아직 적용되지 않았습니다. 몇 분 후에 다시 시도하세요. + at_least_one_custom_option: "하나 이상의 옵션을 사용할 수 있어야 합니다." + previous_custom_field_recalculation_unprocessed: "이 사용자 지정 필드에 대한 이전 변경 사항의 다시 계산이 아직 적용되지 않았습니다. 몇 분 후에 다시 시도하세요." referenced_in_other_fields_html: other: "%{name}은(는) 프로젝트 특성 계산에 사용됩니다: %{links}." attributes: formula: - blank: 수식은 비워둘 수 없습니다. - invalid: 수식이 유효하지 않습니다. - invalid_characters: 정수, 부동 소수점, 계산된 값 및 가중치 목록 유형의 숫자 값, 수학 연산자 및 프로젝트 - 특성만 허용됩니다. - not_allowed_custom_fields_referenced: "%{custom_fields} 특성은 순환 참조로 이어지기 - 때문에 사용할 수 없습니다. 한 특성이 다른 특성에 종속됩니다." + blank: "수식은 비워둘 수 없습니다." + invalid: "수식이 유효하지 않습니다." + invalid_characters: "정수, 부동 소수점, 계산된 값 및 가중치 목록 유형의 숫자 값, 수학 연산자 및 프로젝트 특성만 허용됩니다." + not_allowed_custom_fields_referenced: "%{custom_fields} 특성은 순환 참조로 이어지기 때문에 사용할 수 없습니다. 한 특성이 다른 특성에 종속됩니다." format: "%{message}" required: cannot_be_true: "- true로 설정할 수 없습니다." custom_fields_project: attributes: project_ids: - blank: 프로젝트를 선택하세요. + blank: "프로젝트를 선택하세요." custom_actions: only_one_allowed: "(%{name}) 하나의 값만 허용됩니다." empty: "(%{name}) 값은 비워둘 수 없습니다." @@ -1947,35 +1817,34 @@ ko: not_match_configured: "- 사용 가능한 범위와 일치하지 않습니다." enterprise_trial: already_used: "- 이미 평가판을 만드는 데 사용되었습니다." - failed_to_create: 평가판을 만들 수 없습니다(%{status}) - general_consent: 이용 약관에 동의해 주세요. + failed_to_create: "평가판을 만들 수 없습니다(%{status})" + general_consent: "이용 약관에 동의해 주세요." enterprise_token: - only_one_trial: 평가판 토큰은 하나만 활성화할 수 있습니다. 다른 평가판 토큰을 추가하기 전에 이전 토큰을 삭제하세요. - unreadable: 읽을 수 없습니다. 지원하는 토큰이 확실한가요? - already_added: 이미 추가된 토큰입니다. + only_one_trial: "평가판 토큰은 하나만 활성화할 수 있습니다. 다른 평가판 토큰을 추가하기 전에 이전 토큰을 삭제하세요." + unreadable: "읽을 수 없습니다. 지원하는 토큰이 확실한가요?" + already_added: "이미 추가된 토큰입니다." favorite: already_favorited: "- 이미 즐겨찾기에 추가되었습니다." grids/grid: - overlaps: 오버랩 + overlaps: "오버랩" outside: "- 그리드의 외부에 있습니다." - end_before_start: 종료 값은 시작 값보다 커야 합니다. + end_before_start: "종료 값은 시작 값보다 커야 합니다." ical_token_query_assignment: attributes: name: blank: "- 필수입니다. 이름을 선택하세요." not_unique: "- 사용 중입니다. 다른 이름을 선택하세요." meeting: - error_conflict: 그 사이에 다른 사람이 미팅을 업데이트했기 때문에 저장할 수 없습니다. 페이지를 다시 로드하세요. + error_conflict: "그 사이에 다른 사람이 미팅을 업데이트했기 때문에 저장할 수 없습니다. 페이지를 다시 로드하세요." message: - cannot_move_message_to_forum_of_different_project: 다른 프로젝트의 포럼으로 메시지를 이동할 - 수 없습니다. + cannot_move_message_to_forum_of_different_project: "다른 프로젝트의 포럼으로 메시지를 이동할 수 없습니다." notifications: - at_least_one_channel: 알림을 보낼 채널을 하나 이상 지정해야 합니다. + at_least_one_channel: "알림을 보낼 채널을 하나 이상 지정해야 합니다." attributes: read_ian: - read_on_creation: 알림 생성 시 ture 로 설정할 수 없습니다. + read_on_creation: "알림 생성 시 ture 로 설정할 수 없습니다." mail_reminder_sent: - set_on_creation: 알림 생성 시 ture 로 설정할 수 없습니다. + set_on_creation: "알림 생성 시 ture 로 설정할 수 없습니다." reason: no_notification_reason: "- IAN이 채널로 선택되었으므로 비워둘 수 없습니다." reason_mail_digest: @@ -1988,30 +1857,26 @@ ko: parse_schema_filter_params_service: attributes: base: - unsupported_operator: 그 연산자는 지원되지 않습니다. - invalid_values: 유효하지 않은 값입니다. + unsupported_operator: "그 연산자는 지원되지 않습니다." + invalid_values: "유효하지 않은 값입니다." id_filter_required: "'id' 필터가 필요합니다." project: - archived_ancestor: 이 프로젝트에는 보관된 상위 항목이 있습니다. - foreign_wps_reference_version: 하위가 아닌 프로젝트의 작업 패키지는 해당 프로젝트 또는 하위 프로젝트의 - 버전을 참조합니다. - cannot_be_assigned_to_artifact_work_package: 선택한 사용자는 작업 패키지에 할당할 수 없습니다. + archived_ancestor: "이 프로젝트에는 보관된 상위 항목이 있습니다." + foreign_wps_reference_version: "하위가 아닌 프로젝트의 작업 패키지는 해당 프로젝트 또는 하위 프로젝트의 버전을 참조합니다." + cannot_be_assigned_to_artifact_work_package: "선택한 사용자는 작업 패키지에 할당할 수 없습니다." attributes: base: - archive_permission_missing_on_subprojects: 모든 하위 프로젝트를 보관하는 데 필요한 권한이 - 없습니다. 관리자에게 문의하세요. - project_initiation_request_disabled: 프로젝트 시작 요청이 비활성화되었습니다. 아티팩트 작업 - 패키지를 생성하려면 이 기능을 활성화해야 합니다. + archive_permission_missing_on_subprojects: "모든 하위 프로젝트를 보관하는 데 필요한 권한이 없습니다. 관리자에게 문의하세요." + project_initiation_request_disabled: "프로젝트 시작 요청이 비활성화되었습니다. 아티팩트 작업 패키지를 생성하려면 이 기능을 활성화해야 합니다." types: - in_use_by_work_packages: '아직 작업 패키지에 사용됨: %{types}' + in_use_by_work_packages: "아직 작업 패키지에 사용됨: %{types}" enabled_modules: - dependency_missing: "'%{module}' 모듈이 '%{dependency}' 모듈에 의존하므로 해당 모듈도 - 활성화되어 있어야 합니다." + dependency_missing: "'%{module}' 모듈이 '%{dependency}' 모듈에 의존하므로 해당 모듈도 활성화되어 있어야 합니다." format: "%{message}" project_custom_field_project_mapping: attributes: project_ids: - blank: 프로젝트를 선택하세요. + blank: "프로젝트를 선택하세요." project/phase: attributes: start_date: @@ -2019,39 +1884,38 @@ ko: non_continuous_dates: "- 이전 단계의 종료 날짜보다 빠를 수 없습니다." finish_date: must_be_after_start_date: "- 시작 날짜 후여야 합니다." - cannot_be_a_non_working_day: 휴무일은 사용할 수 없습니다. + cannot_be_a_non_working_day: "휴무일은 사용할 수 없습니다." query: attributes: public: error_unauthorized: "- 해당 사용자는 공용 보기를 만들 권한이 없습니다." group_by: - invalid: '그룹화할 수 없습니다: %{value}' + invalid: "그룹화할 수 없습니다: %{value}" format: "%{message}" column_names: - invalid: '잘못 된 쿼리 열: %{value}' + invalid: "잘못 된 쿼리 열: %{value}" format: "%{message}" sort_criteria: - invalid: '열로 정렬할 수 없습니다: %{value}' + invalid: "열로 정렬할 수 없습니다: %{value}" format: "%{message}" timestamps: - invalid: '타임스탬프에 잘못된 값이 포함되어 있습니다: %{values}' - forbidden: '타임스탬프에 금지된 값이 포함되어 있습니다: %{values}' + invalid: "타임스탬프에 잘못된 값이 포함되어 있습니다: %{values}" + forbidden: "타임스탬프에 금지된 값이 포함되어 있습니다: %{values}" format: "%{message}" selects: name_not_included: "'이름' 열을 포함해야 합니다" nonexistent: "'%{column}' 열이 존재하지 않습니다." format: "%{message}" - group_by_hierarchies_exclusive: 은(는) %{group_by} 에 의해 그룹과 상호배타적입니다. 당신은 - 둘 다 활성화할 수 없습니다. - can_only_be_modified_by_owner: 쿼리는 소유자만 수정할 수 있습니다. - need_permission_to_modify_public_query: 공개 쿼리는 수정할 수 없습니다. + group_by_hierarchies_exclusive: "은(는) %{group_by} 에 의해 그룹과 상호배타적입니다. 당신은 둘 다 활성화할 수 없습니다." + can_only_be_modified_by_owner: "쿼리는 소유자만 수정할 수 있습니다." + need_permission_to_modify_public_query: "공개 쿼리는 수정할 수 없습니다." filters: custom_fields: - inexistent: 필터에 대한 사용자 지정 필드가 없습니다. + inexistent: "필터에 대한 사용자 지정 필드가 없습니다." queries/filters/base: attributes: values: - inclusion: 필터에 잘못된 값이 있습니다. + inclusion: "필터에 잘못된 값이 있습니다." format: "%{message}" queries/principals/filters/internal_mentionable_on_work_package_filter: attributes: @@ -2059,41 +1923,39 @@ ko: single_value_requirement: "- 단일 작업 패키지여야 합니다" relation: typed_dag: - circular_dependency: 이 관계는 관계의 원을 만듭니다. + circular_dependency: "이 관계는 관계의 원을 만듭니다." attributes: base: - error_not_deletable: 선택한 작업 패키지에 대한 편집 권한이 없으므로 이 관계를 삭제할 수 없습니다. - error_not_editable: 선택한 작업 패키지에 대한 편집 권한이 없으므로 이 관계를 편집할 수 없습니다. + error_not_deletable: "선택한 작업 패키지에 대한 편집 권한이 없으므로 이 관계를 삭제할 수 없습니다." + error_not_editable: "선택한 작업 패키지에 대한 편집 권한이 없으므로 이 관계를 편집할 수 없습니다." to_id: - format: 선택한 작업 패키지 %{message} + format: "선택한 작업 패키지 %{message}" error_not_found: "- 찾을 수 없습니다." error_readonly: "- 기존 관계에 대해서는 변경할 수 없습니다." error_not_manageable: "- 선택한 작업 패키지에 대한 편집 권한이 없으므로 추가할 수 없습니다." from_id: - format: 선택한 작업 패키지 %{message} + format: "선택한 작업 패키지 %{message}" error_not_found: "- 찾을 수 없습니다." error_readonly: "- 기존 관계에 대해서는 변경할 수 없습니다." error_not_manageable: "- 선택한 작업 패키지에 대한 편집 권한이 없으므로 추가할 수 없습니다." repository: - not_available: SCM 업체가 가용하지 않습니다. - not_whitelisted: 은(는) 설절에 허용되지 않습니다. - invalid_url: 유효한 리포지토리 URL 또는 경로가 아닙니다. - must_not_be_ssh: SSH url이 아니어야 합니다. - no_directory: 디텍터리가 아님 + not_available: "SCM 업체가 가용하지 않습니다." + not_whitelisted: "은(는) 설절에 허용되지 않습니다." + invalid_url: "유효한 리포지토리 URL 또는 경로가 아닙니다." + must_not_be_ssh: "SSH url이 아니어야 합니다." + no_directory: "디텍터리가 아님" role: attributes: permissions: - dependency_missing: "'%{permission}'이(가) 선택되었으므로 '%{dependency}'도 포함해야 - 합니다." + dependency_missing: "'%{permission}'이(가) 선택되었으므로 '%{dependency}'도 포함해야 합니다." setting: attributes: base: - working_days_are_missing: 적어도 일주일의 하루는 근무일로 정의해야 합니다. - previous_working_day_changes_unprocessed: 근무일 구성에 대한 이전 변경 사항이 아직 적용되지 - 않았습니다. - hours_per_day_are_missing: 일별 시간을 정의해야 합니다. - durations_are_not_positive_numbers: 기간은 양수여야 합니다. - hours_per_day_is_out_of_bounds: 일별 시간은 24시간을 초과할 수 없습니다 + working_days_are_missing: "적어도 일주일의 하루는 근무일로 정의해야 합니다." + previous_working_day_changes_unprocessed: "근무일 구성에 대한 이전 변경 사항이 아직 적용되지 않았습니다." + hours_per_day_are_missing: "일별 시간을 정의해야 합니다." + durations_are_not_positive_numbers: "기간은 양수여야 합니다." + hours_per_day_is_out_of_bounds: "일별 시간은 24시간을 초과할 수 없습니다" status: attributes: default_done_ratio: @@ -2102,7 +1964,7 @@ ko: time_entry: attributes: hours: - day_limit: 하루 최대 24시간을 기록할 수 있으므로 너무 높습니다. + day_limit: "하루 최대 24시간을 기록할 수 있으므로 너무 높습니다." user_preference: attributes: pause_reminders: @@ -2110,206 +1972,194 @@ ko: daily_reminders: full_hour: "- 1시간 전송만 구성할 수 있습니다." notification_settings: - only_one_global_setting: 전역 알림 설정은 하나만 있어야 합니다. - email_alerts_global: 이메일 알림 설정은 전역으로만 설정할 수 있습니다. + only_one_global_setting: "전역 알림 설정은 하나만 있어야 합니다." + email_alerts_global: "이메일 알림 설정은 전역으로만 설정할 수 있습니다." format: "%{message}" - wrong_date: 시작 날짜, 기한 또는 기한 지남 값이 잘못되었습니다. + wrong_date: "시작 날짜, 기한 또는 기한 지남 값이 잘못되었습니다." watcher: attributes: user_id: not_allowed_to_view: "- 이 리소스를 볼 수 없습니다." locked: "- 잠겨 있습니다." wiki_page: - error_conflict: 위키 페이지를 편집하는 동안 다른 사용자에 의해 업데이트되었습니다. + error_conflict: "위키 페이지를 편집하는 동안 다른 사용자에 의해 업데이트되었습니다." attributes: slug: - undeducible: 제목 '%{title}'에서 유추해낼 수 없습니다. + undeducible: "제목 '%{title}'에서 유추해낼 수 없습니다." work_package: - is_not_a_valid_target_for_time_entries: '작업 패키지 #%{id}은(는) 시간 항목 재할당에 올바른 - 대상이 아닙니다.' + is_not_a_valid_target_for_time_entries: "작업 패키지 #%{id}은(는) 시간 항목 재할당에 올바른 대상이 아닙니다." attributes: id: format: "%{message}" - cannot_add_child_because_of_lack_of_permission: 선택한 작업 패키지를 편집할 권한이 - 없으므로 자식을 추가할 수 없습니다. - blank: ID는 비워둘 수 없습니다. + cannot_add_child_because_of_lack_of_permission: "선택한 작업 패키지를 편집할 권한이 없으므로 자식을 추가할 수 없습니다." + blank: "ID는 비워둘 수 없습니다." assigned_to: format: "%{message}" done_ratio: does_not_match_work_and_remaining_work: "- 작업과 남은 작업이 일치하지 않습니다" cannot_be_set_when_work_is_zero: "- 작업이 0시간인 경우 설정할 수 없습니다" must_be_set_when_remaining_work_is_set: "- 남은 작업이 설정된 경우 필수입니다." - must_be_set_when_work_and_remaining_work_are_set: "- 작업 및 남은 작업이 설정된 - 경우 필수입니다." + must_be_set_when_work_and_remaining_work_are_set: "- 작업 및 남은 작업이 설정된 경우 필수입니다." inclusion: "- 0에서 100 사이여야 합니다." due_date: - not_start_date: 마일스톤에서 요구하지만, 시작 날짜가 없음 - cannot_be_null: 시작 날짜와 기간을 알고 있으므로 null로 설정할 수 없습니다. + not_start_date: "마일스톤에서 요구하지만, 시작 날짜가 없음" + cannot_be_null: "시작 날짜와 기간을 알고 있으므로 null로 설정할 수 없습니다." duration: - larger_than_dates: 시작 날짜와 완료 날짜 사이의 간격보다 큽니다. - smaller_than_dates: 시작 날짜와 완료 날짜 사이의 간격보다 작습니다. - not_available_for_milestones: 마일스톤 유형 작업 패키지에 사용할 수 없습니다. - cannot_be_null: 시작 날짜와 완료 날짜를 알고 있으므로 null로 설정할 수 없습니다. + larger_than_dates: "시작 날짜와 완료 날짜 사이의 간격보다 큽니다." + smaller_than_dates: "시작 날짜와 완료 날짜 사이의 간격보다 작습니다." + not_available_for_milestones: "마일스톤 유형 작업 패키지에 사용할 수 없습니다." + cannot_be_null: "시작 날짜와 완료 날짜를 알고 있으므로 null로 설정할 수 없습니다." not_an_integer: "- 유효한 기간이 아닙니다." parent: - cannot_be_milestone: 마일스톤에 포함될 수 없음 + cannot_be_milestone: "마일스톤에 포함될 수 없음" cannot_be_self_assigned: "- 자신에게 할당할 수 없습니다." - cannot_be_in_another_project: 다른 프로젝트에 포함될 수 없음 - not_a_valid_parent: 은(는) 올바르지 않은 값입니다 + cannot_be_in_another_project: "다른 프로젝트에 포함될 수 없음" + not_a_valid_parent: "은(는) 올바르지 않은 값입니다" schedule_manually: - cannot_be_automatically_scheduled: "- 선행 단계 또는 자식이 없으므로 false(자동 예약)로 - 설정할 수 없습니다." + cannot_be_automatically_scheduled: "- 선행 단계 또는 자식이 없으므로 false(자동 예약)로 설정할 수 없습니다." start_date: - violates_relationships: 은(는) %{soonest_start} 이상으로만 설정할 수 있습니다. 작업 패키지의 - 관계를 위반하지 않도록 하기 위해서입니다. - cannot_be_null: 완료 날짜와 기간을 알고 있으므로 null로 설정할 수 없습니다. + violates_relationships: "은(는) %{soonest_start} 이상으로만 설정할 수 있습니다. 작업 패키지의 관계를 위반하지 않도록 하기 위해서입니다." + cannot_be_null: "완료 날짜와 기간을 알고 있으므로 null로 설정할 수 없습니다." status_id: - status_transition_invalid: 현재 사용자 역할이 새 상태로 바르게 전환될 수 없으므로 유효 하지 않음 + status_transition_invalid: "현재 사용자 역할이 새 상태로 바르게 전환될 수 없으므로 유효 하지 않음" status_invalid_in_type: "- 유효하지 않습니다. 현재 상태가 이 유형에서 존재하지 않기 때문입니다." type: - cannot_be_milestone_due_to_children: "- 마일스톤일 수 없습니다. 이 작업 패키지에는 자식 - 항목이 있기 때문입니다." + cannot_be_milestone_due_to_children: "- 마일스톤일 수 없습니다. 이 작업 패키지에는 자식 항목이 있기 때문입니다." priority_id: - only_active_priorities_allowed: 활성화가 요구됨 + only_active_priorities_allowed: "활성화가 요구됨" category: - only_same_project_categories_allowed: 작업 패키지의 카테고리는 작업 패키지와 동일한 프로젝트에 - 있어야 합니다. - does_not_exist: 지정한 카테고리가 존재하지 않습니다. + only_same_project_categories_allowed: "작업 패키지의 카테고리는 작업 패키지와 동일한 프로젝트에 있어야 합니다." + does_not_exist: "지정한 카테고리가 존재하지 않습니다." estimated_hours: not_a_number: "- 유효한 기간이 아닙니다." cant_be_inferior_to_remaining_work: "- 남은 작업보다 낮을 수 없습니다." - must_be_set_when_remaining_work_and_percent_complete_are_set: "- 남은 - 작업 및 완료 %가 설정된 경우 필수입니다." + must_be_set_when_remaining_work_and_percent_complete_are_set: "- 남은 작업 및 완료 %가 설정된 경우 필수입니다." remaining_hours: not_a_number: "- 유효한 기간이 아닙니다." cant_exceed_work: "- 작업보다 높을 수 없습니다." must_be_set_when_work_is_set: "- 작업이 설정된 경우 필수입니다." - must_be_set_when_work_and_percent_complete_are_set: "- 작업 및 완료 %가 설정된 - 경우 필수입니다." - must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: ">- - 작업이 설정되고 완료 %가 100%인 경우 0시간이어야 합니다." - must_be_empty_when_work_is_empty_and_percent_complete_is_100p: "- 작업이 - 비어 있고 완료 %가 100%인 경우 비어 있어야 합니다." - readonly_status: 작업 패키지가 읽기 전용 상태이므로 해당 속성을 변경할 수 없습니다. + must_be_set_when_work_and_percent_complete_are_set: "- 작업 및 완료 %가 설정된 경우 필수입니다." + must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: '>- 작업이 설정되고 완료 %가 100%인 경우 0시간이어야 합니다.' + must_be_empty_when_work_is_empty_and_percent_complete_is_100p: >- + - 작업이 비어 있고 완료 %가 100%인 경우 비어 있어야 합니다. + readonly_status: "작업 패키지가 읽기 전용 상태이므로 해당 속성을 변경할 수 없습니다." type: attributes: attribute_groups: - attribute_unknown: 잘못된 작업 패키지 특성이 사용되었습니다. - attribute_unknown_name: '잘못된 작업 패키지 특성이 사용되었습니다: %{attribute}' - duplicate_group: "'%{group}'(이)라는 그룹 이름이 두 번 이상 사용되었습니다. 그룹 이름은 중복될 - 수 없습니다." - query_invalid: 포함된 쿼리 '%{group}'이(가) 잘못되었습니다. %{details} - group_without_name: 명명되지 않은 그룹은 허용되지 않습니다. + attribute_unknown: "잘못된 작업 패키지 특성이 사용되었습니다." + attribute_unknown_name: "잘못된 작업 패키지 특성이 사용되었습니다: %{attribute}" + duplicate_group: "'%{group}'(이)라는 그룹 이름이 두 번 이상 사용되었습니다. 그룹 이름은 중복될 수 없습니다." + query_invalid: "포함된 쿼리 '%{group}'이(가) 잘못되었습니다. %{details}" + group_without_name: "명명되지 않은 그룹은 허용되지 않습니다." patterns: - invalid_tokens: 필드 내의 특성이 하나 이상의 유효하지 않습니다. 특성을 수정한 후에 저장하세요. + invalid_tokens: "필드 내의 특성이 하나 이상의 유효하지 않습니다. 특성을 수정한 후에 저장하세요." user: attributes: base: - user_limit_reached: 사용자 제한에 도달했습니다. 현재 플랜에서 더 이상 계정을 만들 수 없습니다. - one_must_be_active: 관리자 사용자는 잠그거나/제거할 수 없습니다. 최소한 한 명의 관리자가 활성화되어 있어야 - 합니다. + user_limit_reached: "사용자 제한에 도달했습니다. 현재 플랜에서 더 이상 계정을 만들 수 없습니다." + one_must_be_active: "관리자 사용자는 잠그거나/제거할 수 없습니다. 최소한 한 명의 관리자가 활성화되어 있어야 합니다." password_confirmation: - confirmation: 비밀번호와 비밀번호 확인이 일치하지 않습니다. + confirmation: "비밀번호와 비밀번호 확인이 일치하지 않습니다." format: "%{message}" password: - weak: '다음과 같은 클래스의 문자를 포함해야 합니다(최소 %{min_count} / %{all_count}): %{rules}' - lowercase: '소문자(예: ''a'')' - uppercase: '대문자(예: ''A'')' - numeric: '숫자 (예: '' 1'')' - special: '특수기호 (예: '' %'')' + weak: "다음과 같은 클래스의 문자를 포함해야 합니다(최소 %{min_count} / %{all_count}): %{rules}" + lowercase: "소문자(예: 'a')" + uppercase: "대문자(예: 'A')" + numeric: "숫자 (예: ' 1')" + special: "특수기호 (예: ' %')" reused: - other: 전에 사용 되었습니다. 마지막 %{count} 에서 다른 하나를 선택 하십시오. + other: "전에 사용 되었습니다. 마지막 %{count} 에서 다른 하나를 선택 하십시오." match: - confirm: 비밀번호 확인 - description: 비밀번호와 비밀번호 확인 필드가 일치하지 해야 합니다. + confirm: "비밀번호 확인" + description: "비밀번호와 비밀번호 확인 필드가 일치하지 해야 합니다." status: - invalid_on_create: 은(는) 새 사용자에 대해 유효한 상태가 아닙니다. + invalid_on_create: "은(는) 새 사용자에 대해 유효한 상태가 아닙니다." member: - principal_blank: 하나 이상의 사용자 또는 그룹을 선택 하십시오. - role_blank: 할당해야 합니다. + principal_blank: "하나 이상의 사용자 또는 그룹을 선택 하십시오." + role_blank: "할당해야 합니다." attributes: roles: - ungrantable: 할당할 수 없는 역할이 있습니다. + ungrantable: "할당할 수 없는 역할이 있습니다." more_than_one: "- 두 개 이상의 역할이 있습니다." principal: - unassignable: 프로젝트에 할당할 수 없습니다. + unassignable: "프로젝트에 할당할 수 없습니다." version: - undeletable_archived_projects: 첨부된 작업 패키지가 있으므로 이 버전은 삭제할 수 없습니다. - undeletable_work_packages_attached: 첨부된 작업 패키지가 있으므로 이 버전은 삭제할 수 없습니다. + undeletable_archived_projects: "첨부된 작업 패키지가 있으므로 이 버전은 삭제할 수 없습니다." + undeletable_work_packages_attached: "첨부된 작업 패키지가 있으므로 이 버전은 삭제할 수 없습니다." token/named: attributes: token_name: - blank: 토큰 이름을 입력하세요 - in_use: 이 토큰 이름은 이미 사용 중입니다. 다른 이름을 선택하세요 + blank: "토큰 이름을 입력하세요" + in_use: "이 토큰 이름은 이미 사용 중입니다. 다른 이름을 선택하세요" format: "%{message}" jira: - invalid_protocol: 유효한 프로토콜(http 또는 https)을 입력하세요 + invalid_protocol: "유효한 프로토콜(http 또는 https)을 입력하세요" template: - body: 다음 필드를 확인 하십시오. + body: "다음 필드를 확인 하십시오." header: other: "%{count} 오류 때문에 %{model} 을 저장할 수 없습니다." models: - attachment: 파일 + attachment: "파일" attribute_help_text: - other: 특성 도움말 텍스트 + other: "특성 도움말 텍스트" auth_provider: - other: 인증 공급자 - category: 카테고리 - color: 색상 - comment: 코멘트 - custom_action: 사용자 지정 작업 - custom_field: 사용자 정의 필드 - customized: 사용자 지정됨 - doorkeeper/application: OAuth 애플리케이션 + other: "인증 공급자" + category: "카테고리" + color: "색상" + comment: "코멘트" + custom_action: "사용자 지정 작업" + custom_field: "사용자 정의 필드" + customized: "사용자 지정됨" + "doorkeeper/application": "OAuth 애플리케이션" enterprise_token: - other: Enterprise 토큰 - forum: 포럼 - global_role: 글로벌 역할 - group: 그룹 + other: "Enterprise 토큰" + forum: "포럼" + global_role: "글로벌 역할" + group: "그룹" issue_priority: - other: 우선 순위 - meeting_participant: 미팅 참가자 - member: 멤버 - news: 뉴스 + other: "우선 순위" + meeting_participant: "미팅 참가자" + member: "멤버" + news: "뉴스" notification: - other: 알림 - placeholder_user: 플레이스홀더 사용자 + other: "알림" + placeholder_user: "플레이스홀더 사용자" project: - other: 프로젝트 + other: "프로젝트" project_query: - other: 프로젝트 목록 - query: 사용자 지정 쿼리 - reminder: 미리 알림 + other: "프로젝트 목록" + query: "사용자 지정 쿼리" + reminder: "미리 알림" role: - other: 역할 + other: "역할" scim_client: - other: SCIM 클라이언트 + other: "SCIM 클라이언트" jira: - other: Jira - status: 작업 패키지 상태 + other: "Jira" + status: "작업 패키지 상태" token/api: other: 액세스 토큰 token/rss: - other: RSS 토큰 + other: "RSS 토큰" type: - other: 유형 - user: 사용자 - version: 버전 - workflow: 워크플로 - work_package: 작업 패키지 - wiki: 위키 - wiki_page: 위키 페이지 + other: "유형" + user: "사용자" + version: "버전" + workflow: "워크플로" + work_package: "작업 패키지" + wiki: "위키" + wiki_page: "위키 페이지" errors: header_invalid_fields: - other: 다음 필드에 문제가 있습니다. + other: "다음 필드에 문제가 있습니다." header_additional_invalid_fields: - other: 또한 다음 필드에 문제가 있습니다. + other: "또한 다음 필드에 문제가 있습니다." field_erroneous_label: "이 필드는 유효 하지 않습니다: %{full_errors} \n유효한 값을 입력 해 주십시오." messages: must_be_template: "- 템플릿이어야 합니다" unsupported_storage_type: "- 지원되는 저장소 유형이 아닙니다." - storage_error: 저장소 연결에 오류가 발생했습니다. - invalid_input: 입력이 잘못되었습니다. + storage_error: "저장소 연결에 오류가 발생했습니다." + invalid_input: "입력이 잘못되었습니다." activity: item: created_by_on: "%{datetime}, %{user} 님이 생성함" @@ -2320,421 +2170,398 @@ ko: updated_by_on_time_entry: "%{datetime}, %{user} 님이 기록한 시간을 업데이트함" updated_on: "%{datetime} 업데이트함" updated_on_time_entry: "%{datetime}, 기록한 시간을 업데이트함" - deleted_on: '삭제: %{datetime}' - deleted_by_on: '삭제: %{user}, %{datetime}' - added_on: '추가: %{datetime}' - added_by_on: '추가: %{user}, %{datetime}' - removed_on: '제거: %{datetime}' - removed_by_on: '제거: %{user}, %{datetime}' - parent_without_of: 하위 프로젝트 - parent_no_longer: 더 이상 다음의 하위 프로젝트 아님 + deleted_on: "삭제: %{datetime}" + deleted_by_on: "삭제: %{user}, %{datetime}" + added_on: "추가: %{datetime}" + added_by_on: "추가: %{user}, %{datetime}" + removed_on: "제거: %{datetime}" + removed_by_on: "제거: %{user}, %{datetime}" + parent_without_of: "하위 프로젝트" + parent_no_longer: "더 이상 다음의 하위 프로젝트 아님" time_entry: hour: other: "%{count} 시간" hour_html: other: "%{count}시간" updated: "%{old_value}에서 %{value}(으)로 변경됨" - logged_for: 기록함 - + logged_for: "기록함 -" filter: - changeset: 변경 집합 - message: 포럼 - news: 뉴스 - project_details: 프로젝트 세부 정보 - subproject: 하위 프로젝트 포함 - time_entry: 소요 시간 - wiki_edit: 위키 - work_package: 작업 패키지 + changeset: "변경 집합" + message: "포럼" + news: "뉴스" + project_details: "프로젝트 세부 정보" + subproject: "하위 프로젝트 포함" + time_entry: "소요 시간" + wiki_edit: "위키" + work_package: "작업 패키지" project_phase: - activated: 활성화됨 + activated: "활성화됨" added_date: "%{date}(으)로 설정됨" changed_date: "- %{from}에서 %{to}(으)로 변경되었습니다" - deactivated: 비활성화됨 - deleted_project_phase: 프로젝트 단계 삭제됨 + deactivated: "비활성화됨" + deleted_project_phase: "프로젝트 단계 삭제됨" phase_and_both_gates: "%{phase_message}. %{start_gate_message} 및 %{finish_gate_message}" phase_and_one_gate: "%{phase_message}. %{gate_message}" - removed_date: 삭제된 날짜 %{date} + removed_date: "삭제된 날짜 %{date}" + #common attributes of all models attributes: - active: 활성 - assigned_to: 담당자 - assignee: 담당자 - attachments: 첨부 파일 - actor: 수행자 - action: 액션 - api_key: API 키 - author: 작성자 - avatar: 아바타 - base: '일반 오류:' - body: 본문 - blocks_ids: 차단 된 작업 패키지의 ID - category: 카테고리 - comment: 코멘트 - comments: 코멘트 - content: 내용 - color: 색상 - creator: 만든이 - created_at: 작성일 - custom_field: 사용자 정의 필드 - custom_options: 가능한 값 - custom_values: 사용자 정의 필드 - date: 날짜 - dates_interval: 날짜 범위 - default_columns: 기본 칼럼 - description: 설명 - derived_due_date: 파생된 완료 날짜 - derived_estimated_hours: 총 작업 - derived_start_date: 파생된 시작 날짜 - direction: 방향 - display_sums: 합계 표시 - domain: 도메인 - due_date: 완료 날짜 - estimated_hours: 작업 - estimated_time: 작업 - email: 이메일 - entity_type: 엔티티 - expires_at: 만료 날짜 - firstname: 이름 - filter: 필터 - group: 그룹 - groups: 그룹 - hexcode: 16진수 코드 - id: ID - is_default: 기본값 - is_for_all: 모든 프로젝트용 - public: 공용 - principal: 사용자 또는 그룹 - issue: 작업 패키지 - journal: 기록일지 - journal_notes: 코멘트 - lastname: 성 - login: 사용자 이름 - lock_version: 버전 잠금 - mail: 이메일 - name: 이름 - note: 메모 - notes: 노트 - number: 숫자 - options: 옵션 - operator: 연산자 - password: 암호 - priority: 우선 순위 - project: 프로젝트 - project_ids: 프로젝트 ID - project_phase: 프로젝트 단계 - project_phase_definition: 프로젝트 단계 - reason: 이유 - responsible: 담당 - required: 필수 - recipient: 수신자 - role: 역할 - roles: 역할 - search: 검색 - sprint: 스프린트 - start_date: 시작 날짜 - status: 상태 - state: 상태 - subject: 제목 - slug: 슬러그 - summary: 요약 - template: 템플릿 - time_zone: 표준 시간대 - text: 텍스트 - title: 제목 - type: 타입 - typeahead: 자동 완성 - uid: 고유 식별자 - updated_at: 업데이트 날짜 - updated_on: 업데이트 날짜 - uploader: 업로더 - user: 사용자 - username: 사용자 이름 - unit: 단위 - value: 값 - values: 값 - version: 버전 - visible: 표시 - work_package: 작업 패키지 - work_package_id: 작업 패키지 + active: "활성" + assigned_to: "담당자" + assignee: "담당자" + attachments: "첨부 파일" + actor: "수행자" + action: "액션" + api_key: "API 키" + author: "작성자" + avatar: "아바타" + base: "일반 오류:" + body: "본문" + blocks_ids: "차단 된 작업 패키지의 ID" + category: "카테고리" + comment: "코멘트" + comments: "코멘트" + content: "내용" + color: "색상" + creator: "만든이" + created_at: "작성일" + custom_field: "사용자 정의 필드" + custom_options: "가능한 값" + custom_values: "사용자 정의 필드" + date: "날짜" + dates_interval: "날짜 범위" + default_columns: "기본 칼럼" + description: "설명" + derived_due_date: "파생된 완료 날짜" + derived_estimated_hours: "총 작업" + derived_start_date: "파생된 시작 날짜" + direction: "방향" + display_sums: "합계 표시" + domain: "도메인" + due_date: "완료 날짜" + estimated_hours: "작업" + estimated_time: "작업" + email: "이메일" + entity_type: "엔티티" + expires_at: "만료 날짜" + firstname: "이름" + filter: "필터" + group: "그룹" + groups: "그룹" + hexcode: "16진수 코드" + id: "ID" + is_default: "기본값" + is_for_all: "모든 프로젝트용" + public: "공용" + principal: "사용자 또는 그룹" + #kept for backwards compatibility + issue: "작업 패키지" + journal: "기록일지" + journal_notes: "코멘트" + lastname: "성" + login: "사용자 이름" + lock_version: "버전 잠금" + mail: "이메일" + name: "이름" + note: "메모" + notes: "노트" + number: "숫자" + options: "옵션" + operator: "연산자" + password: "암호" + priority: "우선 순위" + project: "프로젝트" + project_ids: "프로젝트 ID" + project_phase: "프로젝트 단계" + project_phase_definition: "프로젝트 단계" + reason: "이유" + responsible: "담당" + required: "필수" + recipient: "수신자" + role: "역할" + roles: "역할" + search: "검색" + sprint: "스프린트" + start_date: "시작 날짜" + status: "상태" + state: "상태" + subject: "제목" + slug: "슬러그" + summary: "요약" + template: "템플릿" + time_zone: "표준 시간대" + text: "텍스트" + title: "제목" + type: "타입" + typeahead: "자동 완성" + uid: "고유 식별자" + updated_at: "업데이트 날짜" + updated_on: "업데이트 날짜" + uploader: "업로더" + user: "사용자" + username: "사용자 이름" + unit: "단위" + value: "값" + values: "값" + version: "버전" + visible: "표시" + work_package: "작업 패키지" + work_package_id: "작업 패키지" backup: - failed: 백업 실패 - label_backup_token: 백업 토큰 - label_create_token: 백업 토큰 생성 - label_delete_token: 백업 토큰 제거 - label_reset_token: 백업 토큰 초기화 - label_token_users: 아래 사용자들은 활성화된 백업 토큰을 가지고 있습니다 + failed: "백업 실패" + label_backup_token: "백업 토큰" + label_create_token: "백업 토큰 생성" + label_delete_token: "백업 토큰 제거" + label_reset_token: "백업 토큰 초기화" + label_token_users: "아래 사용자들은 활성화된 백업 토큰을 가지고 있습니다" reset_token: action_create: 만들기 action_reset: 재설정 - heading_reset: 백업 토큰 초기화 - heading_create: 백업 토큰 생성 - implications: '백업을 활성화하면 필요한 권한과 이 백업 토큰이 있는 모든 사용자가 이 OpenProject 프로젝트의 모든 - 데이터가 포함된 백업을 다운로드할 수 있습니다. 여기에는 다른 모든 사용자의 데이터도 포함됩니다. - - ' - info: '백업을 생성하려면 백업 토큰을 생성해야 합니다. 백업을 요청할 때마다 토큰을 입력해야 합니다. 백업 토큰을 삭제하면 해당 사용자의 - 백업을 비활성화할 수 있습니다. - - ' - verification: '백업 토큰을 %{action}하려면 %{word}(을)를 입력하여 확인하십시오. - - ' + heading_reset: "백업 토큰 초기화" + heading_create: "백업 토큰 생성" + implications: > + 백업을 활성화하면 필요한 권한과 이 백업 토큰이 있는 모든 사용자가 이 OpenProject 프로젝트의 모든 데이터가 포함된 백업을 다운로드할 수 있습니다. 여기에는 다른 모든 사용자의 데이터도 포함됩니다. + info: > + 백업을 생성하려면 백업 토큰을 생성해야 합니다. 백업을 요청할 때마다 토큰을 입력해야 합니다. 백업 토큰을 삭제하면 해당 사용자의 백업을 비활성화할 수 있습니다. + verification: > + 백업 토큰을 %{action}하려면 %{word}(을)를 입력하여 확인하십시오. verification_word_reset: 초기화 verification_word_create: 생성 - warning: '새 토큰을 생성하면 24시간이 지난 후부터만 백업을 요청할 수 있습니다. 이는 안전을 위한 조치입니다. 이후부터는 토큰을 - 이용해 언제든 백업을 요청할 수 있습니다. - - ' + warning: > + 새 토큰을 생성하면 24시간이 지난 후부터만 백업을 요청할 수 있습니다. 이는 안전을 위한 조치입니다. 이후부터는 토큰을 이용해 언제든 백업을 요청할 수 있습니다. text_token_deleted: 백업 토큰이 제거되었습니다. 백업이 꺼졌습니다. error: invalid_token: 백업 토큰이 유효하지 않거나 누락되었습니다 - token_cooldown: "%{hours}시간 후부터 백업 토큰이 유효합니다." + token_cooldown: '%{hours}시간 후부터 백업 토큰이 유효합니다.' backup_pending: 이미 대기 중인 백업이 있습니다. limit_reached: 하루에 백업 %{limit}회만 진행할 수 있습니다. - button_actions: 작업 - button_add: 추가 - button_add_comment: 댓글 달기 - button_add_item_above: 위에 항목 추가 - button_add_item_below: 아래에 항목 추가 - button_add_sub_item: 하위 항목 추가 + button_actions: "작업" + button_add: "추가" + button_add_comment: "댓글 달기" + button_add_item_above: "위에 항목 추가" + button_add_item_below: "아래에 항목 추가" + button_add_sub_item: "하위 항목 추가" button_add_member: 멤버 추가 - button_add_watcher: 주시자 추가 - button_annotate: 주석 달기 - button_apply: 적용 - button_apply_changes: 변경 사항 적용 - button_archive: 보관 - button_back: 뒤로 - button_cancel: 취소 - button_change: 변경 - button_change_parent_page: 부모 페이지 변경 - button_change_password: 암호 변경 - button_check_all: 모두 선택 - button_clear: 선택 취소 - button_click_to_reveal: 표시하려면 클릭 - button_close: 닫기 - button_collapse_all: 모두 축소 - button_confirm: 확인 - button_configure: 구성 - button_continue: 계속 - button_complete: 완료 - button_copy: 복사 - button_copy_to_clipboard: 클립보드 복사 - button_copy_link_to_clipboard: 클립보드에 링크 복사 - button_create: 만들기 - button_create_and_continue: 만들고 계속하기 - button_decline: 거부 - button_delete: 삭제 - button_delete_permanently: 영구 삭제 - button_delete_watcher: 주시자 %{name} 삭제 - button_download: 다운로드 - button_disable: 비활성화 - button_duplicate: 복제 - button_duplicate_and_follow: 복제하고 팔로우 - button_edit: 편집 - button_enable: 활성화 - button_edit_associated_wikipage: '연결된 위키 페이지 편집: %{page_title}' - button_expand_all: 모두 확장 - button_favorite: 즐겨찾기에 추가 - button_filter: 필터 - button_finish_setup: 설정 완료 - button_generate: 생성 - button_list: 목록 - button_lock: 잠금 - button_login: 로그인 - button_move: 이동 - button_move_and_follow: 이동하고 따라가기 - button_print: 인쇄 - button_quote: 인용 + button_add_watcher: "주시자 추가" + button_annotate: "주석 달기" + button_apply: "적용" + button_apply_changes: "변경 사항 적용" + button_archive: "보관" + button_back: "뒤로" + button_cancel: "취소" + button_change: "변경" + button_change_parent_page: "부모 페이지 변경" + button_change_password: "암호 변경" + button_check_all: "모두 선택" + button_clear: "선택 취소" + button_click_to_reveal: "표시하려면 클릭" + button_close: "닫기" + button_collapse_all: "모두 축소" + button_confirm: "확인" + button_configure: "구성" + button_continue: "계속" + button_complete: "완료" + button_copy: "복사" + button_copy_to_clipboard: "클립보드 복사" + button_copy_link_to_clipboard: "클립보드에 링크 복사" + button_create: "만들기" + button_create_and_continue: "만들고 계속하기" + button_decline: "거부" + button_delete: "삭제" + button_delete_permanently: "영구 삭제" + button_delete_watcher: "주시자 %{name} 삭제" + button_download: "다운로드" + button_disable: "비활성화" + button_duplicate: "복제" + button_duplicate_and_follow: "복제하고 팔로우" + button_edit: "편집" + button_enable: "활성화" + button_edit_associated_wikipage: "연결된 위키 페이지 편집: %{page_title}" + button_expand_all: "모두 확장" + button_favorite: "즐겨찾기에 추가" + button_filter: "필터" + button_finish_setup: "설정 완료" + button_generate: "생성" + button_list: "목록" + button_lock: "잠금" + button_login: "로그인" + button_move: "이동" + button_move_and_follow: "이동하고 따라가기" + button_print: "인쇄" + button_quote: "인용" button_remove: 제거 - button_remove_permanently: 영구적으로 제거 - button_remove_reminder: 미리 알림 제거 - button_rename: 이름 바꾸기 - button_replace: 교체하기 - button_revoke: 취소 - button_reply: 회신 - button_reset: 재설정 - button_rollback: 이 버전으로 롤백 - button_save: 저장 - button_save_as: 다른 이름으로 저장 - button_save_back: 저장하고 돌아가기 - button_select: 선택 - button_set_reminder: 미리 알림 설정 - button_show: 표시 - button_sort: 분류 - button_submit: 제출 - button_test: 테스트 - button_unarchive: 보관 취소 - button_uncheck_all: 모두 선택 취소 - button_unlock: 잠금 해제 - button_unfavorite: 즐겨찾기에서 제거 - button_unwatch: 주시 안 함 - button_update: 업데이트 - button_upgrade: 업그레이드 - button_buy_now: 지금 구입 - button_upload: 업로드하기 - button_view: 보기 - button_watch: 주시 - button_manage_menu_entry: 메뉴 항목 구성 - button_add_menu_entry: 메뉴 항목 추가 - button_configure_menu_entry: 메뉴 항목 구성 - button_delete_menu_entry: 메뉴 항목 삭제 - button_view_shared_work_packages: 공유된 작업 패키지 보기 - button_manage_roles: 역할 관리 - button_remove_member: 멤버 제거 - button_remove_member_and_shares: 멤버 및 공유 제거 - button_revoke_work_package_shares: 작업 패키지 공유 취소 - button_revoke_access: 액세스 취소 - button_revoke_all: 모두 취소 + button_remove_permanently: "영구적으로 제거" + button_remove_reminder: "미리 알림 제거" + button_rename: "이름 바꾸기" + button_replace: "교체하기" + button_revoke: "취소" + button_reply: "회신" + button_reset: "재설정" + button_rollback: "이 버전으로 롤백" + button_save: "저장" + button_save_as: "다른 이름으로 저장" + button_save_back: "저장하고 돌아가기" + button_select: "선택" + button_set_reminder: "미리 알림 설정" + button_show: "표시" + button_sort: "분류" + button_submit: "제출" + button_test: "테스트" + button_unarchive: "보관 취소" + button_uncheck_all: "모두 선택 취소" + button_unlock: "잠금 해제" + button_unfavorite: "즐겨찾기에서 제거" + button_unwatch: "주시 안 함" + button_update: "업데이트" + button_upgrade: "업그레이드" + button_buy_now: "지금 구입" + button_upload: "업로드하기" + button_view: "보기" + button_watch: "주시" + button_manage_menu_entry: "메뉴 항목 구성" + button_add_menu_entry: "메뉴 항목 추가" + button_configure_menu_entry: "메뉴 항목 구성" + button_delete_menu_entry: "메뉴 항목 삭제" + button_view_shared_work_packages: "공유된 작업 패키지 보기" + button_manage_roles: "역할 관리" + button_remove_member: "멤버 제거" + button_remove_member_and_shares: "멤버 및 공유 제거" + button_revoke_work_package_shares: "작업 패키지 공유 취소" + button_revoke_access: "액세스 취소" + button_revoke_all: "모두 취소" button_revoke_only: "%{shared_role_name}만 취소" - button_publish: 공개로 설정 - button_unpublish: 비공개로 설정 + button_publish: "공개로 설정" + button_unpublish: "비공개로 설정" consent: checkbox_label: 위 내용을 확인했으며 이에 동의합니다. failure_message: 동의에 실패했습니다. 계속할 수 없습니다. title: 사용자 동의 decline_warning_message: 동의를 거부하고 로그아웃했습니다. user_has_consented: 사용자가 [구성된 동의 정보 텍스트](consent_settings)에 동의했습니다. - not_yet_consented: 사용자가 [구성된 동의 정보 텍스트](consent_settings)에 아직 동의하지 않았습니다. 다음에 - 로그인할 때 알림이 표시됩니다. - contact_mail_instructions: 사용자가 데이터 변경 또는 제거 요청을 수행하기 위해 데이터 컨트롤러에게 연락할 수 있는 메일 - 주소를 정의합니다. + not_yet_consented: 사용자가 [구성된 동의 정보 텍스트](consent_settings)에 아직 동의하지 않았습니다. 다음에 로그인할 때 알림이 표시됩니다. + contact_mail_instructions: 사용자가 데이터 변경 또는 제거 요청을 수행하기 위해 데이터 컨트롤러에게 연락할 수 있는 메일 주소를 정의합니다. contact_your_administrator: 계정을 삭제하려는 경우 관리자에 문의하세요. contact_this_mail_address: 계정을 삭제하려는 경우 %{mail_address}에 문의하세요. - text_update_consent_time: 사용자에게 다시 동의하도록 요구하려면 이 확인란을 선택합니다. 위의 동의 정보에 대한 법적 내용을 - 변경하는 경우에 사용합니다. - update_consent_last_time: '동의에 대한 마지막 업데이트: %{update_time}' + text_update_consent_time: 사용자에게 다시 동의하도록 요구하려면 이 확인란을 선택합니다. 위의 동의 정보에 대한 법적 내용을 변경하는 경우에 사용합니다. + update_consent_last_time: "동의에 대한 마지막 업데이트: %{update_time}" copy_project: title: '"%{source_project_name}" 프로젝트 복사' - started: 프로젝트 "%{source_project_name}"을(를) "%{target_project_name}"(으)로 복사하기 시작했습니다. - "%{target_project_name}"이(가) 사용 가능하게 되면 메일로 알림이 전송됩니다. - failed: 프로젝트 %{source_project_name}을(를) 복사할 수 없습니다. - failed_internal: 내부 오류로 인해 복사가 실패했습니다. - succeeded: 프로젝트 %{target_project_name} 생성함 - errors: 오류 - project_custom_fields: 프로젝트의 사용자 지정 필드 + started: '프로젝트 "%{source_project_name}"을(를) "%{target_project_name}"(으)로 복사하기 시작했습니다. "%{target_project_name}"이(가) 사용 가능하게 되면 메일로 알림이 전송됩니다.' + failed: "프로젝트 %{source_project_name}을(를) 복사할 수 없습니다." + failed_internal: "내부 오류로 인해 복사가 실패했습니다." + succeeded: "프로젝트 %{target_project_name} 생성함" + errors: "오류" + project_custom_fields: "프로젝트의 사용자 지정 필드" x_objects_of_this_type: - zero: 이 유형의 객체가 없습니다 - one: 이 유형의 객체가 하나 있습니다 - other: 이 유형의 객체가 %{count}개 있습니다 + zero: "이 유형의 객체가 없습니다" + one: "이 유형의 객체가 하나 있습니다" + other: "이 유형의 객체가 %{count}개 있습니다" text: - failed: 프로젝트 "%{source_project_name}"을(를) 프로젝트 "%{target_project_name}"에 복사할 - 수 없습니다. - succeeded: 프로젝트 "%{source_project_name}"을(를) 프로젝트 "%{target_project_name}"에 - 복사했습니다. - source_project_label: 프로젝트 복사됨 + failed: '프로젝트 "%{source_project_name}"을(를) 프로젝트 "%{target_project_name}"에 복사할 수 없습니다.' + succeeded: '프로젝트 "%{source_project_name}"을(를) 프로젝트 "%{target_project_name}"에 복사했습니다.' + source_project_label: "프로젝트 복사됨" copy_options: - dependencies_label: 프로젝트에서 복사 + dependencies_label: "프로젝트에서 복사" create_project: - attributes_heading: 프로젝트에서 작업하려면 이 필수 정보를 입력하세요. - template_label: 템플릿 사용 - template_heading: 프로젝트 템플릿을 선택하여 가장 일반적인 프로젝트 관리 방법으로 작업하거나, 처음부터 프로젝트를 만드세요. + attributes_heading: "프로젝트에서 작업하려면 이 필수 정보를 입력하세요." + template_label: "템플릿 사용" + template_heading: "프로젝트 템플릿을 선택하여 가장 일반적인 프로젝트 관리 방법으로 작업하거나, 처음부터 프로젝트를 만드세요." copy_options: - dependencies_label: 템플릿에서 복사 + dependencies_label: "템플릿에서 복사" blank_template: - label: 빈 프로젝트 + label: "빈 프로젝트" description: 처음부터 시작하세요. 프로젝트 특성, 멤버 및 모듈을 수동으로 추가하세요. blank_description: 제공된 설명이 없습니다. create_portfolio: - template_heading: 포트폴리오 템플릿을 선택하여 가장 일반적인 프로젝트 관리 방법으로 작업하거나, 처음부터 포트폴리오를 만드세요. + template_heading: "포트폴리오 템플릿을 선택하여 가장 일반적인 프로젝트 관리 방법으로 작업하거나, 처음부터 포트폴리오를 만드세요." blank_template: - label: 빈 포트폴리오 + label: "빈 포트폴리오" description: 처음부터 시작하세요. 포트폴리오 특성, 멤버 및 모듈을 수동으로 추가하세요. create_program: - template_heading: 프로그램 템플릿을 선택하여 가장 일반적인 프로젝트 관리 방법으로 작업하거나, 처음부터 프로그램을 만드세요. + template_heading: "프로그램 템플릿을 선택하여 가장 일반적인 프로젝트 관리 방법으로 작업하거나, 처음부터 프로그램을 만드세요." blank_template: - label: 빈 프로그램 + label: "빈 프로그램" description: 처음부터 시작하세요. 프로그램 특성, 멤버 및 모듈을 수동으로 추가하세요. - create_wiki_page: 새 위키 페이지 만들기 - create_wiki_page_button: 위키 페이지 + create_wiki_page: "새 위키 페이지 만들기" + create_wiki_page_button: "위키 페이지" date: abbr_day_names: - - 일 - - 월 - - 화 - - 수 - - 목 - - 금 - - 토 + - "일" + - "월" + - "화" + - "수" + - "목" + - "금" + - "토" abbr_month_names: - - - - 1월 - - 2월 - - 3월 - - 4월 - - 5월 - - 6월 - - 7월 - - 8월 - - 9월 - - 10월 - - 11월 - - 12월 - abbr_week: 주 + - null + - "1월" + - "2월" + - "3월" + - "4월" + - "5월" + - "6월" + - "7월" + - "8월" + - "9월" + - "10월" + - "11월" + - "12월" + abbr_week: "주" day_names: - - 일요일 - - 월요일 - - 화요일 - - 수요일 - - 목요일 - - 금요일 - - 토요일 + - "일요일" + - "월요일" + - "화요일" + - "수요일" + - "목요일" + - "금요일" + - "토요일" formats: + #Use the strftime parameters for formats. + #When no format has been given, it uses default. + #You can provide other formats here if you like! default: "%m/%d/%Y" long: "%B %d, %Y" short: "%b %d" - month_names: - - - - 1월 - - 2월 - - 3월 - - 4월 - - 5월 - - 6월 - - 7월 - - 8월 - - 9월 - - 10월 - - 11월 - - 12월 + #Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: #Used in date_select and datetime_select. + - null + - "1월" + - "2월" + - "3월" + - "4월" + - "5월" + - "6월" + - "7월" + - "8월" + - "9월" + - "10월" + - "11월" + - "12월" order: - - ":년" - - ":월" - - ":일" + - ':년' + - ':월' + - ':일' datetime: distance_in_words: about_x_hours: - other: 약 %{count} 시간 + other: "약 %{count} 시간" about_x_months: - other: |- - 약 1개월 - 약 %{count}개월 + other: "약 1개월\n약 %{count}개월" about_x_years: - other: |- - 약 1년 - 약 %{count}년 + other: "약 1년\n약 %{count}년" almost_x_years: - other: |- - 거의 1년 - 거의 %{count}년 - half_a_minute: 30초 + other: "거의 1년\n거의 %{count}년" + half_a_minute: "30초" less_than_x_minutes: - other: |- - 1분 미만 - %{count}분 미만 + other: "1분 미만\n%{count}분 미만" less_than_x_seconds: - other: |- - 1초 미만 - %{count}초 미만 + other: "1초 미만\n%{count}초 미만" over_x_years: - other: |- - 1년 이상 - %{count}년 이상 + other: "1년 이상\n%{count}년 이상" x_days: - other: |- - 1일 - %{count}일 + other: "1일\n%{count}일" x_minutes: - other: |- - 1분 - %{count}분 + other: "1분\n%{count}분" x_minutes_abbreviated: other: "%{count}분" x_hours: @@ -2744,56 +2571,50 @@ ko: x_weeks: other: "%{count}주" x_months: - other: |- - 1개월 - %{count}개월 + other: "1개월\n%{count}개월" x_years: other: "%{count}년" x_seconds: - other: |- - 1초 - %{count}초 + other: "1초\n%{count}초" x_seconds_abbreviated: other: "%{count}초" units: minute_abbreviated: - other: 분 + other: "분" hour: - other: 시간 + other: "시간" day: - other: 일 - description_active: 활성? - description_attachment_toggle: 첨부 파일 표시/숨기기 - description_autocomplete: '이 필드는 자동 완성 기능을 사용합니다. 작업 패키지의 제목을 입력하는 중에 가능한 후보 목록이 - 나타납니다. 위쪽 화살표와 아래쪽 화살표 키를 사용하여 하나를 선택하고 Tab 또는 Enter 키로 이를 선택하세요. 또는 작업 패키지 번호를 - 직접 입력할 수 있습니다. - - ' - description_available_columns: 사용 가능한 열 - description_choose_project: 프로젝트 - description_compare_from: '다음과 비교:' - description_compare_to: '비교:' - description_current_position: '사용자의 위치: ' - description_date_from: 시작 날짜 입력 - description_date_to: 종료 날짜 입력 - description_enter_number: 번호 입력 - description_enter_text: 텍스트 입력 - description_filter: 필터 - description_filter_toggle: 필터 표시/숨기기 - description_category_reassign: 카테고리 선택 - description_message_content: 메시지 내용 - description_my_project: 사용자는 멤버입니다. - description_notes: 노트 - description_parent_work_package: 현재 항목의 부모 작업 패키지 - description_project_scope: 검색 범위 - description_query_sort_criteria_attribute: 정렬 특성 - description_query_sort_criteria_direction: 정렬 방향 - description_search: 검색 필드 - description_select_work_package: 작업 패키지 선택 - description_selected_columns: 선택된 열 - description_sub_work_package: 현재 항목의 하위 작업 패키지 - description_toc_toggle: 목차 표시/숨기기 - description_wiki_subpages_reassign: 새 부모 페이지 선택 + other: "일" + description_active: "활성?" + description_attachment_toggle: "첨부 파일 표시/숨기기" + description_autocomplete: > + 이 필드는 자동 완성 기능을 사용합니다. 작업 패키지의 제목을 입력하는 중에 가능한 후보 목록이 나타납니다. 위쪽 화살표와 아래쪽 화살표 키를 사용하여 하나를 선택하고 Tab 또는 Enter 키로 이를 선택하세요. 또는 작업 패키지 번호를 직접 입력할 수 있습니다. + description_available_columns: "사용 가능한 열" + description_choose_project: "프로젝트" + description_compare_from: "다음과 비교:" + description_compare_to: "비교:" + description_current_position: "사용자의 위치: " + description_date_from: "시작 날짜 입력" + description_date_to: "종료 날짜 입력" + description_enter_number: "번호 입력" + description_enter_text: "텍스트 입력" + description_filter: "필터" + description_filter_toggle: "필터 표시/숨기기" + description_category_reassign: "카테고리 선택" + description_message_content: "메시지 내용" + description_my_project: "사용자는 멤버입니다." + description_notes: "노트" + description_parent_work_package: "현재 항목의 부모 작업 패키지" + description_project_scope: "검색 범위" + description_query_sort_criteria_attribute: "정렬 특성" + description_query_sort_criteria_direction: "정렬 방향" + description_search: "검색 필드" + description_select_work_package: "작업 패키지 선택" + description_selected_columns: "선택된 열" + description_sub_work_package: "현재 항목의 하위 작업 패키지" + description_toc_toggle: "목차 표시/숨기기" + description_wiki_subpages_reassign: "새 부모 페이지 선택" + #Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) direction: ltr ee: features: @@ -2828,363 +2649,317 @@ ko: work_package_sharing: 외부 사용자와 작업 패키지 공유 work_package_subject_generation: 작업 패키지 제목 생성 upsell: - buy_now_button: 지금 구입 - plans_title: Enterprise 플랜 - title: Enterprise 추가 기능 - plan_title: Enterprise %{plan} 추가 기능 + buy_now_button: "지금 구입" + plans_title: "Enterprise 플랜" + title: "Enterprise 추가 기능" + plan_title: "Enterprise %{plan} 추가 기능" plan_name: "%{plan} Enterprise 플랜" plan_text_html: "%{plan_name}부터 사용 가능합니다." - unlimited: 무제한 - already_have_token: '이미 토큰이 있으신가요? 아래 버튼을 사용하여 토큰을 추가하고 예약한 Enterprise 플랜으로 - 업그레이드하세요. - - ' - hide_banner: 이 배너 숨기기 - homescreen_description: 'Enterprise 플랜은 OpenProject Community Edition에 [Enterprise - 추가 기능](enterprise_url)과 전문 지원을 포함하여 확장한 플랜으로, 미션 크리티컬 환경에서 OpenProject를 실행하는 - 조직에 이상적입니다. - - ' + unlimited: "무제한" + already_have_token: > + 이미 토큰이 있으신가요? 아래 버튼을 사용하여 토큰을 추가하고 예약한 Enterprise 플랜으로 업그레이드하세요. + hide_banner: "이 배너 숨기기" + homescreen_description: > + Enterprise 플랜은 OpenProject Community Edition에 [Enterprise 추가 기능](enterprise_url)과 전문 지원을 포함하여 확장한 플랜으로, 미션 크리티컬 환경에서 OpenProject를 실행하는 조직에 이상적입니다. homescreen_subline: 업그레이드하면 오픈 소스 프로젝트도 지원하게 됩니다. baseline_comparison: description: 과거 어느 시점 이후에 이 목록에서 변경된 사항을 강조 표시합니다. benefits: - description: Enterprise on-premises Edition의 장점은 무엇인가요? - high_security: 보안 기능 - high_security_text: SSO(SAML, OpenID Connect, CAS), LDAP 그룹. - installation: 설치 지원 - installation_text: 숙련된 소프트웨어 엔지니어들이 사용자 고유 인프라에서 완전한 설치 및 설정 프로세스를 안내해 줍니다. - premium_features: Enterprise 추가 기능 - premium_features_text: 애자일 보드, 사용자 지정 테마 및 로고, 그래프, 인텔리전트 워크플로와 사용자 지정 작업, - 작업 패키지 첨부 파일 및 다중 선택 사용자 지정 필드에 대한 전체 텍스트 검색. - professional_support: 전문 지원 - professional_support_text: 비즈니스 크리티컬 환경에서의 OpenProject 실행에 대한 전문 지식을 갖춘 선임 - 지원 엔지니어가 신뢰할 수 있는 뛰어난 지원을 제공합니다. + description: "Enterprise on-premises Edition의 장점은 무엇인가요?" + high_security: "보안 기능" + high_security_text: "SSO(SAML, OpenID Connect, CAS), LDAP 그룹." + installation: "설치 지원" + installation_text: "숙련된 소프트웨어 엔지니어들이 사용자 고유 인프라에서 완전한 설치 및 설정 프로세스를 안내해 줍니다." + premium_features: "Enterprise 추가 기능" + premium_features_text: "애자일 보드, 사용자 지정 테마 및 로고, 그래프, 인텔리전트 워크플로와 사용자 지정 작업, 작업 패키지 첨부 파일 및 다중 선택 사용자 지정 필드에 대한 전체 텍스트 검색." + professional_support: "전문 지원" + professional_support_text: "비즈니스 크리티컬 환경에서의 OpenProject 실행에 대한 전문 지식을 갖춘 선임 지원 엔지니어가 신뢰할 수 있는 뛰어난 지원을 제공합니다." work_package_subject_generation: - description: 참조된 특성과 텍스트를 사용하여 자동으로 생성되는 제목을 만듭니다. + description: "참조된 특성과 텍스트를 사용하여 자동으로 생성되는 제목을 만듭니다." customize_life_cycle: - description: PM2 프로젝트 사이클 계획에서 제공되는 것과는 다른 프로젝트 단계를 만들고 구성합니다. + description: "PM2 프로젝트 사이클 계획에서 제공되는 것과는 다른 프로젝트 단계를 만들고 구성합니다." capture_external_links: - description: 사용자가 외부 링크를 방문하기 전에 캡처하고 경고를 표시하여 소셜 엔지니어링 공격을 방지하세요. + description: "사용자가 외부 링크를 방문하기 전에 캡처하고 경고를 표시하여 소셜 엔지니어링 공격을 방지하세요." work_package_query_relation_columns: - description: 작업 패키지 목록에서 관계 또는 자식 요소를 확인해야 하나요? + description: "작업 패키지 목록에서 관계 또는 자식 요소를 확인해야 하나요?" edit_attribute_groups: - description: 다음과 같은 기타 추가 기능으로 양식 구성을 사용자 지정하세요. + description: "다음과 같은 기타 추가 기능으로 양식 구성을 사용자 지정하세요." features: - groups: 새로운 특성 그룹 추가 - rename: 특성 그룹 이름 바꾸기 - related: 관련 작업 패키지의 테이블 추가 + groups: "새로운 특성 그룹 추가" + rename: "특성 그룹 이름 바꾸기" + related: "관련 작업 패키지의 테이블 추가" readonly_work_packages: - description: 특정 상태의 작업 패키지를 읽기 전용으로 표시합니다. + description: "특정 상태의 작업 패키지를 읽기 전용으로 표시합니다." custom_field_hierarchies: - description: 계층 사용자 지정 필드를 사용하면 다중 레벨 선택 목록을 사용하여 작업 패키지 및 프로젝트의 계층 구조를 구성할 - 수 있습니다. + description: "계층 사용자 지정 필드를 사용하면 다중 레벨 선택 목록을 사용하여 작업 패키지 및 프로젝트의 계층 구조를 구성할 수 있습니다." date_alerts: - description: 날짜 경보를 사용하면, 중요 마감일을 놓치거나 잊지 않도록 향후 시작 날짜 또는 종료 날짜에 대한 알림을 받게 - 됩니다. + description: "날짜 경보를 사용하면, 중요 마감일을 놓치거나 잊지 않도록 향후 시작 날짜 또는 종료 날짜에 대한 알림을 받게 됩니다." weighted_item_lists: - description: 가중치가 적용된 항목 목록을 사용하면 기본 숫자 값이 연결된 목록을 만들 수 있습니다. + description: "가중치가 적용된 항목 목록을 사용하면 기본 숫자 값이 연결된 목록을 만들 수 있습니다." work_package_sharing: - description: 프로젝트 멤버가 아닌 사용자와 작업 패키지를 공유합니다. + description: "프로젝트 멤버가 아닌 사용자와 작업 패키지를 공유합니다." project_list_sharing: - description: 개별 사용자와 프로젝트 목록을 공유합니다. + description: "개별 사용자와 프로젝트 목록을 공유합니다." calculated_values: - description: 계산된 값을 사용하면 숫자 값, 기타 프로젝트 특성 및 사용자 지정 필드를 사용하여 수학 공식 기반 특성을 만들 - 수 있습니다. + description: "계산된 값을 사용하면 숫자 값, 기타 프로젝트 특성 및 사용자 지정 필드를 사용하여 수학 공식 기반 특성을 만들 수 있습니다." define_custom_style: - title: 사용자 지정 색상 테마 및 로고 - more_info: '참고: 사용된 로그는 공개적으로 액세스 가능합니다.' + title: "사용자 지정 색상 테마 및 로고" + more_info: "참고: 사용된 로그는 공개적으로 액세스 가능합니다." description: 고유한 로고와 색상으로 OpenProject 설치를 사용자 지정하세요. custom_actions: - title: 사용자 지정 작업 - description: 사용자 지정 작업은 상태, 역할, 유형 또는 프로젝트를 기반으로 특정 작업 패키지에서 사용할 수 있도록 미리 - 정의된 작업 세트에 대한 원클릭 바로 가기입니다. + title: "사용자 지정 작업" + description: "사용자 지정 작업은 상태, 역할, 유형 또는 프로젝트를 기반으로 특정 작업 패키지에서 사용할 수 있도록 미리 정의된 작업 세트에 대한 원클릭 바로 가기입니다." mcp_server: - description: 안전한 MCP 서버를 사용하여 AI 워크플로에 OpenProject를 도입하세요. + description: "안전한 MCP 서버를 사용하여 AI 워크플로에 OpenProject를 도입하세요." meeting_templates: - description: 설정된 의제 구조로 미팅 템플릿을 정의하고, 새 미팅을 만들 때 이 템플릿을 재사용하여 시간을 절약하세요. + description: "설정된 의제 구조로 미팅 템플릿을 정의하고, 새 미팅을 만들 때 이 템플릿을 재사용하여 시간을 절약하세요." nextcloud_sso: - title: Nextcloud 저장소용 Single Sign-On - description: Single Sign-On을 사용하여 Nextcloud 저장소에 대한 원활하고 안전한 인증을 활성화합니다. 액세스 - 관리를 간소화하고 사용자 편의성을 개선합니다. + title: "Nextcloud 저장소용 Single Sign-On" + description: "Single Sign-On을 사용하여 Nextcloud 저장소에 대한 원활하고 안전한 인증을 활성화합니다. 액세스 관리를 간소화하고 사용자 편의성을 개선합니다." scim_api: - title: SCIM 클라이언트 - description: SCIM 서버 API를 통해 Microsoft Entra 또는 Keycloak 같은 외부 ID 서비스를 원활하게 - 통합하여 OpenProject에서 사용자 관리를 자동화하세요. Enterprise 기업 플랜부터 사용할 수 있습니다. + title: "SCIM 클라이언트" + description: "SCIM 서버 API를 통해 Microsoft Entra 또는 Keycloak 같은 외부 ID 서비스를 원활하게 통합하여 OpenProject에서 사용자 관리를 자동화하세요. Enterprise 기업 플랜부터 사용할 수 있습니다." sso_auth_providers: - title: SSO(Single Sign-On) - description: 기존 ID 시스템에서 원활하게 액세스하고 통합할 수 있도록 SAML 또는 OpenID Connect를 사용하여 - 외부 SSO 공급자를 통해 사용자가 로그인할 수 있게 합니다. + title: "SSO(Single Sign-On)" + description: "기존 ID 시스템에서 원활하게 액세스하고 통합할 수 있도록 SAML 또는 OpenID Connect를 사용하여 외부 SSO 공급자를 통해 사용자가 로그인할 수 있게 합니다." virus_scanning: - description: OpenProject에서 업로드된 파일은 바이러스 검사를 수행한 후에 다른 사용자가 액세스해야 합니다. + description: "OpenProject에서 업로드된 파일은 바이러스 검사를 수행한 후에 다른 사용자가 액세스해야 합니다." project_creation_wizard: - description: 프로젝트 관리자가 프로젝트 시작 요청을 작성하는 데 도움이 되는 단계별 마법사를 생성합니다. + description: "프로젝트 관리자가 프로젝트 시작 요청을 작성하는 데 도움이 되는 단계별 마법사를 생성합니다." placeholder_users: title: 플레이스홀더 사용자 - description: '플레이스홀더 사용자는 해당 프로젝트에 속하지 않은 사용자에게 작업 패키지를 할당하는 방법으로, 다양한 시나리오에서 - 유용할 수 있습니다. 예를 들어, 아직 명명되지 않았거나 사용 가능하지 않은 리소스에 대한 작업을 추적해야 하거나, 해당 개인에게 - OpenProject에 대한 액세스 권한을 부여하고 싶지 않지만 이들에게 할당된 작업을 추적하려는 경우에 유용합니다. - - ' + description: > + 플레이스홀더 사용자는 해당 프로젝트에 속하지 않은 사용자에게 작업 패키지를 할당하는 방법으로, 다양한 시나리오에서 유용할 수 있습니다. 예를 들어, 아직 명명되지 않았거나 사용 가능하지 않은 리소스에 대한 작업을 추적해야 하거나, 해당 개인에게 OpenProject에 대한 액세스 권한을 부여하고 싶지 않지만 이들에게 할당된 작업을 추적하려는 경우에 유용합니다. internal_comments: title: 내부 코멘트 - description: 내부 코멘트를 사용하여 내부 팀이 비공개로 서로 커뮤니케이션할 수 있습니다. 이러한 코멘트는 특정 프로젝트 역할에만 - 표시되며 공개적으로 표시되지 않습니다. + description: "내부 코멘트를 사용하여 내부 팀이 비공개로 서로 커뮤니케이션할 수 있습니다. 이러한 코멘트는 특정 프로젝트 역할에만 표시되며 공개적으로 표시되지 않습니다." internal_comments_inline: - title: 소규모 그룹만 볼 수 있는 내부 코멘트 작성 + title: "소규모 그룹만 볼 수 있는 내부 코멘트 작성" description: " " portfolio_management: description: 프로젝트를 포트폴리오와 프로그램으로 구성하여 전략적 목표에 맞게 조정하세요. teaser: title: other: "%{trial_plan} 평가판 토큰 %{count}일 남음" - description: 모든 %{trial_plan} 기능에 액세스할 수 있습니다. + description: "모든 %{trial_plan} 기능에 액세스할 수 있습니다." trial: - not_found: 평가판 토큰을 요청했지만 해당 요청은 더 이상 사용할 수 없습니다. 다시 시도해 주세요. - wait_for_confirmation: 평가판 토큰을 받을 수 있도록 주소를 확인하기 위한 이메일을 보내드렸습니다. - already_retrieved: '평가판 Enterprise 토큰을 이미 가져왔습니다. 이메일에서 토큰이 첨부되어 있는지 확인하세요. - 새 토큰이 필요한 경우 지원팀에 문의하세요. - - ' - successfully_saved: 평가판 Enterprise 토큰을 가져왔습니다. - token_sent: 평가판 토큰 요청함 - request_again: 다시 요청 - resend_action: 확인 이메일 다시 보내기 - welcome_title: 빠른 기능 개요 - welcome_description: OpenProject Enterprise Edition에서 프로젝트 관리 및 팀 공동 작업에 대한 - 간략한 개요를 확인할 수 있습니다. - confirmation_info: 'OpenProject Enterprise 무료 평가판을 시작하기 위한 모든 정보가 포함된 이메일을 %{date}, - %{email}에 보내드렸습니다. 받은 편지함을 확인하고 제공된 확인 링크를 클릭하여 14일 무료 평가판을 시작하세요. - - ' - confirmation_subline: '받은 편지함을 확인하고 해당 단계에 따라 14일 무료 평가판을 시작하세요. - - ' + not_found: "평가판 토큰을 요청했지만 해당 요청은 더 이상 사용할 수 없습니다. 다시 시도해 주세요." + wait_for_confirmation: "평가판 토큰을 받을 수 있도록 주소를 확인하기 위한 이메일을 보내드렸습니다." + already_retrieved: > + 평가판 Enterprise 토큰을 이미 가져왔습니다. 이메일에서 토큰이 첨부되어 있는지 확인하세요. 새 토큰이 필요한 경우 지원팀에 문의하세요. + successfully_saved: "평가판 Enterprise 토큰을 가져왔습니다." + token_sent: "평가판 토큰 요청함" + request_again: "다시 요청" + resend_action: "확인 이메일 다시 보내기" + welcome_title: "빠른 기능 개요" + welcome_description: "OpenProject Enterprise Edition에서 프로젝트 관리 및 팀 공동 작업에 대한 간략한 개요를 확인할 수 있습니다." + confirmation_info: > + OpenProject Enterprise 무료 평가판을 시작하기 위한 모든 정보가 포함된 이메일을 %{date}, %{email}에 보내드렸습니다. 받은 편지함을 확인하고 제공된 확인 링크를 클릭하여 14일 무료 평가판을 시작하세요. + confirmation_subline: > + 받은 편지함을 확인하고 해당 단계에 따라 14일 무료 평가판을 시작하세요. domain_caption: 토큰은 현재 구성된 호스트 이름에 유효하게 됩니다. - receive_newsletter_html: 'OpenProject 뉴스레터를 - 받아보고 싶습니다. - - ' - consent_html: '서비스 - 약관개인정보 - 취급방침에 동의합니다. - - ' + receive_newsletter_html: > + OpenProject 뉴스레터를 받아보고 싶습니다. + consent_html: > + 서비스 약관개인정보 취급방침에 동의합니다. email_calendar_updates: state: - disabled: 비활성화되었습니다. - enabled: 활성화되었습니다. + disabled: "비활성화되었습니다." + enabled: "활성화되었습니다." button: - disabled: 활성화 - enabled: 비활성화 - enumeration_activities: 시간 추적 활동 - enumeration_work_package_priorities: 작업 패키지 우선 순위 - enumeration_reported_project_statuses: 보고된 상태 - enumeration_caption_order_changed: 주문이 변경되었습니다. - enumeration_could_not_be_moved: 열거형은 이동할 수 없습니다. + disabled: "활성화" + enabled: "비활성화" + enumeration_activities: "시간 추적 활동" + enumeration_work_package_priorities: "작업 패키지 우선 순위" + enumeration_reported_project_statuses: "보고된 상태" + enumeration_caption_order_changed: "주문이 변경되었습니다." + enumeration_could_not_be_moved: "열거형은 이동할 수 없습니다." enterprise_trials: dialog_component: title: Enterprise 평가판 - error_auth_source_sso_failed: 사용자 '%{value}'에 대한 Single Sign-On(SSO) 실패 - error_can_not_archive_project: '이 프로젝트는 보관할 수 없습니다: %{errors}' - error_can_not_delete_entry: 항목을 삭제할 수 없습니다. - error_can_not_delete_custom_field: 사용자 지정 필드를 삭제할 수 없습니다. - error_can_not_delete_in_use_archived_undisclosed: 보관된 프로젝트에는 작업 패키지도 있습니다. 어떤 프로젝트가 - 영향을 받는지 확인하려면 관리자에게 삭제를 수행하도록 요청해야 합니다. - error_can_not_delete_in_use_archived_work_packages: '보관된 프로젝트에 작업 패키지도 있습니다. 해당 - 작업 패키지의 특성을 변경하려면 먼저 다음 프로젝트를 다시 활성화해야 합니다: %{archived_projects_urls}' + error_auth_source_sso_failed: "사용자 '%{value}'에 대한 Single Sign-On(SSO) 실패" + error_can_not_archive_project: "이 프로젝트는 보관할 수 없습니다: %{errors}" + error_can_not_delete_entry: "항목을 삭제할 수 없습니다." + error_can_not_delete_custom_field: "사용자 지정 필드를 삭제할 수 없습니다." + error_can_not_delete_in_use_archived_undisclosed: "보관된 프로젝트에는 작업 패키지도 있습니다. 어떤 프로젝트가 영향을 받는지 확인하려면 관리자에게 삭제를 수행하도록 요청해야 합니다." + error_can_not_delete_in_use_archived_work_packages: "보관된 프로젝트에 작업 패키지도 있습니다. 해당 작업 패키지의 특성을 변경하려면 먼저 다음 프로젝트를 다시 활성화해야 합니다: %{archived_projects_urls}" error_can_not_delete_type: - explanation: 이 유형에는 작업 패키지가 포함되어 있으며 삭제할 수 없습니다. 영향을 받는 모든 작업 패키지는 이 보기에서 볼 수 있습니다. - error_can_not_delete_standard_type: 표준 유형은 삭제할 수 없습니다. - error_can_not_invite_user: 사용자에게 초대장을 보내지 못했습니다. - error_can_not_remove_role: 이 역할은 현재 사용 중이며 삭제할 수 없습니다. - error_can_not_reopen_work_package_on_closed_version: 닫힌 버전에 할당된 작업 패키지는 다시 열 수 없습니다. - error_can_not_find_all_resources: 이 요청 관련 리소스 일부를 찾을 수 없습니다. - error_can_not_unarchive_project: '이 프로젝트를 보관 취소할 수 없습니다: %{errors}' - error_check_user_and_role: 사용자 및 역할을 선택하세요. - error_code: 오류 %{code} - error_color_could_not_be_saved: 색상을 저장할 수 없습니다. - error_cookie_missing: OpenProject 쿠키가 없습니다. 이 응용 프로그램은 쿠키 없이 제대로 작동하지 않으므로, 쿠키를 - 활성화해야 합니다. - error_custom_option_not_found: 존재하지 않는 옵션입니다. - error_enterprise_plan_needed: 이 작업을 수행하려면 %{plan} Enterprise 플랜이 필요합니다. - error_enterprise_activation_user_limit: 사용자 계정을 활성화할 수 없습니다(사용자 제한에 도달함). 액세스하려면 - 관리자에게 문의하세요. - error_enterprise_token_invalid_domain: Enterprise Edition이 활성화되지 않았습니다. 해당 Enterprise - 토큰의 도메인(%{actual})이 시스템의 호스트 이름(%{expected})과 일치하지 않습니다. - error_failed_to_delete_entry: 항목 삭제에 실패하였습니다. - error_in_dependent: '종속 개체를 변경하려는 중에 오류가 발생했습니다: %{dependent_class} #%{related_id} - - %{related_subject}: %{error}' - error_in_new_dependent: '종속 개체를 생성하려는 중에 오류가 발생했습니다: %{dependent_class} - %{related_subject}: - %{error}' - error_invalid_selected_value: 선택된 값이 유효하지 않습니다. - error_journal_attribute_not_present: 저널에 %{attribute} 특성이 없습니다. - error_pdf_export_too_many_columns: PDF 내보내기에 대해 너무 많은 열을 선택했습니다. 열 수를 줄이십시오. - error_pdf_date_range_too_long: 선택한 작업 패키지 날짜 범위는 허용되는 PDF 내보내기 제한을 초과합니다. 범위를 최대 - %{years}년으로 좁혀주세요. - error_pdf_failed_to_export: 'PDF 내보내기를 저장할 수 없습니다: %{error}' - error_token_authenticity: 교차 사이트 요청 위조 토큰을 확인할 수 없습니다. 여러 브라우저나 탭에서 데이터 제출을 시도하셨습니까? - 모든 탭을 닫고 다시 시도하세요. - error_reminder_not_found: 미리 알림을 찾을 수 없거나 이미 알림을 받았습니다. - error_work_package_not_found_in_project: 작업 패키지가 없거나 이 프로젝트에 속하지 않습니다. - error_work_package_id_not_found: 작업 패키지를 찾을 수 없습니다. - error_must_be_project_member: 은(는) 프로젝트 멤버여야 합니다. - error_migrations_are_pending: OpenProject 설치에 보류 중인 데이터베이스 마이그레이션이 있습니다. 지난 업그레이드에서 - 마이그레이션을 실행하지 않았을 가능성이 있습니다. 업그레이드 가이드를 확인하여 제대로 설치를 업그레이드하세요. - error_migrations_visit_upgrade_guides: 업그레이드 가이드 문서를 참조하십시오. - error_no_default_work_package_status: 기본 작업 패키지 상태가 정의되지 않았습니다. 구성을 확인하세요("관리 -> - 작업 패키지 상태"로 이동). - error_no_type_in_project: 이 프로젝트에 유형이 연결되어 있지 않습니다. 프로젝트 설정을 확인하세요. - error_omniauth_registration_timed_out: 외부 인증 공급자를 통한 등록이 시간 초과되었습니다. 다시 시도하세요. - error_omniauth_invalid_auth: ID 공급자로부터 반환된 인증 정보가 잘못되었습니다. 관리자에게 문의하여 추가적인 도움을 받으세요. - error_password_change_failed: 암호를 변경하려는 중에 오류가 발생했습니다. - error_scm_command_failed: 리포지토리에 액세스하는 중에 오류가 발생했습니다. %{value} - error_scm_not_found: 항목 또는 수정 사항을 리포지토리에서 찾지 못했습니다. - error_type_could_not_be_saved: 유형을 저장할 수 없습니다. - error_unable_delete_status: 하나 이상의 작업 패키지에 의해 사용되므로 작업 패키지 상태를 삭제할 수 없습니다. - error_unable_delete_default_status: 기본 작업 패키지 상태를 삭제할 수 없습니다. 현재 상태를 삭제하기 전에 다른 - 기본 작업 패키지 상태를 선택하세요. - error_unable_to_connect: 연결할 수 없습니다(%{value}). - error_unable_delete_wiki: 위키 페이지를 삭제할 수 없습니다. - error_unable_update_wiki: 위키 페이지를 업데이트할 수 없습니다. - error_workflow_copy_source: 소스 유형 또는 역할을 선택하세요. - error_workflow_copy_target: 대상 유형과 역할을 선택하세요. + explanation: '이 유형에는 작업 패키지가 포함되어 있으며 삭제할 수 없습니다. 영향을 받는 모든 작업 패키지는 이 보기에서 볼 수 있습니다.' + error_can_not_delete_standard_type: "표준 유형은 삭제할 수 없습니다." + error_can_not_invite_user: "사용자에게 초대장을 보내지 못했습니다." + error_can_not_remove_role: "이 역할은 현재 사용 중이며 삭제할 수 없습니다." + error_can_not_reopen_work_package_on_closed_version: "닫힌 버전에 할당된 작업 패키지는 다시 열 수 없습니다." + error_can_not_find_all_resources: "이 요청 관련 리소스 일부를 찾을 수 없습니다." + error_can_not_unarchive_project: "이 프로젝트를 보관 취소할 수 없습니다: %{errors}" + error_check_user_and_role: "사용자 및 역할을 선택하세요." + error_code: "오류 %{code}" + error_color_could_not_be_saved: "색상을 저장할 수 없습니다." + error_cookie_missing: "OpenProject 쿠키가 없습니다. 이 응용 프로그램은 쿠키 없이 제대로 작동하지 않으므로, 쿠키를 활성화해야 합니다." + error_custom_option_not_found: "존재하지 않는 옵션입니다." + error_enterprise_plan_needed: "이 작업을 수행하려면 %{plan} Enterprise 플랜이 필요합니다." + error_enterprise_activation_user_limit: "사용자 계정을 활성화할 수 없습니다(사용자 제한에 도달함). 액세스하려면 관리자에게 문의하세요." + error_enterprise_token_invalid_domain: "Enterprise Edition이 활성화되지 않았습니다. 해당 Enterprise 토큰의 도메인(%{actual})이 시스템의 호스트 이름(%{expected})과 일치하지 않습니다." + error_failed_to_delete_entry: "항목 삭제에 실패하였습니다." + error_in_dependent: "종속 개체를 변경하려는 중에 오류가 발생했습니다: %{dependent_class} #%{related_id} - %{related_subject}: %{error}" + error_in_new_dependent: "종속 개체를 생성하려는 중에 오류가 발생했습니다: %{dependent_class} - %{related_subject}: %{error}" + error_invalid_selected_value: "선택된 값이 유효하지 않습니다." + error_journal_attribute_not_present: "저널에 %{attribute} 특성이 없습니다." + error_pdf_export_too_many_columns: "PDF 내보내기에 대해 너무 많은 열을 선택했습니다. 열 수를 줄이십시오." + error_pdf_date_range_too_long: "선택한 작업 패키지 날짜 범위는 허용되는 PDF 내보내기 제한을 초과합니다. 범위를 최대 %{years}년으로 좁혀주세요." + error_pdf_failed_to_export: "PDF 내보내기를 저장할 수 없습니다: %{error}" + error_token_authenticity: "교차 사이트 요청 위조 토큰을 확인할 수 없습니다. 여러 브라우저나 탭에서 데이터 제출을 시도하셨습니까? 모든 탭을 닫고 다시 시도하세요." + error_reminder_not_found: "미리 알림을 찾을 수 없거나 이미 알림을 받았습니다." + error_work_package_not_found_in_project: "작업 패키지가 없거나 이 프로젝트에 속하지 않습니다." + error_work_package_id_not_found: "작업 패키지를 찾을 수 없습니다." + error_must_be_project_member: "은(는) 프로젝트 멤버여야 합니다." + error_migrations_are_pending: "OpenProject 설치에 보류 중인 데이터베이스 마이그레이션이 있습니다. 지난 업그레이드에서 마이그레이션을 실행하지 않았을 가능성이 있습니다. 업그레이드 가이드를 확인하여 제대로 설치를 업그레이드하세요." + error_migrations_visit_upgrade_guides: "업그레이드 가이드 문서를 참조하십시오." + error_no_default_work_package_status: '기본 작업 패키지 상태가 정의되지 않았습니다. 구성을 확인하세요("관리 -> 작업 패키지 상태"로 이동).' + error_no_type_in_project: "이 프로젝트에 유형이 연결되어 있지 않습니다. 프로젝트 설정을 확인하세요." + error_omniauth_registration_timed_out: "외부 인증 공급자를 통한 등록이 시간 초과되었습니다. 다시 시도하세요." + error_omniauth_invalid_auth: "ID 공급자로부터 반환된 인증 정보가 잘못되었습니다. 관리자에게 문의하여 추가적인 도움을 받으세요." + error_password_change_failed: "암호를 변경하려는 중에 오류가 발생했습니다." + error_scm_command_failed: "리포지토리에 액세스하는 중에 오류가 발생했습니다. %{value}" + error_scm_not_found: "항목 또는 수정 사항을 리포지토리에서 찾지 못했습니다." + error_type_could_not_be_saved: "유형을 저장할 수 없습니다." + error_unable_delete_status: "하나 이상의 작업 패키지에 의해 사용되므로 작업 패키지 상태를 삭제할 수 없습니다." + error_unable_delete_default_status: "기본 작업 패키지 상태를 삭제할 수 없습니다. 현재 상태를 삭제하기 전에 다른 기본 작업 패키지 상태를 선택하세요." + error_unable_to_connect: "연결할 수 없습니다(%{value})." + error_unable_delete_wiki: "위키 페이지를 삭제할 수 없습니다." + error_unable_update_wiki: "위키 페이지를 업데이트할 수 없습니다." + error_workflow_copy_source: "소스 유형 또는 역할을 선택하세요." + error_workflow_copy_target: "대상 유형과 역할을 선택하세요." error_menu_item_not_created: 메뉴 항목을 추가할 수 없습니다. error_menu_item_not_saved: 메뉴 항목을 저장할 수 없습니다. - error_wiki_root_menu_item_conflict: '결과 메뉴 항목에서 기존 메뉴 항목 "%{existing_caption}" (%{existing_identifier})과(와)의 - 충돌로 인해 "%{old_name}"을(를) "%{new_name}"(으)로 이름을 바꿀 수 없습니다. - - ' - error_external_authentication_failed_message: '외부 인증 중에 오류가 발생했습니다: %{message}' - error_attribute_not_highlightable: '강조 표시되지 않는 특성: %{attributes}' + error_wiki_root_menu_item_conflict: > + 결과 메뉴 항목에서 기존 메뉴 항목 "%{existing_caption}" (%{existing_identifier})과(와)의 충돌로 인해 "%{old_name}"을(를) "%{new_name}"(으)로 이름을 바꿀 수 없습니다. + error_external_authentication_failed_message: "외부 인증 중에 오류가 발생했습니다: %{message}" + error_attribute_not_highlightable: "강조 표시되지 않는 특성: %{attributes}" events: - changeset: 변경 집합 편집됨 + changeset: "변경 집합 편집됨" message: 메시지 편집됨 news: 뉴스 - project_details: 프로젝트 세부 정보 편집됨 - project: 프로젝트 편집됨 - projects: 프로젝트 편집됨 + project_details: "프로젝트 세부 정보 편집됨" + project: "프로젝트 편집됨" + projects: "프로젝트 편집됨" reply: 회신함 - time_entry: 시간 로그 편집됨 - wiki_page: 위키 페이지 편집됨 - work_package_closed: 작업 패키지 닫힘 - work_package_edit: 작업 패키지 편집됨 - work_package_note: 작업 패키지 메모 추가됨 + time_entry: "시간 로그 편집됨" + wiki_page: "위키 페이지 편집됨" + work_package_closed: "작업 패키지 닫힘" + work_package_edit: "작업 패키지 편집됨" + work_package_note: "작업 패키지 메모 추가됨" title: - project: '프로젝트: %{name}' - subproject: '하위 프로젝트: %{name}' + project: "프로젝트: %{name}" + subproject: "하위 프로젝트: %{name}" export: dialog: - title: 내보내기 - submit: 내보내기 + title: "내보내기" + submit: "내보내기" save_export_settings: - label: 설정 저장 + label: "설정 저장" format: - label: 파일 형식 + label: "파일 형식" options: csv: - label: CSV + label: "CSV" pdf: - label: PDF + label: "PDF" xls: - label: XLS + label: "XLS" columns: - input_label_report: 특성 테이블에 열 추가 - input_caption_report: 기본적으로 작업 패키지 목록에 열로 추가된 모든 특성이 선택되어 있습니다. 긴 텍스트 필드는 - 특성 테이블에서 사용할 수 없지만 그 아래에 표시될 수 있습니다. - input_caption_table: 기본적으로 작업 패키지 목록에 열로 추가된 모든 특성이 선택되어 있습니다. 긴 텍스트 필드는 테이블 - 기반 내보내기에서 사용할 수 없습니다. - input_caption_required: 열이 포함되지 않은 보기는 내보낼 수 없습니다. 하나 이상의 열을 추가하세요. + input_label_report: "특성 테이블에 열 추가" + input_caption_report: "기본적으로 작업 패키지 목록에 열로 추가된 모든 특성이 선택되어 있습니다. 긴 텍스트 필드는 특성 테이블에서 사용할 수 없지만 그 아래에 표시될 수 있습니다." + input_caption_table: "기본적으로 작업 패키지 목록에 열로 추가된 모든 특성이 선택되어 있습니다. 긴 텍스트 필드는 테이블 기반 내보내기에서 사용할 수 없습니다." + input_caption_required: "열이 포함되지 않은 보기는 내보낼 수 없습니다. 하나 이상의 열을 추가하세요." pdf: export_type: - label: PDF 내보내기 유형 + label: "PDF 내보내기 유형" options: table: - label: 테이블 - caption: 원하는 열이 포함된 테이블로 작업 패키지 목록을 내보냅니다. + label: "테이블" + caption: "원하는 열이 포함된 테이블로 작업 패키지 목록을 내보냅니다." report: - label: 보고서 - caption: 목록에 있는 모든 작업 패키지의 상세 보고서로 작업 패키지를 내보냅니다. + label: "보고서" + caption: "목록에 있는 모든 작업 패키지의 상세 보고서로 작업 패키지를 내보냅니다." gantt: - label: Gantt 차트 - caption: Gantt 다이어그램 보기로 작업 패키지 목록을 내보냅니다. + label: "Gantt 차트" + caption: "Gantt 다이어그램 보기로 작업 패키지 목록을 내보냅니다." include_images: - label: 이미지 포함 - caption: PDF 내보내기 크기를 줄이려면 이미지를 제외합니다. + label: "이미지 포함" + caption: "PDF 내보내기 크기를 줄이려면 이미지를 제외합니다." gantt_zoom_levels: - label: 확대/축소 수준 - caption: 차트에 표시되는 날짜의 확대/축소 수준을 선택합니다. + label: "확대/축소 수준" + caption: "차트에 표시되는 날짜의 확대/축소 수준을 선택합니다." options: - days: 일 - weeks: 주 - months: 개월 - quarters: 분기 + days: "일" + weeks: "주" + months: "개월" + quarters: "분기" column_width: - label: 테이블 열 너비 + label: "테이블 열 너비" options: - narrow: 좁음 - medium: 보통 - wide: 넓음 - very_wide: 매우 넓음 + narrow: "좁음" + medium: "보통" + wide: "넓음" + very_wide: "매우 넓음" paper_size: - label: 용지 크기 - caption: 차트 크기에 따라 두 페이지 이상 내보낼 수 있습니다. + label: "용지 크기" + caption: "차트 크기에 따라 두 페이지 이상 내보낼 수 있습니다." long_text_fields: - input_caption: 기본적으로 모든 긴 텍스트 필드가 선택되어 있습니다. - input_label: 긴 텍스트 필드 추가 - input_placeholder: 긴 텍스트 필드 검색 - drag_area_label: 긴 텍스트 필드 관리 + input_caption: "기본적으로 모든 긴 텍스트 필드가 선택되어 있습니다." + input_label: "긴 텍스트 필드 추가" + input_placeholder: "긴 텍스트 필드 검색" + drag_area_label: "긴 텍스트 필드 관리" xls: include_relations: - label: 관계 포함 - caption: 이 옵션은 다른 작업 패키지와의 각 관계에 대해 작업 패키지 각각의 복제본을 만듭니다. + label: "관계 포함" + caption: "이 옵션은 다른 작업 패키지와의 각 관계에 대해 작업 패키지 각각의 복제본을 만듭니다." include_descriptions: - label: 설명 포함 - caption: 이 옵션은 원시 형식으로 설명 열을 추가합니다. - your_work_packages_export: 작업 패키지를 내보내는 중입니다. - your_projects_export: 프로젝트를 내보내는 중입니다 - succeeded: 내보내기 완료 - failed: '작업 패키지를 내보내려는 중에 오류가 발생했습니다: %{message}' + label: "설명 포함" + caption: "이 옵션은 원시 형식으로 설명 열을 추가합니다." + your_work_packages_export: "작업 패키지를 내보내는 중입니다." + your_projects_export: "프로젝트를 내보내는 중입니다" + succeeded: "내보내기 완료" + failed: "작업 패키지를 내보내려는 중에 오류가 발생했습니다: %{message}" demo: - heading: 데모 PDF - footer: OpenProject에서 생성함 + heading: "데모 PDF" + footer: "OpenProject에서 생성함" button_text: 데모 PDF 생성 errors: - embedded_table_with_too_many_columns: 이 포함된 작업 패키지 테이블은 페이지에 맞지 않습니다. 열 수를 줄여주세요. + embedded_table_with_too_many_columns: "이 포함된 작업 패키지 테이블은 페이지에 맞지 않습니다. 열 수를 줄여주세요." format: - atom: Atom - csv: CSV - pdf: PDF - pdf_overview_table: PDF 테이블 - pdf_report_with_images: 이미지가 포함된 PDF 보고서 - pdf_report: PDF 보고서 - pdf_gantt: PDF Gantt + atom: "Atom" + csv: "CSV" + pdf: "PDF" + pdf_overview_table: "PDF 테이블" + pdf_report_with_images: "이미지가 포함된 PDF 보고서" + pdf_report: "PDF 보고서" + pdf_gantt: "PDF Gantt" image: - omitted: 이미지를 내보내지 못했습니다. + omitted: "이미지를 내보내지 못했습니다." macro: - error: 매크로 오류, %{message} - attribute_not_found: '특성을 찾을 수 없음: %{attribute}' - model_not_found: '잘못된 특성 모델: %{model}' - resource_not_found: '리소스를 찾을 수 없음: %{resource}' - nested_rich_text_unsupported: 중첩된 서식 있는 텍스트 임베딩은 내보내기에서 현재 지원되지 않습니다 + error: "매크로 오류, %{message}" + attribute_not_found: "특성을 찾을 수 없음: %{attribute}" + model_not_found: "잘못된 특성 모델: %{model}" + resource_not_found: "리소스를 찾을 수 없음: %{resource}" + nested_rich_text_unsupported: "중첩된 서식 있는 텍스트 임베딩은 내보내기에서 현재 지원되지 않습니다" units: hours: 시간 days: 일 pdf_generator: page_nr_footer: "%{page}/%{total}페이지" template_attributes: - label: 특성 및 설명 + label: "특성 및 설명" caption: 기본 템플릿을 사용하는 현재 양식 구성에 있는 모든 특성입니다. template_contract: - label: 계약 + label: "계약" caption: 표준 독일 계약 양식에 맞춰 작성된 작업 패키지 세부 정보입니다. dialog: title: PDF 생성 submit: 다운로드 templates: - label: 템플릿 - none_enabled: 이 작업 패키지 유형에 대해 활성화된 템플릿이 없습니다 + label: "템플릿" + none_enabled: "이 작업 패키지 유형에 대해 활성화된 템플릿이 없습니다" footer_center: label: 바닥글 텍스트 caption: 이 텍스트는 모든 페이지의 바닥글 가운데에 나타납니다. @@ -3204,90 +2979,88 @@ ko: landscape: 가로 extraction: available: - pdftotext: Pdftotext 사용 가능(선택적) - unrtf: Unrtf 사용 가능(선택적) - catdoc: Catdoc 사용 가능(선택적) - xls2csv: Xls2csv 사용 가능(선택적) - catppt: Catppt 사용 가능(선택적) - tesseract: Tesseract 사용 가능(선택적) + pdftotext: "Pdftotext 사용 가능(선택적)" + unrtf: "Unrtf 사용 가능(선택적)" + catdoc: "Catdoc 사용 가능(선택적)" + xls2csv: "Xls2csv 사용 가능(선택적)" + catppt: "Catppt 사용 가능(선택적)" + tesseract: "Tesseract 사용 가능(선택적)" filterable_tree_view: filter_mode: - all: 모두 - label: 필터 모드 - selected: 선택됨 - include_sub_items: 하위 항목 포함 - no_results_text: 결과 없음 + all: "모두" + label: "필터 모드" + selected: "선택됨" + include_sub_items: "하위 항목 포함" + no_results_text: "결과 없음" toggle_switch: - label_on: 켜기 - label_off: 끄기 + label_on: "켜기" + label_off: "끄기" general_csv_decimal_separator: "." - general_csv_encoding: UTF-8 + general_csv_encoding: "UTF-8" general_csv_separator: "," - general_first_day_of_week: '7' - general_pdf_encoding: ISO-8859-1 - general_text_no: 아니요 - general_text_yes: 예 - general_text_No: 아니요 - general_text_Yes: 예 - general_text_true: 참 - general_text_false: 'false' - gui_validation_error: 1개 오류 + general_first_day_of_week: "7" + general_pdf_encoding: "ISO-8859-1" + general_text_no: "아니요" + general_text_yes: "예" + general_text_No: "아니요" + general_text_Yes: "예" + general_text_true: "참" + general_text_false: "false" + gui_validation_error: "1개 오류" gui_validation_error_plural: "%{count}개 오류" homescreen: additional: - projects: 이 경우 최신 표시 프로젝트입니다. - no_visible_projects: 이 경우 표시되는 프로젝트가 없습니다. - users: 이 경우 최신 등록 된 사용자입니다. + projects: "이 경우 최신 표시 프로젝트입니다." + no_visible_projects: "이 경우 표시되는 프로젝트가 없습니다." + users: "이 경우 최신 등록 된 사용자입니다." blocks: - community: OpenProject 커뮤니티 + community: "OpenProject 커뮤니티" upsell: - title: Enterprise Edition으로 업그레이드 + title: "Enterprise Edition으로 업그레이드" new_features: - header: 새로운 기능 및 제품 업데이트에 대해 알아보세요. - learn_about: 새로운 모든 기능에 대해 자세히 알아보기 - missing: 아직 강조 표시된 기능이 없습니다. - '17_2': - new_features_title: '이 릴리스에는 다음과 같은 다양한 새로운 기능과 개선 사항이 포함되어 있습니다. - - ' + header: "새로운 기능 및 제품 업데이트에 대해 알아보세요." + learn_about: "새로운 모든 기능에 대해 자세히 알아보기" + missing: "아직 강조 표시된 기능이 없습니다." + #We need to include the version to invalidate outdated translations in other locales + "17_2": + new_features_title: > + 이 릴리스에는 다음과 같은 다양한 새로운 기능과 개선 사항이 포함되어 있습니다. new_features_list: line_0: 안전한 MCP 서버를 사용하는 AI 워크플로(Professional 플랜 이상) line_1: 새 예산 위젯이 포함되고 접근성이 향상되어 프로젝트 홈 페이지가 개선됨 - line_2: '미팅: 미팅 템플릿(Basic 플랜 이상)' - line_3: 프로젝트 특성 코멘트의 투명성 향상됨. + line_2: "미팅: 미팅 템플릿(Basic 플랜 이상)" + line_3: 프로젝트 특성 코멘트의 투명성 향상됨 line_4: PDF 내보내기 개선 사항 line_5: 외부 링크에 대한 보안 강화됨(Premium 플랜 이상) line_6: 백로그 모듈의 UI/UX 개선 사항 line_7: 통합 사용자 지정 필드 양식 links: - upgrade_enterprise_edition: Enterprise Edition으로 업그레이드 - postgres_migration: 설치를 PostgreSQL로 마이그레이션 - user_guides: 사용자 가이드 - faq: FAQ - impressum: 법적 고지 - glossary: 용어집 - shortcuts: 바로가기  - blog: OpenProject 블로그 - forums: 커뮤니티 포럼 - security_alerts: 보안 알림 - newsletter: 뉴스레터 + upgrade_enterprise_edition: "Enterprise Edition으로 업그레이드" + postgres_migration: "설치를 PostgreSQL로 마이그레이션" + user_guides: "사용자 가이드" + faq: "FAQ" + impressum: "법적 고지" + glossary: "용어집" + shortcuts: "바로가기 " + blog: "OpenProject 블로그" + forums: "커뮤니티 포럼" + security_alerts: "보안 알림" + newsletter: "뉴스레터" image_conversion: - imagemagick: Imagemagick + imagemagick: "Imagemagick" journals: - changes_retracted: 변경 사항이 취소되었습니다. + changes_retracted: "변경 사항이 취소되었습니다." caused_changes: - budget_deleted: 예산이 삭제되었습니다 - dates_changed: 변경된 날짜 - default_attribute_written: 읽기 전용 특성 작성됨 - import: 가져옴 - progress_mode_changed_to_status_based: 진행률 계산 업데이트됨 - status_changed: 상태 '%{status_name}' - system_update: 'OpenProject 시스템 업데이트:' - work_package_duplicate_closed: '중복 작업 패키지가 업데이트되었습니다:' - total_percent_complete_mode_changed_to_work_weighted_average: 이제 완료 % 합계 계산에는 - 작업별로 가중치가 적용됩니다. - total_percent_complete_mode_changed_to_simple_average: 이제 완료 % 합계 계산은 완료 % 값의 - 단순 평균만을 기반으로 합니다. + budget_deleted: "예산이 삭제되었습니다" + dates_changed: "변경된 날짜" + default_attribute_written: "읽기 전용 특성 작성됨" + import: "가져옴" + progress_mode_changed_to_status_based: "진행률 계산 업데이트됨" + status_changed: "상태 '%{status_name}'" + system_update: "OpenProject 시스템 업데이트:" + work_package_duplicate_closed: "중복 작업 패키지가 업데이트되었습니다:" + total_percent_complete_mode_changed_to_work_weighted_average: "이제 완료 % 합계 계산에는 작업별로 가중치가 적용됩니다." + total_percent_complete_mode_changed_to_simple_average: "이제 완료 % 합계 계산은 완료 % 값의 단순 평균만을 기반으로 합니다." cause_descriptions: import: header: "%{author} 님이 변경함" @@ -3306,7 +3079,7 @@ ko: unaccessable_work_package_changed: 관련 작업 패키지에 대한 변경 사항 기준 budget_deleted: 예산이 삭제되었습니다 working_days_changed: - changed: 근무일에 대한 변경 사항 기준(%{changes}) + changed: "근무일에 대한 변경 사항 기준(%{changes})" days: working: "%{day}은(는) 이제 근무일입니다." non_working: "%{day}은(는) 이제 휴무일입니다." @@ -3316,990 +3089,974 @@ ko: progress_mode_changed_to_status_based: 진행률 계산 모드가 상태 기반으로 설정되었습니다 status_excluded_from_totals_set_to_false_message: 이제 계층 합계에 포함됨 status_excluded_from_totals_set_to_true_message: 이제 계층 합계에서 제외됨 - status_percent_complete_changed: 완료 %가 %{old_value}%에서 %{new_value}%로 변경되었습니다 + status_percent_complete_changed: "완료 %가 %{old_value}%에서 %{new_value}%로 변경되었습니다" system_update: - file_links_journal: '지금부터 파일 링크(외부 저장소에 저장된 파일)와 관련된 활동이 활동 탭에 표시됩니다. 다음은 - 이미 존재하는 링크와 관련된 활동을 나타냅니다. - - ' - progress_calculation_adjusted_from_disabled_mode: 진행률 계산은 자동으로 작업 기반 모드로 설정되고 버전 업데이트에 따라 조정됩니다. - progress_calculation_adjusted: 진행률 계산은 자동으로 버전 - 업데이트에 따라 조정됩니다. - scheduling_mode_adjusted: 버전 업데이트에 따라 자동으로 조정되는 스케줄링 모드입니다. - totals_removed_from_childless_work_packages: 버전 - 업데이트를 통해 부모가 아닌 작업 패키지의 작업 및 진행률 합계가 자동으로 제거됩니다. 유지 관리 작업이므로 무시해도 됩니다. - total_percent_complete_mode_changed_to_work_weighted_average: 작업이 없는 자식 작업 패키지는 - 무시됩니다. - total_percent_complete_mode_changed_to_simple_average: 자식 작업 패키지의 작업 값은 무시됩니다. + file_links_journal: > + 지금부터 파일 링크(외부 저장소에 저장된 파일)와 관련된 활동이 활동 탭에 표시됩니다. 다음은 이미 존재하는 링크와 관련된 활동을 나타냅니다. + progress_calculation_adjusted_from_disabled_mode: >- + 진행률 계산은 자동으로 작업 기반 모드로 설정되고 버전 업데이트에 따라 조정됩니다. + progress_calculation_adjusted: >- + 진행률 계산은 자동으로 버전 업데이트에 따라 조정됩니다. + scheduling_mode_adjusted: >- + 버전 업데이트에 따라 자동으로 조정되는 스케줄링 모드입니다. + totals_removed_from_childless_work_packages: >- + 버전 업데이트를 통해 부모가 아닌 작업 패키지의 작업 및 진행률 합계가 자동으로 제거됩니다. 유지 관리 작업이므로 무시해도 됩니다. + total_percent_complete_mode_changed_to_work_weighted_average: >- + 작업이 없는 자식 작업 패키지는 무시됩니다. + total_percent_complete_mode_changed_to_simple_average: >- + 자식 작업 패키지의 작업 값은 무시됩니다. links: - configuration_guide: 구성 가이드 - get_in_touch: 질문이 있으신가요? 문의해 주세요. + configuration_guide: "구성 가이드" + get_in_touch: "질문이 있으신가요? 문의해 주세요." instructions_after_registration: "%{signin}을(를) 클릭하여 계정이 활성화되면 바로 로그인할 수 있습니다." instructions_after_logout: "%{signin}을(를) 클릭하면 다시 로그인할 수 있습니다." - instructions_after_error: "%{signin}을(를) 클릭하여 다시 로그인해 볼 수 있습니다. 오류가 계속되면 관리자에게 도움을 - 요청하세요." + instructions_after_error: "%{signin}을(를) 클릭하여 다시 로그인해 볼 수 있습니다. 오류가 계속되면 관리자에게 도움을 요청하세요." menus: admin: - ai: 인공 지능(AI) - aggregation: 집계 - api_and_webhooks: API 및 webhook - mail_notification: 이메일 알림 - mails_and_notifications: 이메일 및 알림 - mcp_configurations: 모델 컨텍스트 프로토콜(MCP) + ai: "인공 지능(AI)" + aggregation: "집계" + api_and_webhooks: "API 및 webhook" + mail_notification: "이메일 알림" + mails_and_notifications: "이메일 및 알림" + mcp_configurations: "모델 컨텍스트 프로토콜(MCP)" quick_add: - label: 추가… + label: "추가…" my_account: access_tokens: - description: 공급자 토큰은 OpenProject에서 발급하며, 다른 애플리케이션이 액세스하도록 허용합니다. 클라이언트 토큰은 - 다른 애플리케이션에서 발급하며, OpenProject가 액세스하도록 허용합니다. + description: "공급자 토큰은 OpenProject에서 발급하며, 다른 애플리케이션이 액세스하도록 허용합니다. 클라이언트 토큰은 다른 애플리케이션에서 발급하며, OpenProject가 액세스하도록 허용합니다." no_results: - title: 표시할 수 있는 접근 토큰이 없습니다. - description: 모두 비활성화 되었습니다. 관리 메뉴에서 가용 상태로 되돌릴 수 있습니다. - access_tokens: 액세스 토큰 + title: "표시할 수 있는 접근 토큰이 없습니다." + description: "모두 비활성화 되었습니다. 관리 메뉴에서 가용 상태로 되돌릴 수 있습니다." + access_tokens: "액세스 토큰" headers: - action: 액션 - expiration: 만료 - indefinite_expiration: 사용 안 함 - simple_revoke_confirmation: 이 토큰을 취소하시겠습니까? + action: "액션" + expiration: "만료" + indefinite_expiration: "사용 안 함" + simple_revoke_confirmation: "이 토큰을 취소하시겠습니까?" tabs: client: - title: 클라이언트 토큰 + title: "클라이언트 토큰" provider: - title: 공급자 토큰 + title: "공급자 토큰" token/api: - blank_description: 아직 API 토큰이 없습니다. 아래 버튼을 사용하여 생성할 수 있습니다. - blank_title: API 토큰 없음 - title: API - table_title: API 토큰 - text_hint: API 토큰을 사용하면 타사 애플리케이션이 REST API를 통해 이 OpenProject 인스턴스와 통신할 수 - 있습니다. - static_token_name: API 토큰 - disabled_text: 관리자가 API 토큰을 활성화하지 않았습니다. 이 기능을 사용하려면 관리자에게 문의하세요. - add_button: API 토큰 + blank_description: "아직 API 토큰이 없습니다. 아래 버튼을 사용하여 생성할 수 있습니다." + blank_title: "API 토큰 없음" + title: "API" + table_title: "API 토큰" + text_hint: "API 토큰을 사용하면 타사 애플리케이션이 REST API를 통해 이 OpenProject 인스턴스와 통신할 수 있습니다." + static_token_name: "API 토큰" + disabled_text: "관리자가 API 토큰을 활성화하지 않았습니다. 이 기능을 사용하려면 관리자에게 문의하세요." + add_button: "API 토큰" ical: - blank_description: iCalendar 토큰을 추가하려면 프로젝트의 캘린더 모듈 내에서 새 캘린더 또는 기존 캘린더를 구독하세요. - 필요한 권한이 있어야 합니다. - blank_title: iCalendar 토큰 없음 - title: iCalendar - table_title: iCalendar 토큰 - text_hint_link: iCalendar 토큰을 사용하여 사용자가 [OpenProject 캘린더를 구독](docs_url)하고 - 외부 클라이언트의 최신 작업 패키지 정보를 볼 수 있습니다. - disabled_text: 관리자가 iCalendar 구독을 활성화하지 않았습니다. 이 기능을 사용하려면 관리자에게 문의하세요. + blank_description: "iCalendar 토큰을 추가하려면 프로젝트의 캘린더 모듈 내에서 새 캘린더 또는 기존 캘린더를 구독하세요. 필요한 권한이 있어야 합니다." + blank_title: "iCalendar 토큰 없음" + title: "iCalendar" + table_title: "iCalendar 토큰" + text_hint_link: "iCalendar 토큰을 사용하여 사용자가 [OpenProject 캘린더를 구독](docs_url)하고 외부 클라이언트의 최신 작업 패키지 정보를 볼 수 있습니다." + disabled_text: "관리자가 iCalendar 구독을 활성화하지 않았습니다. 이 기능을 사용하려면 관리자에게 문의하세요." oauth_application: - active_tokens: 활성 토큰 - blank_description: 타사 애플리케이션 액세스가 구성 및 활성화되어 있지 않습니다. - blank_title: OAuth 애플리케이션 토큰 없음 - last_refreshed_at: '마지막 새로고침:' - title: OAuth - table_title: OAuth 애플리케이션 토큰 - text_hint: OAuth 애플리케이션 토큰을 통해 타사 애플리케이션이 이 OpenProject 인스턴스와 연결할 수 있습니다. + active_tokens: "활성 토큰" + blank_description: "타사 애플리케이션 액세스가 구성 및 활성화되어 있지 않습니다." + blank_title: "OAuth 애플리케이션 토큰 없음" + last_refreshed_at: "마지막 새로고침:" + title: "OAuth" + table_title: "OAuth 애플리케이션 토큰" + text_hint: "OAuth 애플리케이션 토큰을 통해 타사 애플리케이션이 이 OpenProject 인스턴스와 연결할 수 있습니다." oauth_client: - blank_description: 아직 OAuth 클라이언트 토큰이 없습니다. - blank_title: OAuth 클라이언트 토큰 없음 - failed: 오류가 발생하여 토큰을 제거할 수 없습니다. 나중에 다시 시도하세요. - integration_type: 통합 유형 - table_title: OAuth 클라이언트 토큰 - text_hint: OAuth 클라이언트 토큰을 통해 이 OpenProject 인스턴스가 파일 저장소와 같은 외부 애플리케이션과 연결할 - 수 있습니다. - title: OAuth - remove_token: 이 토큰을 제거하시겠습니까? %{integration}에서 다시 로그인해야 합니다. - removed: OAuth 클라이언트 토큰이 제거되었습니다 - unknown_integration: 알 수 없음 + blank_description: "아직 OAuth 클라이언트 토큰이 없습니다." + blank_title: "OAuth 클라이언트 토큰 없음" + failed: "오류가 발생하여 토큰을 제거할 수 없습니다. 나중에 다시 시도하세요." + integration_type: "통합 유형" + table_title: "OAuth 클라이언트 토큰" + text_hint: "OAuth 클라이언트 토큰을 통해 이 OpenProject 인스턴스가 파일 저장소와 같은 외부 애플리케이션과 연결할 수 있습니다." + title: "OAuth" + remove_token: "이 토큰을 제거하시겠습니까? %{integration}에서 다시 로그인해야 합니다." + removed: "OAuth 클라이언트 토큰이 제거되었습니다" + unknown_integration: "알 수 없음" token/rss: - add_button: RSS 토큰 - blank_description: 아직 RSS 토큰이 없습니다. 아래 버튼을 사용하여 생성할 수 있습니다. - blank_title: RSS 토큰 없음 - title: RSS - table_title: RSS 토큰 - text_hint: RSS 토큰을 사용하면 외부 RSS 리더를 통해 이 OpenProject 인스턴스의 최신 변경 사항을 확인할 수 - 있습니다. - static_token_name: RSS 토큰 - disabled_text: 관리자가 RSS 토큰을 활성화하지 않았습니다. 이 기능을 사용하려면 관리자에게 문의하세요. + add_button: "RSS 토큰" + blank_description: "아직 RSS 토큰이 없습니다. 아래 버튼을 사용하여 생성할 수 있습니다." + blank_title: "RSS 토큰 없음" + title: "RSS" + table_title: "RSS 토큰" + text_hint: "RSS 토큰을 사용하면 외부 RSS 리더를 통해 이 OpenProject 인스턴스의 최신 변경 사항을 확인할 수 있습니다." + static_token_name: "RSS 토큰" + disabled_text: "관리자가 RSS 토큰을 활성화하지 않았습니다. 이 기능을 사용하려면 관리자에게 문의하세요." storages: - unknown_storage: 알 수 없는 저장소 + unknown_storage: "알 수 없는 저장소" notifications: reasons: - assigned: 담당자 - dateAlert: 날짜 알림 - mentioned: 멘션됨 - responsible: 담당 - shared: 공유됨 - watched: 주시자 - reminder: 미리 알림 + assigned: "담당자" + dateAlert: "날짜 알림" + mentioned: "멘션됨" + responsible: "담당" + shared: "공유됨" + watched: "주시자" + reminder: "미리 알림" facets: - unread: 읽지 않음 - unread_title: 읽지 않은 항목 표시 - all: 모두 - all_title: 모두 표시 + unread: "읽지 않음" + unread_title: "읽지 않은 항목 표시" + all: "모두" + all_title: "모두 표시" menu: - by_project: 프로젝트 기준 읽지 않음 - by_reason: 이유 - inbox: 받은 편지함 - send_notifications: 이 작업에 대한 알림 보내기 + by_project: "프로젝트 기준 읽지 않음" + by_reason: "이유" + inbox: "받은 편지함" + send_notifications: "이 작업에 대한 알림 보내기" work_packages: subject: - created: 작업 패키지가 생성되었습니다. + created: "작업 패키지가 생성되었습니다." assigned: "%{work_package} 을(를) 할당되었습니다." subscribed: "%{work_package} 을(를) 구독하였습니다." mentioned: "%{work_package} 을(를) 멘션하였습니다." responsible: "%{work_package}을(를) 담당하게 되었습니다" watched: "%{work_package}을(를) 지켜 보는 중입니다." query: - invalid_filter: 잘못된 알림 필터 - label_accessibility: 접근성 - label_account: 계정 - label_active: 활성 - label_activate_user: 사용자 활성화 - label_active_in_new_projects: 새로운 프로젝트에서 활성 - label_activity: 활동 - label_add_edit_translations: 추가 및 편집 번역 - label_add_another_file: 다른 파일 추가 - label_add_columns: 선택된 열 추가 - label_add_note: 메모 추가 - label_add_projects: 프로젝트 추가 - label_add_related_work_packages: 관련 작업 패키지 추가 - label_add_subtask: 하위 작업 추가 - label_added: 추가됨 + invalid_filter: "잘못된 알림 필터" + label_accessibility: "접근성" + label_account: "계정" + label_active: "활성" + label_activate_user: "사용자 활성화" + label_active_in_new_projects: "새로운 프로젝트에서 활성" + label_activity: "활동" + label_add_edit_translations: "추가 및 편집 번역" + label_add_another_file: "다른 파일 추가" + label_add_columns: "선택된 열 추가" + label_add_note: "메모 추가" + label_add_projects: "프로젝트 추가" + label_add_related_work_packages: "관련 작업 패키지 추가" + label_add_subtask: "하위 작업 추가" + label_added: "추가됨" label_added_by: "%{author} 님이 추가함" - label_added_by_on: '추가함: %{author}, %{date}' + label_added_by_on: "추가함: %{author}, %{date}" label_added_time_by: "%{author}이(가) %{age} 전에 추가함" - label_additional_workflow_transitions_for_assignee: 사용자가 담당자일 때 허용되는 추가 전환 - label_additional_workflow_transitions_for_author: 사용자가 작성자일 때 허용되는 추가 전환 - label_administration: 관리 - label_interface_colors: 인터페이스 색상 - label_interface_colors_description: '이러한 색상은 애플리케이션의 모양을 제어합니다. 색상을 수정하면 테마가 자동으로 - 사용자 지정 테마로 변경되지만, 접근성 대비 최소값(WCAG 2.1)을 준수하는지 확인할 수 없습니다. ' - label_age: 기간 - label_ago: 일 전 - label_all: 모두 - label_all_time: 모든 시간 - label_all_words: 모든 단어 - label_all_open_wps: 모두 열림 - label_always_visible: 항상 표시 - label_announcement: 공지 사항 - label_angular: AngularJS + label_additional_workflow_transitions_for_assignee: "사용자가 담당자일 때 허용되는 추가 전환" + label_additional_workflow_transitions_for_author: "사용자가 작성자일 때 허용되는 추가 전환" + label_administration: "관리" + label_interface_colors: "인터페이스 색상" + label_interface_colors_description: "이러한 색상은 애플리케이션의 모양을 제어합니다. 색상을 수정하면 테마가 자동으로 사용자 지정 테마로 변경되지만, 접근성 대비 최소값(WCAG 2.1)을 준수하는지 확인할 수 없습니다. " + label_age: "기간" + label_ago: "일 전" + label_all: "모두" + label_all_time: "모든 시간" + label_all_words: "모든 단어" + label_all_open_wps: "모두 열림" + label_always_visible: "항상 표시" + label_announcement: "공지 사항" + label_angular: "AngularJS" label_app_modules: "%{app_title} 모듈" - label_api_access_key: API 액세스 키 - label_api_access_key_created_on: API 액세스 키가 %{value} 전에 생성되었습니다. - label_api_access_key_type: API + label_api_access_key: "API 액세스 키" + label_api_access_key_created_on: "API 액세스 키가 %{value} 전에 생성되었습니다." + label_api_access_key_type: "API" label_auto_option: "(자동)" - label_ical_access_key_type: iCalendar - label_ical_access_key_description: '"%{project_name}"의 "%{calendar_name}"에 대한 iCalendar - 토큰 "%{token_name}"' - label_ical_access_key_not_present: iCalendar 토큰이 없습니다. - label_ical_access_key_generation_hint: 캘린더 구독 시 자동으로 생성됩니다. - label_ical_access_key_latest: 최신 - label_ical_access_key_revoke: 취소 - label_add_column: 열 추가 - label_applied_status: 적용된 상태 - label_archive_project: 프로젝트 아카이브하기 - label_ascending: 오름차순 - label_assigned_to_me_work_packages: 내게 할당된 작업 패키지 - label_associated_revisions: 연결된 수정 - label_attachment_plural: 첨부 파일 - label_attribute: 특성 - label_attribute_plural: 특성 - label_ldap_auth_source_new: 새로운 LDAP 연결 - label_ldap_auth_source: LDAP 연결 - label_ldap_auth_source_plural: LDAP 연결 + label_ical_access_key_type: "iCalendar" + label_ical_access_key_description: '"%{project_name}"의 "%{calendar_name}"에 대한 iCalendar 토큰 "%{token_name}"' + label_ical_access_key_not_present: "iCalendar 토큰이 없습니다." + label_ical_access_key_generation_hint: "캘린더 구독 시 자동으로 생성됩니다." + label_ical_access_key_latest: "최신" + label_ical_access_key_revoke: "취소" + label_add_column: "열 추가" + label_applied_status: "적용된 상태" + label_archive_project: "프로젝트 아카이브하기" + label_ascending: "오름차순" + label_assigned_to_me_work_packages: "내게 할당된 작업 패키지" + label_associated_revisions: "연결된 수정" + label_attachment_plural: "첨부 파일" + label_attribute: "특성" + label_attribute_plural: "특성" + label_ldap_auth_source_new: "새로운 LDAP 연결" + label_ldap_auth_source: "LDAP 연결" + label_ldap_auth_source_plural: "LDAP 연결" label_attribute_expand_text: "'%{attribute}'의 전체 텍스트" - label_authentication: 인증 - label_available_custom_fields_projects: 사용 가능한 사용자 지정 필드 프로젝트 - label_available_global_roles: 사용 가능한 글로벌 역할 - label_available_project_attributes: 사용 가능한 프로젝트 특성 - label_available_project_forums: 사용 가능한 포럼 - label_available_project_repositories: 사용 가능한 저장소 - label_available_project_versions: 사용 가능한 버전 - label_available_project_work_package_categories: 사용 가능한 작업 패키지 카테고리 - label_available_project_work_package_types: 사용 가능한 작업 패키지 유형 - label_available_projects: 사용 가능한 프로젝트 - label_api_doc: API 문서 - label_backup: 백업 - label_backup_code: 백업 코드 - label_basic_details: 기본 세부 정보 - label_between: 사이에 - label_blocked_by: 차단한 사용자 - label_blocks: 블록 - label_blog: 블로그 - label_forums_locked: 잠김 - label_forum_new: 새 포럼 - label_forum_plural: 포럼 - label_forum_sticky: 스티커형 - label_boolean: 부울 - label_board_plural: 보드 - label_branch: 브랜치 - label_browse: 찾아보기 - label_builtin: 내장 - label_bulk_edit_selected_work_packages: 선택된 작업 패키지 일괄 편집 + label_authentication: "인증" + label_available_custom_fields_projects: "사용 가능한 사용자 지정 필드 프로젝트" + label_available_global_roles: "사용 가능한 글로벌 역할" + label_available_project_attributes: "사용 가능한 프로젝트 특성" + label_available_project_forums: "사용 가능한 포럼" + label_available_project_repositories: "사용 가능한 저장소" + label_available_project_versions: "사용 가능한 버전" + label_available_project_work_package_categories: "사용 가능한 작업 패키지 카테고리" + label_available_project_work_package_types: "사용 가능한 작업 패키지 유형" + label_available_projects: "사용 가능한 프로젝트" + label_api_doc: "API 문서" + label_backup: "백업" + label_backup_code: "백업 코드" + label_basic_details: "기본 세부 정보" + label_between: "사이에" + label_blocked_by: "차단한 사용자" + label_blocks: "블록" + label_blog: "블로그" + label_forums_locked: "잠김" + label_forum_new: "새 포럼" + label_forum_plural: "포럼" + label_forum_sticky: "스티커형" + label_boolean: "부울" + label_board_plural: "보드" + label_branch: "브랜치" + label_browse: "찾아보기" + label_builtin: "내장" + label_bulk_edit_selected_work_packages: "선택된 작업 패키지 일괄 편집" label_bundled: "(번들)" - label_calendar: 달력 - label_calendars_and_dates: 캘린더와 날짜 - label_calendar_show: 달력 표시 - label_category: 카테고리 + label_calendar: "달력" + label_calendars_and_dates: "캘린더와 날짜" + label_calendar_show: "달력 표시" + label_category: "카테고리" label_completed: 완료 - label_consent_settings: 사용자 동의 + label_consent_settings: "사용자 동의" label_wiki_menu_item: 위키 메뉴 항목 label_select_main_menu_item: 새 기본 메뉴 항목 선택 - label_required_disk_storage: 필요한 디스크 스토리지 + label_required_disk_storage: "필요한 디스크 스토리지" label_send_invitation: 초대장 보내기 - label_calculated_value: 계산된 값 - label_change_parent: 부모 변경 - label_change_plural: 변경 - label_change_properties: 속성 변경 - label_change_status: 상태 변경 + label_calculated_value: "계산된 값" + label_change_parent: "부모 변경" + label_change_plural: "변경" + label_change_properties: "속성 변경" + label_change_status: "상태 변경" label_change_status_of_user: "#{username} 상태 변경" - label_change_view_all: 모든 변경 사항 보기 - label_changes_details: 모든 변경 사항의 세부 정보 - label_changeset: 변경 집합 - label_changeset_id: 변경 집합 ID - label_changeset_plural: 변경 집합 - label_checked: 확인됨 - label_check_uncheck_all_in_column: 칼럼에서 확인/최소 - label_check_uncheck_all_in_row: 모든 행에서 확인/취소 - label_child_element: 자식 요소 - label_choices: 선택 사항 - label_close_versions: 완료된 버전 닫기 - label_closed_work_packages: 닫음 - label_collapse: 축소 - label_collapsed_click_to_show: 축소되었습니다. 표시하려면 클릭하세요. + label_change_view_all: "모든 변경 사항 보기" + label_changes_details: "모든 변경 사항의 세부 정보" + label_changeset: "변경 집합" + label_changeset_id: "변경 집합 ID" + label_changeset_plural: "변경 집합" + label_checked: "확인됨" + label_check_uncheck_all_in_column: "칼럼에서 확인/최소" + label_check_uncheck_all_in_row: "모든 행에서 확인/취소" + label_child_element: "자식 요소" + label_choices: "선택 사항" + label_close_versions: "완료된 버전 닫기" + label_closed_work_packages: "닫음" + label_collapse: "축소" + label_collapsed_click_to_show: "축소되었습니다. 표시하려면 클릭하세요." label_configuration: 구성 - label_comment_add: 코멘트 추가 - label_comment_added: 코멘트 추가됨 - label_comment_delete: 코멘트 삭제 - label_comment_plural: 코멘트 - label_commits_per_author: 작성자별 커밋 - label_commits_per_month: 월별 커밋 - label_confirmation: 확인 - label_contains: 포함 - label_content: 내용 - label_color_plural: 색상 - label_copied: 복사됨 - label_copy_same_as_target: 대상과 같음 - label_copy_source: 소스 - label_copy_target: 대상 - label_copy_workflow_from: 다음에서 워크플로 복사 - label_copy_project: 프로젝트 복사 - label_core_version: 코어 버전 - label_core_build: 코어 빌드 - label_created_by: '작성자: %{user}' - label_current_status: 현재 상태 - label_current_version: 현재 버전 - label_custom_field_add_no_type: 작업 패키지 유형에 이 필드 추가 - label_custom_field_new: 새 사용자 지정 필드 - label_custom_field_plural: 사용자 정의 필드 - label_custom_field_default_type: 빈 유형 - label_custom_style: 디자인 - label_custom_style_description: 테마를 사용하여 OpenProject의 모양을 선택하고, 앱에서 사용할 기본 색상 및 - 내보내기의 모양을 선택하세요. - label_dashboard: 대시보드 - label_database_version: PostgreSQL 버전 - label_date: 날짜 - label_dates: 날짜 - label_date_and_time: 날짜 및 시간 - label_date_format: 날짜 형식 - label_date_from: 시작 + label_comment_add: "코멘트 추가" + label_comment_added: "코멘트 추가됨" + label_comment_delete: "코멘트 삭제" + label_comment_plural: "코멘트" + label_commits_per_author: "작성자별 커밋" + label_commits_per_month: "월별 커밋" + label_confirmation: "확인" + label_contains: "포함" + label_content: "내용" + label_color_plural: "색상" + label_copied: "복사됨" + label_copy_same_as_target: "대상과 같음" + label_copy_source: "소스" + label_copy_target: "대상" + label_copy_workflow_from: "다음에서 워크플로 복사" + label_copy_project: "프로젝트 복사" + label_core_version: "코어 버전" + label_core_build: "코어 빌드" + label_created_by: "작성자: %{user}" + label_current_status: "현재 상태" + label_current_version: "현재 버전" + label_custom_field_add_no_type: "작업 패키지 유형에 이 필드 추가" + label_custom_field_new: "새 사용자 지정 필드" + label_custom_field_plural: "사용자 정의 필드" + label_custom_field_default_type: "빈 유형" + label_custom_style: "디자인" + label_custom_style_description: "테마를 사용하여 OpenProject의 모양을 선택하고, 앱에서 사용할 기본 색상 및 내보내기의 모양을 선택하세요." + label_dashboard: "대시보드" + label_database_version: "PostgreSQL 버전" + label_date: "날짜" + label_dates: "날짜" + label_date_and_time: "날짜 및 시간" + label_date_format: "날짜 형식" + label_date_from: "시작" label_date_from_to: "%{start}부터 %{end}까지" - label_date_to: 끝 - label_day_plural: 일 - label_default: 기본 - label_delete_user: 사용자 삭제 - label_delete_project: 프로젝트 삭제 - label_delete: 삭제 - label_deleted: 삭제됨 + label_date_to: "끝" + label_day_plural: "일" + label_default: "기본" + label_delete_user: "사용자 삭제" + label_delete_project: "프로젝트 삭제" + label_delete: "삭제" + label_deleted: "삭제됨" label_deleted_custom_field: "(삭제된 사용자 지정 필드)" label_deleted_custom_item: "(삭제된 항목)" label_deleted_custom_option: "(삭제된 옵션)" label_empty_element: "(비어 있음)" - label_go_back: 한 메뉴 레벨 뒤로 돌아가기 + label_go_back: "한 메뉴 레벨 뒤로 돌아가기" label_go_forward: "%{module} 하위 메뉴 열기" label_missing_or_hidden_custom_option: "(값이 없거나 액세스 권한이 없음)" - label_descending: 내림차순 - label_details: 세부 정보 - label_defaults: 기본값 - label_development_roadmap: 개발 로드맵 - label_diff: 차이 - label_diff_inline: 인라인 - label_diff_side_by_side: 나란히 - label_digital_accessibility: 디지털 접근성(DE) - label_disabled: 사용 안 함 - label_disabled_uppercase: 사용 안 함 - label_display: 표시 - label_display_per_page: '페이지당: %{value}' - label_display_used_statuses_only: 이 유형에 사용되는 상태만 표시 + label_descending: "내림차순" + label_details: "세부 정보" + label_defaults: "기본값" + label_development_roadmap: "개발 로드맵" + label_diff: "차이" + label_diff_inline: "인라인" + label_diff_side_by_side: "나란히" + label_digital_accessibility: "디지털 접근성(DE)" + label_disabled: "사용 안 함" + label_disabled_uppercase: "사용 안 함" + label_display: "표시" + label_display_per_page: "페이지당: %{value}" + label_display_used_statuses_only: "이 유형에 사용되는 상태만 표시" label_download: "%{count}개 다운로드" label_download_plural: "%{count}개 다운로드" - label_downloads_abbr: D/L - label_duplicated_by: 복제한 사용자 - label_duplicate: 중복 - label_duplicates: 복제 - label_edit: 편집 - label_edit_x: '편집: %{x}' - label_view_x: '보기: %{x}' - label_enable_multi_select: 다중 선택 토글 - label_enabled_project_custom_fields: 사용자 정의 필드 사용 - label_enabled_project_modules: 사용 가능한 모듈 - label_enabled_project_activities: 활동 추적 시간 사용 - label_end_to_end: 끝 - 끝 - label_end_to_start: 끝 - 시작 - label_enumeration_new: 새 열거형 값 - label_enumeration_value: 열거형 값 - label_enumerations: 열거형 - label_enterprise: 엔터프라이즈 - label_enterprise_active_users: 예약 활성 사용자 %{current}/%{limit}명 - label_enterprise_edition: Enterprise Edition - label_enterprise_support: 엔터프라이즈 지원 - label_environment: 환경 - label_estimates_and_progress: 견적 및 진행률 - label_equals: 일치함 - label_equals_with_descendants: 하위 항목이 있는 항목 - label_everywhere: 어디에 있든지 - label_example: 예 - label_experimental: 실험 - label_i_am_member: 멤버입니다 - label_ifc_viewer: Ifc 뷰어 - label_ifc_model_plural: Ifc 모델 - label_import: 가져오기 - label_export_to: '다음에서도 사용 가능:' - label_expand: 확장 - label_expanded_click_to_collapse: 확장되었습니다. 축소하려면 클릭하세요. + label_downloads_abbr: "D/L" + label_duplicated_by: "복제한 사용자" + label_duplicate: "중복" + label_duplicates: "복제" + label_edit: "편집" + label_edit_x: "편집: %{x}" + label_view_x: "보기: %{x}" + label_enable_multi_select: "다중 선택 토글" + label_enabled_project_custom_fields: "사용자 정의 필드 사용" + label_enabled_project_modules: "사용 가능한 모듈" + label_enabled_project_activities: "활동 추적 시간 사용" + label_end_to_end: "끝 - 끝" + label_end_to_start: "끝 - 시작" + label_enumeration_new: "새 열거형 값" + label_enumeration_value: "열거형 값" + label_enumerations: "열거형" + label_enterprise: "엔터프라이즈" + label_enterprise_active_users: "예약 활성 사용자 %{current}/%{limit}명" + label_enterprise_edition: "Enterprise Edition" + label_enterprise_support: "엔터프라이즈 지원" + label_environment: "환경" + label_estimates_and_progress: "견적 및 진행률" + label_equals: "일치함" + label_equals_with_descendants: "하위 항목이 있는 항목" + label_everywhere: "어디에 있든지" + label_example: "예" + label_experimental: "실험" + label_i_am_member: "멤버입니다" + label_ifc_viewer: "Ifc 뷰어" + label_ifc_model_plural: "Ifc 모델" + label_import: "가져오기" + label_export_to: "다음에서도 사용 가능:" + label_expand: "확장" + label_expanded_click_to_collapse: "확장되었습니다. 축소하려면 클릭하세요." label_f_hour: "%{value}시간" label_f_hour_plural: "%{value}시간" - label_favorite: 즐겨찾기 - label_feed_plural: 피드 - label_feeds_access_key: RSS 액세스 키 - label_feeds_access_key_created_on: RSS 액세스 키가 %{value} 전에 생성되었습니다. - label_feeds_access_key_type: RSS - label_file_plural: 파일 - label_filter: 필터 - label_filter_add: 필터 추가 - label_filter_by: 필터링 기준 - label_filter_any_name_attribute: 이름 특성 - label_filter_plural: 필터 - label_filters_toggle: 필터 표시/숨기기 - label_float: 부동 - label_folder: 폴더 - label_follows: 팔로우 - label_force_user_language_to_default: 허용되지 않는 언어가 있는 사용자의 언어를 기본값으로 설정 - label_form_configuration: 양식 구성 - label_formula: 공식 - label_gantt_chart: Gantt 차트 - label_gantt_chart_plural: Gantt 차트 - label_general: 일반 - label_generate_key: 키 생성 - label_global_modules: 글로벌 모듈 - label_global_roles: 글로벌 역할 + label_favorite: "즐겨찾기" + label_feed_plural: "피드" + label_feeds_access_key: "RSS 액세스 키" + label_feeds_access_key_created_on: "RSS 액세스 키가 %{value} 전에 생성되었습니다." + label_feeds_access_key_type: "RSS" + label_file_plural: "파일" + label_filter: "필터" + label_filter_add: "필터 추가" + label_filter_by: "필터링 기준" + label_filter_any_name_attribute: "이름 특성" + label_filter_plural: "필터" + label_filters_toggle: "필터 표시/숨기기" + label_float: "부동" + label_folder: "폴더" + label_follows: "팔로우" + label_force_user_language_to_default: "허용되지 않는 언어가 있는 사용자의 언어를 기본값으로 설정" + label_form_configuration: "양식 구성" + label_formula: "공식" + label_gantt_chart: "Gantt 차트" + label_gantt_chart_plural: "Gantt 차트" + label_general: "일반" + label_generate_key: "키 생성" + label_global_modules: "글로벌 모듈" + label_global_roles: "글로벌 역할" label_git_path: ".git 디렉터리의 경로" label_greater_or_equal: ">=" - label_group_by: 그룹화 기준 - label_group_new: 새 그룹 - label_group: 그룹 - label_group_named: 그룹 %{name} - label_group_plural: 그룹 - label_help: 도움말 + label_group_by: "그룹화 기준" + label_group_new: "새 그룹" + label_group: "그룹" + label_group_named: "그룹 %{name}" + label_group_plural: "그룹" + label_help: "도움말" label_here: 여기 - label_hide: 숨기기 - label_history: 기록 - label_hierarchy: 계층 - label_hierarchy_leaf: 계층 구조 리프 - label_home: 홈 - label_subject_or_id: 제목 또는 ID - label_calendar_subscriptions: 캘린더 구독 - label_identifier: 식별자 + label_hide: "숨기기" + label_history: "기록" + label_hierarchy: "계층" + label_hierarchy_leaf: "계층 구조 리프" + label_home: "홈" + label_subject_or_id: "제목 또는 ID" + label_calendar_subscriptions: "캘린더 구독" + label_identifier: "식별자" label_in: "-" - label_in_less_than: 보다 작음 - label_in_more_than: 보다 큼 - label_inactive: 비활성화 - label_incoming_emails: 들어오는 이메일 - label_includes: 포함 + label_in_less_than: "보다 작음" + label_in_more_than: "보다 큼" + label_inactive: "비활성화" + label_incoming_emails: "들어오는 이메일" + label_includes: "포함" label_incomplete: 미완료 label_include_sub_projects: 하위 프로젝트 포함 - label_index_by_date: 날짜별 색인 - label_index_by_title: 제목별 색인 - label_information: 정보 - label_information_plural: 정보 - label_installation_guides: 설치 가이드 - label_integer: 정수 - label_interface: 인터페이스 - label_internal: 내부 - label_introduction_video: 시작하기 동영상 - label_invite_user: 사용자 초대 - label_item: 항목 - label_item_plural: 항목 - label_weighted_item_list: 가중치가 적용된 항목 목록 - label_share: 공유 - label_share_project_list: 프로젝트 목록 공유 - label_share_work_package: 작업 패키지 공유 - label_show_all_registered_users: 등록된 사용자 모두 표시 - label_show_less: 간단히 표시 - label_show_more: 자세히 표시 - label_journal: 기록일지 - label_journal_diff: 설명 비교 - label_language: 언어 - label_languages: 언어 - label_external_links: 외부 링크 - label_locale: 언어 및 지역 - label_jump_to_a_project: 프로젝트로 이동... - label_jira_import: Jira 가져오기 - label_keyword_plural: 키워드 - label_language_based: 사용자 언어에 따름 - label_last_activity: 마지막 활동 - label_last_change_on: 마지막 변경 - label_last_changes: 마지막 %{count}개 변경 사항 - label_last_login: 최종 로그인 - label_last_month: 지난달 - label_last_n_days: 지난 %{count}개월 - label_last_week: 지난주 - label_latest_revision: 최근 수정 - label_latest_revision_plural: 최근 수정 - label_ldap_authentication: LDAP 인증 - label_learn_more: 자세히 알아보기 + label_index_by_date: "날짜별 색인" + label_index_by_title: "제목별 색인" + label_information: "정보" + label_information_plural: "정보" + label_installation_guides: "설치 가이드" + label_integer: "정수" + label_interface: "인터페이스" + label_internal: "내부" + label_introduction_video: "시작하기 동영상" + label_invite_user: "사용자 초대" + label_item: "항목" + label_item_plural: "항목" + label_weighted_item_list: "가중치가 적용된 항목 목록" + label_share: "공유" + label_share_project_list: "프로젝트 목록 공유" + label_share_work_package: "작업 패키지 공유" + label_show_all_registered_users: "등록된 사용자 모두 표시" + label_show_less: "간단히 표시" + label_show_more: "자세히 표시" + label_journal: "기록일지" + label_journal_diff: "설명 비교" + label_language: "언어" + label_languages: "언어" + label_external_links: "외부 링크" + label_locale: "언어 및 지역" + label_jump_to_a_project: "프로젝트로 이동..." + label_jira_import: "Jira 가져오기" + label_keyword_plural: "키워드" + label_language_based: "사용자 언어에 따름" + label_last_activity: "마지막 활동" + label_last_change_on: "마지막 변경" + label_last_changes: "마지막 %{count}개 변경 사항" + label_last_login: "최종 로그인" + label_last_month: "지난달" + label_last_n_days: "지난 %{count}개월" + label_last_week: "지난주" + label_latest_revision: "최근 수정" + label_latest_revision_plural: "최근 수정" + label_ldap_authentication: "LDAP 인증" + label_learn_more: "자세히 알아보기" label_less_or_equal: "<=" - label_less_than_ago: 일 미만 전 - label_link_url: 링크(URL) - label_list: 목록 - label_loading: 로드 중... - label_locked: 잠김 - label_lock_user: 사용자 잠금 - label_logged_as: '로그인한 계정:' - label_login: 로그인 + label_less_than_ago: "일 미만 전" + label_link_url: "링크(URL)" + label_list: "목록" + label_loading: "로드 중..." + label_locked: "잠김" + label_lock_user: "사용자 잠금" + label_logged_as: "로그인한 계정:" + label_login: "로그인" label_custom_comment: "%{name} 코멘트" - label_custom_logo: 사용자 지정 로고 데스크톱 - label_custom_logo_mobile: 사용자 지정 로고 모바일 - label_custom_export_logo: 사용자 지정 내보내기 로고 - label_custom_export_cover: 사용자 지정 내보내기 커버 배경 - label_custom_export_footer: 사용자 지정 내보내기 바닥글 이미지 - label_custom_export_font_regular: 일반 - label_custom_export_font_bold: 굵게 - label_custom_export_font_italic: 기울임꼴 - label_custom_export_font_bold_italic: 굵은 기울임꼴 - label_custom_export_cover_overlay: 사용자 지정 내보내기 커버 배경 오버레이 - label_custom_export_cover_text_color: 텍스트 색상 - label_custom_pdf_export_settings: 사용자 지정 PDF 내보내기 설정 - label_custom_favicon: 사용자 지정 favicon - label_custom_touch_icon: 사용자 지정 터치 아이콘 - label_logout: 로그아웃 - label_mapping_for: '매핑 대상: %{attribute}' - label_main_menu: 측면 메뉴 - label_manage: 관리 - label_manage_groups: 그룹 관리 - label_managed_repositories_vendor: 관리 되는 %{vendor} 저장소 - label_mathematical_operators: 수학 연산자 - label_max_size: 최대 크기 - label_me: 나 - label_member_new: 새 멤버 + label_custom_logo: "사용자 지정 로고 데스크톱" + label_custom_logo_mobile: "사용자 지정 로고 모바일" + label_custom_export_logo: "사용자 지정 내보내기 로고" + label_custom_export_cover: "사용자 지정 내보내기 커버 배경" + label_custom_export_footer: "사용자 지정 내보내기 바닥글 이미지" + label_custom_export_font_regular: "일반" + label_custom_export_font_bold: "굵게" + label_custom_export_font_italic: "기울임꼴" + label_custom_export_font_bold_italic: "굵은 기울임꼴" + label_custom_export_cover_overlay: "사용자 지정 내보내기 커버 배경 오버레이" + label_custom_export_cover_text_color: "텍스트 색상" + label_custom_pdf_export_settings: "사용자 지정 PDF 내보내기 설정" + label_custom_favicon: "사용자 지정 favicon" + label_custom_touch_icon: "사용자 지정 터치 아이콘" + label_logout: "로그아웃" + label_mapping_for: "매핑 대상: %{attribute}" + label_main_menu: "측면 메뉴" + label_manage: "관리" + label_manage_groups: "그룹 관리" + label_managed_repositories_vendor: "관리 되는 %{vendor} 저장소" + label_mathematical_operators: "수학 연산자" + label_max_size: "최대 크기" + label_me: "나" + label_member_new: "새 멤버" label_member_all_admin: "(관리 상태에 따른 모든 역할)" - label_member_plural: 멤버 - label_membership_plural: 멤버십 - label_membership_added: 멤버 추가됨 - label_membership_updated: 멤버 업데이트됨 - label_menu: 메뉴 + label_member_plural: "멤버" + label_membership_plural: "멤버십" + label_membership_added: "멤버 추가됨" + label_membership_updated: "멤버 업데이트됨" + label_menu: "메뉴" label_menu_badge: - pre_alpha: 프리 알파 - alpha: 알파 - beta: 베타 - label_menu_item_name: 메뉴 항목의 이름 - label_message: 메시지 - label_message_last: 마지막 메시지 - label_message_new: 새 메시지 - label_message_plural: 메시지 - label_message_posted: 메시지 추가됨 - label_min_max_length: 최소 - 최대 길이 - label_minute_plural: minutes - label_missing_api_access_key: 사라진 API 접근 키 - label_missing_feeds_access_key: 사라진 RSS 접근 키 + pre_alpha: "프리 알파" + alpha: "알파" + beta: "베타" + label_menu_item_name: "메뉴 항목의 이름" + label_message: "메시지" + label_message_last: "마지막 메시지" + label_message_new: "새 메시지" + label_message_plural: "메시지" + label_message_posted: "메시지 추가됨" + label_min_max_length: "최소 - 최대 길이" + label_minute_plural: "minutes" + label_missing_api_access_key: "사라진 API 접근 키" + label_missing_feeds_access_key: "사라진 RSS 접근 키" label_modification: "%{count}개 변경" - label_modified: 수정됨 - label_module_plural: 모듈 - label_modules: 모듈 - label_months_from: 개월 동안 | 다음부터 - label_more: 기타 - label_more_information: 더보기 - label_more_than_ago: 일 이상 전 - label_move_column_left: 왼쪽으로 열 이동 - label_move_column_right: 오른쪽으로 열 이동 - label_move_work_package: 작업 패키지 이동 - label_my_account: 계정 설정 - label_my_activity: 내 활동 - label_my_account_data: 내 계정 데이터 - label_my_avatar: 내 아바타 - label_my_queries: 내 사용자 지정 쿼리 - label_name: 이름 - label_never: 사용 안 함 - label_new: 새로 만들기 - label_new_features: 새로운 기능 - label_new_statuses_allowed: 새 상태 허용됨 - label_news_singular: 뉴스 - label_news_added: 뉴스 추가됨 - label_news_comment_added: 뉴스에 추가된 코멘트 - label_news_latest: 최신 뉴스 - label_news_new: 뉴스 추가 - label_news_edit: 뉴스 편집 - label_news_plural: 뉴스 - label_news_view_all: 모든 뉴스 보기 - label_next: 다음 - label_next_week: 다음 주 + label_modified: "수정됨" + label_module_plural: "모듈" + label_modules: "모듈" + label_months_from: "개월 동안 | 다음부터" + label_more: "기타" + label_more_information: "더보기" + label_more_than_ago: "일 이상 전" + label_move_column_left: "왼쪽으로 열 이동" + label_move_column_right: "오른쪽으로 열 이동" + label_move_work_package: "작업 패키지 이동" + label_my_account: "계정 설정" + label_my_activity: "내 활동" + label_my_account_data: "내 계정 데이터" + label_my_avatar: "내 아바타" + label_my_queries: "내 사용자 지정 쿼리" + label_name: "이름" + label_never: "사용 안 함" + label_new: "새로 만들기" + label_new_features: "새로운 기능" + label_new_statuses_allowed: "새 상태 허용됨" + label_news_singular: "뉴스" + label_news_added: "뉴스 추가됨" + label_news_comment_added: "뉴스에 추가된 코멘트" + label_news_latest: "최신 뉴스" + label_news_new: "뉴스 추가" + label_news_edit: "뉴스 편집" + label_news_plural: "뉴스" + label_news_view_all: "모든 뉴스 보기" + label_next: "다음" + label_next_week: "다음 주" label_no_change_option: "(변경 없음)" - label_no_data: 표시할 데이터가 없습니다. - label_no_due_date: 완료 날짜 없음 - label_no_start_date: 시작 날짜 없음 - label_no_parent_page: 부모 페이지 없음 - label_notification_center_plural: 알림 - label_nothing_display: 표시할 것이 없음 - label_nobody: 아무도 없음 - label_not_configured: 구성되지 않음 - label_not_found: 찾을 수 없음 - label_none: 없음 + label_no_data: "표시할 데이터가 없습니다." + label_no_due_date: "완료 날짜 없음" + label_no_start_date: "시작 날짜 없음" + label_no_parent_page: "부모 페이지 없음" + label_notification_center_plural: "알림" + label_nothing_display: "표시할 것이 없음" + label_nobody: "아무도 없음" + label_not_configured: "구성되지 않음" + label_not_found: "찾을 수 없음" + label_none: "없음" label_none_parentheses: "(없음)" - label_not_contains: 포함하지 않음 - label_not_equals: 일치하지 않음 - label_life_cycle_step_plural: 프로젝트 수명 주기 - label_on: 에 - label_operator_all: 비어 있지 않음 - label_operator_none: 비어 있음 + label_not_contains: "포함하지 않음" + label_not_equals: "일치하지 않음" + label_life_cycle_step_plural: "프로젝트 수명 주기" + label_on: "에" + label_operator_all: "비어 있지 않음" + label_operator_none: "비어 있음" label_operator_equals_or: "(OR)" label_operator_equals_all: "(AND)" - label_operator_shared_with_user_any: 모두 - label_open: 열기 - label_closed: 마감됨 - label_open_menu: 메뉴 열기 - label_open_work_packages: 열기 - label_open_work_packages_plural: 열기 - label_openproject_website: OpenProject 웹사이트 - label_optional_description: 설명 - label_options: 옵션 - label_other: 기타 - label_overall_activity: 전체 작업 - label_overview: 요약 - label_page_title: 페이지 제목 - label_part_of: 부분의 - label_password_lost: 암호를 잊으셨습니까? - label_password_rule_lowercase: 소문자 - label_password_rule_numeric: 숫자 문자 - label_password_rule_special: 특수 문자 - label_password_rule_uppercase: 대문자 - label_path_encoding: 경로 인코딩 - label_per_page: '페이지당:' - label_people: 사용자 - label_permissions: 권한 - label_permissions_report: 권한 보고서 - label_personalize_page: 이 페이지 개인 설정 - label_placeholder_user: 플레이스홀더 사용자 - label_placeholder_user_new: 새로운 플레이스홀더 사용자 - label_placeholder_user_plural: 플레이스홀더 사용자 - label_planning: 계획 - label_please_login: 로그인하세요. - label_plugins: 플러그인 - label_portfolio_plural: 포트폴리오 - label_modules_and_plugins: 모듈 및 플러그인 - label_precedes: 선행 - label_preferences: 기본 설정 - label_preview: 미리 보기 - label_preview_not_available: 미리 보기를 사용할 수 없음 - label_previous: 이전 - label_previous_week: 이전 주 + label_operator_shared_with_user_any: "모두" + label_open: "열기" + label_closed: "마감됨" + label_open_menu: "메뉴 열기" + label_open_work_packages: "열기" + label_open_work_packages_plural: "열기" + label_openproject_website: "OpenProject 웹사이트" + label_optional_description: "설명" + label_options: "옵션" + label_other: "기타" + label_overall_activity: "전체 작업" + label_overview: "요약" + label_page_title: "페이지 제목" + label_part_of: "부분의" + label_password_lost: "암호를 잊으셨습니까?" + label_password_rule_lowercase: "소문자" + label_password_rule_numeric: "숫자 문자" + label_password_rule_special: "특수 문자" + label_password_rule_uppercase: "대문자" + label_path_encoding: "경로 인코딩" + label_per_page: "페이지당:" + label_people: "사용자" + label_permissions: "권한" + label_permissions_report: "권한 보고서" + label_personalize_page: "이 페이지 개인 설정" + label_placeholder_user: "플레이스홀더 사용자" + label_placeholder_user_new: "새로운 플레이스홀더 사용자" + label_placeholder_user_plural: "플레이스홀더 사용자" + label_planning: "계획" + label_please_login: "로그인하세요." + label_plugins: "플러그인" + label_portfolio_plural: "포트폴리오" + label_modules_and_plugins: "모듈 및 플러그인" + label_precedes: "선행" + label_preferences: "기본 설정" + label_preview: "미리 보기" + label_preview_not_available: "미리 보기를 사용할 수 없음" + label_previous: "이전" + label_previous_week: "이전 주" label_principal_invite_via_email: " 또는 이메일을 통해 새 사용자 초대하기" - label_principal_search: 기존 사용자 또는 그룹 추가 - label_privacy_policy: 데이터 프라이버시 및 보안 정책 - label_product_version: 제품 버전 - label_profile: 프로필 - label_percent_complete: 완료 % - label_progress_tracking: 진행률 추적 - label_project: 프로젝트 - label_project_activity: 프로젝트 활동 - label_project_attribute_plural: 프로젝트 특성 - label_project_attribute_manage_link: 프로젝트 특성 관리 - label_project_count: 전체 프로젝트 수 - label_project_copy_notifications: 프로젝트 복사 중에 이메일 알림 보내기 + label_principal_search: "기존 사용자 또는 그룹 추가" + label_privacy_policy: "데이터 프라이버시 및 보안 정책" + label_product_version: "제품 버전" + label_profile: "프로필" + label_percent_complete: "완료 %" + label_progress_tracking: "진행률 추적" + label_project: "프로젝트" + label_project_activity: "프로젝트 활동" + label_project_attribute_plural: "프로젝트 특성" + label_project_attribute_manage_link: "프로젝트 특성 관리" + label_project_count: "전체 프로젝트 수" + label_project_copy_notifications: "프로젝트 복사 중에 이메일 알림 보내기" label_project_initiation_export_pdf: "%{project_creation_name}용 PDF 내보내기" - label_project_latest: 최근 프로젝트 - label_project_default_type: 빈 유형 허용 - label_project_hierarchy: 프로젝트 계층 구조 - label_project_mappings: 프로젝트 - label_project_new: 새 프로젝트 - label_project_plural: 프로젝트 - label_project_list_plural: 프로젝트 목록 - label_project_life_cycle: 프로젝트 수명 주기 - label_project_attributes_plural: 프로젝트 특성 - label_project_custom_field_plural: 프로젝트 특성 - label_project_settings: 프로젝트 설정 - label_project_attributes_settings: 프로젝트 특성 설정 - label_project_storage_plural: 파일 저장소 - label_project_storage_project_folder: '파일 저장소: 프로젝트 폴더' - label_projects_disk_usage_information: "%{used_disk_space} 디스크 공간을 사용하고 있는 %{count}개 - 프로젝트" - label_project_view_all: 모든 프로젝트 보기 - label_project_show_details: 프로젝트 세부 정보 표시 - label_project_hide_details: 프로젝트 세부 정보 숨기기 - label_portfolio: 포트폴리오 - label_portfolio_new: 새 포트폴리오 - label_program: 프로그램 - label_program_new: 새 프로그램 - label_public_projects: 공용 프로젝트 - label_query_new: 새 쿼리 - label_query_plural: 사용자 지정 쿼리 - label_read: 읽기... - label_read_documentation: 설명서 읽기 - label_register: 새 계정 만들기 - label_register_with_developer: 개발자로 등록 - label_registered_on: 등록된 날짜 - label_related_work_packages: 관련 작업 패키지 - label_relates: 관련 항목 - label_relates_to: 관련 항목 - label_relation: 관계 - label_relation_actions: 관계 작업 - label_relation_delete: 관계 삭제 - label_relation_edit: 관계 편집 - label_relation_new: 새 관계 - label_release_notes: 릴리스 노트 - label_remaining_work: 남은 작업 - label_remove_column: 열 제거 - label_remove_columns: 선택된 열 제거 - label_renamed: 이름 변경됨 - label_reply_plural: 회신 - label_report: 보고서 - label_report_bug: 버그 제보 - label_report_plural: 보고서 - label_reported_work_packages: 보고된 관련 패키지 - label_reporting: 보고 - label_reporting_plural: 보고 - label_repository: 리포지토리 - label_repository_remove: 리포지토리 제거 - label_repository_root: 최상위 저장소 - label_repository_plural: 리포지토리 - label_request_submission: 요청 제출 - label_required: 필수 - label_requires: 필수 - label_result_plural: 결과 - label_revision: 수정 - label_revision_id: 수정 %{value} - label_revision_plural: 수정 - label_roadmap: 로드맵 - label_roadmap_edit: 로드맵 %{name} 편집 - label_roadmap_due_in: '기한: %{value}' - label_roadmap_no_work_packages: 이 버전에 대한 작업 패키지 없음 + label_project_latest: "최근 프로젝트" + label_project_default_type: "빈 유형 허용" + label_project_hierarchy: "프로젝트 계층 구조" + label_project_mappings: "프로젝트" + label_project_new: "새 프로젝트" + label_project_plural: "프로젝트" + label_project_list_plural: "프로젝트 목록" + label_project_life_cycle: "프로젝트 수명 주기" + label_project_attributes_plural: "프로젝트 특성" + label_project_custom_field_plural: "프로젝트 특성" + label_project_settings: "프로젝트 설정" + label_project_attributes_settings: "프로젝트 특성 설정" + label_project_storage_plural: "파일 저장소" + label_project_storage_project_folder: "파일 저장소: 프로젝트 폴더" + label_projects_disk_usage_information: "%{used_disk_space} 디스크 공간을 사용하고 있는 %{count}개 프로젝트" + label_project_view_all: "모든 프로젝트 보기" + label_project_show_details: "프로젝트 세부 정보 표시" + label_project_hide_details: "프로젝트 세부 정보 숨기기" + label_portfolio: "포트폴리오" + label_portfolio_new: "새 포트폴리오" + label_program: "프로그램" + label_program_new: "새 프로그램" + label_public_projects: "공용 프로젝트" + label_query_new: "새 쿼리" + label_query_plural: "사용자 지정 쿼리" + label_read: "읽기..." + label_read_documentation: "설명서 읽기" + label_register: "새 계정 만들기" + label_register_with_developer: "개발자로 등록" + label_registered_on: "등록된 날짜" + label_related_work_packages: "관련 작업 패키지" + label_relates: "관련 항목" + label_relates_to: "관련 항목" + label_relation: "관계" + label_relation_actions: "관계 작업" + label_relation_delete: "관계 삭제" + label_relation_edit: "관계 편집" + label_relation_new: "새 관계" + label_release_notes: "릴리스 노트" + label_remaining_work: "남은 작업" + label_remove_column: "열 제거" + label_remove_columns: "선택된 열 제거" + label_renamed: "이름 변경됨" + label_reply_plural: "회신" + label_report: "보고서" + label_report_bug: "버그 제보" + label_report_plural: "보고서" + label_reported_work_packages: "보고된 관련 패키지" + label_reporting: "보고" + label_reporting_plural: "보고" + label_repository: "리포지토리" + label_repository_remove: "리포지토리 제거" + label_repository_root: "최상위 저장소" + label_repository_plural: "리포지토리" + label_request_submission: "요청 제출" + label_required: "필수" + label_requires: "필수" + label_result_plural: "결과" + label_revision: "수정" + label_revision_id: "수정 %{value}" + label_revision_plural: "수정" + label_roadmap: "로드맵" + label_roadmap_edit: "로드맵 %{name} 편집" + label_roadmap_due_in: "기한: %{value}" + label_roadmap_no_work_packages: "이 버전에 대한 작업 패키지 없음" label_roadmap_overdue: "%{value} 지연" - label_role_and_permissions: 역할 및 권한 - label_role_new: 새 역할 - label_role_grantable: 부여 가능한 역할 - label_role_plural: 역할 - label_role_search: 새 멤버에게 역할 할당 - label_scm: SCM - label_scroll_left: 왼쪽으로 스크롤 - label_scroll_right: 오른쪽으로 스크롤 - label_search: 검색 - label_search_by_name: 이름별 검색 - label_send_information: 사용자에게 새 자격 증명 보내기 - label_send_test_email: 테스트 이메일 보내기 - label_session: 세션 - label_setting_plural: 설정 - label_system_settings: 시스템 설정 - label_show_completed_versions: 완료된 버전 표시 - label_columns: 열 - label_sort: 분류 - label_sort_ascending: 오름차순 정렬 + label_role_and_permissions: "역할 및 권한" + label_role_new: "새 역할" + label_role_grantable: "부여 가능한 역할" + label_role_plural: "역할" + label_role_search: "새 멤버에게 역할 할당" + label_scm: "SCM" + label_scroll_left: "왼쪽으로 스크롤" + label_scroll_right: "오른쪽으로 스크롤" + label_search: "검색" + label_search_by_name: "이름별 검색" + label_send_information: "사용자에게 새 자격 증명 보내기" + label_send_test_email: "테스트 이메일 보내기" + label_session: "세션" + label_setting_plural: "설정" + label_system_settings: "시스템 설정" + label_show_completed_versions: "완료된 버전 표시" + label_columns: "열" + label_sort: "분류" + label_sort_ascending: "오름차순 정렬" label_sort_by: "%{value}(으)로 정렬" label_sorted_by: "%{value}(으)로 정렬됨" - label_sort_descending: 내림차순 정렬 - label_sort_higher: 위로 이동 - label_sort_highest: 맨 위로 이동 - label_sort_lower: 아래로 이동 - label_sort_lowest: 맨 아래로 이동 - label_spent_time: 소비한 시간 - label_start_to_end: 시작 - 끝 - label_start_to_start: 시작 - 시작 - label_statistics: 통계 - label_status: 상태 - label_storage_free_space: 남은 디스크 공간 - label_storage_used_space: 사용 중 디스크 공간 - label_storage_group: 저장 파일 시스템 %{identifier} - label_storage_for: 을(를) 위한 전체 저장 공간 - label_string: 텍스트 - label_subproject: 하위 프로젝트 - label_subproject_new: 새 하위 프로젝트 - label_subproject_plural: 하위 프로젝트 - label_subitems: 하위 항목 - label_subtask_plural: 하위 작업 - label_summary: 요약 - label_system: 시스템 - label_system_storage: 저장 공간 정보 - label_table_of_contents: 목차 - label_tag: 태그 - label_team_planner: 팀 플래너 - label_template: 템플릿 - label_templates: 템플릿 - label_text: 긴 텍스트 - label_this_month: 이번 달 - label_this_week: 이번 주 - label_this_year: 올해 - label_time: 시간 - label_time_entry_plural: 소비한 시간 - label_time_entry_activity_plural: 소요 시간 활동 - label_title: 제목 - label_projects_menu: 프로젝트 - label_today: 오늘 - label_token_version: 토큰 버전 - label_today_as_start_date: 오늘을 시작 날짜로 선택하세요. - label_today_as_due_date: 오늘을 완료 날짜로 선택하세요. - label_today_as_date: 오늘을 날짜로 선택하세요. - label_top_menu: 상단 메뉴 - label_topic_plural: 항목 - label_total: 합계 - label_type_new: 새 유형 - label_type_plural: 유형 - label_ui: 사용자 인터페이스 + label_sort_descending: "내림차순 정렬" + label_sort_higher: "위로 이동" + label_sort_highest: "맨 위로 이동" + label_sort_lower: "아래로 이동" + label_sort_lowest: "맨 아래로 이동" + label_spent_time: "소비한 시간" + label_start_to_end: "시작 - 끝" + label_start_to_start: "시작 - 시작" + label_statistics: "통계" + label_status: "상태" + label_storage_free_space: "남은 디스크 공간" + label_storage_used_space: "사용 중 디스크 공간" + label_storage_group: "저장 파일 시스템 %{identifier}" + label_storage_for: "을(를) 위한 전체 저장 공간" + label_string: "텍스트" + label_subproject: "하위 프로젝트" + label_subproject_new: "새 하위 프로젝트" + label_subproject_plural: "하위 프로젝트" + label_subitems: "하위 항목" + label_subtask_plural: "하위 작업" + label_summary: "요약" + label_system: "시스템" + label_system_storage: "저장 공간 정보" + label_table_of_contents: "목차" + label_tag: "태그" + label_team_planner: "팀 플래너" + label_template: "템플릿" + label_templates: "템플릿" + label_text: "긴 텍스트" + label_this_month: "이번 달" + label_this_week: "이번 주" + label_this_year: "올해" + label_time: "시간" + label_time_entry_plural: "소비한 시간" + label_time_entry_activity_plural: "소요 시간 활동" + label_title: "제목" + label_projects_menu: "프로젝트" + label_today: "오늘" + label_token_version: "토큰 버전" + label_today_as_start_date: "오늘을 시작 날짜로 선택하세요." + label_today_as_due_date: "오늘을 완료 날짜로 선택하세요." + label_today_as_date: "오늘을 날짜로 선택하세요." + label_top_menu: "상단 메뉴" + label_topic_plural: "항목" + label_total: "합계" + label_type_new: "새 유형" + label_type_plural: "유형" + label_ui: "사용자 인터페이스" label_updated_time: "%{value} 전에 업데이트됨" label_updated_time_at: "%{author} %{age}" label_updated_time_by: "%{author}이(가) %{age} 전에 업데이트함" - label_upgrade_guides: 업그레이드 가이드 - label_used_by: 사용한 사용자 - label_used_by_types: 유형별로 사용됨 - label_used_in_projects: 프로젝트에서 사용됨 - label_user: 사용자 - label_user_and_permission: 사용자 및 권한 - label_user_named: 사용자 %{name} + label_upgrade_guides: "업그레이드 가이드" + label_used_by: "사용한 사용자" + label_used_by_types: "유형별로 사용됨" + label_used_in_projects: "프로젝트에서 사용됨" + label_user: "사용자" + label_user_and_permission: "사용자 및 권한" + label_user_named: "사용자 %{name}" label_user_activity: "%{value}의 작업" - label_user_anonymous: 익명 - label_user_mail_option_all: 모든 내 프로젝트의 이벤트에 대해 - label_user_mail_option_none: 이벤트 없음 - label_user_mail_option_only_assigned: 나에게 할당된 사항만 - label_user_mail_option_only_my_events: 내가 주시하거나 관련된 사항만 - label_user_mail_option_only_owner: 내가 소유자인 사항만 - label_user_mail_option_selected: 선택된 프로젝트에서 발생하는 이벤트만 - label_user_menu: 사용자 메뉴 - label_user_new: 새 사용자 - label_user_plural: 사용자 - label_user_search: 사용자 검색 - label_user_settings: 사용자 설정 - label_users_settings: 사용자 설정 - label_value_x: '값: %{x}' - label_version_new: 새 버전 - label_version_edit: 버전 편집 - label_version_plural: 버전 - label_version_sharing_descendants: 하위 프로젝트 포함 - label_version_sharing_hierarchy: 프로젝트 계층 구조 포함 - label_version_sharing_none: 공유 안 됨 - label_version_sharing_system: 모든 프로젝트 포함 - label_version_sharing_tree: 프로젝트 트리 포함 - label_videos: 동영상 - label_view_all_revisions: 모든 수정 보기 - label_view_diff: 차이점 보기 - label_view_revisions: 수정 보기 - label_watched_work_packages: 주시하는 작업 패키지 - label_what_is_this: 이게 뭐예요? - label_week: 주 - label_widget: 위젯 - label_widget_new: 새 위젯 - label_wiki_content_added: 위키 페이지 추가됨 - label_wiki_content_updated: 위키 페이지 업데이트됨 - label_wiki_toc: 목차 - label_wiki_toc_empty: 머리글이 없으므로 목차가 비어 있습니다. - label_wiki_dont_show_menu_item: 프로젝트 탐색에 이 위키 페이지 표시 안 함 - label_wiki_edit: 위키 편집 - label_wiki_edit_plural: 위키 편집 - label_wiki_page_attachments: Wiki 페이지 첨부 파일 - label_wiki_page_id: 위키 페이지 ID - label_wiki_navigation: 위키 탐색 - label_wiki_page: 위키 페이지 - label_wiki_page_plural: 위키 페이지 - label_wiki_show_index_page_link: 하위 메뉴 항목 '목차' 표시 - label_wiki_show_menu_item: 프로젝트 탐색에서 메뉴 항목으로 표시 - label_wiki_show_new_page_link: 하위 메뉴 항목 '새 자식 페이지 만들기' 표시 - label_wiki_show_submenu_item: '다음의 하위 메뉴 항목으로 표시: ' - label_wiki_start: 시작 페이지 - label_work: 작업 - label_work_package: 작업 패키지 - label_work_package_attachments: 작업 패키지 첨부 파일 - label_work_package_category_new: 새 카테고리 - label_work_package_category_plural: 작업 패키지 카테고리 - label_work_package_comments: 작업 패키지 코멘트 - label_work_package_hierarchy: 작업 패키지 계층 구조 - label_work_package_new: 새 작업 패키지 - label_work_package_edit: 작업 패키지 %{name} 편집 - label_work_package_plural: 작업 패키지 - label_work_package_status: 작업 패키지 상태 - label_work_package_status_new: 새 상태 - label_work_package_status_plural: 작업 패키지 상태 - label_work_package_types: 작업 패키지 유형 - label_work_package_tracking: 작업 패키지 추적 - label_work_package_view_all: 모든 작업 패키지 보기 - label_workflow: 워크플로 - label_workflow_copy: 워크플로 복사 - label_workflow_plural: 워크플로 - label_workflow_summary: 요약 - label_working_days_and_hours: 근무일 및 시간 + label_user_anonymous: "익명" + label_user_mail_option_all: "모든 내 프로젝트의 이벤트에 대해" + label_user_mail_option_none: "이벤트 없음" + label_user_mail_option_only_assigned: "나에게 할당된 사항만" + label_user_mail_option_only_my_events: "내가 주시하거나 관련된 사항만" + label_user_mail_option_only_owner: "내가 소유자인 사항만" + label_user_mail_option_selected: "선택된 프로젝트에서 발생하는 이벤트만" + label_user_menu: "사용자 메뉴" + label_user_new: "새 사용자" + label_user_plural: "사용자" + label_user_search: "사용자 검색" + label_user_settings: "사용자 설정" + label_users_settings: "사용자 설정" + label_value_x: "값: %{x}" + label_version_new: "새 버전" + label_version_edit: "버전 편집" + label_version_plural: "버전" + label_version_sharing_descendants: "하위 프로젝트 포함" + label_version_sharing_hierarchy: "프로젝트 계층 구조 포함" + label_version_sharing_none: "공유 안 됨" + label_version_sharing_system: "모든 프로젝트 포함" + label_version_sharing_tree: "프로젝트 트리 포함" + label_videos: "동영상" + label_view_all_revisions: "모든 수정 보기" + label_view_diff: "차이점 보기" + label_view_revisions: "수정 보기" + label_watched_work_packages: "주시하는 작업 패키지" + label_what_is_this: "이게 뭐예요?" + label_week: "주" + label_widget: "위젯" + label_widget_new: "새 위젯" + label_wiki_content_added: "위키 페이지 추가됨" + label_wiki_content_updated: "위키 페이지 업데이트됨" + label_wiki_toc: "목차" + label_wiki_toc_empty: "머리글이 없으므로 목차가 비어 있습니다." + label_wiki_dont_show_menu_item: "프로젝트 탐색에 이 위키 페이지 표시 안 함" + label_wiki_edit: "위키 편집" + label_wiki_edit_plural: "위키 편집" + label_wiki_page_attachments: "Wiki 페이지 첨부 파일" + label_wiki_page_id: "위키 페이지 ID" + label_wiki_navigation: "위키 탐색" + label_wiki_page: "위키 페이지" + label_wiki_page_plural: "위키 페이지" + label_wiki_show_index_page_link: "하위 메뉴 항목 '목차' 표시" + label_wiki_show_menu_item: "프로젝트 탐색에서 메뉴 항목으로 표시" + label_wiki_show_new_page_link: "하위 메뉴 항목 '새 자식 페이지 만들기' 표시" + label_wiki_show_submenu_item: "다음의 하위 메뉴 항목으로 표시: " + label_wiki_start: "시작 페이지" + label_work: "작업" + label_work_package: "작업 패키지" + label_work_package_attachments: "작업 패키지 첨부 파일" + label_work_package_category_new: "새 카테고리" + label_work_package_category_plural: "작업 패키지 카테고리" + label_work_package_comments: "작업 패키지 코멘트" + label_work_package_hierarchy: "작업 패키지 계층 구조" + label_work_package_new: "새 작업 패키지" + label_work_package_edit: "작업 패키지 %{name} 편집" + label_work_package_plural: "작업 패키지" + label_work_package_status: "작업 패키지 상태" + label_work_package_status_new: "새 상태" + label_work_package_status_plural: "작업 패키지 상태" + label_work_package_types: "작업 패키지 유형" + label_work_package_tracking: "작업 패키지 추적" + label_work_package_view_all: "모든 작업 패키지 보기" + label_workflow: "워크플로" + label_workflow_copy: "워크플로 복사" + label_workflow_plural: "워크플로" + label_workflow_summary: "요약" + label_working_days_and_hours: "근무일 및 시간" label_x_closed_work_packages_abbr: - one: 1개 닫힘 + one: "1개 닫힘" other: "%{count}개 닫힘" - zero: 0개 닫힘 + zero: "0개 닫힘" label_x_comments: - one: 1개 코멘트 + one: "1개 코멘트" other: "%{count}개 코멘트" - zero: 코멘트 없음 + zero: "코멘트 없음" label_x_open_work_packages_abbr: - one: 1개 열림 + one: "1개 열림" other: "%{count}개 열림" - zero: 0개 열림 + zero: "0개 열림" label_x_work_packages: - one: 작업 패키지 1개 - other: 작업 패키지 %{count}개 - zero: 작업 패키지 없음 + one: "작업 패키지 1개" + other: "작업 패키지 %{count}개" + zero: "작업 패키지 없음" label_x_projects: - one: 1개 프로젝트 + one: "1개 프로젝트" other: "%{count}개 프로젝트" - zero: 프로젝트 없음 + zero: "프로젝트 없음" label_x_files: - one: 파일 1개 - other: 파일 %{count}개 - zero: 파일 없음 - label_yesterday: 어제 - label_zen_mode: 젠 모드 - label_role_type: 유형 - label_member_role: 프로젝트 역할 - label_global_role: 글로벌 역할 + one: "파일 1개" + other: "파일 %{count}개" + zero: "파일 없음" + label_yesterday: "어제" + label_zen_mode: "젠 모드" + label_role_type: "유형" + label_member_role: "프로젝트 역할" + label_global_role: "글로벌 역할" label_not_changeable: "(변경할 수 없음)" - label_global: 글로벌 + label_global: "글로벌" label_seeded_from_env_warning: 이 레코드는 설정 환경 변수를 통해 생성되었습니다. UI에서 편집할 수 없습니다. - macro_execution_error: 매크로 %{macro_name} 실행 중에 오류 발생 - macro_unavailable: 매크로 %{macro_name}은(는) 표시할 수 없습니다. + macro_execution_error: "매크로 %{macro_name} 실행 중에 오류 발생" + macro_unavailable: "매크로 %{macro_name}은(는) 표시할 수 없습니다." macros: placeholder: "[Placeholder] 매크로 %{macro_name}" errors: - missing_or_invalid_parameter: 누락되거나 잘못된 매크로 매개 변수입니다. + missing_or_invalid_parameter: "누락되거나 잘못된 매크로 매개 변수입니다." legacy_warning: - timeline: 이 레거시 타임라인 매크로가 제거되었으며 더 이상 사용할 수 없습니다. 포함된 테이블 매크로로 이 기능을 바꿀 수 있습니다. + timeline: "이 레거시 타임라인 매크로가 제거되었으며 더 이상 사용할 수 없습니다. 포함된 테이블 매크로로 이 기능을 바꿀 수 있습니다." include_wiki_page: - removed: 매크로가 더 이상 존재하지 않습니다. + removed: "매크로가 더 이상 존재하지 않습니다." wiki_child_pages: errors: - page_not_found: 위키 페이지 '%{name}'을(를) 찾을 수 없습니다. + page_not_found: "위키 페이지 '%{name}'을(를) 찾을 수 없습니다." create_work_package_link: errors: - no_project_context: 외부 프로젝트 컨텍스트에서 create_work_package_link 매크로를 호출하는 중입니다. - invalid_type: 프로젝트 '%{project}'에서 이름이 '%{type}'인 유형을 찾지 못했습니다. - link_name: 새 작업 패키지 - link_name_type: 새로운 %{type_name} + no_project_context: "외부 프로젝트 컨텍스트에서 create_work_package_link 매크로를 호출하는 중입니다." + invalid_type: "프로젝트 '%{project}'에서 이름이 '%{type}'인 유형을 찾지 못했습니다." + link_name: "새 작업 패키지" + link_name_type: "새로운 %{type_name}" mail: - actions: 작업 + actions: "작업" digests: - including_mention_singular: 멘션 포함 + including_mention_singular: "멘션 포함" including_mention_plural: "%{number_mentioned}개 멘션 포함" - unread_notification_singular: 읽지 않은 알림 1개 - unread_notification_plural: 읽지 않은 알림 %{number_unread}개 - you_have: 회원님은 - logo_alt_text: 로고 + unread_notification_singular: "읽지 않은 알림 1개" + unread_notification_plural: "읽지 않은 알림 %{number_unread}개" + you_have: "회원님은" + logo_alt_text: "로고" mention: subject: "%{user_name} 님이 #%{id} - %{subject}에서 회원님을 멘션했습니다" notification: - center: 알림 센터로 - see_in_center: 알림 센터의 코멘트 보기 - settings: 이메일 설정 변경 - salutation: 안녕하세요, %{user} 님 - salutation_full_name: 전체 이름 + center: "알림 센터로" + see_in_center: "알림 센터의 코멘트 보기" + settings: "이메일 설정 변경" + salutation: "안녕하세요, %{user} 님" + salutation_full_name: "전체 이름" work_packages: created_at: "%{timestamp}, %{user} 님이 생성함 " - login_to_see_all: 로그인하여 모든 알림을 확인하세요. - mentioned: 회원님이 코멘트에서 멘션되었습니다 + login_to_see_all: "로그인하여 모든 알림을 확인하세요." + mentioned: "회원님이 코멘트에서 멘션되었습니다" mentioned_by: "%{user} 님이 코멘트에서 회원님을 멘션했습니다." more_to_see: - other: 알림이 있는 작업 패키지가 %{count}개 더 있습니다. - open_in_browser: 브라우저에서 열기 + other: "알림이 있는 작업 패키지가 %{count}개 더 있습니다." + open_in_browser: "브라우저에서 열기" reason: - watched: 지켜봄 - assigned: 할당됨 - responsible: 담당 - mentioned: 멘션됨 - shared: 공유됨 - subscribed: 모두 - prefix: '수신 이유는 다음 알림 설정입니다: %{reason}' - date_alert_start_date: 날짜 경보 - date_alert_due_date: 날짜 경보 - reminder: 미리 알림 - see_all: 모두 보기 + watched: "지켜봄" + assigned: "할당됨" + responsible: "담당" + mentioned: "멘션됨" + shared: "공유됨" + subscribed: "모두" + prefix: "수신 이유는 다음 알림 설정입니다: %{reason}" + date_alert_start_date: "날짜 경보" + date_alert_due_date: "날짜 경보" + reminder: "미리 알림" + see_all: "모두 보기" updated_at: "%{timestamp}, %{user} 님이 업데이트함" reminder_notifications: - subject: '미리 알림: %{note}' - heading: 새로운 미리 알림이 있습니다 - note: '참고: "%{note}"' + subject: "미리 알림: %{note}" + heading: "새로운 미리 알림이 있습니다" + note: "참고: \"%{note}\"" sharing: work_packages: - allowed_actions: 이 작업 패키지를 %{allowed_actions}할 수 있습니다. 이는 프로젝트 역할 및 권한에 따라 - 변경될 수 있습니다. - create_account: 이 작업 패키지에 액세스하려면 %{instance}에서 계정을 생성하고 활성화해야 합니다. - open_work_package: 작업 패키지 열기 - subject: '작업 패키지 #%{id}이(가) 귀하와 공유되었습니다' - enterprise_text: 프로젝트 멤버가 아닌 사용자와 작업 패키지를 공유합니다. + allowed_actions: "이 작업 패키지를 %{allowed_actions}할 수 있습니다. 이는 프로젝트 역할 및 권한에 따라 변경될 수 있습니다." + create_account: "이 작업 패키지에 액세스하려면 %{instance}에서 계정을 생성하고 활성화해야 합니다." + open_work_package: "작업 패키지 열기" + subject: "작업 패키지 #%{id}이(가) 귀하와 공유되었습니다" + enterprise_text: "프로젝트 멤버가 아닌 사용자와 작업 패키지를 공유합니다." summary: user: "%{user} 님이 %{role_rights} 권한으로 작업 패키지를 귀하와 공유했습니다." group: "%{user} 님이 귀하가 속한 %{group} 그룹과 작업 패키지를 공유했습니다" storages: health: plaintext: - storage: 저장소 + storage: "저장소" healthy: - summary: 반가운 소식입니다! 저장소 %{storage_name}의 상태가 현재 "정상"으로 표시되고 있습니다. - error-solved-on: '해결:' - recommendation: 당사는 시스템이 양호한 상태를 유지하도록 지속적으로 시스템을 모니터링할 것입니다. 문제가 발견되면 - 알려드리겠습니다. - details: 자세한 내용을 확인하거나 필요한 사항을 수정하려면 저장소 구성을 방문하세요 + summary: '반가운 소식입니다! 저장소 %{storage_name}의 상태가 현재 "정상"으로 표시되고 있습니다.' + error-solved-on: "해결:" + recommendation: "당사는 시스템이 양호한 상태를 유지하도록 지속적으로 시스템을 모니터링할 것입니다. 문제가 발견되면 알려드리겠습니다." + details: "자세한 내용을 확인하거나 필요한 사항을 수정하려면 저장소 구성을 방문하세요" unhealthy: - summary: 현재, 저장소 %{storage_name}의 상태가 "오류"로 표시되고 있습니다. 주의가 필요할 수 있는 이슈가 - 감지되었습니다. - error-details: 오류 세부 정보 - error-message: 오류 메시지 - error-occurred-on: '발생:' - recommendation: 이 문제를 해결하려면 저장소 구성 페이지로 이동하는 것이 좋습니다 - unsubscribe: 이러한 알림을 더 이상 받고 싶지 않다면 언제든지 구독 취소할 수 있습니다. 구독 취소하려면 이 페이지의 - 지침을 따르세요. - email_notification_settings: 저장소 이메일 알림 설정 - see_storage_settings: 저장소 설정 보기 + summary: '현재, 저장소 %{storage_name}의 상태가 "오류"로 표시되고 있습니다. 주의가 필요할 수 있는 이슈가 감지되었습니다.' + error-details: "오류 세부 정보" + error-message: "오류 메시지" + error-occurred-on: "발생:" + recommendation: "이 문제를 해결하려면 저장소 구성 페이지로 이동하는 것이 좋습니다" + unsubscribe: "이러한 알림을 더 이상 받고 싶지 않다면 언제든지 구독 취소할 수 있습니다. 구독 취소하려면 이 페이지의 지침을 따르세요." + email_notification_settings: "저장소 이메일 알림 설정" + see_storage_settings: "저장소 설정 보기" healthy: subject: '"%{name}" 저장소가 이제 정상입니다!' - solved_at: '해결:' + solved_at: "해결:" summary: "%{storage_name} 저장소 통합 문제가 이제 해결되었습니다" unhealthy: subject: '"%{name}" 저장소에 문제가 있습니다!' - since: 이후 + since: "이후" summary: "%{storage_name} 저장소 통합에 문제가 있습니다" troubleshooting: - text: 자세한 내용은 파일 저장소를 확인하세요 - link_text: 문제 해결 문서 - mail_body_account_activation_request: 새 사용자(%{value})가 등록되었습니다. 이 계정은 관리자 승인을 기다리는 - 중입니다. - mail_body_account_information: 계정 정보 + text: "자세한 내용은 파일 저장소를 확인하세요" + link_text: "문제 해결 문서" + mail_body_account_activation_request: "새 사용자(%{value})가 등록되었습니다. 이 계정은 관리자 승인을 기다리는 중입니다." + mail_body_account_information: "계정 정보" mail_body_account_information_external: "%{value} 계정을 사용하여 로그인할 수 있습니다." - mail_body_backup_ready: '요청한 백업이 준비되었습니다. 여기서 내려받으십시오:' + mail_body_backup_ready: "요청한 백업이 준비되었습니다. 여기서 내려받으십시오:" mail_body_backup_token_reset_admin_info: 사용자 '%{user}'님에 대한 백업 토큰이 초기화되었습니다. mail_body_backup_token_reset_user_info: 백업 토큰이 초기화되었습니다. mail_body_backup_token_info: 이전 토큰은 더 이상 유효하지 않습니다. - mail_body_backup_waiting_period: "%{hours}시간 후 새 토큰이 활성화됩니다." + mail_body_backup_waiting_period: '%{hours}시간 후 새 토큰이 활성화됩니다.' mail_body_backup_token_warning: 만약 본인이 한 것이 아니라면, OpenProject에 즉시 로그인하고 다시 초기화하십시오. mail_body_incoming_email_error: OpenProject로 보낸 이메일을 처리할 수 없습니다. mail_body_incoming_email_error_in_reply_to: "%{received_at}, %{from_email} 작성함" - mail_body_incoming_email_error_logs: 로그 - mail_body_lost_password: 암호를 변경하려면 다음 링크를 클릭하세요. + mail_body_incoming_email_error_logs: "로그" + mail_body_lost_password: "암호를 변경하려면 다음 링크를 클릭하세요." mail_password_change_not_possible: - title: 암호를 변경할 수 없음 + title: "암호를 변경할 수 없음" body: "%{app_title}의 계정이 외부 인증 공급자(%{name})에 연결되었습니다." - subtext: 외부 계정의 암호는 애플리케이션에서 변경할 수 없습니다. 인증 공급자의 암호 분실 기능을 사용하십시오. + subtext: "외부 계정의 암호는 애플리케이션에서 변경할 수 없습니다. 인증 공급자의 암호 분실 기능을 사용하십시오." mail_body_register: "%{app_title}입니다. 다음 링크를 클릭하여 계정을 활성화하세요:" - mail_body_register_header_title: 프로젝트 멤버 초대 이메일 + mail_body_register_header_title: "프로젝트 멤버 초대 이메일" mail_body_register_user: "%{name}님께, " mail_body_register_links_html: | 웨비나(%{webinar_link})가 제공되는 Youtube 채널(%{youtube_link})을 찾아보고 “시작하기” 동영상(%{get_started_link})을 보고 OpenProject에서의 첫 단계를 최대한 수월하게 진행하세요.
추가 질문이 있으시면 설명서(%{documentation_link})를 참조하거나 관리자에게 문의하세요. - mail_body_register_closing: OpenProject 팀 - mail_body_register_ending: 계속 지켜봐 주세요! 감사합니다. - mail_body_reminder: 사용자에게 할당된 %{count} 작업 패키지가 다음 %{days}일 후 만료됩니다. + mail_body_register_closing: "OpenProject 팀" + mail_body_register_ending: "계속 지켜봐 주세요! 감사합니다." + mail_body_reminder: "사용자에게 할당된 %{count} 작업 패키지가 다음 %{days}일 후 만료됩니다." mail_body_group_reminder: '"%{group}" 그룹에 할당된 %{count}개 작업 패키지가 향후 %{days}일 후 만료됩니다.' mail_body_wiki_page_added: "%{author}이(가) '%{id}' 위키 페이지를 추가했습니다." mail_body_wiki_page_updated: "%{author}이(가) '%{id}' 위키 페이지를 업데이트했습니다." mail_subject_account_activation_request: "%{value} 계정 활성화 요청" - mail_subject_backup_ready: 백업이 준비되었습니다 - mail_subject_backup_token_reset: 백업 토큰 초기화 - mail_subject_incoming_email_error: OpenProject로 보낸 이메일을 처리할 수 없습니다. + mail_subject_backup_ready: "백업이 준비되었습니다" + mail_subject_backup_token_reset: "백업 토큰 초기화" + mail_subject_incoming_email_error: "OpenProject로 보낸 이메일을 처리할 수 없습니다." mail_subject_lost_password: "%{value} 암호" mail_subject_register: "%{value} 계정 활성화" mail_subject_wiki_content_added: "'%{id}' 위키 페이지가 추가되었습니다." @@ -4310,126 +4067,110 @@ ko: added_by: without_message: "%{user}님이 '%{project}' 프로젝트에 당신을 멤버로 추가했습니다." with_message: "%{user}님이 '%{project}' 프로젝트에 당신을 멤버로 추가했습니다. 메시지:" - roles: '현재 보유한 역할:' + roles: "현재 보유한 역할:" mail_member_updated_project: subject: "%{project} - 역할이 갱신되었습니다" body: updated_by: without_message: "%{user}님이 '%{project}' 프로젝트 내 당신의 역할을 수정했습니다." with_message: "%{user}님이 '%{project}' 프로젝트 내 당신의 역할을 수정했습니다. 메시지:" - roles: '현재 보유한 역할이 갱신되었습니다:' + roles: "현재 보유한 역할이 갱신되었습니다:" mail_member_updated_global: - subject: 전역 권한이 갱신되었습니다 + subject: "전역 권한이 갱신되었습니다" body: updated_by: without_message: "%{user}님이 당신의 전역 권한을 변경했습니다." with_message: "%{user}님이 당신의 전역 권한을 변경했습니다. 메시지:" - roles: '현재 보유한 역할이 갱신되었습니다:' + roles: "현재 보유한 역할이 갱신되었습니다:" mail_user_activation_limit_reached: subject: 사용자 활성화 제한에 도달함 message: | 회원님이 관리하는 OpenProject 환경(%{host})에서 새로운 사용자(%{email})가 계정을 만들려고 시도했습니다. 사용자 제한에 도달한 후에는 해당 사용자가 계정을 활성화할 수 없습니다. steps: - label: '사용자가 로그인하게 허용하려면 다음 중 하나를 수행할 수 있습니다. ' - a: 결제 플랜([here](upgrade_url)) 업그레이드 - b: 기존 사용자([here](users_url)) 잠금 또는 삭제 - more_actions: 추가 기능 - noscript_description: OpenProject를 사용하려면 JavaScript를 활성화해야 합니다! - noscript_heading: JavaScript 사용 안 함 - noscript_learn_more: 자세히 알아보기 + label: "사용자가 로그인하게 허용하려면 다음 중 하나를 수행할 수 있습니다. " + a: "결제 플랜([here](upgrade_url)) 업그레이드" #here turned into a link + b: "기존 사용자([here](users_url)) 잠금 또는 삭제" #here turned into a link + more_actions: "추가 기능" + noscript_description: "OpenProject를 사용하려면 JavaScript를 활성화해야 합니다!" + noscript_heading: "JavaScript 사용 안 함" + noscript_learn_more: "자세히 알아보기" notice_accessibility_mode: 접근성 모드는 해당 [계정 설정](url)에서 활성화할 수 있습니다. - notice_account_activated: 계정이 활성화되었습니다. 이제 로그인할 수 있습니다. + notice_account_activated: "계정이 활성화되었습니다. 이제 로그인할 수 있습니다." notice_account_already_activated: 계정이 이미 활성화 되었습니다. notice_account_invalid_token: 잘못 된 활성화 토큰 - notice_account_invalid_credentials: 잘못된 사용자 또는 암호 - notice_account_invalid_credentials_or_blocked: 여러 번 실패한 로그인 시도로 인해 잘못된 사용자나 암호 또는 - 계정이 차단되었습니다. 이러한 경우 짧은 시간 동안 자동으로 차단됩니다. - notice_account_lost_email_sent: 새로운 암호를 선택하기 위한 지침이 포함된 이메일이 전송되었습니다. - notice_account_new_password_forced: 새 암호를 입력해야 합니다. + notice_account_invalid_credentials: "잘못된 사용자 또는 암호" + notice_account_invalid_credentials_or_blocked: "여러 번 실패한 로그인 시도로 인해 잘못된 사용자나 암호 또는 계정이 차단되었습니다. 이러한 경우 짧은 시간 동안 자동으로 차단됩니다." + notice_account_lost_email_sent: "새로운 암호를 선택하기 위한 지침이 포함된 이메일이 전송되었습니다." + notice_account_new_password_forced: "새 암호를 입력해야 합니다." notice_account_password_expired: "%{days}일 후 암호가 만료됩니다. 새 암호를 설정하세요." - notice_account_password_updated: 암호가 업데이트되었습니다. - notice_account_pending: 계정이 만들어졌으며 관리자 승인 대기 중입니다. - notice_account_register_done: 계정이 만들어졌습니다. 계정을 활성화하려면 이메일로 전송된 링크를 클릭하세요. - notice_account_unknown_email: 알 수 없는 사용자입니다. - notice_account_update_failed: 계정 설정을 저장할 수 없습니다. 계정 페이지를 살펴 보십시오. - notice_account_updated: 계정이 업데이트되었습니다. - notice_account_other_session_expired: 계정에 연결된 다른 모든 세션이 무효화되었습니다. - notice_account_wrong_password: 잘못된 암호 - notice_account_registered_and_logged_in: 환영합니다. 계정이 활성화되었습니다 이제 로그인되었습니다. + notice_account_password_updated: "암호가 업데이트되었습니다." + notice_account_pending: "계정이 만들어졌으며 관리자 승인 대기 중입니다." + notice_account_register_done: "계정이 만들어졌습니다. 계정을 활성화하려면 이메일로 전송된 링크를 클릭하세요." + notice_account_unknown_email: "알 수 없는 사용자입니다." + notice_account_update_failed: "계정 설정을 저장할 수 없습니다. 계정 페이지를 살펴 보십시오." + notice_account_updated: "계정이 업데이트되었습니다." + notice_account_other_session_expired: "계정에 연결된 다른 모든 세션이 무효화되었습니다." + notice_account_wrong_password: "잘못된 암호" + notice_account_registered_and_logged_in: "환영합니다. 계정이 활성화되었습니다 이제 로그인되었습니다." notice_activation_failed: 계정이 활성화 되지 못했습니다. - notice_auth_stage_verification_error: 단계 '%{stage}'을(를) 확인할 수 없습니다. - notice_auth_stage_wrong_stage: 인증 단계 '%{expected}'을(를) 마쳐야 하지만, '%{actual}'이(가) - 반환되었습니다. - notice_auth_stage_error: 인증 단계 '%{stage}'이(가) 실패했습니다. - notice_can_t_change_password: 이 계정은 외부 인증 소스를 사용합니다. 암호를 변경할 수 없습니다. - notice_custom_options_deleted: 옵션 '%{option_value}'와 그것의 %{num_deleted} 항목은 삭제 되었습니다. - notice_email_error: 메일을 전송하는 중에 오류가 발생했습니다(%{value}). + notice_auth_stage_verification_error: "단계 '%{stage}'을(를) 확인할 수 없습니다." + notice_auth_stage_wrong_stage: "인증 단계 '%{expected}'을(를) 마쳐야 하지만, '%{actual}'이(가) 반환되었습니다." + notice_auth_stage_error: "인증 단계 '%{stage}'이(가) 실패했습니다." + notice_can_t_change_password: "이 계정은 외부 인증 소스를 사용합니다. 암호를 변경할 수 없습니다." + notice_custom_options_deleted: "옵션 '%{option_value}'와 그것의 %{num_deleted} 항목은 삭제 되었습니다." + notice_email_error: "메일을 전송하는 중에 오류가 발생했습니다(%{value})." notice_email_sent: "%{value}님에게 이메일이 전송되었습니다." - notice_failed_to_save_work_packages: 선택된 %{total}개에서 %{count}개 작업 패키지를 저장하지 못했습니다. - %{ids}. - notice_failed_to_save_members: 멤버를 저장하지 못했습니다. %{errors}. - notice_deletion_scheduled: 삭제가 예약되었으며 비동기적으로 수행됩니다. - notice_file_not_found: 액세스하려는 페이지가 존재하지 않거나 제거되었습니다. - notice_forced_logout: 비활성화된지 %{ttl_time}분 후 자동으로 로그아웃되었습니다. - notice_internal_server_error: 액세스하려는 페이지에 오류가 발생했습니다. 계속하여 문제가 발생하는 경우 %{app_title} - 관리자에게 문의하여 지원을 받으세요. - notice_locking_conflict: 그 사이에 정보가 한 명 이상의 다른 사용자에 의해 업데이트되었습니다. + notice_failed_to_save_work_packages: "선택된 %{total}개에서 %{count}개 작업 패키지를 저장하지 못했습니다. %{ids}." + notice_failed_to_save_members: "멤버를 저장하지 못했습니다. %{errors}." + notice_deletion_scheduled: "삭제가 예약되었으며 비동기적으로 수행됩니다." + notice_file_not_found: "액세스하려는 페이지가 존재하지 않거나 제거되었습니다." + notice_forced_logout: "비활성화된지 %{ttl_time}분 후 자동으로 로그아웃되었습니다." + notice_internal_server_error: "액세스하려는 페이지에 오류가 발생했습니다. 계속하여 문제가 발생하는 경우 %{app_title} 관리자에게 문의하여 지원을 받으세요." + notice_locking_conflict: "그 사이에 정보가 한 명 이상의 다른 사용자에 의해 업데이트되었습니다." notice_locking_conflict_additional_information: "%{users}의 업데이트입니다." - notice_locking_conflict_reload_page: 페이지를 다시 로드하고, 변경 사항을 검토하고, 업데이트를 다시 적용하세요. - notice_locking_conflict_warning: 이 페이지는 다른 사용자에 의해 업데이트되었습니다. 편집 사항을 손실하지 않으려면 로컬로 - 복사한 후 다시 로드하여 업데이트된 버전을 보세요. - notice_locking_conflict_danger: 수정 사항이 충돌하므로 변경 사항을 저장할 수 없습니다. 편집 사항이 손실되지 않게 하려면 - 로컬로 복사한 후 다시 로드하여 업데이트된 버전을 보세요. - notice_locking_conflict_action_button: 변경 사항 취소 및 다시 로드 - notice_member_added: "%{name} 이(가) 프로젝트에 추가 됨" - notice_members_added: "%{number}명의 사용자가 프로젝트에 추가되었습니다." - notice_member_removed: 프로젝트에서 %{user} 사용자가 제거됨. + notice_locking_conflict_reload_page: "페이지를 다시 로드하고, 변경 사항을 검토하고, 업데이트를 다시 적용하세요." + notice_locking_conflict_warning: "이 페이지는 다른 사용자에 의해 업데이트되었습니다. 편집 사항을 손실하지 않으려면 로컬로 복사한 후 다시 로드하여 업데이트된 버전을 보세요." + notice_locking_conflict_danger: "수정 사항이 충돌하므로 변경 사항을 저장할 수 없습니다. 편집 사항이 손실되지 않게 하려면 로컬로 복사한 후 다시 로드하여 업데이트된 버전을 보세요." + notice_locking_conflict_action_button: "변경 사항 취소 및 다시 로드" + notice_member_added: '%{name} 이(가) 프로젝트에 추가 됨' + notice_members_added: '%{number}명의 사용자가 프로젝트에 추가되었습니다.' + notice_member_removed: "프로젝트에서 %{user} 사용자가 제거됨." notice_member_deleted: "%{user}는 프로젝트에서 제거 되고 삭제됨." - notice_no_principals_found: 결과가 없습니다. - notice_bad_request: 잘못된 요청입니다. - notice_not_authorized: 이 페이지에 액세스할 권한이 없습니다. - notice_not_authorized_archived_project: 액세스하려는 프로젝트는 이미 보관되어 있습니다. - notice_requires_enterprise_token: Enterprise 토큰이 누락되었거나 이 페이지에 대한 액세스를 허용하지 않습니다. - notice_password_confirmation_failed: 입력한 암호가 올바르지 않습니다. - notice_principals_found_multiple: |- - %{number} 개의 결과가 발견되었습니다. - 첫번째 결과를 보려면 탭 해주세요. - notice_principals_found_single: |- - 한 개의 결과가 있습니다. - 보려면 탭 해주세요. - notice_parent_item_not_found: 부모 항목을 찾을 수 없습니다. - notice_project_not_deleted: 프로젝트가 삭제되지 않았습니다. - notice_project_not_found: 프로젝트를 찾을 수 없습니다. - notice_successful_connection: 연결에 성공했습니다. - notice_successful_create: 생성에 성공했습니다. - notice_successful_delete: 삭제에 성공했습니다. - notice_successful_cancel: 취소에 성공했습니다. - notice_successful_update: 업데이트에 성공했습니다. + notice_no_principals_found: "결과가 없습니다." + notice_bad_request: "잘못된 요청입니다." + notice_not_authorized: "이 페이지에 액세스할 권한이 없습니다." + notice_not_authorized_archived_project: "액세스하려는 프로젝트는 이미 보관되어 있습니다." + notice_requires_enterprise_token: "Enterprise 토큰이 누락되었거나 이 페이지에 대한 액세스를 허용하지 않습니다." + notice_password_confirmation_failed: "입력한 암호가 올바르지 않습니다." + notice_principals_found_multiple: "%{number} 개의 결과가 발견되었습니다.\n첫번째 결과를 보려면 탭 해주세요." + notice_principals_found_single: "한 개의 결과가 있습니다.\n보려면 탭 해주세요." + notice_parent_item_not_found: "부모 항목을 찾을 수 없습니다." + notice_project_not_deleted: "프로젝트가 삭제되지 않았습니다." + notice_project_not_found: "프로젝트를 찾을 수 없습니다." + notice_successful_connection: "연결에 성공했습니다." + notice_successful_create: "생성에 성공했습니다." + notice_successful_delete: "삭제에 성공했습니다." + notice_successful_cancel: "취소에 성공했습니다." + notice_successful_update: "업데이트에 성공했습니다." notice_successful_move: "%{from}에서 %{to}(으)로 이동했습니다." - notice_unsuccessful_create: 생성이 실패했습니다. - notice_unsuccessful_create_with_reason: '생성 실패: %{reason}' - notice_unsuccessful_update: 업데이트에 실패했습니다. - notice_unsuccessful_update_with_reason: '업데이트 실패: %{reason}' - notice_successful_update_custom_fields_added_to_project: '업데이트 성공. 활성화된 유형의 사용자 - 지정 필드는 작업 패키지 양식에서 자동으로 활성화됩니다. 자세히 알아보세요. - - ' - notice_to_many_principals_to_display: |- - 너무 많은 결과가 있습니다. - 새 멤버(또는 그룹)의 이름을 입력하여 검색 범위를 좁히세요. + notice_unsuccessful_create: "생성이 실패했습니다." + notice_unsuccessful_create_with_reason: "생성 실패: %{reason}" + notice_unsuccessful_update: "업데이트에 실패했습니다." + notice_unsuccessful_update_with_reason: "업데이트 실패: %{reason}" + notice_successful_update_custom_fields_added_to_project: | + 업데이트 성공. 활성화된 유형의 사용자 지정 필드는 작업 패키지 양식에서 자동으로 활성화됩니다. 자세히 알아보세요. + notice_to_many_principals_to_display: "너무 많은 결과가 있습니다.\n새 멤버(또는 그룹)의 이름을 입력하여 검색 범위를 좁히세요." notice_user_missing_authentication_method: 사용자가 암호나 로그인할 수 있는 다른 방법을 선택해야 합니다. notice_user_invitation_resent: 초대장이 %{email}(으)로 전송되었습니다. - present_access_key_value: '당신의 %{key_name} : %{value}' - notice_automatic_set_of_standard_type: 자동으로 표준 유형을 설정합니다. - notice_logged_out: 로그아웃했습니다. + present_access_key_value: "당신의 %{key_name} : %{value}" + notice_automatic_set_of_standard_type: "자동으로 표준 유형을 설정합니다." + notice_logged_out: "로그아웃했습니다." notice_wont_delete_auth_source: 사용자가 사용 중인 LDAP 연결은 삭제할 수 없습니다. - notice_project_cannot_update_custom_fields: '프로젝트의 사용 가능한 사용자 지정 필드를 업데이트할 수 없습니다. - 프로젝트가 유효하지 않습니다: %{errors}' - notice_attachment_migration_wiki_page: '이 페이지는 OpenProject 업데이트 중에 자동으로 생성되었습니다. - 이 페이지에는 %{container_type} "%{container_name}"과(와) 이전에 연결된 모든 첨부 파일이 포함되어 있습니다. - - ' + notice_project_cannot_update_custom_fields: "프로젝트의 사용 가능한 사용자 지정 필드를 업데이트할 수 없습니다. 프로젝트가 유효하지 않습니다: %{errors}" + notice_attachment_migration_wiki_page: > + 이 페이지는 OpenProject 업데이트 중에 자동으로 생성되었습니다. 이 페이지에는 %{container_type} "%{container_name}"과(와) 이전에 연결된 모든 첨부 파일이 포함되어 있습니다. + #Default format for numbers number: format: delimiter: "," @@ -4437,949 +4178,781 @@ ko: separator: "." human: format: - delimiter: '' + delimiter: "" precision: 1 storage_units: format: "%n %u" units: byte: - other: 바이트 - gb: GB - kb: kB - mb: MB - tb: TB + other: "바이트" + gb: "GB" + kb: "kB" + mb: "MB" + tb: "TB" onboarding: - heading_getting_started: 개요 가져오기 - text_getting_started_description: OpenProject로 프로젝트 관리 및 팀 공동 작업에 대한 간략한 개요를 가져올 - 수 있습니다. 도움말 메뉴에서 이 동영상을 다시 시작할 수 있습니다. + heading_getting_started: "개요 가져오기" + text_getting_started_description: "OpenProject로 프로젝트 관리 및 팀 공동 작업에 대한 간략한 개요를 가져올 수 있습니다. 도움말 메뉴에서 이 동영상을 다시 시작할 수 있습니다." welcome: "%{app_title}입니다." - select_language: 언어를 선택하세요. - permission_add_work_package_comments: 코멘트 추가 - permission_add_work_packages: 작업 패키지 추가 - permission_add_messages: 메시지 게시 - permission_add_project: 프로젝트 만들기 - permission_add_portfolios: 포트폴리오 만들기 - permission_add_programs: 프로그램 만들기 - permission_add_work_package_attachments: 첨부 파일 추가 - permission_add_work_package_attachments_explanation: 작업 패키지 편집 권한 없이 첨부 파일 추가를 허용합니다. - permission_add_internal_comments: 내부 코멘트 작성 - permission_archive_project: 프로젝트 보관 - permission_create_user: 사용자 만들기 - permission_manage_user: 사용자 편집 - permission_manage_placeholder_user: 플레이스홀더 사용자 생성, 수정, 제거 - permission_add_subprojects: 하위 프로젝트 만들기 - permission_add_work_package_watchers: 주시자 추가 - permission_assign_versions: 버전 할당 - permission_browse_repository: 리포지토리에 대한 읽기 전용 액세스(찾아보기 및 체크아웃) - permission_change_wiki_parent_page: 부모 위키 페이지 변경 - permission_change_work_package_status: 작업 패키지 상태 변경 - permission_change_work_package_status_explanation: 작업 패키지 편집 권한 없이 상태 변경을 허용합니다 - permission_comment_news: 뉴스에 코멘트 달기 - permission_commit_access: 리포지토리(커밋)에 대한 읽기/쓰기 액세스 - permission_copy_projects: 프로젝트 복사 - permission_copy_projects_explanation: 템플릿 프로젝트의 이 권한에는 템플릿에서 파생된 새 프로젝트를 만들 수 있는 - 부차적인 기능이 있습니다. - permission_copy_work_packages: 작업 패키지 복제 - permission_create_backup: 백업 만들기 - permission_delete_work_package_watchers: 주시자 삭제 - permission_delete_work_packages: 작업 패키지 삭제 - permission_delete_messages: 메시지 삭제 - permission_delete_own_messages: 내 메시지 삭제 - permission_delete_reportings: 보고 삭제 - permission_delete_timelines: 타임라인 삭제 - permission_delete_wiki_pages: 위키 페이지 삭제 - permission_delete_wiki_pages_attachments: 첨부 파일 삭제 - permission_edit_work_package_comments: 코멘트 조정 - permission_edit_work_package_comments_explanation: '주의: 이 권한이 있는 사용자는 다른 사용자의 코멘트를 - 편집할 수 있습니다.' - permission_edit_work_packages: 작업 패키지 편집 - permission_edit_messages: 메시지 편집 - permission_edit_own_internal_comments: 자신의 내부 코멘트 편집 - permission_edit_own_work_package_comments: 내 코멘트 편집 - permission_edit_own_messages: 내 메시지 편집 - permission_edit_own_time_entries: 내 시간 로그 편집 - permission_edit_others_internal_comments: 내부 코멘트 조정 - permission_edit_others_internal_comments_explanation: '주의: 이 권한이 있는 사용자는 다른 사용자의 - 내부 코멘트를 편집할 수 있습니다.' - permission_edit_project: 프로젝트 편집 - permission_edit_project_attributes: 프로젝트 특성 편집 - permission_edit_project_phases: 프로젝트 단계 편집 - permission_edit_reportings: 보고 편집 - permission_edit_time_entries: 다른 사용자의 시간 로그 편집 - permission_edit_timelines: 타임라인 편집 - permission_edit_wiki_pages: 위키 페이지 편집 - permission_export_work_packages: 작업 패키지 내보내기 - permission_export_projects: 프로젝트 내보내기 - permission_export_wiki_pages: 위키 페이지 내보내기 - permission_invite_members_by_email: 이메일로 멤버 초대 - permission_invite_members_by_email_explanation: '사용자가 이메일로 새로운 멤버를 초대할 수 있습니다. 초대된 - 사용자는 암호를 설정하고 계정을 활성화하는 링크가 포함된 이메일을 받게 됩니다. 멤버를 관리하는 권한에 따라 다릅니다 - - ' - permission_list_attachments: 첨부 파일 나열 - permission_log_own_time: 내 시간 기록 - permission_log_time: 다른 사용자의 시간 기록 - permission_manage_forums: 포럼 관리 - permission_manage_categories: 작업 패키지 카테고리 관리 - permission_manage_dashboards: 대시보드 관리 - permission_manage_work_package_relations: 작업 패키지 관계 관리 - permission_manage_members: 멤버 관리 - permission_manage_news: 뉴스 관리 - permission_manage_project_activities: 프로젝트 작업 관리 - permission_manage_public_queries: 공용 보기 관리 - permission_manage_repository: 리포지토리 관리 - permission_manage_subtasks: |- - OpenProject aims to connect distributed teams and organizations and make project management intuitive and fun. The open source software supports classical project management and team collaboration as well as agile project management methodologies. OpenProject is continuously developed and maintained by an active international community to provide a powerful feature set and yet intuitive user interface. The overall purpose is to create customer benefit. To achieve this, OpenProject follows a requirements and product development process that empathizes identifying and building the functionality which most aligns with OpenProject’s product vision and delivers customer value. - - This guide is an evolving description of the steps taken from collecting requirements all the way to implementation and release. The goal is to provide a single source of truth and provide a guideline for team members, community contributors and interested customers. As such this document will continuously be updated. - permission_manage_versions: 버전 관리 - permission_manage_wiki: 위키 관리 - permission_manage_wiki_menu: 위키 메뉴 관리 - permission_move_work_packages: 작업 패키지 이동 - permission_protect_wiki_pages: 위키 페이지 보호 - permission_rename_wiki_pages: 위키 페이지 이름 바꾸기 - permission_save_queries: 보기 저장 - permission_search_project: 프로젝트 검색 - permission_select_custom_fields: 사용자 지정 필드 선택 - permission_select_project_custom_fields: 프로젝트 특성 선택 - permission_select_project_phases: 프로젝트 단계 선택 - permission_select_project_phases_explanation: 프로젝트의 단계를 활성화/비활성화하세요. 비활성 단계는 프로젝트 - 개요 페이지나 프로젝트 목록에 표시되지 않으므로 사용자가 프로젝트에 적합한 수명 주기를 선택할 수 있습니다. - permission_select_project_modules: 프로젝트 모듈 선택 - permission_share_work_packages: 작업 패키지 공유 - permission_manage_types: 유형 선택 - permission_manage_own_reminders: 고유한 미리 알림 만들기 - permission_view_all_principals: 모든 사용자 및 그룹 보기 - permission_view_all_principals_explanation: '사용자가 참여 프로젝트나 그룹의 멤버가 아니더라도 시스템의 모든 - 사용자와 그룹을 볼 수 있도록 허용합니다. - - ' - permission_view_project: 프로젝트 보기 - permission_view_changesets: OpenProject에서 리포지토리 수정 사항 보기 - permission_view_internal_comments: 내부 코멘트 보기 - permission_view_commit_author_statistics: 커밋 작성자 통계 보기 - permission_view_dashboards: 대시보드 보기 - permission_view_work_package_watchers: 주시자 목록 보기 - permission_view_work_packages: 작업 패키지 보기 - permission_view_messages: 메시지 보기 - permission_view_news: 뉴스 보기 - permission_view_members: 멤버 보기 - permission_view_reportings: 보고 보기 - permission_view_shared_work_packages: 작업 패키지 공유 보기 - permission_view_time_entries: 소요 시간 보기 - permission_view_timelines: 타임라인 보기 - permission_view_user_email: 사용자의 메일 주소 보기 - permission_view_wiki_edits: 위키 기록 보기 - permission_view_wiki_pages: 위키 보기 - permission_work_package_assigned: 담당자/책임자 되기 - permission_work_package_assigned_explanation: 작업 패키지는 각각의 프로젝트에서 이 역할을 가진 사용자와 그룹에 - 할당될 수 있습니다. - permission_view_project_activity: 프로젝트 활동 보기 - permission_view_project_attributes: 프로젝트 특성 보기 - permission_view_project_phases: 프로젝트 단계 보기 - permission_save_bcf_queries: BCF 쿼리 저장 - permission_manage_public_bcf_queries: 공용 BCF 쿼리 관리 - permission_edit_attribute_help_texts: 특성 도움말 텍스트 편집 - permission_manage_public_project_queries: 공개 프로젝트 목록 관리 - permission_view_project_query: 프로젝트 쿼리 보기 - permission_edit_project_query: 프로젝트 쿼리 편집 + select_language: "언어를 선택하세요." + permission_add_work_package_comments: "코멘트 추가" + permission_add_work_packages: "작업 패키지 추가" + permission_add_messages: "메시지 게시" + permission_add_project: "프로젝트 만들기" + permission_add_portfolios: "포트폴리오 만들기" + permission_add_programs: "프로그램 만들기" + permission_add_work_package_attachments: "첨부 파일 추가" + permission_add_work_package_attachments_explanation: "작업 패키지 편집 권한 없이 첨부 파일 추가를 허용합니다." + permission_add_internal_comments: "내부 코멘트 작성" + permission_archive_project: "프로젝트 보관" + permission_create_user: "사용자 만들기" + permission_manage_user: "사용자 편집" + permission_manage_placeholder_user: "플레이스홀더 사용자 생성, 수정, 제거" + permission_add_subprojects: "하위 프로젝트 만들기" + permission_add_work_package_watchers: "주시자 추가" + permission_assign_versions: "버전 할당" + permission_browse_repository: "리포지토리에 대한 읽기 전용 액세스(찾아보기 및 체크아웃)" + permission_change_wiki_parent_page: "부모 위키 페이지 변경" + permission_change_work_package_status: "작업 패키지 상태 변경" + permission_change_work_package_status_explanation: "작업 패키지 편집 권한 없이 상태 변경을 허용합니다" + permission_comment_news: "뉴스에 코멘트 달기" + permission_commit_access: "리포지토리(커밋)에 대한 읽기/쓰기 액세스" + permission_copy_projects: "프로젝트 복사" + permission_copy_projects_explanation: "템플릿 프로젝트의 이 권한에는 템플릿에서 파생된 새 프로젝트를 만들 수 있는 부차적인 기능이 있습니다." + permission_copy_work_packages: "작업 패키지 복제" + permission_create_backup: "백업 만들기" + permission_delete_work_package_watchers: "주시자 삭제" + permission_delete_work_packages: "작업 패키지 삭제" + permission_delete_messages: "메시지 삭제" + permission_delete_own_messages: "내 메시지 삭제" + permission_delete_reportings: "보고 삭제" + permission_delete_timelines: "타임라인 삭제" + permission_delete_wiki_pages: "위키 페이지 삭제" + permission_delete_wiki_pages_attachments: "첨부 파일 삭제" + permission_edit_work_package_comments: "코멘트 조정" + permission_edit_work_package_comments_explanation: "주의: 이 권한이 있는 사용자는 다른 사용자의 코멘트를 편집할 수 있습니다." + permission_edit_work_packages: "작업 패키지 편집" + permission_edit_messages: "메시지 편집" + permission_edit_own_internal_comments: "자신의 내부 코멘트 편집" + permission_edit_own_work_package_comments: "내 코멘트 편집" + permission_edit_own_messages: "내 메시지 편집" + permission_edit_own_time_entries: "내 시간 로그 편집" + permission_edit_others_internal_comments: "내부 코멘트 조정" + permission_edit_others_internal_comments_explanation: "주의: 이 권한이 있는 사용자는 다른 사용자의 내부 코멘트를 편집할 수 있습니다." + permission_edit_project: "프로젝트 편집" + permission_edit_project_attributes: "프로젝트 특성 편집" + permission_edit_project_phases: "프로젝트 단계 편집" + permission_edit_reportings: "보고 편집" + permission_edit_time_entries: "다른 사용자의 시간 로그 편집" + permission_edit_timelines: "타임라인 편집" + permission_edit_wiki_pages: "위키 페이지 편집" + permission_export_work_packages: "작업 패키지 내보내기" + permission_export_projects: "프로젝트 내보내기" + permission_export_wiki_pages: "위키 페이지 내보내기" + permission_invite_members_by_email: "이메일로 멤버 초대" + permission_invite_members_by_email_explanation: > + 사용자가 이메일로 새로운 멤버를 초대할 수 있습니다. 초대된 사용자는 암호를 설정하고 계정을 활성화하는 링크가 포함된 이메일을 받게 됩니다. 멤버를 관리하는 권한에 따라 다릅니다 + permission_list_attachments: "첨부 파일 나열" + permission_log_own_time: "내 시간 기록" + permission_log_time: "다른 사용자의 시간 기록" + permission_manage_forums: "포럼 관리" + permission_manage_categories: "작업 패키지 카테고리 관리" + permission_manage_dashboards: "대시보드 관리" + permission_manage_work_package_relations: "작업 패키지 관계 관리" + permission_manage_members: "멤버 관리" + permission_manage_news: "뉴스 관리" + permission_manage_project_activities: "프로젝트 작업 관리" + permission_manage_public_queries: "공용 보기 관리" + permission_manage_repository: "리포지토리 관리" + permission_manage_subtasks: "OpenProject aims to connect distributed teams and organizations and make project management intuitive and fun. The open source software supports classical project management and team collaboration as well as agile project management methodologies. OpenProject is continuously developed and maintained by an active international community to provide a powerful feature set and yet intuitive user interface. The overall purpose is to create customer benefit. To achieve this, OpenProject follows a requirements and product development process that empathizes identifying and building the functionality which most aligns with OpenProject’s product vision and delivers customer value.\n\nThis guide is an evolving description of the steps taken from collecting requirements all the way to implementation and release. The goal is to provide a single source of truth and provide a guideline for team members, community contributors and interested customers. As such this document will continuously be updated." + permission_manage_versions: "버전 관리" + permission_manage_wiki: "위키 관리" + permission_manage_wiki_menu: "위키 메뉴 관리" + permission_move_work_packages: "작업 패키지 이동" + permission_protect_wiki_pages: "위키 페이지 보호" + permission_rename_wiki_pages: "위키 페이지 이름 바꾸기" + permission_save_queries: "보기 저장" + permission_search_project: "프로젝트 검색" + permission_select_custom_fields: "사용자 지정 필드 선택" + permission_select_project_custom_fields: "프로젝트 특성 선택" + permission_select_project_phases: "프로젝트 단계 선택" + permission_select_project_phases_explanation: "프로젝트의 단계를 활성화/비활성화하세요. 비활성 단계는 프로젝트 개요 페이지나 프로젝트 목록에 표시되지 않으므로 사용자가 프로젝트에 적합한 수명 주기를 선택할 수 있습니다." + permission_select_project_modules: "프로젝트 모듈 선택" + permission_share_work_packages: "작업 패키지 공유" + permission_manage_types: "유형 선택" + permission_manage_own_reminders: "고유한 미리 알림 만들기" + permission_view_all_principals: "모든 사용자 및 그룹 보기" + permission_view_all_principals_explanation: > + 사용자가 참여 프로젝트나 그룹의 멤버가 아니더라도 시스템의 모든 사용자와 그룹을 볼 수 있도록 허용합니다. + permission_view_project: "프로젝트 보기" + permission_view_changesets: "OpenProject에서 리포지토리 수정 사항 보기" + permission_view_internal_comments: "내부 코멘트 보기" + permission_view_commit_author_statistics: "커밋 작성자 통계 보기" + permission_view_dashboards: "대시보드 보기" + permission_view_work_package_watchers: "주시자 목록 보기" + permission_view_work_packages: "작업 패키지 보기" + permission_view_messages: "메시지 보기" + permission_view_news: "뉴스 보기" + permission_view_members: "멤버 보기" + permission_view_reportings: "보고 보기" + permission_view_shared_work_packages: "작업 패키지 공유 보기" + permission_view_time_entries: "소요 시간 보기" + permission_view_timelines: "타임라인 보기" + permission_view_user_email: "사용자의 메일 주소 보기" + permission_view_wiki_edits: "위키 기록 보기" + permission_view_wiki_pages: "위키 보기" + permission_work_package_assigned: "담당자/책임자 되기" + permission_work_package_assigned_explanation: "작업 패키지는 각각의 프로젝트에서 이 역할을 가진 사용자와 그룹에 할당될 수 있습니다." + permission_view_project_activity: "프로젝트 활동 보기" + permission_view_project_attributes: "프로젝트 특성 보기" + permission_view_project_phases: "프로젝트 단계 보기" + permission_save_bcf_queries: "BCF 쿼리 저장" + permission_manage_public_bcf_queries: "공용 BCF 쿼리 관리" + permission_edit_attribute_help_texts: "특성 도움말 텍스트 편집" + permission_manage_public_project_queries: "공개 프로젝트 목록 관리" + permission_view_project_query: "프로젝트 쿼리 보기" + permission_edit_project_query: "프로젝트 쿼리 편집" placeholders: default: "-" - templated_hint: "%{type} 유형을 통해 자동으로 생성됨" + templated_hint: '%{type} 유형을 통해 자동으로 생성됨' portfolio: count: - zero: 0개 포트폴리오 - one: 1개 포트폴리오 + zero: "0개 포트폴리오" + one: "1개 포트폴리오" other: "%{count}개 포트폴리오" program: count: - zero: 0개 프로그램 - one: 1개 프로그램 + zero: "0개 프로그램" + one: "1개 프로그램" other: "%{count}개 프로그램" project: archive: - title: 프로젝트 보관 - are_you_sure: 프로젝트 '%{name}'을(를) 보관하시겠습니까? - archived: 보관됨 + title: "프로젝트 보관" + are_you_sure: "프로젝트 '%{name}'을(를) 보관하시겠습니까?" + archived: "보관됨" count: - zero: 0개 프로젝트 - one: 1개 프로젝트 + zero: "0개 프로젝트" + one: "1개 프로젝트" other: "%{count}개 프로젝트" destroy: - title: 프로젝트 삭제 - heading: 이 프로젝트를 영구적으로 삭제하시겠습니까? + title: "프로젝트 삭제" + heading: "이 프로젝트를 영구적으로 삭제하시겠습니까?" confirmation_message_for_subprojects_html: - zero: "%{name} 프로젝트와 관련된 모든 데이터를 영구적으로 삭제하려고 합니다.\n" - one: "%{name} 프로젝트 및 이 하위 프로젝트와 관련된 모든 데이터를 영구적으로 삭제하려고 합니다:\n" - other: "%{name} 프로젝트 및 해당 하위 프로젝트와 관련된 모든 데이터를 영구적으로 삭제하려고 - 합니다:\n" + zero: > + %{name} 프로젝트와 관련된 모든 데이터를 영구적으로 삭제하려고 합니다. + one: > + %{name} 프로젝트 및 이 하위 프로젝트와 관련된 모든 데이터를 영구적으로 삭제하려고 합니다: + other: > + %{name} 프로젝트 및 해당 하위 프로젝트와 관련된 모든 데이터를 영구적으로 삭제하려고 합니다: filters: - project_phase: '프로젝트 단계: %{phase}' - project_phase_any: '프로젝트 단계: 모두' - project_phase_gate: '프로젝트 단계 게이트: %{gate}' + project_phase: "프로젝트 단계: %{phase}" + project_phase_any: "프로젝트 단계: 모두" + project_phase_gate: "프로젝트 단계 게이트: %{gate}" identifier: warning_one: 프로젝트 멤버는 프로젝트의 리포지토리를 재배치해야 합니다. warning_two: 프로젝트의 기존 링크는 더 이상 작동하지 않습니다. title: 프로젝트의 식별자 변경 - not_available: 프로젝트 N/A + not_available: "프로젝트 N/A" template: - copying_title: 템플릿 적용 - copying: '선택한 템플릿 프로젝트에서 프로젝트를 만들고 있습니다. 프로젝트가 사용 가능하게 되면 즉시 메일로 알려드립니다. - - ' - use_template: 템플릿 사용 - make_template: 템플릿으로 설정 - remove_from_templates: 템플릿에서 제거 - project_module_activity: 활동 - project_module_forums: 포럼 - project_module_work_package_tracking: 작업 패키지 - project_module_news: 뉴스 - project_module_repository: 리포지토리 - project_module_wiki: 위키 - permission_header_for_project_module_work_package_tracking: 작업 패키지 및 Gantt 차트 + copying_title: "템플릿 적용" + copying: > + 선택한 템플릿 프로젝트에서 프로젝트를 만들고 있습니다. 프로젝트가 사용 가능하게 되면 즉시 메일로 알려드립니다. + use_template: "템플릿 사용" + make_template: "템플릿으로 설정" + remove_from_templates: "템플릿에서 제거" + project_module_activity: "활동" + project_module_forums: "포럼" + project_module_work_package_tracking: "작업 패키지" + project_module_news: "뉴스" + project_module_repository: "리포지토리" + project_module_wiki: "위키" + permission_header_for_project_module_work_package_tracking: "작업 패키지 및 Gantt 차트" query: attribute_and_direction: "%{attribute} (%{direction})" + #possible query parameters (e.g. issue queries), + #which are not attributes of an AR-Model. query_fields: - active_or_archived: 활성 또는 보관됨 - assigned_to_role: 담당자의 역할 - assignee_or_group: 담당자 또는 소속 그룹 - member_of_group: 담당자의 그룹 - name_or_identifier: 이름 또는 식별자 - only_subproject_id: 하위 프로젝트만 - shared_with_user: 사용자와 공유됨 - shared_with_me: 나와 공유됨 - subproject_id: 하위 프로젝트 포함 + active_or_archived: "활성 또는 보관됨" + assigned_to_role: "담당자의 역할" + assignee_or_group: "담당자 또는 소속 그룹" + member_of_group: "담당자의 그룹" + name_or_identifier: "이름 또는 식별자" + only_subproject_id: "하위 프로젝트만" + shared_with_user: "사용자와 공유됨" + shared_with_me: "나와 공유됨" + subproject_id: "하위 프로젝트 포함" repositories: at_identifier: "- %{identifier}" - atom_revision_feed: Atom 수정 피드 - autofetch_information: |- - 리포지토리 모듈 페이지에 액세스할 때 자동으로 리포지토리가 업데이트되게 하려면 이 항목을 선택하세요. - 여기에는 리포지토리에서 커밋 검색 및 필요한 디스크 저장소 새로 고침이 포함됩니다. + atom_revision_feed: "Atom 수정 피드" + autofetch_information: "리포지토리 모듈 페이지에 액세스할 때 자동으로 리포지토리가 업데이트되게 하려면 이 항목을 선택하세요.\n여기에는 리포지토리에서 커밋 검색 및 필요한 디스크 저장소 새로 고침이 포함됩니다." checkout: access: - readwrite: 읽기 + 쓰기 - read: 읽기 전용 - none: 체크아웃 액세스 권한이 없습니다. 이 응용 프로그램을 통해서만 리포지토리를 볼 수 있습니다. - access_permission: 이 리포지토리에 대한 권한 - url: 체크아웃 URL - base_url_text: |- - 체크아웃 URL(예: https://myserver.example.org/repos/) 생성에 사용할 기본 URL입니다. - 참고: 기본 URL은 관리되는 리포지토리에서 체크아웃 URL을 다시 작성하는 데에만 사용됩니다. 다른 리포지토리는 변경되지 않습니다. + readwrite: "읽기 + 쓰기" + read: "읽기 전용" + none: "체크아웃 액세스 권한이 없습니다. 이 응용 프로그램을 통해서만 리포지토리를 볼 수 있습니다." + access_permission: "이 리포지토리에 대한 권한" + url: "체크아웃 URL" + base_url_text: "체크아웃 URL(예: https://myserver.example.org/repos/) 생성에 사용할 기본 URL입니다.\n참고: 기본 URL은 관리되는 리포지토리에서 체크아웃 URL을 다시 작성하는 데에만 사용됩니다. 다른 리포지토리는 변경되지 않습니다." default_instructions: - git: 이 리포지토리에 포함된 데이터는 Git으로 컴퓨터에 다운로드할 수 있습니다. 체크아웃 절차 및 사용 가능한 클라이언트에 대한 - 자세한 내용이 필요하면 Git 설명서를 참조하십시오. - subversion: 이 리포지토리에 포함된 데이터는 Subversion으로 컴퓨터에 다운로드할 수 있습니다. 체크아웃 절차 및 사용 - 가능한 클라이언트에 대한 자세한 내용이 필요하면 Subversion 설명서를 참조하십시오. - enable_instructions_text: 모든 리포지토리 관련 페이지에 아래 정의된 체크아웃 지침이 표시됩니다. - instructions: 체크아웃 지침 - show_instructions: 체크아웃 지침 표시 - text_instructions: 이 텍스트는 리포지토리를 체크아웃하는 방법에 대한 지침의 체크아웃 URL과 함께 표시됩니다. - not_available: 이 리포지토리에 대한 체크아웃 지침이 정의되지 않았습니다. 시스템 설정에서 이 리포지토리에 대한 체크아웃 지침을 - 활성화도록 관리자에게 요청하십시오. - create_managed_delay: '참고: 리포지토리가 관리됩니다. 이는 디스크에서 비동기적으로 생성되고 곧 사용 가능하게 됩니다.' - create_successful: 리포지토리가 등록되었습니다. - delete_sucessful: 리포지토리가 삭제되었습니다. + git: |- + 이 리포지토리에 포함된 데이터는 Git으로 컴퓨터에 다운로드할 수 있습니다. 체크아웃 절차 및 사용 가능한 클라이언트에 대한 자세한 내용이 필요하면 Git 설명서를 참조하십시오. + subversion: |- + 이 리포지토리에 포함된 데이터는 Subversion으로 컴퓨터에 다운로드할 수 있습니다. 체크아웃 절차 및 사용 가능한 클라이언트에 대한 자세한 내용이 필요하면 Subversion 설명서를 참조하십시오. + enable_instructions_text: "모든 리포지토리 관련 페이지에 아래 정의된 체크아웃 지침이 표시됩니다." + instructions: "체크아웃 지침" + show_instructions: "체크아웃 지침 표시" + text_instructions: "이 텍스트는 리포지토리를 체크아웃하는 방법에 대한 지침의 체크아웃 URL과 함께 표시됩니다." + not_available: "이 리포지토리에 대한 체크아웃 지침이 정의되지 않았습니다. 시스템 설정에서 이 리포지토리에 대한 체크아웃 지침을 활성화도록 관리자에게 요청하십시오." + create_managed_delay: "참고: 리포지토리가 관리됩니다. 이는 디스크에서 비동기적으로 생성되고 곧 사용 가능하게 됩니다." + create_successful: "리포지토리가 등록되었습니다." + delete_sucessful: "리포지토리가 삭제되었습니다." destroy: - confirmation: 계속하는 경우, 관리되는 리포지토리가 영구적으로 삭제됩니다. - info: 리포지토리 삭제는 취소할 수 없는 작업입니다. - info_not_managed: '참고: 이렇게 해도 이 리포지토리의 콘텐츠는 삭제되지 않습니다. OpenProject에 의해 관리되지 - 않기 때문입니다.' - managed_path_note: 다음 디렉터리가 지워집니다. %{path} - repository_verification: 해당 리포지토리의 삭제를 확인하려면 프로젝트의 식별자 %{identifier}을(를) 입력하세요. - subtitle: 프로젝트 %{project_name}의 %{repository_type}을(를) 삭제하시겠습니까? - subtitle_not_managed: 프로젝트 %{project_name}에서 연결된 %{repository_type} %{url}을(를) - 제거하시겠습니까? + confirmation: "계속하는 경우, 관리되는 리포지토리가 영구적으로 삭제됩니다." + info: "리포지토리 삭제는 취소할 수 없는 작업입니다." + info_not_managed: "참고: 이렇게 해도 이 리포지토리의 콘텐츠는 삭제되지 않습니다. OpenProject에 의해 관리되지 않기 때문입니다." + managed_path_note: "다음 디렉터리가 지워집니다. %{path}" + repository_verification: "해당 리포지토리의 삭제를 확인하려면 프로젝트의 식별자 %{identifier}을(를) 입력하세요." + subtitle: "프로젝트 %{project_name}의 %{repository_type}을(를) 삭제하시겠습니까?" + subtitle_not_managed: "프로젝트 %{project_name}에서 연결된 %{repository_type} %{url}을(를) 제거하시겠습니까?" title: "%{repository_type} 삭제" - title_not_managed: 연결된 %{repository_type}을(를) 제거하시겠습니까? + title_not_managed: "연결된 %{repository_type}을(를) 제거하시겠습니까?" errors: - build_failed: 선택한 구성으로 리포지토리를 만들 수 없습니다. %{reason} - managed_delete: 관리되는 리포지토리는 삭제할 수 없습니다. + build_failed: "선택한 구성으로 리포지토리를 만들 수 없습니다. %{reason}" + managed_delete: "관리되는 리포지토리는 삭제할 수 없습니다." managed_delete_local: "'%{path}'의 파일 시스템에서 로컬 리포지토리를 삭제할 수 없습니다. %{error_message}" - empty_repository: 리포지토리가 존재하지만 비어 있습니다. 여기에는 아직 수정 사항이 포함되어 있지 않습니다. - exists_on_filesystem: 리포지토리 디렉터리가 파일 시스템에 이미 있습니다. - filesystem_access_failed: 파일 시스템의 리포지토리에 액세스하는 중에 오류가 발생했습니다. %{message} - not_manageable: 이 리포지토리 공급업체는 OpenProject가 관리할 수 없습니다. - path_permission_failed: 다음 경로를 만드는 중에 오류가 발생했습니다. %{path}. OpenProject가 해당 폴더에 - 쓸 수 있는지 확인하세요. - unauthorized: 리포지토리에 액세스할 수 있는 권한이 없거나 자격 증명이 올바르지 않습니다. - unavailable: 리포지토리를 사용할 수 없습니다 - exception_title: 리포지토리에 액세스할 수 없습니다. %{message} - disabled_or_unknown_type: 선택한 유형 %{type} 은(는) 비활성화 되었거나, 더이상 SCM 공급 업체 %{vendor}에 - 사용할 수 없습니다. - disabled_or_unknown_vendor: SCM 공급업체 %{vendor}이(가) 비활성화되었거나 더 이상 사용 가능하지 않습니다. - remote_call_failed: '관리되는 원격 호출이 실패하고 메시지 ''%{message}''이(가) 표시되었습니다(코드: %{code}).' - remote_invalid_response: 관리되는 원격에서 잘못된 응답을 받았습니다. - remote_save_failed: 원격에서 검색된 매개 변수가 있는 리포지토리를 저장할 수 없습니다. + empty_repository: "리포지토리가 존재하지만 비어 있습니다. 여기에는 아직 수정 사항이 포함되어 있지 않습니다." + exists_on_filesystem: "리포지토리 디렉터리가 파일 시스템에 이미 있습니다." + filesystem_access_failed: "파일 시스템의 리포지토리에 액세스하는 중에 오류가 발생했습니다. %{message}" + not_manageable: "이 리포지토리 공급업체는 OpenProject가 관리할 수 없습니다." + path_permission_failed: "다음 경로를 만드는 중에 오류가 발생했습니다. %{path}. OpenProject가 해당 폴더에 쓸 수 있는지 확인하세요." + unauthorized: "리포지토리에 액세스할 수 있는 권한이 없거나 자격 증명이 올바르지 않습니다." + unavailable: "리포지토리를 사용할 수 없습니다" + exception_title: "리포지토리에 액세스할 수 없습니다. %{message}" + disabled_or_unknown_type: "선택한 유형 %{type} 은(는) 비활성화 되었거나, 더이상 SCM 공급 업체 %{vendor}에 사용할 수 없습니다." + disabled_or_unknown_vendor: "SCM 공급업체 %{vendor}이(가) 비활성화되었거나 더 이상 사용 가능하지 않습니다." + remote_call_failed: "관리되는 원격 호출이 실패하고 메시지 '%{message}'이(가) 표시되었습니다(코드: %{code})." + remote_invalid_response: "관리되는 원격에서 잘못된 응답을 받았습니다." + remote_save_failed: "원격에서 검색된 매개 변수가 있는 리포지토리를 저장할 수 없습니다." git: instructions: - managed_url: 관리되는 (로컬) Git 리포지토리의 URL입니다. - path: '로컬 Git 리포지토리(예: %{example_path})의 경로를 지정하세요. http(s):// 또는 file://로 - 시작하는 값을 사용하여 로컬 복사본에 복제된 원격 리포지토리를 사용할 수도 있습니다.' - path_encoding: 'Git 경로 인코딩 재정의(기본: UTF-8)' - local_title: 기존 로컬 Git 리포지토리 연결 - local_url: 로컬 URL - local_introduction: 기존 로컬 Git 리포지토리가 있는 경우 응용 프로그램 내에서 액세스하기 위해 OpenProject와 - 이 리포지토리를 연결할 수 있습니다. - managed_introduction: OpenProject가 생성되고 자동으로 로컬 Git 리포지토리를 통합하게 합니다. - managed_title: OpenProject에 통합된 Git 리포지토리 - managed_url: 관리되는 URL - path: Git 리포지토리의 경로 - path_encoding: 경로 인코딩 - go_to_revision: 수정 사항으로 이동 - managed_remote: 이 공급업체에 대한 관리되는 리포지토리는 원격으로 처리됩니다. - managed_remote_note: URL에 대한 정보 및 이 리포지토리의 경로는 생성되기 이전에 사용 가능하지 않습니다. - managed_url: 관리되는 URL + managed_url: "관리되는 (로컬) Git 리포지토리의 URL입니다." + path: >- + 로컬 Git 리포지토리(예: %{example_path})의 경로를 지정하세요. http(s):// 또는 file://로 시작하는 값을 사용하여 로컬 복사본에 복제된 원격 리포지토리를 사용할 수도 있습니다. + path_encoding: "Git 경로 인코딩 재정의(기본: UTF-8)" + local_title: "기존 로컬 Git 리포지토리 연결" + local_url: "로컬 URL" + local_introduction: "기존 로컬 Git 리포지토리가 있는 경우 응용 프로그램 내에서 액세스하기 위해 OpenProject와 이 리포지토리를 연결할 수 있습니다." + managed_introduction: "OpenProject가 생성되고 자동으로 로컬 Git 리포지토리를 통합하게 합니다." + managed_title: "OpenProject에 통합된 Git 리포지토리" + managed_url: "관리되는 URL" + path: "Git 리포지토리의 경로" + path_encoding: "경로 인코딩" + go_to_revision: "수정 사항으로 이동" + managed_remote: "이 공급업체에 대한 관리되는 리포지토리는 원격으로 처리됩니다." + managed_remote_note: "URL에 대한 정보 및 이 리포지토리의 경로는 생성되기 이전에 사용 가능하지 않습니다." + managed_url: "관리되는 URL" settings: - automatic_managed_repos_disabled: 자동 생성 사용 안 함 - automatic_managed_repos: 관리되는 리포지토리의 자동 생성 - automatic_managed_repos_text: 여기에서 공급업체를 설정하면, 새로 생성된 프로젝트는 이 공급업체의 관리되는 리포지토리를 - 자동으로 받게 됩니다. - scm_vendor: 소스 제어 관리 시스템 - scm_type: 리포지토리 유형 + automatic_managed_repos_disabled: "자동 생성 사용 안 함" + automatic_managed_repos: "관리되는 리포지토리의 자동 생성" + automatic_managed_repos_text: "여기에서 공급업체를 설정하면, 새로 생성된 프로젝트는 이 공급업체의 관리되는 리포지토리를 자동으로 받게 됩니다." + scm_vendor: "소스 제어 관리 시스템" + scm_type: "리포지토리 유형" scm_types: - local: 기존 로컬 리포지토리 연결 - existing: 기존 리포지토리 연결 - managed: OpenProject에서 새로운 리포지토리 만들기 + local: "기존 로컬 리포지토리 연결" + existing: "기존 리포지토리 연결" + managed: "OpenProject에서 새로운 리포지토리 만들기" storage: - not_available: 이 리포지토리에 대한 디스크 저장소 사용량이 사용 가능하지 않습니다. - update_timeout: |- - N분 동안 리포지토리의 마지막 필요한 디스크 공간 정보를 유지하세요. - 리포지토리의 필요한 디스크 저장소 공간 계산에는 비용이 많이 소요될 수 있으므로, 이 값을 늘려 성능 영향을 줄이세요. - oauth_application_details: '이 창을 닫으면 클라이언트 비밀 값에 다시 액세스할 수 없습니다. 다음 값을 Nextcloud - OpenProject Integration 설정에 복사하세요:' - oauth_application_details_link_text: 설정 페이지로 이동 - setup_documentation_details: '새 파일 저장소를 구성하는 데 도움이 필요하면 설명서를 확인하세요. ' - setup_documentation_details_link_text: 파일 저장소 설정 - show_warning_details: 이 파일 저장소를 사용하려면 원하는 각 프로젝트의 프로젝트 설정에서 모듈과 특정 저장소를 활성화해야 - 합니다. + not_available: "이 리포지토리에 대한 디스크 저장소 사용량이 사용 가능하지 않습니다." + update_timeout: "N분 동안 리포지토리의 마지막 필요한 디스크 공간 정보를 유지하세요.\n리포지토리의 필요한 디스크 저장소 공간 계산에는 비용이 많이 소요될 수 있으므로, 이 값을 늘려 성능 영향을 줄이세요." + oauth_application_details: "이 창을 닫으면 클라이언트 비밀 값에 다시 액세스할 수 없습니다. 다음 값을 Nextcloud OpenProject Integration 설정에 복사하세요:" + oauth_application_details_link_text: "설정 페이지로 이동" + setup_documentation_details: "새 파일 저장소를 구성하는 데 도움이 필요하면 설명서를 확인하세요. " + setup_documentation_details_link_text: "파일 저장소 설정" + show_warning_details: "이 파일 저장소를 사용하려면 원하는 각 프로젝트의 프로젝트 설정에서 모듈과 특정 저장소를 활성화해야 합니다." subversion: - existing_title: 기존 Subversion 리포지토리 - existing_introduction: 기존 Subversion 리포지토리가 있는 경우 응용 프로그램 내에서 액세스하기 위해 OpenProject와 - 이 리포지토리를 연결할 수 있습니다. - existing_url: 기존 URL + existing_title: "기존 Subversion 리포지토리" + existing_introduction: "기존 Subversion 리포지토리가 있는 경우 응용 프로그램 내에서 액세스하기 위해 OpenProject와 이 리포지토리를 연결할 수 있습니다." + existing_url: "기존 URL" instructions: - managed_url: 관리되는 (로컬) Subversion 리포지토리의 URL입니다. - url: |- - 리포지토리 URL을 입력하세요. 이는 로컬 리포지토리(%{local_proto}(으)로 시작) 또는 원격 리포지토리를 대상으로 할 수 있습니다. - 다음 URL 구성표가 지원됩니다. - managed_title: OpenProject에 통합된 Subversion 리포지토리 - managed_introduction: OpenProject가 생성되고 자동으로 로컬 Subversion 리포지토리를 통합하게 합니다. - managed_url: 관리되는 URL - password: 리포지토리 암호 - username: 리포지토리 사용자 이름 - truncated: 죄송하지만, 이 디렉터리를 %{limit}개 파일로 잘라야 했습니다. %{truncated}개 항목이 목록에서 생략되었습니다. + managed_url: "관리되는 (로컬) Subversion 리포지토리의 URL입니다." + url: "리포지토리 URL을 입력하세요. 이는 로컬 리포지토리(%{local_proto}(으)로 시작) 또는 원격 리포지토리를 대상으로 할 수 있습니다.\n다음 URL 구성표가 지원됩니다." + managed_title: "OpenProject에 통합된 Subversion 리포지토리" + managed_introduction: "OpenProject가 생성되고 자동으로 로컬 Subversion 리포지토리를 통합하게 합니다." + managed_url: "관리되는 URL" + password: "리포지토리 암호" + username: "리포지토리 사용자 이름" + truncated: "죄송하지만, 이 디렉터리를 %{limit}개 파일로 잘라야 했습니다. %{truncated}개 항목이 목록에서 생략되었습니다." named_repository: "%{vendor_name} 리포지토리" - update_settings_successful: 설정이 저장되었습니다. - url: 리포지토리의 URL + update_settings_successful: "설정이 저장되었습니다." + url: "리포지토리의 URL" warnings: - cannot_annotate: 이 파일에는 주석을 지정할 수 없습니다. + cannot_annotate: "이 파일에는 주석을 지정할 수 없습니다." scheduling: - manual: 수동으로 설정 - automatic: 자동으로 설정 - search_input_placeholder: 검색... - setting_allowed_link_protocols: 허용된 링크 프로토콜 - setting_allowed_link_protocols_text_html: '이러한 프로토콜이 작업 패키지 설명, 긴 텍스트 필드 및 코멘트에서 - 링크로 렌더링되도록 허용합니다. 예: %{tel_code} 또는 %{element_code}. 라인별로 하나의 프로토콜을 입력합니다.
- %{http_code}, %{https_code} 및 %{mailto_code} 프로토콜은 항상 허용됩니다.' - setting_capture_external_links: 외부 링크 캡처 - setting_capture_external_links_text: '활성화된 경우, 서식이 지정된 텍스트의 모든 외부 링크는 애플리케이션을 종료하기 - 전에 경고 페이지를 통해 리디렉션됩니다. 따라서 잠재적인 악성 외부 웹사이트로부터 사용자를 보호할 수 있습니다. - - ' - setting_capture_external_links_require_login: 사용자가 로그인해야 함 - setting_capture_external_links_require_login_text: '이 옵션을 활성화하면, 외부 링크를 클릭하려는 사용자는 - 로그인해야 계속할 수 있습니다. - - ' - setting_after_first_login_redirect_url: 첫 번째 로그인 리디렉션 - setting_after_first_login_redirect_url_text_html: '첫 로그인 후 사용자를 리디렉션할 경로를 설정하세요. - 비어 있으면 온보딩 투어의 홈페이지로 리디렉션됩니다.
예: /my/page - - ' - setting_after_login_default_redirect_url: 로그인 리디렉션 후 - setting_after_login_default_redirect_url_text_html: '백 링크가 제공되지 않은 경우 로그인 후 사용자를 - 리디렉션할 기본 경로를 설정하세요. 설정하지 않으면 홈페이지로 리디렉션됩니다.
예: /my/page - - ' - setting_apiv3_cors_title: CORS(크로스 원본 리소스 공유) - setting_apiv3_cors_enabled: CORS 사용 - setting_apiv3_cors_origins: API V3 CORS(크로스-원본 리소스 공유) 허용 원본 - setting_apiv3_cors_origins_text_html: 'CORS가 활성화된 경우, OpenProject API에 액세스하도록 허용된 - 원본이 있습니다.
원본 헤더의 설명서에서 예상 값 - 지정 방법을 확인하세요. - - ' - setting_apiv3_write_readonly_attributes: 읽기 전용 특성에 대한 쓰기 액세스 - setting_apiv3_write_readonly_attributes_instructions: '활성화된 경우, API를 통해 관리자는 생성 - 중에 createdAt 및 author 등 정적 읽기 전용 특성을 작성할 수 있습니다. - - ' - setting_apiv3_write_readonly_attributes_warning: '이 설정에는 데이터 가져오기 등의 사용 사례가 있지만 - 관리자가 다른 사용자로 항목을 만든 것처럼 가장할 수 있습니다. 그러나 모든 생성 요청은 실제 작성자로 기록됩니다. - - ' - setting_apiv3_write_readonly_attributes_additional: '특성 및 지원되는 리소스에 대한 자세한 내용은 %{api_documentation_link}에서 - 참조하세요. - - ' - setting_apiv3_max_page_size: 최대 API 페이지 크기 - setting_apiv3_max_page_size_instructions: 'API가 응답할 최대 페이지 크기를 설정합니다. 단일 페이지에 더 - 많은 값을 반환하는 API 요청은 수행할 수 없습니다. - - ' - setting_apiv3_max_page_size_warning: '필요한 이유가 확실한 경우에만 이 값을 변경하세요. 높은 값으로 설정하면 성능에 - 상당한 영향을 미치며, 페이지당 옵션보다 낮은 값은 페이지가 매겨진 보기에서 오류를 일으킵니다. - - ' - setting_apiv3_docs: 설명서 - setting_apiv3_docs_enabled: 문서 페이지 활성화 - setting_apiv3_docs_enabled_instructions_html: '문서 페이지가 활성화되면 %{link}에서 - APIv3 문서의 대화식 보기를 얻을 수 있습니다. - - ' - setting_apiv3_docs_enabled_instructions_warning: '프로덕션 시스템에서 API 문서를 활성화하면 주의하지 - 않을 경우 중요한 정보가 노출되거나 실수로 데이터가 손실될 수 있다는 점에 유의하세요. 이 설정은 개발 목적으로만 활성화하는 것이 좋습니다. - - ' - setting_attachment_whitelist: 첨부 파일 업로드 허용 목록 - setting_email_delivery_method: 이메일 배달 방법 - setting_emails_salutation: '이메일의 주소 사용자:' - setting_oauth_allow_remapping_of_existing_users: 기존 사용자의 다시 매핑 허용 - setting_sendmail_location: sendmail 실행 파일의 위치 - setting_sendmail_arguments: sendmail의 인수 - setting_smtp_enable_starttls_auto: 사용 가능한 경우 자동으로 STARTTLS 사용 - setting_smtp_ssl: SSL 연결 사용 - setting_smtp_address: SMTP 서버 - setting_smtp_port: SMTP 포트 - setting_smtp_authentication: SMTP 인증 - setting_smtp_user_name: SMTP 사용자 이름 - setting_smtp_password: SMTP 비밀번호 - setting_smtp_domain: SMTP HELO 도메인 - setting_activity_days_default: 프로젝트 작업에 표시되는 기간(일) - setting_api_tokens_enabled: API 토큰 활성화 - setting_api_tokens_enabled_caption: '사용자가 계정 설정에서 개인 API 토큰을 만들 수 있는지 여부를 결정합니다. - 해당 토큰은 APIv3 및 MCP와 같은 OpenProject의 다양한 API에 액세스하는 데 사용할 수 있습니다. - - ' - setting_app_subtitle: 응용 프로그램 부제목 - setting_app_title: 응용 프로그램 제목 - setting_attachment_max_size: 첨부 파일 최대 크기 - setting_show_work_package_attachments: 기본적으로 파일 탭에 첨부 파일 표시 - setting_antivirus_scan_mode: 스캔 모드 - setting_antivirus_scan_action: 감염된 파일 작업 - setting_autofetch_changesets: Autofetch 리포지토리 변경 사항 - setting_autologin: 자동 로그인 - setting_available_languages: 사용 가능한 언어 - setting_bcc_recipients: 숨은 참조 받는 사람(bcc) - setting_brute_force_block_after_failed_logins: 이 로그인 시도 실패 횟수를 넘으면 사용자 차단 - setting_brute_force_block_minutes: 사용자가 다음 시간 동안 차단되었습니다. - setting_cache_formatted_text: 캐시 서식 있는 텍스트 - setting_use_wysiwyg_description: 기본적으로 모든 사용자에 대한 CKEditor5 WYSIWYG 편집기를 활성화하려면 - 선택하세요. CKEditor는 GFM Markdown용 기능을 제한했습니다. - setting_column_options: 기본 작업 패키지 목록 열 - setting_commit_fix_keywords: 키워드 수정 - setting_commit_logs_encoding: 커밋 메시지 인코딩 - setting_commit_logtime_activity_id: 기록된 시간의 작업 - setting_commit_logtime_enabled: 시간 로깅 사용 - setting_commit_ref_keywords: 키워드 참조 - setting_consent_time: 동의 시간 - setting_consent_info: 동의 정보 텍스트 - setting_consent_required: 동의 필요 - setting_consent_decline_mail: 동의 연락처 메일 주소 - setting_cross_project_work_package_relations: 교차 프로젝트 작업 패키지 관계 허용 - setting_first_week_of_year: 1년의 첫 주 기준 - setting_date_format: 날짜 - setting_default_language: 기본 언어 - setting_default_projects_modules: 새 프로젝트에 대해 기본적으로 활성화된 모듈 - setting_default_projects_public: 새 프로젝트는 기본적으로 공용입니다. - setting_disable_password_login: 암호 인증 비활성화 - setting_diff_max_lines_displayed: 표시되는 최대 차이점 줄 수 - setting_omniauth_direct_login_provider: 직접 로그인 SSO 공급자 - setting_display_subprojects_work_packages: 기본적으로 기본 프로젝트의 하위 프로젝트 작업 패키지 표시 - setting_duration_format: 기간 형식 - setting_duration_format_hours_only: 시간만 - setting_duration_format_days_and_hours: 일 및 시간 - setting_duration_format_instructions: 작업, 남은 작업 및 소요 시간이 표시되는 방식을 정의합니다. - setting_emails_footer: 이메일 바닥글 - setting_emails_header: 이메일 머리글 - setting_email_login: 이메일로 로그인하기 - setting_enabled_scm: 활성화된 SCM - setting_enabled_projects_columns: 기본적으로 표시되는 프로젝트 목록의 열 - setting_feeds_enabled: 피드 사용 - setting_ical_enabled: iCalendar 구독 활성화 - setting_feeds_limit: 피드 콘텐츠 제한 - setting_file_max_size_displayed: 인라인에 표시되는 텍스트 파일의 최대 크기 - setting_host_name: 호스트 이름 - setting_collaborative_editing_hocuspocus_url: Hocuspocus 서버 URL - setting_collaborative_editing_hocuspocus_secret: Hocuspocus 서버 비밀번호 - setting_hours_per_day: 일별 시간 - setting_hours_per_day_explanation: '일 및 시간으로 기간을 표시할 때 "하루"로 간주되는 시간을 정의합니다(예: 하루가 - 8시간이면 32시간은 4일이 됩니다).' - setting_invitation_expiration_days: '활성화 이메일 만료 기간:' - setting_invitation_expiration_days_caption: 활성화 이메일이 만료되기까지의 일수입니다. - setting_work_package_done_ratio: 진행률 계산 모드 - setting_work_package_done_ratio_field: 작업 기반 - setting_work_package_done_ratio_field_caption_html: "완료 %는 원하는 값으로 자유롭게 설정할 - 수 있습니다. 선택적으로 작업에 대한 값을 입력하면 남은 작업이 자동으로 나옵니다." - setting_work_package_done_ratio_status: 상태 기반 - setting_work_package_done_ratio_status_caption_html: 각 상태에는 완료 % 값이 연관되어 - 있습니다. 상태를 변경하면 완료 %가 변경됩니다. - setting_work_package_done_ratio_explanation_html: "작업 기반 모드에서 완료 %는 어떤 값으로든 - 자유롭게 설정할 수 있습니다. 선택적으로 작업에 대한 값을 입력하면 남은 작업이 자동으로 파생됩니다. 상태 기반 모드에서는 각 - 상태에 완료 % 값이 연결되어 있습니다. 상태를 변경하면 완료 %도 변경됩니다.\n" - setting_work_package_properties: 작업 패키지 속성 - setting_work_package_startdate_is_adddate: 새 작업 패키지에 대한 시작 날짜로 현재 날짜 사용 - setting_work_packages_projects_export_limit: 작업 패키지/프로젝트 내보내기 제한 - setting_journal_aggregation_time_minutes: 집계된 사용자 작업 - setting_log_requesting_user: 모든 요청에 대한 로그 사용자 로그인, 이름 및 메일 주소 - setting_login_required: 인증이 필요함 - setting_login_required_caption: 이 옵션을 선택하면 애플리케이션에 대한 모든 요청이 인증되어야 합니다. - setting_lost_password: 암호 재설정 활성화 - setting_lost_password_caption: 이 옵션을 선택하면 사용자가 자신의 암호를 재설정할 수 있습니다. - setting_mail_from: 발신 이메일 주소 - setting_mail_handler_api_key: API 키 - setting_mail_handler_body_delimiters: 이러한 줄 중 하나 다음에 이메일 자르기 - setting_mail_handler_body_delimiter_regex: 이 정규식에 일치하는 이메일을 자름 - setting_mail_handler_ignore_filenames: 무시된 메일 첨부 파일 - setting_new_project_user_role_id: 프로젝트를 만드는 비관리자 사용자에게 지정된 역할 - setting_new_project_send_confirmation_email: 새 프로젝트 생성 시 작성자에게 알림 보내기 - setting_new_project_notification_text: 알림 텍스트 - setting_password_active_rules: 활성 문자 클래스 - setting_password_count_former_banned: 재사용 금지된 최근에 사용한 암호 수 - setting_password_days_valid: 암호 변경을 적용할 경과 일 수 - setting_password_min_length: 최소 길이 - setting_password_min_adhered_rules: 최소 필수 클래스 수 - setting_per_page_options: 페이지당 개체 옵션 - setting_percent_complete_on_status_closed: 상태가 닫힘인 경우 완료 % - setting_percent_complete_on_status_closed_no_change: 변경 없음 - setting_percent_complete_on_status_closed_no_change_caption_html: "완료 % 값은 - 작업 패키지가 닫혀도 변경되지 않습니다." - setting_percent_complete_on_status_closed_set_100p: 100%로 자동 설정 - setting_percent_complete_on_status_closed_set_100p_caption: 닫힌 작업 패키지는 완료로 간주됩니다. - setting_plain_text_mail: 일반 텍스트 메일(HTML 없음) - setting_protocol: 프로토콜 - setting_project_gantt_query: 프로젝트 포트폴리오 Gantt 보기 - setting_project_gantt_query_text: 프로젝트 개요 페이지에서 Gantt 차트를 표시하는 데 사용되는 쿼리를 수정할 수 - 있습니다. - setting_security_badge_displayed: 보안 배지 표시 - setting_registration_footer: 등록 꼬리말 - setting_registration_footer_caption: 이 텍스트는 등록 페이지 바닥글에 표시됩니다. HTML 편집기를 사용하여, 선택한 - 각 언어에 대한 텍스트의 서식을 지정하세요. - setting_repositories_automatic_managed_vendor: 자동 리포지토리 공급업체 유형 - setting_repositories_encodings: 리포지토리 인코딩 - setting_repository_storage_cache_minutes: 리포지토리 디스크 크기 캐시 - setting_repository_checkout_display: 체크아웃 지침 표시 - setting_repository_checkout_base_url: 체크아웃 기본 URL - setting_repository_checkout_text: 체크아웃 지침 텍스트 - setting_repository_log_display_limit: 파일 로그 표시되는 최대 수정 수 - setting_repository_truncate_at: 리포지토리 브라우저에 표시되는 최대 파일 수 - setting_self_registration: 자체 등록 - setting_self_registration_caption: '사용자에 대한 자체 등록 메커니즘을 선택하세요. 일부 옵션은 사용자가 이 인스턴스에 - 대해 자신의 계정을 활성화하도록 허용하므로, 선택하는 설정에 주의해 주세요. - - ' - setting_self_registration_warning: '사용자가 자신의 계정을 활성화할 수 있습니다. 이 옵션은 모든 공개 프로젝트와 - 해당 콘텐츠에 대한 액세스 권한을 사용자에게 부여합니다. 민감하거나 개인적인 데이터가 공개 프로젝트에서 노출되지 않도록 주의해 주세요. - - ' - setting_self_registration_disabled: 사용 안 함 - setting_self_registration_disabled_caption: '자체적으로 등록할 수 있는 계정이 없습니다. 새로운 사용자를 생성할 - 수 있는 글로벌 권한을 가진 사용자 및 관리자만 새로운 계정을 생성할 수 있습니다. - - ' - setting_self_registration_activation_by_email: 이메일로 계정 활성화 - setting_self_registration_activation_by_email_caption: '사용자가 이메일 주소를 확인한 후 직접 등록하고 - 계정을 활성화할 수 있습니다. 활성화 프로세스에 대한 조정 권한이 관리자에게 없습니다. - - ' - setting_self_registration_automatic_activation: 자동 계정 활성화 - setting_self_registration_automatic_activation_caption: '사용자가 직접 등록할 수 있습니다. 사용자의 - 계정은 추가 조치 없이 즉시 활성화됩니다. 활성화 프로세스에 대한 조정 권한이 관리자에게 없습니다. - - ' - setting_self_registration_manual_activation: 수동 계정 활성화 - setting_self_registration_manual_activation_caption: '사용자가 직접 등록할 수 있습니다. 사용자를 생성하거나 - 관리할 수 있는 글로벌 권한을 가진 사용자 또는 관리자가 계정을 활성화할 때까지 해당 계정은 대기 상태로 유지됩니다. - - ' - setting_session_ttl: 비활성화된 후 세션 만료 시간 - setting_session_ttl_hint: 5 아래 값은 사용 안함으로 작동합니다. - setting_session_ttl_enabled: 세션 만료됨 - setting_start_of_week: '주의 시작:' - setting_sys_api_enabled: 리포지토리 관리 웹 서비스 사용 - setting_sys_api_description: 리포지토리 관리 웹 서비스는 리포지토리에 액세스하기 위한 통합 및 사용자 인증을 제공합니다. - setting_time_format: 시간 - setting_total_percent_complete_mode: 완료 % 계층 합계 계산 - setting_total_percent_complete_mode_work_weighted_average: 작업별 가중치 적용됨 - setting_total_percent_complete_mode_work_weighted_average_caption_html: "총 완료 - %는 계층에 있는 각 작업 패키지의 작업에 따라 가중치가 적용됩니다. 작업이 없는 작업 패키지는 무시됩니다." - setting_total_percent_complete_mode_simple_average: 단순 평균 - setting_total_percent_complete_mode_simple_average_caption_html: "작업은 무시되며 - 총 완료 %는 계층에 있는 작업 패키지의 완료 % 값에 대한 단순 평균이 됩니다." - setting_accessibility_mode_for_anonymous: 익명 사용자에 대해 접근성 모드 사용 - setting_user_format: 사용자 이름 형식 - setting_user_default_timezone: 사용자의 기본 표준 시간대 - setting_users_deletable_by_admins: 관리자가 삭제 가능한 사용자 계정 - setting_users_deletable_by_self: 자신의 계정을 삭제하도록 허용된 사용자 - setting_welcome_text: 환영 블록 텍스트 - setting_welcome_title: 환영 블록 제목 - setting_welcome_on_homescreen: 홈 화면에 환영 블록 표시 - setting_work_package_list_default_highlighting_mode: 기본 강조 표시 모드 - setting_work_package_list_default_highlighted_attributes: 기본 인라인 강조 표시 특성 - setting_working_days: 근무일 + manual: "수동으로 설정" + automatic: "자동으로 설정" + search_input_placeholder: "검색..." + setting_allowed_link_protocols: "허용된 링크 프로토콜" + setting_allowed_link_protocols_text_html: >- + 이러한 프로토콜이 작업 패키지 설명, 긴 텍스트 필드 및 코멘트에서 링크로 렌더링되도록 허용합니다. 예: %{tel_code} 또는 %{element_code}. 라인별로 하나의 프로토콜을 입력합니다.
%{http_code}, %{https_code} 및 %{mailto_code} 프로토콜은 항상 허용됩니다. + setting_capture_external_links: "외부 링크 캡처" + setting_capture_external_links_text: > + 활성화된 경우, 서식이 지정된 텍스트의 모든 외부 링크는 애플리케이션을 종료하기 전에 경고 페이지를 통해 리디렉션됩니다. 따라서 잠재적인 악성 외부 웹사이트로부터 사용자를 보호할 수 있습니다. + setting_capture_external_links_require_login: "사용자가 로그인해야 함" + setting_capture_external_links_require_login_text: > + 이 옵션을 활성화하면, 외부 링크를 클릭하려는 사용자는 로그인해야 계속할 수 있습니다. + setting_after_first_login_redirect_url: "첫 번째 로그인 리디렉션" + setting_after_first_login_redirect_url_text_html: > + 첫 로그인 후 사용자를 리디렉션할 경로를 설정하세요. 비어 있으면 온보딩 투어의 홈페이지로 리디렉션됩니다.
예: /my/page + setting_after_login_default_redirect_url: "로그인 리디렉션 후" + setting_after_login_default_redirect_url_text_html: > + 백 링크가 제공되지 않은 경우 로그인 후 사용자를 리디렉션할 기본 경로를 설정하세요. 설정하지 않으면 홈페이지로 리디렉션됩니다.
예: /my/page + setting_apiv3_cors_title: "CORS(크로스 원본 리소스 공유)" + setting_apiv3_cors_enabled: "CORS 사용" + setting_apiv3_cors_origins: "API V3 CORS(크로스-원본 리소스 공유) 허용 원본" + setting_apiv3_cors_origins_text_html: > + CORS가 활성화된 경우, OpenProject API에 액세스하도록 허용된 원본이 있습니다.
원본 헤더의 설명서에서 예상 값 지정 방법을 확인하세요. + setting_apiv3_write_readonly_attributes: "읽기 전용 특성에 대한 쓰기 액세스" + setting_apiv3_write_readonly_attributes_instructions: > + 활성화된 경우, API를 통해 관리자는 생성 중에 createdAt 및 author 등 정적 읽기 전용 특성을 작성할 수 있습니다. + setting_apiv3_write_readonly_attributes_warning: > + 이 설정에는 데이터 가져오기 등의 사용 사례가 있지만 관리자가 다른 사용자로 항목을 만든 것처럼 가장할 수 있습니다. 그러나 모든 생성 요청은 실제 작성자로 기록됩니다. + setting_apiv3_write_readonly_attributes_additional: > + 특성 및 지원되는 리소스에 대한 자세한 내용은 %{api_documentation_link}에서 참조하세요. + setting_apiv3_max_page_size: "최대 API 페이지 크기" + setting_apiv3_max_page_size_instructions: > + API가 응답할 최대 페이지 크기를 설정합니다. 단일 페이지에 더 많은 값을 반환하는 API 요청은 수행할 수 없습니다. + setting_apiv3_max_page_size_warning: > + 필요한 이유가 확실한 경우에만 이 값을 변경하세요. 높은 값으로 설정하면 성능에 상당한 영향을 미치며, 페이지당 옵션보다 낮은 값은 페이지가 매겨진 보기에서 오류를 일으킵니다. + setting_apiv3_docs: "설명서" + setting_apiv3_docs_enabled: "문서 페이지 활성화" + setting_apiv3_docs_enabled_instructions_html: > + 문서 페이지가 활성화되면 %{link}에서 APIv3 문서의 대화식 보기를 얻을 수 있습니다. + setting_apiv3_docs_enabled_instructions_warning: > + 프로덕션 시스템에서 API 문서를 활성화하면 주의하지 않을 경우 중요한 정보가 노출되거나 실수로 데이터가 손실될 수 있다는 점에 유의하세요. 이 설정은 개발 목적으로만 활성화하는 것이 좋습니다. + setting_attachment_whitelist: "첨부 파일 업로드 허용 목록" + setting_email_delivery_method: "이메일 배달 방법" + setting_emails_salutation: "이메일의 주소 사용자:" + setting_oauth_allow_remapping_of_existing_users: "기존 사용자의 다시 매핑 허용" + setting_sendmail_location: "sendmail 실행 파일의 위치" + setting_sendmail_arguments: "sendmail의 인수" + setting_smtp_enable_starttls_auto: "사용 가능한 경우 자동으로 STARTTLS 사용" + setting_smtp_ssl: "SSL 연결 사용" + setting_smtp_address: "SMTP 서버" + setting_smtp_port: "SMTP 포트" + setting_smtp_authentication: "SMTP 인증" + setting_smtp_user_name: "SMTP 사용자 이름" + setting_smtp_password: "SMTP 비밀번호" + setting_smtp_domain: "SMTP HELO 도메인" + setting_activity_days_default: "프로젝트 작업에 표시되는 기간(일)" + setting_api_tokens_enabled: "API 토큰 활성화" + setting_api_tokens_enabled_caption: > + 사용자가 계정 설정에서 개인 API 토큰을 만들 수 있는지 여부를 결정합니다. 해당 토큰은 APIv3 및 MCP와 같은 OpenProject의 다양한 API에 액세스하는 데 사용할 수 있습니다. + setting_app_subtitle: "응용 프로그램 부제목" + setting_app_title: "응용 프로그램 제목" + setting_attachment_max_size: "첨부 파일 최대 크기" + setting_show_work_package_attachments: "기본적으로 파일 탭에 첨부 파일 표시" + setting_antivirus_scan_mode: "스캔 모드" + setting_antivirus_scan_action: "감염된 파일 작업" + setting_autofetch_changesets: "Autofetch 리포지토리 변경 사항" + setting_autologin: "자동 로그인" + setting_available_languages: "사용 가능한 언어" + setting_bcc_recipients: "숨은 참조 받는 사람(bcc)" + setting_brute_force_block_after_failed_logins: "이 로그인 시도 실패 횟수를 넘으면 사용자 차단" + setting_brute_force_block_minutes: "사용자가 다음 시간 동안 차단되었습니다." + setting_cache_formatted_text: "캐시 서식 있는 텍스트" + setting_use_wysiwyg_description: "기본적으로 모든 사용자에 대한 CKEditor5 WYSIWYG 편집기를 활성화하려면 선택하세요. CKEditor는 GFM Markdown용 기능을 제한했습니다." + setting_column_options: "기본 작업 패키지 목록 열" + setting_commit_fix_keywords: "키워드 수정" + setting_commit_logs_encoding: "커밋 메시지 인코딩" + setting_commit_logtime_activity_id: "기록된 시간의 작업" + setting_commit_logtime_enabled: "시간 로깅 사용" + setting_commit_ref_keywords: "키워드 참조" + setting_consent_time: "동의 시간" + setting_consent_info: "동의 정보 텍스트" + setting_consent_required: "동의 필요" + setting_consent_decline_mail: "동의 연락처 메일 주소" + setting_cross_project_work_package_relations: "교차 프로젝트 작업 패키지 관계 허용" + setting_first_week_of_year: "1년의 첫 주 기준" + setting_date_format: "날짜" + setting_default_language: "기본 언어" + setting_default_projects_modules: "새 프로젝트에 대해 기본적으로 활성화된 모듈" + setting_default_projects_public: "새 프로젝트는 기본적으로 공용입니다." + setting_disable_password_login: "암호 인증 비활성화" + setting_diff_max_lines_displayed: "표시되는 최대 차이점 줄 수" + setting_omniauth_direct_login_provider: "직접 로그인 SSO 공급자" + setting_display_subprojects_work_packages: "기본적으로 기본 프로젝트의 하위 프로젝트 작업 패키지 표시" + setting_duration_format: "기간 형식" + setting_duration_format_hours_only: "시간만" + setting_duration_format_days_and_hours: "일 및 시간" + setting_duration_format_instructions: "작업, 남은 작업 및 소요 시간이 표시되는 방식을 정의합니다." + setting_emails_footer: "이메일 바닥글" + setting_emails_header: "이메일 머리글" + setting_email_login: "이메일로 로그인하기" + setting_enabled_scm: "활성화된 SCM" + setting_enabled_projects_columns: "기본적으로 표시되는 프로젝트 목록의 열" + setting_feeds_enabled: "피드 사용" + setting_ical_enabled: "iCalendar 구독 활성화" + setting_feeds_limit: "피드 콘텐츠 제한" + setting_file_max_size_displayed: "인라인에 표시되는 텍스트 파일의 최대 크기" + setting_host_name: "호스트 이름" + setting_collaborative_editing_hocuspocus_url: "Hocuspocus 서버 URL" + setting_collaborative_editing_hocuspocus_secret: "Hocuspocus 서버 비밀번호" + setting_hours_per_day: "일별 시간" + setting_hours_per_day_explanation: >- + 일 및 시간으로 기간을 표시할 때 "하루"로 간주되는 시간을 정의합니다(예: 하루가 8시간이면 32시간은 4일이 됩니다). + setting_invitation_expiration_days: "활성화 이메일 만료 기간:" + setting_invitation_expiration_days_caption: "활성화 이메일이 만료되기까지의 일수입니다." + setting_work_package_done_ratio: "진행률 계산 모드" + setting_work_package_done_ratio_field: "작업 기반" + setting_work_package_done_ratio_field_caption_html: >- + 완료 %는 원하는 값으로 자유롭게 설정할 수 있습니다. 선택적으로 작업에 대한 값을 입력하면 남은 작업이 자동으로 나옵니다. + setting_work_package_done_ratio_status: "상태 기반" + setting_work_package_done_ratio_status_caption_html: >- + 각 상태에는 완료 % 값이 연관되어 있습니다. 상태를 변경하면 완료 %가 변경됩니다. + setting_work_package_done_ratio_explanation_html: > + 작업 기반 모드에서 완료 %는 어떤 값으로든 자유롭게 설정할 수 있습니다. 선택적으로 작업에 대한 값을 입력하면 남은 작업이 자동으로 파생됩니다. 상태 기반 모드에서는 각 상태에 완료 % 값이 연결되어 있습니다. 상태를 변경하면 완료 %도 변경됩니다. + setting_work_package_properties: "작업 패키지 속성" + setting_work_package_startdate_is_adddate: "새 작업 패키지에 대한 시작 날짜로 현재 날짜 사용" + setting_work_packages_projects_export_limit: "작업 패키지/프로젝트 내보내기 제한" + setting_journal_aggregation_time_minutes: "집계된 사용자 작업" + setting_log_requesting_user: "모든 요청에 대한 로그 사용자 로그인, 이름 및 메일 주소" + setting_login_required: "인증이 필요함" + setting_login_required_caption: "이 옵션을 선택하면 애플리케이션에 대한 모든 요청이 인증되어야 합니다." + setting_lost_password: "암호 재설정 활성화" + setting_lost_password_caption: "이 옵션을 선택하면 사용자가 자신의 암호를 재설정할 수 있습니다." + setting_mail_from: "발신 이메일 주소" + setting_mail_handler_api_key: "API 키" + setting_mail_handler_body_delimiters: "이러한 줄 중 하나 다음에 이메일 자르기" + setting_mail_handler_body_delimiter_regex: "이 정규식에 일치하는 이메일을 자름" + setting_mail_handler_ignore_filenames: "무시된 메일 첨부 파일" + setting_new_project_user_role_id: "프로젝트를 만드는 비관리자 사용자에게 지정된 역할" + setting_new_project_send_confirmation_email: "새 프로젝트 생성 시 작성자에게 알림 보내기" + setting_new_project_notification_text: "알림 텍스트" + setting_password_active_rules: "활성 문자 클래스" + setting_password_count_former_banned: "재사용 금지된 최근에 사용한 암호 수" + setting_password_days_valid: "암호 변경을 적용할 경과 일 수" + setting_password_min_length: "최소 길이" + setting_password_min_adhered_rules: "최소 필수 클래스 수" + setting_per_page_options: "페이지당 개체 옵션" + setting_percent_complete_on_status_closed: "상태가 닫힘인 경우 완료 %" + setting_percent_complete_on_status_closed_no_change: "변경 없음" + setting_percent_complete_on_status_closed_no_change_caption_html: >- + 완료 % 값은 작업 패키지가 닫혀도 변경되지 않습니다. + setting_percent_complete_on_status_closed_set_100p: "100%로 자동 설정" + setting_percent_complete_on_status_closed_set_100p_caption: >- + 닫힌 작업 패키지는 완료로 간주됩니다. + setting_plain_text_mail: "일반 텍스트 메일(HTML 없음)" + setting_protocol: "프로토콜" + setting_project_gantt_query: "프로젝트 포트폴리오 Gantt 보기" + setting_project_gantt_query_text: "프로젝트 개요 페이지에서 Gantt 차트를 표시하는 데 사용되는 쿼리를 수정할 수 있습니다." + setting_security_badge_displayed: "보안 배지 표시" + setting_registration_footer: "등록 꼬리말" + setting_registration_footer_caption: "이 텍스트는 등록 페이지 바닥글에 표시됩니다. HTML 편집기를 사용하여, 선택한 각 언어에 대한 텍스트의 서식을 지정하세요." + setting_repositories_automatic_managed_vendor: "자동 리포지토리 공급업체 유형" + setting_repositories_encodings: "리포지토리 인코딩" + setting_repository_storage_cache_minutes: "리포지토리 디스크 크기 캐시" + setting_repository_checkout_display: "체크아웃 지침 표시" + setting_repository_checkout_base_url: "체크아웃 기본 URL" + setting_repository_checkout_text: "체크아웃 지침 텍스트" + setting_repository_log_display_limit: "파일 로그 표시되는 최대 수정 수" + setting_repository_truncate_at: "리포지토리 브라우저에 표시되는 최대 파일 수" + setting_self_registration: "자체 등록" + setting_self_registration_caption: > + 사용자에 대한 자체 등록 메커니즘을 선택하세요. 일부 옵션은 사용자가 이 인스턴스에 대해 자신의 계정을 활성화하도록 허용하므로, 선택하는 설정에 주의해 주세요. + setting_self_registration_warning: > + 사용자가 자신의 계정을 활성화할 수 있습니다. 이 옵션은 모든 공개 프로젝트와 해당 콘텐츠에 대한 액세스 권한을 사용자에게 부여합니다. 민감하거나 개인적인 데이터가 공개 프로젝트에서 노출되지 않도록 주의해 주세요. + setting_self_registration_disabled: "사용 안 함" + setting_self_registration_disabled_caption: > + 자체적으로 등록할 수 있는 계정이 없습니다. 새로운 사용자를 생성할 수 있는 글로벌 권한을 가진 사용자 및 관리자만 새로운 계정을 생성할 수 있습니다. + setting_self_registration_activation_by_email: "이메일로 계정 활성화" + setting_self_registration_activation_by_email_caption: > + 사용자가 이메일 주소를 확인한 후 직접 등록하고 계정을 활성화할 수 있습니다. 활성화 프로세스에 대한 조정 권한이 관리자에게 없습니다. + setting_self_registration_automatic_activation: "자동 계정 활성화" + setting_self_registration_automatic_activation_caption: > + 사용자가 직접 등록할 수 있습니다. 사용자의 계정은 추가 조치 없이 즉시 활성화됩니다. 활성화 프로세스에 대한 조정 권한이 관리자에게 없습니다. + setting_self_registration_manual_activation: "수동 계정 활성화" + setting_self_registration_manual_activation_caption: > + 사용자가 직접 등록할 수 있습니다. 사용자를 생성하거나 관리할 수 있는 글로벌 권한을 가진 사용자 또는 관리자가 계정을 활성화할 때까지 해당 계정은 대기 상태로 유지됩니다. + setting_session_ttl: "비활성화된 후 세션 만료 시간" + setting_session_ttl_hint: "5 아래 값은 사용 안함으로 작동합니다." + setting_session_ttl_enabled: "세션 만료됨" + setting_start_of_week: "주의 시작:" + setting_sys_api_enabled: "리포지토리 관리 웹 서비스 사용" + setting_sys_api_description: "리포지토리 관리 웹 서비스는 리포지토리에 액세스하기 위한 통합 및 사용자 인증을 제공합니다." + setting_time_format: "시간" + setting_total_percent_complete_mode: "완료 % 계층 합계 계산" + setting_total_percent_complete_mode_work_weighted_average: "작업별 가중치 적용됨" + setting_total_percent_complete_mode_work_weighted_average_caption_html: >- + 총 완료 %는 계층에 있는 각 작업 패키지의 작업에 따라 가중치가 적용됩니다. 작업이 없는 작업 패키지는 무시됩니다. + setting_total_percent_complete_mode_simple_average: "단순 평균" + setting_total_percent_complete_mode_simple_average_caption_html: >- + 작업은 무시되며 총 완료 %는 계층에 있는 작업 패키지의 완료 % 값에 대한 단순 평균이 됩니다. + setting_accessibility_mode_for_anonymous: "익명 사용자에 대해 접근성 모드 사용" + setting_user_format: "사용자 이름 형식" + setting_user_default_timezone: "사용자의 기본 표준 시간대" + setting_users_deletable_by_admins: "관리자가 삭제 가능한 사용자 계정" + setting_users_deletable_by_self: "자신의 계정을 삭제하도록 허용된 사용자" + setting_welcome_text: "환영 블록 텍스트" + setting_welcome_title: "환영 블록 제목" + setting_welcome_on_homescreen: "홈 화면에 환영 블록 표시" + setting_work_package_list_default_highlighting_mode: "기본 강조 표시 모드" + setting_work_package_list_default_highlighted_attributes: "기본 인라인 강조 표시 특성" + setting_working_days: "근무일" settings: errors: - not_writable: 이 설정은 쓰기 가능하지 않으며 시스템 관리자만 변경할 수 있습니다. + not_writable: "이 설정은 쓰기 가능하지 않으며 시스템 관리자만 변경할 수 있습니다." failed_to_update: "'%{name}' 설정을 업데이트할 수 없습니다: %{message}" authentication: - login: 로그인 - registration: 등록 - sso: SSO(Single Sign-On) - omniauth_direct_login_hint_html: '이 옵션이 활성화된 경우, 로그인 요청은 구성된 omniauth 공급자로 리디렉션됩니다. - 로그인 드롭다운 및 로그인 페이지가 비활성화됩니다.
참고: 또한 암호 로그인을 비활성화하지 - 않는 경우에는 이 옵션이 활성화된 상태에서 사용자가 %{internal_path} 로그인 페이지를 방문하여 내부에서 - 계속 로그인할 수 있습니다. - - ' - remapping_existing_users_hint: '활성화된 경우, 사용자가 이전에 해당 공급자를 통해 로그인한 적이 없더라도, 구성된 - 모든 ID 공급자가 사용자 이름을 기반으로 기존 사용자에 로그인하도록 허용합니다. 이 옵션은 OpenProject 인스턴스를 새 SSO - 공급자로 마이그레이션할 때 유용할 수 있지만 인스턴스의 일부 사용자가 신뢰하지 않는 공급자를 이용할 때는 권장되지 않습니다. - - ' + login: "로그인" + registration: "등록" + sso: "SSO(Single Sign-On)" + omniauth_direct_login_hint_html: > + 이 옵션이 활성화된 경우, 로그인 요청은 구성된 omniauth 공급자로 리디렉션됩니다. 로그인 드롭다운 및 로그인 페이지가 비활성화됩니다.
참고: 또한 암호 로그인을 비활성화하지 않는 경우에는 이 옵션이 활성화된 상태에서 사용자가 %{internal_path} 로그인 페이지를 방문하여 내부에서 계속 로그인할 수 있습니다. + remapping_existing_users_hint: > + 활성화된 경우, 사용자가 이전에 해당 공급자를 통해 로그인한 적이 없더라도, 구성된 모든 ID 공급자가 사용자 이름을 기반으로 기존 사용자에 로그인하도록 허용합니다. 이 옵션은 OpenProject 인스턴스를 새 SSO 공급자로 마이그레이션할 때 유용할 수 있지만 인스턴스의 일부 사용자가 신뢰하지 않는 공급자를 이용할 때는 권장되지 않습니다. attachments: - whitelist_text_html: '업로드된 파일의 유효한 파일 확장명 및/또는 MIME 형식 목록을 정의합니다.
파일 확장명(예: - %{ext_example}) 또는 MIME 형식(예: %{mime_example})을 - 입력합니다.
모든 파일 형식을 업로드할 수 있도록 허용하려면 비워 둡니다. 여러 값이 허용됩니다(각 값에 대해 한 줄). - - ' - show_work_package_attachments: '이 옵션을 비활성화하면 새 프로젝트의 작업 패키지 파일 탭에서 첨부 파일 목록이 - 숨겨집니다. 작업 패키지 설명에 첨부된 파일은 내부 첨부 파일 저장소에 계속 업로드됩니다. - - ' + whitelist_text_html: > + 업로드된 파일의 유효한 파일 확장명 및/또는 MIME 형식 목록을 정의합니다.
파일 확장명(예: %{ext_example}) 또는 MIME 형식(예: %{mime_example})을 입력합니다.
모든 파일 형식을 업로드할 수 있도록 허용하려면 비워 둡니다. 여러 값이 허용됩니다(각 값에 대해 한 줄). + show_work_package_attachments: > + 이 옵션을 비활성화하면 새 프로젝트의 작업 패키지 파일 탭에서 첨부 파일 목록이 숨겨집니다. 작업 패키지 설명에 첨부된 파일은 내부 첨부 파일 저장소에 계속 업로드됩니다. antivirus: - title: 바이러스 검사 - clamav_ping_failed: ClamAV 데몬을 연결하지 못했습니다. 구성을 다시 확인하고 다시 시도하세요. - remaining_quarantined_files_html: '바이러스 검사가 비활성화되었습니다. %{file_count}개는 격리된 상태로 - 유지됩니다. 격리된 파일을 검토하려면 다음 링크를 참조하세요: %{link} - - ' - remaining_scan_complete_html: '나머지 파일을 검사했습니다. %{file_count}개가 격리되었습니다. 격리 페이지로 - 리디렉션되는 중입니다. 이 페이지에서 격리된 파일을 삭제하거나 무시하세요. - - ' - remaining_rescanned_files: '바이러스 검사가 활성화되었습니다. 이전에 업로드되었지만 아직 검사해야 하는 %{file_count}개가 - 있습니다. 이 프로세스는 백그라운드에서 예약되었습니다. 검사하는 동안 파일에 계속 액세스할 수 있습니다. - - ' + title: "바이러스 검사" + clamav_ping_failed: "ClamAV 데몬을 연결하지 못했습니다. 구성을 다시 확인하고 다시 시도하세요." + remaining_quarantined_files_html: > + 바이러스 검사가 비활성화되었습니다. %{file_count}개는 격리된 상태로 유지됩니다. 격리된 파일을 검토하려면 다음 링크를 참조하세요: %{link} + remaining_scan_complete_html: > + 나머지 파일을 검사했습니다. %{file_count}개가 격리되었습니다. 격리 페이지로 리디렉션되는 중입니다. 이 페이지에서 격리된 파일을 삭제하거나 무시하세요. + remaining_rescanned_files: > + 바이러스 검사가 활성화되었습니다. 이전에 업로드되었지만 아직 검사해야 하는 %{file_count}개가 있습니다. 이 프로세스는 백그라운드에서 예약되었습니다. 검사하는 동안 파일에 계속 액세스할 수 있습니다. actions: - delete: 파일 삭제 - quarantine: 파일 격리 - instructions_html: '바이러스가 발견된 파일에 수행할 작업을 선택하세요:
  • %{quarantine_option}: - 파일을 격리하여 사용자가 액세스하지 못하도록 합니다. 관리자는 관리에서 격리된 파일을 검토하고 삭제할 수 있습니다.
  • %{delete_option}: - 파일을 즉시 삭제합니다.
- - ' + delete: "파일 삭제" + quarantine: "파일 격리" + instructions_html: > + 바이러스가 발견된 파일에 수행할 작업을 선택하세요:
  • %{quarantine_option}: 파일을 격리하여 사용자가 액세스하지 못하도록 합니다. 관리자는 관리에서 격리된 파일을 검토하고 삭제할 수 있습니다.
  • %{delete_option}: 파일을 즉시 삭제합니다.
modes: clamav_socket_html: 'clamd 데몬의 소켓을 입력하세요. 예: %{example}' clamav_host_html: '호스트 이름 및 clamd 데몬의 포트를 콜론으로 구분하여 입력하세요. 예: %{example}' - description_html: '바이러스 백신 스캐너 통합이 작동되어야 하는 모드를 선택하세요.
  • %{disabled_option}: - 업로드된 파일은 바이러스 검사를 받지 않습니다.
  • %{socket_option}: OpenProject와 - 동일한 서버에서 ClamAV를 설정했으며 스캔 데몬 clamd가 백그라운드에서 실행 중입니다.
  • %{host_option}: - 외부 바이러스 스캔 호스트에 파일을 스트리밍하고 있습니다.
- - ' - brute_force_prevention: 자동화된 사용자 차단 + description_html: > + 바이러스 백신 스캐너 통합이 작동되어야 하는 모드를 선택하세요.
  • %{disabled_option}: 업로드된 파일은 바이러스 검사를 받지 않습니다.
  • %{socket_option}: OpenProject와 동일한 서버에서 ClamAV를 설정했으며 스캔 데몬 clamd가 백그라운드에서 실행 중입니다.
  • %{host_option}: 외부 바이러스 스캔 호스트에 파일을 스트리밍하고 있습니다.
+ brute_force_prevention: "자동화된 사용자 차단" date_format: - first_date_of_week_and_year_set: '"%{day_of_week_setting_name}" 또는 "%{first_week_setting_name}" - 옵션 중 하나가 설정되었다면, 프론트엔드에서의 충돌을 방지하기 위해 나머지 하나도 설정해야 합니다. - - ' - first_week_of_year_text_html: '해당 연도의 첫 번째 주에 포함된 1월의 날짜를 선택하세요. 이 값은 주의 첫째 - 날과 함께 1년의 총 주 수를 결정합니다. 자세한 내용은 이 항목에 대한 문서를 - 참조하세요. - - ' + first_date_of_week_and_year_set: > + "%{day_of_week_setting_name}" 또는 "%{first_week_setting_name}" 옵션 중 하나가 설정되었다면, 프론트엔드에서의 충돌을 방지하기 위해 나머지 하나도 설정해야 합니다. + first_week_of_year_text_html: > + 해당 연도의 첫 번째 주에 포함된 1월의 날짜를 선택하세요. 이 값은 주의 첫째 날과 함께 1년의 총 주 수를 결정합니다. 자세한 내용은 이 항목에 대한 문서를 참조하세요. experimental: - save_confirmation: 주의! 데이터 손실 위험! OpenProject 설치를 중단하고 일부 데이터를 손실해도 괜찮을 경우에만 - 실험적 기능을 활성화하세요. - warning_toast: 기능 플래그는 아직 개발 중인 기능을 활성화하는 설정이며, 테스트 목적으로만 사용해야 합니다. 중요한 데이터가 - 있는 OpenProject 설치에서는 절대 활성화하지 말아야 합니다. 이러한 기능은 데이터를 손상시킬 가능성이 매우 높습니다. 사용 - 시 책임은 사용자에게 있습니다. + save_confirmation: 주의! 데이터 손실 위험! OpenProject 설치를 중단하고 일부 데이터를 손실해도 괜찮을 경우에만 실험적 기능을 활성화하세요. + warning_toast: 기능 플래그는 아직 개발 중인 기능을 활성화하는 설정이며, 테스트 목적으로만 사용해야 합니다. 중요한 데이터가 있는 OpenProject 설치에서는 절대 활성화하지 말아야 합니다. 이러한 기능은 데이터를 손상시킬 가능성이 매우 높습니다. 사용 시 책임은 사용자에게 있습니다. feature_flags: 기능 플래그 - general: 일반 + general: "일반" highlighting: mode_long: - inline: 특성을 인라인으로 강조 표시 - none: 강조 표시 없음 - status: 상태별 전체 행 - type: 유형별 전체 행 - priority: 우선 순위별 전체 행 + inline: "특성을 인라인으로 강조 표시" + none: "강조 표시 없음" + status: "상태별 전체 행" + type: "유형별 전체 행" + priority: "우선 순위별 전체 행" icalendar: - enable_subscriptions_text_html: 필요한 권한이 있는 사용자가 OpenProject 캘린더를 구독하고 외부 캘린더 - 클라이언트를 통해 작업 패키지 정보에 액세스하도록 허용합니다. 참고: 활성화하기 전에 iCalendar 구독에 대해 읽고 잠재적인 보안 위험을 파악하세요. + enable_subscriptions_text_html: 필요한 권한이 있는 사용자가 OpenProject 캘린더를 구독하고 외부 캘린더 클라이언트를 통해 작업 패키지 정보에 액세스하도록 허용합니다. 참고: 활성화하기 전에 iCalendar 구독에 대해 읽고 잠재적인 보안 위험을 파악하세요. language_name_being_default: "%{language_name}(기본값)" notifications: - events_explanation: 이메일을 보낼 이벤트를 관리합니다. 작업 패키지에 대한 알림은 각 사용자에 대해 구체적으로 구성할 수 - 있으므로 작업 패키지는 이 목록에 포함되지 않습니다. - delay_minutes_explanation: 인앱 알림이 구성된 사용자가 메일이 전송되기 전에 애플리케이션 내에서 알림을 확인할 수 - 있도록 이메일 전송이 지연될 수 있습니다. 애플리케이션 내에서 알림을 읽은 사용자는 이미 읽은 알림에 대한 이메일을 받지 않습니다. - other: 기타 - passwords: 암호 + events_explanation: "이메일을 보낼 이벤트를 관리합니다. 작업 패키지에 대한 알림은 각 사용자에 대해 구체적으로 구성할 수 있으므로 작업 패키지는 이 목록에 포함되지 않습니다." + delay_minutes_explanation: "인앱 알림이 구성된 사용자가 메일이 전송되기 전에 애플리케이션 내에서 알림을 확인할 수 있도록 이메일 전송이 지연될 수 있습니다. 애플리케이션 내에서 알림을 읽은 사용자는 이미 읽은 알림에 대한 이메일을 받지 않습니다." + other: "기타" + passwords: "암호" project_attributes: - heading: 프로젝트 특성 - label_for_all_projects: 모든 프로젝트 - label_new_attribute: 프로젝트 특성 - label_new_section: 섹션 - label_edit_section: 제목 편집 - label_section_actions: 섹션 작업 - heading_description: 이러한 프로젝트 특성은 각 프로젝트의 개요 페이지에 표시됩니다. 새 특성을 추가하고, 섹션으로 그룹화하고, - 원하는 대로 재정렬할 수 있습니다. 이러한 특성은 활성화 또는 비활성화할 수 있지만 프로젝트 수준에서 재정렬할 수는 없습니다. - label_project_custom_field_actions: 프로젝트 특성 작업 - label_no_project_custom_fields: 이 섹션에 정의된 프로젝트 특성이 없습니다 + heading: "프로젝트 특성" + label_for_all_projects: "모든 프로젝트" + label_new_attribute: "프로젝트 특성" + label_new_section: "섹션" + label_edit_section: "제목 편집" + label_section_actions: "섹션 작업" + heading_description: "이러한 프로젝트 특성은 각 프로젝트의 개요 페이지에 표시됩니다. 새 특성을 추가하고, 섹션으로 그룹화하고, 원하는 대로 재정렬할 수 있습니다. 이러한 특성은 활성화 또는 비활성화할 수 있지만 프로젝트 수준에서 재정렬할 수는 없습니다." + label_project_custom_field_actions: "프로젝트 특성 작업" + label_no_project_custom_fields: "이 섹션에 정의된 프로젝트 특성이 없습니다" edit: - description: 이 프로젝트 특성에 대한 변경 사항은 이 특성이 활성화된 모든 프로젝트에 반영됩니다. 필수 특성은 프로젝트별로 - 비활성화할 수 없습니다. + description: "이 프로젝트 특성에 대한 변경 사항은 이 특성이 활성화된 모든 프로젝트에 반영됩니다. 필수 특성은 프로젝트별로 비활성화할 수 없습니다." new: - heading: 새 특성 - description: 이 프로젝트 특성에 대한 변경 사항은 이 특성이 활성화된 모든 프로젝트에 반영됩니다. 필수 특성은 프로젝트별로 - 비활성화할 수 없습니다. + heading: "새 특성" + description: "이 프로젝트 특성에 대한 변경 사항은 이 특성이 활성화된 모든 프로젝트에 반영됩니다. 필수 특성은 프로젝트별로 비활성화할 수 없습니다." sections: display_representation: overview: - label: '프로젝트 속성이 표시되는 위치:' + label: "프로젝트 속성이 표시되는 위치:" main_area: - label: 기본 영역 - description: 프로젝트 개요의 기본 섹션에서 모든 프로젝트 특성을 개별 위젯으로 추가합니다. + label: "기본 영역" + description: "프로젝트 개요의 기본 섹션에서 모든 프로젝트 특성을 개별 위젯으로 추가합니다." side_panel: - label: 사이드 패널 - description: 프로젝트 개요의 오른쪽 사이드 패널 내 섹션에 모든 프로젝트 특성을 추가합니다. + label: "사이드 패널" + description: "프로젝트 개요의 오른쪽 사이드 패널 내 섹션에 모든 프로젝트 특성을 추가합니다." project_initiation_request: - header_description: 'OpenProject는 프로젝트 관리자가 프로젝트 시작 요청을 작성하는 데 도움이 되는 단계별 마법사를 - 생성할 수 있습니다. 어떤 프로젝트 특성을 포함할지 선택하고 PDF 아티팩트를 결과로 생성할 수 있습니다. - - ' + header_description: > + OpenProject는 프로젝트 관리자가 프로젝트 시작 요청을 작성하는 데 도움이 되는 단계별 마법사를 생성할 수 있습니다. 어떤 프로젝트 특성을 포함할지 선택하고 PDF 아티팩트를 결과로 생성할 수 있습니다. status: submitted: "%{wizard_name}이(가) 제출되었습니다" - submitted_description: 아래 버튼을 클릭하여 제출 프로세스에 대한 작업 패키지로 이동합니다. - submitted_button: 제출 요청 열기 + submitted_description: "아래 버튼을 클릭하여 제출 프로세스에 대한 작업 패키지로 이동합니다." + submitted_button: "제출 요청 열기" not_completed: "%{wizard_name}이(가) 아직 완료되지 않음" - not_completed_description: 특성을 채워 필요한 정보를 제공하고 프로젝트를 시작하세요. + not_completed_description: "특성을 채워 필요한 정보를 제공하고 프로젝트를 시작하세요." wizard_status_button: - project_initiation_request: 프로젝트 시작 요청 열기 - project_creation_wizard: 프로젝트 생성 마법사 열기 - project_mandate: 프로젝트 위임 열기 + project_initiation_request: "프로젝트 시작 요청 열기" + project_creation_wizard: "프로젝트 생성 마법사 열기" + project_mandate: "프로젝트 위임 열기" blankslate: - title: 시작 요청이 활성화되지 않음 - description: OpenProject는 프로젝트 관리자가 프로젝트 시작 요청을 작성하는 데 도움이 되는 단계별 마법사를 생성할 - 수 있습니다. 어떤 프로젝트 특성을 포함할지, 출력 문서로 무엇을 수행할지 사용자가 선택할 수 있습니다. 마법사 구성을 시작하려면 - 여기에서 활성화하세요. + title: "시작 요청이 활성화되지 않음" + description: "OpenProject는 프로젝트 관리자가 프로젝트 시작 요청을 작성하는 데 도움이 되는 단계별 마법사를 생성할 수 있습니다. 어떤 프로젝트 특성을 포함할지, 출력 문서로 무엇을 수행할지 사용자가 선택할 수 있습니다. 마법사 구성을 시작하려면 여기에서 활성화하세요." disable_dialog: - title: 프로젝트 시작 요청 비활성화 - heading: 이 프로젝트 시작 요청을 비활성화하시겠습니까? - confirmation_message: 이 템플릿을 기반으로 하는 새 프로젝트에는 시작 요청 마법사를 더 이상 사용할 수 없습니다. - 프로젝트 관리자와 프로젝트 소유자는 프로젝트 개요에서 관련 정보를 수동으로 구성하고 작성해야 합니다. - checkbox_message: 이 작업은 되돌릴 수 없음을 이해합니다 + title: "프로젝트 시작 요청 비활성화" + heading: "이 프로젝트 시작 요청을 비활성화하시겠습니까?" + confirmation_message: "이 템플릿을 기반으로 하는 새 프로젝트에는 시작 요청 마법사를 더 이상 사용할 수 없습니다. 프로젝트 관리자와 프로젝트 소유자는 프로젝트 개요에서 관련 정보를 수동으로 구성하고 작성해야 합니다." + checkbox_message: "이 작업은 되돌릴 수 없음을 이해합니다" name: - artifact_name: 아티팩트 이름 - artifact_name_caption: 프로젝트 관리 프레임워크에서 권장하는 이 아티팩트의 이름을 선택합니다. + artifact_name: "아티팩트 이름" + artifact_name_caption: "프로젝트 관리 프레임워크에서 권장하는 이 아티팩트의 이름을 선택합니다." options: - project_initiation_request: 프로젝트 시작 요청 - project_creation_wizard: 프로젝트 생성 마법사 - project_mandate: 프로젝트 위임 + project_initiation_request: "프로젝트 시작 요청" + project_creation_wizard: "프로젝트 생성 마법사" + project_mandate: "프로젝트 위임" submission: - description_template: "**이 작업 패키지는 %{wizard_name} 워크플로를 완료하면 자동으로 생성됩니다.** - 제출된 모든 정보가 포함된 PDF 아티팩트가 생성되어 참조 및 감사 목적으로 이 작업 패키지에 첨부되었습니다. 시작 단계를 업데이트하거나 - 다시 실행해야 하는 경우 아래 링크를 사용하여 언제든지 마법사를 다시 열 수 있습니다.\n" - description: 사용자가 프로젝트 시작 요청을 제출하면 요청 아티팩트가 PDF 파일로 첨부된 새 작업 패키지가 생성됩니다. 아래 - 설정은 이 새 작업 패키지의 유형, 상태 및 담당자를 정의합니다. - work_package_type: 작업 패키지 유형 - work_package_type_caption: 완료된 아티팩트를 저장하는 데 사용할 작업 패키지 유형입니다. - status_when_submitted: 제출 시 상태 - status_when_submitted_caption: 요청이 제출되면 생성된 작업 패키지가 전환되는 상태입니다. - send_confirmation_email: 프로젝트 시작 요청을 제출한 사용자에게 확인 이메일 보내기 - assignee: 제출 시 담당자 - assignee_caption_html: 또한 이 프로젝트 특성에 할당된 사용자 또는 그룹은 새 작업 패키지의 담당자가 됩니다. 이 - 목록에는 사용자 유형 전용의 활성 프로젝트 특성이 포함되어 있습니다. - confirmation_email_text: 확인 이메일 텍스트 - confirmation_email_default: |- - 안녕하세요, - - **%{project_name}**에 대한 프로젝트 시작 요청을 제출하셨습니다. 이제 검토를 기다리고 있습니다. - 요청이 포함된 작업 패키지에 액세스하려면 아래 링크를 클릭하세요. - work_package_comment: 작업 패키지 코멘트 - work_package_comment_caption: 위에서 선택한 담당자가 코멘트에서 자동으로 @멘션됩니다. - work_package_comment_default: "%{project_name}**에 대한 프로젝트 시작 요청이 제출되어 검토를 - 기다리고 있습니다." + description_template: > + **이 작업 패키지는 %{wizard_name} 워크플로를 완료하면 자동으로 생성됩니다.** 제출된 모든 정보가 포함된 PDF 아티팩트가 생성되어 참조 및 감사 목적으로 이 작업 패키지에 첨부되었습니다. 시작 단계를 업데이트하거나 다시 실행해야 하는 경우 아래 링크를 사용하여 언제든지 마법사를 다시 열 수 있습니다. + description: "사용자가 프로젝트 시작 요청을 제출하면 요청 아티팩트가 PDF 파일로 첨부된 새 작업 패키지가 생성됩니다. 아래 설정은 이 새 작업 패키지의 유형, 상태 및 담당자를 정의합니다." + work_package_type: "작업 패키지 유형" + work_package_type_caption: "완료된 아티팩트를 저장하는 데 사용할 작업 패키지 유형입니다." + status_when_submitted: "제출 시 상태" + status_when_submitted_caption: "요청이 제출되면 생성된 작업 패키지가 전환되는 상태입니다." + send_confirmation_email: "프로젝트 시작 요청을 제출한 사용자에게 확인 이메일 보내기" + assignee: "제출 시 담당자" + assignee_caption_html: "또한 이 프로젝트 특성에 할당된 사용자 또는 그룹은 새 작업 패키지의 담당자가 됩니다. 이 목록에는 사용자 유형 전용의 활성 프로젝트 특성이 포함되어 있습니다." + confirmation_email_text: "확인 이메일 텍스트" + confirmation_email_default: "안녕하세요,\n\n**%{project_name}**에 대한 프로젝트 시작 요청을 제출하셨습니다. 이제 검토를 기다리고 있습니다.\n요청이 포함된 작업 패키지에 액세스하려면 아래 링크를 클릭하세요." + work_package_comment: "작업 패키지 코멘트" + work_package_comment_caption: "위에서 선택한 담당자가 코멘트에서 자동으로 @멘션됩니다." + work_package_comment_default: "%{project_name}**에 대한 프로젝트 시작 요청이 제출되어 검토를 기다리고 있습니다." project_phase_definitions: - heading: 프로젝트 수명 주기 - heading_description: 프로젝트 수명 주기는 프로젝트 계획에 사용할 수 있는 프로젝트 단계를 정의하며, 각 프로젝트의 개요 - 페이지에 표시됩니다. 이러한 특성은 활성화 또는 비활성화할 수 있지만 프로젝트 수준에서 재정렬할 수는 없습니다. - label_add: 추가 - label_add_description: 프로젝트 단계 정의 추가 + heading: "프로젝트 수명 주기" + heading_description: "프로젝트 수명 주기는 프로젝트 계획에 사용할 수 있는 프로젝트 단계를 정의하며, 각 프로젝트의 개요 페이지에 표시됩니다. 이러한 특성은 활성화 또는 비활성화할 수 있지만 프로젝트 수준에서 재정렬할 수는 없습니다." + label_add: "추가" + label_add_description: "프로젝트 단계 정의 추가" filter: - label: 프로젝트 단계 검색 - section_header: 단계 - non_defined: 현재 정의된 단계가 없습니다. - phase_gates: 프로젝트 게이트 + label: "프로젝트 단계 검색" + section_header: "단계" + non_defined: "현재 정의된 단계가 없습니다." + phase_gates: "프로젝트 게이트" new: - description: 이 프로젝트 단계의 변경 사항은 이 단계가 활성화된 모든 프로젝트에 반영됩니다. - heading: 새로운 단계 - both_gate: 시작 및 완료 게이트 - no_gate: 게이트 없음 - start_gate: 시작 게이트 - start_gate_caption: 단계의 시작 날짜가 있는 게이트 추가 - finish_gate: 완료 게이트 - finish_gate_caption: 단계의 완료 날짜가 있는 게이트 추가 + description: "이 프로젝트 단계의 변경 사항은 이 단계가 활성화된 모든 프로젝트에 반영됩니다." + heading: "새로운 단계" + both_gate: "시작 및 완료 게이트" + no_gate: "게이트 없음" + start_gate: "시작 게이트" + start_gate_caption: "단계의 시작 날짜가 있는 게이트 추가" + finish_gate: "완료 게이트" + finish_gate_caption: "단계의 완료 날짜가 있는 게이트 추가" projects: - missing_dependencies: "%{dependencies}에 의존하는 프로젝트 모듈 %{module}이(가) 확인되었습니다. - 이러한 종속성도 확인해야 합니다." - section_new_projects: 새 프로젝트의 설정 - section_project_overview: 프로젝트 목록의 설정 - session: 세션 + missing_dependencies: "%{dependencies}에 의존하는 프로젝트 모듈 %{module}이(가) 확인되었습니다. 이러한 종속성도 확인해야 합니다." + section_new_projects: "새 프로젝트의 설정" + section_project_overview: "프로젝트 목록의 설정" + session: "세션" user: - default_preferences: 기본 설정 - display_format: 표시 형식 - deletion: 삭제 + default_preferences: "기본 설정" + display_format: "표시 형식" + deletion: "삭제" working_days: - section_work_week: 근무 주 - section_holidays_and_closures: 공휴일 및 휴업일 + section_work_week: "근무 주" + section_holidays_and_closures: "공휴일 및 휴업일" work_packages: - not_allowed_text: 이 페이지를 보는 데 필요한 권한이 없습니다. + not_allowed_text: "이 페이지를 보는 데 필요한 권한이 없습니다." activities: - enable_internal_comments: 내부 코멘트 활성화 - helper_text: 내부 코멘트를 사용하여 내부 팀이 비공개로 서로 커뮤니케이션할 수 있습니다. 이러한 코멘트는 필요한 권한을 가진 - 선택된 역할에만 표시되며 공개적으로 표시되지 않습니다. %{link} + enable_internal_comments: "내부 코멘트 활성화" + helper_text: "내부 코멘트를 사용하여 내부 팀이 비공개로 서로 커뮤니케이션할 수 있습니다. 이러한 코멘트는 필요한 권한을 가진 선택된 역할에만 표시되며 공개적으로 표시되지 않습니다. %{link}" text_formatting: - markdown: Markdown - plain: 일반 텍스트 - status_active: 활성 - status_archived: 보관됨 - status_blocked: 차단됨 + markdown: "Markdown" + plain: "일반 텍스트" + status_active: "활성" + status_archived: "보관됨" + status_blocked: "차단됨" status_invited: 초대됨 status_locked: 잠김 status_registered: 등록됨 status_deleted: 삭제됨 + #Used in array.to_sentence. support: array: - sentence_connector: 그리고 - skip_last_comma: 'false' - text_accessibility_hint: 접근성 모드는 시각장애인, 신체장애인, 혹은 시력이 나쁜 사람들을 위해 디자인 되었습니다. 후자를 - 위해서 중심이 되는 요소는 특별히 하이라이트 됩니다. 이 모드에서는 Backlogs 모듈 사용이 불가능합니다. - text_access_token_hint: 액세스 토큰을 사용하여 OpenProject의 리소스에 대한 외부 응용 프로그램 액세스 권한을 부여할 - 수 있습니다. - text_analyze: '추가 분석: %{subject}' - text_are_you_sure: 계속하시겠습니까? - open_link_in_a_new_tab: 새 탭에서 링크 열기 - text_are_you_sure_continue: 계속하시겠습니까? - text_are_you_sure_with_children: 작업 패키지 및 모든 자식 작업 패키지를 삭제하시겠습니까? - text_are_you_sure_with_project_custom_fields: 이 특성을 삭제하면 모든 프로젝트에서 해당 값도 삭제됩니다. - 계속하시겠습니까? - text_are_you_sure_with_project_life_cycle_step: 이 단계를 삭제하면 모든 프로젝트에서 해당 사용도 삭제됩니다. - 계속하시겠습니까? - text_assign_to_project: 프로젝트에 할당 - text_form_configuration: '작업 패키지 양식으로 표시할 필드를 사용자 지정할 수 있습니다. 해당 도메인의 요구 사항을 반영하도록 - 필드를 자유롭게 그룹화할 수 있습니다. - - ' - text_form_configuration_required_attribute: 특성이 필수로 나타나므로 항상 표시됩니다. - text_caracters_maximum: 최대 %{count}자입니다. - text_caracters_minimum: 최소 %{count}자여야 합니다. - text_comma_separated: 여러 값이 허용됩니다(쉼표로 구분). - text_comment_wiki_page: '위키 페이지에 대한 댓글: %{page}' - text_custom_field_possible_values_info: 각 값당 한 줄 - text_custom_field_hint_activate_per_project: '사용자 지정 필드를 사용하는 경우: 사용자 지정 필드는 프로젝트별로 - 활성화해야 함을 유의하세요. - - ' - text_custom_field_hint_activate_per_project_and_type: '사용자 지정 필드는 작업 패키지 유형 및 프로젝트별로 - 활성화해야 합니다. - - ' - text_project_custom_field_html: 'Enterprise Edition은 프로젝트의 사용자 지정 필드에 대해 다음과 같은 - 기타 추가 기능을 추가합니다:
  • 프로젝트 목록에 프로젝트에 대한 사용자 지정 필드를 추가하여 프로젝트 포트폴리오 - 보기 만들기
- - ' - text_custom_logo_instructions: '로고는 헤더에 맞게 자동으로 크기가 조정됩니다. 최상의 결과를 위해 투명한 130×47px - 이미지에 흰색 로고를 업로드하세요. 이미지 내부에 원하는 만큼 간격을 추가할 수 있습니다. - - ' - text_custom_logo_mobile_instructions: '로고는 헤더에 맞게 자동으로 크기가 조정됩니다. 최상의 결과를 위해 투명한 - 130×33px 이미지에 흰색 로고를 업로드하세요. 이미지 내부에 원하는 만큼 간격을 추가할 수 있습니다. - - ' - text_custom_export_logo_instructions: 'PDF 내보내기에서 표시되는 로고입니다. PNG 또는 JPEG 이미지 파일이어야 - 합니다. 투명 또는 흰색 바탕에 검은색 또는 컬러 로고를 사용하는 것이 좋습니다. - - ' - text_custom_export_cover_instructions: 'PDF 내보내기의 커버 페이지 배경에 나타나는 이미지입니다. 약 800px - 너비, 500px 높이의 PNG 또는 JPEG 이미지 파일이어야 합니다. - - ' - text_custom_export_footer_instructions: 'PDF 내보내기에는 바닥글 왼쪽에 있는 그래픽 요소가 포함됩니다. 이 - 이미지는 너비가 약 200픽셀인 PNG 또는 JPEG 파일이어야 합니다. - - ' - label_custom_export_font_instructions: 'PDF 내보내기에 사용되는 사용자 지정 TrueType(.ttf) 글꼴을 - 업로드하고 관리하세요. 최상의 결과를 얻으려면 동일한 글꼴 패밀리의 일치하는 파일을 사용하세요. 글꼴이 제공되지 않으면 기본 NotoSans - 글꼴이 사용됩니다. - - ' - label_custom_export_images_instructions: 'PDF 내보내기에 사용되는 사용자 지정 이미지 파일을 업로드하고 관리하세요. - - ' - text_custom_export_font_regular_instructions: '일반 텍스트용 글꼴 파일입니다. TTF 형식이어야 하며 필수입니다. - - ' - text_custom_export_font_bold_instructions: '굵은 텍스트용 글꼴 파일입니다. TTF 형식이어야 합니다. - - ' - text_custom_export_font_italic_instructions: '기울임꼴 텍스트용 글꼴 파일입니다. TTF 형식이어야 합니다. - - ' - text_custom_export_font_bold_italic_instructions: '굵은 기울임꼴 텍스트용 글꼴 파일입니다. TTF 형식이어야 - 합니다. - - ' - text_custom_favicon_instructions: '페이지 제목 옆의 브라우저 창/탭에 나타나는 작은 아이콘입니다. 투명한 배경을 가진 - 정사각형 32x32 픽셀 크기의 PNG 이미지 파일이어야 합니다. - - ' - text_custom_touch_icon_instructions: '홈 화면에 북마크를 추가하면 휴대폰 또는 태블릿에 표시되는 아이콘입니다. 정사각형 - 180x180 픽셀 크기의 PNG 이미지 파일이어야 합니다. 이미지의 배경이 투명하지 않은지 확인하세요. 그렇지 않으면 iOS에서 제대로 표시되지 - 않습니다. - - ' - text_database_allows_tsv: 데이터베이스에서 TSVector 허용(옵션) - text_default_administrator_account_changed: 기본 관리자 계정 변경됨 - text_default_encoding: '기본: UTF-8' - text_destroy: 삭제 - text_destroy_with_associated: 삭제할 작업 패키지와 연결된 추가 개체가 있습니다. 이러한 개체의 유형은 다음과 같습니다. - text_destroy_what_to_do: 어떤 작업을 수행하시겠습니까? + sentence_connector: "그리고" + skip_last_comma: "false" + text_accessibility_hint: "접근성 모드는 시각장애인, 신체장애인, 혹은 시력이 나쁜 사람들을 위해 디자인 되었습니다. 후자를 위해서 중심이 되는 요소는 특별히 하이라이트 됩니다. 이 모드에서는 Backlogs 모듈 사용이 불가능합니다." + text_access_token_hint: "액세스 토큰을 사용하여 OpenProject의 리소스에 대한 외부 응용 프로그램 액세스 권한을 부여할 수 있습니다." + text_analyze: "추가 분석: %{subject}" + text_are_you_sure: "계속하시겠습니까?" + open_link_in_a_new_tab: "새 탭에서 링크 열기" + text_are_you_sure_continue: "계속하시겠습니까?" + text_are_you_sure_with_children: "작업 패키지 및 모든 자식 작업 패키지를 삭제하시겠습니까?" + text_are_you_sure_with_project_custom_fields: "이 특성을 삭제하면 모든 프로젝트에서 해당 값도 삭제됩니다. 계속하시겠습니까?" + text_are_you_sure_with_project_life_cycle_step: "이 단계를 삭제하면 모든 프로젝트에서 해당 사용도 삭제됩니다. 계속하시겠습니까?" + text_assign_to_project: "프로젝트에 할당" + text_form_configuration: > + 작업 패키지 양식으로 표시할 필드를 사용자 지정할 수 있습니다. 해당 도메인의 요구 사항을 반영하도록 필드를 자유롭게 그룹화할 수 있습니다. + text_form_configuration_required_attribute: "특성이 필수로 나타나므로 항상 표시됩니다." + text_caracters_maximum: "최대 %{count}자입니다." + text_caracters_minimum: "최소 %{count}자여야 합니다." + text_comma_separated: "여러 값이 허용됩니다(쉼표로 구분)." + text_comment_wiki_page: "위키 페이지에 대한 댓글: %{page}" + text_custom_field_possible_values_info: "각 값당 한 줄" + text_custom_field_hint_activate_per_project: > + 사용자 지정 필드를 사용하는 경우: 사용자 지정 필드는 프로젝트별로 활성화해야 함을 유의하세요. + text_custom_field_hint_activate_per_project_and_type: > + 사용자 지정 필드는 작업 패키지 유형 및 프로젝트별로 활성화해야 합니다. + text_project_custom_field_html: > + Enterprise Edition은 프로젝트의 사용자 지정 필드에 대해 다음과 같은 기타 추가 기능을 추가합니다:
  • 프로젝트 목록에 프로젝트에 대한 사용자 지정 필드를 추가하여 프로젝트 포트폴리오 보기 만들기
+ text_custom_logo_instructions: > + 로고는 헤더에 맞게 자동으로 크기가 조정됩니다. 최상의 결과를 위해 투명한 130×47px 이미지에 흰색 로고를 업로드하세요. 이미지 내부에 원하는 만큼 간격을 추가할 수 있습니다. + text_custom_logo_mobile_instructions: > + 로고는 헤더에 맞게 자동으로 크기가 조정됩니다. 최상의 결과를 위해 투명한 130×33px 이미지에 흰색 로고를 업로드하세요. 이미지 내부에 원하는 만큼 간격을 추가할 수 있습니다. + text_custom_export_logo_instructions: > + PDF 내보내기에서 표시되는 로고입니다. PNG 또는 JPEG 이미지 파일이어야 합니다. 투명 또는 흰색 바탕에 검은색 또는 컬러 로고를 사용하는 것이 좋습니다. + text_custom_export_cover_instructions: > + PDF 내보내기의 커버 페이지 배경에 나타나는 이미지입니다. 약 800px 너비, 500px 높이의 PNG 또는 JPEG 이미지 파일이어야 합니다. + text_custom_export_footer_instructions: > + PDF 내보내기에는 바닥글 왼쪽에 있는 그래픽 요소가 포함됩니다. 이 이미지는 너비가 약 200픽셀인 PNG 또는 JPEG 파일이어야 합니다. + label_custom_export_font_instructions: > + PDF 내보내기에 사용되는 사용자 지정 TrueType(.ttf) 글꼴을 업로드하고 관리하세요. 최상의 결과를 얻으려면 동일한 글꼴 패밀리의 일치하는 파일을 사용하세요. 글꼴이 제공되지 않으면 기본 NotoSans 글꼴이 사용됩니다. + label_custom_export_images_instructions: > + PDF 내보내기에 사용되는 사용자 지정 이미지 파일을 업로드하고 관리하세요. + text_custom_export_font_regular_instructions: > + 일반 텍스트용 글꼴 파일입니다. TTF 형식이어야 하며 필수입니다. + text_custom_export_font_bold_instructions: > + 굵은 텍스트용 글꼴 파일입니다. TTF 형식이어야 합니다. + text_custom_export_font_italic_instructions: > + 기울임꼴 텍스트용 글꼴 파일입니다. TTF 형식이어야 합니다. + text_custom_export_font_bold_italic_instructions: > + 굵은 기울임꼴 텍스트용 글꼴 파일입니다. TTF 형식이어야 합니다. + text_custom_favicon_instructions: > + 페이지 제목 옆의 브라우저 창/탭에 나타나는 작은 아이콘입니다. 투명한 배경을 가진 정사각형 32x32 픽셀 크기의 PNG 이미지 파일이어야 합니다. + text_custom_touch_icon_instructions: > + 홈 화면에 북마크를 추가하면 휴대폰 또는 태블릿에 표시되는 아이콘입니다. 정사각형 180x180 픽셀 크기의 PNG 이미지 파일이어야 합니다. 이미지의 배경이 투명하지 않은지 확인하세요. 그렇지 않으면 iOS에서 제대로 표시되지 않습니다. + text_database_allows_tsv: "데이터베이스에서 TSVector 허용(옵션)" + text_default_administrator_account_changed: "기본 관리자 계정 변경됨" + text_default_encoding: "기본: UTF-8" + text_destroy: "삭제" + text_destroy_with_associated: "삭제할 작업 패키지와 연결된 추가 개체가 있습니다. 이러한 개체의 유형은 다음과 같습니다." + text_destroy_what_to_do: "어떤 작업을 수행하시겠습니까?" text_diff_truncated: "... 이 차이점은 표시할 수 있는 최대 크기를 초과하므로 잘렸습니다." - text_email_delivery_not_configured: |- - 이메일 배달이 구성되지 않았고, 알림이 비활성화되었습니다. - SMTP 서버를 구성하여 활성화하세요. - text_enumeration_category_reassign_to: '이 값에 해당 항목 다시 할당:' + text_email_delivery_not_configured: "이메일 배달이 구성되지 않았고, 알림이 비활성화되었습니다.\nSMTP 서버를 구성하여 활성화하세요." + text_enumeration_category_reassign_to: "이 값에 해당 항목 다시 할당:" text_enumeration_destroy_question: "%{count}개 개체가 이 값에 할당되었습니다." - text_file_repository_writable: 첨부 파일 디렉터리 쓰기 가능 - text_git_repo_example: '기본 및 로컬 리포지토리(예: /gitrepo, c:\gitrepo)' - text_hint_date_format: YYYY-MM-dd 형식으로 날짜를 입력하세요. 다른 형식은 원치 않는 날짜로 변경될 수 있습니다. - text_hint_disable_with_0: '참고: 0으로 사용 안 함' + text_file_repository_writable: "첨부 파일 디렉터리 쓰기 가능" + text_git_repo_example: "기본 및 로컬 리포지토리(예: /gitrepo, c:\\gitrepo)" + text_hint_date_format: "YYYY-MM-dd 형식으로 날짜를 입력하세요. 다른 형식은 원치 않는 날짜로 변경될 수 있습니다." + text_hint_disable_with_0: "참고: 0으로 사용 안 함" text_hours_between: "%{min} ~ %{max} 시간 사이입니다." - text_work_package_added: 작업 패키지 %{id}은(는) %{author}에 의해 보고되었습니다. - text_work_package_category_destroy_assignments: 카테고리 할당 제거 - text_work_package_category_destroy_question: 일부 작업 패키지(%{count}개)가 이 카테고리에 할당되어 - 있습니다. 어떻게 하시겠습니까? - text_work_package_category_reassign_to: 이 카테고리에 작업 패키지 다시 할당 - text_work_package_updated: 작업 패키지 %{id}은(는) %{author}에 의해 업데이트되었습니다. - text_work_package_watcher_added: 사용자는 %{watcher_changer}에 의해 작업 패키지 %{id}의 주시자로 - 추가되었습니다. - text_work_package_watcher_removed: 사용자는 %{watcher_changer}에 의해 작업 패키지 %{id}의 주시자에서 - 제거되었습니다. - text_work_packages_destroy_confirmation: 선택한 작업 패키지를 삭제하시겠습니까? - text_work_packages_ref_in_commit_messages: 커밋 메시지의 작업 패키지 참조 또는 수정 + text_work_package_added: "작업 패키지 %{id}은(는) %{author}에 의해 보고되었습니다." + text_work_package_category_destroy_assignments: "카테고리 할당 제거" + text_work_package_category_destroy_question: "일부 작업 패키지(%{count}개)가 이 카테고리에 할당되어 있습니다. 어떻게 하시겠습니까?" + text_work_package_category_reassign_to: "이 카테고리에 작업 패키지 다시 할당" + text_work_package_updated: "작업 패키지 %{id}은(는) %{author}에 의해 업데이트되었습니다." + text_work_package_watcher_added: "사용자는 %{watcher_changer}에 의해 작업 패키지 %{id}의 주시자로 추가되었습니다." + text_work_package_watcher_removed: "사용자는 %{watcher_changer}에 의해 작업 패키지 %{id}의 주시자에서 제거되었습니다." + text_work_packages_destroy_confirmation: "선택한 작업 패키지를 삭제하시겠습니까?" + text_work_packages_ref_in_commit_messages: "커밋 메시지의 작업 패키지 참조 또는 수정" text_journal_added: "%{label} %{value} 추가됨" text_journal_attachment_added: "%{label} %{value}이(가) 첨부 파일로 추가됨" text_journal_attachment_deleted: "%{label} %{old}이(가) 첨부 파일로 제거됨" @@ -5395,334 +4968,278 @@ ko: text_journal_set_to: "%{label}이(가) %{value}(으)로 설정됨" text_journal_set_with_diff: "%{label} 설정됨(%{link})" text_journal_label_value: "%{label} %{value}" - text_latest_note: '최신 코멘트: %{note}' + text_latest_note: "최신 코멘트: %{note}" text_length_between: "%{min} ~ %{max}자 사이의 길이" - text_line_separated: 여러 값이 허용됩니다(각 값에 대해 한 줄). - text_load_default_configuration: 기본 구성 로드 + text_line_separated: "여러 값이 허용됩니다(각 값에 대해 한 줄)." + text_load_default_configuration: "기본 구성 로드" text_no_roles_defined: 정의된 역할이 없습니다. - text_no_access_tokens_configurable: 구성할 수 있는 액세스 토큰이 없습니다. - text_no_configuration_data: |- - 역할, 유형, 작업 패키지 상태 및 워크플로가 아직 구성되지 않았습니다. - 기본 구성을 로드하는 것이 좋습니다. 로드한 후에 수정할 수 있습니다. - text_no_notes: 이 작업 패키지에 사용할 수 있는 코멘트가 없습니다. - text_notice_too_many_values_are_inperformant: '참고: 페이지당 100개가 넘는 항목을 표시하면 페이지 로드 - 시간이 늘어날 수 있습니다.' - text_notice_security_badge_displayed_html: '참고: 활성화하는 경우, %{information_panel_label} - 관리 패널 및 홈페이지에서 설치 상태가 나오는 배지가 표시됩니다. 배지는 관리자에게만 표시됩니다.
배지는 공식 OpenProject - 릴리스 데이터베이스와 비교하여 현재 OpenProject 버전을 확인하고 업데이트 또는 알려진 취약성에 대해 알려줍니다. 이 검사에서 제공하는 - 사항, 사용 가능한 업데이트를 제공하기 위해 필요한 데이터 및 이 검사를 비활성화하는 방법에 대한 자세한 내용은 구성 - 문서를 참조하십시오. - - ' - text_own_membership_delete_confirmation: |- - 권한의 일부 또는 전부를 삭제하려고 합니다. 이렇게 한 후에는 이 프로젝트를 더 이상 편집하지 못할 수 있습니다. - 계속하시겠습니까? - text_permanent_delete_confirmation_checkbox_label: 이 삭제는 되돌릴 수 없음을 이해합니다. - text_permanent_remove_confirmation_checkbox_label: 이 제거는 되돌릴 수 없음을 이해합니다 - text_plugin_assets_writable: 플러그인 자산 디렉터리 쓰기 가능 + text_no_access_tokens_configurable: "구성할 수 있는 액세스 토큰이 없습니다." + text_no_configuration_data: "역할, 유형, 작업 패키지 상태 및 워크플로가 아직 구성되지 않았습니다.\n기본 구성을 로드하는 것이 좋습니다. 로드한 후에 수정할 수 있습니다." + text_no_notes: "이 작업 패키지에 사용할 수 있는 코멘트가 없습니다." + text_notice_too_many_values_are_inperformant: "참고: 페이지당 100개가 넘는 항목을 표시하면 페이지 로드 시간이 늘어날 수 있습니다." + text_notice_security_badge_displayed_html: > + 참고: 활성화하는 경우, %{information_panel_label} 관리 패널 및 홈페이지에서 설치 상태가 나오는 배지가 표시됩니다. 배지는 관리자에게만 표시됩니다.
배지는 공식 OpenProject 릴리스 데이터베이스와 비교하여 현재 OpenProject 버전을 확인하고 업데이트 또는 알려진 취약성에 대해 알려줍니다. 이 검사에서 제공하는 사항, 사용 가능한 업데이트를 제공하기 위해 필요한 데이터 및 이 검사를 비활성화하는 방법에 대한 자세한 내용은 구성 문서를 참조하십시오. + text_own_membership_delete_confirmation: "권한의 일부 또는 전부를 삭제하려고 합니다. 이렇게 한 후에는 이 프로젝트를 더 이상 편집하지 못할 수 있습니다.\n계속하시겠습니까?" + text_permanent_delete_confirmation_checkbox_label: "이 삭제는 되돌릴 수 없음을 이해합니다." + text_permanent_remove_confirmation_checkbox_label: "이 제거는 되돌릴 수 없음을 이해합니다" + text_plugin_assets_writable: "플러그인 자산 디렉터리 쓰기 가능" text_powered_by: "%{link} 제공" - text_project_identifier_info: 소문자(a-z), 숫자, 대시(-) 및 밑줄(_)만 허용됩니다. 소문자로 시작해야 합니다. - text_reassign: '작업 패키지에 다시 할당:' - text_regexp_multiline: 멀티라인 모드에서 정규식이 적용됩니다. 예, e.g., ^---\s+ - text_repository_usernames_mapping: |- - 리포지토리 로그에 있는 각 사용자 이름에 매핑된 OpenProject 사용자를 선택하거나 업데이트하세요. - 동일한 OpenProject 및 리포지토리 사용자 이름이나 이메일을 가진 사용자가 자동으로 매핑됩니다. - text_status_changed_by_changeset: 변경 집합 %{value}에 적용되었습니다. - text_table_difference_description: 이 테이블에서 단일 %{entries}이(가) 표시됩니다. 먼저 테이블의 해당 확인란을 - 선택하여 두 항목 사이의 차이를 볼 수 있습니다. 테이블 아래 버튼을 클릭하면 차이가 표시됩니다. - text_time_logged_by_changeset: 변경 집합 %{value}에 적용되었습니다. - text_tip_work_package_begin_day: 오늘 시작하는 작업 패키지 - text_tip_work_package_begin_end_day: 오늘 시작하는 끝나는 작업 패키지 - text_tip_work_package_end_day: 오늘 끝나는 작업 패키지 - text_type_no_workflow: 이 유형에 대해 워크플로가 정의되지 않음 - text_unallowed_characters: 허용되지 않는 문자 + text_project_identifier_info: "소문자(a-z), 숫자, 대시(-) 및 밑줄(_)만 허용됩니다. 소문자로 시작해야 합니다." + text_reassign: "작업 패키지에 다시 할당:" + text_regexp_multiline: '멀티라인 모드에서 정규식이 적용됩니다. 예, e.g., ^---\s+' + text_repository_usernames_mapping: "리포지토리 로그에 있는 각 사용자 이름에 매핑된 OpenProject 사용자를 선택하거나 업데이트하세요.\n동일한 OpenProject 및 리포지토리 사용자 이름이나 이메일을 가진 사용자가 자동으로 매핑됩니다." + text_status_changed_by_changeset: "변경 집합 %{value}에 적용되었습니다." + text_table_difference_description: "이 테이블에서 단일 %{entries}이(가) 표시됩니다. 먼저 테이블의 해당 확인란을 선택하여 두 항목 사이의 차이를 볼 수 있습니다. 테이블 아래 버튼을 클릭하면 차이가 표시됩니다." + text_time_logged_by_changeset: "변경 집합 %{value}에 적용되었습니다." + text_tip_work_package_begin_day: "오늘 시작하는 작업 패키지" + text_tip_work_package_begin_end_day: "오늘 시작하는 끝나는 작업 패키지" + text_tip_work_package_end_day: "오늘 끝나는 작업 패키지" + text_type_no_workflow: "이 유형에 대해 워크플로가 정의되지 않음" + text_unallowed_characters: "허용되지 않는 문자" text_user_invited: 사용자가 초대되었으며 등록 보류 중입니다. text_user_wrote: "%{value}이(가) 작성함:" - text_wrote: 작성됨 - text_warn_on_leaving_unsaved: 현재 페이지에는 저장되지 않은 텍스트가 있습니다. 이 페이지를 나가면 텍스트가 손실됩니다. - text_what_did_you_change_click_to_add_comment: 무엇을 변경하셨습니까? 댓글을 추가하려면 클릭하세요. - text_wiki_destroy_confirmation: 이 위키와 모든 해당 콘텐츠를 삭제하시겠습니까? - text_wiki_page_destroy_children: 자식 페이지 및 모든 하위 페이지 삭제 - text_wiki_page_destroy_question: 이 페이지에는 %{descendants}개의 자식 페이지와 하위 항목이 있습니다. 어떻게 - 하시겠습니까? - text_wiki_page_nullify_children: 자식 페이지를 루트 페이지로 유지 - text_wiki_page_reassign_children: 자식 페이지를 이 부모 페이지에 다시 할당 - text_workflow_edit: 워크플로를 편집하려면 역할과 유형 선택 - text_zoom_in: 확대 - text_zoom_out: 축소 - text_setup_mail_configuration: 이메일 공급자 구성 + text_wrote: "작성됨" + text_warn_on_leaving_unsaved: "현재 페이지에는 저장되지 않은 텍스트가 있습니다. 이 페이지를 나가면 텍스트가 손실됩니다." + text_what_did_you_change_click_to_add_comment: "무엇을 변경하셨습니까? 댓글을 추가하려면 클릭하세요." + text_wiki_destroy_confirmation: "이 위키와 모든 해당 콘텐츠를 삭제하시겠습니까?" + text_wiki_page_destroy_children: "자식 페이지 및 모든 하위 페이지 삭제" + text_wiki_page_destroy_question: "이 페이지에는 %{descendants}개의 자식 페이지와 하위 항목이 있습니다. 어떻게 하시겠습니까?" + text_wiki_page_nullify_children: "자식 페이지를 루트 페이지로 유지" + text_wiki_page_reassign_children: "자식 페이지를 이 부모 페이지에 다시 할당" + text_workflow_edit: "워크플로를 편집하려면 역할과 유형 선택" + text_zoom_in: "확대" + text_zoom_out: "축소" + text_setup_mail_configuration: "이메일 공급자 구성" help_texts: views: - project: "%{plural}은(는) 항상 프로젝트에 연결됩니다. %{plural} 모듈이 활성화된 프로젝트만 선택할 수 있습니다. - %{singular}을(를) 생성한 후 다른 프로젝트의 작업 패키지를 여기에 추가할 수 있습니다.\n" - public: 다른 사용자가 이 보기에 액세스할 수 있도록 하려면 이 보기를 게시하십시오. '공용 보기 관리' 권한을 가진 사용자는 공용 - 쿼리를 수정 또는 제거할 수 있습니다. 이는 해당 보기에서 작업 패키지 결과의 표시 여부에 영향을 주지 않기 때문에 사용자의 권한에 - 따라 다른 결과가 표시될 수 있습니다. - favoured: 이 보기를 즐겨찾기로 표시하고 왼쪽의 저장된 보기 사이드바에 추가하세요. + project: > + %{plural}은(는) 항상 프로젝트에 연결됩니다. %{plural} 모듈이 활성화된 프로젝트만 선택할 수 있습니다. %{singular}을(를) 생성한 후 다른 프로젝트의 작업 패키지를 여기에 추가할 수 있습니다. + public: "다른 사용자가 이 보기에 액세스할 수 있도록 하려면 이 보기를 게시하십시오. '공용 보기 관리' 권한을 가진 사용자는 공용 쿼리를 수정 또는 제거할 수 있습니다. 이는 해당 보기에서 작업 패키지 결과의 표시 여부에 영향을 주지 않기 때문에 사용자의 권한에 따라 다른 결과가 표시될 수 있습니다." + favoured: "이 보기를 즐겨찾기로 표시하고 왼쪽의 저장된 보기 사이드바에 추가하세요." time: - am: 오전 + am: "오전" formats: default: "%m/%d/%Y %I:%M %p" long: "%B %d, %Y %H:%M" short: "%d %b %H:%M" time: "%I:%M %p" - pm: 오후 + pm: "오후" timeframe: - show: 시간 범위 표시 - end: 끝 - start: 시작 + show: "시간 범위 표시" + end: "끝" + start: "시작" title_remove_and_delete_user: 초대받은 사용자를 프로젝트에서 제거하고 해당 사용자를 삭제하세요. - title_enterprise_upgrade: 더 많은 사용자를 잠금 해제하려면 업그레이드하세요. - tooltip_user_default_timezone: '새 사용자에 대한 기본 표준 시간대입니다. 사용자의 설정에서 변경할 수 있습니다. - - ' - tooltip_resend_invitation: '이전의 토큰이 만료되거나 사용자가 기존 메일을 받지 않았을 수 있기 때문에 새로운 토큰으로 다른 - 초대 메일을 보냅니다. 이것은 활성화된 사용자들이 새로운 인증 방식을 선택할 때 사용될 수도 있습니다. 활성화된 사용자들이 사용할 때 그들의 - 상태는 ''초대됨''으로 변경됩니다. - - ' + title_enterprise_upgrade: "더 많은 사용자를 잠금 해제하려면 업그레이드하세요." + tooltip_user_default_timezone: > + 새 사용자에 대한 기본 표준 시간대입니다. 사용자의 설정에서 변경할 수 있습니다. + tooltip_resend_invitation: > + 이전의 토큰이 만료되거나 사용자가 기존 메일을 받지 않았을 수 있기 때문에 새로운 토큰으로 다른 초대 메일을 보냅니다. 이것은 활성화된 사용자들이 새로운 인증 방식을 선택할 때 사용될 수도 있습니다. 활성화된 사용자들이 사용할 때 그들의 상태는 '초대됨'으로 변경됩니다. tooltip: - setting_email_login: '활성화된 경우, 사용자는 등록 중에 로그인 방식을 선택할 수 없습니다. 대신 주어진 이메일 주소가 로그인 - 방식으로 사용됩니다. 관리자는 로그인 방식을 개별적으로 변경할 수 있습니다. - - ' + setting_email_login: > + 활성화된 경우, 사용자는 등록 중에 로그인 방식을 선택할 수 없습니다. 대신 주어진 이메일 주소가 로그인 방식으로 사용됩니다. 관리자는 로그인 방식을 개별적으로 변경할 수 있습니다. queries: apply_filter: 미리 구성된 필터 적용 configure_view: heading: 보기 구성 columns: - input_label: 열 추가 - input_placeholder: 열 선택 - drag_area_label: 열 관리 및 재정렬 + input_label: "열 추가" + input_placeholder: "열 선택" + drag_area_label: "열 관리 및 재정렬" sort_by: automatic: - heading: 자동 - description: 하나 이상의 정렬 기준에 따라 %{plural}을(를) 정렬합니다. 이전 정렬은 손실됩니다. + heading: "자동" + description: "하나 이상의 정렬 기준에 따라 %{plural}을(를) 정렬합니다. 이전 정렬은 손실됩니다." top_menu: - additional_resources: 추가 리소스 - getting_started: 시작하기 - help_and_support: 도움말과 지원 - total_progress: 총 진행률 + additional_resources: "추가 리소스" + getting_started: "시작하기" + help_and_support: "도움말과 지원" + total_progress: "총 진행률" user: - all: 모두 - active: 활성 - activate: 활성화 - activate_and_reset_failed_logins: 실패한 로그인 활성화 및 재설정 - authentication_provider: 인증 공급자 - identity_url_text: 인증 공급자가 제공한 내부 고유 식별자입니다. - authentication_settings_disabled_due_to_external_authentication: '이 사용자는 외부 인증 - 공급자를 통해 인증하므로, 변경할 OpenProject의 암호가 없습니다. - - ' - authorization_rejected: 로그인할 수 없습니다. - assign_random_password: 무작위 암호 할당(이메일로 사용자에게 전송됨) - blocked: 일시적으로 잠김 + all: "모두" + active: "활성" + activate: "활성화" + activate_and_reset_failed_logins: "실패한 로그인 활성화 및 재설정" + authentication_provider: "인증 공급자" + identity_url_text: "인증 공급자가 제공한 내부 고유 식별자입니다." + authentication_settings_disabled_due_to_external_authentication: > + 이 사용자는 외부 인증 공급자를 통해 인증하므로, 변경할 OpenProject의 암호가 없습니다. + authorization_rejected: "로그인할 수 없습니다." + assign_random_password: "무작위 암호 할당(이메일로 사용자에게 전송됨)" + blocked: "일시적으로 잠김" blocked_num_failed_logins: - other: 일시적으로 잠김 (%{count} 로그인 시도 실패) + other: "일시적으로 잠김 (%{count} 로그인 시도 실패)" confirm_status_change: "%{name} 상태가 변경됩니다. 계속하시겠습니까?" - deleted: 사용자 삭제됨 - error_status_change_self: 자신의 사용자 상태는 변경할 수 없습니다. - error_admin_change_on_non_admin: 관리자만 관리자 사용자의 상태를 변경할 수 있습니다. - error_status_change_failed: '다음 오류 때문에 사용자 상태 변경 실패함: %{errors}' + deleted: "사용자 삭제됨" + error_status_change_self: "자신의 사용자 상태는 변경할 수 없습니다." + error_admin_change_on_non_admin: "관리자만 관리자 사용자의 상태를 변경할 수 있습니다." + error_status_change_failed: "다음 오류 때문에 사용자 상태 변경 실패함: %{errors}" invite: 이메일을 통해 사용자 초대 invited: 초대됨 - lock: 영구적으로 잠금 - locked: 영구적으로 잠김 - no_login: 이 사용자는 암호로 로그인을 통해 인증합니다. 비활성화되어 있기 때문에 로그인할 수 없습니다. + lock: "영구적으로 잠금" + locked: "영구적으로 잠김" + no_login: "이 사용자는 암호로 로그인을 통해 인증합니다. 비활성화되어 있기 때문에 로그인할 수 없습니다." password_change_unsupported: 암호 변경은 지원되지 않습니다. - registered: 등록됨 - reset_failed_logins: 실패한 로그인 재설정 + registered: "등록됨" + reset_failed_logins: "실패한 로그인 재설정" status_user_and_brute_force: "%{user} 및 %{brute_force}" - status_change: 상태 변경 - text_change_disabled_for_provider_login: 이름 및 이메일은 로그인 공급자가 설정하므로 변경할 수 없습니다. - unlock: 잠금 해제 - unlock_and_reset_failed_logins: 실패한 로그인 잠금 해제 및 재설정 - error_cannot_delete_user: 사용자를 삭제할 수 없습니다 - version_status_closed: 닫음 - version_status_locked: 잠김 - version_status_open: 열기 + status_change: "상태 변경" + text_change_disabled_for_provider_login: "이름 및 이메일은 로그인 공급자가 설정하므로 변경할 수 없습니다." + unlock: "잠금 해제" + unlock_and_reset_failed_logins: "실패한 로그인 잠금 해제 및 재설정" + error_cannot_delete_user: "사용자를 삭제할 수 없습니다" + version_status_closed: "닫음" + version_status_locked: "잠김" + version_status_open: "열기" note: 메모 - note_password_login_disabled: 암호 로그인이 %{configuration}에 의해 비활성화되었습니다. + note_password_login_disabled: "암호 로그인이 %{configuration}에 의해 비활성화되었습니다." warning: 경고 warning_attachments_not_saved: "%{count}개 파일을 저장할 수 없습니다." - warning_imminent_user_limit: '현재 플랜으로 지원되는 사용자보다 많은 사용자를 초대했습니다. 초대된 사용자가 OpenProject - 환경에 참여하지 못할 수 있습니다. 초대된 사용자와 등록된 사용자가 참여할 수 있도록 하려면 플랜을 - 업그레이드하세요. - - ' + warning_imminent_user_limit: > + 현재 플랜으로 지원되는 사용자보다 많은 사용자를 초대했습니다. 초대된 사용자가 OpenProject 환경에 참여하지 못할 수 있습니다. 초대된 사용자와 등록된 사용자가 참여할 수 있도록 하려면 플랜을 업그레이드하세요. warning_registration_token_expired: | 활성화 이메일이 만료되었습니다. %{email}(으)로 새로운 이메일이 전송되었습니다. 이메일 내 링크를 클릭하여 계정을 활성화하세요. - warning_user_limit_reached: '사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 인스턴스에 액세스할 수 있도록 - 관리자에게 문의하여 사용자 한도를 늘리세요. + warning_user_limit_reached: > + 사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 인스턴스에 액세스할 수 있도록 관리자에게 문의하여 사용자 한도를 늘리세요. + warning_user_limit_reached_admin: > + 사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 인스턴스에 액세스할 수 있도록 하려면 플랜을 업그레이드하세요. + warning_user_limit_reached_instructions: > + 사용자 제한(활성 사용자 %{current}/%{max}명)에 도달했습니다. sales@openproject.com으로 연락하여 Enterprise Edition 플랜을 업그레이드하고 사용자를 더 추가하세요. + warning_protocol_mismatch_html: > - ' - warning_user_limit_reached_admin: '사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 인스턴스에 액세스할 - 수 있도록 하려면 플랜을 업그레이드하세요. - - ' - warning_user_limit_reached_instructions: '사용자 제한(활성 사용자 %{current}/%{max}명)에 도달했습니다. - sales@openproject.com으로 연락하여 Enterprise Edition 플랜을 업그레이드하고 사용자를 더 추가하세요. - - ' - warning_protocol_mismatch_html: '' warning_bar: https_mismatch: - title: HTTPS 모드 설정 불일치 - text_html: '애플리케이션이 %{set_protocol}로 설정된 HTTPS 모드로 실행되고 있지만, 이 - 요청은 %{actual_protocol} 요청입니다. 이 경우에는 오류가 발생합니다! 다음 구성 값을 설정해야 - 합니다: %{setting_value}. 이 구성을 설정하는 방법은 설치 - 설명서를 참조하세요. - - ' + title: "HTTPS 모드 설정 불일치" + text_html: > + 애플리케이션이 %{set_protocol}로 설정된 HTTPS 모드로 실행되고 있지만, 이 요청은 %{actual_protocol} 요청입니다. 이 경우에는 오류가 발생합니다! 다음 구성 값을 설정해야 합니다: %{setting_value}. 이 구성을 설정하는 방법은 설치 설명서를 참조하세요. hostname_mismatch: - title: 호스트 이름 설정 불일치 - text_html: '해당 애플리케이션이 %{set_hostname}(으)로 지정된 호스트 이름 설정으로 실행되고 - 있지만, 이 요청은 %{actual_hostname} 호스트 이름입니다. 이로 인해 오류가 발생하게 됩니다! - 시스템 설정으로 이동하고 "호스트 이름" 설정을 변경하여 이 오류를 수정하세요. - - ' - menu_item: 메뉴 항목 - menu_item_setting: 표시 여부 - wiki_menu_item_for: 위키 페이지 "%{title}"에 대한 메뉴 항목 - wiki_menu_item_setting: 표시 여부 - wiki_menu_item_new_main_item_explanation: '유일한 기본 위키 메뉴 항목을 삭제하려고 합니다. 이제 새로운 기본 - 항목이 생성될 위키 페이지를 선택해야 합니다. 위키를 삭제하기 위해 프로젝트 관리자가 위키 모듈을 비활성화할 수 있습니다. - - ' + title: "호스트 이름 설정 불일치" + text_html: > + 해당 애플리케이션이 %{set_hostname}(으)로 지정된 호스트 이름 설정으로 실행되고 있지만, 이 요청은 %{actual_hostname} 호스트 이름입니다. 이로 인해 오류가 발생하게 됩니다! 시스템 설정으로 이동하고 "호스트 이름" 설정을 변경하여 이 오류를 수정하세요. + menu_item: "메뉴 항목" + menu_item_setting: "표시 여부" + wiki_menu_item_for: '위키 페이지 "%{title}"에 대한 메뉴 항목' + wiki_menu_item_setting: "표시 여부" + wiki_menu_item_new_main_item_explanation: > + 유일한 기본 위키 메뉴 항목을 삭제하려고 합니다. 이제 새로운 기본 항목이 생성될 위키 페이지를 선택해야 합니다. 위키를 삭제하기 위해 프로젝트 관리자가 위키 모듈을 비활성화할 수 있습니다. wiki_menu_item_delete_not_permitted: 유일한 위키 페이지의 위키 메뉴 항목은 삭제할 수 없습니다. + #TODO: merge with work_packages top level key work_package: - updated_automatically_by_child_changes: '_자식 작업 패키지 %{child} 내에서 값을 변경하여 자동으로 - 업데이트됨_ - - ' + updated_automatically_by_child_changes: | + _자식 작업 패키지 %{child} 내에서 값을 변경하여 자동으로 업데이트됨_ destroy: - info: 작업 패키지 삭제는 취소할 수 없는 작업입니다. - title: 작업 패키지 삭제 + info: "작업 패키지 삭제는 취소할 수 없는 작업입니다." + title: "작업 패키지 삭제" progress: - label_note: '참고:' + label_note: "참고:" modal: - work_based_help_text: 가능한 경우 각 필드는 다른 두 필드에서 자동으로 계산됩니다. - status_based_help_text: 완료 %는 작업 패키지 상태에 따라 설정됩니다. - migration_warning_text: 작업 기반 진행률 계산 모드에서 완료 %는 수동으로 설정할 수 없으며 작업에 연결됩니다. - 기존 값은 유지되지만 편집할 수 없습니다. 먼저 작업을 입력하세요. + work_based_help_text: "가능한 경우 각 필드는 다른 두 필드에서 자동으로 계산됩니다." + status_based_help_text: "완료 %는 작업 패키지 상태에 따라 설정됩니다." + migration_warning_text: "작업 기반 진행률 계산 모드에서 완료 %는 수동으로 설정할 수 없으며 작업에 연결됩니다. 기존 값은 유지되지만 편집할 수 없습니다. 먼저 작업을 입력하세요." derivation_hints: done_ratio: - cleared_because_remaining_work_is_empty: 남은 작업이 비어 있으므로 지워졌습니다. - cleared_because_work_is_0h: 작업이 0시간이므로 지워졌습니다. - derived: 작업 및 남은 작업에서 파생되었습니다. + cleared_because_remaining_work_is_empty: "남은 작업이 비어 있으므로 지워졌습니다." + cleared_because_work_is_0h: "작업이 0시간이므로 지워졌습니다." + derived: "작업 및 남은 작업에서 파생되었습니다." estimated_hours: - cleared_because_remaining_work_is_empty: 남은 작업이 비어 있으므로 지워졌습니다. - derived: 남은 작업 및 완료 %에서 파생되었습니다. - same_as_remaining_work: 남은 작업과 동일한 값으로 설정합니다. + cleared_because_remaining_work_is_empty: "남은 작업이 비어 있으므로 지워졌습니다." + derived: "남은 작업 및 완료 %에서 파생되었습니다." + same_as_remaining_work: "남은 작업과 동일한 값으로 설정합니다." remaining_hours: - cleared_because_work_is_empty: 작업이 비어 있으므로 지워졌습니다. - cleared_because_percent_complete_is_empty: 완료 %가 비어 있으므로 지워졌습니다. + cleared_because_work_is_empty: "작업이 비어 있으므로 지워졌습니다." + cleared_because_percent_complete_is_empty: "완료 %가 비어 있으므로 지워졌습니다." decreased_by_delta_like_work: "%{delta} 감소하여 작업의 감소와 일치합니다." - derived: 작업 및 완료 %에서 파생되었습니다. + derived: "작업 및 완료 %에서 파생되었습니다." increased_by_delta_like_work: "%{delta} 증가하여 작업의 증가와 일치합니다." - same_as_work: 작업과 동일한 값으로 설정합니다. + same_as_work: "작업과 동일한 값으로 설정합니다." permissions: - comment: 코멘트 - comment_description: 이 작업 패키지를 보고 코멘트를 작성할 수 있습니다. - edit: 편집 - edit_description: 이 작업 패키지 보기, 코멘트 작성 및 편집을 할 수 있습니다. - view: 보기 - view_description: 이 작업 패키지를 볼 수 있습니다. + comment: "코멘트" + comment_description: "이 작업 패키지를 보고 코멘트를 작성할 수 있습니다." + edit: "편집" + edit_description: "이 작업 패키지 보기, 코멘트 작성 및 편집을 할 수 있습니다." + view: "보기" + view_description: "이 작업 패키지를 볼 수 있습니다." reminders: - label_remind_at: 날짜 - note_placeholder: 이 미리 알림을 설정하는 이유는 무엇입니까? - create_success_message: 미리 알림이 설정되었습니다. %{reminder_time}에 이 작업 패키지에 대한 알림을 받게 - 됩니다. - success_update_message: 미리 알림이 업데이트되었습니다. - success_deletion_message: 미리 알림이 삭제되었습니다. + label_remind_at: "날짜" + note_placeholder: "이 미리 알림을 설정하는 이유는 무엇입니까?" + create_success_message: "미리 알림이 설정되었습니다. %{reminder_time}에 이 작업 패키지에 대한 알림을 받게 됩니다." + success_update_message: "미리 알림이 업데이트되었습니다." + success_deletion_message: "미리 알림이 삭제되었습니다." sharing: count: - zero: 사용자 0명 - one: 사용자 1명 - other: 사용자 %{count}명 + zero: "사용자 0명" + one: "사용자 1명" + other: "사용자 %{count}명" filter: - project_member: 프로젝트 멤버 - not_project_member: 프로젝트 멤버 아님 - project_group: 프로젝트 그룹 - not_project_group: 프로젝트 그룹 아님 - user: 사용자 - group: 그룹 - role: 역할 - type: 유형 + project_member: "프로젝트 멤버" + not_project_member: "프로젝트 멤버 아님" + project_group: "프로젝트 그룹" + not_project_group: "프로젝트 그룹 아님" + user: "사용자" + group: "그룹" + role: "역할" + type: "유형" denied: "%{entities} 공유를 할 수 있는 권한이 없습니다." - label_search: 초대할 사용자 검색 - label_search_placeholder: 사용자 또는 이메일 주소로 검색 - label_toggle_all: 모든 공유 토글 - remove: 제거 - share: 공유 - text_empty_search_description: 현재 필터 기준에 맞는 사용자가 없습니다. - text_empty_search_header: 일치하는 결과를 찾을 수 없습니다. + label_search: "초대할 사용자 검색" + label_search_placeholder: "사용자 또는 이메일 주소로 검색" + label_toggle_all: "모든 공유 토글" + remove: "제거" + share: "공유" + text_empty_search_description: "현재 필터 기준에 맞는 사용자가 없습니다." + text_empty_search_header: "일치하는 결과를 찾을 수 없습니다." text_empty_state_description: "%{entity}은(는) 아직 누구와도 공유되지 않았습니다." - text_empty_state_header: 공유 안 됨 - text_user_limit_reached: 사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 %{entity}에 액세스할 수 - 있도록 관리자에게 문의하여 사용자 한도를 늘리세요. - text_user_limit_reached_admins: 사용자를 더 추가하면 현재 한도가 초과됩니다. 사용자를 더 추가할 수 있도록 하려면 - 플랜을 업그레이드하세요. - warning_user_limit_reached: '사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 %{entity}에 액세스할 - 수 있도록 관리자에게 문의하여 사용자 한도를 늘리세요. - - ' - warning_user_limit_reached_admin: '사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 %{entity}에 - 액세스할 수 있도록 하려면 플랜을 업그레이드하세요. - - ' - warning_no_selected_user: 이 %{entity}을(를) 공유할 사용자를 선택하세요 + text_empty_state_header: "공유 안 됨" + text_user_limit_reached: "사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 %{entity}에 액세스할 수 있도록 관리자에게 문의하여 사용자 한도를 늘리세요." + text_user_limit_reached_admins: '사용자를 더 추가하면 현재 한도가 초과됩니다. 사용자를 더 추가할 수 있도록 하려면 플랜을 업그레이드하세요.' + warning_user_limit_reached: > + 사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 %{entity}에 액세스할 수 있도록 관리자에게 문의하여 사용자 한도를 늘리세요. + warning_user_limit_reached_admin: > + 사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 %{entity}에 액세스할 수 있도록 하려면 플랜을 업그레이드하세요. + warning_no_selected_user: "이 %{entity}을(를) 공유할 사용자를 선택하세요" warning_locked_user: "%{user} 사용자는 잠겨 있어서 공유할 수 없습니다" user_details: - locked: 잠긴 사용자 - invited: '초대장을 보냈습니다. ' - resend_invite: 다시 보내기. - invite_resent: 초대장을 다시 보냈습니다 - not_project_member: 프로젝트 멤버 아님 - project_group: 그룹 멤버는 (프로젝트 멤버로서) 추가적인 권한을 가질 수 있습니다 - not_project_group: 그룹(모든 멤버와 공유됨) + locked: "잠긴 사용자" + invited: "초대장을 보냈습니다. " + resend_invite: "다시 보내기." + invite_resent: "초대장을 다시 보냈습니다" + not_project_member: "프로젝트 멤버 아님" + project_group: "그룹 멤버는 (프로젝트 멤버로서) 추가적인 권한을 가질 수 있습니다" + not_project_group: "그룹(모든 멤버와 공유됨)" additional_privileges_project: "(프로젝트 멤버로서) 추가적인 권한을 가질 수 있습니다" additional_privileges_group: "(그룹 멤버로서) 추가적인 권한을 가질 수 있습니다" additional_privileges_project_or_group: "(프로젝트 또는 그룹 멤버로서) 추가적인 권한을 가질 수 있습니다" project_queries: - publishing_denied: 프로젝트 목록을 공개로 지정할 수 있는 권한이 없습니다. - access_warning: 사용자는 자신이 액세스할 수 있는 프로젝트만 볼 수 있습니다. 프로젝트 목록을 공유해도 개별 프로젝트 권한에 - 영향을 미치지 않습니다. + publishing_denied: "프로젝트 목록을 공개로 지정할 수 있는 권한이 없습니다." + access_warning: "사용자는 자신이 액세스할 수 있는 프로젝트만 볼 수 있습니다. 프로젝트 목록을 공유해도 개별 프로젝트 권한에 영향을 미치지 않습니다." user_details: - owner: 목록 소유자 - can_view_because_public: 목록이 모두와 공유되므로 이미 볼 수 있습니다 - can_manage_public_lists: 글로벌 권한이 있으므로 편집할 수 있습니다 + owner: "목록 소유자" + can_view_because_public: "목록이 모두와 공유되므로 이미 볼 수 있습니다" + can_manage_public_lists: "글로벌 권한이 있으므로 편집할 수 있습니다" public_flag: label: "%{instance_name}에서 모두와 공유" - caption: 누구나 이 프로젝트 목록을 볼 수 있습니다. 글로벌 편집 권한이 있는 사용자는 이 목록을 수정할 수 있습니다. + caption: "누구나 이 프로젝트 목록을 볼 수 있습니다. 글로벌 편집 권한이 있는 사용자는 이 목록을 수정할 수 있습니다." blank_state: public: - header: 모두와 공유됨 - description: 누구나 이 프로젝트 목록을 볼 수 있습니다. 별도로 권한이 있는 개별 사용자를 추가할 수도 있습니다. + header: "모두와 공유됨" + description: "누구나 이 프로젝트 목록을 볼 수 있습니다. 별도로 권한이 있는 개별 사용자를 추가할 수도 있습니다." private: - header: '공유 안 됨: 비공개' - description: 이 프로젝트 목록은 아직 누구와도 공유되지 않았습니다. 나만 이 목록에 액세스할 수 있습니다. + header: "공유 안 됨: 비공개" + description: "이 프로젝트 목록은 아직 누구와도 공유되지 않았습니다. 나만 이 목록에 액세스할 수 있습니다." permissions: - view: 보기 - view_description: 이 프로젝트 목록을 볼 수 있습니다. - edit: 편집 - edit_description: 이 프로젝트 목록을 보고, 공유하고, 편집할 수 있습니다. + view: "보기" + view_description: "이 프로젝트 목록을 볼 수 있습니다." + edit: "편집" + edit_description: "이 프로젝트 목록을 보고, 공유하고, 편집할 수 있습니다." upsell: - message: 개별 사용자와의 프로젝트 목록 공유는 Enterprise 추가 기능입니다. + message: "개별 사용자와의 프로젝트 목록 공유는 Enterprise 추가 기능입니다." working_days: - info: '선택하지 않은 요일은 작업 패키지 및 프로젝트 수명 주기를 예약할 때 건너뜁니다(일 수에 포함되지 않음). 작업 패키지 수준에서 - 재정의할 수 있습니다. - - ' - instance_wide_info: '아래 목록에 추가된 날짜는 휴무로 간주되며 작업 패키지를 예약할 때 건너뜁니다. - - ' - change_button: 근무일 변경 - warning: '근무일 또는 휴무일로 간주되는 요일을 변경하면 이 인스턴스의 모든 프로젝트에 있는 모든 작업 패키지와 수명 주기의 시작 날짜 - 및 완료 날짜에 영향을 미칠 수 있습니다. - - ' + info: > + 선택하지 않은 요일은 작업 패키지 및 프로젝트 수명 주기를 예약할 때 건너뜁니다(일 수에 포함되지 않음). 작업 패키지 수준에서 재정의할 수 있습니다. + instance_wide_info: > + 아래 목록에 추가된 날짜는 휴무로 간주되며 작업 패키지를 예약할 때 건너뜁니다. + change_button: "근무일 변경" + warning: > + 근무일 또는 휴무일로 간주되는 요일을 변경하면 이 인스턴스의 모든 프로젝트에 있는 모든 작업 패키지와 수명 주기의 시작 날짜 및 완료 날짜에 영향을 미칠 수 있습니다. journal_note: changed: _**근무일**이 변경되었습니다(%{changes})._ days: @@ -5731,71 +5248,67 @@ ko: dates: working: "%{date}은(는) 이제 근무일입니다." non_working: "%{date}은(는) 이제 휴무일입니다." - nothing_to_preview: 미리 볼 내용 없음 + nothing_to_preview: "미리 볼 내용 없음" api_v3: attributes: - property: 속성 + property: "속성" errors: - code_400: '잘못된 요청: %{message}' - code_401: 접근하기 위해서 인증해야 합니다. - code_401_wrong_credentials: 올바른 자격 증명을 제공하지 않았습니다. - code_403: 접근 권한이 없습니다. - code_404: 요청한 리소스를 찾을 수 없습니다. - code_409: 수정 사항이 출동하여 리소스를 업데이트할 수 없습니다. - code_429: 너무 많은 요청이 들어왔습니다. 나중에 다시 시도해주십시오. - code_500: 내부 오류가 발생하였습니다. - code_500_outbound_request_failure: 다른 리소스에 대한 아웃바운드 요청이 실패했으며 상태 코드는 %{status_code}입니다. - code_500_missing_enterprise_token: Enterprise 토큰이 유효하지 않거나 누락되어 요청을 처리할 수 없습니다. + code_400: "잘못된 요청: %{message}" + code_401: "접근하기 위해서 인증해야 합니다." + code_401_wrong_credentials: "올바른 자격 증명을 제공하지 않았습니다." + code_403: "접근 권한이 없습니다." + code_404: "요청한 리소스를 찾을 수 없습니다." + code_409: "수정 사항이 출동하여 리소스를 업데이트할 수 없습니다." + code_429: "너무 많은 요청이 들어왔습니다. 나중에 다시 시도해주십시오." + code_500: "내부 오류가 발생하였습니다." + code_500_outbound_request_failure: "다른 리소스에 대한 아웃바운드 요청이 실패했으며 상태 코드는 %{status_code}입니다." + code_500_missing_enterprise_token: "Enterprise 토큰이 유효하지 않거나 누락되어 요청을 처리할 수 없습니다." bad_request: - emoji_reactions_activity_type_not_supported: 이 활동 유형은 이모티콘 반응을 지원하지 않습니다. + emoji_reactions_activity_type_not_supported: "이 활동 유형은 이모티콘 반응을 지원하지 않습니다." invalid_link: "'%{key}' 키 아래의 링크가 유효하지 않습니다." - links_not_an_object: _links는 JSON 개체여야 합니다. + links_not_an_object: "_links는 JSON 개체여야 합니다." conflict: - multiple_reminders_not_allowed: 작업 패키지에 대해 한 번에 하나의 미리 알림만 설정할 수 있습니다. 기존 - 미리 알림을 삭제하거나 업데이트하세요. + multiple_reminders_not_allowed: |- + 작업 패키지에 대해 한 번에 하나의 미리 알림만 설정할 수 있습니다. 기존 미리 알림을 삭제하거나 업데이트하세요. not_found: - work_package: 원하는 작업 패키지를 찾을 수 없거나 삭제되었습니다. - reminder: 원하는 미리 알림을 찾을 수 없거나 삭제되었습니다. + work_package: "원하는 작업 패키지를 찾을 수 없거나 삭제되었습니다." + reminder: "원하는 미리 알림을 찾을 수 없거나 삭제되었습니다." expected: - date: YYYY-MM-DD(ISO 8601 날짜만) - datetime: YYYY-MM-DDThh:mm:ss[.lll][+hh:mm](호환되는 모든 ISO 8601 날짜/시간) - duration: ISO 8601 기간 - invalid_content_type: 예상되는 CONTENT-TYPE 은 '%{content_type}' 이지만, '%{actual}' - 을 응답 받았습니다. - invalid_format: "'%{property}' 속성에 대한 잘못된 형식: '%{expected_format}' 같은 형식이 필요하지만 - '%{actual}'이(가) 있습니다." - invalid_json: 요청을 JSON으로 구문 분석할 수 없습니다. - invalid_relation: 관계가 잘못되었습니다. - invalid_resource: 속성 '%{property}'의 경우 '%{expected}' 같은 링크가 필요하지만 '%{actual}'이(가) - 있습니다. + date: "YYYY-MM-DD(ISO 8601 날짜만)" + datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm](호환되는 모든 ISO 8601 날짜/시간)" + duration: "ISO 8601 기간" + invalid_content_type: "예상되는 CONTENT-TYPE 은 '%{content_type}' 이지만, '%{actual}' 을 응답 받았습니다." + invalid_format: "'%{property}' 속성에 대한 잘못된 형식: '%{expected_format}' 같은 형식이 필요하지만 '%{actual}'이(가) 있습니다." + invalid_json: "요청을 JSON으로 구문 분석할 수 없습니다." + invalid_relation: "관계가 잘못되었습니다." + invalid_resource: "속성 '%{property}'의 경우 '%{expected}' 같은 링크가 필요하지만 '%{actual}'이(가) 있습니다." invalid_signal: - embed: 요청한 %{invalid}의 임베딩은 지원되지 않습니다. %{supported}의 임베딩은 지원합니다. - select: 요청한 %{invalid}의 선택은 지원되지 않습니다. %{supported}의 선택은 지원합니다. - invalid_user_status_transition: 현재 사용자의 계정 상태는이 작업을 허용 하지 않습니다. - missing_content_type: 지정되지 않음 + embed: "요청한 %{invalid}의 임베딩은 지원되지 않습니다. %{supported}의 임베딩은 지원합니다." + select: "요청한 %{invalid}의 선택은 지원되지 않습니다. %{supported}의 선택은 지원합니다." + invalid_user_status_transition: "현재 사용자의 계정 상태는이 작업을 허용 하지 않습니다." + missing_content_type: "지정되지 않음" missing_property: "'%{property}' 속성이 없습니다." - missing_request_body: 요청 본문이 없습니다. - missing_or_malformed_parameter: 쿼리 매개 변수 '%{parameter}'는 누락되거나 잘못되었습니다. - multipart_body_error: 요청 본문에는 필요한 multipart 부분이 포함되어 있지 않습니다. - multiple_errors: 다중 필드 제약 조건이 위반되었습니다. - unable_to_create_attachment: 첨부 파일을 만들 수 없습니다. - unable_to_create_attachment_permissions: 파일 시스템 사용 권한이 부족하여 첨부 파일을 저장할 수 없습니다. + missing_request_body: "요청 본문이 없습니다." + missing_or_malformed_parameter: "쿼리 매개 변수 '%{parameter}'는 누락되거나 잘못되었습니다." + multipart_body_error: "요청 본문에는 필요한 multipart 부분이 포함되어 있지 않습니다." + multiple_errors: "다중 필드 제약 조건이 위반되었습니다." + unable_to_create_attachment: "첨부 파일을 만들 수 없습니다." + unable_to_create_attachment_permissions: "파일 시스템 사용 권한이 부족하여 첨부 파일을 저장할 수 없습니다." user: - name_readonly: 이름 특성은 읽기 전용입니다. 이름 및 성 특성을 통해 변경 사항을 기록할 수 있습니다. + name_readonly: "이름 특성은 읽기 전용입니다. 이름 및 성 특성을 통해 변경 사항을 기록할 수 있습니다." render: - context_not_parsable: 제공된 컨텍스트는 리소스에 대한 링크가 아닙니다. - unsupported_context: 지정된 리소스는 컨텍스트로 지원되지 않습니다. - context_object_not_found: 컨텍스트로 지정된 리소스를 찾을 수 없습니다. + context_not_parsable: "제공된 컨텍스트는 리소스에 대한 링크가 아닙니다." + unsupported_context: "지정된 리소스는 컨텍스트로 지원되지 않습니다." + context_object_not_found: "컨텍스트로 지정된 리소스를 찾을 수 없습니다." validation: - due_date: 완료 날짜는 부모 작업 패키지에서 설정할 수 없습니다. - invalid_user_assigned_to_work_package: 선택한 사용자는 이 작업 패키지에 대해 '%{property}' - 허가되지 않았습니다. - start_date: 시작 날짜는 부모 작업 패키지에서 설정할 수 없습니다. + due_date: "완료 날짜는 부모 작업 패키지에서 설정할 수 없습니다." + invalid_user_assigned_to_work_package: "선택한 사용자는 이 작업 패키지에 대해 '%{property}' 허가되지 않았습니다." + start_date: "시작 날짜는 부모 작업 패키지에서 설정할 수 없습니다." eprops: invalid_gzip: "- 잘못된 gzip입니다: %{message}" invalid_json: "- 잘못된 json입니다: %{message}" resources: - schema: 스키마 + schema: "스키마" undisclosed: parent: 숨겨짐 - 권한이 없어 부모를 볼 수 없습니다. project: 숨겨짐 - 권한이 없어 프로젝트를 볼 수 없습니다. @@ -5803,198 +5316,167 @@ ko: definingProject: 숨겨짐 - 권한이 없어 프로젝트를 볼 수 없습니다. doorkeeper: pre_authorization: - status: 사전 권한 부여 - auth_url: 인증 URL - access_token_url: 액세스 토큰 URL + status: "사전 권한 부여" + auth_url: "인증 URL" + access_token_url: "액세스 토큰 URL" errors: messages: + #Common error messages invalid_request: - unknown: 이 요청에는 필요한 매개 변수가 없거나, 지원되지 않는 매개 변수 값이 포함되어 있거나, 형식이 잘못되었습니다. - missing_param: '필수 매개 변수 누락: %{value}.' - request_not_authorized: 인증이 필요한 요청입니다. 인증 요청을 위한 필수 매개 변수가 없거나 유효하지 않습니다. - invalid_redirect_uri: 요청한 리디렉션 URI가 잘못된 형식이거나 클라이언트 리디렉션 URI와 일치하지 않습니다. - unauthorized_client: 클라이언트가 이 방법을 사용하여 해당 요청을 실행하도록 허용되지 않았습니다. - access_denied: 리소스 소유자 또는 권한 부여 서버가 요청을 거부했습니다. - invalid_scope: 요청한 범위가 유효하지 않거나, 알 수 없거나, 잘못된 형식입니다. - invalid_code_challenge_method: 코드 챌린지 방식은 일반 또는 S256이어야 합니다. - server_error: 권한 부여 서버에 예기치 않은 상태가 발생하여, 요청을 수행할 수 없습니다. - temporarily_unavailable: 권한 부여 서버가 일시적인 과부하 또는 유지 관리로 인해 요청을 현재 처리할 수 없습니다. - credential_flow_not_configured: Doorkeeper.configure.resource_owner_from_credentials - 구성이 되지 않아 리소스 소유자 암호 자격 증명 흐름이 실패했습니다. - resource_owner_authenticator_not_configured: Resource Owner find failed due - to Doorkeeper.configure.resource_owner_authenticator 구성이 되지 않아 리소스 소유자 찾기에 - 실패했습니다. - admin_authenticator_not_configured: Doorkeeper.configure.admin_authenticator - 구성이 되지 않아 관리자 패널에 대한 액세스가 금지되었습니다. - unsupported_response_type: 권한 부여 서버가 이 응답 유형을 지원하지 않습니다. - unsupported_response_mode: 권한 부여 서버가 이 응답 모드를 지원하지 않습니다. - invalid_client: 알 수 없는 클라이언트, 포함되지 않은 클라이언트 인증 또는 지원되지 않는 인증 방법으로 인해 클라이언트 - 인증이 실패했습니다. - invalid_grant: 제공된 권한 부여가 잘못되거나, 만료되거나, 취소되었거나, 권한 부여 요청에 사용된 리디렉션 URI와 일치하지 - 않거나, 다른 클라이언트에 지정되었습니다. - unsupported_grant_type: 권한 부여 유형이 권한 부여 서버에 의해 지원되지 않습니다. + unknown: "이 요청에는 필요한 매개 변수가 없거나, 지원되지 않는 매개 변수 값이 포함되어 있거나, 형식이 잘못되었습니다." + missing_param: "필수 매개 변수 누락: %{value}." + request_not_authorized: "인증이 필요한 요청입니다. 인증 요청을 위한 필수 매개 변수가 없거나 유효하지 않습니다." + invalid_redirect_uri: "요청한 리디렉션 URI가 잘못된 형식이거나 클라이언트 리디렉션 URI와 일치하지 않습니다." + unauthorized_client: "클라이언트가 이 방법을 사용하여 해당 요청을 실행하도록 허용되지 않았습니다." + access_denied: "리소스 소유자 또는 권한 부여 서버가 요청을 거부했습니다." + invalid_scope: "요청한 범위가 유효하지 않거나, 알 수 없거나, 잘못된 형식입니다." + invalid_code_challenge_method: "코드 챌린지 방식은 일반 또는 S256이어야 합니다." + server_error: "권한 부여 서버에 예기치 않은 상태가 발생하여, 요청을 수행할 수 없습니다." + temporarily_unavailable: "권한 부여 서버가 일시적인 과부하 또는 유지 관리로 인해 요청을 현재 처리할 수 없습니다." + #Configuration error messages + credential_flow_not_configured: "Doorkeeper.configure.resource_owner_from_credentials 구성이 되지 않아 리소스 소유자 암호 자격 증명 흐름이 실패했습니다." + resource_owner_authenticator_not_configured: "Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator 구성이 되지 않아 리소스 소유자 찾기에 실패했습니다." + admin_authenticator_not_configured: "Doorkeeper.configure.admin_authenticator 구성이 되지 않아 관리자 패널에 대한 액세스가 금지되었습니다." + #Access grant errors + unsupported_response_type: "권한 부여 서버가 이 응답 유형을 지원하지 않습니다." + unsupported_response_mode: "권한 부여 서버가 이 응답 모드를 지원하지 않습니다." + #Access token errors + invalid_client: "알 수 없는 클라이언트, 포함되지 않은 클라이언트 인증 또는 지원되지 않는 인증 방법으로 인해 클라이언트 인증이 실패했습니다." + invalid_grant: "제공된 권한 부여가 잘못되거나, 만료되거나, 취소되었거나, 권한 부여 요청에 사용된 리디렉션 URI와 일치하지 않거나, 다른 클라이언트에 지정되었습니다." + unsupported_grant_type: "권한 부여 유형이 권한 부여 서버에 의해 지원되지 않습니다." invalid_token: - revoked: 액세스 토큰이 취소되었습니다. - expired: 액세스 토큰이 만료되었습니다. - unknown: 액세스 토큰이 잘못되었습니다. + revoked: "액세스 토큰이 취소되었습니다." + expired: "액세스 토큰이 만료되었습니다." + unknown: "액세스 토큰이 잘못되었습니다." revoke: - unauthorized: 이 토큰을 취소할 권한이 없습니다. + unauthorized: "이 토큰을 취소할 권한이 없습니다." forbidden_token: - missing_scope: 이 리소스에 액세스하려면 "%{oauth_scopes}" 범위가 필요합니다. + missing_scope: '이 리소스에 액세스하려면 "%{oauth_scopes}" 범위가 필요합니다.' unsupported_browser: - title: 해당 브라우저는 오래되어 지원되지 않습니다. - message: 이 페이지에서 오류가 발생하고 기능이 저하될 수 있습니다. - update_message: 브라우저를 업데이트하시기 바랍니다. - close_warning: 이 경고를 무시하십시오. + title: "해당 브라우저는 오래되어 지원되지 않습니다." + message: "이 페이지에서 오류가 발생하고 기능이 저하될 수 있습니다." + update_message: "브라우저를 업데이트하시기 바랍니다." + close_warning: "이 경고를 무시하십시오." oauth: application: builtin: 기본 제공 인스턴스 애플리케이션 confidential: 기밀 - singular: OAuth 애플리케이션 - scopes: 범위 - client_credentials: 클라이언트 자격 증명 - plural: OAuth 애플리케이션 - named: OAuth 애플리케이션 '%{name}' - new: 새로운 OAuth 애플리케이션 + singular: "OAuth 애플리케이션" + scopes: "범위" + client_credentials: "클라이언트 자격 증명" + plural: "OAuth 애플리케이션" + named: "OAuth 애플리케이션 '%{name}'" + new: "새로운 OAuth 애플리케이션" non_confidential: 기밀 아님 default_scopes: "(기본 범위)" instructions: - enabled: 이 애플리케이션을 활성화하여 사용자가 이 애플리케이션으로 권한 부여를 수행할 수 있도록 합니다. - name: 애플리케이션 이름입니다. 권한 부여 시 다른 사용자에게 표시됩니다. - redirect_uri_html: '허용된 URL 인증 사용자로 리디렉션될 수 있습니다. 라인별로 하나의 항목이 있습니다.
- 데스크톱 애플리케이션을 등록하려면 다음 URL을 사용하세요. - - ' - confidential: 클라이언트 비밀번호를 기밀로 유지할 수 있는 위치에서 애플리케이션이 사용되는지 여부를 확인합니다. 네이티브 - 모바일 앱과 싱글 페이지 앱은 기밀로 간주되지 않습니다. - scopes: 애플리케이션이 액세스 권한을 부여할 범위를 확인하세요. 범위를 확인하지 않으면 api_v3로 가정됩니다. - client_credential_user_id: 클라이언트가 이 애플리케이션을 사용할 때 가장하기 위한 선택적 사용자 ID입니다. 공용 - 액세스만 허용하려면 비워두세요. - register_intro: OpenProject용 OAuth API 클라이언트 애플리케이션을 개발할 경우 이 양식을 사용하여 모든 - 사용자가 사용할 수 있도록 등록할 수 있습니다. - default_scopes: '' + enabled: "이 애플리케이션을 활성화하여 사용자가 이 애플리케이션으로 권한 부여를 수행할 수 있도록 합니다." + name: "애플리케이션 이름입니다. 권한 부여 시 다른 사용자에게 표시됩니다." + redirect_uri_html: > + 허용된 URL 인증 사용자로 리디렉션될 수 있습니다. 라인별로 하나의 항목이 있습니다.
데스크톱 애플리케이션을 등록하려면 다음 URL을 사용하세요. + confidential: "클라이언트 비밀번호를 기밀로 유지할 수 있는 위치에서 애플리케이션이 사용되는지 여부를 확인합니다. 네이티브 모바일 앱과 싱글 페이지 앱은 기밀로 간주되지 않습니다." + scopes: "애플리케이션이 액세스 권한을 부여할 범위를 확인하세요. 범위를 확인하지 않으면 api_v3로 가정됩니다." + client_credential_user_id: "클라이언트가 이 애플리케이션을 사용할 때 가장하기 위한 선택적 사용자 ID입니다. 공용 액세스만 허용하려면 비워두세요." + register_intro: "OpenProject용 OAuth API 클라이언트 애플리케이션을 개발할 경우 이 양식을 사용하여 모든 사용자가 사용할 수 있도록 등록할 수 있습니다." + default_scopes: "" header: builtin_applications: 기본 제공 OAuth 애플리케이션 other_applications: 기타 OAuth 애플리케이션 empty_application_lists: 등록된 OAuth 애플리케이션이 없습니다. - client_id: 클라이언트 ID - client_secret_notice: '클라이언트 비밀번호를 인쇄할 수 있는 유일한 순간입니다. 이 비밀번호를 기록하고 안전하게 보관하십시오. - 이 비밀번호는 암호로 취급해야 하며 나중에 OpenProject로 검색할 수 없습니다. - - ' + client_id: "클라이언트 ID" + client_secret_notice: > + 클라이언트 비밀번호를 인쇄할 수 있는 유일한 순간입니다. 이 비밀번호를 기록하고 안전하게 보관하십시오. 이 비밀번호는 암호로 취급해야 하며 나중에 OpenProject로 검색할 수 없습니다. authorization_dialog: - authorize: 권한 부여 - cancel: 취소하고 권한 부여를 거부합니다. - prompt_html: 계정 %{login}을(를) 사용하도록 %{application_name}에 - 권한을 부여하시겠습니까? + authorize: "권한 부여" + cancel: "취소하고 권한 부여를 거부합니다." + prompt_html: "계정 %{login}을(를) 사용하도록 %{application_name}에 권한을 부여하시겠습니까?" title: "%{application_name} 권한 부여" - wants_to_access_html: '이 애플리케이션은 사용자의 OpenProject 계정에 대한 액세스 권한을 요청합니다.
- 다음과 같은 사용 권한을 요청했습니다: - - ' + wants_to_access_html: > + 이 애플리케이션은 사용자의 OpenProject 계정에 대한 액세스 권한을 요청합니다.
다음과 같은 사용 권한을 요청했습니다: scopes: - api_v3: 전체 API v3 액세스 - api_v3_text: 애플리케이션은 사용자를 대신하여 작업을 수행하기 위해 OpenProject API v3에 대한 전체 읽기 및 쓰기 - 액세스 권한을 받습니다. + api_v3: "전체 API v3 액세스" + api_v3_text: "애플리케이션은 사용자를 대신하여 작업을 수행하기 위해 OpenProject API v3에 대한 전체 읽기 및 쓰기 액세스 권한을 받습니다." grants: - created_date: '승인:' - scopes: 권한 - successful_application_revocation: 애플리케이션 %{application_name} 취소에 성공했습니다. - none_given: 사용자 계정에 대한 액세스 권한이 OAuth 애플리케이션에 부여되지 않았습니다. + created_date: "승인:" + scopes: "권한" + successful_application_revocation: "애플리케이션 %{application_name} 취소에 성공했습니다." + none_given: "사용자 계정에 대한 액세스 권한이 OAuth 애플리케이션에 부여되지 않았습니다." x_active_tokens: other: "%{count}개 활성 토큰" flows: - authorization_code: 권한 부여 코드 흐름 - client_credentials: 클라이언트 자격 증명 흐름 - client_credentials: 클라이언트 자격 증명에 사용된 사용자 - client_credentials_impersonation_set_to: '클라이언트 자격 증명 사용자 설정:' - client_credentials_impersonation_warning: '참고: 이 애플리케이션에서 ''클라이언트 자격 증명'' 흐름을 - 사용하는 클라이언트는 이 사용자의 권한을 갖게 됩니다.' - client_credentials_impersonation_html: '기본적으로, OpenProject는 %{authorization_code_flow_link}에서 - OAuth 2.0 인증을 제공합니다. 선택적으로 %{client_credentials_flow_link}을(를) 활성화할 수 있지만, 대신하여 - 요청을 수행할 대상 사용자를 제공해야 합니다. - - ' - authorization_error: 권한 부여 오류가 발생했습니다. - revoke_my_application_confirmation: 이 애플리케이션을 제거하시겠습니까? 그러면 이 애플리케이션에 대해 활성화된 - %{token_count}개가 취소됩니다. - my_registered_applications: 등록된 OAuth 애플리케이션 + authorization_code: "권한 부여 코드 흐름" + client_credentials: "클라이언트 자격 증명 흐름" + client_credentials: "클라이언트 자격 증명에 사용된 사용자" + client_credentials_impersonation_set_to: "클라이언트 자격 증명 사용자 설정:" + client_credentials_impersonation_warning: "참고: 이 애플리케이션에서 '클라이언트 자격 증명' 흐름을 사용하는 클라이언트는 이 사용자의 권한을 갖게 됩니다." + client_credentials_impersonation_html: > + 기본적으로, OpenProject는 %{authorization_code_flow_link}에서 OAuth 2.0 인증을 제공합니다. 선택적으로 %{client_credentials_flow_link}을(를) 활성화할 수 있지만, 대신하여 요청을 수행할 대상 사용자를 제공해야 합니다. + authorization_error: "권한 부여 오류가 발생했습니다." + revoke_my_application_confirmation: "이 애플리케이션을 제거하시겠습니까? 그러면 이 애플리케이션에 대해 활성화된 %{token_count}개가 취소됩니다." + my_registered_applications: "등록된 OAuth 애플리케이션" oauth_client: urn_connection_status: - connected: 연결됨 - error: 오류 - failed_authorization: 인증 실패 - not_connected: 연결되지 않음 + connected: "연결됨" + error: "오류" + failed_authorization: "인증 실패" + not_connected: "연결되지 않음" labels: - label_oauth_integration: OAuth2 통합 - label_redirect_uri: 리디렉션 URI - label_request_token: 토큰 요청 - label_refresh_token: 토큰 새로고침 + label_oauth_integration: "OAuth2 통합" + label_redirect_uri: "리디렉션 URI" + label_request_token: "토큰 요청" + label_refresh_token: "토큰 새로고침" errors: - oauth_authorization_code_grant_had_errors: OAuth2 권한 부여에 실패했습니다 - oauth_reported: 'OAuth2 공급자가 다음을 보고했습니다:' - oauth_returned_error: OAuth2가 오류를 반환했습니다. - oauth_returned_json_error: OAuth2가 JSON 오류를 반환했습니다. - oauth_returned_http_error: OAuth2가 네트워크 오류를 반환했습니다. - oauth_returned_standard_error: OAuth2가 내부 오류를 반환했습니다. - wrong_token_type_returned: OAuth2가 잘못된 유형의 토큰을 반환했습니다. AccessToken::Bearer가 - 필요합니다. - oauth_issue_contact_admin: OAuth2가 오류를 보고했습니다. 시스템 관리자에게 문의하세요. - oauth_client_not_found: "'callback' 엔드포인트(redirect_uri)에서 OAuth2 클라이언트를 찾을 수 - 없습니다." - refresh_token_called_without_existing_token: '내부 오류: 기존 토큰 없이 refresh_token을 - 호출했습니다. - - ' - refresh_token_updated_failed: OAuthClientToken 업데이트 중에 오류 발생 - oauth_client_not_found_explanation: '이 오류는 OpenProject에서 client_id 및 client_secret을 - 업데이트했지만 OAuth2 공급자에서 ''Return URI'' 필드를 업데이트하지 않으면 나타납니다. - - ' - oauth_code_not_present: "'callback' 엔드포인트(redirect_uri)에서 OAuth2 'code'를 찾을 - 수 없습니다." - oauth_code_not_present_explanation: '이 오류는 OAuth2 공급자에서 잘못된 response_type을 선택한 - 경우 나타납니다. Response_type은 ''code'' 또는 이와 유사해야 합니다. - - ' - oauth_state_not_present: "'callback' 엔드포인트(redirect_uri)에서 OAuth2 'state'를 찾을 - 수 없습니다." - oauth_state_not_present_explanation: "'state'는 성공적인 OAuth2 인증 후 계속할 위치를 OpenProject에 - 표시하는 데 사용됩니다. 누락된 'state'는 설정 중에 나타날 수 있는 내부 오류입니다. 시스템 관리자에게 문의하세요.\n" + oauth_authorization_code_grant_had_errors: "OAuth2 권한 부여에 실패했습니다" + oauth_reported: "OAuth2 공급자가 다음을 보고했습니다:" + oauth_returned_error: "OAuth2가 오류를 반환했습니다." + oauth_returned_json_error: "OAuth2가 JSON 오류를 반환했습니다." + oauth_returned_http_error: "OAuth2가 네트워크 오류를 반환했습니다." + oauth_returned_standard_error: "OAuth2가 내부 오류를 반환했습니다." + wrong_token_type_returned: "OAuth2가 잘못된 유형의 토큰을 반환했습니다. AccessToken::Bearer가 필요합니다." + oauth_issue_contact_admin: "OAuth2가 오류를 보고했습니다. 시스템 관리자에게 문의하세요." + oauth_client_not_found: "'callback' 엔드포인트(redirect_uri)에서 OAuth2 클라이언트를 찾을 수 없습니다." + refresh_token_called_without_existing_token: > + 내부 오류: 기존 토큰 없이 refresh_token을 호출했습니다. + refresh_token_updated_failed: "OAuthClientToken 업데이트 중에 오류 발생" + oauth_client_not_found_explanation: > + 이 오류는 OpenProject에서 client_id 및 client_secret을 업데이트했지만 OAuth2 공급자에서 'Return URI' 필드를 업데이트하지 않으면 나타납니다. + oauth_code_not_present: "'callback' 엔드포인트(redirect_uri)에서 OAuth2 'code'를 찾을 수 없습니다." + oauth_code_not_present_explanation: > + 이 오류는 OAuth2 공급자에서 잘못된 response_type을 선택한 경우 나타납니다. Response_type은 'code' 또는 이와 유사해야 합니다. + oauth_state_not_present: "'callback' 엔드포인트(redirect_uri)에서 OAuth2 'state'를 찾을 수 없습니다." + oauth_state_not_present_explanation: > + 'state'는 성공적인 OAuth2 인증 후 계속할 위치를 OpenProject에 표시하는 데 사용됩니다. 누락된 'state'는 설정 중에 나타날 수 있는 내부 오류입니다. 시스템 관리자에게 문의하세요. rack_oauth2: - client_secret_invalid: 클라이언트 비밀이 유효하지 않습니다(client_secret_invalid) - invalid_request: 'OAuth2 인증 서버가 ''invalid_request''로 응답했습니다. 이 오류는 인증을 여러 - 번 시도했거나 기술적인 문제가 있는 경우 나타납니다. - - ' - invalid_response: OAuth2 인증 서버가 잘못된 응답을 제공했습니다(invalid_response). - invalid_grant: OAuth2 인증 서버가 재인증을 요청합니다(invalid_grant). - invalid_client: OAuth2 인증 서버가 OpenProject를 인식하지 못합니다(invalid_client). - unauthorized_client: OAuth2 인증 서버가 인증 유형을 거부합니다(unauthorized_client). - unsupported_grant_type: OAuth2 인증 서버가 재인증을 요청합니다(unsupported_grant_type). - invalid_scope: 요청한 리소스에 액세스할 수 없습니다(invalid_scope). + client_secret_invalid: "클라이언트 비밀이 유효하지 않습니다(client_secret_invalid)" + invalid_request: > + OAuth2 인증 서버가 'invalid_request'로 응답했습니다. 이 오류는 인증을 여러 번 시도했거나 기술적인 문제가 있는 경우 나타납니다. + invalid_response: "OAuth2 인증 서버가 잘못된 응답을 제공했습니다(invalid_response)." + invalid_grant: "OAuth2 인증 서버가 재인증을 요청합니다(invalid_grant)." + invalid_client: "OAuth2 인증 서버가 OpenProject를 인식하지 못합니다(invalid_client)." + unauthorized_client: "OAuth2 인증 서버가 인증 유형을 거부합니다(unauthorized_client)." + unsupported_grant_type: "OAuth2 인증 서버가 재인증을 요청합니다(unsupported_grant_type)." + invalid_scope: "요청한 리소스에 액세스할 수 없습니다(invalid_scope)." http: request: - failed_authorization: 서버 쪽 요청이 자체 인증에 실패했습니다. - missing_authorization: 인증 정보가 누락되어 서버 쪽 요청이 실패했습니다. + failed_authorization: "서버 쪽 요청이 자체 인증에 실패했습니다." + missing_authorization: "인증 정보가 누락되어 서버 쪽 요청이 실패했습니다." response: - unexpected: 예기치 않은 응답을 받았습니다. + unexpected: "예기치 않은 응답을 받았습니다." you: 당신 link: 링크 plugin_openproject_auth_plugins: - name: OpenProject 인증 플러그인 - description: 인증을 위해 OpenProject에서 OmniAuth 정책 공급자를 통합합니다. + name: "OpenProject 인증 플러그인" + description: "인증을 위해 OpenProject에서 OmniAuth 정책 공급자를 통합합니다." plugin_openproject_auth_saml: - name: OmniAuth SAML/Single-Sign On - description: OpenProject에 OmniAuth SAML 공급자를 추가합니다 + name: "OmniAuth SAML/Single-Sign On" + description: "OpenProject에 OmniAuth SAML 공급자를 추가합니다" enterprise_plans: - legacy_enterprise: Enterprise 플랜 + legacy_enterprise: "Enterprise 플랜" token: hashed_token: display_value_placeholder: "***" external_link_warning: - title: OpenProject 종료 - warning_message: OpenProject를 종료하고 외부 웹사이트를 방문하려고 합니다. 외부 웹사이트는 당사의 통제를 받지 않으며 - 개인정보 보호 및 보안 정책이 다를 수 있다는 점에 유의하시기 바랍니다. - continue_message: 다음 외부 링크로 계속하시겠습니까? - continue_button: 외부 웹사이트로 계속하기 + title: "OpenProject 종료" + warning_message: "OpenProject를 종료하고 외부 웹사이트를 방문하려고 합니다. 외부 웹사이트는 당사의 통제를 받지 않으며 개인정보 보호 및 보안 정책이 다를 수 있다는 점에 유의하시기 바랍니다." + continue_message: "다음 외부 링크로 계속하시겠습니까?" + continue_button: "외부 웹사이트로 계속하기" diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index d144a767648..9678b96342b 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -243,7 +243,7 @@ pl: title: "Zakres importu" caption: "Wybierz co chcesz zaimportować do OpenProject" caption_done: "Ukończono" - 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." + label_info: "Pamiętaj, że to narzędzie importu jest w wersji beta i nie może importować wszystkich typów danych. Poniżej znajduje się podsumowanie tego, co wystąpienie hosta Jira oferuje do importu i co to narzędzie jest obecnie w stanie zaimportować." description: "Wybierz dane, które chcesz zaimportować z dostępnych danych pobranych z hosta wystąpienia Jira." label_available_data: "Dostępne dane" label_not_available_data: "Niedostępne do importu" @@ -285,11 +285,11 @@ pl: select_dialog: filter_projects: "Filtruj według tekstu" import_dialog: - title: "Start this import?" - confirm_button: "Start import" + title: "Rozpocząć ten import?" + confirm_button: "Rozpocznij import" description: > - This importer is an alpha feature. It is not yet able to import all data from Jira and might leave incomplete data on this OpenProject instance. Do not use a production environment and create a backup of your OpenProject data before starting. - confirm: "I understand and made the necessary preparations" + Ten importer jest funkcją w wersji alfa. Nie jest jeszcze w stanie zaimportować wszystkich danych z Jira i może pozostawić niekompletne dane w tym wystąpieniu OpenProject. Nie używaj środowiska produkcyjnego, a przed rozpoczęciem utwórz kopię zapasową danych OpenProject. + confirm: "Rozumiem i poczyniłem(-am) niezbędne przygotowania" revert_dialog: title: "Na stałe cofnąć ten import?" description: "Spowoduje to usunięcie wszystkich zaimportowanych obiektów (w tym całych projektów), nawet jeśli po zaimportowaniu w OpenProject wystąpiła aktywność użytkownika w tych projektach." @@ -3193,7 +3193,7 @@ pl: line_0: Przepływy pracy AI przy użyciu bezpiecznego serwera MCP (plan Professional i wyższe) line_1: Ulepszona strona główna projektu z nowym widżetem budżetów i lepszą dostępnością line_2: "Spotkania: szablony spotkań (plan Basic i wyższe)" - line_3: Better transparency with project attribute comments + line_3: Większa przejrzystość dzięki komentarzom do atrybutów projektu line_4: Ulepszenia eksportu plików PDF line_5: Zwiększone bezpieczeństwo linków zewnętrznych (plan Premium i wyższe) line_6: Ulepszenia UI/UX w module Backlogs diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 886cdfdd486..9d3401c06cc 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -231,7 +231,7 @@ pt-BR: title: "Escopo da importação" caption: "Escolha o que deseja importar para o OpenProject" caption_done: "Concluído" - 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." + label_info: "Observe que esta ferramenta de importação está em versão beta e não consegue importar todos os tipos de dados. A seguir, um resumo do que a instância Jira host oferece para importação e do que esta ferramenta consegue importar no momento." description: "Selecione os dados que deseja importar a partir das informações disponíveis obtidas da instância Jira host." label_available_data: "Dados disponíveis" label_not_available_data: "Não disponível para importação" @@ -273,11 +273,11 @@ pt-BR: select_dialog: filter_projects: "Filtrar por texto" import_dialog: - title: "Start this import?" - confirm_button: "Start import" + title: "Iniciar esta importação?" + confirm_button: "Iniciar importação" description: > - This importer is an alpha feature. It is not yet able to import all data from Jira and might leave incomplete data on this OpenProject instance. Do not use a production environment and create a backup of your OpenProject data before starting. - confirm: "I understand and made the necessary preparations" + Este importador é um recurso em versão alfa. Ele ainda não consegue importar todos os dados do Jira e pode deixar dados incompletos nesta instância do OpenProject. Não use um ambiente de produção e crie um backup dos dados do OpenProject antes de iniciar. + confirm: "Entendo e fiz os preparativos necessários" revert_dialog: title: "Deseja reverter esta importação de forma permanente?" description: "Isso excluirá todos os objetos importados (incluindo projetos inteiros), mesmo que tenha havido atividade de usuários nesses projetos após a importação no OpenProject." @@ -3082,7 +3082,7 @@ pt-BR: line_0: Fluxos de trabalho de IA com um servidor MCP seguro (plano Professional ou superior) line_1: Página inicial do projeto aprimorada, com novo widget para orçamentos e acessibilidade melhorada line_2: "Reuniões: Modelos de reunião (plano Basic ou superior)" - line_3: Better transparency with project attribute comments + line_3: Mais transparência com comentários nos atributos do projeto line_4: Melhorias na exportação para PDF line_5: Segurança reforçada para links externos (plano Premium ou superior) line_6: Melhorias de UI/UX no módulo de Backlogs diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index feccc19e514..35e666122d1 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -231,7 +231,7 @@ pt-PT: title: "Âmbito de importação" caption: "Escolha o que quer importar para o OpenProject" caption_done: "Concluído" - 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." + label_info: "Tenha em atenção que esta ferramenta de importação está em fase beta e não consegue importar todos os tipos de dados. Eis um resumo do que a instância do Jira anfitrião oferece para importação, e o que esta ferramenta consegue importar neste momento." description: "Selecione os dados que pretende importar a partir dos dados disponíveis obtidos na instância anfitriã do Jira." label_available_data: "Dados disponíveis" label_not_available_data: "Não disponível para importação" @@ -273,11 +273,11 @@ pt-PT: select_dialog: filter_projects: "Filtrar por texto" import_dialog: - title: "Start this import?" - confirm_button: "Start import" + title: "Iniciar esta importação?" + confirm_button: "Iniciar importação" description: > - This importer is an alpha feature. It is not yet able to import all data from Jira and might leave incomplete data on this OpenProject instance. Do not use a production environment and create a backup of your OpenProject data before starting. - confirm: "I understand and made the necessary preparations" + Este importador é uma funcionalidade alfa. Ainda não consegue importar todos os dados do Jira, e pode deixar dados incompletos nesta instância do OpenProject. Não utilize um ambiente de produção e crie uma cópia de segurança dos seus dados do OpenProject antes de começar. + confirm: "Compreendo e fiz os preparativos necessários" revert_dialog: title: "Reverter permanentemente esta importação?" description: "Isto vai eliminar todos os objetos importados (incluindo projetos inteiros), mesmo que tenha havido atividade do utilizador nesses projetos após a importação no OpenProject." @@ -3082,7 +3082,7 @@ pt-PT: line_0: Fluxos de trabalho de IA com um servidor MCP seguro (plano Professional e superior) line_1: Página inicial do projeto melhorada com um novo widget para orçamentos e melhor acessibilidade line_2: "Reuniões: Modelos de reunião (Plano básico e superior)" - line_3: Better transparency with project attribute comments + line_3: Maior transparência nos comentários sobre os atributos dos projetos line_4: Melhorias na exportação de PDF line_5: Maior segurança para ligações externas (plano Premium e superior) line_6: Melhorias de UI/UX no módulo Backlogs diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index 1d5d5cf760f..6cabe449eee 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -1,4 +1,24 @@ ---- +#-- 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. +#++ uk: no_results_title_text: Немає що виводити на екран. activities: @@ -7,499 +27,412 @@ uk: work_packages: activity_tab: no_results_title_text: Немає дій - no_results_description_text: Виберіть "Показати все", щоб показати всі дії - і коментарі - label_activity_show_all: Показати все - label_activity_show_only_comments: Показувати лише коментарі - label_activity_show_only_changes: Показувати лише зміни - label_sort_asc: Найновіші внизу - label_sort_desc: Найновіші вгорі - label_type_to_comment: Додайте коментар. Введіть @, щоб сповістити людину. - label_submit_comment: Надіслати коментар + no_results_description_text: 'Виберіть "Показати все", щоб показати всі дії і коментарі' + label_activity_show_all: "Показати все" + label_activity_show_only_comments: "Показувати лише коментарі" + label_activity_show_only_changes: "Показувати лише зміни" + label_sort_asc: "Найновіші внизу" + label_sort_desc: "Найновіші вгорі" + label_type_to_comment: "Додайте коментар. Введіть @, щоб сповістити людину." + label_submit_comment: "Надіслати коментар" label_who: Хто? - changed_on: змінено - created_on: створив(-ла) - changed: змінив(-ла) - created: створив(-ла) - commented: прокоментував(-ла) + changed_on: "змінено" + created_on: "створив(-ла)" + changed: "змінив(-ла)" + created: "створив(-ла)" + commented: "прокоментував(-ла)" internal_comment: Внутрішній коментар internal_journal: Внутрішні коментарі видимі для визначеної групи учасників. - unsaved_changes_confirmation_message: У вас є незбережені зміни. Справді закрити - редактор? + unsaved_changes_confirmation_message: У вас є незбережені зміни. Справді закрити редактор? internal_comment_confirmation: - title: Зробити цей коментар загальнодоступним? - heading: Зробити цей коментар загальнодоступним? - description: Ваш коментар буде видимий усім, хто має доступ до цього пакета - робіт. Продовжити? - confirm_button_text: Зробити загальнодоступним + title: "Зробити цей коментар загальнодоступним?" + heading: "Зробити цей коментар загальнодоступним?" + description: "Ваш коментар буде видимий усім, хто має доступ до цього пакета робіт. Продовжити?" + confirm_button_text: "Зробити загальнодоступним" admin: plugins: no_results_title_text: Зараз немає встановлених плагінів. - no_results_content_text: Щоб дізнатися більше, ознайомтеся з нашою сторінкою - інтеграцій і планів. + no_results_content_text: Щоб дізнатися більше, ознайомтеся з нашою сторінкою інтеграцій і планів. custom_styles: - color_theme: Колірна тема + color_theme: "Колірна тема" color_theme_custom: "(Власний)" - tab_interface: Інтерфейс - tab_branding: Брендування - tab_pdf_export_styles: Стилі експорту PDF - tab_pdf_export_font: Шрифт для експорту в PDF + tab_interface: "Інтерфейс" + tab_branding: "Брендування" + tab_pdf_export_styles: "Стилі експорту PDF" + tab_pdf_export_font: "Шрифт для експорту в PDF" fonts: - file_too_large: завеликий (максимальний розмір – %{count} МБ). - file_is_invalid: не є дійсним файлом шрифту TTF. + file_too_large: "завеликий (максимальний розмір – %{count} МБ)." + file_is_invalid: "не є дійсним файлом шрифту TTF." colors: - primary-button-color: Основна кнопка - accent-color: Акцент - header-bg-color: Фон заголовка - main-menu-bg-color: Фон головного меню - main-menu-bg-selected-background: Головне меню в разі вибору - custom_colors: Кольори за власними вподобаннями - manage_colors: Редагувати параметри вибору кольору + primary-button-color: "Основна кнопка" + accent-color: "Акцент" + header-bg-color: "Фон заголовка" + main-menu-bg-color: "Фон головного меню" + main-menu-bg-selected-background: "Головне меню в разі вибору" + custom_colors: "Кольори за власними вподобаннями" + manage_colors: "Редагувати параметри вибору кольору" instructions: - primary-button-color: Насичений акцентний колір використовується для більшості - важливих кнопок на екрані. - accent-color: Колір для посилань та інших елементів, які має бути виділено. - main-menu-bg-color: Колір фону меню зліва. - theme_warning: Змінення теми перезапише ваш власний стиль. У такому разі дизайн - буде втрачено. Справді продовжити? + primary-button-color: "Насичений акцентний колір використовується для більшості важливих кнопок на екрані." + accent-color: "Колір для посилань та інших елементів, які має бути виділено." + main-menu-bg-color: "Колір фону меню зліва." + theme_warning: Змінення теми перезапише ваш власний стиль. У такому разі дизайн буде втрачено. Справді продовжити? enterprise: delete_dialog: - title: Вилучити корпоративний маркер - heading: Вилучити цей корпоративний маркер? - confirmation: Справді видалити цей маркер підтримки версії Enterprise? + title: "Вилучити корпоративний маркер" + heading: "Вилучити цей корпоративний маркер?" + confirmation: "Справді видалити цей маркер підтримки версії Enterprise?" create_dialog: - title: Додати маркер Enterprise - type_token_text: Текст вашого маркера Enterprise - token_placeholder: Вставте тут свій маркер підтримки версії Enterprise - token_caption: Щоб дізнатися більше про те, як активувати версію Enterprise, - перегляньте [документацію](docs_url). - add_token: Додати маркер підтримки версії Enterprise - replace_token: Замініть поточний маркер підтримки - order: Замовте локальну версію Enterprise - paste: Вставте свій маркер підтримки версії Enterprise - required_for_feature: Це доповнення доступне лише з активним маркером підтримки - версії Enterprise. - enterprise_link: Для отримання додаткової інформації натисніть тут. - start_trial: Розпочати безкоштовну пробну версію - book_now: Забронювати зараз - get_quote: Дізнатися ціну + title: "Додати маркер Enterprise" + type_token_text: "Текст вашого маркера Enterprise" + token_placeholder: "Вставте тут свій маркер підтримки версії Enterprise" + token_caption: "Щоб дізнатися більше про те, як активувати версію Enterprise, перегляньте [документацію](docs_url)." + add_token: "Додати маркер підтримки версії Enterprise" + replace_token: "Замініть поточний маркер підтримки" + order: "Замовте локальну версію Enterprise" + paste: "Вставте свій маркер підтримки версії Enterprise" + required_for_feature: "Це доповнення доступне лише з активним маркером підтримки версії Enterprise." + enterprise_link: "Для отримання додаткової інформації натисніть тут." + start_trial: "Розпочати безкоштовну пробну версію" + book_now: "Забронювати зараз" + get_quote: "Дізнатися ціну" buttons: - upgrade: Оновити зараз - contact: Зв’яжіться з нами, щоб отримати демоверсію + upgrade: "Оновити зараз" + contact: "Зв’яжіться з нами, щоб отримати демоверсію" status: - expired: Термін дії минув - expiring_soon: Термін дії незабаром мине - in_grace_period: У пільговому періоді - invalid_domain: Недійсний домен - not_active: Неактивний - trial: Пробний період + expired: "Термін дії минув" + expiring_soon: "Термін дії незабаром мине" + in_grace_period: "У пільговому періоді" + invalid_domain: "Недійсний домен" + not_active: "Неактивний" + trial: "Пробний період" jemalloc_allocator: Розподіл пам'яті Jemalloc journal_aggregation: explanation: - text: Окремі дії користувача (напр., оновлення робочого пакета двічі) зводяться - в одну дію, якщо відмінність у часі між ними менша за вказаний проміжок - часу. Їх буде виведено як окремі дії в межах додатка. Крім того, це призведе - до затримки сповіщень на такий самий проміжок часу, що зменшить кількість - електронних листів, які надсилатимуться, а також вплине на затримку %{webhook_link}. - link: вебгука + text: "Окремі дії користувача (напр., оновлення робочого пакета двічі) зводяться в одну дію, якщо відмінність у часі між ними менша за вказаний проміжок часу. Їх буде виведено як окремі дії в межах додатка. Крім того, це призведе до затримки сповіщень на такий самий проміжок часу, що зменшить кількість електронних листів, які надсилатимуться, а також вплине на затримку %{webhook_link}." + link: "вебгука" import: - title: Імпортувати + title: "Iмпорт" jira: - title: Імпорт із Jira - description: Використовуйте цей інструмент для імпорту даних зі свого екземпляра - Jira. Ви можете налаштувати кілька хостів Jira й вибрати, що імпортувати в - кожному циклі імпорту. + title: "Імпорт із Jira" + description: "Використовуйте цей інструмент для імпорту даних зі свого екземпляра Jira. Ви можете налаштувати кілька хостів Jira й вибрати, що імпортувати в кожному циклі імпорту." errors: - cannot_delete_with_imports: Не вдається видалити хост Jira з наявними процесами - імпорту + cannot_delete_with_imports: "Не вдається видалити хост Jira з наявними процесами імпорту" blank: - title: Ще немає налаштованих хостів Jira - description: Налаштуйте хост Jira, щоб почати імпорт елементів із Jira в цей - екземпляр OpenProject. + title: "Ще немає налаштованих хостів Jira" + description: "Налаштуйте хост Jira, щоб почати імпорт елементів із Jira в цей екземпляр OpenProject." configuration: - title: Конфігурація Jira - new: Нова конфігурація + title: "Конфігурація Jira" + new: "Нова конфігурація" banner: - title: Обмежений імпорт - description: 'This import tool is currently in beta and can only import basic - data: projects, issues (name, title, description, attachments), users (name, - email, project membership), statuses, and types. It cannot import workflows, - custom fields, issue relations, or permissions. We currently only support - Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not - supported at this time.' + title: "Обмежений імпорт" + description: "Цей інструмент зараз доступний лише як бета-версія і може імпортувати тільки основні дані: проєкти, задачі (назву, заголовок, опис, вкладення), користувачів (ім’я, електронну адресу, дані про участь у проєктах), статуси й типи. Він не може імпортувати робочі процеси, користувацькі поля, зв’язки між задачами чи дозволи. Зараз ми підтримуємо лише версії Jira Server / Data Center 10.x і 11.x. Хмарні екземпляри поки що не підтримуються." form: fields: - name: Назва - url: URL-адреса сервера / центру обробки даних Jira - personal_access_token: Персональний маркер доступу - button_add: Додати конфігурацію - button_save: Зберегти конфігурацію - button_test: Перевірити конфігурацію - button_delete_token: Видалити маркер - delete_token_confirm: Справді видалити маркер? З’єднання з Jira буде розірвано. - label_testing: Перевірка конфігурації… - token_deleted: Маркер успішно видалено. + name: "Назва" + url: "URL-адреса Jira Server / Data Center" + personal_access_token: "Персональний маркер доступу" + button_add: "Додати конфігурацію" + button_save: "Зберегти конфігурацію" + button_test: "Перевірити конфігурацію" + button_delete_token: "Видалити маркер" + delete_token_confirm: "Справді видалити маркер? З’єднання з Jira буде розірвано." + label_testing: "Перевірка конфігурації…" + token_deleted: "Маркер успішно видалено." test: - success: Встановлено з’єднання із сервером %{server} (версії %{version}) - failed: 'З’єднання не встановлено: не вдалось отримати інформацію про сервер' - error: Під час перевірки з’єднання сталася неочікувана помилка - connection_error: 'Помилка з’єднання: %{message}' - parse_error: Failed to parse the response from the server. The server may - not be a valid Jira instance. - api_error: Інтерфейс Jira API повернув статус помилки %{status}. Перевірте - URL-адресу свого екземпляра Jira й маркер API. - token_error: Недійсний маркер API. Перевірте облікові дані, що використовуються - в конфігурації. - missing_credentials: Укажіть URL-адресу й персональний маркер доступу для - перевірки з’єднання - invalid_url: Укажіть дійсну URL-адресу + success: "Встановлено з’єднання із сервером %{server} (версії %{version})" + failed: "З’єднання не встановлено: не вдалось отримати інформацію про сервер" + error: "Під час перевірки з’єднання сталася неочікувана помилка" + connection_error: "Помилка з’єднання: %{message}" + parse_error: "Не вдалося проаналізувати відповідь сервера. Можливо, він не є дійсним екземпляром Jira." + api_error: "Інтерфейс Jira API повернув статус помилки «%{status}». Перевірте URL-адресу свого екземпляра Jira й маркер API." + token_error: "Недійсний маркер API. Перевірте облікові дані, що використовуються в конфігурації." + missing_credentials: "Укажіть URL-адресу й персональний маркер доступу для перевірки з’єднання" + invalid_url: "Укажіть дійсну URL-адресу" client: - connection_error: 'Не вдалося під’єднатися до сервера Jira: %{message}' - connection_timeout: 'Час очікування на встановлення з’єднання до сервера Jira - минув: %{message}' - parse_error: 'Не вдалося проаналізувати відповідь Jira API: %{message}' - api_error: Інтерфейс Jira API повернув статус помилки %{status} + connection_error: "Не вдалося під’єднатися до сервера Jira: %{message}" + connection_timeout: "Час очікування на встановлення з’єднання до сервера Jira минув: %{message}" + parse_error: "Не вдалося проаналізувати відповідь Jira API: %{message}" + api_error: "Інтерфейс Jira API повернув статус помилки «%{status}»" columns: - projects: Проєкти - last_change: Остання зміна - added: Додано + projects: "Проєкти" + last_change: "Остання зміна" + added: "Додано" label_ago: "%{amount} тому" run: - title: Цикл імпорту - history: Історія - remove_error: Імпорт Jira не можна видалити, поки він виконується - import_blocked_error: Зараз виконується або очікує на перевірку ще один цикл - імпорту Jira. Завершіть або скасуйте його, якщо потрібно почати новий імпорт. + title: "Цикл імпорту" + history: "Історія" + remove_error: "Імпорт Jira не можна видалити, поки він виконується" + import_blocked_error: "Зараз виконується або очікує на перевірку ще один цикл імпорту Jira. Завершіть або скасуйте його, якщо потрібно почати новий імпорт." blank: - title: Немає налаштованих циклів імпорту - description: Створіть цикл імпорту, щоб почати імпортувати інформацію із - цього екземпляра Jira + title: "Немає налаштованих циклів імпорту" + description: "Створіть цикл імпорту, щоб почати переносити інформацію із цього екземпляра Jira" 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: Цикл імпорту - button_edit_configuration: Змінити конфігурацію + description: "Ви можете переносити різні набори даних у різних циклах імпорту. Цикл імпорту можна скасувати відразу після виконання в режимі перевірки, але не після завершення." + button_import_run: "Цикл імпорту" + button_edit_configuration: "Змінити конфігурацію" status: - initial: Початок - instance_meta_fetching: Отримання метаданих - instance_meta_error: Не вдалось отримати метадані - instance_meta_done: Метадані отримано - configuring: Вибір обсягу - projects_meta_fetching: Отримання даних про проєкт - projects_meta_error: Не вдалось отримати дані про проєкт - projects_meta_done: Дані зібрано - importing: Виконання - import_error: Помилка під час імпорту - imported: Режим перевірки - reverting: Скасування внесених змін - revert_error: Помилка під час скасування внесених змін - reverted: Внесені зміни скасовано - completed: Завершено + initial: "Початок" + instance_meta_fetching: "Отримання метаданих" + instance_meta_error: "Не вдалось отримати метадані" + instance_meta_done: "Метадані отримано" + configuring: "Вибір обсягу" + projects_meta_fetching: "Отримання даних про проєкт" + projects_meta_error: "Не вдалось отримати дані про проєкт" + projects_meta_done: "Дані зібрано" + importing: "Виконання" + import_error: "Помилка під час імпорту" + imported: "Режим перевірки" + reverting: "Скасування внесених змін" + revert_error: "Помилка під час скасування внесених змін" + reverted: "Внесені зміни скасовано" + completed: "Завершено" wizard: - button_retry: Повторити спробу + button_retry: "Повторити спробу" parts: projects: - one: 1 проєкт + one: "1 проєкт" few: "%{count} проєкти" many: "%{count} проєктів" other: "%{count} проєкту" issues: - one: 1 проблема - few: "%{count} проблеми" - many: "%{count} проблем" - other: "%{count} проблеми" + one: "1 задача" + few: "%{count} задачі" + many: "%{count} задач" + other: "%{count} задачі" work_packages: - one: 1 пакет робіт + one: "1 пакет робіт" few: "%{count} пакети робіт" many: "%{count} пакетів робіт" other: "%{count} пакета робіт" types: - one: 1 тип + one: "1 тип" few: "%{count} типи" many: "%{count} типів" other: "%{count} типу" statuses: - one: 1 статус + one: "1 статус" few: "%{count} статуси" many: "%{count} статусів" other: "%{count} статусу" users: - one: 1 користувач + one: "1 користувач" few: "%{count} користувачі" many: "%{count} користувачів" other: "%{count} користувача" groups: fetch: - title: Отримайте базові дані + title: "Отримайте базові дані" groups_and_users: - title: Групи й користувачі + title: "Групи й користувачі" configuration: - title: Налаштуйте імпорт + title: "Налаштуйте імпорт" confirming: - title: Підтвердіть і імпортуйте + title: "Підтвердьте й імпортуйте" review: - title: Перевірте імпорт + title: "Перевірте імпорт" sections: fetch_data: - title: Отримайте метадані екземпляра - caption_done: Завершено - description: Check what data is available for import in the host Jira - instance. - button_fetch: Check available data - label_progress: Отримання даних із Jira… + title: "Отримайте метадані екземпляра" + caption_done: "Завершено" + description: "Перевірте, які дані доступні для імпорту в хост-екземплярі Jira." + button_fetch: "Переглянути доступні дані" + label_progress: "Отримання даних із Jira…" groups_and_users: - title: Групи й користувачі + title: "Групи й користувачі" import_scope: - title: Обсяг імпорту - caption: Виберіть, що ви хочете імпортувати в OpenProject - caption_done: Завершено - 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_available_data: Доступні дані - label_not_available_data: Недоступно для імпорту - button_select_projects: Виберіть проєкти для імпорту - button_continue: Продовжити - label_import: Виберіть проєкти, які ви хочете імпортувати. - button_select: Вибрати проєкти - label_selected_data: Вибрані дані для імпорту - label_progress: Отримання даних із Jira… + title: "Обсяг імпорту" + caption: "Виберіть вміст, який потрібно імпортувати в OpenProject" + caption_done: "Завершено" + label_info: "Зверніть увагу: цей інструмент доступний лише в бета-версії і не може імпортувати всі типи даних. Ось короткий опис вмісту, доступного для імпорту в хост-екземплярі Jira, а також даних, які інструмент може перенести прямо зараз." + description: "Виберіть дані, які потрібно імпортувати з доступного вмісту, отриманого з хост-екземпляра Jira." + label_available_data: "Доступні дані" + label_not_available_data: "Недоступно для імпорту" + button_select_projects: "Виберіть проєкти для імпорту" + button_continue: "Продовжити" + label_import: "Виберіть проєкти, які ви хочете імпортувати." + button_select: "Вибрати проєкти" + label_selected_data: "Дані, вибрані для імпорту" + label_progress: "Отримання даних із Jira…" elements: - relations: Зв’язки між проблемами - workflows: Робочі процеси на рівні проєктів - users: Користувачі - sprints: Спринти - schemes: Схеми - permissions: Дозволи для користувачів, груп і проєктів + relations: "Зв’язки між задачами" + workflows: "Робочі процеси на рівні проєктів" + users: "Користувачі" + sprints: "Спринти" + schemes: "Схеми" + permissions: "Дозволи для користувачів, груп і проєктів" confirm_import: - title: Імпортуйте дані - caption: Перегляньте налаштування імпорту й запустіть його - caption_done: Завершено - label_available_data: Дані, доступні для імпорту - button_start: Почати імпорт - description: Ви збираєтеся запустити імпорт із наведеними далі налаштуваннями. - label_progress: Виконується імпорт… - label_import_data: Зараз імпортується + title: "Імпортуйте дані" + caption: "Перегляньте налаштування імпорту й запустіть його" + caption_done: "Завершено" + label_available_data: "Дані, доступні для імпорту" + button_start: "Почати імпорт" + description: "Ви збираєтеся запустити імпорт із наведеними далі налаштуваннями." + label_progress: "Виконується імпорт…" + label_import_data: "Зараз імпортується" import_result: - title: Результати циклу імпорту - caption: Перегляньте дані про цикл імпорту або скасуйте внесені зміни - info: Циклу імпорту успішно виконано. - label_results: Імпортовано - label_revert: Скасувати імпорт - button_revert: Скасувати імпорт - button_done: Завершити імпорт - preview_description: Імпортовані дані зараз перебувають у режимі перевірки. - Натисніть «Завершити імпорт», щоб застосувати зміни, або «Скасувати - імпорт», щоб скасувати всі зміни, внесені під час цього циклу імпорту. - label_finalizing_progress: Завершення імпорту… - label_finalized: Імпорт завершено. - label_revert_progress: Скасування імпорту… - label_reverted: Імпорт скасовано. + title: "Результати циклу імпорту" + caption: "Перегляньте дані про цикл імпорту або скасуйте внесені зміни" + info: "Циклу імпорту успішно виконано." + label_results: "Імпортовано" + label_revert: "Скасувати імпорт" + button_revert: "Скасувати імпорт" + button_done: "Завершити імпорт" + preview_description: 'Імпортовані дані зараз перебувають у режимі перевірки. Натисніть «Завершити імпорт», щоб застосувати зміни, або «Скасувати імпорт», щоб скасувати всі зміни, внесені під час цього циклу.' + label_finalizing_progress: "Завершення імпорту…" + label_finalized: "Імпорт завершено." + label_revert_progress: "Скасування імпорту…" + label_reverted: "Імпорт скасовано." select_dialog: - filter_projects: Фільтрування за текстом - revert_dialog: - title: Остаточно скасувати цей імпорт? - description: Буде видалено всі імпортовані об’єкти (зокрема цілі проєкти), - навіть якщо користувачі виконували з ними дії в OpenProject після імпорту. - confirm: Я розумію, що скасування внесених змін призведе до остаточного - видалення даних - finalize_dialog: - title: Завершити цей імпорт? - description: Якщо ви завершите цей імпорт, то більше не зможете його скасувати. - Усі імпортовані дані буде остаточно збережено в системі. - confirm: Я розумію, що цю дію не можна відмінити - confirm_button: Зрозуміло - select_projects: - title: Виберіть проєкти + filter_projects: "Фільтрування за текстом" import_dialog: - title: Почати цей імпорт? - confirm_button: Почати імпорт - description: 'This importer is an alpha feature. It is not yet able to - import all data from Jira and might leave incomplete data on this OpenProject - instance. Do not use a production environment and create a backup - of your OpenProject data before starting. - - ' - confirm: Я розумію; відповідну підготовку виконано + title: "Почати цей імпорт?" + confirm_button: "Почати імпорт" + description: > + Цей модуль імпорту є альфа-функцією. Він ще не може імпортувати всі дані з Jira, тому в результаті в екземплярі OpenProject можуть бути неповні дані. Не використовуйте середовище для експлуатації і створіть резервну копію даних OpenProject, перш ніж починати роботу із цією функцією. + confirm: "Я розумію; відповідну підготовку виконано" + revert_dialog: + title: "Остаточно скасувати цей імпорт?" + description: "Буде видалено всі імпортовані об’єкти (зокрема цілі проєкти), навіть якщо користувачі виконували з ними дії в OpenProject після імпорту." + confirm: "Я розумію, що скасування внесених змін призведе до остаточного видалення даних" + finalize_dialog: + title: "Завершити цей імпорт?" + description: "Якщо ви завершите цей імпорт, то більше не зможете його скасувати. Усі імпортовані дані буде остаточно збережено в системі." + confirm: "Я розумію, що цю дію не можна відмінити" + confirm_button: "Зрозуміло" + select_projects: + title: "Виберіть проєкти" 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. - resources_heading: Ресурси - resources_description: OpenProject реалізує наведені нижче ресурси. Кожен - із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися - більше, ознайомтеся з [документацією щодо ресурсів MCP] (docs_url). - resources_submit: Оновити ресурси - tools_heading: Інструменти - tools_description: OpenProject реалізує наведені нижче інструменти. Кожен - із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися - більше, ознайомтеся з [документацією щодо інструментів MCP] (docs_url). - tools_submit: Оновити інструменти + description: "Протокол контексту моделі дає змогу агентам ШІ надавати користувачам інструменти й ресурси, доступні в цьому екземплярі OpenProject. Ця функція досі доступна лише в бета-версії." + resources_heading: "Ресурси" + resources_description: "OpenProject реалізує наведені нижче ресурси. Кожен із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися більше, ознайомтеся з [документацією щодо ресурсів MCP](docs_url)." + resources_submit: "Оновити ресурси" + tools_heading: "Інструменти" + tools_description: "OpenProject реалізує наведені нижче інструменти. Кожен із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися більше, ознайомтеся з [документацією щодо інструментів MCP] (docs_url)." + tools_submit: "Оновити інструменти" multi_update: - success: Конфігурації MCP оновлено. + success: "Конфігурації MCP оновлено." server_form: - description_caption: Опис сервера MCP для інших додатків, які підключаються - до нього. - title_caption: Короткий заголовок, який відображається для додатків, що підключаються - до сервера MCP. - tool_response_format: Формат відповіді інструмента - tool_response_format_content_only_label: Лише вміст - tool_response_format_content_only_caption: 'Choose this if MCP clients connecting - to this instance do not support structured content. Tool responses will - only contain plain text content and leave out the structured version. - - ' - tool_response_format_full_label: Full - tool_response_format_full_caption: 'The most compatible option. Tool responses - will include both regular and structured content, allowing MCP clients to - choose which format they want to read. This may increase the number of tokens - that the language model has to process, potentially increasing cost and - decreasing performance. - - ' - tool_response_format_structured_only_label: Structured content only - tool_response_format_structured_only_caption: 'Choose this if you are certain - that MCP clients connecting to this instance support structured content. - Tool responses will only include structured content and leave out its text - representation. - - ' + description_caption: "Опис сервера MCP для інших додатків, які підключаються до нього." + title_caption: "Короткий заголовок, який відображається для додатків, що підключаються до сервера MCP." + tool_response_format: "Формат відповіді інструмента" + tool_response_format_content_only_label: "Лише звичайний вміст" + tool_response_format_content_only_caption: > + Виберіть цей варіант, якщо клієнти MCP, які підключаються до цього екземпляра, не підтримують структурований вміст. У відповідях інструмента буде лише звичайний текстовий вміст, і вони не включатимуть структуровану версію. + tool_response_format_full_label: "Увесь вміст" + tool_response_format_full_caption: > + Цей варіант забезпечує найкращу сумісність. Відповіді інструмента включатимуть як звичайний, так і структурований вміст, що дозволить клієнтам MCP вибирати, який формат читати. Це може збільшити кількість токенів, які має обробити мовна модель, що, імовірно, призведе до зростання витрат і зниження продуктивності. + tool_response_format_structured_only_label: "Лише структурований вміст" + tool_response_format_structured_only_caption: > + Виберіть цей варіант, якщо ви впевнені, що клієнти MCP, які підключаються до цього екземпляра, підтримують структурований вміст. У відповідях інструмента буде лише структурований вміст, і вони не включатимуть його текстове представлення. update: - failure: Не вдалось оновити конфігурацію MCP. - success: Конфігурацію MCP оновлено. + failure: "Не вдалось оновити конфігурацію MCP." + success: "Конфігурацію MCP оновлено." scim_clients: authentication_methods: - sso: JWT від постачальника ідентифікаційних даних - oauth2_client: Облікові дані клієнта OAuth 2.0 - oauth2_token: Постійний маркер доступу + sso: "JWT від постачальника ідентифікаційних даних" + oauth2_client: "Облікові дані клієнта OAuth 2.0" + oauth2_token: "Постійний маркер доступу" created_client_credentials_dialog_component: - title: Облікові дані клієнта створено - heading: Облікові дані клієнта згенеровано - one_time_hint: Це єдиний раз, коли ви побачите секретний ключ клієнта. Обов’язково - скопіюйте його зараз. + title: "Облікові дані клієнта створено" + heading: "Облікові дані клієнта згенеровано" + one_time_hint: "Це єдиний раз, коли ви побачите секретний ключ клієнта. Обов’язково скопіюйте його зараз." created_token_dialog_component: - title: Маркер створено - heading: Маркер згенеровано - label_token: Маркер - one_time_hint: Це єдиний раз, коли ви побачите цей маркер. Обов’язково скопіюйте - його зараз. + title: "Маркер створено" + heading: "Маркер згенеровано" + label_token: "Маркер" + one_time_hint: "Це єдиний раз, коли ви побачите цей маркер. Обов’язково скопіюйте його зараз." delete_scim_client_dialog_component: - title: Видалити клієнт SCIM - heading: Ви дійсно хочете видалити цей клієнт SCIM? - description: Цей клієнт SCIM більше не може оновлювати користувачів, якими - керує. + title: "Видалити клієнт SCIM" + heading: "Ви дійсно хочете видалити цей клієнт SCIM?" + description: "Цей клієнт SCIM більше не може оновлювати користувачів, якими керує." edit: - label_delete_scim_client: Видалити клієнт SCIM + label_delete_scim_client: "Видалити клієнт SCIM" form: - auth_provider_description: Це сервіс, який користувачі, додані SCIM-постачальником, - будуть використовувати для автентифікації в OpenProject. - authentication_method_description_html: Ось так клієнт SCIM автентифікується - в OpenProject. Переконайтеся, що маркери OAuth включають область scim_v2. - description: Щоб отримати додаткову інформацію про ці варіанти конфігурації, - перегляньте [документацію щодо налаштування клієнтів SCIM](docs_url). - jwt_sub_description: Наприклад, для Keycloak це UUID пов’язаного з клієнтом - SCIM облікового запису сервісу. Інформацію про те, як знайти тему для свого - варіанту використання, наведено в [документації](docs_url). - name_description: Виберіть ім’я, яке допоможе іншим адміністраторам чітко - зрозуміти, навіщо налаштовано цей клієнт. + auth_provider_description: "Це сервіс, який користувачі, додані SCIM-постачальником, будуть використовувати для автентифікації в OpenProject." + authentication_method_description_html: "Ось так клієнт SCIM автентифікується в OpenProject. Переконайтеся, що маркери OAuth включають область scim_v2." + description: "Щоб отримати додаткову інформацію про ці варіанти конфігурації, перегляньте [документацію щодо налаштування клієнтів SCIM](docs_url)." + jwt_sub_description: "Наприклад, для Keycloak це UUID пов’язаного з клієнтом SCIM облікового запису сервісу. Інформацію про те, як знайти тему для свого варіанту використання, наведено в [документації](docs_url)." + name_description: "Виберіть ім’я, яке допоможе іншим адміністраторам чітко зрозуміти, навіщо налаштовано цей клієнт." index: - description: Клієнти SCIM, налаштовані тут, можуть взаємодіяти з API сервера - SCIM в OpenProject, щоб надавати, оновлювати й видаляти облікові записи - й групи. - label_create_button: Додати клієнт SCIM + description: "Клієнти SCIM, налаштовані тут, можуть взаємодіяти з API сервера SCIM в OpenProject, щоб надавати, оновлювати й видаляти облікові записи й групи." + label_create_button: "Додати клієнт SCIM" new: - title: Новий клієнт SCIM + title: "Новий клієнт SCIM" revoke_static_token_dialog_component: - confirm_button: Анулювати - title: Анулювати статичний маркер - heading: Ви дійсно хочете анулювати цей маркер? - description: Клієнт SCIM, який використовує цей маркер, більше не зможе отримати - доступ до API сервера SCIM в OpenProject. + confirm_button: "Анулювати" + title: "Анулювати статичний маркер" + heading: "Ви дійсно хочете анулювати цей маркер?" + description: "Клієнт SCIM, який використовує цей маркер, більше не зможе отримати доступ до API сервера SCIM в OpenProject." table_component: blank_slate: - title: Ще немає налаштованих клієнтів SCIM - description: Додайте клієнтів, щоб побачити їх тут - user_count: Користувачі + title: "Ще немає налаштованих клієнтів SCIM" + description: "Додайте клієнтів, щоб побачити їх тут" + user_count: "Користувачі" token_list_component: - description: Клієнт SCIM може передавати маркери, які ви генеруєте тут, для - доступу до API сервера SCIM в OpenProject. - heading: Маркери - label_add_token: Маркер - label_aria_add_token: Додати маркер + description: "Клієнт SCIM може передавати маркери, які ви генеруєте тут, для доступу до API сервера SCIM в OpenProject." + heading: "Маркери" + label_add_token: "Маркер" + label_aria_add_token: "Додати маркер" token_table_component: blank_slate: - title: Ще не створено жодного маркера - description: Його можна створити прямо зараз - expired: Термін дії минув %{date} - revoked: Анульовано %{date} - title: Таблиця маркерів доступу + title: "Ще не створено жодного маркера" + description: "Його можна створити прямо зараз" + expired: "Термін дії минув %{date}" + revoked: "Анульовано %{date}" + title: "Таблиця маркерів доступу" settings: new_project: - project_creation: Створення проєкту - notification_text_default: "

Вітаємо,

Новий проєкт створено: projectValue:name

-

Дякуємо

\n" + project_creation: "Створення проєкту" + notification_text_default: > +

Вітаємо,

Новий проєкт створено: projectValue:name

Дякуємо

workflows: tabs: - default_transitions: Стандартні переходи - user_author: Користувач є автором - user_assignee: Користувач є призначеною особою + default_transitions: "Стандартні переходи" + user_author: "Користувач є автором" + user_assignee: "Користувач є призначеною особою" authentication: - login_and_registration: Вхід і реєстрація + login_and_registration: "Вхід і реєстрація" announcements: show_until: Показувати до is_active: наразі відображається is_inactive: наразі не відображається antivirus_scan: - not_processed_yet_message: Завантаження заблоковано, оскільки файл ще не перевірено - на віруси. Повторіть спробу пізніше. - quarantined_message: У файлі «%{filename}» виявлено вірус. Файл перенесено в карантин, - і його не можна завантажити. - deleted_message: У файлі «%{filename}» виявлено вірус. Файл видалено. - deleted_by_admin: Файл «%{filename}», перенесений у карантин, видалено адміністратором. - overridden_by_admin: Файл «%{filename}», перенесений у карантин, вилучено користувачем - %{user}. Доступ до файлу відновлено. + not_processed_yet_message: "Завантаження заблоковано, оскільки файл ще не перевірено на віруси. Повторіть спробу пізніше." + quarantined_message: "У файлі «%{filename}» виявлено вірус. Файл перенесено в карантин, і його не можна завантажити." + deleted_message: "У файлі «%{filename}» виявлено вірус. Файл видалено." + deleted_by_admin: "Файл «%{filename}», перенесений у карантин, видалено адміністратором." + overridden_by_admin: "Файл «%{filename}», перенесений у карантин, вилучено користувачем %{user}. Доступ до файлу відновлено." quarantined_attachments: - container: Контейнер - delete: Видалити файл на карантині - title: Вкладення на карантині - error_cannot_act_self: Неможливо виконати дії з файлами, вивантаженими вами. + container: "Контейнер" + delete: "Видалити файл на карантині" + title: "Вкладення на карантині" + error_cannot_act_self: "Неможливо виконати дії з файлами, вивантаженими вами." attribute_help_texts: - caption: Ця коротка версія буде показуватися як заголовок атрибута. - note_public: Будь-який текст і зображення, які ви додасте в це поле, будуть видимі - всім зареєстрованим користувачам. - text_overview: У цьому поданні можна створювати спеціальні тексти довідки для - перегляду атрибутів. Коли вони визначені, ці тексти можна показувати, натиснувши - піктограму довідки поруч з її атрибутом. - show_preview: Попередній перегляд тексту - add_new: Додати текст довідки - edit_field_name: Редагувати текст довідки для%{attribute_field_name} + caption: "Ця коротка версія буде показуватися як заголовок атрибута." + note_public: "Будь-який текст і зображення, які ви додасте в це поле, будуть видимі всім зареєстрованим користувачам." + text_overview: "У цьому поданні можна створювати спеціальні тексти довідки для перегляду атрибутів. Коли вони визначені, ці тексти можна показувати, натиснувши піктограму довідки поруч з її атрибутом." + show_preview: "Попередній перегляд тексту" + add_new: "Додати текст довідки" + edit_field_name: "Редагувати текст довідки для%{attribute_field_name}" background_jobs: status: - error_requeue: 'Виконується повторний запуск завдання, оскільки попередня спроба - завершилася такою помилкою: %{message}' - cancelled_due_to: 'Завдання скасовано через помилку: %{message}' + error_requeue: "Виконується повторний запуск завдання, оскільки попередня спроба завершилася такою помилкою: %{message}" + cancelled_due_to: "Завдання скасовано через помилку: %{message}" ldap_auth_sources: - ldap_error: 'LDAP-помилка: %{error_message}' - ldap_auth_failed: Не вдалося перевірити автентичність через LDAP-сервер. - sync_failed: 'Не вдалося виконати синхронізацію з LDAP: %{message}.' - back_to_index: Натисніть тут, щоб повернутися до списку підключень. + ldap_error: "LDAP-помилка: %{error_message}" + ldap_auth_failed: "Не вдалося перевірити автентичність через LDAP-сервер." + sync_failed: "Не вдалося виконати синхронізацію з LDAP: %{message}." + back_to_index: "Натисніть тут, щоб повернутися до списку підключень." technical_warning: | Для заповнення форми LDAP вам знадобляться технічні знання щодо конфігурації LDAP / Active Directory. [Докладні вказівки наведено в документації](docs_url). attribute_texts: name: Назва атрибута LDAP-підключення host: Назва хосту LDAP або IP-адреса - login_map: Ключ атрибута в LDAP, який використовується для ідентифікації унікального - входу користувача. Зазвичай це «uid» або «samAccountName». + login_map: Ключ атрибута в LDAP, який використовується для ідентифікації унікального входу користувача. Зазвичай це «uid» або «samAccountName». generic_map: Ключ атрибута в LDAP, зіставлений з атрибутом «%{attribute}» OpenProject - admin_map_html: Необов’язково. Ключ атрибута в LDAP, який, якщо є, - призначає користувача адміністратором OpenProject. Нічого не вказуйте, якщо - маєте сумніви. + admin_map_html: "Необов’язково. Ключ атрибута в LDAP, який, якщо є, призначає користувача адміністратором OpenProject. Нічого не вказуйте, якщо маєте сумніви." system_user_dn_html: | Введіть унікальне ім’я системного користувача, за допомогою якого можна отримати доступ лише для читання.
@@ -517,46 +450,30 @@ uk: onthefly_register: | Якщо встановити цей прапорець, OpenProject автоматично створюватиме нових користувачів на основі своїх записів LDAP під час їх першої автентифікації в OpenProject. Не встановлюйте його, щоб дозволити автентифікацію через LDAP лише наявним обліковим записам в OpenProject! - connection_encryption: Підключення шифрування - encryption_details: Параметри LDAPS / STARTTLS - system_account: Системний обліковий запис + connection_encryption: "Підключення шифрування" + encryption_details: "Параметри LDAPS / STARTTLS" + system_account: "Системний обліковий запис" system_account_legend: | OpenProject потрібен доступ лише для читання через системний обліковий запис, щоб шукати користувачів і групи у вашому LDAP-дереві. Укажіть облікові дані зв‘язування для цього системного користувача в наступному розділі. - ldap_details: Параметри LDAP - user_settings: Зіставлення атрибутів - user_settings_legend: 'Наведені нижче поля пов’язані з тим, як користувачі створюються - в OpenProject на основі записів LDAP і з тим, які атрибути LDAP використовуються - для визначення атрибутів користувача OpenProject (зіставлення атрибутів). - - ' + ldap_details: "Параметри LDAP" + user_settings: "Зіставлення атрибутів" + user_settings_legend: | + Наведені нижче поля пов’язані з тим, як користувачі створюються в OpenProject на основі записів LDAP і з тим, які атрибути LDAP використовуються для визначення атрибутів користувача OpenProject (зіставлення атрибутів). tls_mode: - plain: нічого - simple_tls: LDAPS - start_tls: STARTTLS - plain_description: Відкриває незахищене з’єднання із сервером LDAP. Не рекомендовано - використовувати для робочої версії. - simple_tls_description: Використовується LDAPS. Це вимагає окремого порту на - сервері LDAP. Цей режим часто вважається застарілим, тому радимо використовувати - STARTTLS, коли це можливо. - start_tls_description: Надсилає команду STARTTLS після підключення до стандартного - порту LDAP. Рекомендовано для зашифрованого з’єднання. - section_more_info_link_html: 'Цей розділ стосується безпеки підключення цього - джерела автентифікації LDAP. Для отримання додаткової інформації, вбудовуйте - the Net::LDAP documentation. - - ' + plain: "нічого" + simple_tls: "LDAPS" + start_tls: "STARTTLS" + plain_description: "Відкриває незахищене з’єднання із сервером LDAP. Не рекомендовано використовувати для робочої версії." + simple_tls_description: "Використовується LDAPS. Це вимагає окремого порту на сервері LDAP. Цей режим часто вважається застарілим, тому радимо використовувати STARTTLS, коли це можливо." + start_tls_description: "Надсилає команду STARTTLS після підключення до стандартного порту LDAP. Рекомендовано для зашифрованого з’єднання." + section_more_info_link_html: > + Цей розділ стосується безпеки підключення цього джерела автентифікації LDAP. Для отримання додаткової інформації, вбудовуйте the Net::LDAP documentation. tls_options: - verify_peer: Перевірити сертифікат SSL - verify_peer_description_html: 'Вмикає сувору перевірку SSL ланцюжка довірених - сертифікатів.
Увага! Якщо зняти цей прапорець, буде - вимкнено перевірку SSL сертифіката сервера LDAP. Через це ваше з’єднання може - стати вразливим до MITM-атак. - - ' - tls_certificate_description: Якщо сертифікат сервера LDAP не належить до надійних - джерел цієї системи, ви можете додати його вручну тут. Введіть рядок сертифіката - PEM X509. + verify_peer: "Перевірити сертифікат SSL" + verify_peer_description_html: > + Вмикає сувору перевірку SSL ланцюжка довірених сертифікатів.
Увага! Якщо зняти цей прапорець, буде вимкнено перевірку SSL сертифіката сервера LDAP. Через це ваше з’єднання може стати вразливим до MITM-атак. + tls_certificate_description: "Якщо сертифікат сервера LDAP не належить до надійних джерел цієї системи, ви можете додати його вручну тут. Введіть рядок сертифіката PEM X509." forums: show: no_results_title_text: На даний момент на форумі немає публікацій. @@ -564,89 +481,70 @@ uk: index: no_results_title_text: Наразі немає кольорів. no_results_content_text: Створіть новий колір - label_new_color: Новий колір + label_new_color: "Новий колір" new: - label_new_color: Новий колір + label_new_color: "Новий колір" edit: - label_edit_color: Редагувати колір + label_edit_color: "Редагувати колір" form: - label_new_color: Новий колір - label_edit_color: Редагувати колір - label_no_color: Без кольору - label_properties: Властивості - label_really_delete_color: 'Справді видалити цей колір? Типи, що використовують - його, не буде видалено. - - ' + label_new_color: "Новий колір" + label_edit_color: "Редагувати колір" + label_no_color: "Без кольору" + label_properties: "Властивості" + label_really_delete_color: > + Справді видалити цей колір? Типи, що використовують його, не буде видалено. custom_actions: actions: - name: Дії - add: Додати дію + name: "Дії" + add: "Додати дію" assigned_to: executing_user_value: "(Призначити виконавчому користувачеві)" - conditions: Умови - plural: Спеціальні дії - new: Нова спеціальна дія - edit: Редагувати спеціальну дію %{name} - execute: Виконати %{name} + conditions: "Умови" + plural: "Спеціальні дії" + new: "Нова спеціальна дія" + edit: "Редагувати спеціальну дію %{name}" + execute: "Виконати %{name}" custom_fields: admin: custom_field_projects: is_for_all_blank_slate: heading: Для всіх проєктів - description: Це користувацьке поле активовано в усіх проєктах, оскільки - встановлено прапорець «Для всіх проєктів». Його не можна деактивувати - для окремих проєктів. + description: Це користувацьке поле активовано в усіх проєктах, оскільки встановлено прапорець «Для всіх проєктів». Його не можна деактивувати для окремих проєктів. items: - actions: Дії + actions: "Дії" blankslate: root: - title: Ваш список елементів порожній - description: |- - Спочатку додайте елементи до користувацького поля ієрархії типів. Створити ієрархію можна для кожного елемента. Щоб переходити між піделементами ієрархії і додавати - їх, натисніть створений елемент. + title: "Ваш список елементів порожній" + description: "Спочатку додайте елементи до користувацького поля ієрархії типів. Створити ієрархію можна для кожного елемента. Щоб переходити між піделементами ієрархії і додавати\nїх, натисніть створений елемент." item: title: Цей елемент не має нижчого рівня ієрархії - description: Додайте елементи до цього списку, щоб створити піделементи - всередині іншого + description: Додайте елементи до цього списку, щоб створити піделементи всередині іншого delete_dialog: - title: Видалити елемент користувацького поля - heading: Видалити елемент користувацького поля? - description: Ця дія, яку не можна відмінити, призведе до вилучення елемента - й усіх його вкладених елементів. Усі їх значення буде видалено назавжди. - Якщо це обов’язкове поле, пакети робіт, де їх буде вилучено, можуть стати - недійсними. + title: "Видалити елемент користувацького поля" + heading: "Видалити елемент користувацького поля?" + description: "Ця дія, яку не можна відмінити, призведе до вилучення елемента й усіх його вкладених елементів. Усі їх значення буде видалено назавжди. Якщо це обов’язкове поле, пакети робіт, де їх буде вилучено, можуть стати недійсними." placeholder: - label: Мітка елемента - short: Коротка назва - weight: Вага + label: "Мітка елемента" + short: "Коротка назва" + weight: "Вага" notice: - remember_items_and_projects: Обов’язково задайте елементи й проєкти на відповідних - вкладках для цього користувацького поля. + remember_items_and_projects: "Обов’язково задайте елементи й проєкти на відповідних вкладках для цього користувацького поля." hierarchy: subitems: zero: немає піделементів one: 1 піделемент - other: 'Піделементів: %{count}' + other: "Піделементів: %{count}" role_assignment: title: Призначення ролі - description: Ви можете автоматично надавати певну роль у проєкті будь-якому - користувачу, якому призначено цей атрибут, незалежно від його початкової - ролі у цьому проєкті. - warning: Залежно від вибраної нижче ролі, користувач, якому призначено цей - атрибут проєкту, може отримати значно більше прав доступу, ніж мав раніше, - включно з можливістю додавати нових учасників та підвищувати їхню роль. - role_field_label: Роль проєкту - role_field_caption: Ця роль проєкту буде автоматично надана будь-якому користувачу, - якому призначено цей атрибут проєкту - review_hint: 'Цей атрибут проєкту вже призначено стільком користувачам у різних - проєктах: %{user_count}. Вони можуть отримати додаткові дозволи, а також - доступ до проєктів, у які їх раніше не було додано. - - ' + description: Ви можете автоматично надавати певну роль у проєкті будь-якому користувачу, якому призначено цей атрибут, незалежно від його початкової ролі у цьому проєкті. + warning: Залежно від вибраної нижче ролі, користувач, якому призначено цей атрибут проєкту, може отримати значно більше прав доступу, ніж мав раніше, включно з можливістю додавати нових учасників та підвищувати їхню роль. + role_field_label: "Роль проєкту" + role_field_caption: Ця роль проєкту буде автоматично надана будь-якому користувачу, якому призначено цей атрибут проєкту + review_hint: > + Цей атрибут проєкту вже призначено стільком користувачам у різних проєктах: %{user_count}. Вони можуть отримати додаткові дозволи, а також доступ до проєктів, у які їх раніше не було додано. review_button: Переглянути користувачів і дозволи dialog: - title: Огляд користувачів і дозволів + title: "Огляд користувачів і дозволів" change: Змінити changes: new_member: Буде додано як учасника @@ -655,156 +553,128 @@ uk: gain_role: Отримає роль «%{new_role}» lose_role: Втратить роль «%{old_role}» no_change: Немає змін - text_add_new_custom_field: 'Щоб додати нові користувальницькі поля до проекту, - спочатку потрібно створити їх, перш ніж ви зможете додати їх до цього проекту. - - ' - is_enabled_globally: Увімкнено у всьому світі - enabled_in_project: Увімкнено в проекті - contained_in_type: Міститься за типом - confirm_destroy_option: Видалення опції призведе до видалення всіх його подій - (наприклад, у робочих пакетах). Дійсно видалити його? - reorder_alphabetical: Перевпорядкувати значення за алфавітом - reorder_confirmation: 'Warning: The current order of available values as well - as all unsaved values will be lost. Are you sure you want to continue?' - placeholder_version_select: Спочатку потрібно вибрати пакет робіт або проєкт - calculated_field_not_editable: Атрибут не підлягає редагуванню. Його значення - обчислюється автоматично. - no_role_assigment: Роль не призначено + text_add_new_custom_field: > + Щоб додати нові користувальницькі поля до проекту, спочатку потрібно створити їх, перш ніж ви зможете додати їх до цього проекту. + is_enabled_globally: "Увімкнено у всьому світі" + enabled_in_project: "Увімкнено в проекті" + contained_in_type: "Міститься за типом" + confirm_destroy_option: "Видалення опції призведе до видалення всіх його подій (наприклад, у робочих пакетах). Дійсно видалити його?" + reorder_alphabetical: "Перевпорядкувати значення за алфавітом" + reorder_confirmation: "Попередження: поточний порядок доступних значень, а також усі незбережені значення буде втрачено. Справді продовжити?" + placeholder_version_select: "Спочатку потрібно вибрати пакет робіт або проєкт" + calculated_field_not_editable: "Атрибут не підлягає редагуванню. Його значення обчислюється автоматично." + no_role_assigment: "Роль не призначено" instructions: is_required: - all: Позначте користувацьке поле як обов’язкове. Тоді його необхідно буде - заповнювати при створенні нових ресурсів. При оновленні наявних ресурсів - вводити значення не буде потрібно. - project: Створюючи проєкт, користувач має заповнювати обов’язкові атрибути, - якщо поле активне (як результат установлення прапорця «Для всіх проєктів» - або копіювання з проєкту/шаблону, де воно активне). Це поле не потрібно - заповнювати при оновленні наявних проєктів. + all: "Позначте користувацьке поле як обов’язкове. Тоді його необхідно буде заповнювати при створенні нових ресурсів. При оновленні наявних ресурсів вводити значення не буде потрібно." + project: "Створюючи проєкт, користувач має заповнювати обов’язкові атрибути, якщо поле активне (як результат установлення прапорця «Для всіх проєктів» або копіювання з проєкту/шаблону, де воно активне). Це поле не потрібно заповнювати при оновленні наявних проєктів." is_for_all: - all: Позначте користувацьке поле як доступне в усіх наявних і нових проєктах. - project: Позначте атрибут як доступний в усіх наявних і нових проєктах. + all: "Позначте користувацьке поле як доступне в усіх наявних і нових проєктах." + project: "Позначте атрибут як доступний в усіх наявних і нових проєктах." multi_select: - all: Це дає змогу користувачу присвоїти користувацькому полю кілька значень. - project: Це дає змогу користувачу присвоїти атрибуту кілька значень. + all: "Це дає змогу користувачу присвоїти користувацькому полю кілька значень." + project: "Це дає змогу користувачу присвоїти атрибуту кілька значень." searchable: - all: Включіть значення полів під час використання функції глобального пошуку. - project: Установіть прапорець, щоб зробити цей атрибут доступним як фільтр - у списках проєктів. + all: "Включіть значення полів під час використання функції глобального пошуку." + project: "Установіть прапорець, щоб зробити цей атрибут доступним як фільтр у списках проєктів." editable: - all: Дозвольте користувачам самостійно редагувати це поле. + all: "Дозвольте користувачам самостійно редагувати це поле." admin_only: - all: Установіть прапорець, щоб зробити це користувацьке поле видимим лише - для адміністраторів. Користувачі без прав адміністратора не зможуть переглядати - або редагувати його. - project: Установіть прапорець, щоб зробити цей атрибут видимим лише для адміністраторів. - Користувачі без прав адміністратора не зможуть переглядати або редагувати - його. + all: "Установіть прапорець, щоб зробити це користувацьке поле видимим лише для адміністраторів. Користувачі без прав адміністратора не зможуть переглядати або редагувати його." + project: "Установіть прапорець, щоб зробити цей атрибут видимим лише для адміністраторів. Користувачі без прав адміністратора не зможуть переглядати або редагувати його." is_filter: - all: 'Дозвольте використовувати користувацьке поле у фільтрі в поданнях пакетів - робіт. Зверніть увагу: користувацьке поле відображатиметься в глобальних - поданнях, лише якщо встановлено прапорець «Для всіх проєктів». - - ' + all: > + Дозвольте використовувати користувацьке поле у фільтрі в поданнях пакетів робіт. Зверніть увагу: користувацьке поле відображатиметься в глобальних поданнях, лише якщо встановлено прапорець «Для всіх проєктів». formula: - project: Додайте числові значення або введіть «/» для пошуку атрибута чи математичного - оператора. + project: "Додайте числові значення або введіть «/» для пошуку атрибута чи математичного оператора." regexp: - all: eg. ^[A-Z0-9]+$ - project: eg. ^[A-Z0-9]+$ + all: "наприклад, ^[A-Z0-9]+$" + project: "наприклад, ^[A-Z0-9]+$" min_max: - all: 0 означає відсутність обмежень - project: 0 означає відсутність обмежень + all: "0 означає відсутність обмежень" + project: "0 означає відсутність обмежень" has_comment: - project: Allows the user to add a comment related to the project attribute - when selecting the value in the project overview. + project: "Дає змогу користувачу додати коментар до атрибута проєкту при виборі значення на сторінці «Огляд проєкту»." tab: no_results_title_text: Наразі немає спеціальних полів. no_results_content_text: Створіть нове спеціальне поле calculated_values: error_dialog: - title: Помилка, пов’язана з полем «Розраховане значення» + title: "Помилка, пов’язана з полем «Розраховане значення»" errors: - unknown: Сталася невідома помилка. Перевірте формулу, що використовується для - цього поля «Розраховане значення». - mathematical: Математична формула призводить до помилки. Перевірте обчислювальний - атрибут проєкту й повторіть спробу. - missing_value: Атрибут «%{custom_field_name}» обов’язковий для цього поля «Розраховане - значення», але є порожнім. - disabled_value: Атрибут «%{custom_field_name}» обов’язковий для цього поля «Розраховане - значення», але його вимкнено для проєкту. + unknown: "Сталася невідома помилка. Перевірте формулу, що використовується для цього поля «Розраховане значення»." + mathematical: "Математична формула призводить до помилки. Перевірте обчислювальний атрибут проєкту й повторіть спробу." + missing_value: Атрибут «%{custom_field_name}» обов’язковий для цього поля «Розраховане значення», але є порожнім. + disabled_value: Атрибут «%{custom_field_name}» обов’язковий для цього поля «Розраховане значення», але його вимкнено для проєкту. concatenation: - single: або + single: "або" danger_dialog: - confirmation_live_message_checked: Кнопка для продовження активна. - confirmation_live_message_unchecked: Кнопка для продовження зараз неактивна. Щоб - продовжити, поставте прапорець. + confirmation_live_message_checked: "Кнопка для продовження активна." + confirmation_live_message_unchecked: "Кнопка для продовження зараз неактивна. Щоб продовжити, поставте прапорець." mcp_configurations: server_url_component: - caption: The URL at which the OpenProject MCP server will be reachable. Required - for setting up MCP clients. - label: URL-адреса сервера + caption: "URL-адреса для доступу до сервера MCP OpenProject. Потрібна для налаштування клієнтів MCP." + label: "URL-адреса сервера" op_dry_validation: - or: або + or: "або" errors: - array?: має бути масивом. - decimal?: має бути десятковим числом. - defined: не має визначатися. - eql?: має бути «%{left}». + array?: "має бути масивом." + decimal?: "має бути десятковим числом." + defined: "не має визначатися." + eql?: "має бути «%{left}»." filled?: "— слід заповнити." - greater_or_equal_zero: має бути більше ніж 0 або дорівнювати йому. - gteq?: має бути більше ніж %{num} або дорівнювати цьому значенню. - hash?: має бути гешом. + greater_or_equal_zero: "має бути більше ніж 0 або дорівнювати йому." + gteq?: "має бути більше ніж %{num} або дорівнювати цьому значенню." + hash?: "має бути гешом." included_in?: arg: - default: 'має бути якимось із цих елементів: %{list}.' - range: 'має бути якимось із цих елементів: %{list_left} — %{list_right}.' - int?: має бути цілим числом. + default: "має бути якимось із цих елементів: %{list}." + range: "має бути якимось із цих елементів: %{list_left} — %{list_right}." + int?: "має бути цілим числом." key?: "— відсутній елемент." not_found: "— не знайдено." - respond_to?: не реалізує потрібний метод. + respond_to?: "не реалізує потрібний метод." rules: copy_workflow_from: - workflow_missing: не має власного робочого процесу. + workflow_missing: "не має власного робочого процесу." custom_field: - format_not_supported: формат «%{field_format}» не підтримується. + format_not_supported: "формат «%{field_format}» не підтримується." item: - root_item: не може бути кореневим об’єктом. - not_persisted: має бути вже наявним об’єктом. + root_item: "не може бути кореневим об’єктом." + not_persisted: "має бути вже наявним об’єктом." label: - not_unique: має бути унікальним об’єктом у межах одного рівня ієрархії. + not_unique: "має бути унікальним об’єктом у межах одного рівня ієрархії." short: - not_unique: має бути унікальним об’єктом у межах одного рівня ієрархії. + not_unique: "має бути унікальним об’єктом у межах одного рівня ієрархії." parent: - not_descendant: має бути нащадком кореня ієрархії. - str?: має бути рядком. - type?: має бути типом «%{type}». + not_descendant: "має бути нащадком кореня ієрархії." + str?: "має бути рядком." + type?: "має бути типом «%{type}»." rules: - copy_workflow_from: Тип копії робочого процесу - enabled: Увімкнено - depth: Глибина - item: Об’єкт - label: Мітка - weight: Вага - short: Коротка назва - parent: Батьківський об’єкт - blueprint: Структура шаблону + copy_workflow_from: "Тип копії робочого процесу" + enabled: "Увімкнено" + depth: "Глибина" + item: "Об’єкт" + label: "Мітка" + weight: "Вага" + short: "Коротка назва" + parent: "Батьківський об’єкт" + blueprint: "Структура шаблону" global_search: title: - all_projects: Пошук за терміном «%{search_term}» у всіх проєктах - current_project: Пошук за терміном «%{search_term}» у проєкті «%{project_name}» - project_and_subprojects: Пошук за терміном «%{search_term}» у проєкті «%{project_name}» - і всіх підпроєктах - placeholder: Пошук у додатку %{app_title} + all_projects: 'Пошук за терміном «%{search_term}» у всіх проєктах' + current_project: 'Пошук за терміном «%{search_term}» у проєкті «%{project_name}»' + project_and_subprojects: 'Пошук за терміном «%{search_term}» у проєкті «%{project_name}» і всіх підпроєктах' + placeholder: "Пошук у додатку %{app_title}" overwritten_tabs: - all: Усі - messages: Форум - wiki_pages: Wiki + all: "Усі" + messages: "Форум" + wiki_pages: "Wiki" groups: edit: - synchronized_groups: Синхронізовані групи + synchronized_groups: "Синхронізовані групи" index: - description: Згрупувавши користувачів, можна додавати їх як членів в одні й - ті самі проєкти або призначати їм однакові глобальні ролі. + description: Згрупувавши користувачів, можна додавати їх як членів в одні й ті самі проєкти або призначати їм однакові глобальні ролі. table_component: blank_slate: description: Для груп користувачів із назвами можна вказувати дозволи. @@ -817,16 +687,11 @@ uk: synchronized_groups: blankslate: action: Налаштування автентифікації - description: Коли цю групу буде автоматично синхронізовано з групами від зовнішніх - постачальників ідентифікаційних даних, таких як OpenID, вони з’являться - тут. Це можна налаштувати в параметрах автентифікації. + description: Коли цю групу буде автоматично синхронізовано з групами від зовнішніх постачальників ідентифікаційних даних, таких як OpenID, вони з’являться тут. Це можна налаштувати в параметрах автентифікації. title: Ще немає синхронізованих груп incoming_mails: - ignore_filenames: 'Вкажіть список імен, які ігноруватимуться під час обробки вкладень - для вхідних повідомлень (наприклад, підписів або значків). Введіть одне ім''я - файлу у рядок. - - ' + ignore_filenames: > + Вкажіть список імен, які ігноруватимуться під час обробки вкладень для вхідних повідомлень (наприклад, підписів або значків). Введіть одне ім'я файлу у рядок. portfolios: index: search: @@ -838,54 +703,52 @@ uk: many: "%{count} піделементів" other: "%{count} піделемента" lists: - active: Активні портфелі - my: Мої портфелі - favorited: Вибрані портфелі - archived: Архівні портфелі + active: "Активні портфелі" + my: "Мої портфелі" + favorited: "Вибрані портфелі" + archived: "Архівні портфелі" projects: copy: - members: Учасники проєкту - overviews: Огляд проєкту - queries: 'Пакети робіт: збережені подання' - wiki_page_attachments: 'Сторінки Wiki: вкладення' - work_package_attachments: 'Пакети робіт: вкладення' - work_package_categories: 'Пакети робіт: категорії' - work_package_file_links: 'Пакети робіт: посилання на файли' - work_package_shares: 'Пакети робіт: спільні ресурси' + #Contains custom strings for options when copying a project that cannot be found elsewhere. + members: "Учасники проєкту" + overviews: "Огляд проєкту" + queries: "Пакети робіт: збережені подання" + wiki_page_attachments: "Сторінки Wiki: вкладення" + work_package_attachments: "Пакети робіт: вкладення" + work_package_categories: "Пакети робіт: категорії" + work_package_file_links: "Пакети робіт: посилання на файли" + work_package_shares: "Пакети робіт: спільні ресурси" create: - notification_email_subject: Ваш проєкт «%{project_name}» створено - complete_wizard_link: Заповніть %{artefact_name} + notification_email_subject: "Ваш проєкт «%{project_name}» створено" + complete_wizard_link: "Заповніть %{artefact_name}" delete: - scheduled: Видалення заплановано та виконується у фоновому режимі. Ви отримаєте - сповіщення про результат. - schedule_failed: 'Проект не можна видалити: %{errors}' - failed: Не вдалося видалити проєкт «%{name}» - failed_text: Не вдалося виконати запит на видалення проєкту «%{name}». Він залишився - в архіві. - completed: Видалення проєкту «%{name}» завершено - completed_text: Запит видалення проекту '%{name}' завершено. - completed_text_children: 'Крім того, видалено такі підпроєкти:' + scheduled: "Видалення заплановано та виконується у фоновому режимі. Ви отримаєте сповіщення про результат." + schedule_failed: "Проект не можна видалити: %{errors}" + failed: "Не вдалося видалити проєкт «%{name}»" + failed_text: "Не вдалося виконати запит на видалення проєкту «%{name}». Він залишився в архіві." + completed: "Видалення проєкту «%{name}» завершено" + completed_text: "Запит видалення проекту '%{name}' завершено." + completed_text_children: "Крім того, видалено такі підпроєкти:" index: - open_as_gantt: Відкрити в поданні Ґанта + open_as_gantt: "Відкрити в поданні Ґанта" no_results_title_text: Наразі немає проектів no_results_content_text: Створіть новий проект search: label: Фільтр назв проєктів placeholder: Пошук за назвою проєкту lists: - active: Активні проєкти - my: Мої проєкти - favorited: Вибрані проєкти - archived: Заархівовані проєкти - shared: Спільні проєкти - my_lists: Мої списки проєктів + active: "Активні проєкти" + my: "Мої проєкти" + favorited: "Вибрані проєкти" + archived: "Заархівовані проєкти" + shared: "Спільні проєкти" + my_lists: "Мої списки проєктів" new: - placeholder: Новий список проєктів + placeholder: "Новий список проєктів" delete_modal: - title: Видалити список проєктів - heading: Видалити цей список проєктів? - text: Ця дія не призведе до видалення жодного проєкту зі списку. Справді видалити - цей список проєктів? + title: "Видалити список проєктів" + heading: "Видалити цей список проєктів?" + text: "Ця дія не призведе до видалення жодного проєкту зі списку. Справді видалити цей список проєктів?" settings: header_details: Основна інформація header_status: Статус @@ -893,59 +756,38 @@ uk: button_update_details: Оновити деталі button_update_status_description: Оновити опис проєкту button_update_parent_project: Оновити батьківський проєкт - public_warning: 'Цей проєкт загальнодоступний. Кожен, хто має доступ до цього - екземпляра, зможе переглянути цей проєкт і взаємодіяти з ним відповідно до - своєї ролі й пов’язаних дозволів. Вкладені проєкти мають власні налаштування, - тому це не вплине на них. - - ' + public_warning: > + Цей проєкт загальнодоступний. Кожен, хто має доступ до цього екземпляра, зможе переглянути цей проєкт і взаємодіяти з ним відповідно до своєї ролі й пов’язаних дозволів. Вкладені проєкти мають власні налаштування, тому це не вплине на них. public_confirmation: - checkbox: Я розумію, що внаслідок цієї дії приватний контент стане загальнодоступним - title: Зробити цей проєкт загальнодоступним? - description: 'Кожен, хто має доступ до цього екземпляра, зможе переглянути - цей проєкт і взаємодіяти з ним відповідно до своєї ролі й пов’язаних налаштувань - автентифікації. Вкладені проєкти мають власні налаштування, тому це не вплине - на них. - - ' + checkbox: "Я розумію, що внаслідок цієї дії приватний контент стане загальнодоступним" + title: "Зробити цей проєкт загальнодоступним?" + description: > + Кожен, хто має доступ до цього екземпляра, зможе переглянути цей проєкт і взаємодіяти з ним відповідно до своєї ролі й пов’язаних налаштувань автентифікації. Вкладені проєкти мають власні налаштування, тому це не вплине на них. private_confirmation: - checkbox: Я розумію, що внаслідок цієї дії загальнодоступний контент стане - приватним. - title: Зробити цей проєкт приватним? - description: 'Цей проєкт бачитимуть лише учасники проєкту відповідно до своїх - ролей і пов’язаних дозволів. Вкладені проєкти мають власні налаштування, - тому це не вплине на них. - - ' + checkbox: "Я розумію, що внаслідок цієї дії загальнодоступний контент стане приватним." + title: "Зробити цей проєкт приватним?" + description: > + Цей проєкт бачитимуть лише учасники проєкту відповідно до своїх ролей і пов’язаних дозволів. Вкладені проєкти мають власні налаштування, тому це не вплине на них. change_identifier: Ідентифікатор змін subitems: - template_section: 'Виберіть шаблони, які використовуватимуться при створенні - нових піделементів. - - ' - project_template_label: Шаблон для проєктів - project_template_caption: Виберіть шаблонний проєкт, який використовуватиметься - за замовчуванням для нових піделементів цього типу. - program_template_label: Шаблон для програм - program_template_caption: Виберіть шаблонну програму, яка використовуватиметься - за замовчуванням для нових піделементів цього типу. - no_template: Немає попередньо визначеного шаблону + template_section: > + Виберіть шаблони, які використовуватимуться при створенні нових піделементів. + project_template_label: "Шаблон для проєктів" + project_template_caption: "Виберіть шаблонний проєкт, який використовуватиметься за замовчуванням для нових піделементів цього типу." + program_template_label: "Шаблон для програм" + program_template_caption: "Виберіть шаблонну програму, яка використовуватиметься за замовчуванням для нових піделементів цього типу." + no_template: "Немає попередньо визначеного шаблону" template: - menu_title: Шаблон - title: Налаштування шаблону - enable_failed: Не вдалося ввімкнути режим шаблону. + menu_title: "Шаблон" + title: "Налаштування шаблону" + enable_failed: "Не вдалося ввімкнути режим шаблону." members: - excluded_roles_label: Ролі, які слід виключити при застосуванні шаблону - excluded_roles_caption: 'При створенні нового проєкту на основі цього шаблону - ролі, вибрані вище, буде випущено. Це дає змогу виключити певних учасників - на основі ролей, які їм призначено в проєктах. Такі користувачі зможуть - переглядати шаблон, але не матимуть доступу до нових проєктів, створених - на його основі. - - ' + excluded_roles_label: "Ролі, які слід виключити при застосуванні шаблону" + excluded_roles_caption: > + При створенні нового проєкту на основі цього шаблону ролі, вибрані вище, буде випущено. Це дає змогу виключити певних учасників на основі ролей, які їм призначено в проєктах. Такі користувачі зможуть переглядати шаблон, але не матимуть доступу до нових проєктів, створених на його основі. actions: - label_enable_all: Увімкнути все - label_disable_all: Вимкнути все + label_enable_all: "Увімкнути все" + label_disable_all: "Вимкнути все" activities: no_results_title_text: Наразі немає доступних заходів. forums: @@ -958,43 +800,32 @@ uk: no_results_title_text: Наразі немає спеціальних полів. life_cycle: header: - title: Життєвий цикл проєкту - description_html: Активні етапи проєкту визначають його життєвий цикл і - задаються в налаштуваннях - адміністратора. Увімкнені етапи відображатимуться на вашій сторінці - огляду проєкту. - non_defined: Наразі не визначено жодних етапів. - section_header: Етапи + title: "Життєвий цикл проєкту" + description_html: 'Активні етапи проєкту визначають його життєвий цикл і задаються в налаштуваннях адміністратора. Увімкнені етапи відображатимуться на вашій сторінці огляду проєкту.' + non_defined: "Наразі не визначено жодних етапів." + section_header: "Етапи" step: - use_in_project: Використати %{step} у цьому проєкті + use_in_project: "Використати %{step} у цьому проєкті" filter: - label: Пошук за назвою етапу + label: "Пошук за назвою етапу" project_custom_fields: header: - title: Атрибути проєкту - description_html: 'Ці атрибути проєкту відображатимуться на сторінці огляду проєкту у відповідних розділах. Ви - можете ввімкнути або вимкнути окремі атрибути. Атрибути проєкту й розділи - визначає адміністратор екземпляра в параметрах - адміністрування. ' + title: "Атрибути проєкту" + description_html: 'Ці атрибути проєкту відображатимуться на сторінці огляду проєкту у відповідних розділах. Ви можете ввімкнути або вимкнути окремі атрибути. Атрибути проєкту й розділи визначає адміністратор екземпляра в параметрах адміністрування. ' filter: - label: Пошук атрибутів проєкту + label: "Пошук атрибутів проєкту" actions: - label_enable_single: Увімкнено в цьому проєкті; натисніть, щоб вимкнути - label_disable_single: Вимкнено в цьому проєкті; натисніть, щоб увімкнути - remove_from_project: Вилучити з проєкту + label_enable_single: "Увімкнено в цьому проєкті; натисніть, щоб вимкнути" + label_disable_single: "Вимкнено в цьому проєкті; натисніть, щоб увімкнути" + remove_from_project: "Вилучити з проєкту" is_for_all_blank_slate: heading: Для всіх проєктів - description: Цей атрибут проєкту активовано в усіх проєктах, оскільки встановлено - прапорець «Для всіх проєктів». Його не можна деактивувати для окремих - проєктів. - enabled_via_assignee_when_submitted_html: This project attribute cannot be - disabled since it is set as assignee - when submitted for project initiation requests. + description: Цей атрибут проєкту активовано в усіх проєктах, оскільки встановлено прапорець «Для всіх проєктів». Його не можна деактивувати для окремих проєктів. + enabled_via_assignee_when_submitted_html: Цей атрибут проєкту не можна вимкнути, оскільки він використовується як виконавець на момент подання для запитів на ініціювання проєкту. types: no_results_title_text: Наразі немає доступних типів. form: - enable_type_in_project: Дозволити тип «%{type}»? + enable_type_in_project: 'Дозволити тип «%{type}»?' versions: no_results_title_text: Наразі не існує версій для проекту. no_results_content_text: Створіть нову версію @@ -1003,330 +834,254 @@ uk: storage: no_results_title_text: Цей проєкт не потребує додаткового дискового простору. work_package_priorities: - new_label: Новий пріоритет + new_label: "Новий пріоритет" creation_wizard: errors: - no_work_package_type: Failed to enable project initiation request because - it requires at least one active work package type and this project has - none. Please add at least one work package type to this project. - no_status_when_submitted: Failed to enable project initiation request because - work package type %{type} requires at least one status associated with - it. Please enable at least one status workflow for this work package type. + no_work_package_type: "Не вдалося ввімкнути запит на ініціювання проєкту, оскільки для цього потрібен принаймні один активний тип пакета робіт, а в цьому проєкті немає жодного. Додайте в нього принаймні один тип пакета робіт." + no_status_when_submitted: "Не вдалося ввімкнути запит на ініціювання проєкту, оскільки з типом пакета робіт «%{type}» має бути пов’язано принаймні один статус. Увімкніть для нього принаймні один робочий процес статусу." export: - description_attachment_export: Створений артефакт буде збережено як вкладення - у форматі PDF у пакеті робіт артефакту. - description_file_link_export: Пакет робіт артефакту міститиме посилання - на файл PDF, що зберігатиметься в зовнішньому сховищі. Знадобиться робоче - файлове сховище з папками проєкту з автоматичним керуванням для цього - проєкту. Зараз підтримуються лише файлові сховища Nextcloud. - description_file_storage_selection: Виберіть налаштоване зовнішнє файлове - сховище, яке слід використовувати. - external_file_storage: Зовнішнє файлове сховище - label_artifact_export: Експорт артефакту - label_attachment_export: Зберегти як вкладення файлу в пакеті робіт - label_file_link_export: Завантажити файл у зовнішнє файлове сховище й додати - посилання на нього в пакет робіт - pdf_file_storage: Сховище файлів PDF - unavailable: недоступно - label_request_submission: Подання запиту - project_attributes_description: 'Виберіть атрибути проєкту, які слід включити - в запит на ініціювання проєкту. Цей список містить лише [атрибути проєкту](project_attributes_url), - увімкнені для цього проєкту. - - ' - enabled_because_required_html: This project attribute cannot be disabled for - this project initiation request since it is defined as required. This can - be changed in the administration - settings by the administrator of the instance. + description_attachment_export: "Створений артефакт буде збережено як вкладення у форматі PDF у пакеті робіт артефакту." + description_file_link_export: "Пакет робіт артефакту міститиме посилання на файл PDF, що зберігатиметься в зовнішньому сховищі. Знадобиться робоче файлове сховище з папками проєкту з автоматичним керуванням для цього проєкту. Зараз підтримуються лише файлові сховища Nextcloud." + description_file_storage_selection: "Виберіть налаштоване зовнішнє файлове сховище, яке слід використовувати." + external_file_storage: "Зовнішнє файлове сховище" + label_artifact_export: "Експорт артефакту" + label_attachment_export: "Зберегти як вкладення файлу в пакеті робіт" + label_file_link_export: "Завантажити файл у зовнішнє файлове сховище й додати посилання на нього в пакет робіт" + pdf_file_storage: "Сховище файлів PDF" + unavailable: "недоступно" + label_request_submission: "Подання запиту" + project_attributes_description: > + Виберіть атрибути проєкту, які слід включити в запит на ініціювання проєкту. Цей список містить лише [атрибути проєкту](project_attributes_url), увімкнені для цього проєкту. + enabled_because_required_html: Атрибут проєкту не можна вимкнути для цього запиту на ініціювання проєкту, оскільки вказано, що він обов’язковий. Це налаштування може змінити адміністратор екземпляра в розділі «Адміністрування». status: button_edit: Редагувати статус wizard: - sidebar_content_title: Зміст - sections: Розділи - title: Запит на ініціювання проєкту - no_help_text: Для цього атрибута не визначено текст довідки. - success: Атрибути проєкту збережено, пакет робіт артефакту успішно створено. + sidebar_content_title: "Зміст" + sections: "Розділи" + title: "Запит на ініціювання проєкту" + no_help_text: "Для цього атрибута не визначено текст довідки." + success: "Атрибути проєкту збережено, пакет робіт артефакту успішно створено." progress_label: "%{current} з %{total}" - create_artifact_work_package_error: Не вдалося створити пакет робіт артефакту - create_artifact_storage_error: Не вдалося зберегти артефакт у файловому сховищі + create_artifact_work_package_error: "Не вдалося створити пакет робіт артефакту" + create_artifact_storage_error: "Не вдалося зберегти артефакт у файловому сховищі" lists: create: - success: Змінений список збережено як новий - failure: 'Неможливо зберегти змінений список: %{errors}' + success: "Змінений список збережено як новий" + failure: "Неможливо зберегти змінений список: %{errors}" update: - success: Змінений список збережено - failure: 'Неможливо зберегти змінений список: %{errors}' + success: "Змінений список збережено" + failure: "Неможливо зберегти змінений список: %{errors}" publish: - success: Цей список став загальнодоступним - failure: 'Цей список не можна зробити загальнодоступним: %{errors}' + success: "Цей список став загальнодоступним" + failure: "Цей список не можна зробити загальнодоступним: %{errors}" unpublish: - success: Цей список став приватним - failure: 'Цей список не можна зробити приватним: %{errors}' - can_be_saved: 'Список змінено:' - can_be_saved_as: 'Зміни можна зберегти лише в новому списку:' + success: "Цей список став приватним" + failure: "Цей список не можна зробити приватним: %{errors}" + can_be_saved: "Список змінено:" + can_be_saved_as: "Зміни можна зберегти лише в новому списку:" members: index: no_results_title_text: Наразі учасників цього проекту немає. no_results_content_text: Додайте учасника до проекту - invite_by_mail: Надіслати запрошення на адресу %{mail} - send_invite_to: 'Надіслати запрошення:' + invite_by_mail: "Надіслати запрошення на адресу %{mail}" + send_invite_to: "Надіслати запрошення:" columns: - shared: Спільні + shared: "Спільні" filters: - all_shares: Усі поширення + all_shares: "Усі поширення" menu: - all: Усі - invited: Запрошені - locked: Заблоковані - project_roles: Ролі в проєкті - wp_shares: Поширення пакета робіт - groups: Групи + all: "Усі" + invited: "Запрошені" + locked: "Заблоковані" + project_roles: "Ролі в проєкті" + wp_shares: "Поширення пакета робіт" + groups: "Групи" delete_member_dialog: - title: Вилучити учасника - will_remove_the_users_role: Роль користувача буде вилучено із цього проєкту. - will_remove_the_groups_role: Роль групи буде вилучено із цього проєкту. + title: "Вилучити учасника" + will_remove_the_users_role: "Роль користувача буде вилучено із цього проєкту." + will_remove_the_groups_role: "Роль групи буде вилучено із цього проєкту." however_work_packages_shared_with_user_html: - one: Однак цьому користувачу також надано доступ до %{shared_work_packages_link}. - few: Однак цьому користувачу також надано доступ до %{shared_work_packages_link}. - many: Однак цьому користувачу також надано доступ до %{shared_work_packages_link}. - other: Однак цьому користувачу також надано доступ до %{shared_work_packages_link}. + one: "Однак цьому користувачу також надано доступ до %{shared_work_packages_link}." + few: "Однак цьому користувачу також надано доступ до %{shared_work_packages_link}." + many: "Однак цьому користувачу також надано доступ до %{shared_work_packages_link}." + other: "Однак цьому користувачу також надано доступ до %{shared_work_packages_link}." however_work_packages_shared_with_group_html: - one: Однак цій групі також надано доступ до %{shared_work_packages_link}. - few: Однак цій групі також надано доступ до %{shared_work_packages_link}. - many: Однак цій групі також надано доступ до %{shared_work_packages_link}. - other: Однак цій групі також надано доступ до %{shared_work_packages_link}. - remove_work_packages_shared_with_user_too: Користувач, якого було вилучено як - учасника, досі має доступ до спільних пакетів робіт. Вилучити також його дозволи - на доступ? - remove_work_packages_shared_with_group_too: Група, яку було вилучено як учасника, - досі має доступ до спільних пакетів робіт. Вилучити також її дозволи на доступ? - will_not_affect_inherited_shares: "(Це не вплине на пакети робіт, які спільно - використовуються в межах відповідних груп)." - can_remove_direct_but_not_shared_roles: Ви можете вилучити цього користувача - як безпосереднього учасника проєкту, але він буде й надалі його учасником, - оскільки група, до якої він належить, також є учасником цього проєкту. + one: "Однак цій групі також надано доступ до %{shared_work_packages_link}." + few: "Однак цій групі також надано доступ до %{shared_work_packages_link}." + many: "Однак цій групі також надано доступ до %{shared_work_packages_link}." + other: "Однак цій групі також надано доступ до %{shared_work_packages_link}." + remove_work_packages_shared_with_user_too: "Користувач, якого було вилучено як учасника, досі має доступ до спільних пакетів робіт. Вилучити також його дозволи на доступ?" + remove_work_packages_shared_with_group_too: "Група, яку було вилучено як учасника, досі має доступ до спільних пакетів робіт. Вилучити також її дозволи на доступ?" + will_not_affect_inherited_shares: "(Це не вплине на пакети робіт, які спільно використовуються в межах відповідних груп)." + can_remove_direct_but_not_shared_roles: "Ви можете вилучити цього користувача як безпосереднього учасника проєкту, але він буде й надалі його учасником, оскільки група, до якої він належить, також є учасником цього проєкту." also_work_packages_shared_with_user_html: one: " Крім того, цьому користувачу надано доступ до %{shared_work_packages_link}." few: " Крім того, цьому користувачу надано доступ до %{shared_work_packages_link}." many: " Крім того, цьому користувачу надано доступ до %{shared_work_packages_link}." other: " Крім того, цьому користувачу надано доступ до %{shared_work_packages_link}." - remove_project_membership_or_work_package_shares_too: Вилучити користувача лише - як безпосереднього учасника (і зберегти дозволи на доступ) чи вилучити також - ці дозволи? - will_remove_all_user_access_priveleges: Видалення цього учасника призведе до - вилучення всіх дозволів на доступ користувача до проєкту. Користувач буде - й надалі частиною екземпляра. - will_remove_all_group_access_priveleges: Видалення цього учасника призведе до - вилучення всіх дозволів на доступ групи до проєкту. Група буде й надалі частиною - екземпляра. - cannot_delete_inherited_membership: Неможливо видалити цього учасника, оскільки - він належить до групи, яка сама є учасником цього проєкту. - cannot_delete_inherited_membership_note_admin_html: Ви можете вилучити групу - як учасника проєкту або цього конкретного учасника з групи в %{administration_settings_link}. - cannot_delete_inherited_membership_note_non_admin: Ви можете або вилучити групу - як учасника проєкту, або звернутися до адміністратора з проханням вилучити - цього конкретного учасника з групи. + remove_project_membership_or_work_package_shares_too: "Вилучити користувача лише як безпосереднього учасника (і зберегти дозволи на доступ) чи вилучити також ці дозволи?" + will_remove_all_user_access_priveleges: "Видалення цього учасника призведе до вилучення всіх дозволів на доступ користувача до проєкту. Користувач буде й надалі частиною екземпляра." + will_remove_all_group_access_priveleges: "Видалення цього учасника призведе до вилучення всіх дозволів на доступ групи до проєкту. Група буде й надалі частиною екземпляра." + cannot_delete_inherited_membership: "Неможливо видалити цього учасника, оскільки він належить до групи, яка сама є учасником цього проєкту." + cannot_delete_inherited_membership_note_admin_html: "Ви можете вилучити групу як учасника проєкту або цього конкретного учасника з групи в %{administration_settings_link}." + cannot_delete_inherited_membership_note_non_admin: "Ви можете або вилучити групу як учасника проєкту, або звернутися до адміністратора з проханням вилучити цього конкретного учасника з групи." delete_work_package_shares_dialog: - title: Відкликати дозволи на доступ до пакета робіт + title: "Відкликати дозволи на доступ до пакета робіт" shared_with_this_user_html: - one: Цьому користувачу надано доступ до %{all_shared_work_packages_link}. - few: Цьому користувачу надано доступ до %{all_shared_work_packages_link}. - many: Цьому користувачу надано доступ до %{all_shared_work_packages_link}. - other: Цьому користувачу надано доступ до %{all_shared_work_packages_link}. + one: "Цьому користувачу надано доступ до %{all_shared_work_packages_link}." + few: "Цьому користувачу надано доступ до %{all_shared_work_packages_link}." + many: "Цьому користувачу надано доступ до %{all_shared_work_packages_link}." + other: "Цьому користувачу надано доступ до %{all_shared_work_packages_link}." shared_with_this_group_html: - one: Цій групі надано доступ до %{all_shared_work_packages_link}. - few: Цій групі надано доступ до %{all_shared_work_packages_link}. - many: Цій групі надано доступ до %{all_shared_work_packages_link}. - other: Цій групі надано доступ до %{all_shared_work_packages_link}. + one: "Цій групі надано доступ до %{all_shared_work_packages_link}." + few: "Цій групі надано доступ до %{all_shared_work_packages_link}." + many: "Цій групі надано доступ до %{all_shared_work_packages_link}." + other: "Цій групі надано доступ до %{all_shared_work_packages_link}." shared_with_permission_html: - one: Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}. - few: Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}. - many: Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}. - other: Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}. - revoke_all_or_with_role: Хочете відкликати доступ до всіх спільних пакетів робіт - чи тільки до тих, доступ до яких надано з дозволами ролі «%{shared_role_name}»? - will_not_affect_inherited_shares: "(Це не вплине на пакети робіт, які спільно - використовуються в межах відповідних груп)." - cannot_remove_inherited: Дозволи на доступ до пакетів робіт, надані на рівні - груп, не можна вилучити. - cannot_remove_inherited_with_role: Пакети робіт, до яких надано доступ із дозволами - ролі «%{shared_role_name}», використовуються в групах, і їх не можна вилучити. - cannot_remove_inherited_note_admin_html: Ви можете відкликати дозвіл на доступ - групи або вилучити цього конкретного учасника з групи в %{administration_settings_link}. - cannot_remove_inherited_note_non_admin: Ви можете або відкликати дозвіл на доступ - групи або звернутися до адміністратора з проханням вилучити цього конкретного - учасника з групи. - will_revoke_directly_granted_access: Доступ учасника буде відкликано до всіх - пакетів робіт, крім тих, до яких доступ надано групі. - will_revoke_access_to_all: Доступ учасника буде відкликано до всіх пакетів робіт. + one: "Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}." + few: "Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}." + many: "Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}." + other: "Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}." + revoke_all_or_with_role: "Хочете відкликати доступ до всіх спільних пакетів робіт чи тільки до тих, доступ до яких надано з дозволами ролі «%{shared_role_name}»?" + will_not_affect_inherited_shares: "(Це не вплине на пакети робіт, які спільно використовуються в межах відповідних груп)." + cannot_remove_inherited: "Дозволи на доступ до пакетів робіт, надані на рівні груп, не можна вилучити." + cannot_remove_inherited_with_role: "Пакети робіт, до яких надано доступ із дозволами ролі «%{shared_role_name}», використовуються в групах, і їх не можна вилучити." + cannot_remove_inherited_note_admin_html: "Ви можете відкликати дозвіл на доступ групи або вилучити цього конкретного учасника з групи в %{administration_settings_link}." + cannot_remove_inherited_note_non_admin: "Ви можете або відкликати дозвіл на доступ групи або звернутися до адміністратора з проханням вилучити цього конкретного учасника з групи." + will_revoke_directly_granted_access: "Доступ учасника буде відкликано до всіх пакетів робіт, крім тих, до яких доступ надано групі." + will_revoke_access_to_all: "Доступ учасника буде відкликано до всіх пакетів робіт." my: access_token: dialog: token/api: - dialog_title: Створити новий маркер API - attention_text: Маркери API – це щось на кшталт паролів. Будь-хто, маючи - такий маркер, може отримати доступ до даних вашого екземпляра. Тому надавайте - його тільки користувачам, яким довіряєте. - dialog_body: За допомогою цього маркера сторонні додатки зможуть взаємодіяти - з вашим екземпляром. Призначте новому інтерфейсу API ім’я, щоб ідентифікувати - його. - create_button: Створити - name_label: Ім’я маркера + dialog_title: "Створити новий маркер API" + attention_text: "Маркери API – це щось на кшталт паролів. Будь-хто, маючи такий маркер, може отримати доступ до даних вашого екземпляра. Тому надавайте його тільки користувачам, яким довіряєте." + dialog_body: "За допомогою цього маркера сторонні додатки зможуть взаємодіяти з вашим екземпляром. Призначте новому інтерфейсу API ім’я, щоб ідентифікувати його." + create_button: "Створити" + name_label: "Ім’я маркера" created_dialog: - one_time_warning: Ви більше не побачите цей маркер. Обов’язково скопіюйте - його зараз. + one_time_warning: "Ви більше не побачите цей маркер. Обов’язково скопіюйте його зараз." token/api: - title: Маркер API згенеровано + title: "Маркер API згенеровано" token/rss: - title: Маркер RSS згенеровано - failed_to_reset_token: 'Не вдалося відновити маркер доступу: %{error}' - failed_to_create_token: 'Не вдалося створити маркер доступу: %{error}' - failed_to_revoke_token: 'Не вдалося відкликати маркер доступу: %{error}' - notice_reset_token: 'Нове %{type} генерований маркер. Ваш маркер доступу:' - token_value_warning: Примітка. Це єдиний раз, коли ви побачите цей маркер, переконайтеся, - що його зараз скопіюйте. - no_results_title_text: Наразі немає доступних маркерів доступу. - notice_api_token_revoked: Маркер API видалено. Щоб створити новий, скористайтеся - кнопкою в розділі API. - notice_rss_token_revoked: Маркер RSS видалено. Щоб створити новий, скористайтеся - посиланням у розділі RSS. - notice_ical_token_revoked: Маркер iCalendar «%{token_name}» для календаря «%{calendar_name}» - проєкту «%{project_name}» відкликано. URL-адреса iCalendar із цим маркером - зараз недійсна. + title: "Маркер RSS згенеровано" + failed_to_reset_token: "Не вдалося відновити маркер доступу: %{error}" + failed_to_create_token: "Не вдалося створити маркер доступу: %{error}" + failed_to_revoke_token: "Не вдалося відкликати маркер доступу: %{error}" + notice_reset_token: "Нове %{type} генерований маркер. Ваш маркер доступу:" + token_value_warning: "Примітка. Це єдиний раз, коли ви побачите цей маркер, переконайтеся, що його зараз скопіюйте." + no_results_title_text: "Наразі немає доступних маркерів доступу." + notice_api_token_revoked: "Маркер API видалено. Щоб створити новий, скористайтеся кнопкою в розділі API." + notice_rss_token_revoked: "Маркер RSS видалено. Щоб створити новий, скористайтеся посиланням у розділі RSS." + notice_ical_token_revoked: 'Маркер iCalendar «%{token_name}» для календаря «%{calendar_name}» проєкту «%{project_name}» відкликано. URL-адреса iCalendar із цим маркером зараз недійсна.' password_confirmation_dialog: - confirmation_required: Потрібно ввести пароль облікового запису, щоб підтвердити - цю зміну. - title: Підтвердьте свій пароль, щоб продовжити + confirmation_required: "Потрібно ввести пароль облікового запису, щоб підтвердити цю зміну." + title: "Підтвердьте свій пароль, щоб продовжити" news: index: no_results_title_text: Наразі немає жодної новини. no_results_content_text: Додати новину roles: permissions: - section_check_all_label: Призначити всі дозволи модуля «%{module}» - section_uncheck_all_label: Скасувати призначення всіх дозволів модуля «%{module}» + section_check_all_label: "Призначити всі дозволи модуля «%{module}»" + section_uncheck_all_label: "Скасувати призначення всіх дозволів модуля «%{module}»" report: - matrix_caption: Матриця дозволів для модуля «%{module}» - matrix_checkbox_label: Призначити дозвіл «%{permission}» ролі «%{role}» - matrix_check_all_label: Призначити всі дозволи модуля «%{module}» усім ролям - matrix_uncheck_all_label: Скасувати призначення всіх дозволів модуля «%{module}» - для всіх ролей - matrix_check_uncheck_all_in_row_label_html: Перемикач дозволу %{permission} - для всіх ролей - matrix_check_uncheck_all_in_col_label_html: Перемикач усіх дозволів модуля «%{module}» - для ролі %{role} + matrix_caption: "Матриця дозволів для модуля «%{module}»" + matrix_checkbox_label: "Призначити дозвіл «%{permission}» ролі «%{role}»" + matrix_check_all_label: "Призначити всі дозволи модуля «%{module}» усім ролям" + matrix_uncheck_all_label: "Скасувати призначення всіх дозволів модуля «%{module}» для всіх ролей" + matrix_check_uncheck_all_in_row_label_html: "Перемикач дозволу %{permission} для всіх ролей" + matrix_check_uncheck_all_in_col_label_html: "Перемикач усіх дозволів модуля «%{module}» для ролі %{role}" users: autologins: - prompt: Не виходити %{num_days} + prompt: "Не виходити %{num_days}" sessions: session_name: "%{browser_name} %{browser_version} у %{os_name}" - browser: Браузер - expires: Завершується - last_connection: Останнє підключення - device: Пристрій / ОС - unknown_browser: невідомий браузер - unknown_os: невідома операційна система + browser: "Браузер" + expires: "Завершується" + last_connection: "Останнє підключення" + device: "Пристрій / ОС" + unknown_browser: "невідомий браузер" + unknown_os: "невідома операційна система" unknown: "(невідомо)" browser_session: "(Сеанс браузера)" - current: Поточний (цей пристрій) - title: Керування сеансами - instructions: Ви ввійшли в обліковий запис на вказаних далі пристроях. Скасуйте - сеанси, які вам не знайомі, чи сеанси на пристроях, якими ви не керуєте. - may_not_delete_current: Ви не можете видалити поточний сеанс. - deletion_warning: Ви справді хочете скасувати цей сеанс? Ви вийдете з облікового - запису на цьому пристрої. + current: "Поточний (цей пристрій)" + title: "Керування сеансами" + instructions: "Ви ввійшли в обліковий запис на вказаних далі пристроях. Скасуйте сеанси, які вам не знайомі, чи сеанси на пристроях, якими ви не керуєте." + may_not_delete_current: "Ви не можете видалити поточний сеанс." + deletion_warning: "Ви справді хочете скасувати цей сеанс? Ви вийдете з облікового запису на цьому пристрої." groups: - member_in_these_groups: 'Зараз цей користувач — учасник таких груп:' + member_in_these_groups: "Зараз цей користувач — учасник таких груп:" no_results_title_text: Цей користувач зараз не належить до жодної групи. summary_with_more: Учасник %{names} і ще %{count_link}. - more: Ще %{count} + more: "Ще %{count}" summary: Учасник %{names}. memberships: no_results_title_text: Цей користувач наразі не є учасником проекту. - open_profile: Відкрити профіль + open_profile: "Відкрити профіль" invite_user_modal: - invite: Запросити + invite: "Запросити" title: - invite: Запросити користувача - invite_to_project: 'Запросити користувача «%{type}» у проєкт «%{project}» ' - invite_principal_to_project: Запросити користувача «%{principal}» у проєкт - «%{project}» + invite: "Запросити користувача" + invite_to_project: "Запросити користувача «%{type}» у проєкт «%{project}» " + invite_principal_to_project: "Запросити користувача «%{principal}» у проєкт «%{project}»" project: - label: Проєкт - required: Виберіть проєкт - next_button: Далі - no_results: Жодних проєктів не знайдено - no_invite_rights: Ви не можете запрошувати учасників до цього проєкту + label: "Проєкт" + required: "Виберіть проєкт" + next_button: "Далі" + no_results: "Жодних проєктів не знайдено" + no_invite_rights: "Ви не можете запрошувати учасників до цього проєкту" type: - required: Виберіть тип користувача, якого потрібно запросити + required: "Виберіть тип користувача, якого потрібно запросити" user: - title: Запросити користувача в проєкт «%{project_name}» - description: Дозволи, що ґрунтуються на призначеній ролі у вибраному проєкті + title: "Запросити користувача в проєкт «%{project_name}»" + description: "Дозволи, що ґрунтуються на призначеній ролі у вибраному проєкті" group: - title: Запросити групу в проєкт «%{project_name}» - description: Дозволи, що ґрунтуються на призначеній ролі у вибраному проєкті + title: "Запросити групу в проєкт «%{project_name}»" + description: "Дозволи, що ґрунтуються на призначеній ролі у вибраному проєкті" placeholder_user: - title: Додати прототип користувача в проєкт «%{project_name}» - title_no_ee: Прототип користувача (лише у версії Enterprise) - description: Немає доступу до проєкту; електронні листи не відправляються. - already_member_message: Уже учасник проєкту «%{project}» + title: "Додати прототип користувача в проєкт «%{project_name}»" + title_no_ee: "Прототип користувача (лише у версії Enterprise)" + description: "Немає доступу до проєкту; електронні листи не відправляються." + already_member_message: "Уже учасник проєкту «%{project}»" principal: - no_results_user: Користувачів не знайдено - invite_user: 'Запросити:' - no_results_placeholder: Прототипів не знайдено - create_new_placeholder: 'Створити новий прототип:' - no_results_group: Груп не знайдено - invite_to_project: Запросити в проєкт «%{project_name}» + no_results_user: "Користувачів не знайдено" + invite_user: "Запросити:" + no_results_placeholder: "Прототипів не знайдено" + create_new_placeholder: "Створити новий прототип:" + no_results_group: "Груп не знайдено" + invite_to_project: "Запросити в проєкт «%{project_name}»" required: - user: Виберіть користувача - placeholder: Виберіть прототип - group: Виберіть групу + user: "Виберіть користувача" + placeholder: "Виберіть прототип" + group: "Виберіть групу" role: - label: Ролі у проєкті «%{project}» - no_roles_found: Ролей не знайдено - description: 'Це роль, яку користувач отримає, коли приєднається до вашого - проєкту. Роль визначає, що йому дозволено робити й переглядати. [Дізнайтеся - більше про ролі й дозволи.](docs_url) - - ' - required: Виберіть роль + label: "Ролі у проєкті «%{project}»" + no_roles_found: "Ролей не знайдено" + description: > + Це роль, яку користувач отримає, коли приєднається до вашого проєкту. Роль визначає, що йому дозволено робити й переглядати. [Дізнайтеся більше про ролі й дозволи.](docs_url) + required: "Виберіть роль" message: - label: Повідомлення із запрошенням - description: Ми надішлемо користувачу електронний лист, у який ви можете додати - своє повідомлення. Радимо пояснити причину запрошення або, наприклад, додати - інформацію про проєкт, щоб користувачу було простіше почати працювати над - ним. + label: "Повідомлення із запрошенням" + description: "Ми надішлемо користувачу електронний лист, у який ви можете додати своє повідомлення. Радимо пояснити причину запрошення або, наприклад, додати інформацію про проєкт, щоб користувачу було простіше почати працювати над ним." summary: - next_button: Надіслати запрошення + next_button: "Надіслати запрошення" success_message: - user: Користувач тепер може ввійти, щоб отримати доступ до проєкту %{project}. - Тим часом ви вже можете включати цього користувача в план і призначати йому - пакети робіт. - placeholder_user: Прототип тепер може ввійти, щоб отримати доступ до проєкту - «%{project}». Тим часом ви вже можете включати цього користувача в план - і призначати йому пакети робіт. - group: Ця група тепер входить у проєкт «%{project}». Тим часом ви вже можете - включати її в план і призначати їй пакети робіт. + user: "Користувач тепер може ввійти, щоб отримати доступ до проєкту %{project}. Тим часом ви вже можете включати цього користувача в план і призначати йому пакети робіт." + placeholder_user: "Прототип тепер може ввійти, щоб отримати доступ до проєкту «%{project}». Тим часом ви вже можете включати цього користувача в план і призначати йому пакети робіт." + group: "Ця група тепер входить у проєкт «%{project}». Тим часом ви вже можете включати її в план і призначати їй пакети робіт." page: - text: Текст + text: "Текст" placeholder_users: - right_to_manage_members_missing: 'Ви не можете видалити прототип користувача. - У вас немає права керувати учасниками для всіх проєктів, до яких належить прототип - користувача. - - ' - delete_tooltip: Видалити прототип користувача + right_to_manage_members_missing: > + Ви не можете видалити прототип користувача. У вас немає права керувати учасниками для всіх проєктів, до яких належить прототип користувача. + delete_tooltip: "Видалити прототип користувача" deletion_info: - heading: Видалити прототип користувача %{name} - data_consequences: 'Усі екземпляри прототипу користувача (наприклад, виконавець, - відповідальний тощо) буде перепризначено обліковому запису з назвою «Видалений - користувач». Оскільки дані кожного видаленого облікового запису перепризначаються - цьому обліковому запису, відрізнити дані, створені користувачем, від даних - іншого видаленого облікового запису, може бути важко. - - ' - irreversible: Цю дію не можна скасувати - confirmation: Введіть ім’я прототипу користувача %{name}, щоб підтвердити видалення. + heading: "Видалити прототип користувача %{name}" + data_consequences: > + Усі екземпляри прототипу користувача (наприклад, виконавець, відповідальний тощо) буде перепризначено обліковому запису з назвою «Видалений користувач». Оскільки дані кожного видаленого облікового запису перепризначаються цьому обліковому запису, відрізнити дані, створені користувачем, від даних іншого видаленого облікового запису, може бути важко. + irreversible: "Цю дію не можна скасувати" + confirmation: "Введіть ім’я прототипу користувача %{name}, щоб підтвердити видалення." priorities: edit: priority_color_text: | @@ -1334,13 +1089,12 @@ uk: Його можна використовувати для виділення пакетів роботи в таблиці. admin: default: - caption: Якщо зробити цей пріоритет стандартним, він замінить попередній стандартний - пріоритет. + caption: Якщо зробити цей пріоритет стандартним, він замінить попередній стандартний пріоритет. reactions: - action_title: Реакція - add_reaction: Додати реакцію - react_with: Відреагувати за допомогою %{reaction} - and_user: і %{user} + action_title: "Реакція" + add_reaction: "Додати реакцію" + react_with: "Відреагувати за допомогою %{reaction}" + and_user: "і %{user}" and_others: one: і ще 1 few: і ще %{count} @@ -1356,11 +1110,10 @@ uk: status_color_text: | Натисніть, щоб призначити або змінити колір цього статусу. Він відображається в кнопці стану і може використовуватися для виділення робочих пакетів у таблиці. - status_default_text: Цей тип за замовчуванням мають нові пакети робіт. Вони - не можуть бути доступні лише для читання. - status_excluded_from_totals_text: Поставте цей прапорець, щоб виключити пакети - робіт із цим статусом із підсумків атрибутів «Робота», «Залишок роботи» й - «% завершення» в ієрархії. + status_default_text: |- + Цей тип за замовчуванням мають нові пакети робіт. Вони не можуть бути доступні лише для читання. + status_excluded_from_totals_text: |- + Поставте цей прапорець, щоб виключити пакети робіт із цим статусом із підсумків атрибутів «Робота», «Залишок роботи» й «% завершення» в ієрархії. status_percent_complete_text: |- У режимі обчислення прогресу на основі статусу для атрибута «% завершення» пакета робіт автоматично встановлюється це значення, коли вибрано цей статус. Ігнорується в режимі на основі роботи. @@ -1373,89 +1126,75 @@ uk: no_results_title_text: Наразі немає статусів робочих пакетів. no_results_content_text: Додати новий статус headers: - is_default: За замовчуванням - is_closed: Закрито - is_readonly: Лише для перегляду - excluded_from_totals: Виключено з підсумків + is_default: "За замовчуванням" + is_closed: "Закрито" + is_readonly: "Лише для перегляду" + excluded_from_totals: "Виключено з підсумків" themes: - dark: Темна - light: Світла - sync_with_os: Автоматично (колірний режим ОС) + dark: "Темна" + light: "Світла" + sync_with_os: "Автоматично (колірний режим ОС)" types: index: no_results_title_text: Наразі немає типів. no_results_content_text: Створіть новий тип edit: form_configuration: - tab: Конфігурація форми + tab: "Конфігурація форми" projects: tab: Проєкти enable_all: Використовувати у всіх проєктах select_projects: Вибрати проєкти - select_projects_description: Виберіть проєкти, у яких ви хочете використовувати - цей тип. + select_projects_description: Виберіть проєкти, у яких ви хочете використовувати цей тип. settings: - tab: Налаштування - type_color_text: "Цей колір використовується для виділення різних типів \nна - діаграмах Ґанта або в таблицях пакетів робіт. Тому рекомендуємо вибрати - насичений колір." + tab: "Налаштування" + type_color_text: "Цей колір використовується для виділення різних типів \nна діаграмах Ґанта або в таблицях пакетів робіт. Тому рекомендуємо вибрати насичений колір." subject_configuration: - tab: Конфігурація теми + tab: "Конфігурація теми" manually_editable_subjects: - label: Теми, які можна редагувати вручну - caption: Користувачі можуть самостійно вводити й редагувати теми пакетів - робіт без обмежень. + label: "Теми, які можна редагувати вручну" + caption: "Користувачі можуть самостійно вводити й редагувати теми пакетів робіт без обмежень." automatically_generated_subjects: - label: Автоматично згенеровані теми - caption: Визначте шаблон, використовуючи атрибути й текст, щоб теми пакетів - робіт створювались автоматично. Користувачі не зможуть редагувати теми. + label: "Автоматично згенеровані теми" + caption: "Визначте шаблон, використовуючи атрибути й текст, щоб теми пакетів робіт створювались автоматично. Користувачі не зможуть редагувати теми." token: label_with_context: "%{attribute_context}: %{attribute_label}" context: - work_package: Робочий пакет - parent: Батьківський об’єкт - project: Проєкт + work_package: "Робочий пакет" + parent: "Батьківський об’єкт" + project: "Проєкт" pattern: - label: Шаблон теми - caption: Створіть шаблони, додаючи текст, або введіть «/», щоб знайти [підтримувані - атрибути](attributes_url). + label: "Шаблон теми" + caption: Створіть шаблони, додаючи текст, або введіть «/», щоб знайти [підтримувані атрибути](attributes_url). insert_as_text: 'Атрибутів не знайдено. Додайте як текст: «%{word}»' export_configuration: - tab: Згенерувати PDF - intro: Виберіть, які шаблони з доступних вам ви хочете ввімкнути для цього - типу. Шаблон визначає дизайн і атрибути, що відображаються в експортованому - PDF-файлі пакета робіт за допомогою цього типу. Перший шаблон у списку вибирається - за замовчуванням. + tab: "Згенерувати PDF" + intro: "Виберіть, які шаблони з доступних вам ви хочете ввімкнути для цього типу. Шаблон визначає дизайн і атрибути, що відображаються в експортованому PDF-файлі пакета робіт за допомогою цього типу. Перший шаблон у списку вибирається за замовчуванням." pdf_export_templates: - label: Шаблони експорту PDF + label: "Шаблони експорту PDF" actions: - label_enable_all: Увімкнути все - label_disable_all: Вимкнути все + label_enable_all: "Увімкнути все" + label_disable_all: "Вимкнути все" versions: overview: - work_packages_in_archived_projects: Доступ до цієї версії надано в архівних - проєктах, які досі містять пакети робіт, призначені цій версії. Їх враховано, - але вони не відображаються в пов’язаних поданнях. + work_packages_in_archived_projects: "Доступ до цієї версії надано в архівних проєктах, які досі містять пакети робіт, призначені цій версії. Їх враховано, але вони не відображаються в пов’язаних поданнях." no_results_title_text: Наразі для цієї версії не призначено робочих пакетів. wiki: - page_not_editable_index: Запитувана сторінка не існує (поки що). Вас було переспрямовано - до індексу всіх вікі-сторінок. + page_not_editable_index: Запитувана сторінка не існує (поки що). Вас було переспрямовано до індексу всіх вікі-сторінок. no_results_title_text: Наразі немає wiki-сторінок. print_hint: Буде надруковано вміст цієї wiki-сторінки без панелей навігації. index: no_results_content_text: Додати нову wiki-сторінку workflows: form: - matrix_caption: Матриця робочого процесу - matrix_caption_assignee: Матриця робочого процесу для виконавця - matrix_caption_author: Матриця робочого процесу для автора - matrix_checkbox_label: Дозволити зміну статусу «%{old_status}» на «%{new_status}» - matrix_check_all_label: Дозволити всі зміни - matrix_uncheck_all_label: Заборонити всі зміни - matrix_check_uncheck_all_in_row_label_html: Перемикач зміни статусу %{old_status} - на всі нові статуси - matrix_check_uncheck_all_in_col_label_html: Перемикач зміни всіх старих статусів - на статус %{new_status} + matrix_caption: "Матриця робочого процесу" + matrix_caption_assignee: "Матриця робочого процесу для виконавця" + matrix_caption_author: "Матриця робочого процесу для автора" + matrix_checkbox_label: "Дозволити зміну статусу «%{old_status}» на «%{new_status}»" + matrix_check_all_label: "Дозволити всі зміни" + matrix_uncheck_all_label: "Заборонити всі зміни" + matrix_check_uncheck_all_in_row_label_html: "Перемикач зміни статусу %{old_status} на всі нові статуси" + matrix_check_uncheck_all_in_col_label_html: "Перемикач зміни всіх старих статусів на статус %{new_status}" work_flows: index: no_results_title_text: Наразі немає робочих процесів. @@ -1463,90 +1202,70 @@ uk: datepicker_modal: banner: description: - automatic_mobile: Дату початку отримано. - click_on_show_relations_to_open_gantt: Натисніть кнопку «%{button_name}», - щоб переглянути діаграму Ґантта. - manual_mobile: Зв’язки ігноруються. - manual_gap_between_predecessors: Між цим пакетом робіт і всіма його попередниками - існує проміжок часу. - manual_overlap_with_predecessors: Перекривається принаймні одним попередником. - manual_with_children: Є дочірні пакети робіт, але їх дати початку ігноруються. + automatic_mobile: "Дату початку отримано." + click_on_show_relations_to_open_gantt: 'Натисніть кнопку «%{button_name}», щоб переглянути діаграму Ґантта.' + manual_mobile: "Зв’язки ігноруються." + manual_gap_between_predecessors: "Між цим пакетом робіт і всіма його попередниками існує проміжок часу." + manual_overlap_with_predecessors: "Перекривається принаймні одним попередником." + manual_with_children: "Є дочірні пакети робіт, але їх дати початку ігноруються." title: - automatic_mobile: Автоматично заплановано. - automatic_with_children: Дати визначено дочірніми пакетами робіт. - automatic_with_predecessor: Дату початку задано попередником. - manual_mobile: Заплановано вручну. - manually_scheduled: Заплановано вручну. Зв’язки не впливають на дати. + automatic_mobile: "Автоматично заплановано." + automatic_with_children: "Дати визначено дочірніми пакетами робіт." + automatic_with_predecessor: "Дату початку задано попередником." + manual_mobile: "Заплановано вручну." + manually_scheduled: "Заплановано вручну. Зв’язки не впливають на дати." blankslate: - title: Немає попередників - description: Щоб увімкнути автоматичне планування, додайте принаймні одного - попередника для цього пакета робіт. Після цього його виконання почнеться - автоматично після завершення найближчого попередника. + title: "Немає попередників" + description: "Щоб увімкнути автоматичне планування, додайте принаймні одного попередника для цього пакета робіт. Після цього його виконання почнеться автоматично після завершення найближчого попередника." ignore_non_working_days: - title: Лише робочі дні + title: "Лише робочі дні" mode: - title: Режим планування - automatic: Автоматично - manual: Вручну - show_relations: Показати зв’язки - update_inputs_aria_live_message: Засіб вибору дати оновлено. %{message} + title: "Режим планування" + automatic: "Автоматично" + manual: "Вручну" + show_relations: "Показати зв’язки" + update_inputs_aria_live_message: "Засіб вибору дати оновлено. %{message}" tabs: - aria_label: Вкладки вибору даних - children: Дочірні елементи - dates: Дати - predecessors: Попередники - successors: Наступники + aria_label: "Вкладки вибору даних" + children: "Дочірні елементи" + dates: "Дати" + predecessors: "Попередники" + successors: "Наступники" blankslate: predecessors: - title: Немає попередників - description: Цей пакет робіт не має попередників. + title: "Немає попередників" + description: "Цей пакет робіт не має попередників." successors: - title: Немає наступників - description: Цей пакет робіт не має наступників. + title: "Немає наступників" + description: "Цей пакет робіт не має наступників." children: - title: Немає дочірніх елементів - description: Цей пакет робіт не має дочірніх елементів. + title: "Немає дочірніх елементів" + description: "Цей пакет робіт не має дочірніх елементів." x_descendants: - one: Один робочий пакет нащадків + one: "Один робочий пакет нащадків" few: "%{count} нащадки робочого пакета" many: "%{count} нащадки робочого пакета" other: "%{count} нащадки робочого пакета" bulk: - copy_failed: Не вдалося скопіювати пакети робіт. - move_failed: Не вдалося перемістити пакети робіт. - could_not_be_saved: 'Не вдалося зберегти такі робочі пакети:' - none_could_be_saved: Жоден із пакетів робіт (%{total}) не можна оновити. - x_out_of_y_could_be_saved: 'Не вдалось оновити пакетів робіт: %{failing} із - %{total}. Оновлено: %{success}.' - selected_because_descendants: Хоча вибрано кілька %{selected} пакетів робіт, - змінено всього %{total}, включно з нащадками. - descendant: нащадок вибраного елемента + copy_failed: "Не вдалося скопіювати пакети робіт." + move_failed: "Не вдалося перемістити пакети робіт." + could_not_be_saved: "Не вдалося зберегти такі робочі пакети:" + none_could_be_saved: "Жоден із пакетів робіт (%{total}) не можна оновити." + x_out_of_y_could_be_saved: "Не вдалось оновити пакетів робіт: %{failing} із %{total}. Оновлено: %{success}." + selected_because_descendants: "Хоча вибрано кілька %{selected} пакетів робіт, змінено всього %{total}, включно з нащадками." + descendant: "нащадок вибраного елемента" move: - no_common_statuses_exists: Немає доступного статусу для всіх вибраних робочих - пакетів. Їх статус не може бути змінений. - unsupported_for_multiple_projects: Масове переміщення/копіювання не підтримується - для робочих пакетів з декількох проектів - current_type_not_available_in_target_project: 'Поточний тип пакета робіт не - ввімкнено в цільовому проєкті. Увімкніть його, якщо не хочете, щоб він зазнав - змін. Інакше виберіть зі списку доступний тип у цільовому проєкті. - - ' - bulk_current_type_not_available_in_target_project: 'Поточні типи пакетів робіт - не ввімкнено в цільовому проєкті. Увімкніть, якщо не хочете, щоб вони зазнали - змін. Інакше виберіть зі списку доступний тип у цільовому проєкті. - - ' + no_common_statuses_exists: "Немає доступного статусу для всіх вибраних робочих пакетів. Їх статус не може бути змінений." + unsupported_for_multiple_projects: "Масове переміщення/копіювання не підтримується для робочих пакетів з декількох проектів" + current_type_not_available_in_target_project: > + Поточний тип пакета робіт не ввімкнено в цільовому проєкті. Увімкніть його, якщо не хочете, щоб він зазнав змін. Інакше виберіть зі списку доступний тип у цільовому проєкті. + bulk_current_type_not_available_in_target_project: > + Поточні типи пакетів робіт не ввімкнено в цільовому проєкті. Увімкніть, якщо не хочете, щоб вони зазнали змін. Інакше виберіть зі списку доступний тип у цільовому проєкті. sharing: missing_workflow_warning: - title: Відсутній робочий процес для надання доступу до пакета робіт - message: Для ролі «Редактор пакета робіт» не налаштовано жодного робочого - процесу. Без робочого процесу користувач, якому надано доступ, не може змінити - статус пакета робіт. Робочі процеси можна копіювати. Виберіть вихідний тип - (напр., «Завдання») і роль (напр., «Учасник»). Потім виберіть цільові типи. - Для початку радимо вибирати всі типи як цільові. Нарешті, виберіть роль - «Редактор пакета робіт» і натисніть «Копіювати». Після цього ви зможете - налаштовувати робочі процеси для кожної ролі, як ви це зазвичай робите. - link_message: Налаштуйте робочі процеси на панелі адміністрування. + title: "Відсутній робочий процес для надання доступу до пакета робіт" + message: "Для ролі «Редактор пакета робіт» не налаштовано жодного робочого процесу. Без робочого процесу користувач, якому надано доступ, не може змінити статус пакета робіт. Робочі процеси можна копіювати. Виберіть вихідний тип (напр., «Завдання») і роль (напр., «Учасник»). Потім виберіть цільові типи. Для початку радимо вибирати всі типи як цільові. Нарешті, виберіть роль «Редактор пакета робіт» і натисніть «Копіювати». Після цього ви зможете налаштовувати робочі процеси для кожної ролі, як ви це зазвичай робите." + link_message: "Налаштуйте робочі процеси на панелі адміністрування." summary: reports: category: @@ -1565,605 +1284,542 @@ uk: no_results_title_text: Наразі немає доступних версій. work_package_relations_tab: index: - action_bar_title: Додавайте зв’язки з іншими пакетами робіт. + action_bar_title: "Додавайте зв’язки з іншими пакетами робіт." no_results_title_text: Зараз немає доступних зв’язків. - blankslate_heading: Немає зв’язків - blankslate_description: Цей пакет робіт ще не має зв’язків. - label_add_child_button: Дочірній - label_add_x: Додати %{x} - label_edit_x: Редагувати %{x} - label_add_description: Додати опис + blankslate_heading: "Немає зв’язків" + blankslate_description: "Цей пакет робіт ще не має зв’язків." + label_add_child_button: "Дочірній" + label_add_x: "Додати %{x}" + label_edit_x: "Редагувати %{x}" + label_add_description: "Додати опис" lag: - subject: Затримка - caption: Мінімальна кількість робочих днів між двома пакетами робіт. Може бути - від’ємним числом. + subject: "Затримка" + caption: |- + Мінімальна кількість робочих днів між двома пакетами робіт. Може бути від’ємним числом. relations: - label_new_child_created: Новий пакет робіт створено й додано як дочірній - label_relates_singular: зв’язано з - label_relates_plural: зв’язано з - label_relates_to_singular: зв’язано з - label_relates_to_plural: зв’язано з - relates_description: Створює видимий зв’язок між двома пакетами робіт без додаткових - ефектів - relates_to_description: Створює видимий зв’язок між двома пакетами робіт без - додаткових ефектів - label_precedes_singular: наступник (після) - label_precedes_plural: наступники (після) - precedes_description: Зв’язаний пакет робіт обов’язково має починатися після - завершення цього - label_follows_singular: попередник (до) - label_follows_plural: попередники (до) - follows_description: Зв’язаний пакет робіт обов’язково має завершуватися перед - початком цього - label_child_singular: дочірній елемент - label_child_plural: дочірні елементи - new_child: Створити новий дочірній елемент - new_child_description: Створює звʼязаний пакет робіт як піделемент поточного - (батьківського) пакета робіт - child: Дочірній - child_description: Вкладає звʼязаний пакет робіт як піделемент поточного (батьківського) - пакета робіт - parent: Батьківський об’єкт - parent_description: Установлює звʼязаний пакет робіт батьківським відносно поточного - (дочірнього) пакета робіт - label_closest: Найближчі - label_blocks_singular: блоки - label_blocks_plural: блоки - blocks_description: Звʼязаний пакет робіт можна закрити лише після закриття - цього - label_blocked_singular: заблоковано - label_blocked_plural: заблоковано - label_blocked_by_singular: заблоковано - label_blocked__by_plural: заблоковано - blocked_description: Цей пакет робіт можна закрити лише після закриття звʼязаного - з ним - blocked_by_description: Цей пакет робіт можна закрити лише після закриття звʼязаного - з ним - label_duplicates_singular: дублює - label_duplicates_plural: дублює - duplicates_description: Це копія звʼязаного пакета робіт - label_duplicated_singular: дублюється - label_duplicated_plural: дублюється - label_duplicated_by_singular: дублюється - label_duplicated_by_plural: дублюється - duplicated_by_description: Звʼязаний пакет робіт є копією цього - duplicated_description: Звʼязаний пакет робіт є копією цього - label_includes_singular: включає - label_includes_plural: включає - includes_description: Позначає звʼязаний пакет робіт як такий, що включає цей, - без додаткового ефекту - label_partof_singular: належить до - label_partof_plural: належить до - label_part_of_singular: належить до - label_part_of_plural: належить до - partof_description: Позначає звʼязаний пакет робіт як такий, що належить до - цього, без додаткового ефекту - part_of_description: Позначає звʼязаний пакет робіт як такий, що належить до - цього, без додаткового ефекту - label_requires_singular: вимагає - label_requires_plural: вимагає - requires_description: Позначає звʼязаний пакет робіт як обовʼязковий для цього - label_required_singular: вимагається - label_required_plural: вимагається - required_description: Позначає цей робочий пакет як обовʼязковий для звʼязаного - з ним - label_parent_singular: батьківський елемент - label_parent_plural: батьківський елемент - label_other_relations: Інші зв’язки - ghost_relation_title: Пов’язаний пакет робіт - ghost_relation_description: Ви не маєте дозволів на перегляд цього елемента. + label_new_child_created: "Новий пакет робіт створено й додано як дочірній" + label_relates_singular: "зв’язано з" + label_relates_plural: "зв’язано з" + label_relates_to_singular: "зв’язано з" + label_relates_to_plural: "зв’язано з" + relates_description: "Створює видимий зв’язок між двома пакетами робіт без додаткових ефектів" + relates_to_description: "Створює видимий зв’язок між двома пакетами робіт без додаткових ефектів" + label_precedes_singular: "наступник (після)" + label_precedes_plural: "наступники (після)" + precedes_description: "Зв’язаний пакет робіт обов’язково має починатися після завершення цього" + label_follows_singular: "попередник (до)" + label_follows_plural: "попередники (до)" + follows_description: "Зв’язаний пакет робіт обов’язково має завершуватися перед початком цього" + label_child_singular: "дочірній елемент" + label_child_plural: "дочірні елементи" + new_child: "Створити новий дочірній елемент" + new_child_description: "Створює звʼязаний пакет робіт як піделемент поточного (батьківського) пакета робіт" + child: "Дочірній" + child_description: "Вкладає звʼязаний пакет робіт як піделемент поточного (батьківського) пакета робіт" + parent: "Батьківський об’єкт" + parent_description: "Установлює звʼязаний пакет робіт батьківським відносно поточного (дочірнього) пакета робіт" + label_closest: "Найближчі" + label_blocks_singular: "блоки" + label_blocks_plural: "блоки" + blocks_description: "Звʼязаний пакет робіт можна закрити лише після закриття цього" + label_blocked_singular: "заблоковано" + label_blocked_plural: "заблоковано" + label_blocked_by_singular: "заблоковано" + label_blocked__by_plural: "заблоковано" + blocked_description: "Цей пакет робіт можна закрити лише після закриття звʼязаного з ним" + blocked_by_description: "Цей пакет робіт можна закрити лише після закриття звʼязаного з ним" + label_duplicates_singular: "дублює" + label_duplicates_plural: "дублює" + duplicates_description: "Це копія звʼязаного пакета робіт" + label_duplicated_singular: "дублюється" + label_duplicated_plural: "дублюється" + label_duplicated_by_singular: "дублюється" + label_duplicated_by_plural: "дублюється" + duplicated_by_description: "Звʼязаний пакет робіт є копією цього" + duplicated_description: "Звʼязаний пакет робіт є копією цього" + label_includes_singular: "включає" + label_includes_plural: "включає" + includes_description: "Позначає звʼязаний пакет робіт як такий, що включає цей, без додаткового ефекту" + label_partof_singular: "належить до" + label_partof_plural: "належить до" + label_part_of_singular: "належить до" + label_part_of_plural: "належить до" + partof_description: "Позначає звʼязаний пакет робіт як такий, що належить до цього, без додаткового ефекту" + part_of_description: "Позначає звʼязаний пакет робіт як такий, що належить до цього, без додаткового ефекту" + label_requires_singular: "вимагає" + label_requires_plural: "вимагає" + requires_description: "Позначає звʼязаний пакет робіт як обовʼязковий для цього" + label_required_singular: "вимагається" + label_required_plural: "вимагається" + required_description: "Позначає цей робочий пакет як обовʼязковий для звʼязаного з ним" + label_parent_singular: "батьківський елемент" + label_parent_plural: "батьківський елемент" + label_other_relations: "Інші зв’язки" + ghost_relation_title: "Пов’язаний пакет робіт" + ghost_relation_description: "Ви не маєте дозволів на перегляд цього елемента." label_invitation: Запрошення account: - delete: Видалити обліковий запис - delete_confirmation: Ви дійсно бажаєте видалити цей обліковий запис? - deletion_pending: Для цього облікового запису заплановано видалення. Зверніть - увагу, що цей процес відбувається у фоновому режимі. Остаточне видалення даних - користувача може зайняти кілька хвилин. + delete: "Видалити обліковий запис" + delete_confirmation: "Ви дійсно бажаєте видалити цей обліковий запис?" + deletion_pending: "Для цього облікового запису заплановано видалення. Зверніть увагу, що цей процес відбувається у фоновому режимі. Остаточне видалення даних користувача може зайняти кілька хвилин." deletion_info: data_consequences: - other: Усі дані, які стосуються користувача, буде видалено. Дії користувача - в спільних поданнях, таких як пакети робіт і наради, залишаться в системі, - проте їх буде зв’язано із загальним «Видаленим користувачем», який ніяк - не вказує на оригінальний обліковий запис. - self: Усі дані, які стосуються користувача, буде видалено. Ваші дії в спільних - поданнях, таких як пакети робіт і наради, залишаться в системі, проте їх - буде зв’язано із загальним «Видаленим користувачем», який ніяк не вказує - на ваш оригінальний обліковий запис. - heading: Видалити обліковий запис, яким користується %{name}? + other: "Усі дані, які стосуються користувача, буде видалено. Дії користувача в спільних поданнях, таких як пакети робіт і наради, залишаться в системі, проте їх буде зв’язано із загальним «Видаленим користувачем», який ніяк не вказує на оригінальний обліковий запис." + self: "Усі дані, які стосуються користувача, буде видалено. Ваші дії в спільних поданнях, таких як пакети робіт і наради, залишаться в системі, проте їх буде зв’язано із загальним «Видаленим користувачем», який ніяк не вказує на ваш оригінальний обліковий запис." + heading: "Видалити обліковий запис, яким користується %{name}?" login_consequences: - other: Цей обліковий запис буде негайно видалено із системи, і користувач - більше не зможе ввійти в неї за допомогою своїх облікових даних. - self: Ваш обліковий запис буде негайно видалено із системи, і ви більше не - зможете ввійти в неї за допомогою своїх облікових даних. - error_inactive_activation_by_mail: 'Ваш обліковий запис ще не активовано. Щоб - активувати ваш обліковий запис, перейдіть за посиланням, яке було відправлено - вам електронною поштою. - - ' - error_inactive_manual_activation: 'Ваш обліковий запис ще не активовано. Будь - ласка, зачекайте поки адміністратор активує ваш обліковий запис. - - ' - error_self_registration_disabled: 'Реєстрація користувача у цій системі відключена. - Будь ласка, зверніться до адміністратора, щоб створити обліковий запис для вас. - - ' - error_self_registration_limited_provider: 'Реєстрація користувачів через постачальника - єдиного входу %{name} обмежена. Зверніться до адміністратора, щоб активувати - обліковий запис або змінити ліміт самостійних реєстрацій для цього постачальника. - - ' - login_with_auth_provider: або ввійдіть у свій існуючий обліковий запис - signup_with_auth_provider: або зареєструйтесь, використовуючи + other: "Цей обліковий запис буде негайно видалено із системи, і користувач більше не зможе ввійти в неї за допомогою своїх облікових даних." + self: "Ваш обліковий запис буде негайно видалено із системи, і ви більше не зможете ввійти в неї за допомогою своїх облікових даних." + error_inactive_activation_by_mail: > + Ваш обліковий запис ще не активовано. Щоб активувати ваш обліковий запис, перейдіть за посиланням, яке було відправлено вам електронною поштою. + error_inactive_manual_activation: > + Ваш обліковий запис ще не активовано. Будь ласка, зачекайте поки адміністратор активує ваш обліковий запис. + error_self_registration_disabled: > + Реєстрація користувача у цій системі відключена. Будь ласка, зверніться до адміністратора, щоб створити обліковий запис для вас. + error_self_registration_limited_provider: > + Реєстрація користувачів через постачальника єдиного входу %{name} обмежена. Зверніться до адміністратора, щоб активувати обліковий запис або змінити ліміт самостійних реєстрацій для цього постачальника. + login_with_auth_provider: "або ввійдіть у свій існуючий обліковий запис" + signup_with_auth_provider: "або зареєструйтесь, використовуючи" auth_source_login: Увійдіть, як %{login} для активації облікового запису. omniauth_login: Увійдіть, щоб активувати свій обліковий запис. - actionview_instancetag_blank_option: Будь ласка, виберіть + actionview_instancetag_blank_option: "Будь ласка, виберіть" activemodel: attributes: projects/copy_options: - dependencies: Залежності + dependencies: "Залежності" activerecord: attributes: - agile/sprint: {} jira_import: - projects: Проєкти - import/jira: - name: Назва екземпляра Jira - url: URL-адреса екземпляра Jira - personal_access_token: Персональний маркер доступу + projects: "Проєкти" + "import/jira": + name: "Назва екземпляра Jira" + url: "URL-адреса екземпляра Jira" + personal_access_token: "Персональний маркер доступу" announcements: - show_until: Показувати до + show_until: "Показувати до" attachment: - attachment_content: Вміст вкладення - attachment_file_name: Назва файлу вкладеного файлу - content_type: Тип контенту - downloads: Завантаження - file: Файл - filename: Файл - filesize: Розмір + attachment_content: "Вміст вкладення" + attachment_file_name: "Назва файлу вкладеного файлу" + content_type: "Тип контенту" + downloads: "Завантаження" + file: "Файл" + filename: "Файл" + filesize: "Розмір" attribute_help_text: - attribute_name: Атрибут - help_text: Довідковий текст - caption: Заголовок + attribute_name: "Атрибут" + help_text: "Довідковий текст" + caption: "Заголовок" auth_provider: - scim_clients: Клієнти SCIM + scim_clients: "Клієнти SCIM" calculated_value_error: - error_code: Код помилки - customized_id: Користувацький ідентифікатор - customized_type: Користувацький тип + error_code: "Код помилки" + customized_id: "Користувацький ідентифікатор" + customized_type: "Користувацький тип" capability: - context: Контекст + context: "Контекст" changeset: - repository: Репозиторій + repository: "Репозиторій" comment: - commented: Прокоментовано + commented: "Прокоментовано" #an object that this comment belongs to custom_action: - actions: Дії + actions: "Дії" custom_field: - allow_non_open_versions: Дозволити невідкриті версії - default_value: Значення за замовчуванням - editable: Може бути відредаговане - field_format: Формат - formula: Формула - is_filter: Використовується як фільтр - is_for_all: Для всіх проєктів - is_required: Обов'язкове поле - max_length: Максимальна довжина - min_length: Мінімальна довжина - content_right_to_left: Письмо зліва направо - multi_value: Дозволити вибір - possible_values: Можливі значення - regexp: Регулярний вираз - searchable: Доступно для пошуку - admin_only: Тільки для адміністраторів - has_comment: Add a comment text field + allow_non_open_versions: "Дозволити невідкриті версії" + default_value: "Значення за замовчуванням" + editable: "Може бути відредаговане" + field_format: "Формат" + formula: "Формула" + is_filter: "Використовується як фільтр" + is_for_all: "Для всіх проєктів" + is_required: "Обов'язкове поле" + max_length: "Максимальна довжина" + min_length: "Мінімальна довжина" + content_right_to_left: "Письмо зліва направо" + multi_value: "Дозволити вибір" + possible_values: "Можливі значення" + regexp: "Регулярний вираз" + searchable: "Доступно для пошуку" + admin_only: "Тільки для адміністраторів" + has_comment: "Додати текстове поле для коментаря" custom_value: - value: Значення + value: "Значення" design_color: - variable: Змінна + variable: "Змінна" doorkeeper/application: - uid: Ідентифікатор клієнта - secret: Секретний ключ клієнта - owner: Власник - builtin: Вбудований - enabled: Активні - redirect_uri: Перенаправити URI (Automatic Translation) - client_credentials_user_id: Ідентифікатор користувача для облікових даних - клієнта - scopes: Область дії - confidential: Конфіденційний + uid: "Ідентифікатор клієнта" + secret: "Секретний ключ клієнта" + owner: "Власник" + builtin: "Вбудований" + enabled: "Активні" + redirect_uri: "Перенаправити URI (Automatic Translation)" + client_credentials_user_id: "Ідентифікатор користувача для облікових даних клієнта" + scopes: "Область дії" + confidential: "Конфіденційний" emoji_reaction: - reactable: Реакція на + reactable: "Реакція на" enterprise_token: - starts_at: Дійсний з - subscriber: Абонент - subscription: Підписка - plan: План - encoded_token: Маркер підтримки підприємства - active_user_count_restriction: Активні користувачі + starts_at: "Дійсний з" + subscriber: "Абонент" + subscription: "Підписка" + plan: "План" + encoded_token: "Маркер підтримки підприємства" + active_user_count_restriction: "Активні користувачі" enterprise_trial: - company: Компанія + company: "Компанія" favorite: - favorited: Об’єкт + favorited: "Об’єкт" grids/grid: - page: Сторінка - row_count: Кількість рядків - column_count: Кількість стовпців - widgets: Віджети + page: "Сторінка" + row_count: "Кількість рядків" + column_count: "Кількість стовпців" + widgets: "Віджети" journal: - notes: Примітки - cause_type: Тип причини + notes: "Примітки" + cause_type: "Тип причини" ldap_auth_source: - account: Обліковий запис - attr_firstname: Атрибут «Ім’я» - attr_lastname: Атрибут «Прізвище» - attr_login: Атрибут «Ім’я користувача» - attr_mail: Атрибут «Електронна адреса» - filter_string: Рядок фільтра - admin: Адміністратор - base_dn: Базове ім’я DN - host: Хост - onthefly: Автоматичне створення користувачів - port: Порт - tls_certificate_string: Сертифікат SSL сервера LDAP + account: "Обліковий запис" + attr_firstname: "Атрибут «Ім’я»" + attr_lastname: "Атрибут «Прізвище»" + attr_login: "Атрибут «Ім’я користувача»" + attr_mail: "Атрибут «Електронна адреса»" + filter_string: "Рядок фільтра" + admin: "Адміністратор" + base_dn: "Базове ім’я DN" + host: "Хост" + onthefly: "Автоматичне створення користувачів" + port: "Порт" + tls_certificate_string: "Сертифікат SSL сервера LDAP" mcp_configuration: enabled: Увімкнено title: Заголовок description: Опис member: - roles: Роль + roles: "Роль" notification: - read_ian: Читайте в додатку - resource: Ресурс + read_ian: "Читайте в додатку" + resource: "Ресурс" oauth_client: - client: ID клієнта + client: "ID клієнта" project: active_value: - true: розархівовано - false: заархівовано - attribute_groups: Групи атрибутів - description: Опис - enabled_modules: Увімкнені модулі - identifier: Ідентифікатор - latest_activity_at: Остання активність на - parent: Підпроект - project_creation_wizard_enabled: Запит на ініціювання проєкту + true: "розархівовано" + false: "заархівовано" + attribute_groups: "Групи атрибутів" + description: "Опис" + enabled_modules: "Увімкнені модулі" + identifier: "Ідентифікатор" + latest_activity_at: "Остання активність на" + parent: "Підпроект" + project_creation_wizard_enabled: "Запит на ініціювання проєкту" public_value: - title: Видимість - true: публічний - false: приватний - queries: Запити - status_code: Статус - status_explanation: Опис статусу + title: "Видимість" + true: "публічний" + false: "приватний" + queries: "Запити" + status_code: "Статус" + status_explanation: "Опис статусу" status_codes: - not_started: Не почато - on_track: За графіком - at_risk: Під загрозою - off_track: Не за графіком - finished: Завершено - discontinued: Припинено - project_creation_wizard_assignee_custom_field: Виконавець на момент подання - project_creation_wizard_notification_text: Текст сповіщення - project_creation_wizard_send_confirmation_email: Лист із підтвердженням - project_creation_wizard_status_when_submitted: Статус на момент подання - project_creation_wizard_work_package_comment: Коментар до пакета робіт - project_creation_wizard_work_package_type: Тип пакета робіт - template: Шаблон - templated: Проєкт шаблона + not_started: "Не почато" + on_track: "За графіком" + at_risk: "Під загрозою" + off_track: "Не за графіком" + finished: "Завершено" + discontinued: "Припинено" + project_creation_wizard_assignee_custom_field: "Виконавець на момент подання" + project_creation_wizard_notification_text: "Текст сповіщення" + project_creation_wizard_send_confirmation_email: "Лист із підтвердженням" + project_creation_wizard_status_when_submitted: "Статус на момент подання" + project_creation_wizard_work_package_comment: "Коментар до пакета робіт" + project_creation_wizard_work_package_type: "Тип пакета робіт" + template: "Шаблон" + templated: "Проєкт шаблона" templated_value: - true: позначено як шаблон - false: не позначено як шаблон - types: Типи - versions: Версії - work_packages: Пакет робіт - workspace_type: Тип робочого простору + true: "позначено як шаблон" + false: "не позначено як шаблон" + types: "Типи" + versions: "Версії" + work_packages: "Пакет робіт" + workspace_type: "Тип робочого простору" project_custom_field: custom_field_section: Розділ subproject_template_assignment: - workspace_type: Тип робочого простору + workspace_type: "Тип робочого простору" project/phase: - date_range: Діапазон дат - definition: Визначення - duration: Тривалість - start_date: Дата початку - start_date_caption: Слідує за попереднім етапом. - finish_date: Дата закінчення + date_range: "Діапазон дат" + definition: "Визначення" + duration: "Тривалість" + start_date: "Дата початку" + start_date_caption: "Слідує за попереднім етапом." + finish_date: "Дата закінчення" project/phase_definition: - name: Назва - color: Колір - start_gate: Початкова контрольна точка етапу - start_gate_name: Назва початкової контрольної точки етапу - finish_gate: Кінцева контрольна точка етапу - finish_gate_name: Назва кінцевої контрольної точки етапу + name: "Назва" + color: "Колір" + start_gate: "Початкова контрольна точка етапу" + start_gate_name: "Назва початкової контрольної точки етапу" + finish_gate: "Кінцева контрольна точка етапу" + finish_gate_name: "Назва кінцевої контрольної точки етапу" query: - sums: Суми - columns: Стовпці - column_names: Стовпці - relations_to_type_column: Відносини з %{type} + sums: "Суми" + columns: "Стовпці" + column_names: "Стовпці" + relations_to_type_column: "Відносини з %{type}" relations_of_type_column: "%{type} відносини" - child_work_packages: Дочірні пакети робіт - group_by: Групувати результати по - sort_by: Сортувати результати за - filters: Фільтри - timeline_labels: Мітки часової шкали - timeline_visible: Показати діаграму Ганта - timeline_zoom_level: Рівень масштабу діаграми Ґантта - timestamps: Вихідні значення міток часу - sort_criteria: Критерії сортування - highlighted_attributes: Виділені атрибути - highlighting_mode: Режим виділення - display_representation: Режим відображення - show_hierarchies: Режим відображення - starred: Обрані - hidden: Приховано - manual_sorting: Порядок сортування вручну - ordered_work_packages: Порядок пакетів робіт - include_subprojects: Включити підпроєкти - results: Результати + child_work_packages: "Дочірні пакети робіт" + group_by: "Групувати результати по" + sort_by: "Сортувати результати за" + filters: "Фільтри" + timeline_labels: "Мітки часової шкали" + timeline_visible: "Показати діаграму Ганта" + timeline_zoom_level: "Рівень масштабу діаграми Ґантта" + timestamps: "Вихідні значення міток часу" + sort_criteria: "Критерії сортування" + highlighted_attributes: "Виділені атрибути" + highlighting_mode: "Режим виділення" + display_representation: "Режим відображення" + show_hierarchies: "Режим відображення" + starred: "Обрані" + hidden: "Приховано" + manual_sorting: "Порядок сортування вручну" + ordered_work_packages: "Порядок пакетів робіт" + include_subprojects: "Включити підпроєкти" + results: "Результати" relation: - lag: Затримка - from: Пов’язаний пакет робіт - to: Пов'язаний робочий пакет - relation_type: Тип зв’язку + lag: "Затримка" + from: "Пов’язаний пакет робіт" + to: "Пов'язаний робочий пакет" + relation_type: "Тип зв’язку" reminder: - remindable: Об’єкт нагадування - remind_at: Нагадати о - remind_at_date: Дата - remind_at_time: Час + remindable: "Об’єкт нагадування" + remind_at: "Нагадати о" + remind_at_date: "Дата" + remind_at_time: "Час" reminder_notification: - notification: Сповіщення + notification: "Сповіщення" repository: - url: Посилання + url: "Посилання" role: - permissions: Дозволи + permissions: "Дозволи" scim_client: - authentication_method: Метод автентифікації - jwt_sub: Потрібна тема + authentication_method: "Метод автентифікації" + jwt_sub: "Потрібна тема" status: - is_closed: Робочий пакет закритий - is_readonly: Пакет робіт лише для перегляду - excluded_from_totals: Виключити з підрахунку підсумків в ієрархії + is_closed: "Робочий пакет закритий" + is_readonly: "Пакет робіт лише для перегляду" + excluded_from_totals: "Виключити з підрахунку підсумків в ієрархії" default_done_ratio: "% завершення" token/named: - token_name: Ім’я маркера + token_name: "Ім’я маркера" token/ical: - calendar: Календар - ical_token_query_assignment: Призначення запиту + calendar: "Календар" + ical_token_query_assignment: "Призначення запиту" time_entry: - activity: Активність - hours: Години - spent_on: Дата - type: Тип - ongoing: Триває + activity: "Активність" + hours: "Години" + spent_on: "Дата" + type: "Тип" + ongoing: "Триває" type: - description: Текст за умовчанням для опису - attribute_groups: Конфігурація форми - is_in_roadmap: За умовчанням відображається в дорожній карті - is_default: Активовано для нових проектів за замовчуванням - is_milestone: Це віха - color: Колір - patterns: Шаблони + description: "Текст за умовчанням для опису" + attribute_groups: "Конфігурація форми" + is_in_roadmap: "За умовчанням відображається в дорожній карті" + is_default: "Активовано для нових проектів за замовчуванням" + is_milestone: "Це віха" + color: "Колір" + patterns: "Шаблони" remote_identity: - auth_source: Джерело автентифікації - integration: Інтеграція - user: Користувач + auth_source: "Джерело автентифікації" + integration: "Інтеграція" + user: "Користувач" user: - admin: Адміністратор - auth_source: Джерело автентифікації - ldap_auth_source: LDAP-підключення - identity_url: URL-адреса сутності - current_password: Поточний пароль - force_password_change: Примусово змінити пароль на наступному вході в систему - language: Мова - last_login_on: Останній вхід - failed_login_count: Спроби невдалого входу - first_name: Ім’я - last_name: Прізвище - first_login: Перший вхід - new_password: Новий пароль - password_confirmation: Підтвердження - consented_at: Згоден на + admin: "Адміністратор" + auth_source: "Джерело автентифікації" + ldap_auth_source: "LDAP-підключення" + identity_url: "URL-адреса сутності" + current_password: "Поточний пароль" + force_password_change: "Примусово змінити пароль на наступному вході в систему" + language: "Мова" + last_login_on: "Останній вхід" + failed_login_count: "Спроби невдалого входу" + first_name: "Ім’я" + last_name: "Прізвище" + first_login: "Перший вхід" + new_password: "Новий пароль" + password_confirmation: "Підтвердження" + consented_at: "Згоден на" group: - identity_url: URL-адреса ідентичності + identity_url: "URL-адреса ідентичності" user_preference: - header_look_and_feel: Оформлення - header_alerts: Сповіщення - button_update_look_and_feel: Оновити оформлення - button_update_alerts: Сповіщення про оновлення - button_update_user_information: Оновити профіль - comments_sorting: Відображати дії з пакетів робіт, відсортовані за - disable_keyboard_shortcuts: Вимкнути комбінації клавіш - disable_keyboard_shortcuts_caption_html: Ви можете вимкнути стандартні комбінації клавіш, якщо використовуєте невізуальний екран - або хочете, щоб відповідні дії не запускалися, коли ви натискаєте ці комбінації - клавіш випадково. - dismissed_enterprise_banners: Приховані банери Enterprise - impaired: Режим спеціальних можливостей - auto_hide_popups: Автоматично приховувати банери про успішне виконання - auto_hide_popups_caption: Якщо ввімкнено, зелені банери про успішне виконання - автоматично зникатимуть через 5 секунд. - warn_on_leaving_unsaved: Попереджати мене, коли залишив робочий пакет із незбереженими - змінами - increase_theme_contrast: Збільшити контрастність теми - increase_contrast: Збільшити контрастність - increase_contrast_caption: Вмикає високу контрастність для вибраного колірного - режиму. - force_light_theme_contrast: Примусово вмикати високу контрастність у світлому - режимі - force_dark_theme_contrast: Примусово вмикати високу контрастність у темному - режимі - force_light_theme_contrast_caption: Використовуватиметься висококонтрастна - версія світлого режиму, коли налаштовано автоматичний вибір колірного режиму. - force_dark_theme_contrast_caption: Використовуватиметься висококонтрастна - версія темного режиму, коли налаштовано автоматичний вибір колірного режиму. - theme: Колірний режим - time_zone: Часовий пояс - mode_guideline: Деякі режими перезаписують користувацькі кольори теми, щоб - поліпшити доступність і читабельність. Виберіть світлий режим, якщо потрібна - повна підтримка користувацької теми. - daily_reminders: Щоденні нагадування - workdays: Робочі дні + header_look_and_feel: "Оформлення" + header_alerts: "Сповіщення" + button_update_look_and_feel: "Оновити оформлення" + button_update_alerts: "Сповіщення про оновлення" + button_update_user_information: "Оновити профіль" + comments_sorting: "Відображати дії з пакетів робіт, відсортовані за" + disable_keyboard_shortcuts: "Вимкнути комбінації клавіш" + disable_keyboard_shortcuts_caption_html: |- + Ви можете вимкнути стандартні комбінації клавіш, якщо використовуєте невізуальний екран або хочете, щоб відповідні дії не запускалися, коли ви натискаєте ці комбінації клавіш випадково. + dismissed_enterprise_banners: "Приховані банери Enterprise" + impaired: "Режим спеціальних можливостей" + auto_hide_popups: "Автоматично приховувати банери про успішне виконання" + auto_hide_popups_caption: "Якщо ввімкнено, зелені банери про успішне виконання автоматично зникатимуть через 5 секунд." + warn_on_leaving_unsaved: "Попереджати мене, коли залишив робочий пакет із незбереженими змінами" + increase_theme_contrast: "Збільшити контрастність теми" + increase_contrast: "Збільшити контрастність" + increase_contrast_caption: "Вмикає високу контрастність для вибраного колірного режиму." + force_light_theme_contrast: "Примусово вмикати високу контрастність у світлому режимі" + force_dark_theme_contrast: "Примусово вмикати високу контрастність у темному режимі" + force_light_theme_contrast_caption: "Використовуватиметься висококонтрастна версія світлого режиму, коли налаштовано автоматичний вибір колірного режиму." + force_dark_theme_contrast_caption: "Використовуватиметься висококонтрастна версія темного режиму, коли налаштовано автоматичний вибір колірного режиму." + theme: "Колірний режим" + time_zone: "Часовий пояс" + mode_guideline: "Деякі режими перезаписують користувацькі кольори теми, щоб поліпшити доступність і читабельність. Виберіть світлий режим, якщо потрібна повна підтримка користувацької теми." + daily_reminders: "Щоденні нагадування" + workdays: "Робочі дні" users/invitation/form_model: - principal_type: Тип запрошення - id_or_email: Ім‘я або електронна адреса + principal_type: "Тип запрошення" + id_or_email: "Ім‘я або електронна адреса" version: - effective_date: Дата закінчення - sharing: Поширення + effective_date: "Дата закінчення" + sharing: "Поширення" wiki_content: - text: Текст + text: "Текст" wiki_page: - parent_title: Головна сторінка - redirect_existing_links: Перенаправити існуючі посилання - text: Контент сторінки + parent_title: "Головна сторінка" + redirect_existing_links: "Перенаправити існуючі посилання" + text: "Контент сторінки" work_package: - ancestor: Нащадки - begin_insertion: Початок вставки - begin_deletion: Початок видалення - children: Субелементи - derived_done_ratio: Загальний % завершення - derived_remaining_hours: Загальний залишок роботи - derived_remaining_time: Загальний залишок роботи + ancestor: "Нащадки" #used for filtering of work packages that are descendants of a given work package + begin_insertion: "Початок вставки" + begin_deletion: "Початок видалення" + children: "Субелементи" + derived_done_ratio: "Загальний % завершення" + derived_remaining_hours: "Загальний залишок роботи" + derived_remaining_time: "Загальний залишок роботи" done_ratio: "% завершення" - duration: Тривалість - end_insertion: Кінець вставки - end_deletion: Кінець видалення - ignore_non_working_days: Ігнорувати неробочі дні + duration: "Тривалість" + end_insertion: "Кінець вставки" + end_deletion: "Кінець видалення" + ignore_non_working_days: "Ігнорувати неробочі дні" include_non_working_days: - title: Робочі дні - false: лише робочі дні - true: включати неробочі дні + title: "Робочі дні" + false: "лише робочі дні" + true: "включати неробочі дні" journal_internal: Внутрішній журнал - notify: Сповіщати - parent: Джерело - parent_issue: Батьківський об’єкт - parent_work_package: Батьківський об’єкт - priority: Пріоритет + notify: "Сповіщати" #used in custom actions + parent: "Джерело" + parent_issue: "Батьківський об’єкт" + parent_work_package: "Батьківський об’єкт" + priority: "Пріоритет" progress: "% завершення" - readonly: Лише читання - remaining_hours: Залишок роботи - remaining_time: Залишок роботи - shared_with_users: Доступ мають - schedule_manually: Ручне планування - spent_hours: Витрачений час - spent_time: Трудовитрати - subproject: Підпроект - time_entries: Час журналу - type: Тип - version: Версія - watcher: Спостерігач + readonly: "Лише читання" + remaining_hours: "Залишок роботи" + remaining_time: "Залишок роботи" + shared_with_users: "Доступ мають" + schedule_manually: "Ручне планування" + spent_hours: "Витрачений час" + spent_time: "Трудовитрати" + subproject: "Підпроект" + time_entries: "Час журналу" + type: "Тип" + version: "Версія" + watcher: "Спостерігач" errors: messages: - accepted: повинні бути прийняті. - after: має бути після %{date} - after_today: має бути в майбутньому. - after_or_equal_to: має бути після або рівним %{date} - before: має бути раніше %{date} - before_or_equal_to: має бути до або %{date} - blank: не може бути порожнім. + accepted: "повинні бути прийняті." + after: "має бути після %{date}" + after_today: "має бути в майбутньому." + after_or_equal_to: "має бути після або рівним %{date}" + before: "має бути раніше %{date}" + before_or_equal_to: "має бути до або %{date}" + blank: "не може бути порожнім." blank_nested: "– потрібно встановити властивість «%{property}»." cannot_delete_mapping: "– обов’язкове. Неможливо видалити." - is_for_all_cannot_modify: призначений для всіх проєктів, тому його не можна - бути змінити. - cant_link_a_work_package_with_a_descendant: Робочий пакет не може бути пов'язаний - з одним з підзадач. - circular_dependency: Це співвідношення створить кругову залежність. - confirmation: не збігається %{attribute} + is_for_all_cannot_modify: "призначений для всіх проєктів, тому його не можна бути змінити." + cant_link_a_work_package_with_a_descendant: "Робочий пакет не може бути пов'язаний з одним з підзадач." + circular_dependency: "Це співвідношення створить кругову залежність." + confirmation: "не збігається %{attribute}" could_not_be_copied: "%{dependency} не вдалося скопіювати (повністю)." - does_not_exist: не існує. + does_not_exist: "не існує." error_enterprise_only: "%{action} можна лише у версії OpenProject Enterprise." error_unauthorized: "– можливо, немає доступу." - error_readonly: "– було здійснено спробу запису, але елемент недоступний для - запису." - error_conflict: Інформація була оновлена принаймні один інший користувач в - той же час. - error_not_found: не знайдено. + error_readonly: "– було здійснено спробу запису, але елемент недоступний для запису." + error_conflict: "Інформація була оновлена принаймні один інший користувач в той же час." + error_not_found: "не знайдено." email: "– це не дійсна електронна адреса." - empty: не може бути порожнім. - enterprise_plan_required: потрібен принаймні план %{plan_name}. - even: має бути рівним. - exclusion: зарезервовано. + empty: "не може бути порожнім." + enterprise_plan_required: "потрібен принаймні план %{plan_name}." + even: "має бути рівним." + exclusion: "зарезервовано." feature_disabled: недоступна. feature_disabled_for_project: вимкнено для цього проєкту. - file_too_large: занадто великий (максимальний розмір -%{count} байт) - filter_does_not_exist: фільтр не існує. - format: не відповідає очікуваному формату «%{expected}». - format_nested: не відповідає очікуваному формату «%{expected}» за шляхом «%{path}». - greater_than: має бути більше ніж %{count}. - greater_than_or_equal_to: має бути більшим або рівним %{count} - greater_than_or_equal_to_start_date: має бути більшою або дорівнювати даті - початку. - greater_than_start_date: має бути більше дати початку. - inclusion: не встановлено в одному з допустимих значень + file_too_large: "занадто великий (максимальний розмір -%{count} байт)" + filter_does_not_exist: "фільтр не існує." + format: "не відповідає очікуваному формату «%{expected}»." + format_nested: "не відповідає очікуваному формату «%{expected}» за шляхом «%{path}»." + greater_than: "має бути більше ніж %{count}." + greater_than_or_equal_to: "має бути більшим або рівним %{count}" + greater_than_or_equal_to_start_date: "має бути більшою або дорівнювати даті початку." + greater_than_start_date: "має бути більше дати початку." + inclusion: "не встановлено в одному з допустимих значень" inclusion_nested: "– не призначено одне з дозволених значень за шляхом «%{path}»." - invalid: зазначено невірно - invalid_url: не є дійсною URL-адресою. - invalid_url_scheme: 'не є підтримуваним протоколом (дозволено: %{allowed_schemes}).' - less_than_or_equal_to: має бути меншим або рівним %{count} + invalid: "зазначено невірно" + invalid_url: "не є дійсною URL-адресою." + invalid_url_scheme: "не є підтримуваним протоколом (дозволено: %{allowed_schemes})." + less_than_or_equal_to: "має бути меншим або рівним %{count}" not_available: "– недоступно через налаштування системи." - not_deletable: не можна видалити. - not_current_user: не поточний користувач. - only_one_active_sprint_allowed: дозволяється лише один активний спринт для - кожного проєкту. - not_found: не знайдено. - not_a_date: не є дійсною датою. - not_a_datetime: не є дійсним датою. - not_a_number: не є числом - 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: має бути непарним. - regex_match_failed: не збігається з регулярним виразом %{expression}. - regex_invalid: неможливо перевірити з відповідним регулярним виразом. - regex_list_invalid: Неможливо проаналізувати рядки %{invalid_lines} як регулярний - вираз. - hexcode_invalid: не є дійсним 6-значним шістнадцятковим кодом кольору. - smaller_than_or_equal_to_max_length: має бути меншою або дорівнює максимальній - довжині. - taken: вже прийнято. - too_long: 'занадто довгий (максимум - %{count} characters). - - ' - too_short: занадто короткий (мінімум %{count} символів). + not_deletable: "не можна видалити." + not_current_user: "не поточний користувач." + only_one_active_sprint_allowed: "дозволяється лише один активний спринт для кожного проєкту." + not_found: "не знайдено." + not_a_date: "не є дійсною датою." + not_a_datetime: "не є дійсним датою." + not_a_number: "не є числом" + 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: "має бути непарним." + regex_match_failed: "не збігається з регулярним виразом %{expression}." + regex_invalid: "неможливо перевірити з відповідним регулярним виразом." + regex_list_invalid: "Неможливо проаналізувати рядки %{invalid_lines} як регулярний вираз." + hexcode_invalid: "не є дійсним 6-значним шістнадцятковим кодом кольору." + smaller_than_or_equal_to_max_length: "має бути меншою або дорівнює максимальній довжині." + taken: "вже прийнято." + too_long: "занадто довгий (максимум - %{count} characters).\n" + too_short: "занадто короткий (мінімум %{count} символів)." type_mismatch: "– це не тип «%{type}»." type_mismatch_nested: "– це не тип «%{type}» за шляхом «%{path}»." - unchangeable: не можна змінити. + unchangeable: "не можна змінити." unknown_property: "– це не відома властивість." - unknown_property_nested: має невідомий шлях «%{path}». - unremovable: неможливо видалити. - url_not_secure_context: 'не надає контекст безпеки. Використовуйте HTTPS або - адресу loopback, наприклад localhost. - - ' - wrong_length: неправильна довжина (повинна бути %{count} символів). + unknown_property_nested: "має невідомий шлях «%{path}»." + unremovable: "неможливо видалити." + url_not_secure_context: > + не надає контекст безпеки. Використовуйте HTTPS або адресу loopback, наприклад localhost. + wrong_length: "неправильна довжина (повинна бути %{count} символів)." models: ldap_auth_source: attributes: tls_certificate_string: - invalid_certificate: 'Наданий сертифікат SSL неприпустимий: %{additional_message}' + invalid_certificate: "Наданий сертифікат SSL неприпустимий: %{additional_message}" format: "%{message}" attachment: attributes: content_type: - blank: Тип контенту файлу не може бути пустий. - not_allowlisted: Файл відхилено автоматичним фільтром. Завантаження - «%{value}» не дозволено. + blank: "Тип контенту файлу не може бути пустий." + not_allowlisted: "Файл відхилено автоматичним фільтром. Завантаження «%{value}» не дозволено." format: "%{message}" capability: context: - global: Глобальний + global: "Глобальний" query: filters: - minimum: має містити принаймні один фільтр для адміністратора доступу, - контексту або адміністратора з оператором «=». + minimum: "має містити принаймні один фільтр для адміністратора доступу, контексту або адміністратора з оператором «=»." custom_field: - at_least_one_custom_option: Необхідно мати принаймні один варіант. - previous_custom_field_recalculation_unprocessed: Перерахунок попередніх - змін для цього власного поля ще не було застосовано. Спробуйте повторити - спробу за кілька хвилин. + at_least_one_custom_option: "Необхідно мати принаймні один варіант." + previous_custom_field_recalculation_unprocessed: "Перерахунок попередніх змін для цього власного поля ще не було застосовано. Спробуйте повторити спробу за кілька хвилин." referenced_in_other_fields_html: one: "%{name} використовується при обчисленні атрибутів проєкту %{links}." few: "%{name} використовується при обчисленнях атрибутів проєкту: %{links}." @@ -2171,27 +1827,22 @@ uk: other: "%{name} використовується при обчисленнях атрибутів проєкту: %{links}." attributes: formula: - blank: Потрібно вказати формулу. - invalid: Формула недійсна. - invalid_characters: 'Допускаються лише числові значення, математичні - оператори й атрибути проєкту таких типів: ціле число, число з рухомою - комою, розраховане значення й список зважених елементів.' - not_allowed_custom_fields_referenced: Атрибут «%{custom_fields}» не - можна використовувати, оскільки це призведе до циклічного посилання; - один атрибут залежить від іншого. + blank: "Потрібно вказати формулу." + invalid: "Формула недійсна." + invalid_characters: "Допускаються лише числові значення, математичні оператори й атрибути проєкту таких типів: ціле число, число з рухомою комою, розраховане значення й список зважених елементів." + not_allowed_custom_fields_referenced: "Атрибут «%{custom_fields}» не можна використовувати, оскільки це призведе до циклічного посилання; один атрибут залежить від іншого." format: "%{message}" required: - cannot_be_true: не може мати значення true. + cannot_be_true: "не може мати значення true." custom_fields_project: attributes: project_ids: - blank: Виберіть проєкт. + blank: "Виберіть проєкт." custom_actions: only_one_allowed: "(%{name}) дозволено лише одне значення." empty: "(%{name}) значення не може бути порожнім." inclusion: "(%{name}) значення не встановлено в одне з допустимих значень." - not_logged_in: " (%{name}) Неможливо встановити значення, оскільки ви не - ввійшли в систему." + not_logged_in: " (%{name}) Неможливо встановити значення, оскільки ви не ввійшли в систему." not_an_integer: "(%{name}) не є цілим числом." smaller_than_or_equal_to: "(%{name}) має бути меншим або рівним %{count}." greater_than_or_equal_to: "(%{name}) має бути більшим або рівним %{count}." @@ -2199,497 +1850,427 @@ uk: doorkeeper/application: attributes: redirect_uri: - fragment_present: |- - 26/5000 - не може містити фрагмент. - invalid_uri: має бути дійсним URI. - relative_uri: має бути абсолютним URI. - secured_uri: не надає контекст безпеки. Використовуйте HTTPS або адресу - loopback, наприклад localhost. - forbidden_uri: заборонено сервером. + fragment_present: "26/5000\nне може містити фрагмент." + invalid_uri: "має бути дійсним URI." + relative_uri: "має бути абсолютним URI." + secured_uri: 'не надає контекст безпеки. Використовуйте HTTPS або адресу loopback, наприклад localhost.' + forbidden_uri: "заборонено сервером." scopes: - not_match_configured: не відповідає доступним областям. + not_match_configured: "не відповідає доступним областям." enterprise_trial: - already_used: уже використано для створення пробної версії. - failed_to_create: Не вдалося створити пробну версію (%{status}) - general_consent: Будь ласка, прийміть правила й умови використання. + already_used: "уже використано для створення пробної версії." + failed_to_create: "Не вдалося створити пробну версію (%{status})" + general_consent: "Будь ласка, прийміть правила й умови використання." enterprise_token: - only_one_trial: Активним може бути лише один пробний маркер. Видаліть попередній, - перш ніж додавати новий. - unreadable: неможливо прочитати. Ви впевнені, що це маркер підтримки? - already_added: Цей маркер уже додано. + only_one_trial: "Активним може бути лише один пробний маркер. Видаліть попередній, перш ніж додавати новий." + unreadable: "неможливо прочитати. Ви впевнені, що це маркер підтримки?" + already_added: "Цей маркер уже додано." favorite: - already_favorited: уже додано у вибране. + already_favorited: "уже додано у вибране." grids/grid: - overlaps: перекриваються. - outside: знаходиться за межами сітки. - end_before_start: кінцеве значення має бути більше початкового значення. + overlaps: "перекриваються." + outside: "знаходиться за межами сітки." + end_before_start: "кінцеве значення має бути більше початкового значення." ical_token_query_assignment: attributes: name: blank: "– обов’язковий атрибут. Виберіть ім’я." - not_unique: уже використовується. Виберіть інше ім’я. + not_unique: "уже використовується. Виберіть інше ім’я." meeting: - error_conflict: Не вдалося зберегти, тому що зустріч була оновлена кимось - іншим в цей час. Будь ласка, перезавантажте сторінку. + error_conflict: "Не вдалося зберегти, тому що зустріч була оновлена кимось іншим в цей час. Будь ласка, перезавантажте сторінку." message: - cannot_move_message_to_forum_of_different_project: Повідомлення не можна - перенести на форум іншого проєкту. + cannot_move_message_to_forum_of_different_project: "Повідомлення не можна перенести на форум іншого проєкту." notifications: - at_least_one_channel: Необхідно вказати принаймні один канал для надсилання - сповіщень. + at_least_one_channel: "Необхідно вказати принаймні один канал для надсилання сповіщень." attributes: read_ian: read_on_creation: "– не можна встановити як true під час створення сповіщень." mail_reminder_sent: set_on_creation: "– не можна встановити як true під час створення сповіщень." reason: - no_notification_reason: "– потрібно вказати, оскільки як канал вибрано - сповіщення в додатку." + no_notification_reason: "– потрібно вказати, оскільки як канал вибрано сповіщення в додатку." reason_mail_digest: - no_notification_reason: "– потрібно вказати, оскільки як канал вибрано - поштову розсилку." + no_notification_reason: "– потрібно вказати, оскільки як канал вибрано поштову розсилку." non_working_day: attributes: date: - taken: Неробочий день уже створено для дати %{value}. + taken: "Неробочий день уже створено для дати %{value}." format: "%{message}" parse_schema_filter_params_service: attributes: base: - unsupported_operator: Оператор не підтримується. - invalid_values: Значення недійсне. - id_filter_required: Необхідний фільтр "id". + unsupported_operator: "Оператор не підтримується." + invalid_values: "Значення недійсне." + id_filter_required: "Необхідний фільтр \"id\"." project: - archived_ancestor: У проєкту є архівований предок. - foreign_wps_reference_version: Пакети робіт у ненащадкових проєктах посилаються - на версії цього проєкту або його нащадків. - cannot_be_assigned_to_artifact_work_package: Вибраного користувача не дозволяється - призначати для пакетів робіт. + archived_ancestor: "У проєкту є архівований предок." + foreign_wps_reference_version: "Пакети робіт у ненащадкових проєктах посилаються на версії цього проєкту або його нащадків." + cannot_be_assigned_to_artifact_work_package: "Вибраного користувача не дозволяється призначати для пакетів робіт." attributes: base: - archive_permission_missing_on_subprojects: У вас немає дозволів для - архівації всіх підпроєктів. Зверніться до адміністратора. - project_initiation_request_disabled: Запит на ініціювання проєкту вимкнено. - Щоб створити пакет робіт артефакту, його потрібно ввімкнути. + archive_permission_missing_on_subprojects: "У вас немає дозволів для архівації всіх підпроєктів. Зверніться до адміністратора." + project_initiation_request_disabled: "Запит на ініціювання проєкту вимкнено. Щоб створити пакет робіт артефакту, його потрібно ввімкнути." types: - in_use_by_work_packages: 'як і раніше використовуються робочі пакети: - %{types}' + in_use_by_work_packages: "як і раніше використовуються робочі пакети: %{types}" enabled_modules: - dependency_missing: Модуль «%{dependency}» потрібно також увімкнути, - оскільки від нього залежить модуль «%{module}». + dependency_missing: "Модуль «%{dependency}» потрібно також увімкнути, оскільки від нього залежить модуль «%{module}»." format: "%{message}" project_custom_field_project_mapping: attributes: project_ids: - blank: Виберіть проєкт. + blank: "Виберіть проєкт." project/phase: attributes: start_date: - must_be_before_finish_date: має передувати даті закінчення. - non_continuous_dates: не може передувати даті закінчення попереднього - етапу. + must_be_before_finish_date: "має передувати даті закінчення." + non_continuous_dates: "не може передувати даті закінчення попереднього етапу." finish_date: - must_be_after_start_date: має слідувати за датою початку. - cannot_be_a_non_working_day: не може припадати на неробочий день. + must_be_after_start_date: "має слідувати за датою початку." + cannot_be_a_non_working_day: "не може припадати на неробочий день." query: attributes: public: - error_unauthorized: "- Користувач не має дозволу на створення загальнодоступних - переглядів." + error_unauthorized: "- Користувач не має дозволу на створення загальнодоступних переглядів." group_by: - invalid: Неможливо групувати за %{value} + invalid: "Неможливо групувати за %{value}" format: "%{message}" column_names: - invalid: 'Недійсний стовпець запиту: %{value}' + invalid: "Недійсний стовпець запиту: %{value}" format: "%{message}" sort_criteria: - invalid: 'Неможливо сортувати за стовпцями: %{value}' + invalid: "Неможливо сортувати за стовпцями: %{value}" format: "%{message}" timestamps: - invalid: 'Мітки часу містять неприпустимі значення: %{values}' - forbidden: 'Мітки часу містять заборонені значення: %{values}' + invalid: "Мітки часу містять неприпустимі значення: %{values}" + forbidden: "Мітки часу містять заборонені значення: %{values}" format: "%{message}" selects: - name_not_included: Потрібно додати стовпець «Ім’я» - nonexistent: Стовпець «%{column}» не існує. + name_not_included: "Потрібно додати стовпець «Ім’я»" + nonexistent: "Стовпець «%{column}» не існує." format: "%{message}" - group_by_hierarchies_exclusive: є взаємовиключним з групою %{group_by} Ви - не можете активувати обидва. - can_only_be_modified_by_owner: Запит може змінити лише його власник. - need_permission_to_modify_public_query: Ви не можете змінити загальнодоступний - запит. + group_by_hierarchies_exclusive: "є взаємовиключним з групою %{group_by} Ви не можете активувати обидва." + can_only_be_modified_by_owner: "Запит може змінити лише його власник." + need_permission_to_modify_public_query: "Ви не можете змінити загальнодоступний запит." filters: custom_fields: - inexistent: Немає спеціального поля для фільтра. + inexistent: "Немає спеціального поля для фільтра." queries/filters/base: attributes: values: - inclusion: фільтр має неприпустимі значення. + inclusion: "фільтр має неприпустимі значення." format: "%{message}" queries/principals/filters/internal_mentionable_on_work_package_filter: attributes: values: - single_value_requirement: має бути одним пакетом робіт + single_value_requirement: "має бути одним пакетом робіт" relation: typed_dag: - circular_dependency: Відносини створюють коло відносин. + circular_dependency: "Відносини створюють коло відносин." attributes: base: - error_not_deletable: Цей зв’язок не можна видалити, оскільки ви не маєте - дозволів, потрібних для редагування вибраного пакета робіт. - error_not_editable: Цей зв’язок не можна змінити, оскільки ви не маєте - дозволів, потрібних для редагування вибраного пакета робіт. + error_not_deletable: "Цей зв’язок не можна видалити, оскільки ви не маєте дозволів, потрібних для редагування вибраного пакета робіт." + error_not_editable: "Цей зв’язок не можна змінити, оскільки ви не маєте дозволів, потрібних для редагування вибраного пакета робіт." to_id: - format: Вибраний пакет робіт %{message} - error_not_found: не вдалося знайти. - error_readonly: не можна змінити для наявних зв’язків. - error_not_manageable: не можна додати, оскільки ви не маєте дозволів, - потрібних для його редагування. + format: "Вибраний пакет робіт %{message}" + error_not_found: "не вдалося знайти." + error_readonly: "не можна змінити для наявних зв’язків." + error_not_manageable: "не можна додати, оскільки ви не маєте дозволів, потрібних для його редагування." from_id: - format: Вибраний пакет робіт %{message} - error_not_found: не вдалося знайти. - error_readonly: не можна змінити для наявних зв’язків. - error_not_manageable: не можна додати, оскільки ви не маєте дозволів, - потрібних для його редагування. + format: "Вибраний пакет робіт %{message}" + error_not_found: "не вдалося знайти." + error_readonly: "не можна змінити для наявних зв’язків." + error_not_manageable: "не можна додати, оскільки ви не маєте дозволів, потрібних для його редагування." repository: - not_available: Постачальник SCM недоступний - not_whitelisted: не дозволяється конфігурацією. - invalid_url: не є дійсним URL-адресою або контуром сховища. - must_not_be_ssh: не повинна бути URL-адресою SSH. - no_directory: не є каталогом. + not_available: "Постачальник SCM недоступний" + not_whitelisted: "не дозволяється конфігурацією." + invalid_url: "не є дійсним URL-адресою або контуром сховища." + must_not_be_ssh: "не повинна бути URL-адресою SSH." + no_directory: "не є каталогом." role: attributes: permissions: - dependency_missing: потрібно також вказати '%{dependency}' оскільки - вибрано '%{permission}'. + dependency_missing: "потрібно також вказати '%{dependency}' оскільки вибрано '%{permission}'." setting: attributes: base: - working_days_are_missing: Принаймні один день тижня має бути визначено - як робочий. - previous_working_day_changes_unprocessed: Попередні зміни конфігурації - робочих днів ще не застосовано. - hours_per_day_are_missing: Потрібно визначити кількість годин на день. - durations_are_not_positive_numbers: Тривалість має бути додатним числом. - hours_per_day_is_out_of_bounds: Кількість годин на день не може перевищувати - 24 + working_days_are_missing: "Принаймні один день тижня має бути визначено як робочий." + previous_working_day_changes_unprocessed: "Попередні зміни конфігурації робочих днів ще не застосовано." + hours_per_day_are_missing: "Потрібно визначити кількість годин на день." + durations_are_not_positive_numbers: "Тривалість має бути додатним числом." + hours_per_day_is_out_of_bounds: "Кількість годин на день не може перевищувати 24" status: attributes: default_done_ratio: - inclusion: має бути в діапазоні від 0 до 100. - readonly_default_exlusive: "– не можна активувати для статусів, позначених - як стандартні." + inclusion: "має бути в діапазоні від 0 до 100." + readonly_default_exlusive: "– не можна активувати для статусів, позначених як стандартні." time_entry: attributes: hours: - day_limit: "– завелике значення, оскільки на одну дату можна зареєструвати - лише щонайбільше 24 години." + day_limit: "– завелике значення, оскільки на одну дату можна зареєструвати лише щонайбільше 24 години." user_preference: attributes: pause_reminders: - invalid_range: може належати лише до припустимого інтервалу дат. + invalid_range: "може належати лише до припустимого інтервалу дат." daily_reminders: full_hour: "– можна налаштувати отримання лише на початку кожної години." notification_settings: - only_one_global_setting: Має існувати лише одне глобальне налаштування - сповіщень. - email_alerts_global: Налаштування сповіщень електронною поштою можна - встановити лише глобально. + only_one_global_setting: "Має існувати лише одне глобальне налаштування сповіщень." + email_alerts_global: "Налаштування сповіщень електронною поштою можна встановити лише глобально." format: "%{message}" - wrong_date: Неправильні значення атрибутів «Дата початку», «Дата закінчення» - або «Прострочено». + wrong_date: "Неправильні значення атрибутів «Дата початку», «Дата закінчення» або «Прострочено»." watcher: attributes: user_id: - not_allowed_to_view: не може переглядати цей ресурс. - locked: заблоковано. + not_allowed_to_view: "не може переглядати цей ресурс." + locked: "заблоковано." wiki_page: - error_conflict: Хтось змінив вікі-сторінку, поки ви її редагували. + error_conflict: "Хтось змінив вікі-сторінку, поки ви її редагували." attributes: slug: undeducible: "– не можна вирахувати із заголовка «%{title}»." work_package: - is_not_a_valid_target_for_time_entries: 'Робочий пакет #%{id} не є дійсною - ціллю для перепризначення записів часу.' + is_not_a_valid_target_for_time_entries: "Робочий пакет #%{id} не є дійсною ціллю для перепризначення записів часу." attributes: id: format: "%{message}" - cannot_add_child_because_of_lack_of_permission: Не вдалося додати дочірній - елемент, оскільки у вас немає дозволів для редагування вибраного пакета - робіт. - blank: Поле «ID» не може бути порожнє. + cannot_add_child_because_of_lack_of_permission: "Не вдалося додати дочірній елемент, оскільки у вас немає дозволів для редагування вибраного пакета робіт." + blank: "Поле «ID» не може бути порожнє." assigned_to: format: "%{message}" done_ratio: - does_not_match_work_and_remaining_work: не збігається зі значеннями - атрибутів «Робота» й «Залишок роботи» - cannot_be_set_when_work_is_zero: не можна встановити, коли атрибут «Робота» - дорівнює 0 год - must_be_set_when_remaining_work_is_set: потрібно вказати, якщо визначено - атрибут «Залишок роботи». - must_be_set_when_work_and_remaining_work_are_set: потрібно вказати, - якщо визначено атрибути «Робота» й «Залишок роботи». - inclusion: має бути в діапазоні від 0 до 100. + does_not_match_work_and_remaining_work: "не збігається зі значеннями атрибутів «Робота» й «Залишок роботи»" + cannot_be_set_when_work_is_zero: "не можна встановити, коли атрибут «Робота» дорівнює 0 год" + must_be_set_when_remaining_work_is_set: "потрібно вказати, якщо визначено атрибут «Залишок роботи»." + must_be_set_when_work_and_remaining_work_are_set: "потрібно вказати, якщо визначено атрибути «Робота» й «Залишок роботи»." + inclusion: "має бути в діапазоні від 0 до 100." due_date: - not_start_date: не на дату початку, хоча це потрібно для етапів. - cannot_be_null: не може мати нульове значення, оскільки задано дату - початку й тривалість. + not_start_date: "не на дату початку, хоча це потрібно для етапів." + cannot_be_null: "не може мати нульове значення, оскільки задано дату початку й тривалість." duration: - larger_than_dates: більша за інтервал між датами початку й закінчення. - smaller_than_dates: менша за інтервал між датами початку й закінчення. - not_available_for_milestones: недоступна для пакетів робіт типу «віха». - cannot_be_null: не може мати нульове значення, оскільки задано дату - закінчення й тривалість. + larger_than_dates: "більша за інтервал між датами початку й закінчення." + smaller_than_dates: "менша за інтервал між датами початку й закінчення." + not_available_for_milestones: "недоступна для пакетів робіт типу «віха»." + cannot_be_null: "не може мати нульове значення, оскільки задано дату закінчення й тривалість." not_an_integer: "– не дійсна тривалість." parent: - cannot_be_milestone: не може бути важливою подією. + cannot_be_milestone: "не може бути важливою подією." cannot_be_self_assigned: "– не можна призначити собі." - cannot_be_in_another_project: не може бути в іншому проекті. - not_a_valid_parent: зазначено невірно + cannot_be_in_another_project: "не може бути в іншому проекті." + not_a_valid_parent: "зазначено невірно" schedule_manually: - cannot_be_automatically_scheduled: не може мати значення false (автоматично - заплановано), оскільки не має попередників або дочірніх елементів. + cannot_be_automatically_scheduled: "не може мати значення false (автоматично заплановано), оскільки не має попередників або дочірніх елементів." start_date: - violates_relationships: може бути встановлено лише для %{soonest_start} - або пізнішої версії, щоб не порушувати зв'язки робочого пакету. - cannot_be_null: не може мати нульове значення, оскільки задано дату - початку й тривалість. + violates_relationships: "може бути встановлено лише для %{soonest_start} або пізнішої версії, щоб не порушувати зв'язки робочого пакету." + cannot_be_null: "не може мати нульове значення, оскільки задано дату початку й тривалість." status_id: - status_transition_invalid: є недійсним оскільки немає дійсного переходу - від старого до нового статусу ролей поточного користувача. - status_invalid_in_type: недійсний, оскільки поточного стану не існує - в цьому типі. + status_transition_invalid: "є недійсним оскільки немає дійсного переходу від старого до нового статусу ролей поточного користувача." + status_invalid_in_type: "недійсний, оскільки поточного стану не існує в цьому типі." type: - cannot_be_milestone_due_to_children: не може бути важливою межой, оскільки - цей робочий пакет має похідні. + cannot_be_milestone_due_to_children: "не може бути важливою межой, оскільки цей робочий пакет має похідні." priority_id: - only_active_priorities_allowed: має бути активним. + only_active_priorities_allowed: "має бути активним." category: - only_same_project_categories_allowed: Категорія комплекс робіт повинен - бути в межах одного проекту як комплексу робіт. - does_not_exist: Указана категорія не існує. + only_same_project_categories_allowed: "Категорія комплекс робіт повинен бути в межах одного проекту як комплексу робіт." + does_not_exist: "Указана категорія не існує." estimated_hours: not_a_number: "– не дійсна тривалість." - cant_be_inferior_to_remaining_work: має дорівнювати значенню «Залишок - роботи» або перевищувати його. - must_be_set_when_remaining_work_and_percent_complete_are_set: потрібно - вказати, якщо визначено атрибути «Залишок роботи» й «% завершення». + cant_be_inferior_to_remaining_work: "має дорівнювати значенню «Залишок роботи» або перевищувати його." + must_be_set_when_remaining_work_and_percent_complete_are_set: "потрібно вказати, якщо визначено атрибути «Залишок роботи» й «% завершення»." remaining_hours: not_a_number: "– не дійсна тривалість." - cant_exceed_work: не може перевищувати значення атрибута «Робота». - must_be_set_when_work_is_set: потрібно вказати, якщо визначено атрибут - «Робота». - must_be_set_when_work_and_percent_complete_are_set: потрібно вказати, - якщо визначено атрибути «Робота» й «% завершення». - must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: ">- - має дорівнювати 0 год, якщо вибрано варіант «Робота» й атрибут «% завершення» - становить 100%." - must_be_empty_when_work_is_empty_and_percent_complete_is_100p: має бути - пустим, якщо визначено атрибути «Робота» й «% завершення». - readonly_status: Пакет робіт перебуває в стані лише для читання, тому його - атрибути не можна змінити. + cant_exceed_work: "не може перевищувати значення атрибута «Робота»." + must_be_set_when_work_is_set: "потрібно вказати, якщо визначено атрибут «Робота»." + must_be_set_when_work_and_percent_complete_are_set: "потрібно вказати, якщо визначено атрибути «Робота» й «% завершення»." + must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: '>- має дорівнювати 0 год, якщо вибрано варіант «Робота» й атрибут «% завершення» становить 100%.' + must_be_empty_when_work_is_empty_and_percent_complete_is_100p: >- + має бути пустим, якщо визначено атрибути «Робота» й «% завершення». + readonly_status: "Пакет робіт перебуває в стані лише для читання, тому його атрибути не можна змінити." type: attributes: attribute_groups: - attribute_unknown: Використовується недійсний атрибут робочого пакету. - attribute_unknown_name: Недійсний атрибут робочого пакета:%{attribute} - duplicate_group: Назва групи %{group} використовується більше одного - разу. Назви груп повинні бути унікальними. - query_invalid: 'Вбудований запит %{group} недійсний: %{details}' - group_without_name: Неназвані групи не дозволені. + attribute_unknown: "Використовується недійсний атрибут робочого пакету." + attribute_unknown_name: "Недійсний атрибут робочого пакета:%{attribute}" + duplicate_group: "Назва групи %{group} використовується більше одного разу. Назви груп повинні бути унікальними." + query_invalid: "Вбудований запит %{group} недійсний: %{details}" + group_without_name: "Неназвані групи не дозволені." patterns: - invalid_tokens: Один або кілька атрибутів усередині поля недійсні. Виправте - їх, перш ніж зберігати. + invalid_tokens: "Один або кілька атрибутів усередині поля недійсні. Виправте їх, перш ніж зберігати." user: attributes: base: - user_limit_reached: Досягнуто ліміту користувачів. За поточним тарифним - планом більше не можна створювати облікових записів. - one_must_be_active: Користувача з правами адміністратора не можна заблокувати - або вилучити. Має бути активний принаймні один адміністратор. + user_limit_reached: "Досягнуто ліміту користувачів. За поточним тарифним планом більше не можна створювати облікових записів." + one_must_be_active: "Користувача з правами адміністратора не можна заблокувати або вилучити. Має бути активний принаймні один адміністратор." password_confirmation: - confirmation: Підтвердження пароля та пароль не збігаються. + confirmation: "Підтвердження пароля та пароль не збігаються." format: "%{message}" password: - weak: 'Має містити символи таких класів (принаймні %{min_count} з %{all_count}): - %{rules}' - lowercase: нижній реєстр шрифту (наприклад, 'a') - uppercase: верхній реєстр шрифту (наприклад, 'А') - numeric: числовий (наприклад, '1') - special: спеціальний (наприклад, '%') + weak: "Має містити символи таких класів (принаймні %{min_count} з %{all_count}): %{rules}" + lowercase: "нижній реєстр шрифту (наприклад, 'a')" + uppercase: "верхній реєстр шрифту (наприклад, 'А')" + numeric: "числовий (наприклад, '1')" + special: "спеціальний (наприклад, '%')" reused: - one: раніше використовувався. Виберіть один, який відрізняється від - вашого останнього. - few: раніше використовувався. Виберіть той, який відрізняється від - вашого останнього %{count}. - many: раніше використовувався. Виберіть той, який відрізняється від - вашого останнього %{count}. - other: раніше використовувався. Виберіть той, який відрізняється від - вашого останнього %{count}. + one: "раніше використовувався. Виберіть один, який відрізняється від вашого останнього." + few: "раніше використовувався. Виберіть той, який відрізняється від вашого останнього %{count}." + many: "раніше використовувався. Виберіть той, який відрізняється від вашого останнього %{count}." + other: "раніше використовувався. Виберіть той, який відрізняється від вашого останнього %{count}." match: - confirm: Підтвердіть новий пароль. - description: '"Підтвердження пароля" має відповідати введеному в полі - "Новий пароль".' + confirm: "Підтвердіть новий пароль." + description: "\"Підтвердження пароля\" має відповідати введеному в полі \"Новий пароль\"." status: - invalid_on_create: не є дійсним статусом для нових користувачів. + invalid_on_create: "не є дійсним статусом для нових користувачів." member: - principal_blank: Виберіть принаймні одного користувача або групу. - role_blank: повинні бути призначені. + principal_blank: "Виберіть принаймні одного користувача або групу." + role_blank: "повинні бути призначені." attributes: roles: - ungrantable: має невідповідну роль. - more_than_one: має більше ніж одну роль. + ungrantable: "має невідповідну роль." + more_than_one: "має більше ніж одну роль." principal: - unassignable: не можна призначити проекту. + unassignable: "не можна призначити проекту." version: - undeletable_archived_projects: Версію не можна видалити, оскільки до неї - приєднані робочі пакети. - undeletable_work_packages_attached: Версію не можна видалити, оскільки до - неї приєднані робочі пакети. + undeletable_archived_projects: "Версію не можна видалити, оскільки до неї приєднані робочі пакети." + undeletable_work_packages_attached: "Версію не можна видалити, оскільки до неї приєднані робочі пакети." token/named: attributes: token_name: - blank: Укажіть ім’я маркера - in_use: Це ім’я маркера вже використовується; виберіть інше + blank: "Укажіть ім’я маркера" + in_use: "Це ім’я маркера вже використовується; виберіть інше" format: "%{message}" jira: - invalid_protocol: Укажіть дійсний протокол (http або https) + invalid_protocol: "Укажіть дійсний протокол (http або https)" template: - body: 'Перевірте наступні поля:' + body: "Перевірте наступні поля:" header: - one: 1 помилка заборонила це %{model} від збереження + one: "1 помилка заборонила це %{model} від збереження" few: "%{count} помилка заборонила це %{model} від збереження" many: "%{count} помилка заборонила це %{model} від збереження" other: "%{count} помилка заборонила це %{model} від збереження" models: - attachment: Файл + attachment: "Файл" attribute_help_text: - one: Текст довідки атрибута - few: Тексти довідки атрибутів - many: Тексти довідки атрибутів - other: Тексти довідки атрибутів + one: "Текст довідки атрибута" + few: "Тексти довідки атрибутів" + many: "Тексти довідки атрибутів" + other: "Тексти довідки атрибутів" auth_provider: - one: Постачальник послуг автентифікації - few: Постачальники послуг автентифікації - many: Постачальники послуг автентифікації - other: Постачальники послуг автентифікації - category: Категорія - color: Колір - comment: Коментар - custom_action: Спеціальні дії - custom_field: Користувацьке поле - customized: Персоналізовано - doorkeeper/application: Програма OAuth + one: "Постачальник послуг автентифікації" + few: "Постачальники послуг автентифікації" + many: "Постачальники послуг автентифікації" + other: "Постачальники послуг автентифікації" + category: "Категорія" + color: "Колір" + comment: "Коментар" + custom_action: "Спеціальні дії" + custom_field: "Користувацьке поле" + customized: "Персоналізовано" + "doorkeeper/application": "Програма OAuth" enterprise_token: - one: Маркер Enterprise - few: Маркери Enterprise - many: Маркери Enterprise - other: Маркери Enterprise - forum: Форум - global_role: Глобальна роль - group: Група + one: "Маркер Enterprise" + few: "Маркери Enterprise" + many: "Маркери Enterprise" + other: "Маркери Enterprise" + forum: "Форум" + global_role: "Глобальна роль" + group: "Група" issue_priority: - one: Пріоритет - few: Пріоритети - many: Пріоритети - other: Пріоритети - meeting_participant: Учасник наради - member: Учасник - news: Новини + one: "Пріоритет" + few: "Пріоритети" + many: "Пріоритети" + other: "Пріоритети" + meeting_participant: "Учасник наради" + member: "Учасник" + news: "Новини" notification: - one: Сповіщення - few: Сповіщення - many: Сповіщення - other: Сповіщення - placeholder_user: Прототип користувача + one: "Сповіщення" + few: "Сповіщення" + many: "Сповіщення" + other: "Сповіщення" + placeholder_user: "Прототип користувача" project: - one: Проект - few: Проєкти - many: Проєкти - other: Проєкти + one: "Проект" + few: "Проєкти" + many: "Проєкти" + other: "Проєкти" project_query: - one: Список проєктів - few: Списки проєктів - many: Списки проєктів - other: Списки проєктів - query: Частковий запит - reminder: Нагадування + one: "Список проєктів" + few: "Списки проєктів" + many: "Списки проєктів" + other: "Списки проєктів" + query: "Частковий запит" + reminder: "Нагадування" role: - one: роль - few: Роль - many: Роль - other: Роль + one: "роль" + few: "Роль" + many: "Роль" + other: "Роль" scim_client: - one: Клієнт SCIM - few: Клієнти SCIM - many: Клієнти SCIM - other: Клієнти SCIM + one: "Клієнт SCIM" + few: "Клієнти SCIM" + many: "Клієнти SCIM" + other: "Клієнти SCIM" jira: - one: Jira - few: Jira - many: Jira - other: Jira - status: Стан робочого пакета + one: "Jira" + few: "Jira" + many: "Jira" + other: "Jira" + status: "Стан робочого пакета" token/api: one: Маркер доступу few: Маркери доступу many: Маркери доступу other: Маркери доступу token/rss: - one: Маркер RSS - few: Маркери RSS - many: Маркери RSS - other: Маркери RSS + one: "Маркер RSS" + few: "Маркери RSS" + many: "Маркери RSS" + other: "Маркери RSS" type: - one: Тип - few: Типи - many: Типи - other: Типи - user: Користувач - version: Версія - workflow: Робочий процес - work_package: Пакет робіт - wiki: Wiki - wiki_page: Сторінка Wiki + one: "Тип" + few: "Типи" + many: "Типи" + other: "Типи" + user: "Користувач" + version: "Версія" + workflow: "Робочий процес" + work_package: "Пакет робіт" + wiki: "Wiki" + wiki_page: "Сторінка Wiki" errors: header_invalid_fields: - one: 'Виникла проблема з таким полем:' - few: 'Виникли проблеми з такими полями:' - many: 'Виникли проблеми з такими полями:' - other: 'Виникли проблеми з такими полями:' + one: "Виникла проблема з таким полем:" + few: "Виникли проблеми з такими полями:" + many: "Виникли проблеми з такими полями:" + other: "Виникли проблеми з такими полями:" header_additional_invalid_fields: - one: 'Крім того, виникла проблема з таким полем:' - few: 'Крім того, виникли проблеми з такими полями:' - many: 'Крім того, виникли проблеми з такими полями:' - other: 'Крім того, виникли проблеми з такими полями:' - field_erroneous_label: |- - Це поле недійсне: %{full_errors} - Введіть дійсне значення. + one: "Крім того, виникла проблема з таким полем:" + few: "Крім того, виникли проблеми з такими полями:" + many: "Крім того, виникли проблеми з такими полями:" + other: "Крім того, виникли проблеми з такими полями:" + field_erroneous_label: "Це поле недійсне: %{full_errors}\nВведіть дійсне значення." messages: - must_be_template: має бути шаблоном - unsupported_storage_type: не є типом сховища, що підтримується. - storage_error: Помилка з’єднання зі сховищем. - invalid_input: Введено недійсні дані. + must_be_template: "має бути шаблоном" + unsupported_storage_type: "не є типом сховища, що підтримується." + storage_error: "Помилка з’єднання зі сховищем." + invalid_input: "Введено недійсні дані." activity: item: - created_by_on: створено %{datetime} користувачем %{user} - created_by_on_time_entry: час зареєстровано о %{datetime} користувачем %{user} - created_on: створено %{datetime} - created_on_time_entry: час зареєстровано о %{datetime} - updated_by_on: оновлено %{datetime} користувачем %{user} - updated_by_on_time_entry: зареєстрований час оновлено о %{datetime} користувачем - %{user} - updated_on: оновлено %{datetime} - updated_on_time_entry: зареєстрований час оновлено о %{datetime} - deleted_on: видалено %{datetime} - deleted_by_on: видалено %{datetime} користувачем %{user} - added_on: додано %{datetime} - added_by_on: додано %{datetime} користувачем %{user} - removed_on: вилучено %{datetime} - removed_by_on: вилучено %{datetime} користувачем %{user} - parent_without_of: Підпроєкт - parent_no_longer: Більше не входить у проєкт + created_by_on: "створено %{datetime} користувачем %{user}" + created_by_on_time_entry: "час зареєстровано о %{datetime} користувачем %{user}" + created_on: "створено %{datetime}" + created_on_time_entry: "час зареєстровано о %{datetime}" + updated_by_on: "оновлено %{datetime} користувачем %{user}" + updated_by_on_time_entry: "зареєстрований час оновлено о %{datetime} користувачем %{user}" + updated_on: "оновлено %{datetime}" + updated_on_time_entry: "зареєстрований час оновлено о %{datetime}" + deleted_on: "видалено %{datetime}" + deleted_by_on: "видалено %{datetime} користувачем %{user}" + added_on: "додано %{datetime}" + added_by_on: "додано %{datetime} користувачем %{user}" + removed_on: "вилучено %{datetime}" + removed_by_on: "вилучено %{datetime} користувачем %{user}" + parent_without_of: "Підпроєкт" + parent_no_longer: "Більше не входить у проєкт" time_entry: hour: one: "%{count} год" @@ -2701,526 +2282,498 @@ uk: few: "%{count} год" many: "%{count} год" other: "%{count} год" - updated: змінено з %{old_value} на %{value} - logged_for: Зареєстровано для + updated: "змінено з %{old_value} на %{value}" + logged_for: "Зареєстровано для" filter: - changeset: Набори змін - message: Форуми - news: Новини - project_details: Деталі проєкту - subproject: Включити підпроєкти - time_entry: Витрачений час - wiki_edit: Wiki - work_package: Пакети робіт + changeset: "Набори змін" + message: "Форуми" + news: "Новини" + project_details: "Деталі проєкту" + subproject: "Включити підпроєкти" + time_entry: "Витрачений час" + wiki_edit: "Wiki" + work_package: "Пакети робіт" project_phase: - activated: активовано - added_date: визначено як %{date} - changed_date: змінено з %{from} на %{to} - deactivated: деактивовано - deleted_project_phase: Видалений етап проєкту + activated: "активовано" + added_date: "визначено як %{date}" + changed_date: "змінено з %{from} на %{to}" + deactivated: "деактивовано" + deleted_project_phase: "Видалений етап проєкту" phase_and_both_gates: "%{phase_message}. %{start_gate_message} і %{finish_gate_message}" phase_and_one_gate: "%{phase_message}. %{gate_message}" - removed_date: видалено %{date} + removed_date: "видалено %{date}" + #common attributes of all models attributes: - active: Активний - assigned_to: Призначений - assignee: Виконавець - attachments: Вкладення - actor: Виконавець - action: Дія - api_key: Ключ API - author: Автор - avatar: Аватар - base: 'Загальна помилка:' - body: Текст - blocks_ids: Ідентифікатори заблокованих робочих пакетів - category: Категорія - comment: Коментар - comments: Коментар - content: Контент - color: Колір - creator: Автор - created_at: Створений - custom_field: Користувацьке поле - custom_options: Можливі значення - custom_values: Індивідуальні поля - date: Дата - dates_interval: Діапазон дат - default_columns: Типові колонки - description: Опис - derived_due_date: Отримана дата завершення - derived_estimated_hours: Загальний обсяг робіт - derived_start_date: Отримана дата початку - direction: Напрямок - display_sums: Відображати суми - domain: Домен - due_date: Дата закінчення - estimated_hours: Робота - estimated_time: Робота - email: Ел. адреса - entity_type: Сутність - expires_at: Термін дії минає - firstname: Ім'я - filter: Фільтр - group: Група - groups: Групи - hexcode: Двійковий код + active: "Активний" + assigned_to: "Призначений" + assignee: "Виконавець" + attachments: "Вкладення" + actor: "Виконавець" + action: "Дія" + api_key: "Ключ API" + author: "Автор" + avatar: "Аватар" + base: "Загальна помилка:" + body: "Текст" + blocks_ids: "Ідентифікатори заблокованих робочих пакетів" + category: "Категорія" + comment: "Коментар" + comments: "Коментар" + content: "Контент" + color: "Колір" + creator: "Автор" + created_at: "Створений" + custom_field: "Користувацьке поле" + custom_options: "Можливі значення" + custom_values: "Індивідуальні поля" + date: "Дата" + dates_interval: "Діапазон дат" + default_columns: "Типові колонки" + description: "Опис" + derived_due_date: "Отримана дата завершення" + derived_estimated_hours: "Загальний обсяг робіт" + derived_start_date: "Отримана дата початку" + direction: "Напрямок" + display_sums: "Відображати суми" + domain: "Домен" + due_date: "Дата закінчення" + estimated_hours: "Робота" + estimated_time: "Робота" + email: "Ел. адреса" + entity_type: "Сутність" + expires_at: "Термін дії минає" + firstname: "Ім'я" + filter: "Фільтр" + group: "Група" + groups: "Групи" + hexcode: "Двійковий код" id: "№" - is_default: Значення за замовчуванням - is_for_all: Для усіх проектів - public: Публічні - principal: Користувач або група - issue: Робочий пакет - journal: Журнал - journal_notes: Коментар - lastname: Прізвище - login: Ім'я користувача - lock_version: Заблокувати версію - mail: Електронна пошта - name: Назва - note: Примітка - notes: Примітки - number: Число - options: Опції - operator: Оператор - password: Пароль - priority: Пріоритет - project: Проєкт - project_ids: ID проєктів - project_phase: Етап проєкту - project_phase_definition: Етап проєкту - reason: Причина - responsible: Відповідальний - required: Обов'язкове поле - recipient: Одержувач - role: роль - roles: Роль - search: Пошук - sprint: Спринт - start_date: Початок - status: Статус - state: Стан - subject: Тема - slug: Слаг - summary: Резюме - template: Шаблон - time_zone: Часовий пояс - text: Текст - title: Назва - type: Тип - typeahead: Автозаповнення - uid: Унікальний ідентифікатор - updated_at: Оновлене - updated_on: Оновлено - uploader: Завантажувач - user: Користувач - username: Ім’я користувача - unit: Одиниця - value: Значення - values: Значення - version: Версія - visible: Видиме - work_package: Робочий пакет - work_package_id: Робочий пакет + is_default: "Значення за замовчуванням" + is_for_all: "Для усіх проектів" + public: "Публічні" + principal: "Користувач або група" + #kept for backwards compatibility + issue: "Робочий пакет" + journal: "Журнал" + journal_notes: "Коментар" + lastname: "Прізвище" + login: "Ім'я користувача" + lock_version: "Заблокувати версію" + mail: "Електронна пошта" + name: "Назва" + note: "Примітка" + notes: "Примітки" + number: "Число" + options: "Опції" + operator: "Оператор" + password: "Пароль" + priority: "Пріоритет" + project: "Проєкт" + project_ids: "ID проєктів" + project_phase: "Етап проєкту" + project_phase_definition: "Етап проєкту" + reason: "Причина" + responsible: "Відповідальний" + required: "Обов'язкове поле" + recipient: "Одержувач" + role: "роль" + roles: "Роль" + search: "Пошук" + sprint: "Спринт" + start_date: "Початок" + status: "Статус" + state: "Стан" + subject: "Тема" + slug: "Слаг" + summary: "Резюме" + template: "Шаблон" + time_zone: "Часовий пояс" + text: "Текст" + title: "Назва" + type: "Тип" + typeahead: "Автозаповнення" + uid: "Унікальний ідентифікатор" + updated_at: "Оновлене" + updated_on: "Оновлено" + uploader: "Завантажувач" + user: "Користувач" + username: "Ім’я користувача" + unit: "Одиниця" + value: "Значення" + values: "Значення" + version: "Версія" + visible: "Видиме" + work_package: "Робочий пакет" + work_package_id: "Робочий пакет" backup: - failed: Помилка резервної копії - label_backup_token: Маркер резервного копіювання - label_create_token: Створити маркер резервного копіювання - label_delete_token: Видалити маркер резервного копіювання - label_reset_token: Скинути маркер резервного копіювання - label_token_users: Наведені нижче користувачі мають активні маркери резервного - копіювання + failed: "Помилка резервної копії" + label_backup_token: "Маркер резервного копіювання" + label_create_token: "Створити маркер резервного копіювання" + label_delete_token: "Видалити маркер резервного копіювання" + label_reset_token: "Скинути маркер резервного копіювання" + label_token_users: "Наведені нижче користувачі мають активні маркери резервного копіювання" reset_token: action_create: Створити action_reset: Скинути - heading_reset: Скидання маркера резервного копіювання - heading_create: Створення маркера резервного копіювання - implications: 'Увімкнення резервних копій дасть змогу всім користувачам з обов’язковими - дозволами та цим маркером резервного копіювання завантажувати резервні копії - з усіма даними цього встановлення OpenProject. Це включає дані всіх інших - користувачів. - - ' - info: 'Щоб створити резервну копію, потрібно згенерувати маркер резервного копіювання. - Щоразу, коли ви хочете надіслати запит на резервне копіювання, знадобиться - надати цей маркер. Щоб вимкнути резервне копіювання для цього користувача, - видаліть цей маркер резервного копіювання. - - ' - verification: 'Введіть «%{word}», щоб підтвердити %{action} маркера резервного - копіювання. - - ' + heading_reset: "Скидання маркера резервного копіювання" + heading_create: "Створення маркера резервного копіювання" + implications: > + Увімкнення резервних копій дасть змогу всім користувачам з обов’язковими дозволами та цим маркером резервного копіювання завантажувати резервні копії з усіма даними цього встановлення OpenProject. Це включає дані всіх інших користувачів. + info: > + Щоб створити резервну копію, потрібно згенерувати маркер резервного копіювання. Щоразу, коли ви хочете надіслати запит на резервне копіювання, знадобиться надати цей маркер. Щоб вимкнути резервне копіювання для цього користувача, видаліть цей маркер резервного копіювання. + verification: > + Введіть «%{word}», щоб підтвердити %{action} маркера резервного копіювання. verification_word_reset: скидання verification_word_create: створення - warning: 'У разі створення нового маркера надіслати запит на резервне копіювання - можна тільки через 24 години. Це запобіжний захід. Після цього ви зможете - будь-коли надіслати запит на резервне копіювання за допомогою цього маркера. - - ' - text_token_deleted: Маркер резервного копіювання видалено. Резервні копії тепер - вимкнено. + warning: > + У разі створення нового маркера надіслати запит на резервне копіювання можна тільки через 24 години. Це запобіжний захід. Після цього ви зможете будь-коли надіслати запит на резервне копіювання за допомогою цього маркера. + text_token_deleted: Маркер резервного копіювання видалено. Резервні копії тепер вимкнено. error: invalid_token: Недійсний або відсутній маркер резервного копіювання - token_cooldown: Маркер резервного копіювання буде дійсний протягом %{hours} - год. + token_cooldown: Маркер резервного копіювання буде дійсний протягом %{hours} год. backup_pending: Очікується початок резервного копіювання. limit_reached: 'Ви можете створити лише стільки резервних копій на день: %{limit}.' - button_actions: Дії - button_add: Додати - button_add_comment: Додати коментар - button_add_item_above: Додати елемент вище - button_add_item_below: Додати елемент нижче - button_add_sub_item: Додати піделемент + button_actions: "Дії" + button_add: "Додати" + button_add_comment: "Додати коментар" + button_add_item_above: "Додати елемент вище" + button_add_item_below: "Додати елемент нижче" + button_add_sub_item: "Додати піделемент" button_add_member: Додати учасника - button_add_watcher: Додати спостерігача - button_annotate: Коментувати - button_apply: Застосувати - button_apply_changes: Застосувати зміни - button_archive: Архів - button_back: Назад - button_cancel: Скасувати - button_change: Змінити - button_change_parent_page: Змінити батьківську сторінку - button_change_password: Змінити пароль - button_check_all: Перевірити все - button_clear: Очистити - button_click_to_reveal: Натисніть, щоб показати - button_close: Закрити - button_collapse_all: Згорнути все - button_confirm: Підтвердити - button_configure: Настроювання - button_continue: Продовжити - button_complete: Завершити - button_copy: Копіювати - button_copy_to_clipboard: Копіювати в буфер обміну - button_copy_link_to_clipboard: Копіювати посилання в буфер обміну - button_create: Створити - button_create_and_continue: Створити та продовжити - button_decline: Відхилити - button_delete: Видалити - button_delete_permanently: Видалити назавжди - button_delete_watcher: Видалити спостерігача %{name} - button_download: Завантажити - button_disable: Вимкнути - button_duplicate: Дублювати - button_duplicate_and_follow: Дублювати й стежити - button_edit: Редагувати - button_enable: Увімкнути - button_edit_associated_wikipage: 'Редагувати пов’язану сторінку Wiki: %{page_title}' - button_expand_all: Розгорнути все - button_favorite: Додати в обране - button_filter: Фільтр - button_finish_setup: Завершити налаштування - button_generate: Згенерувати - button_list: Список - button_lock: Заблокувати - button_login: Увійти - button_move: Перемістити - button_move_and_follow: Перемістити і перейти - button_print: Друкувати - button_quote: Цитата + button_add_watcher: "Додати спостерігача" + button_annotate: "Коментувати" + button_apply: "Застосувати" + button_apply_changes: "Застосувати зміни" + button_archive: "Архів" + button_back: "Назад" + button_cancel: "Скасувати" + button_change: "Змінити" + button_change_parent_page: "Змінити батьківську сторінку" + button_change_password: "Змінити пароль" + button_check_all: "Перевірити все" + button_clear: "Очистити" + button_click_to_reveal: "Натисніть, щоб показати" + button_close: "Закрити" + button_collapse_all: "Згорнути все" + button_confirm: "Підтвердити" + button_configure: "Настроювання" + button_continue: "Продовжити" + button_complete: "Завершити" + button_copy: "Копіювати" + button_copy_to_clipboard: "Копіювати в буфер обміну" + button_copy_link_to_clipboard: "Копіювати посилання в буфер обміну" + button_create: "Створити" + button_create_and_continue: "Створити та продовжити" + button_decline: "Відхилити" + button_delete: "Видалити" + button_delete_permanently: "Видалити назавжди" + button_delete_watcher: "Видалити спостерігача %{name}" + button_download: "Завантажити" + button_disable: "Вимкнути" + button_duplicate: "Дублювати" + button_duplicate_and_follow: "Дублювати й стежити" + button_edit: "Редагувати" + button_enable: "Увімкнути" + button_edit_associated_wikipage: "Редагувати пов’язану сторінку Wiki: %{page_title}" + button_expand_all: "Розгорнути все" + button_favorite: "Додати в обране" + button_filter: "Фільтр" + button_finish_setup: "Завершити налаштування" + button_generate: "Згенерувати" + button_list: "Список" + button_lock: "Заблокувати" + button_login: "Увійти" + button_move: "Перемістити" + button_move_and_follow: "Перемістити і перейти" + button_print: "Друкувати" + button_quote: "Цитата" button_remove: Видалити - button_remove_permanently: Вилучити назавжди - button_remove_reminder: Вилучити нагадування - button_rename: Перейменувати - button_replace: Замінити - button_revoke: Скасувати - button_reply: Відповісти - button_reset: Скинути - button_rollback: Відкотити до даної версії - button_save: Зберегти - button_save_as: Зберегти як - button_save_back: Зберегти та повернутися назад - button_select: Вибрати - button_set_reminder: Установити нагадування - button_show: Показати - button_sort: Сортувати - button_submit: Підтвердити - button_test: Тест - button_unarchive: Розпакувати - button_uncheck_all: Зняти усі відмітки - button_unlock: Розблокувати - button_unfavorite: Вилучити з обраного - button_unwatch: Перестати відстежувати - button_update: Оновити - button_upgrade: Оновити - button_buy_now: Придбати зараз - button_upload: Завантажити - button_view: Перегляд - button_watch: Спостерігати - button_manage_menu_entry: Налаштувати пункт меню - button_add_menu_entry: Додати пункт меню - button_configure_menu_entry: Налаштувати пункт меню - button_delete_menu_entry: Видалити пункт меню - button_view_shared_work_packages: Переглянути спільні пакети робіт - button_manage_roles: Керувати ролями - button_remove_member: Вилучити учасника - button_remove_member_and_shares: Вилучити учасника й дозволи на доступ - button_revoke_work_package_shares: Відкликати дозволи на доступ до пакета робіт - button_revoke_access: Відкликати доступ - button_revoke_all: Відкликати все - button_revoke_only: Відкликати лише для ролі «%{shared_role_name}» - button_publish: Зробити загальнодоступним - button_unpublish: Зробити приватним + button_remove_permanently: "Вилучити назавжди" + button_remove_reminder: "Вилучити нагадування" + button_rename: "Перейменувати" + button_replace: "Замінити" + button_revoke: "Скасувати" + button_reply: "Відповісти" + button_reset: "Скинути" + button_rollback: "Відкотити до даної версії" + button_save: "Зберегти" + button_save_as: "Зберегти як" + button_save_back: "Зберегти та повернутися назад" + button_select: "Вибрати" + button_set_reminder: "Установити нагадування" + button_show: "Показати" + button_sort: "Сортувати" + button_submit: "Підтвердити" + button_test: "Тест" + button_unarchive: "Розпакувати" + button_uncheck_all: "Зняти усі відмітки" + button_unlock: "Розблокувати" + button_unfavorite: "Вилучити з обраного" + button_unwatch: "Перестати відстежувати" + button_update: "Оновити" + button_upgrade: "Оновити" + button_buy_now: "Придбати зараз" + button_upload: "Завантажити" + button_view: "Перегляд" + button_watch: "Спостерігати" + button_manage_menu_entry: "Налаштувати пункт меню" + button_add_menu_entry: "Додати пункт меню" + button_configure_menu_entry: "Налаштувати пункт меню" + button_delete_menu_entry: "Видалити пункт меню" + button_view_shared_work_packages: "Переглянути спільні пакети робіт" + button_manage_roles: "Керувати ролями" + button_remove_member: "Вилучити учасника" + button_remove_member_and_shares: "Вилучити учасника й дозволи на доступ" + button_revoke_work_package_shares: "Відкликати дозволи на доступ до пакета робіт" + button_revoke_access: "Відкликати доступ" + button_revoke_all: "Відкликати все" + button_revoke_only: "Відкликати лише для ролі «%{shared_role_name}»" + button_publish: "Зробити загальнодоступним" + button_unpublish: "Зробити приватним" consent: checkbox_label: Я проінформований і згоден з вищесказаним. failure_message: Згода не отримана, продовження неможливе. title: Згода користувача decline_warning_message: Ви відхилили згоду і вийшли з системи. - user_has_consented: Користувач надав згоду на [налаштований текст інформації про - згоду](consent_settings). - not_yet_consented: Користувач ще не надав згоду на [налаштований текст інформації - про згоду] (consent_settings). Він отримає нагадування під час наступного входу. - contact_mail_instructions: Визначте адресу електронної пошти, на яку користувачі - можуть звертатися, для запитів на зміну або видалення даних. - contact_your_administrator: Зверніться до свого адміністратора, якщо ви хочете, - щоб ваш обліковий запис був видалений. - contact_this_mail_address: Будь ласка зв'яжіться %{mail_address} якщо ви бажаєте, - щоб ваш обліковий запис був видалений. - text_update_consent_time: Установіть цей прапорець, щоб примусити користувачів - знову погодитися. Увімкнути, коли ви змінили юридичний аспект інформації про - згоду вище. - update_consent_last_time: 'Останнє оновлення згоди: %{update_time}' + user_has_consented: Користувач надав згоду на [налаштований текст інформації про згоду](consent_settings). + not_yet_consented: Користувач ще не надав згоду на [налаштований текст інформації про згоду] (consent_settings). Він отримає нагадування під час наступного входу. + contact_mail_instructions: Визначте адресу електронної пошти, на яку користувачі можуть звертатися, для запитів на зміну або видалення даних. + contact_your_administrator: Зверніться до свого адміністратора, якщо ви хочете, щоб ваш обліковий запис був видалений. + contact_this_mail_address: Будь ласка зв'яжіться %{mail_address} якщо ви бажаєте, щоб ваш обліковий запис був видалений. + text_update_consent_time: Установіть цей прапорець, щоб примусити користувачів знову погодитися. Увімкнути, коли ви змінили юридичний аспект інформації про згоду вище. + update_consent_last_time: "Останнє оновлення згоди: %{update_time}" copy_project: - title: Скопіювати проєкт «%{source_project_name}» - started: Почалось копіювання проекту "%{source_project_name}" у "%{target_project_name}". - Вас буде проінформовано за допомогою електронної пошти як тільки "%{target_project_name}" - буде доступний. - failed: Неможливо скопіювати проект %{source_project_name} - failed_internal: Копіювання не вдалося через внутрішню помилку. - succeeded: Створений проект %{target_project_name} - errors: Помилка - project_custom_fields: Спеціальні поля в проекті + title: 'Скопіювати проєкт «%{source_project_name}»' + started: 'Почалось копіювання проекту "%{source_project_name}" у "%{target_project_name}". Вас буде проінформовано за допомогою електронної пошти як тільки "%{target_project_name}" буде доступний.' + failed: "Неможливо скопіювати проект %{source_project_name}" + failed_internal: "Копіювання не вдалося через внутрішню помилку." + succeeded: "Створений проект %{target_project_name}" + errors: "Помилка" + project_custom_fields: "Спеціальні поля в проекті" x_objects_of_this_type: - zero: Немає об’єктів цього типу - one: Один об’єкт цього типу - other: 'Об’єктів цього типу: %{count}' + zero: "Немає об’єктів цього типу" + one: "Один об’єкт цього типу" + other: "Об’єктів цього типу: %{count}" text: - failed: Не вдалося скопіювати проект "%{source_project_name}" до проекту "%{target_project_name}". - succeeded: Скопіював проект "%{source_project_name}" до "%{target_project_name}". - source_project_label: Проєкт скопійовано + failed: 'Не вдалося скопіювати проект "%{source_project_name}" до проекту "%{target_project_name}".' + succeeded: 'Скопіював проект "%{source_project_name}" до "%{target_project_name}".' + source_project_label: "Проєкт скопійовано" copy_options: - dependencies_label: Копіювати з проєкту + dependencies_label: "Копіювати з проєкту" create_project: - attributes_heading: Укажіть цю обов’язкову інформацію, щоб працювати над своїми - проєктами. - template_label: Використовувати шаблон - template_heading: Виберіть шаблон проєкту, щоб користуватися найпоширенішими методами - управління проєктами, або створіть проєкт із нуля. + attributes_heading: "Укажіть цю обов’язкову інформацію, щоб працювати над своїми проєктами." + template_label: "Використовувати шаблон" + template_heading: "Виберіть шаблон проєкту, щоб користуватися найпоширенішими методами управління проєктами, або створіть проєкт із нуля." copy_options: - dependencies_label: Копіювати з шаблона + dependencies_label: "Копіювати з шаблона" blank_template: - label: Пустий проєкт + label: "Пустий проєкт" description: Почніть із нуля. Уручну додайте атрибути проєкту, учасників і модулі. blank_description: Опису немає. create_portfolio: - template_heading: Виберіть шаблон портфеля, щоб користуватися найпоширенішими - методами управління проєктами, або створіть портфель із нуля. + template_heading: "Виберіть шаблон портфеля, щоб користуватися найпоширенішими методами управління проєктами, або створіть портфель із нуля." blank_template: - label: Пустий портфель - description: Почніть із нуля. Уручну додайте атрибути портфеля, учасників і - модулі. + label: "Пустий портфель" + description: Почніть із нуля. Уручну додайте атрибути портфеля, учасників і модулі. create_program: - template_heading: Виберіть шаблон програми, щоб користуватися найпоширенішими - методами управління проєктами, або створіть програму з нуля. + template_heading: "Виберіть шаблон програми, щоб користуватися найпоширенішими методами управління проєктами, або створіть програму з нуля." blank_template: - label: Пуста програма - description: Почніть із нуля. Уручну додайте атрибути програми, учасників і - модулі. - create_wiki_page: Створити нову вікісторінку - create_wiki_page_button: Сторінка Wiki + label: "Пуста програма" + description: Почніть із нуля. Уручну додайте атрибути програми, учасників і модулі. + create_wiki_page: "Створити нову вікісторінку" + create_wiki_page_button: "Сторінка Wiki" date: abbr_day_names: - - Нед - - Пн - - Вт - - Ср - - Чет - - П'ят - - Суб + - "Нед" + - "Пн" + - "Вт" + - "Ср" + - "Чет" + - "П'ят" + - "Суб" abbr_month_names: - - - - Січ - - Лют - - Бер - - Кві - - Тра - - Чер - - Лип - - Серп - - Вер - - Жов - - Лис - - Гру - abbr_week: Тиж. + - null + - "Січ" + - "Лют" + - "Бер" + - "Кві" + - "Тра" + - "Чер" + - "Лип" + - "Серп" + - "Вер" + - "Жов" + - "Лис" + - "Гру" + abbr_week: "Тиж." day_names: - - Неділя - - Понеділок - - Вівторок - - Середа - - Четвер - - П'ятниця - - Субота + - "Неділя" + - "Понеділок" + - "Вівторок" + - "Середа" + - "Четвер" + - "П'ятниця" + - "Субота" formats: + #Use the strftime parameters for formats. + #When no format has been given, it uses default. + #You can provide other formats here if you like! default: "%d. %m. %Y" long: "%d %B %Y" short: "%d %b" - month_names: - - - - Січень - - Лютий - - Березень - - Квітень - - Тра - - Червень - - Липень - - Серпень - - Вересень - - Жовтень - - Листопад - - Грудень + #Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: #Used in date_select and datetime_select. + - null + - "Січень" + - "Лютий" + - "Березень" + - "Квітень" + - "Тра" + - "Червень" + - "Липень" + - "Серпень" + - "Вересень" + - "Жовтень" + - "Листопад" + - "Грудень" order: - - рік - - місяць - - день + - рік + - місяць + - день datetime: distance_in_words: about_x_hours: - one: близько 1 години - few: близько %{count} годин(и) - many: близько %{count} годин(и) - other: близько %{count} годин(и) + one: "близько 1 години" + few: "близько %{count} годин(и)" + many: "близько %{count} годин(и)" + other: "близько %{count} годин(и)" about_x_months: - one: близько 1 місяця - few: близько %{count} місяців - many: близько %{count} місяців - other: близько %{count} місяців + one: "близько 1 місяця" + few: "близько %{count} місяців" + many: "близько %{count} місяців" + other: "близько %{count} місяців" about_x_years: - one: близько 1 року - few: близько %{count} років - many: близько %{count} років - other: близько %{count} років + one: "близько 1 року" + few: "близько %{count} років" + many: "близько %{count} років" + other: "близько %{count} років" almost_x_years: - one: майже 1 рік - few: майже %{count} років - many: майже %{count} років - other: майже %{count} років - half_a_minute: пів хвилини + one: "майже 1 рік" + few: "майже %{count} років" + many: "майже %{count} років" + other: "майже %{count} років" + half_a_minute: "пів хвилини" less_than_x_minutes: - one: менш, ніж за хвилину - few: менше %{count} хвилини - many: менше %{count} хвилини - other: менше %{count} хвилини + one: "менш, ніж за хвилину" + few: "менше %{count} хвилини" + many: "менше %{count} хвилини" + other: "менше %{count} хвилини" less_than_x_seconds: - one: менше однієї секунди - few: менш ніж %{count} секунд - many: менш ніж %{count} секунд - other: менш ніж %{count} секунд + one: "менше однієї секунди" + few: "менш ніж %{count} секунд" + many: "менш ніж %{count} секунд" + other: "менш ніж %{count} секунд" over_x_years: - one: більше 1 року - few: більше %{count} років - many: більше %{count} років - other: більше %{count} років + one: "більше 1 року" + few: "більше %{count} років" + many: "більше %{count} років" + other: "більше %{count} років" x_days: - one: 1 день + one: "1 день" few: "%{count} днів" many: "%{count} днів" other: "%{count} днів" x_minutes: - one: 1 хвилина + one: "1 хвилина" few: "%{count} хвилин" many: "%{count} хвилин" other: "%{count} хвилин" x_minutes_abbreviated: - one: 1 хв + one: "1 хв" few: "%{count} хв" many: "%{count} хв" other: "%{count} хв" x_hours: - one: 1 година + one: "1 година" few: "%{count} год" many: "%{count} год" other: "%{count} год" x_hours_abbreviated: - one: 1 год + one: "1 год" few: "%{count} год" many: "%{count} год" other: "%{count} год" x_weeks: - one: 1 тиждень + one: "1 тиждень" few: "%{count} тижні" many: "%{count} тижнів" other: "%{count} тижня" x_months: - one: 1 місяць + one: "1 місяць" few: "%{count} місяців" many: "%{count} місяців" other: "%{count} місяців" x_years: - one: 1 рік + one: "1 рік" few: "%{count} роки" many: "%{count} років" other: "%{count} року" x_seconds: - one: 1 секунда + one: "1 секунда" few: "%{count} секунд" many: "%{count} секунд" other: "%{count} секунд" x_seconds_abbreviated: - one: 1 с + one: "1 с" few: "%{count} с" many: "%{count} с" other: "%{count} с" units: minute_abbreviated: - one: хв - few: хв - many: хв - other: хв + one: "хв" + few: "хв" + many: "хв" + other: "хв" hour: - one: година - few: годин(и) - many: годин(и) - other: годин(и) + one: "година" + few: "годин(и)" + many: "годин(и)" + other: "годин(и)" day: - one: день - few: дні - many: днів - other: дня - description_active: Активний? - description_attachment_toggle: Показати/приховати вкладення - description_autocomplete: 'Це поле використовується автозаповнення. При введенні - заголовка пакета роботу ви отримаєте список можливих кандидатів. Виберіть один - з допомогою стрілка вгору і Стрілка вниз і виберіть його з Tab або Enter. Крім - того ви можете введіть номер робочого пакета напряму. - - ' - description_available_columns: Доступні стовпці - description_choose_project: Проекти - description_compare_from: Порівняти від - description_compare_to: Порівняти до - description_current_position: 'Ви знаходитесь тут: ' - description_date_from: Введіть дату початку - description_date_to: Введіть кінцеву дату - description_enter_number: Введіть номер - description_enter_text: Введіть текст - description_filter: Фільтр - description_filter_toggle: Показати/приховати фільтр - description_category_reassign: Оберіть категорію - description_message_content: Зміст повідомлення - description_my_project: Ви учасник - description_notes: Примітки - description_parent_work_package: Батьківський робочий пакет поточного - description_project_scope: Область пошуку - description_query_sort_criteria_attribute: Критерій сортування - description_query_sort_criteria_direction: Порядок сортування - description_search: Поле пошуку - description_select_work_package: Виберіть робочий пакет - description_selected_columns: Вибрані колонки - description_sub_work_package: Частина робочого пакету поточного - description_toc_toggle: Показати/приховати зміст - description_wiki_subpages_reassign: Виберіть батьківську сторінку + one: "день" + few: "дні" + many: "днів" + other: "дня" + description_active: "Активний?" + description_attachment_toggle: "Показати/приховати вкладення" + description_autocomplete: > + Це поле використовується автозаповнення. При введенні заголовка пакета роботу ви отримаєте список можливих кандидатів. Виберіть один з допомогою стрілка вгору і Стрілка вниз і виберіть його з Tab або Enter. Крім того ви можете введіть номер робочого пакета напряму. + description_available_columns: "Доступні стовпці" + description_choose_project: "Проекти" + description_compare_from: "Порівняти від" + description_compare_to: "Порівняти до" + description_current_position: "Ви знаходитесь тут: " + description_date_from: "Введіть дату початку" + description_date_to: "Введіть кінцеву дату" + description_enter_number: "Введіть номер" + description_enter_text: "Введіть текст" + description_filter: "Фільтр" + description_filter_toggle: "Показати/приховати фільтр" + description_category_reassign: "Оберіть категорію" + description_message_content: "Зміст повідомлення" + description_my_project: "Ви учасник" + description_notes: "Примітки" + description_parent_work_package: "Батьківський робочий пакет поточного" + description_project_scope: "Область пошуку" + description_query_sort_criteria_attribute: "Критерій сортування" + description_query_sort_criteria_direction: "Порядок сортування" + description_search: "Поле пошуку" + description_select_work_package: "Виберіть робочий пакет" + description_selected_columns: "Вибрані колонки" + description_sub_work_package: "Частина робочого пакету поточного" + description_toc_toggle: "Показати/приховати зміст" + description_wiki_subpages_reassign: "Виберіть батьківську сторінку" + #Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) direction: зліва направо ee: features: @@ -3255,435 +2808,326 @@ uk: work_package_sharing: Діліться пакетами робіт із зовнішніми користувачами work_package_subject_generation: Створення теми пакета робіт upsell: - buy_now_button: Купити - plans_title: Плани Enterprise - title: Доповнення версії Enterprise - plan_title: Доповнення версії Enterprise %{plan} - plan_name: Версія Enterprise %{plan} - plan_text_html: Доступно, починаючи з версії %{plan_name}. - unlimited: Без обмежень - already_have_token: 'Уже маєте маркер? Додайте його за допомогою кнопки нижче, - щоб перейти на вже замовлений план Enterprise. - - ' - hide_banner: Приховати цей банер - homescreen_description: 'Користувачам планів Enterprise, створених на основі - версії Community, доступні додаткові [доповнення Enterprise](enterprise_url) - і професійна підтримка, що ідеально для організацій, які використовують OpenProject - у середовищах, критично важливих для стратегічних завдань. - - ' - homescreen_subline: Підвищивши рівень, ви також долучитеся до підтримки проєкту - з відкритим кодом. + buy_now_button: "Купити" + plans_title: "Плани Enterprise" + title: "Доповнення версії Enterprise" + plan_title: "Доповнення версії Enterprise %{plan}" + plan_name: "Версія Enterprise %{plan}" + plan_text_html: "Доступно, починаючи з версії %{plan_name}." + unlimited: "Без обмежень" + already_have_token: > + Уже маєте маркер? Додайте його за допомогою кнопки нижче, щоб перейти на вже замовлений план Enterprise. + hide_banner: "Приховати цей банер" + homescreen_description: > + Користувачам планів Enterprise, створених на основі версії Community, доступні додаткові [доповнення Enterprise](enterprise_url) і професійна підтримка, що ідеально для організацій, які використовують OpenProject у середовищах, критично важливих для стратегічних завдань. + homescreen_subline: Підвищивши рівень, ви також долучитеся до підтримки проєкту з відкритим кодом. baseline_comparison: - description: Виділяйте зміни, внесені в цей список із будь-якого моменту часу - в минулому. + description: Виділяйте зміни, внесені в цей список із будь-якого моменту часу в минулому. benefits: - description: Які переваги локальної версії Enterprise? - high_security: Функції безпеки - high_security_text: Єдиний вхід (SAML, OpenID Connect, CAS), групи LDAP. - installation: Підтримка під час установлення - installation_text: Досвідчені інженери з програмного забезпечення допоможуть - вам виконати повне встановлення й налаштувати процес у вашій інфраструктурі. - premium_features: Доповнення версії Enterprise - premium_features_text: Дошки Agile, власні тема й логотип, діаграми, розумні - робочі процеси з користувацькими діями, повнотекстовий пошук у вкладеннях - пакетів робіт і користувацькі поля з множинним вибором. - professional_support: Професійна підтримка - professional_support_text: Отримайте надійну, комплексну підтримку від старших - інженерів, які знають усе про запуск OpenProject у критично важливих для - бізнесу середовищах. + description: "Які переваги локальної версії Enterprise?" + high_security: "Функції безпеки" + high_security_text: "Єдиний вхід (SAML, OpenID Connect, CAS), групи LDAP." + installation: "Підтримка під час установлення" + installation_text: "Досвідчені інженери з програмного забезпечення допоможуть вам виконати повне встановлення й налаштувати процес у вашій інфраструктурі." + premium_features: "Доповнення версії Enterprise" + premium_features_text: "Дошки Agile, власні тема й логотип, діаграми, розумні робочі процеси з користувацькими діями, повнотекстовий пошук у вкладеннях пакетів робіт і користувацькі поля з множинним вибором." + professional_support: "Професійна підтримка" + professional_support_text: "Отримайте надійну, комплексну підтримку від старших інженерів, які знають усе про запуск OpenProject у критично важливих для бізнесу середовищах." work_package_subject_generation: - description: Створюйте автоматично згенеровані теми на основі атрибутів і - тексту. + description: "Створюйте автоматично згенеровані теми на основі атрибутів і тексту." customize_life_cycle: - description: Створюйте й упорядковуйте етапи й проєкту, відмінні від тих, - що передбачено плануванням циклу проєкту PM2. + description: "Створюйте й упорядковуйте етапи й проєкту, відмінні від тих, що передбачено плануванням циклу проєкту PM2." capture_external_links: - description: Запобігайте атакам соціальної інженерії, виявляючи зовнішні посилання - й попереджаючи про них користувачів перед переходом за ними. + description: "Запобігайте атакам соціальної інженерії, виявляючи зовнішні посилання й попереджаючи про них користувачів перед переходом за ними." work_package_query_relation_columns: - description: Хочете переглядати зв’язки або дочірні елементи в списку пакетів - робіт? + description: "Хочете переглядати зв’язки або дочірні елементи в списку пакетів робіт?" edit_attribute_groups: - description: 'Налаштуйте конфігурацію форми за допомогою цих додаткових доповнень:' + description: "Налаштуйте конфігурацію форми за допомогою цих додаткових доповнень:" features: - groups: Додати нові групи атрибутів - rename: Перейменувати групи атрибутів - related: Додати таблицю зв’язаних пакетів робіт + groups: "Додати нові групи атрибутів" + rename: "Перейменувати групи атрибутів" + related: "Додати таблицю зв’язаних пакетів робіт" readonly_work_packages: - description: Позначайте пакети робіт як доступні лише для читання залежно - від статусу. + description: "Позначайте пакети робіт як доступні лише для читання залежно від статусу." custom_field_hierarchies: - description: Користувацькі поля типу «Ієрархія» дають змогу впорядковувати - ієрархічні структури в пакети робіт і проєкти, використовуючи багаторівневі - розкривні списки. + description: "Користувацькі поля типу «Ієрархія» дають змогу впорядковувати ієрархічні структури в пакети робіт і проєкти, використовуючи багаторівневі розкривні списки." date_alerts: - description: Завдяки оповіщенням про дати ви завжди знатимете про заплановані - дати початку або завершення, тож ніколи не пропускатимете важливі терміни - й не забуватимете про них. + description: "Завдяки оповіщенням про дати ви завжди знатимете про заплановані дати початку або завершення, тож ніколи не пропускатимете важливі терміни й не забуватимете про них." weighted_item_lists: - description: Тип «Список зважених елементів» дає змогу створити список із - пов’язаними опорними числовими значеннями. + description: "Тип «Список зважених елементів» дає змогу створити список із пов’язаними опорними числовими значеннями." work_package_sharing: - description: Діліться пакетами робіт із користувачами, які не належать до - учасників проєкту. + description: "Діліться пакетами робіт із користувачами, які не належать до учасників проєкту." project_list_sharing: - description: Діліться списками проєктів з окремими користувачами. + description: "Діліться списками проєктів з окремими користувачами." calculated_values: - description: Тип «Розраховані значення» дає змогу створити атрибут на основі - математичної формули з використанням числових значень, а також інших атрибутів - проєкту й користувацьких полів. + description: "Тип «Розраховані значення» дає змогу створити атрибут на основі математичної формули з використанням числових значень, а також інших атрибутів проєкту й користувацьких полів." define_custom_style: - title: Користувацький колір теми й логотип - more_info: 'Примітка: вибраний логотип буде загальнодоступний.' - description: Персоналізуйте свій екземпляр OpenProject за допомогою власного - логотипа й кольорів. + title: "Користувацький колір теми й логотип" + more_info: "Примітка: вибраний логотип буде загальнодоступний." + description: Персоналізуйте свій екземпляр OpenProject за допомогою власного логотипа й кольорів. custom_actions: - title: Користувацькі дії - description: Користувацькі дії – це ярлики набору попередньо визначених дій, - які ви можете включати в певні пакети робіт залежно від статусу, ролі, типу - або проєкту. + title: "Користувацькі дії" + description: "Користувацькі дії – це ярлики набору попередньо визначених дій, які ви можете включати в певні пакети робіт залежно від статусу, ролі, типу або проєкту." mcp_server: - description: Bring OpenProject into your AI workflows with a secure MCP server. + description: "Захищений MCP-сервер має змогу інтегрувати OpenProject у робочі процеси на основі ШІ." meeting_templates: - description: Define meeting templates with a set agenda structure and save - time by reusing them when creating new meetings. + description: "Налаштовуйте шаблони нарад з усталеною структурою порядку денного й заощаджуйте час, повторно використовуючи їх для створення нових нарад." nextcloud_sso: - title: Єдиний вхід для сховища Nextcloud - description: Увімкніть швидку й безпечну автентифікацію для свого сховища - Nextcloud завдяки технології єдиного входу. Спростіть керування доступом - і покращте взаємодію користувачів зі своїм продуктом. + title: "Єдиний вхід для сховища Nextcloud" + description: "Увімкніть швидку й безпечну автентифікацію для свого сховища Nextcloud завдяки технології єдиного входу. Спростіть керування доступом і покращте взаємодію користувачів зі своїм продуктом." scim_api: - title: Клієнти SCIM - description: Автоматизуйте управління користувачами в OpenProject, інтегрувавши - зовнішні сервіси для керування ідентичностями, такі як Microsoft Entra або - Keycloak, через API сервера SCIM. Ця можливість доступна, починаючи з корпоративного - плану Enterprise. + title: "Клієнти SCIM" + description: "Автоматизуйте управління користувачами в OpenProject, інтегрувавши зовнішні сервіси для керування ідентичностями, такі як Microsoft Entra або Keycloak, через API сервера SCIM. Ця можливість доступна, починаючи з корпоративного плану Enterprise." sso_auth_providers: - title: Єдиний вхід (SSO) - description: Дайте користувачам змогу входити через зовнішніх постачальників - SSO за допомогою SAML або OpenID Connect для безперешкодного доступу й інтеграції - з наявними ідентифікаційними системами. + title: "Єдиний вхід (SSO)" + description: "Дайте користувачам змогу входити через зовнішніх постачальників SSO за допомогою SAML або OpenID Connect для безперешкодного доступу й інтеграції з наявними ідентифікаційними системами." virus_scanning: - description: Переконайтеся, що вивантажені в OpenProject файли перевіряються - на віруси перед тим, як стають доступними для інших користувачів. + description: "Переконайтеся, що вивантажені в OpenProject файли перевіряються на віруси перед тим, як стають доступними для інших користувачів." project_creation_wizard: - description: Створіть покроковий майстер, який допоможе менеджерам проєктів - заповнити запит на запуск проєкту. + description: "Створіть покроковий майстер, який допоможе менеджерам проєктів заповнити запит на запуск проєкту." placeholder_users: title: Прототипи користувачів - description: 'Прототипи користувачів допомагають призначати пакети робіт користувачам, - які не входять у ваш проєкт. Вони можуть бути корисні в різних сценаріях. - Наприклад, якщо потрібно відстежувати завдання для ресурсу, який поки не - доступний або не визначений. Або ж ви хочете відстежувати завдання, призначені - особі, не надаючи їй доступу до OpenProject. - - ' + description: > + Прототипи користувачів допомагають призначати пакети робіт користувачам, які не входять у ваш проєкт. Вони можуть бути корисні в різних сценаріях. Наприклад, якщо потрібно відстежувати завдання для ресурсу, який поки не доступний або не визначений. Або ж ви хочете відстежувати завдання, призначені особі, не надаючи їй доступу до OpenProject. internal_comments: title: Внутрішні коментарі - description: Завдяки внутрішнім коментарям учасники внутрішньої команди можуть - спілкуватися приватно. Ці коментарі доступні лише користувачам із певними - ролями в проєкті й ніколи не відображаються для всіх. + description: "Завдяки внутрішнім коментарям учасники внутрішньої команди можуть спілкуватися приватно. Ці коментарі доступні лише користувачам із певними ролями в проєкті й ніколи не відображаються для всіх." internal_comments_inline: - title: Створюйте внутрішні коментарі лише для учасників невеликої групи + title: "Створюйте внутрішні коментарі лише для учасників невеликої групи" description: " " portfolio_management: - description: Узгодьте свої проєкти зі стратегічними цілями, об’єднавши їх - у портфелі й програми. + description: Узгодьте свої проєкти зі стратегічними цілями, об’єднавши їх у портфелі й програми. teaser: title: - one: Один день до завершення строку дії пробного маркера %{trial_plan} + one: "Один день до завершення строку дії пробного маркера %{trial_plan}" few: "%{count} дні до завершення строку дії пробного маркера %{trial_plan}" many: "%{count} днів до завершення строку дії пробного маркера %{trial_plan}" other: "%{count} дня до завершення строку дії пробного маркера %{trial_plan}" - description: У вас є доступ до всіх функцій %{trial_plan}. + description: "У вас є доступ до всіх функцій %{trial_plan}." trial: - not_found: Ви запитали пробний маркер, але цей запит більше не доступний. Спробуйте - ще раз. - wait_for_confirmation: Ми надіслали вам електронного листа, щоб ви підтвердили - свою адресу й могли отримати пробний маркер. - already_retrieved: 'Маркер пробної версії Enterprise уже отримано. На вашу електронну - пошту мав надійти лист із вкладеним маркером. Якщо вам потрібен новий маркер, - зверніться до нашої служби підтримки. - - ' - successfully_saved: Маркер пробної версії Enterprise успішно отримано. - token_sent: Запитано пробний маркер - request_again: Надіслати запит ще раз - resend_action: Ще раз надіслати електронного листа з підтвердженням - welcome_title: Стислий огляд функцій - welcome_description: Отримайте стислий огляд функцій для управління проєктами - й командної роботи у версії OpenProject Enterprise. - confirmation_info: 'Ми надіслали вам листа %{date} на адресу %{email} з усією - інформацією, потрібною, щоб почати користуватися безкоштовною пробною версією - OpenProject Enterprise. Знайдіть його у своїй пошті й перейдіть за посиланням - для підтвердження, щоб розпочати безплатний 14-денний пробний період. - - ' - confirmation_subline: 'Перевірте свою пошту й виконайте вказівки, щоб розпочати - безплатний 14-денний пробний період. - - ' + not_found: "Ви запитали пробний маркер, але цей запит більше не доступний. Спробуйте ще раз." + wait_for_confirmation: "Ми надіслали вам електронного листа, щоб ви підтвердили свою адресу й могли отримати пробний маркер." + already_retrieved: > + Маркер пробної версії Enterprise уже отримано. На вашу електронну пошту мав надійти лист із вкладеним маркером. Якщо вам потрібен новий маркер, зверніться до нашої служби підтримки. + successfully_saved: "Маркер пробної версії Enterprise успішно отримано." + token_sent: "Запитано пробний маркер" + request_again: "Надіслати запит ще раз" + resend_action: "Ще раз надіслати електронного листа з підтвердженням" + welcome_title: "Стислий огляд функцій" + welcome_description: "Отримайте стислий огляд функцій для управління проєктами й командної роботи у версії OpenProject Enterprise." + confirmation_info: > + Ми надіслали вам листа %{date} на адресу %{email} з усією інформацією, потрібною, щоб почати користуватися безкоштовною пробною версією OpenProject Enterprise. Знайдіть його у своїй пошті й перейдіть за посиланням для підтвердження, щоб розпочати безплатний 14-денний пробний період. + confirmation_subline: > + Перевірте свою пошту й виконайте вказівки, щоб розпочати безплатний 14-денний пробний період. domain_caption: Маркер буде дійсним для вашого поточного імені хосту. - receive_newsletter_html: 'Я хочу отримувати інформаційний - бюлетень OpenProject. - - ' - consent_html: 'Я погоджуюся з умовами - надання послуг і політикою - конфіденційності. - - ' + receive_newsletter_html: > + Я хочу отримувати інформаційний бюлетень OpenProject. + consent_html: > + Я погоджуюся з умовами надання послуг і політикою конфіденційності. email_calendar_updates: state: - disabled: Вимкнено. - enabled: Увімкнено. + disabled: "Вимкнено." + enabled: "Увімкнено." button: - disabled: Увімкнути - enabled: Вимкнути - enumeration_activities: Дії щодо відстеження часу - enumeration_work_package_priorities: Пріоритети робочого пакету - enumeration_reported_project_statuses: Повідомлений статус - enumeration_caption_order_changed: Порядок змінено. - enumeration_could_not_be_moved: Неможливо перенести перелічення. + disabled: "Увімкнути" + enabled: "Вимкнути" + enumeration_activities: "Дії щодо відстеження часу" + enumeration_work_package_priorities: "Пріоритети робочого пакету" + enumeration_reported_project_statuses: "Повідомлений статус" + enumeration_caption_order_changed: "Порядок змінено." + enumeration_could_not_be_moved: "Неможливо перенести перелічення." enterprise_trials: dialog_component: title: Пробна версія Enterprise - error_auth_source_sso_failed: 'Єдиний вхід (SSO) для користувача %{value} не вдалося ' - error_can_not_archive_project: 'Цей проєкт не можна архівувати: %{errors}' - error_can_not_delete_entry: Неможливо видалити запис - error_can_not_delete_custom_field: Неможливо видалити спеціальне поле - error_can_not_delete_in_use_archived_undisclosed: Пакети робіт також містяться в - архівних проєктах. Попросіть адміністратора виконати операцію видалення, щоб дізнатися, - яких проєктів це стосується. - error_can_not_delete_in_use_archived_work_packages: 'Пакети робіт також містяться - в архівних проєктах. Спочатку потрібно повторно активувати ці проєкти, а потім - – змінити атрибут відповідних пакетів робіт: %{archived_projects_urls}' + error_auth_source_sso_failed: "Єдиний вхід (SSO) для користувача %{value} не вдалося " + error_can_not_archive_project: "Цей проєкт не можна архівувати: %{errors}" + error_can_not_delete_entry: "Неможливо видалити запис" + error_can_not_delete_custom_field: "Неможливо видалити спеціальне поле" + error_can_not_delete_in_use_archived_undisclosed: "Пакети робіт також містяться в архівних проєктах. Попросіть адміністратора виконати операцію видалення, щоб дізнатися, яких проєктів це стосується." + error_can_not_delete_in_use_archived_work_packages: "Пакети робіт також містяться в архівних проєктах. Спочатку потрібно повторно активувати ці проєкти, а потім – змінити атрибут відповідних пакетів робіт: %{archived_projects_urls}" error_can_not_delete_type: - explanation: Цей тип містить пакети робіт, і його не можна видалити. Переглянути - всі пошкоджені пакети робіт можна в цьому поданні. - error_can_not_delete_standard_type: Стандартні типи неможливо видалити. - error_can_not_invite_user: Не вдалося надіслати запрошення користувачеві. - error_can_not_remove_role: Ця роль використовується і не може бути видалений. - error_can_not_reopen_work_package_on_closed_version: Пакет робіт покладених на закритій - версії не може бути відкритий - error_can_not_find_all_resources: Не вдалося знайти всі відповідні ресурси для цього - запиту. - error_can_not_unarchive_project: 'Цей проєкт не можна розархівувати: %{errors}' - error_check_user_and_role: Будь ласка виберіть користувача і роль. - error_code: Помилка %{code} - error_color_could_not_be_saved: Не вдалося зберегти колір - error_cookie_missing: Файл cookie OpenProject відсутній. Переконайтеся, що файли - cookie увімкнено, оскільки ця програма не буде функціонувати належним чином. - error_custom_option_not_found: Варіант не існує. - error_enterprise_plan_needed: Щоб виконати цю дію, потрібен корпоративний план %{plan}. - error_enterprise_activation_user_limit: Ваш обліковий запис не можна активувати - (досягнуто обмеження користувача). Щоб отримати доступ, зверніться до свого адміністратора. - error_enterprise_token_invalid_domain: Версія Enterprise не активна. Домен вашого - маркера Enterprise (%{actual}) не збігається з іменем хосту системи (%{expected}). - error_failed_to_delete_entry: Не вдалося видалити цей запис. - error_in_dependent: 'Помилка спроби змінити залежний об''єкт: %{dependent_class} - %{related_id} - %{related_subject}: %{error}' - error_in_new_dependent: 'Не вдалося створити залежний об’єкт: %{dependent_class} - – %{related_subject}: %{error}' - error_invalid_selected_value: Недійсне вибране значення. - error_journal_attribute_not_present: Журнал не містить атрибута %{attribute}. - error_pdf_export_too_many_columns: Для експорту PDF-файлу вибрано занадто багато - стовпців. Скоротіть кількість стовпців. - error_pdf_date_range_too_long: Діапазон дат, вибраний для пакета робіт, перевищує - допустимий ліміт для експорту у форматі PDF. Скоротіть діапазон до максимального — - %{years} р. - error_pdf_failed_to_export: 'Експорт PDF не вдалося зберегти: %{error}' - error_token_authenticity: Неможливо підтвердити маркер підробки для запиту між сайтами. - Чи спробували ви надіслати дані для кількох веб-переглядачів або вкладок? Закрийте - всі вкладки та повторіть спробу. - error_reminder_not_found: Нагадування не знайдено, або сповіщення вже надіслано. - error_work_package_not_found_in_project: Робочий пакет не був знайдений або не належить - до цього проекту - error_work_package_id_not_found: Пакет робіт не знайдено. - error_must_be_project_member: повинен бути учасником проекту - error_migrations_are_pending: У вашій установці OpenProject міститься міграція бази - даних. Можливо, ви пропустили міграції під час останнього оновлення. Перевірте - керівництво з оновлення, щоб належним чином оновити інсталяцію. - error_migrations_visit_upgrade_guides: Будь ласка, відвідайте нашу документацію - з оновлення - error_no_default_work_package_status: Не визначено статус робочого пакету за промовчанням. - Перевірте конфігурацію (перейдіть до розділу "Адміністрування -> Статуси робочих - пакетів"). - error_no_type_in_project: З цим проектом не асоційовано жодного типу. Перевірте - налаштування проекту. - error_omniauth_registration_timed_out: Реєстрація через зовнішнього постачальника - аутентифікації закінчилася. Будь ласка спробуйте ще раз. - error_omniauth_invalid_auth: Постачальник ідентифікаторів повернув недійсні дані - для автентифікації. Зверніться до адміністратора, щоб отримати додаткову допомогу. - error_password_change_failed: Під час спроби змінити пароль сталася помилка. - error_scm_command_failed: 'Помилка доступу до сховища: %{value}' - error_scm_not_found: Запис або ревізію (версію) не знайдено у репозиторії. - error_type_could_not_be_saved: Не вдалося зберегти тип - error_unable_delete_status: Робота статус пакет не може бути видалено оскільки він - використовується щонайменше один пакет робіт. - error_unable_delete_default_status: Неможливо видалити статус пакета за замовчуванням. - Будь ласка виберіть інший робочий статус пакета за замовчуванням перед видаленням - поточної. - error_unable_to_connect: Неможливо підключитись (%{value}) - error_unable_delete_wiki: Неможливо видалити wiki-сторінку. - error_unable_update_wiki: Неможливо оновити wiki-сторінку. - error_workflow_copy_source: Будь ласка виберіть Тип джерела або роль - error_workflow_copy_target: Виберіть цільові тип(и) та роль(і) + explanation: 'Цей тип містить пакети робіт, і його не можна видалити. Переглянути всі пошкоджені пакети робіт можна в цьому поданні.' + error_can_not_delete_standard_type: "Стандартні типи неможливо видалити." + error_can_not_invite_user: "Не вдалося надіслати запрошення користувачеві." + error_can_not_remove_role: "Ця роль використовується і не може бути видалений." + error_can_not_reopen_work_package_on_closed_version: "Пакет робіт покладених на закритій версії не може бути відкритий" + error_can_not_find_all_resources: "Не вдалося знайти всі відповідні ресурси для цього запиту." + error_can_not_unarchive_project: "Цей проєкт не можна розархівувати: %{errors}" + error_check_user_and_role: "Будь ласка виберіть користувача і роль." + error_code: "Помилка %{code}" + error_color_could_not_be_saved: "Не вдалося зберегти колір" + error_cookie_missing: "Файл cookie OpenProject відсутній. Переконайтеся, що файли cookie увімкнено, оскільки ця програма не буде функціонувати належним чином." + error_custom_option_not_found: "Варіант не існує." + error_enterprise_plan_needed: "Щоб виконати цю дію, потрібен корпоративний план %{plan}." + error_enterprise_activation_user_limit: "Ваш обліковий запис не можна активувати (досягнуто обмеження користувача). Щоб отримати доступ, зверніться до свого адміністратора." + error_enterprise_token_invalid_domain: "Версія Enterprise не активна. Домен вашого маркера Enterprise (%{actual}) не збігається з іменем хосту системи (%{expected})." + error_failed_to_delete_entry: "Не вдалося видалити цей запис." + error_in_dependent: "Помилка спроби змінити залежний об'єкт: %{dependent_class} %{related_id} - %{related_subject}: %{error}" + error_in_new_dependent: "Не вдалося створити залежний об’єкт: %{dependent_class} – %{related_subject}: %{error}" + error_invalid_selected_value: "Недійсне вибране значення." + error_journal_attribute_not_present: "Журнал не містить атрибута %{attribute}." + error_pdf_export_too_many_columns: "Для експорту PDF-файлу вибрано занадто багато стовпців. Скоротіть кількість стовпців." + error_pdf_date_range_too_long: "Діапазон дат, вибраний для пакета робіт, перевищує допустимий ліміт для експорту у форматі PDF. Скоротіть діапазон до максимального — %{years} р." + error_pdf_failed_to_export: "Експорт PDF не вдалося зберегти: %{error}" + error_token_authenticity: "Неможливо підтвердити маркер підробки для запиту між сайтами. Чи спробували ви надіслати дані для кількох веб-переглядачів або вкладок? Закрийте всі вкладки та повторіть спробу." + error_reminder_not_found: "Нагадування не знайдено, або сповіщення вже надіслано." + error_work_package_not_found_in_project: "Робочий пакет не був знайдений або не належить до цього проекту" + error_work_package_id_not_found: "Пакет робіт не знайдено." + error_must_be_project_member: "повинен бути учасником проекту" + error_migrations_are_pending: "У вашій установці OpenProject міститься міграція бази даних. Можливо, ви пропустили міграції під час останнього оновлення. Перевірте керівництво з оновлення, щоб належним чином оновити інсталяцію." + error_migrations_visit_upgrade_guides: "Будь ласка, відвідайте нашу документацію з оновлення" + error_no_default_work_package_status: 'Не визначено статус робочого пакету за промовчанням. Перевірте конфігурацію (перейдіть до розділу "Адміністрування -> Статуси робочих пакетів").' + error_no_type_in_project: "З цим проектом не асоційовано жодного типу. Перевірте налаштування проекту." + error_omniauth_registration_timed_out: "Реєстрація через зовнішнього постачальника аутентифікації закінчилася. Будь ласка спробуйте ще раз." + error_omniauth_invalid_auth: "Постачальник ідентифікаторів повернув недійсні дані для автентифікації. Зверніться до адміністратора, щоб отримати додаткову допомогу." + error_password_change_failed: "Під час спроби змінити пароль сталася помилка." + error_scm_command_failed: "Помилка доступу до сховища: %{value}" + error_scm_not_found: "Запис або ревізію (версію) не знайдено у репозиторії." + error_type_could_not_be_saved: "Не вдалося зберегти тип" + error_unable_delete_status: "Робота статус пакет не може бути видалено оскільки він використовується щонайменше один пакет робіт." + error_unable_delete_default_status: "Неможливо видалити статус пакета за замовчуванням. Будь ласка виберіть інший робочий статус пакета за замовчуванням перед видаленням поточної." + error_unable_to_connect: "Неможливо підключитись (%{value})" + error_unable_delete_wiki: "Неможливо видалити wiki-сторінку." + error_unable_update_wiki: "Неможливо оновити wiki-сторінку." + error_workflow_copy_source: "Будь ласка виберіть Тип джерела або роль" + error_workflow_copy_target: "Виберіть цільові тип(и) та роль(і)" error_menu_item_not_created: Не можна додати пункт меню error_menu_item_not_saved: Не вдалося зберегти пункт меню - error_wiki_root_menu_item_conflict: 'Неможливо перейменувати %{old_name} для %{new_name} - через конфлікт у результуючому пункті меню з існуючим пунктом меню %{existing_caption} - %{existing_identifier} - - ' - error_external_authentication_failed_message: 'Під час зовнішньої автентифікації - сталася помилка: %{message}' - error_attribute_not_highlightable: 'Атрибут(и) не виділено: %{attributes}' + error_wiki_root_menu_item_conflict: > + Неможливо перейменувати %{old_name} для %{new_name} через конфлікт у результуючому пункті меню з існуючим пунктом меню %{existing_caption} %{existing_identifier} + error_external_authentication_failed_message: "Під час зовнішньої автентифікації сталася помилка: %{message}" + error_attribute_not_highlightable: "Атрибут(и) не виділено: %{attributes}" events: - changeset: Набір змін відредаговано + changeset: "Набір змін відредаговано" message: Повідомлення відредаговано news: Новини - project_details: Деталі проєкту змінено - project: Проєкт змінено - projects: Проєкт змінено + project_details: "Деталі проєкту змінено" + project: "Проєкт змінено" + projects: "Проєкт змінено" reply: Відповіли - time_entry: Timelog відредаговано - wiki_page: Wiki-сторінка оновлена - work_package_closed: Робочий пакет закритий - work_package_edit: Робочий пакет оновлений - work_package_note: Робочий пакет не доданий + time_entry: "Timelog відредаговано" + wiki_page: "Wiki-сторінка оновлена" + work_package_closed: "Робочий пакет закритий" + work_package_edit: "Робочий пакет оновлений" + work_package_note: "Робочий пакет не доданий" title: - project: 'Проєкт: %{name}' - subproject: 'Підпроєкт: %{name}' + project: "Проєкт: %{name}" + subproject: "Підпроєкт: %{name}" export: dialog: - title: Експорт - submit: Експортувати + title: "Експорт" + submit: "Експортувати" save_export_settings: - label: Зберегти налаштування + label: "Зберегти налаштування" format: - label: Формат файлу + label: "Формат файлу" options: csv: - label: CSV + label: "CSV" pdf: - label: PDF + label: "PDF" xls: - label: XLS + label: "XLS" columns: - input_label_report: Додати стовпці в таблицю атрибутів - input_caption_report: За замовчуванням вибрано всі атрибути, додані як стовпці - в список пакетів робіт. Довгі текстові поля недоступні в таблиці атрибутів, - але можуть відображатися під нею. - input_caption_table: За замовчуванням вибрано всі атрибути, додані як стовпці - в список пакетів робіт. Довгі текстові поля недоступні в експортах даних - таблиці. - input_caption_required: Неможливо експортувати подання без жодного стовпця. - Додайте принаймні один стовпець. + input_label_report: "Додати стовпці в таблицю атрибутів" + input_caption_report: "За замовчуванням вибрано всі атрибути, додані як стовпці в список пакетів робіт. Довгі текстові поля недоступні в таблиці атрибутів, але можуть відображатися під нею." + input_caption_table: "За замовчуванням вибрано всі атрибути, додані як стовпці в список пакетів робіт. Довгі текстові поля недоступні в експортах даних таблиці." + input_caption_required: "Неможливо експортувати подання без жодного стовпця. Додайте принаймні один стовпець." pdf: export_type: - label: Тип експорту PDF + label: "Тип експорту PDF" options: table: - label: Таблиця - caption: Експортуйте список пакетів робіт у таблицю з потрібними стовпцями. + label: "Таблиця" + caption: "Експортуйте список пакетів робіт у таблицю з потрібними стовпцями." report: - label: Звіт - caption: Експортуйте пакет робіт у докладний звіт про всі пакети робіт - у списку. + label: "Звіт" + caption: "Експортуйте пакет робіт у докладний звіт про всі пакети робіт у списку." gantt: - label: Діаграма Ґанта - caption: Експортуйте список пакетів робіт у вигляді діаграми Ґанта. + label: "Діаграма Ґанта" + caption: "Експортуйте список пакетів робіт у вигляді діаграми Ґанта." include_images: - label: Включити зображення - caption: Виключіть зображення, щоб зменшити розмір експорту PDF. + label: "Включити зображення" + caption: "Виключіть зображення, щоб зменшити розмір експорту PDF." gantt_zoom_levels: - label: Рівні масштабування - caption: Виберіть рівень масштабування для дат, що відображаються на діаграмі. + label: "Рівні масштабування" + caption: "Виберіть рівень масштабування для дат, що відображаються на діаграмі." options: - days: Дні - weeks: Тижні - months: Місяці - quarters: Квартали + days: "Дні" + weeks: "Тижні" + months: "Місяці" + quarters: "Квартали" column_width: - label: Ширина стовпців таблиці + label: "Ширина стовпців таблиці" options: - narrow: Вузькі - medium: Середні - wide: Широкі - very_wide: Дуже широкі + narrow: "Вузькі" + medium: "Середні" + wide: "Широкі" + very_wide: "Дуже широкі" paper_size: - label: Розмір паперу - caption: Залежно від розміру діаграми може бути експортовано більше ніж - одну сторінку. + label: "Розмір паперу" + caption: "Залежно від розміру діаграми може бути експортовано більше ніж одну сторінку." long_text_fields: - input_caption: За замовчуванням вибрано всі довгі текстові поля. - input_label: Додати довгі текстові поля - input_placeholder: Пошук довгих текстових полів - drag_area_label: Керувати довгими текстовими полями + input_caption: "За замовчуванням вибрано всі довгі текстові поля." + input_label: "Додати довгі текстові поля" + input_placeholder: "Пошук довгих текстових полів" + drag_area_label: "Керувати довгими текстовими полями" xls: include_relations: - label: Включити зв’язки - caption: Цей параметр створює дублікат кожного пакета робіт для кожного - його зв’язку з іншим пакетом робіт. + label: "Включити зв’язки" + caption: "Цей параметр створює дублікат кожного пакета робіт для кожного його зв’язку з іншим пакетом робіт." include_descriptions: - label: Включити описи - caption: Цей параметр додає стовпець опису в необробленому форматі. - your_work_packages_export: Пакет робіт експортуються - your_projects_export: Проєкти експортуються - succeeded: Експорт завершено - failed: 'Під час спроби експортувати пакети робіт сталася помилка: %{message}' + label: "Включити описи" + caption: "Цей параметр додає стовпець опису в необробленому форматі." + your_work_packages_export: "Пакет робіт експортуються" + your_projects_export: "Проєкти експортуються" + succeeded: "Експорт завершено" + failed: "Під час спроби експортувати пакети робіт сталася помилка: %{message}" demo: - heading: Демонстраційний файл PDF - footer: Згенеровано за допомогою OpenProject + heading: "Демонстраційний файл PDF" + footer: "Згенеровано за допомогою OpenProject" button_text: Згенерувати демонстраційний файл PDF errors: - embedded_table_with_too_many_columns: Ця вбудована таблиця пакета робіт не вміщується - на сторінку. Зменште кількість стовпців. + embedded_table_with_too_many_columns: "Ця вбудована таблиця пакета робіт не вміщується на сторінку. Зменште кількість стовпців." format: - atom: Atom - csv: CSV - pdf: PDF - pdf_overview_table: Таблиця PDF - pdf_report_with_images: Звіт PDF із зображеннями - pdf_report: Звіт PDF - pdf_gantt: Діаграма Ґанта (PDF) + atom: "Atom" + csv: "CSV" + pdf: "PDF" + pdf_overview_table: "Таблиця PDF" + pdf_report_with_images: "Звіт PDF із зображеннями" + pdf_report: "Звіт PDF" + pdf_gantt: "Діаграма Ґанта (PDF)" image: - omitted: Зображення не експортовано. + omitted: "Зображення не експортовано." macro: - error: Макропомилка, %{message} - attribute_not_found: 'атрибут не знайдено: %{attribute}' - model_not_found: 'недійсна модель атрибута: %{model}' - resource_not_found: 'ресурс не знайдено: %{resource}' - nested_rich_text_unsupported: Вкладені у форматований текст вставки зараз не - підтримуються при експорті + error: "Макропомилка, %{message}" + attribute_not_found: "атрибут не знайдено: %{attribute}" + model_not_found: "недійсна модель атрибута: %{model}" + resource_not_found: "ресурс не знайдено: %{resource}" + nested_rich_text_unsupported: "Вкладені у форматований текст вставки зараз не підтримуються при експорті" units: hours: г days: д pdf_generator: - page_nr_footer: Сторінка %{page} з %{total} + page_nr_footer: "Сторінка %{page} з %{total}" template_attributes: - label: Атрибути й опис - caption: Усі атрибути, наявні в поточній конфігурації форми, що використовують - шаблон за замовчуванням. + label: "Атрибути й опис" + caption: Усі атрибути, наявні в поточній конфігурації форми, що використовують шаблон за замовчуванням. template_contract: - label: Договір + label: "Договір" caption: Деталі пакета робіт відформатовано в типовій для Німеччини формі договору. dialog: title: Згенерувати PDF submit: Завантажити templates: - label: Шаблон - none_enabled: Для цього типу пакета робіт не ввімкнено шаблон + label: "Шаблон" + none_enabled: "Для цього типу пакета робіт не ввімкнено шаблон" footer_center: label: Текст нижнього колонтитула caption: Цей текст з’явиться на кожній сторінці в центрі нижнього колонтитула. footer_right: label: Текст нижнього колонтитула - caption: Цей текст з’явиться на кожній сторінці в правій частині нижнього - колонтитула. + caption: Цей текст з’явиться на кожній сторінці в правій частині нижнього колонтитула. hyphenation: label: Перенесення caption: Розрив між словами для покращення розташування й вирівнювання. @@ -3697,1318 +3141,1200 @@ uk: landscape: Альбомна extraction: available: - pdftotext: Доступний текст PDF (необов'язково) - unrtf: Unrtf доступний (необов'язково) - catdoc: Документ Cat доступний (необов'язково) - xls2csv: Xls 2csv доступно (необов'язково) - catppt: Catppt доступний (необов'язково) - tesseract: Tesseract доступний (необов'язково) + pdftotext: "Доступний текст PDF (необов'язково)" + unrtf: "Unrtf доступний (необов'язково)" + catdoc: "Документ Cat доступний (необов'язково)" + xls2csv: "Xls 2csv доступно (необов'язково)" + catppt: "Catppt доступний (необов'язково)" + tesseract: "Tesseract доступний (необов'язково)" filterable_tree_view: filter_mode: - all: Усі - label: Режим фільтрації - selected: Вибрано - include_sub_items: Включити піделементи - no_results_text: Немає результатів + all: "Усі" + label: "Режим фільтрації" + selected: "Вибрано" + include_sub_items: "Включити піделементи" + no_results_text: "Немає результатів" toggle_switch: - label_on: Увімкнено - label_off: Вимкнено + label_on: "Увімкнено" + label_off: "Вимкнено" general_csv_decimal_separator: "." - general_csv_encoding: UTF-8 + general_csv_encoding: "UTF-8" general_csv_separator: "," - general_first_day_of_week: '7' - general_pdf_encoding: ISO-8859-1 - general_text_no: ні - general_text_yes: так - general_text_No: Ні - general_text_Yes: Так - general_text_true: вірно - general_text_false: хибне значення - gui_validation_error: 1 помилка + general_first_day_of_week: "7" + general_pdf_encoding: "ISO-8859-1" + general_text_no: "ні" + general_text_yes: "так" + general_text_No: "Ні" + general_text_Yes: "Так" + general_text_true: "вірно" + general_text_false: "хибне значення" + gui_validation_error: "1 помилка" gui_validation_error_plural: "%{count} помилок" homescreen: additional: - projects: Нові видимі проекти в цьому екземплярі. - no_visible_projects: У цьому випадку немає видимих проектів. - users: Нові зареєстровані користувачі в цьому екземплярі. + projects: "Нові видимі проекти в цьому екземплярі." + no_visible_projects: "У цьому випадку немає видимих проектів." + users: "Нові зареєстровані користувачі в цьому екземплярі." blocks: - community: Спільнота OpenProject + community: "Спільнота OpenProject" upsell: - title: Оновлення до версії Enterprise + title: "Оновлення до версії Enterprise" new_features: - header: Читайте про нові функції і оновлення продуктів. - learn_about: Дізнайтеся більше про всі нові функції - missing: Ще немає виділених функцій. - '17_2': - new_features_title: 'The release contains various new features and improvements, - such as: - - ' + header: "Читайте про нові функції і оновлення продуктів." + learn_about: "Дізнайтеся більше про всі нові функції" + missing: "Ще немає виділених функцій." + #We need to include the version to invalidate outdated translations in other locales + "17_2": + new_features_title: > + Випуск включає різноманітні нові функції і покращення, такі як: new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved - accessibility - line_2: 'Meetings: Meeting templates (Basic plan and higher)' - line_3: Більша прозорість завдяки коментарям до атрибутів проєктів. - line_4: PDF export enhancements - line_5: Increased security for external links (Premium plan and higher) + line_0: Робочі процеси на основі ШІ із захищеним MCP-сервером (починаючи з тарифного плану Professional) + line_1: Удосконалена домашня сторінка проєкту з новим віджетом для бюджетів і покращеною доступністю + line_2: "Наради: шаблони нарад (починаючи з тарифного плану Basic)" + line_3: Більша прозорість завдяки коментарям до атрибутів проєктів + line_4: Удосконалена функція експорту у форматі PDF + line_5: Кращий захист при роботі із зовнішніми посиланнями (починаючи з тарифного плану Premium) line_6: Покращення UI/UX у модулі беклогів - line_7: Harmonized custom field forms + line_7: Уніфіковані форми з користувацькими полями links: - upgrade_enterprise_edition: Оновлення до версії Enterprise - postgres_migration: Міграція інсталяції в PostgreSQL - user_guides: Посібники користувача - faq: ЧаПи - impressum: Юридична інформація - glossary: Глосарій - shortcuts: Ярлики - blog: Openproject блог - forums: Форум спільноти - security_alerts: Сповіщення системи безпеки - newsletter: Інформаційний лист + upgrade_enterprise_edition: "Оновлення до версії Enterprise" + postgres_migration: "Міграція інсталяції в PostgreSQL" + user_guides: "Посібники користувача" + faq: "ЧаПи" + impressum: "Юридична інформація" + glossary: "Глосарій" + shortcuts: "Ярлики" + blog: "Openproject блог" + forums: "Форум спільноти" + security_alerts: "Сповіщення системи безпеки" + newsletter: "Інформаційний лист" image_conversion: - imagemagick: Imagemagick + imagemagick: "Imagemagick" journals: - changes_retracted: Зміни було відхилено. + changes_retracted: "Зміни було відхилено." caused_changes: - budget_deleted: Budget has been deleted - dates_changed: Дати змінено - default_attribute_written: Атрибути лише для читання записано - import: Імпортовано - progress_mode_changed_to_status_based: Обчислення прогресу оновлено - status_changed: Статус «%{status_name}» - system_update: Оновлення системи OpenProject - work_package_duplicate_closed: 'Дублікат пакета робіт оновлено:' - total_percent_complete_mode_changed_to_work_weighted_average: Під час обчислення - підсумків атрибута «% завершення» тепер враховується значення атрибута «Робота». - total_percent_complete_mode_changed_to_simple_average: Обчислення підсумків - атрибута «% завершення» тепер ґрунтується на середньому арифметичному значень - лише атрибута «% завершення». + budget_deleted: "Бюджет видалено" + dates_changed: "Дати змінено" + default_attribute_written: "Атрибути лише для читання записано" + import: "Імпортовано" + progress_mode_changed_to_status_based: "Обчислення прогресу оновлено" + status_changed: "Статус «%{status_name}»" + system_update: "Оновлення системи OpenProject" + work_package_duplicate_closed: "Дублікат пакета робіт оновлено:" + total_percent_complete_mode_changed_to_work_weighted_average: "Під час обчислення підсумків атрибута «% завершення» тепер враховується значення атрибута «Робота»." + total_percent_complete_mode_changed_to_simple_average: "Обчислення підсумків атрибута «% завершення» тепер ґрунтується на середньому арифметичному значень лише атрибута «% завершення»." cause_descriptions: import: - header: changes by %{author} - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" - field_updated: "%{field} updated" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" - set_with_diff: "%{field} set (%{link})" - work_package_predecessor_changed_times: внесенням змін у попередній елемент - %{link} + header: "зміни вніс (внесла) %{author}" + field_changed: "Значення в полі «%{field}» змінено з «%{old_value}» на «%{new_value}»" + field_set: "Для поля «%{field}» вибрано значення «%{value}»" + field_removed: "Поле «%{field}» видалено" + field_updated: "Поле «%{field}» оновлено" + deleted_with_diff: "Поле «%{field}» видалено (%{link})" + changed_with_diff: "Поле «%{field}» змінено (%{link})" + set_with_diff: "Поле «%{field}» налаштовано (%{link})" + work_package_predecessor_changed_times: внесенням змін у попередній елемент %{link} work_package_parent_changed_times: внесенням змін у батькіський елемент %{link} work_package_children_changed_times: внесенням змін у дочірній елемент %{link} work_package_related_changed_times: внесенням змін у пов’язаний елемент %{link} - work_package_duplicate_closed: Статус автоматично оновлено на основі дубліката - пакета робіт %{link} + work_package_duplicate_closed: Статус автоматично оновлено на основі дубліката пакета робіт %{link} unaccessable_work_package_changed: внесенням змін у пов’язаний пакет робіт - budget_deleted: Budget has been deleted + budget_deleted: Бюджет видалено working_days_changed: - changed: внесенням змін у робочі дні (%{changes}) + changed: "внесенням змін у робочі дні (%{changes})" days: working: "%{day} зараз робочий" non_working: "%{day} зараз неробочий" dates: working: "%{date} – зараз робочий день" non_working: "%{date} – зараз неробочий день" - progress_mode_changed_to_status_based: Установлено режим обчислення прогресу - на основі статусу - status_excluded_from_totals_set_to_false_message: тепер включено в підсумки - ієрархії - status_excluded_from_totals_set_to_true_message: тепер виключено з підсумків - ієрархії + progress_mode_changed_to_status_based: Установлено режим обчислення прогресу на основі статусу + status_excluded_from_totals_set_to_false_message: тепер включено в підсумки ієрархії + status_excluded_from_totals_set_to_true_message: тепер виключено з підсумків ієрархії status_percent_complete_changed: "% Повністю змінено з %{old_value}% на %{new_value}%" system_update: - file_links_journal: 'Тепер дії, пов’язані з посиланнями на файли (файли, що - зберігаються в зовнішніх сховищах), з’являтимуться на вкладці «Активність». - Наявні дії, пов’язані із посиланнями: - - ' - progress_calculation_adjusted_from_disabled_mode: Обчислення прогресу автоматично - переведено в режим на основі робіт, - і його результати скориговано відповідно до оновленої версії. - progress_calculation_adjusted: Результати обчислення прогресу автоматично - скориговано відповідно до оновленої версії. - scheduling_mode_adjusted: Режим планування автоматично змінюється з оновленням - версії. - totals_removed_from_childless_work_packages: Результати обчислення обсягу - й прогресу виконання роботи автоматично вилучено з небатьківських пакетів - робіт з оновленням версії. Це завдання - з технічного обслуговування, і його можна ігнорувати. - total_percent_complete_mode_changed_to_work_weighted_average: Дочірні пакети - робіт без атрибута «Робота» ігноруються. - total_percent_complete_mode_changed_to_simple_average: Значення атрибута «Робота» - дочірніх пакетів робіт ігноруються. + file_links_journal: > + Тепер дії, пов’язані з посиланнями на файли (файли, що зберігаються в зовнішніх сховищах), з’являтимуться на вкладці «Активність». Наявні дії, пов’язані із посиланнями: + progress_calculation_adjusted_from_disabled_mode: >- + Обчислення прогресу автоматично переведено в режим на основі робіт, і його результати скориговано відповідно до оновленої версії. + progress_calculation_adjusted: >- + Результати обчислення прогресу автоматично скориговано відповідно до оновленої версії. + scheduling_mode_adjusted: >- + Режим планування автоматично змінюється з оновленням версії. + totals_removed_from_childless_work_packages: >- + Результати обчислення обсягу й прогресу виконання роботи автоматично вилучено з небатьківських пакетів робіт з оновленням версії. Це завдання з технічного обслуговування, і його можна ігнорувати. + total_percent_complete_mode_changed_to_work_weighted_average: >- + Дочірні пакети робіт без атрибута «Робота» ігноруються. + total_percent_complete_mode_changed_to_simple_average: >- + Значення атрибута «Робота» дочірніх пакетів робіт ігноруються. links: - configuration_guide: Посібник з налаштування - get_in_touch: У вас виникли запитання? Зв'яжіться з нами. - instructions_after_registration: Ви можете ввійти, як тільки ваш обліковий запис - активується, натиснувши %{signin}. - instructions_after_logout: Ви можете ввійти знову, натиснувши %{signin}. - instructions_after_error: Ви можете спробувати ввійти знову, натиснувши %{signin}. - Якщо помилка не зникне, зверніться до адміністратора за допомогою. + configuration_guide: "Посібник з налаштування" + get_in_touch: "У вас виникли запитання? Зв'яжіться з нами." + instructions_after_registration: "Ви можете ввійти, як тільки ваш обліковий запис активується, натиснувши %{signin}." + instructions_after_logout: "Ви можете ввійти знову, натиснувши %{signin}." + instructions_after_error: "Ви можете спробувати ввійти знову, натиснувши %{signin}. Якщо помилка не зникне, зверніться до адміністратора за допомогою." menus: admin: - ai: Штучний інтелект (ШІ) - aggregation: Агрегація - api_and_webhooks: API та вебгуки - mail_notification: Email сповіщення - mails_and_notifications: Електронні листи й сповіщення - mcp_configurations: Model Context Protocol (MCP) + ai: "Штучний інтелект (ШІ)" + aggregation: "Агрегація" + api_and_webhooks: "API та вебгуки" + mail_notification: "Email сповіщення" + mails_and_notifications: "Електронні листи й сповіщення" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: - label: Додати… + label: "Додати…" my_account: access_tokens: - description: Маркери постачальника послуг випускаються в OpenProject, що дає - змогу іншим додаткам отримувати до них доступ. Клієнтські маркери випускаються - іншими додатками, що дає змогу OpenProject отримати до них доступ. + description: "Маркери постачальника послуг випускаються в OpenProject, що дає змогу іншим додаткам отримувати до них доступ. Клієнтські маркери випускаються іншими додатками, що дає змогу OpenProject отримати до них доступ." no_results: - title: Немає маркерів доступу для відображення - description: Всі вони були відключені. Їх можна повторно ввімкнути в меню - адміністрування. - access_tokens: Маркери доступу + title: "Немає маркерів доступу для відображення" + description: "Всі вони були відключені. Їх можна повторно ввімкнути в меню адміністрування." + access_tokens: "Маркери доступу" headers: - action: Дія - expiration: Закінчується - indefinite_expiration: Ніколи - simple_revoke_confirmation: Справі відкликати цей маркер? + action: "Дія" + expiration: "Закінчується" + indefinite_expiration: "Ніколи" + simple_revoke_confirmation: "Справі відкликати цей маркер?" tabs: client: - title: Клієнтські маркери + title: "Клієнтські маркери" provider: - title: Маркери постачальника послуг + title: "Маркери постачальника послуг" token/api: - blank_description: У вас ще немає маркера API. Щоб створити його, натисніть - кнопку нижче. - blank_title: Немає маркера API - title: API - table_title: Маркери API - text_hint: Маркери API дають змогу стороннім додаткам обмінюватися даними - із цим екземпляром OpenProject через інтерфейси REST API. - static_token_name: Маркер API - disabled_text: Маркери API не дозволено адміністратором. Зверніться до нього, - якщо вам потрібна ця функція. - add_button: Маркер API + blank_description: "У вас ще немає маркера API. Щоб створити його, натисніть кнопку нижче." + blank_title: "Немає маркера API" + title: "API" + table_title: "Маркери API" + text_hint: "Маркери API дають змогу стороннім додаткам обмінюватися даними із цим екземпляром OpenProject через інтерфейси REST API." + static_token_name: "Маркер API" + disabled_text: "Маркери API не дозволено адміністратором. Зверніться до нього, якщо вам потрібна ця функція." + add_button: "Маркер API" ical: - blank_description: Щоб додати маркер iCalendar, підпишіться на новий або наявний - календар у модулі календаря проєкту. У вас мають бути необхідні дозволи. - blank_title: Немає маркера iCalendar - title: iCalendar - table_title: Маркери iCalendar - text_hint_link: Маркери iCalendar дають змогу користувачам [підписуватися - на календарі OpenProject](docs_url) і переглядати актуальну інформацію про - пакети робіт у зовнішніх клієнтах. - disabled_text: Підписки на iCalendar не дозволено адміністратором. Зверніться - до нього, якщо вам потрібна ця функція. + blank_description: "Щоб додати маркер iCalendar, підпишіться на новий або наявний календар у модулі календаря проєкту. У вас мають бути необхідні дозволи." + blank_title: "Немає маркера iCalendar" + title: "iCalendar" + table_title: "Маркери iCalendar" + text_hint_link: "Маркери iCalendar дають змогу користувачам [підписуватися на календарі OpenProject](docs_url) і переглядати актуальну інформацію про пакети робіт у зовнішніх клієнтах." + disabled_text: "Підписки на iCalendar не дозволено адміністратором. Зверніться до нього, якщо вам потрібна ця функція." oauth_application: - active_tokens: Активні маркери - blank_description: Для вас не налаштовано й не активовано доступ до сторонніх - додатків. - blank_title: Немає маркера додатка OAuth - last_refreshed_at: Last refreshed at - title: OAuth - table_title: Маркери додатків OAuth - text_hint: Маркери додатків OAuth дають змогу стороннім додаткам обмінюватися - даними із цим екземпляром OpenProject. + active_tokens: "Активні маркери" + blank_description: "Для вас не налаштовано й не активовано доступ до сторонніх додатків." + blank_title: "Немає маркера додатка OAuth" + last_refreshed_at: "Востаннє оновлено о" + title: "OAuth" + table_title: "Маркери додатків OAuth" + text_hint: "Маркери додатків OAuth дають змогу стороннім додаткам обмінюватися даними із цим екземпляром OpenProject." oauth_client: - blank_description: Клієнтських маркерів OAuth ще не існує. - blank_title: Немає клієнтських маркерів OAuth - failed: Сталася помилка й не вдалося вилучити маркер. Повторіть спробу пізніше. - integration_type: Тип інтеграції - table_title: Клієнтські маркери OAuth - text_hint: Клієнтські маркери OAuth дають змогу цьому екземпляру OpenProject - підключатися до зовнішніх додатків, таких як файлові сховища. - title: OAuth - remove_token: Справді вилучити цей маркер? Вам потрібно буде знову ввійти - в %{integration}. - removed: Клієнтський маркер OAuth успішно вилучено - unknown_integration: Невідомо + blank_description: "Клієнтських маркерів OAuth ще не існує." + blank_title: "Немає клієнтських маркерів OAuth" + failed: "Сталася помилка й не вдалося вилучити маркер. Повторіть спробу пізніше." + integration_type: "Тип інтеграції" + table_title: "Клієнтські маркери OAuth" + text_hint: "Клієнтські маркери OAuth дають змогу цьому екземпляру OpenProject підключатися до зовнішніх додатків, таких як файлові сховища." + title: "OAuth" + remove_token: "Справді вилучити цей маркер? Вам потрібно буде знову ввійти в %{integration}." + removed: "Клієнтський маркер OAuth успішно вилучено" + unknown_integration: "Невідомо" token/rss: - add_button: Маркер RSS - blank_description: У вас ще немає маркера API. Ви можете створити його за - допомогою кнопки нижче. - blank_title: Немає маркера API - title: RSS - table_title: Маркери RSS - text_hint: Маркери RSS дають змогу користувачам зберігати останні зміни в - цьому екземплярі OpenProject через зовнішній RSS-агрегатор. - static_token_name: Маркер RSS - disabled_text: Маркери API не ввімкнено адміністратором. Зверніться до нього, - якщо вам потрібна ця функція. + add_button: "Маркер RSS" + blank_description: "У вас ще немає маркера API. Ви можете створити його за допомогою кнопки нижче." + blank_title: "Немає маркера API" + title: "RSS" + table_title: "Маркери RSS" + text_hint: "Маркери RSS дають змогу користувачам зберігати останні зміни в цьому екземплярі OpenProject через зовнішній RSS-агрегатор." + static_token_name: "Маркер RSS" + disabled_text: "Маркери API не ввімкнено адміністратором. Зверніться до нього, якщо вам потрібна ця функція." storages: - unknown_storage: Невідоме сховище + unknown_storage: "Невідоме сховище" notifications: reasons: - assigned: Виконавець - dateAlert: Оповіщення про дату - mentioned: Згадано - responsible: Відповідальний - shared: У спільному доступі - watched: Спостерігач - reminder: Нагадування + assigned: "Виконавець" + dateAlert: "Оповіщення про дату" + mentioned: "Згадано" + responsible: "Відповідальний" + shared: "У спільному доступі" + watched: "Спостерігач" + reminder: "Нагадування" facets: - unread: Непрочитані - unread_title: Показати непрочитані - all: Усі - all_title: Показати всі + unread: "Непрочитані" + unread_title: "Показати непрочитані" + all: "Усі" + all_title: "Показати всі" menu: - by_project: Непрочитані за проєктом - by_reason: Причина - inbox: Вхідні - send_notifications: Надсилати сповіщення щодо цієї дії + by_project: "Непрочитані за проєктом" + by_reason: "Причина" + inbox: "Вхідні" + send_notifications: "Надсилати сповіщення щодо цієї дії" work_packages: subject: - created: Робочий блок було створено. - assigned: Ви були назначені до %{work_package} - subscribed: Ви підписалися на %{work_package} - mentioned: Вас було згадано у %{work_package} - responsible: Ви стали відповідальними за %{work_package} - watched: Ви переглядаєте %{work_package} + created: "Робочий блок було створено." + assigned: "Ви були назначені до %{work_package}" + subscribed: "Ви підписалися на %{work_package}" + mentioned: "Вас було згадано у %{work_package}" + responsible: "Ви стали відповідальними за %{work_package}" + watched: "Ви переглядаєте %{work_package}" query: - invalid_filter: Недійсний фільтр сповіщень - label_accessibility: Розробникам також потрібно оплачувати свої рахунки. З доступністю - label_account: Обліковий запис - label_active: Активні - label_activate_user: Активні користувачі - label_active_in_new_projects: Активна участь в нових проектах - label_activity: Активність - label_add_edit_translations: Додайте та редагуйте переклади - label_add_another_file: Додати ще один файл - label_add_columns: Додати вибрані стовпці - label_add_note: Додати зауваження - label_add_projects: Додати проєкти - label_add_related_work_packages: Додати відповідні робочі пакети - label_add_subtask: Додати підзавдання - label_added: додано - label_added_by: 'Автор: %{author}' - label_added_by_on: Додав(-ла) %{author} %{date} - label_added_time_by: Доданий %{author} %{age} назад - label_additional_workflow_transitions_for_assignee: Додаткові переходи можна коли - користувач є правонаступником - label_additional_workflow_transitions_for_author: Додаткові переходи дозволені користувачу, - який є автором - label_administration: Адміністрування - label_interface_colors: Кольори інтерфейсу - label_interface_colors_description: 'Ці кольори визначають зовнішній вигляд застосунку. - Якщо ви зміните їх, тему буде автоматично змінено на користувацьку тему, але ми - не можемо гарантувати дотримання доступності мінімального контрасту (WCAG 2.1). ' - label_age: Вік - label_ago: днів тому - label_all: всі - label_all_time: весь час - label_all_words: Всі слова - label_all_open_wps: Всі відкрити - label_always_visible: Завжди відображається - label_announcement: Оголошення - label_angular: AngularJS - label_app_modules: "%{app_title} modules" - label_api_access_key: Ключ доступу до API - label_api_access_key_created_on: Ключ доступу до API створено %{value} тому - label_api_access_key_type: API + invalid_filter: "Недійсний фільтр сповіщень" + label_accessibility: "Розробникам також потрібно оплачувати свої рахунки. З доступністю" + label_account: "Обліковий запис" + label_active: "Активні" + label_activate_user: "Активні користувачі" + label_active_in_new_projects: "Активна участь в нових проектах" + label_activity: "Активність" + label_add_edit_translations: "Додайте та редагуйте переклади" + label_add_another_file: "Додати ще один файл" + label_add_columns: "Додати вибрані стовпці" + label_add_note: "Додати зауваження" + label_add_projects: "Додати проєкти" + label_add_related_work_packages: "Додати відповідні робочі пакети" + label_add_subtask: "Додати підзавдання" + label_added: "додано" + label_added_by: "Автор: %{author}" + label_added_by_on: "Додав(-ла) %{author} %{date}" + label_added_time_by: "Доданий %{author} %{age} назад" + label_additional_workflow_transitions_for_assignee: "Додаткові переходи можна коли користувач є правонаступником" + label_additional_workflow_transitions_for_author: "Додаткові переходи дозволені користувачу, який є автором" + label_administration: "Адміністрування" + label_interface_colors: "Кольори інтерфейсу" + label_interface_colors_description: "Ці кольори визначають зовнішній вигляд застосунку. Якщо ви зміните їх, тему буде автоматично змінено на користувацьку тему, але ми не можемо гарантувати дотримання доступності мінімального контрасту (WCAG 2.1). " + label_age: "Вік" + label_ago: "днів тому" + label_all: "всі" + label_all_time: "весь час" + label_all_words: "Всі слова" + label_all_open_wps: "Всі відкрити" + label_always_visible: "Завжди відображається" + label_announcement: "Оголошення" + label_angular: "AngularJS" + label_app_modules: "Модулі %{app_title}" + label_api_access_key: "Ключ доступу до API" + label_api_access_key_created_on: "Ключ доступу до API створено %{value} тому" + label_api_access_key_type: "API" label_auto_option: "(автоматично)" - label_ical_access_key_type: iCalendar - label_ical_access_key_description: Маркер iCalendar «%{token_name}» для календаря - «%{calendar_name}» у проєкті «%{project_name}» - label_ical_access_key_not_present: Немає маркерів iCalendar. - label_ical_access_key_generation_hint: Автоматично створено під час оформлення підписки - на календар. - label_ical_access_key_latest: останні - label_ical_access_key_revoke: Анулювати - label_add_column: Додати стовпець - label_applied_status: Застосовний статус - label_archive_project: Архівний проект - label_ascending: За зростанням - label_assigned_to_me_work_packages: Робочі пакети призначені мені - label_associated_revisions: Пов'язані редакції - label_attachment_plural: Вкладення - label_attribute: Атрибут - label_attribute_plural: Атрибути - label_ldap_auth_source_new: Нове LDAP-підключення - label_ldap_auth_source: LDAP-підключення - label_ldap_auth_source_plural: LDAP-підключення - label_attribute_expand_text: Повний текст для атрибута «%{attribute}» - label_authentication: Автентифікація - label_available_custom_fields_projects: Доступні проєкти з користувацькими полями - label_available_global_roles: Доступні глобальні ролі - label_available_project_attributes: Доступні атрибути проєкту - label_available_project_forums: Доступні форуми - label_available_project_repositories: Доступні сховища - label_available_project_versions: Доступні версії - label_available_project_work_package_categories: Доступні категорії робочих пакетів - label_available_project_work_package_types: Доступні типи пакетів робіт - label_available_projects: Доступні проєкти - label_api_doc: Документація API - label_backup: Резервна копія - label_backup_code: Код резервної копії - label_basic_details: Основна інформація - label_between: між ними - label_blocked_by: заблоковано - label_blocks: блоки - label_blog: Блог - label_forums_locked: Заблоковані - label_forum_new: Новий форум - label_forum_plural: Форуми - label_forum_sticky: Приліплена - label_boolean: Логічний тип - label_board_plural: Дошки - label_branch: Гілка - label_browse: Огляд - label_builtin: Вбудовано - label_bulk_edit_selected_work_packages: Масове редагування вибраних робочих пакетів + label_ical_access_key_type: "iCalendar" + label_ical_access_key_description: 'Маркер iCalendar «%{token_name}» для календаря «%{calendar_name}» у проєкті «%{project_name}»' + label_ical_access_key_not_present: "Немає маркерів iCalendar." + label_ical_access_key_generation_hint: "Автоматично створено під час оформлення підписки на календар." + label_ical_access_key_latest: "останні" + label_ical_access_key_revoke: "Анулювати" + label_add_column: "Додати стовпець" + label_applied_status: "Застосовний статус" + label_archive_project: "Архівний проект" + label_ascending: "За зростанням" + label_assigned_to_me_work_packages: "Робочі пакети призначені мені" + label_associated_revisions: "Пов'язані редакції" + label_attachment_plural: "Вкладення" + label_attribute: "Атрибут" + label_attribute_plural: "Атрибути" + label_ldap_auth_source_new: "Нове LDAP-підключення" + label_ldap_auth_source: "LDAP-підключення" + label_ldap_auth_source_plural: "LDAP-підключення" + label_attribute_expand_text: "Повний текст для атрибута «%{attribute}»" + label_authentication: "Автентифікація" + label_available_custom_fields_projects: "Доступні проєкти з користувацькими полями" + label_available_global_roles: "Доступні глобальні ролі" + label_available_project_attributes: "Доступні атрибути проєкту" + label_available_project_forums: "Доступні форуми" + label_available_project_repositories: "Доступні сховища" + label_available_project_versions: "Доступні версії" + label_available_project_work_package_categories: "Доступні категорії робочих пакетів" + label_available_project_work_package_types: "Доступні типи пакетів робіт" + label_available_projects: "Доступні проєкти" + label_api_doc: "Документація API" + label_backup: "Резервна копія" + label_backup_code: "Код резервної копії" + label_basic_details: "Основна інформація" + label_between: "між ними" + label_blocked_by: "заблоковано" + label_blocks: "блоки" + label_blog: "Блог" + label_forums_locked: "Заблоковані" + label_forum_new: "Новий форум" + label_forum_plural: "Форуми" + label_forum_sticky: "Приліплена" + label_boolean: "Логічний тип" + label_board_plural: "Дошки" + label_branch: "Гілка" + label_browse: "Огляд" + label_builtin: "Вбудовано" + label_bulk_edit_selected_work_packages: "Масове редагування вибраних робочих пакетів" label_bundled: "(В комплекті)" - label_calendar: Календар - label_calendars_and_dates: Календарі й дати - label_calendar_show: Показати календар - label_category: Категорія + label_calendar: "Календар" + label_calendars_and_dates: "Календарі й дати" + label_calendar_show: "Показати календар" + label_category: "Категорія" label_completed: Завершено - label_consent_settings: Згода користувача + label_consent_settings: "Згода користувача" label_wiki_menu_item: Пункт меню Wiki label_select_main_menu_item: Виберіть новий пункт головного меню - label_required_disk_storage: Необхідне місце на диску + label_required_disk_storage: "Необхідне місце на диску" label_send_invitation: Надіслати запрошення - label_calculated_value: Розраховане значення - label_change_parent: Змінити батьківський об’єкт - label_change_plural: Зміни - label_change_properties: Змінити властивості - label_change_status: Змінити статус - label_change_status_of_user: 'Змінити статус #{username}' - label_change_view_all: Проглянути всі зміни - label_changes_details: Подробиці по всіх змінах - label_changeset: Набір змін - label_changeset_id: ID набору змін - label_changeset_plural: Набір змін - label_checked: перевірено - label_check_uncheck_all_in_column: Позначте/зніміть всі прапорці в колонці - label_check_uncheck_all_in_row: Позначте/зніміть всі прапорці в рядку - label_child_element: Дочірній елемент - label_choices: Варіанти вибору - label_close_versions: Закрити завершені версії - label_closed_work_packages: зачинено - label_collapse: Згорнути - label_collapsed_click_to_show: Згорнуто. Натисніть, щоб показати + label_calculated_value: "Розраховане значення" + label_change_parent: "Змінити батьківський об’єкт" + label_change_plural: "Зміни" + label_change_properties: "Змінити властивості" + label_change_status: "Змінити статус" + label_change_status_of_user: "Змінити статус #{username}" + label_change_view_all: "Проглянути всі зміни" + label_changes_details: "Подробиці по всіх змінах" + label_changeset: "Набір змін" + label_changeset_id: "ID набору змін" + label_changeset_plural: "Набір змін" + label_checked: "перевірено" + label_check_uncheck_all_in_column: "Позначте/зніміть всі прапорці в колонці" + label_check_uncheck_all_in_row: "Позначте/зніміть всі прапорці в рядку" + label_child_element: "Дочірній елемент" + label_choices: "Варіанти вибору" + label_close_versions: "Закрити завершені версії" + label_closed_work_packages: "зачинено" + label_collapse: "Згорнути" + label_collapsed_click_to_show: "Згорнуто. Натисніть, щоб показати" label_configuration: конфігурація - label_comment_add: Додати коментар - label_comment_added: Коментар додано - label_comment_delete: Видалити коментарі - label_comment_plural: Коментарі - label_commits_per_author: Комітів на автора - label_commits_per_month: Комітів на місяць - label_confirmation: Підтвердження - label_contains: містить - label_content: Контент - label_color_plural: Кольори - label_copied: скопійовано - label_copy_same_as_target: Те ж, що і для цілі - label_copy_source: Джерело - label_copy_target: Ціль - label_copy_workflow_from: Копіювати робочий процес з - label_copy_project: Копіювати проект - label_core_version: Версія ядра - label_core_build: Збірка ядра - label_created_by: Створено %{user} - label_current_status: Поточний статус - label_current_version: Поточна версія - label_custom_field_add_no_type: Додайте це поле до типу робочого пакета - label_custom_field_new: Нове спеціальне поле - label_custom_field_plural: Індивідуальні поля - label_custom_field_default_type: Порожній тип - label_custom_style: Дизайн - label_custom_style_description: Виберіть, як OpenProject виглядає для вас із темами, - виберіть ваші кольори за замовчуванням для використання в застосунку та як виглядатимуть - експорти. - label_dashboard: Панель керування - label_database_version: Версія PostgreSQL - label_date: Дата - label_dates: Дати - label_date_and_time: Дата і час - label_date_format: 'Формат дати:' - label_date_from: Від - label_date_from_to: З %{start} по %{end} - label_date_to: 'Кому:' - label_day_plural: днів - label_default: За замовчуванням - label_delete_user: Видалити користувача - label_delete_project: Видалити проект - label_delete: Видалити - label_deleted: 'вилучено ' + label_comment_add: "Додати коментар" + label_comment_added: "Коментар додано" + label_comment_delete: "Видалити коментарі" + label_comment_plural: "Коментарі" + label_commits_per_author: "Комітів на автора" + label_commits_per_month: "Комітів на місяць" + label_confirmation: "Підтвердження" + label_contains: "містить" + label_content: "Контент" + label_color_plural: "Кольори" + label_copied: "скопійовано" + label_copy_same_as_target: "Те ж, що і для цілі" + label_copy_source: "Джерело" + label_copy_target: "Ціль" + label_copy_workflow_from: "Копіювати робочий процес з" + label_copy_project: "Копіювати проект" + label_core_version: "Версія ядра" + label_core_build: "Збірка ядра" + label_created_by: "Створено %{user}" + label_current_status: "Поточний статус" + label_current_version: "Поточна версія" + label_custom_field_add_no_type: "Додайте це поле до типу робочого пакета" + label_custom_field_new: "Нове спеціальне поле" + label_custom_field_plural: "Індивідуальні поля" + label_custom_field_default_type: "Порожній тип" + label_custom_style: "Дизайн" + label_custom_style_description: "Виберіть, як OpenProject виглядає для вас із темами, виберіть ваші кольори за замовчуванням для використання в застосунку та як виглядатимуть експорти." + label_dashboard: "Панель керування" + label_database_version: "Версія PostgreSQL" + label_date: "Дата" + label_dates: "Дати" + label_date_and_time: "Дата і час" + label_date_format: "Формат дати:" + label_date_from: "Від" + label_date_from_to: "З %{start} по %{end}" + label_date_to: "Кому:" + label_day_plural: "днів" + label_default: "За замовчуванням" + label_delete_user: "Видалити користувача" + label_delete_project: "Видалити проект" + label_delete: "Видалити" + label_deleted: "вилучено " label_deleted_custom_field: "(видалено спеціальне поле)" label_deleted_custom_item: "(видалений елемент)" label_deleted_custom_option: "(параметр видалення)" label_empty_element: "(пусто)" - label_go_back: Повернутися на попередній рівень меню - label_go_forward: Відкрити підменю %{module} - label_missing_or_hidden_custom_option: "(відсутнє значення або бракує дозволів для - доступу)" - label_descending: За спаданням - label_details: Детальніше - label_defaults: Значення за замовчуванням - label_development_roadmap: Розробка дорожньої карти - label_diff: різниця - label_diff_inline: підключений - label_diff_side_by_side: поряд - label_digital_accessibility: Цифрова доступність (ЦД) - label_disabled: Вимкнено - label_disabled_uppercase: Вимкнено - label_display: Дисплей - label_display_per_page: 'На сторінку: %{value}' - label_display_used_statuses_only: Відображати тільки ті статуси, які використовуються - в цьому трекері + label_go_back: "Повернутися на попередній рівень меню" + label_go_forward: "Відкрити підменю %{module}" + label_missing_or_hidden_custom_option: "(відсутнє значення або бракує дозволів для доступу)" + label_descending: "За спаданням" + label_details: "Детальніше" + label_defaults: "Значення за замовчуванням" + label_development_roadmap: "Розробка дорожньої карти" + label_diff: "різниця" + label_diff_inline: "підключений" + label_diff_side_by_side: "поряд" + label_digital_accessibility: "Цифрова доступність (ЦД)" + label_disabled: "Вимкнено" + label_disabled_uppercase: "Вимкнено" + label_display: "Дисплей" + label_display_per_page: "На сторінку: %{value}" + label_display_used_statuses_only: "Відображати тільки ті статуси, які використовуються в цьому трекері" label_download: "%{count} Завантажити" label_download_plural: "%{count} Завантажити" - label_downloads_abbr: Завантажень - label_duplicated_by: Дублюється - label_duplicate: Дублювати - label_duplicates: Дублікати - label_edit: Редагувати - label_edit_x: 'Редагувати: %{x}' - label_view_x: 'View: %{x}' - label_enable_multi_select: Перемкнути мультиселекцію - label_enabled_project_custom_fields: Увімкнено спеціальні поля - label_enabled_project_modules: Включені модулі - label_enabled_project_activities: Увімкнено функцію відстеження часу - label_end_to_end: кінець в кінець - label_end_to_start: до початку - label_enumeration_new: Нове значення перерахунку - label_enumeration_value: Значення перерахування - label_enumerations: Перерахування - label_enterprise: Enterprise + label_downloads_abbr: "Завантажень" + label_duplicated_by: "Дублюється" + label_duplicate: "Дублювати" + label_duplicates: "Дублікати" + label_edit: "Редагувати" + label_edit_x: "Редагувати: %{x}" + label_view_x: "Переглянути: %{x}" + label_enable_multi_select: "Перемкнути мультиселекцію" + label_enabled_project_custom_fields: "Увімкнено спеціальні поля" + label_enabled_project_modules: "Включені модулі" + label_enabled_project_activities: "Увімкнено функцію відстеження часу" + label_end_to_end: "кінець в кінець" + label_end_to_start: "до початку" + label_enumeration_new: "Нове значення перерахунку" + label_enumeration_value: "Значення перерахування" + label_enumerations: "Перерахування" + label_enterprise: "Enterprise" label_enterprise_active_users: "%{current}/%{limit} зареєстровано активних користувачів" - label_enterprise_edition: Версія Enterprise - label_enterprise_support: Корпоративна підтримка - label_environment: Навколишнє середовище - label_estimates_and_progress: Оцінки й прогрес виконання - label_equals: є + label_enterprise_edition: "Версія Enterprise" + label_enterprise_support: "Корпоративна підтримка" + label_environment: "Навколишнє середовище" + label_estimates_and_progress: "Оцінки й прогрес виконання" + label_equals: "є" label_equals_with_descendants: "– будь-який із нащадками" - label_everywhere: скрізь - label_example: Приклад - label_experimental: Експериментальне - label_i_am_member: Я учасник - label_ifc_viewer: Засіб перегляду Ifc - label_ifc_model_plural: Моделі Ifc - label_import: Імпортувати - label_export_to: 'Також вам доступні:' - label_expand: Розгорнути - label_expanded_click_to_collapse: Розширено. Натисніть, щоб згорнути + label_everywhere: "скрізь" + label_example: "Приклад" + label_experimental: "Експериментальне" + label_i_am_member: "Я учасник" + label_ifc_viewer: "Засіб перегляду Ifc" + label_ifc_model_plural: "Моделі Ifc" + label_import: "Імпортувати" + label_export_to: "Також вам доступні:" + label_expand: "Розгорнути" + label_expanded_click_to_collapse: "Розширено. Натисніть, щоб згорнути" label_f_hour: "%{value} година" label_f_hour_plural: "%{value} годин(и)" - label_favorite: Обрані - label_feed_plural: Канали - label_feeds_access_key: Клавіша доступу RSS - label_feeds_access_key_created_on: Створено ключ доступу RSS %{value} тому - label_feeds_access_key_type: RSS - label_file_plural: Файли - label_filter: Фільтри - label_filter_add: Додати фільтр - label_filter_by: Фільтрувати за - label_filter_any_name_attribute: Атрибути імені - label_filter_plural: Фільтри - label_filters_toggle: Показати / приховати фільтри - label_float: З плаваючою крапкою - label_folder: Папка - label_follows: слідкувати - label_force_user_language_to_default: Встановити мову користувачів, які мають не - підтримувану мову, за умовчанням - label_form_configuration: Конфігурація форми - label_formula: Формула - label_gantt_chart: Діаграма Ґанта - label_gantt_chart_plural: Діаграми Ґанта - label_general: Загальні - label_generate_key: Згенерувати ключ - label_global_modules: Глобальні модулі - label_global_roles: Глобальні ролі - label_git_path: Шлях до каталогу .git + label_favorite: "Обрані" + label_feed_plural: "Канали" + label_feeds_access_key: "Клавіша доступу RSS" + label_feeds_access_key_created_on: "Створено ключ доступу RSS %{value} тому" + label_feeds_access_key_type: "RSS" + label_file_plural: "Файли" + label_filter: "Фільтри" + label_filter_add: "Додати фільтр" + label_filter_by: "Фільтрувати за" + label_filter_any_name_attribute: "Атрибути імені" + label_filter_plural: "Фільтри" + label_filters_toggle: "Показати / приховати фільтри" + label_float: "З плаваючою крапкою" + label_folder: "Папка" + label_follows: "слідкувати" + label_force_user_language_to_default: "Встановити мову користувачів, які мають не підтримувану мову, за умовчанням" + label_form_configuration: "Конфігурація форми" + label_formula: "Формула" + label_gantt_chart: "Діаграма Ґанта" + label_gantt_chart_plural: "Діаграми Ґанта" + label_general: "Загальні" + label_generate_key: "Згенерувати ключ" + label_global_modules: "Глобальні модулі" + label_global_roles: "Глобальні ролі" + label_git_path: "Шлях до каталогу .git" label_greater_or_equal: ">=" - label_group_by: Групувати за - label_group_new: Нова група - label_group: Група - label_group_named: Група %{name} - label_group_plural: Групи - label_help: Допомога + label_group_by: "Групувати за" + label_group_new: "Нова група" + label_group: "Група" + label_group_named: "Група %{name}" + label_group_plural: "Групи" + label_help: "Допомога" label_here: тут - label_hide: Приховати - label_history: Історія - label_hierarchy: Ієрархія - label_hierarchy_leaf: Ієрархічний лист - label_home: Додому - label_subject_or_id: Тема або ідентифікатор - label_calendar_subscriptions: Підписки на календарі - label_identifier: Ідентифікатор - label_in: в - label_in_less_than: менш ніж - label_in_more_than: більше ніж - label_inactive: Неактивний - label_incoming_emails: Вхідні повідомлення - label_includes: Включити + label_hide: "Приховати" + label_history: "Історія" + label_hierarchy: "Ієрархія" + label_hierarchy_leaf: "Ієрархічний лист" + label_home: "Додому" + label_subject_or_id: "Тема або ідентифікатор" + label_calendar_subscriptions: "Підписки на календарі" + label_identifier: "Ідентифікатор" + label_in: "в" + label_in_less_than: "менш ніж" + label_in_more_than: "більше ніж" + label_inactive: "Неактивний" + label_incoming_emails: "Вхідні повідомлення" + label_includes: "Включити" label_incomplete: Не завершено label_include_sub_projects: Включити підпроєкти - label_index_by_date: Індекс за датою - label_index_by_title: Індекс за назвою - label_information: Інформація - label_information_plural: Інформація - label_installation_guides: Інструкції зі встановлення - label_integer: Ціле число - label_interface: Інтерфейс - label_internal: Власне - label_introduction_video: Відео про початок роботи - label_invite_user: Запросити користувача - label_item: Елемент - label_item_plural: Елементи - label_weighted_item_list: Список зважених елементів - label_share: Поділитися - label_share_project_list: Поділитися списком проєктів - label_share_work_package: Поділитися пакетом робіт - label_show_all_registered_users: Усі зареєстровані користувачі - label_show_less: Показати менше - label_show_more: Показати більше - label_journal: Журнал - label_journal_diff: Опис Порівняння - label_language: Мова - label_languages: Мови - label_external_links: Зовнішні посилання - label_locale: Мова й регіон - label_jump_to_a_project: Перейти до проекту... - label_jira_import: Jira Import - label_keyword_plural: Ключові слова - label_language_based: На основі мови користувача - label_last_activity: Остання активність - label_last_change_on: Остання зміна - label_last_changes: останні %{count} змін - label_last_login: Останній вхід - label_last_month: останній місяць - label_last_n_days: останні %{count} днів - label_last_week: ост. тиждень - label_latest_revision: Остання версія - label_latest_revision_plural: Останні версії - label_ldap_authentication: Авторизація за допомогою LDAP - label_learn_more: Докладніше + label_index_by_date: "Індекс за датою" + label_index_by_title: "Індекс за назвою" + label_information: "Інформація" + label_information_plural: "Інформація" + label_installation_guides: "Інструкції зі встановлення" + label_integer: "Ціле число" + label_interface: "Інтерфейс" + label_internal: "Власне" + label_introduction_video: "Відео про початок роботи" + label_invite_user: "Запросити користувача" + label_item: "Елемент" + label_item_plural: "Елементи" + label_weighted_item_list: "Список зважених елементів" + label_share: "Поділитися" + label_share_project_list: "Поділитися списком проєктів" + label_share_work_package: "Поділитися пакетом робіт" + label_show_all_registered_users: "Усі зареєстровані користувачі" + label_show_less: "Показати менше" + label_show_more: "Показати більше" + label_journal: "Журнал" + label_journal_diff: "Опис Порівняння" + label_language: "Мова" + label_languages: "Мови" + label_external_links: "Зовнішні посилання" + label_locale: "Мова й регіон" + label_jump_to_a_project: "Перейти до проекту..." + label_jira_import: "Імпорт із Jira" + label_keyword_plural: "Ключові слова" + label_language_based: "На основі мови користувача" + label_last_activity: "Остання активність" + label_last_change_on: "Остання зміна" + label_last_changes: "останні %{count} змін" + label_last_login: "Останній вхід" + label_last_month: "останній місяць" + label_last_n_days: "останні %{count} днів" + label_last_week: "ост. тиждень" + label_latest_revision: "Остання версія" + label_latest_revision_plural: "Останні версії" + label_ldap_authentication: "Авторизація за допомогою LDAP" + label_learn_more: "Докладніше" label_less_or_equal: "<=" - label_less_than_ago: менше, ніж день тому - label_link_url: Посилання (URL) - label_list: Список - label_loading: Завантаження... - label_locked: заблоковано - label_lock_user: Заблокувати користувача - label_logged_as: Ви увійшли як - label_login: Увійти - label_custom_comment: "%{name} comment" - label_custom_logo: Користувацький логотип для ПК - label_custom_logo_mobile: Користувацький логотип для мобільного - label_custom_export_logo: Користувацький логотип експорту - label_custom_export_cover: Фон обкладинки експорту - label_custom_export_footer: Власне зображення для нижнього колонтитула файлу, що - експортується - label_custom_export_font_regular: Звичайний - label_custom_export_font_bold: Жирний - label_custom_export_font_italic: Курсив - label_custom_export_font_bold_italic: Жирний курсив - label_custom_export_cover_overlay: Накладення фону обкладинки експорту - label_custom_export_cover_text_color: Колір тексту - label_custom_pdf_export_settings: Налаштування експорту PDF - label_custom_favicon: призначені для користувача іконки - label_custom_touch_icon: Призначений для користувача значок логотипу - label_logout: Вийти - label_mapping_for: 'Зіставлення для: %{attribute}' - label_main_menu: Бокове меню - label_manage: Керувати - label_manage_groups: Керувати групами - label_managed_repositories_vendor: Керований %{vendor} repositories - label_mathematical_operators: Математичні оператори - label_max_size: Максимальний розмір - label_me: мені - label_member_new: Новий учасник + label_less_than_ago: "менше, ніж день тому" + label_link_url: "Посилання (URL)" + label_list: "Список" + label_loading: "Завантаження..." + label_locked: "заблоковано" + label_lock_user: "Заблокувати користувача" + label_logged_as: "Ви увійшли як" + label_login: "Увійти" + label_custom_comment: "Коментар %{name}" + label_custom_logo: "Користувацький логотип для ПК" + label_custom_logo_mobile: "Користувацький логотип для мобільного" + label_custom_export_logo: "Користувацький логотип експорту" + label_custom_export_cover: "Фон обкладинки експорту" + label_custom_export_footer: "Власне зображення для нижнього колонтитула файлу, що експортується" + label_custom_export_font_regular: "Звичайний" + label_custom_export_font_bold: "Жирний" + label_custom_export_font_italic: "Курсив" + label_custom_export_font_bold_italic: "Жирний курсив" + label_custom_export_cover_overlay: "Накладення фону обкладинки експорту" + label_custom_export_cover_text_color: "Колір тексту" + label_custom_pdf_export_settings: "Налаштування експорту PDF" + label_custom_favicon: "призначені для користувача іконки" + label_custom_touch_icon: "Призначений для користувача значок логотипу" + label_logout: "Вийти" + label_mapping_for: "Зіставлення для: %{attribute}" + label_main_menu: "Бокове меню" + label_manage: "Керувати" + label_manage_groups: "Керувати групами" + label_managed_repositories_vendor: "Керований %{vendor} repositories" + label_mathematical_operators: "Математичні оператори" + label_max_size: "Максимальний розмір" + label_me: "мені" + label_member_new: "Новий учасник" label_member_all_admin: "(Усі ролі через статус адміністратора)" - label_member_plural: Учасники - label_membership_plural: Членство - label_membership_added: Учасника додано - label_membership_updated: Учасника оновлено - label_menu: Меню + label_member_plural: "Учасники" + label_membership_plural: "Членство" + label_membership_added: "Учасника додано" + label_membership_updated: "Учасника оновлено" + label_menu: "Меню" label_menu_badge: - pre_alpha: попередня альфа - alpha: альфа - beta: бета - label_menu_item_name: Назва пункту меню - label_message: Повідомлення - label_message_last: Останнє повідомлення - label_message_new: Нове повідомлення - label_message_plural: Повідомлення - label_message_posted: Повідомлення додано - label_min_max_length: Мінімальна - максимальна довжина - label_minute_plural: хвилини - label_missing_api_access_key: Відсутній ключ доступу до API - label_missing_feeds_access_key: Відсутній ключ доступу RSS + pre_alpha: "попередня альфа" + alpha: "альфа" + beta: "бета" + label_menu_item_name: "Назва пункту меню" + label_message: "Повідомлення" + label_message_last: "Останнє повідомлення" + label_message_new: "Нове повідомлення" + label_message_plural: "Повідомлення" + label_message_posted: "Повідомлення додано" + label_min_max_length: "Мінімальна - максимальна довжина" + label_minute_plural: "хвилини" + label_missing_api_access_key: "Відсутній ключ доступу до API" + label_missing_feeds_access_key: "Відсутній ключ доступу RSS" label_modification: "%{count} змін" - label_modified: змінено - label_module_plural: Модулі - label_modules: Модулі - label_months_from: місяців(ця) з - label_more: Більше - label_more_information: Додаткові відомості - label_more_than_ago: більш ніж днів(я) назад - label_move_column_left: Перемістити стовпець ліворуч - label_move_column_right: Перемістити стовпець праворуч - label_move_work_package: Перемістити робочий пакет - label_my_account: Налаштування облікового запису - label_my_activity: Мої дії - label_my_account_data: Мої дані облікового запису - label_my_avatar: Мій аватар - label_my_queries: Мої збережені запити - label_name: Назва - label_never: Ніколи - label_new: Нові - label_new_features: Нові можливості - label_new_statuses_allowed: Дозволені нові статуси - label_news_singular: Новини - label_news_added: Новину додано - label_news_comment_added: Добавлено новий коментар до новини - label_news_latest: Останні новини - label_news_new: Додати новини - label_news_edit: Редагувати новини - label_news_plural: Новини - label_news_view_all: Подивитися всі новини - label_next: Далі - label_next_week: Наступний тиждень + label_modified: "змінено" + label_module_plural: "Модулі" + label_modules: "Модулі" + label_months_from: "місяців(ця) з" + label_more: "Більше" + label_more_information: "Додаткові відомості" + label_more_than_ago: "більш ніж днів(я) назад" + label_move_column_left: "Перемістити стовпець ліворуч" + label_move_column_right: "Перемістити стовпець праворуч" + label_move_work_package: "Перемістити робочий пакет" + label_my_account: "Налаштування облікового запису" + label_my_activity: "Мої дії" + label_my_account_data: "Мої дані облікового запису" + label_my_avatar: "Мій аватар" + label_my_queries: "Мої збережені запити" + label_name: "Назва" + label_never: "Ніколи" + label_new: "Нові" + label_new_features: "Нові можливості" + label_new_statuses_allowed: "Дозволені нові статуси" + label_news_singular: "Новини" + label_news_added: "Новину додано" + label_news_comment_added: "Добавлено новий коментар до новини" + label_news_latest: "Останні новини" + label_news_new: "Додати новини" + label_news_edit: "Редагувати новини" + label_news_plural: "Новини" + label_news_view_all: "Подивитися всі новини" + label_next: "Далі" + label_next_week: "Наступний тиждень" label_no_change_option: "(Немає змін)" - label_no_data: Немає даних для відображення - label_no_due_date: немає дати завершення - label_no_start_date: немає дати початку - label_no_parent_page: Немає початкової сторінки - label_notification_center_plural: Сповіщення - label_nothing_display: Нічого не відображається - label_nobody: жодні - label_not_configured: Не налаштовано - label_not_found: не знайдено - label_none: нічого + label_no_data: "Немає даних для відображення" + label_no_due_date: "немає дати завершення" + label_no_start_date: "немає дати початку" + label_no_parent_page: "Немає початкової сторінки" + label_notification_center_plural: "Сповіщення" + label_nothing_display: "Нічого не відображається" + label_nobody: "жодні" + label_not_configured: "Не налаштовано" + label_not_found: "не знайдено" + label_none: "нічого" label_none_parentheses: "(немає)" - label_not_contains: не містить - label_not_equals: немає - label_life_cycle_step_plural: Життєвий цикл проєкту - label_on: на - label_operator_all: вказано - label_operator_none: не вказано - label_operator_equals_or: є (АБО) - label_operator_equals_all: є (І) - label_operator_shared_with_user_any: усі - label_open: відкрити - label_closed: зачинено - label_open_menu: Відкрити меню - label_open_work_packages: відкрити - label_open_work_packages_plural: відкрити - label_openproject_website: Веб-сайт OpenProject - label_optional_description: Опис - label_options: Опції - label_other: Інше - label_overall_activity: Загальна активність - label_overview: Огляд - label_page_title: Заголовок сторінки - label_part_of: частина - label_password_lost: Забули Ваш пароль? - label_password_rule_lowercase: До нижнього регістру - label_password_rule_numeric: Цифрові символи - label_password_rule_special: Спеціальні символи - label_password_rule_uppercase: Верхній регістр - label_path_encoding: Кодування шляху - label_per_page: 'К-сть на сторінку:' - label_people: Люди - label_permissions: Дозволи - label_permissions_report: Звіт про права доступу - label_personalize_page: Персоналізуйте цю сторінку - label_placeholder_user: Прототип користувача - label_placeholder_user_new: Створити прототип користувача - label_placeholder_user_plural: Протототипи користувачів - label_planning: Планування - label_please_login: Увійдіть у систему - label_plugins: Плагіни - label_portfolio_plural: Портфелі - label_modules_and_plugins: Модулі та плагіни - label_precedes: переважати - label_preferences: Налаштування - label_preview: Попередній перегляд - label_preview_not_available: Попередній перегляд недоступний - label_previous: Попередній - label_previous_week: Попередній тиждень - label_principal_invite_via_email: або запрошувати нових користувачів електронною - поштою - label_principal_search: Додати існуючих користувачів або групи - label_privacy_policy: Політика конфіденційності та безпеки даних - label_product_version: Версія продукту - label_profile: Профіль + label_not_contains: "не містить" + label_not_equals: "немає" + label_life_cycle_step_plural: "Життєвий цикл проєкту" + label_on: "на" + label_operator_all: "вказано" + label_operator_none: "не вказано" + label_operator_equals_or: "є (АБО)" + label_operator_equals_all: "є (І)" + label_operator_shared_with_user_any: "усі" + label_open: "відкрити" + label_closed: "зачинено" + label_open_menu: "Відкрити меню" + label_open_work_packages: "відкрити" + label_open_work_packages_plural: "відкрити" + label_openproject_website: "Веб-сайт OpenProject" + label_optional_description: "Опис" + label_options: "Опції" + label_other: "Інше" + label_overall_activity: "Загальна активність" + label_overview: "Огляд" + label_page_title: "Заголовок сторінки" + label_part_of: "частина" + label_password_lost: "Забули Ваш пароль?" + label_password_rule_lowercase: "До нижнього регістру" + label_password_rule_numeric: "Цифрові символи" + label_password_rule_special: "Спеціальні символи" + label_password_rule_uppercase: "Верхній регістр" + label_path_encoding: "Кодування шляху" + label_per_page: "К-сть на сторінку:" + label_people: "Люди" + label_permissions: "Дозволи" + label_permissions_report: "Звіт про права доступу" + label_personalize_page: "Персоналізуйте цю сторінку" + label_placeholder_user: "Прототип користувача" + label_placeholder_user_new: "Створити прототип користувача" + label_placeholder_user_plural: "Протототипи користувачів" + label_planning: "Планування" + label_please_login: "Увійдіть у систему" + label_plugins: "Плагіни" + label_portfolio_plural: "Портфелі" + label_modules_and_plugins: "Модулі та плагіни" + label_precedes: "переважати" + label_preferences: "Налаштування" + label_preview: "Попередній перегляд" + label_preview_not_available: "Попередній перегляд недоступний" + label_previous: "Попередній" + label_previous_week: "Попередній тиждень" + label_principal_invite_via_email: "або запрошувати нових користувачів електронною поштою" + label_principal_search: "Додати існуючих користувачів або групи" + label_privacy_policy: "Політика конфіденційності та безпеки даних" + label_product_version: "Версія продукту" + label_profile: "Профіль" label_percent_complete: "% завершення" - label_progress_tracking: Відстеження прогресу - label_project: Проєкт - label_project_activity: Дії в проєкті - label_project_attribute_plural: Атрибути проєкту - label_project_attribute_manage_link: Керувати атрибутами проєкту - label_project_count: Загальна кількість проектів - label_project_copy_notifications: Відправлення повідомлень по електронній пошті - в ході реалізації проекту копія - label_project_initiation_export_pdf: Експорт PDF для проєкту «%{project_creation_name}» - label_project_latest: Останні проекти - label_project_default_type: Дозволити порожній тип - label_project_hierarchy: Ієрархія проектів - label_project_mappings: Проєкти - label_project_new: Новий проект - label_project_plural: Проєкти - label_project_list_plural: Списки проєкту - label_project_life_cycle: Життєвий цикл проєкту - label_project_attributes_plural: Атрибути проєкту - label_project_custom_field_plural: Атрибути проєкту - label_project_settings: Налаштування проекту - label_project_attributes_settings: Налаштування атрибутів проєкту - label_project_storage_plural: Файлові сховища - label_project_storage_project_folder: 'Файлові сховища: папки проєкту' - label_projects_disk_usage_information: 'Проєктів, що використовують %{used_disk_space} - місця на диску: %{count}' - label_project_view_all: Переглянути всi проекти - label_project_show_details: Показати деталі проекту - label_project_hide_details: Приховати деталі проекту - label_portfolio: Портфель - label_portfolio_new: Новий портфель - label_program: Програма - label_program_new: Нова програма - label_public_projects: Публічні проекти - label_query_new: Новий запит - label_query_plural: Спеціальні запити - label_read: Читання... - label_read_documentation: Прочитати документацію - label_register: Створити новий акаунт - label_register_with_developer: Зареєструйтеся як розробник - label_registered_on: Зареєстровано на - label_related_work_packages: Пов'язані робочі пакети - label_relates: зв’язано з - label_relates_to: пов'язані з - label_relation: Зв’язок - label_relation_actions: Дії зі зв’язками - label_relation_delete: Видалити зв'язок - label_relation_edit: Редагувати зв’язок - label_relation_new: Новий зв'язок - label_release_notes: Примітки до випуску - label_remaining_work: Залишок роботи - label_remove_column: Вилучити стовпець - label_remove_columns: Видалити вибрані стовпці - label_renamed: перейменовано - label_reply_plural: Відповіді - label_report: Звіт - label_report_bug: Повідомити про помилку - label_report_plural: Звіти - label_reported_work_packages: Зазначені робочі пакети - label_reporting: Звітність - label_reporting_plural: Звітність - label_repository: Репозиторій - label_repository_remove: Вилучити репозиторій - label_repository_root: Корень сховища - label_repository_plural: Репозиторії - label_request_submission: Подання запиту - label_required: вимагається - label_requires: вимагається - label_result_plural: Результати - label_revision: Ревізія - label_revision_id: Ревізія %{value} - label_revision_plural: Ревізії - label_roadmap: Дорожня карта - label_roadmap_edit: Редагувати дорожню карту %{name} - label_roadmap_due_in: Строк %{value} - label_roadmap_no_work_packages: Немає робочих пакетів для цієї версії + label_progress_tracking: "Відстеження прогресу" + label_project: "Проєкт" + label_project_activity: "Дії в проєкті" + label_project_attribute_plural: "Атрибути проєкту" + label_project_attribute_manage_link: "Керувати атрибутами проєкту" + label_project_count: "Загальна кількість проектів" + label_project_copy_notifications: "Відправлення повідомлень по електронній пошті в ході реалізації проекту копія" + label_project_initiation_export_pdf: "Експорт PDF для проєкту «%{project_creation_name}»" + label_project_latest: "Останні проекти" + label_project_default_type: "Дозволити порожній тип" + label_project_hierarchy: "Ієрархія проектів" + label_project_mappings: "Проєкти" + label_project_new: "Новий проект" + label_project_plural: "Проєкти" + label_project_list_plural: "Списки проєкту" + label_project_life_cycle: "Життєвий цикл проєкту" + label_project_attributes_plural: "Атрибути проєкту" + label_project_custom_field_plural: "Атрибути проєкту" + label_project_settings: "Налаштування проекту" + label_project_attributes_settings: "Налаштування атрибутів проєкту" + label_project_storage_plural: "Файлові сховища" + label_project_storage_project_folder: "Файлові сховища: папки проєкту" + label_projects_disk_usage_information: "Проєктів, що використовують %{used_disk_space} місця на диску: %{count}" + label_project_view_all: "Переглянути всi проекти" + label_project_show_details: "Показати деталі проекту" + label_project_hide_details: "Приховати деталі проекту" + label_portfolio: "Портфель" + label_portfolio_new: "Новий портфель" + label_program: "Програма" + label_program_new: "Нова програма" + label_public_projects: "Публічні проекти" + label_query_new: "Новий запит" + label_query_plural: "Спеціальні запити" + label_read: "Читання..." + label_read_documentation: "Прочитати документацію" + label_register: "Створити новий акаунт" + label_register_with_developer: "Зареєструйтеся як розробник" + label_registered_on: "Зареєстровано на" + label_related_work_packages: "Пов'язані робочі пакети" + label_relates: "зв’язано з" + label_relates_to: "пов'язані з" + label_relation: "Зв’язок" + label_relation_actions: "Дії зі зв’язками" + label_relation_delete: "Видалити зв'язок" + label_relation_edit: "Редагувати зв’язок" + label_relation_new: "Новий зв'язок" + label_release_notes: "Примітки до випуску" + label_remaining_work: "Залишок роботи" + label_remove_column: "Вилучити стовпець" + label_remove_columns: "Видалити вибрані стовпці" + label_renamed: "перейменовано" + label_reply_plural: "Відповіді" + label_report: "Звіт" + label_report_bug: "Повідомити про помилку" + label_report_plural: "Звіти" + label_reported_work_packages: "Зазначені робочі пакети" + label_reporting: "Звітність" + label_reporting_plural: "Звітність" + label_repository: "Репозиторій" + label_repository_remove: "Вилучити репозиторій" + label_repository_root: "Корень сховища" + label_repository_plural: "Репозиторії" + label_request_submission: "Подання запиту" + label_required: "вимагається" + label_requires: "вимагається" + label_result_plural: "Результати" + label_revision: "Ревізія" + label_revision_id: "Ревізія %{value}" + label_revision_plural: "Ревізії" + label_roadmap: "Дорожня карта" + label_roadmap_edit: "Редагувати дорожню карту %{name}" + label_roadmap_due_in: "Строк %{value}" + label_roadmap_no_work_packages: "Немає робочих пакетів для цієї версії" label_roadmap_overdue: "%{value} запізнення" - label_role_and_permissions: Ролі і права доступу - label_role_new: Нова роль - label_role_grantable: Роль, що надається - label_role_plural: Роль - label_role_search: Призначити роль для нових членів - label_scm: Тип сховища - label_scroll_left: Гортати вліво - label_scroll_right: Гортати вправо - label_search: Пошук - label_search_by_name: Пошук за назвою - label_send_information: Надіслати нові облікові дані користувачу - label_send_test_email: Послати email для перевірки - label_session: Сеанс - label_setting_plural: Налаштування - label_system_settings: Параметри системи - label_show_completed_versions: Показати завершені версії - label_columns: Стовпці - label_sort: Сортувати - label_sort_ascending: Сортувати за зростанням - label_sort_by: Сортувати за %{value} - label_sorted_by: відсортовані за %{value} - label_sort_descending: Сортувати за спаданням - label_sort_higher: Рухатися вгору - label_sort_highest: Помістити на верх - label_sort_lower: Пересунути нижче - label_sort_lowest: Помістити в кінець - label_spent_time: Витрачений час - label_start_to_end: закінчення - label_start_to_start: початок - label_statistics: Статистика - label_status: Стан - label_storage_free_space: Залишок на диску - label_storage_used_space: Використовується дисковий простір - label_storage_group: Зберігання файлової системи %{identifier} - label_storage_for: Охоплює зберігання для - label_string: Текст - label_subproject: Підпроєкт - label_subproject_new: Новий підпроект - label_subproject_plural: Підпроекти - label_subitems: Піделементи - label_subtask_plural: Підзадачі - label_summary: Резюме - label_system: Система - label_system_storage: Інформація про зберігання - label_table_of_contents: Зміст - label_tag: Мітка - label_team_planner: Командний планувальник - label_template: Шаблон - label_templates: Шаблони - label_text: Довгий текст - label_this_month: цього місяця - label_this_week: цього тижня - label_this_year: цей рік - label_time: Час - label_time_entry_plural: Витрачений час - label_time_entry_activity_plural: Завдання з обліком часу - label_title: Назва - label_projects_menu: Проєкти - label_today: сьогодні - label_token_version: Версія маркера - label_today_as_start_date: Виберіть сьогодні як дату початку. - label_today_as_due_date: Виберіть сьогодні як дату завершення. - label_today_as_date: Виберіть сьогодні як дату. - label_top_menu: Верхнє меню - label_topic_plural: Теми - label_total: Усього - label_type_new: Новий тип - label_type_plural: Типи - label_ui: Користувацький інтерфейс - label_updated_time: Оновлений %{value} назад + label_role_and_permissions: "Ролі і права доступу" + label_role_new: "Нова роль" + label_role_grantable: "Роль, що надається" + label_role_plural: "Роль" + label_role_search: "Призначити роль для нових членів" + label_scm: "Тип сховища" + label_scroll_left: "Гортати вліво" + label_scroll_right: "Гортати вправо" + label_search: "Пошук" + label_search_by_name: "Пошук за назвою" + label_send_information: "Надіслати нові облікові дані користувачу" + label_send_test_email: "Послати email для перевірки" + label_session: "Сеанс" + label_setting_plural: "Налаштування" + label_system_settings: "Параметри системи" + label_show_completed_versions: "Показати завершені версії" + label_columns: "Стовпці" + label_sort: "Сортувати" + label_sort_ascending: "Сортувати за зростанням" + label_sort_by: "Сортувати за %{value}" + label_sorted_by: "відсортовані за %{value}" + label_sort_descending: "Сортувати за спаданням" + label_sort_higher: "Рухатися вгору" + label_sort_highest: "Помістити на верх" + label_sort_lower: "Пересунути нижче" + label_sort_lowest: "Помістити в кінець" + label_spent_time: "Витрачений час" + label_start_to_end: "закінчення" + label_start_to_start: "початок" + label_statistics: "Статистика" + label_status: "Стан" + label_storage_free_space: "Залишок на диску" + label_storage_used_space: "Використовується дисковий простір" + label_storage_group: "Зберігання файлової системи %{identifier}" + label_storage_for: "Охоплює зберігання для" + label_string: "Текст" + label_subproject: "Підпроєкт" + label_subproject_new: "Новий підпроект" + label_subproject_plural: "Підпроекти" + label_subitems: "Піделементи" + label_subtask_plural: "Підзадачі" + label_summary: "Резюме" + label_system: "Система" + label_system_storage: "Інформація про зберігання" + label_table_of_contents: "Зміст" + label_tag: "Мітка" + label_team_planner: "Командний планувальник" + label_template: "Шаблон" + label_templates: "Шаблони" + label_text: "Довгий текст" + label_this_month: "цього місяця" + label_this_week: "цього тижня" + label_this_year: "цей рік" + label_time: "Час" + label_time_entry_plural: "Витрачений час" + label_time_entry_activity_plural: "Завдання з обліком часу" + label_title: "Назва" + label_projects_menu: "Проєкти" + label_today: "сьогодні" + label_token_version: "Версія маркера" + label_today_as_start_date: "Виберіть сьогодні як дату початку." + label_today_as_due_date: "Виберіть сьогодні як дату завершення." + label_today_as_date: "Виберіть сьогодні як дату." + label_top_menu: "Верхнє меню" + label_topic_plural: "Теми" + label_total: "Усього" + label_type_new: "Новий тип" + label_type_plural: "Типи" + label_ui: "Користувацький інтерфейс" + label_updated_time: "Оновлений %{value} назад" label_updated_time_at: "%{author} %{age}" - label_updated_time_by: Оновлено %{author} %{age} назад - label_upgrade_guides: Оновлення керівництва - label_used_by: Використовується - label_used_by_types: Використовується за типами - label_used_in_projects: Використовується в проектах - label_user: Користувач - label_user_and_permission: Користувачі й дозволи - label_user_named: User %{name} - label_user_activity: Дії користувача %{value} - label_user_anonymous: Невідомий - label_user_mail_option_all: Для всіх подій у всіх моїх проектах - label_user_mail_option_none: Ніяких подій - label_user_mail_option_only_assigned: Тільки за те що я призначений - label_user_mail_option_only_my_events: Тільки для речей які я дивлюся чи я займаюся - label_user_mail_option_only_owner: Тільки для речей, за якими я спостерігаю або - є власником - label_user_mail_option_selected: Для будь-якої події на вибраних проектах - label_user_menu: Меню користувача - label_user_new: Новий користувач - label_user_plural: Користувачі - label_user_search: 'Знайти користувача:' - label_user_settings: Налаштування користувача - label_users_settings: Налаштування користувачів - label_value_x: 'Значення: %{x}' - label_version_new: Нова версія - label_version_edit: Редагувати версію - label_version_plural: Версії - label_version_sharing_descendants: З підпроектами - label_version_sharing_hierarchy: Ієрархія проектів - label_version_sharing_none: Без сумісного доступу - label_version_sharing_system: З усіма проектами - label_version_sharing_tree: З деревом проекту - label_videos: Відео - label_view_all_revisions: Переглянути всі зміни - label_view_diff: Переглянути відмінності - label_view_revisions: Переглянути зміни - label_watched_work_packages: Спостерігали робочі пакети - label_what_is_this: Що це? - label_week: Тиждень - label_widget: Віджет - label_widget_new: Новий віджет - label_wiki_content_added: Додано сторінку Wiki - label_wiki_content_updated: Сторінка Wiki оновлена - label_wiki_toc: Зміст - label_wiki_toc_empty: Зміст пустий, оскільки немає заголовків. - label_wiki_dont_show_menu_item: Не показувати це wikipage в навігації проекту - label_wiki_edit: Редагування Wiki - label_wiki_edit_plural: Редагування Wiki - label_wiki_page_attachments: Додавання сторінок Wiki - label_wiki_page_id: ID вікі-сторінки - label_wiki_navigation: Навігація Wiki - label_wiki_page: Сторінка Wiki - label_wiki_page_plural: Сторінки Wiki - label_wiki_show_index_page_link: Показати пункт підменю "Зміст" - label_wiki_show_menu_item: Показати як пункт меню в навігації по проекту - label_wiki_show_new_page_link: Показати елемент підменю "Створити нову початкову - сторінку" - label_wiki_show_submenu_item: 'Показати як пункт підменю ' - label_wiki_start: Початкова сторінка - label_work: Робота - label_work_package: Робочий пакет - label_work_package_attachments: Додатки до робочого пакету - label_work_package_category_new: Нова категорія - label_work_package_category_plural: Категорії робочих пакетів - label_work_package_comments: Коментарі до пакета робіт - label_work_package_hierarchy: Ієрархія робочих пакетів - label_work_package_new: Новий пакет робіт - label_work_package_edit: Редагувати робочий пакет %{name} - label_work_package_plural: Пакет робіт - label_work_package_status: Стан пакета робіт - label_work_package_status_new: Новий статус - label_work_package_status_plural: Статуси робочих пакетів - label_work_package_types: Типи робочих пакетів - label_work_package_tracking: Відстеження робочого пакету - label_work_package_view_all: Переглянути всі робочі пакети - label_workflow: Робочий процес - label_workflow_copy: Копіювати робочий процес - label_workflow_plural: Робочі процеси - label_workflow_summary: Резюме - label_working_days_and_hours: Робочі дні й години + label_updated_time_by: "Оновлено %{author} %{age} назад" + label_upgrade_guides: "Оновлення керівництва" + label_used_by: "Використовується" + label_used_by_types: "Використовується за типами" + label_used_in_projects: "Використовується в проектах" + label_user: "Користувач" + label_user_and_permission: "Користувачі й дозволи" + label_user_named: "User %{name}" + label_user_activity: "Дії користувача %{value}" + label_user_anonymous: "Невідомий" + label_user_mail_option_all: "Для всіх подій у всіх моїх проектах" + label_user_mail_option_none: "Ніяких подій" + label_user_mail_option_only_assigned: "Тільки за те що я призначений" + label_user_mail_option_only_my_events: "Тільки для речей які я дивлюся чи я займаюся" + label_user_mail_option_only_owner: "Тільки для речей, за якими я спостерігаю або є власником" + label_user_mail_option_selected: "Для будь-якої події на вибраних проектах" + label_user_menu: "Меню користувача" + label_user_new: "Новий користувач" + label_user_plural: "Користувачі" + label_user_search: "Знайти користувача:" + label_user_settings: "Налаштування користувача" + label_users_settings: "Налаштування користувачів" + label_value_x: "Значення: %{x}" + label_version_new: "Нова версія" + label_version_edit: "Редагувати версію" + label_version_plural: "Версії" + label_version_sharing_descendants: "З підпроектами" + label_version_sharing_hierarchy: "Ієрархія проектів" + label_version_sharing_none: "Без сумісного доступу" + label_version_sharing_system: "З усіма проектами" + label_version_sharing_tree: "З деревом проекту" + label_videos: "Відео" + label_view_all_revisions: "Переглянути всі зміни" + label_view_diff: "Переглянути відмінності" + label_view_revisions: "Переглянути зміни" + label_watched_work_packages: "Спостерігали робочі пакети" + label_what_is_this: "Що це?" + label_week: "Тиждень" + label_widget: "Віджет" + label_widget_new: "Новий віджет" + label_wiki_content_added: "Додано сторінку Wiki" + label_wiki_content_updated: "Сторінка Wiki оновлена" + label_wiki_toc: "Зміст" + label_wiki_toc_empty: "Зміст пустий, оскільки немає заголовків." + label_wiki_dont_show_menu_item: "Не показувати це wikipage в навігації проекту" + label_wiki_edit: "Редагування Wiki" + label_wiki_edit_plural: "Редагування Wiki" + label_wiki_page_attachments: "Додавання сторінок Wiki" + label_wiki_page_id: "ID вікі-сторінки" + label_wiki_navigation: "Навігація Wiki" + label_wiki_page: "Сторінка Wiki" + label_wiki_page_plural: "Сторінки Wiki" + label_wiki_show_index_page_link: "Показати пункт підменю \"Зміст\"" + label_wiki_show_menu_item: "Показати як пункт меню в навігації по проекту" + label_wiki_show_new_page_link: "Показати елемент підменю \"Створити нову початкову сторінку\"" + label_wiki_show_submenu_item: "Показати як пункт підменю " + label_wiki_start: "Початкова сторінка" + label_work: "Робота" + label_work_package: "Робочий пакет" + label_work_package_attachments: "Додатки до робочого пакету" + label_work_package_category_new: "Нова категорія" + label_work_package_category_plural: "Категорії робочих пакетів" + label_work_package_comments: "Коментарі до пакета робіт" + label_work_package_hierarchy: "Ієрархія робочих пакетів" + label_work_package_new: "Новий пакет робіт" + label_work_package_edit: "Редагувати робочий пакет %{name}" + label_work_package_plural: "Пакет робіт" + label_work_package_status: "Стан пакета робіт" + label_work_package_status_new: "Новий статус" + label_work_package_status_plural: "Статуси робочих пакетів" + label_work_package_types: "Типи робочих пакетів" + label_work_package_tracking: "Відстеження робочого пакету" + label_work_package_view_all: "Переглянути всі робочі пакети" + label_workflow: "Робочий процес" + label_workflow_copy: "Копіювати робочий процес" + label_workflow_plural: "Робочі процеси" + label_workflow_summary: "Резюме" + label_working_days_and_hours: "Робочі дні й години" label_x_closed_work_packages_abbr: - one: 1 закрито - other: 'Закрито: %{count}' - zero: 0 закрито + one: "1 закрито" + other: "Закрито: %{count}" + zero: "0 закрито" label_x_comments: - one: 1 коментар - other: 'Коментарів: %{count}' - zero: немає коментарів + one: "1 коментар" + other: "Коментарів: %{count}" + zero: "немає коментарів" label_x_open_work_packages_abbr: - one: 1 відкрито - other: 'Відкрито: %{count}' - zero: 0 відкрито + one: "1 відкрито" + other: "Відкрито: %{count}" + zero: "0 відкрито" label_x_work_packages: - one: 1 пакет робіт - other: 'Пакетів робіт: %{count}' - zero: Немає пакетів робіт + one: "1 пакет робіт" + other: "Пакетів робіт: %{count}" + zero: "Немає пакетів робіт" label_x_projects: - one: 1 проєкт - other: 'Проєктів: %{count}' - zero: немає проєктів + one: "1 проєкт" + other: "Проєктів: %{count}" + zero: "немає проєктів" label_x_files: - one: 1 файл - other: 'Файлів: %{count}' - zero: немає файлів - label_yesterday: вчора - label_zen_mode: Режим «Дзен» - label_role_type: Тип - label_member_role: Роль у проєкті - label_global_role: Глобальна роль + one: "1 файл" + other: "Файлів: %{count}" + zero: "немає файлів" + label_yesterday: "вчора" + label_zen_mode: "Режим «Дзен»" + label_role_type: "Тип" + label_member_role: "Роль у проєкті" + label_global_role: "Глобальна роль" label_not_changeable: "(не змінюється)" - label_global: Глобальний - label_seeded_from_env_warning: Цей запис створено за допомогою змінної середовища - конфігурації. Його не можна змінити в інтерфейсі користувача. - macro_execution_error: Помилка виконання макросу %{macro_name} - macro_unavailable: Макрос %{macro_name} не може бути відображений. + label_global: "Глобальний" + label_seeded_from_env_warning: Цей запис створено за допомогою змінної середовища конфігурації. Його не можна змінити в інтерфейсі користувача. + macro_execution_error: "Помилка виконання макросу %{macro_name}" + macro_unavailable: "Макрос %{macro_name} не може бути відображений." macros: placeholder: "[Placeholder] Макрос %{macro_name}" errors: - missing_or_invalid_parameter: Відсутній або неприпустимий параметр макросу. + missing_or_invalid_parameter: "Відсутній або неприпустимий параметр макросу." legacy_warning: - timeline: Цей попередній макрос часової шкали видалено та більше не доступний. - Можна замінити функціональність вбудованим макросом таблиці. + timeline: "Цей попередній макрос часової шкали видалено та більше не доступний. Можна замінити функціональність вбудованим макросом таблиці." include_wiki_page: - removed: Макросу більше не існує. + removed: "Макросу більше не існує." wiki_child_pages: errors: - page_not_found: Не вдається знайти вікі-сторінку %{name} + page_not_found: "Не вдається знайти вікі-сторінку %{name}" create_work_package_link: errors: - no_project_context: Виклик макросу create_work_package_link із зовнішнього - контексту проекту. - invalid_type: Не знайдено жодного типу з назвою %{type} в проекті %{project}. - link_name: Новий пакет робіт - link_name_type: Новий %{type_name} + no_project_context: "Виклик макросу create_work_package_link із зовнішнього контексту проекту." + invalid_type: "Не знайдено жодного типу з назвою %{type} в проекті %{project}." + link_name: "Новий пакет робіт" + link_name_type: "Новий %{type_name}" mail: - actions: Дії + actions: "Дії" digests: - including_mention_singular: включно зі згадкою - including_mention_plural: включно зі згадками (%{number_mentioned}) - unread_notification_singular: '1 не прочитане сповіщення ' - unread_notification_plural: 'стільки непрочитаних сповіщень: %{number_unread}' - you_have: У вас - logo_alt_text: Логотип + including_mention_singular: "включно зі згадкою" + including_mention_plural: "включно зі згадками (%{number_mentioned})" + unread_notification_singular: "1 не прочитане сповіщення " + unread_notification_plural: "стільки непрочитаних сповіщень: %{number_unread}" + you_have: "У вас" + logo_alt_text: "Логотип" mention: - subject: 'Користувач %{user_name} згадав вас у #%{id} – %{subject}' + subject: "Користувач %{user_name} згадав вас у #%{id} – %{subject}" notification: - center: Центр сповіщень - see_in_center: Переглянути коментарі у центрі сповіщень - settings: Змінити налаштування електронної пошти - salutation: Добрий день, %{user}! - salutation_full_name: Повне ім’я + center: "Центр сповіщень" + see_in_center: "Переглянути коментарі у центрі сповіщень" + settings: "Змінити налаштування електронної пошти" + salutation: "Добрий день, %{user}!" + salutation_full_name: "Повне ім’я" work_packages: - created_at: Створено о %{timestamp} користувачем %{user}  - login_to_see_all: Увійдіть, щоб переглянути всі сповіщення. - mentioned: Вас згадано в коментарі - mentioned_by: Користувач %{user} згадав вас у коментарі + created_at: "Створено о %{timestamp} користувачем %{user} " + login_to_see_all: "Увійдіть, щоб переглянути всі сповіщення." + mentioned: "Вас згадано в коментарі" + mentioned_by: "Користувач %{user} згадав вас у коментарі" more_to_see: - one: Є ще 1 пакет робіт зі сповіщеннями. - few: Є ще %{count} пакети робіт зі сповіщеннями. - many: Є ще %{count} пакетів робіт зі сповіщеннями. - other: Є ще %{count} пакета робіт зі сповіщеннями. - open_in_browser: Відкрити в браузері + one: "Є ще 1 пакет робіт зі сповіщеннями." + few: "Є ще %{count} пакети робіт зі сповіщеннями." + many: "Є ще %{count} пакетів робіт зі сповіщеннями." + other: "Є ще %{count} пакета робіт зі сповіщеннями." + open_in_browser: "Відкрити в браузері" reason: - watched: Відстежено - assigned: Призначено - responsible: Відповідальний - mentioned: Згадано - shared: Спільні - subscribed: усі - prefix: 'Отримано через налаштування сповіщень: %{reason}' - date_alert_start_date: Оповіщення про дату - date_alert_due_date: Оповіщення про дату - reminder: Нагадування - see_all: Показати всі - updated_at: Оновлено о %{timestamp} користувачем %{user} + watched: "Відстежено" + assigned: "Призначено" + responsible: "Відповідальний" + mentioned: "Згадано" + shared: "Спільні" + subscribed: "усі" + prefix: "Отримано через налаштування сповіщень: %{reason}" + date_alert_start_date: "Оповіщення про дату" + date_alert_due_date: "Оповіщення про дату" + reminder: "Нагадування" + see_all: "Показати всі" + updated_at: "Оновлено о %{timestamp} користувачем %{user}" reminder_notifications: - subject: 'Нагадування: %{note}' - heading: У вас нове нагадування - note: 'Примітка: "%{note}"' + subject: "Нагадування: %{note}" + heading: "У вас нове нагадування" + note: "Примітка: \"%{note}\"" sharing: work_packages: - allowed_actions: Ви можете %{allowed_actions} у цьому пакеті робіт, але це - залежить від вашої ролі й дозволів у проєкті. - create_account: 'Щоб отримати доступ до цього пакета робіт, вам знадобиться - створити й активувати обліковий запис в %{instance}. ' - open_work_package: Відкрити пакет робіт - subject: 'Вам надано доступ до пакета робіт #%{id}' - enterprise_text: Діліться пакетами робіт із користувачами, які не належать - до учасників проєкту. + allowed_actions: "Ви можете %{allowed_actions} у цьому пакеті робіт, але це залежить від вашої ролі й дозволів у проєкті." + create_account: "Щоб отримати доступ до цього пакета робіт, вам знадобиться створити й активувати обліковий запис в %{instance}. " + open_work_package: "Відкрити пакет робіт" + subject: "Вам надано доступ до пакета робіт #%{id}" + enterprise_text: "Діліться пакетами робіт із користувачами, які не належать до учасників проєкту." summary: - user: "%{user} надав(-ла) вам доступ до пакета робіт із такими правами: - %{role_rights}" - group: "%{user} надав(-ла) доступ до пакета робіт групі %{group}, до якої - ви належите" + user: "%{user} надав(-ла) вам доступ до пакета робіт із такими правами: %{role_rights}" + group: "%{user} надав(-ла) доступ до пакета робіт групі %{group}, до якої ви належите" storages: health: plaintext: - storage: Сховище + storage: "Сховище" healthy: - summary: Чудові новини! Зараз статус вашого сховища «%{storage_name}» - – «Справне». - error-solved-on: Вирішено - recommendation: Ми продовжуватимемо відстежувати систему, щоб переконатися, - що вона залишається справною. Ми сповістимо вас, якщо виявимо будь-які - невідповідності. - details: Щоб дізнатися більше або внести необхідні зміни, перейдіть на - сторінку конфігурації свого сховища + summary: 'Чудові новини! Зараз статус вашого сховища «%{storage_name}» – «Справне».' + error-solved-on: "Вирішено" + recommendation: "Ми продовжуватимемо відстежувати систему, щоб переконатися, що вона залишається справною. Ми сповістимо вас, якщо виявимо будь-які невідповідності." + details: "Щоб дізнатися більше або внести необхідні зміни, перейдіть на сторінку конфігурації свого сховища" unhealthy: - summary: Зараз статус вашого сховища, %{storage_name}, – «Помилка». Ми - виявили проблему, яка може потребувати вашої уваги. - error-details: Деталі помилки - error-message: Повідомлення про помилку - error-occurred-on: Сталася в - recommendation: Щоб вирішити цю проблему, рекомендуємо перейти на сторінку - конфігурації сховища - unsubscribe: Щоб більше не отримувати ці сповіщення, можете відписатися. - Для цього виконайте вказівки на цій сторінці - email_notification_settings: Налаштування сповіщень електронною поштою для - сховища - see_storage_settings: Переглянути налаштування сховища + summary: 'Зараз статус вашого сховища, %{storage_name}, – «Помилка». Ми виявили проблему, яка може потребувати вашої уваги.' + error-details: "Деталі помилки" + error-message: "Повідомлення про помилку" + error-occurred-on: "Сталася в" + recommendation: "Щоб вирішити цю проблему, рекомендуємо перейти на сторінку конфігурації сховища" + unsubscribe: "Щоб більше не отримувати ці сповіщення, можете відписатися. Для цього виконайте вказівки на цій сторінці" + email_notification_settings: "Налаштування сповіщень електронною поштою для сховища" + see_storage_settings: "Переглянути налаштування сховища" healthy: - subject: Сховище «%{name}» зараз справне! - solved_at: вирішено о - summary: Проблему з інтеграцією вашого сховища «%{storage_name}» вирішено + subject: 'Сховище «%{name}» зараз справне!' + solved_at: "вирішено о" + summary: "Проблему з інтеграцією вашого сховища «%{storage_name}» вирішено" unhealthy: - subject: Сховище «%{name}» несправне! - since: з - summary: Існує проблема з інтеграцією вашого сховища «%{storage_name}» + subject: 'Сховище «%{name}» несправне!' + since: "з" + summary: "Існує проблема з інтеграцією вашого сховища «%{storage_name}»" troubleshooting: - text: Щоб дізнатися більше, перевірте файлові сховища - link_text: документація з вирішення проблем - mail_body_account_activation_request: 'Новий користувач (%{value}) зареєструвався. - Його обліковий запис чекає на ваше підтвердження:' - mail_body_account_information: Інформація по Вашому обліковому запису - mail_body_account_information_external: Ви можете використовувати ваш %{value} обліковий - запис для входу. - mail_body_backup_ready: 'Запитана вами резервна копія готова. Її можна завантажити - тут:' - mail_body_backup_token_reset_admin_info: Маркер резервного копіювання для користувача - «%{user}» скинуто. + text: "Щоб дізнатися більше, перевірте файлові сховища" + link_text: "документація з вирішення проблем" + mail_body_account_activation_request: "Новий користувач (%{value}) зареєструвався. Його обліковий запис чекає на ваше підтвердження:" + mail_body_account_information: "Інформація по Вашому обліковому запису" + mail_body_account_information_external: "Ви можете використовувати ваш %{value} обліковий запис для входу." + mail_body_backup_ready: "Запитана вами резервна копія готова. Її можна завантажити тут:" + mail_body_backup_token_reset_admin_info: Маркер резервного копіювання для користувача «%{user}» скинуто. mail_body_backup_token_reset_user_info: Ваш маркер резервного копіювання скинуто. mail_body_backup_token_info: Попередній маркер більше не дійсний. mail_body_backup_waiting_period: Новий маркер почне діяти через %{hours} год. - mail_body_backup_token_warning: Якщо це були не ви, негайно ввійдіть в OpenProject - і знову скиньте його. - mail_body_incoming_email_error: Не вдалось обробити електронний лист, надісланий - на адресу OpenProject. - mail_body_incoming_email_error_in_reply_to: О %{received_at} %{from_email} написав(-ла) - mail_body_incoming_email_error_logs: Журнали - mail_body_lost_password: 'Щоб змінити пароль, натисніть на посилання:' + mail_body_backup_token_warning: Якщо це були не ви, негайно ввійдіть в OpenProject і знову скиньте його. + mail_body_incoming_email_error: Не вдалось обробити електронний лист, надісланий на адресу OpenProject. + mail_body_incoming_email_error_in_reply_to: "О %{received_at} %{from_email} написав(-ла)" + mail_body_incoming_email_error_logs: "Журнали" + mail_body_lost_password: "Щоб змінити пароль, натисніть на посилання:" mail_password_change_not_possible: - title: Неможливо змінити пароль - body: Ваш обліковий запис %{app_title} зв’язано із зовнішнім постачальником послуг - автентифікації (%{name}). - subtext: Паролі для зовнішніх облікових записів не можна змінювати в додатку. - Скористайтеся функцією відновлення пароля в додатку свого постачальника послуг - автентифікації. - mail_body_register: 'Вітаємо в %{app_title}. Активуйте свій обліковий запис, перейшовши - за цим посиланням:' - mail_body_register_header_title: Електронний лист із запрошенням стати учасником - проєкту - mail_body_register_user: Добрий день, %{name}! + title: "Неможливо змінити пароль" + body: "Ваш обліковий запис %{app_title} зв’язано із зовнішнім постачальником послуг автентифікації (%{name})." + subtext: "Паролі для зовнішніх облікових записів не можна змінювати в додатку. Скористайтеся функцією відновлення пароля в додатку свого постачальника послуг автентифікації." + mail_body_register: "Вітаємо в %{app_title}. Активуйте свій обліковий запис, перейшовши за цим посиланням:" + mail_body_register_header_title: "Електронний лист із запрошенням стати учасником проєкту" + mail_body_register_user: "Добрий день, %{name}!" mail_body_register_links_html: | Ознайомтеся з нашим каналом на YouTube (%{youtube_link}), де ми проводимо вебінар (%{webinar_link}) і відео «Як почати роботу» (%{get_started_link}), щоб якомога більше спростити свої перші кроки в OpenProject.
Якщо виникнуть запитання, перегляньте нашу документацію (%{documentation_link}) або зверніться до адміністратора. - mail_body_register_closing: Ваша команда OpenProject - mail_body_register_ending: Будьте на зв’язку! З повагою, - mail_body_reminder: "%{count} призначених на Вас робочих пакетів на наступні %{days} - днів:" - mail_body_group_reminder: 'Пакети робіт (%{count}), призначені групі «%{group}», - потрібно завершити протягом наступних %{days} дн.:' + mail_body_register_closing: "Ваша команда OpenProject" + mail_body_register_ending: "Будьте на зв’язку! З повагою," + mail_body_reminder: "%{count} призначених на Вас робочих пакетів на наступні %{days} днів:" + mail_body_group_reminder: 'Пакети робіт (%{count}), призначені групі «%{group}», потрібно завершити протягом наступних %{days} дн.:' mail_body_wiki_page_added: "%{author} додав(ла) wiki-сторінку %{id}." mail_body_wiki_page_updated: "%{author} оновив(ла) wiki-сторінку %{id}." - mail_subject_account_activation_request: Запит на активацію облікового запису %{value} - mail_subject_backup_ready: Ваша резервна копія готова - mail_subject_backup_token_reset: Скидання маркера резервного копіювання - mail_subject_incoming_email_error: Не вдалось обробити електронний лист, надісланий - на адресу OpenProject - mail_subject_lost_password: Ваш %{value} пароль - mail_subject_register: Активація облікового запису %{value} - mail_subject_wiki_content_added: Wiki-сторінка '%{id}' була додана - mail_subject_wiki_content_updated: Wiki-сторінка '%{id}' була оновлена + mail_subject_account_activation_request: "Запит на активацію облікового запису %{value}" + mail_subject_backup_ready: "Ваша резервна копія готова" + mail_subject_backup_token_reset: "Скидання маркера резервного копіювання" + mail_subject_incoming_email_error: "Не вдалось обробити електронний лист, надісланий на адресу OpenProject" + mail_subject_lost_password: "Ваш %{value} пароль" + mail_subject_register: "Активація облікового запису %{value}" + mail_subject_wiki_content_added: "Wiki-сторінка '%{id}' була додана" + mail_subject_wiki_content_updated: "Wiki-сторінка '%{id}' була оновлена" mail_member_added_project: subject: "%{project} — вас додано як учасника" body: added_by: - without_message: Користувач %{user} додав вас як учасника проєкту «%{project}». - with_message: 'Користувач %{user} додав вас як учасника проєкту «%{project}»:' - roles: 'У вас є такі ролі:' + without_message: "Користувач %{user} додав вас як учасника проєкту «%{project}»." + with_message: "Користувач %{user} додав вас як учасника проєкту «%{project}»:" + roles: "У вас є такі ролі:" mail_member_updated_project: subject: "%{project} – ваші ролі оновлено" body: updated_by: - without_message: Користувач %{user} оновив ваші ролі в проєкті «%{project}». - with_message: 'Користувач %{user} оновив ваші ролі в проєкті «%{project}»:' - roles: 'Зараз у вас є такі ролі:' + without_message: "Користувач %{user} оновив ваші ролі в проєкті «%{project}»." + with_message: "Користувач %{user} оновив ваші ролі в проєкті «%{project}»:" + roles: "Зараз у вас є такі ролі:" mail_member_updated_global: - subject: Ваші глобальні дозволи оновлено + subject: "Ваші глобальні дозволи оновлено" body: updated_by: - without_message: 'Користувач %{user} оновив ваші глобальні ролі. ' - with_message: 'Користувач %{user} оновив ваші глобальні ролі:' - roles: 'Зараз у вас є такі ролі:' + without_message: "Користувач %{user} оновив ваші глобальні ролі. " + with_message: "Користувач %{user} оновив ваші глобальні ролі:" + roles: "Зараз у вас є такі ролі:" mail_user_activation_limit_reached: subject: Досягнуто ліміту активації користувача message: | Новий користувач (%{email}) намагалися створити обліковий запис на середовищі OpenProject, яким ви керуєте (%{host}). Користувач не може активувати свій обліковий запис після досягнення ліміту користувача. steps: - label: 'To allow the user to sign in you can either: ' - a: Оновіть план платежів ([here](upgrade_url)) - b: Блокування або видалення існуючого користувача ([here](users_url)) - more_actions: Додаткові функції - noscript_description: Щоб використовувати OpenProject, потрібно ввімкнути підтримку - JavaScript у Вашому браузері! - noscript_heading: JavaScript відключений - noscript_learn_more: Дізнатися більше - notice_accessibility_mode: Режим доступності можна ввімкнути в [налаштуваннях облікового - запису](url). - notice_account_activated: Ваш обліковий запис активовано. Тепер ви можете увійти - в систему. + label: "To allow the user to sign in you can either: " + a: "Оновіть план платежів ([here](upgrade_url))" #here turned into a link + b: "Блокування або видалення існуючого користувача ([here](users_url))" #here turned into a link + more_actions: "Додаткові функції" + noscript_description: "Щоб використовувати OpenProject, потрібно ввімкнути підтримку JavaScript у Вашому браузері!" + noscript_heading: "JavaScript відключений" + noscript_learn_more: "Дізнатися більше" + notice_accessibility_mode: Режим доступності можна ввімкнути в [налаштуваннях облікового запису](url). + notice_account_activated: "Ваш обліковий запис активовано. Тепер ви можете увійти в систему." notice_account_already_activated: Обліковий запис вже активовано. notice_account_invalid_token: Недійсний маркер активації - notice_account_invalid_credentials: Неправильне ім’я користувача або пароль - notice_account_invalid_credentials_or_blocked: Неправильне ім'я користувача або - пароль або ваш обліковий запис заблокований через багаторазових невдалих спроб - входу. Якщо це так, то вона буде автоматично розблокована протягом короткого часу. - notice_account_lost_email_sent: Електронний лист з інструкціями щодо зміни паролю - було надіслано до вас. - notice_account_new_password_forced: Потрібен новий пароль. - notice_account_password_expired: Термін дії вашого пароля закінчиться через %{days} - днів. Будь ласка змініть пароль на новий. - notice_account_password_updated: Пароль було успішно оновлено. - notice_account_pending: Ваш обліковий запис створено і тепер очікує схвалення адміністратора. - notice_account_register_done: Обліковий запис було успішно створено. Для активації - облікового запису, перейдіть по посиланню яка була відправлена вам на пошту. - notice_account_unknown_email: Невідомий користувач. - notice_account_update_failed: Не вдалося зберегти налаштування облікового запису. - Перегляньте сторінку свого облікового запису ще раз. - notice_account_updated: Обліковий запис було успішно оновлено. - notice_account_other_session_expired: Усі інші сеанси, пов'язані з вашим обліковим - записом, визнані недійсними. - notice_account_wrong_password: Невірний пароль - notice_account_registered_and_logged_in: Ласкаво просимо, ваша обліковий запис активований. - Ви зараз увійшли. + notice_account_invalid_credentials: "Неправильне ім’я користувача або пароль" + notice_account_invalid_credentials_or_blocked: "Неправильне ім'я користувача або пароль або ваш обліковий запис заблокований через багаторазових невдалих спроб входу. Якщо це так, то вона буде автоматично розблокована протягом короткого часу." + notice_account_lost_email_sent: "Електронний лист з інструкціями щодо зміни паролю було надіслано до вас." + notice_account_new_password_forced: "Потрібен новий пароль." + notice_account_password_expired: "Термін дії вашого пароля закінчиться через %{days} днів. Будь ласка змініть пароль на новий." + notice_account_password_updated: "Пароль було успішно оновлено." + notice_account_pending: "Ваш обліковий запис створено і тепер очікує схвалення адміністратора." + notice_account_register_done: "Обліковий запис було успішно створено. Для активації облікового запису, перейдіть по посиланню яка була відправлена вам на пошту." + notice_account_unknown_email: "Невідомий користувач." + notice_account_update_failed: "Не вдалося зберегти налаштування облікового запису. Перегляньте сторінку свого облікового запису ще раз." + notice_account_updated: "Обліковий запис було успішно оновлено." + notice_account_other_session_expired: "Усі інші сеанси, пов'язані з вашим обліковим записом, визнані недійсними." + notice_account_wrong_password: "Невірний пароль" + notice_account_registered_and_logged_in: "Ласкаво просимо, ваша обліковий запис активований. Ви зараз увійшли." notice_activation_failed: Не вдалося активувати обліковий запис. - notice_auth_stage_verification_error: Не вдалося підтвердити етап %{stage}. - notice_auth_stage_wrong_stage: Передбачається завершити етап аутентифікації%{expected}, - але %{actual} returned. - notice_auth_stage_error: Етап автентифікації %{stage} не вдався. - notice_can_t_change_password: Для даного облікового запису використовується джерело - зовнішньої аутентифікації. Неможливо змінити пароль. - notice_custom_options_deleted: Варіант %{option_value} і його %{num_deleted} вилучень - було видалено. - notice_email_error: Під час відправки листа відбулася помилка (%{value}) - notice_email_sent: Відправлено листа %{value} - notice_failed_to_save_work_packages: 'Не вдалося зберегти %{count} робочих пакетів - на %{total} вибрано: %{ids}.' - notice_failed_to_save_members: 'Не вдалось зберегти учасника(ів): %{errors}.' - notice_deletion_scheduled: Видалення заплановано та виконується асинхронно. - notice_file_not_found: Сторінка, на яку ви намагаєтеся зайти, не існує або видалена. - notice_forced_logout: Ви автоматично вийшли з системи після %{ttl_time} хвилин бездіяльності. - notice_internal_server_error: Сталася помилка на сторінці, до якої ви намагалися - отримати доступ. Якщо ви продовжуєте відчувати проблеми, зверніться до свого адміністратора - %{app_title} за допомогою. - notice_locking_conflict: Інформація була оновлена принаймні один інший користувач - в той же час. - notice_locking_conflict_additional_information: Оновлення надійшли від %{users}. - notice_locking_conflict_reload_page: Будь ласка поновіть сторінку, перевірте зміни - та застосувати оновлення. - notice_locking_conflict_warning: Хтось оновив цю сторінку. Щоб не втратити свої - зміни, скопіюйте й збережіть їх локально й перезавантажте сторінку, щоб переглянути - оновлену версію. - notice_locking_conflict_danger: Не вдалося зберегти зміни через суперечливі модифікації. - Щоб не втратити зміни, скопіюйте їх локально і перезавантажте сторінку, щоб переглянути - оновлену версію. - notice_locking_conflict_action_button: Відхилити зміни й перезавантажити + notice_auth_stage_verification_error: "Не вдалося підтвердити етап %{stage}." + notice_auth_stage_wrong_stage: "Передбачається завершити етап аутентифікації%{expected}, але %{actual} returned." + notice_auth_stage_error: "Етап автентифікації %{stage} не вдався." + notice_can_t_change_password: "Для даного облікового запису використовується джерело зовнішньої аутентифікації. Неможливо змінити пароль." + notice_custom_options_deleted: "Варіант %{option_value} і його %{num_deleted} вилучень було видалено." + notice_email_error: "Під час відправки листа відбулася помилка (%{value})" + notice_email_sent: "Відправлено листа %{value}" + notice_failed_to_save_work_packages: "Не вдалося зберегти %{count} робочих пакетів на %{total} вибрано: %{ids}." + notice_failed_to_save_members: "Не вдалось зберегти учасника(ів): %{errors}." + notice_deletion_scheduled: "Видалення заплановано та виконується асинхронно." + notice_file_not_found: "Сторінка, на яку ви намагаєтеся зайти, не існує або видалена." + notice_forced_logout: "Ви автоматично вийшли з системи після %{ttl_time} хвилин бездіяльності." + notice_internal_server_error: "Сталася помилка на сторінці, до якої ви намагалися отримати доступ. Якщо ви продовжуєте відчувати проблеми, зверніться до свого адміністратора %{app_title} за допомогою." + notice_locking_conflict: "Інформація була оновлена принаймні один інший користувач в той же час." + notice_locking_conflict_additional_information: "Оновлення надійшли від %{users}." + notice_locking_conflict_reload_page: "Будь ласка поновіть сторінку, перевірте зміни та застосувати оновлення." + notice_locking_conflict_warning: "Хтось оновив цю сторінку. Щоб не втратити свої зміни, скопіюйте й збережіть їх локально й перезавантажте сторінку, щоб переглянути оновлену версію." + notice_locking_conflict_danger: "Не вдалося зберегти зміни через суперечливі модифікації. Щоб не втратити зміни, скопіюйте їх локально і перезавантажте сторінку, щоб переглянути оновлену версію." + notice_locking_conflict_action_button: "Відхилити зміни й перезавантажити" notice_member_added: Додано %{name} проекту. notice_members_added: Додано %{number} користувач(-а,-ів) до проекту. - notice_member_removed: Користувач %{user} видалений з проекту. + notice_member_removed: "Користувач %{user} видалений з проекту." notice_member_deleted: "%{user} був виключений з проекту і був знищений." - notice_no_principals_found: Результатів не знайдено. - notice_bad_request: Неправильний Запит. - notice_not_authorized: Ви не авторизовані для доступу до цієї сторінки. - notice_not_authorized_archived_project: Проект ви намагаєтеся отримати доступ до - архіву. - notice_requires_enterprise_token: Токен Enterprise відсутній або не надає доступу - до цієї сторінки. - notice_password_confirmation_failed: Введений пароль неправильний. - notice_principals_found_multiple: "There are %{number} знайдені результати. \nВкладка - для фокусування першого результату." - notice_principals_found_single: Знайдений один результат. Натисніть для переходу - до нього. - notice_parent_item_not_found: Батьківський об’єкт не знайдено. - notice_project_not_deleted: Проект не був видалений. - notice_project_not_found: Проєкт не знайдено. - notice_successful_connection: Підключення успішно встановлене. - notice_successful_create: Створення успішно завершене. - notice_successful_delete: Видалення успішно завершене. - notice_successful_cancel: Успішно видалено. - notice_successful_update: Успішно оновлено. - notice_successful_move: Successful move from %{from} to %{to}. - notice_unsuccessful_create: Не вдалося створити. - notice_unsuccessful_create_with_reason: 'Не вдалося створити: %{reason}' - notice_unsuccessful_update: Не вдалось оновити. - notice_unsuccessful_update_with_reason: 'Помилка оновлення: %{reason}' - notice_successful_update_custom_fields_added_to_project: 'Оновлення завершено. Користувацькі - поля активованих типів автоматично активовано у формі пакета робіт. Докладніше. - - ' - notice_to_many_principals_to_display: |- - Є занадто багато результатів. - Звузити пошук ввівши назву нового елемента (або групи). - notice_user_missing_authentication_method: Користувач ще не вибрав пароль або інший - спосіб входу. + notice_no_principals_found: "Результатів не знайдено." + notice_bad_request: "Неправильний Запит." + notice_not_authorized: "Ви не авторизовані для доступу до цієї сторінки." + notice_not_authorized_archived_project: "Проект ви намагаєтеся отримати доступ до архіву." + notice_requires_enterprise_token: "Токен Enterprise відсутній або не надає доступу до цієї сторінки." + notice_password_confirmation_failed: "Введений пароль неправильний." + notice_principals_found_multiple: "There are %{number} знайдені результати. \nВкладка для фокусування першого результату." + notice_principals_found_single: "Знайдений один результат. Натисніть для переходу до нього." + notice_parent_item_not_found: "Батьківський об’єкт не знайдено." + notice_project_not_deleted: "Проект не був видалений." + notice_project_not_found: "Проєкт не знайдено." + notice_successful_connection: "Підключення успішно встановлене." + notice_successful_create: "Створення успішно завершене." + notice_successful_delete: "Видалення успішно завершене." + notice_successful_cancel: "Успішно видалено." + notice_successful_update: "Успішно оновлено." + notice_successful_move: "Успішне перенесення з %{from} у %{to}." + notice_unsuccessful_create: "Не вдалося створити." + notice_unsuccessful_create_with_reason: "Не вдалося створити: %{reason}" + notice_unsuccessful_update: "Не вдалось оновити." + notice_unsuccessful_update_with_reason: "Помилка оновлення: %{reason}" + notice_successful_update_custom_fields_added_to_project: | + Оновлення завершено. Користувацькі поля активованих типів автоматично активовано у формі пакета робіт. Докладніше. + notice_to_many_principals_to_display: "Є занадто багато результатів.\nЗвузити пошук ввівши назву нового елемента (або групи)." + notice_user_missing_authentication_method: Користувач ще не вибрав пароль або інший спосіб входу. notice_user_invitation_resent: Надіслано запрошення %{email}. - present_access_key_value: 'Ваш ключ %{key_name}: %{value}' - notice_automatic_set_of_standard_type: Встановіть стандартний тип автоматично. - notice_logged_out: Ви вийшли з системи. + present_access_key_value: "Ваш ключ %{key_name}: %{value}" + notice_automatic_set_of_standard_type: "Встановіть стандартний тип автоматично." + notice_logged_out: "Ви вийшли з системи." notice_wont_delete_auth_source: LDAP-підключення не можна видалити, поки воно використовується. - notice_project_cannot_update_custom_fields: 'Неможливо оновити доступні користувальницькі - поля проекту. Проект недійсний: %{errors}' - notice_attachment_migration_wiki_page: 'Ця сторінка була створена автоматично під - час оновлення OpenProject. Він містить усі вкладення, раніше пов''язані з %{container_type} - %{container_name}. - - ' + notice_project_cannot_update_custom_fields: "Неможливо оновити доступні користувальницькі поля проекту. Проект недійсний: %{errors}" + notice_attachment_migration_wiki_page: > + Ця сторінка була створена автоматично під час оновлення OpenProject. Він містить усі вкладення, раніше пов'язані з %{container_type} %{container_name}. + #Default format for numbers number: format: delimiter: "," @@ -5016,251 +4342,223 @@ uk: separator: "." human: format: - delimiter: '' + delimiter: "" precision: 1 storage_units: format: "%n %u" units: byte: - one: Байт - few: Байти - many: Байти - other: Байти - gb: ГБ - kb: кБ - mb: МБ - tb: ТБ + one: "Байт" + few: "Байти" + many: "Байти" + other: "Байти" + gb: "ГБ" + kb: "кБ" + mb: "МБ" + tb: "ТБ" onboarding: - heading_getting_started: Отримати огляд - text_getting_started_description: Отримайте стислий огляд управління проєктами - та командної роботи в OpenProject. Це відео можна переглянути знову в меню довідки. - welcome: Вітаємо в додатку %{app_title} - select_language: Будь ласка, виберіть мову - permission_add_work_package_comments: Додавання коментарів - permission_add_work_packages: Додати робочі пакети - permission_add_messages: Відправка повідомлень - permission_add_project: Створення проєктів - permission_add_portfolios: Створити портфелі - permission_add_programs: Створити програми - permission_add_work_package_attachments: Додати вкладення - permission_add_work_package_attachments_explanation: Дає змогу додавати вкладення - без дозволу «Редагування пакетів робіт» - permission_add_internal_comments: Створення внутрішніх коментарів - permission_archive_project: Архівувати проєкт - permission_create_user: Створення користувачів - permission_manage_user: Редагування користувачів - permission_manage_placeholder_user: Створення, редагування та видалення прототипів - користувачів - permission_add_subprojects: Створення підпроектів - permission_add_work_package_watchers: Додати спостерігачів - permission_assign_versions: Призначити версії - permission_browse_repository: Доступ лише на читання з репозиторію (перегляд і перевірка) - permission_change_wiki_parent_page: Змінити батьківську wiki сторінку - permission_change_work_package_status: Змінити статус пакета робіт - permission_change_work_package_status_explanation: Дає змогу змінювати статус без - дозволу «Редагування пакетів робіт» - permission_comment_news: Коментування новин - permission_commit_access: Доступ для читання/запису до сховища (фіксація) - permission_copy_projects: Копіювати проекти - permission_copy_projects_explanation: У шаблонних проєктах цей дозвіл має другорядну - функцію; він дає змогу створювати нові проєкти на основі шаблону. - permission_copy_work_packages: Дублювати пакети робіт - permission_create_backup: Створення резервних копій - permission_delete_work_package_watchers: Видалення спостерігачів - permission_delete_work_packages: Видалити робочі пакети - permission_delete_messages: Видалити повідомлення - permission_delete_own_messages: Видалення власних повідомлень - permission_delete_reportings: Видалити звіти - permission_delete_timelines: Видалити графіки - permission_delete_wiki_pages: Видалення wiki-сторінок - permission_delete_wiki_pages_attachments: Видалення прикріплених файлів - permission_edit_work_package_comments: Модерування коментарів - permission_edit_work_package_comments_explanation: Увага! Користувачі із цим дозволом - можуть редагувати будь-чиї коментарі. - permission_edit_work_packages: Редагувати робочі пакети - permission_edit_messages: Редагування повідомлень - permission_edit_own_internal_comments: Редагування власних внутрішніх коментарів - permission_edit_own_work_package_comments: Редагування власних коментарів - permission_edit_own_messages: Редагування власних повідомлень - permission_edit_own_time_entries: Редагування власного обліку часу - permission_edit_others_internal_comments: Модерування внутрішніх коментарів - permission_edit_others_internal_comments_explanation: Увага! Користувачі із цим - дозволом можуть редагувати будь-чиї внутрішні коментарі. - permission_edit_project: Редагувати проект + heading_getting_started: "Отримати огляд" + text_getting_started_description: "Отримайте стислий огляд управління проєктами та командної роботи в OpenProject. Це відео можна переглянути знову в меню довідки." + welcome: "Вітаємо в додатку %{app_title}" + select_language: "Будь ласка, виберіть мову" + permission_add_work_package_comments: "Додавання коментарів" + permission_add_work_packages: "Додати робочі пакети" + permission_add_messages: "Відправка повідомлень" + permission_add_project: "Створення проєктів" + permission_add_portfolios: "Створити портфелі" + permission_add_programs: "Створити програми" + permission_add_work_package_attachments: "Додати вкладення" + permission_add_work_package_attachments_explanation: "Дає змогу додавати вкладення без дозволу «Редагування пакетів робіт»" + permission_add_internal_comments: "Створення внутрішніх коментарів" + permission_archive_project: "Архівувати проєкт" + permission_create_user: "Створення користувачів" + permission_manage_user: "Редагування користувачів" + permission_manage_placeholder_user: "Створення, редагування та видалення прототипів користувачів" + permission_add_subprojects: "Створення підпроектів" + permission_add_work_package_watchers: "Додати спостерігачів" + permission_assign_versions: "Призначити версії" + permission_browse_repository: "Доступ лише на читання з репозиторію (перегляд і перевірка)" + permission_change_wiki_parent_page: "Змінити батьківську wiki сторінку" + permission_change_work_package_status: "Змінити статус пакета робіт" + permission_change_work_package_status_explanation: "Дає змогу змінювати статус без дозволу «Редагування пакетів робіт»" + permission_comment_news: "Коментування новин" + permission_commit_access: "Доступ для читання/запису до сховища (фіксація)" + permission_copy_projects: "Копіювати проекти" + permission_copy_projects_explanation: "У шаблонних проєктах цей дозвіл має другорядну функцію; він дає змогу створювати нові проєкти на основі шаблону." + permission_copy_work_packages: "Дублювати пакети робіт" + permission_create_backup: "Створення резервних копій" + permission_delete_work_package_watchers: "Видалення спостерігачів" + permission_delete_work_packages: "Видалити робочі пакети" + permission_delete_messages: "Видалити повідомлення" + permission_delete_own_messages: "Видалення власних повідомлень" + permission_delete_reportings: "Видалити звіти" + permission_delete_timelines: "Видалити графіки" + permission_delete_wiki_pages: "Видалення wiki-сторінок" + permission_delete_wiki_pages_attachments: "Видалення прикріплених файлів" + permission_edit_work_package_comments: "Модерування коментарів" + permission_edit_work_package_comments_explanation: "Увага! Користувачі із цим дозволом можуть редагувати будь-чиї коментарі." + permission_edit_work_packages: "Редагувати робочі пакети" + permission_edit_messages: "Редагування повідомлень" + permission_edit_own_internal_comments: "Редагування власних внутрішніх коментарів" + permission_edit_own_work_package_comments: "Редагування власних коментарів" + permission_edit_own_messages: "Редагування власних повідомлень" + permission_edit_own_time_entries: "Редагування власного обліку часу" + permission_edit_others_internal_comments: "Модерування внутрішніх коментарів" + permission_edit_others_internal_comments_explanation: "Увага! Користувачі із цим дозволом можуть редагувати будь-чиї внутрішні коментарі." + permission_edit_project: "Редагувати проект" permission_edit_project_attributes: " Редагувати атрибути проєкту" - permission_edit_project_phases: Редагування етапів проєкту - permission_edit_reportings: Редагування звітів - permission_edit_time_entries: Редагувати журнали часу для інших користувачів - permission_edit_timelines: Змінити часові рамки - permission_edit_wiki_pages: Редагування wiki-сторінок - permission_export_work_packages: Експорт робочих пакетів - permission_export_projects: Експорт проєктів - permission_export_wiki_pages: Експорт wiki-сторінок - permission_invite_members_by_email: Запрошення учасників електронною поштою - permission_invite_members_by_email_explanation: 'Дозвольте запрошувати нових користувачів - електронною поштою. Запрошені користувачі отримають лист із посиланням для встановлення - пароля й активації облікового запису. На це налаштування впливає дозвіл на керування - користувачами. - - ' - permission_list_attachments: Список вкладень - permission_log_own_time: Реєструвати власний час - permission_log_time: Реєструвати час для інших користувачів - permission_manage_forums: Управління форумами - permission_manage_categories: Управління категоріями пакет робота - permission_manage_dashboards: Керування інформаційними панелями - permission_manage_work_package_relations: Управління зв'язками робочого пакету - permission_manage_members: Управління учасниками - permission_manage_news: Управління новинами - permission_manage_project_activities: Управління проектною діяльністю - permission_manage_public_queries: Керуйте переглядами громадськості - permission_manage_repository: Управління сховищем - permission_manage_subtasks: Керування ієрархіями пакетів робіт - permission_manage_versions: Управління версіями - permission_manage_wiki: Управління wiki - permission_manage_wiki_menu: Керування wiki-меню - permission_move_work_packages: Переміщення робочих пакетів - permission_protect_wiki_pages: Захист wiki-сторінок - permission_rename_wiki_pages: Перейменування wiki-сторінок - permission_save_queries: Зберегти перегляди - permission_search_project: Пошук проєктів - permission_select_custom_fields: Вибирати власні поля - permission_select_project_custom_fields: Виберіть атрибути проєкту - permission_select_project_phases: Вибір етапів проєкту - permission_select_project_phases_explanation: Активація / деактивація етапів у проєкті. - Дає змогу користувачу вибрати відповідний життєвий цикл для проєкту, оскільки - неактивні етапи не відображатимуться на сторінці огляду проєкту й у списку проєктів. - permission_select_project_modules: Вибір модулів проекту - permission_share_work_packages: Надати доступ до пакетів робіт - permission_manage_types: Виберіть типи - permission_manage_own_reminders: Створюйте власні нагадування - permission_view_all_principals: Перегляд усіх користувачів і груп - permission_view_all_principals_explanation: 'Дозволяє бачити всіх користувачів і - групи, які є в системі, навіть якщо вони не учасники проєктів або груп, до яких - приєднався користувач. - - ' - permission_view_project: Перегляд проєктів - permission_view_changesets: Перегляд змін репозиторію (сховища) в OpenProject - permission_view_internal_comments: Перегляд внутрішніх коментарів - permission_view_commit_author_statistics: Перегляд статистики комітів автора - permission_view_dashboards: Перегляд панелей керування - permission_view_work_package_watchers: Перегляд списку спостерігачів - permission_view_work_packages: Переглянути робочі пакети - permission_view_messages: Перегляд повідомлень - permission_view_news: Перегляд новин - permission_view_members: Перегляд учасників - permission_view_reportings: Перегляд звітів - permission_view_shared_work_packages: Переглянути дозволи на доступ до пакета робіт - permission_view_time_entries: Перегляд трудовитрат - permission_view_timelines: Переглянути часові рамки - permission_view_user_email: Переглянути поштові адреси користувачів - permission_view_wiki_edits: Перегляд історії wiki - permission_view_wiki_pages: Перегляд wiki - permission_work_package_assigned: Стати виконавцем / відповідальним - permission_work_package_assigned_explanation: Робочі пакети можуть бути призначені - користувачам і групам, які володіють цією роллю у відповідному проекті - permission_view_project_activity: Перегляд дій у проєкті - permission_view_project_attributes: Переглянути атрибути проєкту - permission_view_project_phases: Перегляд етапів проєкту - permission_save_bcf_queries: Зберігання запитів BCF - permission_manage_public_bcf_queries: Керування загальнодоступними запитами BCF - permission_edit_attribute_help_texts: Редагування текстів довідки для атрибутів - permission_manage_public_project_queries: Керування списками загальнодоступних проєктів - permission_view_project_query: Перегляд запиту проєктів - permission_edit_project_query: Редагування запиту проєктів + permission_edit_project_phases: "Редагування етапів проєкту" + permission_edit_reportings: "Редагування звітів" + permission_edit_time_entries: "Редагувати журнали часу для інших користувачів" + permission_edit_timelines: "Змінити часові рамки" + permission_edit_wiki_pages: "Редагування wiki-сторінок" + permission_export_work_packages: "Експорт робочих пакетів" + permission_export_projects: "Експорт проєктів" + permission_export_wiki_pages: "Експорт wiki-сторінок" + permission_invite_members_by_email: "Запрошення учасників електронною поштою" + permission_invite_members_by_email_explanation: > + Дозвольте запрошувати нових користувачів електронною поштою. Запрошені користувачі отримають лист із посиланням для встановлення пароля й активації облікового запису. На це налаштування впливає дозвіл на керування користувачами. + permission_list_attachments: "Список вкладень" + permission_log_own_time: "Реєструвати власний час" + permission_log_time: "Реєструвати час для інших користувачів" + permission_manage_forums: "Управління форумами" + permission_manage_categories: "Управління категоріями пакет робота" + permission_manage_dashboards: "Керування інформаційними панелями" + permission_manage_work_package_relations: "Управління зв'язками робочого пакету" + permission_manage_members: "Управління учасниками" + permission_manage_news: "Управління новинами" + permission_manage_project_activities: "Управління проектною діяльністю" + permission_manage_public_queries: "Керуйте переглядами громадськості" + permission_manage_repository: "Управління сховищем" + permission_manage_subtasks: "Керування ієрархіями пакетів робіт" + permission_manage_versions: "Управління версіями" + permission_manage_wiki: "Управління wiki" + permission_manage_wiki_menu: "Керування wiki-меню" + permission_move_work_packages: "Переміщення робочих пакетів" + permission_protect_wiki_pages: "Захист wiki-сторінок" + permission_rename_wiki_pages: "Перейменування wiki-сторінок" + permission_save_queries: "Зберегти перегляди" + permission_search_project: "Пошук проєктів" + permission_select_custom_fields: "Вибирати власні поля" + permission_select_project_custom_fields: "Виберіть атрибути проєкту" + permission_select_project_phases: "Вибір етапів проєкту" + permission_select_project_phases_explanation: "Активація / деактивація етапів у проєкті. Дає змогу користувачу вибрати відповідний життєвий цикл для проєкту, оскільки неактивні етапи не відображатимуться на сторінці огляду проєкту й у списку проєктів." + permission_select_project_modules: "Вибір модулів проекту" + permission_share_work_packages: "Надати доступ до пакетів робіт" + permission_manage_types: "Виберіть типи" + permission_manage_own_reminders: "Створюйте власні нагадування" + permission_view_all_principals: "Перегляд усіх користувачів і груп" + permission_view_all_principals_explanation: > + Дозволяє бачити всіх користувачів і групи, які є в системі, навіть якщо вони не учасники проєктів або груп, до яких приєднався користувач. + permission_view_project: "Перегляд проєктів" + permission_view_changesets: "Перегляд змін репозиторію (сховища) в OpenProject" + permission_view_internal_comments: "Перегляд внутрішніх коментарів" + permission_view_commit_author_statistics: "Перегляд статистики комітів автора" + permission_view_dashboards: "Перегляд панелей керування" + permission_view_work_package_watchers: "Перегляд списку спостерігачів" + permission_view_work_packages: "Переглянути робочі пакети" + permission_view_messages: "Перегляд повідомлень" + permission_view_news: "Перегляд новин" + permission_view_members: "Перегляд учасників" + permission_view_reportings: "Перегляд звітів" + permission_view_shared_work_packages: "Переглянути дозволи на доступ до пакета робіт" + permission_view_time_entries: "Перегляд трудовитрат" + permission_view_timelines: "Переглянути часові рамки" + permission_view_user_email: "Переглянути поштові адреси користувачів" + permission_view_wiki_edits: "Перегляд історії wiki" + permission_view_wiki_pages: "Перегляд wiki" + permission_work_package_assigned: "Стати виконавцем / відповідальним" + permission_work_package_assigned_explanation: "Робочі пакети можуть бути призначені користувачам і групам, які володіють цією роллю у відповідному проекті" + permission_view_project_activity: "Перегляд дій у проєкті" + permission_view_project_attributes: "Переглянути атрибути проєкту" + permission_view_project_phases: "Перегляд етапів проєкту" + permission_save_bcf_queries: "Зберігання запитів BCF" + permission_manage_public_bcf_queries: "Керування загальнодоступними запитами BCF" + permission_edit_attribute_help_texts: "Редагування текстів довідки для атрибутів" + permission_manage_public_project_queries: "Керування списками загальнодоступних проєктів" + permission_view_project_query: "Перегляд запиту проєктів" + permission_edit_project_query: "Редагування запиту проєктів" placeholders: default: "-" - templated_hint: Automatically generated through type %{type} + templated_hint: Автоматично згенеровано з використанням типу «%{type}» portfolio: count: - zero: 0 портфелів - one: 1 портфель + zero: "0 портфелів" + one: "1 портфель" other: "%{count} портфелі(-ів)" program: count: - zero: 0 програм - one: 1 програма + zero: "0 програм" + one: "1 програма" other: "%{count} програм(-и)" project: archive: - title: Архівування проєкту - are_you_sure: Дійсно архівувати проект %{name} ? - archived: Архівований + title: "Архівування проєкту" + are_you_sure: "Дійсно архівувати проект %{name} ?" + archived: "Архівований" count: - zero: 0 проєктів - one: 1 проєкт - other: 'Проєктів: %{count}' + zero: "0 проєктів" + one: "1 проєкт" + other: "Проєктів: %{count}" destroy: - title: Видалити проєкт - heading: Видалити цей проєкт остаточно? + title: "Видалити проєкт" + heading: "Видалити цей проєкт остаточно?" confirmation_message_for_subprojects_html: - zero: 'Ви остаточно видалите всі дані, пов’язані з проєктом %{name}. - - ' - one: 'Ви остаточно видалите всі дані, пов’язані з проєктом %{name} - і цим підпроєктом: - - ' - other: 'Ви остаточно видалите всі дані, пов’язані з проєктом %{name} - і цими підпроєктами: - - ' + zero: > + Ви остаточно видалите всі дані, пов’язані з проєктом %{name}. + one: > + Ви остаточно видалите всі дані, пов’язані з проєктом %{name} і цим підпроєктом: + other: > + Ви остаточно видалите всі дані, пов’язані з проєктом %{name} і цими підпроєктами: filters: - project_phase: 'Етап проєкту: %{phase}' - project_phase_any: 'Етап проєкту: будь-який' - project_phase_gate: 'Контрольна точка етапу проєкту: %{gate}' + project_phase: "Етап проєкту: %{phase}" + project_phase_any: "Етап проєкту: будь-який" + project_phase_gate: "Контрольна точка етапу проєкту: %{gate}" identifier: warning_one: Членам проекту доведеться перенести репозиторії проекту. warning_two: Існуючі посилання на проект більше не працюватимуть. title: Змініть ідентифікатор проекту - not_available: Проєкт Н/Д + not_available: "Проєкт Н/Д" template: - copying_title: Застосування шаблону - copying: 'Ваш проєкт створюється на основі вибраного шаблону проєкту. Ми повідомимо - Вас електронною поштою, щойно проєкт стане доступним. - - ' - use_template: Використовувати шаблон - make_template: Установити як шаблон - remove_from_templates: Вилучити із шаблонів - project_module_activity: Активність - project_module_forums: Форуми - project_module_work_package_tracking: Пакети робіт - project_module_news: Новини - project_module_repository: Репозиторій - project_module_wiki: Wiki - permission_header_for_project_module_work_package_tracking: Пакети робіт і діаграми - Ґанта + copying_title: "Застосування шаблону" + copying: > + Ваш проєкт створюється на основі вибраного шаблону проєкту. Ми повідомимо Вас електронною поштою, щойно проєкт стане доступним. + use_template: "Використовувати шаблон" + make_template: "Установити як шаблон" + remove_from_templates: "Вилучити із шаблонів" + project_module_activity: "Активність" + project_module_forums: "Форуми" + project_module_work_package_tracking: "Пакети робіт" + project_module_news: "Новини" + project_module_repository: "Репозиторій" + project_module_wiki: "Wiki" + permission_header_for_project_module_work_package_tracking: "Пакети робіт і діаграми Ґанта" query: attribute_and_direction: "%{attribute}%{direction}" + #possible query parameters (e.g. issue queries), + #which are not attributes of an AR-Model. query_fields: - active_or_archived: Активний або архівований - assigned_to_role: Роль виконавця - assignee_or_group: Правонаступник або приналежність до групи - member_of_group: Група виконавця - name_or_identifier: Ім'я або ідентифікатор - only_subproject_id: Лише підпроєкт - shared_with_user: Надано доступ користувачам - shared_with_me: Доступ надано мені - subproject_id: Включно з підпроєктом + active_or_archived: "Активний або архівований" + assigned_to_role: "Роль виконавця" + assignee_or_group: "Правонаступник або приналежність до групи" + member_of_group: "Група виконавця" + name_or_identifier: "Ім'я або ідентифікатор" + only_subproject_id: "Лише підпроєкт" + shared_with_user: "Надано доступ користувачам" + shared_with_me: "Доступ надано мені" + subproject_id: "Включно з підпроєктом" repositories: - at_identifier: на %{identifier} - atom_revision_feed: Atom-канал - autofetch_information: |- - Позначте цей пункт, якщо ви хочете, щоб репозиторії оновлювалися автоматично під час доступу до сторінки модуля сховища. - Це охоплює видобуток комітів з сховища та оновлення необхідного дискового простору. + at_identifier: "на %{identifier}" + atom_revision_feed: "Atom-канал" + autofetch_information: "Позначте цей пункт, якщо ви хочете, щоб репозиторії оновлювалися автоматично під час доступу до сторінки модуля сховища.\nЦе охоплює видобуток комітів з сховища та оновлення необхідного дискового простору." checkout: access: - readwrite: Читання + Запис - read: Лише для перегляду - none: Немає доступу до перевірки, ви можете переглядати репозиторій за допомогою - цього додатку. - access_permission: Ваші дозволи на цей репозиторій - url: Перевірити URL - base_url_text: |- - Базова URL-адреса, яка використовується для створення URL-адрес перевірки (наприклад, https://myserver.example.org/repos/). - Примітка. Базова URL-адреса використовується лише для перевизначення URL-адрес перевірки в керованих сховищах. Інші репозиторії не змінюються. + readwrite: "Читання + Запис" + read: "Лише для перегляду" + none: "Немає доступу до перевірки, ви можете переглядати репозиторій за допомогою цього додатку." + access_permission: "Ваші дозволи на цей репозиторій" + url: "Перевірити URL" + base_url_text: "Базова URL-адреса, яка використовується для створення URL-адрес перевірки (наприклад, https://myserver.example.org/repos/).\nПримітка. Базова URL-адреса використовується лише для перевизначення URL-адрес перевірки в керованих сховищах. Інші репозиторії не змінюються." default_instructions: git: |- Дані, що містяться в цьому репозиторії, можна завантажити на комп'ютер за допомогою Git. @@ -5268,872 +4566,562 @@ uk: subversion: |- Дані, що містяться в цьому сховищі, можна завантажити на комп'ютер за допомогою Subversion. Будь ласка, зверніться до документації Subversion, якщо вам потрібна додаткова інформація щодо процедури перевірки та доступних клієнтів. - enable_instructions_text: Відображає інструкції перевірки, розміщені нижче на - всіх сторінках, пов'язаних з репозиторієм. - instructions: Перевірити інструкції - show_instructions: Показати перевірені інструкції - text_instructions: Цей текст відображається поруч із URL-адресою перевірки для - вказівки щодо того, як перевірити сховище. - not_available: Перевірити інструкції не призначені для цього сховища. Зверніться - до адміністратора, щоб включити їх для цього сховища в налаштуваннях системи. - create_managed_delay: 'Зверніть увагу: керування сховищем здійснюється асинхронно - на диску і незабаром буде доступним.' - create_successful: Репозитарій зареєстровано. - delete_sucessful: Репозиторій видалено. + enable_instructions_text: "Відображає інструкції перевірки, розміщені нижче на всіх сторінках, пов'язаних з репозиторієм." + instructions: "Перевірити інструкції" + show_instructions: "Показати перевірені інструкції" + text_instructions: "Цей текст відображається поруч із URL-адресою перевірки для вказівки щодо того, як перевірити сховище." + not_available: "Перевірити інструкції не призначені для цього сховища. Зверніться до адміністратора, щоб включити їх для цього сховища в налаштуваннях системи." + create_managed_delay: "Зверніть увагу: керування сховищем здійснюється асинхронно на диску і незабаром буде доступним." + create_successful: "Репозитарій зареєстровано." + delete_sucessful: "Репозиторій видалено." destroy: - confirmation: Якщо ви продовжите, це призведе до видалення керованого репозиторію - назавжди. - info: Видалення сховища є незворотною дією. - info_not_managed: 'Примітка: Зміст цього репозиторію не буде видалено, оскільки - він не керується OpenProject.' - managed_path_note: 'Наступний каталог буде видалено: %{path}' - repository_verification: Введіть ідентифікатор проекту %{identifier}, щоб підтвердити - видалення його репозиторію. - subtitle: Ви дійсно бажаєте видалити %{repository_type} проекту %{project_name}? - subtitle_not_managed: Ви дійсно бажаєте видалити пов'язаний %{repository_type} - %{url} з проекту %{project_name}? - title: Видалити %{repository_type} - title_not_managed: Видалити посилання %{repository_type}? + confirmation: "Якщо ви продовжите, це призведе до видалення керованого репозиторію назавжди." + info: "Видалення сховища є незворотною дією." + info_not_managed: "Примітка: Зміст цього репозиторію не буде видалено, оскільки він не керується OpenProject." + managed_path_note: "Наступний каталог буде видалено: %{path}" + repository_verification: "Введіть ідентифікатор проекту %{identifier}, щоб підтвердити видалення його репозиторію." + subtitle: "Ви дійсно бажаєте видалити %{repository_type} проекту %{project_name}?" + subtitle_not_managed: "Ви дійсно бажаєте видалити пов'язаний %{repository_type} %{url} з проекту %{project_name}?" + title: "Видалити %{repository_type}" + title_not_managed: "Видалити посилання %{repository_type}?" errors: - build_failed: Неможливо створити сховище з вибраною конфігурацією. %{reason} - managed_delete: Неможливо видалити керований репозиторій. - managed_delete_local: Неможливо видалити локальне сховище на файловій системі - %{path} :%{error_message} - empty_repository: Репозиторій існує, але порожній. Він ще не містить жодних - змін. - exists_on_filesystem: Каталог сховища вже існує у файловій системі. - filesystem_access_failed: 'Під час доступу до сховища у файловій системі сталася - помилка: %{message}' - not_manageable: Цей постачальник репозиторію не може управлятися OpenProject. - path_permission_failed: 'Під час створення наступного шляху сталася помилка: - %{path}. Переконайтеся, що OpenProject може писати в цю папку.' - unauthorized: Ви не маєте права на доступ до сховища або недійсними є облікові - дані. - unavailable: Сховище недоступне. - exception_title: 'Не вдається отримати доступ до сховища: %{message}' - disabled_or_unknown_type: The selected type %{type} вимкнено або більше не - доступне для постачальника СКМ %{vendor}. - disabled_or_unknown_vendor: Продавець SCM %{vendor} вимкнено або більше не доступне. - remote_call_failed: Виклик керованого віддаленого не вдалося з повідомленням - %{message} (Код:%{code}) - remote_invalid_response: Отримано недійсну відповідь від віддаленого керування - . - remote_save_failed: Не вдалося зберегти сховище з параметрами, отриманими віддалено. + build_failed: "Неможливо створити сховище з вибраною конфігурацією. %{reason}" + managed_delete: "Неможливо видалити керований репозиторій." + managed_delete_local: "Неможливо видалити локальне сховище на файловій системі %{path} :%{error_message}" + empty_repository: "Репозиторій існує, але порожній. Він ще не містить жодних змін." + exists_on_filesystem: "Каталог сховища вже існує у файловій системі." + filesystem_access_failed: "Під час доступу до сховища у файловій системі сталася помилка: %{message}" + not_manageable: "Цей постачальник репозиторію не може управлятися OpenProject." + path_permission_failed: "Під час створення наступного шляху сталася помилка: %{path}. Переконайтеся, що OpenProject може писати в цю папку." + unauthorized: "Ви не маєте права на доступ до сховища або недійсними є облікові дані." + unavailable: "Сховище недоступне." + exception_title: "Не вдається отримати доступ до сховища: %{message}" + disabled_or_unknown_type: "The selected type %{type} вимкнено або більше не доступне для постачальника СКМ %{vendor}." + disabled_or_unknown_vendor: "Продавець SCM %{vendor} вимкнено або більше не доступне." + remote_call_failed: "Виклик керованого віддаленого не вдалося з повідомленням %{message} (Код:%{code})" + remote_invalid_response: "Отримано недійсну відповідь від віддаленого керування ." + remote_save_failed: "Не вдалося зберегти сховище з параметрами, отриманими віддалено." git: instructions: - managed_url: Це URL-адреса керованого (місцевого) сховища Git. - path: Вкажіть шлях до місцевого сховища Git ( e.g., %{example_path} ). Ви - також можете використовувати віддалені сховища, які клонувалися до локальної - копії, використовуючи значення, що починається з http(s):// or file://. - path_encoding: 'Перевизначити кодування шляху Git (за промовчанням: UTF-8)' - local_title: Посилання на існуюче локальне сховище Git - local_url: Локальний URL - local_introduction: Якщо у вас є локальний репозиторій Git, ви можете зв'язати - його з OpenProject, щоб отримати доступ до нього з програми. - managed_introduction: Нехай OpenProject автоматично створює та інтегрує локальне - сховище Git. - managed_title: Репозиторій Git інтегрований у OpenProject - managed_url: Керований URL - path: Шлях до сховища Git - path_encoding: Кодування шляху - go_to_revision: Перейти до версії - managed_remote: Керовані сховища для цього постачальника обробляються віддалено. - managed_remote_note: Інформація про URL і шлях цього сховища недоступна до її - створення. - managed_url: Керований URL + managed_url: "Це URL-адреса керованого (місцевого) сховища Git." + path: >- + Вкажіть шлях до місцевого сховища Git ( e.g., %{example_path} ). Ви також можете використовувати віддалені сховища, які клонувалися до локальної копії, використовуючи значення, що починається з http(s):// or file://. + path_encoding: "Перевизначити кодування шляху Git (за промовчанням: UTF-8)" + local_title: "Посилання на існуюче локальне сховище Git" + local_url: "Локальний URL" + local_introduction: "Якщо у вас є локальний репозиторій Git, ви можете зв'язати його з OpenProject, щоб отримати доступ до нього з програми." + managed_introduction: "Нехай OpenProject автоматично створює та інтегрує локальне сховище Git." + managed_title: "Репозиторій Git інтегрований у OpenProject" + managed_url: "Керований URL" + path: "Шлях до сховища Git" + path_encoding: "Кодування шляху" + go_to_revision: "Перейти до версії" + managed_remote: "Керовані сховища для цього постачальника обробляються віддалено." + managed_remote_note: "Інформація про URL і шлях цього сховища недоступна до її створення." + managed_url: "Керований URL" settings: - automatic_managed_repos_disabled: Вимкнути автоматичне створення - automatic_managed_repos: Автоматичне створення керованих сховищ - automatic_managed_repos_text: Встановивши тут постачальника, новостворені проекти - автоматично отримають керований репозиторій цього постачальника. - scm_vendor: Система управління джерелом управління - scm_type: Тип сховища + automatic_managed_repos_disabled: "Вимкнути автоматичне створення" + automatic_managed_repos: "Автоматичне створення керованих сховищ" + automatic_managed_repos_text: "Встановивши тут постачальника, новостворені проекти автоматично отримають керований репозиторій цього постачальника." + scm_vendor: "Система управління джерелом управління" + scm_type: "Тип сховища" scm_types: - local: Посилання на існуюче локальне сховище - existing: Посилання на існуюче сховище - managed: Створити нове сховище в OpenProject + local: "Посилання на існуюче локальне сховище" + existing: "Посилання на існуюче сховище" + managed: "Створити нове сховище в OpenProject" storage: - not_available: Споживання дискового сховища недоступне для цього сховища. - update_timeout: |- - Зберігайте останню необхідну інформацію про дисковий простір для сховища протягом N хвилин. - Оскільки підрахунок необхідного дискового простору сховища може бути довгим, збільште це значення, щоб зменшити вплив продуктивності. - oauth_application_details: 'Секретний ключ клієнта стане недоступним, коли ви - закриєте це вікно. Скопіюйте це значення в налаштування інтеграції Nextcloud - OpenProject:' - oauth_application_details_link_text: Перейти на сторінку налаштувань - setup_documentation_details: 'Якщо потрібна допомога з налаштуванням сховища - нових файлів, ознайомтеся з документацією: ' - setup_documentation_details_link_text: Налаштування файлових сховищ - show_warning_details: Щоб користуватися цим файловим сховищем, активуйте модуль - і визначене сховище в налаштуваннях кожного потрібного проєкту. + not_available: "Споживання дискового сховища недоступне для цього сховища." + update_timeout: "Зберігайте останню необхідну інформацію про дисковий простір для сховища протягом N хвилин.\nОскільки підрахунок необхідного дискового простору сховища може бути довгим, збільште це значення, щоб зменшити вплив продуктивності." + oauth_application_details: "Секретний ключ клієнта стане недоступним, коли ви закриєте це вікно. Скопіюйте це значення в налаштування інтеграції Nextcloud OpenProject:" + oauth_application_details_link_text: "Перейти на сторінку налаштувань" + setup_documentation_details: "Якщо потрібна допомога з налаштуванням сховища нових файлів, ознайомтеся з документацією: " + setup_documentation_details_link_text: "Налаштування файлових сховищ" + show_warning_details: "Щоб користуватися цим файловим сховищем, активуйте модуль і визначене сховище в налаштуваннях кожного потрібного проєкту." subversion: - existing_title: Існуюче сховище Subversion - existing_introduction: Якщо у вас є існуюче сховище Subversion, ви можете зв'язати - його з OpenProject, щоб отримати доступ до нього з програми. - existing_url: Існуючий URL + existing_title: "Існуюче сховище Subversion" + existing_introduction: "Якщо у вас є існуюче сховище Subversion, ви можете зв'язати його з OpenProject, щоб отримати доступ до нього з програми." + existing_url: "Існуючий URL" instructions: - managed_url: Це URL-адреса керованого (локального) сховища Subversion. - url: |- - Введіть URL-адресу сховища. Це може або націлити локальне сховище (починаючи з %{local_proto} ) ,або віддаленого сховища. - Підтримуються такі схеми URL-адрес: - managed_title: Репозиторій Subversion інтегрований в OpenProject - managed_introduction: Нехай OpenProject автоматично створює та інтегрує локальне - сховище Subversion. - managed_url: Керований URL - password: Пароль сховища - username: Ім'я користувача сховища - truncated: 'На жаль, нам довелося скоротити цей каталог до%{limit} файлів: %{truncated} - записи були опущені зі списку.' + managed_url: "Це URL-адреса керованого (локального) сховища Subversion." + url: "Введіть URL-адресу сховища. Це може або націлити локальне сховище (починаючи з %{local_proto} ) ,або віддаленого сховища.\nПідтримуються такі схеми URL-адрес:" + managed_title: "Репозиторій Subversion інтегрований в OpenProject" + managed_introduction: "Нехай OpenProject автоматично створює та інтегрує локальне сховище Subversion." + managed_url: "Керований URL" + password: "Пароль сховища" + username: "Ім'я користувача сховища" + truncated: "На жаль, нам довелося скоротити цей каталог до%{limit} файлів: %{truncated} записи були опущені зі списку." named_repository: "%{vendor_name} сховище" - update_settings_successful: Налаштування збережено. - url: 'URL-адреса до сховища ' + update_settings_successful: "Налаштування збережено." + url: "URL-адреса до сховища " warnings: - cannot_annotate: Цей файл не може бути анотований. + cannot_annotate: "Цей файл не може бути анотований." scheduling: - manual: ручне - automatic: автоматичне - search_input_placeholder: Пошук ... - setting_allowed_link_protocols: Дозволені протоколи для посилань - setting_allowed_link_protocols_text_html: Дозвольте відображення цих протоколів - у вигляді посилань в описах пакетів робіт, довгих текстових полях і коментарях. - Наприклад, %{tel_code} або %{element_code}. Вводьте по одному протоколу в рядок. -
Протоколи %{http_code}, %{https_code} і %{mailto_code} завжди дозволені. - setting_capture_external_links: Захоплення зовнішніх посилань - setting_capture_external_links_text: 'Якщо ввімкнено, усі зовнішні посилання у відформатованому - тексті переспрямовуватимуть на попереджувальну сторінку перед переходом із додатка. - Це допомагає захистити користувачів від потенційно шкідливих зовнішніх вебсайтів. - - ' - setting_capture_external_links_require_login: Require users to be logged in - setting_capture_external_links_require_login_text: 'When enabled, users wanting - to click on external links need to be logged in before being able to continue. - - ' - setting_after_first_login_redirect_url: Переспрямування після першого входу - setting_after_first_login_redirect_url_text_html: 'Задайте шлях для переспрямування - користувачів після першого входу. Якщо не задано, користувачі переспрямовуються - на головну сторінку з ознайомленням.
Наприклад: /my/page - - ' - setting_after_login_default_redirect_url: Переспрямування після входу - setting_after_login_default_redirect_url_text_html: 'Задайте шлях за замовчуванням - для переспрямування користувачів після входу, якщо зворотне посилання не надано. - Якщо не задано, користувачі переспрямовуються на головну сторінку.
Приклад: - /my/page - - ' - setting_apiv3_cors_title: Спільне використання ресурсів із різних джерел (CORS) - setting_apiv3_cors_enabled: Увімкнути CORS - setting_apiv3_cors_origins: Дозволені джерела CORS (Cross-Origin Resource Sharing) - в API версії 3 - setting_apiv3_cors_origins_text_html: 'Якщо CORS увімкнено, це джерела, які можуть - отримувати доступ до OpenProject API.
Щоб дізнатися, як указати очікувані - значення, ознайомтеся з Документацією - щодо заголовка джерела. - - ' - setting_apiv3_write_readonly_attributes: Дозвіл для записування атрибутів лише для - читання - setting_apiv3_write_readonly_attributes_instructions: 'Якщо ввімкнено, адміністратори - зможуть за допомогою API записувати статичні атрибути тільки для читання під час - створення, такі як createdAt та author. - - ' - setting_apiv3_write_readonly_attributes_warning: 'Це налаштування використовується, - наприклад, для імпорту даних, але дає змогу адміністраторам створювати елементи - від імені інших користувачів. Однак усі запити на створення реєструються із зазначенням - справжнього автора. - - ' - setting_apiv3_write_readonly_attributes_additional: 'Щоб дізнатися більше про атрибути - й підтримувані ресурси, відвідайте %{api_documentation_link}. - - ' - setting_apiv3_max_page_size: Максимальний розмір сторінки API - setting_apiv3_max_page_size_instructions: 'Установіть максимальний розмір сторінки, - яку повертатиме API. Виконувати запити до API, які повертають більше значень на - одній сторінці, буде неможливо. - - ' - setting_apiv3_max_page_size_warning: 'Змінюйте це значення, лише якщо впевнені, - навіщо це вам потрібно. Встановлення високого значення призведе до суттєвого впливу - на продуктивність, тоді як значення, нижче за параметри кожної сторінки, призведе - до помилок у посторінкових поданнях. - - ' - setting_apiv3_docs: Документація - setting_apiv3_docs_enabled: Увімкнути сторінку документів - setting_apiv3_docs_enabled_instructions_html: 'Якщо сторінку документів увімкнено, - ви можете отримати інтерактивне подання документації APIv3 за посиланням %{link}. - - ' - setting_apiv3_docs_enabled_instructions_warning: 'Зверніть увагу: увімкнення документації - API у виробничій системі може призвести до розкриття конфіденційної інформації - або випадкової втрати даних, якщо ви не будете обережними. Рекомендуємо вмикати - цей параметр лише для потреб розробки. - - ' - setting_attachment_whitelist: Дозволений список завантаження вкладень - setting_email_delivery_method: Спосіб доставки електронної пошти - setting_emails_salutation: 'Звертатися до користувача в електронних листах так:' - setting_oauth_allow_remapping_of_existing_users: Дозволити повторне зіставлення - наявних користувачів - setting_sendmail_location: Розташування виконуваного файлу sendmail - setting_sendmail_arguments: Аргументи для sendmail - setting_smtp_enable_starttls_auto: Автоматично використовуйте STARTTLS, якщо він - доступний - setting_smtp_ssl: Використовуйте SSL-з'єднання - setting_smtp_address: Сервер SMTP - setting_smtp_port: SMTP порт - setting_smtp_authentication: SMTP аутентифікація - setting_smtp_user_name: 'SMTP користувач:' - setting_smtp_password: 'SMTP пароль:' - setting_smtp_domain: Домен SMTP HELO - setting_activity_days_default: Кількість днів, відображених в Діях - setting_api_tokens_enabled: Enable API tokens - setting_api_tokens_enabled_caption: 'Decide whether users can create personal API - tokens in their account settings. These tokens can be used to access the different - APIs of OpenProject, such as APIv3 and MCP. - - ' - setting_app_subtitle: Підзаголовок додатку - setting_app_title: Назва додатку - setting_attachment_max_size: Максимальний розмір вкладення - setting_show_work_package_attachments: За замовчуванням показувати вкладення на - вкладці «Файли» - setting_antivirus_scan_mode: Режим перевірки - setting_antivirus_scan_action: Дія із зараженим файлом - setting_autofetch_changesets: Змінюється сховище автозбірки - setting_autologin: Автовхід - setting_available_languages: Доступні мови - setting_bcc_recipients: Отримувачі прихованої копії (bcc) - setting_brute_force_block_after_failed_logins: Заблокувати користувача після цієї - кількості невдалих спроб входу - setting_brute_force_block_minutes: Час, коли користувач заблоковано - setting_cache_formatted_text: Кешувати форматований текст - setting_use_wysiwyg_description: Виберіть, щоб увімкнути редактор CKEditor5 WYSIWYG - для всіх користувачів за умовчанням. CKEditor має обмежену функціональність для - GFM Markdown. - setting_column_options: Стовпці списків пакетів робіт за замовчуванням - setting_commit_fix_keywords: Призначення ключових слів - setting_commit_logs_encoding: Кодування повідомлень - setting_commit_logtime_activity_id: Активність для реєстрації часу - setting_commit_logtime_enabled: Увімкнути реєстрацію часу - setting_commit_ref_keywords: Ключові слова для посилання - setting_consent_time: Час згоди - setting_consent_info: Текст інформації про згоду - setting_consent_required: Потрібна згода - setting_consent_decline_mail: Згода на контактну пошту - setting_cross_project_work_package_relations: Дозволити взаємозв'язок між робочими - пакетами і проектами - setting_first_week_of_year: Перший тиждень у році містить - setting_date_format: Дата - setting_default_language: Мова за замовчуванням - setting_default_projects_modules: Включені по замовчуванню модулі для нових проектів - setting_default_projects_public: Нові проекти є загальнодоступними - setting_disable_password_login: Вимкнути автентифікацію за допомогою пароля - setting_diff_max_lines_displayed: Відображається максимальна кількість рядків diff - setting_omniauth_direct_login_provider: Постачальник послуг SSO для прямого входу - setting_display_subprojects_work_packages: Дисплей підпроекти пакети робіт на основні - проекти за замовчуванням - setting_duration_format: Формат тривалості - setting_duration_format_hours_only: Тільки години - setting_duration_format_days_and_hours: Дні й години - setting_duration_format_instructions: Визначає спосіб відображення значень «Робота», - «Залишок роботи» і «Витрачений час». - setting_emails_footer: Листи до нижнього колонтитула - setting_emails_header: Заголовок листа - setting_email_login: Використовуйте електронну пошту як логін - setting_enabled_scm: Увімкнені SCM - setting_enabled_projects_columns: Стовпці в списку проєктів відображаються за замовчуванням - setting_feeds_enabled: Увімкнути канали - setting_ical_enabled: Дозволити підписки на iCalendar - setting_feeds_limit: Обмеження вмісту каналу - setting_file_max_size_displayed: Максимальний розмір текстового файлу для відображення - setting_host_name: Ім'я хоста - setting_collaborative_editing_hocuspocus_url: URL-адреса сервера Hocuspocus - setting_collaborative_editing_hocuspocus_secret: Секрет сервера Hocuspocus - setting_hours_per_day: Годин на день - setting_hours_per_day_explanation: Визначає, що вважати днем, якщо тривалість представлено - в днях і годинах (наприклад, якщо день триває 8 годин, то 32 години – це 4 дні). - setting_invitation_expiration_days: Повідомлення про активацію закінчується - setting_invitation_expiration_days_caption: Кількість днів до завершення дії листа - з посиланням для активації. - setting_work_package_done_ratio: Режим обчислення прогресу - setting_work_package_done_ratio_field: На основі роботи - setting_work_package_done_ratio_field_caption_html: Для % Завершення можна - вільно встановити будь-яке значення. Якщо ви додатково введете значення для параметра - Робота, Залишок роботи буде виведено автоматично. - setting_work_package_done_ratio_status: На основі статусу - setting_work_package_done_ratio_status_caption_html: Кожен статус % Завершення - має пов'язане з ним значення. Зміна статусу змінить % Завершення. - setting_work_package_done_ratio_explanation_html: 'У режимі на основі роботи - атрибут «% завершення» може мати будь-яке значення. Якщо визначено атрибут «Робота», - з нього автоматично виводиться значення атрибута «Залишок роботи». У режимі на - основі статусу кожен статус має пов’язане з ним значення атрибута «% завершення». - У разі змінення статусу змінюється й значення атрибута «% завершення». - - ' - setting_work_package_properties: Властивості робочого пакета - setting_work_package_startdate_is_adddate: Використовувати поточну дату в якості - дати початку роботи для нових пакетів - setting_work_packages_projects_export_limit: Ліміт експорту пакетів робіт / проєктів - setting_journal_aggregation_time_minutes: Дії користувача зведено протягом - setting_log_requesting_user: Запишіть логін користувача, ім'я та поштову адресу - для всіх запитів - setting_login_required: Необхідна аутентифікація - setting_login_required_caption: Якщо встановлено, усі запити до додатка мають проходити - автентифікацію. - setting_lost_password: Увімкнути скидання пароля - setting_lost_password_caption: Якщо встановлено, користувачі можуть скидати свої - паролі. - setting_mail_from: email адреса для передачі інформації - setting_mail_handler_api_key: Ключ API - setting_mail_handler_body_delimiters: Усічення листи після однієї з цих ліній - setting_mail_handler_body_delimiter_regex: Обрізати електронні листи, які відповідають - цьому регулярному виразу - setting_mail_handler_ignore_filenames: Проігноровані вкладення пошти - setting_new_project_user_role_id: Роль, що призначається користувачу, створившому - проект - setting_new_project_send_confirmation_email: Надсилати сповіщення автору при створенні - нового проєкту - setting_new_project_notification_text: Текст сповіщення - setting_password_active_rules: Активні класи символів - setting_password_count_former_banned: Кількість останніх використаних паролів, заборонених - для повторного використання - setting_password_days_valid: Кількість днів, після чого змінюється пароль - setting_password_min_length: Мінімальна довжина - setting_password_min_adhered_rules: Мінімальна кількість необхідних класів - setting_per_page_options: Кількість записів на сторінку + manual: "ручне" + automatic: "автоматичне" + search_input_placeholder: "Пошук ..." + setting_allowed_link_protocols: "Дозволені протоколи для посилань" + setting_allowed_link_protocols_text_html: >- + Дозвольте відображення цих протоколів у вигляді посилань в описах пакетів робіт, довгих текстових полях і коментарях. Наприклад, %{tel_code} або %{element_code}. Вводьте по одному протоколу в рядок.
Протоколи %{http_code}, %{https_code} і %{mailto_code} завжди дозволені. + setting_capture_external_links: "Захоплення зовнішніх посилань" + setting_capture_external_links_text: > + Якщо ввімкнено, усі зовнішні посилання у відформатованому тексті переспрямовуватимуть на попереджувальну сторінку перед переходом із додатка. Це допомагає захистити користувачів від потенційно шкідливих зовнішніх вебсайтів. + setting_capture_external_links_require_login: "Вимагати, щоб користувачі входили в систему" + setting_capture_external_links_require_login_text: > + Якщо ввімкнено, користувачі, які переходять за зовнішнім посиланням, мають увійти в систему, інакше не зможуть продовжити. + setting_after_first_login_redirect_url: "Переспрямування після першого входу" + setting_after_first_login_redirect_url_text_html: > + Задайте шлях для переспрямування користувачів після першого входу. Якщо не задано, користувачі переспрямовуються на головну сторінку з ознайомленням.
Наприклад: /my/page + setting_after_login_default_redirect_url: "Переспрямування після входу" + setting_after_login_default_redirect_url_text_html: > + Задайте шлях за замовчуванням для переспрямування користувачів після входу, якщо зворотне посилання не надано. Якщо не задано, користувачі переспрямовуються на головну сторінку.
Приклад: /my/page + setting_apiv3_cors_title: "Спільне використання ресурсів із різних джерел (CORS)" + setting_apiv3_cors_enabled: "Увімкнути CORS" + setting_apiv3_cors_origins: "Дозволені джерела CORS (Cross-Origin Resource Sharing) в API версії 3" + setting_apiv3_cors_origins_text_html: > + Якщо CORS увімкнено, це джерела, які можуть отримувати доступ до OpenProject API.
Щоб дізнатися, як указати очікувані значення, ознайомтеся з Документацією щодо заголовка джерела. + setting_apiv3_write_readonly_attributes: "Дозвіл для записування атрибутів лише для читання" + setting_apiv3_write_readonly_attributes_instructions: > + Якщо ввімкнено, адміністратори зможуть за допомогою API записувати статичні атрибути тільки для читання під час створення, такі як createdAt та author. + setting_apiv3_write_readonly_attributes_warning: > + Це налаштування використовується, наприклад, для імпорту даних, але дає змогу адміністраторам створювати елементи від імені інших користувачів. Однак усі запити на створення реєструються із зазначенням справжнього автора. + setting_apiv3_write_readonly_attributes_additional: > + Щоб дізнатися більше про атрибути й підтримувані ресурси, відвідайте %{api_documentation_link}. + setting_apiv3_max_page_size: "Максимальний розмір сторінки API" + setting_apiv3_max_page_size_instructions: > + Установіть максимальний розмір сторінки, яку повертатиме API. Виконувати запити до API, які повертають більше значень на одній сторінці, буде неможливо. + setting_apiv3_max_page_size_warning: > + Змінюйте це значення, лише якщо впевнені, навіщо це вам потрібно. Встановлення високого значення призведе до суттєвого впливу на продуктивність, тоді як значення, нижче за параметри кожної сторінки, призведе до помилок у посторінкових поданнях. + setting_apiv3_docs: "Документація" + setting_apiv3_docs_enabled: "Увімкнути сторінку документів" + setting_apiv3_docs_enabled_instructions_html: > + Якщо сторінку документів увімкнено, ви можете отримати інтерактивне подання документації APIv3 за посиланням %{link}. + setting_apiv3_docs_enabled_instructions_warning: > + Зверніть увагу: увімкнення документації API у виробничій системі може призвести до розкриття конфіденційної інформації або випадкової втрати даних, якщо ви не будете обережними. Рекомендуємо вмикати цей параметр лише для потреб розробки. + setting_attachment_whitelist: "Дозволений список завантаження вкладень" + setting_email_delivery_method: "Спосіб доставки електронної пошти" + setting_emails_salutation: "Звертатися до користувача в електронних листах так:" + setting_oauth_allow_remapping_of_existing_users: "Дозволити повторне зіставлення наявних користувачів" + setting_sendmail_location: "Розташування виконуваного файлу sendmail" + setting_sendmail_arguments: "Аргументи для sendmail" + setting_smtp_enable_starttls_auto: "Автоматично використовуйте STARTTLS, якщо він доступний" + setting_smtp_ssl: "Використовуйте SSL-з'єднання" + setting_smtp_address: "Сервер SMTP" + setting_smtp_port: "SMTP порт" + setting_smtp_authentication: "SMTP аутентифікація" + setting_smtp_user_name: "SMTP користувач:" + setting_smtp_password: "SMTP пароль:" + setting_smtp_domain: "Домен SMTP HELO" + setting_activity_days_default: "Кількість днів, відображених в Діях" + setting_api_tokens_enabled: "Увімкнути маркери API" + setting_api_tokens_enabled_caption: > + Виберіть, чи дозволяти користувачам створювати персональні маркери API в налаштуваннях їхніх облікових записів. Ці маркери можна використовувати для доступу до різних API OpenProject, наприклад APIv3 й MCP. + setting_app_subtitle: "Підзаголовок додатку" + setting_app_title: "Назва додатку" + setting_attachment_max_size: "Максимальний розмір вкладення" + setting_show_work_package_attachments: "За замовчуванням показувати вкладення на вкладці «Файли»" + setting_antivirus_scan_mode: "Режим перевірки" + setting_antivirus_scan_action: "Дія із зараженим файлом" + setting_autofetch_changesets: "Змінюється сховище автозбірки" + setting_autologin: "Автовхід" + setting_available_languages: "Доступні мови" + setting_bcc_recipients: "Отримувачі прихованої копії (bcc)" + setting_brute_force_block_after_failed_logins: "Заблокувати користувача після цієї кількості невдалих спроб входу" + setting_brute_force_block_minutes: "Час, коли користувач заблоковано" + setting_cache_formatted_text: "Кешувати форматований текст" + setting_use_wysiwyg_description: "Виберіть, щоб увімкнути редактор CKEditor5 WYSIWYG для всіх користувачів за умовчанням. CKEditor має обмежену функціональність для GFM Markdown." + setting_column_options: "Стовпці списків пакетів робіт за замовчуванням" + setting_commit_fix_keywords: "Призначення ключових слів" + setting_commit_logs_encoding: "Кодування повідомлень" + setting_commit_logtime_activity_id: "Активність для реєстрації часу" + setting_commit_logtime_enabled: "Увімкнути реєстрацію часу" + setting_commit_ref_keywords: "Ключові слова для посилання" + setting_consent_time: "Час згоди" + setting_consent_info: "Текст інформації про згоду" + setting_consent_required: "Потрібна згода" + setting_consent_decline_mail: "Згода на контактну пошту" + setting_cross_project_work_package_relations: "Дозволити взаємозв'язок між робочими пакетами і проектами" + setting_first_week_of_year: "Перший тиждень у році містить" + setting_date_format: "Дата" + setting_default_language: "Мова за замовчуванням" + setting_default_projects_modules: "Включені по замовчуванню модулі для нових проектів" + setting_default_projects_public: "Нові проекти є загальнодоступними" + setting_disable_password_login: "Вимкнути автентифікацію за допомогою пароля" + setting_diff_max_lines_displayed: "Відображається максимальна кількість рядків diff" + setting_omniauth_direct_login_provider: "Постачальник послуг SSO для прямого входу" + setting_display_subprojects_work_packages: "Дисплей підпроекти пакети робіт на основні проекти за замовчуванням" + setting_duration_format: "Формат тривалості" + setting_duration_format_hours_only: "Тільки години" + setting_duration_format_days_and_hours: "Дні й години" + setting_duration_format_instructions: "Визначає спосіб відображення значень «Робота», «Залишок роботи» і «Витрачений час»." + setting_emails_footer: "Листи до нижнього колонтитула" + setting_emails_header: "Заголовок листа" + setting_email_login: "Використовуйте електронну пошту як логін" + setting_enabled_scm: "Увімкнені SCM" + setting_enabled_projects_columns: "Стовпці в списку проєктів відображаються за замовчуванням" + setting_feeds_enabled: "Увімкнути канали" + setting_ical_enabled: "Дозволити підписки на iCalendar" + setting_feeds_limit: "Обмеження вмісту каналу" + setting_file_max_size_displayed: "Максимальний розмір текстового файлу для відображення" + setting_host_name: "Ім'я хоста" + setting_collaborative_editing_hocuspocus_url: "URL-адреса сервера Hocuspocus" + setting_collaborative_editing_hocuspocus_secret: "Секрет сервера Hocuspocus" + setting_hours_per_day: "Годин на день" + setting_hours_per_day_explanation: >- + Визначає, що вважати днем, якщо тривалість представлено в днях і годинах (наприклад, якщо день триває 8 годин, то 32 години – це 4 дні). + setting_invitation_expiration_days: "Повідомлення про активацію закінчується" + setting_invitation_expiration_days_caption: "Кількість днів до завершення дії листа з посиланням для активації." + setting_work_package_done_ratio: "Режим обчислення прогресу" + setting_work_package_done_ratio_field: "На основі роботи" + setting_work_package_done_ratio_field_caption_html: >- + Для % Завершення можна вільно встановити будь-яке значення. Якщо ви додатково введете значення для параметра Робота, Залишок роботи буде виведено автоматично. + setting_work_package_done_ratio_status: "На основі статусу" + setting_work_package_done_ratio_status_caption_html: >- + Кожен статус % Завершення має пов'язане з ним значення. Зміна статусу змінить % Завершення. + setting_work_package_done_ratio_explanation_html: > + У режимі на основі роботи атрибут «% завершення» може мати будь-яке значення. Якщо визначено атрибут «Робота», з нього автоматично виводиться значення атрибута «Залишок роботи». У режимі на основі статусу кожен статус має пов’язане з ним значення атрибута «% завершення». У разі змінення статусу змінюється й значення атрибута «% завершення». + setting_work_package_properties: "Властивості робочого пакета" + setting_work_package_startdate_is_adddate: "Використовувати поточну дату в якості дати початку роботи для нових пакетів" + setting_work_packages_projects_export_limit: "Ліміт експорту пакетів робіт / проєктів" + setting_journal_aggregation_time_minutes: "Дії користувача зведено протягом" + setting_log_requesting_user: "Запишіть логін користувача, ім'я та поштову адресу для всіх запитів" + setting_login_required: "Необхідна аутентифікація" + setting_login_required_caption: "Якщо встановлено, усі запити до додатка мають проходити автентифікацію." + setting_lost_password: "Увімкнути скидання пароля" + setting_lost_password_caption: "Якщо встановлено, користувачі можуть скидати свої паролі." + setting_mail_from: "email адреса для передачі інформації" + setting_mail_handler_api_key: "Ключ API" + setting_mail_handler_body_delimiters: "Усічення листи після однієї з цих ліній" + setting_mail_handler_body_delimiter_regex: "Обрізати електронні листи, які відповідають цьому регулярному виразу" + setting_mail_handler_ignore_filenames: "Проігноровані вкладення пошти" + setting_new_project_user_role_id: "Роль, що призначається користувачу, створившому проект" + setting_new_project_send_confirmation_email: "Надсилати сповіщення автору при створенні нового проєкту" + setting_new_project_notification_text: "Текст сповіщення" + setting_password_active_rules: "Активні класи символів" + setting_password_count_former_banned: "Кількість останніх використаних паролів, заборонених для повторного використання" + setting_password_days_valid: "Кількість днів, після чого змінюється пароль" + setting_password_min_length: "Мінімальна довжина" + setting_password_min_adhered_rules: "Мінімальна кількість необхідних класів" + setting_per_page_options: "Кількість записів на сторінку" setting_percent_complete_on_status_closed: "% Завершення, коли статус закрито" - setting_percent_complete_on_status_closed_no_change: Без змін - setting_percent_complete_on_status_closed_no_change_caption_html: Значення % - Завершення не зміниться, навіть якщо робочий пакет закрито. - setting_percent_complete_on_status_closed_set_100p: Автоматично встановити на 100% - setting_percent_complete_on_status_closed_set_100p_caption: Закритий робочий пакет - вважається завершеним. - setting_plain_text_mail: Простий текстовий лист (без HTML) - setting_protocol: Протокол - setting_project_gantt_query: 'Подання Ґанта портфеля проєкту ' - setting_project_gantt_query_text: Ви можете змінити запит, який слугує для показу - діаграми Ґанта на сторінці огляду проєкту. - setting_security_badge_displayed: Показ значка безпеки - setting_registration_footer: Реєстраційний колонтитул - setting_registration_footer_caption: Цей текст відображається в нижньому колонтитулі - сторінки реєстрації. За допомогою редактора HTML відформатуйте текст для кожної - вибраної мови. - setting_repositories_automatic_managed_vendor: Тип автоматичного сховища - setting_repositories_encodings: Кодування сховищ - setting_repository_storage_cache_minutes: Кеш розміру диска в сховищі - setting_repository_checkout_display: Показувати інструкції щодо оформлення замовлення - setting_repository_checkout_base_url: Перевірити URL - setting_repository_checkout_text: Текст інструкції перевірки - setting_repository_log_display_limit: Максимальна кількість змін відображається - в лог файл - setting_repository_truncate_at: Максимальна кількість файлів, відображених у переглядачі - сховища - setting_self_registration: Самостійна реєстрація - setting_self_registration_caption: 'Виберіть механізм самостійної реєстрації користувачів. - Зверніть увагу, що деякі варіанти дають змогу користувачам активувати свої облікові - записи в цьому екземплярі. - - ' - setting_self_registration_warning: 'Користувачі зможуть активувати свої облікові - записи. Зверніть увагу: вони отримають доступ до всіх загальнодоступних проєктів. - Переконайтеся, що загальнодоступні проєкти не містять чутливих або персональних - даних. - - ' - setting_self_registration_disabled: Вимкнено - setting_self_registration_disabled_caption: 'Самостійна реєстрація облікових записів - заборонена. Нові облікові записи можуть створювати лише адміністратори й користувачі - з глобальним дозволом на створення нових користувачів. - - ' - setting_self_registration_activation_by_email: Активація облікового запису електронною - поштою - setting_self_registration_activation_by_email_caption: 'Користувачі можуть реєструватися - самостійно й активувати свої облікові записи після підтвердження адреси електронної - пошти. Адміністратори не мають контролю над процесом активації. - - ' - setting_self_registration_automatic_activation: Автоматична активація облікового - запису - setting_self_registration_automatic_activation_caption: 'Користувачі можуть реєструватися - самостійно. Їхні облікові записи активуються одразу без додаткових дій. Адміністратори - не мають контролю над процесом активації. - - ' - setting_self_registration_manual_activation: Ручна активація облікового запису - setting_self_registration_manual_activation_caption: 'Користувачі можуть реєструватися - самостійно. Їхні облікові записи активує адміністратор або користувач із глобальними - дозволами на створення користувачів чи керування ними. - - ' - setting_session_ttl: Період неактивності, після якого завершується сеанс - setting_session_ttl_hint: Значення нижче 5 працює як відключено - setting_session_ttl_enabled: Сеанс закінчився - setting_start_of_week: Тиждень починається - setting_sys_api_enabled: Увімкнути веб-службу керування сховищем - setting_sys_api_description: Веб-сервіс управління сховищем забезпечує інтеграцію - та авторизацію користувача для доступу до сховищ. - setting_time_format: Час - setting_total_percent_complete_mode: Обчислення підсумків ієрархів «% завершення» - setting_total_percent_complete_mode_work_weighted_average: Зважено за роботою - setting_total_percent_complete_mode_work_weighted_average_caption_html: Атрибут - Загальний % завершення буде зважено за атрибутом Робота кожного - пакета робіт в ієрархії. Пакети робіт без атрибута Робота ігноруватимуться. - setting_total_percent_complete_mode_simple_average: Середнє арифметичне - setting_total_percent_complete_mode_simple_average_caption_html: Атрибут Робота - ігнорується, а Загальний % завершення дорівнюватиме середньому арифметичному - значень атрибута % завершення пакетів робіт в ієрархії. - setting_accessibility_mode_for_anonymous: Увімкніть режим доступності для анонімних - користувачів - setting_user_format: Формат імені користувача - setting_user_default_timezone: Часовий пояс користувача за замовчуванням - setting_users_deletable_by_admins: Облікові записи користувачів можуть бути видалені - адміністраторами - setting_users_deletable_by_self: Користувачі можуть видаляти свої акаунти - setting_welcome_text: Текст блоку привітання - setting_welcome_title: Заголовок вітального блоку - setting_welcome_on_homescreen: Відображати вітальний блок на робочому столі - setting_work_package_list_default_highlighting_mode: Режим виділення за умовчанням - setting_work_package_list_default_highlighted_attributes: Стандартні вбудовані виділені - атрибути - setting_working_days: Робочі дні + setting_percent_complete_on_status_closed_no_change: "Без змін" + setting_percent_complete_on_status_closed_no_change_caption_html: >- + Значення % Завершення не зміниться, навіть якщо робочий пакет закрито. + setting_percent_complete_on_status_closed_set_100p: "Автоматично встановити на 100%" + setting_percent_complete_on_status_closed_set_100p_caption: >- + Закритий робочий пакет вважається завершеним. + setting_plain_text_mail: "Простий текстовий лист (без HTML)" + setting_protocol: "Протокол" + setting_project_gantt_query: "Подання Ґанта портфеля проєкту " + setting_project_gantt_query_text: "Ви можете змінити запит, який слугує для показу діаграми Ґанта на сторінці огляду проєкту." + setting_security_badge_displayed: "Показ значка безпеки" + setting_registration_footer: "Реєстраційний колонтитул" + setting_registration_footer_caption: "Цей текст відображається в нижньому колонтитулі сторінки реєстрації. За допомогою редактора HTML відформатуйте текст для кожної вибраної мови." + setting_repositories_automatic_managed_vendor: "Тип автоматичного сховища" + setting_repositories_encodings: "Кодування сховищ" + setting_repository_storage_cache_minutes: "Кеш розміру диска в сховищі" + setting_repository_checkout_display: "Показувати інструкції щодо оформлення замовлення" + setting_repository_checkout_base_url: "Перевірити URL" + setting_repository_checkout_text: "Текст інструкції перевірки" + setting_repository_log_display_limit: "Максимальна кількість змін відображається в лог файл" + setting_repository_truncate_at: "Максимальна кількість файлів, відображених у переглядачі сховища" + setting_self_registration: "Самостійна реєстрація" + setting_self_registration_caption: > + Виберіть механізм самостійної реєстрації користувачів. Зверніть увагу, що деякі варіанти дають змогу користувачам активувати свої облікові записи в цьому екземплярі. + setting_self_registration_warning: > + Користувачі зможуть активувати свої облікові записи. Зверніть увагу: вони отримають доступ до всіх загальнодоступних проєктів. Переконайтеся, що загальнодоступні проєкти не містять чутливих або персональних даних. + setting_self_registration_disabled: "Вимкнено" + setting_self_registration_disabled_caption: > + Самостійна реєстрація облікових записів заборонена. Нові облікові записи можуть створювати лише адміністратори й користувачі з глобальним дозволом на створення нових користувачів. + setting_self_registration_activation_by_email: "Активація облікового запису електронною поштою" + setting_self_registration_activation_by_email_caption: > + Користувачі можуть реєструватися самостійно й активувати свої облікові записи після підтвердження адреси електронної пошти. Адміністратори не мають контролю над процесом активації. + setting_self_registration_automatic_activation: "Автоматична активація облікового запису" + setting_self_registration_automatic_activation_caption: > + Користувачі можуть реєструватися самостійно. Їхні облікові записи активуються одразу без додаткових дій. Адміністратори не мають контролю над процесом активації. + setting_self_registration_manual_activation: "Ручна активація облікового запису" + setting_self_registration_manual_activation_caption: > + Користувачі можуть реєструватися самостійно. Їхні облікові записи активує адміністратор або користувач із глобальними дозволами на створення користувачів чи керування ними. + setting_session_ttl: "Період неактивності, після якого завершується сеанс" + setting_session_ttl_hint: "Значення нижче 5 працює як відключено" + setting_session_ttl_enabled: "Сеанс закінчився" + setting_start_of_week: "Тиждень починається" + setting_sys_api_enabled: "Увімкнути веб-службу керування сховищем" + setting_sys_api_description: "Веб-сервіс управління сховищем забезпечує інтеграцію та авторизацію користувача для доступу до сховищ." + setting_time_format: "Час" + setting_total_percent_complete_mode: "Обчислення підсумків ієрархів «% завершення»" + setting_total_percent_complete_mode_work_weighted_average: "Зважено за роботою" + setting_total_percent_complete_mode_work_weighted_average_caption_html: >- + Атрибут Загальний % завершення буде зважено за атрибутом Робота кожного пакета робіт в ієрархії. Пакети робіт без атрибута Робота ігноруватимуться. + setting_total_percent_complete_mode_simple_average: "Середнє арифметичне" + setting_total_percent_complete_mode_simple_average_caption_html: >- + Атрибут Робота ігнорується, а Загальний % завершення дорівнюватиме середньому арифметичному значень атрибута % завершення пакетів робіт в ієрархії. + setting_accessibility_mode_for_anonymous: "Увімкніть режим доступності для анонімних користувачів" + setting_user_format: "Формат імені користувача" + setting_user_default_timezone: "Часовий пояс користувача за замовчуванням" + setting_users_deletable_by_admins: "Облікові записи користувачів можуть бути видалені адміністраторами" + setting_users_deletable_by_self: "Користувачі можуть видаляти свої акаунти" + setting_welcome_text: "Текст блоку привітання" + setting_welcome_title: "Заголовок вітального блоку" + setting_welcome_on_homescreen: "Відображати вітальний блок на робочому столі" + setting_work_package_list_default_highlighting_mode: "Режим виділення за умовчанням" + setting_work_package_list_default_highlighted_attributes: "Стандартні вбудовані виділені атрибути" + setting_working_days: "Робочі дні" settings: errors: - not_writable: Це налаштування недоступне для запису; його може змінити лише - системний адміністратор. - failed_to_update: 'Не вдалось оновити налаштування «%{name}»: %{message}' + not_writable: "Це налаштування недоступне для запису; його може змінити лише системний адміністратор." + failed_to_update: "Не вдалось оновити налаштування «%{name}»: %{message}" authentication: - login: Увійти - registration: Реєстрація - sso: Єдиний вхід (SSO) - omniauth_direct_login_hint_html: 'Якщо цей параметр увімкнено, запити на вхід - переспрямовуватимуться налаштованому постачальнику omniauth. Спадний список - і сторінку входу буде вимкнено.
Примітка. Якщо цей - параметр увімкнено й вхід за допомогою пароля дозволено, користувачі зможуть - входити зі сторінки входу %{internal_path}. - - ' - remapping_existing_users_hint: 'Якщо ввімкнено, будь-який налаштований постачальник - ідентифікаційних даних зможе виконувати вхід в облікові записи наявних користувачів - за допомогою їхніх електронних адрес, навіть якщо користувач ніколи раніше - не входив через цього постачальника. Це може бути корисно під час перенесення - екземпляра OpenProject у сервіс нового постачальника SSO, але не рекомендовано, - якщо використовується постачальник, якому не довіряють усі користувачі вашого - екземпляра. - - ' + login: "Увійти" + registration: "Реєстрація" + sso: "Єдиний вхід (SSO)" + omniauth_direct_login_hint_html: > + Якщо цей параметр увімкнено, запити на вхід переспрямовуватимуться налаштованому постачальнику omniauth. Спадний список і сторінку входу буде вимкнено.
Примітка. Якщо цей параметр увімкнено й вхід за допомогою пароля дозволено, користувачі зможуть входити зі сторінки входу %{internal_path}. + remapping_existing_users_hint: > + Якщо ввімкнено, будь-який налаштований постачальник ідентифікаційних даних зможе виконувати вхід в облікові записи наявних користувачів за допомогою їхніх електронних адрес, навіть якщо користувач ніколи раніше не входив через цього постачальника. Це може бути корисно під час перенесення екземпляра OpenProject у сервіс нового постачальника SSO, але не рекомендовано, якщо використовується постачальник, якому не довіряють усі користувачі вашого екземпляра. attachments: - whitelist_text_html: 'Визначте список дійсних розширень файлів і/або типів MIME - для завантажених файлів.
Введіть розширення файлу (напр., %{ext_example}) - або типи MIME (напр., %{mime_example}). Не вказуйте нічого, щоб - дозволити завантаження будь-яких типів файлів. Ви можете вводити кілька значень - (по одному в кожному рядку). - - ' - show_work_package_attachments: 'Якщо вимкнути цей параметр, список вкладень - буде приховано на вкладці «Файли» пакетів робіт для нових проєктів. Файли, - вкладені в опис пакета робіт, усе одно буде додано у внутрішнє сховище вкладень. - - ' + whitelist_text_html: > + Визначте список дійсних розширень файлів і/або типів MIME для завантажених файлів.
Введіть розширення файлу (напр., %{ext_example}) або типи MIME (напр., %{mime_example}). Не вказуйте нічого, щоб дозволити завантаження будь-яких типів файлів. Ви можете вводити кілька значень (по одному в кожному рядку). + show_work_package_attachments: > + Якщо вимкнути цей параметр, список вкладень буде приховано на вкладці «Файли» пакетів робіт для нових проєктів. Файли, вкладені в опис пакета робіт, усе одно буде додано у внутрішнє сховище вкладень. antivirus: - title: Перевірка на віруси - clamav_ping_failed: Не вдалося підключити демон ClamAV. Перевірте конфігурацію - і повторіть спробу. - remaining_quarantined_files_html: 'Перевірку на віруси вимкнено. Залишок файлів - на карантині: %{file_count}. Переглянути файли на карантині можна за цим посиланням: - %{link} - - ' - remaining_scan_complete_html: 'Решту файлів перевірено. Файлів на карантині: - %{file_count}. Зараз ви перейдете на сторінку карантину, де можна видалити - або замінити файли, перенесені в карантин. - - ' - remaining_rescanned_files: 'Перевірку на віруси ввімкнено. Потрібно ще перевірити - деякі вивантажені раніше файли (%{file_count}). Цей процес заплановано у фоновому - режимі. Файли будуть доступні під час перевірки. - - ' + title: "Перевірка на віруси" + clamav_ping_failed: "Не вдалося підключити демон ClamAV. Перевірте конфігурацію і повторіть спробу." + remaining_quarantined_files_html: > + Перевірку на віруси вимкнено. Залишок файлів на карантині: %{file_count}. Переглянути файли на карантині можна за цим посиланням: %{link} + remaining_scan_complete_html: > + Решту файлів перевірено. Файлів на карантині: %{file_count}. Зараз ви перейдете на сторінку карантину, де можна видалити або замінити файли, перенесені в карантин. + remaining_rescanned_files: > + Перевірку на віруси ввімкнено. Потрібно ще перевірити деякі вивантажені раніше файли (%{file_count}). Цей процес заплановано у фоновому режимі. Файли будуть доступні під час перевірки. actions: - delete: Видалити файл - quarantine: Перенести файл на карантин - instructions_html: 'Виберіть дію, яку потрібно виконати з файлами, у яких - виявлено вірус:
  • %{quarantine_option}: помістити - файл на карантин, заборонивши користувачам доступ до нього. Адміністратори - можуть переглядати й видаляти файли на карантині на панелі адмініструванні.
  • -
  • %{delete_option}: негайно видалити файл.
- - ' + delete: "Видалити файл" + quarantine: "Перенести файл на карантин" + instructions_html: > + Виберіть дію, яку потрібно виконати з файлами, у яких виявлено вірус:
  • %{quarantine_option}: помістити файл на карантин, заборонивши користувачам доступ до нього. Адміністратори можуть переглядати й видаляти файли на карантині на панелі адмініструванні.
  • %{delete_option}: негайно видалити файл.
modes: clamav_socket_html: Введіть сокет до демона clamd, наприклад %{example} - clamav_host_html: Введіть ім’я хоста й порт до демона clamd через двокрапку, - наприклад %{example} - description_html: 'Виберіть режим, у якому має працювати інтеграція з антивірусним - сканером.
  • %{disabled_option}: вивантажені - файли не перевіряються на віруси.
  • %{socket_option}: - ви встановили ClamAV на тому ж сервері, що й OpenProject, і демон сканування - clamd працює у фоновому режимі
  • %{host_option}: - ви передаєте файли на зовнішній хост для перевірки на віруси.
- - ' - brute_force_prevention: Автоматизоване блокування користувачів + clamav_host_html: Введіть ім’я хоста й порт до демона clamd через двокрапку, наприклад %{example} + description_html: > + Виберіть режим, у якому має працювати інтеграція з антивірусним сканером.
  • %{disabled_option}: вивантажені файли не перевіряються на віруси.
  • %{socket_option}: ви встановили ClamAV на тому ж сервері, що й OpenProject, і демон сканування clamd працює у фоновому режимі
  • %{host_option}: ви передаєте файли на зовнішній хост для перевірки на віруси.
+ brute_force_prevention: "Автоматизоване блокування користувачів" date_format: - first_date_of_week_and_year_set: 'Якщо вибрано один із варіантів «%{day_of_week_setting_name}» - і «%{first_week_setting_name}», інший із цих варіантів потрібно також вибрати, - щоб уникнути розбіжностей на зовнішньому сервері. - - ' - first_week_of_year_text_html: 'Виберіть дату в січні, що припадає на перший - тиждень року. Це значення разом із першим днем тижня визначає загальну кількість - днів року. Щоб дізнатися більше, ознайомтеся з нашою документацією - на цю тему. - - ' + first_date_of_week_and_year_set: > + Якщо вибрано один із варіантів «%{day_of_week_setting_name}» і «%{first_week_setting_name}», інший із цих варіантів потрібно також вибрати, щоб уникнути розбіжностей на зовнішньому сервері. + first_week_of_year_text_html: > + Виберіть дату в січні, що припадає на перший тиждень року. Це значення разом із першим днем тижня визначає загальну кількість днів року. Щоб дізнатися більше, ознайомтеся з нашою документацією на цю тему. experimental: - save_confirmation: Увага! Існує ризик втрати даних! Активуйте експериментальні - функції, лише якщо ви готові перервати встановлення екземплара OpenProject - і втратити всі його дані. - warning_toast: Прапори функцій – це параметри, що активують функції, які ще - розробляються. Використовуйте їх лише під час тестування. Не вмикайте їх в - екземплярах OpenProject, що містять важливі дані. Використання цих функцій - майже напевно призведе до пошкодження ваших даних. Ви берете на себе відповідальність - за наслідки. + save_confirmation: Увага! Існує ризик втрати даних! Активуйте експериментальні функції, лише якщо ви готові перервати встановлення екземплара OpenProject і втратити всі його дані. + warning_toast: Прапори функцій – це параметри, що активують функції, які ще розробляються. Використовуйте їх лише під час тестування. Не вмикайте їх в екземплярах OpenProject, що містять важливі дані. Використання цих функцій майже напевно призведе до пошкодження ваших даних. Ви берете на себе відповідальність за наслідки. feature_flags: Прапори функцій - general: Загальні + general: "Загальні" highlighting: mode_long: - inline: Виділіть атрибут(и) в лінію - none: Немає підсвічування - status: Весь рядок за Статусом - type: Весь рядок за Типом - priority: Весь рядок за Пріоритетом + inline: "Виділіть атрибут(и) в лінію" + none: "Немає підсвічування" + status: "Весь рядок за Статусом" + type: "Весь рядок за Типом" + priority: "Весь рядок за Пріоритетом" icalendar: - enable_subscriptions_text_html: Дозволяє користувачам із необхідними дозволами - підписуватися на календарі OpenProject і отримувати доступ до інформації про - пакети робіт через зовнішній клієнт календаря. Примітка. - Прочитайте про підписки на iCalendar, - щоб дізнатися про потенційні ризики для безпеки перед увімкненням цього параметра. + enable_subscriptions_text_html: Дозволяє користувачам із необхідними дозволами підписуватися на календарі OpenProject і отримувати доступ до інформації про пакети робіт через зовнішній клієнт календаря. Примітка. Прочитайте про підписки на iCalendar, щоб дізнатися про потенційні ризики для безпеки перед увімкненням цього параметра. language_name_being_default: "%{language_name} (за замовчуванням)" notifications: - events_explanation: Визначає події, для яких надсилається електронний лист. - Пакети робіт виключаються зі списку, оскільки сповіщення для них можна налаштувати - окремо для кожного користувача. - delay_minutes_explanation: Надсилання електронного листа можна відкласти, щоб - користувачі з налаштованими сповіщеннями в додатку могли підтверджувати сповіщення - в додатку до надсилання листа. Користувачі, які прочитали сповіщення в додатку, - не отримуватимуть електронні листи про вже прочитані сповіщення. - other: Інше - passwords: Паролі + events_explanation: "Визначає події, для яких надсилається електронний лист. Пакети робіт виключаються зі списку, оскільки сповіщення для них можна налаштувати окремо для кожного користувача." + delay_minutes_explanation: "Надсилання електронного листа можна відкласти, щоб користувачі з налаштованими сповіщеннями в додатку могли підтверджувати сповіщення в додатку до надсилання листа. Користувачі, які прочитали сповіщення в додатку, не отримуватимуть електронні листи про вже прочитані сповіщення." + other: "Інше" + passwords: "Паролі" project_attributes: - heading: Атрибути проєкту - label_for_all_projects: Усі проєкти - label_new_attribute: Атрибут проєкту - label_new_section: Розділ - label_edit_section: Редагувати назву - label_section_actions: Дії з розділом - heading_description: Ці атрибути проєкту відображаються на сторінці огляду кожного - проєкту. Ви можете додавати нові атрибути, групувати їх за розділами й перевпорядковувати - за бажанням. Ці атрибути можна вмикати або вимикати, але не можна перевпорядковувати - на рівні проєкту. - label_project_custom_field_actions: Дії з атрибутами проєкту - label_no_project_custom_fields: У цьому розділі не визначено жодних атрибутів - проєкту + heading: "Атрибути проєкту" + label_for_all_projects: "Усі проєкти" + label_new_attribute: "Атрибут проєкту" + label_new_section: "Розділ" + label_edit_section: "Редагувати назву" + label_section_actions: "Дії з розділом" + heading_description: "Ці атрибути проєкту відображаються на сторінці огляду кожного проєкту. Ви можете додавати нові атрибути, групувати їх за розділами й перевпорядковувати за бажанням. Ці атрибути можна вмикати або вимикати, але не можна перевпорядковувати на рівні проєкту." + label_project_custom_field_actions: "Дії з атрибутами проєкту" + label_no_project_custom_fields: "У цьому розділі не визначено жодних атрибутів проєкту" edit: - description: Зміни цього атрибута проєкту відобразяться в усіх проєктах, де - його ввімкнено. Обов’язкові атрибути не можна вимикати для окремого проєкту. + description: "Зміни цього атрибута проєкту відобразяться в усіх проєктах, де його ввімкнено. Обов’язкові атрибути не можна вимикати для окремого проєкту." new: - heading: Новий атрибут - description: Зміни цього атрибута проєкту відобразяться в усіх проєктах, де - його ввімкнено. Обов’язкові атрибути не можна вимикати для окремого проєкту. + heading: "Новий атрибут" + description: "Зміни цього атрибута проєкту відобразяться в усіх проєктах, де його ввімкнено. Обов’язкові атрибути не можна вимикати для окремого проєкту." sections: display_representation: overview: - label: 'Де відображається атрибут проєкту:' + label: "Де відображається атрибут проєкту:" main_area: - label: Основна зона - description: Додайте всі атрибути проєкту як окремі віджети в основний - розділ сторінки «Огляд проєкту». + label: "Основна зона" + description: "Додайте всі атрибути проєкту як окремі віджети в основний розділ сторінки «Огляд проєкту»." side_panel: - label: Бічна панель - description: Додайте всі атрибути проєкту в розділ, що міститься на - правій бічній панелі сторінки «Огляд проєкту». + label: "Бічна панель" + description: "Додайте всі атрибути проєкту в розділ, що міститься на правій бічній панелі сторінки «Огляд проєкту»." project_initiation_request: - header_description: 'OpenProject може створити покроковий майстер, який допомагатиме - менеджерам проєктів заповнювати запити на ініціювання проєктів. Ви можете - вибрати атрибути проєктів, які слід включити, і в результаті створити артефакт - у форматі PDF. - - ' + header_description: > + OpenProject може створити покроковий майстер, який допомагатиме менеджерам проєктів заповнювати запити на ініціювання проєктів. Ви можете вибрати атрибути проєктів, які слід включити, і в результаті створити артефакт у форматі PDF. status: - submitted: Запит «%{wizard_name}» подано - submitted_description: Натисніть кнопку нижче, щоб перейти до пакета робіт - процесу подання. - submitted_button: Відкрити поданий запит - not_completed: Запит «%{wizard_name}» ще не заповнено - not_completed_description: Надайте необхідну інформацію, указавши атрибути, - і ініціюйте проєкт. + submitted: "Запит «%{wizard_name}» подано" + submitted_description: "Натисніть кнопку нижче, щоб перейти до пакета робіт процесу подання." + submitted_button: "Відкрити поданий запит" + not_completed: "Запит «%{wizard_name}» ще не заповнено" + not_completed_description: "Надайте необхідну інформацію, указавши атрибути, і ініціюйте проєкт." wizard_status_button: - project_initiation_request: Відкрити запит на ініціювання проєкту - project_creation_wizard: Відкрити майстер створення проєктів - project_mandate: Відкрити мандат проєкту + project_initiation_request: "Відкрити запит на ініціювання проєкту" + project_creation_wizard: "Відкрити майстер створення проєктів" + project_mandate: "Відкрити мандат проєкту" blankslate: - title: Запит на ініціювання проєкту не ввімкнено - description: OpenProject може створити покроковий майстер, який допомагатиме - менеджерам проєктів заповнювати запити на ініціювання проєктів. Ви можете - вибрати атрибути проєктів, які слід включити, а також указати, що робити - з вихідним документом. Щоб почати налаштування майстра, увімкніть його тут. + title: "Запит на ініціювання проєкту не ввімкнено" + description: "OpenProject може створити покроковий майстер, який допомагатиме менеджерам проєктів заповнювати запити на ініціювання проєктів. Ви можете вибрати атрибути проєктів, які слід включити, а також указати, що робити з вихідним документом. Щоб почати налаштування майстра, увімкніть його тут." disable_dialog: - title: Вимкнути запит на ініціювання проєкту - heading: Вимкнути цей запит на ініціювання проєкту? - confirmation_message: Майстер запиту на ініціювання більше не буде доступний - для нових проєктів, створених на основі цього шаблону. Менеджерам і власникам - проєктів доведеться вручну вибирати налаштування й указувати відповідну - інформацію на сторінці «Огляд проєкту». - checkbox_message: Я розумію, що цю дію не можна буде скасувати + title: "Вимкнути запит на ініціювання проєкту" + heading: "Вимкнути цей запит на ініціювання проєкту?" + confirmation_message: "Майстер запиту на ініціювання більше не буде доступний для нових проєктів, створених на основі цього шаблону. Менеджерам і власникам проєктів доведеться вручну вибирати налаштування й указувати відповідну інформацію на сторінці «Огляд проєкту»." + checkbox_message: "Я розумію, що цю дію не можна буде скасувати" name: - artifact_name: Назва артефакту - artifact_name_caption: Виберіть для цього артефакту назву, яка відповідатиме - вашому методу управління проєктами. + artifact_name: "Назва артефакту" + artifact_name_caption: "Виберіть для цього артефакту назву, яка відповідатиме вашому методу управління проєктами." options: - project_initiation_request: Запит на ініціювання проєкту - project_creation_wizard: Майстер створення проєктів - project_mandate: Мандат проєкту + project_initiation_request: "Запит на ініціювання проєкту" + project_creation_wizard: "Майстер створення проєктів" + project_mandate: "Мандат проєкту" submission: - description_template: "**Цей пакет робіт автоматично створено після завершення - робочого процесу «%{wizard_name}».** Артефакт у форматі PDF, що містить - усю подану інформацію, було створено й додано в цей пакет робіт для довідки - й аудиту. Якщо знадобиться оновити дані або повторити кроки із запуску, - можна будь-коли знову відкрити майстер, скориставшись посиланням, наведеним - нижче:\n" - description: Коли користувач подає запит на ініціювання проєкту, створюється - новий пакет робіт з артефактом запиту, долученим як файл PDF. Наведені нижче - налаштування визначають тип, статус і виконавця нового пакета робіт. - work_package_type: Тип пакета робіт - work_package_type_caption: Тип пакета робіт, який слід використовувати для - зберігання завершеного артефакту. - status_when_submitted: Статус на момент подання - status_when_submitted_caption: Статус, який буде присвоєно створеному пакету - робіт після подання запиту. - send_confirmation_email: Надіслати лист із підтвердженням користувачу, що - подав запит на ініціювання проєкту - assignee: Виконавець на момент подання - assignee_caption_html: Користувач або група, призначена цьому атрибуту проєкту, - також стане отримувачем нового пакета робіт. Цей список включає активні - атрибути проєкту лише типу Користувач. - confirmation_email_text: Текст листа з підтвердженням - confirmation_email_default: |- - Вітаємо! - - Ви подали запит на ініціювання проєкту **%{project_name}**. Зараз він очікує на розгляд. - Перейдіть за посиланням нижче, щоб отримати доступ до пакета робіт із Вашим запитом. - work_package_comment: Коментар до пакета робіт - work_package_comment_caption: Виконавця, вибраного вище, буде автоматично - @згадано в коментарі. - work_package_comment_default: Запит на ініціювання проєкту **%{project_name}** - подано, і він очікує на розгляд. + description_template: > + **Цей пакет робіт автоматично створено після завершення робочого процесу «%{wizard_name}».** Артефакт у форматі PDF, що містить усю подану інформацію, було створено й додано в цей пакет робіт для довідки й аудиту. Якщо знадобиться оновити дані або повторити кроки із запуску, можна будь-коли знову відкрити майстер, скориставшись посиланням, наведеним нижче: + description: "Коли користувач подає запит на ініціювання проєкту, створюється новий пакет робіт з артефактом запиту, долученим як файл PDF. Наведені нижче налаштування визначають тип, статус і виконавця нового пакета робіт." + work_package_type: "Тип пакета робіт" + work_package_type_caption: "Тип пакета робіт, який слід використовувати для зберігання завершеного артефакту." + status_when_submitted: "Статус на момент подання" + status_when_submitted_caption: "Статус, який буде присвоєно створеному пакету робіт після подання запиту." + send_confirmation_email: "Надіслати лист із підтвердженням користувачу, що подав запит на ініціювання проєкту" + assignee: "Виконавець на момент подання" + assignee_caption_html: "Користувач або група, призначена цьому атрибуту проєкту, також стане отримувачем нового пакета робіт. Цей список включає активні атрибути проєкту лише типу Користувач." + confirmation_email_text: "Текст листа з підтвердженням" + confirmation_email_default: "Вітаємо!\n\nВи подали запит на ініціювання проєкту **%{project_name}**. Зараз він очікує на розгляд.\nПерейдіть за посиланням нижче, щоб отримати доступ до пакета робіт із Вашим запитом." + work_package_comment: "Коментар до пакета робіт" + work_package_comment_caption: "Виконавця, вибраного вище, буде автоматично @згадано в коментарі." + work_package_comment_default: "Запит на ініціювання проєкту **%{project_name}** подано, і він очікує на розгляд." project_phase_definitions: - heading: Життєвий цикл проєкту - heading_description: Життєвий цикл проєкту визначає етапи, які можна використовувати - для планування проєкту і які з’являться на сторінці огляду кожного проєкту. - Ці атрибути можна вмикати або вимикати, але їх не можна перевпорядковувати - на рівні окремого проєкту. - label_add: Додати - label_add_description: Додати визначення етапу проєкту + heading: "Життєвий цикл проєкту" + heading_description: "Життєвий цикл проєкту визначає етапи, які можна використовувати для планування проєкту і які з’являться на сторінці огляду кожного проєкту. Ці атрибути можна вмикати або вимикати, але їх не можна перевпорядковувати на рівні окремого проєкту." + label_add: "Додати" + label_add_description: "Додати визначення етапу проєкту" filter: - label: Пошук за назвою етапу - section_header: Етапи - non_defined: Наразі не визначено жодних етапів. - phase_gates: Контрольні точки етапів + label: "Пошук за назвою етапу" + section_header: "Етапи" + non_defined: "Наразі не визначено жодних етапів." + phase_gates: "Контрольні точки етапів" new: - description: Зміни цього етапу проєкту відображатимуться в усіх проєктах із - цим етапом. - heading: Новий етап - both_gate: Початкова й кінцева контрольні точки - no_gate: Немає контрольної точки - start_gate: Початкова контрольна точка - start_gate_caption: Додайте контрольну точку з датою початку етапу - finish_gate: Кінцева контрольна точка - finish_gate_caption: Додайте контрольну точку з датою закінчення етапу + description: "Зміни цього етапу проєкту відображатимуться в усіх проєктах із цим етапом." + heading: "Новий етап" + both_gate: "Початкова й кінцева контрольні точки" + no_gate: "Немає контрольної точки" + start_gate: "Початкова контрольна точка" + start_gate_caption: "Додайте контрольну точку з датою початку етапу" + finish_gate: "Кінцева контрольна точка" + finish_gate_caption: "Додайте контрольну точку з датою закінчення етапу" projects: - missing_dependencies: Перевірено модуль проєкту %{module}, який містить залежності - від %{dependencies}. Ці залежності потрібно також перевірити. - section_new_projects: Налаштування нових проєктів - section_project_overview: Налаштування для списків проєктів - session: Сесія + missing_dependencies: "Перевірено модуль проєкту %{module}, який містить залежності від %{dependencies}. Ці залежності потрібно також перевірити." + section_new_projects: "Налаштування нових проєктів" + section_project_overview: "Налаштування для списків проєктів" + session: "Сесія" user: - default_preferences: Параметри за умовчанням - display_format: Формат відображення - deletion: Видалення + default_preferences: "Параметри за умовчанням" + display_format: "Формат відображення" + deletion: "Видалення" working_days: - section_work_week: Робочий тиждень - section_holidays_and_closures: Свята й вихідні + section_work_week: "Робочий тиждень" + section_holidays_and_closures: "Свята й вихідні" work_packages: - not_allowed_text: У вас немає дозволів для перегляду цієї сторінки. + not_allowed_text: "У вас немає дозволів для перегляду цієї сторінки." activities: - enable_internal_comments: Увімкнути внутрішні коментарі - helper_text: Завдяки внутрішнім коментарям учасники внутрішньої команди можуть - спілкуватися приватно. Ці коментарі доступні лише користувачам із певними - ролями й необхідними дозволами й ніколи не відображаються для всіх. %{link} + enable_internal_comments: "Увімкнути внутрішні коментарі" + helper_text: "Завдяки внутрішнім коментарям учасники внутрішньої команди можуть спілкуватися приватно. Ці коментарі доступні лише користувачам із певними ролями й необхідними дозволами й ніколи не відображаються для всіх. %{link}" text_formatting: - markdown: Markdown - plain: Простий текст - status_active: активний - status_archived: в архіві - status_blocked: заблоковано + markdown: "Markdown" + plain: "Простий текст" + status_active: "активний" + status_archived: "в архіві" + status_blocked: "заблоковано" status_invited: запрошені status_locked: заблоковано status_registered: Зареєстровано status_deleted: видалено + #Used in array.to_sentence. support: array: - sentence_connector: і - skip_last_comma: хибне значення - text_accessibility_hint: Режим доступності призначений для користувачів, які є сліпими, - з обмеженими можливостями або мають поганий зір. Для останніх спеціально виділені - цілеспрямовані елементи. Зауважте, що модуль Backlogs недоступний у цьому режимі. - text_access_token_hint: Маркери доступу дозволяють надавати зовнішнім програмам - доступ до ресурсів у OpenProject. - text_analyze: 'Подальший аналіз: %{subject}' - text_are_you_sure: Ви впевненені? - open_link_in_a_new_tab: Відкрити посилання в новій вкладці - text_are_you_sure_continue: Хочете продовжити? - text_are_you_sure_with_children: Видалити робочий пакет і всі дочірні робочі пакети? - text_are_you_sure_with_project_custom_fields: Видалення цього атрибута також призведе - до видалення його значень у всіх проєктах. Ви впевнені? - text_are_you_sure_with_project_life_cycle_step: Видалення цього етапу також призведе - до його видалення в усіх проєктах. Ви впевнені? - text_assign_to_project: Призначити на проект - text_form_configuration: 'Можна налаштувати, які поля будуть відображатися у формах - робочих пакетів. Ви можете вільно групувати поля для відображення потреб вашого - домену. - - ' - text_form_configuration_required_attribute: Атрибут позначений необхідним і таким - чином завжди показано + sentence_connector: "і" + skip_last_comma: "хибне значення" + text_accessibility_hint: "Режим доступності призначений для користувачів, які є сліпими, з обмеженими можливостями або мають поганий зір. Для останніх спеціально виділені цілеспрямовані елементи. Зауважте, що модуль Backlogs недоступний у цьому режимі." + text_access_token_hint: "Маркери доступу дозволяють надавати зовнішнім програмам доступ до ресурсів у OpenProject." + text_analyze: "Подальший аналіз: %{subject}" + text_are_you_sure: "Ви впевненені?" + open_link_in_a_new_tab: "Відкрити посилання в новій вкладці" + text_are_you_sure_continue: "Хочете продовжити?" + text_are_you_sure_with_children: "Видалити робочий пакет і всі дочірні робочі пакети?" + text_are_you_sure_with_project_custom_fields: "Видалення цього атрибута також призведе до видалення його значень у всіх проєктах. Ви впевнені?" + text_are_you_sure_with_project_life_cycle_step: "Видалення цього етапу також призведе до його видалення в усіх проєктах. Ви впевнені?" + text_assign_to_project: "Призначити на проект" + text_form_configuration: > + Можна налаштувати, які поля будуть відображатися у формах робочих пакетів. Ви можете вільно групувати поля для відображення потреб вашого домену. + text_form_configuration_required_attribute: "Атрибут позначений необхідним і таким чином завжди показано" text_caracters_maximum: "%{count} символів(а) максимум." - text_caracters_minimum: Повинно мати якнайменше %{count} символів(а) у довжину. - text_comma_separated: Допустимі декілька значень (розділені комою). - text_comment_wiki_page: 'Коментарі до сторінки вікі: %{page}' - text_custom_field_possible_values_info: По одному значенню в кожному рядку - text_custom_field_hint_activate_per_project: 'При використанні спеціальних полів: - Майте на увазі, що спеціальні поля повинні бути активовані для кожного проекту. - - ' - text_custom_field_hint_activate_per_project_and_type: 'Користувальницькі поля повинні - бути активовані за типом робочого пакета та проекту. - - ' - text_project_custom_field_html: 'У версії Enterprise з’являться такі додаткові доповнення - для користувацьких полів проєктів:
  • Додавати користувацькі поля - проєктів у список проєктів для створення режиму перегляду портфеля проєктів
  • -
- - ' - text_custom_logo_instructions: 'Логотип автоматично масштабується відповідно до - розміру заголовка. Щоб отримати найкращий результат, завантажте зображення з білим - логотипом на прозорому фоні розміром 130×47 пікселів. Відступи на зображені можуть - бути будь-які. - - ' - text_custom_logo_mobile_instructions: 'Логотип автоматично масштабується відповідно - до розміру заголовка. Щоб отримати найкращий результат, завантажте зображення - з білим логотипом на прозорому фоні розміром 130×33 пікселі. Відступи на зображені - можуть бути будь-які. - - ' - text_custom_export_logo_instructions: 'Це логотип з’являється, що відображається - у ваших експортах PDF. Він має бути у форматі файлу зображення PNG або JPEG. Рекомендується - чорний або кольоровий логотип на прозорому чи білому фоні. - - ' - text_custom_export_cover_instructions: 'Це зображення, що з’являється на фоні сторінки - обкладинки у ваших експортах PDF. Вимоги до зображення: 800 пікс. (ширина) на - 500 пікс. (висота), файл PNG або JPEG. - - ' - text_custom_export_footer_instructions: 'Дані, експортовані як PDF, включатимуть - графічний елемент, розташований ліворуч у нижньому колонтитулі. Це зображення - має бути у форматі PNG або JPEG шириною приблизно 200 пікселів. - - ' - label_custom_export_font_instructions: 'Завантажуйте власні шрифти TrueType (.ttf), - щоб використовувати їх при експорті в PDF, і керуйте ними. Щоб досягти найкращих - результатів, використовуйте суміжні файли з одного сімейства шрифтів. Якщо шрифт - не надано, буде використано стандартний шрифт NotoSans. - - ' - label_custom_export_images_instructions: 'Завантажуйте власні файли зображень, щоб - використовувати їх при експорті в PDF, і керуйте ними. - - ' - text_custom_export_font_regular_instructions: 'Це файл шрифту для звичайного тексту. - Він має бути у форматі TTF і є обов’язковим. - - ' - text_custom_export_font_bold_instructions: 'Це файл шрифту для жирного тексту. Він - має бути у форматі TTF. - - ' - text_custom_export_font_italic_instructions: 'Це файл шрифту для курсиву. Він має - бути у форматі TTF. - - ' - text_custom_export_font_bold_italic_instructions: 'Це файл шрифту для жирного тексту - й курсиву. Він має бути у форматі TTF. - - ' - text_custom_favicon_instructions: 'Це крихітний значок, який з’являється у вікні - / на вкладці вашого браузера біля назви сторінки. Це має бути квадратний файл - зображення 32 на 32 пікселі з прозорим фоном у форматі PNG. - - ' - text_custom_touch_icon_instructions: 'Це значок, який відображається на вашому мобільному - пристрої або планшеті, коли ви створюєте закладку на робочому столі. Це має бути - квадратний файл зображення 180 на 180 пікселів у форматі PNG. Переконайтеся, що - фон зображення не прозорий, інакше воно буде матиме поганий вигляд на iOS. - - ' - text_database_allows_tsv: База даних дозволяє TSVector (необов'язково) - text_default_administrator_account_changed: Обліковий запис адміністратора за замовчуванням - змінений - text_default_encoding: 'По замовчуванню: UTF-8' - text_destroy: Видалити - text_destroy_with_associated: 'Існують додаткові об''єкти, асоційовані з робочими - пакетами, які потрібно видалити. Ці об''єкти мають наступні типи:' - text_destroy_what_to_do: Що ти хочеш зробити? - text_diff_truncated: "... Це порівняння (diff) було скорочене, оскільки воно перевищує - максимальний розмір, який можна відобразити." - text_email_delivery_not_configured: |- - Доставку електронної пошти не налаштовано, і сповіщення вимкнуто. - Налаштуйте свій SMTP-сервер, щоб увімкнути їх. - text_enumeration_category_reassign_to: 'Надати їм наступне значення:' + text_caracters_minimum: "Повинно мати якнайменше %{count} символів(а) у довжину." + text_comma_separated: "Допустимі декілька значень (розділені комою)." + text_comment_wiki_page: "Коментарі до сторінки вікі: %{page}" + text_custom_field_possible_values_info: "По одному значенню в кожному рядку" + text_custom_field_hint_activate_per_project: > + При використанні спеціальних полів: Майте на увазі, що спеціальні поля повинні бути активовані для кожного проекту. + text_custom_field_hint_activate_per_project_and_type: > + Користувальницькі поля повинні бути активовані за типом робочого пакета та проекту. + text_project_custom_field_html: > + У версії Enterprise з’являться такі додаткові доповнення для користувацьких полів проєктів:
  • Додавати користувацькі поля проєктів у список проєктів для створення режиму перегляду портфеля проєктів
+ text_custom_logo_instructions: > + Логотип автоматично масштабується відповідно до розміру заголовка. Щоб отримати найкращий результат, завантажте зображення з білим логотипом на прозорому фоні розміром 130×47 пікселів. Відступи на зображені можуть бути будь-які. + text_custom_logo_mobile_instructions: > + Логотип автоматично масштабується відповідно до розміру заголовка. Щоб отримати найкращий результат, завантажте зображення з білим логотипом на прозорому фоні розміром 130×33 пікселі. Відступи на зображені можуть бути будь-які. + text_custom_export_logo_instructions: > + Це логотип з’являється, що відображається у ваших експортах PDF. Він має бути у форматі файлу зображення PNG або JPEG. Рекомендується чорний або кольоровий логотип на прозорому чи білому фоні. + text_custom_export_cover_instructions: > + Це зображення, що з’являється на фоні сторінки обкладинки у ваших експортах PDF. Вимоги до зображення: 800 пікс. (ширина) на 500 пікс. (висота), файл PNG або JPEG. + text_custom_export_footer_instructions: > + Дані, експортовані як PDF, включатимуть графічний елемент, розташований ліворуч у нижньому колонтитулі. Це зображення має бути у форматі PNG або JPEG шириною приблизно 200 пікселів. + label_custom_export_font_instructions: > + Завантажуйте власні шрифти TrueType (.ttf), щоб використовувати їх при експорті в PDF, і керуйте ними. Щоб досягти найкращих результатів, використовуйте суміжні файли з одного сімейства шрифтів. Якщо шрифт не надано, буде використано стандартний шрифт NotoSans. + label_custom_export_images_instructions: > + Завантажуйте власні файли зображень, щоб використовувати їх при експорті в PDF, і керуйте ними. + text_custom_export_font_regular_instructions: > + Це файл шрифту для звичайного тексту. Він має бути у форматі TTF і є обов’язковим. + text_custom_export_font_bold_instructions: > + Це файл шрифту для жирного тексту. Він має бути у форматі TTF. + text_custom_export_font_italic_instructions: > + Це файл шрифту для курсиву. Він має бути у форматі TTF. + text_custom_export_font_bold_italic_instructions: > + Це файл шрифту для жирного тексту й курсиву. Він має бути у форматі TTF. + text_custom_favicon_instructions: > + Це крихітний значок, який з’являється у вікні / на вкладці вашого браузера біля назви сторінки. Це має бути квадратний файл зображення 32 на 32 пікселі з прозорим фоном у форматі PNG. + text_custom_touch_icon_instructions: > + Це значок, який відображається на вашому мобільному пристрої або планшеті, коли ви створюєте закладку на робочому столі. Це має бути квадратний файл зображення 180 на 180 пікселів у форматі PNG. Переконайтеся, що фон зображення не прозорий, інакше воно буде матиме поганий вигляд на iOS. + text_database_allows_tsv: "База даних дозволяє TSVector (необов'язково)" + text_default_administrator_account_changed: "Обліковий запис адміністратора за замовчуванням змінений" + text_default_encoding: "По замовчуванню: UTF-8" + text_destroy: "Видалити" + text_destroy_with_associated: "Існують додаткові об'єкти, асоційовані з робочими пакетами, які потрібно видалити. Ці об'єкти мають наступні типи:" + text_destroy_what_to_do: "Що ти хочеш зробити?" + text_diff_truncated: "... Це порівняння (diff) було скорочене, оскільки воно перевищує максимальний розмір, який можна відобразити." + text_email_delivery_not_configured: "Доставку електронної пошти не налаштовано, і сповіщення вимкнуто.\nНалаштуйте свій SMTP-сервер, щоб увімкнути їх." + text_enumeration_category_reassign_to: "Надати їм наступне значення:" text_enumeration_destroy_question: "%{count} об'єктам призначено дане значення." - text_file_repository_writable: Папка вкладень доступна для запису - text_git_repo_example: пуста локальна тека репозиторію (напр. /gitrepo, c:\gitrepo) - text_hint_date_format: Введіть дату у вигляді YYYY-MM-DD. Інші формати можуть бути - змінені на небажану дату. - text_hint_disable_with_0: 'Примітка: Вимкнути за допомогою 0' - text_hours_between: Між %{min} і %{max} годин - text_work_package_added: Автор %{author} відзвітував по робочому пакету %{id}. - text_work_package_category_destroy_assignments: Видалити призначення категорії - text_work_package_category_destroy_question: Деякі робочі пакети (%{count}) були - призначені для цієї категорії. Що ви хочете зробити? - text_work_package_category_reassign_to: Перепризначити робочі пакети до даної категорії + text_file_repository_writable: "Папка вкладень доступна для запису" + text_git_repo_example: "пуста локальна тека репозиторію (напр. /gitrepo, c:\\gitrepo)" + text_hint_date_format: "Введіть дату у вигляді YYYY-MM-DD. Інші формати можуть бути змінені на небажану дату." + text_hint_disable_with_0: "Примітка: Вимкнути за допомогою 0" + text_hours_between: "Між %{min} і %{max} годин" + text_work_package_added: "Автор %{author} відзвітував по робочому пакету %{id}." + text_work_package_category_destroy_assignments: "Видалити призначення категорії" + text_work_package_category_destroy_question: "Деякі робочі пакети (%{count}) були призначені для цієї категорії. Що ви хочете зробити?" + text_work_package_category_reassign_to: "Перепризначити робочі пакети до даної категорії" text_work_package_updated: "%{author} оновив робочий пакет %{id}." - text_work_package_watcher_added: Користувач %{watcher_changer} додав вас як відстежувача - в пакет робіт %{id}. - text_work_package_watcher_removed: Користувач %{watcher_changer} вилучив вас зі - списку відстежувачів у пакеті робіт %{id}. - text_work_packages_destroy_confirmation: Ви впевнені у тому, що хочете видалити - вибрані робочі пакети? - text_work_packages_ref_in_commit_messages: Посилання та фіксація робочих пакетів - у повідомленнях комітів + text_work_package_watcher_added: "Користувач %{watcher_changer} додав вас як відстежувача в пакет робіт %{id}." + text_work_package_watcher_removed: "Користувач %{watcher_changer} вилучив вас зі списку відстежувачів у пакеті робіт %{id}." + text_work_packages_destroy_confirmation: "Ви впевнені у тому, що хочете видалити вибрані робочі пакети?" + text_work_packages_ref_in_commit_messages: "Посилання та фіксація робочих пакетів у повідомленнях комітів" text_journal_added: "%{label} %{value} доданий" text_journal_attachment_added: "%{label} %{value} додано як вкладення" text_journal_attachment_deleted: "%{label} %{old} вилучено як вкладення" @@ -6143,412 +5131,286 @@ uk: text_journal_deleted: "%{label} видалено (%{old})" text_journal_deleted_subproject: "%{label} %{old}" text_journal_deleted_with_diff: "%{label} видалено (%{link})" - text_journal_file_link_added: Додано посилання %{label} на значення %{value} (%{storage}) - text_journal_file_link_deleted: Вилучено посилання %{label} на значення %{old} (%{storage}) + text_journal_file_link_added: "Додано посилання %{label} на значення %{value} (%{storage})" + text_journal_file_link_deleted: "Вилучено посилання %{label} на значення %{old} (%{storage})" text_journal_of: "%{label} %{value}" - text_journal_set_to: Параметр %{label} змінився на %{value} + text_journal_set_to: "Параметр %{label} змінився на %{value}" text_journal_set_with_diff: "%{label} встановлено (%{link})" text_journal_label_value: "%{label} %{value}" - text_latest_note: 'Останній коментар: %{note}' - text_length_between: Довжина між %{min} і %{max} символів. - text_line_separated: Дозволено кілька значень (по одному значенню в рядок). - text_load_default_configuration: Завантажити Конфігурацію по замовчуванню + text_latest_note: "Останній коментар: %{note}" + text_length_between: "Довжина між %{min} і %{max} символів." + text_line_separated: "Дозволено кілька значень (по одному значенню в рядок)." + text_load_default_configuration: "Завантажити Конфігурацію по замовчуванню" text_no_roles_defined: Не визначено жодної ролі. - text_no_access_tokens_configurable: Немає маркерів доступу, які можна налаштувати. - text_no_configuration_data: |- - Роль, типи, пакет робочі статуси і процес ще не налаштований. - Настійно рекомендується завантажити налаштування за замовчуванням. Ви зможете змінити його тільки один раз. - text_no_notes: Для цього робочого пакету немає коментарів. - text_notice_too_many_values_are_inperformant: 'Примітка: Відображення понад 100 - елементів на сторінці може збільшити час завантаження сторінки.' - text_notice_security_badge_displayed_html: 'Примітка: якщо цей параметр увімкнено, - на екрані з''явиться значок із статусом інсталяції %{information_panel_label} панелі - адміністрування та на головній сторінці. Він відображається лише адміністраторам.
- Значок перевірить поточну версію OpenProject на основі офіційної бази даних випуску - OpenProject, щоб сповістити вас про будь-які оновлення або відомі уразливості. - Щоб отримати додаткові відомості про те, що надає перевірка, які дані потрібні - для надання доступних оновлень, та про те, як вимкнути цю перевірку, відвідайте - сторінку конфігураційна документація. - - ' - text_own_membership_delete_confirmation: |- - Ви збираєтесь видалити деякі або всі права, через що можуть зникнути права на редагування цього проекту. - Ви впевнені що хочете продовжити? - text_permanent_delete_confirmation_checkbox_label: Я розумію, що це видалення не - можна відмінити - text_permanent_remove_confirmation_checkbox_label: Я розумію, що вилучення не можна - буде скасувати - text_plugin_assets_writable: Каталог ресурсів модулів доступний для запису - text_powered_by: Працює на %{link} - text_project_identifier_info: Допускаються тільки рядкові малі букви (a-z), цифри, - тире та нижнє підкреслення. Початок має бути з малої літери. - text_reassign: 'Перепризначити робочому пакету:' - text_regexp_multiline: Реестр застосовується в багаторядковому режимі. наприклад, - --- --- - text_repository_usernames_mapping: |- - Виберіть або оновіть користувача OpenProject, зіставленого з кожним ім'ям користувача в журналі репозиторію. - Користувачі з таким самим ім'ям користувача або електронною поштою OpenProject автоматично відображаються. + text_no_access_tokens_configurable: "Немає маркерів доступу, які можна налаштувати." + text_no_configuration_data: "Роль, типи, пакет робочі статуси і процес ще не налаштований.\nНастійно рекомендується завантажити налаштування за замовчуванням. Ви зможете змінити його тільки один раз." + text_no_notes: "Для цього робочого пакету немає коментарів." + text_notice_too_many_values_are_inperformant: "Примітка: Відображення понад 100 елементів на сторінці може збільшити час завантаження сторінки." + text_notice_security_badge_displayed_html: > + Примітка: якщо цей параметр увімкнено, на екрані з'явиться значок із статусом інсталяції %{information_panel_label} панелі адміністрування та на головній сторінці. Він відображається лише адміністраторам.
Значок перевірить поточну версію OpenProject на основі офіційної бази даних випуску OpenProject, щоб сповістити вас про будь-які оновлення або відомі уразливості. Щоб отримати додаткові відомості про те, що надає перевірка, які дані потрібні для надання доступних оновлень, та про те, як вимкнути цю перевірку, відвідайте сторінку конфігураційна документація. + text_own_membership_delete_confirmation: "Ви збираєтесь видалити деякі або всі права, через що можуть зникнути права на редагування цього проекту.\nВи впевнені що хочете продовжити?" + text_permanent_delete_confirmation_checkbox_label: "Я розумію, що це видалення не можна відмінити" + text_permanent_remove_confirmation_checkbox_label: "Я розумію, що вилучення не можна буде скасувати" + text_plugin_assets_writable: "Каталог ресурсів модулів доступний для запису" + text_powered_by: "Працює на %{link}" + text_project_identifier_info: "Допускаються тільки рядкові малі букви (a-z), цифри, тире та нижнє підкреслення. Початок має бути з малої літери." + text_reassign: "Перепризначити робочому пакету:" + text_regexp_multiline: 'Реестр застосовується в багаторядковому режимі. наприклад, --- ---' + text_repository_usernames_mapping: "Виберіть або оновіть користувача OpenProject, зіставленого з кожним ім'ям користувача в журналі репозиторію.\nКористувачі з таким самим ім'ям користувача або електронною поштою OpenProject автоматично відображаються." text_status_changed_by_changeset: " Застосовується в наборі змін %{value}" - text_table_difference_description: У цій таблиці наведений єдиний %{entries}. Ви - можете переглянути різницю між будь-якими двома записами, спочатку поставивши - відповідні прапорці в таблиці. При натисканні на кнопку внизу таблиці будуть показані - відмінності. + text_table_difference_description: "У цій таблиці наведений єдиний %{entries}. Ви можете переглянути різницю між будь-якими двома записами, спочатку поставивши відповідні прапорці в таблиці. При натисканні на кнопку внизу таблиці будуть показані відмінності." text_time_logged_by_changeset: " Застосовується в наборі змін %{value}" - text_tip_work_package_begin_day: робочий пакет починається цього дня - text_tip_work_package_begin_end_day: початок і закінчення робочого пакету цього - дня - text_tip_work_package_end_day: робочий пакет закінчується цього дня - text_type_no_workflow: Для цього типу не визначено робочий процес - text_unallowed_characters: Недозволені символи + text_tip_work_package_begin_day: "робочий пакет починається цього дня" + text_tip_work_package_begin_end_day: "початок і закінчення робочого пакету цього дня" + text_tip_work_package_end_day: "робочий пакет закінчується цього дня" + text_type_no_workflow: "Для цього типу не визначено робочий процес" + text_unallowed_characters: "Недозволені символи" text_user_invited: Користувача запрошено та очікує реєстрації. text_user_wrote: "%{value} написав:" - text_wrote: написав(-ла) - text_warn_on_leaving_unsaved: Робочий пакет містить незбережений текст, який буде - втрачено, якщо ви залишите цю сторінку. - text_what_did_you_change_click_to_add_comment: Що ви змінили? Натисніть, щоб додати - коментар - text_wiki_destroy_confirmation: Ви впевнені що хочете видалити цю Вікі і весь її - вміст? - text_wiki_page_destroy_children: Видалення дочірніх сторінок і всі їх нащадки - text_wiki_page_destroy_question: На цій сторінці є %{descendants} дочірні сторінки - та нащадки. Що ти хочеш робити? - text_wiki_page_nullify_children: Майте дочірні сторінки як кореневі сторінки - text_wiki_page_reassign_children: Перепризначити дочірніх сторінок до батьківського - сторінці - text_workflow_edit: Виберіть роль і тип для редагування робочого процесу - text_zoom_in: Збільшити масштаб - text_zoom_out: Зменшити масштаб - text_setup_mail_configuration: Налаштуйте постачальника послуг електронної пошти + text_wrote: "написав(-ла)" + text_warn_on_leaving_unsaved: "Робочий пакет містить незбережений текст, який буде втрачено, якщо ви залишите цю сторінку." + text_what_did_you_change_click_to_add_comment: "Що ви змінили? Натисніть, щоб додати коментар" + text_wiki_destroy_confirmation: "Ви впевнені що хочете видалити цю Вікі і весь її вміст?" + text_wiki_page_destroy_children: "Видалення дочірніх сторінок і всі їх нащадки" + text_wiki_page_destroy_question: "На цій сторінці є %{descendants} дочірні сторінки та нащадки. Що ти хочеш робити?" + text_wiki_page_nullify_children: "Майте дочірні сторінки як кореневі сторінки" + text_wiki_page_reassign_children: "Перепризначити дочірніх сторінок до батьківського сторінці" + text_workflow_edit: "Виберіть роль і тип для редагування робочого процесу" + text_zoom_in: "Збільшити масштаб" + text_zoom_out: "Зменшити масштаб" + text_setup_mail_configuration: "Налаштуйте постачальника послуг електронної пошти" help_texts: views: - project: "%{plural} завжди вкладаються в проєкт. Тут можна вибрати лише проєкти - з активним модулем %{plural}. Після створення проєкту %{singular} ви зможете - додавати в нього пакети робіт з інших проєктів.\n" - public: Опублікуйте це подання, надавши доступ до нього. Користувачі з дозволом - «Керування загальнодоступними поданнями» можуть змінювати або вилучати загальнодоступні - запити. Це не впливає на видимість результатів пакетів робіт у цьому поданні, - і залежно від дозволів користувачі можуть бачити різні результати. - favoured: Позначте це подання як улюблене й додайте на бічну панель збережених - подань ліворуч. + project: > + %{plural} завжди вкладаються в проєкт. Тут можна вибрати лише проєкти з активним модулем %{plural}. Після створення проєкту %{singular} ви зможете додавати в нього пакети робіт з інших проєктів. + public: "Опублікуйте це подання, надавши доступ до нього. Користувачі з дозволом «Керування загальнодоступними поданнями» можуть змінювати або вилучати загальнодоступні запити. Це не впливає на видимість результатів пакетів робіт у цьому поданні, і залежно від дозволів користувачі можуть бачити різні результати." + favoured: "Позначте це подання як улюблене й додайте на бічну панель збережених подань ліворуч." time: - am: до полудня + am: "до полудня" formats: default: "%m/%d/%Y %I:%M%p" long: "%B%d,%Y%H:%M%H:%M" short: "%d %b %H:%M" time: "%I:%M %p" - pm: після обіду + pm: "після обіду" timeframe: - show: Показувати часові рамки - end: до - start: від - title_remove_and_delete_user: Вилучіть запрошеного користувача з проекту та видаліть - його. - title_enterprise_upgrade: Оновлення, щоб розблокувати більше користувачів. - tooltip_user_default_timezone: 'Типовий часовий пояс для нових користувачів. Може - бути змінено в налаштуваннях користувача. - - ' - tooltip_resend_invitation: 'Надіслати ще одне запрошення з новим маркером, якщо - старий минув або користувач не отримав оригінальну електронну адресу. Можна також - використовувати для активних користувачів вибір нового методу аутентифікації. - При використанні активних користувачів їх статус буде змінено на "запрошений". - - ' + show: "Показувати часові рамки" + end: "до" + start: "від" + title_remove_and_delete_user: Вилучіть запрошеного користувача з проекту та видаліть його. + title_enterprise_upgrade: "Оновлення, щоб розблокувати більше користувачів." + tooltip_user_default_timezone: > + Типовий часовий пояс для нових користувачів. Може бути змінено в налаштуваннях користувача. + tooltip_resend_invitation: > + Надіслати ще одне запрошення з новим маркером, якщо старий минув або користувач не отримав оригінальну електронну адресу. Можна також використовувати для активних користувачів вибір нового методу аутентифікації. При використанні активних користувачів їх статус буде змінено на "запрошений". tooltip: - setting_email_login: 'Якщо увімкнено, користувач не зможе вибрати реєстраційний - запис під час реєстрації. Замість цього їхня адреса електронної пошти слугуватиме - логіном. Адміністратор може змінити вхід окремо. - - ' + setting_email_login: > + Якщо увімкнено, користувач не зможе вибрати реєстраційний запис під час реєстрації. Замість цього їхня адреса електронної пошти слугуватиме логіном. Адміністратор може змінити вхід окремо. queries: apply_filter: Застосувати попередньо налаштований фільтр configure_view: heading: Налаштувати режим перегляду columns: - input_label: Додати стовпці - input_placeholder: Вибрати стовпець - drag_area_label: Керування стовпцями і їх перевпорядкування + input_label: "Додати стовпці" + input_placeholder: "Вибрати стовпець" + drag_area_label: "Керування стовпцями і їх перевпорядкування" sort_by: automatic: - heading: Автоматично - description: Упорядкуйте %{plural} за одним або кількома критеріями сортування. - Результати попереднього сортування буде втрачено. + heading: "Автоматично" + description: "Упорядкуйте %{plural} за одним або кількома критеріями сортування. Результати попереднього сортування буде втрачено." top_menu: - additional_resources: Додаткові ресурси - getting_started: Починаємо - help_and_support: Допомога та підтримка - total_progress: Загальний прогрес + additional_resources: "Додаткові ресурси" + getting_started: "Починаємо" + help_and_support: "Допомога та підтримка" + total_progress: "Загальний прогрес" user: - all: всі - active: активний - activate: Активувати - activate_and_reset_failed_logins: Активація та скидання невдалих входів - authentication_provider: Провайдер аутентифікації - identity_url_text: Внутрішній унікальний ідентифікатор, наданий постачальником - послуг автентифікації. - authentication_settings_disabled_due_to_external_authentication: 'Цей користувач - авторизирується через зовнішнього постачальника автентифікації, що немає паролів - в OpenProject бути змінений. - - ' - authorization_rejected: Вам не дозволено входити. - assign_random_password: Призначити випадковий пароль (надіслано користувачу електронною - поштою) - blocked: тимчасово заблоковано + all: "всі" + active: "активний" + activate: "Активувати" + activate_and_reset_failed_logins: "Активація та скидання невдалих входів" + authentication_provider: "Провайдер аутентифікації" + identity_url_text: "Внутрішній унікальний ідентифікатор, наданий постачальником послуг автентифікації." + authentication_settings_disabled_due_to_external_authentication: > + Цей користувач авторизирується через зовнішнього постачальника автентифікації, що немає паролів в OpenProject бути змінений. + authorization_rejected: "Вам не дозволено входити." + assign_random_password: "Призначити випадковий пароль (надіслано користувачу електронною поштою)" + blocked: "тимчасово заблоковано" blocked_num_failed_logins: - one: тимчасово заблоковано (одна невдала спроба входу) - few: тимчасово заблоковано (%{count} спроби входу в систему) - many: тимчасово заблоковано (%{count} спроби входу в систему) - other: тимчасово заблоковано (%{count} спроби входу в систему) - confirm_status_change: Ви збираєтеся змінити статус %{name} Ви дійсно бажаєте - продовжити? - deleted: Видалити користувача - error_status_change_self: Ви не можете змінити власний статус користувача. - error_admin_change_on_non_admin: Тільки адміністратори можуть змінювати статус - користувачів-адміністраторів. - error_status_change_failed: 'Не вдалося змінити статус користувача через такі - помилки: %{errors}' + one: "тимчасово заблоковано (одна невдала спроба входу)" + few: "тимчасово заблоковано (%{count} спроби входу в систему)" + many: "тимчасово заблоковано (%{count} спроби входу в систему)" + other: "тимчасово заблоковано (%{count} спроби входу в систему)" + confirm_status_change: "Ви збираєтеся змінити статус %{name} Ви дійсно бажаєте продовжити?" + deleted: "Видалити користувача" + error_status_change_self: "Ви не можете змінити власний статус користувача." + error_admin_change_on_non_admin: "Тільки адміністратори можуть змінювати статус користувачів-адміністраторів." + error_status_change_failed: "Не вдалося змінити статус користувача через такі помилки: %{errors}" invite: Запросити користувача електронною поштою invited: запрошені - lock: Блокування постійно - locked: Блокування постійно - no_login: Цей користувач автентифікується через логін за допомогою пароля. Оскільки - вона вимкнена, вони не можуть увійти. + lock: "Блокування постійно" + locked: "Блокування постійно" + no_login: "Цей користувач автентифікується через логін за допомогою пароля. Оскільки вона вимкнена, вони не можуть увійти." password_change_unsupported: Зміна пароля не підтримується. - registered: Зареєстровано - reset_failed_logins: Скинути помилки входу + registered: "Зареєстровано" + reset_failed_logins: "Скинути помилки входу" status_user_and_brute_force: "%{user} і %{brute_force}" - status_change: Зміна стану - text_change_disabled_for_provider_login: The name and email is set by your login - provider and can thus not be changed. - unlock: Розблокувати - unlock_and_reset_failed_logins: Розблокувати та скинути помилки входу до системи - error_cannot_delete_user: User cannot be deleted - version_status_closed: закрито - version_status_locked: Заблоковано - version_status_open: відкрити + status_change: "Зміна стану" + text_change_disabled_for_provider_login: "Ім’я і електронну адресу вказав ваш постачальник облікових даних, тому їх не можна змінити." + unlock: "Розблокувати" + unlock_and_reset_failed_logins: "Розблокувати та скинути помилки входу до системи" + error_cannot_delete_user: "Користувача не можна видалити" + version_status_closed: "закрито" + version_status_locked: "Заблоковано" + version_status_open: "відкрити" note: Замітка - note_password_login_disabled: Вхід до пароля вимкнено користувачем %{configuration} + note_password_login_disabled: "Вхід до пароля вимкнено користувачем %{configuration}" warning: Попередження warning_attachments_not_saved: "%{count} Не вдалося зберегти файл (файли)." - warning_imminent_user_limit: 'Ви запросили більше користувачів, ніж підтримується - вашим поточним планом. Запрошені користувачі можуть не мати змоги приєднатися - до вашого середовища OpenProject. Будь ласка оновіть - свій план або заблокувати існуючих користувачів, щоб дозволити запрошені - та зареєстровані користувачі приєднатися. + warning_imminent_user_limit: > + Ви запросили більше користувачів, ніж підтримується вашим поточним планом. Запрошені користувачі можуть не мати змоги приєднатися до вашого середовища OpenProject. Будь ласка оновіть свій план або заблокувати існуючих користувачів, щоб дозволити запрошені та зареєстровані користувачі приєднатися. + warning_registration_token_expired: | + Термін дії електронної пошти для активації минув. Ми надіслали вам нову %{email} Натисніть посилання в ньому, щоб активувати свій обліковий запис. + warning_user_limit_reached: > + Додавання користувачів призведе до перевищення поточного ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким чином забезпечити доступ до цього екземпляра зовнішнім користувачам. + warning_user_limit_reached_admin: > + Додавання користувачів призведе до перевищення поточного ліміту. Підвищте рівень свого плану, щоб забезпечити доступ до цього екземпляра зовнішнім користувачам. + warning_user_limit_reached_instructions: > + Ви досягли обмеження користувача (%{current}/%{max} активних користувачів). Напишіть на адресу sales@openproject.com, щоб перейти на версію Enterprise і додати більше користувачів. + warning_protocol_mismatch_html: > - ' - warning_registration_token_expired: 'Термін дії електронної пошти для активації - минув. Ми надіслали вам нову %{email} Натисніть посилання в ньому, щоб активувати - свій обліковий запис. - - ' - warning_user_limit_reached: 'Додавання користувачів призведе до перевищення поточного - ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким - чином забезпечити доступ до цього екземпляра зовнішнім користувачам. - - ' - warning_user_limit_reached_admin: 'Додавання користувачів призведе до перевищення - поточного ліміту. Підвищте рівень свого плану, щоб - забезпечити доступ до цього екземпляра зовнішнім користувачам. - - ' - warning_user_limit_reached_instructions: 'Ви досягли обмеження користувача (%{current}/%{max} - активних користувачів). Напишіть на адресу sales@openproject.com, щоб перейти - на версію Enterprise і додати більше користувачів. - - ' - warning_protocol_mismatch_html: '' warning_bar: https_mismatch: - title: Невідповідність налаштувань режиму HTTPS - text_html: 'Значення параметра режиму HTTPS вашого додатка – %{set_protocol}, - але отримано запит %{actual_protocol}. Це призведе до помилок! - Потрібно встановити таке значення конфігурації: %{setting_value}. - Ознайомтеся з документацією зі встановлення, - щоб дізнатися, як налаштувати цю конфігурацію. - - ' + title: "Невідповідність налаштувань режиму HTTPS" + text_html: > + Значення параметра режиму HTTPS вашого додатка – %{set_protocol}, але отримано запит %{actual_protocol}. Це призведе до помилок! Потрібно встановити таке значення конфігурації: %{setting_value}. Ознайомтеся з документацією зі встановлення, щоб дізнатися, як налаштувати цю конфігурацію. hostname_mismatch: - title: Невідповідність налаштуванням імені хосту - text_html: 'Ваш додаток запущено з іменем хосту %{set_hostname}, - але в запиті використовується %{actual_hostname}. Це призведе - до помилок! Виберіть Системні налаштування та - змініть параметр «Ім’я хосту» на правильний. - - ' - menu_item: Пункт меню - menu_item_setting: Видимість - wiki_menu_item_for: Пункт меню для вікі-сторінки %{title} - wiki_menu_item_setting: Видимість - wiki_menu_item_new_main_item_explanation: 'Ви видаляєте лише головний пункт меню - вікі. Тепер ви повинні вибрати вікі-сторінку, для якої буде створено новий головний - елемент. Щоб видалити вікі, модуль wiki може бути відключений адміністраторами - проекту. - - ' - wiki_menu_item_delete_not_permitted: Пункт меню вікі лише з вікі-сторінки не можна - видалити. + title: "Невідповідність налаштуванням імені хосту" + text_html: > + Ваш додаток запущено з іменем хосту %{set_hostname}, але в запиті використовується %{actual_hostname}. Це призведе до помилок! Виберіть Системні налаштування та змініть параметр «Ім’я хосту» на правильний. + menu_item: "Пункт меню" + menu_item_setting: "Видимість" + wiki_menu_item_for: 'Пункт меню для вікі-сторінки %{title}' + wiki_menu_item_setting: "Видимість" + wiki_menu_item_new_main_item_explanation: > + Ви видаляєте лише головний пункт меню вікі. Тепер ви повинні вибрати вікі-сторінку, для якої буде створено новий головний елемент. Щоб видалити вікі, модуль wiki може бути відключений адміністраторами проекту. + wiki_menu_item_delete_not_permitted: Пункт меню вікі лише з вікі-сторінки не можна видалити. + #TODO: merge with work_packages top level key work_package: - updated_automatically_by_child_changes: '_Поповнюється автоматично шляхом зміни - значень у робочому пакеті для дітей %{child} _ - - ' + updated_automatically_by_child_changes: | + _Поповнюється автоматично шляхом зміни значень у робочому пакеті для дітей %{child} _ destroy: - info: Видалення робочого пакету є незворотною дією. - title: Видаліть робочий пакет + info: "Видалення робочого пакету є незворотною дією." + title: "Видаліть робочий пакет" progress: - label_note: Примітка. + label_note: "Примітка." modal: - work_based_help_text: Кожне поле автоматично обчислюється на основі двох інших, - коли це можливо. - status_based_help_text: Значення параметра «% завершення» визначається статусом - пакета робіт. - migration_warning_text: У режимі обчислення прогресу на основі робіт значення - параметра «% завершення» не можна встановити вручну й прив’язати до значення - параметра «Робота». Наявне значення збережено, але його не можна змінити. - Спочатку визначте параметр «Робота». + work_based_help_text: "Кожне поле автоматично обчислюється на основі двох інших, коли це можливо." + status_based_help_text: "Значення параметра «% завершення» визначається статусом пакета робіт." + migration_warning_text: "У режимі обчислення прогресу на основі робіт значення параметра «% завершення» не можна встановити вручну й прив’язати до значення параметра «Робота». Наявне значення збережено, але його не можна змінити. Спочатку визначте параметр «Робота»." derivation_hints: done_ratio: - cleared_because_remaining_work_is_empty: Очищено, оскільки атрибут «Залишок - роботи» пустий. - cleared_because_work_is_0h: Очищено, оскільки атрибут «Робота» дорівнює - 0 год. - derived: Виведено з атрибутів «Робота» й «Залишок роботи». + cleared_because_remaining_work_is_empty: "Очищено, оскільки атрибут «Залишок роботи» пустий." + cleared_because_work_is_0h: "Очищено, оскільки атрибут «Робота» дорівнює 0 год." + derived: "Виведено з атрибутів «Робота» й «Залишок роботи»." estimated_hours: - cleared_because_remaining_work_is_empty: Очищено, оскільки атрибут «Залишок - роботи» пустий. - derived: Виведено з атрибутів «Залишок роботи» й «% завершення». - same_as_remaining_work: Збігається зі значенням атрибута «Залишок роботи». + cleared_because_remaining_work_is_empty: "Очищено, оскільки атрибут «Залишок роботи» пустий." + derived: "Виведено з атрибутів «Залишок роботи» й «% завершення»." + same_as_remaining_work: "Збігається зі значенням атрибута «Залишок роботи»." remaining_hours: - cleared_because_work_is_empty: Очищено, оскільки атрибут «Робота» пустий. - cleared_because_percent_complete_is_empty: Очищено, оскільки атрибут «% - завершення» пустий. - decreased_by_delta_like_work: Зменшено на %{delta} відповідно до зміни атрибута - «Робота». - derived: Виведено з атрибутів «Робота» й «% завершення». - increased_by_delta_like_work: Збільшено на %{delta} відповідно до зміни - атрибута «Робота». - same_as_work: Збігається зі значенням атрибута «Робота». + cleared_because_work_is_empty: "Очищено, оскільки атрибут «Робота» пустий." + cleared_because_percent_complete_is_empty: "Очищено, оскільки атрибут «% завершення» пустий." + decreased_by_delta_like_work: "Зменшено на %{delta} відповідно до зміни атрибута «Робота»." + derived: "Виведено з атрибутів «Робота» й «% завершення»." + increased_by_delta_like_work: "Збільшено на %{delta} відповідно до зміни атрибута «Робота»." + same_as_work: "Збігається зі значенням атрибута «Робота»." permissions: - comment: Коментування - comment_description: Може переглядати й коментувати цей пакет робіт. - edit: Редагування - edit_description: Може переглядати, коментувати й редагувати цей пакет робіт. - view: Перегляд - view_description: Може переглядати цей пакет робіт. + comment: "Коментування" + comment_description: "Може переглядати й коментувати цей пакет робіт." + edit: "Редагування" + edit_description: "Може переглядати, коментувати й редагувати цей пакет робіт." + view: "Перегляд" + view_description: "Може переглядати цей пакет робіт." reminders: - label_remind_at: Дата - note_placeholder: Навіщо ви встановлюєте це нагадування? - create_success_message: 'Нагадування встановлено. Ви отримаєте сповіщення про - цей пакет робіт у такий час: %{reminder_time}.' - success_update_message: Нагадування оновлено. - success_deletion_message: Нагадування видалено. + label_remind_at: "Дата" + note_placeholder: "Навіщо ви встановлюєте це нагадування?" + create_success_message: "Нагадування встановлено. Ви отримаєте сповіщення про цей пакет робіт у такий час: %{reminder_time}." + success_update_message: "Нагадування оновлено." + success_deletion_message: "Нагадування видалено." sharing: count: - zero: 0 користувачів - one: 1 користувач - other: 'Користувачів: %{count}' + zero: "0 користувачів" + one: "1 користувач" + other: "Користувачів: %{count}" filter: - project_member: Учасник проєкту - not_project_member: Не учасник проєкту - project_group: Група проєкту - not_project_group: Не група проєкту - user: Користувач - group: Група - role: Роль - type: Тип - denied: У вас немає дозволу надавати спільний доступ до %{entities}. - label_search: Шукати й запрошувати користувачів - label_search_placeholder: Пошук за користувачем або електронною адресою - label_toggle_all: Перемкнути всі спільні ресурси - remove: Вилучити - share: Надати спільний доступ - text_empty_search_description: Користувачів за поточними умовами фільтра не знайдено. - text_empty_search_header: Результатів за запитом не знайдено. - text_empty_state_description: Доступ до цього %{entity} ще нікому не надано. - text_empty_state_header: Без спільного доступу - text_user_limit_reached: Додавання користувачів призведе до перевищення поточного - ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким - чином забезпечити доступ до цього %{entity} зовнішнім користувачам. - text_user_limit_reached_admins: Додавання користувачів призведе до перевищення - поточного ліміту. Підвищте рівень свого плану, - щоб додати користувачів. - warning_user_limit_reached: 'Додавання користувачів призведе до перевищення поточного - ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким - чином забезпечити доступ до цього %{entity} зовнішнім користувачам. - - ' - warning_user_limit_reached_admin: 'Додавання користувачів призведе до перевищення - поточного ліміту. Підвищте рівень свого плану, - щоб забезпечити доступ до цього %{entity} зовнішнім користувачам. - - ' - warning_no_selected_user: Виберіть користувачів, яким потрібно надати спільний - доступ до цього %{entity} - warning_locked_user: Користувача %{user} заблоковано, і йому не можна надати спільний - доступ + project_member: "Учасник проєкту" + not_project_member: "Не учасник проєкту" + project_group: "Група проєкту" + not_project_group: "Не група проєкту" + user: "Користувач" + group: "Група" + role: "Роль" + type: "Тип" + denied: "У вас немає дозволу надавати спільний доступ до %{entities}." + label_search: "Шукати й запрошувати користувачів" + label_search_placeholder: "Пошук за користувачем або електронною адресою" + label_toggle_all: "Перемкнути всі спільні ресурси" + remove: "Вилучити" + share: "Надати спільний доступ" + text_empty_search_description: "Користувачів за поточними умовами фільтра не знайдено." + text_empty_search_header: "Результатів за запитом не знайдено." + text_empty_state_description: "Доступ до цього %{entity} ще нікому не надано." + text_empty_state_header: "Без спільного доступу" + text_user_limit_reached: "Додавання користувачів призведе до перевищення поточного ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким чином забезпечити доступ до цього %{entity} зовнішнім користувачам." + text_user_limit_reached_admins: 'Додавання користувачів призведе до перевищення поточного ліміту. Підвищте рівень свого плану, щоб додати користувачів.' + warning_user_limit_reached: > + Додавання користувачів призведе до перевищення поточного ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким чином забезпечити доступ до цього %{entity} зовнішнім користувачам. + warning_user_limit_reached_admin: > + Додавання користувачів призведе до перевищення поточного ліміту. Підвищте рівень свого плану, щоб забезпечити доступ до цього %{entity} зовнішнім користувачам. + warning_no_selected_user: "Виберіть користувачів, яким потрібно надати спільний доступ до цього %{entity}" + warning_locked_user: "Користувача %{user} заблоковано, і йому не можна надати спільний доступ" user_details: - locked: Заблокований користувач - invited: 'Запрошення надіслано. ' - resend_invite: Переслати. - invite_resent: Запрошення надіслано повторно - not_project_member: Не учасник проєкту - project_group: Учасники групи можуть мати додаткові повноваження (як учасники - проєкту) - not_project_group: Група (спільна для всіх учасників) - additional_privileges_project: Може мати додаткові повноваження (як учасник - проєкту) - additional_privileges_group: Може мати додаткові повноваження (як учасник групи) - additional_privileges_project_or_group: Може мати додаткові повноваження (як - учасник проєкту або групи) + locked: "Заблокований користувач" + invited: "Запрошення надіслано. " + resend_invite: "Переслати." + invite_resent: "Запрошення надіслано повторно" + not_project_member: "Не учасник проєкту" + project_group: "Учасники групи можуть мати додаткові повноваження (як учасники проєкту)" + not_project_group: "Група (спільна для всіх учасників)" + additional_privileges_project: "Може мати додаткові повноваження (як учасник проєкту)" + additional_privileges_group: "Може мати додаткові повноваження (як учасник групи)" + additional_privileges_project_or_group: "Може мати додаткові повноваження (як учасник проєкту або групи)" project_queries: - publishing_denied: Ви не маєте дозволу на оприлюднення списків проєктів. - access_warning: Користувачі бачитимуть лише ті проєкти, до яких вони мають доступ. - Спільний доступ до списків проєктів не впливає на дозволи для окремих проєктів. + publishing_denied: "Ви не маєте дозволу на оприлюднення списків проєктів." + access_warning: "Користувачі бачитимуть лише ті проєкти, до яких вони мають доступ. Спільний доступ до списків проєктів не впливає на дозволи для окремих проєктів." user_details: - owner: Власник списку - can_view_because_public: Може переглядати, оскільки спільний доступ до списку - мають усі - can_manage_public_lists: Може редагувати завдяки, оскільки має глобальні дозволи + owner: "Власник списку" + can_view_because_public: "Може переглядати, оскільки спільний доступ до списку мають усі" + can_manage_public_lists: "Може редагувати завдяки, оскільки має глобальні дозволи" public_flag: - label: Надати спільний доступ усім користувачам екземпляра %{instance_name} - caption: Усі можуть переглядати цей список проєктів. Змінити його можуть користувачі - з глобальними дозволами на редагування. + label: "Надати спільний доступ усім користувачам екземпляра %{instance_name}" + caption: "Усі можуть переглядати цей список проєктів. Змінити його можуть користувачі з глобальними дозволами на редагування." blank_state: public: - header: Спільний доступ надано всім - description: Усі можуть переглядати цей список проєктів. Ви також можете - додати окремих користувачів із розширеними дозволами. + header: "Спільний доступ надано всім" + description: "Усі можуть переглядати цей список проєктів. Ви також можете додати окремих користувачів із розширеними дозволами." private: - header: 'Без спільного доступу: приватний' - description: Доступ до цього проєкту поки маєте лише ви. + header: "Без спільного доступу: приватний" + description: "Доступ до цього проєкту поки маєте лише ви." permissions: - view: Перегляд - view_description: Може переглядати цей список проєктів. - edit: Редагування - edit_description: Може переглядати, редагувати список проєктів і надавати - спільний доступ до нього. + view: "Перегляд" + view_description: "Може переглядати цей список проєктів." + edit: "Редагування" + edit_description: "Може переглядати, редагувати список проєктів і надавати спільний доступ до нього." upsell: - message: Надавати спільний доступ до списків проєктів окремим користувачам - можна за допомогою доповнення версії Enterprise. + message: "Надавати спільний доступ до списків проєктів окремим користувачам можна за допомогою доповнення версії Enterprise." working_days: - info: 'Під час планування пакетів робіт і життєвих циклів проєктів невибрані дні - пропускаються (і не включаються в кількість днів). Це налаштування можна змінити - на рівні пакета робіт. - - ' - instance_wide_info: 'Під час планування пакетів робіт дати, додані в список нижче, - вважаються неробочим днями й пропускаються. - - ' - change_button: Змінити робочі дні - warning: 'Якщо змінити дні тижня, які вважаються робочими чи неробочими, це може - вплинути на дати початку й завершення всіх пакетів робіт і життєвих циклів проєктів - в усіх проєктах цього екземпляра. - - ' + info: > + Під час планування пакетів робіт і життєвих циклів проєктів невибрані дні пропускаються (і не включаються в кількість днів). Це налаштування можна змінити на рівні пакета робіт. + instance_wide_info: > + Під час планування пакетів робіт дати, додані в список нижче, вважаються неробочим днями й пропускаються. + change_button: "Змінити робочі дні" + warning: > + Якщо змінити дні тижня, які вважаються робочими чи неробочими, це може вплинути на дати початку й завершення всіх пакетів робіт і життєвих циклів проєктів в усіх проєктах цього екземпляра. journal_note: changed: _**Робочі дні** змінено (%{changes})._ days: @@ -6557,81 +5419,67 @@ uk: dates: working: "%{date} зараз робочий день" non_working: "%{date} зараз неробочий день" - nothing_to_preview: Нічого для перегляду + nothing_to_preview: "Нічого для перегляду" api_v3: attributes: - property: Властивість + property: "Властивість" errors: - code_400: 'Поганий запит: %{message}' - code_401: Щоб отримати доступ до цього ресурсу, потрібно пройти аутентифікацію. - code_401_wrong_credentials: Ви не надати правильні облікові дані. - code_403: Ви не маєте права на доступ до цього ресурсу. - code_404: Не вдалося знайти потрібний ресурс. - code_409: Не вдалося оновити ресурс через конфліктуючі зміни. - code_429: Забагато запитів. Повторіть спробу пізніше. - code_500: Сталася внутрішня помилка. - code_500_outbound_request_failure: 'Вихідний запит до іншого ресурсу завершився - помилкою з кодом стану: %{status_code}.' - code_500_missing_enterprise_token: Цей запит не можна обробити через недійсний - або відсутній маркер версії Enterprise. + code_400: "Поганий запит: %{message}" + code_401: "Щоб отримати доступ до цього ресурсу, потрібно пройти аутентифікацію." + code_401_wrong_credentials: "Ви не надати правильні облікові дані." + code_403: "Ви не маєте права на доступ до цього ресурсу." + code_404: "Не вдалося знайти потрібний ресурс." + code_409: "Не вдалося оновити ресурс через конфліктуючі зміни." + code_429: "Забагато запитів. Повторіть спробу пізніше." + code_500: "Сталася внутрішня помилка." + code_500_outbound_request_failure: "Вихідний запит до іншого ресурсу завершився помилкою з кодом стану: %{status_code}." + code_500_missing_enterprise_token: "Цей запит не можна обробити через недійсний або відсутній маркер версії Enterprise." bad_request: - emoji_reactions_activity_type_not_supported: Дія такого типу не підтримує - реакцію за допомогою емодзі. - invalid_link: Посилання, пов’язане з ключем «%{key}», недійсне. - links_not_an_object: _links має бути об’єктом JSON. + emoji_reactions_activity_type_not_supported: "Дія такого типу не підтримує реакцію за допомогою емодзі." + invalid_link: "Посилання, пов’язане з ключем «%{key}», недійсне." + links_not_an_object: "_links має бути об’єктом JSON." conflict: - multiple_reminders_not_allowed: Можна одночасно встановити лише одне нагадування - для пакета робіт. Видаліть або оновіть наявне нагадування. + multiple_reminders_not_allowed: |- + Можна одночасно встановити лише одне нагадування для пакета робіт. Видаліть або оновіть наявне нагадування. not_found: - work_package: Пакет робіт, який ви шукаєте, не можна знайти або його видалено. - reminder: Нагадування, яке ви шукаєте, не вдалося знайти. Можливо, його видалено. + work_package: "Пакет робіт, який ви шукаєте, не можна знайти або його видалено." + reminder: "Нагадування, яке ви шукаєте, не вдалося знайти. Можливо, його видалено." expected: - date: YYYY-MM-DD (ISO 8601 date only) - datetime: YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (будь-який сумісний формат ISO - 8601 дати й часу) - duration: ISO 8601 тривалість - invalid_content_type: Очікуваний тип CONTENT-TYPE %{content_type} але отримав - %{actual}. - invalid_format: 'Недійсний формат властивості %{property}: Очікуваний формат - на зразок %{expected_format} but got %{actual}' - invalid_json: Запит не може бути проаналізований як JSON. - invalid_relation: Відношення недійсне. - invalid_resource: За нерухомість %{property} посилання на зразок %{expected} - очікується, але потрапив%{actual}. + date: "YYYY-MM-DD (ISO 8601 date only)" + datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (будь-який сумісний формат ISO 8601 дати й часу)" + duration: "ISO 8601 тривалість" + invalid_content_type: "Очікуваний тип CONTENT-TYPE %{content_type} але отримав %{actual}." + invalid_format: "Недійсний формат властивості %{property}: Очікуваний формат на зразок %{expected_format} but got %{actual}" + invalid_json: "Запит не може бути проаналізований як JSON." + invalid_relation: "Відношення недійсне." + invalid_resource: "За нерухомість %{property} посилання на зразок %{expected} очікується, але потрапив%{actual}." invalid_signal: - embed: 'Запитане вбудування %{invalid} не підтримується. Підтримувані вбудування: - %{supported}.' - select: 'Запитаний варіант %{invalid} не підтримується. Підтримувані варіанти: - %{supported}.' - invalid_user_status_transition: Поточний статус облікового запису користувача - не дозволяє цю операцію. - missing_content_type: не вказано - missing_property: Немає властивості «%{property}». - missing_request_body: Не було органу запиту. - missing_or_malformed_parameter: Параметр запиту %{parameter} відсутній або неправильно - сформований. - multipart_body_error: Текст запиту не містить очікуваного складових частин. - multiple_errors: Було порушено декілька обмежень поля. - unable_to_create_attachment: Не вдалося створити вкладення - unable_to_create_attachment_permissions: Вкладення не вдалося зберегти через - відсутність дозволів на файлову систему + embed: "Запитане вбудування %{invalid} не підтримується. Підтримувані вбудування: %{supported}." + select: "Запитаний варіант %{invalid} не підтримується. Підтримувані варіанти: %{supported}." + invalid_user_status_transition: "Поточний статус облікового запису користувача не дозволяє цю операцію." + missing_content_type: "не вказано" + missing_property: "Немає властивості «%{property}»." + missing_request_body: "Не було органу запиту." + missing_or_malformed_parameter: "Параметр запиту %{parameter} відсутній або неправильно сформований." + multipart_body_error: "Текст запиту не містить очікуваного складових частин." + multiple_errors: "Було порушено декілька обмежень поля." + unable_to_create_attachment: "Не вдалося створити вкладення" + unable_to_create_attachment_permissions: "Вкладення не вдалося зберегти через відсутність дозволів на файлову систему" user: - name_readonly: Атрибут «Повне ім’я» (name) доступний лише для читання. Зміни - можна записати за допомогою атрибутів «Ім’я» (firstname) і «Прізвище» (lastname). + name_readonly: "Атрибут «Повне ім’я» (name) доступний лише для читання. Зміни можна записати за допомогою атрибутів «Ім’я» (firstname) і «Прізвище» (lastname)." render: - context_not_parsable: Контексті не посилання на ресурс. - unsupported_context: Даний ресурс не підтримується як контекст. - context_object_not_found: Не можу знайти ресурс з урахуванням контексту. + context_not_parsable: "Контексті не посилання на ресурс." + unsupported_context: "Даний ресурс не підтримується як контекст." + context_object_not_found: "Не можу знайти ресурс з урахуванням контексту." validation: - due_date: Дата закінчення не може бути встановлена на початкових робочих пакетах. - invalid_user_assigned_to_work_package: Вибраному користувачеві не дозволяється - %{property} для цього робочого пакету. - start_date: Дата початку не може бути встановлена на базових робочих пакетах. + due_date: "Дата закінчення не може бути встановлена на початкових робочих пакетах." + invalid_user_assigned_to_work_package: "Вибраному користувачеві не дозволяється %{property} для цього робочого пакету." + start_date: "Дата початку не може бути встановлена на базових робочих пакетах." eprops: invalid_gzip: "– недійсний gzip: %{message}" invalid_json: "– недійсний json: %{message}" resources: - schema: Схема + schema: "Схема" undisclosed: parent: 'Нерозкритий: батьківський елемент невидимий через відсутність дозволів.' project: 'Нерозкритий: проєкт невидимий через відсутність дозволів.' @@ -6639,232 +5487,170 @@ uk: definingProject: 'Нерозкритий: проєкт невидимий через відсутність дозволів.' doorkeeper: pre_authorization: - status: Попередня авторизація - auth_url: URL автентифікації - access_token_url: URL маркера доступу + status: "Попередня авторизація" + auth_url: "URL автентифікації" + access_token_url: "URL маркера доступу" errors: messages: + #Common error messages invalid_request: - unknown: У запиті відсутній необхідний параметр, він містить непідтримуваний - параметр або інший варіант. - missing_param: 'Відсутній обов’язковий параметр: %{value}.' - request_not_authorized: Запит потрібно авторизувати. Необхідний параметр - запиту авторизації відсутній або недійсний. - invalid_redirect_uri: Запитаний URI переспрямування пошкоджений або не збігається - з клієнтським URI переспрямування. - unauthorized_client: Клієнт не має права виконувати цей запит за допомогою - цього методу. - access_denied: Власник ресурсів або сервер авторизації відхилив запит. - invalid_scope: Запитувана область дії є недійсною, невідомою або неправильною. - invalid_code_challenge_method: Метод виклику коду повинен бути простим або - S256. - server_error: Сервер авторизації зіткнувся з несподіваною умовою, яка не дозволила - виконати запит. - temporarily_unavailable: Сервер авторизації наразі не може обробити запит - через тимчасове перевантаження або обслуговування сервера. - credential_flow_not_configured: Потік облікових даних не вдався через Doorkeeper.configure.resource_owner_from_credentials - being unconfigured. - resource_owner_authenticator_not_configured: Не вдалося знайти власника ресурсу - через Doorkeeper.configure.resource_owner_authenticator being unconfigured. - admin_authenticator_not_configured: Доступ до адміністративної панелі заборонений - через Doorkeeper.configure.admin_authenticator being unconfigured. - unsupported_response_type: Сервер авторизації не підтримує цей тип відповіді. - unsupported_response_mode: Сервер авторизації не підтримує цей режим відповіді. - invalid_client: Аутентифікація клієнта не вдалася за відстуності клієнта, - не було включено автентифікацію клієнта або непідтримувався метод автентифікації. - invalid_grant: Наданий дозвіл на авторизацію недійсний, минув, анульований, - не відповідає URI перенаправлення, що використовується в запиті на авторизацію, - або був виданий іншому клієнту. - unsupported_grant_type: Тип дозволу авторизації не підтримується сервером - авторизації. + unknown: "У запиті відсутній необхідний параметр, він містить непідтримуваний параметр або інший варіант." + missing_param: "Відсутній обов’язковий параметр: %{value}." + request_not_authorized: "Запит потрібно авторизувати. Необхідний параметр запиту авторизації відсутній або недійсний." + invalid_redirect_uri: "Запитаний URI переспрямування пошкоджений або не збігається з клієнтським URI переспрямування." + unauthorized_client: "Клієнт не має права виконувати цей запит за допомогою цього методу." + access_denied: "Власник ресурсів або сервер авторизації відхилив запит." + invalid_scope: "Запитувана область дії є недійсною, невідомою або неправильною." + invalid_code_challenge_method: "Метод виклику коду повинен бути простим або S256." + server_error: "Сервер авторизації зіткнувся з несподіваною умовою, яка не дозволила виконати запит." + temporarily_unavailable: "Сервер авторизації наразі не може обробити запит через тимчасове перевантаження або обслуговування сервера." + #Configuration error messages + credential_flow_not_configured: "Потік облікових даних не вдався через Doorkeeper.configure.resource_owner_from_credentials being unconfigured." + resource_owner_authenticator_not_configured: "Не вдалося знайти власника ресурсу через Doorkeeper.configure.resource_owner_authenticator being unconfigured." + admin_authenticator_not_configured: "Доступ до адміністративної панелі заборонений через Doorkeeper.configure.admin_authenticator being unconfigured." + #Access grant errors + unsupported_response_type: "Сервер авторизації не підтримує цей тип відповіді." + unsupported_response_mode: "Сервер авторизації не підтримує цей режим відповіді." + #Access token errors + invalid_client: "Аутентифікація клієнта не вдалася за відстуності клієнта, не було включено автентифікацію клієнта або непідтримувався метод автентифікації." + invalid_grant: "Наданий дозвіл на авторизацію недійсний, минув, анульований, не відповідає URI перенаправлення, що використовується в запиті на авторизацію, або був виданий іншому клієнту." + unsupported_grant_type: "Тип дозволу авторизації не підтримується сервером авторизації." invalid_token: - revoked: Маркер доступу скасовано - expired: Термін дії доступу закінчився - unknown: Маркер доступу недійсний + revoked: "Маркер доступу скасовано" + expired: "Термін дії доступу закінчився" + unknown: "Маркер доступу недійсний" revoke: - unauthorized: Ви не вповноважені відкликати цей маркер. + unauthorized: "Ви не вповноважені відкликати цей маркер." forbidden_token: - missing_scope: Для доступу до цього ресурсу потрібна область «%{oauth_scopes}». + missing_scope: 'Для доступу до цього ресурсу потрібна область «%{oauth_scopes}».' unsupported_browser: - title: Ваш веб-переглядач застарілий і не підтримується. - message: Ви можете зіткнутися з помилками та погіршити досвід роботи на цій сторінці. - update_message: Будь ласка, оновіть ваш браузер. - close_warning: Ігнорувати це попередження. + title: "Ваш веб-переглядач застарілий і не підтримується." + message: "Ви можете зіткнутися з помилками та погіршити досвід роботи на цій сторінці." + update_message: "Будь ласка, оновіть ваш браузер." + close_warning: "Ігнорувати це попередження." oauth: application: builtin: Вбудований екземпляр застосунку confidential: Конфіденційний - singular: Програма OAuth - scopes: Області - client_credentials: Облікові дані клієнта - plural: Програми OAuth + singular: "Програма OAuth" + scopes: "Області" + client_credentials: "Облікові дані клієнта" + plural: "Програми OAuth" named: " Програми OAuth '%{name}'" - new: Нова програма OAuth + new: "Нова програма OAuth" non_confidential: Не конфіденційний default_scopes: "(Області за умовчанням)" instructions: - enabled: Увімкнути цей застосунок, дозволяючи користувачам надання авторизації - з ним. - name: Назва вашої програми. Це буде показано іншим користувачам після авторизації. - redirect_uri_html: 'Дозволені URL-адреси, дозволені користувачам, можна перенаправити. - Один запис на рядок.
Якщо ви реєструєте настільну програму, використовуйте - таку URL-адресу. - - ' - confidential: Перевірте, чи буде використовуватися програма, якщо секрет клієнта - може бути конфіденційним. Природні мобільні програми та програми з однією - сторінкою вважаються неконфіденційними. - scopes: Перевірте області, до яких ви хотіли б надати доступ. Якщо не позначено - жодну область, такою вважатиметься api_v3. - client_credential_user_id: Необов'язковий ідентифікатор користувача, який - видає себе, коли клієнти використовують цю програму. Залиште пустим, щоб - дозволити лише загальний доступ - register_intro: Якщо ви розробляєте клієнтське додаток OAuth для OpenProject, - ви можете зареєструвати його, використовуючи цю форму для всіх користувачів. - default_scopes: '' + enabled: "Увімкнути цей застосунок, дозволяючи користувачам надання авторизації з ним." + name: "Назва вашої програми. Це буде показано іншим користувачам після авторизації." + redirect_uri_html: > + Дозволені URL-адреси, дозволені користувачам, можна перенаправити. Один запис на рядок.
Якщо ви реєструєте настільну програму, використовуйте таку URL-адресу. + confidential: "Перевірте, чи буде використовуватися програма, якщо секрет клієнта може бути конфіденційним. Природні мобільні програми та програми з однією сторінкою вважаються неконфіденційними." + scopes: "Перевірте області, до яких ви хотіли б надати доступ. Якщо не позначено жодну область, такою вважатиметься api_v3." + client_credential_user_id: "Необов'язковий ідентифікатор користувача, який видає себе, коли клієнти використовують цю програму. Залиште пустим, щоб дозволити лише загальний доступ" + register_intro: "Якщо ви розробляєте клієнтське додаток OAuth для OpenProject, ви можете зареєструвати його, використовуючи цю форму для всіх користувачів." + default_scopes: "" header: builtin_applications: Вбудовані застосунки OAuth other_applications: Інші застосунки OAuth empty_application_lists: Жодного застосунку OAuth не зареєстровано. - client_id: Client ID - client_secret_notice: 'Це єдиний раз, коли ми можемо надати клієнтську таємницю, - зауважте її та збережіть її в безпеці. Він повинен розглядатися як пароль і - не може бути отриманий OpenProject пізніше. - - ' + client_id: "Client ID" + client_secret_notice: > + Це єдиний раз, коли ми можемо надати клієнтську таємницю, зауважте її та збережіть її в безпеці. Він повинен розглядатися як пароль і не може бути отриманий OpenProject пізніше. authorization_dialog: - authorize: Авторизувати - cancel: Скасувати та заборонити авторизацію. - prompt_html: Авторизувати%{application_name} використовувати - обліковий запис %{login}? - title: Авторизувати %{application_name} - wants_to_access_html: 'Ця програма запитує доступ до вашого облікового запису - OpenProject.
Він подав запит на такі дозволи: - - ' + authorize: "Авторизувати" + cancel: "Скасувати та заборонити авторизацію." + prompt_html: "Авторизувати%{application_name} використовувати обліковий запис %{login}?" + title: "Авторизувати %{application_name}" + wants_to_access_html: > + Ця програма запитує доступ до вашого облікового запису OpenProject.
Він подав запит на такі дозволи: scopes: - api_v3: Повний доступ до API версії 3 - api_v3_text: Додаток отримає повний доступ для читання та записування в OpenProject - API версії 3, щоб виконувати дії від вашого імені. + api_v3: "Повний доступ до API версії 3" + api_v3_text: "Додаток отримає повний доступ для читання та записування в OpenProject API версії 3, щоб виконувати дії від вашого імені." grants: - created_date: Затверджено - scopes: Дозволи - successful_application_revocation: Відкликання заявки %{application_name} успішне. - none_given: Жодних програм OAuth не було надано доступ до вашого облікового - запису користувача. + created_date: "Затверджено" + scopes: "Дозволи" + successful_application_revocation: "Відкликання заявки %{application_name} успішне." + none_given: "Жодних програм OAuth не було надано доступ до вашого облікового запису користувача." x_active_tokens: - one: один активний маркер + one: "один активний маркер" few: "%{count} активний маркер" many: "%{count} активний маркер" other: "%{count} активний маркер" flows: - authorization_code: Потік авторизації коду - client_credentials: Потік облікових даних клієнта - client_credentials: Користувач, який використовується для облікових даних клієнта - client_credentials_impersonation_set_to: Ідентифікатор користувача для облікових - даних клієнта - client_credentials_impersonation_warning: 'Примітка: Клієнти, які використовують - потік "Клієнтські дані" в цій програмі, матимуть права цього користувача' - client_credentials_impersonation_html: 'За замовчуванням OpenProject надає авторизацію - OAuth 2.0 через %{authorization_code_flow_link}. За бажанням можна включити - %{client_credentials_flow_link} але ви повинні надати користувачеві, від імені - будуть кого виконуватися запити. - - ' - authorization_error: Сталася помилка авторизації. - revoke_my_application_confirmation: Ви дійсно бажаєте видалити цю програму? Це - скасує %{token_count} активація для цього. - my_registered_applications: Зареєстровані програми OAuth + authorization_code: "Потік авторизації коду" + client_credentials: "Потік облікових даних клієнта" + client_credentials: "Користувач, який використовується для облікових даних клієнта" + client_credentials_impersonation_set_to: "Ідентифікатор користувача для облікових даних клієнта" + client_credentials_impersonation_warning: "Примітка: Клієнти, які використовують потік \"Клієнтські дані\" в цій програмі, матимуть права цього користувача" + client_credentials_impersonation_html: > + За замовчуванням OpenProject надає авторизацію OAuth 2.0 через %{authorization_code_flow_link}. За бажанням можна включити %{client_credentials_flow_link} але ви повинні надати користувачеві, від імені будуть кого виконуватися запити. + authorization_error: "Сталася помилка авторизації." + revoke_my_application_confirmation: "Ви дійсно бажаєте видалити цю програму? Це скасує %{token_count} активація для цього." + my_registered_applications: "Зареєстровані програми OAuth" oauth_client: urn_connection_status: - connected: Підключено - error: Помилка - failed_authorization: Помилка авторизації - not_connected: Не підключено + connected: "Підключено" + error: "Помилка" + failed_authorization: "Помилка авторизації" + not_connected: "Не підключено" labels: - label_oauth_integration: Інтеграція OAuth2 - label_redirect_uri: URI переспрямування - label_request_token: Маркер запиту - label_refresh_token: Маркер оновлення + label_oauth_integration: "Інтеграція OAuth2" + label_redirect_uri: "URI переспрямування" + label_request_token: "Маркер запиту" + label_refresh_token: "Маркер оновлення" errors: - oauth_authorization_code_grant_had_errors: Не вдалося надати дозвіл на авторизацію - OAuth2 - oauth_reported: 'Постачальник OAuth2 повідомив:' - oauth_returned_error: Клієнт OAuth2 повернув помилку - oauth_returned_json_error: Клієнт OAuth2 повернув помилку JSON - oauth_returned_http_error: Клієнт OAuth2 повернув помилку мережі - oauth_returned_standard_error: Клієнт OAuth2 повернув внутрішню помилку - wrong_token_type_returned: Клієнт OAuth2 повернув неправильний тип маркеру (очікувався - тип AccessToken::Bearer) - oauth_issue_contact_admin: Клієнт OAuth2 повідомив про помилку. Зверніться до - системного адміністратора. - oauth_client_not_found: Клієнта OAuth2 не знайдено в кінцевій точці 'callback' - (redirect_uri). - refresh_token_called_without_existing_token: 'Внутрішня помилка: здійснено виклик - маркера refresh_token без наявного раніше маркера. - - ' - refresh_token_updated_failed: Сталася помилка під час оновлення маркера OAuthClientToken - oauth_client_not_found_explanation: 'Ця помилка з’являється, якщо оновити client_id - та client_secret в OpenProject, але не оновити поле ''Return URI'' для постачальника - OAuth2. - - ' - oauth_code_not_present: Значення 'code' OAuth2 не знайдено в кінцевій точці - 'callback' (redirect_uri). - oauth_code_not_present_explanation: 'Ця помилка з’являється, якщо вибрати неправильне - значення response_type для постачальника OAuth2. Поле Response_type може мати - значення ''code'' або подібне. - - ' - oauth_state_not_present: Значення 'state' OAuth2 не знайдено в кінцевій точці - 'callback' (redirect_uri). - oauth_state_not_present_explanation: 'Значення ''state'' указує OpenProject - на місце, з якого потрібно продовжити після вдалої авторизації OAuth2. Відсутнє - значення ''state'' – це внутрішня помилка, яка може статися під час налаштування. - Зверніться до системного адміністратора. - - ' + oauth_authorization_code_grant_had_errors: "Не вдалося надати дозвіл на авторизацію OAuth2" + oauth_reported: "Постачальник OAuth2 повідомив:" + oauth_returned_error: "Клієнт OAuth2 повернув помилку" + oauth_returned_json_error: "Клієнт OAuth2 повернув помилку JSON" + oauth_returned_http_error: "Клієнт OAuth2 повернув помилку мережі" + oauth_returned_standard_error: "Клієнт OAuth2 повернув внутрішню помилку" + wrong_token_type_returned: "Клієнт OAuth2 повернув неправильний тип маркеру (очікувався тип AccessToken::Bearer)" + oauth_issue_contact_admin: "Клієнт OAuth2 повідомив про помилку. Зверніться до системного адміністратора." + oauth_client_not_found: "Клієнта OAuth2 не знайдено в кінцевій точці 'callback' (redirect_uri)." + refresh_token_called_without_existing_token: > + Внутрішня помилка: здійснено виклик маркера refresh_token без наявного раніше маркера. + refresh_token_updated_failed: "Сталася помилка під час оновлення маркера OAuthClientToken" + oauth_client_not_found_explanation: > + Ця помилка з’являється, якщо оновити client_id та client_secret в OpenProject, але не оновити поле 'Return URI' для постачальника OAuth2. + oauth_code_not_present: "Значення 'code' OAuth2 не знайдено в кінцевій точці 'callback' (redirect_uri)." + oauth_code_not_present_explanation: > + Ця помилка з’являється, якщо вибрати неправильне значення response_type для постачальника OAuth2. Поле Response_type може мати значення 'code' або подібне. + oauth_state_not_present: "Значення 'state' OAuth2 не знайдено в кінцевій точці 'callback' (redirect_uri)." + oauth_state_not_present_explanation: > + Значення 'state' указує OpenProject на місце, з якого потрібно продовжити після вдалої авторизації OAuth2. Відсутнє значення 'state' – це внутрішня помилка, яка може статися під час налаштування. Зверніться до системного адміністратора. rack_oauth2: - client_secret_invalid: Секретний ключ клієнта неприпустимий (client_secret_invalid) - invalid_request: 'Сервер авторизації OAuth2 повернув відповідь ''invalid_request''. - Ця помилка стається в разі повторних спроб авторизації або технічних проблем. - - ' - invalid_response: Сервер авторизації OAuth2 повернув неприпустиму відповідь - (invalid_response) - invalid_grant: Сервер авторизації OAuth2 просить вас авторизуватися повторно - (invalid_grant). - invalid_client: Сервер авторизації OAuth2 не розпізнає OpenProject (invalid_client). - unauthorized_client: Сервер авторизації OAuth2 відхиляє тип дозволу (unauthorized_client) - unsupported_grant_type: Сервер авторизації OAuth2 просить вас авторизуватися - повторно (unsupported_grant_type). - invalid_scope: Ви не можете отримати доступ до потрібного ресурсу (invalid_scope). + client_secret_invalid: "Секретний ключ клієнта неприпустимий (client_secret_invalid)" + invalid_request: > + Сервер авторизації OAuth2 повернув відповідь 'invalid_request'. Ця помилка стається в разі повторних спроб авторизації або технічних проблем. + invalid_response: "Сервер авторизації OAuth2 повернув неприпустиму відповідь (invalid_response)" + invalid_grant: "Сервер авторизації OAuth2 просить вас авторизуватися повторно (invalid_grant)." + invalid_client: "Сервер авторизації OAuth2 не розпізнає OpenProject (invalid_client)." + unauthorized_client: "Сервер авторизації OAuth2 відхиляє тип дозволу (unauthorized_client)" + unsupported_grant_type: "Сервер авторизації OAuth2 просить вас авторизуватися повторно (unsupported_grant_type)." + invalid_scope: "Ви не можете отримати доступ до потрібного ресурсу (invalid_scope)." http: request: - failed_authorization: Серверному запиту не вдалось авторизуватися. - missing_authorization: Сталася помилка серверного запиту через відсутність інформації - про авторизацію. + failed_authorization: "Серверному запиту не вдалось авторизуватися." + missing_authorization: "Сталася помилка серверного запиту через відсутність інформації про авторизацію." response: - unexpected: Отримано неочікувану відповідь. + unexpected: "Отримано неочікувану відповідь." you: ви link: посилання plugin_openproject_auth_plugins: - name: Плагіни OpenProject Auth - description: Інтеграція постачальників стратегії OmniAuth для автентифікації в - OpenProject. + name: "Плагіни OpenProject Auth" + description: "Інтеграція постачальників стратегії OmniAuth для автентифікації в OpenProject." plugin_openproject_auth_saml: - name: OmniAuth SAML / Служба єдиного входу - description: Додає постачальника OmniAuth SAML в OpenProject + name: "OmniAuth SAML / Служба єдиного входу" + description: "Додає постачальника OmniAuth SAML в OpenProject" enterprise_plans: - legacy_enterprise: План Enterprise + legacy_enterprise: "План Enterprise" token: hashed_token: display_value_placeholder: "***" external_link_warning: - title: Вихід з OpenProject - warning_message: Ви збираєтеся перейти з OpenProject на зовнішній вебсайт. Зауважте, - що ми не контролюємо зовнішні вебсайти, і вони можуть мати інші політики конфіденційності - й безпеки. - continue_message: Справді перейти за зовнішнім посиланням нижче? - continue_button: Перейти на зовнішній вебсайт + title: "Вихід з OpenProject" + warning_message: "Ви збираєтеся перейти з OpenProject на зовнішній вебсайт. Зауважте, що ми не контролюємо зовнішні вебсайти, і вони можуть мати інші політики конфіденційності й безпеки." + continue_message: "Справді перейти за зовнішнім посиланням нижче?" + continue_button: "Перейти на зовнішній вебсайт" diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index cbada303548..211926edb6c 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -225,7 +225,7 @@ zh-CN: title: "导入范围" caption: "选择要导入 OpenProject 的内容" caption_done: "已完成" - 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." + label_info: "请注意,此导入工具仍处于测试阶段,不能导入所有类型的数据。以下是主机 Jira 实例提供的导入功能摘要,以及此工具目前能够导入的内容。" description: "在从主机 Jira 实例获取的可用数据中选择要导入的数据。" label_available_data: "可用数据" label_not_available_data: "不可导入" @@ -267,11 +267,11 @@ zh-CN: select_dialog: filter_projects: "按文本筛选" import_dialog: - title: "Start this import?" - confirm_button: "Start import" + title: "是否开始此导入?" + confirm_button: "开始导入" description: > - This importer is an alpha feature. It is not yet able to import all data from Jira and might leave incomplete data on this OpenProject instance. Do not use a production environment and create a backup of your OpenProject data before starting. - confirm: "I understand and made the necessary preparations" + 此导入器是一项 alpha 功能。它还不能从 Jira 导入所有数据,可能会在此 OpenProject 实例上留下不完整的数据。 请勿在生产环境中使用,在开始之前,请先创建 OpenProject 数据备份。 + confirm: "我明白,我已做好了必要的准备" revert_dialog: title: "是否永久撤消此导入?" description: "这将删除所有导入的对象(包括整个项目),即使在 OpenProject 上导入后这些项目中有用户活动。" @@ -3025,7 +3025,7 @@ zh-CN: line_0: 通过安全的 MCP 服务器实现的 AI 工作流(专业方案及更高版本) line_1: 改进了项目首页,新增了预算微件,提高了可访问性 line_2: "会议:会议模板(基本方案及更高版本)" - line_3: Better transparency with project attribute comments + line_3: 通过项目特性注释,提高了透明度 line_4: PDF 导出增强功能 line_5: 提高了外部链接的安全性(高级方案及更高版本) line_6: 积压工作模块中的 UI/UX 改进 diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 34f5a9d153c..55ad9815bfe 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -84,8 +84,8 @@ de: blankslate_title: "%{name} ist leer" blankslate_description: "Noch keine Arbeitspakete geplant. Ziehen Sie Arbeitspakete hierher, um sie hinzuzufügen." sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} ist leer" + blankslate_description: "Noch keine Arbeitspakete geplant. Ziehen Sie Arbeitspakete hierher, um sie hinzuzufügen." backlog_header_component: label_toggle_backlog: "%{name} ein-/ausklappen" label_story_count: @@ -93,11 +93,11 @@ de: one: "%{count} Arbeitspakete im Backlog" other: "%{count} Geschichten im Backlog" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "%{name} ein-/ausklappen" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "Keine Stories im Sprint" + one: "%{count} Stories im Sprint" + other: "%{count} Stories im Sprint" backlog_menu_component: label_actions: "Backlog-Aktionen" action_menu: @@ -109,13 +109,13 @@ de: wiki: "Wiki" properties: "Eigenschaften" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "Sprint-Aktionen" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Sprint bearbeiten" + new_story: "Neue Story" + stories_tasks: "Stories/Aufgaben" + task_board: "Taskboard" + burndown_chart: "Burndown-Diagramm" story_component: label_drag_story: "%{name} verschieben" story_menu_component: @@ -143,10 +143,10 @@ de: label_backlogs_unconfigured: "Sie haben noch keine Backlogs konfiguriert. Bitte gehen Sie auf %{administration} > %{plugins}, klicken Sie dann auf den %{configure} Link für dieses Plugin. Kommen Sie hierher zurück, sobald sie die Felder konfiguriert haben." label_blocks_ids: "IDs der blockierten Arbeitspakete" label_column_in_backlog: "Spalte im Backlog" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "Als Backlog verwendet" label_points_burn_down: "Runter" label_points_burn_up: "Hoch" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "Sprint bearbeiten" label_sprint_impediments: "Sprint Hindernisse" label_sprint_new: "Neuer Sprint" label_task_board: "Taskboard" diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index 996d73f762b..0eb631ca443 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -84,8 +84,8 @@ es: blankslate_title: "%{name} está vacío" blankslate_description: "Aún no hay elementos previstos. Arrastre los elementos aquí para añadirlos." sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} está vacío" + blankslate_description: "Aún no hay elementos previstos. Arrastre los elementos aquí para añadirlos." backlog_header_component: label_toggle_backlog: "Contraer/expandir %{name}" label_story_count: @@ -93,11 +93,11 @@ es: one: "%{count} historia en backlog" other: "%{count} historias en backlog" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Contraer/expandir %{name}" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "No hay historias en sprint" + one: "%{count} historia en sprint" + other: "%{count} historias en sprint" backlog_menu_component: label_actions: "Acciones de backlog" action_menu: @@ -109,13 +109,13 @@ es: wiki: "Wiki" properties: "Propiedades" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "Acciones de sprint" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Editar sprint" + new_story: "Nueva historia" + stories_tasks: "Historias/tareas" + task_board: "Panel de tareas" + burndown_chart: "Diagrama Burndown" story_component: label_drag_story: "Mover %{name}" story_menu_component: @@ -143,10 +143,10 @@ es: label_backlogs_unconfigured: "Todavía no ha configurado backlogs. Por favor, visite %{administration} > %{plugins}, luego haga clic en el enlace de %{configure} para esta extensión. Cuando haya establecido los campos, vuelva a esta página para empezar a usar la herramienta." label_blocks_ids: "ID de los paquetes de trabajo bloqueados" label_column_in_backlog: "Columna en backlog" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "Se usa como backlog" label_points_burn_down: "Abajo" label_points_burn_up: "Arriba" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "Editar sprint" label_sprint_impediments: "Impedimentos de sprint" label_sprint_new: "Nuevo sprint" label_task_board: "Tablero de tareas" diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index b0ca3a3eab3..38bb8715cd3 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -84,8 +84,8 @@ fr: blankslate_title: "%{name} est vide" blankslate_description: "Aucun élément n'a encore été planifié. Faites glisser les éléments ici pour les ajouter." sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} est vide" + blankslate_description: "Aucun élément n'a encore été planifié. Faites glisser les éléments ici pour les ajouter." backlog_header_component: label_toggle_backlog: "Réduire/développer %{name}" label_story_count: @@ -93,11 +93,11 @@ fr: one: "%{count} histoire dans le backlog" other: "%{count} histoires dans le backlog" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Réduire/développer %{name}" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "Aucune story dans le sprint" + one: "%{count} story dans le sprint" + other: "%{count} stories dans le sprint" backlog_menu_component: label_actions: "Actions dans le backlog" action_menu: @@ -109,13 +109,13 @@ fr: wiki: "Wiki" properties: "Propriétés" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "Actions du sprint" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Modifier le sprint" + new_story: "Nouvelle story" + stories_tasks: "Stories/tâches" + task_board: "Tableau des tâches" + burndown_chart: "Graphique burndown" story_component: label_drag_story: "Déplacer %{name}" story_menu_component: @@ -143,10 +143,10 @@ fr: label_backlogs_unconfigured: "Vous n'avez pas encore configuré Backlogs. Veuillez vous rendre dans %{administration} > %{plugins}, puis cliquer sur le lien %{configure} pour ce plugin. Une fois que vous avez défini les champs, revenez sur cette page pour commencer à utiliser l'outil." label_blocks_ids: "ID des lots de travaux bloqués" label_column_in_backlog: "Colonne dans le backlog" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "Utilisé comme backlog" label_points_burn_down: "Vers le bas" label_points_burn_up: "Vers le haut" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "Modifier le sprint" label_sprint_impediments: "Obstacles de sprint" label_sprint_new: "Nouveau sprint" label_task_board: "Tableau des tâches" diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml index 880e49c1d2f..c9d01481205 100644 --- a/modules/backlogs/config/locales/crowdin/it.yml +++ b/modules/backlogs/config/locales/crowdin/it.yml @@ -84,8 +84,8 @@ it: blankslate_title: "%{name} è vuoto" blankslate_description: "Nessun elemento pianificato ancora. Trascina gli elementi qui per aggiungerli." sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} è vuoto" + blankslate_description: "Nessun elemento pianificato ancora. Trascina gli elementi qui per aggiungerli." backlog_header_component: label_toggle_backlog: "Comprimi/Espandi %{name}" label_story_count: @@ -93,11 +93,11 @@ it: one: "%{count} story nel backlog" other: "%{count} story nel backlog" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Comprimi/Espandi %{name}" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "Nessuna story nello sprint" + one: "%{count} story nello sprint" + other: "%{count} story nello sprint" backlog_menu_component: label_actions: "Azioni nel backlog" action_menu: @@ -109,13 +109,13 @@ it: wiki: "Wiki" properties: "Proprietà" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "Azioni dello sprint" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Modifica sprint" + new_story: "Nuova story" + stories_tasks: "Story/Task" + task_board: "Bacheca dei task" + burndown_chart: "Grafico Burndown" story_component: label_drag_story: "Sposta %{name}" story_menu_component: @@ -143,10 +143,10 @@ it: label_backlogs_unconfigured: "Non hai ancora configurato i Backlog. Vai su %{administration} > %{plugins}, quindi fai clic sul link %{configure} per il plugin. Dopo aver impostato i campi, torna su questa pagina per iniziare a utilizzare lo strumento." label_blocks_ids: "ID dei pacchetti di lavoro bloccati" label_column_in_backlog: "Colonna nel backlog" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "Usato come backlog" label_points_burn_down: "Verso il basso" label_points_burn_up: "Verso l'alto" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "Modifica sprint" label_sprint_impediments: "Impedimenti allo sprint" label_sprint_new: "Nuovo sprint" label_task_board: "Pannello delle attività" diff --git a/modules/backlogs/config/locales/crowdin/js-uk.yml b/modules/backlogs/config/locales/crowdin/js-uk.yml index aa86d45e2a2..1e1e96441f9 100644 --- a/modules/backlogs/config/locales/crowdin/js-uk.yml +++ b/modules/backlogs/config/locales/crowdin/js-uk.yml @@ -25,5 +25,5 @@ uk: properties: storyPoints: "Сторі-поінти" burndown: - day: "Day" - points: "Points" + day: "День" + points: "Одиниці" diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index d78afe60f47..9dd153b792a 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -82,8 +82,8 @@ ko: blankslate_title: "%{name}이(가) 비어 있습니다" blankslate_description: "아직 계획된 항목이 없습니다. 항목을 추가하려면 여기로 드래그하세요." sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name}이(가) 비어 있습니다" + blankslate_description: "아직 계획된 항목이 없습니다. 항목을 추가하려면 여기로 드래그하세요." backlog_header_component: label_toggle_backlog: "%{name} 축소/확장" label_story_count: @@ -91,11 +91,11 @@ ko: one: "백로그의 %{count}개 스토리" other: "백로그의 %{count}개 스토리" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "%{name} 축소/확장" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "스프린트의 스토리 없음" + one: "스프린트의 %{count}개 스토리" + other: "스프린트의 %{count}개 스토리" backlog_menu_component: label_actions: "백로그 작업" action_menu: @@ -107,13 +107,13 @@ ko: wiki: "위키" properties: "속성" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "스프린트 작업" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "스프린트 편집" + new_story: "새로운 스토리" + stories_tasks: "스토리/작업" + task_board: "작업 보드" + burndown_chart: "번다운 차트" story_component: label_drag_story: "%{name} 이동" story_menu_component: @@ -141,10 +141,10 @@ ko: label_backlogs_unconfigured: "백로그를 아직 구성하지 않았습니다. %{administration} > %{plugins}(으)로 이동한 다음 이 플러그인의 %{configure} 링크를 클릭하세요. 필드를 설정한 후 이 페이지로 돌아가서 해당 도구 사용을 시작하세요." label_blocks_ids: "차단된 작업 패키지의 ID" label_column_in_backlog: "백로그의 열" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "백로그로 사용됨" label_points_burn_down: "아래" label_points_burn_up: "위" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "스프린트 편집" label_sprint_impediments: "스프린트 제한" label_sprint_new: "새로운 스프린트" label_task_board: "작업 보드" diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index e83f6ad6dbe..53a5179b879 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -88,8 +88,8 @@ pl: blankslate_title: "Element %{name} jest pusty" blankslate_description: "Nie zaplanowano jeszcze żadnych punktów. Przeciągnij punkty tutaj, aby je dodać." sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "Element %{name} jest pusty" + blankslate_description: "Nie zaplanowano jeszcze żadnych punktów. Przeciągnij punkty tutaj, aby je dodać." backlog_header_component: label_toggle_backlog: "Zwiń/rozwiń %{name}" label_story_count: @@ -97,11 +97,11 @@ pl: one: "%{count} historia w backlogu" other: "Liczba historii w backlogu: %{count}" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Zwiń/rozwiń %{name}" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "Brak historii w sprincie" + one: "%{count} historia w sprincie" + other: "Liczba historii w sprincie: %{count}" backlog_menu_component: label_actions: "Działania backlogu" action_menu: @@ -113,13 +113,13 @@ pl: wiki: "Wiki" properties: "Właściwości" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "Działania w ramach sprintu" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Edytuj sprint" + new_story: "Nowa historia" + stories_tasks: "Historie/zadania" + task_board: "Panel zadań" + burndown_chart: "Wykres spalania (burndown)" story_component: label_drag_story: "Przenieś %{name}" story_menu_component: @@ -147,10 +147,10 @@ pl: label_backlogs_unconfigured: "Jeszcze nie skonfigurowałeś backlogów. Przejdź do %{administration} > %{plugins}, następnie kliknij link %{configure} dla otrzymania tego dodatku. Po ustawieniu pól, wróć na tę stronę, aby zacząć korzystanie z narzędzia." label_blocks_ids: "Identyfikatory zablokowanych pakietów prac" label_column_in_backlog: "Kolumna w backlogu" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "Służy jako backlog" label_points_burn_down: "W dół" label_points_burn_up: "W górę" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "Edytuj sprint" label_sprint_impediments: "Przeszkody sprintu" label_sprint_new: "Nowy sprint" label_task_board: "Panel zadań" diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index 075fa92e5d9..2c509d53765 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -84,8 +84,8 @@ pt-BR: blankslate_title: "%{name} está vazio" blankslate_description: "Ainda não há itens planejados. Arraste os itens para este espaço para adicioná-los." sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} está vazio" + blankslate_description: "Ainda não há itens planejados. Arraste os itens para este espaço para adicioná-los." backlog_header_component: label_toggle_backlog: "Recolher/Expandir %{name}" label_story_count: @@ -93,11 +93,11 @@ pt-BR: one: "%{count} história no backlog" other: "%{count} histórias no backlog" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Recolher/Expandir %{name}" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "Nenhuma história na sprint" + one: "%{count} história na sprint" + other: "%{count} histórias na sprint" backlog_menu_component: label_actions: "Ações do backlog" action_menu: @@ -109,13 +109,13 @@ pt-BR: wiki: "Wiki" properties: "Propriedades" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "Ações da sprint" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Editar sprint" + new_story: "Nova história" + stories_tasks: "Histórias/tarefas" + task_board: "Quadro de tarefas" + burndown_chart: "Gráfico de burndown" story_component: label_drag_story: "Mover %{name}" story_menu_component: @@ -143,10 +143,10 @@ pt-BR: label_backlogs_unconfigured: "Você ainda não configurou o Backlog. Por favor, vá para %{administration} > %{plugins} e, em seguida, clique em %{configure} o link para este plugin. Uma vez que você definiu os campos, volte a esta página para começar a usar a ferramenta." label_blocks_ids: "IDs dos pacotes de trabalho bloqueados" label_column_in_backlog: "Coluna no backlog" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "Usado como backlog" label_points_burn_down: "Abaixo" label_points_burn_up: "Acima" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "Editar sprint" label_sprint_impediments: "Impedimentos da Sprint" label_sprint_new: "Nova sprint" label_task_board: "Quadro de tarefas" diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml index 404abc6e518..a6489bac640 100644 --- a/modules/backlogs/config/locales/crowdin/pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml @@ -84,8 +84,8 @@ pt-PT: blankslate_title: "%{name} está vazio" blankslate_description: "Ainda não existem elementos planeados. Arraste elementos para aqui para os adicionar." sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} está vazio" + blankslate_description: "Ainda não existem elementos planeados. Arraste elementos para aqui para os adicionar." backlog_header_component: label_toggle_backlog: "Recolher/expandir %{name}" label_story_count: @@ -93,11 +93,11 @@ pt-PT: one: "%{count} história no backlog" other: "%{count} histórias no backlog" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Recolher/expandir %{name}" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "Não há histórias no sprint" + one: "%{count} história em sprint" + other: "%{count} histórias em sprint" backlog_menu_component: label_actions: "Ações de backlog" action_menu: @@ -109,13 +109,13 @@ pt-PT: wiki: "Wiki" properties: "Propriedades" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "Ações do sprint" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Editar sprint" + new_story: "Nova história" + stories_tasks: "Histórias/tarefas" + task_board: "Quadro de tarefas" + burndown_chart: "Gráfico de burndown" story_component: label_drag_story: "Mover %{name}" story_menu_component: @@ -143,10 +143,10 @@ pt-PT: label_backlogs_unconfigured: "Ainda não configurou os backlogs. Vá a %{administration} > %{plugins}, e depois clique no link %{configure} para este plugin. Após definir os campos, volte a esta página para começar a utilizar a ferramenta." label_blocks_ids: "Identificações de pacotes de trabalho bloqueados" label_column_in_backlog: "Coluna no backlog" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "Utilizado como backlog" label_points_burn_down: "Abaixo" label_points_burn_up: "Acima" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "Editar sprint" label_sprint_impediments: "Impedimentos de Sprint" label_sprint_new: "Novo sprint" label_task_board: "Quadro de tarefas" diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml index 71f23f836d5..2962742c3c8 100644 --- a/modules/backlogs/config/locales/crowdin/uk.yml +++ b/modules/backlogs/config/locales/crowdin/uk.yml @@ -30,7 +30,7 @@ uk: finish_date: "Дата закінчення" goal: "Ціль спринту" name: "Ім’я спринту" - sharing: "Sharing" + sharing: "Надання доступу" sprint: duration: "Тривалість спринту" work_package: @@ -88,40 +88,40 @@ uk: blankslate_title: "%{name} нічого не містить" blankslate_description: "Ще нічого не заплановано. Перетягніть елементи сюди, щоб додати їх." sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} нічого не містить" + blankslate_description: "Ще нічого не заплановано. Перетягніть елементи сюди, щоб додати їх." backlog_header_component: label_toggle_backlog: "Згорнути/розгорнути %{name}" label_story_count: - zero: "Немає історій у беклозі" - one: "%{count} історія в беклозі" - other: "%{count} історії(-й) у беклозі" + zero: "У беклозі немає історій" + one: "У беклозі %{count} історія" + other: "У беклозі стільки історій: %{count}" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Згорнути/розгорнути %{name}" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "У спринті немає історій" + one: "У спринті %{count} історія" + other: "У спринті стільки історій: %{count}" backlog_menu_component: label_actions: "Дії беклогу" action_menu: edit_sprint: "Редагувати спринт" new_story: "Нова історія" - stories_tasks: "Історії/Завдання" + stories_tasks: "Історії/завдання" task_board: "Дошка завдань" burndown_chart: "Діаграма згорання завдань" wiki: "Wiki" properties: "Властивості" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "Дії спринту" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Редагувати спринт" + new_story: "Нова історія" + stories_tasks: "Історії/завдання" + task_board: "Дошка завдань" + burndown_chart: "Діаграма згорання завдань" story_component: - label_drag_story: "Перемістити %{name}" + label_drag_story: "Перемістити історію «%{name}»" story_menu_component: label_actions: "Дії історії" backlogs_points_burn_direction: "Бали спалюються вгору/вниз" @@ -147,10 +147,10 @@ uk: label_backlogs_unconfigured: "Ви ще не настроїли Backlogs. Перейдіть на %{administration}>%{plugins}, потім натисніть посилання %{configure} для цього плагіна. Після того, як ви встановите поля, поверніться на цю сторінку, щоб розпочати використання інструмента." label_blocks_ids: "Ідентифікатори заблокованих робочих пакетів" label_column_in_backlog: "Стовпець у backlog-у" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "Використовується як беклог" label_points_burn_down: "Вниз" label_points_burn_up: "Вгору" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "Редагувати спринт" label_sprint_impediments: "Перешкоди спринту" label_sprint_new: "Новий спринт" label_task_board: "Дошка завдань" diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index 2803dea6486..2c7f7f2d91f 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -82,8 +82,8 @@ zh-CN: blankslate_title: "%{name} 为空" blankslate_description: "尚未计划条目。请将条目拖到此处以添加。" sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} 为空" + blankslate_description: "尚未计划条目。请将条目拖到此处以添加。" backlog_header_component: label_toggle_backlog: "折叠/展开 %{name}" label_story_count: @@ -91,11 +91,11 @@ zh-CN: one: "积压工作中有 %{count} 个故事" other: "积压工作中有 %{count} 个故事" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "折叠/展开 %{name}" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "冲刺中没有故事" + one: "冲刺中有 %{count} 个故事" + other: "冲刺中有 %{count} 个故事" backlog_menu_component: label_actions: "积压工作操作" action_menu: @@ -107,13 +107,13 @@ zh-CN: wiki: "维基" properties: "属性" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "冲刺操作" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "编辑冲刺" + new_story: "新故事" + stories_tasks: "故事/任务" + task_board: "任务板" + burndown_chart: "燃尽图" story_component: label_drag_story: "移动 %{name}" story_menu_component: @@ -141,10 +141,10 @@ zh-CN: label_backlogs_unconfigured: "您尚未配置待办清单。请转到“%{administration} > %{plugins}”,然后单击此插件的 %{configure} 链接。设置字段后,返回到此页面开始使用工具。" label_blocks_ids: "被阻止的工作包 ID" label_column_in_backlog: "待办清单中的列" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "用作积压工作" label_points_burn_down: "减少" label_points_burn_up: "增加" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "编辑冲刺" label_sprint_impediments: "冲刺 (sprint) 障碍" label_sprint_new: "新冲刺" label_task_board: "任务板" diff --git a/modules/budgets/config/locales/crowdin/de.yml b/modules/budgets/config/locales/crowdin/de.yml index 38ada3019f6..62ebe818a40 100644 --- a/modules/budgets/config/locales/crowdin/de.yml +++ b/modules/budgets/config/locales/crowdin/de.yml @@ -79,22 +79,22 @@ de: heading: "Budgetdetails fehlen" description: "Fügen Sie Details zu Ihrem geplanten Budget hinzu, um die Daten hier zu sehen" count_caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget" - other: "Data aggregated from %{count} budgets" + zero: "Keine Budgetdaten." + one: "Daten aggregiert aus %{count} Budget" + other: "Daten aggregiert aus %{count} Budgets" count_caption_with_subitems: project: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this project and its subitems." - other: "Data aggregated from %{count} budgets included in this project and its subitems." + zero: "Keine Budgetdaten." + one: "Daten aggregiert aus %{count} Budget in diesem Projekt und seinen Unterelementen." + other: "Daten aggregiert aus %{count} Budgets in diesem Projekt und seinen Unterelementen." program: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this program and its subitems." - other: "Data aggregated from %{count} budgets included in this program and its subitems." + zero: "Keine Budgetdaten." + one: "Daten aggregiert aus %{count} Budget in diesem Programm und seinen Unterelementen." + other: "Daten aggregiert aus %{count} Budgets in diesem Programm und seinen Unterelementen." portfolio: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this portfolio and its subitems." - other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." + zero: "Keine Budgetdaten." + one: "Daten aggregiert aus %{count} Budget in diesem Portfolio und seinen Unterelementen." + other: "Daten aggregiert aus %{count} Budgets in diesem Portfolio und seinen Unterelementen." view_details: "Budgetdetails anzeigen" events: budget: "Budget bearbeitet" diff --git a/modules/budgets/config/locales/crowdin/es.yml b/modules/budgets/config/locales/crowdin/es.yml index 77651a0ad9b..00e1d202a10 100644 --- a/modules/budgets/config/locales/crowdin/es.yml +++ b/modules/budgets/config/locales/crowdin/es.yml @@ -1,125 +1,125 @@ ---- +#-- 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. +#++ es: plugin_budgets_engine: - name: Presupuestos + name: "Presupuestos" activerecord: attributes: budget: - author: Autor - available: Disponible - budget: Planeado - budget_ratio: Gastado (proporción) - description: Descripción - spent: Gastado - status: Estado - subject: Asunto - type: Tipo de costo - labor_budget: Costos laborales planeados - material_budget: Costos unitarios planeados - base_amount: Importe base + author: "Autor" + available: "Disponible" + budget: "Planeado" + budget_ratio: "Gastado (proporción)" + description: "Descripción" + spent: "Gastado" + status: "Estado" + subject: "Asunto" + type: "Tipo de costo" + labor_budget: "Costos laborales planeados" + material_budget: "Costos unitarios planeados" + base_amount: "Importe base" work_package: - budget_subject: Título de presupuesto + budget_subject: "Título de presupuesto" errors: models: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: no es miembro del proyecto presupuestario + not_a_member_of_budget_project: "no es miembro del proyecto presupuestario" models: - budget: Presupuesto - material_budget_item: Unidad + budget: "Presupuesto" + material_budget_item: "Unidad" activity: filter: - budget: Presupuestos + budget: "Presupuestos" attributes: - budget: Presupuesto - button_add_budget_item: Añadir los costos previstos - button_add_budget: Añadir presupuesto - button_add_cost_type: Agregar tipo de costo - button_cancel_edit_budget: Cancelar edicion de presupuesto - button_cancel_edit_costs: Cancelar edición de los costos - caption_labor: Mano de obra - caption_labor_costs: Costos laborales actuales - caption_material_costs: Costos unitarios actuales - budgets_title: Presupuestos + budget: "Presupuesto" + button_add_budget_item: "Añadir los costos previstos" + button_add_budget: "Añadir presupuesto" + button_add_cost_type: "Agregar tipo de costo" + button_cancel_edit_budget: "Cancelar edicion de presupuesto" + button_cancel_edit_costs: "Cancelar edición de los costos" + caption_labor: "Mano de obra" + caption_labor_costs: "Costos laborales actuales" + caption_material_costs: "Costos unitarios actuales" + budgets_title: "Presupuestos" budgets: widgets: budget_totals: - title: Total del presupuesto - remaining_budget: Presupuesto restante - spent_budget: Presupuesto gastado - total_actual_costs: Costes reales totales - total_planned_budget: Presupuesto total previsto + title: "Total del presupuesto" + remaining_budget: "Presupuesto restante" + spent_budget: "Presupuesto gastado" + total_actual_costs: "Costes reales totales" + total_planned_budget: "Presupuesto total previsto" budget_by_cost_type: - title: Presupuesto por tipo de coste + title: "Presupuesto por tipo de coste" blankslate: - heading: Comience a controlar su proyecto - description: Obtenga una visión general de los presupuestos y costes para - realizar un seguimiento eficaz del estado de su proyecto + heading: "Comience a controlar su proyecto" + description: "Obtenga una visión general de los presupuestos y costes para realizar un seguimiento eficaz del estado de su proyecto" blankslate_zero: - heading: Faltan detalles del presupuesto - description: Añada detalles sobre su presupuesto previsto para ver los datos - aquí - caption: - zero: No hay datos presupuestarios. - one: Datos recopilados de %{count} presupuesto incluido en este %{workspace}. - other: Datos recopilados de %{count} presupuestos incluidos en este %{workspace}. - caption_with_subitems: - zero: No hay datos presupuestarios. - one: Datos recopilados de %{count} presupuesto incluido en este %{workspace} - y sus subelementos. - other: Datos recopilados de %{count} presupuestos incluidos en este %{workspace} - y sus subelementos. - view_details: Ver los detalles del presupuesto + heading: "Faltan detalles del presupuesto" + description: "Añada detalles sobre su presupuesto previsto para ver los datos aquí" count_caption: - zero: No budget data. - one: Data aggregated from %{count} budget - other: Data aggregated from %{count} budgets + zero: "No hay datos presupuestarios." + one: "Datos recopilados de %{count} presupuesto" + other: "Datos recopilados de %{count} presupuestos" count_caption_with_subitems: project: - zero: No budget data. - one: Data aggregated from %{count} budget included in this project and - its subitems. - other: Data aggregated from %{count} budgets included in this project - and its subitems. + zero: "No hay datos presupuestarios." + one: "Datos recopilados de %{count} presupuesto incluido en este proyecto y sus subelementos." + other: "Datos recopilados de %{count} presupuestos incluidos en este proyecto y sus subelementos." program: - zero: No budget data. - one: Data aggregated from %{count} budget included in this program and - its subitems. - other: Data aggregated from %{count} budgets included in this program - and its subitems. + zero: "No hay datos presupuestarios." + one: "Datos recopilados de %{count} presupuesto incluido en este programa y sus subelementos." + other: "Datos recopilados de %{count} presupuestos incluidos en este programa y sus subelementos." portfolio: - zero: No budget data. - one: Data aggregated from %{count} budget included in this portfolio and - its subitems. - other: Data aggregated from %{count} budgets included in this portfolio - and its subitems. + zero: "No hay datos presupuestarios." + one: "Datos recopilados de %{count} presupuesto incluido en esta cartera y sus subelementos." + other: "Datos recopilados de %{count} presupuestos incluidos en esta cartera y sus subelementos." + view_details: "Ver los detalles del presupuesto" events: - budget: Presupuesto editado - help_click_to_edit: Haga clic aquí para editar. - help_currency_format: Formato de muestra de valores de divisas. %n se sustituye - por el valor de la moneda, %u es reemplazada por la unidad monetaria. - help_override_rate: Introduzca un valor para anular la morisidad. - label_budget: Presupuesto - label_budget_available: Presupuesto disponible - label_budget_id: 'Presupuesto #%{id}' - label_budget_new: Nuevo presupuesto - label_budget_planned: Presupuesto previsto - label_budget_plural: Presupuestos - label_budget_spent: Presupuesto gastado - label_budget_spent_ratio: Ratio de presupuesto gastado - label_deliverable: Presupuesto - label_example_placeholder: Por ejemplo, %{decimal} - label_view_all_budgets: Ver todos los presupuestos - label_yes: Sí - label_budget_totals: Totales - label_budget_details: Detalles de presupuesto - notice_budget_conflict: Los paquetes de trabajo deben ser del mismo proyecto. - notice_no_budgets_available: No hay presupuestos disponibles. - permission_edit_budgets: Editar presupuestos - permission_view_budgets: Ver los presupuestos - project_module_budgets: Presupuestos - text_budget_reassign_to: 'Reasígnelos al siguiente presupuesto:' - text_budget_delete: Eliminar el presupuesto de todos los paquetes de trabajo. - text_budget_destroy_assigned_wp: Hay %{count} paquetes de trabajo asignados a este - presupuesto. ¿Qué desea hacer? + budget: "Presupuesto editado" + help_click_to_edit: "Haga clic aquí para editar." + help_currency_format: "Formato de muestra de valores de divisas. %n se sustituye por el valor de la moneda, %u es reemplazada por la unidad monetaria." + help_override_rate: "Introduzca un valor para anular la morisidad." + label_budget: "Presupuesto" + label_budget_available: "Presupuesto disponible" + label_budget_id: "Presupuesto #%{id}" + label_budget_new: "Nuevo presupuesto" + label_budget_planned: "Presupuesto previsto" + label_budget_plural: "Presupuestos" + label_budget_spent: "Presupuesto gastado" + label_budget_spent_ratio: "Ratio de presupuesto gastado" + label_deliverable: "Presupuesto" + label_example_placeholder: "Por ejemplo, %{decimal}" + label_view_all_budgets: "Ver todos los presupuestos" + label_yes: "Sí" + label_budget_totals: "Totales" + label_budget_details: "Detalles de presupuesto" + notice_budget_conflict: "Los paquetes de trabajo deben ser del mismo proyecto." + notice_no_budgets_available: "No hay presupuestos disponibles." + permission_edit_budgets: "Editar presupuestos" + permission_view_budgets: "Ver los presupuestos" + project_module_budgets: "Presupuestos" + text_budget_reassign_to: "Reasígnelos al siguiente presupuesto:" + text_budget_delete: "Eliminar el presupuesto de todos los paquetes de trabajo." + text_budget_destroy_assigned_wp: "Hay %{count} paquetes de trabajo asignados a este presupuesto. ¿Qué desea hacer?" diff --git a/modules/budgets/config/locales/crowdin/fr.yml b/modules/budgets/config/locales/crowdin/fr.yml index f6b7c37a592..9b8eca74ec0 100644 --- a/modules/budgets/config/locales/crowdin/fr.yml +++ b/modules/budgets/config/locales/crowdin/fr.yml @@ -79,22 +79,22 @@ fr: heading: "Détails du budget manquant" description: "Ajoutez les détails de votre budget prévisionnel pour voir les données ici" count_caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget" - other: "Data aggregated from %{count} budgets" + zero: "Aucune donnée budgétaire." + one: "Données agrégées à partir de %{count} budget" + other: "Données agrégées à partir de %{count} budgets" count_caption_with_subitems: project: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this project and its subitems." - other: "Data aggregated from %{count} budgets included in this project and its subitems." + zero: "Aucune donnée budgétaire." + one: "Données agrégées à partir de %{count} budget inclus dans ce projet et ses sous-éléments." + other: "Données agrégées à partir de %{count} budgets inclus dans ce projet et leurs sous-éléments." program: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this program and its subitems." - other: "Data aggregated from %{count} budgets included in this program and its subitems." + zero: "Aucune donnée budgétaire." + one: "Données agrégées à partir de %{count} budget inclus dans ce programme et ses sous-éléments." + other: "Données agrégées à partir de %{count} budgets inclus dans ce programme et leurs sous-éléments." portfolio: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this portfolio and its subitems." - other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." + zero: "Aucune donnée budgétaire." + one: "Données agrégées à partir de %{count} budget inclus dans ce portefeuille et ses sous-éléments." + other: "Données agrégées à partir de %{count} budgets inclus dans ce portefeuille et leurs sous-éléments." view_details: "Voir les détails du budget" events: budget: "Budget modifié" diff --git a/modules/budgets/config/locales/crowdin/it.yml b/modules/budgets/config/locales/crowdin/it.yml index 7796579eb94..e3f96074590 100644 --- a/modules/budgets/config/locales/crowdin/it.yml +++ b/modules/budgets/config/locales/crowdin/it.yml @@ -79,22 +79,22 @@ it: heading: "Dettagli del budget mancanti" description: "Aggiungi dettagli sul tuo budget pianificato per visualizzare i dati qui" count_caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget" - other: "Data aggregated from %{count} budgets" + zero: "Nessun dato di budget." + one: "Dati aggregati da %{count} budget" + other: "Dati aggregati da %{count} budget" count_caption_with_subitems: project: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this project and its subitems." - other: "Data aggregated from %{count} budgets included in this project and its subitems." + zero: "Nessun dato di budget." + one: "Dati aggregati da %{count} budget incluso in questo progetto e nei suoi sottoelementi." + other: "Dati aggregati da %{count} budget inclusi in questo progetto e nei suoi sottoelementi." program: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this program and its subitems." - other: "Data aggregated from %{count} budgets included in this program and its subitems." + zero: "Nessun dato di budget." + one: "Dati aggregati da %{count} budget incluso in questo programma e nei suoi sottoelementi." + other: "Dati aggregati da %{count} budget inclusi in questo programma e nei suoi sottoelementi." portfolio: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this portfolio and its subitems." - other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." + zero: "Nessun dato di budget." + one: "Dati aggregati da %{count} budget incluso in questo portfolio e nei suoi sottoelementi." + other: "Dati aggregati da %{count} budget inclusi in questo portfolio e nei suoi sottoelementi." view_details: "Visualizza i dettagli del budget" events: budget: "Bilancio modificato" diff --git a/modules/budgets/config/locales/crowdin/ko.yml b/modules/budgets/config/locales/crowdin/ko.yml index 63600922c5a..c976e608f5d 100644 --- a/modules/budgets/config/locales/crowdin/ko.yml +++ b/modules/budgets/config/locales/crowdin/ko.yml @@ -1,24 +1,44 @@ ---- +#-- 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. +#++ ko: plugin_budgets_engine: - name: 예산 + name: "예산" activerecord: attributes: budget: - author: 작성자 - available: 사용 가능 - budget: 계획됨 - budget_ratio: 소비(비율) - description: 설명 - spent: 소비 - status: 상태 - subject: 제목 - type: 비용 유형 - labor_budget: 계획된 노동 비용 - material_budget: 계획된 단위 비용 - base_amount: 기본 금액 + author: "작성자" + available: "사용 가능" + budget: "계획됨" + budget_ratio: "소비(비율)" + description: "설명" + spent: "소비" + status: "상태" + subject: "제목" + type: "비용 유형" + labor_budget: "계획된 노동 비용" + material_budget: "계획된 단위 비용" + base_amount: "기본 금액" work_package: - budget_subject: 예산 제목 + budget_subject: "예산 제목" errors: models: labor_budget_item: @@ -26,92 +46,80 @@ ko: principal: not_a_member_of_budget_project: "- 예산 프로젝트의 멤버가 아닙니다" models: - budget: 예산 - material_budget_item: 단위 + budget: "예산" + material_budget_item: "단위" activity: filter: - budget: 예산 + budget: "예산" attributes: - budget: 예산 - button_add_budget_item: 계획된 비용 추가 - button_add_budget: 예산 추가 - button_add_cost_type: 비용 유형 추가 - button_cancel_edit_budget: 예산 편집 취소 - button_cancel_edit_costs: 비용 편집 취소 - caption_labor: 노동 - caption_labor_costs: 실제 노동 비용 - caption_material_costs: 실제 단위 비용 - budgets_title: 예산 + budget: "예산" + button_add_budget_item: "계획된 비용 추가" + button_add_budget: "예산 추가" + button_add_cost_type: "비용 유형 추가" + button_cancel_edit_budget: "예산 편집 취소" + button_cancel_edit_costs: "비용 편집 취소" + caption_labor: "노동" + caption_labor_costs: "실제 노동 비용" + caption_material_costs: "실제 단위 비용" + budgets_title: "예산" budgets: widgets: budget_totals: - title: 예산 합계 - remaining_budget: 남은 예산 - spent_budget: 소비된 예산 - total_actual_costs: 총 실제 비용 - total_planned_budget: 총 계획 예산 + title: "예산 합계" + remaining_budget: "남은 예산" + spent_budget: "소비된 예산" + total_actual_costs: "총 실제 비용" + total_planned_budget: "총 계획 예산" budget_by_cost_type: - title: 비용 유형별 예산 + title: "비용 유형별 예산" blankslate: - heading: 프로젝트 제어 시작 - description: 예산 및 비용에 대한 개요를 확인하여 효율적으로 프로젝트 상태를 추적합니다 + heading: "프로젝트 제어 시작" + description: "예산 및 비용에 대한 개요를 확인하여 효율적으로 프로젝트 상태를 추적합니다" blankslate_zero: - heading: 예산 세부 정보 누락 - description: 계획된 예산에 대한 세부 정보를 추가하여 여기에서 데이터를 확인합니다 - caption: - one: 이 %{workspace}에 포함된 %{count} 예산에서 집계된 데이터입니다. - other: 이 %{workspace}에 포함된 %{count} 예산에서 집계된 데이터입니다. - caption_with_subitems: - one: 이 %{workspace} 및 해당 하위 항목에 포함된 %{count} 예산에서 집계된 데이터입니다. - other: 이 %{workspace} 및 해당 하위 항목에 포함된 %{count} 예산에서 집계된 데이터입니다. - view_details: 예산 세부 정보 보기 + heading: "예산 세부 정보 누락" + description: "계획된 예산에 대한 세부 정보를 추가하여 여기에서 데이터를 확인합니다" count_caption: - zero: No budget data. - one: Data aggregated from %{count} budget - other: Data aggregated from %{count} budgets + zero: "예산 데이터가 없습니다." + one: "Data aggregated from %{count} budget" + other: "Data aggregated from %{count} budgets" count_caption_with_subitems: project: - zero: No budget data. - one: Data aggregated from %{count} budget included in this project and - its subitems. - other: Data aggregated from %{count} budgets included in this project - and its subitems. + zero: "No budget data." + one: "Data aggregated from %{count} budget included in this project and its subitems." + other: "Data aggregated from %{count} budgets included in this project and its subitems." program: - zero: No budget data. - one: Data aggregated from %{count} budget included in this program and - its subitems. - other: Data aggregated from %{count} budgets included in this program - and its subitems. + zero: "No budget data." + one: "Data aggregated from %{count} budget included in this program and its subitems." + other: "Data aggregated from %{count} budgets included in this program and its subitems." portfolio: - zero: No budget data. - one: Data aggregated from %{count} budget included in this portfolio and - its subitems. - other: Data aggregated from %{count} budgets included in this portfolio - and its subitems. + zero: "No budget data." + one: "Data aggregated from %{count} budget included in this portfolio and its subitems." + other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." + view_details: "예산 세부 정보 보기" events: - budget: 예산 편집됨 - help_click_to_edit: 편집하려면 여기를 클릭하세요. - help_currency_format: 표시된 통화 값의 형식입니다. %n은(는) 통화 값으로 바뀌고, %u은(는) 통화 단위로 바뀝니다. - help_override_rate: 기본 요금을 재정의하려면 여기에 값을 입력하세요. - label_budget: 예산 - label_budget_available: 사용 가능한 예산 - label_budget_id: '예산 #%{id}' - label_budget_new: 새 예산 - label_budget_planned: 계획된 예산 - label_budget_plural: 예산 - label_budget_spent: 소비된 예산 - label_budget_spent_ratio: 예산 소비율 - label_deliverable: 예산 - label_example_placeholder: '예: %{decimal}' - label_view_all_budgets: 모든 예산 보기 - label_yes: 예 - label_budget_totals: 합계 - label_budget_details: 예산 세부 정보 - notice_budget_conflict: 작업 패키지는 동일한 프로젝트에 속해야 합니다. - notice_no_budgets_available: 사용 가능한 예산이 없습니다. - permission_edit_budgets: 예산 편집 - permission_view_budgets: 예산 보기 - project_module_budgets: 예산 - text_budget_reassign_to: '이 예산에 해당 항목 다시 할당:' - text_budget_delete: 모든 작업 패키지에서 예산 삭제 - text_budget_destroy_assigned_wp: 이 예산에 할당된 %{count}개 작업 패키지가 있습니다. 어떤 작업을 수행하시겠습니까? + budget: "예산 편집됨" + help_click_to_edit: "편집하려면 여기를 클릭하세요." + help_currency_format: "표시된 통화 값의 형식입니다. %n은(는) 통화 값으로 바뀌고, %u은(는) 통화 단위로 바뀝니다." + help_override_rate: "기본 요금을 재정의하려면 여기에 값을 입력하세요." + label_budget: "예산" + label_budget_available: "사용 가능한 예산" + label_budget_id: "예산 #%{id}" + label_budget_new: "새 예산" + label_budget_planned: "계획된 예산" + label_budget_plural: "예산" + label_budget_spent: "소비된 예산" + label_budget_spent_ratio: "예산 소비율" + label_deliverable: "예산" + label_example_placeholder: "예: %{decimal}" + label_view_all_budgets: "모든 예산 보기" + label_yes: "예" + label_budget_totals: "합계" + label_budget_details: "예산 세부 정보" + notice_budget_conflict: "작업 패키지는 동일한 프로젝트에 속해야 합니다." + notice_no_budgets_available: "사용 가능한 예산이 없습니다." + permission_edit_budgets: "예산 편집" + permission_view_budgets: "예산 보기" + project_module_budgets: "예산" + text_budget_reassign_to: "이 예산에 해당 항목 다시 할당:" + text_budget_delete: "모든 작업 패키지에서 예산 삭제" + text_budget_destroy_assigned_wp: "이 예산에 할당된 %{count}개 작업 패키지가 있습니다. 어떤 작업을 수행하시겠습니까?" diff --git a/modules/budgets/config/locales/crowdin/pl.yml b/modules/budgets/config/locales/crowdin/pl.yml index 61b2442ce1e..21566e64c31 100644 --- a/modules/budgets/config/locales/crowdin/pl.yml +++ b/modules/budgets/config/locales/crowdin/pl.yml @@ -79,22 +79,22 @@ pl: heading: "Brak szczegółów budżetu" description: "Aby zobaczyć tutaj dane, dodaj szczegóły dotyczące planowanego budżetu" count_caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget" - other: "Data aggregated from %{count} budgets" + zero: "Brak danych budżetowych." + one: "Dane zagregowane z %{count} budżetu" + other: "Dane zagregowane z %{count} budżetów" count_caption_with_subitems: project: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this project and its subitems." - other: "Data aggregated from %{count} budgets included in this project and its subitems." + zero: "Brak danych budżetowych." + one: "Dane zagregowane z %{count} budżetu zawarte w tym projekcie i jego podpozycjach." + other: "Dane zagregowane z %{count} budżetów zawarte w tym projekcie i jego podpozycjach." program: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this program and its subitems." - other: "Data aggregated from %{count} budgets included in this program and its subitems." + zero: "Brak danych budżetowych." + one: "Dane zagregowane z %{count} budżetu zawarte w tym programie i jego podpozycjach." + other: "Dane zagregowane z %{count} budżetów zawarte w tym programie i jego podpozycjach." portfolio: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this portfolio and its subitems." - other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." + zero: "Brak danych budżetowych." + one: "Dane zagregowane z %{count} budżetu zawarte w tym portfolio i jego podpozycjach." + other: "Dane zagregowane z %{count} budżetów zawarte w tym portfolio i jego podpozycjach." view_details: "Wyświetl szczegóły budżetu" events: budget: "Budżet edytowany" diff --git a/modules/budgets/config/locales/crowdin/pt-BR.yml b/modules/budgets/config/locales/crowdin/pt-BR.yml index 447bca10e87..9a2757a146c 100644 --- a/modules/budgets/config/locales/crowdin/pt-BR.yml +++ b/modules/budgets/config/locales/crowdin/pt-BR.yml @@ -79,22 +79,22 @@ pt-BR: heading: "Detalhes de orçamento ausentes" description: "Adicione os detalhes do orçamento planejado para visualizar os dados aqui" count_caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget" - other: "Data aggregated from %{count} budgets" + zero: "Sem dados de orçamento." + one: "Dados agregados de %{count} orçamento" + other: "Dados agregados de %{count} orçamentos" count_caption_with_subitems: project: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this project and its subitems." - other: "Data aggregated from %{count} budgets included in this project and its subitems." + zero: "Sem dados de orçamento." + one: "Dados agregados de %{count} orçamento incluídos neste projeto e em seus subitens." + other: "Dados agregados de %{count} orçamentos incluídos neste projeto e em seus subitens." program: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this program and its subitems." - other: "Data aggregated from %{count} budgets included in this program and its subitems." + zero: "Sem dados de orçamento." + one: "Dados agregados de %{count} orçamento incluídos neste programa e em seus subitens." + other: "Dados agregados de %{count} orçamentos incluídos neste programa e em seus subitens." portfolio: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this portfolio and its subitems." - other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." + zero: "Sem dados de orçamento." + one: "Dados agregados de %{count} orçamento incluídos neste portfólio e em seus subitens." + other: "Dados agregados de %{count} orçamentos incluídos neste portfólio e em seus subitens." view_details: "Ver detalhes do orçamento" events: budget: "Orçamento editado" diff --git a/modules/budgets/config/locales/crowdin/pt-PT.yml b/modules/budgets/config/locales/crowdin/pt-PT.yml index c57d4e3c962..55a1bb473d6 100644 --- a/modules/budgets/config/locales/crowdin/pt-PT.yml +++ b/modules/budgets/config/locales/crowdin/pt-PT.yml @@ -79,22 +79,22 @@ pt-PT: heading: "Faltam dados orçamentais" description: "Adicione detalhes sobre o seu orçamento planeado para ver os dados aqui" count_caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget" - other: "Data aggregated from %{count} budgets" + zero: "Sem dados de orçamento." + one: "Dados agregados de %{count} orçamento" + other: "Dados agregados de %{count} orçamentos" count_caption_with_subitems: project: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this project and its subitems." - other: "Data aggregated from %{count} budgets included in this project and its subitems." + zero: "Sem dados de orçamento." + one: "Dados agregados a partir de %{count} orçamento incluído neste projeto e seus sub-elementos." + other: "Dados agregados a partir de %{count} orçamentos incluído neste projeto e seus sub-elementos." program: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this program and its subitems." - other: "Data aggregated from %{count} budgets included in this program and its subitems." + zero: "Sem dados de orçamento." + one: "Dados agregados a partir de %{count} orçamento incluído neste programa e seus sub-elementos." + other: "Dados agregados a partir de %{count} orçamentos incluídos neste programa e seus sub-elementos." portfolio: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this portfolio and its subitems." - other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." + zero: "Sem dados de orçamento." + one: "Dados agregados a partir de %{count} orçamento incluído nesta carteira e seus sub-elementos." + other: "Dados agregados a partir de %{count} orçamentos incluídos nesta carteira e seus sub-elementos." view_details: "Ver detalhes do orçamento" events: budget: "Orçamento editado" diff --git a/modules/budgets/config/locales/crowdin/uk.yml b/modules/budgets/config/locales/crowdin/uk.yml index 15fe88d6bd1..549a9939101 100644 --- a/modules/budgets/config/locales/crowdin/uk.yml +++ b/modules/budgets/config/locales/crowdin/uk.yml @@ -1,117 +1,125 @@ ---- +#-- 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. +#++ uk: plugin_budgets_engine: - name: Бюджети + name: "Бюджети" activerecord: attributes: budget: - author: Автор - available: Доступно - budget: Заплановано - budget_ratio: Витрачено (співвідношення) - description: Опис - spent: Витрачено - status: Статус - subject: Тема - type: Тип вартості - labor_budget: Планові витрати на працю - material_budget: Планові витрати на одиницю продукції - base_amount: Базова сума + author: "Автор" + available: "Доступно" + budget: "Заплановано" + budget_ratio: "Витрачено (співвідношення)" + description: "Опис" + spent: "Витрачено" + status: "Статус" + subject: "Тема" + type: "Тип вартості" + labor_budget: "Планові витрати на працю" + material_budget: "Планові витрати на одиницю продукції" + base_amount: "Базова сума" work_package: - budget_subject: Назва бюджету + budget_subject: "Назва бюджету" errors: models: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: is not a member of the budget's project + not_a_member_of_budget_project: "не є учасником проєкту бюджету" models: - budget: Бюджет - material_budget_item: Одиниця + budget: "Бюджет" + material_budget_item: "Одиниця" activity: filter: - budget: Бюджети + budget: "Бюджети" attributes: - budget: Бюджет - button_add_budget_item: Додайте планові витрати - button_add_budget: Додати бюджет - button_add_cost_type: Додати тип витрат - button_cancel_edit_budget: Скасувати редагування бюджету - button_cancel_edit_costs: 'Скасування редагування витрат ' - caption_labor: Праця - caption_labor_costs: Фактичні витрати на оплату праці - caption_material_costs: Фактичні витрати на одиницю - budgets_title: Бюджети + budget: "Бюджет" + button_add_budget_item: "Додайте планові витрати" + button_add_budget: "Додати бюджет" + button_add_cost_type: "Додати тип витрат" + button_cancel_edit_budget: "Скасувати редагування бюджету" + button_cancel_edit_costs: "Скасування редагування витрат " + caption_labor: "Праця" + caption_labor_costs: "Фактичні витрати на оплату праці" + caption_material_costs: "Фактичні витрати на одиницю" + budgets_title: "Бюджети" budgets: widgets: budget_totals: - title: Загальні суми бюджету - remaining_budget: Залишок бюджету - spent_budget: Витрачений бюджет - total_actual_costs: Загальна сума фактичних витрат - total_planned_budget: Загальна сума запланованого бюджету + title: "Загальні суми бюджету" + remaining_budget: "Залишок бюджету" + spent_budget: "Витрачений бюджет" + total_actual_costs: "Загальна сума фактичних витрат" + total_planned_budget: "Загальна сума запланованого бюджету" budget_by_cost_type: - title: Бюджет за типом витрат + title: "Бюджет за типом витрат" blankslate: - heading: Почніть контролювати роботу над проєктом - description: Переглядайте свої бюджети й витрати, щоб ефективно відстежувати - стан проєкту + heading: "Почніть контролювати роботу над проєктом" + description: "Переглядайте свої бюджети й витрати, щоб ефективно відстежувати стан проєкту" blankslate_zero: - heading: Немає інформації про бюджет - description: Додайте інформацію про запланований бюджет, щоб побачити дані - тут - caption: - zero: Немає даних про бюджет. - view_details: Переглянути інформацію про бюджет + heading: "Немає інформації про бюджет" + description: "Додайте інформацію про запланований бюджет, щоб побачити дані тут" count_caption: - zero: No budget data. - one: Data aggregated from %{count} budget - other: Data aggregated from %{count} budgets + zero: "Немає даних про бюджет." + one: "Дані, агреговані з %{count} бюджету" + other: "Дані, агреговані з %{count} бюджетів" count_caption_with_subitems: project: - zero: No budget data. - one: Data aggregated from %{count} budget included in this project and - its subitems. - other: Data aggregated from %{count} budgets included in this project - and its subitems. + zero: "Немає даних про бюджет." + one: "Дані, агреговані з %{count} бюджету, включено в цей проєкт і його піделементи." + other: "Дані, агреговані з %{count} бюджетів, включено в цей проєкт і його піделементи." program: - zero: No budget data. - one: Data aggregated from %{count} budget included in this program and - its subitems. - other: Data aggregated from %{count} budgets included in this program - and its subitems. + zero: "Немає даних про бюджет." + one: "Дані, агреговані з %{count} бюджету, включено в цю програму і її піделементи." + other: "Дані, агреговані з %{count} бюджетів, включено в цю програму і її піделементи." portfolio: - zero: No budget data. - one: Data aggregated from %{count} budget included in this portfolio and - its subitems. - other: Data aggregated from %{count} budgets included in this portfolio - and its subitems. + zero: "Немає даних про бюджет." + one: "Дані, агреговані з %{count} бюджету, включено в цей портфель і його піделементи." + other: "Дані, агреговані з %{count} бюджетів, включено в цей портфель і його піделементи." + view_details: "Переглянути інформацію про бюджет" events: - budget: Бюджет відредаговано - help_click_to_edit: Натисніть тут, щоб редагувати. - help_currency_format: Формат відображених валютних значень. %n замінюється на вартість - валюти, %u це замінюється грошовою одиницею. - help_override_rate: Введіть тут значення, щоб змінити стандартну швидкість. - label_budget: Бюджет - label_budget_available: Доступний бюджет - label_budget_id: 'Бюджет #%{id}' - label_budget_new: Новий бюджет - label_budget_planned: Запланований бюджет - label_budget_plural: Бюджети - label_budget_spent: Витрачений бюджет - label_budget_spent_ratio: Коефіцієнт використання бюджету - label_deliverable: Бюджет - label_example_placeholder: наприклад, %{decimal} - label_view_all_budgets: Переглянути всі бюджети - label_yes: Так - label_budget_totals: Загальні суми - label_budget_details: Деталі бюджету - notice_budget_conflict: Робочі задачі повинні бути з одного проекту. - notice_no_budgets_available: Немає доступних бюджетів. - permission_edit_budgets: Редагувати бюджети - permission_view_budgets: Переглянути бюджети - project_module_budgets: Бюджети - text_budget_reassign_to: 'Перепризначити їх для цього бюджету:' - text_budget_delete: Видалити цей бюджет з усіх пакетів робіт - text_budget_destroy_assigned_wp: Цьому бюджету призначено кілька (%{count}) пакетів - робіт. Що потрібно зробити? + budget: "Бюджет відредаговано" + help_click_to_edit: "Натисніть тут, щоб редагувати." + help_currency_format: "Формат відображених валютних значень. %n замінюється на вартість валюти, %u це замінюється грошовою одиницею." + help_override_rate: "Введіть тут значення, щоб змінити стандартну швидкість." + label_budget: "Бюджет" + label_budget_available: "Доступний бюджет" + label_budget_id: "Бюджет #%{id}" + label_budget_new: "Новий бюджет" + label_budget_planned: "Запланований бюджет" + label_budget_plural: "Бюджети" + label_budget_spent: "Витрачений бюджет" + label_budget_spent_ratio: "Коефіцієнт використання бюджету" + label_deliverable: "Бюджет" + label_example_placeholder: "наприклад, %{decimal}" + label_view_all_budgets: "Переглянути всі бюджети" + label_yes: "Так" + label_budget_totals: "Загальні суми" + label_budget_details: "Деталі бюджету" + notice_budget_conflict: "Робочі задачі повинні бути з одного проекту." + notice_no_budgets_available: "Немає доступних бюджетів." + permission_edit_budgets: "Редагувати бюджети" + permission_view_budgets: "Переглянути бюджети" + project_module_budgets: "Бюджети" + text_budget_reassign_to: "Перепризначити їх для цього бюджету:" + text_budget_delete: "Видалити цей бюджет з усіх пакетів робіт" + text_budget_destroy_assigned_wp: "Цьому бюджету призначено кілька (%{count}) пакетів робіт. Що потрібно зробити?" diff --git a/modules/budgets/config/locales/crowdin/zh-CN.yml b/modules/budgets/config/locales/crowdin/zh-CN.yml index 49f988833b0..56aa90e4ee8 100644 --- a/modules/budgets/config/locales/crowdin/zh-CN.yml +++ b/modules/budgets/config/locales/crowdin/zh-CN.yml @@ -79,22 +79,22 @@ zh-CN: heading: "预算详细信息缺失" description: "添加计划预算的详细信息,以便在此处查看数据" count_caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget" - other: "Data aggregated from %{count} budgets" + zero: "无预算数据。" + one: "从 %{count} 个预算中汇总的数据" + other: "从 %{count} 个预算中汇总的数据" count_caption_with_subitems: project: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this project and its subitems." - other: "Data aggregated from %{count} budgets included in this project and its subitems." + zero: "无预算数据。" + one: "从包含在此项目及其子条目中的 %{count} 个预算中汇总的数据。" + other: "从包含在此项目及其子条目中的 %{count} 个预算中汇总的数据。" program: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this program and its subitems." - other: "Data aggregated from %{count} budgets included in this program and its subitems." + zero: "无预算数据。" + one: "从包含在此计划及其子条目中的 %{count} 个预算中汇总的数据。" + other: "从包含在此计划及其子条目中的 %{count} 个预算中汇总的数据。" portfolio: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this portfolio and its subitems." - other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." + zero: "无预算数据。" + one: "从包含在此项目组合及其子条目中的 %{count} 个预算中汇总的数据。" + other: "从包含在此项目组合及其子条目中的 %{count} 个预算中汇总的数据。" view_details: "查看预算详细信息" events: budget: "预算已编辑" diff --git a/modules/costs/config/locales/crowdin/uk.yml b/modules/costs/config/locales/crowdin/uk.yml index c5d2252eb4b..d0ca340d910 100644 --- a/modules/costs/config/locales/crowdin/uk.yml +++ b/modules/costs/config/locales/crowdin/uk.yml @@ -245,7 +245,7 @@ uk: heading: "Почніть відстежувати час і витрати" description: "Переглядайте свої витрати й зафіксований час, щоб контролювати прогрес роботи над проєктом. Переконайтеся, що пакети робіт зв’язано з відповідним бюджетом." action: "Записати час" - view_details: "Переглянути дані пор фактичні витрати" + view_details: "Переглянути дані про фактичні витрати" ee: features: time_entry_time_restrictions: Вимагати точного відстеження часу diff --git a/modules/grids/config/locales/crowdin/js-uk.yml b/modules/grids/config/locales/crowdin/js-uk.yml index b6202130ec1..f6c74579d13 100644 --- a/modules/grids/config/locales/crowdin/js-uk.yml +++ b/modules/grids/config/locales/crowdin/js-uk.yml @@ -2,12 +2,12 @@ uk: js: grid: add_widget: 'Додати віджет' - widget_menu_label: 'Show menu options for %{widgetName} widget' + widget_menu_label: 'Показати пункти меню для віджета «%{widgetName}»' remove: 'Видалити віджет' configure: 'Налаштувати віджет' widgets: missing_permission: "У вас немає дозволів для перегляду цього віджета." - not_available: "This widget is currently unavailable." + not_available: "Цей віджет зараз недоступний." custom_text: title: 'Текстовий блок' documents: diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index 6cbfe32cbe9..07885eac197 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -42,7 +42,7 @@ de: start_date: "Datum" start_time: "Startzeit" start_time_hour: "Startzeit" - sharing: "Sharing" + sharing: "Teilen" meeting_agenda_item: title: "Titel" author: "Autor" @@ -196,7 +196,7 @@ de: label_start_date: "Beginn" label_subscribe_icalendar: "Im Kalender abonnieren" caption_meeting_template_select: "Wählen Sie eine Vorlage, um deren Tagesordnungspunkte automatisch zu kopieren" - caption_template_project_select: "Please select the project in which to create this meeting template" + caption_template_project_select: "Bitte wählen Sie das Projekt aus, in dem Sie diese Besprechungsvorlage erstellen möchten" meeting: participants: label: @@ -615,16 +615,16 @@ de: text_meeting_draft_banner: "Dieses Meeting ist derzeit ein Entwurf. Diese Besprechung sendet keine Kalenderaktualisierungen oder Einladungen, selbst wenn Sie Besprechungsdetails ändern oder Teilnehmer hinzufügen/entfernen." text_onetime_meeting_template_banner: "Sie bearbeiten gerade eine Meeting-Vorlage. Sie können diese Vorlage verwenden, um einmalige Besprechungen mit einer vordefinierten Tagesordnung zu erstellen. Änderungen wirken sich nicht auf bereits erstellte Meetings aus." text_onetime_meeting_template_empty_heading: "Die Vorlage für Besprechungen ist leer" - text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." + text_onetime_meeting_template_empty_description: "Fügen Sie hier Tagesordnungspunkte, Abschnitte und Anhänge hinzu. Sie werden in jede mit dieser Vorlage erstellte Besprechung aufgenommen." text_exit_draft_mode_dialog_title: "Diese Besprechung öffnen und Einladungen verschicken?" text_exit_draft_mode_dialog_subtitle: "Sie können nicht mehr zum Entwurfsmodus zurückkehren, sobald Sie die Besprechung eröffnen." text_exit_draft_mode_dialog_template_title: "Das erste Vorkommen dieser Terminserie öffnen?" text_exit_draft_mode_dialog_template_subtitle: "Sie können danach nicht mehr in den Entwurfsmodus zurückkehren." - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "Teilen" + label_meeting_template_sharing_none: "Nur dieses Projekt" + label_meeting_template_sharing_descendants: "Unterprojekte" + label_meeting_template_sharing_system: "Alle Projekte" + text_meeting_template_sharing_description: "Diese Vorlage kann mit Unterprojekten oder anderen Projekten geteilt werden. Es werden nur die Tagesordnungspunkte und Anhänge kopiert." text_meeting_not_editable_anymore: "Diese Besprechung ist nicht mehr bearbeitbar." text_meeting_not_present_anymore: "Dieses Meeting wurde gelöscht. Bitte wählen Sie eine andere Besprechung." label_add_work_package_to_meeting_dialog_title: "Besprechung auswählen" diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml index e849d11ed24..ef209914168 100644 --- a/modules/meeting/config/locales/crowdin/es.yml +++ b/modules/meeting/config/locales/crowdin/es.yml @@ -42,7 +42,7 @@ es: start_date: "Fecha" start_time: "Hora de inicio" start_time_hour: "Hora de inicio" - sharing: "Sharing" + sharing: "Compartiendo" meeting_agenda_item: title: "Título" author: "Autor" @@ -620,11 +620,11 @@ es: text_exit_draft_mode_dialog_subtitle: "Una vez programada una reunión, no puedes volver al modo Borrador." text_exit_draft_mode_dialog_template_title: "¿Abrir la primera repetición de esta serie de reuniones?" text_exit_draft_mode_dialog_template_subtitle: "No podrás volver al modo Borrador después de esto." - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "Compartiendo" + label_meeting_template_sharing_none: "Solo este proyecto" + label_meeting_template_sharing_descendants: "Subproyectos" + label_meeting_template_sharing_system: "Todos los proyectos" + text_meeting_template_sharing_description: "Esta plantilla se puede compartir con subproyectos u otros proyectos en esta instancia. Solo se copiarán los elementos del orden del día y los archivos adjuntos." text_meeting_not_editable_anymore: "Esta reunión ya no es editable." text_meeting_not_present_anymore: "Esta reunión ha sido eliminada. Por favor, seleccione otra reunión." label_add_work_package_to_meeting_dialog_title: "Seleccionar reunión" diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index dda0dd01e95..9cadf531930 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -42,7 +42,7 @@ fr: start_date: "Date" start_time: "Heure de début" start_time_hour: "Heure de début" - sharing: "Sharing" + sharing: "Partage" meeting_agenda_item: title: "Titre" author: "Auteur" @@ -620,11 +620,11 @@ fr: text_exit_draft_mode_dialog_subtitle: "Vous ne pouvez pas revenir au mode brouillon une fois que vous avez planifié une réunion." text_exit_draft_mode_dialog_template_title: "Ouvrez la première occurrence de cette série de réunions ?" text_exit_draft_mode_dialog_template_subtitle: "Vous ne pouvez plus revenir au mode brouillon après cette opération." - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "Partage" + label_meeting_template_sharing_none: "Seulement ce projet" + label_meeting_template_sharing_descendants: "Sous-projets" + label_meeting_template_sharing_system: "Tous les projets" + text_meeting_template_sharing_description: "Ce modèle peut être partagé avec des sous-projets ou d'autres projets dans cette instance. Seuls les points de l'ordre du jour et les pièces jointes seront copiés." text_meeting_not_editable_anymore: "Cette réunion n'est plus modifiable." text_meeting_not_present_anymore: "Cette réunion a été supprimée. Veuillez sélectionner une autre réunion." label_add_work_package_to_meeting_dialog_title: "Sélectionner la réunion" diff --git a/modules/meeting/config/locales/crowdin/it.yml b/modules/meeting/config/locales/crowdin/it.yml index a81edfb261e..e4924337105 100644 --- a/modules/meeting/config/locales/crowdin/it.yml +++ b/modules/meeting/config/locales/crowdin/it.yml @@ -42,7 +42,7 @@ it: start_date: "Data" start_time: "Ora di inizio" start_time_hour: "Ora di inizio" - sharing: "Sharing" + sharing: "Condivisione" meeting_agenda_item: title: "Titolo" author: "Autore" @@ -620,11 +620,11 @@ it: text_exit_draft_mode_dialog_subtitle: "Non può tornare alla modalità bozza una volta programmata una riunione." text_exit_draft_mode_dialog_template_title: "Aprire la prima occorrenza di questa serie di riunioni?" text_exit_draft_mode_dialog_template_subtitle: "Non puoi tornare alla modalità bozza dopo averlo fatto." - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "Condivisione" + label_meeting_template_sharing_none: "Solo questo progetto" + label_meeting_template_sharing_descendants: "Sottoprogetti" + label_meeting_template_sharing_system: "Tutti i progetti" + text_meeting_template_sharing_description: "In questa istanza, questo modello può essere condiviso con sottoprogetti o altri progetti. Verranno copiati solo gli elementi dell'ordine del giorno e gli allegati." text_meeting_not_editable_anymore: "Questa riunione non è più modificabile." text_meeting_not_present_anymore: "Questa riunione è stata eliminata. Seleziona un'altra riunione." label_add_work_package_to_meeting_dialog_title: "Seleziona riunione" diff --git a/modules/meeting/config/locales/crowdin/ko.yml b/modules/meeting/config/locales/crowdin/ko.yml index fed6553910d..7947e73fa96 100644 --- a/modules/meeting/config/locales/crowdin/ko.yml +++ b/modules/meeting/config/locales/crowdin/ko.yml @@ -41,7 +41,7 @@ ko: start_date: "날짜" start_time: "시작 시간" start_time_hour: "시작 시간" - sharing: "Sharing" + sharing: "공유" meeting_agenda_item: title: "제목" author: "작성자" @@ -613,11 +613,11 @@ ko: text_exit_draft_mode_dialog_subtitle: "미팅을 예약한 후에는 초안 모드로 돌아갈 수 없습니다." text_exit_draft_mode_dialog_template_title: "이 미팅 시리즈의 첫 번째 항목을 열어보시겠습니까?" text_exit_draft_mode_dialog_template_subtitle: "이후에는 초안 모드로 돌아갈 수 없습니다." - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "공유" + label_meeting_template_sharing_none: "이 프로젝트만" + label_meeting_template_sharing_descendants: "하위 프로젝트" + label_meeting_template_sharing_system: "모든 프로젝트" + text_meeting_template_sharing_description: "이 템플릿은 해당 인스턴스의 하위 프로젝트 또는 다른 프로젝트와 공유할 수 있습니다. 의제 항목과 첨부 파일만 복사됩니다." text_meeting_not_editable_anymore: "이 미팅은 더 이상 편집할 수 없습니다." text_meeting_not_present_anymore: "이 미팅은 삭제되었습니다. 다른 미팅을 선택해 주세요." label_add_work_package_to_meeting_dialog_title: "미팅 선택" diff --git a/modules/meeting/config/locales/crowdin/pl.yml b/modules/meeting/config/locales/crowdin/pl.yml index 1c049d86032..51b2328c18b 100644 --- a/modules/meeting/config/locales/crowdin/pl.yml +++ b/modules/meeting/config/locales/crowdin/pl.yml @@ -44,7 +44,7 @@ pl: start_date: "Data" start_time: "Data rozpoczęcia" start_time_hour: "Godzina rozpoczęcia" - sharing: "Sharing" + sharing: "Udostępnianie" meeting_agenda_item: title: "Tytuł" author: "Autor" @@ -206,7 +206,7 @@ pl: label_start_date: "Data rozpoczęcia" label_subscribe_icalendar: "Subskrybuj kalendarz" caption_meeting_template_select: "Wybierz szablon, aby automatycznie skopiować z niego punkty planu spotkania" - caption_template_project_select: "Please select the project in which to create this meeting template" + caption_template_project_select: "Wybierz projekt, w którym ma zostać utworzony ten szablon spotkania" meeting: participants: label: @@ -629,16 +629,16 @@ pl: text_meeting_draft_banner: "Jesteś teraz w trybie wersji roboczej. To spotkanie nie wyśle żadnych aktualizacji kalendarza ani zaproszeń, nawet jeśli zmienisz szczegóły spotkania lub dodasz/usuniesz uczestników." text_onetime_meeting_template_banner: "Obecnie edytujesz szablon spotkania. Możesz użyć tego szablonu do tworzenia jednorazowych spotkań z predefiniowanym planem spotkania. Zmiany nie będą miały wpływu na już utworzone spotkania." text_onetime_meeting_template_empty_heading: "Ten szablon spotkania jest pusty" - text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." + text_onetime_meeting_template_empty_description: "Dodaj punkty planu spotkania, sekcje i załączniki tutaj. Będą one dołączane do każdego spotkania utworzonego przy użyciu tego szablonu." text_exit_draft_mode_dialog_title: "Otworzyć to spotkanie i wysłać zaproszenia?" text_exit_draft_mode_dialog_subtitle: "Po zaplanowaniu spotkania nie można powrócić do trybu wersji roboczej." text_exit_draft_mode_dialog_template_title: "Otworzyć pierwsze wystąpienie z tej serii spotkań?" text_exit_draft_mode_dialog_template_subtitle: "Po tym nie możesz powrócić do trybu wersji roboczej." - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "Udostępnianie" + label_meeting_template_sharing_none: "Tylko ten projekt" + label_meeting_template_sharing_descendants: "Podprojekty" + label_meeting_template_sharing_system: "Wszystkie projekty" + text_meeting_template_sharing_description: "Ten szablon można udostępniać podprojektom lub innym projektom w tym wystąpieniu. Skopiowane zostaną tylko pozycje planu spotkania i załączniki." text_meeting_not_editable_anymore: "Tego spotkania nie można już edytować." text_meeting_not_present_anymore: "To spotkanie zostało usunięte. Wybierz inne spotkanie." label_add_work_package_to_meeting_dialog_title: "Wybierz spotkanie" diff --git a/modules/meeting/config/locales/crowdin/pt-BR.yml b/modules/meeting/config/locales/crowdin/pt-BR.yml index edae21ab20f..c05aaf5793b 100644 --- a/modules/meeting/config/locales/crowdin/pt-BR.yml +++ b/modules/meeting/config/locales/crowdin/pt-BR.yml @@ -42,7 +42,7 @@ pt-BR: start_date: "Data" start_time: "Hora de início" start_time_hour: "Hora de início" - sharing: "Sharing" + sharing: "Compartilhamento" meeting_agenda_item: title: "Título" author: "Autor" @@ -620,11 +620,11 @@ pt-BR: text_exit_draft_mode_dialog_subtitle: "Não é possível voltar ao modo rascunho depois de agendar uma reunião." text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?" text_exit_draft_mode_dialog_template_subtitle: "Você não pode retornar ao modo rascunho após isto." - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "Compartilhamento" + label_meeting_template_sharing_none: "Apenas neste projeto" + label_meeting_template_sharing_descendants: "Subprojetos" + label_meeting_template_sharing_system: "Todos os projetos" + text_meeting_template_sharing_description: "Este modelo pode ser compartilhado com subprojetos ou outros projetos nesta instância. Apenas os itens de pauta e os anexos serão copiados." text_meeting_not_editable_anymore: "A reunião não pode mais ser editada." text_meeting_not_present_anymore: "Esta reunião foi excluída. Selecione outra reunião." label_add_work_package_to_meeting_dialog_title: "Selecionar reunião" diff --git a/modules/meeting/config/locales/crowdin/pt-PT.yml b/modules/meeting/config/locales/crowdin/pt-PT.yml index 194ff4d8fcd..836e2118bdc 100644 --- a/modules/meeting/config/locales/crowdin/pt-PT.yml +++ b/modules/meeting/config/locales/crowdin/pt-PT.yml @@ -42,7 +42,7 @@ pt-PT: start_date: "Data" start_time: "Hora de início" start_time_hour: "Hora de início" - sharing: "Sharing" + sharing: "Partilhar" meeting_agenda_item: title: "Título" author: "Autor" @@ -196,7 +196,7 @@ pt-PT: label_start_date: "Data de início" label_subscribe_icalendar: "Subscrever o calendário" caption_meeting_template_select: "Selecione um modelo para copiar automaticamente os seus pontos da agenda" - caption_template_project_select: "Please select the project in which to create this meeting template" + caption_template_project_select: "Selecione o projeto em que quer criar este modelo de reunião" meeting: participants: label: @@ -615,16 +615,16 @@ pt-PT: text_meeting_draft_banner: "Está no modo de rascunho. Esta reunião não enviará atualizações de calendário ou convites, mesmo que altere os detalhes da reunião ou adicione/remova participantes." text_onetime_meeting_template_banner: "Está a editar um modelo de reunião. Pode utilizar este modelo para criar reuniões únicas com uma agenda predefinida. As alterações não afetarão as reuniões já criadas." text_onetime_meeting_template_empty_heading: "Este modelo de reunião está vazio" - text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." + text_onetime_meeting_template_empty_description: "Adicione elementos da agenda, secções e anexos aqui. Serão incluídos em todas as reuniões criadas com este modelo." text_exit_draft_mode_dialog_title: "Abrir esta reunião e enviar convites?" text_exit_draft_mode_dialog_subtitle: "Não pode regressar ao modo de rascunho após agendar uma reunião." text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?" text_exit_draft_mode_dialog_template_subtitle: "Depois disso, não pode voltar ao modo de rascunho." - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "Partilhar" + label_meeting_template_sharing_none: "Apenas este projeto" + label_meeting_template_sharing_descendants: "Sub-projetos" + label_meeting_template_sharing_system: "Todos os projetos" + text_meeting_template_sharing_description: "Este modelo pode ser partilhado com sub-projetos ou outros projetos nesta instância. Só os elementos da agenda e os anexos serão copiados." text_meeting_not_editable_anymore: "Esta reunião não é mais editável." text_meeting_not_present_anymore: "Esta reunião foi excluída. Por favor, selecione outra reunião." label_add_work_package_to_meeting_dialog_title: "Selecionar reunião" diff --git a/modules/meeting/config/locales/crowdin/uk.yml b/modules/meeting/config/locales/crowdin/uk.yml index 1f113933574..de0bf19f6ae 100644 --- a/modules/meeting/config/locales/crowdin/uk.yml +++ b/modules/meeting/config/locales/crowdin/uk.yml @@ -44,7 +44,7 @@ uk: start_date: "Дата" start_time: "Час початку" start_time_hour: "Час початку" - sharing: "Sharing" + sharing: "Надання доступу" meeting_agenda_item: title: "Назва " author: "Автор" @@ -63,7 +63,7 @@ uk: end_date: "Дата завершення" iterations: "Повторення" recurring_meeting_interim_response: - start_time: "Start time" + start_time: "Час початку" meeting_participant: invited: "Запрошені" attended: "Відвідано" @@ -76,7 +76,7 @@ uk: section_not_belong_to_meeting: "Розділ не належить до тієї самої наради." user_invalid: "не є дійсним учасником." recurring_meeting_interim_response: - not_an_occurrence: "is not a valid occurrence time for this recurring meeting" + not_an_occurrence: "не є дійсним часом проведення цієї повторюваної наради" recurring_meeting: must_cover_existing_meetings: one: "Одна відкрита нарада в серії не входить у новий розклад. Налаштуйте розклад так, щоб він охоплював усі наявні наради." @@ -205,8 +205,8 @@ uk: label_time_zone: "Часовий пояс" label_start_date: "Дата початку" label_subscribe_icalendar: "Підписатися на календар" - caption_meeting_template_select: "Виберіть шаблон, щоб автоматично скопіювати пункти порядку денного" - caption_template_project_select: "Please select the project in which to create this meeting template" + caption_meeting_template_select: "Виберіть шаблон, щоб автоматично скопіювати з нього пункти порядку денного" + caption_template_project_select: "Виберіть проєкт, у якому ви хочете створити цей шаблон наради" meeting: participants: label: @@ -258,9 +258,9 @@ uk: header: "Скасовано: нарада «%{title}»" header_occurrence: "Скасовано: нарада серії «%{title}»" header_series: "Скасовано: серія нарад «%{title}»" - 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" + summary_occurrence: "Нараду серії «%{title}» скасував(-ла) %{actor}, або вас видалено з учасників" + summary_series: "Серію нарад «%{title}» скасував(-ла) %{actor}, або вас видалено з учасників" + summary: "Нараду «%{title}» скасував(-ла) %{actor}, або вас видалено з учасників" date_time: "Заплановані дата/час" participant_added: header: "Нарада «%{title}» — додано учасника" @@ -274,7 +274,7 @@ uk: summary_series: "Виконавець %{actor} вилучив учасника %{participant} із серії нарад «%{title}»" ended: header_series: "Завершено: серія нарад «%{title}»" - summary_series: "Meeting series '%{title}' has been ended by %{actor}" + summary_series: "Серію нарад «%{title}» завершив(-ла) %{actor}" updated: header: "Нараду «%{title}» оновлено" summary: "Нараду «%{title}» оновив(-ла) %{actor}" @@ -567,8 +567,8 @@ uk: label_agenda_item_move_up: "Перемістити вгору" label_agenda_item_move_down: "Перемістити вниз" label_agenda_item_duplicate: "Дублювати" - label_agenda_item_duplicate_in_next: "Duplicate in next meeting" - label_agenda_item_duplicate_in_next_title: "Duplicate in next meeting?" + label_agenda_item_duplicate_in_next: "Дублювати в наступну нараду" + label_agenda_item_duplicate_in_next_title: "Дублювати в наступну нараду?" label_agenda_item_add_notes: "Додати примітки" label_agenda_item_add_outcome: "Додати результат" label_agenda_item_work_package_add: "Додати пакет робіт" @@ -634,11 +634,11 @@ uk: text_exit_draft_mode_dialog_subtitle: "Запланувавши нараду, не можна повернутися в режим чернетки." text_exit_draft_mode_dialog_template_title: "Відкрити першу нараду цієї серії?" text_exit_draft_mode_dialog_template_subtitle: "Після цього не можна буде повернутися в режим чернетки." - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "Надання доступу" + label_meeting_template_sharing_none: "Лише цей проєкт" + label_meeting_template_sharing_descendants: "Підпроєкти" + label_meeting_template_sharing_system: "Усі проєкти" + text_meeting_template_sharing_description: "Цим шаблоном можна поділитися з підпроєктами або іншими проєктами цього екземпляра. Буде скопійовано лише пункти порядку денного й вкладення." text_meeting_not_editable_anymore: "Цю нараду більше не можна редагувати." text_meeting_not_present_anymore: "Цю нараду видалено. Виберіть іншу нараду." label_add_work_package_to_meeting_dialog_title: "Вибрати нараду" diff --git a/modules/meeting/config/locales/crowdin/zh-CN.yml b/modules/meeting/config/locales/crowdin/zh-CN.yml index 3fd94209580..352e7023157 100644 --- a/modules/meeting/config/locales/crowdin/zh-CN.yml +++ b/modules/meeting/config/locales/crowdin/zh-CN.yml @@ -41,7 +41,7 @@ zh-CN: start_date: "日期" start_time: "开始时间" start_time_hour: "开始时间" - sharing: "Sharing" + sharing: "共享中" meeting_agenda_item: title: "标题" author: "作者" @@ -613,11 +613,11 @@ zh-CN: text_exit_draft_mode_dialog_subtitle: "会议安排完成后,您将无法返回到草稿模式。" text_exit_draft_mode_dialog_template_title: "是否打开此会议系列的第一个会议?" text_exit_draft_mode_dialog_template_subtitle: "在此之后,您将无法返回到草稿模式。" - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "共享中" + label_meeting_template_sharing_none: "仅此项目" + label_meeting_template_sharing_descendants: "子项目" + label_meeting_template_sharing_system: "所有项目" + text_meeting_template_sharing_description: "在这种情况下,此模板可以与此实例中的子项目或其他项目共享。仅复制议程条目和附件。" text_meeting_not_editable_anymore: "本次会议已不可编辑。" text_meeting_not_present_anymore: "此次会议已被删除。请选择另一次会议。" label_add_work_package_to_meeting_dialog_title: "选择会议" From fed6be5cb6e82a17d0838b7ec37dff25b6172bcb Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Sat, 31 Jan 2026 19:01:49 -0300 Subject: [PATCH 222/334] Sort Inflection Acronym rules alphabetically --- config/initializers/inflections.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index ad78036edd4..58cc436853b 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -43,8 +43,8 @@ # These inflection rules are supported but not enabled by default: ActiveSupport::Inflector.inflections(:en) do |inflect| inflect.acronym "API" + inflect.acronym "ClamAV" + inflect.acronym "ICal" inflect.acronym "OAuth" inflect.acronym "OpenID" - inflect.acronym "ICal" - inflect.acronym "ClamAV" end From 5dd408e0974dee6ab56490237d2bec3a37ef2809 Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Sat, 31 Jan 2026 19:03:41 -0300 Subject: [PATCH 223/334] Preemptively add Inflection rule for AI --- config/initializers/inflections.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index 58cc436853b..28b6fb2eb55 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -42,6 +42,7 @@ # These inflection rules are supported but not enabled by default: ActiveSupport::Inflector.inflections(:en) do |inflect| + inflect.acronym "AI" inflect.acronym "API" inflect.acronym "ClamAV" inflect.acronym "ICal" From 051d14f0a786e487b492b984cfbec4ffea8ab338 Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Tue, 10 Mar 2026 10:08:40 +0100 Subject: [PATCH 224/334] Add fereshtehnm to CLA allowlist [skip ci] --- .github/workflows/cla.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 72974c3b5f1..dfce7ca123d 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -59,6 +59,7 @@ jobs: dominic-braeunlein, dsteiner, dtohmucu, + fereshtehnm, gleone-art, ihor-khomenko, judithroth, From e6278f1b7666b05bc91599708389bcd77a30b6ab Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 10 Mar 2026 10:58:55 +0000 Subject: [PATCH 225/334] update locales from crowdin [ci skip] --- config/locales/crowdin/de.yml | 26 +- config/locales/crowdin/fr.yml | 20 +- config/locales/crowdin/ko.yml | 32 +- config/locales/crowdin/ru.yml | 410 +- config/locales/crowdin/uk.yml | 9604 +++++++---------- config/locales/crowdin/zh-CN.yml | 26 +- .../backlogs/config/locales/crowdin/de.yml | 4 +- .../backlogs/config/locales/crowdin/ru.yml | 36 +- .../backlogs/config/locales/crowdin/zh-CN.yml | 4 +- modules/budgets/config/locales/crowdin/ko.yml | 8 +- modules/budgets/config/locales/crowdin/ru.yml | 26 +- modules/costs/config/locales/crowdin/ru.yml | 14 +- .../grids/config/locales/crowdin/js-ru.yml | 4 +- modules/meeting/config/locales/crowdin/de.yml | 1236 +-- modules/meeting/config/locales/crowdin/fr.yml | 6 +- modules/meeting/config/locales/crowdin/ko.yml | 6 +- modules/meeting/config/locales/crowdin/ru.yml | 20 +- .../meeting/config/locales/crowdin/zh-CN.yml | 8 +- .../storages/config/locales/crowdin/ru.yml | 22 +- 19 files changed, 5059 insertions(+), 6453 deletions(-) diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 7ff85b71458..26ad0192aee 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -175,7 +175,7 @@ de: instance_meta_fetching: "Abrufen von Metadaten" instance_meta_error: "Fehler beim Abrufen von Metadaten" instance_meta_done: "Metadaten abgerufen" - import_scope: "Select scope" + import_scope: "Umfang auswählen" configuring: "Umfang auswählen" projects_meta_fetching: "Abrufen von Projektdaten" projects_meta_error: "Fehler beim Abrufen von Projektdaten" @@ -185,12 +185,12 @@ de: imported: "Überprüfungsmodus" reverting: "Rückgängig machen" revert_error: "Fehler beim Revertieren" - revert_cancelling: "Cancelling revert" - revert_cancelled: "Revert cancelled" + revert_cancelling: "Rückgängig machen abbrechen" + revert_cancelled: "Rückgängig machen abgebrochen" reverted: "Rückgängig gemacht" - finalizing: "Finalizing" - finalizing_error: "Error during finalizing" - finalizing_done: "Completed" + finalizing: "Abschließen" + finalizing_error: "Fehler beim Abschließen" + finalizing_done: "Abgeschlossen" wizard: button_retry: "Erneut versuchen" parts: @@ -271,9 +271,9 @@ de: button_revert: "Import rückgängig machen" button_done: "Import abschließen" preview_description: 'Die importierten Daten befinden sich derzeit im Überprüfungsmodus. Klicken Sie auf "Import abschließen", um den Import dauerhaft zu machen, oder auf "Import rückgängig machen", um alle in diesem Importlauf vorgenommenen Änderungen rückgängig zu machen.' - label_finalize_import: "Finalize import" - label_finalizing: "Finalizing import..." - label_finalizing_done: "Import finalized." + label_finalize_import: "Import abschließen" + label_finalizing: "Import wird abgeschlossen..." + label_finalizing_done: "Import abgeschlossen." label_revert_progress: "Import wird rückgängig gemacht..." label_reverted: "Import rückgängig gemacht." select_dialog: @@ -310,13 +310,13 @@ de: description_caption: "Wie der MCP-Server gegenüber anderen Anwendungen beschrieben wird, die sich damit verbinden." title_caption: "Ein kurzer Titel, der Anwendungen angezeigt wird, die sich mit dem MCP-Server verbinden." tool_response_format: "Antwortformat des Tools" - tool_response_format_content_only_label: "Nur Inhalt" + tool_response_format_content_only_label: "Nur unstrukturiert (content)" tool_response_format_content_only_caption: > Wählen Sie diese Option, wenn MCP-Clients, die sich mit dieser Instanz verbinden, keine strukturierten Inhalte unterstützen. Die Antworten des Tools enthalten dann nur den reinen Textinhalt und lassen die strukturierte Inhalte aus. tool_response_format_full_label: "Vollständig" tool_response_format_full_caption: > Die kompatibelste Option. Die Antworten des Tools enthalten sowohl reguläre als auch strukturierte Inhalte, so dass MCP-Clients wählen können, welches Format sie lesen möchten. Dies kann die Anzahl der Token erhöhen, die das Sprachmodell verarbeiten muss, was die Kosten erhöhen und die Leistung verringern kann. - tool_response_format_structured_only_label: "Nur strukturierte Inhalte" + tool_response_format_structured_only_label: "Nur strukturiert (structured content)" tool_response_format_structured_only_caption: > Wählen Sie diese Option, wenn Sie sicher sind, dass MCP-Clients, die sich mit dieser Instanz verbinden, strukturierte Inhalte unterstützen. Die Antworten des Tools enthalten dann nur strukturierte Inhalte und nicht deren Textdarstellung. update: @@ -1371,7 +1371,7 @@ de: personal_access_token: "Persönlicher Zugangs-Token" "import/jira_open_project_reference": jira: "Jira" - jira_import: "Jira import" + jira_import: "Jira Import" announcements: show_until: "Anzeigen bis" attachment: @@ -4206,7 +4206,7 @@ de: notice_parent_item_not_found: "Übergeordnetes Element nicht gefunden." notice_project_not_deleted: "Das Projekt wurde nicht gelöscht." notice_project_not_found: "Projekt nicht gefunden." - notice_smtp_address_unsafe: "SMTP address %{address} is not safe. Please add it to OPENPROJECT_SSRF_PROTECTION_ALLOWLIST." + notice_smtp_address_unsafe: "Die SMTP-Adresse %{address} ist nicht sicher. Bitte fügen Sie sie zu OPENPROJECT_SSRF_PROTECTION_ALLOWLIST hinzu." notice_successful_connection: "Verbindung erfolgreich." notice_successful_create: "Erfolgreich angelegt." notice_successful_delete: "Erfolgreich gelöscht." diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index cb325852068..2b86c280d12 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -175,7 +175,7 @@ fr: instance_meta_fetching: "Récupération des métadonnées" instance_meta_error: "Erreur lors de la récupération des métadonnées" instance_meta_done: "Métadonnées récupérées" - import_scope: "Select scope" + import_scope: "Sélectionnez la portée" configuring: "Sélectionnez la portée" projects_meta_fetching: "Récupération des données du projet" projects_meta_error: "Erreur lors de la récupération des données du projet" @@ -188,9 +188,9 @@ fr: revert_cancelling: "Cancelling revert" revert_cancelled: "Revert cancelled" reverted: "Restauré" - finalizing: "Finalizing" - finalizing_error: "Error during finalizing" - finalizing_done: "Completed" + finalizing: "Finalisation" + finalizing_error: "Erreur lors de la finalisation" + finalizing_done: "Terminé" wizard: button_retry: "Réessayer" parts: @@ -271,9 +271,9 @@ fr: button_revert: "Annuler l'importation" button_done: "Finaliser l'importation" preview_description: 'Les données importées sont actuellement en mode révision. Cliquez sur « Finaliser l''importation » pour rendre l''importation permanente ou sur « Annuler l''importation » pour annuler toutes les modifications apportées lors de ce cycle d''importation.' - label_finalize_import: "Finalize import" - label_finalizing: "Finalizing import..." - label_finalizing_done: "Import finalized." + label_finalize_import: "Finaliser l'importation" + label_finalizing: "Finalisation de l'importation..." + label_finalizing_done: "Importation finalisée." label_revert_progress: "Annulation de l'importation..." label_reverted: "Importation annulée." select_dialog: @@ -1377,7 +1377,7 @@ fr: personal_access_token: "Jeton d'accès personnel" "import/jira_open_project_reference": jira: "Jira" - jira_import: "Jira import" + jira_import: "Importation de Jira" announcements: show_until: "Afficher jusqu'à" attachment: @@ -4212,7 +4212,7 @@ fr: notice_parent_item_not_found: "L'élément parent est introuvable." notice_project_not_deleted: "Le projet n'a pas été supprimé." notice_project_not_found: "Projet introuvable." - notice_smtp_address_unsafe: "SMTP address %{address} is not safe. Please add it to OPENPROJECT_SSRF_PROTECTION_ALLOWLIST." + notice_smtp_address_unsafe: "L'adresse SMTP %{address} n'est pas sûre. Veuillez l'ajouter à OPENPROJECT_SSRF_PROTECTION_ALLOWLIST." notice_successful_connection: "Connection réussie." notice_successful_create: "Création réussie." notice_successful_delete: "Suppression réussie." @@ -4394,7 +4394,7 @@ fr: project: archive: title: "Archiver le projet" - are_you_sure: "Êtes-vous sûr de vouloir archiver le projet '%{name}%' ?" + are_you_sure: "Êtes-vous sûr de vouloir archiver le projet '%{name}' ?" archived: "Archivé" count: zero: "0 projet" diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 98c73da4d0d..e6df4e64be5 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -167,7 +167,7 @@ ko: title: "가져오기 실행이 아직 설정되지 않음" description: "가져오기 실행을 만들어서 이 Jira 인스턴스에서 정보 가져오기를 시작하세요" index: - description: "가져오기를 실행할 때마다 다른 데이터 세트를 가져올 수 있습니다. 검토 모드에서 가져오기 실행은 직후에 실행 취소할 수 있지만 완료한 후에는 실행 취소할 수 없습니다." + description: "가져오기를 실행할 때마다 다른 데이터 세트를 가져올 수 있습니다. 검토 모드에서 가져오기 실행은 직후에 실행 취소할 수 있지만 마무리한 후에는 실행 취소할 수 없습니다." button_import_run: "가져오기 실행" button_edit_configuration: "구성 편집" status: @@ -175,7 +175,7 @@ ko: instance_meta_fetching: "메타 데이터를 가져오는 중" instance_meta_error: "메타 데이터를 가져오는 중에 오류 발생" instance_meta_done: "메타 데이터 가져옴" - import_scope: "Select scope" + import_scope: "범위 선택" configuring: "범위 선택" projects_meta_fetching: "프로젝트 데이터를 가져오는 중" projects_meta_error: "프로젝트 데이터를 가져오는 중에 오류 발생" @@ -185,12 +185,12 @@ ko: imported: "검토 모드" reverting: "되돌리는 중" revert_error: "되돌리는 중에 오류 발생" - revert_cancelling: "Cancelling revert" - revert_cancelled: "Revert cancelled" + revert_cancelling: "되돌리기 취소 중" + revert_cancelled: "되돌리기 취소됨" reverted: "되돌림" - finalizing: "Finalizing" - finalizing_error: "Error during finalizing" - finalizing_done: "Completed" + finalizing: "마무리 중" + finalizing_error: "마무리 중 오류 발생" + finalizing_done: "완료됨" wizard: button_retry: "다시 시도" parts: @@ -263,11 +263,11 @@ ko: label_results: "가져옴" label_revert: "가져오기 되돌리기" button_revert: "가져오기 되돌리기" - button_done: "가져오기 완료" - preview_description: '가져온 데이터는 현재 검토 모드에 있습니다. 가져오기를 영구적으로 적용하려면 "가져오기 완료"를 클릭하고, 가져오기 실행에서 변경된 모든 사항을 취소하려면 "가져오기 되돌리기"를 클릭합니다.' - label_finalize_import: "Finalize import" - label_finalizing: "Finalizing import..." - label_finalizing_done: "Import finalized." + button_done: "가져오기 마무리" + preview_description: '가져온 데이터는 현재 검토 모드에 있습니다. 가져오기를 영구적으로 적용하려면 "가져오기 마무리"를 클릭하고, 가져오기 실행에서 변경된 모든 사항을 취소하려면 "가져오기 되돌리기"를 클릭합니다.' + label_finalize_import: "가져오기 마무리" + label_finalizing: "가져오기 마무리 중..." + label_finalizing_done: "가져오기가 마무리되었습니다." label_revert_progress: "가져오기를 되돌리는 중..." label_reverted: "가져오기를 되돌렸습니다." select_dialog: @@ -283,8 +283,8 @@ ko: description: "이렇게 하면 OpenProject의 가져오기 후 해당 프로젝트에 사용자 활동이 있더라도 가져온 모든 개체(전체 프로젝트 포함)가 삭제됩니다." confirm: "이 되돌리기를 통해 데이터가 영구적으로 삭제됨을 이해합니다" finalize_dialog: - title: "이 가져오기를 완료하시겠습니까?" - description: "가져오기가 완료되면 더 이상 되돌릴 수 없습니다. 가져온 모든 데이터는 영구적으로 가져오게 됩니다." + title: "이 가져오기를 마무리하시겠습니까?" + description: "이 가져오기가 마무리되면 더 이상 되돌릴 수 없습니다. 가져온 모든 데이터는 영구적으로 가져오게 됩니다." confirm: "이 작업을 취소할 수 없음을 이해합니다." confirm_button: "이해함" select_projects: @@ -1364,7 +1364,7 @@ ko: personal_access_token: "개인 액세스 토큰" "import/jira_open_project_reference": jira: "Jira" - jira_import: "Jira import" + jira_import: "Jira 가져오기" announcements: show_until: "표시 기한" attachment: @@ -4157,7 +4157,7 @@ ko: notice_parent_item_not_found: "부모 항목을 찾을 수 없습니다." notice_project_not_deleted: "프로젝트가 삭제되지 않았습니다." notice_project_not_found: "프로젝트를 찾을 수 없습니다." - notice_smtp_address_unsafe: "SMTP address %{address} is not safe. Please add it to OPENPROJECT_SSRF_PROTECTION_ALLOWLIST." + notice_smtp_address_unsafe: "SMTP 주소 %{address}은(는) 안전하지 않습니다. OPENPROJECT_SSRF_PROTECTION_ALLOWLIST에 추가하세요." notice_successful_connection: "연결에 성공했습니다." notice_successful_create: "생성에 성공했습니다." notice_successful_delete: "삭제에 성공했습니다." diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index fdca837fdc1..eb11c6168c7 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -83,9 +83,9 @@ ru: confirmation: "Вы уверены, что хотите удалить этот токен поддержки корпоративной версии?" create_dialog: title: "Добавить корпоративный токен" - type_token_text: "Your Enterprise token text" + type_token_text: "Текст вашего корпоративного токена" token_placeholder: "Вставьте ваш токен поддержки корпоративной версии здесь" - token_caption: "To learn more about how to activate Enterprise edition check our [documentation](docs_url)." + token_caption: "Чтобы узнать больше о том, как активировать корпоративную версию, ознакомьтесь с нашей [документацией](docs_url)." add_token: "Загрузить токен поддержки корпоративной версии" replace_token: "Замените ваш текущий маркер поддержки" order: "Закажите корпоративную версию" @@ -114,202 +114,202 @@ ru: title: "Импорт" jira: title: "Импорт из Jira" - description: "Use this tool to import data from your Jira instance. You can configure multiple Jira hosts and choose what to import in each import run." + description: "Используйте этот инструмент для импорта данных из Вашего экземпляра Jira. Вы можете настроить несколько узлов Jira и выбрать, что импортировать в каждом запуске импорта." errors: - cannot_delete_with_imports: "Cannot delete Jira host with existing imports" + cannot_delete_with_imports: "Невозможно удалить хост Jira с существующими импортами" blank: - title: "No Jira hosts configured yet" - description: "Configure a Jira host to start importing items from Jira to this OpenProject instance." + title: "Хосты Jira еще не настроены" + description: "Настройте хост Jira, чтобы начать импортировать элементы из Jira в этот экземпляр OpenProject." configuration: - title: "Jira configuration" - new: "New configuration" + title: "Конфигурация Jira" + new: "Новая конфигурация" banner: - title: "Limited import" - description: "This import tool is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time." + title: "Ограниченный импорт" + description: "Этот инструмент импорта в настоящее время находится в стадии бета-тестирования и может импортировать только основные данные: проекты, проблемы (имя, название, описание, вложения), пользователей (имя, электронная почта, членство в проекте), статусы и типы. Он не может импортировать рабочие процессы, пользовательские поля, отношения между заданиями или разрешения. В настоящее время мы поддерживаем только Jira Server/Data Center версий 10.x и 11.x. Облачные экземпляры на данный момент не поддерживаются." form: fields: - name: "Name" - url: "Jira Server/Data Center URL" - personal_access_token: "Personal Access Token" - button_add: "Add configuration" - button_save: "Save configuration" - button_test: "Test configuration" - button_delete_token: "Delete token" - delete_token_confirm: "Are you sure you want to delete the token? This will disable the Jira connection." - label_testing: "Testing configuration..." - token_deleted: "Token was successfully deleted." + name: "Имя" + url: "URL сервера/центра обработки данных Jira" + personal_access_token: "Персональный токен доступа" + button_add: "Добавить конфигурацию" + button_save: "Сохранить конфигурацию" + button_test: "Проверить конфигурацию" + button_delete_token: "Удалить токен" + delete_token_confirm: "Вы уверены, что хотите удалить токен? Это отключит подключение к Jira." + label_testing: "Тестирование конфигурации..." + token_deleted: "Токен был успешно удален." test: - success: "Successfully connected to %{server} (version %{version})" - failed: "Connection failed: Unable to retrieve server information" - error: "An unexpected error occurred while testing the connection" - connection_error: "Connection error: %{message}" - parse_error: "Failed to parse the response from the server. The server may not be a valid Jira instance." - api_error: "Jira API returned error status %{status}. Please check your Jira instance URL and API token." - token_error: "Invalid API token. Please check your credentials in the configuration." - missing_credentials: "Please provide both URL and Personal Access Token to test the connection" - invalid_url: "Please provide a valid URL" + success: "Успешное подключение к %{server} (версия %{version})" + failed: "Соединение не удалось: Невозможно получить информацию о сервере" + error: "Во время тестирования соединения произошла непредвиденная ошибка" + connection_error: "Ошибка соединения: %{message}" + parse_error: "Не удалось разобрать ответ от сервера. Возможно, сервер не является действующим экземпляром Jira." + api_error: "Jira API вернул статус ошибки %{status}. Пожалуйста, проверьте ваш экземпляр Jira URL и API токен." + token_error: "Неверный API токен. Пожалуйста, проверьте свои учетные данные в конфигурации." + missing_credentials: "Пожалуйста, укажите URL и персональный токен доступа, чтобы проверить соединение" + invalid_url: "Укажите корректный URL" client: - connection_error: "Failed to connect to Jira server: %{message}" - connection_timeout: "Connection to Jira server timed out: %{message}" - parse_error: "Failed to parse Jira API response: %{message}" - api_error: "Jira API returned error status %{status}" + connection_error: "Не удалось подключиться к серверу Jira: %{message}" + connection_timeout: "Время подключения к серверу Jira истекло: %{message}" + parse_error: "Не удалось разобрать ответ Jira API: %{message}" + api_error: "Jira API вернул статус ошибки %{status}" columns: - projects: "Projects" - last_change: "Last change" - added: "Added" - label_ago: "%{amount} ago" + projects: "Проекты" + last_change: "Последнее изменение" + added: "Добавлено" + label_ago: "%{amount} назад" run: - title: "Import run" - history: "History" - remove_error: "A Jira import cannot be removed while it is running" - import_blocked_error: "Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import." + title: "Выполнение импорта" + history: "История" + remove_error: "Импорт Jira нельзя удалить во время его выполнения" + import_blocked_error: "Другая операция импорта Jira находится в процессе выполнения или ожидает рассмотрения. Пожалуйста, завершите или отмените его, прежде чем начинать новый импорт." blank: - title: "No import runs set up yet" - description: "Create an import run to start importing information from this Jira instance" + title: "Импорт еще не настроен" + description: "Создайте запуск импорта, чтобы начать импортировать информацию из этого экземпляра Jira" 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" + description: "С каждым запуском импорта можно импортировать различные наборы данных. Отмена импорта возможна сразу же после завершения процесса проверки, но не после завершения." + button_import_run: "Выполнение импорта" + button_edit_configuration: "Изменить конфигурацию" status: - initial: "Start" - instance_meta_fetching: "Fetching meta data" - instance_meta_error: "Error fetching meta data" - instance_meta_done: "Meta data fetched" - import_scope: "Select scope" - configuring: "Select scope" - projects_meta_fetching: "Fetching project data" - projects_meta_error: "Error fetching project data" - projects_meta_done: "Data gathered" - importing: "In progress" - import_error: "Error during import" - imported: "Review mode" - reverting: "Reverting" - revert_error: "Error during revert" - revert_cancelling: "Cancelling revert" - revert_cancelled: "Revert cancelled" - reverted: "Reverted" - finalizing: "Finalizing" - finalizing_error: "Error during finalizing" - finalizing_done: "Completed" + initial: "Начать" + instance_meta_fetching: "Получение метаданных" + instance_meta_error: "Ошибка при получении метаданных" + instance_meta_done: "Метаданные загружены" + import_scope: "Выберите область применения" + configuring: "Выберите область применения" + projects_meta_fetching: "Получение данных о проекте" + projects_meta_error: "Ошибка при получении данных о проекте" + projects_meta_done: "Данные собраны" + importing: "В процессе" + import_error: "Ошибка при импорте" + imported: "Режим обзора" + reverting: "Возврат в исходное состояние" + revert_error: "Ошибка при откате" + revert_cancelling: "Отмена отката" + revert_cancelled: "Откат отменен" + reverted: "Возвращено к исходному состоянию" + finalizing: "Завершение" + finalizing_error: "Ошибка при завершении" + finalizing_done: "Завершено" wizard: - button_retry: "Retry" + button_retry: "Повторить" parts: projects: - one: "1 project" + one: "1 проект" few: "%{count} projects" many: "%{count} projects" - other: "%{count} projects" + other: "%{count} проектов" issues: - one: "1 issue" + one: "1 проблема" few: "%{count} issues" many: "%{count} issues" - other: "%{count} issues" + other: "%{count} проблем" work_packages: - one: "1 work package" + one: "1 пакет работ" few: "%{count} work packages" many: "%{count} work packages" - other: "%{count} work packages" + other: "%{count} пакетов работ" types: - one: "1 type" + one: "1 тип" few: "%{count} types" many: "%{count} types" - other: "%{count} types" + other: "%{count} типов" statuses: - one: "1 status" + one: "1 статус" few: "%{count} statuses" many: "%{count} statuses" - other: "%{count} statuses" + other: "%{count} статусов" users: - one: "1 user" + one: "1 пользователь" few: "%{count} users" many: "%{count} users" - other: "%{count} users" + other: "%{count} пользователей" groups: fetch: - title: "Get base data" + title: "Получить базовые данные" groups_and_users: - title: "Groups and Users" + title: "Группы и пользователи" configuration: - title: "Configure import" + title: "Настроить импорт" confirming: - title: "Confirm and import" + title: "Подтвердить и импортировать" review: - title: "Review import" + title: "Обзор импорта" sections: fetch_data: - title: "Fetch instance meta data" - caption_done: "Completed" - description: "Check what data is available for import in the host Jira instance." - button_fetch: "Check available data" - label_progress: "Fetching data from Jira..." + title: "Получить мета данные экземпляра" + caption_done: "Завершено" + description: "Проверьте, какие данные доступны для импорта в экземпляре хоста Jira." + button_fetch: "Проверка доступных данных" + label_progress: "Получение данных из Jira..." groups_and_users: - title: "Groups and Users" + title: "Группы и пользователи" import_scope: - title: "Import scope" - caption: "Choose what you want to import into OpenProject" - caption_done: "Completed" - 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_available_data: "Available data" - label_not_available_data: "Not available for import" - button_select_projects: "Select projects to import" - button_continue: "Continue" - 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..." + title: "Объем импорта" + caption: "Выберите, что Вы хотите импортировать в OpenProject" + caption_done: "Завершено" + label_info: "Пожалуйста, обратите внимание, что этот инструмент импорта находится в бета-версии и не может импортировать все типы данных. Вот краткая информация о том, что хост Jira предлагает для импорта, и что этот инструмент может импортировать прямо сейчас." + description: "Выберите, какие данные Вы хотите импортировать из доступных, полученных из хоста Jira." + label_available_data: "Доступные данные" + label_not_available_data: "Недоступно для импорта" + button_select_projects: "Выберите проекты для импорта" + button_continue: "Продолжить" + label_import: "Выберите проекты, которые Вы хотите импортировать." + button_select: "Выбрать проекты" + label_selected_data: "Выбранные данные для импорта" + label_progress: "Получение данных из Jira..." elements: - relations: "Relations between issues" - workflows: "Project-level workflows" - users: "Users" - sprints: "Sprints" - schemes: "Schemas" - permissions: "User, group and project permissions" + relations: "Отношения между проблемами" + workflows: "Рабочие процессы на уровне проекта" + users: "Пользователи" + sprints: "Спринты" + schemes: "Схемы" + permissions: "Разрешения пользователей, групп и проектов" confirm_import: - title: "Import data" - caption: "Review your import settings and start the import" - caption_done: "Completed" - label_available_data: "Available data to import" - 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" + title: "Импорт данных" + caption: "Просмотрите настройки импорта и начните импорт" + caption_done: "Завершено" + label_available_data: "Доступные данные для импорта" + button_start: "Начать импорт" + description: "Вы собираетесь начать импорт со следующими настройками." + label_progress: "Идёт импорт..." + label_import_data: "Сейчас импортируется" import_result: - title: "Import run results" - caption: "Review import run or revert import" - info: "Import run successful." - label_results: "Imported" - label_revert: "Revert import" - button_revert: "Revert import" - button_done: "Finalize import" - preview_description: 'The imported data is currently in review mode. Click "Finalize import" to make the import permanent or "Revert import" to undo all changes made in this import run.' - label_finalize_import: "Finalize import" - label_finalizing: "Finalizing import..." - label_finalizing_done: "Import finalized." - label_revert_progress: "Reverting import..." - label_reverted: "Import reverted." + title: "Результаты запуска импорта" + caption: "Просмотрите выполнение импорта или отмените импорт" + info: "Импорт успешно запущен." + label_results: "Импортировано" + label_revert: "Откатить импорт" + button_revert: "Откатить импорт" + button_done: "Завершить импорт" + preview_description: 'В настоящее время импортированные данные находятся в режиме просмотра. Нажмите "Завершить импорт", чтобы сделать импорт постоянным, или "Отменить импорт", чтобы отменить все изменения, сделанные в ходе этого запуска импорта.' + label_finalize_import: "Завершить импорт" + label_finalizing: "Завершение импорта..." + label_finalizing_done: "Импорт завершен." + label_revert_progress: "Отмена импорта..." + label_reverted: "Импорт отменен." select_dialog: - filter_projects: "Filter by text" + filter_projects: "Фильтр по тексту" import_dialog: - title: "Start this import?" - confirm_button: "Start import" + title: "Начать импорт?" + confirm_button: "Начать импорт" description: > - This importer is an alpha feature. It is not yet able to import all data from Jira and might leave incomplete data on this OpenProject instance. Do not use a production environment and create a backup of your OpenProject data before starting. - confirm: "I understand and made the necessary preparations" + Этот импортер является альфа-версией. Он еще не может импортировать все данные из Jira и может оставить неполные данные в данном экземпляре OpenProject. Не используйте его в производственной среде и создайте резервную копию данных OpenProject перед началом работы. + confirm: "Я понял и сделал необходимые приготовления" revert_dialog: - title: "Permanently revert this import?" - description: "This will delete all imported objects (including whole projects) even if there was user activity in those projects after the import on OpenProject." - confirm: "I understand that this reversion will delete data permanently" + title: "Отменить этот импорт?" + description: "Это удалит все импортированные объекты (включая целые проекты), даже если после импорта на OpenProject в этих проектах была активность пользователей." + confirm: "Я понимаю, что при отмене данные будут удалены навсегда" finalize_dialog: - title: "Finalize this import?" - description: "Once finalized, this import can no longer be reverted. All imported data will become permanently imported." - confirm: "I understand that this action cannot be undone" - confirm_button: "Understood" + title: "Завершить импорт?" + description: "После завершения импорта его уже нельзя будет отменить. Все импортированные данные будут импортированы навсегда." + confirm: "Я понимаю, что это действие не может быть отменено" + confirm_button: "Понятно" select_projects: - title: "Select projects" + title: "Выбрать проекты" 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." + description: "Протокол контекста модели позволяет агентам ИИ предоставлять своим пользователям инструменты и ресурсы, открытые данным экземпляром OpenProject. Эта функция пока находится в стадии бета-версии." resources_heading: "Ресурсы" resources_description: "OpenProject реализует следующие ресурсы. Каждый из них может быть включен, переименован и описан по Вашему желанию. Для получения дополнительной информации обратитесь к [документации по ресурсам MCP](docs_url)." resources_submit: "Обновить ресурсы" @@ -321,16 +321,16 @@ ru: server_form: description_caption: "Как сервер MCP будет описан для других приложений, которые подключатся к нему." title_caption: "Краткое название, показываемое приложениям, которые подключаются к серверу MCP." - tool_response_format: "Tool response format" - tool_response_format_content_only_label: "Content only" + tool_response_format: "Формат инструмента ответа" + tool_response_format_content_only_label: "Только содержимое" tool_response_format_content_only_caption: > - Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version. - tool_response_format_full_label: "Full" + Выберите этот вариант, если клиенты MCP, подключающиеся к этому экземпляру, не поддерживают структурированное содержимое. Ответы инструмента будут содержать только обычный текст и не будут содержать структурированную версию. + tool_response_format_full_label: "Полный" tool_response_format_full_caption: > - The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance. - tool_response_format_structured_only_label: "Structured content only" + Наиболее совместимый вариант. Ответы инструмента будут включать как обычное, так и структурированное содержимое, позволяя клиентам MCP выбирать, какой формат они хотят читать. Это может увеличить количество лексем, которые приходится обрабатывать языковой модели, что может привести к увеличению затрат и снижению производительности. + tool_response_format_structured_only_label: "Только структурированное содержимое" tool_response_format_structured_only_caption: > - Choose this if you are certain that MCP clients connecting to this instance support structured content. Tool responses will only include structured content and leave out its text representation. + Выберите этот вариант, если Вы уверены, что клиенты MCP, подключающиеся к этому экземпляру, поддерживают структурированное содержимое. Ответы инструмента будут включать только структурированное содержимое и не будут содержать его текстового представления. update: failure: "Конфигурация MCP не может быть обновлена." success: "Конфигурация MCP была успешно обновлена." @@ -568,7 +568,7 @@ ru: contained_in_type: "Содержится в типе" confirm_destroy_option: "Удаление опции приведет к удалению всех ее вхождений (например, в пакеты работ). Вы уверены, что вы хотите удалить ее?" reorder_alphabetical: "Переупорядочить значения по алфавиту" - reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?" + reorder_confirmation: "Предупреждение: Текущий порядок доступных значений, а также все несохраненные значения будут потеряны. Вы уверены, что хотите продолжить?" placeholder_version_select: "Сначала необходимо выбрать пакет работ или проект" calculated_field_not_editable: "Не редактируемый атрибут. Это значение рассчитывается автоматически." no_role_assigment: "Роль не назначена" @@ -596,13 +596,13 @@ ru: formula: project: "Добавьте числовые значения или введите / для поиска атрибута или математического оператора." regexp: - all: "eg. ^[A-Z0-9]+$" - project: "eg. ^[A-Z0-9]+$" + all: "например: ^[A-Z0-9]+$" + project: "например: ^[A-Z0-9]+$" min_max: - all: "0 means no restriction" - project: "0 means no restriction" + all: "0 означает отсутствие ограничений" + project: "0 означает отсутствие ограничений" has_comment: - project: "Allows the user to add a comment related to the project attribute when selecting the value in the project overview." + project: "Позволяет пользователю добавить комментарий, относящийся к атрибуту проекта, при выборе значения в обзоре проекта." tab: no_results_title_text: Нет настраиваемых полей. no_results_content_text: Создать новое настраиваемое поле @@ -621,8 +621,8 @@ ru: confirmation_live_message_unchecked: "Кнопка для продолжения неактивна. Чтобы продолжить, поставьте галочку." mcp_configurations: server_url_component: - caption: "The URL at which the OpenProject MCP server will be reachable. Required for setting up MCP clients." - label: "Server URL" + caption: "URL, по которому будет доступен сервер OpenProject MCP. Требуется для настройки клиентов MCP." + label: "URL сервера" op_dry_validation: or: "или" errors: @@ -845,8 +845,8 @@ ru: new_label: "Новый приоритет" creation_wizard: errors: - no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." - no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." + no_work_package_type: "Не удалось включить запрос на инициирование проекта, поскольку для этого требуется хотя бы один активный тип пакета работ, а в данном проекте его нет. Пожалуйста, добавьте хотя бы один тип пакета работ в этот проект." + no_status_when_submitted: "Не удалось включить запрос на инициирование проекта, поскольку тип пакета работ %{type} требует наличия хотя бы одного связанного с ним статуса. Пожалуйста, включите хотя бы один рабочий процесс со статусом для этого типа пакета работ." export: description_attachment_export: "Созданный артефакт будет сохранен в виде PDF-вложения к пакету работ." description_file_link_export: "Пакет работ будет содержать ссылку на файл PDF, хранящийся во внешнем файловом хранилище. Требуется рабочее файловое хранилище с автоматически управляемыми папками для данного проекта. На данный момент поддерживаются только файловые хранилища Nextcloud." @@ -860,7 +860,7 @@ ru: label_request_submission: "Подача заявки" project_attributes_description: > Выберите, какие атрибуты проекта должны быть включены в запрос на инициацию проекта. В этот список входят только [атрибуты проекта](project_attributes_url), включенные для этого проекта. - enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. + enabled_because_required_html: Этот атрибут проекта не может быть отключен для данного запроса на инициацию проекта, поскольку он определен как обязательный. Это можно изменить в настройках администрирования администратором экземпляра. status: button_edit: Редактировать статус wizard: @@ -1400,14 +1400,14 @@ ru: activerecord: attributes: jira_import: - projects: "Projects" + projects: "Проекты" "import/jira": - name: "Jira instance name" - url: "Jira instance URL" - personal_access_token: "Personal access token" + name: "Имя экземпляра Jira" + url: "URL-адрес экземпляра Jira" + personal_access_token: "Персональный токен доступа" "import/jira_open_project_reference": jira: "Jira" - jira_import: "Jira import" + jira_import: "Импорт из Jira" announcements: show_until: "Отобразить до" attachment: @@ -1453,7 +1453,7 @@ ru: regexp: "Регулярное выражение" searchable: "Доступно для поиска" admin_only: "Только администратор" - has_comment: "Add a comment text field" + has_comment: "Добавьте комментарий для текстового поля" custom_value: value: "Значение" design_color: @@ -1892,7 +1892,7 @@ ru: meeting: error_conflict: "Невозможно сохранить, потому что совещание было обновлено кем-то другим за это время. Пожалуйста, перезагрузите страницу." message: - cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project." + cannot_move_message_to_forum_of_different_project: "Сообщение не может быть перемещено в форум другого проекта." notifications: at_least_one_channel: "Нужно указать хотя бы один канал для отправки уведомлений." attributes: @@ -2151,7 +2151,7 @@ ru: in_use: "Это имя токена уже используется, пожалуйста, выберите другое" format: "%{message}" jira: - invalid_protocol: "Please provide a valid protocol (http or https)" + invalid_protocol: "Пожалуйста, укажите корректный протокол (http или https)" template: body: "Пожалуйста, проверьте следующие поля:" header: @@ -2176,7 +2176,7 @@ ru: comment: "Комментарий" custom_action: "Пользовательское действие" custom_field: "Настраиваемое поле" - customized: "Customized" + customized: "Настраиваемый" "doorkeeper/application": "Приложение OAuth" enterprise_token: one: "Корпоративный токен" @@ -2803,13 +2803,13 @@ ru: edit_attribute_groups: Редактирование атрибутов групп gantt_pdf_export: Экспорт диаграммы Ганта в PDF ldap_groups: Синхронизация пользователей LDAP и групп - mcp_server: Model Context Protocol (MCP) - meeting_templates: Reusable meeting templates + mcp_server: Протокол контекста модели (MCP) + meeting_templates: Многоразовые шаблоны совещаний nextcloud_sso: Единый вход для Nextcloud хранения one_drive_sharepoint_file_storage: Файловое хранилище OneDrive/SharePoint placeholder_users: Пользователи-заполнители portfolio_management: Управление портфолио - project_creation_wizard: Project initiation request + project_creation_wizard: Запрос на инициализацию проекта project_list_sharing: Совместное использование списка проектов readonly_work_packages: Пакеты работ только для чтения scim_api: API сервера SCIM @@ -2882,9 +2882,9 @@ ru: title: "Пользовательские действия" description: "Пользовательские действия являются ярлыками к набору заранее определенных действий, которые вы можете сделать доступными для определенных пакетов работ на основе статуса, роли, типа или проекта." mcp_server: - description: "Bring OpenProject into your AI workflows with a secure MCP server." + description: "Внесите OpenProject в свои рабочие процессы искусственного интеллекта с помощью защищенного сервера MCP." meeting_templates: - description: "Define meeting templates with a set agenda structure and save time by reusing them when creating new meetings." + description: "Определите шаблоны совещаний с заданной структурой повестки дня и экономьте время, повторно используя их при создании новых совещаний." nextcloud_sso: title: "Единый вход для Nextcloud хранения" description: "Включите бесшовную и безопасную аутентификацию для вашего Nextcloud хранилища с помощью Single Sign-On. Упростите управление доступом и сделайте удобным для пользователя." @@ -2897,7 +2897,7 @@ ru: virus_scanning: description: "Будьте уверены в том, что загруженные в OpenProject файлы проверены на наличие вирусов, прежде чем они станут доступны другим пользователям." project_creation_wizard: - description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." + description: "Создайте пошаговый мастер, который поможет руководителям проектов заполнить запрос на инициирование проекта." placeholder_users: title: Пользователи-заполнители description: > @@ -3199,16 +3199,16 @@ ru: #We need to include the version to invalidate outdated translations in other locales "17_2": new_features_title: > - The release contains various new features and improvements, such as: + Релиз содержит различные новые функции и улучшения, такие как: new_features_list: - line_0: AI workflows with a secure MCP server (Professional plan and higher) - line_1: Improved project home page with new widget for budgets and improved accessibility - line_2: "Meetings: Meeting templates (Basic plan and higher)" - line_3: Better transparency with project attribute comments - line_4: PDF export enhancements - line_5: Increased security for external links (Premium plan and higher) - line_6: UI/UX improvements in the Backlogs module - line_7: Harmonized custom field forms + line_0: Рабочие процессы AI с защищенным сервером MCP (тарифный план Professional и выше) + line_1: Улучшенная главная страница проекта с новым виджетом для бюджетов и улучшенной доступностью + line_2: "Совещания: Шаблоны совещаний (Базовый план и выше)" + line_3: Повышение прозрачности комментариев к атрибутам проекта + line_4: Улучшения экспорта PDF + line_5: Повышенная безопасность внешних ссылок (тарифный план Premium и выше) + line_6: Улучшение UI/UX в модуле бэклогов + line_7: Согласованные формы пользовательских полей links: upgrade_enterprise_edition: "Обновить до корпоративной версии" postgres_migration: "Перенос вашей установки в PostgreSQL" @@ -3226,10 +3226,10 @@ ru: journals: changes_retracted: "Изменения отменены." caused_changes: - budget_deleted: "Budget has been deleted" + budget_deleted: "Бюджет был удален" dates_changed: "Даты изменены" default_attribute_written: "Запись атрибутов со свойством \"только для чтения\"" - import: "Imported" + import: "Импортировано" progress_mode_changed_to_status_based: "Расчет прогресса обновлен" status_changed: "Статус '%{status_name}'" system_update: "Обновление системы OpenProject:" @@ -3238,21 +3238,21 @@ ru: total_percent_complete_mode_changed_to_simple_average: "Вычисление общего % завершения теперь осуществляется по среднему арифметическому значений % завершения." cause_descriptions: import: - header: "changes by %{author}" - field_changed: "%{field} changed from %{old_value} to %{new_value}" - field_set: "%{field} set to %{value}" - field_removed: "%{field} removed" - field_updated: "%{field} updated" - deleted_with_diff: "%{field} deleted (%{link})" - changed_with_diff: "%{field} changed (%{link})" - set_with_diff: "%{field} set (%{link})" + header: "изменения %{author}" + field_changed: "%{field} изменено с %{old_value} на %{new_value}" + field_set: "%{field} установлено в %{value}" + field_removed: "%{field} удалено" + field_updated: "%{field} обновлено" + deleted_with_diff: "%{field} удалено (%{link})" + changed_with_diff: "%{field} изменено (%{link})" + set_with_diff: "%{field} установлено (%{link})" work_package_predecessor_changed_times: внесением изменений в предшественника %{link} work_package_parent_changed_times: внесением изменений в родительский %{link} work_package_children_changed_times: внесением изменений в дочерний элемент %{link} work_package_related_changed_times: внесением изменений в связанный элемент %{link} work_package_duplicate_closed: Статус был автоматически обновлен дубликатом пакета работ %{link} unaccessable_work_package_changed: внесением изменений в связанный пакет работ - budget_deleted: Budget has been deleted + budget_deleted: Бюджет был удален working_days_changed: changed: "внесением изменений в рабочие дни (%{changes})" days: @@ -3293,7 +3293,7 @@ ru: api_and_webhooks: "API и вебхуки" mail_notification: "Уведомления по электронной почте" mails_and_notifications: "Письма и уведомления" - mcp_configurations: "Model Context Protocol (MCP)" + mcp_configurations: "Протокол контекста модели (MCP)" quick_add: label: "Добавить…" my_account: @@ -3333,7 +3333,7 @@ ru: active_tokens: "Активные токены" blank_description: "Для Вас не будет настроен и активен доступ к сторонним приложениям." blank_title: "Нет токена приложения OAuth" - last_refreshed_at: "Last refreshed at" + last_refreshed_at: "Последнее обновление" title: "OAuth" table_title: "Токены приложения OAuth" text_hint: "Токены приложений OAuth позволяют сторонним приложениям подключаться к данному экземпляру OpenProject." @@ -3419,7 +3419,7 @@ ru: label_always_visible: "Всегда отображается" label_announcement: "Объявление" label_angular: "AngularJS" - label_app_modules: "%{app_title} modules" + label_app_modules: "%{app_title} модули" label_api_access_key: "Ключ доступа к API" label_api_access_key_created_on: "Ключ доступа к API, созданный %{value} назад" label_api_access_key_type: "API" @@ -3573,7 +3573,7 @@ ru: label_duplicates: "Дублирует" label_edit: "Правка" label_edit_x: "Правка: %{x}" - label_view_x: "View: %{x}" + label_view_x: "Вид: %{x}" label_enable_multi_select: "Разрешен множественный выбор" label_enabled_project_custom_fields: "Доступные настраиваемые поля" label_enabled_project_modules: "Включенные модули" @@ -3678,7 +3678,7 @@ ru: label_external_links: "Внешние ссылки" label_locale: "Язык и регион" label_jump_to_a_project: "Перейти к проекту..." - label_jira_import: "Jira Import" + label_jira_import: "Импорт из Jira" label_keyword_plural: "Ключевые слова" label_language_based: "Основанный на языке пользователя" label_last_activity: "Последняя активность" @@ -3701,7 +3701,7 @@ ru: label_lock_user: "Заблокировать пользователя" label_logged_as: "Войти в систему как" label_login: "Войти" - label_custom_comment: "%{name} comment" + label_custom_comment: "%{name} комментарий" label_custom_logo: "Пользовательский логотип компьютера" label_custom_logo_mobile: "Пользовательский логотип мобильного устройства" label_custom_export_logo: "Пользовательский логотип экспорта" @@ -4325,7 +4325,7 @@ ru: notice_parent_item_not_found: "Родительский элемент не найден." notice_project_not_deleted: "Проект удалён не был." notice_project_not_found: "Проект не найден." - notice_smtp_address_unsafe: "SMTP address %{address} is not safe. Please add it to OPENPROJECT_SSRF_PROTECTION_ALLOWLIST." + notice_smtp_address_unsafe: "SMTP-адрес %{address} небезопасен. Пожалуйста, добавьте его в список OPENPROJECT_SSRF_PROTECTION_ALLOWLIST." notice_successful_connection: "Подключение выполнено." notice_successful_create: "Создание выполнено." notice_successful_delete: "Удаление выполнено." @@ -5271,7 +5271,7 @@ ru: text_change_disabled_for_provider_login: "Это имя и адрес электронной почты заданы вашим поставщиком авторизации, поэтому их нельзя изменить." unlock: "Разблокировать" unlock_and_reset_failed_logins: "Разблокировать и сбросить неудачные попытки входа" - error_cannot_delete_user: "User cannot be deleted" + error_cannot_delete_user: "Пользователь не может быть удален" version_status_closed: "закрыт" version_status_locked: "заблокировано" version_status_open: "открыт" diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index 6509e9c3740..bcfec3ccb22 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -1,4 +1,24 @@ ---- +#-- 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. +#++ uk: no_results_title_text: Немає що виводити на екран. activities: @@ -7,506 +27,418 @@ uk: work_packages: activity_tab: no_results_title_text: Немає дій - no_results_description_text: Виберіть "Показати все", щоб показати всі дії - і коментарі - label_activity_show_all: Показати все - label_activity_show_only_comments: Показувати лише коментарі - label_activity_show_only_changes: Показувати лише зміни - label_sort_asc: Найновіші внизу - label_sort_desc: Найновіші вгорі - label_type_to_comment: Додайте коментар. Введіть @, щоб сповістити людину. - label_submit_comment: Надіслати коментар + no_results_description_text: 'Виберіть "Показати все", щоб показати всі дії і коментарі' + label_activity_show_all: "Показати все" + label_activity_show_only_comments: "Показувати лише коментарі" + label_activity_show_only_changes: "Показувати лише зміни" + label_sort_asc: "Найновіші внизу" + label_sort_desc: "Найновіші вгорі" + label_type_to_comment: "Додайте коментар. Введіть @, щоб сповістити людину." + label_submit_comment: "Надіслати коментар" label_who: Хто? - changed_on: змінено - created_on: створив(-ла) - changed: змінив(-ла) - created: створив(-ла) - commented: прокоментував(-ла) + changed_on: "змінено" + created_on: "створив(-ла)" + changed: "змінив(-ла)" + created: "створив(-ла)" + commented: "прокоментував(-ла)" internal_comment: Внутрішній коментар internal_journal: Внутрішні коментарі видимі для визначеної групи учасників. - unsaved_changes_confirmation_message: У вас є незбережені зміни. Справді закрити - редактор? + unsaved_changes_confirmation_message: У вас є незбережені зміни. Справді закрити редактор? internal_comment_confirmation: - title: Зробити цей коментар загальнодоступним? - heading: Зробити цей коментар загальнодоступним? - description: Ваш коментар буде видимий усім, хто має доступ до цього пакета - робіт. Продовжити? - confirm_button_text: Зробити загальнодоступним + title: "Зробити цей коментар загальнодоступним?" + heading: "Зробити цей коментар загальнодоступним?" + description: "Ваш коментар буде видимий усім, хто має доступ до цього пакета робіт. Продовжити?" + confirm_button_text: "Зробити загальнодоступним" admin: plugins: no_results_title_text: Зараз немає встановлених плагінів. - no_results_content_text: Щоб дізнатися більше, ознайомтеся з нашою сторінкою - інтеграцій і планів. + no_results_content_text: Щоб дізнатися більше, ознайомтеся з нашою сторінкою інтеграцій і планів. custom_styles: - color_theme: Колірна тема + color_theme: "Колірна тема" color_theme_custom: "(Власний)" - tab_interface: Інтерфейс - tab_branding: Брендування - tab_pdf_export_styles: Стилі експорту PDF - tab_pdf_export_font: Шрифт для експорту в PDF + tab_interface: "Інтерфейс" + tab_branding: "Брендування" + tab_pdf_export_styles: "Стилі експорту PDF" + tab_pdf_export_font: "Шрифт для експорту в PDF" fonts: - file_too_large: завеликий (максимальний розмір – %{count} МБ). - file_is_invalid: не є дійсним файлом шрифту TTF. + file_too_large: "завеликий (максимальний розмір – %{count} МБ)." + file_is_invalid: "не є дійсним файлом шрифту TTF." colors: - primary-button-color: Основна кнопка - accent-color: Акцент - header-bg-color: Фон заголовка - main-menu-bg-color: Фон головного меню - main-menu-bg-selected-background: Головне меню в разі вибору - custom_colors: Кольори за власними вподобаннями - manage_colors: Редагувати параметри вибору кольору + primary-button-color: "Основна кнопка" + accent-color: "Акцент" + header-bg-color: "Фон заголовка" + main-menu-bg-color: "Фон головного меню" + main-menu-bg-selected-background: "Головне меню в разі вибору" + custom_colors: "Кольори за власними вподобаннями" + manage_colors: "Редагувати параметри вибору кольору" instructions: - primary-button-color: Насичений акцентний колір використовується для більшості - важливих кнопок на екрані. - accent-color: Колір для посилань та інших елементів, які має бути виділено. - main-menu-bg-color: Колір фону меню зліва. - theme_warning: Змінення теми перезапише ваш власний стиль. У такому разі дизайн - буде втрачено. Справді продовжити? + primary-button-color: "Насичений акцентний колір використовується для більшості важливих кнопок на екрані." + accent-color: "Колір для посилань та інших елементів, які має бути виділено." + main-menu-bg-color: "Колір фону меню зліва." + theme_warning: Змінення теми перезапише ваш власний стиль. У такому разі дизайн буде втрачено. Справді продовжити? enterprise: delete_dialog: - title: Вилучити корпоративний маркер - heading: Вилучити цей корпоративний маркер? - confirmation: Справді видалити цей маркер підтримки версії Enterprise? + title: "Вилучити корпоративний маркер" + heading: "Вилучити цей корпоративний маркер?" + confirmation: "Справді видалити цей маркер підтримки версії Enterprise?" create_dialog: - title: Додати маркер Enterprise - type_token_text: Текст вашого маркера Enterprise - token_placeholder: Вставте тут свій маркер підтримки версії Enterprise - token_caption: Щоб дізнатися більше про те, як активувати версію Enterprise, - перегляньте [документацію](docs_url). - add_token: Додати маркер підтримки версії Enterprise - replace_token: Замініть поточний маркер підтримки - order: Замовте локальну версію Enterprise - paste: Вставте свій маркер підтримки версії Enterprise - required_for_feature: Це доповнення доступне лише з активним маркером підтримки - версії Enterprise. - enterprise_link: Для отримання додаткової інформації натисніть тут. - start_trial: Розпочати безкоштовну пробну версію - book_now: Забронювати зараз - get_quote: Дізнатися ціну + title: "Додати маркер Enterprise" + type_token_text: "Текст вашого маркера Enterprise" + token_placeholder: "Вставте тут свій маркер підтримки версії Enterprise" + token_caption: "Щоб дізнатися більше про те, як активувати версію Enterprise, перегляньте [документацію](docs_url)." + add_token: "Додати маркер підтримки версії Enterprise" + replace_token: "Замініть поточний маркер підтримки" + order: "Замовте локальну версію Enterprise" + paste: "Вставте свій маркер підтримки версії Enterprise" + required_for_feature: "Це доповнення доступне лише з активним маркером підтримки версії Enterprise." + enterprise_link: "Для отримання додаткової інформації натисніть тут." + start_trial: "Розпочати безкоштовну пробну версію" + book_now: "Забронювати зараз" + get_quote: "Дізнатися ціну" buttons: - upgrade: Оновити зараз - contact: Зв’яжіться з нами, щоб отримати демоверсію + upgrade: "Оновити зараз" + contact: "Зв’яжіться з нами, щоб отримати демоверсію" status: - expired: Термін дії минув - expiring_soon: Термін дії незабаром мине - in_grace_period: У пільговому періоді - invalid_domain: Недійсний домен - not_active: Неактивний - trial: Пробний період + expired: "Термін дії минув" + expiring_soon: "Термін дії незабаром мине" + in_grace_period: "У пільговому періоді" + invalid_domain: "Недійсний домен" + not_active: "Неактивний" + trial: "Пробний період" jemalloc_allocator: Розподіл пам'яті Jemalloc journal_aggregation: explanation: - text: Окремі дії користувача (напр., оновлення робочого пакета двічі) зводяться - в одну дію, якщо відмінність у часі між ними менша за вказаний проміжок - часу. Їх буде виведено як окремі дії в межах додатка. Крім того, це призведе - до затримки сповіщень на такий самий проміжок часу, що зменшить кількість - електронних листів, які надсилатимуться, а також вплине на затримку %{webhook_link}. - link: вебгука + text: "Окремі дії користувача (напр., оновлення робочого пакета двічі) зводяться в одну дію, якщо відмінність у часі між ними менша за вказаний проміжок часу. Їх буде виведено як окремі дії в межах додатка. Крім того, це призведе до затримки сповіщень на такий самий проміжок часу, що зменшить кількість електронних листів, які надсилатимуться, а також вплине на затримку %{webhook_link}." + link: "вебгука" import: - title: Iмпорт + title: "Iмпорт" jira: - title: Імпорт із Jira - description: Використовуйте цей інструмент для імпорту даних зі свого екземпляра - Jira. Ви можете налаштувати кілька хостів Jira й вибрати, що імпортувати в - кожному циклі імпорту. + title: "Імпорт із Jira" + description: "Використовуйте цей інструмент для імпорту даних зі свого екземпляра Jira. Ви можете налаштувати кілька хостів Jira й вибрати, що імпортувати в кожному циклі імпорту." errors: - cannot_delete_with_imports: Не вдається видалити хост Jira з наявними процесами - імпорту + cannot_delete_with_imports: "Не вдається видалити хост Jira з наявними процесами імпорту" blank: - title: Ще немає налаштованих хостів Jira - description: Налаштуйте хост Jira, щоб почати імпорт елементів із Jira в цей - екземпляр OpenProject. + title: "Ще немає налаштованих хостів Jira" + description: "Налаштуйте хост Jira, щоб почати імпорт елементів із Jira в цей екземпляр OpenProject." configuration: - title: Конфігурація Jira - new: Нова конфігурація + title: "Конфігурація Jira" + new: "Нова конфігурація" banner: - title: Обмежений імпорт - description: 'Цей інструмент зараз доступний лише як бета-версія і може імпортувати - тільки основні дані: проєкти, задачі (назву, заголовок, опис, вкладення), - користувачів (ім’я, електронну адресу, дані про участь у проєктах), статуси - й типи. Він не може імпортувати робочі процеси, користувацькі поля, зв’язки - між задачами чи дозволи. Зараз ми підтримуємо лише версії Jira Server / - Data Center 10.x і 11.x. Хмарні екземпляри поки що не підтримуються.' + title: "Обмежений імпорт" + description: "Цей інструмент зараз доступний лише як бета-версія і може імпортувати тільки основні дані: проєкти, задачі (назву, заголовок, опис, вкладення), користувачів (ім’я, електронну адресу, дані про участь у проєктах), статуси й типи. Він не може імпортувати робочі процеси, користувацькі поля, зв’язки між задачами чи дозволи. Зараз ми підтримуємо лише версії Jira Server / Data Center 10.x і 11.x. Хмарні екземпляри поки що не підтримуються." form: fields: - name: Назва - url: URL-адреса Jira Server / Data Center - personal_access_token: Персональний маркер доступу - button_add: Додати конфігурацію - button_save: Зберегти конфігурацію - button_test: Перевірити конфігурацію - button_delete_token: Видалити маркер - delete_token_confirm: Справді видалити маркер? З’єднання з Jira буде розірвано. - label_testing: Перевірка конфігурації… - token_deleted: Маркер успішно видалено. + name: "Назва" + url: "URL-адреса Jira Server / Data Center" + personal_access_token: "Персональний маркер доступу" + button_add: "Додати конфігурацію" + button_save: "Зберегти конфігурацію" + button_test: "Перевірити конфігурацію" + button_delete_token: "Видалити маркер" + delete_token_confirm: "Справді видалити маркер? З’єднання з Jira буде розірвано." + label_testing: "Перевірка конфігурації…" + token_deleted: "Маркер успішно видалено." test: - success: Встановлено з’єднання із сервером %{server} (версії %{version}) - failed: 'З’єднання не встановлено: не вдалось отримати інформацію про сервер' - error: Під час перевірки з’єднання сталася неочікувана помилка - connection_error: 'Помилка з’єднання: %{message}' - parse_error: Не вдалося проаналізувати відповідь сервера. Можливо, він не - є дійсним екземпляром Jira. - api_error: Інтерфейс Jira API повернув статус помилки «%{status}». Перевірте - URL-адресу свого екземпляра Jira й маркер API. - token_error: Недійсний маркер API. Перевірте облікові дані, що використовуються - в конфігурації. - missing_credentials: Укажіть URL-адресу й персональний маркер доступу для - перевірки з’єднання - invalid_url: Укажіть дійсну URL-адресу + success: "Встановлено з’єднання із сервером %{server} (версії %{version})" + failed: "З’єднання не встановлено: не вдалось отримати інформацію про сервер" + error: "Під час перевірки з’єднання сталася неочікувана помилка" + connection_error: "Помилка з’єднання: %{message}" + parse_error: "Не вдалося проаналізувати відповідь сервера. Можливо, він не є дійсним екземпляром Jira." + api_error: "Інтерфейс Jira API повернув статус помилки «%{status}». Перевірте URL-адресу свого екземпляра Jira й маркер API." + token_error: "Недійсний маркер API. Перевірте облікові дані, що використовуються в конфігурації." + missing_credentials: "Укажіть URL-адресу й персональний маркер доступу для перевірки з’єднання" + invalid_url: "Укажіть дійсну URL-адресу" client: - connection_error: 'Не вдалося під’єднатися до сервера Jira: %{message}' - connection_timeout: 'Час очікування на встановлення з’єднання до сервера Jira - минув: %{message}' - parse_error: 'Не вдалося проаналізувати відповідь Jira API: %{message}' - api_error: Інтерфейс Jira API повернув статус помилки «%{status}» + connection_error: "Не вдалося під’єднатися до сервера Jira: %{message}" + connection_timeout: "Час очікування на встановлення з’єднання до сервера Jira минув: %{message}" + parse_error: "Не вдалося проаналізувати відповідь Jira API: %{message}" + api_error: "Інтерфейс Jira API повернув статус помилки «%{status}»" columns: - projects: Проєкти - last_change: Остання зміна - added: Додано + projects: "Проєкти" + last_change: "Остання зміна" + added: "Додано" label_ago: "%{amount} тому" run: - title: Цикл імпорту - history: Історія - remove_error: Імпорт Jira не можна видалити, поки він виконується - import_blocked_error: Зараз виконується або очікує на перевірку ще один цикл - імпорту Jira. Завершіть або скасуйте його, якщо потрібно почати новий імпорт. + title: "Цикл імпорту" + history: "Історія" + remove_error: "Імпорт Jira не можна видалити, поки він виконується" + import_blocked_error: "Зараз виконується або очікує на перевірку ще один цикл імпорту Jira. Завершіть або скасуйте його, якщо потрібно почати новий імпорт." blank: - title: Немає налаштованих циклів імпорту - description: Створіть цикл імпорту, щоб почати переносити інформацію із - цього екземпляра Jira + title: "Немає налаштованих циклів імпорту" + description: "Створіть цикл імпорту, щоб почати переносити інформацію із цього екземпляра Jira" index: - description: Ви можете переносити різні набори даних у різних циклах імпорту. - Цикл імпорту можна скасувати відразу після виконання в режимі перевірки, - але не після завершення. - button_import_run: Цикл імпорту - button_edit_configuration: Змінити конфігурацію + description: "Ви можете переносити різні набори даних у різних циклах імпорту. Цикл імпорту можна скасувати відразу після виконання в режимі перевірки, але не після завершення." + button_import_run: "Цикл імпорту" + button_edit_configuration: "Змінити конфігурацію" status: - initial: Початок - instance_meta_fetching: Отримання метаданих - instance_meta_error: Не вдалось отримати метадані - instance_meta_done: Метадані отримано - import_scope: Select scope - configuring: Вибір обсягу - projects_meta_fetching: Отримання даних про проєкт - projects_meta_error: Не вдалось отримати дані про проєкт - projects_meta_done: Дані зібрано - importing: Виконання - import_error: Помилка під час імпорту - imported: Режим перевірки - reverting: Скасування внесених змін - revert_error: Помилка під час скасування внесених змін - revert_cancelling: Cancelling revert - revert_cancelled: Revert cancelled - reverted: Внесені зміни скасовано - finalizing: Finalizing - finalizing_error: Error during finalizing - finalizing_done: Completed + initial: "Початок" + instance_meta_fetching: "Отримання метаданих" + instance_meta_error: "Не вдалось отримати метадані" + instance_meta_done: "Метадані отримано" + import_scope: "Select scope" + configuring: "Вибір обсягу" + projects_meta_fetching: "Отримання даних про проєкт" + projects_meta_error: "Не вдалось отримати дані про проєкт" + projects_meta_done: "Дані зібрано" + importing: "Виконання" + import_error: "Помилка під час імпорту" + imported: "Режим перевірки" + reverting: "Скасування внесених змін" + revert_error: "Помилка під час скасування внесених змін" + revert_cancelling: "Cancelling revert" + revert_cancelled: "Revert cancelled" + reverted: "Внесені зміни скасовано" + finalizing: "Finalizing" + finalizing_error: "Error during finalizing" + finalizing_done: "Completed" wizard: - button_retry: Повторити спробу + button_retry: "Повторити спробу" parts: projects: - one: 1 проєкт + one: "1 проєкт" few: "%{count} проєкти" many: "%{count} проєктів" other: "%{count} проєкту" issues: - one: 1 задача + one: "1 задача" few: "%{count} задачі" many: "%{count} задач" other: "%{count} задачі" work_packages: - one: 1 пакет робіт + one: "1 пакет робіт" few: "%{count} пакети робіт" many: "%{count} пакетів робіт" other: "%{count} пакета робіт" types: - one: 1 тип + one: "1 тип" few: "%{count} типи" many: "%{count} типів" other: "%{count} типу" statuses: - one: 1 статус + one: "1 статус" few: "%{count} статуси" many: "%{count} статусів" other: "%{count} статусу" users: - one: 1 користувач + one: "1 користувач" few: "%{count} користувачі" many: "%{count} користувачів" other: "%{count} користувача" groups: fetch: - title: Отримайте базові дані + title: "Отримайте базові дані" groups_and_users: - title: Групи й користувачі + title: "Групи й користувачі" configuration: - title: Налаштуйте імпорт + title: "Налаштуйте імпорт" confirming: - title: Підтвердьте й імпортуйте + title: "Підтвердьте й імпортуйте" review: - title: Перевірте імпорт + title: "Перевірте імпорт" sections: fetch_data: - title: Отримайте метадані екземпляра - caption_done: Завершено - description: Перевірте, які дані доступні для імпорту в хост-екземплярі - Jira. - button_fetch: Переглянути доступні дані - label_progress: Отримання даних із Jira… + title: "Отримайте метадані екземпляра" + caption_done: "Завершено" + description: "Перевірте, які дані доступні для імпорту в хост-екземплярі Jira." + button_fetch: "Переглянути доступні дані" + label_progress: "Отримання даних із Jira…" groups_and_users: - title: Групи й користувачі + title: "Групи й користувачі" import_scope: - title: Обсяг імпорту - caption: Виберіть вміст, який потрібно імпортувати в OpenProject - caption_done: Завершено - label_info: 'Зверніть увагу: цей інструмент доступний лише в бета-версії - і не може імпортувати всі типи даних. Ось короткий опис вмісту, доступного - для імпорту в хост-екземплярі Jira, а також даних, які інструмент - може перенести прямо зараз.' - description: Виберіть дані, які потрібно імпортувати з доступного вмісту, - отриманого з хост-екземпляра Jira. - label_available_data: Доступні дані - label_not_available_data: Недоступно для імпорту - button_select_projects: Виберіть проєкти для імпорту - button_continue: Продовжити - label_import: Виберіть проєкти, які ви хочете імпортувати. - button_select: Вибрати проєкти - label_selected_data: Дані, вибрані для імпорту - label_progress: Отримання даних із Jira… + title: "Обсяг імпорту" + caption: "Виберіть вміст, який потрібно імпортувати в OpenProject" + caption_done: "Завершено" + label_info: "Зверніть увагу: цей інструмент доступний лише в бета-версії і не може імпортувати всі типи даних. Ось короткий опис вмісту, доступного для імпорту в хост-екземплярі Jira, а також даних, які інструмент може перенести прямо зараз." + description: "Виберіть дані, які потрібно імпортувати з доступного вмісту, отриманого з хост-екземпляра Jira." + label_available_data: "Доступні дані" + label_not_available_data: "Недоступно для імпорту" + button_select_projects: "Виберіть проєкти для імпорту" + button_continue: "Продовжити" + label_import: "Виберіть проєкти, які ви хочете імпортувати." + button_select: "Вибрати проєкти" + label_selected_data: "Дані, вибрані для імпорту" + label_progress: "Отримання даних із Jira…" elements: - relations: Зв’язки між задачами - workflows: Робочі процеси на рівні проєктів - users: Користувачі - sprints: Спринти - schemes: Схеми - permissions: Дозволи для користувачів, груп і проєктів + relations: "Зв’язки між задачами" + workflows: "Робочі процеси на рівні проєктів" + users: "Користувачі" + sprints: "Спринти" + schemes: "Схеми" + permissions: "Дозволи для користувачів, груп і проєктів" confirm_import: - title: Імпортуйте дані - caption: Перегляньте налаштування імпорту й запустіть його - caption_done: Завершено - label_available_data: Дані, доступні для імпорту - button_start: Почати імпорт - description: Ви збираєтеся запустити імпорт із наведеними далі налаштуваннями. - label_progress: Виконується імпорт… - label_import_data: Зараз імпортується + title: "Імпортуйте дані" + caption: "Перегляньте налаштування імпорту й запустіть його" + caption_done: "Завершено" + label_available_data: "Дані, доступні для імпорту" + button_start: "Почати імпорт" + description: "Ви збираєтеся запустити імпорт із наведеними далі налаштуваннями." + label_progress: "Виконується імпорт…" + label_import_data: "Зараз імпортується" import_result: - title: Результати циклу імпорту - caption: Перегляньте дані про цикл імпорту або скасуйте внесені зміни - info: Циклу імпорту успішно виконано. - label_results: Імпортовано - label_revert: Скасувати імпорт - button_revert: Скасувати імпорт - button_done: Завершити імпорт - preview_description: Імпортовані дані зараз перебувають у режимі перевірки. - Натисніть «Завершити імпорт», щоб застосувати зміни, або «Скасувати - імпорт», щоб скасувати всі зміни, внесені під час цього циклу. - label_revert_progress: Скасування імпорту… - label_reverted: Імпорт скасовано. - label_finalize_import: Finalize import - label_finalizing: Finalizing import... - label_finalizing_done: Import finalized. + title: "Результати циклу імпорту" + caption: "Перегляньте дані про цикл імпорту або скасуйте внесені зміни" + info: "Циклу імпорту успішно виконано." + label_results: "Імпортовано" + label_revert: "Скасувати імпорт" + button_revert: "Скасувати імпорт" + button_done: "Завершити імпорт" + preview_description: 'Імпортовані дані зараз перебувають у режимі перевірки. Натисніть «Завершити імпорт», щоб застосувати зміни, або «Скасувати імпорт», щоб скасувати всі зміни, внесені під час цього циклу.' + label_finalize_import: "Finalize import" + label_finalizing: "Finalizing import..." + label_finalizing_done: "Import finalized." + label_revert_progress: "Скасування імпорту…" + label_reverted: "Імпорт скасовано." select_dialog: - filter_projects: Фільтрування за текстом + filter_projects: "Фільтрування за текстом" import_dialog: - title: Почати цей імпорт? - confirm_button: Почати імпорт - description: 'Цей модуль імпорту є альфа-функцією. Він ще не може імпортувати - всі дані з Jira, тому в результаті в екземплярі OpenProject можуть бути - неповні дані. Не використовуйте середовище для експлуатації і створіть - резервну копію даних OpenProject, перш ніж починати роботу із цією функцією. - - ' - confirm: Я розумію; відповідну підготовку виконано + title: "Почати цей імпорт?" + confirm_button: "Почати імпорт" + description: > + Цей модуль імпорту є альфа-функцією. Він ще не може імпортувати всі дані з Jira, тому в результаті в екземплярі OpenProject можуть бути неповні дані. Не використовуйте середовище для експлуатації і створіть резервну копію даних OpenProject, перш ніж починати роботу із цією функцією. + confirm: "Я розумію; відповідну підготовку виконано" revert_dialog: - title: Остаточно скасувати цей імпорт? - description: Буде видалено всі імпортовані об’єкти (зокрема цілі проєкти), - навіть якщо користувачі виконували з ними дії в OpenProject після імпорту. - confirm: Я розумію, що скасування внесених змін призведе до остаточного - видалення даних + title: "Остаточно скасувати цей імпорт?" + description: "Буде видалено всі імпортовані об’єкти (зокрема цілі проєкти), навіть якщо користувачі виконували з ними дії в OpenProject після імпорту." + confirm: "Я розумію, що скасування внесених змін призведе до остаточного видалення даних" finalize_dialog: - title: Завершити цей імпорт? - description: Якщо ви завершите цей імпорт, то більше не зможете його скасувати. - Усі імпортовані дані буде остаточно збережено в системі. - confirm: Я розумію, що цю дію не можна відмінити - confirm_button: Зрозуміло + title: "Завершити цей імпорт?" + description: "Якщо ви завершите цей імпорт, то більше не зможете його скасувати. Усі імпортовані дані буде остаточно збережено в системі." + confirm: "Я розумію, що цю дію не можна відмінити" + confirm_button: "Зрозуміло" select_projects: - title: Виберіть проєкти + title: "Виберіть проєкти" mcp_configurations: index: - description: Протокол контексту моделі дає змогу агентам ШІ надавати користувачам - інструменти й ресурси, доступні в цьому екземплярі OpenProject. Ця функція - досі доступна лише в бета-версії. - resources_heading: Ресурси - resources_description: OpenProject реалізує наведені нижче ресурси. Кожен - із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися - більше, ознайомтеся з [документацією щодо ресурсів MCP](docs_url). - resources_submit: Оновити ресурси - tools_heading: Інструменти - tools_description: OpenProject реалізує наведені нижче інструменти. Кожен - із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися - більше, ознайомтеся з [документацією щодо інструментів MCP] (docs_url). - tools_submit: Оновити інструменти + description: "Протокол контексту моделі дає змогу агентам ШІ надавати користувачам інструменти й ресурси, доступні в цьому екземплярі OpenProject. Ця функція досі доступна лише в бета-версії." + resources_heading: "Ресурси" + resources_description: "OpenProject реалізує наведені нижче ресурси. Кожен із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися більше, ознайомтеся з [документацією щодо ресурсів MCP](docs_url)." + resources_submit: "Оновити ресурси" + tools_heading: "Інструменти" + tools_description: "OpenProject реалізує наведені нижче інструменти. Кожен із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися більше, ознайомтеся з [документацією щодо інструментів MCP] (docs_url)." + tools_submit: "Оновити інструменти" multi_update: - success: Конфігурації MCP оновлено. + success: "Конфігурації MCP оновлено." server_form: - description_caption: Опис сервера MCP для інших додатків, які підключаються - до нього. - title_caption: Короткий заголовок, який відображається для додатків, що підключаються - до сервера MCP. - tool_response_format: Формат відповіді інструмента - tool_response_format_content_only_label: Лише звичайний вміст - tool_response_format_content_only_caption: 'Виберіть цей варіант, якщо клієнти - MCP, які підключаються до цього екземпляра, не підтримують структурований - вміст. У відповідях інструмента буде лише звичайний текстовий вміст, і вони - не включатимуть структуровану версію. - - ' - tool_response_format_full_label: Увесь вміст - tool_response_format_full_caption: 'Цей варіант забезпечує найкращу сумісність. - Відповіді інструмента включатимуть як звичайний, так і структурований вміст, - що дозволить клієнтам MCP вибирати, який формат читати. Це може збільшити - кількість токенів, які має обробити мовна модель, що, імовірно, призведе - до зростання витрат і зниження продуктивності. - - ' - tool_response_format_structured_only_label: Лише структурований вміст - tool_response_format_structured_only_caption: 'Виберіть цей варіант, якщо - ви впевнені, що клієнти MCP, які підключаються до цього екземпляра, підтримують - структурований вміст. У відповідях інструмента буде лише структурований - вміст, і вони не включатимуть його текстове представлення. - - ' + description_caption: "Опис сервера MCP для інших додатків, які підключаються до нього." + title_caption: "Короткий заголовок, який відображається для додатків, що підключаються до сервера MCP." + tool_response_format: "Формат відповіді інструмента" + tool_response_format_content_only_label: "Лише звичайний вміст" + tool_response_format_content_only_caption: > + Виберіть цей варіант, якщо клієнти MCP, які підключаються до цього екземпляра, не підтримують структурований вміст. У відповідях інструмента буде лише звичайний текстовий вміст, і вони не включатимуть структуровану версію. + tool_response_format_full_label: "Увесь вміст" + tool_response_format_full_caption: > + Цей варіант забезпечує найкращу сумісність. Відповіді інструмента включатимуть як звичайний, так і структурований вміст, що дозволить клієнтам MCP вибирати, який формат читати. Це може збільшити кількість токенів, які має обробити мовна модель, що, імовірно, призведе до зростання витрат і зниження продуктивності. + tool_response_format_structured_only_label: "Лише структурований вміст" + tool_response_format_structured_only_caption: > + Виберіть цей варіант, якщо ви впевнені, що клієнти MCP, які підключаються до цього екземпляра, підтримують структурований вміст. У відповідях інструмента буде лише структурований вміст, і вони не включатимуть його текстове представлення. update: - failure: Не вдалось оновити конфігурацію MCP. - success: Конфігурацію MCP оновлено. + failure: "Не вдалось оновити конфігурацію MCP." + success: "Конфігурацію MCP оновлено." scim_clients: authentication_methods: - sso: JWT від постачальника ідентифікаційних даних - oauth2_client: Облікові дані клієнта OAuth 2.0 - oauth2_token: Постійний маркер доступу + sso: "JWT від постачальника ідентифікаційних даних" + oauth2_client: "Облікові дані клієнта OAuth 2.0" + oauth2_token: "Постійний маркер доступу" created_client_credentials_dialog_component: - title: Облікові дані клієнта створено - heading: Облікові дані клієнта згенеровано - one_time_hint: Це єдиний раз, коли ви побачите секретний ключ клієнта. Обов’язково - скопіюйте його зараз. + title: "Облікові дані клієнта створено" + heading: "Облікові дані клієнта згенеровано" + one_time_hint: "Це єдиний раз, коли ви побачите секретний ключ клієнта. Обов’язково скопіюйте його зараз." created_token_dialog_component: - title: Маркер створено - heading: Маркер згенеровано - label_token: Маркер - one_time_hint: Це єдиний раз, коли ви побачите цей маркер. Обов’язково скопіюйте - його зараз. + title: "Маркер створено" + heading: "Маркер згенеровано" + label_token: "Маркер" + one_time_hint: "Це єдиний раз, коли ви побачите цей маркер. Обов’язково скопіюйте його зараз." delete_scim_client_dialog_component: - title: Видалити клієнт SCIM - heading: Ви дійсно хочете видалити цей клієнт SCIM? - description: Цей клієнт SCIM більше не може оновлювати користувачів, якими - керує. + title: "Видалити клієнт SCIM" + heading: "Ви дійсно хочете видалити цей клієнт SCIM?" + description: "Цей клієнт SCIM більше не може оновлювати користувачів, якими керує." edit: - label_delete_scim_client: Видалити клієнт SCIM + label_delete_scim_client: "Видалити клієнт SCIM" form: - auth_provider_description: Це сервіс, який користувачі, додані SCIM-постачальником, - будуть використовувати для автентифікації в OpenProject. - authentication_method_description_html: Ось так клієнт SCIM автентифікується - в OpenProject. Переконайтеся, що маркери OAuth включають область scim_v2. - description: Щоб отримати додаткову інформацію про ці варіанти конфігурації, - перегляньте [документацію щодо налаштування клієнтів SCIM](docs_url). - jwt_sub_description: Наприклад, для Keycloak це UUID пов’язаного з клієнтом - SCIM облікового запису сервісу. Інформацію про те, як знайти тему для свого - варіанту використання, наведено в [документації](docs_url). - name_description: Виберіть ім’я, яке допоможе іншим адміністраторам чітко - зрозуміти, навіщо налаштовано цей клієнт. + auth_provider_description: "Це сервіс, який користувачі, додані SCIM-постачальником, будуть використовувати для автентифікації в OpenProject." + authentication_method_description_html: "Ось так клієнт SCIM автентифікується в OpenProject. Переконайтеся, що маркери OAuth включають область scim_v2." + description: "Щоб отримати додаткову інформацію про ці варіанти конфігурації, перегляньте [документацію щодо налаштування клієнтів SCIM](docs_url)." + jwt_sub_description: "Наприклад, для Keycloak це UUID пов’язаного з клієнтом SCIM облікового запису сервісу. Інформацію про те, як знайти тему для свого варіанту використання, наведено в [документації](docs_url)." + name_description: "Виберіть ім’я, яке допоможе іншим адміністраторам чітко зрозуміти, навіщо налаштовано цей клієнт." index: - description: Клієнти SCIM, налаштовані тут, можуть взаємодіяти з API сервера - SCIM в OpenProject, щоб надавати, оновлювати й видаляти облікові записи - й групи. - label_create_button: Додати клієнт SCIM + description: "Клієнти SCIM, налаштовані тут, можуть взаємодіяти з API сервера SCIM в OpenProject, щоб надавати, оновлювати й видаляти облікові записи й групи." + label_create_button: "Додати клієнт SCIM" new: - title: Новий клієнт SCIM + title: "Новий клієнт SCIM" revoke_static_token_dialog_component: - confirm_button: Анулювати - title: Анулювати статичний маркер - heading: Ви дійсно хочете анулювати цей маркер? - description: Клієнт SCIM, який використовує цей маркер, більше не зможе отримати - доступ до API сервера SCIM в OpenProject. + confirm_button: "Анулювати" + title: "Анулювати статичний маркер" + heading: "Ви дійсно хочете анулювати цей маркер?" + description: "Клієнт SCIM, який використовує цей маркер, більше не зможе отримати доступ до API сервера SCIM в OpenProject." table_component: blank_slate: - title: Ще немає налаштованих клієнтів SCIM - description: Додайте клієнтів, щоб побачити їх тут - user_count: Користувачі + title: "Ще немає налаштованих клієнтів SCIM" + description: "Додайте клієнтів, щоб побачити їх тут" + user_count: "Користувачі" token_list_component: - description: Клієнт SCIM може передавати маркери, які ви генеруєте тут, для - доступу до API сервера SCIM в OpenProject. - heading: Маркери - label_add_token: Маркер - label_aria_add_token: Додати маркер + description: "Клієнт SCIM може передавати маркери, які ви генеруєте тут, для доступу до API сервера SCIM в OpenProject." + heading: "Маркери" + label_add_token: "Маркер" + label_aria_add_token: "Додати маркер" token_table_component: blank_slate: - title: Ще не створено жодного маркера - description: Його можна створити прямо зараз - expired: Термін дії минув %{date} - revoked: Анульовано %{date} - title: Таблиця маркерів доступу + title: "Ще не створено жодного маркера" + description: "Його можна створити прямо зараз" + expired: "Термін дії минув %{date}" + revoked: "Анульовано %{date}" + title: "Таблиця маркерів доступу" settings: new_project: - project_creation: Створення проєкту - notification_text_default: "

Вітаємо,

Новий проєкт створено: projectValue:name

-

Дякуємо

\n" + project_creation: "Створення проєкту" + notification_text_default: > +

Вітаємо,

Новий проєкт створено: projectValue:name

Дякуємо

workflows: tabs: - default_transitions: Стандартні переходи - user_author: Користувач є автором - user_assignee: Користувач є призначеною особою + default_transitions: "Стандартні переходи" + user_author: "Користувач є автором" + user_assignee: "Користувач є призначеною особою" authentication: - login_and_registration: Вхід і реєстрація + login_and_registration: "Вхід і реєстрація" announcements: show_until: Показувати до is_active: наразі відображається is_inactive: наразі не відображається antivirus_scan: - not_processed_yet_message: Завантаження заблоковано, оскільки файл ще не перевірено - на віруси. Повторіть спробу пізніше. - quarantined_message: У файлі «%{filename}» виявлено вірус. Файл перенесено в карантин, - і його не можна завантажити. - deleted_message: У файлі «%{filename}» виявлено вірус. Файл видалено. - deleted_by_admin: Файл «%{filename}», перенесений у карантин, видалено адміністратором. - overridden_by_admin: Файл «%{filename}», перенесений у карантин, вилучено користувачем - %{user}. Доступ до файлу відновлено. + not_processed_yet_message: "Завантаження заблоковано, оскільки файл ще не перевірено на віруси. Повторіть спробу пізніше." + quarantined_message: "У файлі «%{filename}» виявлено вірус. Файл перенесено в карантин, і його не можна завантажити." + deleted_message: "У файлі «%{filename}» виявлено вірус. Файл видалено." + deleted_by_admin: "Файл «%{filename}», перенесений у карантин, видалено адміністратором." + overridden_by_admin: "Файл «%{filename}», перенесений у карантин, вилучено користувачем %{user}. Доступ до файлу відновлено." quarantined_attachments: - container: Контейнер - delete: Видалити файл на карантині - title: Вкладення на карантині - error_cannot_act_self: Неможливо виконати дії з файлами, вивантаженими вами. + container: "Контейнер" + delete: "Видалити файл на карантині" + title: "Вкладення на карантині" + error_cannot_act_self: "Неможливо виконати дії з файлами, вивантаженими вами." attribute_help_texts: - caption: Ця коротка версія буде показуватися як заголовок атрибута. - note_public: Будь-який текст і зображення, які ви додасте в це поле, будуть видимі - всім зареєстрованим користувачам. - text_overview: У цьому поданні можна створювати спеціальні тексти довідки для - перегляду атрибутів. Коли вони визначені, ці тексти можна показувати, натиснувши - піктограму довідки поруч з її атрибутом. - show_preview: Попередній перегляд тексту - add_new: Додати текст довідки - edit_field_name: Редагувати текст довідки для%{attribute_field_name} + caption: "Ця коротка версія буде показуватися як заголовок атрибута." + note_public: "Будь-який текст і зображення, які ви додасте в це поле, будуть видимі всім зареєстрованим користувачам." + text_overview: "У цьому поданні можна створювати спеціальні тексти довідки для перегляду атрибутів. Коли вони визначені, ці тексти можна показувати, натиснувши піктограму довідки поруч з її атрибутом." + show_preview: "Попередній перегляд тексту" + add_new: "Додати текст довідки" + edit_field_name: "Редагувати текст довідки для%{attribute_field_name}" background_jobs: status: - error_requeue: 'Виконується повторний запуск завдання, оскільки попередня спроба - завершилася такою помилкою: %{message}' - cancelled_due_to: 'Завдання скасовано через помилку: %{message}' + error_requeue: "Виконується повторний запуск завдання, оскільки попередня спроба завершилася такою помилкою: %{message}" + cancelled_due_to: "Завдання скасовано через помилку: %{message}" ldap_auth_sources: - ldap_error: 'LDAP-помилка: %{error_message}' - ldap_auth_failed: Не вдалося перевірити автентичність через LDAP-сервер. - sync_failed: 'Не вдалося виконати синхронізацію з LDAP: %{message}.' - back_to_index: Натисніть тут, щоб повернутися до списку підключень. + ldap_error: "LDAP-помилка: %{error_message}" + ldap_auth_failed: "Не вдалося перевірити автентичність через LDAP-сервер." + sync_failed: "Не вдалося виконати синхронізацію з LDAP: %{message}." + back_to_index: "Натисніть тут, щоб повернутися до списку підключень." technical_warning: | Для заповнення форми LDAP вам знадобляться технічні знання щодо конфігурації LDAP / Active Directory. [Докладні вказівки наведено в документації](docs_url). attribute_texts: name: Назва атрибута LDAP-підключення host: Назва хосту LDAP або IP-адреса - login_map: Ключ атрибута в LDAP, який використовується для ідентифікації унікального - входу користувача. Зазвичай це «uid» або «samAccountName». + login_map: Ключ атрибута в LDAP, який використовується для ідентифікації унікального входу користувача. Зазвичай це «uid» або «samAccountName». generic_map: Ключ атрибута в LDAP, зіставлений з атрибутом «%{attribute}» OpenProject - admin_map_html: Необов’язково. Ключ атрибута в LDAP, який, якщо є, - призначає користувача адміністратором OpenProject. Нічого не вказуйте, якщо - маєте сумніви. + admin_map_html: "Необов’язково. Ключ атрибута в LDAP, який, якщо є, призначає користувача адміністратором OpenProject. Нічого не вказуйте, якщо маєте сумніви." system_user_dn_html: | Введіть унікальне ім’я системного користувача, за допомогою якого можна отримати доступ лише для читання.
@@ -524,46 +456,30 @@ uk: onthefly_register: | Якщо встановити цей прапорець, OpenProject автоматично створюватиме нових користувачів на основі своїх записів LDAP під час їх першої автентифікації в OpenProject. Не встановлюйте його, щоб дозволити автентифікацію через LDAP лише наявним обліковим записам в OpenProject! - connection_encryption: Підключення шифрування - encryption_details: Параметри LDAPS / STARTTLS - system_account: Системний обліковий запис + connection_encryption: "Підключення шифрування" + encryption_details: "Параметри LDAPS / STARTTLS" + system_account: "Системний обліковий запис" system_account_legend: | OpenProject потрібен доступ лише для читання через системний обліковий запис, щоб шукати користувачів і групи у вашому LDAP-дереві. Укажіть облікові дані зв‘язування для цього системного користувача в наступному розділі. - ldap_details: Параметри LDAP - user_settings: Зіставлення атрибутів - user_settings_legend: 'Наведені нижче поля пов’язані з тим, як користувачі створюються - в OpenProject на основі записів LDAP і з тим, які атрибути LDAP використовуються - для визначення атрибутів користувача OpenProject (зіставлення атрибутів). - - ' + ldap_details: "Параметри LDAP" + user_settings: "Зіставлення атрибутів" + user_settings_legend: | + Наведені нижче поля пов’язані з тим, як користувачі створюються в OpenProject на основі записів LDAP і з тим, які атрибути LDAP використовуються для визначення атрибутів користувача OpenProject (зіставлення атрибутів). tls_mode: - plain: нічого - simple_tls: LDAPS - start_tls: STARTTLS - plain_description: Відкриває незахищене з’єднання із сервером LDAP. Не рекомендовано - використовувати для робочої версії. - simple_tls_description: Використовується LDAPS. Це вимагає окремого порту на - сервері LDAP. Цей режим часто вважається застарілим, тому радимо використовувати - STARTTLS, коли це можливо. - start_tls_description: Надсилає команду STARTTLS після підключення до стандартного - порту LDAP. Рекомендовано для зашифрованого з’єднання. - section_more_info_link_html: 'Цей розділ стосується безпеки підключення цього - джерела автентифікації LDAP. Для отримання додаткової інформації, вбудовуйте - the Net::LDAP documentation. - - ' + plain: "нічого" + simple_tls: "LDAPS" + start_tls: "STARTTLS" + plain_description: "Відкриває незахищене з’єднання із сервером LDAP. Не рекомендовано використовувати для робочої версії." + simple_tls_description: "Використовується LDAPS. Це вимагає окремого порту на сервері LDAP. Цей режим часто вважається застарілим, тому радимо використовувати STARTTLS, коли це можливо." + start_tls_description: "Надсилає команду STARTTLS після підключення до стандартного порту LDAP. Рекомендовано для зашифрованого з’єднання." + section_more_info_link_html: > + Цей розділ стосується безпеки підключення цього джерела автентифікації LDAP. Для отримання додаткової інформації, вбудовуйте the Net::LDAP documentation. tls_options: - verify_peer: Перевірити сертифікат SSL - verify_peer_description_html: 'Вмикає сувору перевірку SSL ланцюжка довірених - сертифікатів.
Увага! Якщо зняти цей прапорець, буде - вимкнено перевірку SSL сертифіката сервера LDAP. Через це ваше з’єднання може - стати вразливим до MITM-атак. - - ' - tls_certificate_description: Якщо сертифікат сервера LDAP не належить до надійних - джерел цієї системи, ви можете додати його вручну тут. Введіть рядок сертифіката - PEM X509. + verify_peer: "Перевірити сертифікат SSL" + verify_peer_description_html: > + Вмикає сувору перевірку SSL ланцюжка довірених сертифікатів.
Увага! Якщо зняти цей прапорець, буде вимкнено перевірку SSL сертифіката сервера LDAP. Через це ваше з’єднання може стати вразливим до MITM-атак. + tls_certificate_description: "Якщо сертифікат сервера LDAP не належить до надійних джерел цієї системи, ви можете додати його вручну тут. Введіть рядок сертифіката PEM X509." forums: show: no_results_title_text: На даний момент на форумі немає публікацій. @@ -571,89 +487,70 @@ uk: index: no_results_title_text: Наразі немає кольорів. no_results_content_text: Створіть новий колір - label_new_color: Новий колір + label_new_color: "Новий колір" new: - label_new_color: Новий колір + label_new_color: "Новий колір" edit: - label_edit_color: Редагувати колір + label_edit_color: "Редагувати колір" form: - label_new_color: Новий колір - label_edit_color: Редагувати колір - label_no_color: Без кольору - label_properties: Властивості - label_really_delete_color: 'Справді видалити цей колір? Типи, що використовують - його, не буде видалено. - - ' + label_new_color: "Новий колір" + label_edit_color: "Редагувати колір" + label_no_color: "Без кольору" + label_properties: "Властивості" + label_really_delete_color: > + Справді видалити цей колір? Типи, що використовують його, не буде видалено. custom_actions: actions: - name: Дії - add: Додати дію + name: "Дії" + add: "Додати дію" assigned_to: executing_user_value: "(Призначити виконавчому користувачеві)" - conditions: Умови - plural: Спеціальні дії - new: Нова спеціальна дія - edit: Редагувати спеціальну дію %{name} - execute: Виконати %{name} + conditions: "Умови" + plural: "Спеціальні дії" + new: "Нова спеціальна дія" + edit: "Редагувати спеціальну дію %{name}" + execute: "Виконати %{name}" custom_fields: admin: custom_field_projects: is_for_all_blank_slate: heading: Для всіх проєктів - description: Це користувацьке поле активовано в усіх проєктах, оскільки - встановлено прапорець «Для всіх проєктів». Його не можна деактивувати - для окремих проєктів. + description: Це користувацьке поле активовано в усіх проєктах, оскільки встановлено прапорець «Для всіх проєктів». Його не можна деактивувати для окремих проєктів. items: - actions: Дії + actions: "Дії" blankslate: root: - title: Ваш список елементів порожній - description: |- - Спочатку додайте елементи до користувацького поля ієрархії типів. Створити ієрархію можна для кожного елемента. Щоб переходити між піделементами ієрархії і додавати - їх, натисніть створений елемент. + title: "Ваш список елементів порожній" + description: "Спочатку додайте елементи до користувацького поля ієрархії типів. Створити ієрархію можна для кожного елемента. Щоб переходити між піделементами ієрархії і додавати\nїх, натисніть створений елемент." item: title: Цей елемент не має нижчого рівня ієрархії - description: Додайте елементи до цього списку, щоб створити піделементи - всередині іншого + description: Додайте елементи до цього списку, щоб створити піделементи всередині іншого delete_dialog: - title: Видалити елемент користувацького поля - heading: Видалити елемент користувацького поля? - description: Ця дія, яку не можна відмінити, призведе до вилучення елемента - й усіх його вкладених елементів. Усі їх значення буде видалено назавжди. - Якщо це обов’язкове поле, пакети робіт, де їх буде вилучено, можуть стати - недійсними. + title: "Видалити елемент користувацького поля" + heading: "Видалити елемент користувацького поля?" + description: "Ця дія, яку не можна відмінити, призведе до вилучення елемента й усіх його вкладених елементів. Усі їх значення буде видалено назавжди. Якщо це обов’язкове поле, пакети робіт, де їх буде вилучено, можуть стати недійсними." placeholder: - label: Мітка елемента - short: Коротка назва - weight: Вага + label: "Мітка елемента" + short: "Коротка назва" + weight: "Вага" notice: - remember_items_and_projects: Обов’язково задайте елементи й проєкти на відповідних - вкладках для цього користувацького поля. + remember_items_and_projects: "Обов’язково задайте елементи й проєкти на відповідних вкладках для цього користувацького поля." hierarchy: subitems: zero: немає піделементів one: 1 піделемент - other: 'Піделементів: %{count}' + other: "Піделементів: %{count}" role_assignment: title: Призначення ролі - description: Ви можете автоматично надавати певну роль у проєкті будь-якому - користувачу, якому призначено цей атрибут, незалежно від його початкової - ролі у цьому проєкті. - warning: Залежно від вибраної нижче ролі, користувач, якому призначено цей - атрибут проєкту, може отримати значно більше прав доступу, ніж мав раніше, - включно з можливістю додавати нових учасників та підвищувати їхню роль. - role_field_label: Роль проєкту - role_field_caption: Ця роль проєкту буде автоматично надана будь-якому користувачу, - якому призначено цей атрибут проєкту - review_hint: 'Цей атрибут проєкту вже призначено стільком користувачам у різних - проєктах: %{user_count}. Вони можуть отримати додаткові дозволи, а також - доступ до проєктів, у які їх раніше не було додано. - - ' + description: Ви можете автоматично надавати певну роль у проєкті будь-якому користувачу, якому призначено цей атрибут, незалежно від його початкової ролі у цьому проєкті. + warning: Залежно від вибраної нижче ролі, користувач, якому призначено цей атрибут проєкту, може отримати значно більше прав доступу, ніж мав раніше, включно з можливістю додавати нових учасників та підвищувати їхню роль. + role_field_label: "Роль проєкту" + role_field_caption: Ця роль проєкту буде автоматично надана будь-якому користувачу, якому призначено цей атрибут проєкту + review_hint: > + Цей атрибут проєкту вже призначено стільком користувачам у різних проєктах: %{user_count}. Вони можуть отримати додаткові дозволи, а також доступ до проєктів, у які їх раніше не було додано. review_button: Переглянути користувачів і дозволи dialog: - title: Огляд користувачів і дозволів + title: "Огляд користувачів і дозволів" change: Змінити changes: new_member: Буде додано як учасника @@ -662,156 +559,128 @@ uk: gain_role: Отримає роль «%{new_role}» lose_role: Втратить роль «%{old_role}» no_change: Немає змін - text_add_new_custom_field: 'Щоб додати нові користувальницькі поля до проекту, - спочатку потрібно створити їх, перш ніж ви зможете додати їх до цього проекту. - - ' - is_enabled_globally: Увімкнено у всьому світі - enabled_in_project: Увімкнено в проекті - contained_in_type: Міститься за типом - confirm_destroy_option: Видалення опції призведе до видалення всіх його подій - (наприклад, у робочих пакетах). Дійсно видалити його? - reorder_alphabetical: Перевпорядкувати значення за алфавітом - reorder_confirmation: 'Попередження: поточний порядок доступних значень, а також - усі незбережені значення буде втрачено. Справді продовжити?' - placeholder_version_select: Спочатку потрібно вибрати пакет робіт або проєкт - calculated_field_not_editable: Атрибут не підлягає редагуванню. Його значення - обчислюється автоматично. - no_role_assigment: Роль не призначено + text_add_new_custom_field: > + Щоб додати нові користувальницькі поля до проекту, спочатку потрібно створити їх, перш ніж ви зможете додати їх до цього проекту. + is_enabled_globally: "Увімкнено у всьому світі" + enabled_in_project: "Увімкнено в проекті" + contained_in_type: "Міститься за типом" + confirm_destroy_option: "Видалення опції призведе до видалення всіх його подій (наприклад, у робочих пакетах). Дійсно видалити його?" + reorder_alphabetical: "Перевпорядкувати значення за алфавітом" + reorder_confirmation: "Попередження: поточний порядок доступних значень, а також усі незбережені значення буде втрачено. Справді продовжити?" + placeholder_version_select: "Спочатку потрібно вибрати пакет робіт або проєкт" + calculated_field_not_editable: "Атрибут не підлягає редагуванню. Його значення обчислюється автоматично." + no_role_assigment: "Роль не призначено" instructions: is_required: - all: Позначте користувацьке поле як обов’язкове. Тоді його необхідно буде - заповнювати при створенні нових ресурсів. При оновленні наявних ресурсів - вводити значення не буде потрібно. - project: Створюючи проєкт, користувач має заповнювати обов’язкові атрибути, - якщо поле активне (як результат установлення прапорця «Для всіх проєктів» - або копіювання з проєкту/шаблону, де воно активне). Це поле не потрібно - заповнювати при оновленні наявних проєктів. + all: "Позначте користувацьке поле як обов’язкове. Тоді його необхідно буде заповнювати при створенні нових ресурсів. При оновленні наявних ресурсів вводити значення не буде потрібно." + project: "Створюючи проєкт, користувач має заповнювати обов’язкові атрибути, якщо поле активне (як результат установлення прапорця «Для всіх проєктів» або копіювання з проєкту/шаблону, де воно активне). Це поле не потрібно заповнювати при оновленні наявних проєктів." is_for_all: - all: Позначте користувацьке поле як доступне в усіх наявних і нових проєктах. - project: Позначте атрибут як доступний в усіх наявних і нових проєктах. + all: "Позначте користувацьке поле як доступне в усіх наявних і нових проєктах." + project: "Позначте атрибут як доступний в усіх наявних і нових проєктах." multi_select: - all: Це дає змогу користувачу присвоїти користувацькому полю кілька значень. - project: Це дає змогу користувачу присвоїти атрибуту кілька значень. + all: "Це дає змогу користувачу присвоїти користувацькому полю кілька значень." + project: "Це дає змогу користувачу присвоїти атрибуту кілька значень." searchable: - all: Включіть значення полів під час використання функції глобального пошуку. - project: Установіть прапорець, щоб зробити цей атрибут доступним як фільтр - у списках проєктів. + all: "Включіть значення полів під час використання функції глобального пошуку." + project: "Установіть прапорець, щоб зробити цей атрибут доступним як фільтр у списках проєктів." editable: - all: Дозвольте користувачам самостійно редагувати це поле. + all: "Дозвольте користувачам самостійно редагувати це поле." admin_only: - all: Установіть прапорець, щоб зробити це користувацьке поле видимим лише - для адміністраторів. Користувачі без прав адміністратора не зможуть переглядати - або редагувати його. - project: Установіть прапорець, щоб зробити цей атрибут видимим лише для адміністраторів. - Користувачі без прав адміністратора не зможуть переглядати або редагувати - його. + all: "Установіть прапорець, щоб зробити це користувацьке поле видимим лише для адміністраторів. Користувачі без прав адміністратора не зможуть переглядати або редагувати його." + project: "Установіть прапорець, щоб зробити цей атрибут видимим лише для адміністраторів. Користувачі без прав адміністратора не зможуть переглядати або редагувати його." is_filter: - all: 'Дозвольте використовувати користувацьке поле у фільтрі в поданнях пакетів - робіт. Зверніть увагу: користувацьке поле відображатиметься в глобальних - поданнях, лише якщо встановлено прапорець «Для всіх проєктів». - - ' + all: > + Дозвольте використовувати користувацьке поле у фільтрі в поданнях пакетів робіт. Зверніть увагу: користувацьке поле відображатиметься в глобальних поданнях, лише якщо встановлено прапорець «Для всіх проєктів». formula: - project: Додайте числові значення або введіть «/» для пошуку атрибута чи математичного - оператора. + project: "Додайте числові значення або введіть «/» для пошуку атрибута чи математичного оператора." regexp: - all: наприклад, ^[A-Z0-9]+$ - project: наприклад, ^[A-Z0-9]+$ + all: "наприклад, ^[A-Z0-9]+$" + project: "наприклад, ^[A-Z0-9]+$" min_max: - all: 0 означає відсутність обмежень - project: 0 означає відсутність обмежень + all: "0 означає відсутність обмежень" + project: "0 означає відсутність обмежень" has_comment: - project: Дає змогу користувачу додати коментар до атрибута проєкту при виборі - значення на сторінці «Огляд проєкту». + project: "Дає змогу користувачу додати коментар до атрибута проєкту при виборі значення на сторінці «Огляд проєкту»." tab: no_results_title_text: Наразі немає спеціальних полів. no_results_content_text: Створіть нове спеціальне поле calculated_values: error_dialog: - title: Помилка, пов’язана з полем «Розраховане значення» + title: "Помилка, пов’язана з полем «Розраховане значення»" errors: - unknown: Сталася невідома помилка. Перевірте формулу, що використовується для - цього поля «Розраховане значення». - mathematical: Математична формула призводить до помилки. Перевірте обчислювальний - атрибут проєкту й повторіть спробу. - missing_value: Атрибут «%{custom_field_name}» обов’язковий для цього поля «Розраховане - значення», але є порожнім. - disabled_value: Атрибут «%{custom_field_name}» обов’язковий для цього поля «Розраховане - значення», але його вимкнено для проєкту. + unknown: "Сталася невідома помилка. Перевірте формулу, що використовується для цього поля «Розраховане значення»." + mathematical: "Математична формула призводить до помилки. Перевірте обчислювальний атрибут проєкту й повторіть спробу." + missing_value: Атрибут «%{custom_field_name}» обов’язковий для цього поля «Розраховане значення», але є порожнім. + disabled_value: Атрибут «%{custom_field_name}» обов’язковий для цього поля «Розраховане значення», але його вимкнено для проєкту. concatenation: - single: або + single: "або" danger_dialog: - confirmation_live_message_checked: Кнопка для продовження активна. - confirmation_live_message_unchecked: Кнопка для продовження зараз неактивна. Щоб - продовжити, поставте прапорець. + confirmation_live_message_checked: "Кнопка для продовження активна." + confirmation_live_message_unchecked: "Кнопка для продовження зараз неактивна. Щоб продовжити, поставте прапорець." mcp_configurations: server_url_component: - caption: URL-адреса для доступу до сервера MCP OpenProject. Потрібна для налаштування - клієнтів MCP. - label: URL-адреса сервера + caption: "URL-адреса для доступу до сервера MCP OpenProject. Потрібна для налаштування клієнтів MCP." + label: "URL-адреса сервера" op_dry_validation: - or: або + or: "або" errors: - array?: має бути масивом. - decimal?: має бути десятковим числом. - defined: не має визначатися. - eql?: має бути «%{left}». + array?: "має бути масивом." + decimal?: "має бути десятковим числом." + defined: "не має визначатися." + eql?: "має бути «%{left}»." filled?: "— слід заповнити." - greater_or_equal_zero: має бути більше ніж 0 або дорівнювати йому. - gteq?: має бути більше ніж %{num} або дорівнювати цьому значенню. - hash?: має бути гешом. + greater_or_equal_zero: "має бути більше ніж 0 або дорівнювати йому." + gteq?: "має бути більше ніж %{num} або дорівнювати цьому значенню." + hash?: "має бути гешом." included_in?: arg: - default: 'має бути якимось із цих елементів: %{list}.' - range: 'має бути якимось із цих елементів: %{list_left} — %{list_right}.' - int?: має бути цілим числом. + default: "має бути якимось із цих елементів: %{list}." + range: "має бути якимось із цих елементів: %{list_left} — %{list_right}." + int?: "має бути цілим числом." key?: "— відсутній елемент." not_found: "— не знайдено." - respond_to?: не реалізує потрібний метод. + respond_to?: "не реалізує потрібний метод." rules: copy_workflow_from: - workflow_missing: не має власного робочого процесу. + workflow_missing: "не має власного робочого процесу." custom_field: - format_not_supported: формат «%{field_format}» не підтримується. + format_not_supported: "формат «%{field_format}» не підтримується." item: - root_item: не може бути кореневим об’єктом. - not_persisted: має бути вже наявним об’єктом. + root_item: "не може бути кореневим об’єктом." + not_persisted: "має бути вже наявним об’єктом." label: - not_unique: має бути унікальним об’єктом у межах одного рівня ієрархії. + not_unique: "має бути унікальним об’єктом у межах одного рівня ієрархії." short: - not_unique: має бути унікальним об’єктом у межах одного рівня ієрархії. + not_unique: "має бути унікальним об’єктом у межах одного рівня ієрархії." parent: - not_descendant: має бути нащадком кореня ієрархії. - str?: має бути рядком. - type?: має бути типом «%{type}». + not_descendant: "має бути нащадком кореня ієрархії." + str?: "має бути рядком." + type?: "має бути типом «%{type}»." rules: - copy_workflow_from: Тип копії робочого процесу - enabled: Увімкнено - depth: Глибина - item: Об’єкт - label: Мітка - weight: Вага - short: Коротка назва - parent: Батьківський об’єкт - blueprint: Структура шаблону + copy_workflow_from: "Тип копії робочого процесу" + enabled: "Увімкнено" + depth: "Глибина" + item: "Об’єкт" + label: "Мітка" + weight: "Вага" + short: "Коротка назва" + parent: "Батьківський об’єкт" + blueprint: "Структура шаблону" global_search: title: - all_projects: Пошук за терміном «%{search_term}» у всіх проєктах - current_project: Пошук за терміном «%{search_term}» у проєкті «%{project_name}» - project_and_subprojects: Пошук за терміном «%{search_term}» у проєкті «%{project_name}» - і всіх підпроєктах - placeholder: Пошук у додатку %{app_title} + all_projects: 'Пошук за терміном «%{search_term}» у всіх проєктах' + current_project: 'Пошук за терміном «%{search_term}» у проєкті «%{project_name}»' + project_and_subprojects: 'Пошук за терміном «%{search_term}» у проєкті «%{project_name}» і всіх підпроєктах' + placeholder: "Пошук у додатку %{app_title}" overwritten_tabs: - all: Усі - messages: Форум - wiki_pages: Wiki + all: "Усі" + messages: "Форум" + wiki_pages: "Wiki" groups: edit: - synchronized_groups: Синхронізовані групи + synchronized_groups: "Синхронізовані групи" index: - description: Згрупувавши користувачів, можна додавати їх як членів в одні й - ті самі проєкти або призначати їм однакові глобальні ролі. + description: Згрупувавши користувачів, можна додавати їх як членів в одні й ті самі проєкти або призначати їм однакові глобальні ролі. table_component: blank_slate: description: Для груп користувачів із назвами можна вказувати дозволи. @@ -824,16 +693,11 @@ uk: synchronized_groups: blankslate: action: Налаштування автентифікації - description: Коли цю групу буде автоматично синхронізовано з групами від зовнішніх - постачальників ідентифікаційних даних, таких як OpenID, вони з’являться - тут. Це можна налаштувати в параметрах автентифікації. + description: Коли цю групу буде автоматично синхронізовано з групами від зовнішніх постачальників ідентифікаційних даних, таких як OpenID, вони з’являться тут. Це можна налаштувати в параметрах автентифікації. title: Ще немає синхронізованих груп incoming_mails: - ignore_filenames: 'Вкажіть список імен, які ігноруватимуться під час обробки вкладень - для вхідних повідомлень (наприклад, підписів або значків). Введіть одне ім''я - файлу у рядок. - - ' + ignore_filenames: > + Вкажіть список імен, які ігноруватимуться під час обробки вкладень для вхідних повідомлень (наприклад, підписів або значків). Введіть одне ім'я файлу у рядок. portfolios: index: search: @@ -845,54 +709,52 @@ uk: many: "%{count} піделементів" other: "%{count} піделемента" lists: - active: Активні портфелі - my: Мої портфелі - favorited: Вибрані портфелі - archived: Архівні портфелі + active: "Активні портфелі" + my: "Мої портфелі" + favorited: "Вибрані портфелі" + archived: "Архівні портфелі" projects: copy: - members: Учасники проєкту - overviews: Огляд проєкту - queries: 'Пакети робіт: збережені подання' - wiki_page_attachments: 'Сторінки Wiki: вкладення' - work_package_attachments: 'Пакети робіт: вкладення' - work_package_categories: 'Пакети робіт: категорії' - work_package_file_links: 'Пакети робіт: посилання на файли' - work_package_shares: 'Пакети робіт: спільні ресурси' + #Contains custom strings for options when copying a project that cannot be found elsewhere. + members: "Учасники проєкту" + overviews: "Огляд проєкту" + queries: "Пакети робіт: збережені подання" + wiki_page_attachments: "Сторінки Wiki: вкладення" + work_package_attachments: "Пакети робіт: вкладення" + work_package_categories: "Пакети робіт: категорії" + work_package_file_links: "Пакети робіт: посилання на файли" + work_package_shares: "Пакети робіт: спільні ресурси" create: - notification_email_subject: Ваш проєкт «%{project_name}» створено - complete_wizard_link: Заповніть %{artefact_name} + notification_email_subject: "Ваш проєкт «%{project_name}» створено" + complete_wizard_link: "Заповніть %{artefact_name}" delete: - scheduled: Видалення заплановано та виконується у фоновому режимі. Ви отримаєте - сповіщення про результат. - schedule_failed: 'Проект не можна видалити: %{errors}' - failed: Не вдалося видалити проєкт «%{name}» - failed_text: Не вдалося виконати запит на видалення проєкту «%{name}». Він залишився - в архіві. - completed: Видалення проєкту «%{name}» завершено - completed_text: Запит видалення проекту '%{name}' завершено. - completed_text_children: 'Крім того, видалено такі підпроєкти:' + scheduled: "Видалення заплановано та виконується у фоновому режимі. Ви отримаєте сповіщення про результат." + schedule_failed: "Проект не можна видалити: %{errors}" + failed: "Не вдалося видалити проєкт «%{name}»" + failed_text: "Не вдалося виконати запит на видалення проєкту «%{name}». Він залишився в архіві." + completed: "Видалення проєкту «%{name}» завершено" + completed_text: "Запит видалення проекту '%{name}' завершено." + completed_text_children: "Крім того, видалено такі підпроєкти:" index: - open_as_gantt: Відкрити в поданні Ґанта + open_as_gantt: "Відкрити в поданні Ґанта" no_results_title_text: Наразі немає проектів no_results_content_text: Створіть новий проект search: label: Фільтр назв проєктів placeholder: Пошук за назвою проєкту lists: - active: Активні проєкти - my: Мої проєкти - favorited: Вибрані проєкти - archived: Заархівовані проєкти - shared: Спільні проєкти - my_lists: Мої списки проєктів + active: "Активні проєкти" + my: "Мої проєкти" + favorited: "Вибрані проєкти" + archived: "Заархівовані проєкти" + shared: "Спільні проєкти" + my_lists: "Мої списки проєктів" new: - placeholder: Новий список проєктів + placeholder: "Новий список проєктів" delete_modal: - title: Видалити список проєктів - heading: Видалити цей список проєктів? - text: Ця дія не призведе до видалення жодного проєкту зі списку. Справді видалити - цей список проєктів? + title: "Видалити список проєктів" + heading: "Видалити цей список проєктів?" + text: "Ця дія не призведе до видалення жодного проєкту зі списку. Справді видалити цей список проєктів?" settings: header_details: Основна інформація header_status: Статус @@ -900,59 +762,38 @@ uk: button_update_details: Оновити деталі button_update_status_description: Оновити опис проєкту button_update_parent_project: Оновити батьківський проєкт - public_warning: 'Цей проєкт загальнодоступний. Кожен, хто має доступ до цього - екземпляра, зможе переглянути цей проєкт і взаємодіяти з ним відповідно до - своєї ролі й пов’язаних дозволів. Вкладені проєкти мають власні налаштування, - тому це не вплине на них. - - ' + public_warning: > + Цей проєкт загальнодоступний. Кожен, хто має доступ до цього екземпляра, зможе переглянути цей проєкт і взаємодіяти з ним відповідно до своєї ролі й пов’язаних дозволів. Вкладені проєкти мають власні налаштування, тому це не вплине на них. public_confirmation: - checkbox: Я розумію, що внаслідок цієї дії приватний контент стане загальнодоступним - title: Зробити цей проєкт загальнодоступним? - description: 'Кожен, хто має доступ до цього екземпляра, зможе переглянути - цей проєкт і взаємодіяти з ним відповідно до своєї ролі й пов’язаних налаштувань - автентифікації. Вкладені проєкти мають власні налаштування, тому це не вплине - на них. - - ' + checkbox: "Я розумію, що внаслідок цієї дії приватний контент стане загальнодоступним" + title: "Зробити цей проєкт загальнодоступним?" + description: > + Кожен, хто має доступ до цього екземпляра, зможе переглянути цей проєкт і взаємодіяти з ним відповідно до своєї ролі й пов’язаних налаштувань автентифікації. Вкладені проєкти мають власні налаштування, тому це не вплине на них. private_confirmation: - checkbox: Я розумію, що внаслідок цієї дії загальнодоступний контент стане - приватним. - title: Зробити цей проєкт приватним? - description: 'Цей проєкт бачитимуть лише учасники проєкту відповідно до своїх - ролей і пов’язаних дозволів. Вкладені проєкти мають власні налаштування, - тому це не вплине на них. - - ' + checkbox: "Я розумію, що внаслідок цієї дії загальнодоступний контент стане приватним." + title: "Зробити цей проєкт приватним?" + description: > + Цей проєкт бачитимуть лише учасники проєкту відповідно до своїх ролей і пов’язаних дозволів. Вкладені проєкти мають власні налаштування, тому це не вплине на них. change_identifier: Ідентифікатор змін subitems: - template_section: 'Виберіть шаблони, які використовуватимуться при створенні - нових піделементів. - - ' - project_template_label: Шаблон для проєктів - project_template_caption: Виберіть шаблонний проєкт, який використовуватиметься - за замовчуванням для нових піделементів цього типу. - program_template_label: Шаблон для програм - program_template_caption: Виберіть шаблонну програму, яка використовуватиметься - за замовчуванням для нових піделементів цього типу. - no_template: Немає попередньо визначеного шаблону + template_section: > + Виберіть шаблони, які використовуватимуться при створенні нових піделементів. + project_template_label: "Шаблон для проєктів" + project_template_caption: "Виберіть шаблонний проєкт, який використовуватиметься за замовчуванням для нових піделементів цього типу." + program_template_label: "Шаблон для програм" + program_template_caption: "Виберіть шаблонну програму, яка використовуватиметься за замовчуванням для нових піделементів цього типу." + no_template: "Немає попередньо визначеного шаблону" template: - menu_title: Шаблон - title: Налаштування шаблону - enable_failed: Не вдалося ввімкнути режим шаблону. + menu_title: "Шаблон" + title: "Налаштування шаблону" + enable_failed: "Не вдалося ввімкнути режим шаблону." members: - excluded_roles_label: Ролі, які слід виключити при застосуванні шаблону - excluded_roles_caption: 'При створенні нового проєкту на основі цього шаблону - ролі, вибрані вище, буде випущено. Це дає змогу виключити певних учасників - на основі ролей, які їм призначено в проєктах. Такі користувачі зможуть - переглядати шаблон, але не матимуть доступу до нових проєктів, створених - на його основі. - - ' + excluded_roles_label: "Ролі, які слід виключити при застосуванні шаблону" + excluded_roles_caption: > + При створенні нового проєкту на основі цього шаблону ролі, вибрані вище, буде випущено. Це дає змогу виключити певних учасників на основі ролей, які їм призначено в проєктах. Такі користувачі зможуть переглядати шаблон, але не матимуть доступу до нових проєктів, створених на його основі. actions: - label_enable_all: Увімкнути все - label_disable_all: Вимкнути все + label_enable_all: "Увімкнути все" + label_disable_all: "Вимкнути все" activities: no_results_title_text: Наразі немає доступних заходів. forums: @@ -965,43 +806,32 @@ uk: no_results_title_text: Наразі немає спеціальних полів. life_cycle: header: - title: Життєвий цикл проєкту - description_html: Активні етапи проєкту визначають його життєвий цикл і - задаються в налаштуваннях - адміністратора. Увімкнені етапи відображатимуться на вашій сторінці - огляду проєкту. - non_defined: Наразі не визначено жодних етапів. - section_header: Етапи + title: "Життєвий цикл проєкту" + description_html: 'Активні етапи проєкту визначають його життєвий цикл і задаються в налаштуваннях адміністратора. Увімкнені етапи відображатимуться на вашій сторінці огляду проєкту.' + non_defined: "Наразі не визначено жодних етапів." + section_header: "Етапи" step: - use_in_project: Використати %{step} у цьому проєкті + use_in_project: "Використати %{step} у цьому проєкті" filter: - label: Пошук за назвою етапу + label: "Пошук за назвою етапу" project_custom_fields: header: - title: Атрибути проєкту - description_html: 'Ці атрибути проєкту відображатимуться на сторінці огляду проєкту у відповідних розділах. Ви - можете ввімкнути або вимкнути окремі атрибути. Атрибути проєкту й розділи - визначає адміністратор екземпляра в параметрах - адміністрування. ' + title: "Атрибути проєкту" + description_html: 'Ці атрибути проєкту відображатимуться на сторінці огляду проєкту у відповідних розділах. Ви можете ввімкнути або вимкнути окремі атрибути. Атрибути проєкту й розділи визначає адміністратор екземпляра в параметрах адміністрування. ' filter: - label: Пошук атрибутів проєкту + label: "Пошук атрибутів проєкту" actions: - label_enable_single: Увімкнено в цьому проєкті; натисніть, щоб вимкнути - label_disable_single: Вимкнено в цьому проєкті; натисніть, щоб увімкнути - remove_from_project: Вилучити з проєкту + label_enable_single: "Увімкнено в цьому проєкті; натисніть, щоб вимкнути" + label_disable_single: "Вимкнено в цьому проєкті; натисніть, щоб увімкнути" + remove_from_project: "Вилучити з проєкту" is_for_all_blank_slate: heading: Для всіх проєктів - description: Цей атрибут проєкту активовано в усіх проєктах, оскільки встановлено - прапорець «Для всіх проєктів». Його не можна деактивувати для окремих - проєктів. - enabled_via_assignee_when_submitted_html: Цей атрибут проєкту не можна вимкнути, - оскільки він використовується як виконавець - на момент подання для запитів на ініціювання проєкту. + description: Цей атрибут проєкту активовано в усіх проєктах, оскільки встановлено прапорець «Для всіх проєктів». Його не можна деактивувати для окремих проєктів. + enabled_via_assignee_when_submitted_html: Цей атрибут проєкту не можна вимкнути, оскільки він використовується як виконавець на момент подання для запитів на ініціювання проєкту. types: no_results_title_text: Наразі немає доступних типів. form: - enable_type_in_project: Дозволити тип «%{type}»? + enable_type_in_project: 'Дозволити тип «%{type}»?' versions: no_results_title_text: Наразі не існує версій для проекту. no_results_content_text: Створіть нову версію @@ -1010,331 +840,254 @@ uk: storage: no_results_title_text: Цей проєкт не потребує додаткового дискового простору. work_package_priorities: - new_label: Новий пріоритет + new_label: "Новий пріоритет" creation_wizard: errors: - no_work_package_type: Не вдалося ввімкнути запит на ініціювання проєкту, - оскільки для цього потрібен принаймні один активний тип пакета робіт, - а в цьому проєкті немає жодного. Додайте в нього принаймні один тип пакета - робіт. - no_status_when_submitted: Не вдалося ввімкнути запит на ініціювання проєкту, - оскільки з типом пакета робіт «%{type}» має бути пов’язано принаймні один - статус. Увімкніть для нього принаймні один робочий процес статусу. + no_work_package_type: "Не вдалося ввімкнути запит на ініціювання проєкту, оскільки для цього потрібен принаймні один активний тип пакета робіт, а в цьому проєкті немає жодного. Додайте в нього принаймні один тип пакета робіт." + no_status_when_submitted: "Не вдалося ввімкнути запит на ініціювання проєкту, оскільки з типом пакета робіт «%{type}» має бути пов’язано принаймні один статус. Увімкніть для нього принаймні один робочий процес статусу." export: - description_attachment_export: Створений артефакт буде збережено як вкладення - у форматі PDF у пакеті робіт артефакту. - description_file_link_export: Пакет робіт артефакту міститиме посилання - на файл PDF, що зберігатиметься в зовнішньому сховищі. Знадобиться робоче - файлове сховище з папками проєкту з автоматичним керуванням для цього - проєкту. Зараз підтримуються лише файлові сховища Nextcloud. - description_file_storage_selection: Виберіть налаштоване зовнішнє файлове - сховище, яке слід використовувати. - external_file_storage: Зовнішнє файлове сховище - label_artifact_export: Експорт артефакту - label_attachment_export: Зберегти як вкладення файлу в пакеті робіт - label_file_link_export: Завантажити файл у зовнішнє файлове сховище й додати - посилання на нього в пакет робіт - pdf_file_storage: Сховище файлів PDF - unavailable: недоступно - label_request_submission: Подання запиту - project_attributes_description: 'Виберіть атрибути проєкту, які слід включити - в запит на ініціювання проєкту. Цей список містить лише [атрибути проєкту](project_attributes_url), - увімкнені для цього проєкту. - - ' - enabled_because_required_html: Атрибут проєкту не можна вимкнути для цього - запиту на ініціювання проєкту, оскільки вказано, що він обов’язковий. Це - налаштування може змінити адміністратор екземпляра в розділі «Адміністрування». + description_attachment_export: "Створений артефакт буде збережено як вкладення у форматі PDF у пакеті робіт артефакту." + description_file_link_export: "Пакет робіт артефакту міститиме посилання на файл PDF, що зберігатиметься в зовнішньому сховищі. Знадобиться робоче файлове сховище з папками проєкту з автоматичним керуванням для цього проєкту. Зараз підтримуються лише файлові сховища Nextcloud." + description_file_storage_selection: "Виберіть налаштоване зовнішнє файлове сховище, яке слід використовувати." + external_file_storage: "Зовнішнє файлове сховище" + label_artifact_export: "Експорт артефакту" + label_attachment_export: "Зберегти як вкладення файлу в пакеті робіт" + label_file_link_export: "Завантажити файл у зовнішнє файлове сховище й додати посилання на нього в пакет робіт" + pdf_file_storage: "Сховище файлів PDF" + unavailable: "недоступно" + label_request_submission: "Подання запиту" + project_attributes_description: > + Виберіть атрибути проєкту, які слід включити в запит на ініціювання проєкту. Цей список містить лише [атрибути проєкту](project_attributes_url), увімкнені для цього проєкту. + enabled_because_required_html: Атрибут проєкту не можна вимкнути для цього запиту на ініціювання проєкту, оскільки вказано, що він обов’язковий. Це налаштування може змінити адміністратор екземпляра в розділі «Адміністрування». status: button_edit: Редагувати статус wizard: - sidebar_content_title: Зміст - sections: Розділи - title: Запит на ініціювання проєкту - no_help_text: Для цього атрибута не визначено текст довідки. - success: Атрибути проєкту збережено, пакет робіт артефакту успішно створено. + sidebar_content_title: "Зміст" + sections: "Розділи" + title: "Запит на ініціювання проєкту" + no_help_text: "Для цього атрибута не визначено текст довідки." + success: "Атрибути проєкту збережено, пакет робіт артефакту успішно створено." progress_label: "%{current} з %{total}" - create_artifact_work_package_error: Не вдалося створити пакет робіт артефакту - create_artifact_storage_error: Не вдалося зберегти артефакт у файловому сховищі + create_artifact_work_package_error: "Не вдалося створити пакет робіт артефакту" + create_artifact_storage_error: "Не вдалося зберегти артефакт у файловому сховищі" lists: create: - success: Змінений список збережено як новий - failure: 'Неможливо зберегти змінений список: %{errors}' + success: "Змінений список збережено як новий" + failure: "Неможливо зберегти змінений список: %{errors}" update: - success: Змінений список збережено - failure: 'Неможливо зберегти змінений список: %{errors}' + success: "Змінений список збережено" + failure: "Неможливо зберегти змінений список: %{errors}" publish: - success: Цей список став загальнодоступним - failure: 'Цей список не можна зробити загальнодоступним: %{errors}' + success: "Цей список став загальнодоступним" + failure: "Цей список не можна зробити загальнодоступним: %{errors}" unpublish: - success: Цей список став приватним - failure: 'Цей список не можна зробити приватним: %{errors}' - can_be_saved: 'Список змінено:' - can_be_saved_as: 'Зміни можна зберегти лише в новому списку:' + success: "Цей список став приватним" + failure: "Цей список не можна зробити приватним: %{errors}" + can_be_saved: "Список змінено:" + can_be_saved_as: "Зміни можна зберегти лише в новому списку:" members: index: no_results_title_text: Наразі учасників цього проекту немає. no_results_content_text: Додайте учасника до проекту - invite_by_mail: Надіслати запрошення на адресу %{mail} - send_invite_to: 'Надіслати запрошення:' + invite_by_mail: "Надіслати запрошення на адресу %{mail}" + send_invite_to: "Надіслати запрошення:" columns: - shared: Спільні + shared: "Спільні" filters: - all_shares: Усі поширення + all_shares: "Усі поширення" menu: - all: Усі - invited: Запрошені - locked: Заблоковані - project_roles: Ролі в проєкті - wp_shares: Поширення пакета робіт - groups: Групи + all: "Усі" + invited: "Запрошені" + locked: "Заблоковані" + project_roles: "Ролі в проєкті" + wp_shares: "Поширення пакета робіт" + groups: "Групи" delete_member_dialog: - title: Вилучити учасника - will_remove_the_users_role: Роль користувача буде вилучено із цього проєкту. - will_remove_the_groups_role: Роль групи буде вилучено із цього проєкту. + title: "Вилучити учасника" + will_remove_the_users_role: "Роль користувача буде вилучено із цього проєкту." + will_remove_the_groups_role: "Роль групи буде вилучено із цього проєкту." however_work_packages_shared_with_user_html: - one: Однак цьому користувачу також надано доступ до %{shared_work_packages_link}. - few: Однак цьому користувачу також надано доступ до %{shared_work_packages_link}. - many: Однак цьому користувачу також надано доступ до %{shared_work_packages_link}. - other: Однак цьому користувачу також надано доступ до %{shared_work_packages_link}. + one: "Однак цьому користувачу також надано доступ до %{shared_work_packages_link}." + few: "Однак цьому користувачу також надано доступ до %{shared_work_packages_link}." + many: "Однак цьому користувачу також надано доступ до %{shared_work_packages_link}." + other: "Однак цьому користувачу також надано доступ до %{shared_work_packages_link}." however_work_packages_shared_with_group_html: - one: Однак цій групі також надано доступ до %{shared_work_packages_link}. - few: Однак цій групі також надано доступ до %{shared_work_packages_link}. - many: Однак цій групі також надано доступ до %{shared_work_packages_link}. - other: Однак цій групі також надано доступ до %{shared_work_packages_link}. - remove_work_packages_shared_with_user_too: Користувач, якого було вилучено як - учасника, досі має доступ до спільних пакетів робіт. Вилучити також його дозволи - на доступ? - remove_work_packages_shared_with_group_too: Група, яку було вилучено як учасника, - досі має доступ до спільних пакетів робіт. Вилучити також її дозволи на доступ? - will_not_affect_inherited_shares: "(Це не вплине на пакети робіт, які спільно - використовуються в межах відповідних груп)." - can_remove_direct_but_not_shared_roles: Ви можете вилучити цього користувача - як безпосереднього учасника проєкту, але він буде й надалі його учасником, - оскільки група, до якої він належить, також є учасником цього проєкту. + one: "Однак цій групі також надано доступ до %{shared_work_packages_link}." + few: "Однак цій групі також надано доступ до %{shared_work_packages_link}." + many: "Однак цій групі також надано доступ до %{shared_work_packages_link}." + other: "Однак цій групі також надано доступ до %{shared_work_packages_link}." + remove_work_packages_shared_with_user_too: "Користувач, якого було вилучено як учасника, досі має доступ до спільних пакетів робіт. Вилучити також його дозволи на доступ?" + remove_work_packages_shared_with_group_too: "Група, яку було вилучено як учасника, досі має доступ до спільних пакетів робіт. Вилучити також її дозволи на доступ?" + will_not_affect_inherited_shares: "(Це не вплине на пакети робіт, які спільно використовуються в межах відповідних груп)." + can_remove_direct_but_not_shared_roles: "Ви можете вилучити цього користувача як безпосереднього учасника проєкту, але він буде й надалі його учасником, оскільки група, до якої він належить, також є учасником цього проєкту." also_work_packages_shared_with_user_html: one: " Крім того, цьому користувачу надано доступ до %{shared_work_packages_link}." few: " Крім того, цьому користувачу надано доступ до %{shared_work_packages_link}." many: " Крім того, цьому користувачу надано доступ до %{shared_work_packages_link}." other: " Крім того, цьому користувачу надано доступ до %{shared_work_packages_link}." - remove_project_membership_or_work_package_shares_too: Вилучити користувача лише - як безпосереднього учасника (і зберегти дозволи на доступ) чи вилучити також - ці дозволи? - will_remove_all_user_access_priveleges: Видалення цього учасника призведе до - вилучення всіх дозволів на доступ користувача до проєкту. Користувач буде - й надалі частиною екземпляра. - will_remove_all_group_access_priveleges: Видалення цього учасника призведе до - вилучення всіх дозволів на доступ групи до проєкту. Група буде й надалі частиною - екземпляра. - cannot_delete_inherited_membership: Неможливо видалити цього учасника, оскільки - він належить до групи, яка сама є учасником цього проєкту. - cannot_delete_inherited_membership_note_admin_html: Ви можете вилучити групу - як учасника проєкту або цього конкретного учасника з групи в %{administration_settings_link}. - cannot_delete_inherited_membership_note_non_admin: Ви можете або вилучити групу - як учасника проєкту, або звернутися до адміністратора з проханням вилучити - цього конкретного учасника з групи. + remove_project_membership_or_work_package_shares_too: "Вилучити користувача лише як безпосереднього учасника (і зберегти дозволи на доступ) чи вилучити також ці дозволи?" + will_remove_all_user_access_priveleges: "Видалення цього учасника призведе до вилучення всіх дозволів на доступ користувача до проєкту. Користувач буде й надалі частиною екземпляра." + will_remove_all_group_access_priveleges: "Видалення цього учасника призведе до вилучення всіх дозволів на доступ групи до проєкту. Група буде й надалі частиною екземпляра." + cannot_delete_inherited_membership: "Неможливо видалити цього учасника, оскільки він належить до групи, яка сама є учасником цього проєкту." + cannot_delete_inherited_membership_note_admin_html: "Ви можете вилучити групу як учасника проєкту або цього конкретного учасника з групи в %{administration_settings_link}." + cannot_delete_inherited_membership_note_non_admin: "Ви можете або вилучити групу як учасника проєкту, або звернутися до адміністратора з проханням вилучити цього конкретного учасника з групи." delete_work_package_shares_dialog: - title: Відкликати дозволи на доступ до пакета робіт + title: "Відкликати дозволи на доступ до пакета робіт" shared_with_this_user_html: - one: Цьому користувачу надано доступ до %{all_shared_work_packages_link}. - few: Цьому користувачу надано доступ до %{all_shared_work_packages_link}. - many: Цьому користувачу надано доступ до %{all_shared_work_packages_link}. - other: Цьому користувачу надано доступ до %{all_shared_work_packages_link}. + one: "Цьому користувачу надано доступ до %{all_shared_work_packages_link}." + few: "Цьому користувачу надано доступ до %{all_shared_work_packages_link}." + many: "Цьому користувачу надано доступ до %{all_shared_work_packages_link}." + other: "Цьому користувачу надано доступ до %{all_shared_work_packages_link}." shared_with_this_group_html: - one: Цій групі надано доступ до %{all_shared_work_packages_link}. - few: Цій групі надано доступ до %{all_shared_work_packages_link}. - many: Цій групі надано доступ до %{all_shared_work_packages_link}. - other: Цій групі надано доступ до %{all_shared_work_packages_link}. + one: "Цій групі надано доступ до %{all_shared_work_packages_link}." + few: "Цій групі надано доступ до %{all_shared_work_packages_link}." + many: "Цій групі надано доступ до %{all_shared_work_packages_link}." + other: "Цій групі надано доступ до %{all_shared_work_packages_link}." shared_with_permission_html: - one: Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}. - few: Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}. - many: Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}. - other: Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}. - revoke_all_or_with_role: Хочете відкликати доступ до всіх спільних пакетів робіт - чи тільки до тих, доступ до яких надано з дозволами ролі «%{shared_role_name}»? - will_not_affect_inherited_shares: "(Це не вплине на пакети робіт, які спільно - використовуються в межах відповідних груп)." - cannot_remove_inherited: Дозволи на доступ до пакетів робіт, надані на рівні - груп, не можна вилучити. - cannot_remove_inherited_with_role: Пакети робіт, до яких надано доступ із дозволами - ролі «%{shared_role_name}», використовуються в групах, і їх не можна вилучити. - cannot_remove_inherited_note_admin_html: Ви можете відкликати дозвіл на доступ - групи або вилучити цього конкретного учасника з групи в %{administration_settings_link}. - cannot_remove_inherited_note_non_admin: Ви можете або відкликати дозвіл на доступ - групи або звернутися до адміністратора з проханням вилучити цього конкретного - учасника з групи. - will_revoke_directly_granted_access: Доступ учасника буде відкликано до всіх - пакетів робіт, крім тих, до яких доступ надано групі. - will_revoke_access_to_all: Доступ учасника буде відкликано до всіх пакетів робіт. + one: "Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}." + few: "Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}." + many: "Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}." + other: "Доступ із дозволами ролі «%{shared_role_name}» надано лише до %{shared_work_packages_link}." + revoke_all_or_with_role: "Хочете відкликати доступ до всіх спільних пакетів робіт чи тільки до тих, доступ до яких надано з дозволами ролі «%{shared_role_name}»?" + will_not_affect_inherited_shares: "(Це не вплине на пакети робіт, які спільно використовуються в межах відповідних груп)." + cannot_remove_inherited: "Дозволи на доступ до пакетів робіт, надані на рівні груп, не можна вилучити." + cannot_remove_inherited_with_role: "Пакети робіт, до яких надано доступ із дозволами ролі «%{shared_role_name}», використовуються в групах, і їх не можна вилучити." + cannot_remove_inherited_note_admin_html: "Ви можете відкликати дозвіл на доступ групи або вилучити цього конкретного учасника з групи в %{administration_settings_link}." + cannot_remove_inherited_note_non_admin: "Ви можете або відкликати дозвіл на доступ групи або звернутися до адміністратора з проханням вилучити цього конкретного учасника з групи." + will_revoke_directly_granted_access: "Доступ учасника буде відкликано до всіх пакетів робіт, крім тих, до яких доступ надано групі." + will_revoke_access_to_all: "Доступ учасника буде відкликано до всіх пакетів робіт." my: access_token: dialog: token/api: - dialog_title: Створити новий маркер API - attention_text: Маркери API – це щось на кшталт паролів. Будь-хто, маючи - такий маркер, може отримати доступ до даних вашого екземпляра. Тому надавайте - його тільки користувачам, яким довіряєте. - dialog_body: За допомогою цього маркера сторонні додатки зможуть взаємодіяти - з вашим екземпляром. Призначте новому інтерфейсу API ім’я, щоб ідентифікувати - його. - create_button: Створити - name_label: Ім’я маркера + dialog_title: "Створити новий маркер API" + attention_text: "Маркери API – це щось на кшталт паролів. Будь-хто, маючи такий маркер, може отримати доступ до даних вашого екземпляра. Тому надавайте його тільки користувачам, яким довіряєте." + dialog_body: "За допомогою цього маркера сторонні додатки зможуть взаємодіяти з вашим екземпляром. Призначте новому інтерфейсу API ім’я, щоб ідентифікувати його." + create_button: "Створити" + name_label: "Ім’я маркера" created_dialog: - one_time_warning: Ви більше не побачите цей маркер. Обов’язково скопіюйте - його зараз. + one_time_warning: "Ви більше не побачите цей маркер. Обов’язково скопіюйте його зараз." token/api: - title: Маркер API згенеровано + title: "Маркер API згенеровано" token/rss: - title: Маркер RSS згенеровано - failed_to_reset_token: 'Не вдалося відновити маркер доступу: %{error}' - failed_to_create_token: 'Не вдалося створити маркер доступу: %{error}' - failed_to_revoke_token: 'Не вдалося відкликати маркер доступу: %{error}' - notice_reset_token: 'Нове %{type} генерований маркер. Ваш маркер доступу:' - token_value_warning: Примітка. Це єдиний раз, коли ви побачите цей маркер, переконайтеся, - що його зараз скопіюйте. - no_results_title_text: Наразі немає доступних маркерів доступу. - notice_api_token_revoked: Маркер API видалено. Щоб створити новий, скористайтеся - кнопкою в розділі API. - notice_rss_token_revoked: Маркер RSS видалено. Щоб створити новий, скористайтеся - посиланням у розділі RSS. - notice_ical_token_revoked: Маркер iCalendar «%{token_name}» для календаря «%{calendar_name}» - проєкту «%{project_name}» відкликано. URL-адреса iCalendar із цим маркером - зараз недійсна. + title: "Маркер RSS згенеровано" + failed_to_reset_token: "Не вдалося відновити маркер доступу: %{error}" + failed_to_create_token: "Не вдалося створити маркер доступу: %{error}" + failed_to_revoke_token: "Не вдалося відкликати маркер доступу: %{error}" + notice_reset_token: "Нове %{type} генерований маркер. Ваш маркер доступу:" + token_value_warning: "Примітка. Це єдиний раз, коли ви побачите цей маркер, переконайтеся, що його зараз скопіюйте." + no_results_title_text: "Наразі немає доступних маркерів доступу." + notice_api_token_revoked: "Маркер API видалено. Щоб створити новий, скористайтеся кнопкою в розділі API." + notice_rss_token_revoked: "Маркер RSS видалено. Щоб створити новий, скористайтеся посиланням у розділі RSS." + notice_ical_token_revoked: 'Маркер iCalendar «%{token_name}» для календаря «%{calendar_name}» проєкту «%{project_name}» відкликано. URL-адреса iCalendar із цим маркером зараз недійсна.' password_confirmation_dialog: - confirmation_required: Потрібно ввести пароль облікового запису, щоб підтвердити - цю зміну. - title: Підтвердьте свій пароль, щоб продовжити + confirmation_required: "Потрібно ввести пароль облікового запису, щоб підтвердити цю зміну." + title: "Підтвердьте свій пароль, щоб продовжити" news: index: no_results_title_text: Наразі немає жодної новини. no_results_content_text: Додати новину roles: permissions: - section_check_all_label: Призначити всі дозволи модуля «%{module}» - section_uncheck_all_label: Скасувати призначення всіх дозволів модуля «%{module}» + section_check_all_label: "Призначити всі дозволи модуля «%{module}»" + section_uncheck_all_label: "Скасувати призначення всіх дозволів модуля «%{module}»" report: - matrix_caption: Матриця дозволів для модуля «%{module}» - matrix_checkbox_label: Призначити дозвіл «%{permission}» ролі «%{role}» - matrix_check_all_label: Призначити всі дозволи модуля «%{module}» усім ролям - matrix_uncheck_all_label: Скасувати призначення всіх дозволів модуля «%{module}» - для всіх ролей - matrix_check_uncheck_all_in_row_label_html: Перемикач дозволу %{permission} - для всіх ролей - matrix_check_uncheck_all_in_col_label_html: Перемикач усіх дозволів модуля «%{module}» - для ролі %{role} + matrix_caption: "Матриця дозволів для модуля «%{module}»" + matrix_checkbox_label: "Призначити дозвіл «%{permission}» ролі «%{role}»" + matrix_check_all_label: "Призначити всі дозволи модуля «%{module}» усім ролям" + matrix_uncheck_all_label: "Скасувати призначення всіх дозволів модуля «%{module}» для всіх ролей" + matrix_check_uncheck_all_in_row_label_html: "Перемикач дозволу %{permission} для всіх ролей" + matrix_check_uncheck_all_in_col_label_html: "Перемикач усіх дозволів модуля «%{module}» для ролі %{role}" users: autologins: - prompt: Не виходити %{num_days} + prompt: "Не виходити %{num_days}" sessions: session_name: "%{browser_name} %{browser_version} у %{os_name}" - browser: Браузер - expires: Завершується - last_connection: Останнє підключення - device: Пристрій / ОС - unknown_browser: невідомий браузер - unknown_os: невідома операційна система + browser: "Браузер" + expires: "Завершується" + last_connection: "Останнє підключення" + device: "Пристрій / ОС" + unknown_browser: "невідомий браузер" + unknown_os: "невідома операційна система" unknown: "(невідомо)" browser_session: "(Сеанс браузера)" - current: Поточний (цей пристрій) - title: Керування сеансами - instructions: Ви ввійшли в обліковий запис на вказаних далі пристроях. Скасуйте - сеанси, які вам не знайомі, чи сеанси на пристроях, якими ви не керуєте. - may_not_delete_current: Ви не можете видалити поточний сеанс. - deletion_warning: Ви справді хочете скасувати цей сеанс? Ви вийдете з облікового - запису на цьому пристрої. + current: "Поточний (цей пристрій)" + title: "Керування сеансами" + instructions: "Ви ввійшли в обліковий запис на вказаних далі пристроях. Скасуйте сеанси, які вам не знайомі, чи сеанси на пристроях, якими ви не керуєте." + may_not_delete_current: "Ви не можете видалити поточний сеанс." + deletion_warning: "Ви справді хочете скасувати цей сеанс? Ви вийдете з облікового запису на цьому пристрої." groups: - member_in_these_groups: 'Зараз цей користувач — учасник таких груп:' + member_in_these_groups: "Зараз цей користувач — учасник таких груп:" no_results_title_text: Цей користувач зараз не належить до жодної групи. summary_with_more: Учасник %{names} і ще %{count_link}. - more: Ще %{count} + more: "Ще %{count}" summary: Учасник %{names}. memberships: no_results_title_text: Цей користувач наразі не є учасником проекту. - open_profile: Відкрити профіль + open_profile: "Відкрити профіль" invite_user_modal: - invite: Запросити + invite: "Запросити" title: - invite: Запросити користувача - invite_to_project: 'Запросити користувача «%{type}» у проєкт «%{project}» ' - invite_principal_to_project: Запросити користувача «%{principal}» у проєкт - «%{project}» + invite: "Запросити користувача" + invite_to_project: "Запросити користувача «%{type}» у проєкт «%{project}» " + invite_principal_to_project: "Запросити користувача «%{principal}» у проєкт «%{project}»" project: - label: Проєкт - required: Виберіть проєкт - next_button: Далі - no_results: Жодних проєктів не знайдено - no_invite_rights: Ви не можете запрошувати учасників до цього проєкту + label: "Проєкт" + required: "Виберіть проєкт" + next_button: "Далі" + no_results: "Жодних проєктів не знайдено" + no_invite_rights: "Ви не можете запрошувати учасників до цього проєкту" type: - required: Виберіть тип користувача, якого потрібно запросити + required: "Виберіть тип користувача, якого потрібно запросити" user: - title: Запросити користувача в проєкт «%{project_name}» - description: Дозволи, що ґрунтуються на призначеній ролі у вибраному проєкті + title: "Запросити користувача в проєкт «%{project_name}»" + description: "Дозволи, що ґрунтуються на призначеній ролі у вибраному проєкті" group: - title: Запросити групу в проєкт «%{project_name}» - description: Дозволи, що ґрунтуються на призначеній ролі у вибраному проєкті + title: "Запросити групу в проєкт «%{project_name}»" + description: "Дозволи, що ґрунтуються на призначеній ролі у вибраному проєкті" placeholder_user: - title: Додати прототип користувача в проєкт «%{project_name}» - title_no_ee: Прототип користувача (лише у версії Enterprise) - description: Немає доступу до проєкту; електронні листи не відправляються. - already_member_message: Уже учасник проєкту «%{project}» + title: "Додати прототип користувача в проєкт «%{project_name}»" + title_no_ee: "Прототип користувача (лише у версії Enterprise)" + description: "Немає доступу до проєкту; електронні листи не відправляються." + already_member_message: "Уже учасник проєкту «%{project}»" principal: - no_results_user: Користувачів не знайдено - invite_user: 'Запросити:' - no_results_placeholder: Прототипів не знайдено - create_new_placeholder: 'Створити новий прототип:' - no_results_group: Груп не знайдено - invite_to_project: Запросити в проєкт «%{project_name}» + no_results_user: "Користувачів не знайдено" + invite_user: "Запросити:" + no_results_placeholder: "Прототипів не знайдено" + create_new_placeholder: "Створити новий прототип:" + no_results_group: "Груп не знайдено" + invite_to_project: "Запросити в проєкт «%{project_name}»" required: - user: Виберіть користувача - placeholder: Виберіть прототип - group: Виберіть групу + user: "Виберіть користувача" + placeholder: "Виберіть прототип" + group: "Виберіть групу" role: - label: Ролі у проєкті «%{project}» - no_roles_found: Ролей не знайдено - description: 'Це роль, яку користувач отримає, коли приєднається до вашого - проєкту. Роль визначає, що йому дозволено робити й переглядати. [Дізнайтеся - більше про ролі й дозволи.](docs_url) - - ' - required: Виберіть роль + label: "Ролі у проєкті «%{project}»" + no_roles_found: "Ролей не знайдено" + description: > + Це роль, яку користувач отримає, коли приєднається до вашого проєкту. Роль визначає, що йому дозволено робити й переглядати. [Дізнайтеся більше про ролі й дозволи.](docs_url) + required: "Виберіть роль" message: - label: Повідомлення із запрошенням - description: Ми надішлемо користувачу електронний лист, у який ви можете додати - своє повідомлення. Радимо пояснити причину запрошення або, наприклад, додати - інформацію про проєкт, щоб користувачу було простіше почати працювати над - ним. + label: "Повідомлення із запрошенням" + description: "Ми надішлемо користувачу електронний лист, у який ви можете додати своє повідомлення. Радимо пояснити причину запрошення або, наприклад, додати інформацію про проєкт, щоб користувачу було простіше почати працювати над ним." summary: - next_button: Надіслати запрошення + next_button: "Надіслати запрошення" success_message: - user: Користувач тепер може ввійти, щоб отримати доступ до проєкту %{project}. - Тим часом ви вже можете включати цього користувача в план і призначати йому - пакети робіт. - placeholder_user: Прототип тепер може ввійти, щоб отримати доступ до проєкту - «%{project}». Тим часом ви вже можете включати цього користувача в план - і призначати йому пакети робіт. - group: Ця група тепер входить у проєкт «%{project}». Тим часом ви вже можете - включати її в план і призначати їй пакети робіт. + user: "Користувач тепер може ввійти, щоб отримати доступ до проєкту %{project}. Тим часом ви вже можете включати цього користувача в план і призначати йому пакети робіт." + placeholder_user: "Прототип тепер може ввійти, щоб отримати доступ до проєкту «%{project}». Тим часом ви вже можете включати цього користувача в план і призначати йому пакети робіт." + group: "Ця група тепер входить у проєкт «%{project}». Тим часом ви вже можете включати її в план і призначати їй пакети робіт." page: - text: Текст + text: "Текст" placeholder_users: - right_to_manage_members_missing: 'Ви не можете видалити прототип користувача. - У вас немає права керувати учасниками для всіх проєктів, до яких належить прототип - користувача. - - ' - delete_tooltip: Видалити прототип користувача + right_to_manage_members_missing: > + Ви не можете видалити прототип користувача. У вас немає права керувати учасниками для всіх проєктів, до яких належить прототип користувача. + delete_tooltip: "Видалити прототип користувача" deletion_info: - heading: Видалити прототип користувача %{name} - data_consequences: 'Усі екземпляри прототипу користувача (наприклад, виконавець, - відповідальний тощо) буде перепризначено обліковому запису з назвою «Видалений - користувач». Оскільки дані кожного видаленого облікового запису перепризначаються - цьому обліковому запису, відрізнити дані, створені користувачем, від даних - іншого видаленого облікового запису, може бути важко. - - ' - irreversible: Цю дію не можна скасувати - confirmation: Введіть ім’я прототипу користувача %{name}, щоб підтвердити видалення. + heading: "Видалити прототип користувача %{name}" + data_consequences: > + Усі екземпляри прототипу користувача (наприклад, виконавець, відповідальний тощо) буде перепризначено обліковому запису з назвою «Видалений користувач». Оскільки дані кожного видаленого облікового запису перепризначаються цьому обліковому запису, відрізнити дані, створені користувачем, від даних іншого видаленого облікового запису, може бути важко. + irreversible: "Цю дію не можна скасувати" + confirmation: "Введіть ім’я прототипу користувача %{name}, щоб підтвердити видалення." priorities: edit: priority_color_text: | @@ -1342,13 +1095,12 @@ uk: Його можна використовувати для виділення пакетів роботи в таблиці. admin: default: - caption: Якщо зробити цей пріоритет стандартним, він замінить попередній стандартний - пріоритет. + caption: Якщо зробити цей пріоритет стандартним, він замінить попередній стандартний пріоритет. reactions: - action_title: Реакція - add_reaction: Додати реакцію - react_with: Відреагувати за допомогою %{reaction} - and_user: і %{user} + action_title: "Реакція" + add_reaction: "Додати реакцію" + react_with: "Відреагувати за допомогою %{reaction}" + and_user: "і %{user}" and_others: one: і ще 1 few: і ще %{count} @@ -1364,11 +1116,10 @@ uk: status_color_text: | Натисніть, щоб призначити або змінити колір цього статусу. Він відображається в кнопці стану і може використовуватися для виділення робочих пакетів у таблиці. - status_default_text: Цей тип за замовчуванням мають нові пакети робіт. Вони - не можуть бути доступні лише для читання. - status_excluded_from_totals_text: Поставте цей прапорець, щоб виключити пакети - робіт із цим статусом із підсумків атрибутів «Робота», «Залишок роботи» й - «% завершення» в ієрархії. + status_default_text: |- + Цей тип за замовчуванням мають нові пакети робіт. Вони не можуть бути доступні лише для читання. + status_excluded_from_totals_text: |- + Поставте цей прапорець, щоб виключити пакети робіт із цим статусом із підсумків атрибутів «Робота», «Залишок роботи» й «% завершення» в ієрархії. status_percent_complete_text: |- У режимі обчислення прогресу на основі статусу для атрибута «% завершення» пакета робіт автоматично встановлюється це значення, коли вибрано цей статус. Ігнорується в режимі на основі роботи. @@ -1381,89 +1132,75 @@ uk: no_results_title_text: Наразі немає статусів робочих пакетів. no_results_content_text: Додати новий статус headers: - is_default: За замовчуванням - is_closed: Закрито - is_readonly: Лише для перегляду - excluded_from_totals: Виключено з підсумків + is_default: "За замовчуванням" + is_closed: "Закрито" + is_readonly: "Лише для перегляду" + excluded_from_totals: "Виключено з підсумків" themes: - dark: Темна - light: Світла - sync_with_os: Автоматично (колірний режим ОС) + dark: "Темна" + light: "Світла" + sync_with_os: "Автоматично (колірний режим ОС)" types: index: no_results_title_text: Наразі немає типів. no_results_content_text: Створіть новий тип edit: form_configuration: - tab: Конфігурація форми + tab: "Конфігурація форми" projects: tab: Проєкти enable_all: Використовувати у всіх проєктах select_projects: Вибрати проєкти - select_projects_description: Виберіть проєкти, у яких ви хочете використовувати - цей тип. + select_projects_description: Виберіть проєкти, у яких ви хочете використовувати цей тип. settings: - tab: Налаштування - type_color_text: "Цей колір використовується для виділення різних типів \nна - діаграмах Ґанта або в таблицях пакетів робіт. Тому рекомендуємо вибрати - насичений колір." + tab: "Налаштування" + type_color_text: "Цей колір використовується для виділення різних типів \nна діаграмах Ґанта або в таблицях пакетів робіт. Тому рекомендуємо вибрати насичений колір." subject_configuration: - tab: Конфігурація теми + tab: "Конфігурація теми" manually_editable_subjects: - label: Теми, які можна редагувати вручну - caption: Користувачі можуть самостійно вводити й редагувати теми пакетів - робіт без обмежень. + label: "Теми, які можна редагувати вручну" + caption: "Користувачі можуть самостійно вводити й редагувати теми пакетів робіт без обмежень." automatically_generated_subjects: - label: Автоматично згенеровані теми - caption: Визначте шаблон, використовуючи атрибути й текст, щоб теми пакетів - робіт створювались автоматично. Користувачі не зможуть редагувати теми. + label: "Автоматично згенеровані теми" + caption: "Визначте шаблон, використовуючи атрибути й текст, щоб теми пакетів робіт створювались автоматично. Користувачі не зможуть редагувати теми." token: label_with_context: "%{attribute_context}: %{attribute_label}" context: - work_package: Робочий пакет - parent: Батьківський об’єкт - project: Проєкт + work_package: "Робочий пакет" + parent: "Батьківський об’єкт" + project: "Проєкт" pattern: - label: Шаблон теми - caption: Створіть шаблони, додаючи текст, або введіть «/», щоб знайти [підтримувані - атрибути](attributes_url). + label: "Шаблон теми" + caption: Створіть шаблони, додаючи текст, або введіть «/», щоб знайти [підтримувані атрибути](attributes_url). insert_as_text: 'Атрибутів не знайдено. Додайте як текст: «%{word}»' export_configuration: - tab: Згенерувати PDF - intro: Виберіть, які шаблони з доступних вам ви хочете ввімкнути для цього - типу. Шаблон визначає дизайн і атрибути, що відображаються в експортованому - PDF-файлі пакета робіт за допомогою цього типу. Перший шаблон у списку вибирається - за замовчуванням. + tab: "Згенерувати PDF" + intro: "Виберіть, які шаблони з доступних вам ви хочете ввімкнути для цього типу. Шаблон визначає дизайн і атрибути, що відображаються в експортованому PDF-файлі пакета робіт за допомогою цього типу. Перший шаблон у списку вибирається за замовчуванням." pdf_export_templates: - label: Шаблони експорту PDF + label: "Шаблони експорту PDF" actions: - label_enable_all: Увімкнути все - label_disable_all: Вимкнути все + label_enable_all: "Увімкнути все" + label_disable_all: "Вимкнути все" versions: overview: - work_packages_in_archived_projects: Доступ до цієї версії надано в архівних - проєктах, які досі містять пакети робіт, призначені цій версії. Їх враховано, - але вони не відображаються в пов’язаних поданнях. + work_packages_in_archived_projects: "Доступ до цієї версії надано в архівних проєктах, які досі містять пакети робіт, призначені цій версії. Їх враховано, але вони не відображаються в пов’язаних поданнях." no_results_title_text: Наразі для цієї версії не призначено робочих пакетів. wiki: - page_not_editable_index: Запитувана сторінка не існує (поки що). Вас було переспрямовано - до індексу всіх вікі-сторінок. + page_not_editable_index: Запитувана сторінка не існує (поки що). Вас було переспрямовано до індексу всіх вікі-сторінок. no_results_title_text: Наразі немає wiki-сторінок. print_hint: Буде надруковано вміст цієї wiki-сторінки без панелей навігації. index: no_results_content_text: Додати нову wiki-сторінку workflows: form: - matrix_caption: Матриця робочого процесу - matrix_caption_assignee: Матриця робочого процесу для виконавця - matrix_caption_author: Матриця робочого процесу для автора - matrix_checkbox_label: Дозволити зміну статусу «%{old_status}» на «%{new_status}» - matrix_check_all_label: Дозволити всі зміни - matrix_uncheck_all_label: Заборонити всі зміни - matrix_check_uncheck_all_in_row_label_html: Перемикач зміни статусу %{old_status} - на всі нові статуси - matrix_check_uncheck_all_in_col_label_html: Перемикач зміни всіх старих статусів - на статус %{new_status} + matrix_caption: "Матриця робочого процесу" + matrix_caption_assignee: "Матриця робочого процесу для виконавця" + matrix_caption_author: "Матриця робочого процесу для автора" + matrix_checkbox_label: "Дозволити зміну статусу «%{old_status}» на «%{new_status}»" + matrix_check_all_label: "Дозволити всі зміни" + matrix_uncheck_all_label: "Заборонити всі зміни" + matrix_check_uncheck_all_in_row_label_html: "Перемикач зміни статусу %{old_status} на всі нові статуси" + matrix_check_uncheck_all_in_col_label_html: "Перемикач зміни всіх старих статусів на статус %{new_status}" work_flows: index: no_results_title_text: Наразі немає робочих процесів. @@ -1471,90 +1208,70 @@ uk: datepicker_modal: banner: description: - automatic_mobile: Дату початку отримано. - click_on_show_relations_to_open_gantt: Натисніть кнопку «%{button_name}», - щоб переглянути діаграму Ґантта. - manual_mobile: Зв’язки ігноруються. - manual_gap_between_predecessors: Між цим пакетом робіт і всіма його попередниками - існує проміжок часу. - manual_overlap_with_predecessors: Перекривається принаймні одним попередником. - manual_with_children: Є дочірні пакети робіт, але їх дати початку ігноруються. + automatic_mobile: "Дату початку отримано." + click_on_show_relations_to_open_gantt: 'Натисніть кнопку «%{button_name}», щоб переглянути діаграму Ґантта.' + manual_mobile: "Зв’язки ігноруються." + manual_gap_between_predecessors: "Між цим пакетом робіт і всіма його попередниками існує проміжок часу." + manual_overlap_with_predecessors: "Перекривається принаймні одним попередником." + manual_with_children: "Є дочірні пакети робіт, але їх дати початку ігноруються." title: - automatic_mobile: Автоматично заплановано. - automatic_with_children: Дати визначено дочірніми пакетами робіт. - automatic_with_predecessor: Дату початку задано попередником. - manual_mobile: Заплановано вручну. - manually_scheduled: Заплановано вручну. Зв’язки не впливають на дати. + automatic_mobile: "Автоматично заплановано." + automatic_with_children: "Дати визначено дочірніми пакетами робіт." + automatic_with_predecessor: "Дату початку задано попередником." + manual_mobile: "Заплановано вручну." + manually_scheduled: "Заплановано вручну. Зв’язки не впливають на дати." blankslate: - title: Немає попередників - description: Щоб увімкнути автоматичне планування, додайте принаймні одного - попередника для цього пакета робіт. Після цього його виконання почнеться - автоматично після завершення найближчого попередника. + title: "Немає попередників" + description: "Щоб увімкнути автоматичне планування, додайте принаймні одного попередника для цього пакета робіт. Після цього його виконання почнеться автоматично після завершення найближчого попередника." ignore_non_working_days: - title: Лише робочі дні + title: "Лише робочі дні" mode: - title: Режим планування - automatic: Автоматично - manual: Вручну - show_relations: Показати зв’язки - update_inputs_aria_live_message: Засіб вибору дати оновлено. %{message} + title: "Режим планування" + automatic: "Автоматично" + manual: "Вручну" + show_relations: "Показати зв’язки" + update_inputs_aria_live_message: "Засіб вибору дати оновлено. %{message}" tabs: - aria_label: Вкладки вибору даних - children: Дочірні елементи - dates: Дати - predecessors: Попередники - successors: Наступники + aria_label: "Вкладки вибору даних" + children: "Дочірні елементи" + dates: "Дати" + predecessors: "Попередники" + successors: "Наступники" blankslate: predecessors: - title: Немає попередників - description: Цей пакет робіт не має попередників. + title: "Немає попередників" + description: "Цей пакет робіт не має попередників." successors: - title: Немає наступників - description: Цей пакет робіт не має наступників. + title: "Немає наступників" + description: "Цей пакет робіт не має наступників." children: - title: Немає дочірніх елементів - description: Цей пакет робіт не має дочірніх елементів. + title: "Немає дочірніх елементів" + description: "Цей пакет робіт не має дочірніх елементів." x_descendants: - one: Один робочий пакет нащадків + one: "Один робочий пакет нащадків" few: "%{count} нащадки робочого пакета" many: "%{count} нащадки робочого пакета" other: "%{count} нащадки робочого пакета" bulk: - copy_failed: Не вдалося скопіювати пакети робіт. - move_failed: Не вдалося перемістити пакети робіт. - could_not_be_saved: 'Не вдалося зберегти такі робочі пакети:' - none_could_be_saved: Жоден із пакетів робіт (%{total}) не можна оновити. - x_out_of_y_could_be_saved: 'Не вдалось оновити пакетів робіт: %{failing} із - %{total}. Оновлено: %{success}.' - selected_because_descendants: Хоча вибрано кілька %{selected} пакетів робіт, - змінено всього %{total}, включно з нащадками. - descendant: нащадок вибраного елемента + copy_failed: "Не вдалося скопіювати пакети робіт." + move_failed: "Не вдалося перемістити пакети робіт." + could_not_be_saved: "Не вдалося зберегти такі робочі пакети:" + none_could_be_saved: "Жоден із пакетів робіт (%{total}) не можна оновити." + x_out_of_y_could_be_saved: "Не вдалось оновити пакетів робіт: %{failing} із %{total}. Оновлено: %{success}." + selected_because_descendants: "Хоча вибрано кілька %{selected} пакетів робіт, змінено всього %{total}, включно з нащадками." + descendant: "нащадок вибраного елемента" move: - no_common_statuses_exists: Немає доступного статусу для всіх вибраних робочих - пакетів. Їх статус не може бути змінений. - unsupported_for_multiple_projects: Масове переміщення/копіювання не підтримується - для робочих пакетів з декількох проектів - current_type_not_available_in_target_project: 'Поточний тип пакета робіт не - ввімкнено в цільовому проєкті. Увімкніть його, якщо не хочете, щоб він зазнав - змін. Інакше виберіть зі списку доступний тип у цільовому проєкті. - - ' - bulk_current_type_not_available_in_target_project: 'Поточні типи пакетів робіт - не ввімкнено в цільовому проєкті. Увімкніть, якщо не хочете, щоб вони зазнали - змін. Інакше виберіть зі списку доступний тип у цільовому проєкті. - - ' + no_common_statuses_exists: "Немає доступного статусу для всіх вибраних робочих пакетів. Їх статус не може бути змінений." + unsupported_for_multiple_projects: "Масове переміщення/копіювання не підтримується для робочих пакетів з декількох проектів" + current_type_not_available_in_target_project: > + Поточний тип пакета робіт не ввімкнено в цільовому проєкті. Увімкніть його, якщо не хочете, щоб він зазнав змін. Інакше виберіть зі списку доступний тип у цільовому проєкті. + bulk_current_type_not_available_in_target_project: > + Поточні типи пакетів робіт не ввімкнено в цільовому проєкті. Увімкніть, якщо не хочете, щоб вони зазнали змін. Інакше виберіть зі списку доступний тип у цільовому проєкті. sharing: missing_workflow_warning: - title: Відсутній робочий процес для надання доступу до пакета робіт - message: Для ролі «Редактор пакета робіт» не налаштовано жодного робочого - процесу. Без робочого процесу користувач, якому надано доступ, не може змінити - статус пакета робіт. Робочі процеси можна копіювати. Виберіть вихідний тип - (напр., «Завдання») і роль (напр., «Учасник»). Потім виберіть цільові типи. - Для початку радимо вибирати всі типи як цільові. Нарешті, виберіть роль - «Редактор пакета робіт» і натисніть «Копіювати». Після цього ви зможете - налаштовувати робочі процеси для кожної ролі, як ви це зазвичай робите. - link_message: Налаштуйте робочі процеси на панелі адміністрування. + title: "Відсутній робочий процес для надання доступу до пакета робіт" + message: "Для ролі «Редактор пакета робіт» не налаштовано жодного робочого процесу. Без робочого процесу користувач, якому надано доступ, не може змінити статус пакета робіт. Робочі процеси можна копіювати. Виберіть вихідний тип (напр., «Завдання») і роль (напр., «Учасник»). Потім виберіть цільові типи. Для початку радимо вибирати всі типи як цільові. Нарешті, виберіть роль «Редактор пакета робіт» і натисніть «Копіювати». Після цього ви зможете налаштовувати робочі процеси для кожної ролі, як ви це зазвичай робите." + link_message: "Налаштуйте робочі процеси на панелі адміністрування." summary: reports: category: @@ -1573,608 +1290,545 @@ uk: no_results_title_text: Наразі немає доступних версій. work_package_relations_tab: index: - action_bar_title: Додавайте зв’язки з іншими пакетами робіт. + action_bar_title: "Додавайте зв’язки з іншими пакетами робіт." no_results_title_text: Зараз немає доступних зв’язків. - blankslate_heading: Немає зв’язків - blankslate_description: Цей пакет робіт ще не має зв’язків. - label_add_child_button: Дочірній - label_add_x: Додати %{x} - label_edit_x: Редагувати %{x} - label_add_description: Додати опис + blankslate_heading: "Немає зв’язків" + blankslate_description: "Цей пакет робіт ще не має зв’язків." + label_add_child_button: "Дочірній" + label_add_x: "Додати %{x}" + label_edit_x: "Редагувати %{x}" + label_add_description: "Додати опис" lag: - subject: Затримка - caption: Мінімальна кількість робочих днів між двома пакетами робіт. Може бути - від’ємним числом. + subject: "Затримка" + caption: |- + Мінімальна кількість робочих днів між двома пакетами робіт. Може бути від’ємним числом. relations: - label_new_child_created: Новий пакет робіт створено й додано як дочірній - label_relates_singular: зв’язано з - label_relates_plural: зв’язано з - label_relates_to_singular: зв’язано з - label_relates_to_plural: зв’язано з - relates_description: Створює видимий зв’язок між двома пакетами робіт без додаткових - ефектів - relates_to_description: Створює видимий зв’язок між двома пакетами робіт без - додаткових ефектів - label_precedes_singular: наступник (після) - label_precedes_plural: наступники (після) - precedes_description: Зв’язаний пакет робіт обов’язково має починатися після - завершення цього - label_follows_singular: попередник (до) - label_follows_plural: попередники (до) - follows_description: Зв’язаний пакет робіт обов’язково має завершуватися перед - початком цього - label_child_singular: дочірній елемент - label_child_plural: дочірні елементи - new_child: Створити новий дочірній елемент - new_child_description: Створює звʼязаний пакет робіт як піделемент поточного - (батьківського) пакета робіт - child: Дочірній - child_description: Вкладає звʼязаний пакет робіт як піделемент поточного (батьківського) - пакета робіт - parent: Батьківський об’єкт - parent_description: Установлює звʼязаний пакет робіт батьківським відносно поточного - (дочірнього) пакета робіт - label_closest: Найближчі - label_blocks_singular: блоки - label_blocks_plural: блоки - blocks_description: Звʼязаний пакет робіт можна закрити лише після закриття - цього - label_blocked_singular: заблоковано - label_blocked_plural: заблоковано - label_blocked_by_singular: заблоковано - label_blocked__by_plural: заблоковано - blocked_description: Цей пакет робіт можна закрити лише після закриття звʼязаного - з ним - blocked_by_description: Цей пакет робіт можна закрити лише після закриття звʼязаного - з ним - label_duplicates_singular: дублює - label_duplicates_plural: дублює - duplicates_description: Це копія звʼязаного пакета робіт - label_duplicated_singular: дублюється - label_duplicated_plural: дублюється - label_duplicated_by_singular: дублюється - label_duplicated_by_plural: дублюється - duplicated_by_description: Звʼязаний пакет робіт є копією цього - duplicated_description: Звʼязаний пакет робіт є копією цього - label_includes_singular: включає - label_includes_plural: включає - includes_description: Позначає звʼязаний пакет робіт як такий, що включає цей, - без додаткового ефекту - label_partof_singular: належить до - label_partof_plural: належить до - label_part_of_singular: належить до - label_part_of_plural: належить до - partof_description: Позначає звʼязаний пакет робіт як такий, що належить до - цього, без додаткового ефекту - part_of_description: Позначає звʼязаний пакет робіт як такий, що належить до - цього, без додаткового ефекту - label_requires_singular: вимагає - label_requires_plural: вимагає - requires_description: Позначає звʼязаний пакет робіт як обовʼязковий для цього - label_required_singular: вимагається - label_required_plural: вимагається - required_description: Позначає цей робочий пакет як обовʼязковий для звʼязаного - з ним - label_parent_singular: батьківський елемент - label_parent_plural: батьківський елемент - label_other_relations: Інші зв’язки - ghost_relation_title: Пов’язаний пакет робіт - ghost_relation_description: Ви не маєте дозволів на перегляд цього елемента. + label_new_child_created: "Новий пакет робіт створено й додано як дочірній" + label_relates_singular: "зв’язано з" + label_relates_plural: "зв’язано з" + label_relates_to_singular: "зв’язано з" + label_relates_to_plural: "зв’язано з" + relates_description: "Створює видимий зв’язок між двома пакетами робіт без додаткових ефектів" + relates_to_description: "Створює видимий зв’язок між двома пакетами робіт без додаткових ефектів" + label_precedes_singular: "наступник (після)" + label_precedes_plural: "наступники (після)" + precedes_description: "Зв’язаний пакет робіт обов’язково має починатися після завершення цього" + label_follows_singular: "попередник (до)" + label_follows_plural: "попередники (до)" + follows_description: "Зв’язаний пакет робіт обов’язково має завершуватися перед початком цього" + label_child_singular: "дочірній елемент" + label_child_plural: "дочірні елементи" + new_child: "Створити новий дочірній елемент" + new_child_description: "Створює звʼязаний пакет робіт як піделемент поточного (батьківського) пакета робіт" + child: "Дочірній" + child_description: "Вкладає звʼязаний пакет робіт як піделемент поточного (батьківського) пакета робіт" + parent: "Батьківський об’єкт" + parent_description: "Установлює звʼязаний пакет робіт батьківським відносно поточного (дочірнього) пакета робіт" + label_closest: "Найближчі" + label_blocks_singular: "блоки" + label_blocks_plural: "блоки" + blocks_description: "Звʼязаний пакет робіт можна закрити лише після закриття цього" + label_blocked_singular: "заблоковано" + label_blocked_plural: "заблоковано" + label_blocked_by_singular: "заблоковано" + label_blocked__by_plural: "заблоковано" + blocked_description: "Цей пакет робіт можна закрити лише після закриття звʼязаного з ним" + blocked_by_description: "Цей пакет робіт можна закрити лише після закриття звʼязаного з ним" + label_duplicates_singular: "дублює" + label_duplicates_plural: "дублює" + duplicates_description: "Це копія звʼязаного пакета робіт" + label_duplicated_singular: "дублюється" + label_duplicated_plural: "дублюється" + label_duplicated_by_singular: "дублюється" + label_duplicated_by_plural: "дублюється" + duplicated_by_description: "Звʼязаний пакет робіт є копією цього" + duplicated_description: "Звʼязаний пакет робіт є копією цього" + label_includes_singular: "включає" + label_includes_plural: "включає" + includes_description: "Позначає звʼязаний пакет робіт як такий, що включає цей, без додаткового ефекту" + label_partof_singular: "належить до" + label_partof_plural: "належить до" + label_part_of_singular: "належить до" + label_part_of_plural: "належить до" + partof_description: "Позначає звʼязаний пакет робіт як такий, що належить до цього, без додаткового ефекту" + part_of_description: "Позначає звʼязаний пакет робіт як такий, що належить до цього, без додаткового ефекту" + label_requires_singular: "вимагає" + label_requires_plural: "вимагає" + requires_description: "Позначає звʼязаний пакет робіт як обовʼязковий для цього" + label_required_singular: "вимагається" + label_required_plural: "вимагається" + required_description: "Позначає цей робочий пакет як обовʼязковий для звʼязаного з ним" + label_parent_singular: "батьківський елемент" + label_parent_plural: "батьківський елемент" + label_other_relations: "Інші зв’язки" + ghost_relation_title: "Пов’язаний пакет робіт" + ghost_relation_description: "Ви не маєте дозволів на перегляд цього елемента." label_invitation: Запрошення account: - delete: Видалити обліковий запис - delete_confirmation: Ви дійсно бажаєте видалити цей обліковий запис? - deletion_pending: Для цього облікового запису заплановано видалення. Зверніть - увагу, що цей процес відбувається у фоновому режимі. Остаточне видалення даних - користувача може зайняти кілька хвилин. + delete: "Видалити обліковий запис" + delete_confirmation: "Ви дійсно бажаєте видалити цей обліковий запис?" + deletion_pending: "Для цього облікового запису заплановано видалення. Зверніть увагу, що цей процес відбувається у фоновому режимі. Остаточне видалення даних користувача може зайняти кілька хвилин." deletion_info: data_consequences: - other: Усі дані, які стосуються користувача, буде видалено. Дії користувача - в спільних поданнях, таких як пакети робіт і наради, залишаться в системі, - проте їх буде зв’язано із загальним «Видаленим користувачем», який ніяк - не вказує на оригінальний обліковий запис. - self: Усі дані, які стосуються користувача, буде видалено. Ваші дії в спільних - поданнях, таких як пакети робіт і наради, залишаться в системі, проте їх - буде зв’язано із загальним «Видаленим користувачем», який ніяк не вказує - на ваш оригінальний обліковий запис. - heading: Видалити обліковий запис, яким користується %{name}? + other: "Усі дані, які стосуються користувача, буде видалено. Дії користувача в спільних поданнях, таких як пакети робіт і наради, залишаться в системі, проте їх буде зв’язано із загальним «Видаленим користувачем», який ніяк не вказує на оригінальний обліковий запис." + self: "Усі дані, які стосуються користувача, буде видалено. Ваші дії в спільних поданнях, таких як пакети робіт і наради, залишаться в системі, проте їх буде зв’язано із загальним «Видаленим користувачем», який ніяк не вказує на ваш оригінальний обліковий запис." + heading: "Видалити обліковий запис, яким користується %{name}?" login_consequences: - other: Цей обліковий запис буде негайно видалено із системи, і користувач - більше не зможе ввійти в неї за допомогою своїх облікових даних. - self: Ваш обліковий запис буде негайно видалено із системи, і ви більше не - зможете ввійти в неї за допомогою своїх облікових даних. - error_inactive_activation_by_mail: 'Ваш обліковий запис ще не активовано. Щоб - активувати ваш обліковий запис, перейдіть за посиланням, яке було відправлено - вам електронною поштою. - - ' - error_inactive_manual_activation: 'Ваш обліковий запис ще не активовано. Будь - ласка, зачекайте поки адміністратор активує ваш обліковий запис. - - ' - error_self_registration_disabled: 'Реєстрація користувача у цій системі відключена. - Будь ласка, зверніться до адміністратора, щоб створити обліковий запис для вас. - - ' - error_self_registration_limited_provider: 'Реєстрація користувачів через постачальника - єдиного входу %{name} обмежена. Зверніться до адміністратора, щоб активувати - обліковий запис або змінити ліміт самостійних реєстрацій для цього постачальника. - - ' - login_with_auth_provider: або ввійдіть у свій існуючий обліковий запис - signup_with_auth_provider: або зареєструйтесь, використовуючи + other: "Цей обліковий запис буде негайно видалено із системи, і користувач більше не зможе ввійти в неї за допомогою своїх облікових даних." + self: "Ваш обліковий запис буде негайно видалено із системи, і ви більше не зможете ввійти в неї за допомогою своїх облікових даних." + error_inactive_activation_by_mail: > + Ваш обліковий запис ще не активовано. Щоб активувати ваш обліковий запис, перейдіть за посиланням, яке було відправлено вам електронною поштою. + error_inactive_manual_activation: > + Ваш обліковий запис ще не активовано. Будь ласка, зачекайте поки адміністратор активує ваш обліковий запис. + error_self_registration_disabled: > + Реєстрація користувача у цій системі відключена. Будь ласка, зверніться до адміністратора, щоб створити обліковий запис для вас. + error_self_registration_limited_provider: > + Реєстрація користувачів через постачальника єдиного входу %{name} обмежена. Зверніться до адміністратора, щоб активувати обліковий запис або змінити ліміт самостійних реєстрацій для цього постачальника. + login_with_auth_provider: "або ввійдіть у свій існуючий обліковий запис" + signup_with_auth_provider: "або зареєструйтесь, використовуючи" auth_source_login: Увійдіть, як %{login} для активації облікового запису. omniauth_login: Увійдіть, щоб активувати свій обліковий запис. - actionview_instancetag_blank_option: Будь ласка, виберіть + actionview_instancetag_blank_option: "Будь ласка, виберіть" activemodel: attributes: projects/copy_options: - dependencies: Залежності + dependencies: "Залежності" activerecord: attributes: - agile/sprint: {} jira_import: - projects: Проєкти - import/jira: - name: Назва екземпляра Jira - url: URL-адреса екземпляра Jira - personal_access_token: Персональний маркер доступу + projects: "Проєкти" + "import/jira": + name: "Назва екземпляра Jira" + url: "URL-адреса екземпляра Jira" + personal_access_token: "Персональний маркер доступу" + "import/jira_open_project_reference": + jira: "Jira" + jira_import: "Jira import" announcements: - show_until: Показувати до + show_until: "Показувати до" attachment: - attachment_content: Вміст вкладення - attachment_file_name: Назва файлу вкладеного файлу - content_type: Тип контенту - downloads: Завантаження - file: Файл - filename: Файл - filesize: Розмір + attachment_content: "Вміст вкладення" + attachment_file_name: "Назва файлу вкладеного файлу" + content_type: "Тип контенту" + downloads: "Завантаження" + file: "Файл" + filename: "Файл" + filesize: "Розмір" attribute_help_text: - attribute_name: Атрибут - help_text: Довідковий текст - caption: Заголовок + attribute_name: "Атрибут" + help_text: "Довідковий текст" + caption: "Заголовок" auth_provider: - scim_clients: Клієнти SCIM + scim_clients: "Клієнти SCIM" calculated_value_error: - error_code: Код помилки - customized_id: Користувацький ідентифікатор - customized_type: Користувацький тип + error_code: "Код помилки" + customized_id: "Користувацький ідентифікатор" + customized_type: "Користувацький тип" capability: - context: Контекст + context: "Контекст" changeset: - repository: Репозиторій + repository: "Репозиторій" comment: - commented: Прокоментовано + commented: "Прокоментовано" #an object that this comment belongs to custom_action: - actions: Дії + actions: "Дії" custom_field: - allow_non_open_versions: Дозволити невідкриті версії - default_value: Значення за замовчуванням - editable: Може бути відредаговане - field_format: Формат - formula: Формула - is_filter: Використовується як фільтр - is_for_all: Для всіх проєктів - is_required: Обов'язкове поле - max_length: Максимальна довжина - min_length: Мінімальна довжина - content_right_to_left: Письмо зліва направо - multi_value: Дозволити вибір - possible_values: Можливі значення - regexp: Регулярний вираз - searchable: Доступно для пошуку - admin_only: Тільки для адміністраторів - has_comment: Додати текстове поле для коментаря + allow_non_open_versions: "Дозволити невідкриті версії" + default_value: "Значення за замовчуванням" + editable: "Може бути відредаговане" + field_format: "Формат" + formula: "Формула" + is_filter: "Використовується як фільтр" + is_for_all: "Для всіх проєктів" + is_required: "Обов'язкове поле" + max_length: "Максимальна довжина" + min_length: "Мінімальна довжина" + content_right_to_left: "Письмо зліва направо" + multi_value: "Дозволити вибір" + possible_values: "Можливі значення" + regexp: "Регулярний вираз" + searchable: "Доступно для пошуку" + admin_only: "Тільки для адміністраторів" + has_comment: "Додати текстове поле для коментаря" custom_value: - value: Значення + value: "Значення" design_color: - variable: Змінна + variable: "Змінна" doorkeeper/application: - uid: Ідентифікатор клієнта - secret: Секретний ключ клієнта - owner: Власник - builtin: Вбудований - enabled: Активні - redirect_uri: Перенаправити URI (Automatic Translation) - client_credentials_user_id: Ідентифікатор користувача для облікових даних - клієнта - scopes: Область дії - confidential: Конфіденційний + uid: "Ідентифікатор клієнта" + secret: "Секретний ключ клієнта" + owner: "Власник" + builtin: "Вбудований" + enabled: "Активні" + redirect_uri: "Перенаправити URI (Automatic Translation)" + client_credentials_user_id: "Ідентифікатор користувача для облікових даних клієнта" + scopes: "Область дії" + confidential: "Конфіденційний" emoji_reaction: - reactable: Реакція на + reactable: "Реакція на" enterprise_token: - starts_at: Дійсний з - subscriber: Абонент - subscription: Підписка - plan: План - encoded_token: Маркер підтримки підприємства - active_user_count_restriction: Активні користувачі + starts_at: "Дійсний з" + subscriber: "Абонент" + subscription: "Підписка" + plan: "План" + encoded_token: "Маркер підтримки підприємства" + active_user_count_restriction: "Активні користувачі" enterprise_trial: - company: Компанія + company: "Компанія" favorite: - favorited: Об’єкт + favorited: "Об’єкт" grids/grid: - page: Сторінка - row_count: Кількість рядків - column_count: Кількість стовпців - widgets: Віджети + page: "Сторінка" + row_count: "Кількість рядків" + column_count: "Кількість стовпців" + widgets: "Віджети" journal: - notes: Примітки - cause_type: Тип причини + notes: "Примітки" + cause_type: "Тип причини" ldap_auth_source: - account: Обліковий запис - attr_firstname: Атрибут «Ім’я» - attr_lastname: Атрибут «Прізвище» - attr_login: Атрибут «Ім’я користувача» - attr_mail: Атрибут «Електронна адреса» - filter_string: Рядок фільтра - admin: Адміністратор - base_dn: Базове ім’я DN - host: Хост - onthefly: Автоматичне створення користувачів - port: Порт - tls_certificate_string: Сертифікат SSL сервера LDAP + account: "Обліковий запис" + attr_firstname: "Атрибут «Ім’я»" + attr_lastname: "Атрибут «Прізвище»" + attr_login: "Атрибут «Ім’я користувача»" + attr_mail: "Атрибут «Електронна адреса»" + filter_string: "Рядок фільтра" + admin: "Адміністратор" + base_dn: "Базове ім’я DN" + host: "Хост" + onthefly: "Автоматичне створення користувачів" + port: "Порт" + tls_certificate_string: "Сертифікат SSL сервера LDAP" mcp_configuration: enabled: Увімкнено title: Заголовок description: Опис member: - roles: Роль + roles: "Роль" notification: - read_ian: Читайте в додатку - resource: Ресурс + read_ian: "Читайте в додатку" + resource: "Ресурс" oauth_client: - client: ID клієнта + client: "ID клієнта" project: active_value: - true: розархівовано - false: заархівовано - attribute_groups: Групи атрибутів - description: Опис - enabled_modules: Увімкнені модулі - identifier: Ідентифікатор - latest_activity_at: Остання активність на - parent: Підпроект - project_creation_wizard_enabled: Запит на ініціювання проєкту + true: "розархівовано" + false: "заархівовано" + attribute_groups: "Групи атрибутів" + description: "Опис" + enabled_modules: "Увімкнені модулі" + identifier: "Ідентифікатор" + latest_activity_at: "Остання активність на" + parent: "Підпроект" + project_creation_wizard_enabled: "Запит на ініціювання проєкту" public_value: - title: Видимість - true: публічний - false: приватний - queries: Запити - status_code: Статус - status_explanation: Опис статусу + title: "Видимість" + true: "публічний" + false: "приватний" + queries: "Запити" + status_code: "Статус" + status_explanation: "Опис статусу" status_codes: - not_started: Не почато - on_track: За графіком - at_risk: Під загрозою - off_track: Не за графіком - finished: Завершено - discontinued: Припинено - project_creation_wizard_assignee_custom_field: Виконавець на момент подання - project_creation_wizard_notification_text: Текст сповіщення - project_creation_wizard_send_confirmation_email: Лист із підтвердженням - project_creation_wizard_status_when_submitted: Статус на момент подання - project_creation_wizard_work_package_comment: Коментар до пакета робіт - project_creation_wizard_work_package_type: Тип пакета робіт - template: Шаблон - templated: Проєкт шаблона + not_started: "Не почато" + on_track: "За графіком" + at_risk: "Під загрозою" + off_track: "Не за графіком" + finished: "Завершено" + discontinued: "Припинено" + project_creation_wizard_assignee_custom_field: "Виконавець на момент подання" + project_creation_wizard_notification_text: "Текст сповіщення" + project_creation_wizard_send_confirmation_email: "Лист із підтвердженням" + project_creation_wizard_status_when_submitted: "Статус на момент подання" + project_creation_wizard_work_package_comment: "Коментар до пакета робіт" + project_creation_wizard_work_package_type: "Тип пакета робіт" + template: "Шаблон" + templated: "Проєкт шаблона" templated_value: - true: позначено як шаблон - false: не позначено як шаблон - types: Типи - versions: Версії - work_packages: Пакет робіт - workspace_type: Тип робочого простору + true: "позначено як шаблон" + false: "не позначено як шаблон" + types: "Типи" + versions: "Версії" + work_packages: "Пакет робіт" + workspace_type: "Тип робочого простору" project_custom_field: custom_field_section: Розділ subproject_template_assignment: - workspace_type: Тип робочого простору + workspace_type: "Тип робочого простору" project/phase: - date_range: Діапазон дат - definition: Визначення - duration: Тривалість - start_date: Дата початку - start_date_caption: Слідує за попереднім етапом. - finish_date: Дата закінчення + date_range: "Діапазон дат" + definition: "Визначення" + duration: "Тривалість" + start_date: "Дата початку" + start_date_caption: "Слідує за попереднім етапом." + finish_date: "Дата закінчення" project/phase_definition: - name: Назва - color: Колір - start_gate: Початкова контрольна точка етапу - start_gate_name: Назва початкової контрольної точки етапу - finish_gate: Кінцева контрольна точка етапу - finish_gate_name: Назва кінцевої контрольної точки етапу + name: "Назва" + color: "Колір" + start_gate: "Початкова контрольна точка етапу" + start_gate_name: "Назва початкової контрольної точки етапу" + finish_gate: "Кінцева контрольна точка етапу" + finish_gate_name: "Назва кінцевої контрольної точки етапу" query: - sums: Суми - columns: Стовпці - column_names: Стовпці - relations_to_type_column: Відносини з %{type} + sums: "Суми" + columns: "Стовпці" + column_names: "Стовпці" + relations_to_type_column: "Відносини з %{type}" relations_of_type_column: "%{type} відносини" - child_work_packages: Дочірні пакети робіт - group_by: Групувати результати по - sort_by: Сортувати результати за - filters: Фільтри - timeline_labels: Мітки часової шкали - timeline_visible: Показати діаграму Ганта - timeline_zoom_level: Рівень масштабу діаграми Ґантта - timestamps: Вихідні значення міток часу - sort_criteria: Критерії сортування - highlighted_attributes: Виділені атрибути - highlighting_mode: Режим виділення - display_representation: Режим відображення - show_hierarchies: Режим відображення - starred: Обрані - hidden: Приховано - manual_sorting: Порядок сортування вручну - ordered_work_packages: Порядок пакетів робіт - include_subprojects: Включити підпроєкти - results: Результати + child_work_packages: "Дочірні пакети робіт" + group_by: "Групувати результати по" + sort_by: "Сортувати результати за" + filters: "Фільтри" + timeline_labels: "Мітки часової шкали" + timeline_visible: "Показати діаграму Ганта" + timeline_zoom_level: "Рівень масштабу діаграми Ґантта" + timestamps: "Вихідні значення міток часу" + sort_criteria: "Критерії сортування" + highlighted_attributes: "Виділені атрибути" + highlighting_mode: "Режим виділення" + display_representation: "Режим відображення" + show_hierarchies: "Режим відображення" + starred: "Обрані" + hidden: "Приховано" + manual_sorting: "Порядок сортування вручну" + ordered_work_packages: "Порядок пакетів робіт" + include_subprojects: "Включити підпроєкти" + results: "Результати" relation: - lag: Затримка - from: Пов’язаний пакет робіт - to: Пов'язаний робочий пакет - relation_type: Тип зв’язку + lag: "Затримка" + from: "Пов’язаний пакет робіт" + to: "Пов'язаний робочий пакет" + relation_type: "Тип зв’язку" reminder: - remindable: Об’єкт нагадування - remind_at: Нагадати о - remind_at_date: Дата - remind_at_time: Час + remindable: "Об’єкт нагадування" + remind_at: "Нагадати о" + remind_at_date: "Дата" + remind_at_time: "Час" reminder_notification: - notification: Сповіщення + notification: "Сповіщення" repository: - url: Посилання + url: "Посилання" role: - permissions: Дозволи + permissions: "Дозволи" scim_client: - authentication_method: Метод автентифікації - jwt_sub: Потрібна тема + authentication_method: "Метод автентифікації" + jwt_sub: "Потрібна тема" status: - is_closed: Робочий пакет закритий - is_readonly: Пакет робіт лише для перегляду - excluded_from_totals: Виключити з підрахунку підсумків в ієрархії + is_closed: "Робочий пакет закритий" + is_readonly: "Пакет робіт лише для перегляду" + excluded_from_totals: "Виключити з підрахунку підсумків в ієрархії" default_done_ratio: "% завершення" token/named: - token_name: Ім’я маркера + token_name: "Ім’я маркера" token/ical: - calendar: Календар - ical_token_query_assignment: Призначення запиту + calendar: "Календар" + ical_token_query_assignment: "Призначення запиту" time_entry: - activity: Активність - hours: Години - spent_on: Дата - type: Тип - ongoing: Триває + activity: "Активність" + hours: "Години" + spent_on: "Дата" + type: "Тип" + ongoing: "Триває" type: - description: Текст за умовчанням для опису - attribute_groups: Конфігурація форми - is_in_roadmap: За умовчанням відображається в дорожній карті - is_default: Активовано для нових проектів за замовчуванням - is_milestone: Це віха - color: Колір - patterns: Шаблони + description: "Текст за умовчанням для опису" + attribute_groups: "Конфігурація форми" + is_in_roadmap: "За умовчанням відображається в дорожній карті" + is_default: "Активовано для нових проектів за замовчуванням" + is_milestone: "Це віха" + color: "Колір" + patterns: "Шаблони" remote_identity: - auth_source: Джерело автентифікації - integration: Інтеграція - user: Користувач + auth_source: "Джерело автентифікації" + integration: "Інтеграція" + user: "Користувач" user: - admin: Адміністратор - auth_source: Джерело автентифікації - ldap_auth_source: LDAP-підключення - identity_url: URL-адреса сутності - current_password: Поточний пароль - force_password_change: Примусово змінити пароль на наступному вході в систему - language: Мова - last_login_on: Останній вхід - failed_login_count: Спроби невдалого входу - first_name: Ім’я - last_name: Прізвище - first_login: Перший вхід - new_password: Новий пароль - password_confirmation: Підтвердження - consented_at: Згоден на + admin: "Адміністратор" + auth_source: "Джерело автентифікації" + ldap_auth_source: "LDAP-підключення" + identity_url: "URL-адреса сутності" + current_password: "Поточний пароль" + force_password_change: "Примусово змінити пароль на наступному вході в систему" + language: "Мова" + last_login_on: "Останній вхід" + failed_login_count: "Спроби невдалого входу" + first_name: "Ім’я" + last_name: "Прізвище" + first_login: "Перший вхід" + new_password: "Новий пароль" + password_confirmation: "Підтвердження" + consented_at: "Згоден на" group: - identity_url: URL-адреса ідентичності + identity_url: "URL-адреса ідентичності" user_preference: - header_look_and_feel: Оформлення - header_alerts: Сповіщення - button_update_look_and_feel: Оновити оформлення - button_update_alerts: Сповіщення про оновлення - button_update_user_information: Оновити профіль - comments_sorting: Відображати дії з пакетів робіт, відсортовані за - disable_keyboard_shortcuts: Вимкнути комбінації клавіш - disable_keyboard_shortcuts_caption_html: Ви можете вимкнути стандартні комбінації клавіш, якщо використовуєте невізуальний екран - або хочете, щоб відповідні дії не запускалися, коли ви натискаєте ці комбінації - клавіш випадково. - dismissed_enterprise_banners: Приховані банери Enterprise - impaired: Режим спеціальних можливостей - auto_hide_popups: Автоматично приховувати банери про успішне виконання - auto_hide_popups_caption: Якщо ввімкнено, зелені банери про успішне виконання - автоматично зникатимуть через 5 секунд. - warn_on_leaving_unsaved: Попереджати мене, коли залишив робочий пакет із незбереженими - змінами - increase_theme_contrast: Збільшити контрастність теми - increase_contrast: Збільшити контрастність - increase_contrast_caption: Вмикає високу контрастність для вибраного колірного - режиму. - force_light_theme_contrast: Примусово вмикати високу контрастність у світлому - режимі - force_dark_theme_contrast: Примусово вмикати високу контрастність у темному - режимі - force_light_theme_contrast_caption: Використовуватиметься висококонтрастна - версія світлого режиму, коли налаштовано автоматичний вибір колірного режиму. - force_dark_theme_contrast_caption: Використовуватиметься висококонтрастна - версія темного режиму, коли налаштовано автоматичний вибір колірного режиму. - theme: Колірний режим - time_zone: Часовий пояс - mode_guideline: Деякі режими перезаписують користувацькі кольори теми, щоб - поліпшити доступність і читабельність. Виберіть світлий режим, якщо потрібна - повна підтримка користувацької теми. - daily_reminders: Щоденні нагадування - workdays: Робочі дні + header_look_and_feel: "Оформлення" + header_alerts: "Сповіщення" + button_update_look_and_feel: "Оновити оформлення" + button_update_alerts: "Сповіщення про оновлення" + button_update_user_information: "Оновити профіль" + comments_sorting: "Відображати дії з пакетів робіт, відсортовані за" + disable_keyboard_shortcuts: "Вимкнути комбінації клавіш" + disable_keyboard_shortcuts_caption_html: |- + Ви можете вимкнути стандартні комбінації клавіш, якщо використовуєте невізуальний екран або хочете, щоб відповідні дії не запускалися, коли ви натискаєте ці комбінації клавіш випадково. + dismissed_enterprise_banners: "Приховані банери Enterprise" + impaired: "Режим спеціальних можливостей" + auto_hide_popups: "Автоматично приховувати банери про успішне виконання" + auto_hide_popups_caption: "Якщо ввімкнено, зелені банери про успішне виконання автоматично зникатимуть через 5 секунд." + warn_on_leaving_unsaved: "Попереджати мене, коли залишив робочий пакет із незбереженими змінами" + increase_theme_contrast: "Збільшити контрастність теми" + increase_contrast: "Збільшити контрастність" + increase_contrast_caption: "Вмикає високу контрастність для вибраного колірного режиму." + force_light_theme_contrast: "Примусово вмикати високу контрастність у світлому режимі" + force_dark_theme_contrast: "Примусово вмикати високу контрастність у темному режимі" + force_light_theme_contrast_caption: "Використовуватиметься висококонтрастна версія світлого режиму, коли налаштовано автоматичний вибір колірного режиму." + force_dark_theme_contrast_caption: "Використовуватиметься висококонтрастна версія темного режиму, коли налаштовано автоматичний вибір колірного режиму." + theme: "Колірний режим" + time_zone: "Часовий пояс" + mode_guideline: "Деякі режими перезаписують користувацькі кольори теми, щоб поліпшити доступність і читабельність. Виберіть світлий режим, якщо потрібна повна підтримка користувацької теми." + daily_reminders: "Щоденні нагадування" + workdays: "Робочі дні" users/invitation/form_model: - principal_type: Тип запрошення - id_or_email: Ім‘я або електронна адреса + principal_type: "Тип запрошення" + id_or_email: "Ім‘я або електронна адреса" version: - effective_date: Дата закінчення - sharing: Поширення + effective_date: "Дата закінчення" + sharing: "Поширення" wiki_content: - text: Текст + text: "Текст" wiki_page: - parent_title: Головна сторінка - redirect_existing_links: Перенаправити існуючі посилання - text: Контент сторінки + parent_title: "Головна сторінка" + redirect_existing_links: "Перенаправити існуючі посилання" + text: "Контент сторінки" work_package: - ancestor: Нащадки - begin_insertion: Початок вставки - begin_deletion: Початок видалення - children: Субелементи - derived_done_ratio: Загальний % завершення - derived_remaining_hours: Загальний залишок роботи - derived_remaining_time: Загальний залишок роботи + ancestor: "Нащадки" #used for filtering of work packages that are descendants of a given work package + begin_insertion: "Початок вставки" + begin_deletion: "Початок видалення" + children: "Субелементи" + derived_done_ratio: "Загальний % завершення" + derived_remaining_hours: "Загальний залишок роботи" + derived_remaining_time: "Загальний залишок роботи" done_ratio: "% завершення" - duration: Тривалість - end_insertion: Кінець вставки - end_deletion: Кінець видалення - ignore_non_working_days: Ігнорувати неробочі дні + duration: "Тривалість" + end_insertion: "Кінець вставки" + end_deletion: "Кінець видалення" + ignore_non_working_days: "Ігнорувати неробочі дні" include_non_working_days: - title: Робочі дні - false: лише робочі дні - true: включати неробочі дні + title: "Робочі дні" + false: "лише робочі дні" + true: "включати неробочі дні" journal_internal: Внутрішній журнал - notify: Сповіщати - parent: Джерело - parent_issue: Батьківський об’єкт - parent_work_package: Батьківський об’єкт - priority: Пріоритет + notify: "Сповіщати" #used in custom actions + parent: "Джерело" + parent_issue: "Батьківський об’єкт" + parent_work_package: "Батьківський об’єкт" + priority: "Пріоритет" progress: "% завершення" - readonly: Лише читання - remaining_hours: Залишок роботи - remaining_time: Залишок роботи - shared_with_users: Доступ мають - schedule_manually: Ручне планування - spent_hours: Витрачений час - spent_time: Трудовитрати - subproject: Підпроект - time_entries: Час журналу - type: Тип - version: Версія - watcher: Спостерігач - import/jira_open_project_reference: - jira: Jira - jira_import: Jira import + readonly: "Лише читання" + remaining_hours: "Залишок роботи" + remaining_time: "Залишок роботи" + shared_with_users: "Доступ мають" + schedule_manually: "Ручне планування" + spent_hours: "Витрачений час" + spent_time: "Трудовитрати" + subproject: "Підпроект" + time_entries: "Час журналу" + type: "Тип" + version: "Версія" + watcher: "Спостерігач" errors: messages: - accepted: повинні бути прийняті. - after: має бути після %{date} - after_today: має бути в майбутньому. - after_or_equal_to: має бути після або рівним %{date} - before: має бути раніше %{date} - before_or_equal_to: має бути до або %{date} - blank: не може бути порожнім. + accepted: "повинні бути прийняті." + after: "має бути після %{date}" + after_today: "має бути в майбутньому." + after_or_equal_to: "має бути після або рівним %{date}" + before: "має бути раніше %{date}" + before_or_equal_to: "має бути до або %{date}" + blank: "не може бути порожнім." blank_nested: "– потрібно встановити властивість «%{property}»." cannot_delete_mapping: "– обов’язкове. Неможливо видалити." - is_for_all_cannot_modify: призначений для всіх проєктів, тому його не можна - бути змінити. - cant_link_a_work_package_with_a_descendant: Робочий пакет не може бути пов'язаний - з одним з підзадач. - circular_dependency: Це співвідношення створить кругову залежність. - confirmation: не збігається %{attribute} + is_for_all_cannot_modify: "призначений для всіх проєктів, тому його не можна бути змінити." + cant_link_a_work_package_with_a_descendant: "Робочий пакет не може бути пов'язаний з одним з підзадач." + circular_dependency: "Це співвідношення створить кругову залежність." + confirmation: "не збігається %{attribute}" could_not_be_copied: "%{dependency} не вдалося скопіювати (повністю)." - does_not_exist: не існує. + does_not_exist: "не існує." error_enterprise_only: "%{action} можна лише у версії OpenProject Enterprise." error_unauthorized: "– можливо, немає доступу." - error_readonly: "– було здійснено спробу запису, але елемент недоступний для - запису." - error_conflict: Інформація була оновлена принаймні один інший користувач в - той же час. - error_not_found: не знайдено. + error_readonly: "– було здійснено спробу запису, але елемент недоступний для запису." + error_conflict: "Інформація була оновлена принаймні один інший користувач в той же час." + error_not_found: "не знайдено." email: "– це не дійсна електронна адреса." - empty: не може бути порожнім. - enterprise_plan_required: потрібен принаймні план %{plan_name}. - even: має бути рівним. - exclusion: зарезервовано. + empty: "не може бути порожнім." + enterprise_plan_required: "потрібен принаймні план %{plan_name}." + even: "має бути рівним." + exclusion: "зарезервовано." feature_disabled: недоступна. feature_disabled_for_project: вимкнено для цього проєкту. - file_too_large: занадто великий (максимальний розмір -%{count} байт) - filter_does_not_exist: фільтр не існує. - format: не відповідає очікуваному формату «%{expected}». - format_nested: не відповідає очікуваному формату «%{expected}» за шляхом «%{path}». - greater_than: має бути більше ніж %{count}. - greater_than_or_equal_to: має бути більшим або рівним %{count} - greater_than_or_equal_to_start_date: має бути більшою або дорівнювати даті - початку. - greater_than_start_date: має бути більше дати початку. - inclusion: не встановлено в одному з допустимих значень + file_too_large: "занадто великий (максимальний розмір -%{count} байт)" + filter_does_not_exist: "фільтр не існує." + format: "не відповідає очікуваному формату «%{expected}»." + format_nested: "не відповідає очікуваному формату «%{expected}» за шляхом «%{path}»." + greater_than: "має бути більше ніж %{count}." + greater_than_or_equal_to: "має бути більшим або рівним %{count}" + greater_than_or_equal_to_start_date: "має бути більшою або дорівнювати даті початку." + greater_than_start_date: "має бути більше дати початку." + inclusion: "не встановлено в одному з допустимих значень" inclusion_nested: "– не призначено одне з дозволених значень за шляхом «%{path}»." - invalid: зазначено невірно - invalid_url: не є дійсною URL-адресою. - invalid_url_scheme: 'не є підтримуваним протоколом (дозволено: %{allowed_schemes}).' - less_than_or_equal_to: має бути меншим або рівним %{count} + invalid: "зазначено невірно" + invalid_url: "не є дійсною URL-адресою." + invalid_url_scheme: "не є підтримуваним протоколом (дозволено: %{allowed_schemes})." + less_than_or_equal_to: "має бути меншим або рівним %{count}" not_available: "– недоступно через налаштування системи." - not_deletable: не можна видалити. - not_current_user: не поточний користувач. - only_one_active_sprint_allowed: дозволяється лише один активний спринт для - кожного проєкту. - not_found: не знайдено. - not_a_date: не є дійсною датою. - not_a_datetime: не є дійсним датою. - not_a_number: не є числом - 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: має бути непарним. - regex_match_failed: не збігається з регулярним виразом %{expression}. - regex_invalid: неможливо перевірити з відповідним регулярним виразом. - regex_list_invalid: Неможливо проаналізувати рядки %{invalid_lines} як регулярний - вираз. - hexcode_invalid: не є дійсним 6-значним шістнадцятковим кодом кольору. - smaller_than_or_equal_to_max_length: має бути меншою або дорівнює максимальній - довжині. - taken: вже прийнято. - too_long: 'занадто довгий (максимум - %{count} characters). - - ' - too_short: занадто короткий (мінімум %{count} символів). + not_deletable: "не можна видалити." + not_current_user: "не поточний користувач." + only_one_active_sprint_allowed: "дозволяється лише один активний спринт для кожного проєкту." + not_found: "не знайдено." + not_a_date: "не є дійсною датою." + not_a_datetime: "не є дійсним датою." + not_a_number: "не є числом" + 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: "має бути непарним." + regex_match_failed: "не збігається з регулярним виразом %{expression}." + regex_invalid: "неможливо перевірити з відповідним регулярним виразом." + regex_list_invalid: "Неможливо проаналізувати рядки %{invalid_lines} як регулярний вираз." + hexcode_invalid: "не є дійсним 6-значним шістнадцятковим кодом кольору." + smaller_than_or_equal_to_max_length: "має бути меншою або дорівнює максимальній довжині." + taken: "вже прийнято." + too_long: "занадто довгий (максимум - %{count} characters).\n" + too_short: "занадто короткий (мінімум %{count} символів)." type_mismatch: "– це не тип «%{type}»." type_mismatch_nested: "– це не тип «%{type}» за шляхом «%{path}»." - unchangeable: не можна змінити. + unchangeable: "не можна змінити." unknown_property: "– це не відома властивість." - unknown_property_nested: має невідомий шлях «%{path}». - unremovable: неможливо видалити. - url_not_secure_context: 'не надає контекст безпеки. Використовуйте HTTPS або - адресу loopback, наприклад localhost. - - ' - wrong_length: неправильна довжина (повинна бути %{count} символів). + unknown_property_nested: "має невідомий шлях «%{path}»." + unremovable: "неможливо видалити." + url_not_secure_context: > + не надає контекст безпеки. Використовуйте HTTPS або адресу loopback, наприклад localhost. + wrong_length: "неправильна довжина (повинна бути %{count} символів)." models: ldap_auth_source: attributes: tls_certificate_string: - invalid_certificate: 'Наданий сертифікат SSL неприпустимий: %{additional_message}' + invalid_certificate: "Наданий сертифікат SSL неприпустимий: %{additional_message}" format: "%{message}" attachment: attributes: content_type: - blank: Тип контенту файлу не може бути пустий. - not_allowlisted: Файл відхилено автоматичним фільтром. Завантаження - «%{value}» не дозволено. + blank: "Тип контенту файлу не може бути пустий." + not_allowlisted: "Файл відхилено автоматичним фільтром. Завантаження «%{value}» не дозволено." format: "%{message}" capability: context: - global: Глобальний + global: "Глобальний" query: filters: - minimum: має містити принаймні один фільтр для адміністратора доступу, - контексту або адміністратора з оператором «=». + minimum: "має містити принаймні один фільтр для адміністратора доступу, контексту або адміністратора з оператором «=»." custom_field: - at_least_one_custom_option: Необхідно мати принаймні один варіант. - previous_custom_field_recalculation_unprocessed: Перерахунок попередніх - змін для цього власного поля ще не було застосовано. Спробуйте повторити - спробу за кілька хвилин. + at_least_one_custom_option: "Необхідно мати принаймні один варіант." + previous_custom_field_recalculation_unprocessed: "Перерахунок попередніх змін для цього власного поля ще не було застосовано. Спробуйте повторити спробу за кілька хвилин." referenced_in_other_fields_html: one: "%{name} використовується при обчисленні атрибутів проєкту %{links}." few: "%{name} використовується при обчисленнях атрибутів проєкту: %{links}." @@ -2182,27 +1836,22 @@ uk: other: "%{name} використовується при обчисленнях атрибутів проєкту: %{links}." attributes: formula: - blank: Потрібно вказати формулу. - invalid: Формула недійсна. - invalid_characters: 'Допускаються лише числові значення, математичні - оператори й атрибути проєкту таких типів: ціле число, число з рухомою - комою, розраховане значення й список зважених елементів.' - not_allowed_custom_fields_referenced: Атрибут «%{custom_fields}» не - можна використовувати, оскільки це призведе до циклічного посилання; - один атрибут залежить від іншого. + blank: "Потрібно вказати формулу." + invalid: "Формула недійсна." + invalid_characters: "Допускаються лише числові значення, математичні оператори й атрибути проєкту таких типів: ціле число, число з рухомою комою, розраховане значення й список зважених елементів." + not_allowed_custom_fields_referenced: "Атрибут «%{custom_fields}» не можна використовувати, оскільки це призведе до циклічного посилання; один атрибут залежить від іншого." format: "%{message}" required: - cannot_be_true: не може мати значення true. + cannot_be_true: "не може мати значення true." custom_fields_project: attributes: project_ids: - blank: Виберіть проєкт. + blank: "Виберіть проєкт." custom_actions: only_one_allowed: "(%{name}) дозволено лише одне значення." empty: "(%{name}) значення не може бути порожнім." inclusion: "(%{name}) значення не встановлено в одне з допустимих значень." - not_logged_in: " (%{name}) Неможливо встановити значення, оскільки ви не - ввійшли в систему." + not_logged_in: " (%{name}) Неможливо встановити значення, оскільки ви не ввійшли в систему." not_an_integer: "(%{name}) не є цілим числом." smaller_than_or_equal_to: "(%{name}) має бути меншим або рівним %{count}." greater_than_or_equal_to: "(%{name}) має бути більшим або рівним %{count}." @@ -2210,497 +1859,427 @@ uk: doorkeeper/application: attributes: redirect_uri: - fragment_present: |- - 26/5000 - не може містити фрагмент. - invalid_uri: має бути дійсним URI. - relative_uri: має бути абсолютним URI. - secured_uri: не надає контекст безпеки. Використовуйте HTTPS або адресу - loopback, наприклад localhost. - forbidden_uri: заборонено сервером. + fragment_present: "26/5000\nне може містити фрагмент." + invalid_uri: "має бути дійсним URI." + relative_uri: "має бути абсолютним URI." + secured_uri: 'не надає контекст безпеки. Використовуйте HTTPS або адресу loopback, наприклад localhost.' + forbidden_uri: "заборонено сервером." scopes: - not_match_configured: не відповідає доступним областям. + not_match_configured: "не відповідає доступним областям." enterprise_trial: - already_used: уже використано для створення пробної версії. - failed_to_create: Не вдалося створити пробну версію (%{status}) - general_consent: Будь ласка, прийміть правила й умови використання. + already_used: "уже використано для створення пробної версії." + failed_to_create: "Не вдалося створити пробну версію (%{status})" + general_consent: "Будь ласка, прийміть правила й умови використання." enterprise_token: - only_one_trial: Активним може бути лише один пробний маркер. Видаліть попередній, - перш ніж додавати новий. - unreadable: неможливо прочитати. Ви впевнені, що це маркер підтримки? - already_added: Цей маркер уже додано. + only_one_trial: "Активним може бути лише один пробний маркер. Видаліть попередній, перш ніж додавати новий." + unreadable: "неможливо прочитати. Ви впевнені, що це маркер підтримки?" + already_added: "Цей маркер уже додано." favorite: - already_favorited: уже додано у вибране. + already_favorited: "уже додано у вибране." grids/grid: - overlaps: перекриваються. - outside: знаходиться за межами сітки. - end_before_start: кінцеве значення має бути більше початкового значення. + overlaps: "перекриваються." + outside: "знаходиться за межами сітки." + end_before_start: "кінцеве значення має бути більше початкового значення." ical_token_query_assignment: attributes: name: blank: "– обов’язковий атрибут. Виберіть ім’я." - not_unique: уже використовується. Виберіть інше ім’я. + not_unique: "уже використовується. Виберіть інше ім’я." meeting: - error_conflict: Не вдалося зберегти, тому що зустріч була оновлена кимось - іншим в цей час. Будь ласка, перезавантажте сторінку. + error_conflict: "Не вдалося зберегти, тому що зустріч була оновлена кимось іншим в цей час. Будь ласка, перезавантажте сторінку." message: - cannot_move_message_to_forum_of_different_project: Повідомлення не можна - перенести на форум іншого проєкту. + cannot_move_message_to_forum_of_different_project: "Повідомлення не можна перенести на форум іншого проєкту." notifications: - at_least_one_channel: Необхідно вказати принаймні один канал для надсилання - сповіщень. + at_least_one_channel: "Необхідно вказати принаймні один канал для надсилання сповіщень." attributes: read_ian: read_on_creation: "– не можна встановити як true під час створення сповіщень." mail_reminder_sent: set_on_creation: "– не можна встановити як true під час створення сповіщень." reason: - no_notification_reason: "– потрібно вказати, оскільки як канал вибрано - сповіщення в додатку." + no_notification_reason: "– потрібно вказати, оскільки як канал вибрано сповіщення в додатку." reason_mail_digest: - no_notification_reason: "– потрібно вказати, оскільки як канал вибрано - поштову розсилку." + no_notification_reason: "– потрібно вказати, оскільки як канал вибрано поштову розсилку." non_working_day: attributes: date: - taken: Неробочий день уже створено для дати %{value}. + taken: "Неробочий день уже створено для дати %{value}." format: "%{message}" parse_schema_filter_params_service: attributes: base: - unsupported_operator: Оператор не підтримується. - invalid_values: Значення недійсне. - id_filter_required: Необхідний фільтр "id". + unsupported_operator: "Оператор не підтримується." + invalid_values: "Значення недійсне." + id_filter_required: "Необхідний фільтр \"id\"." project: - archived_ancestor: У проєкту є архівований предок. - foreign_wps_reference_version: Пакети робіт у ненащадкових проєктах посилаються - на версії цього проєкту або його нащадків. - cannot_be_assigned_to_artifact_work_package: Вибраного користувача не дозволяється - призначати для пакетів робіт. + archived_ancestor: "У проєкту є архівований предок." + foreign_wps_reference_version: "Пакети робіт у ненащадкових проєктах посилаються на версії цього проєкту або його нащадків." + cannot_be_assigned_to_artifact_work_package: "Вибраного користувача не дозволяється призначати для пакетів робіт." attributes: base: - archive_permission_missing_on_subprojects: У вас немає дозволів для - архівації всіх підпроєктів. Зверніться до адміністратора. - project_initiation_request_disabled: Запит на ініціювання проєкту вимкнено. - Щоб створити пакет робіт артефакту, його потрібно ввімкнути. + archive_permission_missing_on_subprojects: "У вас немає дозволів для архівації всіх підпроєктів. Зверніться до адміністратора." + project_initiation_request_disabled: "Запит на ініціювання проєкту вимкнено. Щоб створити пакет робіт артефакту, його потрібно ввімкнути." types: - in_use_by_work_packages: 'як і раніше використовуються робочі пакети: - %{types}' + in_use_by_work_packages: "як і раніше використовуються робочі пакети: %{types}" enabled_modules: - dependency_missing: Модуль «%{dependency}» потрібно також увімкнути, - оскільки від нього залежить модуль «%{module}». + dependency_missing: "Модуль «%{dependency}» потрібно також увімкнути, оскільки від нього залежить модуль «%{module}»." format: "%{message}" project_custom_field_project_mapping: attributes: project_ids: - blank: Виберіть проєкт. + blank: "Виберіть проєкт." project/phase: attributes: start_date: - must_be_before_finish_date: має передувати даті закінчення. - non_continuous_dates: не може передувати даті закінчення попереднього - етапу. + must_be_before_finish_date: "має передувати даті закінчення." + non_continuous_dates: "не може передувати даті закінчення попереднього етапу." finish_date: - must_be_after_start_date: має слідувати за датою початку. - cannot_be_a_non_working_day: не може припадати на неробочий день. + must_be_after_start_date: "має слідувати за датою початку." + cannot_be_a_non_working_day: "не може припадати на неробочий день." query: attributes: public: - error_unauthorized: "- Користувач не має дозволу на створення загальнодоступних - переглядів." + error_unauthorized: "- Користувач не має дозволу на створення загальнодоступних переглядів." group_by: - invalid: Неможливо групувати за %{value} + invalid: "Неможливо групувати за %{value}" format: "%{message}" column_names: - invalid: 'Недійсний стовпець запиту: %{value}' + invalid: "Недійсний стовпець запиту: %{value}" format: "%{message}" sort_criteria: - invalid: 'Неможливо сортувати за стовпцями: %{value}' + invalid: "Неможливо сортувати за стовпцями: %{value}" format: "%{message}" timestamps: - invalid: 'Мітки часу містять неприпустимі значення: %{values}' - forbidden: 'Мітки часу містять заборонені значення: %{values}' + invalid: "Мітки часу містять неприпустимі значення: %{values}" + forbidden: "Мітки часу містять заборонені значення: %{values}" format: "%{message}" selects: - name_not_included: Потрібно додати стовпець «Ім’я» - nonexistent: Стовпець «%{column}» не існує. + name_not_included: "Потрібно додати стовпець «Ім’я»" + nonexistent: "Стовпець «%{column}» не існує." format: "%{message}" - group_by_hierarchies_exclusive: є взаємовиключним з групою %{group_by} Ви - не можете активувати обидва. - can_only_be_modified_by_owner: Запит може змінити лише його власник. - need_permission_to_modify_public_query: Ви не можете змінити загальнодоступний - запит. + group_by_hierarchies_exclusive: "є взаємовиключним з групою %{group_by} Ви не можете активувати обидва." + can_only_be_modified_by_owner: "Запит може змінити лише його власник." + need_permission_to_modify_public_query: "Ви не можете змінити загальнодоступний запит." filters: custom_fields: - inexistent: Немає спеціального поля для фільтра. + inexistent: "Немає спеціального поля для фільтра." queries/filters/base: attributes: values: - inclusion: фільтр має неприпустимі значення. + inclusion: "фільтр має неприпустимі значення." format: "%{message}" queries/principals/filters/internal_mentionable_on_work_package_filter: attributes: values: - single_value_requirement: має бути одним пакетом робіт + single_value_requirement: "має бути одним пакетом робіт" relation: typed_dag: - circular_dependency: Відносини створюють коло відносин. + circular_dependency: "Відносини створюють коло відносин." attributes: base: - error_not_deletable: Цей зв’язок не можна видалити, оскільки ви не маєте - дозволів, потрібних для редагування вибраного пакета робіт. - error_not_editable: Цей зв’язок не можна змінити, оскільки ви не маєте - дозволів, потрібних для редагування вибраного пакета робіт. + error_not_deletable: "Цей зв’язок не можна видалити, оскільки ви не маєте дозволів, потрібних для редагування вибраного пакета робіт." + error_not_editable: "Цей зв’язок не можна змінити, оскільки ви не маєте дозволів, потрібних для редагування вибраного пакета робіт." to_id: - format: Вибраний пакет робіт %{message} - error_not_found: не вдалося знайти. - error_readonly: не можна змінити для наявних зв’язків. - error_not_manageable: не можна додати, оскільки ви не маєте дозволів, - потрібних для його редагування. + format: "Вибраний пакет робіт %{message}" + error_not_found: "не вдалося знайти." + error_readonly: "не можна змінити для наявних зв’язків." + error_not_manageable: "не можна додати, оскільки ви не маєте дозволів, потрібних для його редагування." from_id: - format: Вибраний пакет робіт %{message} - error_not_found: не вдалося знайти. - error_readonly: не можна змінити для наявних зв’язків. - error_not_manageable: не можна додати, оскільки ви не маєте дозволів, - потрібних для його редагування. + format: "Вибраний пакет робіт %{message}" + error_not_found: "не вдалося знайти." + error_readonly: "не можна змінити для наявних зв’язків." + error_not_manageable: "не можна додати, оскільки ви не маєте дозволів, потрібних для його редагування." repository: - not_available: Постачальник SCM недоступний - not_whitelisted: не дозволяється конфігурацією. - invalid_url: не є дійсним URL-адресою або контуром сховища. - must_not_be_ssh: не повинна бути URL-адресою SSH. - no_directory: не є каталогом. + not_available: "Постачальник SCM недоступний" + not_whitelisted: "не дозволяється конфігурацією." + invalid_url: "не є дійсним URL-адресою або контуром сховища." + must_not_be_ssh: "не повинна бути URL-адресою SSH." + no_directory: "не є каталогом." role: attributes: permissions: - dependency_missing: потрібно також вказати '%{dependency}' оскільки - вибрано '%{permission}'. + dependency_missing: "потрібно також вказати '%{dependency}' оскільки вибрано '%{permission}'." setting: attributes: base: - working_days_are_missing: Принаймні один день тижня має бути визначено - як робочий. - previous_working_day_changes_unprocessed: Попередні зміни конфігурації - робочих днів ще не застосовано. - hours_per_day_are_missing: Потрібно визначити кількість годин на день. - durations_are_not_positive_numbers: Тривалість має бути додатним числом. - hours_per_day_is_out_of_bounds: Кількість годин на день не може перевищувати - 24 + working_days_are_missing: "Принаймні один день тижня має бути визначено як робочий." + previous_working_day_changes_unprocessed: "Попередні зміни конфігурації робочих днів ще не застосовано." + hours_per_day_are_missing: "Потрібно визначити кількість годин на день." + durations_are_not_positive_numbers: "Тривалість має бути додатним числом." + hours_per_day_is_out_of_bounds: "Кількість годин на день не може перевищувати 24" status: attributes: default_done_ratio: - inclusion: має бути в діапазоні від 0 до 100. - readonly_default_exlusive: "– не можна активувати для статусів, позначених - як стандартні." + inclusion: "має бути в діапазоні від 0 до 100." + readonly_default_exlusive: "– не можна активувати для статусів, позначених як стандартні." time_entry: attributes: hours: - day_limit: "– завелике значення, оскільки на одну дату можна зареєструвати - лише щонайбільше 24 години." + day_limit: "– завелике значення, оскільки на одну дату можна зареєструвати лише щонайбільше 24 години." user_preference: attributes: pause_reminders: - invalid_range: може належати лише до припустимого інтервалу дат. + invalid_range: "може належати лише до припустимого інтервалу дат." daily_reminders: full_hour: "– можна налаштувати отримання лише на початку кожної години." notification_settings: - only_one_global_setting: Має існувати лише одне глобальне налаштування - сповіщень. - email_alerts_global: Налаштування сповіщень електронною поштою можна - встановити лише глобально. + only_one_global_setting: "Має існувати лише одне глобальне налаштування сповіщень." + email_alerts_global: "Налаштування сповіщень електронною поштою можна встановити лише глобально." format: "%{message}" - wrong_date: Неправильні значення атрибутів «Дата початку», «Дата закінчення» - або «Прострочено». + wrong_date: "Неправильні значення атрибутів «Дата початку», «Дата закінчення» або «Прострочено»." watcher: attributes: user_id: - not_allowed_to_view: не може переглядати цей ресурс. - locked: заблоковано. + not_allowed_to_view: "не може переглядати цей ресурс." + locked: "заблоковано." wiki_page: - error_conflict: Хтось змінив вікі-сторінку, поки ви її редагували. + error_conflict: "Хтось змінив вікі-сторінку, поки ви її редагували." attributes: slug: undeducible: "– не можна вирахувати із заголовка «%{title}»." work_package: - is_not_a_valid_target_for_time_entries: 'Робочий пакет #%{id} не є дійсною - ціллю для перепризначення записів часу.' + is_not_a_valid_target_for_time_entries: "Робочий пакет #%{id} не є дійсною ціллю для перепризначення записів часу." attributes: id: format: "%{message}" - cannot_add_child_because_of_lack_of_permission: Не вдалося додати дочірній - елемент, оскільки у вас немає дозволів для редагування вибраного пакета - робіт. - blank: Поле «ID» не може бути порожнє. + cannot_add_child_because_of_lack_of_permission: "Не вдалося додати дочірній елемент, оскільки у вас немає дозволів для редагування вибраного пакета робіт." + blank: "Поле «ID» не може бути порожнє." assigned_to: format: "%{message}" done_ratio: - does_not_match_work_and_remaining_work: не збігається зі значеннями - атрибутів «Робота» й «Залишок роботи» - cannot_be_set_when_work_is_zero: не можна встановити, коли атрибут «Робота» - дорівнює 0 год - must_be_set_when_remaining_work_is_set: потрібно вказати, якщо визначено - атрибут «Залишок роботи». - must_be_set_when_work_and_remaining_work_are_set: потрібно вказати, - якщо визначено атрибути «Робота» й «Залишок роботи». - inclusion: має бути в діапазоні від 0 до 100. + does_not_match_work_and_remaining_work: "не збігається зі значеннями атрибутів «Робота» й «Залишок роботи»" + cannot_be_set_when_work_is_zero: "не можна встановити, коли атрибут «Робота» дорівнює 0 год" + must_be_set_when_remaining_work_is_set: "потрібно вказати, якщо визначено атрибут «Залишок роботи»." + must_be_set_when_work_and_remaining_work_are_set: "потрібно вказати, якщо визначено атрибути «Робота» й «Залишок роботи»." + inclusion: "має бути в діапазоні від 0 до 100." due_date: - not_start_date: не на дату початку, хоча це потрібно для етапів. - cannot_be_null: не може мати нульове значення, оскільки задано дату - початку й тривалість. + not_start_date: "не на дату початку, хоча це потрібно для етапів." + cannot_be_null: "не може мати нульове значення, оскільки задано дату початку й тривалість." duration: - larger_than_dates: більша за інтервал між датами початку й закінчення. - smaller_than_dates: менша за інтервал між датами початку й закінчення. - not_available_for_milestones: недоступна для пакетів робіт типу «віха». - cannot_be_null: не може мати нульове значення, оскільки задано дату - закінчення й тривалість. + larger_than_dates: "більша за інтервал між датами початку й закінчення." + smaller_than_dates: "менша за інтервал між датами початку й закінчення." + not_available_for_milestones: "недоступна для пакетів робіт типу «віха»." + cannot_be_null: "не може мати нульове значення, оскільки задано дату закінчення й тривалість." not_an_integer: "– не дійсна тривалість." parent: - cannot_be_milestone: не може бути важливою подією. + cannot_be_milestone: "не може бути важливою подією." cannot_be_self_assigned: "– не можна призначити собі." - cannot_be_in_another_project: не може бути в іншому проекті. - not_a_valid_parent: зазначено невірно + cannot_be_in_another_project: "не може бути в іншому проекті." + not_a_valid_parent: "зазначено невірно" schedule_manually: - cannot_be_automatically_scheduled: не може мати значення false (автоматично - заплановано), оскільки не має попередників або дочірніх елементів. + cannot_be_automatically_scheduled: "не може мати значення false (автоматично заплановано), оскільки не має попередників або дочірніх елементів." start_date: - violates_relationships: може бути встановлено лише для %{soonest_start} - або пізнішої версії, щоб не порушувати зв'язки робочого пакету. - cannot_be_null: не може мати нульове значення, оскільки задано дату - початку й тривалість. + violates_relationships: "може бути встановлено лише для %{soonest_start} або пізнішої версії, щоб не порушувати зв'язки робочого пакету." + cannot_be_null: "не може мати нульове значення, оскільки задано дату початку й тривалість." status_id: - status_transition_invalid: є недійсним оскільки немає дійсного переходу - від старого до нового статусу ролей поточного користувача. - status_invalid_in_type: недійсний, оскільки поточного стану не існує - в цьому типі. + status_transition_invalid: "є недійсним оскільки немає дійсного переходу від старого до нового статусу ролей поточного користувача." + status_invalid_in_type: "недійсний, оскільки поточного стану не існує в цьому типі." type: - cannot_be_milestone_due_to_children: не може бути важливою межой, оскільки - цей робочий пакет має похідні. + cannot_be_milestone_due_to_children: "не може бути важливою межой, оскільки цей робочий пакет має похідні." priority_id: - only_active_priorities_allowed: має бути активним. + only_active_priorities_allowed: "має бути активним." category: - only_same_project_categories_allowed: Категорія комплекс робіт повинен - бути в межах одного проекту як комплексу робіт. - does_not_exist: Указана категорія не існує. + only_same_project_categories_allowed: "Категорія комплекс робіт повинен бути в межах одного проекту як комплексу робіт." + does_not_exist: "Указана категорія не існує." estimated_hours: not_a_number: "– не дійсна тривалість." - cant_be_inferior_to_remaining_work: має дорівнювати значенню «Залишок - роботи» або перевищувати його. - must_be_set_when_remaining_work_and_percent_complete_are_set: потрібно - вказати, якщо визначено атрибути «Залишок роботи» й «% завершення». + cant_be_inferior_to_remaining_work: "має дорівнювати значенню «Залишок роботи» або перевищувати його." + must_be_set_when_remaining_work_and_percent_complete_are_set: "потрібно вказати, якщо визначено атрибути «Залишок роботи» й «% завершення»." remaining_hours: not_a_number: "– не дійсна тривалість." - cant_exceed_work: не може перевищувати значення атрибута «Робота». - must_be_set_when_work_is_set: потрібно вказати, якщо визначено атрибут - «Робота». - must_be_set_when_work_and_percent_complete_are_set: потрібно вказати, - якщо визначено атрибути «Робота» й «% завершення». - must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: ">- - має дорівнювати 0 год, якщо вибрано варіант «Робота» й атрибут «% завершення» - становить 100%." - must_be_empty_when_work_is_empty_and_percent_complete_is_100p: має бути - пустим, якщо визначено атрибути «Робота» й «% завершення». - readonly_status: Пакет робіт перебуває в стані лише для читання, тому його - атрибути не можна змінити. + cant_exceed_work: "не може перевищувати значення атрибута «Робота»." + must_be_set_when_work_is_set: "потрібно вказати, якщо визначено атрибут «Робота»." + must_be_set_when_work_and_percent_complete_are_set: "потрібно вказати, якщо визначено атрибути «Робота» й «% завершення»." + must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: '>- має дорівнювати 0 год, якщо вибрано варіант «Робота» й атрибут «% завершення» становить 100%.' + must_be_empty_when_work_is_empty_and_percent_complete_is_100p: >- + має бути пустим, якщо визначено атрибути «Робота» й «% завершення». + readonly_status: "Пакет робіт перебуває в стані лише для читання, тому його атрибути не можна змінити." type: attributes: attribute_groups: - attribute_unknown: Використовується недійсний атрибут робочого пакету. - attribute_unknown_name: Недійсний атрибут робочого пакета:%{attribute} - duplicate_group: Назва групи %{group} використовується більше одного - разу. Назви груп повинні бути унікальними. - query_invalid: 'Вбудований запит %{group} недійсний: %{details}' - group_without_name: Неназвані групи не дозволені. + attribute_unknown: "Використовується недійсний атрибут робочого пакету." + attribute_unknown_name: "Недійсний атрибут робочого пакета:%{attribute}" + duplicate_group: "Назва групи %{group} використовується більше одного разу. Назви груп повинні бути унікальними." + query_invalid: "Вбудований запит %{group} недійсний: %{details}" + group_without_name: "Неназвані групи не дозволені." patterns: - invalid_tokens: Один або кілька атрибутів усередині поля недійсні. Виправте - їх, перш ніж зберігати. + invalid_tokens: "Один або кілька атрибутів усередині поля недійсні. Виправте їх, перш ніж зберігати." user: attributes: base: - user_limit_reached: Досягнуто ліміту користувачів. За поточним тарифним - планом більше не можна створювати облікових записів. - one_must_be_active: Користувача з правами адміністратора не можна заблокувати - або вилучити. Має бути активний принаймні один адміністратор. + user_limit_reached: "Досягнуто ліміту користувачів. За поточним тарифним планом більше не можна створювати облікових записів." + one_must_be_active: "Користувача з правами адміністратора не можна заблокувати або вилучити. Має бути активний принаймні один адміністратор." password_confirmation: - confirmation: Підтвердження пароля та пароль не збігаються. + confirmation: "Підтвердження пароля та пароль не збігаються." format: "%{message}" password: - weak: 'Має містити символи таких класів (принаймні %{min_count} з %{all_count}): - %{rules}' - lowercase: нижній реєстр шрифту (наприклад, 'a') - uppercase: верхній реєстр шрифту (наприклад, 'А') - numeric: числовий (наприклад, '1') - special: спеціальний (наприклад, '%') + weak: "Має містити символи таких класів (принаймні %{min_count} з %{all_count}): %{rules}" + lowercase: "нижній реєстр шрифту (наприклад, 'a')" + uppercase: "верхній реєстр шрифту (наприклад, 'А')" + numeric: "числовий (наприклад, '1')" + special: "спеціальний (наприклад, '%')" reused: - one: раніше використовувався. Виберіть один, який відрізняється від - вашого останнього. - few: раніше використовувався. Виберіть той, який відрізняється від - вашого останнього %{count}. - many: раніше використовувався. Виберіть той, який відрізняється від - вашого останнього %{count}. - other: раніше використовувався. Виберіть той, який відрізняється від - вашого останнього %{count}. + one: "раніше використовувався. Виберіть один, який відрізняється від вашого останнього." + few: "раніше використовувався. Виберіть той, який відрізняється від вашого останнього %{count}." + many: "раніше використовувався. Виберіть той, який відрізняється від вашого останнього %{count}." + other: "раніше використовувався. Виберіть той, який відрізняється від вашого останнього %{count}." match: - confirm: Підтвердіть новий пароль. - description: '"Підтвердження пароля" має відповідати введеному в полі - "Новий пароль".' + confirm: "Підтвердіть новий пароль." + description: "\"Підтвердження пароля\" має відповідати введеному в полі \"Новий пароль\"." status: - invalid_on_create: не є дійсним статусом для нових користувачів. + invalid_on_create: "не є дійсним статусом для нових користувачів." member: - principal_blank: Виберіть принаймні одного користувача або групу. - role_blank: повинні бути призначені. + principal_blank: "Виберіть принаймні одного користувача або групу." + role_blank: "повинні бути призначені." attributes: roles: - ungrantable: має невідповідну роль. - more_than_one: має більше ніж одну роль. + ungrantable: "має невідповідну роль." + more_than_one: "має більше ніж одну роль." principal: - unassignable: не можна призначити проекту. + unassignable: "не можна призначити проекту." version: - undeletable_archived_projects: Версію не можна видалити, оскільки до неї - приєднані робочі пакети. - undeletable_work_packages_attached: Версію не можна видалити, оскільки до - неї приєднані робочі пакети. + undeletable_archived_projects: "Версію не можна видалити, оскільки до неї приєднані робочі пакети." + undeletable_work_packages_attached: "Версію не можна видалити, оскільки до неї приєднані робочі пакети." token/named: attributes: token_name: - blank: Укажіть ім’я маркера - in_use: Це ім’я маркера вже використовується; виберіть інше + blank: "Укажіть ім’я маркера" + in_use: "Це ім’я маркера вже використовується; виберіть інше" format: "%{message}" jira: - invalid_protocol: Укажіть дійсний протокол (http або https) + invalid_protocol: "Укажіть дійсний протокол (http або https)" template: - body: 'Перевірте наступні поля:' + body: "Перевірте наступні поля:" header: - one: 1 помилка заборонила це %{model} від збереження + one: "1 помилка заборонила це %{model} від збереження" few: "%{count} помилка заборонила це %{model} від збереження" many: "%{count} помилка заборонила це %{model} від збереження" other: "%{count} помилка заборонила це %{model} від збереження" models: - attachment: Файл + attachment: "Файл" attribute_help_text: - one: Текст довідки атрибута - few: Тексти довідки атрибутів - many: Тексти довідки атрибутів - other: Тексти довідки атрибутів + one: "Текст довідки атрибута" + few: "Тексти довідки атрибутів" + many: "Тексти довідки атрибутів" + other: "Тексти довідки атрибутів" auth_provider: - one: Постачальник послуг автентифікації - few: Постачальники послуг автентифікації - many: Постачальники послуг автентифікації - other: Постачальники послуг автентифікації - category: Категорія - color: Колір - comment: Коментар - custom_action: Спеціальні дії - custom_field: Користувацьке поле - customized: Персоналізовано - doorkeeper/application: Програма OAuth + one: "Постачальник послуг автентифікації" + few: "Постачальники послуг автентифікації" + many: "Постачальники послуг автентифікації" + other: "Постачальники послуг автентифікації" + category: "Категорія" + color: "Колір" + comment: "Коментар" + custom_action: "Спеціальні дії" + custom_field: "Користувацьке поле" + customized: "Персоналізовано" + "doorkeeper/application": "Програма OAuth" enterprise_token: - one: Маркер Enterprise - few: Маркери Enterprise - many: Маркери Enterprise - other: Маркери Enterprise - forum: Форум - global_role: Глобальна роль - group: Група + one: "Маркер Enterprise" + few: "Маркери Enterprise" + many: "Маркери Enterprise" + other: "Маркери Enterprise" + forum: "Форум" + global_role: "Глобальна роль" + group: "Група" issue_priority: - one: Пріоритет - few: Пріоритети - many: Пріоритети - other: Пріоритети - meeting_participant: Учасник наради - member: Учасник - news: Новини + one: "Пріоритет" + few: "Пріоритети" + many: "Пріоритети" + other: "Пріоритети" + meeting_participant: "Учасник наради" + member: "Учасник" + news: "Новини" notification: - one: Сповіщення - few: Сповіщення - many: Сповіщення - other: Сповіщення - placeholder_user: Прототип користувача + one: "Сповіщення" + few: "Сповіщення" + many: "Сповіщення" + other: "Сповіщення" + placeholder_user: "Прототип користувача" project: - one: Проект - few: Проєкти - many: Проєкти - other: Проєкти + one: "Проект" + few: "Проєкти" + many: "Проєкти" + other: "Проєкти" project_query: - one: Список проєктів - few: Списки проєктів - many: Списки проєктів - other: Списки проєктів - query: Частковий запит - reminder: Нагадування + one: "Список проєктів" + few: "Списки проєктів" + many: "Списки проєктів" + other: "Списки проєктів" + query: "Частковий запит" + reminder: "Нагадування" role: - one: роль - few: Роль - many: Роль - other: Роль + one: "роль" + few: "Роль" + many: "Роль" + other: "Роль" scim_client: - one: Клієнт SCIM - few: Клієнти SCIM - many: Клієнти SCIM - other: Клієнти SCIM + one: "Клієнт SCIM" + few: "Клієнти SCIM" + many: "Клієнти SCIM" + other: "Клієнти SCIM" jira: - one: Jira - few: Jira - many: Jira - other: Jira - status: Стан робочого пакета + one: "Jira" + few: "Jira" + many: "Jira" + other: "Jira" + status: "Стан робочого пакета" token/api: one: Маркер доступу few: Маркери доступу many: Маркери доступу other: Маркери доступу token/rss: - one: Маркер RSS - few: Маркери RSS - many: Маркери RSS - other: Маркери RSS + one: "Маркер RSS" + few: "Маркери RSS" + many: "Маркери RSS" + other: "Маркери RSS" type: - one: Тип - few: Типи - many: Типи - other: Типи - user: Користувач - version: Версія - workflow: Робочий процес - work_package: Пакет робіт - wiki: Wiki - wiki_page: Сторінка Wiki + one: "Тип" + few: "Типи" + many: "Типи" + other: "Типи" + user: "Користувач" + version: "Версія" + workflow: "Робочий процес" + work_package: "Пакет робіт" + wiki: "Wiki" + wiki_page: "Сторінка Wiki" errors: header_invalid_fields: - one: 'Виникла проблема з таким полем:' - few: 'Виникли проблеми з такими полями:' - many: 'Виникли проблеми з такими полями:' - other: 'Виникли проблеми з такими полями:' + one: "Виникла проблема з таким полем:" + few: "Виникли проблеми з такими полями:" + many: "Виникли проблеми з такими полями:" + other: "Виникли проблеми з такими полями:" header_additional_invalid_fields: - one: 'Крім того, виникла проблема з таким полем:' - few: 'Крім того, виникли проблеми з такими полями:' - many: 'Крім того, виникли проблеми з такими полями:' - other: 'Крім того, виникли проблеми з такими полями:' - field_erroneous_label: |- - Це поле недійсне: %{full_errors} - Введіть дійсне значення. + one: "Крім того, виникла проблема з таким полем:" + few: "Крім того, виникли проблеми з такими полями:" + many: "Крім того, виникли проблеми з такими полями:" + other: "Крім того, виникли проблеми з такими полями:" + field_erroneous_label: "Це поле недійсне: %{full_errors}\nВведіть дійсне значення." messages: - must_be_template: має бути шаблоном - unsupported_storage_type: не є типом сховища, що підтримується. - storage_error: Помилка з’єднання зі сховищем. - invalid_input: Введено недійсні дані. + must_be_template: "має бути шаблоном" + unsupported_storage_type: "не є типом сховища, що підтримується." + storage_error: "Помилка з’єднання зі сховищем." + invalid_input: "Введено недійсні дані." activity: item: - created_by_on: створено %{datetime} користувачем %{user} - created_by_on_time_entry: час зареєстровано о %{datetime} користувачем %{user} - created_on: створено %{datetime} - created_on_time_entry: час зареєстровано о %{datetime} - updated_by_on: оновлено %{datetime} користувачем %{user} - updated_by_on_time_entry: зареєстрований час оновлено о %{datetime} користувачем - %{user} - updated_on: оновлено %{datetime} - updated_on_time_entry: зареєстрований час оновлено о %{datetime} - deleted_on: видалено %{datetime} - deleted_by_on: видалено %{datetime} користувачем %{user} - added_on: додано %{datetime} - added_by_on: додано %{datetime} користувачем %{user} - removed_on: вилучено %{datetime} - removed_by_on: вилучено %{datetime} користувачем %{user} - parent_without_of: Підпроєкт - parent_no_longer: Більше не входить у проєкт + created_by_on: "створено %{datetime} користувачем %{user}" + created_by_on_time_entry: "час зареєстровано о %{datetime} користувачем %{user}" + created_on: "створено %{datetime}" + created_on_time_entry: "час зареєстровано о %{datetime}" + updated_by_on: "оновлено %{datetime} користувачем %{user}" + updated_by_on_time_entry: "зареєстрований час оновлено о %{datetime} користувачем %{user}" + updated_on: "оновлено %{datetime}" + updated_on_time_entry: "зареєстрований час оновлено о %{datetime}" + deleted_on: "видалено %{datetime}" + deleted_by_on: "видалено %{datetime} користувачем %{user}" + added_on: "додано %{datetime}" + added_by_on: "додано %{datetime} користувачем %{user}" + removed_on: "вилучено %{datetime}" + removed_by_on: "вилучено %{datetime} користувачем %{user}" + parent_without_of: "Підпроєкт" + parent_no_longer: "Більше не входить у проєкт" time_entry: hour: one: "%{count} год" @@ -2712,526 +2291,498 @@ uk: few: "%{count} год" many: "%{count} год" other: "%{count} год" - updated: змінено з %{old_value} на %{value} - logged_for: Зареєстровано для + updated: "змінено з %{old_value} на %{value}" + logged_for: "Зареєстровано для" filter: - changeset: Набори змін - message: Форуми - news: Новини - project_details: Деталі проєкту - subproject: Включити підпроєкти - time_entry: Витрачений час - wiki_edit: Wiki - work_package: Пакети робіт + changeset: "Набори змін" + message: "Форуми" + news: "Новини" + project_details: "Деталі проєкту" + subproject: "Включити підпроєкти" + time_entry: "Витрачений час" + wiki_edit: "Wiki" + work_package: "Пакети робіт" project_phase: - activated: активовано - added_date: визначено як %{date} - changed_date: змінено з %{from} на %{to} - deactivated: деактивовано - deleted_project_phase: Видалений етап проєкту + activated: "активовано" + added_date: "визначено як %{date}" + changed_date: "змінено з %{from} на %{to}" + deactivated: "деактивовано" + deleted_project_phase: "Видалений етап проєкту" phase_and_both_gates: "%{phase_message}. %{start_gate_message} і %{finish_gate_message}" phase_and_one_gate: "%{phase_message}. %{gate_message}" - removed_date: видалено %{date} + removed_date: "видалено %{date}" + #common attributes of all models attributes: - active: Активний - assigned_to: Призначений - assignee: Виконавець - attachments: Вкладення - actor: Виконавець - action: Дія - api_key: Ключ API - author: Автор - avatar: Аватар - base: 'Загальна помилка:' - body: Текст - blocks_ids: Ідентифікатори заблокованих робочих пакетів - category: Категорія - comment: Коментар - comments: Коментар - content: Контент - color: Колір - creator: Автор - created_at: Створений - custom_field: Користувацьке поле - custom_options: Можливі значення - custom_values: Індивідуальні поля - date: Дата - dates_interval: Діапазон дат - default_columns: Типові колонки - description: Опис - derived_due_date: Отримана дата завершення - derived_estimated_hours: Загальний обсяг робіт - derived_start_date: Отримана дата початку - direction: Напрямок - display_sums: Відображати суми - domain: Домен - due_date: Дата закінчення - estimated_hours: Робота - estimated_time: Робота - email: Ел. адреса - entity_type: Сутність - expires_at: Термін дії минає - firstname: Ім'я - filter: Фільтр - group: Група - groups: Групи - hexcode: Двійковий код + active: "Активний" + assigned_to: "Призначений" + assignee: "Виконавець" + attachments: "Вкладення" + actor: "Виконавець" + action: "Дія" + api_key: "Ключ API" + author: "Автор" + avatar: "Аватар" + base: "Загальна помилка:" + body: "Текст" + blocks_ids: "Ідентифікатори заблокованих робочих пакетів" + category: "Категорія" + comment: "Коментар" + comments: "Коментар" + content: "Контент" + color: "Колір" + creator: "Автор" + created_at: "Створений" + custom_field: "Користувацьке поле" + custom_options: "Можливі значення" + custom_values: "Індивідуальні поля" + date: "Дата" + dates_interval: "Діапазон дат" + default_columns: "Типові колонки" + description: "Опис" + derived_due_date: "Отримана дата завершення" + derived_estimated_hours: "Загальний обсяг робіт" + derived_start_date: "Отримана дата початку" + direction: "Напрямок" + display_sums: "Відображати суми" + domain: "Домен" + due_date: "Дата закінчення" + estimated_hours: "Робота" + estimated_time: "Робота" + email: "Ел. адреса" + entity_type: "Сутність" + expires_at: "Термін дії минає" + firstname: "Ім'я" + filter: "Фільтр" + group: "Група" + groups: "Групи" + hexcode: "Двійковий код" id: "№" - is_default: Значення за замовчуванням - is_for_all: Для усіх проектів - public: Публічні - principal: Користувач або група - issue: Робочий пакет - journal: Журнал - journal_notes: Коментар - lastname: Прізвище - login: Ім'я користувача - lock_version: Заблокувати версію - mail: Електронна пошта - name: Назва - note: Примітка - notes: Примітки - number: Число - options: Опції - operator: Оператор - password: Пароль - priority: Пріоритет - project: Проєкт - project_ids: ID проєктів - project_phase: Етап проєкту - project_phase_definition: Етап проєкту - reason: Причина - responsible: Відповідальний - required: Обов'язкове поле - recipient: Одержувач - role: роль - roles: Роль - search: Пошук - sprint: Спринт - start_date: Початок - status: Статус - state: Стан - subject: Тема - slug: Слаг - summary: Резюме - template: Шаблон - time_zone: Часовий пояс - text: Текст - title: Назва - type: Тип - typeahead: Автозаповнення - uid: Унікальний ідентифікатор - updated_at: Оновлене - updated_on: Оновлено - uploader: Завантажувач - user: Користувач - username: Ім’я користувача - unit: Одиниця - value: Значення - values: Значення - version: Версія - visible: Видиме - work_package: Робочий пакет - work_package_id: Робочий пакет + is_default: "Значення за замовчуванням" + is_for_all: "Для усіх проектів" + public: "Публічні" + principal: "Користувач або група" + #kept for backwards compatibility + issue: "Робочий пакет" + journal: "Журнал" + journal_notes: "Коментар" + lastname: "Прізвище" + login: "Ім'я користувача" + lock_version: "Заблокувати версію" + mail: "Електронна пошта" + name: "Назва" + note: "Примітка" + notes: "Примітки" + number: "Число" + options: "Опції" + operator: "Оператор" + password: "Пароль" + priority: "Пріоритет" + project: "Проєкт" + project_ids: "ID проєктів" + project_phase: "Етап проєкту" + project_phase_definition: "Етап проєкту" + reason: "Причина" + responsible: "Відповідальний" + required: "Обов'язкове поле" + recipient: "Одержувач" + role: "роль" + roles: "Роль" + search: "Пошук" + sprint: "Спринт" + start_date: "Початок" + status: "Статус" + state: "Стан" + subject: "Тема" + slug: "Слаг" + summary: "Резюме" + template: "Шаблон" + time_zone: "Часовий пояс" + text: "Текст" + title: "Назва" + type: "Тип" + typeahead: "Автозаповнення" + uid: "Унікальний ідентифікатор" + updated_at: "Оновлене" + updated_on: "Оновлено" + uploader: "Завантажувач" + user: "Користувач" + username: "Ім’я користувача" + unit: "Одиниця" + value: "Значення" + values: "Значення" + version: "Версія" + visible: "Видиме" + work_package: "Робочий пакет" + work_package_id: "Робочий пакет" backup: - failed: Помилка резервної копії - label_backup_token: Маркер резервного копіювання - label_create_token: Створити маркер резервного копіювання - label_delete_token: Видалити маркер резервного копіювання - label_reset_token: Скинути маркер резервного копіювання - label_token_users: Наведені нижче користувачі мають активні маркери резервного - копіювання + failed: "Помилка резервної копії" + label_backup_token: "Маркер резервного копіювання" + label_create_token: "Створити маркер резервного копіювання" + label_delete_token: "Видалити маркер резервного копіювання" + label_reset_token: "Скинути маркер резервного копіювання" + label_token_users: "Наведені нижче користувачі мають активні маркери резервного копіювання" reset_token: action_create: Створити action_reset: Скинути - heading_reset: Скидання маркера резервного копіювання - heading_create: Створення маркера резервного копіювання - implications: 'Увімкнення резервних копій дасть змогу всім користувачам з обов’язковими - дозволами та цим маркером резервного копіювання завантажувати резервні копії - з усіма даними цього встановлення OpenProject. Це включає дані всіх інших - користувачів. - - ' - info: 'Щоб створити резервну копію, потрібно згенерувати маркер резервного копіювання. - Щоразу, коли ви хочете надіслати запит на резервне копіювання, знадобиться - надати цей маркер. Щоб вимкнути резервне копіювання для цього користувача, - видаліть цей маркер резервного копіювання. - - ' - verification: 'Введіть «%{word}», щоб підтвердити %{action} маркера резервного - копіювання. - - ' + heading_reset: "Скидання маркера резервного копіювання" + heading_create: "Створення маркера резервного копіювання" + implications: > + Увімкнення резервних копій дасть змогу всім користувачам з обов’язковими дозволами та цим маркером резервного копіювання завантажувати резервні копії з усіма даними цього встановлення OpenProject. Це включає дані всіх інших користувачів. + info: > + Щоб створити резервну копію, потрібно згенерувати маркер резервного копіювання. Щоразу, коли ви хочете надіслати запит на резервне копіювання, знадобиться надати цей маркер. Щоб вимкнути резервне копіювання для цього користувача, видаліть цей маркер резервного копіювання. + verification: > + Введіть «%{word}», щоб підтвердити %{action} маркера резервного копіювання. verification_word_reset: скидання verification_word_create: створення - warning: 'У разі створення нового маркера надіслати запит на резервне копіювання - можна тільки через 24 години. Це запобіжний захід. Після цього ви зможете - будь-коли надіслати запит на резервне копіювання за допомогою цього маркера. - - ' - text_token_deleted: Маркер резервного копіювання видалено. Резервні копії тепер - вимкнено. + warning: > + У разі створення нового маркера надіслати запит на резервне копіювання можна тільки через 24 години. Це запобіжний захід. Після цього ви зможете будь-коли надіслати запит на резервне копіювання за допомогою цього маркера. + text_token_deleted: Маркер резервного копіювання видалено. Резервні копії тепер вимкнено. error: invalid_token: Недійсний або відсутній маркер резервного копіювання - token_cooldown: Маркер резервного копіювання буде дійсний протягом %{hours} - год. + token_cooldown: Маркер резервного копіювання буде дійсний протягом %{hours} год. backup_pending: Очікується початок резервного копіювання. limit_reached: 'Ви можете створити лише стільки резервних копій на день: %{limit}.' - button_actions: Дії - button_add: Додати - button_add_comment: Додати коментар - button_add_item_above: Додати елемент вище - button_add_item_below: Додати елемент нижче - button_add_sub_item: Додати піделемент + button_actions: "Дії" + button_add: "Додати" + button_add_comment: "Додати коментар" + button_add_item_above: "Додати елемент вище" + button_add_item_below: "Додати елемент нижче" + button_add_sub_item: "Додати піделемент" button_add_member: Додати учасника - button_add_watcher: Додати спостерігача - button_annotate: Коментувати - button_apply: Застосувати - button_apply_changes: Застосувати зміни - button_archive: Архів - button_back: Назад - button_cancel: Скасувати - button_change: Змінити - button_change_parent_page: Змінити батьківську сторінку - button_change_password: Змінити пароль - button_check_all: Перевірити все - button_clear: Очистити - button_click_to_reveal: Натисніть, щоб показати - button_close: Закрити - button_collapse_all: Згорнути все - button_confirm: Підтвердити - button_configure: Настроювання - button_continue: Продовжити - button_complete: Завершити - button_copy: Копіювати - button_copy_to_clipboard: Копіювати в буфер обміну - button_copy_link_to_clipboard: Копіювати посилання в буфер обміну - button_create: Створити - button_create_and_continue: Створити та продовжити - button_decline: Відхилити - button_delete: Видалити - button_delete_permanently: Видалити назавжди - button_delete_watcher: Видалити спостерігача %{name} - button_download: Завантажити - button_disable: Вимкнути - button_duplicate: Дублювати - button_duplicate_and_follow: Дублювати й стежити - button_edit: Редагувати - button_enable: Увімкнути - button_edit_associated_wikipage: 'Редагувати пов’язану сторінку Wiki: %{page_title}' - button_expand_all: Розгорнути все - button_favorite: Додати в обране - button_filter: Фільтр - button_finish_setup: Завершити налаштування - button_generate: Згенерувати - button_list: Список - button_lock: Заблокувати - button_login: Увійти - button_move: Перемістити - button_move_and_follow: Перемістити і перейти - button_print: Друкувати - button_quote: Цитата + button_add_watcher: "Додати спостерігача" + button_annotate: "Коментувати" + button_apply: "Застосувати" + button_apply_changes: "Застосувати зміни" + button_archive: "Архів" + button_back: "Назад" + button_cancel: "Скасувати" + button_change: "Змінити" + button_change_parent_page: "Змінити батьківську сторінку" + button_change_password: "Змінити пароль" + button_check_all: "Перевірити все" + button_clear: "Очистити" + button_click_to_reveal: "Натисніть, щоб показати" + button_close: "Закрити" + button_collapse_all: "Згорнути все" + button_confirm: "Підтвердити" + button_configure: "Настроювання" + button_continue: "Продовжити" + button_complete: "Завершити" + button_copy: "Копіювати" + button_copy_to_clipboard: "Копіювати в буфер обміну" + button_copy_link_to_clipboard: "Копіювати посилання в буфер обміну" + button_create: "Створити" + button_create_and_continue: "Створити та продовжити" + button_decline: "Відхилити" + button_delete: "Видалити" + button_delete_permanently: "Видалити назавжди" + button_delete_watcher: "Видалити спостерігача %{name}" + button_download: "Завантажити" + button_disable: "Вимкнути" + button_duplicate: "Дублювати" + button_duplicate_and_follow: "Дублювати й стежити" + button_edit: "Редагувати" + button_enable: "Увімкнути" + button_edit_associated_wikipage: "Редагувати пов’язану сторінку Wiki: %{page_title}" + button_expand_all: "Розгорнути все" + button_favorite: "Додати в обране" + button_filter: "Фільтр" + button_finish_setup: "Завершити налаштування" + button_generate: "Згенерувати" + button_list: "Список" + button_lock: "Заблокувати" + button_login: "Увійти" + button_move: "Перемістити" + button_move_and_follow: "Перемістити і перейти" + button_print: "Друкувати" + button_quote: "Цитата" button_remove: Видалити - button_remove_permanently: Вилучити назавжди - button_remove_reminder: Вилучити нагадування - button_rename: Перейменувати - button_replace: Замінити - button_revoke: Скасувати - button_reply: Відповісти - button_reset: Скинути - button_rollback: Відкотити до даної версії - button_save: Зберегти - button_save_as: Зберегти як - button_save_back: Зберегти та повернутися назад - button_select: Вибрати - button_set_reminder: Установити нагадування - button_show: Показати - button_sort: Сортувати - button_submit: Підтвердити - button_test: Тест - button_unarchive: Розпакувати - button_uncheck_all: Зняти усі відмітки - button_unlock: Розблокувати - button_unfavorite: Вилучити з обраного - button_unwatch: Перестати відстежувати - button_update: Оновити - button_upgrade: Оновити - button_buy_now: Придбати зараз - button_upload: Завантажити - button_view: Перегляд - button_watch: Спостерігати - button_manage_menu_entry: Налаштувати пункт меню - button_add_menu_entry: Додати пункт меню - button_configure_menu_entry: Налаштувати пункт меню - button_delete_menu_entry: Видалити пункт меню - button_view_shared_work_packages: Переглянути спільні пакети робіт - button_manage_roles: Керувати ролями - button_remove_member: Вилучити учасника - button_remove_member_and_shares: Вилучити учасника й дозволи на доступ - button_revoke_work_package_shares: Відкликати дозволи на доступ до пакета робіт - button_revoke_access: Відкликати доступ - button_revoke_all: Відкликати все - button_revoke_only: Відкликати лише для ролі «%{shared_role_name}» - button_publish: Зробити загальнодоступним - button_unpublish: Зробити приватним + button_remove_permanently: "Вилучити назавжди" + button_remove_reminder: "Вилучити нагадування" + button_rename: "Перейменувати" + button_replace: "Замінити" + button_revoke: "Скасувати" + button_reply: "Відповісти" + button_reset: "Скинути" + button_rollback: "Відкотити до даної версії" + button_save: "Зберегти" + button_save_as: "Зберегти як" + button_save_back: "Зберегти та повернутися назад" + button_select: "Вибрати" + button_set_reminder: "Установити нагадування" + button_show: "Показати" + button_sort: "Сортувати" + button_submit: "Підтвердити" + button_test: "Тест" + button_unarchive: "Розпакувати" + button_uncheck_all: "Зняти усі відмітки" + button_unlock: "Розблокувати" + button_unfavorite: "Вилучити з обраного" + button_unwatch: "Перестати відстежувати" + button_update: "Оновити" + button_upgrade: "Оновити" + button_buy_now: "Придбати зараз" + button_upload: "Завантажити" + button_view: "Перегляд" + button_watch: "Спостерігати" + button_manage_menu_entry: "Налаштувати пункт меню" + button_add_menu_entry: "Додати пункт меню" + button_configure_menu_entry: "Налаштувати пункт меню" + button_delete_menu_entry: "Видалити пункт меню" + button_view_shared_work_packages: "Переглянути спільні пакети робіт" + button_manage_roles: "Керувати ролями" + button_remove_member: "Вилучити учасника" + button_remove_member_and_shares: "Вилучити учасника й дозволи на доступ" + button_revoke_work_package_shares: "Відкликати дозволи на доступ до пакета робіт" + button_revoke_access: "Відкликати доступ" + button_revoke_all: "Відкликати все" + button_revoke_only: "Відкликати лише для ролі «%{shared_role_name}»" + button_publish: "Зробити загальнодоступним" + button_unpublish: "Зробити приватним" consent: checkbox_label: Я проінформований і згоден з вищесказаним. failure_message: Згода не отримана, продовження неможливе. title: Згода користувача decline_warning_message: Ви відхилили згоду і вийшли з системи. - user_has_consented: Користувач надав згоду на [налаштований текст інформації про - згоду](consent_settings). - not_yet_consented: Користувач ще не надав згоду на [налаштований текст інформації - про згоду] (consent_settings). Він отримає нагадування під час наступного входу. - contact_mail_instructions: Визначте адресу електронної пошти, на яку користувачі - можуть звертатися, для запитів на зміну або видалення даних. - contact_your_administrator: Зверніться до свого адміністратора, якщо ви хочете, - щоб ваш обліковий запис був видалений. - contact_this_mail_address: Будь ласка зв'яжіться %{mail_address} якщо ви бажаєте, - щоб ваш обліковий запис був видалений. - text_update_consent_time: Установіть цей прапорець, щоб примусити користувачів - знову погодитися. Увімкнути, коли ви змінили юридичний аспект інформації про - згоду вище. - update_consent_last_time: 'Останнє оновлення згоди: %{update_time}' + user_has_consented: Користувач надав згоду на [налаштований текст інформації про згоду](consent_settings). + not_yet_consented: Користувач ще не надав згоду на [налаштований текст інформації про згоду] (consent_settings). Він отримає нагадування під час наступного входу. + contact_mail_instructions: Визначте адресу електронної пошти, на яку користувачі можуть звертатися, для запитів на зміну або видалення даних. + contact_your_administrator: Зверніться до свого адміністратора, якщо ви хочете, щоб ваш обліковий запис був видалений. + contact_this_mail_address: Будь ласка зв'яжіться %{mail_address} якщо ви бажаєте, щоб ваш обліковий запис був видалений. + text_update_consent_time: Установіть цей прапорець, щоб примусити користувачів знову погодитися. Увімкнути, коли ви змінили юридичний аспект інформації про згоду вище. + update_consent_last_time: "Останнє оновлення згоди: %{update_time}" copy_project: - title: Скопіювати проєкт «%{source_project_name}» - started: Почалось копіювання проекту "%{source_project_name}" у "%{target_project_name}". - Вас буде проінформовано за допомогою електронної пошти як тільки "%{target_project_name}" - буде доступний. - failed: Неможливо скопіювати проект %{source_project_name} - failed_internal: Копіювання не вдалося через внутрішню помилку. - succeeded: Створений проект %{target_project_name} - errors: Помилка - project_custom_fields: Спеціальні поля в проекті + title: 'Скопіювати проєкт «%{source_project_name}»' + started: 'Почалось копіювання проекту "%{source_project_name}" у "%{target_project_name}". Вас буде проінформовано за допомогою електронної пошти як тільки "%{target_project_name}" буде доступний.' + failed: "Неможливо скопіювати проект %{source_project_name}" + failed_internal: "Копіювання не вдалося через внутрішню помилку." + succeeded: "Створений проект %{target_project_name}" + errors: "Помилка" + project_custom_fields: "Спеціальні поля в проекті" x_objects_of_this_type: - zero: Немає об’єктів цього типу - one: Один об’єкт цього типу - other: 'Об’єктів цього типу: %{count}' + zero: "Немає об’єктів цього типу" + one: "Один об’єкт цього типу" + other: "Об’єктів цього типу: %{count}" text: - failed: Не вдалося скопіювати проект "%{source_project_name}" до проекту "%{target_project_name}". - succeeded: Скопіював проект "%{source_project_name}" до "%{target_project_name}". - source_project_label: Проєкт скопійовано + failed: 'Не вдалося скопіювати проект "%{source_project_name}" до проекту "%{target_project_name}".' + succeeded: 'Скопіював проект "%{source_project_name}" до "%{target_project_name}".' + source_project_label: "Проєкт скопійовано" copy_options: - dependencies_label: Копіювати з проєкту + dependencies_label: "Копіювати з проєкту" create_project: - attributes_heading: Укажіть цю обов’язкову інформацію, щоб працювати над своїми - проєктами. - template_label: Використовувати шаблон - template_heading: Виберіть шаблон проєкту, щоб користуватися найпоширенішими методами - управління проєктами, або створіть проєкт із нуля. + attributes_heading: "Укажіть цю обов’язкову інформацію, щоб працювати над своїми проєктами." + template_label: "Використовувати шаблон" + template_heading: "Виберіть шаблон проєкту, щоб користуватися найпоширенішими методами управління проєктами, або створіть проєкт із нуля." copy_options: - dependencies_label: Копіювати з шаблона + dependencies_label: "Копіювати з шаблона" blank_template: - label: Пустий проєкт + label: "Пустий проєкт" description: Почніть із нуля. Уручну додайте атрибути проєкту, учасників і модулі. blank_description: Опису немає. create_portfolio: - template_heading: Виберіть шаблон портфеля, щоб користуватися найпоширенішими - методами управління проєктами, або створіть портфель із нуля. + template_heading: "Виберіть шаблон портфеля, щоб користуватися найпоширенішими методами управління проєктами, або створіть портфель із нуля." blank_template: - label: Пустий портфель - description: Почніть із нуля. Уручну додайте атрибути портфеля, учасників і - модулі. + label: "Пустий портфель" + description: Почніть із нуля. Уручну додайте атрибути портфеля, учасників і модулі. create_program: - template_heading: Виберіть шаблон програми, щоб користуватися найпоширенішими - методами управління проєктами, або створіть програму з нуля. + template_heading: "Виберіть шаблон програми, щоб користуватися найпоширенішими методами управління проєктами, або створіть програму з нуля." blank_template: - label: Пуста програма - description: Почніть із нуля. Уручну додайте атрибути програми, учасників і - модулі. - create_wiki_page: Створити нову вікісторінку - create_wiki_page_button: Сторінка Wiki + label: "Пуста програма" + description: Почніть із нуля. Уручну додайте атрибути програми, учасників і модулі. + create_wiki_page: "Створити нову вікісторінку" + create_wiki_page_button: "Сторінка Wiki" date: abbr_day_names: - - Нед - - Пн - - Вт - - Ср - - Чет - - П'ят - - Суб + - "Нед" + - "Пн" + - "Вт" + - "Ср" + - "Чет" + - "П'ят" + - "Суб" abbr_month_names: - - - - Січ - - Лют - - Бер - - Кві - - Тра - - Чер - - Лип - - Серп - - Вер - - Жов - - Лис - - Гру - abbr_week: Тиж. + - null + - "Січ" + - "Лют" + - "Бер" + - "Кві" + - "Тра" + - "Чер" + - "Лип" + - "Серп" + - "Вер" + - "Жов" + - "Лис" + - "Гру" + abbr_week: "Тиж." day_names: - - Неділя - - Понеділок - - Вівторок - - Середа - - Четвер - - П'ятниця - - Субота + - "Неділя" + - "Понеділок" + - "Вівторок" + - "Середа" + - "Четвер" + - "П'ятниця" + - "Субота" formats: + #Use the strftime parameters for formats. + #When no format has been given, it uses default. + #You can provide other formats here if you like! default: "%d. %m. %Y" long: "%d %B %Y" short: "%d %b" - month_names: - - - - Січень - - Лютий - - Березень - - Квітень - - Тра - - Червень - - Липень - - Серпень - - Вересень - - Жовтень - - Листопад - - Грудень + #Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: #Used in date_select and datetime_select. + - null + - "Січень" + - "Лютий" + - "Березень" + - "Квітень" + - "Тра" + - "Червень" + - "Липень" + - "Серпень" + - "Вересень" + - "Жовтень" + - "Листопад" + - "Грудень" order: - - рік - - місяць - - день + - рік + - місяць + - день datetime: distance_in_words: about_x_hours: - one: близько 1 години - few: близько %{count} годин(и) - many: близько %{count} годин(и) - other: близько %{count} годин(и) + one: "близько 1 години" + few: "близько %{count} годин(и)" + many: "близько %{count} годин(и)" + other: "близько %{count} годин(и)" about_x_months: - one: близько 1 місяця - few: близько %{count} місяців - many: близько %{count} місяців - other: близько %{count} місяців + one: "близько 1 місяця" + few: "близько %{count} місяців" + many: "близько %{count} місяців" + other: "близько %{count} місяців" about_x_years: - one: близько 1 року - few: близько %{count} років - many: близько %{count} років - other: близько %{count} років + one: "близько 1 року" + few: "близько %{count} років" + many: "близько %{count} років" + other: "близько %{count} років" almost_x_years: - one: майже 1 рік - few: майже %{count} років - many: майже %{count} років - other: майже %{count} років - half_a_minute: пів хвилини + one: "майже 1 рік" + few: "майже %{count} років" + many: "майже %{count} років" + other: "майже %{count} років" + half_a_minute: "пів хвилини" less_than_x_minutes: - one: менш, ніж за хвилину - few: менше %{count} хвилини - many: менше %{count} хвилини - other: менше %{count} хвилини + one: "менш, ніж за хвилину" + few: "менше %{count} хвилини" + many: "менше %{count} хвилини" + other: "менше %{count} хвилини" less_than_x_seconds: - one: менше однієї секунди - few: менш ніж %{count} секунд - many: менш ніж %{count} секунд - other: менш ніж %{count} секунд + one: "менше однієї секунди" + few: "менш ніж %{count} секунд" + many: "менш ніж %{count} секунд" + other: "менш ніж %{count} секунд" over_x_years: - one: більше 1 року - few: більше %{count} років - many: більше %{count} років - other: більше %{count} років + one: "більше 1 року" + few: "більше %{count} років" + many: "більше %{count} років" + other: "більше %{count} років" x_days: - one: 1 день + one: "1 день" few: "%{count} днів" many: "%{count} днів" other: "%{count} днів" x_minutes: - one: 1 хвилина + one: "1 хвилина" few: "%{count} хвилин" many: "%{count} хвилин" other: "%{count} хвилин" x_minutes_abbreviated: - one: 1 хв + one: "1 хв" few: "%{count} хв" many: "%{count} хв" other: "%{count} хв" x_hours: - one: 1 година + one: "1 година" few: "%{count} год" many: "%{count} год" other: "%{count} год" x_hours_abbreviated: - one: 1 год + one: "1 год" few: "%{count} год" many: "%{count} год" other: "%{count} год" x_weeks: - one: 1 тиждень + one: "1 тиждень" few: "%{count} тижні" many: "%{count} тижнів" other: "%{count} тижня" x_months: - one: 1 місяць + one: "1 місяць" few: "%{count} місяців" many: "%{count} місяців" other: "%{count} місяців" x_years: - one: 1 рік + one: "1 рік" few: "%{count} роки" many: "%{count} років" other: "%{count} року" x_seconds: - one: 1 секунда + one: "1 секунда" few: "%{count} секунд" many: "%{count} секунд" other: "%{count} секунд" x_seconds_abbreviated: - one: 1 с + one: "1 с" few: "%{count} с" many: "%{count} с" other: "%{count} с" units: minute_abbreviated: - one: хв - few: хв - many: хв - other: хв + one: "хв" + few: "хв" + many: "хв" + other: "хв" hour: - one: година - few: годин(и) - many: годин(и) - other: годин(и) + one: "година" + few: "годин(и)" + many: "годин(и)" + other: "годин(и)" day: - one: день - few: дні - many: днів - other: дня - description_active: Активний? - description_attachment_toggle: Показати/приховати вкладення - description_autocomplete: 'Це поле використовується автозаповнення. При введенні - заголовка пакета роботу ви отримаєте список можливих кандидатів. Виберіть один - з допомогою стрілка вгору і Стрілка вниз і виберіть його з Tab або Enter. Крім - того ви можете введіть номер робочого пакета напряму. - - ' - description_available_columns: Доступні стовпці - description_choose_project: Проекти - description_compare_from: Порівняти від - description_compare_to: Порівняти до - description_current_position: 'Ви знаходитесь тут: ' - description_date_from: Введіть дату початку - description_date_to: Введіть кінцеву дату - description_enter_number: Введіть номер - description_enter_text: Введіть текст - description_filter: Фільтр - description_filter_toggle: Показати/приховати фільтр - description_category_reassign: Оберіть категорію - description_message_content: Зміст повідомлення - description_my_project: Ви учасник - description_notes: Примітки - description_parent_work_package: Батьківський робочий пакет поточного - description_project_scope: Область пошуку - description_query_sort_criteria_attribute: Критерій сортування - description_query_sort_criteria_direction: Порядок сортування - description_search: Поле пошуку - description_select_work_package: Виберіть робочий пакет - description_selected_columns: Вибрані колонки - description_sub_work_package: Частина робочого пакету поточного - description_toc_toggle: Показати/приховати зміст - description_wiki_subpages_reassign: Виберіть батьківську сторінку + one: "день" + few: "дні" + many: "днів" + other: "дня" + description_active: "Активний?" + description_attachment_toggle: "Показати/приховати вкладення" + description_autocomplete: > + Це поле використовується автозаповнення. При введенні заголовка пакета роботу ви отримаєте список можливих кандидатів. Виберіть один з допомогою стрілка вгору і Стрілка вниз і виберіть його з Tab або Enter. Крім того ви можете введіть номер робочого пакета напряму. + description_available_columns: "Доступні стовпці" + description_choose_project: "Проекти" + description_compare_from: "Порівняти від" + description_compare_to: "Порівняти до" + description_current_position: "Ви знаходитесь тут: " + description_date_from: "Введіть дату початку" + description_date_to: "Введіть кінцеву дату" + description_enter_number: "Введіть номер" + description_enter_text: "Введіть текст" + description_filter: "Фільтр" + description_filter_toggle: "Показати/приховати фільтр" + description_category_reassign: "Оберіть категорію" + description_message_content: "Зміст повідомлення" + description_my_project: "Ви учасник" + description_notes: "Примітки" + description_parent_work_package: "Батьківський робочий пакет поточного" + description_project_scope: "Область пошуку" + description_query_sort_criteria_attribute: "Критерій сортування" + description_query_sort_criteria_direction: "Порядок сортування" + description_search: "Поле пошуку" + description_select_work_package: "Виберіть робочий пакет" + description_selected_columns: "Вибрані колонки" + description_sub_work_package: "Частина робочого пакету поточного" + description_toc_toggle: "Показати/приховати зміст" + description_wiki_subpages_reassign: "Виберіть батьківську сторінку" + #Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) direction: зліва направо ee: features: @@ -3266,436 +2817,326 @@ uk: work_package_sharing: Діліться пакетами робіт із зовнішніми користувачами work_package_subject_generation: Створення теми пакета робіт upsell: - buy_now_button: Купити - plans_title: Плани Enterprise - title: Доповнення версії Enterprise - plan_title: Доповнення версії Enterprise %{plan} - plan_name: Версія Enterprise %{plan} - plan_text_html: Доступно, починаючи з версії %{plan_name}. - unlimited: Без обмежень - already_have_token: 'Уже маєте маркер? Додайте його за допомогою кнопки нижче, - щоб перейти на вже замовлений план Enterprise. - - ' - hide_banner: Приховати цей банер - homescreen_description: 'Користувачам планів Enterprise, створених на основі - версії Community, доступні додаткові [доповнення Enterprise](enterprise_url) - і професійна підтримка, що ідеально для організацій, які використовують OpenProject - у середовищах, критично важливих для стратегічних завдань. - - ' - homescreen_subline: Підвищивши рівень, ви також долучитеся до підтримки проєкту - з відкритим кодом. + buy_now_button: "Купити" + plans_title: "Плани Enterprise" + title: "Доповнення версії Enterprise" + plan_title: "Доповнення версії Enterprise %{plan}" + plan_name: "Версія Enterprise %{plan}" + plan_text_html: "Доступно, починаючи з версії %{plan_name}." + unlimited: "Без обмежень" + already_have_token: > + Уже маєте маркер? Додайте його за допомогою кнопки нижче, щоб перейти на вже замовлений план Enterprise. + hide_banner: "Приховати цей банер" + homescreen_description: > + Користувачам планів Enterprise, створених на основі версії Community, доступні додаткові [доповнення Enterprise](enterprise_url) і професійна підтримка, що ідеально для організацій, які використовують OpenProject у середовищах, критично важливих для стратегічних завдань. + homescreen_subline: Підвищивши рівень, ви також долучитеся до підтримки проєкту з відкритим кодом. baseline_comparison: - description: Виділяйте зміни, внесені в цей список із будь-якого моменту часу - в минулому. + description: Виділяйте зміни, внесені в цей список із будь-якого моменту часу в минулому. benefits: - description: Які переваги локальної версії Enterprise? - high_security: Функції безпеки - high_security_text: Єдиний вхід (SAML, OpenID Connect, CAS), групи LDAP. - installation: Підтримка під час установлення - installation_text: Досвідчені інженери з програмного забезпечення допоможуть - вам виконати повне встановлення й налаштувати процес у вашій інфраструктурі. - premium_features: Доповнення версії Enterprise - premium_features_text: Дошки Agile, власні тема й логотип, діаграми, розумні - робочі процеси з користувацькими діями, повнотекстовий пошук у вкладеннях - пакетів робіт і користувацькі поля з множинним вибором. - professional_support: Професійна підтримка - professional_support_text: Отримайте надійну, комплексну підтримку від старших - інженерів, які знають усе про запуск OpenProject у критично важливих для - бізнесу середовищах. + description: "Які переваги локальної версії Enterprise?" + high_security: "Функції безпеки" + high_security_text: "Єдиний вхід (SAML, OpenID Connect, CAS), групи LDAP." + installation: "Підтримка під час установлення" + installation_text: "Досвідчені інженери з програмного забезпечення допоможуть вам виконати повне встановлення й налаштувати процес у вашій інфраструктурі." + premium_features: "Доповнення версії Enterprise" + premium_features_text: "Дошки Agile, власні тема й логотип, діаграми, розумні робочі процеси з користувацькими діями, повнотекстовий пошук у вкладеннях пакетів робіт і користувацькі поля з множинним вибором." + professional_support: "Професійна підтримка" + professional_support_text: "Отримайте надійну, комплексну підтримку від старших інженерів, які знають усе про запуск OpenProject у критично важливих для бізнесу середовищах." work_package_subject_generation: - description: Створюйте автоматично згенеровані теми на основі атрибутів і - тексту. + description: "Створюйте автоматично згенеровані теми на основі атрибутів і тексту." customize_life_cycle: - description: Створюйте й упорядковуйте етапи й проєкту, відмінні від тих, - що передбачено плануванням циклу проєкту PM2. + description: "Створюйте й упорядковуйте етапи й проєкту, відмінні від тих, що передбачено плануванням циклу проєкту PM2." capture_external_links: - description: Запобігайте атакам соціальної інженерії, виявляючи зовнішні посилання - й попереджаючи про них користувачів перед переходом за ними. + description: "Запобігайте атакам соціальної інженерії, виявляючи зовнішні посилання й попереджаючи про них користувачів перед переходом за ними." work_package_query_relation_columns: - description: Хочете переглядати зв’язки або дочірні елементи в списку пакетів - робіт? + description: "Хочете переглядати зв’язки або дочірні елементи в списку пакетів робіт?" edit_attribute_groups: - description: 'Налаштуйте конфігурацію форми за допомогою цих додаткових доповнень:' + description: "Налаштуйте конфігурацію форми за допомогою цих додаткових доповнень:" features: - groups: Додати нові групи атрибутів - rename: Перейменувати групи атрибутів - related: Додати таблицю зв’язаних пакетів робіт + groups: "Додати нові групи атрибутів" + rename: "Перейменувати групи атрибутів" + related: "Додати таблицю зв’язаних пакетів робіт" readonly_work_packages: - description: Позначайте пакети робіт як доступні лише для читання залежно - від статусу. + description: "Позначайте пакети робіт як доступні лише для читання залежно від статусу." custom_field_hierarchies: - description: Користувацькі поля типу «Ієрархія» дають змогу впорядковувати - ієрархічні структури в пакети робіт і проєкти, використовуючи багаторівневі - розкривні списки. + description: "Користувацькі поля типу «Ієрархія» дають змогу впорядковувати ієрархічні структури в пакети робіт і проєкти, використовуючи багаторівневі розкривні списки." date_alerts: - description: Завдяки оповіщенням про дати ви завжди знатимете про заплановані - дати початку або завершення, тож ніколи не пропускатимете важливі терміни - й не забуватимете про них. + description: "Завдяки оповіщенням про дати ви завжди знатимете про заплановані дати початку або завершення, тож ніколи не пропускатимете важливі терміни й не забуватимете про них." weighted_item_lists: - description: Тип «Список зважених елементів» дає змогу створити список із - пов’язаними опорними числовими значеннями. + description: "Тип «Список зважених елементів» дає змогу створити список із пов’язаними опорними числовими значеннями." work_package_sharing: - description: Діліться пакетами робіт із користувачами, які не належать до - учасників проєкту. + description: "Діліться пакетами робіт із користувачами, які не належать до учасників проєкту." project_list_sharing: - description: Діліться списками проєктів з окремими користувачами. + description: "Діліться списками проєктів з окремими користувачами." calculated_values: - description: Тип «Розраховані значення» дає змогу створити атрибут на основі - математичної формули з використанням числових значень, а також інших атрибутів - проєкту й користувацьких полів. + description: "Тип «Розраховані значення» дає змогу створити атрибут на основі математичної формули з використанням числових значень, а також інших атрибутів проєкту й користувацьких полів." define_custom_style: - title: Користувацький колір теми й логотип - more_info: 'Примітка: вибраний логотип буде загальнодоступний.' - description: Персоналізуйте свій екземпляр OpenProject за допомогою власного - логотипа й кольорів. + title: "Користувацький колір теми й логотип" + more_info: "Примітка: вибраний логотип буде загальнодоступний." + description: Персоналізуйте свій екземпляр OpenProject за допомогою власного логотипа й кольорів. custom_actions: - title: Користувацькі дії - description: Користувацькі дії – це ярлики набору попередньо визначених дій, - які ви можете включати в певні пакети робіт залежно від статусу, ролі, типу - або проєкту. + title: "Користувацькі дії" + description: "Користувацькі дії – це ярлики набору попередньо визначених дій, які ви можете включати в певні пакети робіт залежно від статусу, ролі, типу або проєкту." mcp_server: - description: Захищений MCP-сервер має змогу інтегрувати OpenProject у робочі - процеси на основі ШІ. + description: "Захищений MCP-сервер має змогу інтегрувати OpenProject у робочі процеси на основі ШІ." meeting_templates: - description: Налаштовуйте шаблони нарад з усталеною структурою порядку денного - й заощаджуйте час, повторно використовуючи їх для створення нових нарад. + description: "Налаштовуйте шаблони нарад з усталеною структурою порядку денного й заощаджуйте час, повторно використовуючи їх для створення нових нарад." nextcloud_sso: - title: Єдиний вхід для сховища Nextcloud - description: Увімкніть швидку й безпечну автентифікацію для свого сховища - Nextcloud завдяки технології єдиного входу. Спростіть керування доступом - і покращте взаємодію користувачів зі своїм продуктом. + title: "Єдиний вхід для сховища Nextcloud" + description: "Увімкніть швидку й безпечну автентифікацію для свого сховища Nextcloud завдяки технології єдиного входу. Спростіть керування доступом і покращте взаємодію користувачів зі своїм продуктом." scim_api: - title: Клієнти SCIM - description: Автоматизуйте управління користувачами в OpenProject, інтегрувавши - зовнішні сервіси для керування ідентичностями, такі як Microsoft Entra або - Keycloak, через API сервера SCIM. Ця можливість доступна, починаючи з корпоративного - плану Enterprise. + title: "Клієнти SCIM" + description: "Автоматизуйте управління користувачами в OpenProject, інтегрувавши зовнішні сервіси для керування ідентичностями, такі як Microsoft Entra або Keycloak, через API сервера SCIM. Ця можливість доступна, починаючи з корпоративного плану Enterprise." sso_auth_providers: - title: Єдиний вхід (SSO) - description: Дайте користувачам змогу входити через зовнішніх постачальників - SSO за допомогою SAML або OpenID Connect для безперешкодного доступу й інтеграції - з наявними ідентифікаційними системами. + title: "Єдиний вхід (SSO)" + description: "Дайте користувачам змогу входити через зовнішніх постачальників SSO за допомогою SAML або OpenID Connect для безперешкодного доступу й інтеграції з наявними ідентифікаційними системами." virus_scanning: - description: Переконайтеся, що вивантажені в OpenProject файли перевіряються - на віруси перед тим, як стають доступними для інших користувачів. + description: "Переконайтеся, що вивантажені в OpenProject файли перевіряються на віруси перед тим, як стають доступними для інших користувачів." project_creation_wizard: - description: Створіть покроковий майстер, який допоможе менеджерам проєктів - заповнити запит на запуск проєкту. + description: "Створіть покроковий майстер, який допоможе менеджерам проєктів заповнити запит на запуск проєкту." placeholder_users: title: Прототипи користувачів - description: 'Прототипи користувачів допомагають призначати пакети робіт користувачам, - які не входять у ваш проєкт. Вони можуть бути корисні в різних сценаріях. - Наприклад, якщо потрібно відстежувати завдання для ресурсу, який поки не - доступний або не визначений. Або ж ви хочете відстежувати завдання, призначені - особі, не надаючи їй доступу до OpenProject. - - ' + description: > + Прототипи користувачів допомагають призначати пакети робіт користувачам, які не входять у ваш проєкт. Вони можуть бути корисні в різних сценаріях. Наприклад, якщо потрібно відстежувати завдання для ресурсу, який поки не доступний або не визначений. Або ж ви хочете відстежувати завдання, призначені особі, не надаючи їй доступу до OpenProject. internal_comments: title: Внутрішні коментарі - description: Завдяки внутрішнім коментарям учасники внутрішньої команди можуть - спілкуватися приватно. Ці коментарі доступні лише користувачам із певними - ролями в проєкті й ніколи не відображаються для всіх. + description: "Завдяки внутрішнім коментарям учасники внутрішньої команди можуть спілкуватися приватно. Ці коментарі доступні лише користувачам із певними ролями в проєкті й ніколи не відображаються для всіх." internal_comments_inline: - title: Створюйте внутрішні коментарі лише для учасників невеликої групи + title: "Створюйте внутрішні коментарі лише для учасників невеликої групи" description: " " portfolio_management: - description: Узгодьте свої проєкти зі стратегічними цілями, об’єднавши їх - у портфелі й програми. + description: Узгодьте свої проєкти зі стратегічними цілями, об’єднавши їх у портфелі й програми. teaser: title: - one: Один день до завершення строку дії пробного маркера %{trial_plan} + one: "Один день до завершення строку дії пробного маркера %{trial_plan}" few: "%{count} дні до завершення строку дії пробного маркера %{trial_plan}" many: "%{count} днів до завершення строку дії пробного маркера %{trial_plan}" other: "%{count} дня до завершення строку дії пробного маркера %{trial_plan}" - description: У вас є доступ до всіх функцій %{trial_plan}. + description: "У вас є доступ до всіх функцій %{trial_plan}." trial: - not_found: Ви запитали пробний маркер, але цей запит більше не доступний. Спробуйте - ще раз. - wait_for_confirmation: Ми надіслали вам електронного листа, щоб ви підтвердили - свою адресу й могли отримати пробний маркер. - already_retrieved: 'Маркер пробної версії Enterprise уже отримано. На вашу електронну - пошту мав надійти лист із вкладеним маркером. Якщо вам потрібен новий маркер, - зверніться до нашої служби підтримки. - - ' - successfully_saved: Маркер пробної версії Enterprise успішно отримано. - token_sent: Запитано пробний маркер - request_again: Надіслати запит ще раз - resend_action: Ще раз надіслати електронного листа з підтвердженням - welcome_title: Стислий огляд функцій - welcome_description: Отримайте стислий огляд функцій для управління проєктами - й командної роботи у версії OpenProject Enterprise. - confirmation_info: 'Ми надіслали вам листа %{date} на адресу %{email} з усією - інформацією, потрібною, щоб почати користуватися безкоштовною пробною версією - OpenProject Enterprise. Знайдіть його у своїй пошті й перейдіть за посиланням - для підтвердження, щоб розпочати безплатний 14-денний пробний період. - - ' - confirmation_subline: 'Перевірте свою пошту й виконайте вказівки, щоб розпочати - безплатний 14-денний пробний період. - - ' + not_found: "Ви запитали пробний маркер, але цей запит більше не доступний. Спробуйте ще раз." + wait_for_confirmation: "Ми надіслали вам електронного листа, щоб ви підтвердили свою адресу й могли отримати пробний маркер." + already_retrieved: > + Маркер пробної версії Enterprise уже отримано. На вашу електронну пошту мав надійти лист із вкладеним маркером. Якщо вам потрібен новий маркер, зверніться до нашої служби підтримки. + successfully_saved: "Маркер пробної версії Enterprise успішно отримано." + token_sent: "Запитано пробний маркер" + request_again: "Надіслати запит ще раз" + resend_action: "Ще раз надіслати електронного листа з підтвердженням" + welcome_title: "Стислий огляд функцій" + welcome_description: "Отримайте стислий огляд функцій для управління проєктами й командної роботи у версії OpenProject Enterprise." + confirmation_info: > + Ми надіслали вам листа %{date} на адресу %{email} з усією інформацією, потрібною, щоб почати користуватися безкоштовною пробною версією OpenProject Enterprise. Знайдіть його у своїй пошті й перейдіть за посиланням для підтвердження, щоб розпочати безплатний 14-денний пробний період. + confirmation_subline: > + Перевірте свою пошту й виконайте вказівки, щоб розпочати безплатний 14-денний пробний період. domain_caption: Маркер буде дійсним для вашого поточного імені хосту. - receive_newsletter_html: 'Я хочу отримувати інформаційний - бюлетень OpenProject. - - ' - consent_html: 'Я погоджуюся з умовами - надання послуг і політикою - конфіденційності. - - ' + receive_newsletter_html: > + Я хочу отримувати інформаційний бюлетень OpenProject. + consent_html: > + Я погоджуюся з умовами надання послуг і політикою конфіденційності. email_calendar_updates: state: - disabled: Вимкнено. - enabled: Увімкнено. + disabled: "Вимкнено." + enabled: "Увімкнено." button: - disabled: Увімкнути - enabled: Вимкнути - enumeration_activities: Дії щодо відстеження часу - enumeration_work_package_priorities: Пріоритети робочого пакету - enumeration_reported_project_statuses: Повідомлений статус - enumeration_caption_order_changed: Порядок змінено. - enumeration_could_not_be_moved: Неможливо перенести перелічення. + disabled: "Увімкнути" + enabled: "Вимкнути" + enumeration_activities: "Дії щодо відстеження часу" + enumeration_work_package_priorities: "Пріоритети робочого пакету" + enumeration_reported_project_statuses: "Повідомлений статус" + enumeration_caption_order_changed: "Порядок змінено." + enumeration_could_not_be_moved: "Неможливо перенести перелічення." enterprise_trials: dialog_component: title: Пробна версія Enterprise - error_auth_source_sso_failed: 'Єдиний вхід (SSO) для користувача %{value} не вдалося ' - error_can_not_archive_project: 'Цей проєкт не можна архівувати: %{errors}' - error_can_not_delete_entry: Неможливо видалити запис - error_can_not_delete_custom_field: Неможливо видалити спеціальне поле - error_can_not_delete_in_use_archived_undisclosed: Пакети робіт також містяться в - архівних проєктах. Попросіть адміністратора виконати операцію видалення, щоб дізнатися, - яких проєктів це стосується. - error_can_not_delete_in_use_archived_work_packages: 'Пакети робіт також містяться - в архівних проєктах. Спочатку потрібно повторно активувати ці проєкти, а потім - – змінити атрибут відповідних пакетів робіт: %{archived_projects_urls}' + error_auth_source_sso_failed: "Єдиний вхід (SSO) для користувача %{value} не вдалося " + error_can_not_archive_project: "Цей проєкт не можна архівувати: %{errors}" + error_can_not_delete_entry: "Неможливо видалити запис" + error_can_not_delete_custom_field: "Неможливо видалити спеціальне поле" + error_can_not_delete_in_use_archived_undisclosed: "Пакети робіт також містяться в архівних проєктах. Попросіть адміністратора виконати операцію видалення, щоб дізнатися, яких проєктів це стосується." + error_can_not_delete_in_use_archived_work_packages: "Пакети робіт також містяться в архівних проєктах. Спочатку потрібно повторно активувати ці проєкти, а потім – змінити атрибут відповідних пакетів робіт: %{archived_projects_urls}" error_can_not_delete_type: - explanation: Цей тип містить пакети робіт, і його не можна видалити. Переглянути - всі пошкоджені пакети робіт можна в цьому поданні. - error_can_not_delete_standard_type: Стандартні типи неможливо видалити. - error_can_not_invite_user: Не вдалося надіслати запрошення користувачеві. - error_can_not_remove_role: Ця роль використовується і не може бути видалений. - error_can_not_reopen_work_package_on_closed_version: Пакет робіт покладених на закритій - версії не може бути відкритий - error_can_not_find_all_resources: Не вдалося знайти всі відповідні ресурси для цього - запиту. - error_can_not_unarchive_project: 'Цей проєкт не можна розархівувати: %{errors}' - error_check_user_and_role: Будь ласка виберіть користувача і роль. - error_code: Помилка %{code} - error_color_could_not_be_saved: Не вдалося зберегти колір - error_cookie_missing: Файл cookie OpenProject відсутній. Переконайтеся, що файли - cookie увімкнено, оскільки ця програма не буде функціонувати належним чином. - error_custom_option_not_found: Варіант не існує. - error_enterprise_plan_needed: Щоб виконати цю дію, потрібен корпоративний план %{plan}. - error_enterprise_activation_user_limit: Ваш обліковий запис не можна активувати - (досягнуто обмеження користувача). Щоб отримати доступ, зверніться до свого адміністратора. - error_enterprise_token_invalid_domain: Версія Enterprise не активна. Домен вашого - маркера Enterprise (%{actual}) не збігається з іменем хосту системи (%{expected}). - error_failed_to_delete_entry: Не вдалося видалити цей запис. - error_in_dependent: 'Помилка спроби змінити залежний об''єкт: %{dependent_class} - %{related_id} - %{related_subject}: %{error}' - error_in_new_dependent: 'Не вдалося створити залежний об’єкт: %{dependent_class} - – %{related_subject}: %{error}' - error_invalid_selected_value: Недійсне вибране значення. - error_journal_attribute_not_present: Журнал не містить атрибута %{attribute}. - error_pdf_export_too_many_columns: Для експорту PDF-файлу вибрано занадто багато - стовпців. Скоротіть кількість стовпців. - error_pdf_date_range_too_long: Діапазон дат, вибраний для пакета робіт, перевищує - допустимий ліміт для експорту у форматі PDF. Скоротіть діапазон до максимального — - %{years} р. - error_pdf_failed_to_export: 'Експорт PDF не вдалося зберегти: %{error}' - error_token_authenticity: Неможливо підтвердити маркер підробки для запиту між сайтами. - Чи спробували ви надіслати дані для кількох веб-переглядачів або вкладок? Закрийте - всі вкладки та повторіть спробу. - error_reminder_not_found: Нагадування не знайдено, або сповіщення вже надіслано. - error_work_package_not_found_in_project: Робочий пакет не був знайдений або не належить - до цього проекту - error_work_package_id_not_found: Пакет робіт не знайдено. - error_must_be_project_member: повинен бути учасником проекту - error_migrations_are_pending: У вашій установці OpenProject міститься міграція бази - даних. Можливо, ви пропустили міграції під час останнього оновлення. Перевірте - керівництво з оновлення, щоб належним чином оновити інсталяцію. - error_migrations_visit_upgrade_guides: Будь ласка, відвідайте нашу документацію - з оновлення - error_no_default_work_package_status: Не визначено статус робочого пакету за промовчанням. - Перевірте конфігурацію (перейдіть до розділу "Адміністрування -> Статуси робочих - пакетів"). - error_no_type_in_project: З цим проектом не асоційовано жодного типу. Перевірте - налаштування проекту. - error_omniauth_registration_timed_out: Реєстрація через зовнішнього постачальника - аутентифікації закінчилася. Будь ласка спробуйте ще раз. - error_omniauth_invalid_auth: Постачальник ідентифікаторів повернув недійсні дані - для автентифікації. Зверніться до адміністратора, щоб отримати додаткову допомогу. - error_password_change_failed: Під час спроби змінити пароль сталася помилка. - error_scm_command_failed: 'Помилка доступу до сховища: %{value}' - error_scm_not_found: Запис або ревізію (версію) не знайдено у репозиторії. - error_type_could_not_be_saved: Не вдалося зберегти тип - error_unable_delete_status: Робота статус пакет не може бути видалено оскільки він - використовується щонайменше один пакет робіт. - error_unable_delete_default_status: Неможливо видалити статус пакета за замовчуванням. - Будь ласка виберіть інший робочий статус пакета за замовчуванням перед видаленням - поточної. - error_unable_to_connect: Неможливо підключитись (%{value}) - error_unable_delete_wiki: Неможливо видалити wiki-сторінку. - error_unable_update_wiki: Неможливо оновити wiki-сторінку. - error_workflow_copy_source: Будь ласка виберіть Тип джерела або роль - error_workflow_copy_target: Виберіть цільові тип(и) та роль(і) + explanation: 'Цей тип містить пакети робіт, і його не можна видалити. Переглянути всі пошкоджені пакети робіт можна в цьому поданні.' + error_can_not_delete_standard_type: "Стандартні типи неможливо видалити." + error_can_not_invite_user: "Не вдалося надіслати запрошення користувачеві." + error_can_not_remove_role: "Ця роль використовується і не може бути видалений." + error_can_not_reopen_work_package_on_closed_version: "Пакет робіт покладених на закритій версії не може бути відкритий" + error_can_not_find_all_resources: "Не вдалося знайти всі відповідні ресурси для цього запиту." + error_can_not_unarchive_project: "Цей проєкт не можна розархівувати: %{errors}" + error_check_user_and_role: "Будь ласка виберіть користувача і роль." + error_code: "Помилка %{code}" + error_color_could_not_be_saved: "Не вдалося зберегти колір" + error_cookie_missing: "Файл cookie OpenProject відсутній. Переконайтеся, що файли cookie увімкнено, оскільки ця програма не буде функціонувати належним чином." + error_custom_option_not_found: "Варіант не існує." + error_enterprise_plan_needed: "Щоб виконати цю дію, потрібен корпоративний план %{plan}." + error_enterprise_activation_user_limit: "Ваш обліковий запис не можна активувати (досягнуто обмеження користувача). Щоб отримати доступ, зверніться до свого адміністратора." + error_enterprise_token_invalid_domain: "Версія Enterprise не активна. Домен вашого маркера Enterprise (%{actual}) не збігається з іменем хосту системи (%{expected})." + error_failed_to_delete_entry: "Не вдалося видалити цей запис." + error_in_dependent: "Помилка спроби змінити залежний об'єкт: %{dependent_class} %{related_id} - %{related_subject}: %{error}" + error_in_new_dependent: "Не вдалося створити залежний об’єкт: %{dependent_class} – %{related_subject}: %{error}" + error_invalid_selected_value: "Недійсне вибране значення." + error_journal_attribute_not_present: "Журнал не містить атрибута %{attribute}." + error_pdf_export_too_many_columns: "Для експорту PDF-файлу вибрано занадто багато стовпців. Скоротіть кількість стовпців." + error_pdf_date_range_too_long: "Діапазон дат, вибраний для пакета робіт, перевищує допустимий ліміт для експорту у форматі PDF. Скоротіть діапазон до максимального — %{years} р." + error_pdf_failed_to_export: "Експорт PDF не вдалося зберегти: %{error}" + error_token_authenticity: "Неможливо підтвердити маркер підробки для запиту між сайтами. Чи спробували ви надіслати дані для кількох веб-переглядачів або вкладок? Закрийте всі вкладки та повторіть спробу." + error_reminder_not_found: "Нагадування не знайдено, або сповіщення вже надіслано." + error_work_package_not_found_in_project: "Робочий пакет не був знайдений або не належить до цього проекту" + error_work_package_id_not_found: "Пакет робіт не знайдено." + error_must_be_project_member: "повинен бути учасником проекту" + error_migrations_are_pending: "У вашій установці OpenProject міститься міграція бази даних. Можливо, ви пропустили міграції під час останнього оновлення. Перевірте керівництво з оновлення, щоб належним чином оновити інсталяцію." + error_migrations_visit_upgrade_guides: "Будь ласка, відвідайте нашу документацію з оновлення" + error_no_default_work_package_status: 'Не визначено статус робочого пакету за промовчанням. Перевірте конфігурацію (перейдіть до розділу "Адміністрування -> Статуси робочих пакетів").' + error_no_type_in_project: "З цим проектом не асоційовано жодного типу. Перевірте налаштування проекту." + error_omniauth_registration_timed_out: "Реєстрація через зовнішнього постачальника аутентифікації закінчилася. Будь ласка спробуйте ще раз." + error_omniauth_invalid_auth: "Постачальник ідентифікаторів повернув недійсні дані для автентифікації. Зверніться до адміністратора, щоб отримати додаткову допомогу." + error_password_change_failed: "Під час спроби змінити пароль сталася помилка." + error_scm_command_failed: "Помилка доступу до сховища: %{value}" + error_scm_not_found: "Запис або ревізію (версію) не знайдено у репозиторії." + error_type_could_not_be_saved: "Не вдалося зберегти тип" + error_unable_delete_status: "Робота статус пакет не може бути видалено оскільки він використовується щонайменше один пакет робіт." + error_unable_delete_default_status: "Неможливо видалити статус пакета за замовчуванням. Будь ласка виберіть інший робочий статус пакета за замовчуванням перед видаленням поточної." + error_unable_to_connect: "Неможливо підключитись (%{value})" + error_unable_delete_wiki: "Неможливо видалити wiki-сторінку." + error_unable_update_wiki: "Неможливо оновити wiki-сторінку." + error_workflow_copy_source: "Будь ласка виберіть Тип джерела або роль" + error_workflow_copy_target: "Виберіть цільові тип(и) та роль(і)" error_menu_item_not_created: Не можна додати пункт меню error_menu_item_not_saved: Не вдалося зберегти пункт меню - error_wiki_root_menu_item_conflict: 'Неможливо перейменувати %{old_name} для %{new_name} - через конфлікт у результуючому пункті меню з існуючим пунктом меню %{existing_caption} - %{existing_identifier} - - ' - error_external_authentication_failed_message: 'Під час зовнішньої автентифікації - сталася помилка: %{message}' - error_attribute_not_highlightable: 'Атрибут(и) не виділено: %{attributes}' + error_wiki_root_menu_item_conflict: > + Неможливо перейменувати %{old_name} для %{new_name} через конфлікт у результуючому пункті меню з існуючим пунктом меню %{existing_caption} %{existing_identifier} + error_external_authentication_failed_message: "Під час зовнішньої автентифікації сталася помилка: %{message}" + error_attribute_not_highlightable: "Атрибут(и) не виділено: %{attributes}" events: - changeset: Набір змін відредаговано + changeset: "Набір змін відредаговано" message: Повідомлення відредаговано news: Новини - project_details: Деталі проєкту змінено - project: Проєкт змінено - projects: Проєкт змінено + project_details: "Деталі проєкту змінено" + project: "Проєкт змінено" + projects: "Проєкт змінено" reply: Відповіли - time_entry: Timelog відредаговано - wiki_page: Wiki-сторінка оновлена - work_package_closed: Робочий пакет закритий - work_package_edit: Робочий пакет оновлений - work_package_note: Робочий пакет не доданий + time_entry: "Timelog відредаговано" + wiki_page: "Wiki-сторінка оновлена" + work_package_closed: "Робочий пакет закритий" + work_package_edit: "Робочий пакет оновлений" + work_package_note: "Робочий пакет не доданий" title: - project: 'Проєкт: %{name}' - subproject: 'Підпроєкт: %{name}' + project: "Проєкт: %{name}" + subproject: "Підпроєкт: %{name}" export: dialog: - title: Експорт - submit: Експортувати + title: "Експорт" + submit: "Експортувати" save_export_settings: - label: Зберегти налаштування + label: "Зберегти налаштування" format: - label: Формат файлу + label: "Формат файлу" options: csv: - label: CSV + label: "CSV" pdf: - label: PDF + label: "PDF" xls: - label: XLS + label: "XLS" columns: - input_label_report: Додати стовпці в таблицю атрибутів - input_caption_report: За замовчуванням вибрано всі атрибути, додані як стовпці - в список пакетів робіт. Довгі текстові поля недоступні в таблиці атрибутів, - але можуть відображатися під нею. - input_caption_table: За замовчуванням вибрано всі атрибути, додані як стовпці - в список пакетів робіт. Довгі текстові поля недоступні в експортах даних - таблиці. - input_caption_required: Неможливо експортувати подання без жодного стовпця. - Додайте принаймні один стовпець. + input_label_report: "Додати стовпці в таблицю атрибутів" + input_caption_report: "За замовчуванням вибрано всі атрибути, додані як стовпці в список пакетів робіт. Довгі текстові поля недоступні в таблиці атрибутів, але можуть відображатися під нею." + input_caption_table: "За замовчуванням вибрано всі атрибути, додані як стовпці в список пакетів робіт. Довгі текстові поля недоступні в експортах даних таблиці." + input_caption_required: "Неможливо експортувати подання без жодного стовпця. Додайте принаймні один стовпець." pdf: export_type: - label: Тип експорту PDF + label: "Тип експорту PDF" options: table: - label: Таблиця - caption: Експортуйте список пакетів робіт у таблицю з потрібними стовпцями. + label: "Таблиця" + caption: "Експортуйте список пакетів робіт у таблицю з потрібними стовпцями." report: - label: Звіт - caption: Експортуйте пакет робіт у докладний звіт про всі пакети робіт - у списку. + label: "Звіт" + caption: "Експортуйте пакет робіт у докладний звіт про всі пакети робіт у списку." gantt: - label: Діаграма Ґанта - caption: Експортуйте список пакетів робіт у вигляді діаграми Ґанта. + label: "Діаграма Ґанта" + caption: "Експортуйте список пакетів робіт у вигляді діаграми Ґанта." include_images: - label: Включити зображення - caption: Виключіть зображення, щоб зменшити розмір експорту PDF. + label: "Включити зображення" + caption: "Виключіть зображення, щоб зменшити розмір експорту PDF." gantt_zoom_levels: - label: Рівні масштабування - caption: Виберіть рівень масштабування для дат, що відображаються на діаграмі. + label: "Рівні масштабування" + caption: "Виберіть рівень масштабування для дат, що відображаються на діаграмі." options: - days: Дні - weeks: Тижні - months: Місяці - quarters: Квартали + days: "Дні" + weeks: "Тижні" + months: "Місяці" + quarters: "Квартали" column_width: - label: Ширина стовпців таблиці + label: "Ширина стовпців таблиці" options: - narrow: Вузькі - medium: Середні - wide: Широкі - very_wide: Дуже широкі + narrow: "Вузькі" + medium: "Середні" + wide: "Широкі" + very_wide: "Дуже широкі" paper_size: - label: Розмір паперу - caption: Залежно від розміру діаграми може бути експортовано більше ніж - одну сторінку. + label: "Розмір паперу" + caption: "Залежно від розміру діаграми може бути експортовано більше ніж одну сторінку." long_text_fields: - input_caption: За замовчуванням вибрано всі довгі текстові поля. - input_label: Додати довгі текстові поля - input_placeholder: Пошук довгих текстових полів - drag_area_label: Керувати довгими текстовими полями + input_caption: "За замовчуванням вибрано всі довгі текстові поля." + input_label: "Додати довгі текстові поля" + input_placeholder: "Пошук довгих текстових полів" + drag_area_label: "Керувати довгими текстовими полями" xls: include_relations: - label: Включити зв’язки - caption: Цей параметр створює дублікат кожного пакета робіт для кожного - його зв’язку з іншим пакетом робіт. + label: "Включити зв’язки" + caption: "Цей параметр створює дублікат кожного пакета робіт для кожного його зв’язку з іншим пакетом робіт." include_descriptions: - label: Включити описи - caption: Цей параметр додає стовпець опису в необробленому форматі. - your_work_packages_export: Пакет робіт експортуються - your_projects_export: Проєкти експортуються - succeeded: Експорт завершено - failed: 'Під час спроби експортувати пакети робіт сталася помилка: %{message}' + label: "Включити описи" + caption: "Цей параметр додає стовпець опису в необробленому форматі." + your_work_packages_export: "Пакет робіт експортуються" + your_projects_export: "Проєкти експортуються" + succeeded: "Експорт завершено" + failed: "Під час спроби експортувати пакети робіт сталася помилка: %{message}" demo: - heading: Демонстраційний файл PDF - footer: Згенеровано за допомогою OpenProject + heading: "Демонстраційний файл PDF" + footer: "Згенеровано за допомогою OpenProject" button_text: Згенерувати демонстраційний файл PDF errors: - embedded_table_with_too_many_columns: Ця вбудована таблиця пакета робіт не вміщується - на сторінку. Зменште кількість стовпців. + embedded_table_with_too_many_columns: "Ця вбудована таблиця пакета робіт не вміщується на сторінку. Зменште кількість стовпців." format: - atom: Atom - csv: CSV - pdf: PDF - pdf_overview_table: Таблиця PDF - pdf_report_with_images: Звіт PDF із зображеннями - pdf_report: Звіт PDF - pdf_gantt: Діаграма Ґанта (PDF) + atom: "Atom" + csv: "CSV" + pdf: "PDF" + pdf_overview_table: "Таблиця PDF" + pdf_report_with_images: "Звіт PDF із зображеннями" + pdf_report: "Звіт PDF" + pdf_gantt: "Діаграма Ґанта (PDF)" image: - omitted: Зображення не експортовано. + omitted: "Зображення не експортовано." macro: - error: Макропомилка, %{message} - attribute_not_found: 'атрибут не знайдено: %{attribute}' - model_not_found: 'недійсна модель атрибута: %{model}' - resource_not_found: 'ресурс не знайдено: %{resource}' - nested_rich_text_unsupported: Вкладені у форматований текст вставки зараз не - підтримуються при експорті + error: "Макропомилка, %{message}" + attribute_not_found: "атрибут не знайдено: %{attribute}" + model_not_found: "недійсна модель атрибута: %{model}" + resource_not_found: "ресурс не знайдено: %{resource}" + nested_rich_text_unsupported: "Вкладені у форматований текст вставки зараз не підтримуються при експорті" units: hours: г days: д pdf_generator: - page_nr_footer: Сторінка %{page} з %{total} + page_nr_footer: "Сторінка %{page} з %{total}" template_attributes: - label: Атрибути й опис - caption: Усі атрибути, наявні в поточній конфігурації форми, що використовують - шаблон за замовчуванням. + label: "Атрибути й опис" + caption: Усі атрибути, наявні в поточній конфігурації форми, що використовують шаблон за замовчуванням. template_contract: - label: Договір + label: "Договір" caption: Деталі пакета робіт відформатовано в типовій для Німеччини формі договору. dialog: title: Згенерувати PDF submit: Завантажити templates: - label: Шаблон - none_enabled: Для цього типу пакета робіт не ввімкнено шаблон + label: "Шаблон" + none_enabled: "Для цього типу пакета робіт не ввімкнено шаблон" footer_center: label: Текст нижнього колонтитула caption: Цей текст з’явиться на кожній сторінці в центрі нижнього колонтитула. footer_right: label: Текст нижнього колонтитула - caption: Цей текст з’явиться на кожній сторінці в правій частині нижнього - колонтитула. + caption: Цей текст з’явиться на кожній сторінці в правій частині нижнього колонтитула. hyphenation: label: Перенесення caption: Розрив між словами для покращення розташування й вирівнювання. @@ -3709,1320 +3150,1201 @@ uk: landscape: Альбомна extraction: available: - pdftotext: Доступний текст PDF (необов'язково) - unrtf: Unrtf доступний (необов'язково) - catdoc: Документ Cat доступний (необов'язково) - xls2csv: Xls 2csv доступно (необов'язково) - catppt: Catppt доступний (необов'язково) - tesseract: Tesseract доступний (необов'язково) + pdftotext: "Доступний текст PDF (необов'язково)" + unrtf: "Unrtf доступний (необов'язково)" + catdoc: "Документ Cat доступний (необов'язково)" + xls2csv: "Xls 2csv доступно (необов'язково)" + catppt: "Catppt доступний (необов'язково)" + tesseract: "Tesseract доступний (необов'язково)" filterable_tree_view: filter_mode: - all: Усі - label: Режим фільтрації - selected: Вибрано - include_sub_items: Включити піделементи - no_results_text: Немає результатів + all: "Усі" + label: "Режим фільтрації" + selected: "Вибрано" + include_sub_items: "Включити піделементи" + no_results_text: "Немає результатів" toggle_switch: - label_on: Увімкнено - label_off: Вимкнено + label_on: "Увімкнено" + label_off: "Вимкнено" general_csv_decimal_separator: "." - general_csv_encoding: UTF-8 + general_csv_encoding: "UTF-8" general_csv_separator: "," - general_first_day_of_week: '7' - general_pdf_encoding: ISO-8859-1 - general_text_no: ні - general_text_yes: так - general_text_No: Ні - general_text_Yes: Так - general_text_true: вірно - general_text_false: хибне значення - gui_validation_error: 1 помилка + general_first_day_of_week: "7" + general_pdf_encoding: "ISO-8859-1" + general_text_no: "ні" + general_text_yes: "так" + general_text_No: "Ні" + general_text_Yes: "Так" + general_text_true: "вірно" + general_text_false: "хибне значення" + gui_validation_error: "1 помилка" gui_validation_error_plural: "%{count} помилок" homescreen: additional: - projects: Нові видимі проекти в цьому екземплярі. - no_visible_projects: У цьому випадку немає видимих проектів. - users: Нові зареєстровані користувачі в цьому екземплярі. + projects: "Нові видимі проекти в цьому екземплярі." + no_visible_projects: "У цьому випадку немає видимих проектів." + users: "Нові зареєстровані користувачі в цьому екземплярі." blocks: - community: Спільнота OpenProject + community: "Спільнота OpenProject" upsell: - title: Оновлення до версії Enterprise + title: "Оновлення до версії Enterprise" new_features: - header: Читайте про нові функції і оновлення продуктів. - learn_about: Дізнайтеся більше про всі нові функції - missing: Ще немає виділених функцій. - '17_2': - new_features_title: 'Випуск включає різноманітні нові функції і покращення, - такі як: - - ' + header: "Читайте про нові функції і оновлення продуктів." + learn_about: "Дізнайтеся більше про всі нові функції" + missing: "Ще немає виділених функцій." + #We need to include the version to invalidate outdated translations in other locales + "17_2": + new_features_title: > + Випуск включає різноманітні нові функції і покращення, такі як: new_features_list: - line_0: Робочі процеси на основі ШІ із захищеним MCP-сервером (починаючи - з тарифного плану Professional) - line_1: Удосконалена домашня сторінка проєкту з новим віджетом для бюджетів - і покращеною доступністю - line_2: 'Наради: шаблони нарад (починаючи з тарифного плану Basic)' + line_0: Робочі процеси на основі ШІ із захищеним MCP-сервером (починаючи з тарифного плану Professional) + line_1: Удосконалена домашня сторінка проєкту з новим віджетом для бюджетів і покращеною доступністю + line_2: "Наради: шаблони нарад (починаючи з тарифного плану Basic)" line_3: Більша прозорість завдяки коментарям до атрибутів проєктів line_4: Удосконалена функція експорту у форматі PDF - line_5: Кращий захист при роботі із зовнішніми посиланнями (починаючи - з тарифного плану Premium) + line_5: Кращий захист при роботі із зовнішніми посиланнями (починаючи з тарифного плану Premium) line_6: Покращення UI/UX у модулі беклогів line_7: Уніфіковані форми з користувацькими полями links: - upgrade_enterprise_edition: Оновлення до версії Enterprise - postgres_migration: Міграція інсталяції в PostgreSQL - user_guides: Посібники користувача - faq: ЧаПи - impressum: Юридична інформація - glossary: Глосарій - shortcuts: Ярлики - blog: Openproject блог - forums: Форум спільноти - security_alerts: Сповіщення системи безпеки - newsletter: Інформаційний лист + upgrade_enterprise_edition: "Оновлення до версії Enterprise" + postgres_migration: "Міграція інсталяції в PostgreSQL" + user_guides: "Посібники користувача" + faq: "ЧаПи" + impressum: "Юридична інформація" + glossary: "Глосарій" + shortcuts: "Ярлики" + blog: "Openproject блог" + forums: "Форум спільноти" + security_alerts: "Сповіщення системи безпеки" + newsletter: "Інформаційний лист" image_conversion: - imagemagick: Imagemagick + imagemagick: "Imagemagick" journals: - changes_retracted: Зміни було відхилено. + changes_retracted: "Зміни було відхилено." caused_changes: - budget_deleted: Бюджет видалено - dates_changed: Дати змінено - default_attribute_written: Атрибути лише для читання записано - import: Імпортовано - progress_mode_changed_to_status_based: Обчислення прогресу оновлено - status_changed: Статус «%{status_name}» - system_update: Оновлення системи OpenProject - work_package_duplicate_closed: 'Дублікат пакета робіт оновлено:' - total_percent_complete_mode_changed_to_work_weighted_average: Під час обчислення - підсумків атрибута «% завершення» тепер враховується значення атрибута «Робота». - total_percent_complete_mode_changed_to_simple_average: Обчислення підсумків - атрибута «% завершення» тепер ґрунтується на середньому арифметичному значень - лише атрибута «% завершення». + budget_deleted: "Бюджет видалено" + dates_changed: "Дати змінено" + default_attribute_written: "Атрибути лише для читання записано" + import: "Імпортовано" + progress_mode_changed_to_status_based: "Обчислення прогресу оновлено" + status_changed: "Статус «%{status_name}»" + system_update: "Оновлення системи OpenProject" + work_package_duplicate_closed: "Дублікат пакета робіт оновлено:" + total_percent_complete_mode_changed_to_work_weighted_average: "Під час обчислення підсумків атрибута «% завершення» тепер враховується значення атрибута «Робота»." + total_percent_complete_mode_changed_to_simple_average: "Обчислення підсумків атрибута «% завершення» тепер ґрунтується на середньому арифметичному значень лише атрибута «% завершення»." cause_descriptions: import: - header: зміни вніс (внесла) %{author} - field_changed: Значення в полі «%{field}» змінено з «%{old_value}» на «%{new_value}» - field_set: Для поля «%{field}» вибрано значення «%{value}» - field_removed: Поле «%{field}» видалено - field_updated: Поле «%{field}» оновлено - deleted_with_diff: Поле «%{field}» видалено (%{link}) - changed_with_diff: Поле «%{field}» змінено (%{link}) - set_with_diff: Поле «%{field}» налаштовано (%{link}) - work_package_predecessor_changed_times: внесенням змін у попередній елемент - %{link} + header: "зміни вніс (внесла) %{author}" + field_changed: "Значення в полі «%{field}» змінено з «%{old_value}» на «%{new_value}»" + field_set: "Для поля «%{field}» вибрано значення «%{value}»" + field_removed: "Поле «%{field}» видалено" + field_updated: "Поле «%{field}» оновлено" + deleted_with_diff: "Поле «%{field}» видалено (%{link})" + changed_with_diff: "Поле «%{field}» змінено (%{link})" + set_with_diff: "Поле «%{field}» налаштовано (%{link})" + work_package_predecessor_changed_times: внесенням змін у попередній елемент %{link} work_package_parent_changed_times: внесенням змін у батькіський елемент %{link} work_package_children_changed_times: внесенням змін у дочірній елемент %{link} work_package_related_changed_times: внесенням змін у пов’язаний елемент %{link} - work_package_duplicate_closed: Статус автоматично оновлено на основі дубліката - пакета робіт %{link} + work_package_duplicate_closed: Статус автоматично оновлено на основі дубліката пакета робіт %{link} unaccessable_work_package_changed: внесенням змін у пов’язаний пакет робіт budget_deleted: Бюджет видалено working_days_changed: - changed: внесенням змін у робочі дні (%{changes}) + changed: "внесенням змін у робочі дні (%{changes})" days: working: "%{day} зараз робочий" non_working: "%{day} зараз неробочий" dates: working: "%{date} – зараз робочий день" non_working: "%{date} – зараз неробочий день" - progress_mode_changed_to_status_based: Установлено режим обчислення прогресу - на основі статусу - status_excluded_from_totals_set_to_false_message: тепер включено в підсумки - ієрархії - status_excluded_from_totals_set_to_true_message: тепер виключено з підсумків - ієрархії + progress_mode_changed_to_status_based: Установлено режим обчислення прогресу на основі статусу + status_excluded_from_totals_set_to_false_message: тепер включено в підсумки ієрархії + status_excluded_from_totals_set_to_true_message: тепер виключено з підсумків ієрархії status_percent_complete_changed: "% Повністю змінено з %{old_value}% на %{new_value}%" system_update: - file_links_journal: 'Тепер дії, пов’язані з посиланнями на файли (файли, що - зберігаються в зовнішніх сховищах), з’являтимуться на вкладці «Активність». - Наявні дії, пов’язані із посиланнями: - - ' - progress_calculation_adjusted_from_disabled_mode: Обчислення прогресу автоматично - переведено в режим на основі робіт, - і його результати скориговано відповідно до оновленої версії. - progress_calculation_adjusted: Результати обчислення прогресу автоматично - скориговано відповідно до оновленої версії. - scheduling_mode_adjusted: Режим планування автоматично змінюється з оновленням - версії. - totals_removed_from_childless_work_packages: Результати обчислення обсягу - й прогресу виконання роботи автоматично вилучено з небатьківських пакетів - робіт з оновленням версії. Це завдання - з технічного обслуговування, і його можна ігнорувати. - total_percent_complete_mode_changed_to_work_weighted_average: Дочірні пакети - робіт без атрибута «Робота» ігноруються. - total_percent_complete_mode_changed_to_simple_average: Значення атрибута «Робота» - дочірніх пакетів робіт ігноруються. + file_links_journal: > + Тепер дії, пов’язані з посиланнями на файли (файли, що зберігаються в зовнішніх сховищах), з’являтимуться на вкладці «Активність». Наявні дії, пов’язані із посиланнями: + progress_calculation_adjusted_from_disabled_mode: >- + Обчислення прогресу автоматично переведено в режим на основі робіт, і його результати скориговано відповідно до оновленої версії. + progress_calculation_adjusted: >- + Результати обчислення прогресу автоматично скориговано відповідно до оновленої версії. + scheduling_mode_adjusted: >- + Режим планування автоматично змінюється з оновленням версії. + totals_removed_from_childless_work_packages: >- + Результати обчислення обсягу й прогресу виконання роботи автоматично вилучено з небатьківських пакетів робіт з оновленням версії. Це завдання з технічного обслуговування, і його можна ігнорувати. + total_percent_complete_mode_changed_to_work_weighted_average: >- + Дочірні пакети робіт без атрибута «Робота» ігноруються. + total_percent_complete_mode_changed_to_simple_average: >- + Значення атрибута «Робота» дочірніх пакетів робіт ігноруються. links: - configuration_guide: Посібник з налаштування - get_in_touch: У вас виникли запитання? Зв'яжіться з нами. - instructions_after_registration: Ви можете ввійти, як тільки ваш обліковий запис - активується, натиснувши %{signin}. - instructions_after_logout: Ви можете ввійти знову, натиснувши %{signin}. - instructions_after_error: Ви можете спробувати ввійти знову, натиснувши %{signin}. - Якщо помилка не зникне, зверніться до адміністратора за допомогою. + configuration_guide: "Посібник з налаштування" + get_in_touch: "У вас виникли запитання? Зв'яжіться з нами." + instructions_after_registration: "Ви можете ввійти, як тільки ваш обліковий запис активується, натиснувши %{signin}." + instructions_after_logout: "Ви можете ввійти знову, натиснувши %{signin}." + instructions_after_error: "Ви можете спробувати ввійти знову, натиснувши %{signin}. Якщо помилка не зникне, зверніться до адміністратора за допомогою." menus: admin: - ai: Штучний інтелект (ШІ) - aggregation: Агрегація - api_and_webhooks: API та вебгуки - mail_notification: Email сповіщення - mails_and_notifications: Електронні листи й сповіщення - mcp_configurations: Model Context Protocol (MCP) + ai: "Штучний інтелект (ШІ)" + aggregation: "Агрегація" + api_and_webhooks: "API та вебгуки" + mail_notification: "Email сповіщення" + mails_and_notifications: "Електронні листи й сповіщення" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: - label: Додати… + label: "Додати…" my_account: access_tokens: - description: Маркери постачальника послуг випускаються в OpenProject, що дає - змогу іншим додаткам отримувати до них доступ. Клієнтські маркери випускаються - іншими додатками, що дає змогу OpenProject отримати до них доступ. + description: "Маркери постачальника послуг випускаються в OpenProject, що дає змогу іншим додаткам отримувати до них доступ. Клієнтські маркери випускаються іншими додатками, що дає змогу OpenProject отримати до них доступ." no_results: - title: Немає маркерів доступу для відображення - description: Всі вони були відключені. Їх можна повторно ввімкнути в меню - адміністрування. - access_tokens: Маркери доступу + title: "Немає маркерів доступу для відображення" + description: "Всі вони були відключені. Їх можна повторно ввімкнути в меню адміністрування." + access_tokens: "Маркери доступу" headers: - action: Дія - expiration: Закінчується - indefinite_expiration: Ніколи - simple_revoke_confirmation: Справі відкликати цей маркер? + action: "Дія" + expiration: "Закінчується" + indefinite_expiration: "Ніколи" + simple_revoke_confirmation: "Справі відкликати цей маркер?" tabs: client: - title: Клієнтські маркери + title: "Клієнтські маркери" provider: - title: Маркери постачальника послуг + title: "Маркери постачальника послуг" token/api: - blank_description: У вас ще немає маркера API. Щоб створити його, натисніть - кнопку нижче. - blank_title: Немає маркера API - title: API - table_title: Маркери API - text_hint: Маркери API дають змогу стороннім додаткам обмінюватися даними - із цим екземпляром OpenProject через інтерфейси REST API. - static_token_name: Маркер API - disabled_text: Маркери API не дозволено адміністратором. Зверніться до нього, - якщо вам потрібна ця функція. - add_button: Маркер API + blank_description: "У вас ще немає маркера API. Щоб створити його, натисніть кнопку нижче." + blank_title: "Немає маркера API" + title: "API" + table_title: "Маркери API" + text_hint: "Маркери API дають змогу стороннім додаткам обмінюватися даними із цим екземпляром OpenProject через інтерфейси REST API." + static_token_name: "Маркер API" + disabled_text: "Маркери API не дозволено адміністратором. Зверніться до нього, якщо вам потрібна ця функція." + add_button: "Маркер API" ical: - blank_description: Щоб додати маркер iCalendar, підпишіться на новий або наявний - календар у модулі календаря проєкту. У вас мають бути необхідні дозволи. - blank_title: Немає маркера iCalendar - title: iCalendar - table_title: Маркери iCalendar - text_hint_link: Маркери iCalendar дають змогу користувачам [підписуватися - на календарі OpenProject](docs_url) і переглядати актуальну інформацію про - пакети робіт у зовнішніх клієнтах. - disabled_text: Підписки на iCalendar не дозволено адміністратором. Зверніться - до нього, якщо вам потрібна ця функція. + blank_description: "Щоб додати маркер iCalendar, підпишіться на новий або наявний календар у модулі календаря проєкту. У вас мають бути необхідні дозволи." + blank_title: "Немає маркера iCalendar" + title: "iCalendar" + table_title: "Маркери iCalendar" + text_hint_link: "Маркери iCalendar дають змогу користувачам [підписуватися на календарі OpenProject](docs_url) і переглядати актуальну інформацію про пакети робіт у зовнішніх клієнтах." + disabled_text: "Підписки на iCalendar не дозволено адміністратором. Зверніться до нього, якщо вам потрібна ця функція." oauth_application: - active_tokens: Активні маркери - blank_description: Для вас не налаштовано й не активовано доступ до сторонніх - додатків. - blank_title: Немає маркера додатка OAuth - last_refreshed_at: Востаннє оновлено о - title: OAuth - table_title: Маркери додатків OAuth - text_hint: Маркери додатків OAuth дають змогу стороннім додаткам обмінюватися - даними із цим екземпляром OpenProject. + active_tokens: "Активні маркери" + blank_description: "Для вас не налаштовано й не активовано доступ до сторонніх додатків." + blank_title: "Немає маркера додатка OAuth" + last_refreshed_at: "Востаннє оновлено о" + title: "OAuth" + table_title: "Маркери додатків OAuth" + text_hint: "Маркери додатків OAuth дають змогу стороннім додаткам обмінюватися даними із цим екземпляром OpenProject." oauth_client: - blank_description: Клієнтських маркерів OAuth ще не існує. - blank_title: Немає клієнтських маркерів OAuth - failed: Сталася помилка й не вдалося вилучити маркер. Повторіть спробу пізніше. - integration_type: Тип інтеграції - table_title: Клієнтські маркери OAuth - text_hint: Клієнтські маркери OAuth дають змогу цьому екземпляру OpenProject - підключатися до зовнішніх додатків, таких як файлові сховища. - title: OAuth - remove_token: Справді вилучити цей маркер? Вам потрібно буде знову ввійти - в %{integration}. - removed: Клієнтський маркер OAuth успішно вилучено - unknown_integration: Невідомо + blank_description: "Клієнтських маркерів OAuth ще не існує." + blank_title: "Немає клієнтських маркерів OAuth" + failed: "Сталася помилка й не вдалося вилучити маркер. Повторіть спробу пізніше." + integration_type: "Тип інтеграції" + table_title: "Клієнтські маркери OAuth" + text_hint: "Клієнтські маркери OAuth дають змогу цьому екземпляру OpenProject підключатися до зовнішніх додатків, таких як файлові сховища." + title: "OAuth" + remove_token: "Справді вилучити цей маркер? Вам потрібно буде знову ввійти в %{integration}." + removed: "Клієнтський маркер OAuth успішно вилучено" + unknown_integration: "Невідомо" token/rss: - add_button: Маркер RSS - blank_description: У вас ще немає маркера API. Ви можете створити його за - допомогою кнопки нижче. - blank_title: Немає маркера API - title: RSS - table_title: Маркери RSS - text_hint: Маркери RSS дають змогу користувачам зберігати останні зміни в - цьому екземплярі OpenProject через зовнішній RSS-агрегатор. - static_token_name: Маркер RSS - disabled_text: Маркери API не ввімкнено адміністратором. Зверніться до нього, - якщо вам потрібна ця функція. + add_button: "Маркер RSS" + blank_description: "У вас ще немає маркера API. Ви можете створити його за допомогою кнопки нижче." + blank_title: "Немає маркера API" + title: "RSS" + table_title: "Маркери RSS" + text_hint: "Маркери RSS дають змогу користувачам зберігати останні зміни в цьому екземплярі OpenProject через зовнішній RSS-агрегатор." + static_token_name: "Маркер RSS" + disabled_text: "Маркери API не ввімкнено адміністратором. Зверніться до нього, якщо вам потрібна ця функція." storages: - unknown_storage: Невідоме сховище + unknown_storage: "Невідоме сховище" notifications: reasons: - assigned: Виконавець - dateAlert: Оповіщення про дату - mentioned: Згадано - responsible: Відповідальний - shared: У спільному доступі - watched: Спостерігач - reminder: Нагадування + assigned: "Виконавець" + dateAlert: "Оповіщення про дату" + mentioned: "Згадано" + responsible: "Відповідальний" + shared: "У спільному доступі" + watched: "Спостерігач" + reminder: "Нагадування" facets: - unread: Непрочитані - unread_title: Показати непрочитані - all: Усі - all_title: Показати всі + unread: "Непрочитані" + unread_title: "Показати непрочитані" + all: "Усі" + all_title: "Показати всі" menu: - by_project: Непрочитані за проєктом - by_reason: Причина - inbox: Вхідні - send_notifications: Надсилати сповіщення щодо цієї дії + by_project: "Непрочитані за проєктом" + by_reason: "Причина" + inbox: "Вхідні" + send_notifications: "Надсилати сповіщення щодо цієї дії" work_packages: subject: - created: Робочий блок було створено. - assigned: Ви були назначені до %{work_package} - subscribed: Ви підписалися на %{work_package} - mentioned: Вас було згадано у %{work_package} - responsible: Ви стали відповідальними за %{work_package} - watched: Ви переглядаєте %{work_package} + created: "Робочий блок було створено." + assigned: "Ви були назначені до %{work_package}" + subscribed: "Ви підписалися на %{work_package}" + mentioned: "Вас було згадано у %{work_package}" + responsible: "Ви стали відповідальними за %{work_package}" + watched: "Ви переглядаєте %{work_package}" query: - invalid_filter: Недійсний фільтр сповіщень - label_accessibility: Розробникам також потрібно оплачувати свої рахунки. З доступністю - label_account: Обліковий запис - label_active: Активні - label_activate_user: Активні користувачі - label_active_in_new_projects: Активна участь в нових проектах - label_activity: Активність - label_add_edit_translations: Додайте та редагуйте переклади - label_add_another_file: Додати ще один файл - label_add_columns: Додати вибрані стовпці - label_add_note: Додати зауваження - label_add_projects: Додати проєкти - label_add_related_work_packages: Додати відповідні робочі пакети - label_add_subtask: Додати підзавдання - label_added: додано - label_added_by: 'Автор: %{author}' - label_added_by_on: Додав(-ла) %{author} %{date} - label_added_time_by: Доданий %{author} %{age} назад - label_additional_workflow_transitions_for_assignee: Додаткові переходи можна коли - користувач є правонаступником - label_additional_workflow_transitions_for_author: Додаткові переходи дозволені користувачу, - який є автором - label_administration: Адміністрування - label_interface_colors: Кольори інтерфейсу - label_interface_colors_description: 'Ці кольори визначають зовнішній вигляд застосунку. - Якщо ви зміните їх, тему буде автоматично змінено на користувацьку тему, але ми - не можемо гарантувати дотримання доступності мінімального контрасту (WCAG 2.1). ' - label_age: Вік - label_ago: днів тому - label_all: всі - label_all_time: весь час - label_all_words: Всі слова - label_all_open_wps: Всі відкрити - label_always_visible: Завжди відображається - label_announcement: Оголошення - label_angular: AngularJS - label_app_modules: Модулі %{app_title} - label_api_access_key: Ключ доступу до API - label_api_access_key_created_on: Ключ доступу до API створено %{value} тому - label_api_access_key_type: API + invalid_filter: "Недійсний фільтр сповіщень" + label_accessibility: "Розробникам також потрібно оплачувати свої рахунки. З доступністю" + label_account: "Обліковий запис" + label_active: "Активні" + label_activate_user: "Активні користувачі" + label_active_in_new_projects: "Активна участь в нових проектах" + label_activity: "Активність" + label_add_edit_translations: "Додайте та редагуйте переклади" + label_add_another_file: "Додати ще один файл" + label_add_columns: "Додати вибрані стовпці" + label_add_note: "Додати зауваження" + label_add_projects: "Додати проєкти" + label_add_related_work_packages: "Додати відповідні робочі пакети" + label_add_subtask: "Додати підзавдання" + label_added: "додано" + label_added_by: "Автор: %{author}" + label_added_by_on: "Додав(-ла) %{author} %{date}" + label_added_time_by: "Доданий %{author} %{age} назад" + label_additional_workflow_transitions_for_assignee: "Додаткові переходи можна коли користувач є правонаступником" + label_additional_workflow_transitions_for_author: "Додаткові переходи дозволені користувачу, який є автором" + label_administration: "Адміністрування" + label_interface_colors: "Кольори інтерфейсу" + label_interface_colors_description: "Ці кольори визначають зовнішній вигляд застосунку. Якщо ви зміните їх, тему буде автоматично змінено на користувацьку тему, але ми не можемо гарантувати дотримання доступності мінімального контрасту (WCAG 2.1). " + label_age: "Вік" + label_ago: "днів тому" + label_all: "всі" + label_all_time: "весь час" + label_all_words: "Всі слова" + label_all_open_wps: "Всі відкрити" + label_always_visible: "Завжди відображається" + label_announcement: "Оголошення" + label_angular: "AngularJS" + label_app_modules: "Модулі %{app_title}" + label_api_access_key: "Ключ доступу до API" + label_api_access_key_created_on: "Ключ доступу до API створено %{value} тому" + label_api_access_key_type: "API" label_auto_option: "(автоматично)" - label_ical_access_key_type: iCalendar - label_ical_access_key_description: Маркер iCalendar «%{token_name}» для календаря - «%{calendar_name}» у проєкті «%{project_name}» - label_ical_access_key_not_present: Немає маркерів iCalendar. - label_ical_access_key_generation_hint: Автоматично створено під час оформлення підписки - на календар. - label_ical_access_key_latest: останні - label_ical_access_key_revoke: Анулювати - label_add_column: Додати стовпець - label_applied_status: Застосовний статус - label_archive_project: Архівний проект - label_ascending: За зростанням - label_assigned_to_me_work_packages: Робочі пакети призначені мені - label_associated_revisions: Пов'язані редакції - label_attachment_plural: Вкладення - label_attribute: Атрибут - label_attribute_plural: Атрибути - label_ldap_auth_source_new: Нове LDAP-підключення - label_ldap_auth_source: LDAP-підключення - label_ldap_auth_source_plural: LDAP-підключення - label_attribute_expand_text: Повний текст для атрибута «%{attribute}» - label_authentication: Автентифікація - label_available_custom_fields_projects: Доступні проєкти з користувацькими полями - label_available_global_roles: Доступні глобальні ролі - label_available_project_attributes: Доступні атрибути проєкту - label_available_project_forums: Доступні форуми - label_available_project_repositories: Доступні сховища - label_available_project_versions: Доступні версії - label_available_project_work_package_categories: Доступні категорії робочих пакетів - label_available_project_work_package_types: Доступні типи пакетів робіт - label_available_projects: Доступні проєкти - label_api_doc: Документація API - label_backup: Резервна копія - label_backup_code: Код резервної копії - label_basic_details: Основна інформація - label_between: між ними - label_blocked_by: заблоковано - label_blocks: блоки - label_blog: Блог - label_forums_locked: Заблоковані - label_forum_new: Новий форум - label_forum_plural: Форуми - label_forum_sticky: Приліплена - label_boolean: Логічний тип - label_board_plural: Дошки - label_branch: Гілка - label_browse: Огляд - label_builtin: Вбудовано - label_bulk_edit_selected_work_packages: Масове редагування вибраних робочих пакетів + label_ical_access_key_type: "iCalendar" + label_ical_access_key_description: 'Маркер iCalendar «%{token_name}» для календаря «%{calendar_name}» у проєкті «%{project_name}»' + label_ical_access_key_not_present: "Немає маркерів iCalendar." + label_ical_access_key_generation_hint: "Автоматично створено під час оформлення підписки на календар." + label_ical_access_key_latest: "останні" + label_ical_access_key_revoke: "Анулювати" + label_add_column: "Додати стовпець" + label_applied_status: "Застосовний статус" + label_archive_project: "Архівний проект" + label_ascending: "За зростанням" + label_assigned_to_me_work_packages: "Робочі пакети призначені мені" + label_associated_revisions: "Пов'язані редакції" + label_attachment_plural: "Вкладення" + label_attribute: "Атрибут" + label_attribute_plural: "Атрибути" + label_ldap_auth_source_new: "Нове LDAP-підключення" + label_ldap_auth_source: "LDAP-підключення" + label_ldap_auth_source_plural: "LDAP-підключення" + label_attribute_expand_text: "Повний текст для атрибута «%{attribute}»" + label_authentication: "Автентифікація" + label_available_custom_fields_projects: "Доступні проєкти з користувацькими полями" + label_available_global_roles: "Доступні глобальні ролі" + label_available_project_attributes: "Доступні атрибути проєкту" + label_available_project_forums: "Доступні форуми" + label_available_project_repositories: "Доступні сховища" + label_available_project_versions: "Доступні версії" + label_available_project_work_package_categories: "Доступні категорії робочих пакетів" + label_available_project_work_package_types: "Доступні типи пакетів робіт" + label_available_projects: "Доступні проєкти" + label_api_doc: "Документація API" + label_backup: "Резервна копія" + label_backup_code: "Код резервної копії" + label_basic_details: "Основна інформація" + label_between: "між ними" + label_blocked_by: "заблоковано" + label_blocks: "блоки" + label_blog: "Блог" + label_forums_locked: "Заблоковані" + label_forum_new: "Новий форум" + label_forum_plural: "Форуми" + label_forum_sticky: "Приліплена" + label_boolean: "Логічний тип" + label_board_plural: "Дошки" + label_branch: "Гілка" + label_browse: "Огляд" + label_builtin: "Вбудовано" + label_bulk_edit_selected_work_packages: "Масове редагування вибраних робочих пакетів" label_bundled: "(В комплекті)" - label_calendar: Календар - label_calendars_and_dates: Календарі й дати - label_calendar_show: Показати календар - label_category: Категорія + label_calendar: "Календар" + label_calendars_and_dates: "Календарі й дати" + label_calendar_show: "Показати календар" + label_category: "Категорія" label_completed: Завершено - label_consent_settings: Згода користувача + label_consent_settings: "Згода користувача" label_wiki_menu_item: Пункт меню Wiki label_select_main_menu_item: Виберіть новий пункт головного меню - label_required_disk_storage: Необхідне місце на диску + label_required_disk_storage: "Необхідне місце на диску" label_send_invitation: Надіслати запрошення - label_calculated_value: Розраховане значення - label_change_parent: Змінити батьківський об’єкт - label_change_plural: Зміни - label_change_properties: Змінити властивості - label_change_status: Змінити статус - label_change_status_of_user: 'Змінити статус #{username}' - label_change_view_all: Проглянути всі зміни - label_changes_details: Подробиці по всіх змінах - label_changeset: Набір змін - label_changeset_id: ID набору змін - label_changeset_plural: Набір змін - label_checked: перевірено - label_check_uncheck_all_in_column: Позначте/зніміть всі прапорці в колонці - label_check_uncheck_all_in_row: Позначте/зніміть всі прапорці в рядку - label_child_element: Дочірній елемент - label_choices: Варіанти вибору - label_close_versions: Закрити завершені версії - label_closed_work_packages: зачинено - label_collapse: Згорнути - label_collapsed_click_to_show: Згорнуто. Натисніть, щоб показати + label_calculated_value: "Розраховане значення" + label_change_parent: "Змінити батьківський об’єкт" + label_change_plural: "Зміни" + label_change_properties: "Змінити властивості" + label_change_status: "Змінити статус" + label_change_status_of_user: "Змінити статус #{username}" + label_change_view_all: "Проглянути всі зміни" + label_changes_details: "Подробиці по всіх змінах" + label_changeset: "Набір змін" + label_changeset_id: "ID набору змін" + label_changeset_plural: "Набір змін" + label_checked: "перевірено" + label_check_uncheck_all_in_column: "Позначте/зніміть всі прапорці в колонці" + label_check_uncheck_all_in_row: "Позначте/зніміть всі прапорці в рядку" + label_child_element: "Дочірній елемент" + label_choices: "Варіанти вибору" + label_close_versions: "Закрити завершені версії" + label_closed_work_packages: "зачинено" + label_collapse: "Згорнути" + label_collapsed_click_to_show: "Згорнуто. Натисніть, щоб показати" label_configuration: конфігурація - label_comment_add: Додати коментар - label_comment_added: Коментар додано - label_comment_delete: Видалити коментарі - label_comment_plural: Коментарі - label_commits_per_author: Комітів на автора - label_commits_per_month: Комітів на місяць - label_confirmation: Підтвердження - label_contains: містить - label_content: Контент - label_color_plural: Кольори - label_copied: скопійовано - label_copy_same_as_target: Те ж, що і для цілі - label_copy_source: Джерело - label_copy_target: Ціль - label_copy_workflow_from: Копіювати робочий процес з - label_copy_project: Копіювати проект - label_core_version: Версія ядра - label_core_build: Збірка ядра - label_created_by: Створено %{user} - label_current_status: Поточний статус - label_current_version: Поточна версія - label_custom_field_add_no_type: Додайте це поле до типу робочого пакета - label_custom_field_new: Нове спеціальне поле - label_custom_field_plural: Індивідуальні поля - label_custom_field_default_type: Порожній тип - label_custom_style: Дизайн - label_custom_style_description: Виберіть, як OpenProject виглядає для вас із темами, - виберіть ваші кольори за замовчуванням для використання в застосунку та як виглядатимуть - експорти. - label_dashboard: Панель керування - label_database_version: Версія PostgreSQL - label_date: Дата - label_dates: Дати - label_date_and_time: Дата і час - label_date_format: 'Формат дати:' - label_date_from: Від - label_date_from_to: З %{start} по %{end} - label_date_to: 'Кому:' - label_day_plural: днів - label_default: За замовчуванням - label_delete_user: Видалити користувача - label_delete_project: Видалити проект - label_delete: Видалити - label_deleted: 'вилучено ' + label_comment_add: "Додати коментар" + label_comment_added: "Коментар додано" + label_comment_delete: "Видалити коментарі" + label_comment_plural: "Коментарі" + label_commits_per_author: "Комітів на автора" + label_commits_per_month: "Комітів на місяць" + label_confirmation: "Підтвердження" + label_contains: "містить" + label_content: "Контент" + label_color_plural: "Кольори" + label_copied: "скопійовано" + label_copy_same_as_target: "Те ж, що і для цілі" + label_copy_source: "Джерело" + label_copy_target: "Ціль" + label_copy_workflow_from: "Копіювати робочий процес з" + label_copy_project: "Копіювати проект" + label_core_version: "Версія ядра" + label_core_build: "Збірка ядра" + label_created_by: "Створено %{user}" + label_current_status: "Поточний статус" + label_current_version: "Поточна версія" + label_custom_field_add_no_type: "Додайте це поле до типу робочого пакета" + label_custom_field_new: "Нове спеціальне поле" + label_custom_field_plural: "Індивідуальні поля" + label_custom_field_default_type: "Порожній тип" + label_custom_style: "Дизайн" + label_custom_style_description: "Виберіть, як OpenProject виглядає для вас із темами, виберіть ваші кольори за замовчуванням для використання в застосунку та як виглядатимуть експорти." + label_dashboard: "Панель керування" + label_database_version: "Версія PostgreSQL" + label_date: "Дата" + label_dates: "Дати" + label_date_and_time: "Дата і час" + label_date_format: "Формат дати:" + label_date_from: "Від" + label_date_from_to: "З %{start} по %{end}" + label_date_to: "Кому:" + label_day_plural: "днів" + label_default: "За замовчуванням" + label_delete_user: "Видалити користувача" + label_delete_project: "Видалити проект" + label_delete: "Видалити" + label_deleted: "вилучено " label_deleted_custom_field: "(видалено спеціальне поле)" label_deleted_custom_item: "(видалений елемент)" label_deleted_custom_option: "(параметр видалення)" label_empty_element: "(пусто)" - label_go_back: Повернутися на попередній рівень меню - label_go_forward: Відкрити підменю %{module} - label_missing_or_hidden_custom_option: "(відсутнє значення або бракує дозволів для - доступу)" - label_descending: За спаданням - label_details: Детальніше - label_defaults: Значення за замовчуванням - label_development_roadmap: Розробка дорожньої карти - label_diff: різниця - label_diff_inline: підключений - label_diff_side_by_side: поряд - label_digital_accessibility: Цифрова доступність (ЦД) - label_disabled: Вимкнено - label_disabled_uppercase: Вимкнено - label_display: Дисплей - label_display_per_page: 'На сторінку: %{value}' - label_display_used_statuses_only: Відображати тільки ті статуси, які використовуються - в цьому трекері + label_go_back: "Повернутися на попередній рівень меню" + label_go_forward: "Відкрити підменю %{module}" + label_missing_or_hidden_custom_option: "(відсутнє значення або бракує дозволів для доступу)" + label_descending: "За спаданням" + label_details: "Детальніше" + label_defaults: "Значення за замовчуванням" + label_development_roadmap: "Розробка дорожньої карти" + label_diff: "різниця" + label_diff_inline: "підключений" + label_diff_side_by_side: "поряд" + label_digital_accessibility: "Цифрова доступність (ЦД)" + label_disabled: "Вимкнено" + label_disabled_uppercase: "Вимкнено" + label_display: "Дисплей" + label_display_per_page: "На сторінку: %{value}" + label_display_used_statuses_only: "Відображати тільки ті статуси, які використовуються в цьому трекері" label_download: "%{count} Завантажити" label_download_plural: "%{count} Завантажити" - label_downloads_abbr: Завантажень - label_duplicated_by: Дублюється - label_duplicate: Дублювати - label_duplicates: Дублікати - label_edit: Редагувати - label_edit_x: 'Редагувати: %{x}' - label_view_x: 'Переглянути: %{x}' - label_enable_multi_select: Перемкнути мультиселекцію - label_enabled_project_custom_fields: Увімкнено спеціальні поля - label_enabled_project_modules: Включені модулі - label_enabled_project_activities: Увімкнено функцію відстеження часу - label_end_to_end: кінець в кінець - label_end_to_start: до початку - label_enumeration_new: Нове значення перерахунку - label_enumeration_value: Значення перерахування - label_enumerations: Перерахування - label_enterprise: Enterprise + label_downloads_abbr: "Завантажень" + label_duplicated_by: "Дублюється" + label_duplicate: "Дублювати" + label_duplicates: "Дублікати" + label_edit: "Редагувати" + label_edit_x: "Редагувати: %{x}" + label_view_x: "Переглянути: %{x}" + label_enable_multi_select: "Перемкнути мультиселекцію" + label_enabled_project_custom_fields: "Увімкнено спеціальні поля" + label_enabled_project_modules: "Включені модулі" + label_enabled_project_activities: "Увімкнено функцію відстеження часу" + label_end_to_end: "кінець в кінець" + label_end_to_start: "до початку" + label_enumeration_new: "Нове значення перерахунку" + label_enumeration_value: "Значення перерахування" + label_enumerations: "Перерахування" + label_enterprise: "Enterprise" label_enterprise_active_users: "%{current}/%{limit} зареєстровано активних користувачів" - label_enterprise_edition: Версія Enterprise - label_enterprise_support: Корпоративна підтримка - label_environment: Навколишнє середовище - label_estimates_and_progress: Оцінки й прогрес виконання - label_equals: є + label_enterprise_edition: "Версія Enterprise" + label_enterprise_support: "Корпоративна підтримка" + label_environment: "Навколишнє середовище" + label_estimates_and_progress: "Оцінки й прогрес виконання" + label_equals: "є" label_equals_with_descendants: "– будь-який із нащадками" - label_everywhere: скрізь - label_example: Приклад - label_experimental: Експериментальне - label_i_am_member: Я учасник - label_ifc_viewer: Засіб перегляду Ifc - label_ifc_model_plural: Моделі Ifc - label_import: Імпортувати - label_export_to: 'Також вам доступні:' - label_expand: Розгорнути - label_expanded_click_to_collapse: Розширено. Натисніть, щоб згорнути + label_everywhere: "скрізь" + label_example: "Приклад" + label_experimental: "Експериментальне" + label_i_am_member: "Я учасник" + label_ifc_viewer: "Засіб перегляду Ifc" + label_ifc_model_plural: "Моделі Ifc" + label_import: "Імпортувати" + label_export_to: "Також вам доступні:" + label_expand: "Розгорнути" + label_expanded_click_to_collapse: "Розширено. Натисніть, щоб згорнути" label_f_hour: "%{value} година" label_f_hour_plural: "%{value} годин(и)" - label_favorite: Обрані - label_feed_plural: Канали - label_feeds_access_key: Клавіша доступу RSS - label_feeds_access_key_created_on: Створено ключ доступу RSS %{value} тому - label_feeds_access_key_type: RSS - label_file_plural: Файли - label_filter: Фільтри - label_filter_add: Додати фільтр - label_filter_by: Фільтрувати за - label_filter_any_name_attribute: Атрибути імені - label_filter_plural: Фільтри - label_filters_toggle: Показати / приховати фільтри - label_float: З плаваючою крапкою - label_folder: Папка - label_follows: слідкувати - label_force_user_language_to_default: Встановити мову користувачів, які мають не - підтримувану мову, за умовчанням - label_form_configuration: Конфігурація форми - label_formula: Формула - label_gantt_chart: Діаграма Ґанта - label_gantt_chart_plural: Діаграми Ґанта - label_general: Загальні - label_generate_key: Згенерувати ключ - label_global_modules: Глобальні модулі - label_global_roles: Глобальні ролі - label_git_path: Шлях до каталогу .git + label_favorite: "Обрані" + label_feed_plural: "Канали" + label_feeds_access_key: "Клавіша доступу RSS" + label_feeds_access_key_created_on: "Створено ключ доступу RSS %{value} тому" + label_feeds_access_key_type: "RSS" + label_file_plural: "Файли" + label_filter: "Фільтри" + label_filter_add: "Додати фільтр" + label_filter_by: "Фільтрувати за" + label_filter_any_name_attribute: "Атрибути імені" + label_filter_plural: "Фільтри" + label_filters_toggle: "Показати / приховати фільтри" + label_float: "З плаваючою крапкою" + label_folder: "Папка" + label_follows: "слідкувати" + label_force_user_language_to_default: "Встановити мову користувачів, які мають не підтримувану мову, за умовчанням" + label_form_configuration: "Конфігурація форми" + label_formula: "Формула" + label_gantt_chart: "Діаграма Ґанта" + label_gantt_chart_plural: "Діаграми Ґанта" + label_general: "Загальні" + label_generate_key: "Згенерувати ключ" + label_global_modules: "Глобальні модулі" + label_global_roles: "Глобальні ролі" + label_git_path: "Шлях до каталогу .git" label_greater_or_equal: ">=" - label_group_by: Групувати за - label_group_new: Нова група - label_group: Група - label_group_named: Група %{name} - label_group_plural: Групи - label_help: Допомога + label_group_by: "Групувати за" + label_group_new: "Нова група" + label_group: "Група" + label_group_named: "Група %{name}" + label_group_plural: "Групи" + label_help: "Допомога" label_here: тут - label_hide: Приховати - label_history: Історія - label_hierarchy: Ієрархія - label_hierarchy_leaf: Ієрархічний лист - label_home: Додому - label_subject_or_id: Тема або ідентифікатор - label_calendar_subscriptions: Підписки на календарі - label_identifier: Ідентифікатор - label_in: в - label_in_less_than: менш ніж - label_in_more_than: більше ніж - label_inactive: Неактивний - label_incoming_emails: Вхідні повідомлення - label_includes: Включити + label_hide: "Приховати" + label_history: "Історія" + label_hierarchy: "Ієрархія" + label_hierarchy_leaf: "Ієрархічний лист" + label_home: "Додому" + label_subject_or_id: "Тема або ідентифікатор" + label_calendar_subscriptions: "Підписки на календарі" + label_identifier: "Ідентифікатор" + label_in: "в" + label_in_less_than: "менш ніж" + label_in_more_than: "більше ніж" + label_inactive: "Неактивний" + label_incoming_emails: "Вхідні повідомлення" + label_includes: "Включити" label_incomplete: Не завершено label_include_sub_projects: Включити підпроєкти - label_index_by_date: Індекс за датою - label_index_by_title: Індекс за назвою - label_information: Інформація - label_information_plural: Інформація - label_installation_guides: Інструкції зі встановлення - label_integer: Ціле число - label_interface: Інтерфейс - label_internal: Власне - label_introduction_video: Відео про початок роботи - label_invite_user: Запросити користувача - label_item: Елемент - label_item_plural: Елементи - label_weighted_item_list: Список зважених елементів - label_share: Поділитися - label_share_project_list: Поділитися списком проєктів - label_share_work_package: Поділитися пакетом робіт - label_show_all_registered_users: Усі зареєстровані користувачі - label_show_less: Показати менше - label_show_more: Показати більше - label_journal: Журнал - label_journal_diff: Опис Порівняння - label_language: Мова - label_languages: Мови - label_external_links: Зовнішні посилання - label_locale: Мова й регіон - label_jump_to_a_project: Перейти до проекту... - label_jira_import: Імпорт із Jira - label_keyword_plural: Ключові слова - label_language_based: На основі мови користувача - label_last_activity: Остання активність - label_last_change_on: Остання зміна - label_last_changes: останні %{count} змін - label_last_login: Останній вхід - label_last_month: останній місяць - label_last_n_days: останні %{count} днів - label_last_week: ост. тиждень - label_latest_revision: Остання версія - label_latest_revision_plural: Останні версії - label_ldap_authentication: Авторизація за допомогою LDAP - label_learn_more: Докладніше + label_index_by_date: "Індекс за датою" + label_index_by_title: "Індекс за назвою" + label_information: "Інформація" + label_information_plural: "Інформація" + label_installation_guides: "Інструкції зі встановлення" + label_integer: "Ціле число" + label_interface: "Інтерфейс" + label_internal: "Власне" + label_introduction_video: "Відео про початок роботи" + label_invite_user: "Запросити користувача" + label_item: "Елемент" + label_item_plural: "Елементи" + label_weighted_item_list: "Список зважених елементів" + label_share: "Поділитися" + label_share_project_list: "Поділитися списком проєктів" + label_share_work_package: "Поділитися пакетом робіт" + label_show_all_registered_users: "Усі зареєстровані користувачі" + label_show_less: "Показати менше" + label_show_more: "Показати більше" + label_journal: "Журнал" + label_journal_diff: "Опис Порівняння" + label_language: "Мова" + label_languages: "Мови" + label_external_links: "Зовнішні посилання" + label_locale: "Мова й регіон" + label_jump_to_a_project: "Перейти до проекту..." + label_jira_import: "Імпорт із Jira" + label_keyword_plural: "Ключові слова" + label_language_based: "На основі мови користувача" + label_last_activity: "Остання активність" + label_last_change_on: "Остання зміна" + label_last_changes: "останні %{count} змін" + label_last_login: "Останній вхід" + label_last_month: "останній місяць" + label_last_n_days: "останні %{count} днів" + label_last_week: "ост. тиждень" + label_latest_revision: "Остання версія" + label_latest_revision_plural: "Останні версії" + label_ldap_authentication: "Авторизація за допомогою LDAP" + label_learn_more: "Докладніше" label_less_or_equal: "<=" - label_less_than_ago: менше, ніж день тому - label_link_url: Посилання (URL) - label_list: Список - label_loading: Завантаження... - label_locked: заблоковано - label_lock_user: Заблокувати користувача - label_logged_as: Ви увійшли як - label_login: Увійти - label_custom_comment: Коментар %{name} - label_custom_logo: Користувацький логотип для ПК - label_custom_logo_mobile: Користувацький логотип для мобільного - label_custom_export_logo: Користувацький логотип експорту - label_custom_export_cover: Фон обкладинки експорту - label_custom_export_footer: Власне зображення для нижнього колонтитула файлу, що - експортується - label_custom_export_font_regular: Звичайний - label_custom_export_font_bold: Жирний - label_custom_export_font_italic: Курсив - label_custom_export_font_bold_italic: Жирний курсив - label_custom_export_cover_overlay: Накладення фону обкладинки експорту - label_custom_export_cover_text_color: Колір тексту - label_custom_pdf_export_settings: Налаштування експорту PDF - label_custom_favicon: призначені для користувача іконки - label_custom_touch_icon: Призначений для користувача значок логотипу - label_logout: Вийти - label_mapping_for: 'Зіставлення для: %{attribute}' - label_main_menu: Бокове меню - label_manage: Керувати - label_manage_groups: Керувати групами - label_managed_repositories_vendor: Керований %{vendor} repositories - label_mathematical_operators: Математичні оператори - label_max_size: Максимальний розмір - label_me: мені - label_member_new: Новий учасник + label_less_than_ago: "менше, ніж день тому" + label_link_url: "Посилання (URL)" + label_list: "Список" + label_loading: "Завантаження..." + label_locked: "заблоковано" + label_lock_user: "Заблокувати користувача" + label_logged_as: "Ви увійшли як" + label_login: "Увійти" + label_custom_comment: "Коментар до атрибута «%{name}»" + label_custom_logo: "Користувацький логотип для ПК" + label_custom_logo_mobile: "Користувацький логотип для мобільного" + label_custom_export_logo: "Користувацький логотип експорту" + label_custom_export_cover: "Фон обкладинки експорту" + label_custom_export_footer: "Власне зображення для нижнього колонтитула файлу, що експортується" + label_custom_export_font_regular: "Звичайний" + label_custom_export_font_bold: "Жирний" + label_custom_export_font_italic: "Курсив" + label_custom_export_font_bold_italic: "Жирний курсив" + label_custom_export_cover_overlay: "Накладення фону обкладинки експорту" + label_custom_export_cover_text_color: "Колір тексту" + label_custom_pdf_export_settings: "Налаштування експорту PDF" + label_custom_favicon: "призначені для користувача іконки" + label_custom_touch_icon: "Призначений для користувача значок логотипу" + label_logout: "Вийти" + label_mapping_for: "Зіставлення для: %{attribute}" + label_main_menu: "Бокове меню" + label_manage: "Керувати" + label_manage_groups: "Керувати групами" + label_managed_repositories_vendor: "Керований %{vendor} repositories" + label_mathematical_operators: "Математичні оператори" + label_max_size: "Максимальний розмір" + label_me: "мені" + label_member_new: "Новий учасник" label_member_all_admin: "(Усі ролі через статус адміністратора)" - label_member_plural: Учасники - label_membership_plural: Членство - label_membership_added: Учасника додано - label_membership_updated: Учасника оновлено - label_menu: Меню + label_member_plural: "Учасники" + label_membership_plural: "Членство" + label_membership_added: "Учасника додано" + label_membership_updated: "Учасника оновлено" + label_menu: "Меню" label_menu_badge: - pre_alpha: попередня альфа - alpha: альфа - beta: бета - label_menu_item_name: Назва пункту меню - label_message: Повідомлення - label_message_last: Останнє повідомлення - label_message_new: Нове повідомлення - label_message_plural: Повідомлення - label_message_posted: Повідомлення додано - label_min_max_length: Мінімальна - максимальна довжина - label_minute_plural: хвилини - label_missing_api_access_key: Відсутній ключ доступу до API - label_missing_feeds_access_key: Відсутній ключ доступу RSS + pre_alpha: "попередня альфа" + alpha: "альфа" + beta: "бета" + label_menu_item_name: "Назва пункту меню" + label_message: "Повідомлення" + label_message_last: "Останнє повідомлення" + label_message_new: "Нове повідомлення" + label_message_plural: "Повідомлення" + label_message_posted: "Повідомлення додано" + label_min_max_length: "Мінімальна - максимальна довжина" + label_minute_plural: "хвилини" + label_missing_api_access_key: "Відсутній ключ доступу до API" + label_missing_feeds_access_key: "Відсутній ключ доступу RSS" label_modification: "%{count} змін" - label_modified: змінено - label_module_plural: Модулі - label_modules: Модулі - label_months_from: місяців(ця) з - label_more: Більше - label_more_information: Додаткові відомості - label_more_than_ago: більш ніж днів(я) назад - label_move_column_left: Перемістити стовпець ліворуч - label_move_column_right: Перемістити стовпець праворуч - label_move_work_package: Перемістити робочий пакет - label_my_account: Налаштування облікового запису - label_my_activity: Мої дії - label_my_account_data: Мої дані облікового запису - label_my_avatar: Мій аватар - label_my_queries: Мої збережені запити - label_name: Назва - label_never: Ніколи - label_new: Нові - label_new_features: Нові можливості - label_new_statuses_allowed: Дозволені нові статуси - label_news_singular: Новини - label_news_added: Новину додано - label_news_comment_added: Добавлено новий коментар до новини - label_news_latest: Останні новини - label_news_new: Додати новини - label_news_edit: Редагувати новини - label_news_plural: Новини - label_news_view_all: Подивитися всі новини - label_next: Далі - label_next_week: Наступний тиждень + label_modified: "змінено" + label_module_plural: "Модулі" + label_modules: "Модулі" + label_months_from: "місяців(ця) з" + label_more: "Більше" + label_more_information: "Додаткові відомості" + label_more_than_ago: "більш ніж днів(я) назад" + label_move_column_left: "Перемістити стовпець ліворуч" + label_move_column_right: "Перемістити стовпець праворуч" + label_move_work_package: "Перемістити робочий пакет" + label_my_account: "Налаштування облікового запису" + label_my_activity: "Мої дії" + label_my_account_data: "Мої дані облікового запису" + label_my_avatar: "Мій аватар" + label_my_queries: "Мої збережені запити" + label_name: "Назва" + label_never: "Ніколи" + label_new: "Нові" + label_new_features: "Нові можливості" + label_new_statuses_allowed: "Дозволені нові статуси" + label_news_singular: "Новини" + label_news_added: "Новину додано" + label_news_comment_added: "Добавлено новий коментар до новини" + label_news_latest: "Останні новини" + label_news_new: "Додати новини" + label_news_edit: "Редагувати новини" + label_news_plural: "Новини" + label_news_view_all: "Подивитися всі новини" + label_next: "Далі" + label_next_week: "Наступний тиждень" label_no_change_option: "(Немає змін)" - label_no_data: Немає даних для відображення - label_no_due_date: немає дати завершення - label_no_start_date: немає дати початку - label_no_parent_page: Немає початкової сторінки - label_notification_center_plural: Сповіщення - label_nothing_display: Нічого не відображається - label_nobody: жодні - label_not_configured: Не налаштовано - label_not_found: не знайдено - label_none: нічого + label_no_data: "Немає даних для відображення" + label_no_due_date: "немає дати завершення" + label_no_start_date: "немає дати початку" + label_no_parent_page: "Немає початкової сторінки" + label_notification_center_plural: "Сповіщення" + label_nothing_display: "Нічого не відображається" + label_nobody: "жодні" + label_not_configured: "Не налаштовано" + label_not_found: "не знайдено" + label_none: "нічого" label_none_parentheses: "(немає)" - label_not_contains: не містить - label_not_equals: немає - label_life_cycle_step_plural: Життєвий цикл проєкту - label_on: на - label_operator_all: вказано - label_operator_none: не вказано - label_operator_equals_or: є (АБО) - label_operator_equals_all: є (І) - label_operator_shared_with_user_any: усі - label_open: відкрити - label_closed: зачинено - label_open_menu: Відкрити меню - label_open_work_packages: відкрити - label_open_work_packages_plural: відкрити - label_openproject_website: Веб-сайт OpenProject - label_optional_description: Опис - label_options: Опції - label_other: Інше - label_overall_activity: Загальна активність - label_overview: Огляд - label_page_title: Заголовок сторінки - label_part_of: частина - label_password_lost: Забули Ваш пароль? - label_password_rule_lowercase: До нижнього регістру - label_password_rule_numeric: Цифрові символи - label_password_rule_special: Спеціальні символи - label_password_rule_uppercase: Верхній регістр - label_path_encoding: Кодування шляху - label_per_page: 'К-сть на сторінку:' - label_people: Люди - label_permissions: Дозволи - label_permissions_report: Звіт про права доступу - label_personalize_page: Персоналізуйте цю сторінку - label_placeholder_user: Прототип користувача - label_placeholder_user_new: Створити прототип користувача - label_placeholder_user_plural: Протототипи користувачів - label_planning: Планування - label_please_login: Увійдіть у систему - label_plugins: Плагіни - label_portfolio_plural: Портфелі - label_modules_and_plugins: Модулі та плагіни - label_precedes: переважати - label_preferences: Налаштування - label_preview: Попередній перегляд - label_preview_not_available: Попередній перегляд недоступний - label_previous: Попередній - label_previous_week: Попередній тиждень - label_principal_invite_via_email: або запрошувати нових користувачів електронною - поштою - label_principal_search: Додати існуючих користувачів або групи - label_privacy_policy: Політика конфіденційності та безпеки даних - label_product_version: Версія продукту - label_profile: Профіль + label_not_contains: "не містить" + label_not_equals: "немає" + label_life_cycle_step_plural: "Життєвий цикл проєкту" + label_on: "на" + label_operator_all: "вказано" + label_operator_none: "не вказано" + label_operator_equals_or: "є (АБО)" + label_operator_equals_all: "є (І)" + label_operator_shared_with_user_any: "усі" + label_open: "відкрити" + label_closed: "зачинено" + label_open_menu: "Відкрити меню" + label_open_work_packages: "відкрити" + label_open_work_packages_plural: "відкрити" + label_openproject_website: "Веб-сайт OpenProject" + label_optional_description: "Опис" + label_options: "Опції" + label_other: "Інше" + label_overall_activity: "Загальна активність" + label_overview: "Огляд" + label_page_title: "Заголовок сторінки" + label_part_of: "частина" + label_password_lost: "Забули Ваш пароль?" + label_password_rule_lowercase: "До нижнього регістру" + label_password_rule_numeric: "Цифрові символи" + label_password_rule_special: "Спеціальні символи" + label_password_rule_uppercase: "Верхній регістр" + label_path_encoding: "Кодування шляху" + label_per_page: "К-сть на сторінку:" + label_people: "Люди" + label_permissions: "Дозволи" + label_permissions_report: "Звіт про права доступу" + label_personalize_page: "Персоналізуйте цю сторінку" + label_placeholder_user: "Прототип користувача" + label_placeholder_user_new: "Створити прототип користувача" + label_placeholder_user_plural: "Протототипи користувачів" + label_planning: "Планування" + label_please_login: "Увійдіть у систему" + label_plugins: "Плагіни" + label_portfolio_plural: "Портфелі" + label_modules_and_plugins: "Модулі та плагіни" + label_precedes: "переважати" + label_preferences: "Налаштування" + label_preview: "Попередній перегляд" + label_preview_not_available: "Попередній перегляд недоступний" + label_previous: "Попередній" + label_previous_week: "Попередній тиждень" + label_principal_invite_via_email: "або запрошувати нових користувачів електронною поштою" + label_principal_search: "Додати існуючих користувачів або групи" + label_privacy_policy: "Політика конфіденційності та безпеки даних" + label_product_version: "Версія продукту" + label_profile: "Профіль" label_percent_complete: "% завершення" - label_progress_tracking: Відстеження прогресу - label_project: Проєкт - label_project_activity: Дії в проєкті - label_project_attribute_plural: Атрибути проєкту - label_project_attribute_manage_link: Керувати атрибутами проєкту - label_project_count: Загальна кількість проектів - label_project_copy_notifications: Відправлення повідомлень по електронній пошті - в ході реалізації проекту копія - label_project_initiation_export_pdf: Експорт PDF для проєкту «%{project_creation_name}» - label_project_latest: Останні проекти - label_project_default_type: Дозволити порожній тип - label_project_hierarchy: Ієрархія проектів - label_project_mappings: Проєкти - label_project_new: Новий проект - label_project_plural: Проєкти - label_project_list_plural: Списки проєкту - label_project_life_cycle: Життєвий цикл проєкту - label_project_attributes_plural: Атрибути проєкту - label_project_custom_field_plural: Атрибути проєкту - label_project_settings: Налаштування проекту - label_project_attributes_settings: Налаштування атрибутів проєкту - label_project_storage_plural: Файлові сховища - label_project_storage_project_folder: 'Файлові сховища: папки проєкту' - label_projects_disk_usage_information: 'Проєктів, що використовують %{used_disk_space} - місця на диску: %{count}' - label_project_view_all: Переглянути всi проекти - label_project_show_details: Показати деталі проекту - label_project_hide_details: Приховати деталі проекту - label_portfolio: Портфель - label_portfolio_new: Новий портфель - label_program: Програма - label_program_new: Нова програма - label_public_projects: Публічні проекти - label_query_new: Новий запит - label_query_plural: Спеціальні запити - label_read: Читання... - label_read_documentation: Прочитати документацію - label_register: Створити новий акаунт - label_register_with_developer: Зареєструйтеся як розробник - label_registered_on: Зареєстровано на - label_related_work_packages: Пов'язані робочі пакети - label_relates: зв’язано з - label_relates_to: пов'язані з - label_relation: Зв’язок - label_relation_actions: Дії зі зв’язками - label_relation_delete: Видалити зв'язок - label_relation_edit: Редагувати зв’язок - label_relation_new: Новий зв'язок - label_release_notes: Примітки до випуску - label_remaining_work: Залишок роботи - label_remove_column: Вилучити стовпець - label_remove_columns: Видалити вибрані стовпці - label_renamed: перейменовано - label_reply_plural: Відповіді - label_report: Звіт - label_report_bug: Повідомити про помилку - label_report_plural: Звіти - label_reported_work_packages: Зазначені робочі пакети - label_reporting: Звітність - label_reporting_plural: Звітність - label_repository: Репозиторій - label_repository_remove: Вилучити репозиторій - label_repository_root: Корень сховища - label_repository_plural: Репозиторії - label_request_submission: Подання запиту - label_required: вимагається - label_requires: вимагається - label_result_plural: Результати - label_revision: Ревізія - label_revision_id: Ревізія %{value} - label_revision_plural: Ревізії - label_roadmap: Дорожня карта - label_roadmap_edit: Редагувати дорожню карту %{name} - label_roadmap_due_in: Строк %{value} - label_roadmap_no_work_packages: Немає робочих пакетів для цієї версії + label_progress_tracking: "Відстеження прогресу" + label_project: "Проєкт" + label_project_activity: "Дії в проєкті" + label_project_attribute_plural: "Атрибути проєкту" + label_project_attribute_manage_link: "Керувати атрибутами проєкту" + label_project_count: "Загальна кількість проектів" + label_project_copy_notifications: "Відправлення повідомлень по електронній пошті в ході реалізації проекту копія" + label_project_initiation_export_pdf: "Експорт PDF для проєкту «%{project_creation_name}»" + label_project_latest: "Останні проекти" + label_project_default_type: "Дозволити порожній тип" + label_project_hierarchy: "Ієрархія проектів" + label_project_mappings: "Проєкти" + label_project_new: "Новий проект" + label_project_plural: "Проєкти" + label_project_list_plural: "Списки проєкту" + label_project_life_cycle: "Життєвий цикл проєкту" + label_project_attributes_plural: "Атрибути проєкту" + label_project_custom_field_plural: "Атрибути проєкту" + label_project_settings: "Налаштування проекту" + label_project_attributes_settings: "Налаштування атрибутів проєкту" + label_project_storage_plural: "Файлові сховища" + label_project_storage_project_folder: "Файлові сховища: папки проєкту" + label_projects_disk_usage_information: "Проєктів, що використовують %{used_disk_space} місця на диску: %{count}" + label_project_view_all: "Переглянути всi проекти" + label_project_show_details: "Показати деталі проекту" + label_project_hide_details: "Приховати деталі проекту" + label_portfolio: "Портфель" + label_portfolio_new: "Новий портфель" + label_program: "Програма" + label_program_new: "Нова програма" + label_public_projects: "Публічні проекти" + label_query_new: "Новий запит" + label_query_plural: "Спеціальні запити" + label_read: "Читання..." + label_read_documentation: "Прочитати документацію" + label_register: "Створити новий акаунт" + label_register_with_developer: "Зареєструйтеся як розробник" + label_registered_on: "Зареєстровано на" + label_related_work_packages: "Пов'язані робочі пакети" + label_relates: "зв’язано з" + label_relates_to: "пов'язані з" + label_relation: "Зв’язок" + label_relation_actions: "Дії зі зв’язками" + label_relation_delete: "Видалити зв'язок" + label_relation_edit: "Редагувати зв’язок" + label_relation_new: "Новий зв'язок" + label_release_notes: "Примітки до випуску" + label_remaining_work: "Залишок роботи" + label_remove_column: "Вилучити стовпець" + label_remove_columns: "Видалити вибрані стовпці" + label_renamed: "перейменовано" + label_reply_plural: "Відповіді" + label_report: "Звіт" + label_report_bug: "Повідомити про помилку" + label_report_plural: "Звіти" + label_reported_work_packages: "Зазначені робочі пакети" + label_reporting: "Звітність" + label_reporting_plural: "Звітність" + label_repository: "Репозиторій" + label_repository_remove: "Вилучити репозиторій" + label_repository_root: "Корень сховища" + label_repository_plural: "Репозиторії" + label_request_submission: "Подання запиту" + label_required: "вимагається" + label_requires: "вимагається" + label_result_plural: "Результати" + label_revision: "Ревізія" + label_revision_id: "Ревізія %{value}" + label_revision_plural: "Ревізії" + label_roadmap: "Дорожня карта" + label_roadmap_edit: "Редагувати дорожню карту %{name}" + label_roadmap_due_in: "Строк %{value}" + label_roadmap_no_work_packages: "Немає робочих пакетів для цієї версії" label_roadmap_overdue: "%{value} запізнення" - label_role_and_permissions: Ролі і права доступу - label_role_new: Нова роль - label_role_grantable: Роль, що надається - label_role_plural: Роль - label_role_search: Призначити роль для нових членів - label_scm: Тип сховища - label_scroll_left: Гортати вліво - label_scroll_right: Гортати вправо - label_search: Пошук - label_search_by_name: Пошук за назвою - label_send_information: Надіслати нові облікові дані користувачу - label_send_test_email: Послати email для перевірки - label_session: Сеанс - label_setting_plural: Налаштування - label_system_settings: Параметри системи - label_show_completed_versions: Показати завершені версії - label_columns: Стовпці - label_sort: Сортувати - label_sort_ascending: Сортувати за зростанням - label_sort_by: Сортувати за %{value} - label_sorted_by: відсортовані за %{value} - label_sort_descending: Сортувати за спаданням - label_sort_higher: Рухатися вгору - label_sort_highest: Помістити на верх - label_sort_lower: Пересунути нижче - label_sort_lowest: Помістити в кінець - label_spent_time: Витрачений час - label_start_to_end: закінчення - label_start_to_start: початок - label_statistics: Статистика - label_status: Стан - label_storage_free_space: Залишок на диску - label_storage_used_space: Використовується дисковий простір - label_storage_group: Зберігання файлової системи %{identifier} - label_storage_for: Охоплює зберігання для - label_string: Текст - label_subproject: Підпроєкт - label_subproject_new: Новий підпроект - label_subproject_plural: Підпроекти - label_subitems: Піделементи - label_subtask_plural: Підзадачі - label_summary: Резюме - label_system: Система - label_system_storage: Інформація про зберігання - label_table_of_contents: Зміст - label_tag: Мітка - label_team_planner: Командний планувальник - label_template: Шаблон - label_templates: Шаблони - label_text: Довгий текст - label_this_month: цього місяця - label_this_week: цього тижня - label_this_year: цей рік - label_time: Час - label_time_entry_plural: Витрачений час - label_time_entry_activity_plural: Завдання з обліком часу - label_title: Назва - label_projects_menu: Проєкти - label_today: сьогодні - label_token_version: Версія маркера - label_today_as_start_date: Виберіть сьогодні як дату початку. - label_today_as_due_date: Виберіть сьогодні як дату завершення. - label_today_as_date: Виберіть сьогодні як дату. - label_top_menu: Верхнє меню - label_topic_plural: Теми - label_total: Усього - label_type_new: Новий тип - label_type_plural: Типи - label_ui: Користувацький інтерфейс - label_updated_time: Оновлений %{value} назад + label_role_and_permissions: "Ролі і права доступу" + label_role_new: "Нова роль" + label_role_grantable: "Роль, що надається" + label_role_plural: "Роль" + label_role_search: "Призначити роль для нових членів" + label_scm: "Тип сховища" + label_scroll_left: "Гортати вліво" + label_scroll_right: "Гортати вправо" + label_search: "Пошук" + label_search_by_name: "Пошук за назвою" + label_send_information: "Надіслати нові облікові дані користувачу" + label_send_test_email: "Послати email для перевірки" + label_session: "Сеанс" + label_setting_plural: "Налаштування" + label_system_settings: "Параметри системи" + label_show_completed_versions: "Показати завершені версії" + label_columns: "Стовпці" + label_sort: "Сортувати" + label_sort_ascending: "Сортувати за зростанням" + label_sort_by: "Сортувати за %{value}" + label_sorted_by: "відсортовані за %{value}" + label_sort_descending: "Сортувати за спаданням" + label_sort_higher: "Рухатися вгору" + label_sort_highest: "Помістити на верх" + label_sort_lower: "Пересунути нижче" + label_sort_lowest: "Помістити в кінець" + label_spent_time: "Витрачений час" + label_start_to_end: "закінчення" + label_start_to_start: "початок" + label_statistics: "Статистика" + label_status: "Стан" + label_storage_free_space: "Залишок на диску" + label_storage_used_space: "Використовується дисковий простір" + label_storage_group: "Зберігання файлової системи %{identifier}" + label_storage_for: "Охоплює зберігання для" + label_string: "Текст" + label_subproject: "Підпроєкт" + label_subproject_new: "Новий підпроект" + label_subproject_plural: "Підпроекти" + label_subitems: "Піделементи" + label_subtask_plural: "Підзадачі" + label_summary: "Резюме" + label_system: "Система" + label_system_storage: "Інформація про зберігання" + label_table_of_contents: "Зміст" + label_tag: "Мітка" + label_team_planner: "Командний планувальник" + label_template: "Шаблон" + label_templates: "Шаблони" + label_text: "Довгий текст" + label_this_month: "цього місяця" + label_this_week: "цього тижня" + label_this_year: "цей рік" + label_time: "Час" + label_time_entry_plural: "Витрачений час" + label_time_entry_activity_plural: "Завдання з обліком часу" + label_title: "Назва" + label_projects_menu: "Проєкти" + label_today: "сьогодні" + label_token_version: "Версія маркера" + label_today_as_start_date: "Виберіть сьогодні як дату початку." + label_today_as_due_date: "Виберіть сьогодні як дату завершення." + label_today_as_date: "Виберіть сьогодні як дату." + label_top_menu: "Верхнє меню" + label_topic_plural: "Теми" + label_total: "Усього" + label_type_new: "Новий тип" + label_type_plural: "Типи" + label_ui: "Користувацький інтерфейс" + label_updated_time: "Оновлений %{value} назад" label_updated_time_at: "%{author} %{age}" - label_updated_time_by: Оновлено %{author} %{age} назад - label_upgrade_guides: Оновлення керівництва - label_used_by: Використовується - label_used_by_types: Використовується за типами - label_used_in_projects: Використовується в проектах - label_user: Користувач - label_user_and_permission: Користувачі й дозволи - label_user_named: User %{name} - label_user_activity: Дії користувача %{value} - label_user_anonymous: Невідомий - label_user_mail_option_all: Для всіх подій у всіх моїх проектах - label_user_mail_option_none: Ніяких подій - label_user_mail_option_only_assigned: Тільки за те що я призначений - label_user_mail_option_only_my_events: Тільки для речей які я дивлюся чи я займаюся - label_user_mail_option_only_owner: Тільки для речей, за якими я спостерігаю або - є власником - label_user_mail_option_selected: Для будь-якої події на вибраних проектах - label_user_menu: Меню користувача - label_user_new: Новий користувач - label_user_plural: Користувачі - label_user_search: 'Знайти користувача:' - label_user_settings: Налаштування користувача - label_users_settings: Налаштування користувачів - label_value_x: 'Значення: %{x}' - label_version_new: Нова версія - label_version_edit: Редагувати версію - label_version_plural: Версії - label_version_sharing_descendants: З підпроектами - label_version_sharing_hierarchy: Ієрархія проектів - label_version_sharing_none: Без сумісного доступу - label_version_sharing_system: З усіма проектами - label_version_sharing_tree: З деревом проекту - label_videos: Відео - label_view_all_revisions: Переглянути всі зміни - label_view_diff: Переглянути відмінності - label_view_revisions: Переглянути зміни - label_watched_work_packages: Спостерігали робочі пакети - label_what_is_this: Що це? - label_week: Тиждень - label_widget: Віджет - label_widget_new: Новий віджет - label_wiki_content_added: Додано сторінку Wiki - label_wiki_content_updated: Сторінка Wiki оновлена - label_wiki_toc: Зміст - label_wiki_toc_empty: Зміст пустий, оскільки немає заголовків. - label_wiki_dont_show_menu_item: Не показувати це wikipage в навігації проекту - label_wiki_edit: Редагування Wiki - label_wiki_edit_plural: Редагування Wiki - label_wiki_page_attachments: Додавання сторінок Wiki - label_wiki_page_id: ID вікі-сторінки - label_wiki_navigation: Навігація Wiki - label_wiki_page: Сторінка Wiki - label_wiki_page_plural: Сторінки Wiki - label_wiki_show_index_page_link: Показати пункт підменю "Зміст" - label_wiki_show_menu_item: Показати як пункт меню в навігації по проекту - label_wiki_show_new_page_link: Показати елемент підменю "Створити нову початкову - сторінку" - label_wiki_show_submenu_item: 'Показати як пункт підменю ' - label_wiki_start: Початкова сторінка - label_work: Робота - label_work_package: Робочий пакет - label_work_package_attachments: Додатки до робочого пакету - label_work_package_category_new: Нова категорія - label_work_package_category_plural: Категорії робочих пакетів - label_work_package_comments: Коментарі до пакета робіт - label_work_package_hierarchy: Ієрархія робочих пакетів - label_work_package_new: Новий пакет робіт - label_work_package_edit: Редагувати робочий пакет %{name} - label_work_package_plural: Пакет робіт - label_work_package_status: Стан пакета робіт - label_work_package_status_new: Новий статус - label_work_package_status_plural: Статуси робочих пакетів - label_work_package_types: Типи робочих пакетів - label_work_package_tracking: Відстеження робочого пакету - label_work_package_view_all: Переглянути всі робочі пакети - label_workflow: Робочий процес - label_workflow_copy: Копіювати робочий процес - label_workflow_plural: Робочі процеси - label_workflow_summary: Резюме - label_working_days_and_hours: Робочі дні й години + label_updated_time_by: "Оновлено %{author} %{age} назад" + label_upgrade_guides: "Оновлення керівництва" + label_used_by: "Використовується" + label_used_by_types: "Використовується за типами" + label_used_in_projects: "Використовується в проектах" + label_user: "Користувач" + label_user_and_permission: "Користувачі й дозволи" + label_user_named: "User %{name}" + label_user_activity: "Дії користувача %{value}" + label_user_anonymous: "Невідомий" + label_user_mail_option_all: "Для всіх подій у всіх моїх проектах" + label_user_mail_option_none: "Ніяких подій" + label_user_mail_option_only_assigned: "Тільки за те що я призначений" + label_user_mail_option_only_my_events: "Тільки для речей які я дивлюся чи я займаюся" + label_user_mail_option_only_owner: "Тільки для речей, за якими я спостерігаю або є власником" + label_user_mail_option_selected: "Для будь-якої події на вибраних проектах" + label_user_menu: "Меню користувача" + label_user_new: "Новий користувач" + label_user_plural: "Користувачі" + label_user_search: "Знайти користувача:" + label_user_settings: "Налаштування користувача" + label_users_settings: "Налаштування користувачів" + label_value_x: "Значення: %{x}" + label_version_new: "Нова версія" + label_version_edit: "Редагувати версію" + label_version_plural: "Версії" + label_version_sharing_descendants: "З підпроектами" + label_version_sharing_hierarchy: "Ієрархія проектів" + label_version_sharing_none: "Без сумісного доступу" + label_version_sharing_system: "З усіма проектами" + label_version_sharing_tree: "З деревом проекту" + label_videos: "Відео" + label_view_all_revisions: "Переглянути всі зміни" + label_view_diff: "Переглянути відмінності" + label_view_revisions: "Переглянути зміни" + label_watched_work_packages: "Спостерігали робочі пакети" + label_what_is_this: "Що це?" + label_week: "Тиждень" + label_widget: "Віджет" + label_widget_new: "Новий віджет" + label_wiki_content_added: "Додано сторінку Wiki" + label_wiki_content_updated: "Сторінка Wiki оновлена" + label_wiki_toc: "Зміст" + label_wiki_toc_empty: "Зміст пустий, оскільки немає заголовків." + label_wiki_dont_show_menu_item: "Не показувати це wikipage в навігації проекту" + label_wiki_edit: "Редагування Wiki" + label_wiki_edit_plural: "Редагування Wiki" + label_wiki_page_attachments: "Додавання сторінок Wiki" + label_wiki_page_id: "ID вікі-сторінки" + label_wiki_navigation: "Навігація Wiki" + label_wiki_page: "Сторінка Wiki" + label_wiki_page_plural: "Сторінки Wiki" + label_wiki_show_index_page_link: "Показати пункт підменю \"Зміст\"" + label_wiki_show_menu_item: "Показати як пункт меню в навігації по проекту" + label_wiki_show_new_page_link: "Показати елемент підменю \"Створити нову початкову сторінку\"" + label_wiki_show_submenu_item: "Показати як пункт підменю " + label_wiki_start: "Початкова сторінка" + label_work: "Робота" + label_work_package: "Робочий пакет" + label_work_package_attachments: "Додатки до робочого пакету" + label_work_package_category_new: "Нова категорія" + label_work_package_category_plural: "Категорії робочих пакетів" + label_work_package_comments: "Коментарі до пакета робіт" + label_work_package_hierarchy: "Ієрархія робочих пакетів" + label_work_package_new: "Новий пакет робіт" + label_work_package_edit: "Редагувати робочий пакет %{name}" + label_work_package_plural: "Пакет робіт" + label_work_package_status: "Стан пакета робіт" + label_work_package_status_new: "Новий статус" + label_work_package_status_plural: "Статуси робочих пакетів" + label_work_package_types: "Типи робочих пакетів" + label_work_package_tracking: "Відстеження робочого пакету" + label_work_package_view_all: "Переглянути всі робочі пакети" + label_workflow: "Робочий процес" + label_workflow_copy: "Копіювати робочий процес" + label_workflow_plural: "Робочі процеси" + label_workflow_summary: "Резюме" + label_working_days_and_hours: "Робочі дні й години" label_x_closed_work_packages_abbr: - one: 1 закрито - other: 'Закрито: %{count}' - zero: 0 закрито + one: "1 закрито" + other: "Закрито: %{count}" + zero: "0 закрито" label_x_comments: - one: 1 коментар - other: 'Коментарів: %{count}' - zero: немає коментарів + one: "1 коментар" + other: "Коментарів: %{count}" + zero: "немає коментарів" label_x_open_work_packages_abbr: - one: 1 відкрито - other: 'Відкрито: %{count}' - zero: 0 відкрито + one: "1 відкрито" + other: "Відкрито: %{count}" + zero: "0 відкрито" label_x_work_packages: - one: 1 пакет робіт - other: 'Пакетів робіт: %{count}' - zero: Немає пакетів робіт + one: "1 пакет робіт" + other: "Пакетів робіт: %{count}" + zero: "Немає пакетів робіт" label_x_projects: - one: 1 проєкт - other: 'Проєктів: %{count}' - zero: немає проєктів + one: "1 проєкт" + other: "Проєктів: %{count}" + zero: "немає проєктів" label_x_files: - one: 1 файл - other: 'Файлів: %{count}' - zero: немає файлів - label_yesterday: вчора - label_zen_mode: Режим «Дзен» - label_role_type: Тип - label_member_role: Роль у проєкті - label_global_role: Глобальна роль + one: "1 файл" + other: "Файлів: %{count}" + zero: "немає файлів" + label_yesterday: "вчора" + label_zen_mode: "Режим «Дзен»" + label_role_type: "Тип" + label_member_role: "Роль у проєкті" + label_global_role: "Глобальна роль" label_not_changeable: "(не змінюється)" - label_global: Глобальний - label_seeded_from_env_warning: Цей запис створено за допомогою змінної середовища - конфігурації. Його не можна змінити в інтерфейсі користувача. - macro_execution_error: Помилка виконання макросу %{macro_name} - macro_unavailable: Макрос %{macro_name} не може бути відображений. + label_global: "Глобальний" + label_seeded_from_env_warning: Цей запис створено за допомогою змінної середовища конфігурації. Його не можна змінити в інтерфейсі користувача. + macro_execution_error: "Помилка виконання макросу %{macro_name}" + macro_unavailable: "Макрос %{macro_name} не може бути відображений." macros: placeholder: "[Placeholder] Макрос %{macro_name}" errors: - missing_or_invalid_parameter: Відсутній або неприпустимий параметр макросу. + missing_or_invalid_parameter: "Відсутній або неприпустимий параметр макросу." legacy_warning: - timeline: Цей попередній макрос часової шкали видалено та більше не доступний. - Можна замінити функціональність вбудованим макросом таблиці. + timeline: "Цей попередній макрос часової шкали видалено та більше не доступний. Можна замінити функціональність вбудованим макросом таблиці." include_wiki_page: - removed: Макросу більше не існує. + removed: "Макросу більше не існує." wiki_child_pages: errors: - page_not_found: Не вдається знайти вікі-сторінку %{name} + page_not_found: "Не вдається знайти вікі-сторінку %{name}" create_work_package_link: errors: - no_project_context: Виклик макросу create_work_package_link із зовнішнього - контексту проекту. - invalid_type: Не знайдено жодного типу з назвою %{type} в проекті %{project}. - link_name: Новий пакет робіт - link_name_type: Новий %{type_name} + no_project_context: "Виклик макросу create_work_package_link із зовнішнього контексту проекту." + invalid_type: "Не знайдено жодного типу з назвою %{type} в проекті %{project}." + link_name: "Новий пакет робіт" + link_name_type: "Новий %{type_name}" mail: - actions: Дії + actions: "Дії" digests: - including_mention_singular: включно зі згадкою - including_mention_plural: включно зі згадками (%{number_mentioned}) - unread_notification_singular: '1 не прочитане сповіщення ' - unread_notification_plural: 'стільки непрочитаних сповіщень: %{number_unread}' - you_have: У вас - logo_alt_text: Логотип + including_mention_singular: "включно зі згадкою" + including_mention_plural: "включно зі згадками (%{number_mentioned})" + unread_notification_singular: "1 не прочитане сповіщення " + unread_notification_plural: "стільки непрочитаних сповіщень: %{number_unread}" + you_have: "У вас" + logo_alt_text: "Логотип" mention: - subject: 'Користувач %{user_name} згадав вас у #%{id} – %{subject}' + subject: "Користувач %{user_name} згадав вас у #%{id} – %{subject}" notification: - center: Центр сповіщень - see_in_center: Переглянути коментарі у центрі сповіщень - settings: Змінити налаштування електронної пошти - salutation: Добрий день, %{user}! - salutation_full_name: Повне ім’я + center: "Центр сповіщень" + see_in_center: "Переглянути коментарі у центрі сповіщень" + settings: "Змінити налаштування електронної пошти" + salutation: "Добрий день, %{user}!" + salutation_full_name: "Повне ім’я" work_packages: - created_at: Створено о %{timestamp} користувачем %{user}  - login_to_see_all: Увійдіть, щоб переглянути всі сповіщення. - mentioned: Вас згадано в коментарі - mentioned_by: Користувач %{user} згадав вас у коментарі + created_at: "Створено о %{timestamp} користувачем %{user} " + login_to_see_all: "Увійдіть, щоб переглянути всі сповіщення." + mentioned: "Вас згадано в коментарі" + mentioned_by: "Користувач %{user} згадав вас у коментарі" more_to_see: - one: Є ще 1 пакет робіт зі сповіщеннями. - few: Є ще %{count} пакети робіт зі сповіщеннями. - many: Є ще %{count} пакетів робіт зі сповіщеннями. - other: Є ще %{count} пакета робіт зі сповіщеннями. - open_in_browser: Відкрити в браузері + one: "Є ще 1 пакет робіт зі сповіщеннями." + few: "Є ще %{count} пакети робіт зі сповіщеннями." + many: "Є ще %{count} пакетів робіт зі сповіщеннями." + other: "Є ще %{count} пакета робіт зі сповіщеннями." + open_in_browser: "Відкрити в браузері" reason: - watched: Відстежено - assigned: Призначено - responsible: Відповідальний - mentioned: Згадано - shared: Спільні - subscribed: усі - prefix: 'Отримано через налаштування сповіщень: %{reason}' - date_alert_start_date: Оповіщення про дату - date_alert_due_date: Оповіщення про дату - reminder: Нагадування - see_all: Показати всі - updated_at: Оновлено о %{timestamp} користувачем %{user} + watched: "Відстежено" + assigned: "Призначено" + responsible: "Відповідальний" + mentioned: "Згадано" + shared: "Спільні" + subscribed: "усі" + prefix: "Отримано через налаштування сповіщень: %{reason}" + date_alert_start_date: "Оповіщення про дату" + date_alert_due_date: "Оповіщення про дату" + reminder: "Нагадування" + see_all: "Показати всі" + updated_at: "Оновлено о %{timestamp} користувачем %{user}" reminder_notifications: - subject: 'Нагадування: %{note}' - heading: У вас нове нагадування - note: 'Примітка: "%{note}"' + subject: "Нагадування: %{note}" + heading: "У вас нове нагадування" + note: "Примітка: \"%{note}\"" sharing: work_packages: - allowed_actions: Ви можете %{allowed_actions} у цьому пакеті робіт, але це - залежить від вашої ролі й дозволів у проєкті. - create_account: 'Щоб отримати доступ до цього пакета робіт, вам знадобиться - створити й активувати обліковий запис в %{instance}. ' - open_work_package: Відкрити пакет робіт - subject: 'Вам надано доступ до пакета робіт #%{id}' - enterprise_text: Діліться пакетами робіт із користувачами, які не належать - до учасників проєкту. + allowed_actions: "Ви можете %{allowed_actions} у цьому пакеті робіт, але це залежить від вашої ролі й дозволів у проєкті." + create_account: "Щоб отримати доступ до цього пакета робіт, вам знадобиться створити й активувати обліковий запис в %{instance}. " + open_work_package: "Відкрити пакет робіт" + subject: "Вам надано доступ до пакета робіт #%{id}" + enterprise_text: "Діліться пакетами робіт із користувачами, які не належать до учасників проєкту." summary: - user: "%{user} надав(-ла) вам доступ до пакета робіт із такими правами: - %{role_rights}" - group: "%{user} надав(-ла) доступ до пакета робіт групі %{group}, до якої - ви належите" + user: "%{user} надав(-ла) вам доступ до пакета робіт із такими правами: %{role_rights}" + group: "%{user} надав(-ла) доступ до пакета робіт групі %{group}, до якої ви належите" storages: health: plaintext: - storage: Сховище + storage: "Сховище" healthy: - summary: Чудові новини! Зараз статус вашого сховища «%{storage_name}» - – «Справне». - error-solved-on: Вирішено - recommendation: Ми продовжуватимемо відстежувати систему, щоб переконатися, - що вона залишається справною. Ми сповістимо вас, якщо виявимо будь-які - невідповідності. - details: Щоб дізнатися більше або внести необхідні зміни, перейдіть на - сторінку конфігурації свого сховища + summary: 'Чудові новини! Зараз статус вашого сховища «%{storage_name}» – «Справне».' + error-solved-on: "Вирішено" + recommendation: "Ми продовжуватимемо відстежувати систему, щоб переконатися, що вона залишається справною. Ми сповістимо вас, якщо виявимо будь-які невідповідності." + details: "Щоб дізнатися більше або внести необхідні зміни, перейдіть на сторінку конфігурації свого сховища" unhealthy: - summary: Зараз статус вашого сховища, %{storage_name}, – «Помилка». Ми - виявили проблему, яка може потребувати вашої уваги. - error-details: Деталі помилки - error-message: Повідомлення про помилку - error-occurred-on: Сталася в - recommendation: Щоб вирішити цю проблему, рекомендуємо перейти на сторінку - конфігурації сховища - unsubscribe: Щоб більше не отримувати ці сповіщення, можете відписатися. - Для цього виконайте вказівки на цій сторінці - email_notification_settings: Налаштування сповіщень електронною поштою для - сховища - see_storage_settings: Переглянути налаштування сховища + summary: 'Зараз статус вашого сховища, %{storage_name}, – «Помилка». Ми виявили проблему, яка може потребувати вашої уваги.' + error-details: "Деталі помилки" + error-message: "Повідомлення про помилку" + error-occurred-on: "Сталася в" + recommendation: "Щоб вирішити цю проблему, рекомендуємо перейти на сторінку конфігурації сховища" + unsubscribe: "Щоб більше не отримувати ці сповіщення, можете відписатися. Для цього виконайте вказівки на цій сторінці" + email_notification_settings: "Налаштування сповіщень електронною поштою для сховища" + see_storage_settings: "Переглянути налаштування сховища" healthy: - subject: Сховище «%{name}» зараз справне! - solved_at: вирішено о - summary: Проблему з інтеграцією вашого сховища «%{storage_name}» вирішено + subject: 'Сховище «%{name}» зараз справне!' + solved_at: "вирішено о" + summary: "Проблему з інтеграцією вашого сховища «%{storage_name}» вирішено" unhealthy: - subject: Сховище «%{name}» несправне! - since: з - summary: Існує проблема з інтеграцією вашого сховища «%{storage_name}» + subject: 'Сховище «%{name}» несправне!' + since: "з" + summary: "Існує проблема з інтеграцією вашого сховища «%{storage_name}»" troubleshooting: - text: Щоб дізнатися більше, перевірте файлові сховища - link_text: документація з вирішення проблем - mail_body_account_activation_request: 'Новий користувач (%{value}) зареєструвався. - Його обліковий запис чекає на ваше підтвердження:' - mail_body_account_information: Інформація по Вашому обліковому запису - mail_body_account_information_external: Ви можете використовувати ваш %{value} обліковий - запис для входу. - mail_body_backup_ready: 'Запитана вами резервна копія готова. Її можна завантажити - тут:' - mail_body_backup_token_reset_admin_info: Маркер резервного копіювання для користувача - «%{user}» скинуто. + text: "Щоб дізнатися більше, перевірте файлові сховища" + link_text: "документація з вирішення проблем" + mail_body_account_activation_request: "Новий користувач (%{value}) зареєструвався. Його обліковий запис чекає на ваше підтвердження:" + mail_body_account_information: "Інформація по Вашому обліковому запису" + mail_body_account_information_external: "Ви можете використовувати ваш %{value} обліковий запис для входу." + mail_body_backup_ready: "Запитана вами резервна копія готова. Її можна завантажити тут:" + mail_body_backup_token_reset_admin_info: Маркер резервного копіювання для користувача «%{user}» скинуто. mail_body_backup_token_reset_user_info: Ваш маркер резервного копіювання скинуто. mail_body_backup_token_info: Попередній маркер більше не дійсний. mail_body_backup_waiting_period: Новий маркер почне діяти через %{hours} год. - mail_body_backup_token_warning: Якщо це були не ви, негайно ввійдіть в OpenProject - і знову скиньте його. - mail_body_incoming_email_error: Не вдалось обробити електронний лист, надісланий - на адресу OpenProject. - mail_body_incoming_email_error_in_reply_to: О %{received_at} %{from_email} написав(-ла) - mail_body_incoming_email_error_logs: Журнали - mail_body_lost_password: 'Щоб змінити пароль, натисніть на посилання:' + mail_body_backup_token_warning: Якщо це були не ви, негайно ввійдіть в OpenProject і знову скиньте його. + mail_body_incoming_email_error: Не вдалось обробити електронний лист, надісланий на адресу OpenProject. + mail_body_incoming_email_error_in_reply_to: "О %{received_at} %{from_email} написав(-ла)" + mail_body_incoming_email_error_logs: "Журнали" + mail_body_lost_password: "Щоб змінити пароль, натисніть на посилання:" mail_password_change_not_possible: - title: Неможливо змінити пароль - body: Ваш обліковий запис %{app_title} зв’язано із зовнішнім постачальником послуг - автентифікації (%{name}). - subtext: Паролі для зовнішніх облікових записів не можна змінювати в додатку. - Скористайтеся функцією відновлення пароля в додатку свого постачальника послуг - автентифікації. - mail_body_register: 'Вітаємо в %{app_title}. Активуйте свій обліковий запис, перейшовши - за цим посиланням:' - mail_body_register_header_title: Електронний лист із запрошенням стати учасником - проєкту - mail_body_register_user: Добрий день, %{name}! + title: "Неможливо змінити пароль" + body: "Ваш обліковий запис %{app_title} зв’язано із зовнішнім постачальником послуг автентифікації (%{name})." + subtext: "Паролі для зовнішніх облікових записів не можна змінювати в додатку. Скористайтеся функцією відновлення пароля в додатку свого постачальника послуг автентифікації." + mail_body_register: "Вітаємо в %{app_title}. Активуйте свій обліковий запис, перейшовши за цим посиланням:" + mail_body_register_header_title: "Електронний лист із запрошенням стати учасником проєкту" + mail_body_register_user: "Добрий день, %{name}!" mail_body_register_links_html: | Ознайомтеся з нашим каналом на YouTube (%{youtube_link}), де ми проводимо вебінар (%{webinar_link}) і відео «Як почати роботу» (%{get_started_link}), щоб якомога більше спростити свої перші кроки в OpenProject.
Якщо виникнуть запитання, перегляньте нашу документацію (%{documentation_link}) або зверніться до адміністратора. - mail_body_register_closing: Ваша команда OpenProject - mail_body_register_ending: Будьте на зв’язку! З повагою, - mail_body_reminder: "%{count} призначених на Вас робочих пакетів на наступні %{days} - днів:" - mail_body_group_reminder: 'Пакети робіт (%{count}), призначені групі «%{group}», - потрібно завершити протягом наступних %{days} дн.:' + mail_body_register_closing: "Ваша команда OpenProject" + mail_body_register_ending: "Будьте на зв’язку! З повагою," + mail_body_reminder: "%{count} призначених на Вас робочих пакетів на наступні %{days} днів:" + mail_body_group_reminder: 'Пакети робіт (%{count}), призначені групі «%{group}», потрібно завершити протягом наступних %{days} дн.:' mail_body_wiki_page_added: "%{author} додав(ла) wiki-сторінку %{id}." mail_body_wiki_page_updated: "%{author} оновив(ла) wiki-сторінку %{id}." - mail_subject_account_activation_request: Запит на активацію облікового запису %{value} - mail_subject_backup_ready: Ваша резервна копія готова - mail_subject_backup_token_reset: Скидання маркера резервного копіювання - mail_subject_incoming_email_error: Не вдалось обробити електронний лист, надісланий - на адресу OpenProject - mail_subject_lost_password: Ваш %{value} пароль - mail_subject_register: Активація облікового запису %{value} - mail_subject_wiki_content_added: Wiki-сторінка '%{id}' була додана - mail_subject_wiki_content_updated: Wiki-сторінка '%{id}' була оновлена + mail_subject_account_activation_request: "Запит на активацію облікового запису %{value}" + mail_subject_backup_ready: "Ваша резервна копія готова" + mail_subject_backup_token_reset: "Скидання маркера резервного копіювання" + mail_subject_incoming_email_error: "Не вдалось обробити електронний лист, надісланий на адресу OpenProject" + mail_subject_lost_password: "Ваш %{value} пароль" + mail_subject_register: "Активація облікового запису %{value}" + mail_subject_wiki_content_added: "Wiki-сторінка '%{id}' була додана" + mail_subject_wiki_content_updated: "Wiki-сторінка '%{id}' була оновлена" mail_member_added_project: subject: "%{project} — вас додано як учасника" body: added_by: - without_message: Користувач %{user} додав вас як учасника проєкту «%{project}». - with_message: 'Користувач %{user} додав вас як учасника проєкту «%{project}»:' - roles: 'У вас є такі ролі:' + without_message: "Користувач %{user} додав вас як учасника проєкту «%{project}»." + with_message: "Користувач %{user} додав вас як учасника проєкту «%{project}»:" + roles: "У вас є такі ролі:" mail_member_updated_project: subject: "%{project} – ваші ролі оновлено" body: updated_by: - without_message: Користувач %{user} оновив ваші ролі в проєкті «%{project}». - with_message: 'Користувач %{user} оновив ваші ролі в проєкті «%{project}»:' - roles: 'Зараз у вас є такі ролі:' + without_message: "Користувач %{user} оновив ваші ролі в проєкті «%{project}»." + with_message: "Користувач %{user} оновив ваші ролі в проєкті «%{project}»:" + roles: "Зараз у вас є такі ролі:" mail_member_updated_global: - subject: Ваші глобальні дозволи оновлено + subject: "Ваші глобальні дозволи оновлено" body: updated_by: - without_message: 'Користувач %{user} оновив ваші глобальні ролі. ' - with_message: 'Користувач %{user} оновив ваші глобальні ролі:' - roles: 'Зараз у вас є такі ролі:' + without_message: "Користувач %{user} оновив ваші глобальні ролі. " + with_message: "Користувач %{user} оновив ваші глобальні ролі:" + roles: "Зараз у вас є такі ролі:" mail_user_activation_limit_reached: subject: Досягнуто ліміту активації користувача message: | Новий користувач (%{email}) намагалися створити обліковий запис на середовищі OpenProject, яким ви керуєте (%{host}). Користувач не може активувати свій обліковий запис після досягнення ліміту користувача. steps: - label: 'To allow the user to sign in you can either: ' - a: Оновіть план платежів ([here](upgrade_url)) - b: Блокування або видалення існуючого користувача ([here](users_url)) - more_actions: Додаткові функції - noscript_description: Щоб використовувати OpenProject, потрібно ввімкнути підтримку - JavaScript у Вашому браузері! - noscript_heading: JavaScript відключений - noscript_learn_more: Дізнатися більше - notice_accessibility_mode: Режим доступності можна ввімкнути в [налаштуваннях облікового - запису](url). - notice_account_activated: Ваш обліковий запис активовано. Тепер ви можете увійти - в систему. + label: "To allow the user to sign in you can either: " + a: "Оновіть план платежів ([here](upgrade_url))" #here turned into a link + b: "Блокування або видалення існуючого користувача ([here](users_url))" #here turned into a link + more_actions: "Додаткові функції" + noscript_description: "Щоб використовувати OpenProject, потрібно ввімкнути підтримку JavaScript у Вашому браузері!" + noscript_heading: "JavaScript відключений" + noscript_learn_more: "Дізнатися більше" + notice_accessibility_mode: Режим доступності можна ввімкнути в [налаштуваннях облікового запису](url). + notice_account_activated: "Ваш обліковий запис активовано. Тепер ви можете увійти в систему." notice_account_already_activated: Обліковий запис вже активовано. notice_account_invalid_token: Недійсний маркер активації - notice_account_invalid_credentials: Неправильне ім’я користувача або пароль - notice_account_invalid_credentials_or_blocked: Неправильне ім'я користувача або - пароль або ваш обліковий запис заблокований через багаторазових невдалих спроб - входу. Якщо це так, то вона буде автоматично розблокована протягом короткого часу. - notice_account_lost_email_sent: Електронний лист з інструкціями щодо зміни паролю - було надіслано до вас. - notice_account_new_password_forced: Потрібен новий пароль. - notice_account_password_expired: Термін дії вашого пароля закінчиться через %{days} - днів. Будь ласка змініть пароль на новий. - notice_account_password_updated: Пароль було успішно оновлено. - notice_account_pending: Ваш обліковий запис створено і тепер очікує схвалення адміністратора. - notice_account_register_done: Обліковий запис було успішно створено. Для активації - облікового запису, перейдіть по посиланню яка була відправлена вам на пошту. - notice_account_unknown_email: Невідомий користувач. - notice_account_update_failed: Не вдалося зберегти налаштування облікового запису. - Перегляньте сторінку свого облікового запису ще раз. - notice_account_updated: Обліковий запис було успішно оновлено. - notice_account_other_session_expired: Усі інші сеанси, пов'язані з вашим обліковим - записом, визнані недійсними. - notice_account_wrong_password: Невірний пароль - notice_account_registered_and_logged_in: Ласкаво просимо, ваша обліковий запис активований. - Ви зараз увійшли. + notice_account_invalid_credentials: "Неправильне ім’я користувача або пароль" + notice_account_invalid_credentials_or_blocked: "Неправильне ім'я користувача або пароль або ваш обліковий запис заблокований через багаторазових невдалих спроб входу. Якщо це так, то вона буде автоматично розблокована протягом короткого часу." + notice_account_lost_email_sent: "Електронний лист з інструкціями щодо зміни паролю було надіслано до вас." + notice_account_new_password_forced: "Потрібен новий пароль." + notice_account_password_expired: "Термін дії вашого пароля закінчиться через %{days} днів. Будь ласка змініть пароль на новий." + notice_account_password_updated: "Пароль було успішно оновлено." + notice_account_pending: "Ваш обліковий запис створено і тепер очікує схвалення адміністратора." + notice_account_register_done: "Обліковий запис було успішно створено. Для активації облікового запису, перейдіть по посиланню яка була відправлена вам на пошту." + notice_account_unknown_email: "Невідомий користувач." + notice_account_update_failed: "Не вдалося зберегти налаштування облікового запису. Перегляньте сторінку свого облікового запису ще раз." + notice_account_updated: "Обліковий запис було успішно оновлено." + notice_account_other_session_expired: "Усі інші сеанси, пов'язані з вашим обліковим записом, визнані недійсними." + notice_account_wrong_password: "Невірний пароль" + notice_account_registered_and_logged_in: "Ласкаво просимо, ваша обліковий запис активований. Ви зараз увійшли." notice_activation_failed: Не вдалося активувати обліковий запис. - notice_auth_stage_verification_error: Не вдалося підтвердити етап %{stage}. - notice_auth_stage_wrong_stage: Передбачається завершити етап аутентифікації%{expected}, - але %{actual} returned. - notice_auth_stage_error: Етап автентифікації %{stage} не вдався. - notice_can_t_change_password: Для даного облікового запису використовується джерело - зовнішньої аутентифікації. Неможливо змінити пароль. - notice_custom_options_deleted: Варіант %{option_value} і його %{num_deleted} вилучень - було видалено. - notice_email_error: Під час відправки листа відбулася помилка (%{value}) - notice_email_sent: Відправлено листа %{value} - notice_failed_to_save_work_packages: 'Не вдалося зберегти %{count} робочих пакетів - на %{total} вибрано: %{ids}.' - notice_failed_to_save_members: 'Не вдалось зберегти учасника(ів): %{errors}.' - notice_deletion_scheduled: Видалення заплановано та виконується асинхронно. - notice_file_not_found: Сторінка, на яку ви намагаєтеся зайти, не існує або видалена. - notice_forced_logout: Ви автоматично вийшли з системи після %{ttl_time} хвилин бездіяльності. - notice_internal_server_error: Сталася помилка на сторінці, до якої ви намагалися - отримати доступ. Якщо ви продовжуєте відчувати проблеми, зверніться до свого адміністратора - %{app_title} за допомогою. - notice_locking_conflict: Інформація була оновлена принаймні один інший користувач - в той же час. - notice_locking_conflict_additional_information: Оновлення надійшли від %{users}. - notice_locking_conflict_reload_page: Будь ласка поновіть сторінку, перевірте зміни - та застосувати оновлення. - notice_locking_conflict_warning: Хтось оновив цю сторінку. Щоб не втратити свої - зміни, скопіюйте й збережіть їх локально й перезавантажте сторінку, щоб переглянути - оновлену версію. - notice_locking_conflict_danger: Не вдалося зберегти зміни через суперечливі модифікації. - Щоб не втратити зміни, скопіюйте їх локально і перезавантажте сторінку, щоб переглянути - оновлену версію. - notice_locking_conflict_action_button: Відхилити зміни й перезавантажити + notice_auth_stage_verification_error: "Не вдалося підтвердити етап %{stage}." + notice_auth_stage_wrong_stage: "Передбачається завершити етап аутентифікації%{expected}, але %{actual} returned." + notice_auth_stage_error: "Етап автентифікації %{stage} не вдався." + notice_can_t_change_password: "Для даного облікового запису використовується джерело зовнішньої аутентифікації. Неможливо змінити пароль." + notice_custom_options_deleted: "Варіант %{option_value} і його %{num_deleted} вилучень було видалено." + notice_email_error: "Під час відправки листа відбулася помилка (%{value})" + notice_email_sent: "Відправлено листа %{value}" + notice_failed_to_save_work_packages: "Не вдалося зберегти %{count} робочих пакетів на %{total} вибрано: %{ids}." + notice_failed_to_save_members: "Не вдалось зберегти учасника(ів): %{errors}." + notice_deletion_scheduled: "Видалення заплановано та виконується асинхронно." + notice_file_not_found: "Сторінка, на яку ви намагаєтеся зайти, не існує або видалена." + notice_forced_logout: "Ви автоматично вийшли з системи після %{ttl_time} хвилин бездіяльності." + notice_internal_server_error: "Сталася помилка на сторінці, до якої ви намагалися отримати доступ. Якщо ви продовжуєте відчувати проблеми, зверніться до свого адміністратора %{app_title} за допомогою." + notice_locking_conflict: "Інформація була оновлена принаймні один інший користувач в той же час." + notice_locking_conflict_additional_information: "Оновлення надійшли від %{users}." + notice_locking_conflict_reload_page: "Будь ласка поновіть сторінку, перевірте зміни та застосувати оновлення." + notice_locking_conflict_warning: "Хтось оновив цю сторінку. Щоб не втратити свої зміни, скопіюйте й збережіть їх локально й перезавантажте сторінку, щоб переглянути оновлену версію." + notice_locking_conflict_danger: "Не вдалося зберегти зміни через суперечливі модифікації. Щоб не втратити зміни, скопіюйте їх локально і перезавантажте сторінку, щоб переглянути оновлену версію." + notice_locking_conflict_action_button: "Відхилити зміни й перезавантажити" notice_member_added: Додано %{name} проекту. notice_members_added: Додано %{number} користувач(-а,-ів) до проекту. - notice_member_removed: Користувач %{user} видалений з проекту. + notice_member_removed: "Користувач %{user} видалений з проекту." notice_member_deleted: "%{user} був виключений з проекту і був знищений." - notice_no_principals_found: Результатів не знайдено. - notice_bad_request: Неправильний Запит. - notice_not_authorized: Ви не авторизовані для доступу до цієї сторінки. - notice_not_authorized_archived_project: Проект ви намагаєтеся отримати доступ до - архіву. - notice_requires_enterprise_token: Токен Enterprise відсутній або не надає доступу - до цієї сторінки. - notice_password_confirmation_failed: Введений пароль неправильний. - notice_principals_found_multiple: "There are %{number} знайдені результати. \nВкладка - для фокусування першого результату." - notice_principals_found_single: Знайдений один результат. Натисніть для переходу - до нього. - notice_parent_item_not_found: Батьківський об’єкт не знайдено. - notice_project_not_deleted: Проект не був видалений. - notice_project_not_found: Проєкт не знайдено. - notice_successful_connection: Підключення успішно встановлене. - notice_successful_create: Створення успішно завершене. - notice_successful_delete: Видалення успішно завершене. - notice_successful_cancel: Успішно видалено. - notice_successful_update: Успішно оновлено. - notice_successful_move: Успішне перенесення з %{from} у %{to}. - notice_unsuccessful_create: Не вдалося створити. - notice_unsuccessful_create_with_reason: 'Не вдалося створити: %{reason}' - notice_unsuccessful_update: Не вдалось оновити. - notice_unsuccessful_update_with_reason: 'Помилка оновлення: %{reason}' - notice_successful_update_custom_fields_added_to_project: 'Оновлення завершено. Користувацькі - поля активованих типів автоматично активовано у формі пакета робіт. Докладніше. - - ' - notice_to_many_principals_to_display: |- - Є занадто багато результатів. - Звузити пошук ввівши назву нового елемента (або групи). - notice_user_missing_authentication_method: Користувач ще не вибрав пароль або інший - спосіб входу. + notice_no_principals_found: "Результатів не знайдено." + notice_bad_request: "Неправильний Запит." + notice_not_authorized: "Ви не авторизовані для доступу до цієї сторінки." + notice_not_authorized_archived_project: "Проект ви намагаєтеся отримати доступ до архіву." + notice_requires_enterprise_token: "Токен Enterprise відсутній або не надає доступу до цієї сторінки." + notice_password_confirmation_failed: "Введений пароль неправильний." + notice_principals_found_multiple: "There are %{number} знайдені результати. \nВкладка для фокусування першого результату." + notice_principals_found_single: "Знайдений один результат. Натисніть для переходу до нього." + notice_parent_item_not_found: "Батьківський об’єкт не знайдено." + notice_project_not_deleted: "Проект не був видалений." + notice_project_not_found: "Проєкт не знайдено." + notice_smtp_address_unsafe: "SMTP address %{address} is not safe. Please add it to OPENPROJECT_SSRF_PROTECTION_ALLOWLIST." + notice_successful_connection: "Підключення успішно встановлене." + notice_successful_create: "Створення успішно завершене." + notice_successful_delete: "Видалення успішно завершене." + notice_successful_cancel: "Успішно видалено." + notice_successful_update: "Успішно оновлено." + notice_successful_move: "Успішне перенесення з %{from} у %{to}." + notice_unsuccessful_create: "Не вдалося створити." + notice_unsuccessful_create_with_reason: "Не вдалося створити: %{reason}" + notice_unsuccessful_update: "Не вдалось оновити." + notice_unsuccessful_update_with_reason: "Помилка оновлення: %{reason}" + notice_successful_update_custom_fields_added_to_project: | + Оновлення завершено. Користувацькі поля активованих типів автоматично активовано у формі пакета робіт. Докладніше. + notice_to_many_principals_to_display: "Є занадто багато результатів.\nЗвузити пошук ввівши назву нового елемента (або групи)." + notice_user_missing_authentication_method: Користувач ще не вибрав пароль або інший спосіб входу. notice_user_invitation_resent: Надіслано запрошення %{email}. - present_access_key_value: 'Ваш ключ %{key_name}: %{value}' - notice_automatic_set_of_standard_type: Встановіть стандартний тип автоматично. - notice_logged_out: Ви вийшли з системи. + present_access_key_value: "Ваш ключ %{key_name}: %{value}" + notice_automatic_set_of_standard_type: "Встановіть стандартний тип автоматично." + notice_logged_out: "Ви вийшли з системи." notice_wont_delete_auth_source: LDAP-підключення не можна видалити, поки воно використовується. - notice_project_cannot_update_custom_fields: 'Неможливо оновити доступні користувальницькі - поля проекту. Проект недійсний: %{errors}' - notice_attachment_migration_wiki_page: 'Ця сторінка була створена автоматично під - час оновлення OpenProject. Він містить усі вкладення, раніше пов''язані з %{container_type} - %{container_name}. - - ' + notice_project_cannot_update_custom_fields: "Неможливо оновити доступні користувальницькі поля проекту. Проект недійсний: %{errors}" + notice_attachment_migration_wiki_page: > + Ця сторінка була створена автоматично під час оновлення OpenProject. Він містить усі вкладення, раніше пов'язані з %{container_type} %{container_name}. + #Default format for numbers number: format: delimiter: "," @@ -5030,251 +4352,223 @@ uk: separator: "." human: format: - delimiter: '' + delimiter: "" precision: 1 storage_units: format: "%n %u" units: byte: - one: Байт - few: Байти - many: Байти - other: Байти - gb: ГБ - kb: кБ - mb: МБ - tb: ТБ + one: "Байт" + few: "Байти" + many: "Байти" + other: "Байти" + gb: "ГБ" + kb: "кБ" + mb: "МБ" + tb: "ТБ" onboarding: - heading_getting_started: Отримати огляд - text_getting_started_description: Отримайте стислий огляд управління проєктами - та командної роботи в OpenProject. Це відео можна переглянути знову в меню довідки. - welcome: Вітаємо в додатку %{app_title} - select_language: Будь ласка, виберіть мову - permission_add_work_package_comments: Додавання коментарів - permission_add_work_packages: Додати робочі пакети - permission_add_messages: Відправка повідомлень - permission_add_project: Створення проєктів - permission_add_portfolios: Створити портфелі - permission_add_programs: Створити програми - permission_add_work_package_attachments: Додати вкладення - permission_add_work_package_attachments_explanation: Дає змогу додавати вкладення - без дозволу «Редагування пакетів робіт» - permission_add_internal_comments: Створення внутрішніх коментарів - permission_archive_project: Архівувати проєкт - permission_create_user: Створення користувачів - permission_manage_user: Редагування користувачів - permission_manage_placeholder_user: Створення, редагування та видалення прототипів - користувачів - permission_add_subprojects: Створення підпроектів - permission_add_work_package_watchers: Додати спостерігачів - permission_assign_versions: Призначити версії - permission_browse_repository: Доступ лише на читання з репозиторію (перегляд і перевірка) - permission_change_wiki_parent_page: Змінити батьківську wiki сторінку - permission_change_work_package_status: Змінити статус пакета робіт - permission_change_work_package_status_explanation: Дає змогу змінювати статус без - дозволу «Редагування пакетів робіт» - permission_comment_news: Коментування новин - permission_commit_access: Доступ для читання/запису до сховища (фіксація) - permission_copy_projects: Копіювати проекти - permission_copy_projects_explanation: У шаблонних проєктах цей дозвіл має другорядну - функцію; він дає змогу створювати нові проєкти на основі шаблону. - permission_copy_work_packages: Дублювати пакети робіт - permission_create_backup: Створення резервних копій - permission_delete_work_package_watchers: Видалення спостерігачів - permission_delete_work_packages: Видалити робочі пакети - permission_delete_messages: Видалити повідомлення - permission_delete_own_messages: Видалення власних повідомлень - permission_delete_reportings: Видалити звіти - permission_delete_timelines: Видалити графіки - permission_delete_wiki_pages: Видалення wiki-сторінок - permission_delete_wiki_pages_attachments: Видалення прикріплених файлів - permission_edit_work_package_comments: Модерування коментарів - permission_edit_work_package_comments_explanation: Увага! Користувачі із цим дозволом - можуть редагувати будь-чиї коментарі. - permission_edit_work_packages: Редагувати робочі пакети - permission_edit_messages: Редагування повідомлень - permission_edit_own_internal_comments: Редагування власних внутрішніх коментарів - permission_edit_own_work_package_comments: Редагування власних коментарів - permission_edit_own_messages: Редагування власних повідомлень - permission_edit_own_time_entries: Редагування власного обліку часу - permission_edit_others_internal_comments: Модерування внутрішніх коментарів - permission_edit_others_internal_comments_explanation: Увага! Користувачі із цим - дозволом можуть редагувати будь-чиї внутрішні коментарі. - permission_edit_project: Редагувати проект + heading_getting_started: "Отримати огляд" + text_getting_started_description: "Отримайте стислий огляд управління проєктами та командної роботи в OpenProject. Це відео можна переглянути знову в меню довідки." + welcome: "Вітаємо в додатку %{app_title}" + select_language: "Будь ласка, виберіть мову" + permission_add_work_package_comments: "Додавання коментарів" + permission_add_work_packages: "Додати робочі пакети" + permission_add_messages: "Відправка повідомлень" + permission_add_project: "Створення проєктів" + permission_add_portfolios: "Створити портфелі" + permission_add_programs: "Створити програми" + permission_add_work_package_attachments: "Додати вкладення" + permission_add_work_package_attachments_explanation: "Дає змогу додавати вкладення без дозволу «Редагування пакетів робіт»" + permission_add_internal_comments: "Створення внутрішніх коментарів" + permission_archive_project: "Архівувати проєкт" + permission_create_user: "Створення користувачів" + permission_manage_user: "Редагування користувачів" + permission_manage_placeholder_user: "Створення, редагування та видалення прототипів користувачів" + permission_add_subprojects: "Створення підпроектів" + permission_add_work_package_watchers: "Додати спостерігачів" + permission_assign_versions: "Призначити версії" + permission_browse_repository: "Доступ лише на читання з репозиторію (перегляд і перевірка)" + permission_change_wiki_parent_page: "Змінити батьківську wiki сторінку" + permission_change_work_package_status: "Змінити статус пакета робіт" + permission_change_work_package_status_explanation: "Дає змогу змінювати статус без дозволу «Редагування пакетів робіт»" + permission_comment_news: "Коментування новин" + permission_commit_access: "Доступ для читання/запису до сховища (фіксація)" + permission_copy_projects: "Копіювати проекти" + permission_copy_projects_explanation: "У шаблонних проєктах цей дозвіл має другорядну функцію; він дає змогу створювати нові проєкти на основі шаблону." + permission_copy_work_packages: "Дублювати пакети робіт" + permission_create_backup: "Створення резервних копій" + permission_delete_work_package_watchers: "Видалення спостерігачів" + permission_delete_work_packages: "Видалити робочі пакети" + permission_delete_messages: "Видалити повідомлення" + permission_delete_own_messages: "Видалення власних повідомлень" + permission_delete_reportings: "Видалити звіти" + permission_delete_timelines: "Видалити графіки" + permission_delete_wiki_pages: "Видалення wiki-сторінок" + permission_delete_wiki_pages_attachments: "Видалення прикріплених файлів" + permission_edit_work_package_comments: "Модерування коментарів" + permission_edit_work_package_comments_explanation: "Увага! Користувачі із цим дозволом можуть редагувати будь-чиї коментарі." + permission_edit_work_packages: "Редагувати робочі пакети" + permission_edit_messages: "Редагування повідомлень" + permission_edit_own_internal_comments: "Редагування власних внутрішніх коментарів" + permission_edit_own_work_package_comments: "Редагування власних коментарів" + permission_edit_own_messages: "Редагування власних повідомлень" + permission_edit_own_time_entries: "Редагування власного обліку часу" + permission_edit_others_internal_comments: "Модерування внутрішніх коментарів" + permission_edit_others_internal_comments_explanation: "Увага! Користувачі із цим дозволом можуть редагувати будь-чиї внутрішні коментарі." + permission_edit_project: "Редагувати проект" permission_edit_project_attributes: " Редагувати атрибути проєкту" - permission_edit_project_phases: Редагування етапів проєкту - permission_edit_reportings: Редагування звітів - permission_edit_time_entries: Редагувати журнали часу для інших користувачів - permission_edit_timelines: Змінити часові рамки - permission_edit_wiki_pages: Редагування wiki-сторінок - permission_export_work_packages: Експорт робочих пакетів - permission_export_projects: Експорт проєктів - permission_export_wiki_pages: Експорт wiki-сторінок - permission_invite_members_by_email: Запрошення учасників електронною поштою - permission_invite_members_by_email_explanation: 'Дозвольте запрошувати нових користувачів - електронною поштою. Запрошені користувачі отримають лист із посиланням для встановлення - пароля й активації облікового запису. На це налаштування впливає дозвіл на керування - користувачами. - - ' - permission_list_attachments: Список вкладень - permission_log_own_time: Реєструвати власний час - permission_log_time: Реєструвати час для інших користувачів - permission_manage_forums: Управління форумами - permission_manage_categories: Управління категоріями пакет робота - permission_manage_dashboards: Керування інформаційними панелями - permission_manage_work_package_relations: Управління зв'язками робочого пакету - permission_manage_members: Управління учасниками - permission_manage_news: Управління новинами - permission_manage_project_activities: Управління проектною діяльністю - permission_manage_public_queries: Керуйте переглядами громадськості - permission_manage_repository: Управління сховищем - permission_manage_subtasks: Керування ієрархіями пакетів робіт - permission_manage_versions: Управління версіями - permission_manage_wiki: Управління wiki - permission_manage_wiki_menu: Керування wiki-меню - permission_move_work_packages: Переміщення робочих пакетів - permission_protect_wiki_pages: Захист wiki-сторінок - permission_rename_wiki_pages: Перейменування wiki-сторінок - permission_save_queries: Зберегти перегляди - permission_search_project: Пошук проєктів - permission_select_custom_fields: Вибирати власні поля - permission_select_project_custom_fields: Виберіть атрибути проєкту - permission_select_project_phases: Вибір етапів проєкту - permission_select_project_phases_explanation: Активація / деактивація етапів у проєкті. - Дає змогу користувачу вибрати відповідний життєвий цикл для проєкту, оскільки - неактивні етапи не відображатимуться на сторінці огляду проєкту й у списку проєктів. - permission_select_project_modules: Вибір модулів проекту - permission_share_work_packages: Надати доступ до пакетів робіт - permission_manage_types: Виберіть типи - permission_manage_own_reminders: Створюйте власні нагадування - permission_view_all_principals: Перегляд усіх користувачів і груп - permission_view_all_principals_explanation: 'Дозволяє бачити всіх користувачів і - групи, які є в системі, навіть якщо вони не учасники проєктів або груп, до яких - приєднався користувач. - - ' - permission_view_project: Перегляд проєктів - permission_view_changesets: Перегляд змін репозиторію (сховища) в OpenProject - permission_view_internal_comments: Перегляд внутрішніх коментарів - permission_view_commit_author_statistics: Перегляд статистики комітів автора - permission_view_dashboards: Перегляд панелей керування - permission_view_work_package_watchers: Перегляд списку спостерігачів - permission_view_work_packages: Переглянути робочі пакети - permission_view_messages: Перегляд повідомлень - permission_view_news: Перегляд новин - permission_view_members: Перегляд учасників - permission_view_reportings: Перегляд звітів - permission_view_shared_work_packages: Переглянути дозволи на доступ до пакета робіт - permission_view_time_entries: Перегляд трудовитрат - permission_view_timelines: Переглянути часові рамки - permission_view_user_email: Переглянути поштові адреси користувачів - permission_view_wiki_edits: Перегляд історії wiki - permission_view_wiki_pages: Перегляд wiki - permission_work_package_assigned: Стати виконавцем / відповідальним - permission_work_package_assigned_explanation: Робочі пакети можуть бути призначені - користувачам і групам, які володіють цією роллю у відповідному проекті - permission_view_project_activity: Перегляд дій у проєкті - permission_view_project_attributes: Переглянути атрибути проєкту - permission_view_project_phases: Перегляд етапів проєкту - permission_save_bcf_queries: Зберігання запитів BCF - permission_manage_public_bcf_queries: Керування загальнодоступними запитами BCF - permission_edit_attribute_help_texts: Редагування текстів довідки для атрибутів - permission_manage_public_project_queries: Керування списками загальнодоступних проєктів - permission_view_project_query: Перегляд запиту проєктів - permission_edit_project_query: Редагування запиту проєктів + permission_edit_project_phases: "Редагування етапів проєкту" + permission_edit_reportings: "Редагування звітів" + permission_edit_time_entries: "Редагувати журнали часу для інших користувачів" + permission_edit_timelines: "Змінити часові рамки" + permission_edit_wiki_pages: "Редагування wiki-сторінок" + permission_export_work_packages: "Експорт робочих пакетів" + permission_export_projects: "Експорт проєктів" + permission_export_wiki_pages: "Експорт wiki-сторінок" + permission_invite_members_by_email: "Запрошення учасників електронною поштою" + permission_invite_members_by_email_explanation: > + Дозвольте запрошувати нових користувачів електронною поштою. Запрошені користувачі отримають лист із посиланням для встановлення пароля й активації облікового запису. На це налаштування впливає дозвіл на керування користувачами. + permission_list_attachments: "Список вкладень" + permission_log_own_time: "Реєструвати власний час" + permission_log_time: "Реєструвати час для інших користувачів" + permission_manage_forums: "Управління форумами" + permission_manage_categories: "Управління категоріями пакет робота" + permission_manage_dashboards: "Керування інформаційними панелями" + permission_manage_work_package_relations: "Управління зв'язками робочого пакету" + permission_manage_members: "Управління учасниками" + permission_manage_news: "Управління новинами" + permission_manage_project_activities: "Управління проектною діяльністю" + permission_manage_public_queries: "Керуйте переглядами громадськості" + permission_manage_repository: "Управління сховищем" + permission_manage_subtasks: "Керування ієрархіями пакетів робіт" + permission_manage_versions: "Управління версіями" + permission_manage_wiki: "Управління wiki" + permission_manage_wiki_menu: "Керування wiki-меню" + permission_move_work_packages: "Переміщення робочих пакетів" + permission_protect_wiki_pages: "Захист wiki-сторінок" + permission_rename_wiki_pages: "Перейменування wiki-сторінок" + permission_save_queries: "Зберегти перегляди" + permission_search_project: "Пошук проєктів" + permission_select_custom_fields: "Вибирати власні поля" + permission_select_project_custom_fields: "Виберіть атрибути проєкту" + permission_select_project_phases: "Вибір етапів проєкту" + permission_select_project_phases_explanation: "Активація / деактивація етапів у проєкті. Дає змогу користувачу вибрати відповідний життєвий цикл для проєкту, оскільки неактивні етапи не відображатимуться на сторінці огляду проєкту й у списку проєктів." + permission_select_project_modules: "Вибір модулів проекту" + permission_share_work_packages: "Надати доступ до пакетів робіт" + permission_manage_types: "Виберіть типи" + permission_manage_own_reminders: "Створюйте власні нагадування" + permission_view_all_principals: "Перегляд усіх користувачів і груп" + permission_view_all_principals_explanation: > + Дозволяє бачити всіх користувачів і групи, які є в системі, навіть якщо вони не учасники проєктів або груп, до яких приєднався користувач. + permission_view_project: "Перегляд проєктів" + permission_view_changesets: "Перегляд змін репозиторію (сховища) в OpenProject" + permission_view_internal_comments: "Перегляд внутрішніх коментарів" + permission_view_commit_author_statistics: "Перегляд статистики комітів автора" + permission_view_dashboards: "Перегляд панелей керування" + permission_view_work_package_watchers: "Перегляд списку спостерігачів" + permission_view_work_packages: "Переглянути робочі пакети" + permission_view_messages: "Перегляд повідомлень" + permission_view_news: "Перегляд новин" + permission_view_members: "Перегляд учасників" + permission_view_reportings: "Перегляд звітів" + permission_view_shared_work_packages: "Переглянути дозволи на доступ до пакета робіт" + permission_view_time_entries: "Перегляд трудовитрат" + permission_view_timelines: "Переглянути часові рамки" + permission_view_user_email: "Переглянути поштові адреси користувачів" + permission_view_wiki_edits: "Перегляд історії wiki" + permission_view_wiki_pages: "Перегляд wiki" + permission_work_package_assigned: "Стати виконавцем / відповідальним" + permission_work_package_assigned_explanation: "Робочі пакети можуть бути призначені користувачам і групам, які володіють цією роллю у відповідному проекті" + permission_view_project_activity: "Перегляд дій у проєкті" + permission_view_project_attributes: "Переглянути атрибути проєкту" + permission_view_project_phases: "Перегляд етапів проєкту" + permission_save_bcf_queries: "Зберігання запитів BCF" + permission_manage_public_bcf_queries: "Керування загальнодоступними запитами BCF" + permission_edit_attribute_help_texts: "Редагування текстів довідки для атрибутів" + permission_manage_public_project_queries: "Керування списками загальнодоступних проєктів" + permission_view_project_query: "Перегляд запиту проєктів" + permission_edit_project_query: "Редагування запиту проєктів" placeholders: default: "-" templated_hint: Автоматично згенеровано з використанням типу «%{type}» portfolio: count: - zero: 0 портфелів - one: 1 портфель + zero: "0 портфелів" + one: "1 портфель" other: "%{count} портфелі(-ів)" program: count: - zero: 0 програм - one: 1 програма + zero: "0 програм" + one: "1 програма" other: "%{count} програм(-и)" project: archive: - title: Архівування проєкту - are_you_sure: Дійсно архівувати проект %{name} ? - archived: Архівований + title: "Архівування проєкту" + are_you_sure: "Дійсно архівувати проект %{name} ?" + archived: "Архівований" count: - zero: 0 проєктів - one: 1 проєкт - other: 'Проєктів: %{count}' + zero: "0 проєктів" + one: "1 проєкт" + other: "Проєктів: %{count}" destroy: - title: Видалити проєкт - heading: Видалити цей проєкт остаточно? + title: "Видалити проєкт" + heading: "Видалити цей проєкт остаточно?" confirmation_message_for_subprojects_html: - zero: 'Ви остаточно видалите всі дані, пов’язані з проєктом %{name}. - - ' - one: 'Ви остаточно видалите всі дані, пов’язані з проєктом %{name} - і цим підпроєктом: - - ' - other: 'Ви остаточно видалите всі дані, пов’язані з проєктом %{name} - і цими підпроєктами: - - ' + zero: > + Ви остаточно видалите всі дані, пов’язані з проєктом %{name}. + one: > + Ви остаточно видалите всі дані, пов’язані з проєктом %{name} і цим підпроєктом: + other: > + Ви остаточно видалите всі дані, пов’язані з проєктом %{name} і цими підпроєктами: filters: - project_phase: 'Етап проєкту: %{phase}' - project_phase_any: 'Етап проєкту: будь-який' - project_phase_gate: 'Контрольна точка етапу проєкту: %{gate}' + project_phase: "Етап проєкту: %{phase}" + project_phase_any: "Етап проєкту: будь-який" + project_phase_gate: "Контрольна точка етапу проєкту: %{gate}" identifier: warning_one: Членам проекту доведеться перенести репозиторії проекту. warning_two: Існуючі посилання на проект більше не працюватимуть. title: Змініть ідентифікатор проекту - not_available: Проєкт Н/Д + not_available: "Проєкт Н/Д" template: - copying_title: Застосування шаблону - copying: 'Ваш проєкт створюється на основі вибраного шаблону проєкту. Ми повідомимо - Вас електронною поштою, щойно проєкт стане доступним. - - ' - use_template: Використовувати шаблон - make_template: Установити як шаблон - remove_from_templates: Вилучити із шаблонів - project_module_activity: Активність - project_module_forums: Форуми - project_module_work_package_tracking: Пакети робіт - project_module_news: Новини - project_module_repository: Репозиторій - project_module_wiki: Wiki - permission_header_for_project_module_work_package_tracking: Пакети робіт і діаграми - Ґанта + copying_title: "Застосування шаблону" + copying: > + Ваш проєкт створюється на основі вибраного шаблону проєкту. Ми повідомимо Вас електронною поштою, щойно проєкт стане доступним. + use_template: "Використовувати шаблон" + make_template: "Установити як шаблон" + remove_from_templates: "Вилучити із шаблонів" + project_module_activity: "Активність" + project_module_forums: "Форуми" + project_module_work_package_tracking: "Пакети робіт" + project_module_news: "Новини" + project_module_repository: "Репозиторій" + project_module_wiki: "Wiki" + permission_header_for_project_module_work_package_tracking: "Пакети робіт і діаграми Ґанта" query: attribute_and_direction: "%{attribute}%{direction}" + #possible query parameters (e.g. issue queries), + #which are not attributes of an AR-Model. query_fields: - active_or_archived: Активний або архівований - assigned_to_role: Роль виконавця - assignee_or_group: Правонаступник або приналежність до групи - member_of_group: Група виконавця - name_or_identifier: Ім'я або ідентифікатор - only_subproject_id: Лише підпроєкт - shared_with_user: Надано доступ користувачам - shared_with_me: Доступ надано мені - subproject_id: Включно з підпроєктом + active_or_archived: "Активний або архівований" + assigned_to_role: "Роль виконавця" + assignee_or_group: "Правонаступник або приналежність до групи" + member_of_group: "Група виконавця" + name_or_identifier: "Ім'я або ідентифікатор" + only_subproject_id: "Лише підпроєкт" + shared_with_user: "Надано доступ користувачам" + shared_with_me: "Доступ надано мені" + subproject_id: "Включно з підпроєктом" repositories: - at_identifier: на %{identifier} - atom_revision_feed: Atom-канал - autofetch_information: |- - Позначте цей пункт, якщо ви хочете, щоб репозиторії оновлювалися автоматично під час доступу до сторінки модуля сховища. - Це охоплює видобуток комітів з сховища та оновлення необхідного дискового простору. + at_identifier: "на %{identifier}" + atom_revision_feed: "Atom-канал" + autofetch_information: "Позначте цей пункт, якщо ви хочете, щоб репозиторії оновлювалися автоматично під час доступу до сторінки модуля сховища.\nЦе охоплює видобуток комітів з сховища та оновлення необхідного дискового простору." checkout: access: - readwrite: Читання + Запис - read: Лише для перегляду - none: Немає доступу до перевірки, ви можете переглядати репозиторій за допомогою - цього додатку. - access_permission: Ваші дозволи на цей репозиторій - url: Перевірити URL - base_url_text: |- - Базова URL-адреса, яка використовується для створення URL-адрес перевірки (наприклад, https://myserver.example.org/repos/). - Примітка. Базова URL-адреса використовується лише для перевизначення URL-адрес перевірки в керованих сховищах. Інші репозиторії не змінюються. + readwrite: "Читання + Запис" + read: "Лише для перегляду" + none: "Немає доступу до перевірки, ви можете переглядати репозиторій за допомогою цього додатку." + access_permission: "Ваші дозволи на цей репозиторій" + url: "Перевірити URL" + base_url_text: "Базова URL-адреса, яка використовується для створення URL-адрес перевірки (наприклад, https://myserver.example.org/repos/).\nПримітка. Базова URL-адреса використовується лише для перевизначення URL-адрес перевірки в керованих сховищах. Інші репозиторії не змінюються." default_instructions: git: |- Дані, що містяться в цьому репозиторії, можна завантажити на комп'ютер за допомогою Git. @@ -5282,874 +4576,562 @@ uk: subversion: |- Дані, що містяться в цьому сховищі, можна завантажити на комп'ютер за допомогою Subversion. Будь ласка, зверніться до документації Subversion, якщо вам потрібна додаткова інформація щодо процедури перевірки та доступних клієнтів. - enable_instructions_text: Відображає інструкції перевірки, розміщені нижче на - всіх сторінках, пов'язаних з репозиторієм. - instructions: Перевірити інструкції - show_instructions: Показати перевірені інструкції - text_instructions: Цей текст відображається поруч із URL-адресою перевірки для - вказівки щодо того, як перевірити сховище. - not_available: Перевірити інструкції не призначені для цього сховища. Зверніться - до адміністратора, щоб включити їх для цього сховища в налаштуваннях системи. - create_managed_delay: 'Зверніть увагу: керування сховищем здійснюється асинхронно - на диску і незабаром буде доступним.' - create_successful: Репозитарій зареєстровано. - delete_sucessful: Репозиторій видалено. + enable_instructions_text: "Відображає інструкції перевірки, розміщені нижче на всіх сторінках, пов'язаних з репозиторієм." + instructions: "Перевірити інструкції" + show_instructions: "Показати перевірені інструкції" + text_instructions: "Цей текст відображається поруч із URL-адресою перевірки для вказівки щодо того, як перевірити сховище." + not_available: "Перевірити інструкції не призначені для цього сховища. Зверніться до адміністратора, щоб включити їх для цього сховища в налаштуваннях системи." + create_managed_delay: "Зверніть увагу: керування сховищем здійснюється асинхронно на диску і незабаром буде доступним." + create_successful: "Репозитарій зареєстровано." + delete_sucessful: "Репозиторій видалено." destroy: - confirmation: Якщо ви продовжите, це призведе до видалення керованого репозиторію - назавжди. - info: Видалення сховища є незворотною дією. - info_not_managed: 'Примітка: Зміст цього репозиторію не буде видалено, оскільки - він не керується OpenProject.' - managed_path_note: 'Наступний каталог буде видалено: %{path}' - repository_verification: Введіть ідентифікатор проекту %{identifier}, щоб підтвердити - видалення його репозиторію. - subtitle: Ви дійсно бажаєте видалити %{repository_type} проекту %{project_name}? - subtitle_not_managed: Ви дійсно бажаєте видалити пов'язаний %{repository_type} - %{url} з проекту %{project_name}? - title: Видалити %{repository_type} - title_not_managed: Видалити посилання %{repository_type}? + confirmation: "Якщо ви продовжите, це призведе до видалення керованого репозиторію назавжди." + info: "Видалення сховища є незворотною дією." + info_not_managed: "Примітка: Зміст цього репозиторію не буде видалено, оскільки він не керується OpenProject." + managed_path_note: "Наступний каталог буде видалено: %{path}" + repository_verification: "Введіть ідентифікатор проекту %{identifier}, щоб підтвердити видалення його репозиторію." + subtitle: "Ви дійсно бажаєте видалити %{repository_type} проекту %{project_name}?" + subtitle_not_managed: "Ви дійсно бажаєте видалити пов'язаний %{repository_type} %{url} з проекту %{project_name}?" + title: "Видалити %{repository_type}" + title_not_managed: "Видалити посилання %{repository_type}?" errors: - build_failed: Неможливо створити сховище з вибраною конфігурацією. %{reason} - managed_delete: Неможливо видалити керований репозиторій. - managed_delete_local: Неможливо видалити локальне сховище на файловій системі - %{path} :%{error_message} - empty_repository: Репозиторій існує, але порожній. Він ще не містить жодних - змін. - exists_on_filesystem: Каталог сховища вже існує у файловій системі. - filesystem_access_failed: 'Під час доступу до сховища у файловій системі сталася - помилка: %{message}' - not_manageable: Цей постачальник репозиторію не може управлятися OpenProject. - path_permission_failed: 'Під час створення наступного шляху сталася помилка: - %{path}. Переконайтеся, що OpenProject може писати в цю папку.' - unauthorized: Ви не маєте права на доступ до сховища або недійсними є облікові - дані. - unavailable: Сховище недоступне. - exception_title: 'Не вдається отримати доступ до сховища: %{message}' - disabled_or_unknown_type: The selected type %{type} вимкнено або більше не - доступне для постачальника СКМ %{vendor}. - disabled_or_unknown_vendor: Продавець SCM %{vendor} вимкнено або більше не доступне. - remote_call_failed: Виклик керованого віддаленого не вдалося з повідомленням - %{message} (Код:%{code}) - remote_invalid_response: Отримано недійсну відповідь від віддаленого керування - . - remote_save_failed: Не вдалося зберегти сховище з параметрами, отриманими віддалено. + build_failed: "Неможливо створити сховище з вибраною конфігурацією. %{reason}" + managed_delete: "Неможливо видалити керований репозиторій." + managed_delete_local: "Неможливо видалити локальне сховище на файловій системі %{path} :%{error_message}" + empty_repository: "Репозиторій існує, але порожній. Він ще не містить жодних змін." + exists_on_filesystem: "Каталог сховища вже існує у файловій системі." + filesystem_access_failed: "Під час доступу до сховища у файловій системі сталася помилка: %{message}" + not_manageable: "Цей постачальник репозиторію не може управлятися OpenProject." + path_permission_failed: "Під час створення наступного шляху сталася помилка: %{path}. Переконайтеся, що OpenProject може писати в цю папку." + unauthorized: "Ви не маєте права на доступ до сховища або недійсними є облікові дані." + unavailable: "Сховище недоступне." + exception_title: "Не вдається отримати доступ до сховища: %{message}" + disabled_or_unknown_type: "The selected type %{type} вимкнено або більше не доступне для постачальника СКМ %{vendor}." + disabled_or_unknown_vendor: "Продавець SCM %{vendor} вимкнено або більше не доступне." + remote_call_failed: "Виклик керованого віддаленого не вдалося з повідомленням %{message} (Код:%{code})" + remote_invalid_response: "Отримано недійсну відповідь від віддаленого керування ." + remote_save_failed: "Не вдалося зберегти сховище з параметрами, отриманими віддалено." git: instructions: - managed_url: Це URL-адреса керованого (місцевого) сховища Git. - path: Вкажіть шлях до місцевого сховища Git ( e.g., %{example_path} ). Ви - також можете використовувати віддалені сховища, які клонувалися до локальної - копії, використовуючи значення, що починається з http(s):// or file://. - path_encoding: 'Перевизначити кодування шляху Git (за промовчанням: UTF-8)' - local_title: Посилання на існуюче локальне сховище Git - local_url: Локальний URL - local_introduction: Якщо у вас є локальний репозиторій Git, ви можете зв'язати - його з OpenProject, щоб отримати доступ до нього з програми. - managed_introduction: Нехай OpenProject автоматично створює та інтегрує локальне - сховище Git. - managed_title: Репозиторій Git інтегрований у OpenProject - managed_url: Керований URL - path: Шлях до сховища Git - path_encoding: Кодування шляху - go_to_revision: Перейти до версії - managed_remote: Керовані сховища для цього постачальника обробляються віддалено. - managed_remote_note: Інформація про URL і шлях цього сховища недоступна до її - створення. - managed_url: Керований URL + managed_url: "Це URL-адреса керованого (місцевого) сховища Git." + path: >- + Вкажіть шлях до місцевого сховища Git ( e.g., %{example_path} ). Ви також можете використовувати віддалені сховища, які клонувалися до локальної копії, використовуючи значення, що починається з http(s):// or file://. + path_encoding: "Перевизначити кодування шляху Git (за промовчанням: UTF-8)" + local_title: "Посилання на існуюче локальне сховище Git" + local_url: "Локальний URL" + local_introduction: "Якщо у вас є локальний репозиторій Git, ви можете зв'язати його з OpenProject, щоб отримати доступ до нього з програми." + managed_introduction: "Нехай OpenProject автоматично створює та інтегрує локальне сховище Git." + managed_title: "Репозиторій Git інтегрований у OpenProject" + managed_url: "Керований URL" + path: "Шлях до сховища Git" + path_encoding: "Кодування шляху" + go_to_revision: "Перейти до версії" + managed_remote: "Керовані сховища для цього постачальника обробляються віддалено." + managed_remote_note: "Інформація про URL і шлях цього сховища недоступна до її створення." + managed_url: "Керований URL" settings: - automatic_managed_repos_disabled: Вимкнути автоматичне створення - automatic_managed_repos: Автоматичне створення керованих сховищ - automatic_managed_repos_text: Встановивши тут постачальника, новостворені проекти - автоматично отримають керований репозиторій цього постачальника. - scm_vendor: Система управління джерелом управління - scm_type: Тип сховища + automatic_managed_repos_disabled: "Вимкнути автоматичне створення" + automatic_managed_repos: "Автоматичне створення керованих сховищ" + automatic_managed_repos_text: "Встановивши тут постачальника, новостворені проекти автоматично отримають керований репозиторій цього постачальника." + scm_vendor: "Система управління джерелом управління" + scm_type: "Тип сховища" scm_types: - local: Посилання на існуюче локальне сховище - existing: Посилання на існуюче сховище - managed: Створити нове сховище в OpenProject + local: "Посилання на існуюче локальне сховище" + existing: "Посилання на існуюче сховище" + managed: "Створити нове сховище в OpenProject" storage: - not_available: Споживання дискового сховища недоступне для цього сховища. - update_timeout: |- - Зберігайте останню необхідну інформацію про дисковий простір для сховища протягом N хвилин. - Оскільки підрахунок необхідного дискового простору сховища може бути довгим, збільште це значення, щоб зменшити вплив продуктивності. - oauth_application_details: 'Секретний ключ клієнта стане недоступним, коли ви - закриєте це вікно. Скопіюйте це значення в налаштування інтеграції Nextcloud - OpenProject:' - oauth_application_details_link_text: Перейти на сторінку налаштувань - setup_documentation_details: 'Якщо потрібна допомога з налаштуванням сховища - нових файлів, ознайомтеся з документацією: ' - setup_documentation_details_link_text: Налаштування файлових сховищ - show_warning_details: Щоб користуватися цим файловим сховищем, активуйте модуль - і визначене сховище в налаштуваннях кожного потрібного проєкту. + not_available: "Споживання дискового сховища недоступне для цього сховища." + update_timeout: "Зберігайте останню необхідну інформацію про дисковий простір для сховища протягом N хвилин.\nОскільки підрахунок необхідного дискового простору сховища може бути довгим, збільште це значення, щоб зменшити вплив продуктивності." + oauth_application_details: "Секретний ключ клієнта стане недоступним, коли ви закриєте це вікно. Скопіюйте це значення в налаштування інтеграції Nextcloud OpenProject:" + oauth_application_details_link_text: "Перейти на сторінку налаштувань" + setup_documentation_details: "Якщо потрібна допомога з налаштуванням сховища нових файлів, ознайомтеся з документацією: " + setup_documentation_details_link_text: "Налаштування файлових сховищ" + show_warning_details: "Щоб користуватися цим файловим сховищем, активуйте модуль і визначене сховище в налаштуваннях кожного потрібного проєкту." subversion: - existing_title: Існуюче сховище Subversion - existing_introduction: Якщо у вас є існуюче сховище Subversion, ви можете зв'язати - його з OpenProject, щоб отримати доступ до нього з програми. - existing_url: Існуючий URL + existing_title: "Існуюче сховище Subversion" + existing_introduction: "Якщо у вас є існуюче сховище Subversion, ви можете зв'язати його з OpenProject, щоб отримати доступ до нього з програми." + existing_url: "Існуючий URL" instructions: - managed_url: Це URL-адреса керованого (локального) сховища Subversion. - url: |- - Введіть URL-адресу сховища. Це може або націлити локальне сховище (починаючи з %{local_proto} ) ,або віддаленого сховища. - Підтримуються такі схеми URL-адрес: - managed_title: Репозиторій Subversion інтегрований в OpenProject - managed_introduction: Нехай OpenProject автоматично створює та інтегрує локальне - сховище Subversion. - managed_url: Керований URL - password: Пароль сховища - username: Ім'я користувача сховища - truncated: 'На жаль, нам довелося скоротити цей каталог до%{limit} файлів: %{truncated} - записи були опущені зі списку.' + managed_url: "Це URL-адреса керованого (локального) сховища Subversion." + url: "Введіть URL-адресу сховища. Це може або націлити локальне сховище (починаючи з %{local_proto} ) ,або віддаленого сховища.\nПідтримуються такі схеми URL-адрес:" + managed_title: "Репозиторій Subversion інтегрований в OpenProject" + managed_introduction: "Нехай OpenProject автоматично створює та інтегрує локальне сховище Subversion." + managed_url: "Керований URL" + password: "Пароль сховища" + username: "Ім'я користувача сховища" + truncated: "На жаль, нам довелося скоротити цей каталог до%{limit} файлів: %{truncated} записи були опущені зі списку." named_repository: "%{vendor_name} сховище" - update_settings_successful: Налаштування збережено. - url: 'URL-адреса до сховища ' + update_settings_successful: "Налаштування збережено." + url: "URL-адреса до сховища " warnings: - cannot_annotate: Цей файл не може бути анотований. + cannot_annotate: "Цей файл не може бути анотований." scheduling: - manual: ручне - automatic: автоматичне - search_input_placeholder: Пошук ... - setting_allowed_link_protocols: Дозволені протоколи для посилань - setting_allowed_link_protocols_text_html: Дозвольте відображення цих протоколів - у вигляді посилань в описах пакетів робіт, довгих текстових полях і коментарях. - Наприклад, %{tel_code} або %{element_code}. Вводьте по одному протоколу в рядок. -
Протоколи %{http_code}, %{https_code} і %{mailto_code} завжди дозволені. - setting_capture_external_links: Захоплення зовнішніх посилань - setting_capture_external_links_text: 'Якщо ввімкнено, усі зовнішні посилання у відформатованому - тексті переспрямовуватимуть на попереджувальну сторінку перед переходом із додатка. - Це допомагає захистити користувачів від потенційно шкідливих зовнішніх вебсайтів. - - ' - setting_capture_external_links_require_login: Вимагати, щоб користувачі входили - в систему - setting_capture_external_links_require_login_text: 'Якщо ввімкнено, користувачі, - які переходять за зовнішнім посиланням, мають увійти в систему, інакше не зможуть - продовжити. - - ' - setting_after_first_login_redirect_url: Переспрямування після першого входу - setting_after_first_login_redirect_url_text_html: 'Задайте шлях для переспрямування - користувачів після першого входу. Якщо не задано, користувачі переспрямовуються - на головну сторінку з ознайомленням.
Наприклад: /my/page - - ' - setting_after_login_default_redirect_url: Переспрямування після входу - setting_after_login_default_redirect_url_text_html: 'Задайте шлях за замовчуванням - для переспрямування користувачів після входу, якщо зворотне посилання не надано. - Якщо не задано, користувачі переспрямовуються на головну сторінку.
Приклад: - /my/page - - ' - setting_apiv3_cors_title: Спільне використання ресурсів із різних джерел (CORS) - setting_apiv3_cors_enabled: Увімкнути CORS - setting_apiv3_cors_origins: Дозволені джерела CORS (Cross-Origin Resource Sharing) - в API версії 3 - setting_apiv3_cors_origins_text_html: 'Якщо CORS увімкнено, це джерела, які можуть - отримувати доступ до OpenProject API.
Щоб дізнатися, як указати очікувані - значення, ознайомтеся з Документацією - щодо заголовка джерела. - - ' - setting_apiv3_write_readonly_attributes: Дозвіл для записування атрибутів лише для - читання - setting_apiv3_write_readonly_attributes_instructions: 'Якщо ввімкнено, адміністратори - зможуть за допомогою API записувати статичні атрибути тільки для читання під час - створення, такі як createdAt та author. - - ' - setting_apiv3_write_readonly_attributes_warning: 'Це налаштування використовується, - наприклад, для імпорту даних, але дає змогу адміністраторам створювати елементи - від імені інших користувачів. Однак усі запити на створення реєструються із зазначенням - справжнього автора. - - ' - setting_apiv3_write_readonly_attributes_additional: 'Щоб дізнатися більше про атрибути - й підтримувані ресурси, відвідайте %{api_documentation_link}. - - ' - setting_apiv3_max_page_size: Максимальний розмір сторінки API - setting_apiv3_max_page_size_instructions: 'Установіть максимальний розмір сторінки, - яку повертатиме API. Виконувати запити до API, які повертають більше значень на - одній сторінці, буде неможливо. - - ' - setting_apiv3_max_page_size_warning: 'Змінюйте це значення, лише якщо впевнені, - навіщо це вам потрібно. Встановлення високого значення призведе до суттєвого впливу - на продуктивність, тоді як значення, нижче за параметри кожної сторінки, призведе - до помилок у посторінкових поданнях. - - ' - setting_apiv3_docs: Документація - setting_apiv3_docs_enabled: Увімкнути сторінку документів - setting_apiv3_docs_enabled_instructions_html: 'Якщо сторінку документів увімкнено, - ви можете отримати інтерактивне подання документації APIv3 за посиланням %{link}. - - ' - setting_apiv3_docs_enabled_instructions_warning: 'Зверніть увагу: увімкнення документації - API у виробничій системі може призвести до розкриття конфіденційної інформації - або випадкової втрати даних, якщо ви не будете обережними. Рекомендуємо вмикати - цей параметр лише для потреб розробки. - - ' - setting_attachment_whitelist: Дозволений список завантаження вкладень - setting_email_delivery_method: Спосіб доставки електронної пошти - setting_emails_salutation: 'Звертатися до користувача в електронних листах так:' - setting_oauth_allow_remapping_of_existing_users: Дозволити повторне зіставлення - наявних користувачів - setting_sendmail_location: Розташування виконуваного файлу sendmail - setting_sendmail_arguments: Аргументи для sendmail - setting_smtp_enable_starttls_auto: Автоматично використовуйте STARTTLS, якщо він - доступний - setting_smtp_ssl: Використовуйте SSL-з'єднання - setting_smtp_address: Сервер SMTP - setting_smtp_port: SMTP порт - setting_smtp_authentication: SMTP аутентифікація - setting_smtp_user_name: 'SMTP користувач:' - setting_smtp_password: 'SMTP пароль:' - setting_smtp_domain: Домен SMTP HELO - setting_activity_days_default: Кількість днів, відображених в Діях - setting_api_tokens_enabled: Увімкнути маркери API - setting_api_tokens_enabled_caption: 'Виберіть, чи дозволяти користувачам створювати - персональні маркери API в налаштуваннях їхніх облікових записів. Ці маркери можна - використовувати для доступу до різних API OpenProject, наприклад APIv3 й MCP. - - ' - setting_app_subtitle: Підзаголовок додатку - setting_app_title: Назва додатку - setting_attachment_max_size: Максимальний розмір вкладення - setting_show_work_package_attachments: За замовчуванням показувати вкладення на - вкладці «Файли» - setting_antivirus_scan_mode: Режим перевірки - setting_antivirus_scan_action: Дія із зараженим файлом - setting_autofetch_changesets: Змінюється сховище автозбірки - setting_autologin: Автовхід - setting_available_languages: Доступні мови - setting_bcc_recipients: Отримувачі прихованої копії (bcc) - setting_brute_force_block_after_failed_logins: Заблокувати користувача після цієї - кількості невдалих спроб входу - setting_brute_force_block_minutes: Час, коли користувач заблоковано - setting_cache_formatted_text: Кешувати форматований текст - setting_use_wysiwyg_description: Виберіть, щоб увімкнути редактор CKEditor5 WYSIWYG - для всіх користувачів за умовчанням. CKEditor має обмежену функціональність для - GFM Markdown. - setting_column_options: Стовпці списків пакетів робіт за замовчуванням - setting_commit_fix_keywords: Призначення ключових слів - setting_commit_logs_encoding: Кодування повідомлень - setting_commit_logtime_activity_id: Активність для реєстрації часу - setting_commit_logtime_enabled: Увімкнути реєстрацію часу - setting_commit_ref_keywords: Ключові слова для посилання - setting_consent_time: Час згоди - setting_consent_info: Текст інформації про згоду - setting_consent_required: Потрібна згода - setting_consent_decline_mail: Згода на контактну пошту - setting_cross_project_work_package_relations: Дозволити взаємозв'язок між робочими - пакетами і проектами - setting_first_week_of_year: Перший тиждень у році містить - setting_date_format: Дата - setting_default_language: Мова за замовчуванням - setting_default_projects_modules: Включені по замовчуванню модулі для нових проектів - setting_default_projects_public: Нові проекти є загальнодоступними - setting_disable_password_login: Вимкнути автентифікацію за допомогою пароля - setting_diff_max_lines_displayed: Відображається максимальна кількість рядків diff - setting_omniauth_direct_login_provider: Постачальник послуг SSO для прямого входу - setting_display_subprojects_work_packages: Дисплей підпроекти пакети робіт на основні - проекти за замовчуванням - setting_duration_format: Формат тривалості - setting_duration_format_hours_only: Тільки години - setting_duration_format_days_and_hours: Дні й години - setting_duration_format_instructions: Визначає спосіб відображення значень «Робота», - «Залишок роботи» і «Витрачений час». - setting_emails_footer: Листи до нижнього колонтитула - setting_emails_header: Заголовок листа - setting_email_login: Використовуйте електронну пошту як логін - setting_enabled_scm: Увімкнені SCM - setting_enabled_projects_columns: Стовпці в списку проєктів відображаються за замовчуванням - setting_feeds_enabled: Увімкнути канали - setting_ical_enabled: Дозволити підписки на iCalendar - setting_feeds_limit: Обмеження вмісту каналу - setting_file_max_size_displayed: Максимальний розмір текстового файлу для відображення - setting_host_name: Ім'я хоста - setting_collaborative_editing_hocuspocus_url: URL-адреса сервера Hocuspocus - setting_collaborative_editing_hocuspocus_secret: Секрет сервера Hocuspocus - setting_hours_per_day: Годин на день - setting_hours_per_day_explanation: Визначає, що вважати днем, якщо тривалість представлено - в днях і годинах (наприклад, якщо день триває 8 годин, то 32 години – це 4 дні). - setting_invitation_expiration_days: Повідомлення про активацію закінчується - setting_invitation_expiration_days_caption: Кількість днів до завершення дії листа - з посиланням для активації. - setting_work_package_done_ratio: Режим обчислення прогресу - setting_work_package_done_ratio_field: На основі роботи - setting_work_package_done_ratio_field_caption_html: Для % Завершення можна - вільно встановити будь-яке значення. Якщо ви додатково введете значення для параметра - Робота, Залишок роботи буде виведено автоматично. - setting_work_package_done_ratio_status: На основі статусу - setting_work_package_done_ratio_status_caption_html: Кожен статус % Завершення - має пов'язане з ним значення. Зміна статусу змінить % Завершення. - setting_work_package_done_ratio_explanation_html: 'У режимі на основі роботи - атрибут «% завершення» може мати будь-яке значення. Якщо визначено атрибут «Робота», - з нього автоматично виводиться значення атрибута «Залишок роботи». У режимі на - основі статусу кожен статус має пов’язане з ним значення атрибута «% завершення». - У разі змінення статусу змінюється й значення атрибута «% завершення». - - ' - setting_work_package_properties: Властивості робочого пакета - setting_work_package_startdate_is_adddate: Використовувати поточну дату в якості - дати початку роботи для нових пакетів - setting_work_packages_projects_export_limit: Ліміт експорту пакетів робіт / проєктів - setting_journal_aggregation_time_minutes: Дії користувача зведено протягом - setting_log_requesting_user: Запишіть логін користувача, ім'я та поштову адресу - для всіх запитів - setting_login_required: Необхідна аутентифікація - setting_login_required_caption: Якщо встановлено, усі запити до додатка мають проходити - автентифікацію. - setting_lost_password: Увімкнути скидання пароля - setting_lost_password_caption: Якщо встановлено, користувачі можуть скидати свої - паролі. - setting_mail_from: email адреса для передачі інформації - setting_mail_handler_api_key: Ключ API - setting_mail_handler_body_delimiters: Усічення листи після однієї з цих ліній - setting_mail_handler_body_delimiter_regex: Обрізати електронні листи, які відповідають - цьому регулярному виразу - setting_mail_handler_ignore_filenames: Проігноровані вкладення пошти - setting_new_project_user_role_id: Роль, що призначається користувачу, створившому - проект - setting_new_project_send_confirmation_email: Надсилати сповіщення автору при створенні - нового проєкту - setting_new_project_notification_text: Текст сповіщення - setting_password_active_rules: Активні класи символів - setting_password_count_former_banned: Кількість останніх використаних паролів, заборонених - для повторного використання - setting_password_days_valid: Кількість днів, після чого змінюється пароль - setting_password_min_length: Мінімальна довжина - setting_password_min_adhered_rules: Мінімальна кількість необхідних класів - setting_per_page_options: Кількість записів на сторінку + manual: "ручне" + automatic: "автоматичне" + search_input_placeholder: "Пошук ..." + setting_allowed_link_protocols: "Дозволені протоколи для посилань" + setting_allowed_link_protocols_text_html: >- + Дозвольте відображення цих протоколів у вигляді посилань в описах пакетів робіт, довгих текстових полях і коментарях. Наприклад, %{tel_code} або %{element_code}. Вводьте по одному протоколу в рядок.
Протоколи %{http_code}, %{https_code} і %{mailto_code} завжди дозволені. + setting_capture_external_links: "Захоплення зовнішніх посилань" + setting_capture_external_links_text: > + Якщо ввімкнено, усі зовнішні посилання у відформатованому тексті переспрямовуватимуть на попереджувальну сторінку перед переходом із додатка. Це допомагає захистити користувачів від потенційно шкідливих зовнішніх вебсайтів. + setting_capture_external_links_require_login: "Вимагати, щоб користувачі входили в систему" + setting_capture_external_links_require_login_text: > + Якщо ввімкнено, користувачі, які переходять за зовнішнім посиланням, мають увійти в систему, інакше не зможуть продовжити. + setting_after_first_login_redirect_url: "Переспрямування після першого входу" + setting_after_first_login_redirect_url_text_html: > + Задайте шлях для переспрямування користувачів після першого входу. Якщо не задано, користувачі переспрямовуються на головну сторінку з ознайомленням.
Наприклад: /my/page + setting_after_login_default_redirect_url: "Переспрямування після входу" + setting_after_login_default_redirect_url_text_html: > + Задайте шлях за замовчуванням для переспрямування користувачів після входу, якщо зворотне посилання не надано. Якщо не задано, користувачі переспрямовуються на головну сторінку.
Приклад: /my/page + setting_apiv3_cors_title: "Спільне використання ресурсів із різних джерел (CORS)" + setting_apiv3_cors_enabled: "Увімкнути CORS" + setting_apiv3_cors_origins: "Дозволені джерела CORS (Cross-Origin Resource Sharing) в API версії 3" + setting_apiv3_cors_origins_text_html: > + Якщо CORS увімкнено, це джерела, які можуть отримувати доступ до OpenProject API.
Щоб дізнатися, як указати очікувані значення, ознайомтеся з Документацією щодо заголовка джерела. + setting_apiv3_write_readonly_attributes: "Дозвіл для записування атрибутів лише для читання" + setting_apiv3_write_readonly_attributes_instructions: > + Якщо ввімкнено, адміністратори зможуть за допомогою API записувати статичні атрибути тільки для читання під час створення, такі як createdAt та author. + setting_apiv3_write_readonly_attributes_warning: > + Це налаштування використовується, наприклад, для імпорту даних, але дає змогу адміністраторам створювати елементи від імені інших користувачів. Однак усі запити на створення реєструються із зазначенням справжнього автора. + setting_apiv3_write_readonly_attributes_additional: > + Щоб дізнатися більше про атрибути й підтримувані ресурси, відвідайте %{api_documentation_link}. + setting_apiv3_max_page_size: "Максимальний розмір сторінки API" + setting_apiv3_max_page_size_instructions: > + Установіть максимальний розмір сторінки, яку повертатиме API. Виконувати запити до API, які повертають більше значень на одній сторінці, буде неможливо. + setting_apiv3_max_page_size_warning: > + Змінюйте це значення, лише якщо впевнені, навіщо це вам потрібно. Встановлення високого значення призведе до суттєвого впливу на продуктивність, тоді як значення, нижче за параметри кожної сторінки, призведе до помилок у посторінкових поданнях. + setting_apiv3_docs: "Документація" + setting_apiv3_docs_enabled: "Увімкнути сторінку документів" + setting_apiv3_docs_enabled_instructions_html: > + Якщо сторінку документів увімкнено, ви можете отримати інтерактивне подання документації APIv3 за посиланням %{link}. + setting_apiv3_docs_enabled_instructions_warning: > + Зверніть увагу: увімкнення документації API у виробничій системі може призвести до розкриття конфіденційної інформації або випадкової втрати даних, якщо ви не будете обережними. Рекомендуємо вмикати цей параметр лише для потреб розробки. + setting_attachment_whitelist: "Дозволений список завантаження вкладень" + setting_email_delivery_method: "Спосіб доставки електронної пошти" + setting_emails_salutation: "Звертатися до користувача в електронних листах так:" + setting_oauth_allow_remapping_of_existing_users: "Дозволити повторне зіставлення наявних користувачів" + setting_sendmail_location: "Розташування виконуваного файлу sendmail" + setting_sendmail_arguments: "Аргументи для sendmail" + setting_smtp_enable_starttls_auto: "Автоматично використовуйте STARTTLS, якщо він доступний" + setting_smtp_ssl: "Використовуйте SSL-з'єднання" + setting_smtp_address: "Сервер SMTP" + setting_smtp_port: "SMTP порт" + setting_smtp_authentication: "SMTP аутентифікація" + setting_smtp_user_name: "SMTP користувач:" + setting_smtp_password: "SMTP пароль:" + setting_smtp_domain: "Домен SMTP HELO" + setting_activity_days_default: "Кількість днів, відображених в Діях" + setting_api_tokens_enabled: "Увімкнути маркери API" + setting_api_tokens_enabled_caption: > + Виберіть, чи дозволяти користувачам створювати персональні маркери API в налаштуваннях їхніх облікових записів. Ці маркери можна використовувати для доступу до різних API OpenProject, наприклад APIv3 й MCP. + setting_app_subtitle: "Підзаголовок додатку" + setting_app_title: "Назва додатку" + setting_attachment_max_size: "Максимальний розмір вкладення" + setting_show_work_package_attachments: "За замовчуванням показувати вкладення на вкладці «Файли»" + setting_antivirus_scan_mode: "Режим перевірки" + setting_antivirus_scan_action: "Дія із зараженим файлом" + setting_autofetch_changesets: "Змінюється сховище автозбірки" + setting_autologin: "Автовхід" + setting_available_languages: "Доступні мови" + setting_bcc_recipients: "Отримувачі прихованої копії (bcc)" + setting_brute_force_block_after_failed_logins: "Заблокувати користувача після цієї кількості невдалих спроб входу" + setting_brute_force_block_minutes: "Час, коли користувач заблоковано" + setting_cache_formatted_text: "Кешувати форматований текст" + setting_use_wysiwyg_description: "Виберіть, щоб увімкнути редактор CKEditor5 WYSIWYG для всіх користувачів за умовчанням. CKEditor має обмежену функціональність для GFM Markdown." + setting_column_options: "Стовпці списків пакетів робіт за замовчуванням" + setting_commit_fix_keywords: "Призначення ключових слів" + setting_commit_logs_encoding: "Кодування повідомлень" + setting_commit_logtime_activity_id: "Активність для реєстрації часу" + setting_commit_logtime_enabled: "Увімкнути реєстрацію часу" + setting_commit_ref_keywords: "Ключові слова для посилання" + setting_consent_time: "Час згоди" + setting_consent_info: "Текст інформації про згоду" + setting_consent_required: "Потрібна згода" + setting_consent_decline_mail: "Згода на контактну пошту" + setting_cross_project_work_package_relations: "Дозволити взаємозв'язок між робочими пакетами і проектами" + setting_first_week_of_year: "Перший тиждень у році містить" + setting_date_format: "Дата" + setting_default_language: "Мова за замовчуванням" + setting_default_projects_modules: "Включені по замовчуванню модулі для нових проектів" + setting_default_projects_public: "Нові проекти є загальнодоступними" + setting_disable_password_login: "Вимкнути автентифікацію за допомогою пароля" + setting_diff_max_lines_displayed: "Відображається максимальна кількість рядків diff" + setting_omniauth_direct_login_provider: "Постачальник послуг SSO для прямого входу" + setting_display_subprojects_work_packages: "Дисплей підпроекти пакети робіт на основні проекти за замовчуванням" + setting_duration_format: "Формат тривалості" + setting_duration_format_hours_only: "Тільки години" + setting_duration_format_days_and_hours: "Дні й години" + setting_duration_format_instructions: "Визначає спосіб відображення значень «Робота», «Залишок роботи» і «Витрачений час»." + setting_emails_footer: "Листи до нижнього колонтитула" + setting_emails_header: "Заголовок листа" + setting_email_login: "Використовуйте електронну пошту як логін" + setting_enabled_scm: "Увімкнені SCM" + setting_enabled_projects_columns: "Стовпці в списку проєктів відображаються за замовчуванням" + setting_feeds_enabled: "Увімкнути канали" + setting_ical_enabled: "Дозволити підписки на iCalendar" + setting_feeds_limit: "Обмеження вмісту каналу" + setting_file_max_size_displayed: "Максимальний розмір текстового файлу для відображення" + setting_host_name: "Ім'я хоста" + setting_collaborative_editing_hocuspocus_url: "URL-адреса сервера Hocuspocus" + setting_collaborative_editing_hocuspocus_secret: "Секрет сервера Hocuspocus" + setting_hours_per_day: "Годин на день" + setting_hours_per_day_explanation: >- + Визначає, що вважати днем, якщо тривалість представлено в днях і годинах (наприклад, якщо день триває 8 годин, то 32 години – це 4 дні). + setting_invitation_expiration_days: "Повідомлення про активацію закінчується" + setting_invitation_expiration_days_caption: "Кількість днів до завершення дії листа з посиланням для активації." + setting_work_package_done_ratio: "Режим обчислення прогресу" + setting_work_package_done_ratio_field: "На основі роботи" + setting_work_package_done_ratio_field_caption_html: >- + Для % Завершення можна вільно встановити будь-яке значення. Якщо ви додатково введете значення для параметра Робота, Залишок роботи буде виведено автоматично. + setting_work_package_done_ratio_status: "На основі статусу" + setting_work_package_done_ratio_status_caption_html: >- + Кожен статус % Завершення має пов'язане з ним значення. Зміна статусу змінить % Завершення. + setting_work_package_done_ratio_explanation_html: > + У режимі на основі роботи атрибут «% завершення» може мати будь-яке значення. Якщо визначено атрибут «Робота», з нього автоматично виводиться значення атрибута «Залишок роботи». У режимі на основі статусу кожен статус має пов’язане з ним значення атрибута «% завершення». У разі змінення статусу змінюється й значення атрибута «% завершення». + setting_work_package_properties: "Властивості робочого пакета" + setting_work_package_startdate_is_adddate: "Використовувати поточну дату в якості дати початку роботи для нових пакетів" + setting_work_packages_projects_export_limit: "Ліміт експорту пакетів робіт / проєктів" + setting_journal_aggregation_time_minutes: "Дії користувача зведено протягом" + setting_log_requesting_user: "Запишіть логін користувача, ім'я та поштову адресу для всіх запитів" + setting_login_required: "Необхідна аутентифікація" + setting_login_required_caption: "Якщо встановлено, усі запити до додатка мають проходити автентифікацію." + setting_lost_password: "Увімкнути скидання пароля" + setting_lost_password_caption: "Якщо встановлено, користувачі можуть скидати свої паролі." + setting_mail_from: "email адреса для передачі інформації" + setting_mail_handler_api_key: "Ключ API" + setting_mail_handler_body_delimiters: "Усічення листи після однієї з цих ліній" + setting_mail_handler_body_delimiter_regex: "Обрізати електронні листи, які відповідають цьому регулярному виразу" + setting_mail_handler_ignore_filenames: "Проігноровані вкладення пошти" + setting_new_project_user_role_id: "Роль, що призначається користувачу, створившому проект" + setting_new_project_send_confirmation_email: "Надсилати сповіщення автору при створенні нового проєкту" + setting_new_project_notification_text: "Текст сповіщення" + setting_password_active_rules: "Активні класи символів" + setting_password_count_former_banned: "Кількість останніх використаних паролів, заборонених для повторного використання" + setting_password_days_valid: "Кількість днів, після чого змінюється пароль" + setting_password_min_length: "Мінімальна довжина" + setting_password_min_adhered_rules: "Мінімальна кількість необхідних класів" + setting_per_page_options: "Кількість записів на сторінку" setting_percent_complete_on_status_closed: "% Завершення, коли статус закрито" - setting_percent_complete_on_status_closed_no_change: Без змін - setting_percent_complete_on_status_closed_no_change_caption_html: Значення % - Завершення не зміниться, навіть якщо робочий пакет закрито. - setting_percent_complete_on_status_closed_set_100p: Автоматично встановити на 100% - setting_percent_complete_on_status_closed_set_100p_caption: Закритий робочий пакет - вважається завершеним. - setting_plain_text_mail: Простий текстовий лист (без HTML) - setting_protocol: Протокол - setting_project_gantt_query: 'Подання Ґанта портфеля проєкту ' - setting_project_gantt_query_text: Ви можете змінити запит, який слугує для показу - діаграми Ґанта на сторінці огляду проєкту. - setting_security_badge_displayed: Показ значка безпеки - setting_registration_footer: Реєстраційний колонтитул - setting_registration_footer_caption: Цей текст відображається в нижньому колонтитулі - сторінки реєстрації. За допомогою редактора HTML відформатуйте текст для кожної - вибраної мови. - setting_repositories_automatic_managed_vendor: Тип автоматичного сховища - setting_repositories_encodings: Кодування сховищ - setting_repository_storage_cache_minutes: Кеш розміру диска в сховищі - setting_repository_checkout_display: Показувати інструкції щодо оформлення замовлення - setting_repository_checkout_base_url: Перевірити URL - setting_repository_checkout_text: Текст інструкції перевірки - setting_repository_log_display_limit: Максимальна кількість змін відображається - в лог файл - setting_repository_truncate_at: Максимальна кількість файлів, відображених у переглядачі - сховища - setting_self_registration: Самостійна реєстрація - setting_self_registration_caption: 'Виберіть механізм самостійної реєстрації користувачів. - Зверніть увагу, що деякі варіанти дають змогу користувачам активувати свої облікові - записи в цьому екземплярі. - - ' - setting_self_registration_warning: 'Користувачі зможуть активувати свої облікові - записи. Зверніть увагу: вони отримають доступ до всіх загальнодоступних проєктів. - Переконайтеся, що загальнодоступні проєкти не містять чутливих або персональних - даних. - - ' - setting_self_registration_disabled: Вимкнено - setting_self_registration_disabled_caption: 'Самостійна реєстрація облікових записів - заборонена. Нові облікові записи можуть створювати лише адміністратори й користувачі - з глобальним дозволом на створення нових користувачів. - - ' - setting_self_registration_activation_by_email: Активація облікового запису електронною - поштою - setting_self_registration_activation_by_email_caption: 'Користувачі можуть реєструватися - самостійно й активувати свої облікові записи після підтвердження адреси електронної - пошти. Адміністратори не мають контролю над процесом активації. - - ' - setting_self_registration_automatic_activation: Автоматична активація облікового - запису - setting_self_registration_automatic_activation_caption: 'Користувачі можуть реєструватися - самостійно. Їхні облікові записи активуються одразу без додаткових дій. Адміністратори - не мають контролю над процесом активації. - - ' - setting_self_registration_manual_activation: Ручна активація облікового запису - setting_self_registration_manual_activation_caption: 'Користувачі можуть реєструватися - самостійно. Їхні облікові записи активує адміністратор або користувач із глобальними - дозволами на створення користувачів чи керування ними. - - ' - setting_session_ttl: Період неактивності, після якого завершується сеанс - setting_session_ttl_hint: Значення нижче 5 працює як відключено - setting_session_ttl_enabled: Сеанс закінчився - setting_start_of_week: Тиждень починається - setting_sys_api_enabled: Увімкнути веб-службу керування сховищем - setting_sys_api_description: Веб-сервіс управління сховищем забезпечує інтеграцію - та авторизацію користувача для доступу до сховищ. - setting_time_format: Час - setting_total_percent_complete_mode: Обчислення підсумків ієрархів «% завершення» - setting_total_percent_complete_mode_work_weighted_average: Зважено за роботою - setting_total_percent_complete_mode_work_weighted_average_caption_html: Атрибут - Загальний % завершення буде зважено за атрибутом Робота кожного - пакета робіт в ієрархії. Пакети робіт без атрибута Робота ігноруватимуться. - setting_total_percent_complete_mode_simple_average: Середнє арифметичне - setting_total_percent_complete_mode_simple_average_caption_html: Атрибут Робота - ігнорується, а Загальний % завершення дорівнюватиме середньому арифметичному - значень атрибута % завершення пакетів робіт в ієрархії. - setting_accessibility_mode_for_anonymous: Увімкніть режим доступності для анонімних - користувачів - setting_user_format: Формат імені користувача - setting_user_default_timezone: Часовий пояс користувача за замовчуванням - setting_users_deletable_by_admins: Облікові записи користувачів можуть бути видалені - адміністраторами - setting_users_deletable_by_self: Користувачі можуть видаляти свої акаунти - setting_welcome_text: Текст блоку привітання - setting_welcome_title: Заголовок вітального блоку - setting_welcome_on_homescreen: Відображати вітальний блок на робочому столі - setting_work_package_list_default_highlighting_mode: Режим виділення за умовчанням - setting_work_package_list_default_highlighted_attributes: Стандартні вбудовані виділені - атрибути - setting_working_days: Робочі дні + setting_percent_complete_on_status_closed_no_change: "Без змін" + setting_percent_complete_on_status_closed_no_change_caption_html: >- + Значення % Завершення не зміниться, навіть якщо робочий пакет закрито. + setting_percent_complete_on_status_closed_set_100p: "Автоматично встановити на 100%" + setting_percent_complete_on_status_closed_set_100p_caption: >- + Закритий робочий пакет вважається завершеним. + setting_plain_text_mail: "Простий текстовий лист (без HTML)" + setting_protocol: "Протокол" + setting_project_gantt_query: "Подання Ґанта портфеля проєкту " + setting_project_gantt_query_text: "Ви можете змінити запит, який слугує для показу діаграми Ґанта на сторінці огляду проєкту." + setting_security_badge_displayed: "Показ значка безпеки" + setting_registration_footer: "Реєстраційний колонтитул" + setting_registration_footer_caption: "Цей текст відображається в нижньому колонтитулі сторінки реєстрації. За допомогою редактора HTML відформатуйте текст для кожної вибраної мови." + setting_repositories_automatic_managed_vendor: "Тип автоматичного сховища" + setting_repositories_encodings: "Кодування сховищ" + setting_repository_storage_cache_minutes: "Кеш розміру диска в сховищі" + setting_repository_checkout_display: "Показувати інструкції щодо оформлення замовлення" + setting_repository_checkout_base_url: "Перевірити URL" + setting_repository_checkout_text: "Текст інструкції перевірки" + setting_repository_log_display_limit: "Максимальна кількість змін відображається в лог файл" + setting_repository_truncate_at: "Максимальна кількість файлів, відображених у переглядачі сховища" + setting_self_registration: "Самостійна реєстрація" + setting_self_registration_caption: > + Виберіть механізм самостійної реєстрації користувачів. Зверніть увагу, що деякі варіанти дають змогу користувачам активувати свої облікові записи в цьому екземплярі. + setting_self_registration_warning: > + Користувачі зможуть активувати свої облікові записи. Зверніть увагу: вони отримають доступ до всіх загальнодоступних проєктів. Переконайтеся, що загальнодоступні проєкти не містять чутливих або персональних даних. + setting_self_registration_disabled: "Вимкнено" + setting_self_registration_disabled_caption: > + Самостійна реєстрація облікових записів заборонена. Нові облікові записи можуть створювати лише адміністратори й користувачі з глобальним дозволом на створення нових користувачів. + setting_self_registration_activation_by_email: "Активація облікового запису електронною поштою" + setting_self_registration_activation_by_email_caption: > + Користувачі можуть реєструватися самостійно й активувати свої облікові записи після підтвердження адреси електронної пошти. Адміністратори не мають контролю над процесом активації. + setting_self_registration_automatic_activation: "Автоматична активація облікового запису" + setting_self_registration_automatic_activation_caption: > + Користувачі можуть реєструватися самостійно. Їхні облікові записи активуються одразу без додаткових дій. Адміністратори не мають контролю над процесом активації. + setting_self_registration_manual_activation: "Ручна активація облікового запису" + setting_self_registration_manual_activation_caption: > + Користувачі можуть реєструватися самостійно. Їхні облікові записи активує адміністратор або користувач із глобальними дозволами на створення користувачів чи керування ними. + setting_session_ttl: "Період неактивності, після якого завершується сеанс" + setting_session_ttl_hint: "Значення нижче 5 працює як відключено" + setting_session_ttl_enabled: "Сеанс закінчився" + setting_start_of_week: "Тиждень починається" + setting_sys_api_enabled: "Увімкнути веб-службу керування сховищем" + setting_sys_api_description: "Веб-сервіс управління сховищем забезпечує інтеграцію та авторизацію користувача для доступу до сховищ." + setting_time_format: "Час" + setting_total_percent_complete_mode: "Обчислення підсумків ієрархів «% завершення»" + setting_total_percent_complete_mode_work_weighted_average: "Зважено за роботою" + setting_total_percent_complete_mode_work_weighted_average_caption_html: >- + Атрибут Загальний % завершення буде зважено за атрибутом Робота кожного пакета робіт в ієрархії. Пакети робіт без атрибута Робота ігноруватимуться. + setting_total_percent_complete_mode_simple_average: "Середнє арифметичне" + setting_total_percent_complete_mode_simple_average_caption_html: >- + Атрибут Робота ігнорується, а Загальний % завершення дорівнюватиме середньому арифметичному значень атрибута % завершення пакетів робіт в ієрархії. + setting_accessibility_mode_for_anonymous: "Увімкніть режим доступності для анонімних користувачів" + setting_user_format: "Формат імені користувача" + setting_user_default_timezone: "Часовий пояс користувача за замовчуванням" + setting_users_deletable_by_admins: "Облікові записи користувачів можуть бути видалені адміністраторами" + setting_users_deletable_by_self: "Користувачі можуть видаляти свої акаунти" + setting_welcome_text: "Текст блоку привітання" + setting_welcome_title: "Заголовок вітального блоку" + setting_welcome_on_homescreen: "Відображати вітальний блок на робочому столі" + setting_work_package_list_default_highlighting_mode: "Режим виділення за умовчанням" + setting_work_package_list_default_highlighted_attributes: "Стандартні вбудовані виділені атрибути" + setting_working_days: "Робочі дні" settings: errors: - not_writable: Це налаштування недоступне для запису; його може змінити лише - системний адміністратор. - failed_to_update: 'Не вдалось оновити налаштування «%{name}»: %{message}' + not_writable: "Це налаштування недоступне для запису; його може змінити лише системний адміністратор." + failed_to_update: "Не вдалось оновити налаштування «%{name}»: %{message}" authentication: - login: Увійти - registration: Реєстрація - sso: Єдиний вхід (SSO) - omniauth_direct_login_hint_html: 'Якщо цей параметр увімкнено, запити на вхід - переспрямовуватимуться налаштованому постачальнику omniauth. Спадний список - і сторінку входу буде вимкнено.
Примітка. Якщо цей - параметр увімкнено й вхід за допомогою пароля дозволено, користувачі зможуть - входити зі сторінки входу %{internal_path}. - - ' - remapping_existing_users_hint: 'Якщо ввімкнено, будь-який налаштований постачальник - ідентифікаційних даних зможе виконувати вхід в облікові записи наявних користувачів - за допомогою їхніх електронних адрес, навіть якщо користувач ніколи раніше - не входив через цього постачальника. Це може бути корисно під час перенесення - екземпляра OpenProject у сервіс нового постачальника SSO, але не рекомендовано, - якщо використовується постачальник, якому не довіряють усі користувачі вашого - екземпляра. - - ' + login: "Увійти" + registration: "Реєстрація" + sso: "Єдиний вхід (SSO)" + omniauth_direct_login_hint_html: > + Якщо цей параметр увімкнено, запити на вхід переспрямовуватимуться налаштованому постачальнику omniauth. Спадний список і сторінку входу буде вимкнено.
Примітка. Якщо цей параметр увімкнено й вхід за допомогою пароля дозволено, користувачі зможуть входити зі сторінки входу %{internal_path}. + remapping_existing_users_hint: > + Якщо ввімкнено, будь-який налаштований постачальник ідентифікаційних даних зможе виконувати вхід в облікові записи наявних користувачів за допомогою їхніх електронних адрес, навіть якщо користувач ніколи раніше не входив через цього постачальника. Це може бути корисно під час перенесення екземпляра OpenProject у сервіс нового постачальника SSO, але не рекомендовано, якщо використовується постачальник, якому не довіряють усі користувачі вашого екземпляра. attachments: - whitelist_text_html: 'Визначте список дійсних розширень файлів і/або типів MIME - для завантажених файлів.
Введіть розширення файлу (напр., %{ext_example}) - або типи MIME (напр., %{mime_example}). Не вказуйте нічого, щоб - дозволити завантаження будь-яких типів файлів. Ви можете вводити кілька значень - (по одному в кожному рядку). - - ' - show_work_package_attachments: 'Якщо вимкнути цей параметр, список вкладень - буде приховано на вкладці «Файли» пакетів робіт для нових проєктів. Файли, - вкладені в опис пакета робіт, усе одно буде додано у внутрішнє сховище вкладень. - - ' + whitelist_text_html: > + Визначте список дійсних розширень файлів і/або типів MIME для завантажених файлів.
Введіть розширення файлу (напр., %{ext_example}) або типи MIME (напр., %{mime_example}). Не вказуйте нічого, щоб дозволити завантаження будь-яких типів файлів. Ви можете вводити кілька значень (по одному в кожному рядку). + show_work_package_attachments: > + Якщо вимкнути цей параметр, список вкладень буде приховано на вкладці «Файли» пакетів робіт для нових проєктів. Файли, вкладені в опис пакета робіт, усе одно буде додано у внутрішнє сховище вкладень. antivirus: - title: Перевірка на віруси - clamav_ping_failed: Не вдалося підключити демон ClamAV. Перевірте конфігурацію - і повторіть спробу. - remaining_quarantined_files_html: 'Перевірку на віруси вимкнено. Залишок файлів - на карантині: %{file_count}. Переглянути файли на карантині можна за цим посиланням: - %{link} - - ' - remaining_scan_complete_html: 'Решту файлів перевірено. Файлів на карантині: - %{file_count}. Зараз ви перейдете на сторінку карантину, де можна видалити - або замінити файли, перенесені в карантин. - - ' - remaining_rescanned_files: 'Перевірку на віруси ввімкнено. Потрібно ще перевірити - деякі вивантажені раніше файли (%{file_count}). Цей процес заплановано у фоновому - режимі. Файли будуть доступні під час перевірки. - - ' + title: "Перевірка на віруси" + clamav_ping_failed: "Не вдалося підключити демон ClamAV. Перевірте конфігурацію і повторіть спробу." + remaining_quarantined_files_html: > + Перевірку на віруси вимкнено. Залишок файлів на карантині: %{file_count}. Переглянути файли на карантині можна за цим посиланням: %{link} + remaining_scan_complete_html: > + Решту файлів перевірено. Файлів на карантині: %{file_count}. Зараз ви перейдете на сторінку карантину, де можна видалити або замінити файли, перенесені в карантин. + remaining_rescanned_files: > + Перевірку на віруси ввімкнено. Потрібно ще перевірити деякі вивантажені раніше файли (%{file_count}). Цей процес заплановано у фоновому режимі. Файли будуть доступні під час перевірки. actions: - delete: Видалити файл - quarantine: Перенести файл на карантин - instructions_html: 'Виберіть дію, яку потрібно виконати з файлами, у яких - виявлено вірус:
  • %{quarantine_option}: помістити - файл на карантин, заборонивши користувачам доступ до нього. Адміністратори - можуть переглядати й видаляти файли на карантині на панелі адмініструванні.
  • -
  • %{delete_option}: негайно видалити файл.
- - ' + delete: "Видалити файл" + quarantine: "Перенести файл на карантин" + instructions_html: > + Виберіть дію, яку потрібно виконати з файлами, у яких виявлено вірус:
  • %{quarantine_option}: помістити файл на карантин, заборонивши користувачам доступ до нього. Адміністратори можуть переглядати й видаляти файли на карантині на панелі адмініструванні.
  • %{delete_option}: негайно видалити файл.
modes: clamav_socket_html: Введіть сокет до демона clamd, наприклад %{example} - clamav_host_html: Введіть ім’я хоста й порт до демона clamd через двокрапку, - наприклад %{example} - description_html: 'Виберіть режим, у якому має працювати інтеграція з антивірусним - сканером.
  • %{disabled_option}: вивантажені - файли не перевіряються на віруси.
  • %{socket_option}: - ви встановили ClamAV на тому ж сервері, що й OpenProject, і демон сканування - clamd працює у фоновому режимі
  • %{host_option}: - ви передаєте файли на зовнішній хост для перевірки на віруси.
- - ' - brute_force_prevention: Автоматизоване блокування користувачів + clamav_host_html: Введіть ім’я хоста й порт до демона clamd через двокрапку, наприклад %{example} + description_html: > + Виберіть режим, у якому має працювати інтеграція з антивірусним сканером.
  • %{disabled_option}: вивантажені файли не перевіряються на віруси.
  • %{socket_option}: ви встановили ClamAV на тому ж сервері, що й OpenProject, і демон сканування clamd працює у фоновому режимі
  • %{host_option}: ви передаєте файли на зовнішній хост для перевірки на віруси.
+ brute_force_prevention: "Автоматизоване блокування користувачів" date_format: - first_date_of_week_and_year_set: 'Якщо вибрано один із варіантів «%{day_of_week_setting_name}» - і «%{first_week_setting_name}», інший із цих варіантів потрібно також вибрати, - щоб уникнути розбіжностей на зовнішньому сервері. - - ' - first_week_of_year_text_html: 'Виберіть дату в січні, що припадає на перший - тиждень року. Це значення разом із першим днем тижня визначає загальну кількість - днів року. Щоб дізнатися більше, ознайомтеся з нашою документацією - на цю тему. - - ' + first_date_of_week_and_year_set: > + Якщо вибрано один із варіантів «%{day_of_week_setting_name}» і «%{first_week_setting_name}», інший із цих варіантів потрібно також вибрати, щоб уникнути розбіжностей на зовнішньому сервері. + first_week_of_year_text_html: > + Виберіть дату в січні, що припадає на перший тиждень року. Це значення разом із першим днем тижня визначає загальну кількість днів року. Щоб дізнатися більше, ознайомтеся з нашою документацією на цю тему. experimental: - save_confirmation: Увага! Існує ризик втрати даних! Активуйте експериментальні - функції, лише якщо ви готові перервати встановлення екземплара OpenProject - і втратити всі його дані. - warning_toast: Прапори функцій – це параметри, що активують функції, які ще - розробляються. Використовуйте їх лише під час тестування. Не вмикайте їх в - екземплярах OpenProject, що містять важливі дані. Використання цих функцій - майже напевно призведе до пошкодження ваших даних. Ви берете на себе відповідальність - за наслідки. + save_confirmation: Увага! Існує ризик втрати даних! Активуйте експериментальні функції, лише якщо ви готові перервати встановлення екземплара OpenProject і втратити всі його дані. + warning_toast: Прапори функцій – це параметри, що активують функції, які ще розробляються. Використовуйте їх лише під час тестування. Не вмикайте їх в екземплярах OpenProject, що містять важливі дані. Використання цих функцій майже напевно призведе до пошкодження ваших даних. Ви берете на себе відповідальність за наслідки. feature_flags: Прапори функцій - general: Загальні + general: "Загальні" highlighting: mode_long: - inline: Виділіть атрибут(и) в лінію - none: Немає підсвічування - status: Весь рядок за Статусом - type: Весь рядок за Типом - priority: Весь рядок за Пріоритетом + inline: "Виділіть атрибут(и) в лінію" + none: "Немає підсвічування" + status: "Весь рядок за Статусом" + type: "Весь рядок за Типом" + priority: "Весь рядок за Пріоритетом" icalendar: - enable_subscriptions_text_html: Дозволяє користувачам із необхідними дозволами - підписуватися на календарі OpenProject і отримувати доступ до інформації про - пакети робіт через зовнішній клієнт календаря. Примітка. - Прочитайте про підписки на iCalendar, - щоб дізнатися про потенційні ризики для безпеки перед увімкненням цього параметра. + enable_subscriptions_text_html: Дозволяє користувачам із необхідними дозволами підписуватися на календарі OpenProject і отримувати доступ до інформації про пакети робіт через зовнішній клієнт календаря. Примітка. Прочитайте про підписки на iCalendar, щоб дізнатися про потенційні ризики для безпеки перед увімкненням цього параметра. language_name_being_default: "%{language_name} (за замовчуванням)" notifications: - events_explanation: Визначає події, для яких надсилається електронний лист. - Пакети робіт виключаються зі списку, оскільки сповіщення для них можна налаштувати - окремо для кожного користувача. - delay_minutes_explanation: Надсилання електронного листа можна відкласти, щоб - користувачі з налаштованими сповіщеннями в додатку могли підтверджувати сповіщення - в додатку до надсилання листа. Користувачі, які прочитали сповіщення в додатку, - не отримуватимуть електронні листи про вже прочитані сповіщення. - other: Інше - passwords: Паролі + events_explanation: "Визначає події, для яких надсилається електронний лист. Пакети робіт виключаються зі списку, оскільки сповіщення для них можна налаштувати окремо для кожного користувача." + delay_minutes_explanation: "Надсилання електронного листа можна відкласти, щоб користувачі з налаштованими сповіщеннями в додатку могли підтверджувати сповіщення в додатку до надсилання листа. Користувачі, які прочитали сповіщення в додатку, не отримуватимуть електронні листи про вже прочитані сповіщення." + other: "Інше" + passwords: "Паролі" project_attributes: - heading: Атрибути проєкту - label_for_all_projects: Усі проєкти - label_new_attribute: Атрибут проєкту - label_new_section: Розділ - label_edit_section: Редагувати назву - label_section_actions: Дії з розділом - heading_description: Ці атрибути проєкту відображаються на сторінці огляду кожного - проєкту. Ви можете додавати нові атрибути, групувати їх за розділами й перевпорядковувати - за бажанням. Ці атрибути можна вмикати або вимикати, але не можна перевпорядковувати - на рівні проєкту. - label_project_custom_field_actions: Дії з атрибутами проєкту - label_no_project_custom_fields: У цьому розділі не визначено жодних атрибутів - проєкту + heading: "Атрибути проєкту" + label_for_all_projects: "Усі проєкти" + label_new_attribute: "Атрибут проєкту" + label_new_section: "Розділ" + label_edit_section: "Редагувати назву" + label_section_actions: "Дії з розділом" + heading_description: "Ці атрибути проєкту відображаються на сторінці огляду кожного проєкту. Ви можете додавати нові атрибути, групувати їх за розділами й перевпорядковувати за бажанням. Ці атрибути можна вмикати або вимикати, але не можна перевпорядковувати на рівні проєкту." + label_project_custom_field_actions: "Дії з атрибутами проєкту" + label_no_project_custom_fields: "У цьому розділі не визначено жодних атрибутів проєкту" edit: - description: Зміни цього атрибута проєкту відобразяться в усіх проєктах, де - його ввімкнено. Обов’язкові атрибути не можна вимикати для окремого проєкту. + description: "Зміни цього атрибута проєкту відобразяться в усіх проєктах, де його ввімкнено. Обов’язкові атрибути не можна вимикати для окремого проєкту." new: - heading: Новий атрибут - description: Зміни цього атрибута проєкту відобразяться в усіх проєктах, де - його ввімкнено. Обов’язкові атрибути не можна вимикати для окремого проєкту. + heading: "Новий атрибут" + description: "Зміни цього атрибута проєкту відобразяться в усіх проєктах, де його ввімкнено. Обов’язкові атрибути не можна вимикати для окремого проєкту." sections: display_representation: overview: - label: 'Де відображається атрибут проєкту:' + label: "Де відображається атрибут проєкту:" main_area: - label: Основна зона - description: Додайте всі атрибути проєкту як окремі віджети в основний - розділ сторінки «Огляд проєкту». + label: "Основна зона" + description: "Додайте всі атрибути проєкту як окремі віджети в основний розділ сторінки «Огляд проєкту»." side_panel: - label: Бічна панель - description: Додайте всі атрибути проєкту в розділ, що міститься на - правій бічній панелі сторінки «Огляд проєкту». + label: "Бічна панель" + description: "Додайте всі атрибути проєкту в розділ, що міститься на правій бічній панелі сторінки «Огляд проєкту»." project_initiation_request: - header_description: 'OpenProject може створити покроковий майстер, який допомагатиме - менеджерам проєктів заповнювати запити на ініціювання проєктів. Ви можете - вибрати атрибути проєктів, які слід включити, і в результаті створити артефакт - у форматі PDF. - - ' + header_description: > + OpenProject може створити покроковий майстер, який допомагатиме менеджерам проєктів заповнювати запити на ініціювання проєктів. Ви можете вибрати атрибути проєктів, які слід включити, і в результаті створити артефакт у форматі PDF. status: - submitted: Запит «%{wizard_name}» подано - submitted_description: Натисніть кнопку нижче, щоб перейти до пакета робіт - процесу подання. - submitted_button: Відкрити поданий запит - not_completed: Запит «%{wizard_name}» ще не заповнено - not_completed_description: Надайте необхідну інформацію, указавши атрибути, - і ініціюйте проєкт. + submitted: "Запит «%{wizard_name}» подано" + submitted_description: "Натисніть кнопку нижче, щоб перейти до пакета робіт процесу подання." + submitted_button: "Відкрити поданий запит" + not_completed: "Запит «%{wizard_name}» ще не заповнено" + not_completed_description: "Надайте необхідну інформацію, указавши атрибути, і ініціюйте проєкт." wizard_status_button: - project_initiation_request: Відкрити запит на ініціювання проєкту - project_creation_wizard: Відкрити майстер створення проєктів - project_mandate: Відкрити мандат проєкту + project_initiation_request: "Відкрити запит на ініціювання проєкту" + project_creation_wizard: "Відкрити майстер створення проєктів" + project_mandate: "Відкрити мандат проєкту" blankslate: - title: Запит на ініціювання проєкту не ввімкнено - description: OpenProject може створити покроковий майстер, який допомагатиме - менеджерам проєктів заповнювати запити на ініціювання проєктів. Ви можете - вибрати атрибути проєктів, які слід включити, а також указати, що робити - з вихідним документом. Щоб почати налаштування майстра, увімкніть його тут. + title: "Запит на ініціювання проєкту не ввімкнено" + description: "OpenProject може створити покроковий майстер, який допомагатиме менеджерам проєктів заповнювати запити на ініціювання проєктів. Ви можете вибрати атрибути проєктів, які слід включити, а також указати, що робити з вихідним документом. Щоб почати налаштування майстра, увімкніть його тут." disable_dialog: - title: Вимкнути запит на ініціювання проєкту - heading: Вимкнути цей запит на ініціювання проєкту? - confirmation_message: Майстер запиту на ініціювання більше не буде доступний - для нових проєктів, створених на основі цього шаблону. Менеджерам і власникам - проєктів доведеться вручну вибирати налаштування й указувати відповідну - інформацію на сторінці «Огляд проєкту». - checkbox_message: Я розумію, що цю дію не можна буде скасувати + title: "Вимкнути запит на ініціювання проєкту" + heading: "Вимкнути цей запит на ініціювання проєкту?" + confirmation_message: "Майстер запиту на ініціювання більше не буде доступний для нових проєктів, створених на основі цього шаблону. Менеджерам і власникам проєктів доведеться вручну вибирати налаштування й указувати відповідну інформацію на сторінці «Огляд проєкту»." + checkbox_message: "Я розумію, що цю дію не можна буде скасувати" name: - artifact_name: Назва артефакту - artifact_name_caption: Виберіть для цього артефакту назву, яка відповідатиме - вашому методу управління проєктами. + artifact_name: "Назва артефакту" + artifact_name_caption: "Виберіть для цього артефакту назву, яка відповідатиме вашому методу управління проєктами." options: - project_initiation_request: Запит на ініціювання проєкту - project_creation_wizard: Майстер створення проєктів - project_mandate: Мандат проєкту + project_initiation_request: "Запит на ініціювання проєкту" + project_creation_wizard: "Майстер створення проєктів" + project_mandate: "Мандат проєкту" submission: - description_template: "**Цей пакет робіт автоматично створено після завершення - робочого процесу «%{wizard_name}».** Артефакт у форматі PDF, що містить - усю подану інформацію, було створено й додано в цей пакет робіт для довідки - й аудиту. Якщо знадобиться оновити дані або повторити кроки із запуску, - можна будь-коли знову відкрити майстер, скориставшись посиланням, наведеним - нижче:\n" - description: Коли користувач подає запит на ініціювання проєкту, створюється - новий пакет робіт з артефактом запиту, долученим як файл PDF. Наведені нижче - налаштування визначають тип, статус і виконавця нового пакета робіт. - work_package_type: Тип пакета робіт - work_package_type_caption: Тип пакета робіт, який слід використовувати для - зберігання завершеного артефакту. - status_when_submitted: Статус на момент подання - status_when_submitted_caption: Статус, який буде присвоєно створеному пакету - робіт після подання запиту. - send_confirmation_email: Надіслати лист із підтвердженням користувачу, що - подав запит на ініціювання проєкту - assignee: Виконавець на момент подання - assignee_caption_html: Користувач або група, призначена цьому атрибуту проєкту, - також стане отримувачем нового пакета робіт. Цей список включає активні - атрибути проєкту лише типу Користувач. - confirmation_email_text: Текст листа з підтвердженням - confirmation_email_default: |- - Вітаємо! - - Ви подали запит на ініціювання проєкту **%{project_name}**. Зараз він очікує на розгляд. - Перейдіть за посиланням нижче, щоб отримати доступ до пакета робіт із Вашим запитом. - work_package_comment: Коментар до пакета робіт - work_package_comment_caption: Виконавця, вибраного вище, буде автоматично - @згадано в коментарі. - work_package_comment_default: Запит на ініціювання проєкту **%{project_name}** - подано, і він очікує на розгляд. + description_template: > + **Цей пакет робіт автоматично створено після завершення робочого процесу «%{wizard_name}».** Артефакт у форматі PDF, що містить усю подану інформацію, було створено й додано в цей пакет робіт для довідки й аудиту. Якщо знадобиться оновити дані або повторити кроки із запуску, можна будь-коли знову відкрити майстер, скориставшись посиланням, наведеним нижче: + description: "Коли користувач подає запит на ініціювання проєкту, створюється новий пакет робіт з артефактом запиту, долученим як файл PDF. Наведені нижче налаштування визначають тип, статус і виконавця нового пакета робіт." + work_package_type: "Тип пакета робіт" + work_package_type_caption: "Тип пакета робіт, який слід використовувати для зберігання завершеного артефакту." + status_when_submitted: "Статус на момент подання" + status_when_submitted_caption: "Статус, який буде присвоєно створеному пакету робіт після подання запиту." + send_confirmation_email: "Надіслати лист із підтвердженням користувачу, що подав запит на ініціювання проєкту" + assignee: "Виконавець на момент подання" + assignee_caption_html: "Користувач або група, призначена цьому атрибуту проєкту, також стане отримувачем нового пакета робіт. Цей список включає активні атрибути проєкту лише типу Користувач." + confirmation_email_text: "Текст листа з підтвердженням" + confirmation_email_default: "Вітаємо!\n\nВи подали запит на ініціювання проєкту **%{project_name}**. Зараз він очікує на розгляд.\nПерейдіть за посиланням нижче, щоб отримати доступ до пакета робіт із Вашим запитом." + work_package_comment: "Коментар до пакета робіт" + work_package_comment_caption: "Виконавця, вибраного вище, буде автоматично @згадано в коментарі." + work_package_comment_default: "Запит на ініціювання проєкту **%{project_name}** подано, і він очікує на розгляд." project_phase_definitions: - heading: Життєвий цикл проєкту - heading_description: Життєвий цикл проєкту визначає етапи, які можна використовувати - для планування проєкту і які з’являться на сторінці огляду кожного проєкту. - Ці атрибути можна вмикати або вимикати, але їх не можна перевпорядковувати - на рівні окремого проєкту. - label_add: Додати - label_add_description: Додати визначення етапу проєкту + heading: "Життєвий цикл проєкту" + heading_description: "Життєвий цикл проєкту визначає етапи, які можна використовувати для планування проєкту і які з’являться на сторінці огляду кожного проєкту. Ці атрибути можна вмикати або вимикати, але їх не можна перевпорядковувати на рівні окремого проєкту." + label_add: "Додати" + label_add_description: "Додати визначення етапу проєкту" filter: - label: Пошук за назвою етапу - section_header: Етапи - non_defined: Наразі не визначено жодних етапів. - phase_gates: Контрольні точки етапів + label: "Пошук за назвою етапу" + section_header: "Етапи" + non_defined: "Наразі не визначено жодних етапів." + phase_gates: "Контрольні точки етапів" new: - description: Зміни цього етапу проєкту відображатимуться в усіх проєктах із - цим етапом. - heading: Новий етап - both_gate: Початкова й кінцева контрольні точки - no_gate: Немає контрольної точки - start_gate: Початкова контрольна точка - start_gate_caption: Додайте контрольну точку з датою початку етапу - finish_gate: Кінцева контрольна точка - finish_gate_caption: Додайте контрольну точку з датою закінчення етапу + description: "Зміни цього етапу проєкту відображатимуться в усіх проєктах із цим етапом." + heading: "Новий етап" + both_gate: "Початкова й кінцева контрольні точки" + no_gate: "Немає контрольної точки" + start_gate: "Початкова контрольна точка" + start_gate_caption: "Додайте контрольну точку з датою початку етапу" + finish_gate: "Кінцева контрольна точка" + finish_gate_caption: "Додайте контрольну точку з датою закінчення етапу" projects: - missing_dependencies: Перевірено модуль проєкту %{module}, який містить залежності - від %{dependencies}. Ці залежності потрібно також перевірити. - section_new_projects: Налаштування нових проєктів - section_project_overview: Налаштування для списків проєктів - session: Сесія + missing_dependencies: "Перевірено модуль проєкту %{module}, який містить залежності від %{dependencies}. Ці залежності потрібно також перевірити." + section_new_projects: "Налаштування нових проєктів" + section_project_overview: "Налаштування для списків проєктів" + session: "Сесія" user: - default_preferences: Параметри за умовчанням - display_format: Формат відображення - deletion: Видалення + default_preferences: "Параметри за умовчанням" + display_format: "Формат відображення" + deletion: "Видалення" working_days: - section_work_week: Робочий тиждень - section_holidays_and_closures: Свята й вихідні + section_work_week: "Робочий тиждень" + section_holidays_and_closures: "Свята й вихідні" work_packages: - not_allowed_text: У вас немає дозволів для перегляду цієї сторінки. + not_allowed_text: "У вас немає дозволів для перегляду цієї сторінки." activities: - enable_internal_comments: Увімкнути внутрішні коментарі - helper_text: Завдяки внутрішнім коментарям учасники внутрішньої команди можуть - спілкуватися приватно. Ці коментарі доступні лише користувачам із певними - ролями й необхідними дозволами й ніколи не відображаються для всіх. %{link} + enable_internal_comments: "Увімкнути внутрішні коментарі" + helper_text: "Завдяки внутрішнім коментарям учасники внутрішньої команди можуть спілкуватися приватно. Ці коментарі доступні лише користувачам із певними ролями й необхідними дозволами й ніколи не відображаються для всіх. %{link}" text_formatting: - markdown: Markdown - plain: Простий текст - status_active: активний - status_archived: в архіві - status_blocked: заблоковано + markdown: "Markdown" + plain: "Простий текст" + status_active: "активний" + status_archived: "в архіві" + status_blocked: "заблоковано" status_invited: запрошені status_locked: заблоковано status_registered: Зареєстровано status_deleted: видалено + #Used in array.to_sentence. support: array: - sentence_connector: і - skip_last_comma: хибне значення - text_accessibility_hint: Режим доступності призначений для користувачів, які є сліпими, - з обмеженими можливостями або мають поганий зір. Для останніх спеціально виділені - цілеспрямовані елементи. Зауважте, що модуль Backlogs недоступний у цьому режимі. - text_access_token_hint: Маркери доступу дозволяють надавати зовнішнім програмам - доступ до ресурсів у OpenProject. - text_analyze: 'Подальший аналіз: %{subject}' - text_are_you_sure: Ви впевненені? - open_link_in_a_new_tab: Відкрити посилання в новій вкладці - text_are_you_sure_continue: Хочете продовжити? - text_are_you_sure_with_children: Видалити робочий пакет і всі дочірні робочі пакети? - text_are_you_sure_with_project_custom_fields: Видалення цього атрибута також призведе - до видалення його значень у всіх проєктах. Ви впевнені? - text_are_you_sure_with_project_life_cycle_step: Видалення цього етапу також призведе - до його видалення в усіх проєктах. Ви впевнені? - text_assign_to_project: Призначити на проект - text_form_configuration: 'Можна налаштувати, які поля будуть відображатися у формах - робочих пакетів. Ви можете вільно групувати поля для відображення потреб вашого - домену. - - ' - text_form_configuration_required_attribute: Атрибут позначений необхідним і таким - чином завжди показано + sentence_connector: "і" + skip_last_comma: "хибне значення" + text_accessibility_hint: "Режим доступності призначений для користувачів, які є сліпими, з обмеженими можливостями або мають поганий зір. Для останніх спеціально виділені цілеспрямовані елементи. Зауважте, що модуль Backlogs недоступний у цьому режимі." + text_access_token_hint: "Маркери доступу дозволяють надавати зовнішнім програмам доступ до ресурсів у OpenProject." + text_analyze: "Подальший аналіз: %{subject}" + text_are_you_sure: "Ви впевненені?" + open_link_in_a_new_tab: "Відкрити посилання в новій вкладці" + text_are_you_sure_continue: "Хочете продовжити?" + text_are_you_sure_with_children: "Видалити робочий пакет і всі дочірні робочі пакети?" + text_are_you_sure_with_project_custom_fields: "Видалення цього атрибута також призведе до видалення його значень у всіх проєктах. Ви впевнені?" + text_are_you_sure_with_project_life_cycle_step: "Видалення цього етапу також призведе до його видалення в усіх проєктах. Ви впевнені?" + text_assign_to_project: "Призначити на проект" + text_form_configuration: > + Можна налаштувати, які поля будуть відображатися у формах робочих пакетів. Ви можете вільно групувати поля для відображення потреб вашого домену. + text_form_configuration_required_attribute: "Атрибут позначений необхідним і таким чином завжди показано" text_caracters_maximum: "%{count} символів(а) максимум." - text_caracters_minimum: Повинно мати якнайменше %{count} символів(а) у довжину. - text_comma_separated: Допустимі декілька значень (розділені комою). - text_comment_wiki_page: 'Коментарі до сторінки вікі: %{page}' - text_custom_field_possible_values_info: По одному значенню в кожному рядку - text_custom_field_hint_activate_per_project: 'При використанні спеціальних полів: - Майте на увазі, що спеціальні поля повинні бути активовані для кожного проекту. - - ' - text_custom_field_hint_activate_per_project_and_type: 'Користувальницькі поля повинні - бути активовані за типом робочого пакета та проекту. - - ' - text_project_custom_field_html: 'У версії Enterprise з’являться такі додаткові доповнення - для користувацьких полів проєктів:
  • Додавати користувацькі поля - проєктів у список проєктів для створення режиму перегляду портфеля проєктів
  • -
- - ' - text_custom_logo_instructions: 'Логотип автоматично масштабується відповідно до - розміру заголовка. Щоб отримати найкращий результат, завантажте зображення з білим - логотипом на прозорому фоні розміром 130×47 пікселів. Відступи на зображені можуть - бути будь-які. - - ' - text_custom_logo_mobile_instructions: 'Логотип автоматично масштабується відповідно - до розміру заголовка. Щоб отримати найкращий результат, завантажте зображення - з білим логотипом на прозорому фоні розміром 130×33 пікселі. Відступи на зображені - можуть бути будь-які. - - ' - text_custom_export_logo_instructions: 'Це логотип з’являється, що відображається - у ваших експортах PDF. Він має бути у форматі файлу зображення PNG або JPEG. Рекомендується - чорний або кольоровий логотип на прозорому чи білому фоні. - - ' - text_custom_export_cover_instructions: 'Це зображення, що з’являється на фоні сторінки - обкладинки у ваших експортах PDF. Вимоги до зображення: 800 пікс. (ширина) на - 500 пікс. (висота), файл PNG або JPEG. - - ' - text_custom_export_footer_instructions: 'Дані, експортовані як PDF, включатимуть - графічний елемент, розташований ліворуч у нижньому колонтитулі. Це зображення - має бути у форматі PNG або JPEG шириною приблизно 200 пікселів. - - ' - label_custom_export_font_instructions: 'Завантажуйте власні шрифти TrueType (.ttf), - щоб використовувати їх при експорті в PDF, і керуйте ними. Щоб досягти найкращих - результатів, використовуйте суміжні файли з одного сімейства шрифтів. Якщо шрифт - не надано, буде використано стандартний шрифт NotoSans. - - ' - label_custom_export_images_instructions: 'Завантажуйте власні файли зображень, щоб - використовувати їх при експорті в PDF, і керуйте ними. - - ' - text_custom_export_font_regular_instructions: 'Це файл шрифту для звичайного тексту. - Він має бути у форматі TTF і є обов’язковим. - - ' - text_custom_export_font_bold_instructions: 'Це файл шрифту для жирного тексту. Він - має бути у форматі TTF. - - ' - text_custom_export_font_italic_instructions: 'Це файл шрифту для курсиву. Він має - бути у форматі TTF. - - ' - text_custom_export_font_bold_italic_instructions: 'Це файл шрифту для жирного тексту - й курсиву. Він має бути у форматі TTF. - - ' - text_custom_favicon_instructions: 'Це крихітний значок, який з’являється у вікні - / на вкладці вашого браузера біля назви сторінки. Це має бути квадратний файл - зображення 32 на 32 пікселі з прозорим фоном у форматі PNG. - - ' - text_custom_touch_icon_instructions: 'Це значок, який відображається на вашому мобільному - пристрої або планшеті, коли ви створюєте закладку на робочому столі. Це має бути - квадратний файл зображення 180 на 180 пікселів у форматі PNG. Переконайтеся, що - фон зображення не прозорий, інакше воно буде матиме поганий вигляд на iOS. - - ' - text_database_allows_tsv: База даних дозволяє TSVector (необов'язково) - text_default_administrator_account_changed: Обліковий запис адміністратора за замовчуванням - змінений - text_default_encoding: 'По замовчуванню: UTF-8' - text_destroy: Видалити - text_destroy_with_associated: 'Існують додаткові об''єкти, асоційовані з робочими - пакетами, які потрібно видалити. Ці об''єкти мають наступні типи:' - text_destroy_what_to_do: Що ти хочеш зробити? - text_diff_truncated: "... Це порівняння (diff) було скорочене, оскільки воно перевищує - максимальний розмір, який можна відобразити." - text_email_delivery_not_configured: |- - Доставку електронної пошти не налаштовано, і сповіщення вимкнуто. - Налаштуйте свій SMTP-сервер, щоб увімкнути їх. - text_enumeration_category_reassign_to: 'Надати їм наступне значення:' + text_caracters_minimum: "Повинно мати якнайменше %{count} символів(а) у довжину." + text_comma_separated: "Допустимі декілька значень (розділені комою)." + text_comment_wiki_page: "Коментарі до сторінки вікі: %{page}" + text_custom_field_possible_values_info: "По одному значенню в кожному рядку" + text_custom_field_hint_activate_per_project: > + При використанні спеціальних полів: Майте на увазі, що спеціальні поля повинні бути активовані для кожного проекту. + text_custom_field_hint_activate_per_project_and_type: > + Користувальницькі поля повинні бути активовані за типом робочого пакета та проекту. + text_project_custom_field_html: > + У версії Enterprise з’являться такі додаткові доповнення для користувацьких полів проєктів:
  • Додавати користувацькі поля проєктів у список проєктів для створення режиму перегляду портфеля проєктів
+ text_custom_logo_instructions: > + Логотип автоматично масштабується відповідно до розміру заголовка. Щоб отримати найкращий результат, завантажте зображення з білим логотипом на прозорому фоні розміром 130×47 пікселів. Відступи на зображені можуть бути будь-які. + text_custom_logo_mobile_instructions: > + Логотип автоматично масштабується відповідно до розміру заголовка. Щоб отримати найкращий результат, завантажте зображення з білим логотипом на прозорому фоні розміром 130×33 пікселі. Відступи на зображені можуть бути будь-які. + text_custom_export_logo_instructions: > + Це логотип з’являється, що відображається у ваших експортах PDF. Він має бути у форматі файлу зображення PNG або JPEG. Рекомендується чорний або кольоровий логотип на прозорому чи білому фоні. + text_custom_export_cover_instructions: > + Це зображення, що з’являється на фоні сторінки обкладинки у ваших експортах PDF. Вимоги до зображення: 800 пікс. (ширина) на 500 пікс. (висота), файл PNG або JPEG. + text_custom_export_footer_instructions: > + Дані, експортовані як PDF, включатимуть графічний елемент, розташований ліворуч у нижньому колонтитулі. Це зображення має бути у форматі PNG або JPEG шириною приблизно 200 пікселів. + label_custom_export_font_instructions: > + Завантажуйте власні шрифти TrueType (.ttf), щоб використовувати їх при експорті в PDF, і керуйте ними. Щоб досягти найкращих результатів, використовуйте суміжні файли з одного сімейства шрифтів. Якщо шрифт не надано, буде використано стандартний шрифт NotoSans. + label_custom_export_images_instructions: > + Завантажуйте власні файли зображень, щоб використовувати їх при експорті в PDF, і керуйте ними. + text_custom_export_font_regular_instructions: > + Це файл шрифту для звичайного тексту. Він має бути у форматі TTF і є обов’язковим. + text_custom_export_font_bold_instructions: > + Це файл шрифту для жирного тексту. Він має бути у форматі TTF. + text_custom_export_font_italic_instructions: > + Це файл шрифту для курсиву. Він має бути у форматі TTF. + text_custom_export_font_bold_italic_instructions: > + Це файл шрифту для жирного тексту й курсиву. Він має бути у форматі TTF. + text_custom_favicon_instructions: > + Це крихітний значок, який з’являється у вікні / на вкладці вашого браузера біля назви сторінки. Це має бути квадратний файл зображення 32 на 32 пікселі з прозорим фоном у форматі PNG. + text_custom_touch_icon_instructions: > + Це значок, який відображається на вашому мобільному пристрої або планшеті, коли ви створюєте закладку на робочому столі. Це має бути квадратний файл зображення 180 на 180 пікселів у форматі PNG. Переконайтеся, що фон зображення не прозорий, інакше воно буде матиме поганий вигляд на iOS. + text_database_allows_tsv: "База даних дозволяє TSVector (необов'язково)" + text_default_administrator_account_changed: "Обліковий запис адміністратора за замовчуванням змінений" + text_default_encoding: "По замовчуванню: UTF-8" + text_destroy: "Видалити" + text_destroy_with_associated: "Існують додаткові об'єкти, асоційовані з робочими пакетами, які потрібно видалити. Ці об'єкти мають наступні типи:" + text_destroy_what_to_do: "Що ти хочеш зробити?" + text_diff_truncated: "... Це порівняння (diff) було скорочене, оскільки воно перевищує максимальний розмір, який можна відобразити." + text_email_delivery_not_configured: "Доставку електронної пошти не налаштовано, і сповіщення вимкнуто.\nНалаштуйте свій SMTP-сервер, щоб увімкнути їх." + text_enumeration_category_reassign_to: "Надати їм наступне значення:" text_enumeration_destroy_question: "%{count} об'єктам призначено дане значення." - text_file_repository_writable: Папка вкладень доступна для запису - text_git_repo_example: пуста локальна тека репозиторію (напр. /gitrepo, c:\gitrepo) - text_hint_date_format: Введіть дату у вигляді YYYY-MM-DD. Інші формати можуть бути - змінені на небажану дату. - text_hint_disable_with_0: 'Примітка: Вимкнути за допомогою 0' - text_hours_between: Між %{min} і %{max} годин - text_work_package_added: Автор %{author} відзвітував по робочому пакету %{id}. - text_work_package_category_destroy_assignments: Видалити призначення категорії - text_work_package_category_destroy_question: Деякі робочі пакети (%{count}) були - призначені для цієї категорії. Що ви хочете зробити? - text_work_package_category_reassign_to: Перепризначити робочі пакети до даної категорії + text_file_repository_writable: "Папка вкладень доступна для запису" + text_git_repo_example: "пуста локальна тека репозиторію (напр. /gitrepo, c:\\gitrepo)" + text_hint_date_format: "Введіть дату у вигляді YYYY-MM-DD. Інші формати можуть бути змінені на небажану дату." + text_hint_disable_with_0: "Примітка: Вимкнути за допомогою 0" + text_hours_between: "Між %{min} і %{max} годин" + text_work_package_added: "Автор %{author} відзвітував по робочому пакету %{id}." + text_work_package_category_destroy_assignments: "Видалити призначення категорії" + text_work_package_category_destroy_question: "Деякі робочі пакети (%{count}) були призначені для цієї категорії. Що ви хочете зробити?" + text_work_package_category_reassign_to: "Перепризначити робочі пакети до даної категорії" text_work_package_updated: "%{author} оновив робочий пакет %{id}." - text_work_package_watcher_added: Користувач %{watcher_changer} додав вас як відстежувача - в пакет робіт %{id}. - text_work_package_watcher_removed: Користувач %{watcher_changer} вилучив вас зі - списку відстежувачів у пакеті робіт %{id}. - text_work_packages_destroy_confirmation: Ви впевнені у тому, що хочете видалити - вибрані робочі пакети? - text_work_packages_ref_in_commit_messages: Посилання та фіксація робочих пакетів - у повідомленнях комітів + text_work_package_watcher_added: "Користувач %{watcher_changer} додав вас як відстежувача в пакет робіт %{id}." + text_work_package_watcher_removed: "Користувач %{watcher_changer} вилучив вас зі списку відстежувачів у пакеті робіт %{id}." + text_work_packages_destroy_confirmation: "Ви впевнені у тому, що хочете видалити вибрані робочі пакети?" + text_work_packages_ref_in_commit_messages: "Посилання та фіксація робочих пакетів у повідомленнях комітів" text_journal_added: "%{label} %{value} доданий" text_journal_attachment_added: "%{label} %{value} додано як вкладення" text_journal_attachment_deleted: "%{label} %{old} вилучено як вкладення" @@ -6159,412 +5141,286 @@ uk: text_journal_deleted: "%{label} видалено (%{old})" text_journal_deleted_subproject: "%{label} %{old}" text_journal_deleted_with_diff: "%{label} видалено (%{link})" - text_journal_file_link_added: Додано посилання %{label} на значення %{value} (%{storage}) - text_journal_file_link_deleted: Вилучено посилання %{label} на значення %{old} (%{storage}) + text_journal_file_link_added: "Додано посилання %{label} на значення %{value} (%{storage})" + text_journal_file_link_deleted: "Вилучено посилання %{label} на значення %{old} (%{storage})" text_journal_of: "%{label} %{value}" - text_journal_set_to: Параметр %{label} змінився на %{value} + text_journal_set_to: "Параметр %{label} змінився на %{value}" text_journal_set_with_diff: "%{label} встановлено (%{link})" text_journal_label_value: "%{label} %{value}" - text_latest_note: 'Останній коментар: %{note}' - text_length_between: Довжина між %{min} і %{max} символів. - text_line_separated: Дозволено кілька значень (по одному значенню в рядок). - text_load_default_configuration: Завантажити Конфігурацію по замовчуванню + text_latest_note: "Останній коментар: %{note}" + text_length_between: "Довжина між %{min} і %{max} символів." + text_line_separated: "Дозволено кілька значень (по одному значенню в рядок)." + text_load_default_configuration: "Завантажити Конфігурацію по замовчуванню" text_no_roles_defined: Не визначено жодної ролі. - text_no_access_tokens_configurable: Немає маркерів доступу, які можна налаштувати. - text_no_configuration_data: |- - Роль, типи, пакет робочі статуси і процес ще не налаштований. - Настійно рекомендується завантажити налаштування за замовчуванням. Ви зможете змінити його тільки один раз. - text_no_notes: Для цього робочого пакету немає коментарів. - text_notice_too_many_values_are_inperformant: 'Примітка: Відображення понад 100 - елементів на сторінці може збільшити час завантаження сторінки.' - text_notice_security_badge_displayed_html: 'Примітка: якщо цей параметр увімкнено, - на екрані з''явиться значок із статусом інсталяції %{information_panel_label} панелі - адміністрування та на головній сторінці. Він відображається лише адміністраторам.
- Значок перевірить поточну версію OpenProject на основі офіційної бази даних випуску - OpenProject, щоб сповістити вас про будь-які оновлення або відомі уразливості. - Щоб отримати додаткові відомості про те, що надає перевірка, які дані потрібні - для надання доступних оновлень, та про те, як вимкнути цю перевірку, відвідайте - сторінку конфігураційна документація. - - ' - text_own_membership_delete_confirmation: |- - Ви збираєтесь видалити деякі або всі права, через що можуть зникнути права на редагування цього проекту. - Ви впевнені що хочете продовжити? - text_permanent_delete_confirmation_checkbox_label: Я розумію, що це видалення не - можна відмінити - text_permanent_remove_confirmation_checkbox_label: Я розумію, що вилучення не можна - буде скасувати - text_plugin_assets_writable: Каталог ресурсів модулів доступний для запису - text_powered_by: Працює на %{link} - text_project_identifier_info: Допускаються тільки рядкові малі букви (a-z), цифри, - тире та нижнє підкреслення. Початок має бути з малої літери. - text_reassign: 'Перепризначити робочому пакету:' - text_regexp_multiline: Реестр застосовується в багаторядковому режимі. наприклад, - --- --- - text_repository_usernames_mapping: |- - Виберіть або оновіть користувача OpenProject, зіставленого з кожним ім'ям користувача в журналі репозиторію. - Користувачі з таким самим ім'ям користувача або електронною поштою OpenProject автоматично відображаються. + text_no_access_tokens_configurable: "Немає маркерів доступу, які можна налаштувати." + text_no_configuration_data: "Роль, типи, пакет робочі статуси і процес ще не налаштований.\nНастійно рекомендується завантажити налаштування за замовчуванням. Ви зможете змінити його тільки один раз." + text_no_notes: "Для цього робочого пакету немає коментарів." + text_notice_too_many_values_are_inperformant: "Примітка: Відображення понад 100 елементів на сторінці може збільшити час завантаження сторінки." + text_notice_security_badge_displayed_html: > + Примітка: якщо цей параметр увімкнено, на екрані з'явиться значок із статусом інсталяції %{information_panel_label} панелі адміністрування та на головній сторінці. Він відображається лише адміністраторам.
Значок перевірить поточну версію OpenProject на основі офіційної бази даних випуску OpenProject, щоб сповістити вас про будь-які оновлення або відомі уразливості. Щоб отримати додаткові відомості про те, що надає перевірка, які дані потрібні для надання доступних оновлень, та про те, як вимкнути цю перевірку, відвідайте сторінку конфігураційна документація. + text_own_membership_delete_confirmation: "Ви збираєтесь видалити деякі або всі права, через що можуть зникнути права на редагування цього проекту.\nВи впевнені що хочете продовжити?" + text_permanent_delete_confirmation_checkbox_label: "Я розумію, що це видалення не можна відмінити" + text_permanent_remove_confirmation_checkbox_label: "Я розумію, що вилучення не можна буде скасувати" + text_plugin_assets_writable: "Каталог ресурсів модулів доступний для запису" + text_powered_by: "Працює на %{link}" + text_project_identifier_info: "Допускаються тільки рядкові малі букви (a-z), цифри, тире та нижнє підкреслення. Початок має бути з малої літери." + text_reassign: "Перепризначити робочому пакету:" + text_regexp_multiline: 'Реестр застосовується в багаторядковому режимі. наприклад, --- ---' + text_repository_usernames_mapping: "Виберіть або оновіть користувача OpenProject, зіставленого з кожним ім'ям користувача в журналі репозиторію.\nКористувачі з таким самим ім'ям користувача або електронною поштою OpenProject автоматично відображаються." text_status_changed_by_changeset: " Застосовується в наборі змін %{value}" - text_table_difference_description: У цій таблиці наведений єдиний %{entries}. Ви - можете переглянути різницю між будь-якими двома записами, спочатку поставивши - відповідні прапорці в таблиці. При натисканні на кнопку внизу таблиці будуть показані - відмінності. + text_table_difference_description: "У цій таблиці наведений єдиний %{entries}. Ви можете переглянути різницю між будь-якими двома записами, спочатку поставивши відповідні прапорці в таблиці. При натисканні на кнопку внизу таблиці будуть показані відмінності." text_time_logged_by_changeset: " Застосовується в наборі змін %{value}" - text_tip_work_package_begin_day: робочий пакет починається цього дня - text_tip_work_package_begin_end_day: початок і закінчення робочого пакету цього - дня - text_tip_work_package_end_day: робочий пакет закінчується цього дня - text_type_no_workflow: Для цього типу не визначено робочий процес - text_unallowed_characters: Недозволені символи + text_tip_work_package_begin_day: "робочий пакет починається цього дня" + text_tip_work_package_begin_end_day: "початок і закінчення робочого пакету цього дня" + text_tip_work_package_end_day: "робочий пакет закінчується цього дня" + text_type_no_workflow: "Для цього типу не визначено робочий процес" + text_unallowed_characters: "Недозволені символи" text_user_invited: Користувача запрошено та очікує реєстрації. text_user_wrote: "%{value} написав:" - text_wrote: написав(-ла) - text_warn_on_leaving_unsaved: Робочий пакет містить незбережений текст, який буде - втрачено, якщо ви залишите цю сторінку. - text_what_did_you_change_click_to_add_comment: Що ви змінили? Натисніть, щоб додати - коментар - text_wiki_destroy_confirmation: Ви впевнені що хочете видалити цю Вікі і весь її - вміст? - text_wiki_page_destroy_children: Видалення дочірніх сторінок і всі їх нащадки - text_wiki_page_destroy_question: На цій сторінці є %{descendants} дочірні сторінки - та нащадки. Що ти хочеш робити? - text_wiki_page_nullify_children: Майте дочірні сторінки як кореневі сторінки - text_wiki_page_reassign_children: Перепризначити дочірніх сторінок до батьківського - сторінці - text_workflow_edit: Виберіть роль і тип для редагування робочого процесу - text_zoom_in: Збільшити масштаб - text_zoom_out: Зменшити масштаб - text_setup_mail_configuration: Налаштуйте постачальника послуг електронної пошти + text_wrote: "написав(-ла)" + text_warn_on_leaving_unsaved: "Робочий пакет містить незбережений текст, який буде втрачено, якщо ви залишите цю сторінку." + text_what_did_you_change_click_to_add_comment: "Що ви змінили? Натисніть, щоб додати коментар" + text_wiki_destroy_confirmation: "Ви впевнені що хочете видалити цю Вікі і весь її вміст?" + text_wiki_page_destroy_children: "Видалення дочірніх сторінок і всі їх нащадки" + text_wiki_page_destroy_question: "На цій сторінці є %{descendants} дочірні сторінки та нащадки. Що ти хочеш робити?" + text_wiki_page_nullify_children: "Майте дочірні сторінки як кореневі сторінки" + text_wiki_page_reassign_children: "Перепризначити дочірніх сторінок до батьківського сторінці" + text_workflow_edit: "Виберіть роль і тип для редагування робочого процесу" + text_zoom_in: "Збільшити масштаб" + text_zoom_out: "Зменшити масштаб" + text_setup_mail_configuration: "Налаштуйте постачальника послуг електронної пошти" help_texts: views: - project: "%{plural} завжди вкладаються в проєкт. Тут можна вибрати лише проєкти - з активним модулем %{plural}. Після створення проєкту %{singular} ви зможете - додавати в нього пакети робіт з інших проєктів.\n" - public: Опублікуйте це подання, надавши доступ до нього. Користувачі з дозволом - «Керування загальнодоступними поданнями» можуть змінювати або вилучати загальнодоступні - запити. Це не впливає на видимість результатів пакетів робіт у цьому поданні, - і залежно від дозволів користувачі можуть бачити різні результати. - favoured: Позначте це подання як улюблене й додайте на бічну панель збережених - подань ліворуч. + project: > + %{plural} завжди вкладаються в проєкт. Тут можна вибрати лише проєкти з активним модулем %{plural}. Після створення проєкту %{singular} ви зможете додавати в нього пакети робіт з інших проєктів. + public: "Опублікуйте це подання, надавши доступ до нього. Користувачі з дозволом «Керування загальнодоступними поданнями» можуть змінювати або вилучати загальнодоступні запити. Це не впливає на видимість результатів пакетів робіт у цьому поданні, і залежно від дозволів користувачі можуть бачити різні результати." + favoured: "Позначте це подання як улюблене й додайте на бічну панель збережених подань ліворуч." time: - am: до полудня + am: "до полудня" formats: default: "%m/%d/%Y %I:%M%p" long: "%B%d,%Y%H:%M%H:%M" short: "%d %b %H:%M" time: "%I:%M %p" - pm: після обіду + pm: "після обіду" timeframe: - show: Показувати часові рамки - end: до - start: від - title_remove_and_delete_user: Вилучіть запрошеного користувача з проекту та видаліть - його. - title_enterprise_upgrade: Оновлення, щоб розблокувати більше користувачів. - tooltip_user_default_timezone: 'Типовий часовий пояс для нових користувачів. Може - бути змінено в налаштуваннях користувача. - - ' - tooltip_resend_invitation: 'Надіслати ще одне запрошення з новим маркером, якщо - старий минув або користувач не отримав оригінальну електронну адресу. Можна також - використовувати для активних користувачів вибір нового методу аутентифікації. - При використанні активних користувачів їх статус буде змінено на "запрошений". - - ' + show: "Показувати часові рамки" + end: "до" + start: "від" + title_remove_and_delete_user: Вилучіть запрошеного користувача з проекту та видаліть його. + title_enterprise_upgrade: "Оновлення, щоб розблокувати більше користувачів." + tooltip_user_default_timezone: > + Типовий часовий пояс для нових користувачів. Може бути змінено в налаштуваннях користувача. + tooltip_resend_invitation: > + Надіслати ще одне запрошення з новим маркером, якщо старий минув або користувач не отримав оригінальну електронну адресу. Можна також використовувати для активних користувачів вибір нового методу аутентифікації. При використанні активних користувачів їх статус буде змінено на "запрошений". tooltip: - setting_email_login: 'Якщо увімкнено, користувач не зможе вибрати реєстраційний - запис під час реєстрації. Замість цього їхня адреса електронної пошти слугуватиме - логіном. Адміністратор може змінити вхід окремо. - - ' + setting_email_login: > + Якщо увімкнено, користувач не зможе вибрати реєстраційний запис під час реєстрації. Замість цього їхня адреса електронної пошти слугуватиме логіном. Адміністратор може змінити вхід окремо. queries: apply_filter: Застосувати попередньо налаштований фільтр configure_view: heading: Налаштувати режим перегляду columns: - input_label: Додати стовпці - input_placeholder: Вибрати стовпець - drag_area_label: Керування стовпцями і їх перевпорядкування + input_label: "Додати стовпці" + input_placeholder: "Вибрати стовпець" + drag_area_label: "Керування стовпцями і їх перевпорядкування" sort_by: automatic: - heading: Автоматично - description: Упорядкуйте %{plural} за одним або кількома критеріями сортування. - Результати попереднього сортування буде втрачено. + heading: "Автоматично" + description: "Упорядкуйте %{plural} за одним або кількома критеріями сортування. Результати попереднього сортування буде втрачено." top_menu: - additional_resources: Додаткові ресурси - getting_started: Починаємо - help_and_support: Допомога та підтримка - total_progress: Загальний прогрес + additional_resources: "Додаткові ресурси" + getting_started: "Починаємо" + help_and_support: "Допомога та підтримка" + total_progress: "Загальний прогрес" user: - all: всі - active: активний - activate: Активувати - activate_and_reset_failed_logins: Активація та скидання невдалих входів - authentication_provider: Провайдер аутентифікації - identity_url_text: Внутрішній унікальний ідентифікатор, наданий постачальником - послуг автентифікації. - authentication_settings_disabled_due_to_external_authentication: 'Цей користувач - авторизирується через зовнішнього постачальника автентифікації, що немає паролів - в OpenProject бути змінений. - - ' - authorization_rejected: Вам не дозволено входити. - assign_random_password: Призначити випадковий пароль (надіслано користувачу електронною - поштою) - blocked: тимчасово заблоковано + all: "всі" + active: "активний" + activate: "Активувати" + activate_and_reset_failed_logins: "Активація та скидання невдалих входів" + authentication_provider: "Провайдер аутентифікації" + identity_url_text: "Внутрішній унікальний ідентифікатор, наданий постачальником послуг автентифікації." + authentication_settings_disabled_due_to_external_authentication: > + Цей користувач авторизирується через зовнішнього постачальника автентифікації, що немає паролів в OpenProject бути змінений. + authorization_rejected: "Вам не дозволено входити." + assign_random_password: "Призначити випадковий пароль (надіслано користувачу електронною поштою)" + blocked: "тимчасово заблоковано" blocked_num_failed_logins: - one: тимчасово заблоковано (одна невдала спроба входу) - few: тимчасово заблоковано (%{count} спроби входу в систему) - many: тимчасово заблоковано (%{count} спроби входу в систему) - other: тимчасово заблоковано (%{count} спроби входу в систему) - confirm_status_change: Ви збираєтеся змінити статус %{name} Ви дійсно бажаєте - продовжити? - deleted: Видалити користувача - error_status_change_self: Ви не можете змінити власний статус користувача. - error_admin_change_on_non_admin: Тільки адміністратори можуть змінювати статус - користувачів-адміністраторів. - error_status_change_failed: 'Не вдалося змінити статус користувача через такі - помилки: %{errors}' + one: "тимчасово заблоковано (одна невдала спроба входу)" + few: "тимчасово заблоковано (%{count} спроби входу в систему)" + many: "тимчасово заблоковано (%{count} спроби входу в систему)" + other: "тимчасово заблоковано (%{count} спроби входу в систему)" + confirm_status_change: "Ви збираєтеся змінити статус %{name} Ви дійсно бажаєте продовжити?" + deleted: "Видалити користувача" + error_status_change_self: "Ви не можете змінити власний статус користувача." + error_admin_change_on_non_admin: "Тільки адміністратори можуть змінювати статус користувачів-адміністраторів." + error_status_change_failed: "Не вдалося змінити статус користувача через такі помилки: %{errors}" invite: Запросити користувача електронною поштою invited: запрошені - lock: Блокування постійно - locked: Блокування постійно - no_login: Цей користувач автентифікується через логін за допомогою пароля. Оскільки - вона вимкнена, вони не можуть увійти. + lock: "Блокування постійно" + locked: "Блокування постійно" + no_login: "Цей користувач автентифікується через логін за допомогою пароля. Оскільки вона вимкнена, вони не можуть увійти." password_change_unsupported: Зміна пароля не підтримується. - registered: Зареєстровано - reset_failed_logins: Скинути помилки входу + registered: "Зареєстровано" + reset_failed_logins: "Скинути помилки входу" status_user_and_brute_force: "%{user} і %{brute_force}" - status_change: Зміна стану - text_change_disabled_for_provider_login: Ім’я і електронну адресу вказав ваш постачальник - облікових даних, тому їх не можна змінити. - unlock: Розблокувати - unlock_and_reset_failed_logins: Розблокувати та скинути помилки входу до системи - error_cannot_delete_user: Користувача не можна видалити - version_status_closed: закрито - version_status_locked: Заблоковано - version_status_open: відкрити + status_change: "Зміна стану" + text_change_disabled_for_provider_login: "Ім’я і електронну адресу вказав ваш постачальник облікових даних, тому їх не можна змінити." + unlock: "Розблокувати" + unlock_and_reset_failed_logins: "Розблокувати та скинути помилки входу до системи" + error_cannot_delete_user: "Користувача не можна видалити" + version_status_closed: "закрито" + version_status_locked: "Заблоковано" + version_status_open: "відкрити" note: Замітка - note_password_login_disabled: Вхід до пароля вимкнено користувачем %{configuration} + note_password_login_disabled: "Вхід до пароля вимкнено користувачем %{configuration}" warning: Попередження warning_attachments_not_saved: "%{count} Не вдалося зберегти файл (файли)." - warning_imminent_user_limit: 'Ви запросили більше користувачів, ніж підтримується - вашим поточним планом. Запрошені користувачі можуть не мати змоги приєднатися - до вашого середовища OpenProject. Будь ласка оновіть - свій план або заблокувати існуючих користувачів, щоб дозволити запрошені - та зареєстровані користувачі приєднатися. + warning_imminent_user_limit: > + Ви запросили більше користувачів, ніж підтримується вашим поточним планом. Запрошені користувачі можуть не мати змоги приєднатися до вашого середовища OpenProject. Будь ласка оновіть свій план або заблокувати існуючих користувачів, щоб дозволити запрошені та зареєстровані користувачі приєднатися. + warning_registration_token_expired: | + Термін дії електронної пошти для активації минув. Ми надіслали вам нову %{email} Натисніть посилання в ньому, щоб активувати свій обліковий запис. + warning_user_limit_reached: > + Додавання користувачів призведе до перевищення поточного ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким чином забезпечити доступ до цього екземпляра зовнішнім користувачам. + warning_user_limit_reached_admin: > + Додавання користувачів призведе до перевищення поточного ліміту. Підвищте рівень свого плану, щоб забезпечити доступ до цього екземпляра зовнішнім користувачам. + warning_user_limit_reached_instructions: > + Ви досягли обмеження користувача (%{current}/%{max} активних користувачів). Напишіть на адресу sales@openproject.com, щоб перейти на версію Enterprise і додати більше користувачів. + warning_protocol_mismatch_html: > - ' - warning_registration_token_expired: 'Термін дії електронної пошти для активації - минув. Ми надіслали вам нову %{email} Натисніть посилання в ньому, щоб активувати - свій обліковий запис. - - ' - warning_user_limit_reached: 'Додавання користувачів призведе до перевищення поточного - ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким - чином забезпечити доступ до цього екземпляра зовнішнім користувачам. - - ' - warning_user_limit_reached_admin: 'Додавання користувачів призведе до перевищення - поточного ліміту. Підвищте рівень свого плану, щоб - забезпечити доступ до цього екземпляра зовнішнім користувачам. - - ' - warning_user_limit_reached_instructions: 'Ви досягли обмеження користувача (%{current}/%{max} - активних користувачів). Напишіть на адресу sales@openproject.com, щоб перейти - на версію Enterprise і додати більше користувачів. - - ' - warning_protocol_mismatch_html: '' warning_bar: https_mismatch: - title: Невідповідність налаштувань режиму HTTPS - text_html: 'Значення параметра режиму HTTPS вашого додатка – %{set_protocol}, - але отримано запит %{actual_protocol}. Це призведе до помилок! - Потрібно встановити таке значення конфігурації: %{setting_value}. - Ознайомтеся з документацією зі встановлення, - щоб дізнатися, як налаштувати цю конфігурацію. - - ' + title: "Невідповідність налаштувань режиму HTTPS" + text_html: > + Значення параметра режиму HTTPS вашого додатка – %{set_protocol}, але отримано запит %{actual_protocol}. Це призведе до помилок! Потрібно встановити таке значення конфігурації: %{setting_value}. Ознайомтеся з документацією зі встановлення, щоб дізнатися, як налаштувати цю конфігурацію. hostname_mismatch: - title: Невідповідність налаштуванням імені хосту - text_html: 'Ваш додаток запущено з іменем хосту %{set_hostname}, - але в запиті використовується %{actual_hostname}. Це призведе - до помилок! Виберіть Системні налаштування та - змініть параметр «Ім’я хосту» на правильний. - - ' - menu_item: Пункт меню - menu_item_setting: Видимість - wiki_menu_item_for: Пункт меню для вікі-сторінки %{title} - wiki_menu_item_setting: Видимість - wiki_menu_item_new_main_item_explanation: 'Ви видаляєте лише головний пункт меню - вікі. Тепер ви повинні вибрати вікі-сторінку, для якої буде створено новий головний - елемент. Щоб видалити вікі, модуль wiki може бути відключений адміністраторами - проекту. - - ' - wiki_menu_item_delete_not_permitted: Пункт меню вікі лише з вікі-сторінки не можна - видалити. + title: "Невідповідність налаштуванням імені хосту" + text_html: > + Ваш додаток запущено з іменем хосту %{set_hostname}, але в запиті використовується %{actual_hostname}. Це призведе до помилок! Виберіть Системні налаштування та змініть параметр «Ім’я хосту» на правильний. + menu_item: "Пункт меню" + menu_item_setting: "Видимість" + wiki_menu_item_for: 'Пункт меню для вікі-сторінки %{title}' + wiki_menu_item_setting: "Видимість" + wiki_menu_item_new_main_item_explanation: > + Ви видаляєте лише головний пункт меню вікі. Тепер ви повинні вибрати вікі-сторінку, для якої буде створено новий головний елемент. Щоб видалити вікі, модуль wiki може бути відключений адміністраторами проекту. + wiki_menu_item_delete_not_permitted: Пункт меню вікі лише з вікі-сторінки не можна видалити. + #TODO: merge with work_packages top level key work_package: - updated_automatically_by_child_changes: '_Поповнюється автоматично шляхом зміни - значень у робочому пакеті для дітей %{child} _ - - ' + updated_automatically_by_child_changes: | + _Поповнюється автоматично шляхом зміни значень у робочому пакеті для дітей %{child} _ destroy: - info: Видалення робочого пакету є незворотною дією. - title: Видаліть робочий пакет + info: "Видалення робочого пакету є незворотною дією." + title: "Видаліть робочий пакет" progress: - label_note: Примітка. + label_note: "Примітка." modal: - work_based_help_text: Кожне поле автоматично обчислюється на основі двох інших, - коли це можливо. - status_based_help_text: Значення параметра «% завершення» визначається статусом - пакета робіт. - migration_warning_text: У режимі обчислення прогресу на основі робіт значення - параметра «% завершення» не можна встановити вручну й прив’язати до значення - параметра «Робота». Наявне значення збережено, але його не можна змінити. - Спочатку визначте параметр «Робота». + work_based_help_text: "Кожне поле автоматично обчислюється на основі двох інших, коли це можливо." + status_based_help_text: "Значення параметра «% завершення» визначається статусом пакета робіт." + migration_warning_text: "У режимі обчислення прогресу на основі робіт значення параметра «% завершення» не можна встановити вручну й прив’язати до значення параметра «Робота». Наявне значення збережено, але його не можна змінити. Спочатку визначте параметр «Робота»." derivation_hints: done_ratio: - cleared_because_remaining_work_is_empty: Очищено, оскільки атрибут «Залишок - роботи» пустий. - cleared_because_work_is_0h: Очищено, оскільки атрибут «Робота» дорівнює - 0 год. - derived: Виведено з атрибутів «Робота» й «Залишок роботи». + cleared_because_remaining_work_is_empty: "Очищено, оскільки атрибут «Залишок роботи» пустий." + cleared_because_work_is_0h: "Очищено, оскільки атрибут «Робота» дорівнює 0 год." + derived: "Виведено з атрибутів «Робота» й «Залишок роботи»." estimated_hours: - cleared_because_remaining_work_is_empty: Очищено, оскільки атрибут «Залишок - роботи» пустий. - derived: Виведено з атрибутів «Залишок роботи» й «% завершення». - same_as_remaining_work: Збігається зі значенням атрибута «Залишок роботи». + cleared_because_remaining_work_is_empty: "Очищено, оскільки атрибут «Залишок роботи» пустий." + derived: "Виведено з атрибутів «Залишок роботи» й «% завершення»." + same_as_remaining_work: "Збігається зі значенням атрибута «Залишок роботи»." remaining_hours: - cleared_because_work_is_empty: Очищено, оскільки атрибут «Робота» пустий. - cleared_because_percent_complete_is_empty: Очищено, оскільки атрибут «% - завершення» пустий. - decreased_by_delta_like_work: Зменшено на %{delta} відповідно до зміни атрибута - «Робота». - derived: Виведено з атрибутів «Робота» й «% завершення». - increased_by_delta_like_work: Збільшено на %{delta} відповідно до зміни - атрибута «Робота». - same_as_work: Збігається зі значенням атрибута «Робота». + cleared_because_work_is_empty: "Очищено, оскільки атрибут «Робота» пустий." + cleared_because_percent_complete_is_empty: "Очищено, оскільки атрибут «% завершення» пустий." + decreased_by_delta_like_work: "Зменшено на %{delta} відповідно до зміни атрибута «Робота»." + derived: "Виведено з атрибутів «Робота» й «% завершення»." + increased_by_delta_like_work: "Збільшено на %{delta} відповідно до зміни атрибута «Робота»." + same_as_work: "Збігається зі значенням атрибута «Робота»." permissions: - comment: Коментування - comment_description: Може переглядати й коментувати цей пакет робіт. - edit: Редагування - edit_description: Може переглядати, коментувати й редагувати цей пакет робіт. - view: Перегляд - view_description: Може переглядати цей пакет робіт. + comment: "Коментування" + comment_description: "Може переглядати й коментувати цей пакет робіт." + edit: "Редагування" + edit_description: "Може переглядати, коментувати й редагувати цей пакет робіт." + view: "Перегляд" + view_description: "Може переглядати цей пакет робіт." reminders: - label_remind_at: Дата - note_placeholder: Навіщо ви встановлюєте це нагадування? - create_success_message: 'Нагадування встановлено. Ви отримаєте сповіщення про - цей пакет робіт у такий час: %{reminder_time}.' - success_update_message: Нагадування оновлено. - success_deletion_message: Нагадування видалено. + label_remind_at: "Дата" + note_placeholder: "Навіщо ви встановлюєте це нагадування?" + create_success_message: "Нагадування встановлено. Ви отримаєте сповіщення про цей пакет робіт у такий час: %{reminder_time}." + success_update_message: "Нагадування оновлено." + success_deletion_message: "Нагадування видалено." sharing: count: - zero: 0 користувачів - one: 1 користувач - other: 'Користувачів: %{count}' + zero: "0 користувачів" + one: "1 користувач" + other: "Користувачів: %{count}" filter: - project_member: Учасник проєкту - not_project_member: Не учасник проєкту - project_group: Група проєкту - not_project_group: Не група проєкту - user: Користувач - group: Група - role: Роль - type: Тип - denied: У вас немає дозволу надавати спільний доступ до %{entities}. - label_search: Шукати й запрошувати користувачів - label_search_placeholder: Пошук за користувачем або електронною адресою - label_toggle_all: Перемкнути всі спільні ресурси - remove: Вилучити - share: Надати спільний доступ - text_empty_search_description: Користувачів за поточними умовами фільтра не знайдено. - text_empty_search_header: Результатів за запитом не знайдено. - text_empty_state_description: Доступ до цього %{entity} ще нікому не надано. - text_empty_state_header: Без спільного доступу - text_user_limit_reached: Додавання користувачів призведе до перевищення поточного - ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким - чином забезпечити доступ до цього %{entity} зовнішнім користувачам. - text_user_limit_reached_admins: Додавання користувачів призведе до перевищення - поточного ліміту. Підвищте рівень свого плану, - щоб додати користувачів. - warning_user_limit_reached: 'Додавання користувачів призведе до перевищення поточного - ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким - чином забезпечити доступ до цього %{entity} зовнішнім користувачам. - - ' - warning_user_limit_reached_admin: 'Додавання користувачів призведе до перевищення - поточного ліміту. Підвищте рівень свого плану, - щоб забезпечити доступ до цього %{entity} зовнішнім користувачам. - - ' - warning_no_selected_user: Виберіть користувачів, яким потрібно надати спільний - доступ до цього %{entity} - warning_locked_user: Користувача %{user} заблоковано, і йому не можна надати спільний - доступ + project_member: "Учасник проєкту" + not_project_member: "Не учасник проєкту" + project_group: "Група проєкту" + not_project_group: "Не група проєкту" + user: "Користувач" + group: "Група" + role: "Роль" + type: "Тип" + denied: "У вас немає дозволу надавати спільний доступ до %{entities}." + label_search: "Шукати й запрошувати користувачів" + label_search_placeholder: "Пошук за користувачем або електронною адресою" + label_toggle_all: "Перемкнути всі спільні ресурси" + remove: "Вилучити" + share: "Надати спільний доступ" + text_empty_search_description: "Користувачів за поточними умовами фільтра не знайдено." + text_empty_search_header: "Результатів за запитом не знайдено." + text_empty_state_description: "Доступ до цього %{entity} ще нікому не надано." + text_empty_state_header: "Без спільного доступу" + text_user_limit_reached: "Додавання користувачів призведе до перевищення поточного ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким чином забезпечити доступ до цього %{entity} зовнішнім користувачам." + text_user_limit_reached_admins: 'Додавання користувачів призведе до перевищення поточного ліміту. Підвищте рівень свого плану, щоб додати користувачів.' + warning_user_limit_reached: > + Додавання користувачів призведе до перевищення поточного ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким чином забезпечити доступ до цього %{entity} зовнішнім користувачам. + warning_user_limit_reached_admin: > + Додавання користувачів призведе до перевищення поточного ліміту. Підвищте рівень свого плану, щоб забезпечити доступ до цього %{entity} зовнішнім користувачам. + warning_no_selected_user: "Виберіть користувачів, яким потрібно надати спільний доступ до цього %{entity}" + warning_locked_user: "Користувача %{user} заблоковано, і йому не можна надати спільний доступ" user_details: - locked: Заблокований користувач - invited: 'Запрошення надіслано. ' - resend_invite: Переслати. - invite_resent: Запрошення надіслано повторно - not_project_member: Не учасник проєкту - project_group: Учасники групи можуть мати додаткові повноваження (як учасники - проєкту) - not_project_group: Група (спільна для всіх учасників) - additional_privileges_project: Може мати додаткові повноваження (як учасник - проєкту) - additional_privileges_group: Може мати додаткові повноваження (як учасник групи) - additional_privileges_project_or_group: Може мати додаткові повноваження (як - учасник проєкту або групи) + locked: "Заблокований користувач" + invited: "Запрошення надіслано. " + resend_invite: "Переслати." + invite_resent: "Запрошення надіслано повторно" + not_project_member: "Не учасник проєкту" + project_group: "Учасники групи можуть мати додаткові повноваження (як учасники проєкту)" + not_project_group: "Група (спільна для всіх учасників)" + additional_privileges_project: "Може мати додаткові повноваження (як учасник проєкту)" + additional_privileges_group: "Може мати додаткові повноваження (як учасник групи)" + additional_privileges_project_or_group: "Може мати додаткові повноваження (як учасник проєкту або групи)" project_queries: - publishing_denied: Ви не маєте дозволу на оприлюднення списків проєктів. - access_warning: Користувачі бачитимуть лише ті проєкти, до яких вони мають доступ. - Спільний доступ до списків проєктів не впливає на дозволи для окремих проєктів. + publishing_denied: "Ви не маєте дозволу на оприлюднення списків проєктів." + access_warning: "Користувачі бачитимуть лише ті проєкти, до яких вони мають доступ. Спільний доступ до списків проєктів не впливає на дозволи для окремих проєктів." user_details: - owner: Власник списку - can_view_because_public: Може переглядати, оскільки спільний доступ до списку - мають усі - can_manage_public_lists: Може редагувати завдяки, оскільки має глобальні дозволи + owner: "Власник списку" + can_view_because_public: "Може переглядати, оскільки спільний доступ до списку мають усі" + can_manage_public_lists: "Може редагувати завдяки, оскільки має глобальні дозволи" public_flag: - label: Надати спільний доступ усім користувачам екземпляра %{instance_name} - caption: Усі можуть переглядати цей список проєктів. Змінити його можуть користувачі - з глобальними дозволами на редагування. + label: "Надати спільний доступ усім користувачам екземпляра %{instance_name}" + caption: "Усі можуть переглядати цей список проєктів. Змінити його можуть користувачі з глобальними дозволами на редагування." blank_state: public: - header: Спільний доступ надано всім - description: Усі можуть переглядати цей список проєктів. Ви також можете - додати окремих користувачів із розширеними дозволами. + header: "Спільний доступ надано всім" + description: "Усі можуть переглядати цей список проєктів. Ви також можете додати окремих користувачів із розширеними дозволами." private: - header: 'Без спільного доступу: приватний' - description: Доступ до цього проєкту поки маєте лише ви. + header: "Без спільного доступу: приватний" + description: "Доступ до цього проєкту поки маєте лише ви." permissions: - view: Перегляд - view_description: Може переглядати цей список проєктів. - edit: Редагування - edit_description: Може переглядати, редагувати список проєктів і надавати - спільний доступ до нього. + view: "Перегляд" + view_description: "Може переглядати цей список проєктів." + edit: "Редагування" + edit_description: "Може переглядати, редагувати список проєктів і надавати спільний доступ до нього." upsell: - message: Надавати спільний доступ до списків проєктів окремим користувачам - можна за допомогою доповнення версії Enterprise. + message: "Надавати спільний доступ до списків проєктів окремим користувачам можна за допомогою доповнення версії Enterprise." working_days: - info: 'Під час планування пакетів робіт і життєвих циклів проєктів невибрані дні - пропускаються (і не включаються в кількість днів). Це налаштування можна змінити - на рівні пакета робіт. - - ' - instance_wide_info: 'Під час планування пакетів робіт дати, додані в список нижче, - вважаються неробочим днями й пропускаються. - - ' - change_button: Змінити робочі дні - warning: 'Якщо змінити дні тижня, які вважаються робочими чи неробочими, це може - вплинути на дати початку й завершення всіх пакетів робіт і життєвих циклів проєктів - в усіх проєктах цього екземпляра. - - ' + info: > + Під час планування пакетів робіт і життєвих циклів проєктів невибрані дні пропускаються (і не включаються в кількість днів). Це налаштування можна змінити на рівні пакета робіт. + instance_wide_info: > + Під час планування пакетів робіт дати, додані в список нижче, вважаються неробочим днями й пропускаються. + change_button: "Змінити робочі дні" + warning: > + Якщо змінити дні тижня, які вважаються робочими чи неробочими, це може вплинути на дати початку й завершення всіх пакетів робіт і життєвих циклів проєктів в усіх проєктах цього екземпляра. journal_note: changed: _**Робочі дні** змінено (%{changes})._ days: @@ -6573,81 +5429,67 @@ uk: dates: working: "%{date} зараз робочий день" non_working: "%{date} зараз неробочий день" - nothing_to_preview: Нічого для перегляду + nothing_to_preview: "Нічого для перегляду" api_v3: attributes: - property: Властивість + property: "Властивість" errors: - code_400: 'Поганий запит: %{message}' - code_401: Щоб отримати доступ до цього ресурсу, потрібно пройти аутентифікацію. - code_401_wrong_credentials: Ви не надати правильні облікові дані. - code_403: Ви не маєте права на доступ до цього ресурсу. - code_404: Не вдалося знайти потрібний ресурс. - code_409: Не вдалося оновити ресурс через конфліктуючі зміни. - code_429: Забагато запитів. Повторіть спробу пізніше. - code_500: Сталася внутрішня помилка. - code_500_outbound_request_failure: 'Вихідний запит до іншого ресурсу завершився - помилкою з кодом стану: %{status_code}.' - code_500_missing_enterprise_token: Цей запит не можна обробити через недійсний - або відсутній маркер версії Enterprise. + code_400: "Поганий запит: %{message}" + code_401: "Щоб отримати доступ до цього ресурсу, потрібно пройти аутентифікацію." + code_401_wrong_credentials: "Ви не надати правильні облікові дані." + code_403: "Ви не маєте права на доступ до цього ресурсу." + code_404: "Не вдалося знайти потрібний ресурс." + code_409: "Не вдалося оновити ресурс через конфліктуючі зміни." + code_429: "Забагато запитів. Повторіть спробу пізніше." + code_500: "Сталася внутрішня помилка." + code_500_outbound_request_failure: "Вихідний запит до іншого ресурсу завершився помилкою з кодом стану: %{status_code}." + code_500_missing_enterprise_token: "Цей запит не можна обробити через недійсний або відсутній маркер версії Enterprise." bad_request: - emoji_reactions_activity_type_not_supported: Дія такого типу не підтримує - реакцію за допомогою емодзі. - invalid_link: Посилання, пов’язане з ключем «%{key}», недійсне. - links_not_an_object: _links має бути об’єктом JSON. + emoji_reactions_activity_type_not_supported: "Дія такого типу не підтримує реакцію за допомогою емодзі." + invalid_link: "Посилання, пов’язане з ключем «%{key}», недійсне." + links_not_an_object: "_links має бути об’єктом JSON." conflict: - multiple_reminders_not_allowed: Можна одночасно встановити лише одне нагадування - для пакета робіт. Видаліть або оновіть наявне нагадування. + multiple_reminders_not_allowed: |- + Можна одночасно встановити лише одне нагадування для пакета робіт. Видаліть або оновіть наявне нагадування. not_found: - work_package: Пакет робіт, який ви шукаєте, не можна знайти або його видалено. - reminder: Нагадування, яке ви шукаєте, не вдалося знайти. Можливо, його видалено. + work_package: "Пакет робіт, який ви шукаєте, не можна знайти або його видалено." + reminder: "Нагадування, яке ви шукаєте, не вдалося знайти. Можливо, його видалено." expected: - date: YYYY-MM-DD (ISO 8601 date only) - datetime: YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (будь-який сумісний формат ISO - 8601 дати й часу) - duration: ISO 8601 тривалість - invalid_content_type: Очікуваний тип CONTENT-TYPE %{content_type} але отримав - %{actual}. - invalid_format: 'Недійсний формат властивості %{property}: Очікуваний формат - на зразок %{expected_format} but got %{actual}' - invalid_json: Запит не може бути проаналізований як JSON. - invalid_relation: Відношення недійсне. - invalid_resource: За нерухомість %{property} посилання на зразок %{expected} - очікується, але потрапив%{actual}. + date: "YYYY-MM-DD (ISO 8601 date only)" + datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (будь-який сумісний формат ISO 8601 дати й часу)" + duration: "ISO 8601 тривалість" + invalid_content_type: "Очікуваний тип CONTENT-TYPE %{content_type} але отримав %{actual}." + invalid_format: "Недійсний формат властивості %{property}: Очікуваний формат на зразок %{expected_format} but got %{actual}" + invalid_json: "Запит не може бути проаналізований як JSON." + invalid_relation: "Відношення недійсне." + invalid_resource: "За нерухомість %{property} посилання на зразок %{expected} очікується, але потрапив%{actual}." invalid_signal: - embed: 'Запитане вбудування %{invalid} не підтримується. Підтримувані вбудування: - %{supported}.' - select: 'Запитаний варіант %{invalid} не підтримується. Підтримувані варіанти: - %{supported}.' - invalid_user_status_transition: Поточний статус облікового запису користувача - не дозволяє цю операцію. - missing_content_type: не вказано - missing_property: Немає властивості «%{property}». - missing_request_body: Не було органу запиту. - missing_or_malformed_parameter: Параметр запиту %{parameter} відсутній або неправильно - сформований. - multipart_body_error: Текст запиту не містить очікуваного складових частин. - multiple_errors: Було порушено декілька обмежень поля. - unable_to_create_attachment: Не вдалося створити вкладення - unable_to_create_attachment_permissions: Вкладення не вдалося зберегти через - відсутність дозволів на файлову систему + embed: "Запитане вбудування %{invalid} не підтримується. Підтримувані вбудування: %{supported}." + select: "Запитаний варіант %{invalid} не підтримується. Підтримувані варіанти: %{supported}." + invalid_user_status_transition: "Поточний статус облікового запису користувача не дозволяє цю операцію." + missing_content_type: "не вказано" + missing_property: "Немає властивості «%{property}»." + missing_request_body: "Не було органу запиту." + missing_or_malformed_parameter: "Параметр запиту %{parameter} відсутній або неправильно сформований." + multipart_body_error: "Текст запиту не містить очікуваного складових частин." + multiple_errors: "Було порушено декілька обмежень поля." + unable_to_create_attachment: "Не вдалося створити вкладення" + unable_to_create_attachment_permissions: "Вкладення не вдалося зберегти через відсутність дозволів на файлову систему" user: - name_readonly: Атрибут «Повне ім’я» (name) доступний лише для читання. Зміни - можна записати за допомогою атрибутів «Ім’я» (firstname) і «Прізвище» (lastname). + name_readonly: "Атрибут «Повне ім’я» (name) доступний лише для читання. Зміни можна записати за допомогою атрибутів «Ім’я» (firstname) і «Прізвище» (lastname)." render: - context_not_parsable: Контексті не посилання на ресурс. - unsupported_context: Даний ресурс не підтримується як контекст. - context_object_not_found: Не можу знайти ресурс з урахуванням контексту. + context_not_parsable: "Контексті не посилання на ресурс." + unsupported_context: "Даний ресурс не підтримується як контекст." + context_object_not_found: "Не можу знайти ресурс з урахуванням контексту." validation: - due_date: Дата закінчення не може бути встановлена на початкових робочих пакетах. - invalid_user_assigned_to_work_package: Вибраному користувачеві не дозволяється - %{property} для цього робочого пакету. - start_date: Дата початку не може бути встановлена на базових робочих пакетах. + due_date: "Дата закінчення не може бути встановлена на початкових робочих пакетах." + invalid_user_assigned_to_work_package: "Вибраному користувачеві не дозволяється %{property} для цього робочого пакету." + start_date: "Дата початку не може бути встановлена на базових робочих пакетах." eprops: invalid_gzip: "– недійсний gzip: %{message}" invalid_json: "– недійсний json: %{message}" resources: - schema: Схема + schema: "Схема" undisclosed: parent: 'Нерозкритий: батьківський елемент невидимий через відсутність дозволів.' project: 'Нерозкритий: проєкт невидимий через відсутність дозволів.' @@ -6655,234 +5497,170 @@ uk: definingProject: 'Нерозкритий: проєкт невидимий через відсутність дозволів.' doorkeeper: pre_authorization: - status: Попередня авторизація - auth_url: URL автентифікації - access_token_url: URL маркера доступу + status: "Попередня авторизація" + auth_url: "URL автентифікації" + access_token_url: "URL маркера доступу" errors: messages: + #Common error messages invalid_request: - unknown: У запиті відсутній необхідний параметр, він містить непідтримуваний - параметр або інший варіант. - missing_param: 'Відсутній обов’язковий параметр: %{value}.' - request_not_authorized: Запит потрібно авторизувати. Необхідний параметр - запиту авторизації відсутній або недійсний. - invalid_redirect_uri: Запитаний URI переспрямування пошкоджений або не збігається - з клієнтським URI переспрямування. - unauthorized_client: Клієнт не має права виконувати цей запит за допомогою - цього методу. - access_denied: Власник ресурсів або сервер авторизації відхилив запит. - invalid_scope: Запитувана область дії є недійсною, невідомою або неправильною. - invalid_code_challenge_method: Метод виклику коду повинен бути простим або - S256. - server_error: Сервер авторизації зіткнувся з несподіваною умовою, яка не дозволила - виконати запит. - temporarily_unavailable: Сервер авторизації наразі не може обробити запит - через тимчасове перевантаження або обслуговування сервера. - credential_flow_not_configured: Потік облікових даних не вдався через Doorkeeper.configure.resource_owner_from_credentials - being unconfigured. - resource_owner_authenticator_not_configured: Не вдалося знайти власника ресурсу - через Doorkeeper.configure.resource_owner_authenticator being unconfigured. - admin_authenticator_not_configured: Доступ до адміністративної панелі заборонений - через Doorkeeper.configure.admin_authenticator being unconfigured. - unsupported_response_type: Сервер авторизації не підтримує цей тип відповіді. - unsupported_response_mode: Сервер авторизації не підтримує цей режим відповіді. - invalid_client: Аутентифікація клієнта не вдалася за відстуності клієнта, - не було включено автентифікацію клієнта або непідтримувався метод автентифікації. - invalid_grant: Наданий дозвіл на авторизацію недійсний, минув, анульований, - не відповідає URI перенаправлення, що використовується в запиті на авторизацію, - або був виданий іншому клієнту. - unsupported_grant_type: Тип дозволу авторизації не підтримується сервером - авторизації. + unknown: "У запиті відсутній необхідний параметр, він містить непідтримуваний параметр або інший варіант." + missing_param: "Відсутній обов’язковий параметр: %{value}." + request_not_authorized: "Запит потрібно авторизувати. Необхідний параметр запиту авторизації відсутній або недійсний." + invalid_redirect_uri: "Запитаний URI переспрямування пошкоджений або не збігається з клієнтським URI переспрямування." + unauthorized_client: "Клієнт не має права виконувати цей запит за допомогою цього методу." + access_denied: "Власник ресурсів або сервер авторизації відхилив запит." + invalid_scope: "Запитувана область дії є недійсною, невідомою або неправильною." + invalid_code_challenge_method: "Метод виклику коду повинен бути простим або S256." + server_error: "Сервер авторизації зіткнувся з несподіваною умовою, яка не дозволила виконати запит." + temporarily_unavailable: "Сервер авторизації наразі не може обробити запит через тимчасове перевантаження або обслуговування сервера." + #Configuration error messages + credential_flow_not_configured: "Потік облікових даних не вдався через Doorkeeper.configure.resource_owner_from_credentials being unconfigured." + resource_owner_authenticator_not_configured: "Не вдалося знайти власника ресурсу через Doorkeeper.configure.resource_owner_authenticator being unconfigured." + admin_authenticator_not_configured: "Доступ до адміністративної панелі заборонений через Doorkeeper.configure.admin_authenticator being unconfigured." + #Access grant errors + unsupported_response_type: "Сервер авторизації не підтримує цей тип відповіді." + unsupported_response_mode: "Сервер авторизації не підтримує цей режим відповіді." + #Access token errors + invalid_client: "Аутентифікація клієнта не вдалася за відстуності клієнта, не було включено автентифікацію клієнта або непідтримувався метод автентифікації." + invalid_grant: "Наданий дозвіл на авторизацію недійсний, минув, анульований, не відповідає URI перенаправлення, що використовується в запиті на авторизацію, або був виданий іншому клієнту." + unsupported_grant_type: "Тип дозволу авторизації не підтримується сервером авторизації." invalid_token: - revoked: Маркер доступу скасовано - expired: Термін дії доступу закінчився - unknown: Маркер доступу недійсний + revoked: "Маркер доступу скасовано" + expired: "Термін дії доступу закінчився" + unknown: "Маркер доступу недійсний" revoke: - unauthorized: Ви не вповноважені відкликати цей маркер. + unauthorized: "Ви не вповноважені відкликати цей маркер." forbidden_token: - missing_scope: Для доступу до цього ресурсу потрібна область «%{oauth_scopes}». + missing_scope: 'Для доступу до цього ресурсу потрібна область «%{oauth_scopes}».' unsupported_browser: - title: Ваш веб-переглядач застарілий і не підтримується. - message: Ви можете зіткнутися з помилками та погіршити досвід роботи на цій сторінці. - update_message: Будь ласка, оновіть ваш браузер. - close_warning: Ігнорувати це попередження. + title: "Ваш веб-переглядач застарілий і не підтримується." + message: "Ви можете зіткнутися з помилками та погіршити досвід роботи на цій сторінці." + update_message: "Будь ласка, оновіть ваш браузер." + close_warning: "Ігнорувати це попередження." oauth: application: builtin: Вбудований екземпляр застосунку confidential: Конфіденційний - singular: Програма OAuth - scopes: Області - client_credentials: Облікові дані клієнта - plural: Програми OAuth + singular: "Програма OAuth" + scopes: "Області" + client_credentials: "Облікові дані клієнта" + plural: "Програми OAuth" named: " Програми OAuth '%{name}'" - new: Нова програма OAuth + new: "Нова програма OAuth" non_confidential: Не конфіденційний default_scopes: "(Області за умовчанням)" instructions: - enabled: Увімкнути цей застосунок, дозволяючи користувачам надання авторизації - з ним. - name: Назва вашої програми. Це буде показано іншим користувачам після авторизації. - redirect_uri_html: 'Дозволені URL-адреси, дозволені користувачам, можна перенаправити. - Один запис на рядок.
Якщо ви реєструєте настільну програму, використовуйте - таку URL-адресу. - - ' - confidential: Перевірте, чи буде використовуватися програма, якщо секрет клієнта - може бути конфіденційним. Природні мобільні програми та програми з однією - сторінкою вважаються неконфіденційними. - scopes: Перевірте області, до яких ви хотіли б надати доступ. Якщо не позначено - жодну область, такою вважатиметься api_v3. - client_credential_user_id: Необов'язковий ідентифікатор користувача, який - видає себе, коли клієнти використовують цю програму. Залиште пустим, щоб - дозволити лише загальний доступ - register_intro: Якщо ви розробляєте клієнтське додаток OAuth для OpenProject, - ви можете зареєструвати його, використовуючи цю форму для всіх користувачів. - default_scopes: '' + enabled: "Увімкнути цей застосунок, дозволяючи користувачам надання авторизації з ним." + name: "Назва вашої програми. Це буде показано іншим користувачам після авторизації." + redirect_uri_html: > + Дозволені URL-адреси, дозволені користувачам, можна перенаправити. Один запис на рядок.
Якщо ви реєструєте настільну програму, використовуйте таку URL-адресу. + confidential: "Перевірте, чи буде використовуватися програма, якщо секрет клієнта може бути конфіденційним. Природні мобільні програми та програми з однією сторінкою вважаються неконфіденційними." + scopes: "Перевірте області, до яких ви хотіли б надати доступ. Якщо не позначено жодну область, такою вважатиметься api_v3." + client_credential_user_id: "Необов'язковий ідентифікатор користувача, який видає себе, коли клієнти використовують цю програму. Залиште пустим, щоб дозволити лише загальний доступ" + register_intro: "Якщо ви розробляєте клієнтське додаток OAuth для OpenProject, ви можете зареєструвати його, використовуючи цю форму для всіх користувачів." + default_scopes: "" header: builtin_applications: Вбудовані застосунки OAuth other_applications: Інші застосунки OAuth empty_application_lists: Жодного застосунку OAuth не зареєстровано. - client_id: Client ID - client_secret_notice: 'Це єдиний раз, коли ми можемо надати клієнтську таємницю, - зауважте її та збережіть її в безпеці. Він повинен розглядатися як пароль і - не може бути отриманий OpenProject пізніше. - - ' + client_id: "Client ID" + client_secret_notice: > + Це єдиний раз, коли ми можемо надати клієнтську таємницю, зауважте її та збережіть її в безпеці. Він повинен розглядатися як пароль і не може бути отриманий OpenProject пізніше. authorization_dialog: - authorize: Авторизувати - cancel: Скасувати та заборонити авторизацію. - prompt_html: Авторизувати%{application_name} використовувати - обліковий запис %{login}? - title: Авторизувати %{application_name} - wants_to_access_html: 'Ця програма запитує доступ до вашого облікового запису - OpenProject.
Він подав запит на такі дозволи: - - ' + authorize: "Авторизувати" + cancel: "Скасувати та заборонити авторизацію." + prompt_html: "Авторизувати%{application_name} використовувати обліковий запис %{login}?" + title: "Авторизувати %{application_name}" + wants_to_access_html: > + Ця програма запитує доступ до вашого облікового запису OpenProject.
Він подав запит на такі дозволи: scopes: - api_v3: Повний доступ до API версії 3 - api_v3_text: Додаток отримає повний доступ для читання та записування в OpenProject - API версії 3, щоб виконувати дії від вашого імені. + api_v3: "Повний доступ до API версії 3" + api_v3_text: "Додаток отримає повний доступ для читання та записування в OpenProject API версії 3, щоб виконувати дії від вашого імені." grants: - created_date: Затверджено - scopes: Дозволи - successful_application_revocation: Відкликання заявки %{application_name} успішне. - none_given: Жодних програм OAuth не було надано доступ до вашого облікового - запису користувача. + created_date: "Затверджено" + scopes: "Дозволи" + successful_application_revocation: "Відкликання заявки %{application_name} успішне." + none_given: "Жодних програм OAuth не було надано доступ до вашого облікового запису користувача." x_active_tokens: - one: один активний маркер + one: "один активний маркер" few: "%{count} активний маркер" many: "%{count} активний маркер" other: "%{count} активний маркер" flows: - authorization_code: Потік авторизації коду - client_credentials: Потік облікових даних клієнта - client_credentials: Користувач, який використовується для облікових даних клієнта - client_credentials_impersonation_set_to: Ідентифікатор користувача для облікових - даних клієнта - client_credentials_impersonation_warning: 'Примітка: Клієнти, які використовують - потік "Клієнтські дані" в цій програмі, матимуть права цього користувача' - client_credentials_impersonation_html: 'За замовчуванням OpenProject надає авторизацію - OAuth 2.0 через %{authorization_code_flow_link}. За бажанням можна включити - %{client_credentials_flow_link} але ви повинні надати користувачеві, від імені - будуть кого виконуватися запити. - - ' - authorization_error: Сталася помилка авторизації. - revoke_my_application_confirmation: Ви дійсно бажаєте видалити цю програму? Це - скасує %{token_count} активація для цього. - my_registered_applications: Зареєстровані програми OAuth + authorization_code: "Потік авторизації коду" + client_credentials: "Потік облікових даних клієнта" + client_credentials: "Користувач, який використовується для облікових даних клієнта" + client_credentials_impersonation_set_to: "Ідентифікатор користувача для облікових даних клієнта" + client_credentials_impersonation_warning: "Примітка: Клієнти, які використовують потік \"Клієнтські дані\" в цій програмі, матимуть права цього користувача" + client_credentials_impersonation_html: > + За замовчуванням OpenProject надає авторизацію OAuth 2.0 через %{authorization_code_flow_link}. За бажанням можна включити %{client_credentials_flow_link} але ви повинні надати користувачеві, від імені будуть кого виконуватися запити. + authorization_error: "Сталася помилка авторизації." + revoke_my_application_confirmation: "Ви дійсно бажаєте видалити цю програму? Це скасує %{token_count} активація для цього." + my_registered_applications: "Зареєстровані програми OAuth" oauth_client: urn_connection_status: - connected: Підключено - error: Помилка - failed_authorization: Помилка авторизації - not_connected: Не підключено + connected: "Підключено" + error: "Помилка" + failed_authorization: "Помилка авторизації" + not_connected: "Не підключено" labels: - label_oauth_integration: Інтеграція OAuth2 - label_redirect_uri: URI переспрямування - label_request_token: Маркер запиту - label_refresh_token: Маркер оновлення + label_oauth_integration: "Інтеграція OAuth2" + label_redirect_uri: "URI переспрямування" + label_request_token: "Маркер запиту" + label_refresh_token: "Маркер оновлення" errors: - oauth_authorization_code_grant_had_errors: Не вдалося надати дозвіл на авторизацію - OAuth2 - oauth_reported: 'Постачальник OAuth2 повідомив:' - oauth_returned_error: Клієнт OAuth2 повернув помилку - oauth_returned_json_error: Клієнт OAuth2 повернув помилку JSON - oauth_returned_http_error: Клієнт OAuth2 повернув помилку мережі - oauth_returned_standard_error: Клієнт OAuth2 повернув внутрішню помилку - wrong_token_type_returned: Клієнт OAuth2 повернув неправильний тип маркеру (очікувався - тип AccessToken::Bearer) - oauth_issue_contact_admin: Клієнт OAuth2 повідомив про помилку. Зверніться до - системного адміністратора. - oauth_client_not_found: Клієнта OAuth2 не знайдено в кінцевій точці 'callback' - (redirect_uri). - refresh_token_called_without_existing_token: 'Внутрішня помилка: здійснено виклик - маркера refresh_token без наявного раніше маркера. - - ' - refresh_token_updated_failed: Сталася помилка під час оновлення маркера OAuthClientToken - oauth_client_not_found_explanation: 'Ця помилка з’являється, якщо оновити client_id - та client_secret в OpenProject, але не оновити поле ''Return URI'' для постачальника - OAuth2. - - ' - oauth_code_not_present: Значення 'code' OAuth2 не знайдено в кінцевій точці - 'callback' (redirect_uri). - oauth_code_not_present_explanation: 'Ця помилка з’являється, якщо вибрати неправильне - значення response_type для постачальника OAuth2. Поле Response_type може мати - значення ''code'' або подібне. - - ' - oauth_state_not_present: Значення 'state' OAuth2 не знайдено в кінцевій точці - 'callback' (redirect_uri). - oauth_state_not_present_explanation: 'Значення ''state'' указує OpenProject - на місце, з якого потрібно продовжити після вдалої авторизації OAuth2. Відсутнє - значення ''state'' – це внутрішня помилка, яка може статися під час налаштування. - Зверніться до системного адміністратора. - - ' + oauth_authorization_code_grant_had_errors: "Не вдалося надати дозвіл на авторизацію OAuth2" + oauth_reported: "Постачальник OAuth2 повідомив:" + oauth_returned_error: "Клієнт OAuth2 повернув помилку" + oauth_returned_json_error: "Клієнт OAuth2 повернув помилку JSON" + oauth_returned_http_error: "Клієнт OAuth2 повернув помилку мережі" + oauth_returned_standard_error: "Клієнт OAuth2 повернув внутрішню помилку" + wrong_token_type_returned: "Клієнт OAuth2 повернув неправильний тип маркеру (очікувався тип AccessToken::Bearer)" + oauth_issue_contact_admin: "Клієнт OAuth2 повідомив про помилку. Зверніться до системного адміністратора." + oauth_client_not_found: "Клієнта OAuth2 не знайдено в кінцевій точці 'callback' (redirect_uri)." + refresh_token_called_without_existing_token: > + Внутрішня помилка: здійснено виклик маркера refresh_token без наявного раніше маркера. + refresh_token_updated_failed: "Сталася помилка під час оновлення маркера OAuthClientToken" + oauth_client_not_found_explanation: > + Ця помилка з’являється, якщо оновити client_id та client_secret в OpenProject, але не оновити поле 'Return URI' для постачальника OAuth2. + oauth_code_not_present: "Значення 'code' OAuth2 не знайдено в кінцевій точці 'callback' (redirect_uri)." + oauth_code_not_present_explanation: > + Ця помилка з’являється, якщо вибрати неправильне значення response_type для постачальника OAuth2. Поле Response_type може мати значення 'code' або подібне. + oauth_state_not_present: "Значення 'state' OAuth2 не знайдено в кінцевій точці 'callback' (redirect_uri)." + oauth_state_not_present_explanation: > + Значення 'state' указує OpenProject на місце, з якого потрібно продовжити після вдалої авторизації OAuth2. Відсутнє значення 'state' – це внутрішня помилка, яка може статися під час налаштування. Зверніться до системного адміністратора. rack_oauth2: - client_secret_invalid: Секретний ключ клієнта неприпустимий (client_secret_invalid) - invalid_request: 'Сервер авторизації OAuth2 повернув відповідь ''invalid_request''. - Ця помилка стається в разі повторних спроб авторизації або технічних проблем. - - ' - invalid_response: Сервер авторизації OAuth2 повернув неприпустиму відповідь - (invalid_response) - invalid_grant: Сервер авторизації OAuth2 просить вас авторизуватися повторно - (invalid_grant). - invalid_client: Сервер авторизації OAuth2 не розпізнає OpenProject (invalid_client). - unauthorized_client: Сервер авторизації OAuth2 відхиляє тип дозволу (unauthorized_client) - unsupported_grant_type: Сервер авторизації OAuth2 просить вас авторизуватися - повторно (unsupported_grant_type). - invalid_scope: Ви не можете отримати доступ до потрібного ресурсу (invalid_scope). + client_secret_invalid: "Секретний ключ клієнта неприпустимий (client_secret_invalid)" + invalid_request: > + Сервер авторизації OAuth2 повернув відповідь 'invalid_request'. Ця помилка стається в разі повторних спроб авторизації або технічних проблем. + invalid_response: "Сервер авторизації OAuth2 повернув неприпустиму відповідь (invalid_response)" + invalid_grant: "Сервер авторизації OAuth2 просить вас авторизуватися повторно (invalid_grant)." + invalid_client: "Сервер авторизації OAuth2 не розпізнає OpenProject (invalid_client)." + unauthorized_client: "Сервер авторизації OAuth2 відхиляє тип дозволу (unauthorized_client)" + unsupported_grant_type: "Сервер авторизації OAuth2 просить вас авторизуватися повторно (unsupported_grant_type)." + invalid_scope: "Ви не можете отримати доступ до потрібного ресурсу (invalid_scope)." http: request: - failed_authorization: Серверному запиту не вдалось авторизуватися. - missing_authorization: Сталася помилка серверного запиту через відсутність інформації - про авторизацію. + failed_authorization: "Серверному запиту не вдалось авторизуватися." + missing_authorization: "Сталася помилка серверного запиту через відсутність інформації про авторизацію." response: - unexpected: Отримано неочікувану відповідь. + unexpected: "Отримано неочікувану відповідь." you: ви link: посилання plugin_openproject_auth_plugins: - name: Плагіни OpenProject Auth - description: Інтеграція постачальників стратегії OmniAuth для автентифікації в - OpenProject. + name: "Плагіни OpenProject Auth" + description: "Інтеграція постачальників стратегії OmniAuth для автентифікації в OpenProject." plugin_openproject_auth_saml: - name: OmniAuth SAML / Служба єдиного входу - description: Додає постачальника OmniAuth SAML в OpenProject + name: "OmniAuth SAML / Служба єдиного входу" + description: "Додає постачальника OmniAuth SAML в OpenProject" enterprise_plans: - legacy_enterprise: План Enterprise + legacy_enterprise: "План Enterprise" token: hashed_token: display_value_placeholder: "***" external_link_warning: - title: Вихід з OpenProject - warning_message: Ви збираєтеся перейти з OpenProject на зовнішній вебсайт. Зауважте, - що ми не контролюємо зовнішні вебсайти, і вони можуть мати інші політики конфіденційності - й безпеки. - continue_message: Справді перейти за зовнішнім посиланням нижче? - continue_button: Перейти на зовнішній вебсайт - notice_smtp_address_unsafe: SMTP address %{address} is not safe. Please add it to - OPENPROJECT_SSRF_PROTECTION_ALLOWLIST. + title: "Вихід з OpenProject" + warning_message: "Ви збираєтеся перейти з OpenProject на зовнішній вебсайт. Зауважте, що ми не контролюємо зовнішні вебсайти, і вони можуть мати інші політики конфіденційності й безпеки." + continue_message: "Справді перейти за зовнішнім посиланням нижче?" + continue_button: "Перейти на зовнішній вебсайт" diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index d9af2cd47f4..cf6a1ace99f 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -175,7 +175,7 @@ zh-CN: instance_meta_fetching: "正在获取元数据" instance_meta_error: "获取元数据时出错" instance_meta_done: "元数据已获取" - import_scope: "Select scope" + import_scope: "选择范围" configuring: "选择范围" projects_meta_fetching: "正在获取项目数据" projects_meta_error: "获取项目数据时出错" @@ -185,12 +185,12 @@ zh-CN: imported: "审核模式" reverting: "正在撤消" revert_error: "撤消过程中出错" - revert_cancelling: "Cancelling revert" - revert_cancelled: "Revert cancelled" + revert_cancelling: "正在取消撤消" + revert_cancelled: "已取消撤消" reverted: "已撤消" - finalizing: "Finalizing" - finalizing_error: "Error during finalizing" - finalizing_done: "Completed" + finalizing: "正在完成" + finalizing_error: "完成过程中出错" + finalizing_done: "已完成" wizard: button_retry: "重试" parts: @@ -230,7 +230,7 @@ zh-CN: title: "导入范围" caption: "选择要导入 OpenProject 的内容" caption_done: "已完成" - label_info: "请注意,此导入工具仍处于测试阶段,不能导入所有类型的数据。以下是主机 Jira 实例提供的导入功能摘要,以及此工具目前能够导入的内容。" + label_info: "请注意,此导入工具仍处于测试阶段,不能导入所有类型的数据。以下是主机 Jira 实例提供的导入摘要,以及此工具目前能够导入的内容。" description: "在从主机 Jira 实例获取的可用数据中选择要导入的数据。" label_available_data: "可用数据" label_not_available_data: "不可导入" @@ -265,9 +265,9 @@ zh-CN: button_revert: "撤消导入" button_done: "完成导入" preview_description: '导入的数据当前处于审核模式。点击“完成导入”可永久导入,点击“撤消导入”可撤消本次导入运行中的所有更改。' - label_finalize_import: "Finalize import" - label_finalizing: "Finalizing import..." - label_finalizing_done: "Import finalized." + label_finalize_import: "完成导入" + label_finalizing: "正在完成导入…" + label_finalizing_done: "导入已完成。" label_revert_progress: "正在撤消导入…" label_reverted: "导入已撤消。" select_dialog: @@ -276,7 +276,7 @@ zh-CN: title: "是否开始此导入?" confirm_button: "开始导入" description: > - 此导入器是一项 alpha 功能。它还不能从 Jira 导入所有数据,可能会在此 OpenProject 实例上留下不完整的数据。 请勿在生产环境中使用,在开始之前,请先创建 OpenProject 数据备份。 + 此导入功能是一项 alpha 功能。它还不能从 Jira 导入所有数据,可能会在此 OpenProject 实例上留下不完整的数据。 请勿在生产环境中使用,在开始之前,请先创建 OpenProject 数据备份。 confirm: "我明白,我已做好了必要的准备" revert_dialog: title: "是否永久撤消此导入?" @@ -1360,7 +1360,7 @@ zh-CN: personal_access_token: "个人访问令牌" "import/jira_open_project_reference": jira: "Jira" - jira_import: "Jira import" + jira_import: "Jira 导入" announcements: show_until: "显示截止日期" attachment: @@ -4151,7 +4151,7 @@ zh-CN: notice_parent_item_not_found: "未找到父项" notice_project_not_deleted: "项目没有被删除" notice_project_not_found: "未找到项目。" - notice_smtp_address_unsafe: "SMTP address %{address} is not safe. Please add it to OPENPROJECT_SSRF_PROTECTION_ALLOWLIST." + notice_smtp_address_unsafe: "SMTP 地址 %{address} 不安全。请将其添加到 OPENPROJECT_SSRF_PROTECTION_ALLOWLIST。" notice_successful_connection: "成功连接。" notice_successful_create: "成功创建。" notice_successful_delete: "成功删除。" diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 55ad9815bfe..3ed70909dab 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -32,7 +32,7 @@ de: name: "Sprint-Name" sharing: "Teilen" sprint: - duration: "Sprintdauer" + duration: "Sprint-Dauer" work_package: position: "Position" story_points: "Story-Punkte" @@ -155,7 +155,7 @@ de: permission_select_done_statuses: "Abgeschlossene Status auswählen" permission_share_sprint: "Sprint teilen" permission_start_complete_sprint: "Sprint starten/abschließen" - permission_view_sprints: "Sprints sehen" + permission_view_sprints: "Sprints ansehen" project_module_backlogs: "Backlogs" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index ec436209df3..51c16f00aa0 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -88,8 +88,8 @@ ru: blankslate_title: "%{name} пустой" blankslate_description: "Пока ничего не запланировано. Перетащите элементы сюда, чтобы добавить их." sprint_component: - blankslate_title: "%{name} is empty" - blankslate_description: "No items planned yet. Drag items here to add them." + blankslate_title: "%{name} пустой" + blankslate_description: "Пока ничего не запланировано. Перетащите элементы сюда, чтобы добавить их." backlog_header_component: label_toggle_backlog: "Свернуть/Развернуть %{name}" label_story_count: @@ -97,11 +97,11 @@ ru: one: "%{count} история в бэклоге" other: "%{count} историй в бэклоге" sprint_header_component: - label_toggle_backlog: "Collapse/Expand %{name}" + label_toggle_backlog: "Свернуть/Развернуть %{name}" label_story_count: - zero: "No stories in sprint" - one: "%{count} story in sprint" - other: "%{count} stories in sprint" + zero: "Нет историй в спринте" + one: "%{count} история в спринте" + other: "%{count} историй в спринте" backlog_menu_component: label_actions: "Действия в рамках бэклога" action_menu: @@ -113,13 +113,13 @@ ru: wiki: "Wiki" properties: "Свойства" sprint_menu_component: - label_actions: "Sprint actions" + label_actions: "Действия в спринте" action_menu: - edit_sprint: "Edit sprint" - new_story: "New story" - stories_tasks: "Stories/Tasks" - task_board: "Task board" - burndown_chart: "Burndown chart" + edit_sprint: "Редактировать спринт" + new_story: "Новая история" + stories_tasks: "Истории/задачи" + task_board: "Панель задач" + burndown_chart: "Сводная таблица" story_component: label_drag_story: "Переместить %{name}" story_menu_component: @@ -147,19 +147,19 @@ ru: label_backlogs_unconfigured: "Вы еще не настроили Невыполненные работы. Перейдите на страницу %{administration} > %{plugins}, а затем нажмите на ссылку %{configure} для получения этого дополнения. После того как вы настроите поля, возвратитесь на эту страницу, чтобы начать пользоваться инструментом." label_blocks_ids: "Идентификаторы заблокированных рабочих пакетов" label_column_in_backlog: "Колонка в бэклоге" - label_used_as_backlog: "Used as backlog" + label_used_as_backlog: "Используется как бэклог" label_points_burn_down: "Вниз" label_points_burn_up: "Вверх" - label_sprint_edit: "Edit sprint" + label_sprint_edit: "Редактировать спринт" label_sprint_impediments: "Препятствия спринта" label_sprint_new: "Новый спринт" label_task_board: "Панель задач" permission_create_sprints: "Создание спринтов" - permission_manage_sprint_items: "Manage sprint items" + permission_manage_sprint_items: "Управление пунктами спринта" permission_select_done_statuses: "Выберите завершенные статусы" - permission_share_sprint: "Share sprint" - permission_start_complete_sprint: "Start/complete sprint" - permission_view_sprints: "View sprints" + permission_share_sprint: "Поделиться спринтом" + permission_start_complete_sprint: "Начать/завершить спринт" + permission_view_sprints: "Просмотр спринтов" project_module_backlogs: "Бэклоги" rb_burndown_charts: show: diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index 2c7f7f2d91f..c09e747a66a 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -110,9 +110,9 @@ zh-CN: label_actions: "冲刺操作" action_menu: edit_sprint: "编辑冲刺" - new_story: "新故事" + new_story: "新建故事" stories_tasks: "故事/任务" - task_board: "任务板" + task_board: "任务面板" burndown_chart: "燃尽图" story_component: label_drag_story: "移动 %{name}" diff --git a/modules/budgets/config/locales/crowdin/ko.yml b/modules/budgets/config/locales/crowdin/ko.yml index 87fefaf7263..b05d9fd617e 100644 --- a/modules/budgets/config/locales/crowdin/ko.yml +++ b/modules/budgets/config/locales/crowdin/ko.yml @@ -90,11 +90,11 @@ ko: program: zero: "예산 데이터가 없습니다." one: "이 프로그램 및 해당 하위 항목에 포함된 %{count}개 예산에서 집계된 데이터입니다." - other: "Data aggregated from %{count} budgets included in this program and its subitems." + other: "이 프로그램 및 해당 하위 항목에 포함된 %{count}개 예산에서 집계된 데이터입니다." portfolio: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this portfolio and its subitems." - other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." + zero: "예산 데이터가 없습니다." + one: "이 포트폴리오 및 해당 하위 항목에 포함된 %{count}개 예산에서 집계된 데이터입니다." + other: "이 포트폴리오 및 해당 하위 항목에 포함된 %{count}개 예산에서 집계된 데이터입니다." view_details: "예산 세부 정보 보기" events: budget: "예산 편집됨" diff --git a/modules/budgets/config/locales/crowdin/ru.yml b/modules/budgets/config/locales/crowdin/ru.yml index 9aaff58bb66..a9ca6fc08c1 100644 --- a/modules/budgets/config/locales/crowdin/ru.yml +++ b/modules/budgets/config/locales/crowdin/ru.yml @@ -44,7 +44,7 @@ ru: labor_budget_item: attributes: principal: - not_a_member_of_budget_project: "is not a member of the budget's project" + not_a_member_of_budget_project: "не является участником бюджета проекта" models: budget: "Бюджет" material_budget_item: "Единица" @@ -73,29 +73,29 @@ ru: budget_by_cost_type: title: "Бюджет по видам затрат" blankslate: - heading: "Start project controlling" - description: "Get an overview of your budgets and costs to efficiently track the health status of your project" + heading: "Начать контроль над проектом" + description: "Получите обзор Ваших бюджетов и затрат, чтобы эффективно отслеживать состояние здоровья Вашего проекта" blankslate_zero: - heading: "Budget details missing" - description: "Add details about your planned budget to see data here" + heading: "Отсутствуют детали бюджета" + description: "Добавьте подробную информацию о планируемом бюджете, чтобы увидеть данные здесь" count_caption: - zero: "No budget data." - one: "Data aggregated from %{count} budget" - other: "Data aggregated from %{count} budgets" + zero: "Нет данных о бюджете." + one: "Данные собраны из %{count} бюджета" + other: "Данные собраны из %{count} бюджетов" count_caption_with_subitems: project: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this project and its subitems." - other: "Data aggregated from %{count} budgets included in this project and its subitems." + zero: "Нет данных о бюджете." + one: "Данные, собранные из %{count} бюджета, включены в этот проект и его подпроекты." + other: "Данные, собранные из %{count} бюджетов, включены в этот проект и его подпроекты." program: - zero: "No budget data." + zero: "Нет данных о бюджете." one: "Data aggregated from %{count} budget included in this program and its subitems." other: "Data aggregated from %{count} budgets included in this program and its subitems." portfolio: zero: "No budget data." one: "Data aggregated from %{count} budget included in this portfolio and its subitems." other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." - view_details: "View budget details" + view_details: "Посмотреть детали бюджета" events: budget: "Бюджет изменен" help_click_to_edit: "Нажмите здесь, чтобы править." diff --git a/modules/costs/config/locales/crowdin/ru.yml b/modules/costs/config/locales/crowdin/ru.yml index 7c0d9adc533..69f9ca319be 100644 --- a/modules/costs/config/locales/crowdin/ru.yml +++ b/modules/costs/config/locales/crowdin/ru.yml @@ -213,10 +213,10 @@ ru: project_module_costs: "Время и затраты" setting_allow_tracking_start_and_end_times: "Разрешить время начала и окончания" setting_costs_currency: "Валюта" - setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥." - setting_costs_currency_format: "Currency format" - setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)" - setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)" + setting_costs_currency_caption: "Это единица валюты. Это может быть трехбуквенный код ISO, например, EUR, USD или JPY, или символ, например, €, $ или ¥." + setting_costs_currency_format: "Формат валюты" + setting_costs_currency_format_prefix: "Перед числом (например, EUR 100)" + setting_costs_currency_format_suffix: "После числа (например, 100 EUR)" setting_enforce_tracking_start_and_end_times: "Требуется время начала и окончания" setting_enforce_without_allow: "Требование точного времени невозможно без соответствующего разрешения" setting_allow_tracking_start_and_end_times_caption: "Включает время начала и окончания учета." @@ -242,10 +242,10 @@ ru: actual_costs: title: "Фактические затраты по месяцам" blankslate: - heading: "Start tracking your time and costs" - description: "Get an overview of your costs and logged time to monitor progress of your project. Make sure that work packages are associated with the correct budget." + heading: "Начните отслеживать свое время и расходы" + description: "Получите обзор Ваших затрат и затраченного времени, чтобы контролировать ход выполнения проекта. Убедитесь, что пакеты работ связаны с правильным бюджетом." action: "Добавить трудозатраты" - view_details: "View actual costs details" + view_details: "Подробнее о фактических затратах" ee: features: time_entry_time_restrictions: Требует точного отслеживания времени diff --git a/modules/grids/config/locales/crowdin/js-ru.yml b/modules/grids/config/locales/crowdin/js-ru.yml index a48559b4ff7..79d09578383 100644 --- a/modules/grids/config/locales/crowdin/js-ru.yml +++ b/modules/grids/config/locales/crowdin/js-ru.yml @@ -2,12 +2,12 @@ ru: js: grid: add_widget: 'Добавить виджет' - widget_menu_label: 'Show menu options for %{widgetName} widget' + widget_menu_label: 'Показать настройки меню для виджета %{widgetName}' remove: 'Удалить виджет' configure: 'Настроить виджет' widgets: missing_permission: "У вас нет необходимых прав для просмотра этого виджета." - not_available: "This widget is currently unavailable." + not_available: "В настоящее время этот виджет недоступен." custom_text: title: 'Пользовательский текст' documents: diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index 86415b4c322..f47e26c306b 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -1,101 +1,113 @@ ---- +#-- 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. +#++ +#English strings go here for Rails i18n de: plugin_openproject_meeting: - name: OpenProject Besprechungen - description: Dieses Modul fügt Funktionen zur Unterstützung von Besprechungen - zu OpenProject hinzu. Sie können Besprechungen planen und dabei Teilnehmer 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 Teilnehmer ausgewählt und Protokolle auf der Grundlage - der Tagesordnung erstellt werden. Schließlich kann das Protokoll an alle Teilnehmer - und Eingeladenen gesendet werden. + name: "OpenProject Besprechungen" + description: >- + Dieses Modul fügt Funktionen zur Unterstützung von Besprechungen zu OpenProject hinzu. Sie können Besprechungen planen und dabei Teilnehmer 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 Teilnehmer ausgewählt und Protokolle auf der Grundlage der Tagesordnung erstellt werden. Schließlich kann das Protokoll an alle Teilnehmer und Eingeladenen gesendet werden. activerecord: attributes: meeting: - type: Art der Besprechung - location: Ort/Raum - duration: Dauer - notes: Anmerkungen - participants: Teilnehmer + type: "Art der Besprechung" + location: "Ort/Raum" + duration: "Dauer" + notes: "Anmerkungen" + participants: "Teilnehmer" participant: - one: 1 Teilnehmer + one: "1 Teilnehmer" other: "%{count} Teilnehmer" - participants_attended: Anwesend - participants_invited: Eingeladen - project: Projekt - start_date: Datum - start_time: Startzeit - start_time_hour: Startzeit - sharing: Teilen + participants_attended: "Anwesend" + participants_invited: "Eingeladen" + project: "Projekt" + start_date: "Datum" + start_time: "Startzeit" + start_time_hour: "Startzeit" + sharing: "Teilen" meeting_agenda_item: - title: Titel - author: Autor - duration_in_minutes: Dauer - description: Anmerkungen - presenter: Referent + title: "Titel" + author: "Autor" + duration_in_minutes: "Dauer" + description: "Anmerkungen" + presenter: "Referent" meeting_section: - title: Titel + title: "Titel" recurring_meeting: - frequency: Häufigkeit - interval: Intervall - start_date: Startet am - start_time: Startdatum - start_time_hour: Uhrzeit - end_after: Ende der Terminserie - end_date: Enddatum - iterations: Ereignisse + frequency: "Häufigkeit" + interval: "Intervall" + start_date: "Startet am" + start_time: "Startdatum" + start_time_hour: "Uhrzeit" + end_after: "Ende der Terminserie" + end_date: "Enddatum" + iterations: "Ereignisse" recurring_meeting_interim_response: - start_time: Startzeit + start_time: "Startzeit" meeting_participant: - invited: Eingeladen - attended: Teilgenommen - participation_status: Teilnahme-Status + invited: "Eingeladen" + attended: "Teilgenommen" + participation_status: "Teilnahme-Status" errors: models: meeting_participant: - user_invalid: ist kein gültiger Teilnehmer. + user_invalid: "ist kein gültiger Teilnehmer." meeting_agenda_item: - section_not_belong_to_meeting: Die Sektion gehört nicht zur gleichen Besprechung. - user_invalid: ist kein gültiger Teilnehmer. + 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 dieses wiederkehrende Treffen + 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. - other: Es gibt %{count} offene Besprechungen in der Terminserie, die nicht - durch den neuen Zeitplan abgedeckt sind. Passen Sie den Zeitplan an, - um alle bestehenden Meetings einzuschließen. + 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." + other: "Es gibt %{count} offene Besprechungen in der Terminserie, die nicht durch den neuen Zeitplan abgedeckt sind. Passen Sie den Zeitplan an, um alle bestehenden Meetings einzuschließen." format: "%{message}" messages: - invalid_time_format: 'ist keine gültige Zeit. Erforderliches Format: HH:MM' + invalid_time_format: "ist keine gültige Zeit. Erforderliches Format: HH:MM" models: - recurring_meeting: Wiederkehrende Besprechung - meeting: Einmalige Besprechung - meeting_agenda_item: Tagesordnungspunkt - meeting_agenda: Agenda - meeting_section: Abschnitt + recurring_meeting: "Wiederkehrende Besprechung" + meeting: "Einmalige Besprechung" + meeting_agenda_item: "Tagesordnungspunkt" + meeting_agenda: "Agenda" + meeting_section: "Abschnitt" token/ical_meeting: - one: iCal Meeting Abonnement - other: iCal Meeting Abonnements + one: "iCal Meeting Abonnement" + other: "iCal Meeting Abonnements" activity: filter: - meeting: Besprechungen + meeting: "Besprechungen" item: meeting_agenda_item: duration: - added: auf %{value} setzen - added_html: auf %{value} setzen - removed: entfernt - updated: von %{old_value} zu %{value} geändert - updated_html: von %{old_value} zu %{value} geändert + added: "auf %{value} setzen" + added_html: "auf %{value} setzen" + removed: "entfernt" + updated: "von %{old_value} zu %{value} geändert" + updated_html: "von %{old_value} zu %{value} geändert" position: - updated: neu geordnet + updated: "neu geordnet" work_package: - updated: von %{old_value} zu %{value} geändert - updated_html: von %{old_value} zu %{value} geändert - description_attended: teilgenommen + updated: "von %{old_value} zu %{value} geändert" + updated_html: "von %{old_value} zu %{value} geändert" + description_attended: "teilgenommen" events: meeting: Besprechung bearbeitet meeting_agenda: Agenda bearbeitet @@ -103,246 +115,215 @@ de: meeting_agenda_opened: Agenda geöffnet meeting_minutes: Protokoll bearbeitet meeting_minutes_created: Protokoll erstellt - error_notification: Die Benachrichtigung konnte nicht gesendet werden. - error_notification_with_errors: 'Benachrichtigungversenden fehlgeschlagen. Folgende - Empfänger konnten nicht benachrichtigt werden: %{recipients}' - label_meeting: Besprechung - label_meeting_plural: Besprechungen - label_meeting_templates: Vorlagen - label_meeting_template: Vorlage - label_meeting_template_new: Neue Vorlage - label_meeting_template_create: Vorlage erstellen - label_meeting_template_delete: Vorlage löschen - label_meeting_template_edit: Vorlage bearbeiten - label_meeting_create_from_template: Besprechung aus Vorlage erstellen - label_meeting_new: Neue Besprechung - label_meeting_new_dynamic: Neue einmalige Besprechung - label_meeting_new_recurring: Neue Terminserie - label_meeting_create: Besprechung erstellen - label_meeting_duplicate: Besprechung duplizieren - label_meeting_edit: Besprechung bearbeiten - label_meeting_agenda: Agenda - label_meeting_minutes: Protokoll - label_meeting_close: Schließen - label_meeting_open: Öffnen - label_meeting_index_delete: Löschen - label_meeting_open_this_meeting: Diese Besprechung öffnen - label_meeting_agenda_close: Agenda schließen um mit dem Protokoll zu beginnen - label_meeting_date_time: Datum/Uhrzeit - label_meeting_date_and_time: Datum und Zeit - label_meeting_diff: Differenz - label_meeting_send_updates: E-Mail-Kalender-Aktualisierungen senden - label_meeting_send_updates_caption: Versenden Sie E-Mail-Einladungen an alle Teilnehmenden - dieser Besprechung - label_recurring_meeting: Wiederkehrende Besprechung - label_recurring_meeting_part_of: Teil einer Terminserie - label_recurring_meeting_new: Neue Terminserie - label_recurring_meeting_plural: Wiederkehrende Besprechungen - label_template: Vorlage - label_recurring_meeting_view: Terminserie ansehen - label_recurring_meeting_create: Öffnen - label_recurring_meeting_duplicate: Als einmalige Besprechung duplizieren - label_recurring_meeting_cancel: Diese Besprechung absagen - label_recurring_meeting_delete: Besprechung löschen - label_recurring_meeting_restore: Dieses Vorkommen wiederherstellen - label_recurring_meeting_schedule: Terminplan - label_recurring_meeting_next_occurrence: Nächstes Ereignis - label_recurring_meeting_no_end_date: Es sind weitere Besprechungen geplant (%{schedule}). + error_notification: "Die Benachrichtigung konnte nicht gesendet werden." + error_notification_with_errors: "Benachrichtigungversenden fehlgeschlagen. Folgende Empfänger konnten nicht benachrichtigt werden: %{recipients}" + label_meeting: "Besprechung" + label_meeting_plural: "Besprechungen" + label_meeting_templates: "Vorlagen" + label_meeting_template: "Vorlage" + label_meeting_template_new: "Neue Vorlage" + label_meeting_template_create: "Vorlage erstellen" + label_meeting_template_delete: "Vorlage löschen" + label_meeting_template_edit: "Vorlage bearbeiten" + label_meeting_create_from_template: "Besprechung aus Vorlage erstellen" + label_meeting_new: "Neue Besprechung" + label_meeting_new_dynamic: "Neue einmalige Besprechung" + label_meeting_new_recurring: "Neue Terminserie" + label_meeting_create: "Besprechung erstellen" + label_meeting_duplicate: "Besprechung duplizieren" + label_meeting_edit: "Besprechung bearbeiten" + label_meeting_agenda: "Agenda" + label_meeting_minutes: "Protokoll" + label_meeting_close: "Schließen" + label_meeting_open: "Öffnen" + label_meeting_index_delete: "Löschen" + label_meeting_open_this_meeting: "Diese Besprechung öffnen" + label_meeting_agenda_close: "Agenda schließen um mit dem Protokoll zu beginnen" + label_meeting_date_time: "Datum/Uhrzeit" + label_meeting_date_and_time: "Datum und Zeit" + label_meeting_diff: "Differenz" + label_meeting_send_updates: "E-Mail-Kalender-Aktualisierungen senden" + label_meeting_send_updates_caption: "Versenden Sie E-Mail-Einladungen an alle Teilnehmenden dieser Besprechung" + label_recurring_meeting: "Wiederkehrende Besprechung" + label_recurring_meeting_part_of: "Teil einer Terminserie" + label_recurring_meeting_new: "Neue Terminserie" + label_recurring_meeting_plural: "Wiederkehrende Besprechungen" + label_template: "Vorlage" + label_recurring_meeting_view: "Terminserie ansehen" + label_recurring_meeting_create: "Öffnen" + label_recurring_meeting_duplicate: "Als einmalige Besprechung duplizieren" + label_recurring_meeting_cancel: "Diese Besprechung absagen" + label_recurring_meeting_delete: "Besprechung löschen" + label_recurring_meeting_restore: "Dieses Vorkommen wiederherstellen" + label_recurring_meeting_schedule: "Terminplan" + label_recurring_meeting_next_occurrence: "Nächstes Ereignis" + label_recurring_meeting_no_end_date: "Es sind weitere Besprechungen geplant (%{schedule})." label_recurring_meeting_more: - one: Es gibt eine weitere Besprechung (%{schedule}). - other: Es gibt %{count} folgende Besprechungen (%{schedule}). + one: "Es gibt eine weitere Besprechung (%{schedule})." + other: "Es gibt %{count} folgende Besprechungen (%{schedule})." label_recurring_meeting_more_past: - one: Es gibt eine weitere vergangene Besprechung. - other: Es gibt %{count} weitere vergangene Besprechungen. - label_recurring_meeting_show_more: Mehr anzeigen - label_recurring_meeting_series_create: Terminserie erstellen - label_recurring_meeting_series_edit: Terminserie bearbeiten - label_recurring_meeting_series_delete: Terminserie löschen - label_recurring_meeting_series_end: Terminserie beenden - label_recurring_meeting_series_end_now: Serie jetzt beenden + one: "Es gibt eine weitere vergangene Besprechung." + other: "Es gibt %{count} weitere vergangene Besprechungen." + label_recurring_meeting_show_more: "Mehr anzeigen" + label_recurring_meeting_series_create: "Terminserie erstellen" + label_recurring_meeting_series_edit: "Terminserie bearbeiten" + label_recurring_meeting_series_delete: "Terminserie löschen" + label_recurring_meeting_series_end: "Terminserie beenden" + label_recurring_meeting_series_end_now: "Serie jetzt beenden" label_meeting_more: - one: Es gibt eine weitere Besprechung. - other: Es gibt %{count} weitere Besprechungen. - label_my_meetings: Meine Besprechungen - label_all_meetings: Alle Besprechungen - label_upcoming_meetings: Zukünftige Meetings - label_past_meetings: Vergangene Meetings - label_upcoming_meetings_short: Anstehend - label_past_meetings_short: Vergangen - label_involvement: Beteiligt - label_invitations: Einladungen - label_invited_user: Eingeladen - label_past_invitations: Vergangene Einladungen - label_attended: Teilgenommen - label_attended_user: Teilgenommen - label_created_by_me: Von mir erstellt - label_notify: Zur Einsicht verschicken - label_icalendar: iCalendar senden - label_icalendar_download: iCalendar-Termin herunterladen - label_view_meeting_series: Terminserie ansehen - label_meeting_series: Terminserien - label_version: Version - label_time_zone: Zeitzone - label_start_date: Beginn - label_subscribe_icalendar: Im Kalender abonnieren - caption_meeting_template_select: Wählen Sie eine Vorlage, um deren Tagesordnungspunkte - automatisch zu kopieren - caption_template_project_select: Bitte wählen Sie das Projekt aus, in dem Sie diese - Besprechungsvorlage erstellen möchten + one: "Es gibt eine weitere Besprechung." + other: "Es gibt %{count} weitere Besprechungen." + label_my_meetings: "Meine Besprechungen" + label_all_meetings: "Alle Besprechungen" + label_upcoming_meetings: "Zukünftige Meetings" + label_past_meetings: "Vergangene Meetings" + label_upcoming_meetings_short: "Anstehend" + label_past_meetings_short: "Vergangen" + label_involvement: "Beteiligt" + label_invitations: "Einladungen" + label_invited_user: "Eingeladen" + label_past_invitations: "Vergangene Einladungen" + label_attended: "Teilgenommen" + label_attended_user: "Teilgenommen" + label_created_by_me: "Von mir erstellt" + label_notify: "Zur Einsicht verschicken" + label_icalendar: "iCalendar senden" + label_icalendar_download: "iCalendar-Termin herunterladen" + label_view_meeting_series: "Terminserie ansehen" + label_meeting_series: "Terminserien" + label_version: "Version" + label_time_zone: "Zeitzone" + label_start_date: "Beginn" + label_subscribe_icalendar: "Im Kalender abonnieren" + caption_meeting_template_select: "Wählen Sie eine Vorlage, um deren Tagesordnungspunkte automatisch zu kopieren" + caption_template_project_select: "Bitte wählen Sie das Projekt aus, in dem Sie diese Besprechungsvorlage erstellen möchten" meeting: participants: label: - participants: Teilnehmer - attended: Teilgenommen - mark_as_attended: Als teilgenommen markieren - mark_all_as_attended: Alle als teilgenommen markieren - remove_participant: Teilnehmer entfernen - manage_participants: Teilnehmer verwalten - no_participants: Keine Teilnehmer - show_all: Alle anzeigen + participants: "Teilnehmer" + attended: "Teilgenommen" + mark_as_attended: "Als teilgenommen markieren" + mark_all_as_attended: "Alle als teilgenommen markieren" + remove_participant: "Teilnehmer entfernen" + manage_participants: "Teilnehmer verwalten" + no_participants: "Keine Teilnehmer" + show_all: "Alle anzeigen" text: - template: Diese Teilnehmer werden automatisch zu allen zukünftigen Besprechungen - eingeladen, sobald diese erstellt werden. - manage_participants: Suchen Sie nach Projektmitgliedern, um sie als Teilnehmer - zu dieser Besprechung hinzuzufügen. - search_for_members: Suche nach Projektmitgliedern + template: "Diese Teilnehmer werden automatisch zu allen zukünftigen Besprechungen eingeladen, sobald diese erstellt werden." + manage_participants: "Suchen Sie nach Projektmitgliedern, um sie als Teilnehmer zu dieser Besprechung hinzuzufügen." + search_for_members: "Suche nach Projektmitgliedern" blankslate: - heading: Keine Teilnehmer - description: Es gibt noch keine Teilnehmer. + heading: "Keine Teilnehmer" + description: "Es gibt noch keine Teilnehmer." attachments: - onetime_template: These attached files will be included in all future meetings - using this template. - series_template: These attached files will be included in all future meetings - in the series. - text: Angehängte Dateien sind für alle Teilnehmer der Besprechung verfügbar. - Sie können diese auch per Drag-and-drop in die Notizen der Tagesordnungspunkte - ziehen. + onetime_template: "Diese angehängten Dateien werden bei allen zukünftigen Besprechungen mit dieser Vorlage berücksichtigt." + series_template: "Die angehängten Dateien werden in alle künftigen Besprechungen dieser Terminserie einbezogen." + text: "Angehängte Dateien sind für alle Teilnehmer der Besprechung verfügbar. Sie können diese auch per Drag-and-drop in die Notizen der Tagesordnungspunkte ziehen." copy: - title: 'Besprechung kopieren: %{title}' - attachments: Anhänge kopieren - attachments_text: Alle angehängten Dateien in die neue Besprechung kopieren - agenda: Tagesordnung kopieren - agenda_items: Tagesordnungspunkte kopieren - agenda_text: Tagesordnung der alten Besprechung kopieren - participants: Liste der Teilnehmer kopieren - to_clipboard: Link in Zwischenablage kopieren + title: "Besprechung kopieren: %{title}" + attachments: "Anhänge kopieren" + attachments_text: "Alle angehängten Dateien in die neue Besprechung kopieren" + agenda: "Tagesordnung kopieren" + agenda_items: "Tagesordnungspunkte kopieren" + agenda_text: "Tagesordnung der alten Besprechung kopieren" + participants: "Liste der Teilnehmer kopieren" + to_clipboard: "Link in Zwischenablage kopieren" email: - send_emails: E-Mail an Teilnehmer - send_invitation_emails: 'Senden Sie sofort eine E-Mail Einladung an die oben - ausgewählten Teilnehmer. Sie können dies auch jederzeit manuell durchführen. - - ' - send_invitation_emails_structured: Sofortige E-Mail-Einladung an alle Teilnehmer - senden. Sie können dies auch zu einem späteren Zeitpunkt manuell tun. - open_meeting_link: Besprechung öffnen - open_my_meetings_link: Meine Besprechungen anzeigen + send_emails: "E-Mail an Teilnehmer" + send_invitation_emails: > + Senden Sie sofort eine E-Mail Einladung an die oben ausgewählten Teilnehmer. Sie können dies auch jederzeit manuell durchführen. + send_invitation_emails_structured: "Sofortige E-Mail-Einladung an alle Teilnehmer senden. Sie können dies auch zu einem späteren Zeitpunkt manuell tun." + open_meeting_link: "Besprechung öffnen" + open_my_meetings_link: "Meine Besprechungen anzeigen" series: title: "[%{project_name}] Terminserie '%{title}'" summary: "%{actor} hat Sie zu einer neuen Terminserie '%{title}' eingeladen" series_updated: title: "[%{project_name}] Terminserie '%{title}' wurde aktualisiert" - summary: Die Terminserie '%{title}' wurde von %{actor} aktualisiert - old_schedule: Alter Zeitplan - new_schedule: Neuer Zeitplan + summary: "Die Terminserie '%{title}' wurde von %{actor} aktualisiert" + old_schedule: "Alter Zeitplan" + new_schedule: "Neuer Zeitplan" invited: - summary: "%{actor} hat Ihnen eine Einladung für die folgende Besprechung gesendet: - '%{title}'" + summary: "%{actor} hat Ihnen eine Einladung für die folgende Besprechung gesendet: '%{title}'" cancelled: - header: 'Abgesagt: Besprechung ''%{title}''' - header_occurrence: 'Abgesagt: Wiederkehrende Besprechung ''%{title}''' - header_series: 'Abgesagt: Terminserie ''%{title}''' - summary_occurrence: Eine Besprechung der Terminserie '%{title}' wurde von - %{actor} abgesagt, oder Sie wurden als Teilnehmer entfernt - summary_series: Terminserie '%{title}' wurde von %{actor} gelöscht, oder Sie - wurden als Teilnehmer entfernt - summary: "'%{title}' wurde von %{actor} abgesagt, oder Sie wurden als Teilnehmer - entfernt" - date_time: Geplanter Zeitpunkt + header: "Abgesagt: Besprechung '%{title}'" + header_occurrence: "Abgesagt: Wiederkehrende Besprechung '%{title}'" + header_series: "Abgesagt: Terminserie '%{title}'" + summary_occurrence: "Eine Besprechung der Terminserie '%{title}' wurde von %{actor} abgesagt, oder Sie wurden als Teilnehmer entfernt" + summary_series: "Terminserie '%{title}' wurde von %{actor} gelöscht, oder Sie wurden als Teilnehmer entfernt" + summary: "'%{title}' wurde von %{actor} abgesagt, oder Sie wurden als Teilnehmer entfernt" + date_time: "Geplanter Zeitpunkt" participant_added: - header: Besprechung '%{title}' - Teilnehmer hinzugefügt - header_series: Terminserie '%{title}' - Teilnehmer hinzugefügt + header: "Besprechung '%{title}' - Teilnehmer hinzugefügt" + header_series: "Terminserie '%{title}' - Teilnehmer hinzugefügt" summary: "%{actor} hat %{participant} zur Besprechung '%{title}' hinzugefügt" summary_series: "%{actor} hat %{participant} zur Terminserie '%{title}' hinzugefügt" participant_removed: - header: Besprechung '%{title}' - Teilnehmer entfernt - header_series: Terminserie '%{title}' - Teilnehmer hinzugefügt + header: "Besprechung '%{title}' - Teilnehmer entfernt" + header_series: "Terminserie '%{title}' - Teilnehmer hinzugefügt" summary: "%{actor} hat %{participant} aus Besprechung '%{title}' entfernt" summary_series: "%{actor} hat %{participant} aus Terminserie '%{title}' entfernt" ended: - header_series: 'Beendet: Terminserie ''%{title}''' - summary_series: Die Terminserie '%{title}' wurde von %{actor} beendet + header_series: "Beendet: Terminserie '%{title}'" + summary_series: "Die Terminserie '%{title}' wurde von %{actor} beendet" updated: - header: Besprechung '%{title}' wurde aktualisiert - summary: Die Besprechung '%{title}' wurde durch %{actor} aktualisiert - body: Die Besprechung '%{title}' wurde durch %{actor} aktualisiert. - old_title: Alter Titel - new_title: Neuer Titel - old_date_time: Alte(s) Datum/Zeit - new_date_time: Neue(s) Datum/Zeit - old_location: Alter Ort - new_location: Neuer Ort - label_mail_all_participants: E-Mail Einladung an alle Teilnehmenden versenden + header: "Besprechung '%{title}' wurde aktualisiert" + summary: "Die Besprechung '%{title}' wurde durch %{actor} aktualisiert" + body: "Die Besprechung '%{title}' wurde durch %{actor} aktualisiert." + old_title: "Alter Titel" + new_title: "Neuer Titel" + old_date_time: "Alte(s) Datum/Zeit" + new_date_time: "Neue(s) Datum/Zeit" + old_location: "Alter Ort" + new_location: "Neuer Ort" + label_mail_all_participants: "E-Mail Einladung an alle Teilnehmenden versenden" types: - one_time: Einmalig - recurring: Terminserie - recurring_text: Erstellen Sie eine Terminserie mit einer dynamischen Vorlage - und wiederkehrenden Besprechungen. - structured_text: Organisieren Sie Ihr Meeting als strukturierte Liste von Einträgen - und verknüpfen Sie diese optional mit einem Arbeitspaket. - structured_text_copy: Das Kopieren einer Besprechung kopiert derzeit nicht die - zugehörigen Tagesordnungspunkte, sondern nur dessen Details - copied: 'Kopiert von Meeting #%{id}' + one_time: "Einmalig" + recurring: "Terminserie" + recurring_text: "Erstellen Sie eine Terminserie mit einer dynamischen Vorlage und wiederkehrenden Besprechungen." + structured_text: "Organisieren Sie Ihr Meeting als strukturierte Liste von Einträgen und verknüpfen Sie diese optional mit einem Arbeitspaket." + structured_text_copy: "Das Kopieren einer Besprechung kopiert derzeit nicht die zugehörigen Tagesordnungspunkte, sondern nur dessen Details" + copied: "Kopiert von Meeting #%{id}" delete_dialog: one_time: - title: Besprechung löschen - heading: Diese Besprechung löschen? - confirmation_message_html: 'Diese Aktion kann nicht rückgängig gemacht werden. - Bitte prüfen Sie die Angaben, bevor Sie fortfahren. - - ' + title: "Besprechung löschen" + heading: "Diese Besprechung löschen?" + confirmation_message_html: > + Diese Aktion kann nicht rückgängig gemacht werden. Bitte prüfen Sie die Angaben, bevor Sie fortfahren. template: - title: Vorlage löschen - heading: Vorlage löschen? - confirmation_message_html: 'This action is not reversible. Please proceed - with caution. Existing meetings that were created using this template - will not be affected. - - ' + title: "Vorlage löschen" + heading: "Vorlage löschen?" + confirmation_message_html: > + Diese Aktion kann nicht rückgängig gemacht werden. Bitte gehen Sie mit Vorsicht vor. Bestehende Meetings, die mit dieser Vorlage erstellt wurden, sind davon nicht betroffen. occurrence: - title: Wiederkehrende Besprechung absagen - heading: Dieses Ereignis absagen? - confirmation_message_html: 'Sämtliche Inhalte der Besprechung, die nicht aus - der Vorlage entstammen, werden gelöscht und verloren werden. Möchten Sie - fortfahren? - - ' - confirm_button: Besprechung absagen + title: "Wiederkehrende Besprechung absagen" + heading: "Dieses Ereignis absagen?" + confirmation_message_html: > + Sämtliche Inhalte der Besprechung, die nicht aus der Vorlage entstammen, werden gelöscht und verloren werden. Möchten Sie fortfahren? + confirm_button: "Besprechung absagen" blankslate: - title: Es gibt keine Besprechungen vorhanden - desc: Sie können eine neue Besprechung erstellen oder Filterkriterien ändern - label_export_pdf: PDF exportieren + title: "Es gibt keine Besprechungen vorhanden" + desc: "Sie können eine neue Besprechung erstellen oder Filterkriterien ändern" + label_export_pdf: "PDF exportieren" export: - your_meeting_export: Besprechung wird exportiert + your_meeting_export: "Besprechung wird exportiert" minutes: - footer_page_numbers: S. %{current_page} von %{total_pages} - author: Verfasser:in - date: Datum - time: Zeit - location: Ort/Raum - title: Protokoll + footer_page_numbers: "S. %{current_page} von %{total_pages}" + author: "Verfasser:in" + date: "Datum" + time: "Zeit" + location: "Ort/Raum" + title: "Protokoll" export_pdf_dialog: title: PDF exportieren - description: Erstellen Sie eine druckbare PDF-Datei dieser Besprechung im aktuellen - Zustand. + description: Erstellen Sie eine druckbare PDF-Datei dieser Besprechung im aktuellen Zustand. templates: default: label: Standard - caption: Die Standardvorlage ist für die meisten Besprechungen geeignet - und repräsentiert den aktuellen Zustand. + caption: Die Standardvorlage ist für die meisten Besprechungen geeignet und repräsentiert den aktuellen Zustand. minutes: label: Protokoll - caption: Die Protokollvorlage eignet sich für geschlossene und archivierte - Besprechungen. + caption: Die Protokollvorlage eignet sich für geschlossene und archivierte Besprechungen. first_page_header_left: label: Erste Kopfzeile links caption: Dieser Text erscheint auf der ersten Seite links im Seitenkopf. @@ -357,497 +338,344 @@ de: caption: Eine Liste mit den Dateinamen von Anhängen wird am Ende angehängt. include_backlog: label: Backlog einfügen - caption: Einträge im Backlog der Besprechung sind standardmäßig nicht Teil - des Exports, aber Sie können sie optional einbinden. + caption: Einträge im Backlog der Besprechung sind standardmäßig nicht Teil des Exports, aber Sie können sie optional einbinden. include_outcomes: label: Ergebnisse einfügen - caption: Wenn Ihre Ergebnisse vertrauliche Informationen enthalten, können - Sie wählen, diese nicht in den Export aufzunehmen. + caption: Wenn Ihre Ergebnisse vertrauliche Informationen enthalten, können Sie wählen, diese nicht in den Export aufzunehmen. footer_text: label: Text in der Fußzeile caption: Dieser Text wird auf jeder Seite in der Mitte der Fußzeile angezeigt. submit_button: Download notifications: sidepanel: - title: E-Mail-Kalender-Aktualisierungen + title: "E-Mail-Kalender-Aktualisierungen" description: - disabled: Die Teilnehmer 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. + disabled: "Die Teilnehmer 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? + 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: 'Die Teilnehmer erhalten keine aktualisierten Kalendereinladungen - mehr per E-Mail, wenn sich das Datum, die Uhrzeit, der Ort oder die Teilnehmer - der Besprechung geändert haben. Wenn sie bereits eine Einladung für diese - Besprechung hatten, wird diese nicht mehr aktualisiert und könnte veraltete - Informationen anzeigen. - - ' + 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: > + Die Teilnehmer erhalten keine aktualisierten Kalendereinladungen mehr per E-Mail, wenn sich das Datum, die Uhrzeit, der Ort oder die Teilnehmer der Besprechung geändert haben. Wenn sie bereits eine Einladung für diese Besprechung hatten, wird diese nicht mehr aktualisiert und könnte veraltete Informationen anzeigen. confirm_label: - enable: E-Mail-Aktualisierungen aktivieren - disable: E-Mail-Aktualisierungen deaktivieren + enable: "E-Mail-Aktualisierungen aktivieren" + disable: "E-Mail-Aktualisierungen deaktivieren" banner: participants: - enabled: 'Alle Teilnehmer erhalten aktualisierte Kalendereinladungen per - E-Mail, wenn Sie Teilnehmer hinzufügen oder entfernen. - - ' - disabled: 'E-Mail-Kalenderaktualisierungen sind deaktiviert. Die Teilnehmer - erhalten keine E-Mails bei Änderungen an der Teilnehmerliste. - - ' + enabled: > + Alle Teilnehmer erhalten aktualisierte Kalendereinladungen per E-Mail, wenn Sie Teilnehmer hinzufügen oder entfernen. + disabled: > + E-Mail-Kalenderaktualisierungen sind deaktiviert. Die Teilnehmer erhalten keine E-Mails bei Änderungen an der Teilnehmerliste. onetime: - enabled: 'Alle Teilnehmer erhalten aktualisierte Kalendereinladungen per - E-Mail, wenn Sie Teilnehmer hinzufügen oder entfernen. - - ' - disabled: 'Die Teilnehmer erhalten keine E-Mail, die sie über Änderungen - des Datums, der Uhrzeit oder der Teilnehmer der Besprechung informiert. - - ' + enabled: > + Alle Teilnehmer erhalten aktualisierte Kalendereinladungen per E-Mail, wenn Sie Teilnehmer hinzufügen oder entfernen. + disabled: > + Die Teilnehmer 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. - - ' + 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. - - ' + 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 - exit: Präsentation verlassen - current_item: Aktuelles Element + title: "Präsentationsmodus" + button_present: "Präsentieren" + exit: "Präsentation verlassen" + current_item: "Aktuelles Element" total_items: "%{current} von %{total}" - previous: Zurück - next: Weiter - no_items: Keine Tagesordnungspunkte - no_items_flash: Es sind keine Tagesordnungspunkte vorhanden. + previous: "Zurück" + next: "Weiter" + no_items: "Keine Tagesordnungspunkte" + no_items_flash: "Es sind keine Tagesordnungspunkte vorhanden." ical_response: - update_failed: Teilnahmestatus konnte nicht aktualisiert werden. - meeting_not_found: Besprechung für die angegebene UID nicht gefunden. + update_failed: "Teilnahmestatus konnte nicht aktualisiert werden." + meeting_not_found: "Besprechung für die angegebene UID nicht gefunden." meeting_section: - untitled_title: Unbenannter Abschnitt - delete_confirmation: Wenn Sie den Abschnitt löschen, werden auch alle zugehörigen - Tagesordnungspunkte gelöscht. Möchten Sie fortfahren? - placeholder_title: Neuer Abschnitt - empty_text: Neue Agendapunkte hierhin bewegen oder neu erstellen + untitled_title: "Unbenannter Abschnitt" + delete_confirmation: "Wenn Sie den Abschnitt löschen, werden auch alle zugehörigen Tagesordnungspunkte gelöscht. Möchten Sie fortfahren?" + placeholder_title: "Neuer Abschnitt" + empty_text: "Neue Agendapunkte hierhin bewegen oder neu erstellen" meeting_participant: participation_status: - needs_action: Keine Antwort - accepted: Akzeptiert - declined: Abgelehnt - tentative: Vielleicht - unknown: Unbekannt + needs_action: "Keine Antwort" + accepted: "Akzeptiert" + declined: "Abgelehnt" + tentative: "Vielleicht" + unknown: "Unbekannt" recurring_meeting: time_zone_difference_banner: - title: Unterschiedliche Zeitzone - description: 'Die unten stehenden Daten beziehen sich auf die Zeitzone der Terminserie - (%{actual_zone}), nicht auf Ihre lokale Zeitzone (%{user_zone}). - - ' + title: "Unterschiedliche Zeitzone" + description: > + Die unten stehenden Daten beziehen sich auf die Zeitzone der Terminserie (%{actual_zone}), nicht auf Ihre lokale Zeitzone (%{user_zone}). ended_blankslate: - title: Terminserie beendet - message: 'Diese Terminserie ist beendet. Es finden keine weiteren Ereignisse - statt. ' - action: Sie können immer noch vorangegangene Besprechungen dieser Serie anzeigen - oder die Serie bearbeiten, um weitere Termine ergänzen. + title: "Terminserie beendet" + message: "Diese Terminserie ist beendet. Es finden keine weiteren Ereignisse statt. " + action: "Sie können immer noch vorangegangene Besprechungen dieser Serie anzeigen oder die Serie bearbeiten, um weitere Termine ergänzen." occurrence: - infoline: Diese Besprechung ist Teil einer Terminserie. - error_no_next: Es gibt keinen nächsten Termin für diese Serie. - first_already_exists: Das erste Vorkommen dieser Terminserie wurde bereits angelegt. - first_created: 'Die erste Besprechung wurde erfolgreich aus der Vorlage erstellt. - Weitere werden automatisch zu dem Zeitpunkt erstellt, wenn die vorhergehende - Besprechung startet. - - ' + infoline: "Diese Besprechung ist Teil einer Terminserie." + error_no_next: "Es gibt keinen nächsten Termin für diese Serie." + first_already_exists: "Das erste Vorkommen dieser Terminserie wurde bereits angelegt." + first_created: > + Die erste Besprechung wurde erfolgreich aus der Vorlage erstellt. Weitere werden automatisch zu dem Zeitpunkt erstellt, wenn die vorhergehende Besprechung startet. template: - button_finalize: Erste Besprechung öffnen - blank_title: Die Vorlage für die wiederkehrenden Besprechungen ist leer - description: 'Diese Vorlage wird immer dann verwendet, wenn neue Besprechungen - der Terminserie erstellt werden. Sie können zu dieser Vorlage Tagesordnungspunkte, - Teilnehmer und Anhänge hinzufügen. - - ' - label_view_template: Vorlage ansehen - label_edit_template: Vorlage bearbeiten - banner_html: 'Sie bearbeiten gerade eine Vorlage einer Terminserie: %{link}. - Jede neue Besprechung der Serie kopiert diese Vorlage. Änderungen wirken sich - nicht auf frühere oder bereits erstellte Besprechungen aus. - - ' - draft_banner_html: 'Sie bearbeiten gerade eine Vorlage einer Terminserie: %{link}. - Jede neue Besprechung der Serie kopiert diese Vorlage. Änderungen wirken sich - nicht auf frühere oder bereits erstellte Besprechungen aus. In diesem aktuellen - Entwurfsmodus werden keine E-Mail-Einladungen versendet, bis Sie das erste - Meeting öffnen. - - ' + button_finalize: "Erste Besprechung öffnen" + blank_title: "Die Vorlage für die wiederkehrenden Besprechungen ist leer" + description: > + Diese Vorlage wird immer dann verwendet, wenn neue Besprechungen der Terminserie erstellt werden. Sie können zu dieser Vorlage Tagesordnungspunkte, Teilnehmer und Anhänge hinzufügen. + label_view_template: "Vorlage ansehen" + label_edit_template: "Vorlage bearbeiten" + banner_html: > + Sie bearbeiten gerade eine Vorlage einer Terminserie: %{link}. Jede neue Besprechung der Serie kopiert diese Vorlage. Änderungen wirken sich nicht auf frühere oder bereits erstellte Besprechungen aus. + draft_banner_html: > + Sie bearbeiten gerade eine Vorlage einer Terminserie: %{link}. Jede neue Besprechung der Serie kopiert diese Vorlage. Änderungen wirken sich nicht auf frühere oder bereits erstellte Besprechungen aus. In diesem aktuellen Entwurfsmodus werden keine E-Mail-Einladungen versendet, bis Sie das erste Meeting öffnen. frequency: x_daily: - one: Jeden Tag - other: alle %{count} Tage + one: "Jeden Tag" + other: "alle %{count} Tage" x_weekly: - one: Jede Woche - other: alle %{count} Wochen - every_weekday: Jeden %{day_of_the_week} - working_days: An Arbeitstagen + one: "Jede Woche" + other: "alle %{count} Wochen" + every_weekday: "Jeden %{day_of_the_week}" + working_days: "An Arbeitstagen" end_after: - never: nie - specific_date: nach einem bestimmten Datum - iterations: nach einer Reihe von Ereignissen - starts: Beginnt + never: "nie" + specific_date: "nach einem bestimmten Datum" + iterations: "nach einer Reihe von Ereignissen" + starts: "Beginnt" in_words: - daily_interval: Alle %{interval} Tage - working_days: Jeden Arbeitstag - weekly: Jede Woche am %{weekday} - weekly_interval: Alle %{interval} Wochen am %{weekday} + daily_interval: "Alle %{interval} Tage" + working_days: "Jeden Arbeitstag" + weekly: "Jede Woche am %{weekday}" + weekly_interval: "Alle %{interval} Wochen am %{weekday}" frequency: "%{base} um %{time}" full: "%{base} um %{time}, endet %{end_date}" full_past: "%{base} um %{time}, endet am %{end_date}" never_ending: "%{base} um %{time}" open: - title: Tagesordnung eröffnet - subtitle: 'Offene Besprechungen haben Tagesordnungen, die bearbeitet werden - können und im Bereich "Meine Meetings" der Teilnehmer angezeigt werden. Änderungen - an der Vorlage für Besprechungsserien wirken sich nicht mehr auf diese bereits - geöffneten Besprechungen aus. - - ' + title: "Tagesordnung eröffnet" + subtitle: > + Offene Besprechungen haben Tagesordnungen, die bearbeitet werden können und im Bereich "Meine Meetings" der Teilnehmer angezeigt werden. Änderungen an der Vorlage für Besprechungsserien wirken sich nicht mehr auf diese bereits geöffneten Besprechungen aus. blankslate: - title: Zurzeit keine offenen Besprechungen - desc: Sie können eine geplante Besprechung manuell öffnen, indem Sie unten - auf die Schaltfläche "Öffnen" klicken + title: "Zurzeit keine offenen Besprechungen" + desc: "Sie können eine geplante Besprechung manuell öffnen, indem Sie unten auf die Schaltfläche \"Öffnen\" klicken" planned: - title: Geplant - subtitle: 'Die folgenden Besprechungen sind als Teil der Terminserie geplant, - aber noch nicht geöffnet. Jedes Mal, wenn eine geplante Besprechung beginnt, - wird die nächste automatisch für Sie geöffnet. Sie können geplante Besprechungen - auch manuell öffnen, um die Vorlage zu importieren und mit der Bearbeitung - der Tagesordnung zu beginnen. - - ' + title: "Geplant" + subtitle: > + Die folgenden Besprechungen sind als Teil der Terminserie geplant, aber noch nicht geöffnet. Jedes Mal, wenn eine geplante Besprechung beginnt, wird die nächste automatisch für Sie geöffnet. Sie können geplante Besprechungen auch manuell öffnen, um die Vorlage zu importieren und mit der Bearbeitung der Tagesordnung zu beginnen. blankslate: - title: Keine weiteren geplanten Besprechungen - desc: 'In dieser Terminserie sind keine weiteren Besprechungen geplant. Um - weitere Besprechungen zu planen oder die Serie zu erweitern, gehen Sie zur - Vorlage und bearbeiten Sie die Besprechungsdetails, um das Enddatum, die - Häufigkeit oder das Intervall zu ändern. - - ' + title: "Keine weiteren geplanten Besprechungen" + desc: > + In dieser Terminserie sind keine weiteren Besprechungen geplant. Um weitere Besprechungen zu planen oder die Serie zu erweitern, gehen Sie zur Vorlage und bearbeiten Sie die Besprechungsdetails, um das Enddatum, die Häufigkeit oder das Intervall zu ändern. delete_dialog: - title: Terminserie löschen - heading: Diese Terminserie endgültig löschen? + title: "Terminserie löschen" + heading: "Diese Terminserie endgültig löschen?" confirmation_message_html: - zero: 'Die Terminserie %{title} enthält keine Besprechungen. - Die Serie wird für alle gelöscht. Bitte gehen Sie mit Vorsicht vor. - - ' - one: 'Durch die Löschung von %{title} wird eine bestehende - Besprechung in dieser Serie gelöscht. Diese Aktion ist nicht rückgängig - zu machen. Bitte prüfen Sie die Angaben, bevor Sie fortfahren. - - ' - other: 'Durch die Löschung von %{title} werden alle %{count} - Besprechungen in dieser Serie gelöscht. Diese Aktion ist nicht rückgängig - zu machen. Bitte prüfen Sie die Angaben, bevor Sie fortfahren. - - ' + zero: > + Die Terminserie %{title} enthält keine Besprechungen. Die Serie wird für alle gelöscht. Bitte gehen Sie mit Vorsicht vor. + one: > + Durch die Löschung von %{title} wird eine bestehende Besprechung in dieser Serie gelöscht. Diese Aktion ist nicht rückgängig zu machen. Bitte prüfen Sie die Angaben, bevor Sie fortfahren. + other: > + Durch die Löschung von %{title} werden alle %{count} Besprechungen in dieser Serie gelöscht. Diese Aktion ist nicht rückgängig zu machen. Bitte prüfen Sie die Angaben, bevor Sie fortfahren. scheduled_delete_dialog: - title: Terminserie abbrechen - heading: Dieses Ereignis absagen? - confirmation_message_html: 'Sämtliche Inhalte der Besprechung, die nicht aus - der Vorlage entstammen, werden gelöscht und verloren werden. Möchten Sie fortfahren? - - ' - confirm_button: Besprechung absagen + title: "Terminserie abbrechen" + heading: "Dieses Ereignis absagen?" + confirmation_message_html: > + Sämtliche Inhalte der Besprechung, die nicht aus der Vorlage entstammen, werden gelöscht und verloren werden. Möchten Sie fortfahren? + confirm_button: "Besprechung absagen" end_series_dialog: - title: Terminserie beenden - notice_successful_notification: E-Mail-Kalendereinladung an alle Teilnehmer gesendet - notice_meeting_template_created: Vorlage wurde erstellt - notice_timezone_missing: Keine Zeitzone eingestellt und daher %{zone} angenommen. - Um Ihre Zeitzone einzustellen, klicken Sie bitte hier. - notice_meeting_updated: Diese Seite wurde von einem anderen Benutzer verändert. - Laden Sie neu, um die Änderungen zu sehen. - permission_create_meetings: Besprechungen erstellen - permission_edit_meetings: Besprechungen bearbeiten - permission_delete_meetings: Besprechungen löschen - permission_view_meetings: Besprechungen ansehen - permission_manage_agendas: Agenden anlegen/bearbeiten - permission_manage_agendas_explanation: Ermöglicht das Erstellen, Bearbeiten und - Entfernen von Tagesordnungspunkten - permission_manage_outcomes: Ergebnisse verwalten - permission_send_meeting_invites_and_outcomes: Besprechungseinladungen und -ergebnisse - an Teilnehmer senden - project_module_meetings: Besprechungen - text_duration_in_hours: Dauer in Stunden - text_in_hours: in Stunden - text_meeting_agenda_for_meeting: die Agenda für die Besprechung "%{meeting}" - text_meeting_template_blank_slate_heading: Es gibt keine Vorlagen zum Anzeigen - text_meeting_template_blank_slate: Sie können eine neue Vorlage für einmalige Besprechungen - erstellen - text_meeting_series_end_early_heading: Zukünftige Ereignisse löschen? - text_meeting_series_end_early: Durch das Beenden der Terminserie werden alle zukünftigen - offenen oder geplanten Besprechungsereignisse gelöscht - text_meeting_closing_are_you_sure: Sind Sie sicher, dass Sie die Agenda schließen - wollen? - text_meeting_agenda_open_are_you_sure: Es werden alle Änderungen im Protokoll überschrieben! - Wollen Sie fortfahren? - text_meeting_minutes_for_meeting: das Protokoll für die Besprechung "%{meeting}" - text_notificiation_invited: 'Diese Email enthält einen ics Eintrag für die untenstehende - Besprechung:' - text_meeting_ics_description: 'Link zur Besprechung: %{url}' - text_meeting_ics_meeting_series_description: 'Link zur Terminserie: %{url}' - text_meeting_occurrence_ics_description: 'URL der Besprechung: %{url} URL der Terminserie: - %{series_url}' - text_meeting_empty_heading: Ihre Besprechung ist leer - text_meeting_empty_description1: Beginnen Sie unten mit dem Hinzufügen von Tagesordnungspunkten. - Jeder Eintrag kann zunächst nur aus einem Titel bestehen. Optional können Sie - zusätzliche Details wie Dauer und Notizen hinzufügen. - text_meeting_empty_description2: Sie können auch Verweise auf bestehende Arbeitspakete - hinzufügen. So werden angehängte Notizen automatisch auch im "Besprechungen"-Tab - des Arbeitspakets angezeigt. - label_meeting_empty_action: Tagesordnungspunkt hinzufügen - label_meeting_actions: Aktionen der Besprechung - label_meeting_edit_title: Besprechungstitel bearbeiten - label_meeting_delete: Besprechung löschen - label_meeting_created_by: Erstellt von - label_meeting_last_updated: Zuletzt aktualisiert - label_meeting_reload: Neu laden - label_meeting_index_today: Heute - label_meeting_index_tomorrow: Morgen - label_meeting_index_this_week: Später in dieser Woche - label_meeting_index_later: Nächste Woche und später - label_agenda_items: Tagesordnungspunkte - label_agenda_items_reordered: neu geordnet - label_agenda_item_add: Tagesordnungspunkt hinzufügen - label_agenda_item_remove_from_agenda: Von der Tagesordnung entfernen - label_agenda_item_remove_from_backlog: Aus dem Backlog entfernen - label_agenda_item_undisclosed_wp: 'Arbeitspaket #%{id} ist nicht sichtbar' - label_agenda_item_deleted_wp: Referenz auf ein gelöschtes Arbeitspaket - label_agenda_item_actions: Aktionen zu Tagesordnungspunkten - label_agenda_item_move_to_next_title: Zur nächsten Besprechung verschieben? - label_agenda_item_move: Verschieben - label_agenda_item_move_to_next: Zur nächsten Besprechung verschieben - label_agenda_item_move_to_backlog: In Backlog verschieben - label_agenda_item_move_to_current_meeting: Zur aktuellen Besprechung verschieben - label_agenda_item_move_to_section: In Abschnitt verschieben - label_agenda_item_move_to_top: Nach ganz oben verschieben - label_agenda_item_move_to_bottom: Nach ganz unten verschieben - label_agenda_item_move_up: Nach oben verschieben - label_agenda_item_move_down: Nach unten verschieben - label_agenda_item_duplicate: Duplizieren - label_agenda_item_duplicate_in_next: In die nächste Besprechung duplizieren - 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_work_package_add: Arbeitspaket hinzufügen - label_agenda_item_work_package: Tagesordnungspunkt Arbeitspaket - label_section_rename: Abschnitt umbenennen - label_agenda_outcome: Ergebnis - label_agenda_new_outcome: Ergebnis hinzufügen - label_agenda_outcome_actions: Aktionen für die Ergebnisse von Agendapunkten - label_agenda_outcome_edit: Ergebnis bearbeiten - label_agenda_outcome_delete: Ergebnis entfernen - label_added_as_outcome: Als Ergebnis hinzugefügt - label_write_outcome: Ergebnis ergänzen - label_existing_work_package: Bestehendes Arbeitspaket - text_outcome_not_editable_anymore: Dieses Ergebnis ist nicht mehr bearbeitbar. - text_outcome_cannot_be_added: Ein Ergebnis kann nicht mehr hinzugefügt werden. - label_backlog_clear: Backlog leeren - label_backlog_clear_button: Eingabe löschen - text_backlog_clear_error: Ein oder mehrere Fehler trat auf beim Versuch, den Backlog - zu leeren. - label_agenda_backlog: Agenda-Backlog - text_agenda_backlog: 'Dieser Backlog gehört nur dieser einmaligen Besprechung. Sie - können Elemente einfügen um sie aus der Besprechungsagenda hinzuzufügen oder zu - entfernen. - - ' - label_agenda_backlog_clear_title: Backlog leeren? - text_agenda_backlog_clear_description: 'Sind Sie sicher, dass Sie alle aktuellen - Einträge entfernen möchten? Diese Aktion kann nicht rückgängig gemacht werden. - - ' - label_series_backlog: Backlog der Terminserie - text_series_backlog: 'Der Backlog wird mit allen Vorkommnissen dieser Terminserie - geteilt. Sie können Elemente hin- und herziehen um sie aus einer bestimmten Besprechung - hinzuzufügen oder zu entfernen. - - ' - label_series_backlog_clear_title: Backlog der Terminserie leeren? - text_series_backlog_clear_description: 'Dadurch werden alle Elemente des Backlogs - entfernt, die mit allen Besprechungen in der Terminserie geteilt werden. Sind - Sie sicher, dass Sie fortfahren möchten? Diese Aktion kann nicht rückgängig gemacht - werden. - - ' - text_agenda_item_title: Tagesordnungspunkt „%{title}“ - text_agenda_work_package_deleted: Tagesordnungspunkt für gelöschtes Arbeitspaket - text_deleted_agenda_item: Gelöschter Tagesordnungspunkt - label_initial_meeting_details: Besprechung - label_meeting_details: Besprechungsdetails - label_meeting_series_details: Details der Terminserie - label_meeting_details_edit: Besprechungsdetails bearbeiten - label_meeting_state: Besprechungsstatus - label_meeting_state_draft: Entwurf - label_meeting_state_open: Offen - label_meeting_state_closed: Geschlossen - label_meeting_state_agenda_created: Tagesordnung erstellt - label_meeting_state_planned: Geplant - label_meeting_state_cancelled: Abgesagt - label_meeting_state_skipped: Übersprungen - label_meeting_state_in_progress: In Durchführung - label_meeting_reopen_action: Besprechung wiedereröffnen - label_meeting_close_action: Besprechung schließen - label_meeting_in_progress_action: Besprechung starten - label_meeting_open_action: Besprechung öffnen - text_meeting_draft_description: Bereiten Sie Ihre Tagesordnung als Entwurf vor. - Besprechungen in diesem Modus versenden keine Kalenderaktualisierungen oder Einladungen, - selbst wenn Sie Besprechungsdetails ändern oder Teilnehmer hinzufügen/entfernen. - text_meeting_open_description: Sie können Tagesordnungspunkte hinzufügen oder entfernen - und bearbeiten. Sobald die Tagesordnung fertig ist, wechseln Sie auf In Durchführung, - um Ergebnisse zu dokumentieren. - text_meeting_closed_description: Diese Besprechung ist abgeschlossen. Sie können - keine Tagesordnungspunkte mehr hinzufügen/entfernen. - text_meeting_in_progress_description: Sie können die Tagesordnung ändern, die Ergebnisse - für jeden Agendapunkt dokumentieren und die Anwesenheit der Teilnehmer verfolgen. - Sobald die Besprechung abgeschlossen ist, können Sie sie als geschlossen markieren, - um sie zu sperren. - text_meeting_open_dropdown_description: Alle bestehenden Ergebnisse bleiben bestehen, - aber die Benutzer werden nicht in der Lage sein, neue Ergebnisse hinzuzufügen. - text_meeting_in_progress_dropdown_description: Ergebnisse der Besprechung festhalten, - wie z. B. Informationsbedarf oder Entscheidungen, die während der Besprechung - getroffen werden. - text_meeting_closed_dropdown_description: Diese Besprechung ist geschlossen. Sie - können keine Tagesordnungspunkte mehr hinzufügen/entfernen. - text_meeting_draft_banner: Dieses Meeting ist derzeit ein Entwurf. Diese Besprechung - sendet keine Kalenderaktualisierungen oder Einladungen, selbst wenn Sie Besprechungsdetails - ändern oder Teilnehmer hinzufügen/entfernen. - text_onetime_meeting_template_banner: Sie bearbeiten gerade eine Meeting-Vorlage. - Sie können diese Vorlage verwenden, um einmalige Besprechungen mit einer vordefinierten - Tagesordnung zu erstellen. Änderungen wirken sich nicht auf bereits erstellte - Meetings aus. - text_onetime_meeting_template_empty_heading: Die Vorlage für Besprechungen ist leer - text_onetime_meeting_template_empty_description: Fügen Sie hier Tagesordnungspunkte, - Abschnitte und Anhänge hinzu. Sie werden in jede mit dieser Vorlage erstellte - Besprechung aufgenommen. - text_exit_draft_mode_dialog_title: Diese Besprechung öffnen und Einladungen verschicken? - text_exit_draft_mode_dialog_subtitle: Sie können nicht mehr zum Entwurfsmodus zurückkehren, - sobald Sie die Besprechung eröffnen. - text_exit_draft_mode_dialog_template_title: Das erste Vorkommen dieser Terminserie - öffnen? - text_exit_draft_mode_dialog_template_subtitle: Sie können danach nicht mehr in den - Entwurfsmodus zurückkehren. - text_meeting_not_editable_anymore: Diese Besprechung ist nicht mehr bearbeitbar. - text_meeting_not_present_anymore: Dieses Meeting wurde gelöscht. Bitte wählen Sie - eine andere Besprechung. - label_add_work_package_to_meeting_dialog_title: Besprechung auswählen - label_add_work_package_to_meeting_section_label: Abschnitt - label_add_work_package_to_meeting_dialog_button: Zur Besprechung hinzufügen - label_meeting_selection_caption: Dieses Arbeitspaket kann nur zu einer bevorstehenden - oder laufenden Besprechung hinzugefügt werden. - label_section_selection_caption: Wählen Sie einen bestimmten Abschnitt der Tagesordnung - aus oder fügen Sie es zum Backlog hinzu. - placeholder_section_select_meeting_first: Besprechungsauswahl ist zuerst erforderlich - text_add_work_package_to_meeting_form: Das Arbeitspaket wird als Tagesordnungspunkt - zur ausgewählten Besprechung oder Backlog hinzugefügt. - text_add_work_package_to_meeting_description: Ein Arbeitspaket kann zu mehreren - Besprechungen hinzugefügt werden. - text_agenda_item_no_notes: Keine Notizen angegeben. - text_agenda_item_not_editable_anymore: Dieser Tagesordnungspunkt kann nicht mehr - bearbeitet werden. - text_agenda_item_move_next_meeting: Dieser Punkt wird auf die nächste Sitzung am - %{date} auf %{time} verschoben. - text_agenda_item_moved_to_next_meeting: Tagesordnungspunkt zur nächsten Besprechung - am %{date} verschoben - text_agenda_item_duplicate_in_next_meeting: Sind Sie sicher, dass Sie eine Kopie - dieses Tagesordnungspunktes in die nächste Besprechung am %{date} um %{time} aufnehmen - wollen? Ergebnisse dieses Eintrags werden nicht kopiert. - text_agenda_item_duplicated_in_next_meeting: Tagesordnungspunkt zum nächsten Besprechung - am %{date} kopiert - text_work_package_has_no_upcoming_meeting_agenda_items: Dieses Arbeitspaket ist - bisher in keiner anstehenden Besprechung enthalten. - text_agenda_item_no_available_occurrence: Alle kommenden Besprechungen wurden abgesagt. - text_agenda_item_dialog_skipping_cancelled_one: 'Hinweis: Abgesagte Besprechung - am %{date} wird übersprungen.' - text_agenda_item_dialog_skipping_cancelled_many: 'Hinweis: Überspringe %{count} - abgesagte Besprechungen.' - text_work_package_add_to_meeting_hint: Über den Button "Zur Besprechung hinzufügen" - können Sie dieses Arbeitspaket zu einer zukünftigen Besprechung hinzuzufügen. - text_work_package_has_no_past_meeting_agenda_items: Dieses Arbeitspaket wurde in - einer früheren Besprechung nicht als Tagesordnungspunkt hinzugefügt. - text_email_updates_muted: E-Mail-Kalenderaktualisierungen sind deaktiviert. Die - Teilnehmer erhalten keine aktualisierten Einladungen per E-Mail, wenn Sie Änderungen - vornehmen. - text_email_updates_enabled: E-Mail-Kalenderaktualisierungen sind aktiviert. Alle - Teilnehmenden erhalten aktualisierte Einladungen per E-Mail, wenn Sie Änderungen - vornehmen. + title: "Terminserie beenden" + notice_successful_notification: "E-Mail-Kalendereinladung an alle Teilnehmer gesendet" + notice_meeting_template_created: "Vorlage wurde erstellt" + notice_timezone_missing: Keine Zeitzone eingestellt und daher %{zone} angenommen. Um Ihre Zeitzone einzustellen, klicken Sie bitte hier. + notice_meeting_updated: "Diese Seite wurde von einem anderen Benutzer verändert. Laden Sie neu, um die Änderungen zu sehen." + permission_create_meetings: "Besprechungen erstellen" + permission_edit_meetings: "Besprechungen bearbeiten" + permission_delete_meetings: "Besprechungen löschen" + permission_view_meetings: "Besprechungen ansehen" + permission_manage_agendas: "Agenden anlegen/bearbeiten" + permission_manage_agendas_explanation: "Ermöglicht das Erstellen, Bearbeiten und Entfernen von Tagesordnungspunkten" + permission_manage_outcomes: "Ergebnisse verwalten" + permission_send_meeting_invites_and_outcomes: "Besprechungseinladungen und -ergebnisse an Teilnehmer senden" + project_module_meetings: "Besprechungen" + text_duration_in_hours: "Dauer in Stunden" + text_in_hours: "in Stunden" + text_meeting_agenda_for_meeting: 'die Agenda für die Besprechung "%{meeting}"' + text_meeting_template_blank_slate_heading: "Es gibt keine Vorlagen zum Anzeigen" + text_meeting_template_blank_slate: "Sie können eine neue Vorlage für einmalige Besprechungen erstellen" + text_meeting_series_end_early_heading: "Zukünftige Ereignisse löschen?" + text_meeting_series_end_early: "Durch das Beenden der Terminserie werden alle zukünftigen offenen oder geplanten Besprechungsereignisse gelöscht" + text_meeting_closing_are_you_sure: "Sind Sie sicher, dass Sie die Agenda schließen wollen?" + text_meeting_agenda_open_are_you_sure: "Es werden alle Änderungen im Protokoll überschrieben! Wollen Sie fortfahren?" + text_meeting_minutes_for_meeting: 'das Protokoll für die Besprechung "%{meeting}"' + text_notificiation_invited: "Diese Email enthält einen ics Eintrag für die untenstehende Besprechung:" + text_meeting_ics_description: >- + Link zur Besprechung: %{url} + text_meeting_ics_meeting_series_description: >- + Link zur Terminserie: %{url} + text_meeting_occurrence_ics_description: >- + URL der Besprechung: %{url} URL der Terminserie: %{series_url} + text_meeting_empty_heading: "Ihre Besprechung ist leer" + text_meeting_empty_description1: "Beginnen Sie unten mit dem Hinzufügen von Tagesordnungspunkten. Jeder Eintrag kann zunächst nur aus einem Titel bestehen. Optional können Sie zusätzliche Details wie Dauer und Notizen hinzufügen." + text_meeting_empty_description2: 'Sie können auch Verweise auf bestehende Arbeitspakete hinzufügen. So werden angehängte Notizen automatisch auch im "Besprechungen"-Tab des Arbeitspakets angezeigt.' + label_meeting_empty_action: "Tagesordnungspunkt hinzufügen" + label_meeting_actions: "Aktionen der Besprechung" + label_meeting_edit_title: "Besprechungstitel bearbeiten" + label_meeting_delete: "Besprechung löschen" + label_meeting_created_by: "Erstellt von" + label_meeting_last_updated: "Zuletzt aktualisiert" + label_meeting_reload: "Neu laden" + label_meeting_index_today: "Heute" + label_meeting_index_tomorrow: "Morgen" + label_meeting_index_this_week: "Später in dieser Woche" + label_meeting_index_later: "Nächste Woche und später" + label_agenda_items: "Tagesordnungspunkte" + label_agenda_items_reordered: "neu geordnet" + label_agenda_item_add: "Tagesordnungspunkt hinzufügen" + label_agenda_item_remove_from_agenda: "Von der Tagesordnung entfernen" + label_agenda_item_remove_from_backlog: "Aus dem Backlog entfernen" + label_agenda_item_undisclosed_wp: "Arbeitspaket #%{id} ist nicht sichtbar" + label_agenda_item_deleted_wp: "Referenz auf ein gelöschtes Arbeitspaket" + label_agenda_item_actions: "Aktionen zu Tagesordnungspunkten" + label_agenda_item_move_to_next_title: "Zur nächsten Besprechung verschieben?" + label_agenda_item_move: "Verschieben" + label_agenda_item_move_to_next: "Zur nächsten Besprechung verschieben" + label_agenda_item_move_to_backlog: "In Backlog verschieben" + label_agenda_item_move_to_current_meeting: "Zur aktuellen Besprechung verschieben" + label_agenda_item_move_to_section: "In Abschnitt verschieben" + label_agenda_item_move_to_top: "Nach ganz oben verschieben" + label_agenda_item_move_to_bottom: "Nach ganz unten verschieben" + label_agenda_item_move_up: "Nach oben verschieben" + label_agenda_item_move_down: "Nach unten verschieben" + label_agenda_item_duplicate: "Duplizieren" + label_agenda_item_duplicate_in_next: "In die nächste Besprechung duplizieren" + 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_work_package_add: "Arbeitspaket hinzufügen" + label_agenda_item_work_package: "Tagesordnungspunkt Arbeitspaket" + label_section_rename: "Abschnitt umbenennen" + label_agenda_outcome: "Ergebnis" + label_agenda_new_outcome: "Ergebnis hinzufügen" + label_agenda_outcome_actions: "Aktionen für die Ergebnisse von Agendapunkten" + label_agenda_outcome_edit: "Ergebnis bearbeiten" + label_agenda_outcome_delete: "Ergebnis entfernen" + label_added_as_outcome: "Als Ergebnis hinzugefügt" + label_write_outcome: "Ergebnis ergänzen" + label_existing_work_package: "Bestehendes Arbeitspaket" + text_outcome_not_editable_anymore: "Dieses Ergebnis ist nicht mehr bearbeitbar." + text_outcome_cannot_be_added: "Ein Ergebnis kann nicht mehr hinzugefügt werden." + label_backlog_clear: "Backlog leeren" + label_backlog_clear_button: "Eingabe löschen" + text_backlog_clear_error: "Ein oder mehrere Fehler trat auf beim Versuch, den Backlog zu leeren." + label_agenda_backlog: "Agenda-Backlog" + text_agenda_backlog: > + Dieser Backlog gehört nur dieser einmaligen Besprechung. Sie können Elemente einfügen um sie aus der Besprechungsagenda hinzuzufügen oder zu entfernen. + label_agenda_backlog_clear_title: "Backlog leeren?" + text_agenda_backlog_clear_description: > + Sind Sie sicher, dass Sie alle aktuellen Einträge entfernen möchten? Diese Aktion kann nicht rückgängig gemacht werden. + label_series_backlog: "Backlog der Terminserie" + text_series_backlog: > + Der Backlog wird mit allen Vorkommnissen dieser Terminserie geteilt. Sie können Elemente hin- und herziehen um sie aus einer bestimmten Besprechung hinzuzufügen oder zu entfernen. + label_series_backlog_clear_title: "Backlog der Terminserie leeren?" + text_series_backlog_clear_description: > + Dadurch werden alle Elemente des Backlogs entfernt, die mit allen Besprechungen in der Terminserie geteilt werden. Sind Sie sicher, dass Sie fortfahren möchten? Diese Aktion kann nicht rückgängig gemacht werden. + text_agenda_item_title: 'Tagesordnungspunkt „%{title}“' + text_agenda_work_package_deleted: "Tagesordnungspunkt für gelöschtes Arbeitspaket" + text_deleted_agenda_item: "Gelöschter Tagesordnungspunkt" + label_initial_meeting_details: "Besprechung" + label_meeting_details: "Besprechungsdetails" + label_meeting_series_details: "Details der Terminserie" + label_meeting_details_edit: "Besprechungsdetails bearbeiten" + label_meeting_state: "Besprechungsstatus" + label_meeting_state_draft: "Entwurf" + label_meeting_state_open: "Offen" + label_meeting_state_closed: "Geschlossen" + label_meeting_state_agenda_created: "Tagesordnung erstellt" + label_meeting_state_planned: "Geplant" + label_meeting_state_cancelled: "Abgesagt" + label_meeting_state_skipped: "Übersprungen" + label_meeting_state_in_progress: "In Durchführung" + label_meeting_reopen_action: "Besprechung wiedereröffnen" + label_meeting_close_action: "Besprechung schließen" + label_meeting_in_progress_action: "Besprechung starten" + label_meeting_open_action: "Besprechung öffnen" + text_meeting_draft_description: "Bereiten Sie Ihre Tagesordnung als Entwurf vor. Besprechungen in diesem Modus versenden keine Kalenderaktualisierungen oder Einladungen, selbst wenn Sie Besprechungsdetails ändern oder Teilnehmer hinzufügen/entfernen." + text_meeting_open_description: "Sie können Tagesordnungspunkte hinzufügen oder entfernen und bearbeiten. Sobald die Tagesordnung fertig ist, wechseln Sie auf In Durchführung, um Ergebnisse zu dokumentieren." + text_meeting_closed_description: "Diese Besprechung ist abgeschlossen. Sie können keine Tagesordnungspunkte mehr hinzufügen/entfernen." + text_meeting_in_progress_description: "Sie können die Tagesordnung ändern, die Ergebnisse für jeden Agendapunkt dokumentieren und die Anwesenheit der Teilnehmer verfolgen. Sobald die Besprechung abgeschlossen ist, können Sie sie als geschlossen markieren, um sie zu sperren." + text_meeting_open_dropdown_description: "Alle bestehenden Ergebnisse bleiben bestehen, aber die Benutzer werden nicht in der Lage sein, neue Ergebnisse hinzuzufügen." + text_meeting_in_progress_dropdown_description: "Ergebnisse der Besprechung festhalten, wie z. B. Informationsbedarf oder Entscheidungen, die während der Besprechung getroffen werden." + text_meeting_closed_dropdown_description: "Diese Besprechung ist geschlossen. Sie können keine Tagesordnungspunkte mehr hinzufügen/entfernen." + text_meeting_draft_banner: "Dieses Meeting ist derzeit ein Entwurf. Diese Besprechung sendet keine Kalenderaktualisierungen oder Einladungen, selbst wenn Sie Besprechungsdetails ändern oder Teilnehmer hinzufügen/entfernen." + text_onetime_meeting_template_banner: "Sie bearbeiten gerade eine Meeting-Vorlage. Sie können diese Vorlage verwenden, um einmalige Besprechungen mit einer vordefinierten Tagesordnung zu erstellen. Änderungen wirken sich nicht auf bereits erstellte Meetings aus." + text_onetime_meeting_template_empty_heading: "Die Vorlage für Besprechungen ist leer" + text_onetime_meeting_template_empty_description: "Fügen Sie hier Tagesordnungspunkte, Abschnitte und Anhänge hinzu. Sie werden in jede mit dieser Vorlage erstellte Besprechung aufgenommen." + text_exit_draft_mode_dialog_title: "Diese Besprechung öffnen und Einladungen verschicken?" + text_exit_draft_mode_dialog_subtitle: "Sie können nicht mehr zum Entwurfsmodus zurückkehren, sobald Sie die Besprechung eröffnen." + text_exit_draft_mode_dialog_template_title: "Das erste Vorkommen dieser Terminserie öffnen?" + text_exit_draft_mode_dialog_template_subtitle: "Sie können danach nicht mehr in den Entwurfsmodus zurückkehren." + label_meeting_template_sharing: "Teilen" + label_meeting_template_sharing_none: "Nur dieses Projekt" + label_meeting_template_sharing_descendants: "Unterprojekte" + label_meeting_template_sharing_system: "Alle Projekte" + text_meeting_template_sharing_description: "Diese Vorlage kann mit Unterprojekten oder anderen Projekten geteilt werden. Es werden nur die Tagesordnungspunkte und Anhänge kopiert." + text_meeting_not_editable_anymore: "Diese Besprechung ist nicht mehr bearbeitbar." + text_meeting_not_present_anymore: "Dieses Meeting wurde gelöscht. Bitte wählen Sie eine andere Besprechung." + label_add_work_package_to_meeting_dialog_title: "Besprechung auswählen" + label_add_work_package_to_meeting_section_label: "Abschnitt" + label_add_work_package_to_meeting_dialog_button: "Zur Besprechung hinzufügen" + label_meeting_selection_caption: "Dieses Arbeitspaket kann nur zu einer bevorstehenden oder laufenden Besprechung hinzugefügt werden." + label_section_selection_caption: "Wählen Sie einen bestimmten Abschnitt der Tagesordnung aus oder fügen Sie es zum Backlog hinzu." + placeholder_section_select_meeting_first: "Besprechungsauswahl ist zuerst erforderlich" + text_add_work_package_to_meeting_form: "Das Arbeitspaket wird als Tagesordnungspunkt zur ausgewählten Besprechung oder Backlog hinzugefügt." + text_add_work_package_to_meeting_description: "Ein Arbeitspaket kann zu mehreren Besprechungen hinzugefügt werden." + text_agenda_item_no_notes: "Keine Notizen angegeben." + text_agenda_item_not_editable_anymore: "Dieser Tagesordnungspunkt kann nicht mehr bearbeitet werden." + text_agenda_item_move_next_meeting: "Dieser Punkt wird auf die nächste Sitzung am %{date} auf %{time} verschoben." + text_agenda_item_moved_to_next_meeting: "Tagesordnungspunkt zur nächsten Besprechung am %{date} verschoben" + text_agenda_item_duplicate_in_next_meeting: "Sind Sie sicher, dass Sie eine Kopie dieses Tagesordnungspunktes in die nächste Besprechung am %{date} um %{time} aufnehmen wollen? Ergebnisse dieses Eintrags werden nicht kopiert." + text_agenda_item_duplicated_in_next_meeting: "Tagesordnungspunkt zum nächsten Besprechung am %{date} kopiert" + text_work_package_has_no_upcoming_meeting_agenda_items: "Dieses Arbeitspaket ist bisher in keiner anstehenden Besprechung enthalten." + text_agenda_item_no_available_occurrence: "Alle kommenden Besprechungen wurden abgesagt." + text_agenda_item_dialog_skipping_cancelled_one: "Hinweis: Abgesagte Besprechung am %{date} wird übersprungen." + text_agenda_item_dialog_skipping_cancelled_many: "Hinweis: Überspringe %{count} abgesagte Besprechungen." + text_work_package_add_to_meeting_hint: 'Über den Button "Zur Besprechung hinzufügen" können Sie dieses Arbeitspaket zu einer zukünftigen Besprechung hinzuzufügen.' + text_work_package_has_no_past_meeting_agenda_items: "Dieses Arbeitspaket wurde in einer früheren Besprechung nicht als Tagesordnungspunkt hinzugefügt." + text_email_updates_muted: "E-Mail-Kalenderaktualisierungen sind deaktiviert. Die Teilnehmer erhalten keine aktualisierten Einladungen per E-Mail, wenn Sie Änderungen vornehmen." + text_email_updates_enabled: "E-Mail-Kalenderaktualisierungen sind aktiviert. Alle Teilnehmenden erhalten aktualisierte Einladungen per E-Mail, wenn Sie Änderungen vornehmen." my_account: access_tokens: token/ical_meeting: - blank_description: Sie können ein Token erstellen, indem sie auf die Schaltfläche - unten klicken. - blank_title: Kein iCalendar-Besprechungs-Token - title: iCalendar für Besprechungen - table_title: iCalendar-Besprechungs-Token - text_hint: iCalendar Besprechungs-Token ermöglichen es Benutzern, ihre Besprechungen - zu abonnieren und aktuelle Informationen in externen Kalendern anzuzeigen. - disabled_text: iCalendar Besprechungs-Abonnements wurden nicht vom Administrator - aktiviert. Bitte wenden Sie sich an Ihren Administrator, um diese Funktion - zu nutzen. - add_button: Im Kalender abonnieren + blank_description: "Sie können ein Token erstellen, indem sie auf die Schaltfläche unten klicken." + blank_title: "Kein iCalendar-Besprechungs-Token" + title: "iCalendar für Besprechungen" + table_title: "iCalendar-Besprechungs-Token" + text_hint: "iCalendar Besprechungs-Token ermöglichen es Benutzern, ihre Besprechungen zu abonnieren und aktuelle Informationen in externen Kalendern anzuzeigen." + disabled_text: "iCalendar Besprechungs-Abonnements wurden nicht vom Administrator aktiviert. Bitte wenden Sie sich an Ihren Administrator, um diese Funktion zu nutzen." + add_button: "Im Kalender abonnieren" my: access_token: dialog: token/ical_meeting: - dialog_title: Neues iCal-Abonnement-Token für Besprechungen - dialog_body: Dieses Token generiert eine iCal-URL, mit der Sie alle Ihre - Termine in einer externen Kalenderanwendung anzeigen können. - create_button: Abonnement erstellen - name_label: Token-Name - name_caption: Sie können den Token beliebig nennen, z. B. passend zum Gerät - an dem es eingesetzt wird, wie "Mein Handy" oder "Arbeitsrechner". + dialog_title: "Neues iCal-Abonnement-Token für Besprechungen" + dialog_body: "Dieses Token generiert eine iCal-URL, mit der Sie alle Ihre Termine in einer externen Kalenderanwendung anzeigen können." + create_button: "Abonnement erstellen" + name_label: "Token-Name" + name_caption: 'Sie können den Token beliebig nennen, z. B. passend zum Gerät an dem es eingesetzt wird, wie "Mein Handy" oder "Arbeitsrechner".' created_dialog: token/ical_meeting: - title: Ein iCal-Abonnement-Token für Besprechungen wurde erstellt - body: Behandeln Sie die folgende URL wie ein Passwort. Jeder, der Zugriff - darauf hat, kann alle Ihre Meetings einsehen. + title: "Ein iCal-Abonnement-Token für Besprechungen wurde erstellt" + body: "Behandeln Sie die folgende URL wie ein Passwort. Jeder, der Zugriff darauf hat, kann alle Ihre Meetings einsehen." revocation: token/ical_meeting: - notice_success: Das iCal-Abonnement-Token für Besprechungen wurde erfolgreich - widerrufen. - notice_failure: 'iCal-Abonnement-Token für Besprechungen konnte nicht widerrufen - werden: %{error}' - label_meeting_template_sharing: Teilen - label_meeting_template_sharing_none: Nur dieses Projekt - label_meeting_template_sharing_descendants: Unterprojekte - label_meeting_template_sharing_system: Alle Projekte - text_meeting_template_sharing_description: Diese Vorlage kann mit Unterprojekten - oder anderen Projekten geteilt werden. Es werden nur die Tagesordnungspunkte und - Anhänge kopiert. + notice_success: "Das iCal-Abonnement-Token für Besprechungen wurde erfolgreich widerrufen." + notice_failure: "iCal-Abonnement-Token für Besprechungen konnte nicht widerrufen werden: %{error}" diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index 592ff1f8d98..09c6cda97c5 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -216,8 +216,8 @@ fr: heading: "Aucun participant" description: "Il n'y a pas encore de participants." attachments: - onetime_template: "These attached files will be included in all future meetings using this template." - series_template: "These attached files will be included in all future meetings in the series." + onetime_template: "Ces fichiers joints seront inclus dans toutes les futures réunions de la série." + series_template: "Ces fichiers joints seront inclus dans toutes les futures réunions de la série." text: "Les fichiers joints sont accessibles à tous les participants à la réunion. Vous pouvez également les glisser-déposer dans les notes relatives aux points de l'ordre du jour." copy: title: "Copier la réunion : %{title}" @@ -294,7 +294,7 @@ fr: title: "Supprimer le modèle" heading: "Supprimer ce modèle ?" confirmation_message_html: > - This action is not reversible. Please proceed with caution. Existing meetings that were created using this template will not be affected. + Cette action n'est pas réversible. Veuillez procéder avec prudence. Les réunions existantes qui ont été créées à l'aide de ce modèle ne seront pas affectées. occurrence: title: "Annuler l'occurrence de la réunion" heading: "Annuler cette occurrence de réunion ?" diff --git a/modules/meeting/config/locales/crowdin/ko.yml b/modules/meeting/config/locales/crowdin/ko.yml index e86f8d452f3..f624df287a7 100644 --- a/modules/meeting/config/locales/crowdin/ko.yml +++ b/modules/meeting/config/locales/crowdin/ko.yml @@ -211,8 +211,8 @@ ko: heading: "참가자 없음" description: "아직 참가자가 없습니다." attachments: - onetime_template: "These attached files will be included in all future meetings using this template." - series_template: "These attached files will be included in all future meetings in the series." + onetime_template: "이러한 첨부 파일은 이 템플릿을 사용하는 모든 향후 미팅에 포함됩니다." + series_template: "이러한 첨부 파일은 시리즈의 모든 향후 미팅에 포함됩니다." text: "첨부된 파일은 모든 미팅 참가자가 사용할 수 있습니다. 이러한 파일을 의제 항목 메모에 끌어다 놓을 수도 있습니다." copy: title: "미팅 복사: %{title}" @@ -289,7 +289,7 @@ ko: title: "템플릿 삭제" heading: "이 템플릿을 삭제하시겠습니까?" confirmation_message_html: > - This action is not reversible. Please proceed with caution. Existing meetings that were created using this template will not be affected. + 이 작업은 되돌릴 수 없습니다. 주의해서 진행하시기 바랍니다. 이 템플릿을 사용하여 만든 기존 미팅은 영향을 받지 않습니다. occurrence: title: "미팅 항목 취소" heading: "이 미팅 항목을 취소하시겠습니까?" diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index e4a1190f080..ab2052d8fb7 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -44,7 +44,7 @@ ru: start_date: "Дата" start_time: "Время начала" start_time_hour: "Время начала" - sharing: "Sharing" + sharing: "Совместное использование" meeting_agenda_item: title: "Заголовок" author: "Автор" @@ -73,7 +73,7 @@ ru: meeting_participant: user_invalid: "не является действительным участником." meeting_agenda_item: - section_not_belong_to_meeting: "Section does not belong to the same meeting." + section_not_belong_to_meeting: "Раздел не принадлежит к одному и тому же совещанию." user_invalid: "не является действительным участником." recurring_meeting_interim_response: not_an_occurrence: "is not a valid occurrence time for this recurring meeting" @@ -205,7 +205,7 @@ ru: label_time_zone: "Часовой пояс" label_start_date: "Дата начала" label_subscribe_icalendar: "Подписаться на календарь" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_meeting_template_select: "Выберите шаблон для автоматического копирования его повестки дня" caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: @@ -630,18 +630,18 @@ ru: 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." - text_onetime_meeting_template_empty_heading: "This meeting template is empty" + text_onetime_meeting_template_banner: "В данный момент Вы редактируете шаблон совещания. Вы можете использовать этот шаблон для создания одноразовых совещаний с заранее определенной повесткой дня. Изменения не повлияют на уже созданные совещания." + text_onetime_meeting_template_empty_heading: "Этот шаблон совещания пуст" text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Открыть это совещание и разослать приглашения?" text_exit_draft_mode_dialog_subtitle: "Вы не можете вернуться в режим черновика после того, как запланировали совещание." text_exit_draft_mode_dialog_template_title: "Открыть первое совещание из этой серии?" text_exit_draft_mode_dialog_template_subtitle: "После этого Вы не сможете вернуться в режим черновика." - label_meeting_template_sharing: "Sharing" - label_meeting_template_sharing_none: "Only this project" - label_meeting_template_sharing_descendants: "Subprojects" - label_meeting_template_sharing_system: "All projects" - text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied." + label_meeting_template_sharing: "Совместное использование" + label_meeting_template_sharing_none: "Только этот проект" + label_meeting_template_sharing_descendants: "Подпроекты" + label_meeting_template_sharing_system: "Все проекты" + text_meeting_template_sharing_description: "Этот шаблон можно использовать совместно с подпроектами или другими проектами. Будут скопированы только пункты повестки дня и вложения." text_meeting_not_editable_anymore: "Это совещание больше нельзя редактировать." text_meeting_not_present_anymore: "Это совещание было удалено. Пожалуйста, выберите другое." label_add_work_package_to_meeting_dialog_title: "Выберите совещание" diff --git a/modules/meeting/config/locales/crowdin/zh-CN.yml b/modules/meeting/config/locales/crowdin/zh-CN.yml index e8d532d13fa..6ad4209c0e4 100644 --- a/modules/meeting/config/locales/crowdin/zh-CN.yml +++ b/modules/meeting/config/locales/crowdin/zh-CN.yml @@ -211,8 +211,8 @@ zh-CN: heading: "沒有与会者" description: "还没有参加者。" attachments: - onetime_template: "These attached files will be included in all future meetings using this template." - series_template: "These attached files will be included in all future meetings in the series." + onetime_template: "今后所有使用此模板的会议都将包含这些随附文件。" + series_template: "今后此系列中的所有会议都将包含这些随附文件。" text: "所有与会者都可以查看附件。您还可以将这些文件拖放到议程项目注释中。" copy: title: "复制会议: %{title}" @@ -289,7 +289,7 @@ zh-CN: title: "删除模板" heading: "是否删除此模板?" confirmation_message_html: > - This action is not reversible. Please proceed with caution. Existing meetings that were created using this template will not be affected. + 此操作无法撤消。请谨慎操作。使用此模板创建的现有会议将不受影响。 occurrence: title: "取消会议事件" heading: "取消此会议事件?" @@ -620,7 +620,7 @@ zh-CN: label_meeting_template_sharing_none: "仅此项目" label_meeting_template_sharing_descendants: "子项目" label_meeting_template_sharing_system: "所有项目" - text_meeting_template_sharing_description: "在这种情况下,此模板可以与此实例中的子项目或其他项目共享。仅复制议程条目和附件。" + text_meeting_template_sharing_description: "此模板可以与此实例中的子项目或其他项目共享。仅复制议程条目和附件。" text_meeting_not_editable_anymore: "本次会议已不可编辑。" text_meeting_not_present_anymore: "此次会议已被删除。请选择另一次会议。" label_add_work_package_to_meeting_dialog_title: "选择会议" diff --git a/modules/storages/config/locales/crowdin/ru.yml b/modules/storages/config/locales/crowdin/ru.yml index db0c20535d6..1cc7b7c77f9 100644 --- a/modules/storages/config/locales/crowdin/ru.yml +++ b/modules/storages/config/locales/crowdin/ru.yml @@ -104,20 +104,20 @@ ru: create_folder: 'Создание управляемых папок проекта:' ensure_root_folder_permissions: 'Установить разрешения для базовых папок:' hide_inactive_folders: 'Скрыть неактивные папки:' - remote_folders: 'Read contents of the team folder:' + remote_folders: 'Чтение содержимого командной папки:' remove_user_from_group: 'Удалить пользователя из группы:' rename_project_folder: 'Переименовать управляемую папку проекта:' one_drive_sync_service: create_folder: 'Создание управляемых папок проекта:' ensure_root_folder_permissions: 'Установить разрешения для базовых папок:' hide_inactive_folders: 'Скрыть неактивные папки:' - remote_folders: 'Read contents of the drive root folder:' + remote_folders: 'Чтение содержимого корневой папки диска:' rename_project_folder: 'Переименовать управляемую папку проекта:' sharepoint_sync_service: create_folder: 'Создание управляемых папок проекта:' ensure_root_folder_permissions: 'Установить разрешения для базовых папок:' hide_inactive_folders: 'Скрыть неактивные папки:' - remote_folders: 'Read contents of the drive root folder:' + remote_folders: 'Чтение содержимого корневой папки диска:' rename_project_folder: 'Переименовать управляемую папку проекта:' errors: messages: @@ -140,7 +140,7 @@ ru: conflict: Папка %{folder_name} уже существует на %{parent_location}. not_found: "%{parent_location} не найден." ensure_root_folder_permissions: - not_found: "%{group_folder} wasn't found. Please check your Nextcloud Team Folder setup." + not_found: "%{group_folder} не найдена. Пожалуйста, проверьте настройки команды в Nextcloud." permission_not_set: не удалось установить разрешения на %{group_folder}. hide_inactive_folders: permission_not_set: не удалось установить разрешения на %{path}. @@ -230,7 +230,7 @@ ru: storage_delete_result_3: Автоматически управляемая папка проекта и все файлы в ней будут удалены dependencies: nextcloud: - group_folders_app: Team Folders + group_folders_app: Папки команды integration_app: Интеграция OpenProject enabled_in_projects: setup_incomplete_description: Это хранилище имеет незавершенную настройку. Пожалуйста, завершите настройку, прежде чем включать его в нескольких проектах. @@ -277,11 +277,11 @@ ru: client_folder_creation: Автоматическое создание папки client_folder_removal: Автоматическое удаление папок drive_contents: Содержимое диска - files_request: Fetching team folder files + files_request: Получение файлов папки команды header: Автоматически управляемые папки проекта - team_folder_app: 'Dependency: Team Folders' - team_folder_contents: Team folder content - team_folder_presence: Team folder exists + team_folder_app: 'Зависимость: папки команды' + team_folder_contents: Содержимое папки команды + team_folder_presence: Папка команды существует userless_access: Аутентификация на стороне сервера authentication: existing_token: Токен пользователя @@ -326,8 +326,8 @@ ru: nc_oauth_request_not_found: Конечная точка для получения данных о текущем подключенном пользователе не найдена. Пожалуйста, проверьте журналы сервера для получения дополнительной информации. nc_oauth_request_unauthorized: Текущий пользователь не авторизован для доступа к удаленному файловому хранилищу. Пожалуйста, проверьте журналы сервера для получения дополнительной информации. nc_oauth_token_missing: OpenProject не может протестировать пользовательскую связь с Nextcloud, так как пользователь еще не связал свою учетную запись Nextcloud. - nc_team_folder_not_found: The team folder could not be found. - nc_unexpected_content: Unexpected content found in the managed team folder. + nc_team_folder_not_found: Папка команды не найдена. + nc_unexpected_content: Непредвиденное содержимое найдено в папке команды. nc_userless_access_denied: Указанный пароль приложения неверен. not_configured: Соединение не удалось подтвердить. Пожалуйста, сначала завершите настройку. od_client_cant_delete_folder: У клиента возникли проблемы с удалением папок. Пожалуйста, проверьте документацию по конфигурации для вашего хранилища. From 6cf18bf124f05f9dcea885bee6bc14793a7e8577 Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Tue, 10 Mar 2026 08:32:41 -0300 Subject: [PATCH 226/334] Fix stories_in_backlog_spec for spec method rename See changes introduced in commit bdabc82d --- modules/backlogs/spec/features/stories_in_backlog_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/spec/features/stories_in_backlog_spec.rb b/modules/backlogs/spec/features/stories_in_backlog_spec.rb index ebdcbe514e2..37dc5efc407 100644 --- a/modules/backlogs/spec/features/stories_in_backlog_spec.rb +++ b/modules/backlogs/spec/features/stories_in_backlog_spec.rb @@ -191,13 +191,13 @@ RSpec.describe "Stories in backlog", :js, :settings_reset do .click_in_story_menu(sprint_story1, "Open details view") backlogs_page.expect_details_view(sprint_story1) - backlogs_page.expect_story_in_sprint(sprint_story2, sprint) + backlogs_page.expect_story_in_backlog(sprint_story2, sprint) backlogs_page .click_in_story_menu(sprint_story2, "Open details view") backlogs_page.expect_details_view(sprint_story2) - backlogs_page.expect_story_in_sprint(sprint_story1, sprint) + backlogs_page.expect_story_in_backlog(sprint_story1, sprint) end it "removes story from sprint when type is changed to non-story type via details view" do From 5ac08d5caa9923b1c85c64d063924651e3eddbd7 Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Tue, 10 Mar 2026 08:50:42 -0300 Subject: [PATCH 227/334] Fix backlogs task board permission guard --- .../backlogs/backlog_menu_component.html.erb | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb b/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb index 59c71bd842c..944eb46096d 100644 --- a/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/backlog_menu_component.html.erb @@ -76,15 +76,13 @@ See COPYRIGHT and LICENSE files for more details. end if backlog.sprint_backlog? - if user_allowed?(:view_taskboards) - menu.with_item( - id: dom_target(sprint, :menu, :task_board), - label: t(".action_menu.task_board"), - tag: :a, - href: backlogs_project_sprint_taskboard_path(project, sprint) - ) do |item| - item.with_leading_visual_icon(icon: :"op-view-cards") - end + menu.with_item( + id: dom_target(sprint, :menu, :task_board), + label: t(".action_menu.task_board"), + tag: :a, + href: backlogs_project_sprint_taskboard_path(project, sprint) + ) do |item| + item.with_leading_visual_icon(icon: :"op-view-cards") end menu.with_item( From 02d82ff957a4658356b0328f600515c0cef999fb Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 10 Mar 2026 12:56:01 +0000 Subject: [PATCH 228/334] update locales from crowdin [ci skip] --- config/locales/crowdin/fr.seeders.yml | 2 +- config/locales/crowdin/fr.yml | 8 ++++---- config/locales/crowdin/js-fr.yml | 2 +- modules/costs/config/locales/crowdin/fr.yml | 2 +- modules/grids/config/locales/crowdin/js-fr.yml | 2 +- modules/meeting/config/locales/crowdin/fr.yml | 2 +- modules/team_planner/config/locales/crowdin/fr.yml | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/config/locales/crowdin/fr.seeders.yml b/config/locales/crowdin/fr.seeders.yml index 8648ec98b8c..b3e98234eb6 100644 --- a/config/locales/crowdin/fr.seeders.yml +++ b/config/locales/crowdin/fr.seeders.yml @@ -432,7 +432,7 @@ fr: item_0: name: Nouveau item_1: - name: En cous de spécification + name: En cours de spécification item_2: name: Spécifié item_3: diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 2b86c280d12..f0ede2db621 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -1587,7 +1587,7 @@ fr: jwt_sub: "Revendication de sujet" status: is_closed: "Lot de travaux clôturé" - is_readonly: "Paquet de travail en lecture seule" + is_readonly: "Lot de travaux en lecture seule" excluded_from_totals: "Exclure du calcul des totaux dans la hiérarchie" default_done_ratio: "% Réalisé" token/named: @@ -3339,7 +3339,7 @@ fr: label_available_project_repositories: "Dépôts disponibles" label_available_project_versions: "Versions disponibles" label_available_project_work_package_categories: "Catégories de lots de travaux disponibles" - label_available_project_work_package_types: "Types de paquet de travail disponible" + label_available_project_work_package_types: "Types de lot de travaux disponibles" label_available_projects: "Projets disponibles" label_api_doc: "Documentation de l'API" label_backup: "Sauvegarde" @@ -4050,9 +4050,9 @@ fr: sharing: work_packages: allowed_actions: "Vous pouvez %{allowed_actions} ce lot de travaux. Cela peut changer en fonction de votre rôle dans le projet et de vos droits." - create_account: "Pour accéder à ce paquet de travail, vous aurez besoin de créer et activer un compte sur %{instance}." + create_account: "Pour accéder à ce lot de travaux, vous aurez besoin de créer et activer un compte sur %{instance}." open_work_package: "Ouvrir ce lot de travaux" - subject: "Le lot des travaux #%{id} a été partagé avec vous" + subject: "Le lot de travaux #%{id} a été partagé avec vous" enterprise_text: "Partagez les lots de travaux avec des utilisateurs qui ne sont pas membres du projet." summary: user: "%{user} a partagé un lot de travaux avec vous avec les droits %{role_rights}" diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml index ad51bf1455a..2ea958a21f7 100644 --- a/config/locales/crowdin/js-fr.yml +++ b/config/locales/crowdin/js-fr.yml @@ -845,7 +845,7 @@ fr: message_successful_bulk_delete: Les lots de travaux ont été correctement supprimés. message_successful_show_in_fullscreen: "Cliquez ici pour ouvrir ce lot de travaux en affichage plein écran." message_view_spent_time: "Afficher le temps passé pour ce lot de travaux" - message_work_package_read_only: "Paquet de travail est verrouillé. Aucun attribut autre que l’État ne peut être modifié." + message_work_package_read_only: "Le lot de travaux est verrouillé dans ce statut. Aucun autre attribut que le statut ne peut être modifié." message_work_package_status_blocked: "Le statut du lot de travail n'est pas modifiable en raison de la fermeture du statut et de la version assignés." placeholder_filter_by_text: "Objet, description, commentaires, ..." progress: diff --git a/modules/costs/config/locales/crowdin/fr.yml b/modules/costs/config/locales/crowdin/fr.yml index 540036f35ba..f02d2ee0037 100644 --- a/modules/costs/config/locales/crowdin/fr.yml +++ b/modules/costs/config/locales/crowdin/fr.yml @@ -181,7 +181,7 @@ fr: label_today_capitalized: "Aujourd'hui" label_view_mode_switcher: "Changer la vue" label_timer_since: "Commencé à %{time}" - placeholder_activity_select_work_package_first: La sélection d'un paquet de travail est requise en premier + placeholder_activity_select_work_package_first: La sélection préalable d'un lot de travaux est requise notice_something_wrong: "Quelque chose s'est mal passé. Veuillez réessayer." notice_successful_restore: "Restauration réussie." notice_successful_lock: "Bloqué avec succès." diff --git a/modules/grids/config/locales/crowdin/js-fr.yml b/modules/grids/config/locales/crowdin/js-fr.yml index 23446e47fb1..d6310aa0bf2 100644 --- a/modules/grids/config/locales/crowdin/js-fr.yml +++ b/modules/grids/config/locales/crowdin/js-fr.yml @@ -51,7 +51,7 @@ fr: title: 'Tableau des lots de travaux' work_packages_graph: title: 'Graphique des lots de travaux' - summary: "%{chartType} graphique montrant les paquets de travail qui sont %{description}." + summary: "%{chartType} graphique montrant les lots de travaux qui sont %{description}." work_packages_calendar: title: 'Calendrier' work_packages_overview: diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index 09c6cda97c5..3409978e1d7 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -542,7 +542,7 @@ fr: label_agenda_item_add: "Ajouter un point à l'ordre du jour" label_agenda_item_remove_from_agenda: "Retirer de l'ordre du jour" label_agenda_item_remove_from_backlog: "Retirer du backlog" - label_agenda_item_undisclosed_wp: "Paquet de travail #%{id} non visible" + label_agenda_item_undisclosed_wp: "Lot de travaux #%{id} non visible" label_agenda_item_deleted_wp: "Référence de lot de travaux supprimée" label_agenda_item_actions: "Actions des points de l'ordre du jour" label_agenda_item_move_to_next_title: "Passer à la prochaine réunion ?" diff --git a/modules/team_planner/config/locales/crowdin/fr.yml b/modules/team_planner/config/locales/crowdin/fr.yml index 6d59ab8fbd8..ba1bcdd280d 100644 --- a/modules/team_planner/config/locales/crowdin/fr.yml +++ b/modules/team_planner/config/locales/crowdin/fr.yml @@ -12,7 +12,7 @@ fr: upsell: team_planner_view: title: "Planificateur d'équipe" - description: "Obtenez un aperçu complet du planning de votre équipe avec le planificateur d'équipe. Allongez, raccourcissez et faites glisser les paquets de travail pour modifier les dates, les déplacer ou changer les assignés." + description: "Obtenez un aperçu complet du planning de votre équipe avec le planificateur d'équipe. Allongez, raccourcissez et faites glisser les lots de travaux pour modifier les dates, les déplacer ou changer les assignés." team_planner: label_team_planner: "Planificateur d'équipe" label_new_team_planner: "Nouveau planificateur d'équipe" From 1c5fd45c9e40c86abf391a331281333e21c91812 Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Tue, 10 Mar 2026 17:10:29 +0100 Subject: [PATCH 229/334] Remove unused i18n key label_force_user_language_to_default Was removed in PR #12839. --- config/locales/en.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 7a76fdbfc2c..15cee19fe26 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -3667,7 +3667,6 @@ en: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" From f64e45eec718298cc208c3378f6c6f5db606cc5b Mon Sep 17 00:00:00 2001 From: Markus Kahl Date: Tue, 10 Mar 2026 16:12:40 +0000 Subject: [PATCH 230/334] SSRF protection update to work with ssrf_filter 1.3, explicitly pin gem version --- Gemfile | 1 + Gemfile.lock | 1 + .../outgoing/request_webhook_service_spec.rb | 23 +++++++++++++++---- .../workers/attachment_webhook_job_spec.rb | 2 +- .../spec/workers/project_webhook_job_spec.rb | 2 +- .../workers/time_entry_webhook_job_spec.rb | 2 +- .../work_package_comment_webhook_job_spec.rb | 2 +- .../workers/work_package_webhook_job_spec.rb | 2 +- .../support/shared/with_ssrf_webhook_stubs.rb | 18 +++------------ 9 files changed, 28 insertions(+), 25 deletions(-) diff --git a/Gemfile b/Gemfile index 07235d3d500..0147b491349 100644 --- a/Gemfile +++ b/Gemfile @@ -201,6 +201,7 @@ gem "nokogiri", "~> 1.19.1" gem "carrierwave", "~> 2.2.6" gem "carrierwave_direct", "~> 3.0.0" +gem "ssrf_filter", "~> 1.3" gem "fog-aws" gem "aws-sdk-core", "~> 3.241" diff --git a/Gemfile.lock b/Gemfile.lock index 78c9dd2e86b..9ab34165d48 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1753,6 +1753,7 @@ DEPENDENCIES spring-commands-rubocop sprockets (~> 3.7.2) sprockets-rails (~> 3.5.1) + ssrf_filter (~> 1.3) stackprof statesman (~> 13.1.0) store_attribute (~> 2.0) diff --git a/modules/webhooks/spec/services/webhooks/outgoing/request_webhook_service_spec.rb b/modules/webhooks/spec/services/webhooks/outgoing/request_webhook_service_spec.rb index 3ad13e89f60..1d826303b63 100644 --- a/modules/webhooks/spec/services/webhooks/outgoing/request_webhook_service_spec.rb +++ b/modules/webhooks/spec/services/webhooks/outgoing/request_webhook_service_spec.rb @@ -43,7 +43,7 @@ RSpec.describe Webhooks::Outgoing::RequestWebhookService, :webmock, type: :model describe "#call!" do context "when the request is successful" do before do - stub_request(:post, ssrf_resolved_url(webhook.url)) + stub_request(:post, webhook.url) .with(body: "body", headers: { "X-Custom" => "header" }) .to_return(status: 200, body: "OK", headers: { "Content-Type" => "application/json" }) end @@ -52,7 +52,7 @@ RSpec.describe Webhooks::Outgoing::RequestWebhookService, :webmock, type: :model it "makes a POST request to the webhook URL with the given body and headers" do subject - expect(WebMock).to have_requested(:post, ssrf_resolved_url(webhook.url)) + expect(WebMock).to have_requested(:post, webhook.url) .with(body: "body", headers: { "X-Custom" => "header", "Host" => "example.net" }).once end @@ -67,11 +67,24 @@ RSpec.describe Webhooks::Outgoing::RequestWebhookService, :webmock, type: :model expect(log.response_body).to eq("OK") expect(log.url).to eq(webhook.url) end + + it "connects to the original hostname while routing through the resolved safe IP address" do + http_start_args = nil + allow(Net::HTTP).to receive(:start).and_wrap_original do |original, *args, **kwargs, &block| + http_start_args = { host: args[0], options: kwargs } + original.call(*args, **kwargs, &block) + end + + subject + + expect(http_start_args[:host]).to eq("example.net") + expect(http_start_args[:options]).to include(ipaddr: WithSsrfWebhookStubsMixin::SSRF_TEST_IP) + end end context "when the request times out" do before do - stub_request(:post, ssrf_resolved_url(webhook.url)).to_timeout + stub_request(:post, webhook.url).to_timeout end it "re-raises the timeout error while still creating a log entry" do @@ -83,7 +96,7 @@ RSpec.describe Webhooks::Outgoing::RequestWebhookService, :webmock, type: :model context "when request_url fails with SSL errors" do before do - stub_request(:post, ssrf_resolved_url(webhook.url)).to_raise(OpenSSL::SSL::SSLError) + stub_request(:post, webhook.url).to_raise(OpenSSL::SSL::SSLError) end it "still logs the exception" do @@ -135,7 +148,7 @@ RSpec.describe Webhooks::Outgoing::RequestWebhookService, :webmock, type: :model context "when an unexpected error occurs" do before do - stub_request(:post, ssrf_resolved_url(webhook.url)).to_raise(StandardError.new("something went wrong")) + stub_request(:post, webhook.url).to_raise(StandardError.new("something went wrong")) end it "creates a log entry" do diff --git a/modules/webhooks/spec/workers/attachment_webhook_job_spec.rb b/modules/webhooks/spec/workers/attachment_webhook_job_spec.rb index 63f9885e99f..04b0d8366b6 100644 --- a/modules/webhooks/spec/workers/attachment_webhook_job_spec.rb +++ b/modules/webhooks/spec/workers/attachment_webhook_job_spec.rb @@ -52,7 +52,7 @@ RSpec.describe AttachmentWebhookJob, :webmock, type: :job do end let(:stub) do - stub_request(:post, ssrf_resolved_url(stubbed_url)) + stub_request(:post, stubbed_url) .with( body: hash_including( "action" => event, diff --git a/modules/webhooks/spec/workers/project_webhook_job_spec.rb b/modules/webhooks/spec/workers/project_webhook_job_spec.rb index 63813ee0136..5bfc2864c65 100644 --- a/modules/webhooks/spec/workers/project_webhook_job_spec.rb +++ b/modules/webhooks/spec/workers/project_webhook_job_spec.rb @@ -56,7 +56,7 @@ RSpec.describe ProjectWebhookJob, :webmock, type: :job do end let(:stub) do - stub_request(:post, ssrf_resolved_url(stubbed_url)) + stub_request(:post, stubbed_url) .with( body: hash_including( "action" => event, diff --git a/modules/webhooks/spec/workers/time_entry_webhook_job_spec.rb b/modules/webhooks/spec/workers/time_entry_webhook_job_spec.rb index a99a56b546e..affb68d46a8 100644 --- a/modules/webhooks/spec/workers/time_entry_webhook_job_spec.rb +++ b/modules/webhooks/spec/workers/time_entry_webhook_job_spec.rb @@ -53,7 +53,7 @@ RSpec.describe TimeEntryWebhookJob, :webmock, type: :job do end let(:stub) do - stub_request(:post, ssrf_resolved_url(stubbed_url)) + stub_request(:post, stubbed_url) .with( body: hash_including( "action" => event, diff --git a/modules/webhooks/spec/workers/work_package_comment_webhook_job_spec.rb b/modules/webhooks/spec/workers/work_package_comment_webhook_job_spec.rb index 43908098b1b..843c9cd4bcd 100644 --- a/modules/webhooks/spec/workers/work_package_comment_webhook_job_spec.rb +++ b/modules/webhooks/spec/workers/work_package_comment_webhook_job_spec.rb @@ -53,7 +53,7 @@ RSpec.describe WorkPackageCommentWebhookJob, :webmock, type: :model do end let(:stub) do - stub_request(:post, ssrf_resolved_url(stubbed_url)).with( + stub_request(:post, stubbed_url).with( body: hash_including( "action" => event_name, "activity" => hash_including( diff --git a/modules/webhooks/spec/workers/work_package_webhook_job_spec.rb b/modules/webhooks/spec/workers/work_package_webhook_job_spec.rb index d38f97b707b..40c6eff15af 100644 --- a/modules/webhooks/spec/workers/work_package_webhook_job_spec.rb +++ b/modules/webhooks/spec/workers/work_package_webhook_job_spec.rb @@ -56,7 +56,7 @@ RSpec.describe WorkPackageWebhookJob, :webmock, type: :model do end let(:stub) do - stub_request(:post, ssrf_resolved_url(stubbed_url)) + stub_request(:post, stubbed_url) .with( body: hash_including( "action" => event, diff --git a/spec/support/shared/with_ssrf_webhook_stubs.rb b/spec/support/shared/with_ssrf_webhook_stubs.rb index 2114f66bddf..23bb7590060 100644 --- a/spec/support/shared/with_ssrf_webhook_stubs.rb +++ b/spec/support/shared/with_ssrf_webhook_stubs.rb @@ -29,23 +29,11 @@ module WithSsrfWebhookStubsMixin ## # A safe public IP returned by the stubbed resolver for any hostname. - # It is not in SsrfFilter's private-address blocklist, so SSRF validation passes, - # and WebMock stubs using this IP will match the actual Net::HTTP request. + # It is not in SsrfFilter's private-address blocklist, so SSRF validation passes. + # ssrf_filter 1.3+ makes requests to the original hostname URL (not the resolved IP), + # passing the resolved IP via the `ipaddr:` option to Net::HTTP.start instead. SSRF_TEST_IP = "93.184.216.34" - ## - # Translates a webhook URL containing a hostname to the IP-based URL that - # SsrfFilter will use when making the actual HTTP request. Use this when - # setting up WebMock stubs so that they match the resolved request. - # - # URLs that already contain an IP address are returned unchanged. - def ssrf_resolved_url(url) - uri = URI.parse(url) - return url if ip_address?(uri.host) - - url.sub(uri.host, SSRF_TEST_IP) - end - def ip_address?(host) [Resolv::IPv4::Regex, Resolv::IPv6::Regex].any? { host.match? it } end From 122b5b542cbc2fceecb7efe762b82c39f270cf2b Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Tue, 10 Mar 2026 17:36:19 +0100 Subject: [PATCH 231/334] Fix typo --- config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 15cee19fe26..c53385f0bcb 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -5284,7 +5284,7 @@ en: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Delete" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." From 11cd5717f9d96d10dbc63a319c98aaa787591eec Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Tue, 10 Mar 2026 17:52:25 +0100 Subject: [PATCH 232/334] Remove unused translation key Usage was removed in PR #9665. Some i18n keys were removed back then in this PR, but this one was missed. --- config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index c53385f0bcb..2d789e00cc8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -292,7 +292,7 @@ en: confirm_button: "Start import" description: > This importer is an alpha feature. It is not yet able to import all data from Jira and might leave incomplete data on this OpenProject instance. - + Do not use a production environment and create a backup of your OpenProject data before starting. confirm: "I understand and made the necessary preparations" revert_dialog: From 5d42fa473aabd94c80c074b51e3ebfab0f74b659 Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Tue, 10 Mar 2026 13:59:03 -0300 Subject: [PATCH 233/334] [#72928] Use Turbo morphing for agile sprint updates Update agile sprint header refreshes to use Turbo morphing so DOM state is preserved more reliably when sprint details are changed. https://community.openproject.org/wp/72928 --- modules/backlogs/app/controllers/rb_sprints_controller.rb | 5 ++++- .../backlogs/spec/controllers/rb_sprints_controller_spec.rb | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index 824483d61aa..0dbbe03a5b5 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -154,7 +154,10 @@ class RbSprintsController < RbApplicationController end def update_sprint_header_component_via_turbo_stream(sprint:) - update_via_turbo_stream(component: Backlogs::SprintHeaderComponent.new(sprint:)) + update_via_turbo_stream( + component: Backlogs::SprintHeaderComponent.new(sprint:), + method: :morph + ) end def update_new_sprint_form_component_via_turbo_stream(sprint:, base_errors: nil) diff --git a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb index 287b1d073b7..396fb2b9e1b 100644 --- a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb @@ -312,6 +312,8 @@ RSpec.describe RbSprintsController do expect(response).to be_successful expect(response).to have_http_status :ok expect(response.body).to have_turbo_stream action: "flash" + expect(response.body).to have_turbo_stream action: "update", target: "backlogs-sprint-header-component-#{sprint.id}" + assert_select %(turbo-stream[action="update"][target="backlogs-sprint-header-component-#{sprint.id}"][method="morph"]) expect(response.body).to include("Successful update.") expect(sprint.reload.name).to eq("Changed sprint name") end From 0474b85e8ad82b8d79fb85c7e3f3761844da31e8 Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Tue, 10 Mar 2026 14:00:13 -0300 Subject: [PATCH 234/334] Add stable DOM ids to sprint backlog menus Assign deterministic ids to sprint headers and sprint menu elements so Turbo morphing can reconcile the old and new DOM reliably. --- .../app/components/backlogs/sprint_component.html.erb | 2 +- .../components/backlogs/sprint_menu_component.html.erb | 5 ++++- .../app/components/backlogs/sprint_menu_component.rb | 10 +++++++++- .../spec/components/backlogs/sprint_component_spec.rb | 6 ++++++ .../backlogs/sprint_header_component_spec.rb | 6 ++++++ .../components/backlogs/sprint_menu_component_spec.rb | 8 ++++++++ 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/sprint_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_component.html.erb index f1fd27e97a2..fc6fe3ac72b 100644 --- a/modules/backlogs/app/components/backlogs/sprint_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprint_component.html.erb @@ -29,7 +29,7 @@ See COPYRIGHT and LICENSE files for more details. <%= component_wrapper(tag: :section) do %> <%= render(Primer::Beta::BorderBox.new(**@system_arguments)) do |border_box| %> - <% border_box.with_header do %> + <% border_box.with_header(id: dom_target(sprint, :header)) do %> <%= render(Backlogs::SprintHeaderComponent.new(sprint:, folded: folded?)) %> <% end %> <% if stories.empty? %> diff --git a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb index a374f690bbb..13d99c433c6 100644 --- a/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprint_menu_component.html.erb @@ -28,7 +28,7 @@ See COPYRIGHT and LICENSE files for more details. ++# %> <%= - render(Primer::Alpha::ActionMenu.new(anchor_align: :end, classes: "hide-when-print")) do |menu| + render(Primer::Alpha::ActionMenu.new(**@system_arguments)) do |menu| menu.with_show_button( scheme: :invisible, icon: :"kebab-horizontal", @@ -38,6 +38,7 @@ See COPYRIGHT and LICENSE files for more details. if user_allowed?(:create_sprints) menu.with_item( + id: dom_target(sprint, :menu, :edit_sprint), label: t(".action_menu.edit_sprint"), href: edit_dialog_project_sprint_path(project, sprint), content_arguments: { data: { controller: "async-dialog" } } @@ -48,6 +49,7 @@ See COPYRIGHT and LICENSE files for more details. if user_allowed?(:manage_sprint_items) menu.with_item( + id: dom_target(sprint, :menu, :new_story), label: t(".action_menu.new_story"), href: new_project_work_packages_dialog_path( project, @@ -66,6 +68,7 @@ See COPYRIGHT and LICENSE files for more details. menu.with_item( # TODO: sprint_id filter does not exist for work packages. Add? + id: dom_target(sprint, :menu, :stories_tasks), scheme: :danger, label: t(".action_menu.stories_tasks"), tag: :a, diff --git a/modules/backlogs/app/components/backlogs/sprint_menu_component.rb b/modules/backlogs/app/components/backlogs/sprint_menu_component.rb index 386b8c6e376..91e3dc15436 100644 --- a/modules/backlogs/app/components/backlogs/sprint_menu_component.rb +++ b/modules/backlogs/app/components/backlogs/sprint_menu_component.rb @@ -34,12 +34,20 @@ module Backlogs attr_reader :sprint, :project, :current_user - def initialize(sprint:, project:, current_user: User.current) + def initialize(sprint:, project:, current_user: User.current, **system_arguments) super() @sprint = sprint @project = project @current_user = current_user + + @system_arguments = system_arguments + @system_arguments[:menu_id] = dom_target(sprint, :menu) + @system_arguments[:anchor_align] = :end + @system_arguments[:classes] = class_names( + @system_arguments[:classes], + "hide-when-print" + ) end def stories diff --git a/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb index 03790fc01b1..ef112b8e470 100644 --- a/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb @@ -94,6 +94,12 @@ RSpec.describe Backlogs::SprintComponent, type: :component do expect(page).to have_css(".Box-header h3", text: "Sprint 1") end + it "renders a stable id on the sprint header" do + render_component + + expect(page).to have_element(:div, class: "Box-header", id: /\Aagile_sprint_#{sprint.id}_header\z/) + end + it "renders StoryComponent for each story" do render_component diff --git a/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb index dc72e4170dd..2318fd41172 100644 --- a/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb @@ -123,6 +123,12 @@ RSpec.describe Backlogs::SprintHeaderComponent, type: :component do expect(page).to have_css("action-menu") end + + it "renders a stable id on the sprint menu trigger" do + render_component + + expect(page).to have_element(:button, id: /\Aagile_sprint_#{sprint.id}_menu-button\z/) + end end context "with no stories" do diff --git a/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb index 86fadec20d0..c2c96a07263 100644 --- a/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb @@ -105,6 +105,14 @@ RSpec.describe Backlogs::SprintMenuComponent, type: :component do describe "always-visible items" do let(:permissions) { [:view_sprints] } + it "renders stable ids on the action menu and stories/tasks item" do + render_component + + expect(page).to have_element(:button, id: /\Aagile_sprint_#{sprint.id}_menu-button\z/) + expect(page).to have_element(:ul, id: /\Aagile_sprint_#{sprint.id}_menu-list\z/) + expect(page).to have_element(:a, id: /\Aagile_sprint_#{sprint.id}_menu_stories_tasks\z/) + end + it "shows Stories/Tasks link" do render_component From ab2e3d0f7df06f29579342119444a7e7f091ba32 Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Tue, 10 Mar 2026 14:11:16 -0300 Subject: [PATCH 235/334] [#72927] Align backlog drag-and-drop specs on dev Cover the componentized backlogs UI with the drag-and-drop contract used by the generic Stimulus controller. Assert container target wiring, draggable story metadata, and the rendered drag handle in the new backlog and sprint component specs. https://community.openproject.org/wp/72927 --- .../spec/components/backlogs/backlog_component_spec.rb | 6 +++++- .../spec/components/backlogs/sprint_component_spec.rb | 6 +++++- .../spec/components/backlogs/story_component_spec.rb | 7 +++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb b/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb index 1eebc30e9f0..4a9e1ccb2bb 100644 --- a/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb @@ -31,6 +31,8 @@ require "rails_helper" RSpec.describe Backlogs::BacklogComponent, type: :component do + include Rails.application.routes.url_helpers + shared_let(:type_feature) { create(:type_feature) } shared_let(:type_task) { create(:type_task) } shared_let(:default_status) { create(:default_status) } @@ -115,6 +117,8 @@ RSpec.describe Backlogs::BacklogComponent, type: :component do render_component box = page.find(".Box") + expect(box["data-generic-drag-and-drop-target"]).to eq("container") + expect(box["data-target-container-accessor"]).to eq(":scope > ul") expect(box["data-target-id"]).to eq(sprint.id.to_s) expect(box["data-target-allowed-drag-type"]).to eq("story") end @@ -125,7 +129,7 @@ RSpec.describe Backlogs::BacklogComponent, type: :component do story_row = page.find(".Box-row[id='story_#{story1.id}']") expect(story_row["data-draggable-id"]).to eq(story1.id.to_s) expect(story_row["data-draggable-type"]).to eq("story") - expect(story_row["data-drop-url"]).to include("move") + expect(story_row["data-drop-url"]).to end_with(move_backlogs_project_sprint_story_path(project, sprint, story1)) end it "renders story rows with proper classes" do diff --git a/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb index 03790fc01b1..a34ede4bfcb 100644 --- a/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb @@ -31,6 +31,8 @@ require "rails_helper" RSpec.describe Backlogs::SprintComponent, type: :component do + include Rails.application.routes.url_helpers + shared_let(:type_feature) { create(:type_feature) } shared_let(:type_task) { create(:type_task) } shared_let(:default_status) { create(:default_status) } @@ -106,6 +108,8 @@ RSpec.describe Backlogs::SprintComponent, type: :component do render_component box = page.find(".Box") + expect(box["data-generic-drag-and-drop-target"]).to eq("container") + expect(box["data-target-container-accessor"]).to eq(":scope > ul") expect(box["data-target-id"]).to eq(sprint.id.to_s) expect(box["data-target-allowed-drag-type"]).to eq("story") end @@ -116,7 +120,7 @@ RSpec.describe Backlogs::SprintComponent, type: :component do story_row = page.find(".Box-row[id='work_package_#{story1.id}']") expect(story_row["data-draggable-id"]).to eq(story1.id.to_s) expect(story_row["data-draggable-type"]).to eq("story") - expect(story_row["data-drop-url"]).to include("move") + expect(story_row["data-drop-url"]).to end_with(move_backlogs_project_sprint_story_path(project, sprint, story1)) end it "renders story rows with proper classes" do diff --git a/modules/backlogs/spec/components/backlogs/story_component_spec.rb b/modules/backlogs/spec/components/backlogs/story_component_spec.rb index 5481e6bfcbf..8cd5e3207eb 100644 --- a/modules/backlogs/spec/components/backlogs/story_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/story_component_spec.rb @@ -97,6 +97,13 @@ RSpec.describe Backlogs::StoryComponent, type: :component do expect(page).to have_css("action-menu") end + + it "renders a drag handle compatible with GenericDragAndDropController" do + render_component + + expect(page).to have_css(".DragHandle[role='button'][tabindex='0']") + expect(page).to have_css(".DragHandle[aria-label='Move Test Story Subject']") + end end describe "story points handling" do From cd8d776a77b668cefe93be6a6c760526c51740f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 14:23:43 -0300 Subject: [PATCH 236/334] Bump the html-eslint group in /frontend with 2 updates (#22283) Bumps the html-eslint group in /frontend with 2 updates: [@html-eslint/eslint-plugin](https://github.com/yeonjuan/html-eslint) and [@html-eslint/parser](https://github.com/yeonjuan/html-eslint). Updates `@html-eslint/eslint-plugin` from 0.56.0 to 0.57.0 - [Release notes](https://github.com/yeonjuan/html-eslint/releases) - [Commits](https://github.com/yeonjuan/html-eslint/compare/v0.56.0...v0.57.0) Updates `@html-eslint/parser` from 0.56.0 to 0.57.0 - [Release notes](https://github.com/yeonjuan/html-eslint/releases) - [Commits](https://github.com/yeonjuan/html-eslint/compare/v0.56.0...v0.57.0) --- updated-dependencies: - dependency-name: "@html-eslint/eslint-plugin" dependency-version: 0.57.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: html-eslint - dependency-name: "@html-eslint/parser" dependency-version: 0.57.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: html-eslint ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 160 +++++++++++++++++++++++-------------- frontend/package.json | 4 +- 2 files changed, 103 insertions(+), 61 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b6cc17786b5..952a78eb63b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -138,8 +138,8 @@ "@angular-eslint/template-parser": "20.7.0", "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", - "@html-eslint/eslint-plugin": "^0.56.0", - "@html-eslint/parser": "^0.56.0", + "@html-eslint/eslint-plugin": "^0.57.0", + "@html-eslint/parser": "^0.57.0", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@stylistic/eslint-plugin": "^5.7.1", "@types/codemirror": "5.60.5", @@ -5288,12 +5288,12 @@ } }, "node_modules/@html-eslint/core": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.56.0.tgz", - "integrity": "sha512-xbgEwKMFVZXZdr/43irrXTs6z+lijKDSWt5Zi7CRCyc1cdf7J6dQDT9QDInuwadJJEqc/er+VVjFNY/Ymv9GCA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.57.0.tgz", + "integrity": "sha512-X/cKrOmXrxZSdgyKwtbaCuuJ1k/u82MK58Q6p1TzfwPatwIYx+icfBv1Vp1dLui0L0y1fwBW4H+TKhBf7mMKmg==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.56.0", + "@html-eslint/types": "^0.57.0", "eslint": "^9.39.1", "html-standard": "^0.0.13" }, @@ -5302,17 +5302,18 @@ } }, "node_modules/@html-eslint/eslint-plugin": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.56.0.tgz", - "integrity": "sha512-CEJDF8O9ObZvRjJm5igNW+th11xvsXVKFXvnWKKnbaXNufPVdKMbC/GA4RoYKKc4R6tI0lhQz5qPEVNWrWiOew==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.57.0.tgz", + "integrity": "sha512-9/sjZ2KHsZmco45Z9rGySOocJ734rhjjt1ofXJve7lzzBY+t8FF7fwVp9EmcXSer+0zDUb5hGBHWbgIZ0SEnJA==", "dev": true, "dependencies": { "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/core": "^0.56.0", - "@html-eslint/parser": "^0.56.0", - "@html-eslint/template-parser": "^0.56.0", - "@html-eslint/template-syntax-parser": "^0.56.0", - "@html-eslint/types": "^0.56.0" + "@html-eslint/core": "^0.57.0", + "@html-eslint/parser": "^0.57.0", + "@html-eslint/template-parser": "^0.57.0", + "@html-eslint/template-syntax-parser": "^0.57.0", + "@html-eslint/types": "^0.57.0", + "@rviscomi/capo.js": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5321,42 +5322,55 @@ "eslint": ">=8.0.0 || ^10.0.0-0" } }, - "node_modules/@html-eslint/parser": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.56.0.tgz", - "integrity": "sha512-QpUW88eu/LDws5ImzqoTbZjeQ4xTDlWPoP7IqSxQLSFQa0Ixkyw9x/LN/azJfaJNwCv9U94eNRSDCOjDNAh0gA==", + "node_modules/@html-eslint/eslint-plugin/node_modules/@html-eslint/parser": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.1.tgz", + "integrity": "sha512-nQ5vw7Os+Snjxq9hLLBak2bv502Obn77BNOWfGK2+GIrShxtGd8w1ehlKW3EB5/RQzqBk6VDK8nPfexlR3M7kg==", "dev": true, "dependencies": { "@eslint/css-tree": "^3.6.9", - "@html-eslint/template-syntax-parser": "^0.56.0", - "@html-eslint/types": "^0.56.0", + "@html-eslint/template-syntax-parser": "^0.57.0", + "@html-eslint/types": "^0.57.0", + "css-tree": "^3.1.0", + "es-html-parser": "0.3.1" + } + }, + "node_modules/@html-eslint/parser": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.0.tgz", + "integrity": "sha512-guzD7QJFM0UOGnOZco7I9WEZOBQCmXR3abt6sIhznq4x7Ws6l/KwnNo7im6r0g7/ftLTmuKnLjyNEbW8seQyMQ==", + "dev": true, + "dependencies": { + "@eslint/css-tree": "^3.6.9", + "@html-eslint/template-syntax-parser": "^0.57.0", + "@html-eslint/types": "^0.57.0", "css-tree": "^3.1.0", "es-html-parser": "0.3.1" } }, "node_modules/@html-eslint/template-parser": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.56.0.tgz", - "integrity": "sha512-zd4IV/PSaiOiS2W7129J+G6QOLfocno8UHAcm/+w/oKrCXr9EyIhJj9bx7ZBYMvLYBSF8hndpIBoBppegIy4iQ==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.57.0.tgz", + "integrity": "sha512-tddyBo4dEl4W4Ehxuyd6H4jsSqvsfL5F7Bj9/aFfdQyv36q7BGWM2BRHb6FMmYKAPGZ3VzyEbUlcqIwXpDkY3w==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.56.0", + "@html-eslint/types": "^0.57.0", "es-html-parser": "0.3.1" } }, "node_modules/@html-eslint/template-syntax-parser": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.56.0.tgz", - "integrity": "sha512-vH5YGgODce8cUwwgDa0UoAc2Ta4HnAm2mlJ0wuBjbXk6fzE7mkmoyk23k80W79zAssgJ0+r5s7mvAdIFCyAQjw==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.57.0.tgz", + "integrity": "sha512-vHp5y4TR+HhgMDi3rAkgm90LBptSZaQUJudZSj+WdvnSBjLe/fgJC4aVjtLVHTS9ynORrFio8AmH1Bz20kYk4g==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.56.0" + "@html-eslint/types": "^0.57.0" } }, "node_modules/@html-eslint/types": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.56.0.tgz", - "integrity": "sha512-e4mVkBa1/UAO4hWj2xej7UX5Ij0uWyaNpDNPOzuo4ON2ftk80Cz7RobRkd49GQ8pk4WXeIfaXCMU2HeHqz0Jzg==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.57.0.tgz", + "integrity": "sha512-wZAHc9FHZRVAcKyx1NdMNGpw1Jo/Anh+9y+bTQ/cKjh5MHJlbs8ogthIG8efBVFIVlIgzxEA8yrX+DPXmuWisA==", "dev": true, "dependencies": { "@types/css-tree": "^2.3.11", @@ -8433,6 +8447,12 @@ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true }, + "node_modules/@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 + }, "node_modules/@schematics/angular": { "version": "21.1.5", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.5.tgz", @@ -29086,66 +29106,82 @@ } }, "@html-eslint/core": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.56.0.tgz", - "integrity": "sha512-xbgEwKMFVZXZdr/43irrXTs6z+lijKDSWt5Zi7CRCyc1cdf7J6dQDT9QDInuwadJJEqc/er+VVjFNY/Ymv9GCA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.57.0.tgz", + "integrity": "sha512-X/cKrOmXrxZSdgyKwtbaCuuJ1k/u82MK58Q6p1TzfwPatwIYx+icfBv1Vp1dLui0L0y1fwBW4H+TKhBf7mMKmg==", "dev": true, "requires": { - "@html-eslint/types": "^0.56.0", + "@html-eslint/types": "^0.57.0", "eslint": "^9.39.1", "html-standard": "^0.0.13" } }, "@html-eslint/eslint-plugin": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.56.0.tgz", - "integrity": "sha512-CEJDF8O9ObZvRjJm5igNW+th11xvsXVKFXvnWKKnbaXNufPVdKMbC/GA4RoYKKc4R6tI0lhQz5qPEVNWrWiOew==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.57.0.tgz", + "integrity": "sha512-9/sjZ2KHsZmco45Z9rGySOocJ734rhjjt1ofXJve7lzzBY+t8FF7fwVp9EmcXSer+0zDUb5hGBHWbgIZ0SEnJA==", "dev": true, "requires": { "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/core": "^0.56.0", - "@html-eslint/parser": "^0.56.0", - "@html-eslint/template-parser": "^0.56.0", - "@html-eslint/template-syntax-parser": "^0.56.0", - "@html-eslint/types": "^0.56.0" + "@html-eslint/core": "^0.57.0", + "@html-eslint/parser": "^0.57.0", + "@html-eslint/template-parser": "^0.57.0", + "@html-eslint/template-syntax-parser": "^0.57.0", + "@html-eslint/types": "^0.57.0", + "@rviscomi/capo.js": "^2.1.0" + }, + "dependencies": { + "@html-eslint/parser": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.1.tgz", + "integrity": "sha512-nQ5vw7Os+Snjxq9hLLBak2bv502Obn77BNOWfGK2+GIrShxtGd8w1ehlKW3EB5/RQzqBk6VDK8nPfexlR3M7kg==", + "dev": true, + "requires": { + "@eslint/css-tree": "^3.6.9", + "@html-eslint/template-syntax-parser": "^0.57.0", + "@html-eslint/types": "^0.57.0", + "css-tree": "^3.1.0", + "es-html-parser": "0.3.1" + } + } } }, "@html-eslint/parser": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.56.0.tgz", - "integrity": "sha512-QpUW88eu/LDws5ImzqoTbZjeQ4xTDlWPoP7IqSxQLSFQa0Ixkyw9x/LN/azJfaJNwCv9U94eNRSDCOjDNAh0gA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.0.tgz", + "integrity": "sha512-guzD7QJFM0UOGnOZco7I9WEZOBQCmXR3abt6sIhznq4x7Ws6l/KwnNo7im6r0g7/ftLTmuKnLjyNEbW8seQyMQ==", "dev": true, "requires": { "@eslint/css-tree": "^3.6.9", - "@html-eslint/template-syntax-parser": "^0.56.0", - "@html-eslint/types": "^0.56.0", + "@html-eslint/template-syntax-parser": "^0.57.0", + "@html-eslint/types": "^0.57.0", "css-tree": "^3.1.0", "es-html-parser": "0.3.1" } }, "@html-eslint/template-parser": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.56.0.tgz", - "integrity": "sha512-zd4IV/PSaiOiS2W7129J+G6QOLfocno8UHAcm/+w/oKrCXr9EyIhJj9bx7ZBYMvLYBSF8hndpIBoBppegIy4iQ==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.57.0.tgz", + "integrity": "sha512-tddyBo4dEl4W4Ehxuyd6H4jsSqvsfL5F7Bj9/aFfdQyv36q7BGWM2BRHb6FMmYKAPGZ3VzyEbUlcqIwXpDkY3w==", "dev": true, "requires": { - "@html-eslint/types": "^0.56.0", + "@html-eslint/types": "^0.57.0", "es-html-parser": "0.3.1" } }, "@html-eslint/template-syntax-parser": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.56.0.tgz", - "integrity": "sha512-vH5YGgODce8cUwwgDa0UoAc2Ta4HnAm2mlJ0wuBjbXk6fzE7mkmoyk23k80W79zAssgJ0+r5s7mvAdIFCyAQjw==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.57.0.tgz", + "integrity": "sha512-vHp5y4TR+HhgMDi3rAkgm90LBptSZaQUJudZSj+WdvnSBjLe/fgJC4aVjtLVHTS9ynORrFio8AmH1Bz20kYk4g==", "dev": true, "requires": { - "@html-eslint/types": "^0.56.0" + "@html-eslint/types": "^0.57.0" } }, "@html-eslint/types": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.56.0.tgz", - "integrity": "sha512-e4mVkBa1/UAO4hWj2xej7UX5Ij0uWyaNpDNPOzuo4ON2ftk80Cz7RobRkd49GQ8pk4WXeIfaXCMU2HeHqz0Jzg==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.57.0.tgz", + "integrity": "sha512-wZAHc9FHZRVAcKyx1NdMNGpw1Jo/Anh+9y+bTQ/cKjh5MHJlbs8ogthIG8efBVFIVlIgzxEA8yrX+DPXmuWisA==", "dev": true, "requires": { "@types/css-tree": "^2.3.11", @@ -30894,6 +30930,12 @@ "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.1.5", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.5.tgz", diff --git a/frontend/package.json b/frontend/package.json index 42bab64df40..9cc24afeb8d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,8 +14,8 @@ "@angular-eslint/template-parser": "20.7.0", "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", - "@html-eslint/eslint-plugin": "^0.56.0", - "@html-eslint/parser": "^0.56.0", + "@html-eslint/eslint-plugin": "^0.57.0", + "@html-eslint/parser": "^0.57.0", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@stylistic/eslint-plugin": "^5.7.1", "@types/codemirror": "5.60.5", From 4bad8abff48f4e523cddea7430bb48696c2dd479 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 14:25:50 -0300 Subject: [PATCH 237/334] Bump @tiptap/extensions from 3.15.3 to 3.20.0 in /frontend (#22230) Bumps [@tiptap/extensions](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/extension) from 3.15.3 to 3.20.0. - [Release notes](https://github.com/ueberdosis/tiptap/releases) - [Commits](https://github.com/ueberdosis/tiptap/commits/v3.20.0/packages/extension) --- updated-dependencies: - dependency-name: "@tiptap/extensions" dependency-version: 3.20.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 19 +++++++++---------- frontend/package.json | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 952a78eb63b..63781f826d8 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -65,7 +65,7 @@ "@rails/request.js": "^0.0.13", "@stimulus-components/auto-submit": "^6.0.0", "@stimulus-components/reveal": "^5.0.0", - "@tiptap/extensions": "^3.13.0", + "@tiptap/extensions": "^3.20.0", "@types/jquery.cookie": "^1.4.36", "@uirouter/angular": "^17.0.0", "@uirouter/core": "^6.1.0", @@ -9035,17 +9035,16 @@ } }, "node_modules/@tiptap/extensions": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.15.3.tgz", - "integrity": "sha512-ycx/BgxR4rc9tf3ZyTdI98Z19yKLFfqM3UN+v42ChuIwkzyr9zyp7kG8dB9xN2lNqrD+5y/HyJobz/VJ7T90gA==", - "license": "MIT", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.20.0.tgz", + "integrity": "sha512-HIsXX942w3nbxEQBlMAAR/aa6qiMBEP7CsSMxaxmTIVAmW35p6yUASw6GdV1u0o3lCZjXq2OSRMTskzIqi5uLg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.15.3", - "@tiptap/pm": "^3.15.3" + "@tiptap/core": "^3.20.0", + "@tiptap/pm": "^3.20.0" } }, "node_modules/@tiptap/pm": { @@ -31263,9 +31262,9 @@ "integrity": "sha512-Woh/nk1/7c31D14dIaU5i9d4NMK06TBeEA+uBidhZp+JAXVGMeQGm0K2iJxBXNvNrc6aKGlZ57W1o3CPUWOlWQ==" }, "@tiptap/extensions": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.15.3.tgz", - "integrity": "sha512-ycx/BgxR4rc9tf3ZyTdI98Z19yKLFfqM3UN+v42ChuIwkzyr9zyp7kG8dB9xN2lNqrD+5y/HyJobz/VJ7T90gA==" + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.20.0.tgz", + "integrity": "sha512-HIsXX942w3nbxEQBlMAAR/aa6qiMBEP7CsSMxaxmTIVAmW35p6yUASw6GdV1u0o3lCZjXq2OSRMTskzIqi5uLg==" }, "@tiptap/pm": { "version": "3.12.0", diff --git a/frontend/package.json b/frontend/package.json index 9cc24afeb8d..743f8b84c2d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -120,7 +120,7 @@ "@rails/request.js": "^0.0.13", "@stimulus-components/auto-submit": "^6.0.0", "@stimulus-components/reveal": "^5.0.0", - "@tiptap/extensions": "^3.13.0", + "@tiptap/extensions": "^3.20.0", "@types/jquery.cookie": "^1.4.36", "@uirouter/angular": "^17.0.0", "@uirouter/core": "^6.1.0", From eb6bb22dc744815492b849f34688d2023c4153bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 15:00:26 -0300 Subject: [PATCH 238/334] Bump docker/setup-qemu-action from 3 to 4 (#22256) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3 to 4. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 2 +- .github/workflows/hocuspocus-docker.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index d47fa283ccf..44f2ac52c18 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -192,7 +192,7 @@ jobs: echo "https://github.com/opf/openproject/commits/${{ inputs.branch }}" > PRODUCT_URL date -u +"%Y-%m-%dT%H:%M:%SZ" > RELEASE_DATE - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v3 diff --git a/.github/workflows/hocuspocus-docker.yml b/.github/workflows/hocuspocus-docker.yml index 680f1ae61c1..c29fb10a33e 100644 --- a/.github/workflows/hocuspocus-docker.yml +++ b/.github/workflows/hocuspocus-docker.yml @@ -89,7 +89,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 From 7752a2252157f71e900c79bbdcecc7221a88bc73 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 15:00:42 -0300 Subject: [PATCH 239/334] Bump docker/build-push-action from 6 to 7 (#22259) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6...v7) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 4 ++-- .github/workflows/hocuspocus-docker.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 44f2ac52c18..e6e78b8dd6f 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -228,7 +228,7 @@ jobs: sed -i 's/vendor\/bundle//g' .dockerignore - name: Build image id: build - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . platforms: ${{ matrix.platform }} @@ -273,7 +273,7 @@ jobs: --platform "${{ matrix.platform }}" - name: Push image id: push - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . platforms: ${{ matrix.platform }} diff --git a/.github/workflows/hocuspocus-docker.yml b/.github/workflows/hocuspocus-docker.yml index c29fb10a33e..8b328c44cae 100644 --- a/.github/workflows/hocuspocus-docker.yml +++ b/.github/workflows/hocuspocus-docker.yml @@ -96,7 +96,7 @@ jobs: - name: Build and push id: build - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: extensions/op-blocknote-hocuspocus push: true From 7d29c7c43dc8a7be038e1f0ce9c53a10420cec09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 15:00:54 -0300 Subject: [PATCH 240/334] Bump docker/metadata-action from 5 to 6 (#22260) Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 5 to 6. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/v5...v6) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index e6e78b8dd6f..a3b170aaba0 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -203,7 +203,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Docker meta id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: context: git labels: | @@ -327,7 +327,7 @@ jobs: uses: docker/setup-buildx-action@v3 - name: Docker meta id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ needs.setup.outputs.registry_image }} labels: | From c4216a712b13e3e27b08e77d3bf227e709fa728f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 15:01:41 -0300 Subject: [PATCH 241/334] Bump express-rate-limit from 8.2.1 to 8.3.0 in /frontend (#22246) Bumps [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) from 8.2.1 to 8.3.0. - [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases) - [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v8.2.1...v8.3.0) --- updated-dependencies: - dependency-name: express-rate-limit dependency-version: 8.3.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 63781f826d8..6dd367bc56a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14637,11 +14637,11 @@ } }, "node_modules/express-rate-limit": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", - "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", + "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==", "dependencies": { - "ip-address": "10.0.1" + "ip-address": "10.1.0" }, "engines": { "node": ">= 16" @@ -14653,14 +14653,6 @@ "express": ">= 4.11" } }, - "node_modules/express-rate-limit/node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "engines": { - "node": ">= 12" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -35303,18 +35295,11 @@ } }, "express-rate-limit": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", - "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", + "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.0.1" - }, - "dependencies": { - "ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==" - } + "ip-address": "10.1.0" } }, "ext": { From 1c46e1d3f53622fd492f99a8f6f156de33169940 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 10 Mar 2026 18:15:51 +0000 Subject: [PATCH 242/334] update locales from crowdin [ci skip] --- config/locales/crowdin/af.yml | 3 +- config/locales/crowdin/ar.yml | 3 +- config/locales/crowdin/az.yml | 3 +- config/locales/crowdin/be.yml | 3 +- config/locales/crowdin/bg.yml | 3 +- config/locales/crowdin/ca.yml | 3 +- config/locales/crowdin/ckb-IR.yml | 3 +- config/locales/crowdin/cs.yml | 3 +- config/locales/crowdin/da.yml | 3 +- config/locales/crowdin/de.yml | 3 +- 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 | 107 +++++++++--------- config/locales/crowdin/he.yml | 3 +- config/locales/crowdin/hi.yml | 3 +- config/locales/crowdin/hr.yml | 3 +- config/locales/crowdin/hu.yml | 3 +- config/locales/crowdin/id.yml | 3 +- config/locales/crowdin/it.yml | 3 +- config/locales/crowdin/ja.yml | 3 +- config/locales/crowdin/js-fr.yml | 2 +- config/locales/crowdin/ka.yml | 3 +- config/locales/crowdin/kk.yml | 3 +- config/locales/crowdin/ko.yml | 3 +- config/locales/crowdin/lt.yml | 3 +- config/locales/crowdin/lv.yml | 3 +- config/locales/crowdin/mn.yml | 3 +- config/locales/crowdin/ms.yml | 3 +- config/locales/crowdin/ne.yml | 3 +- config/locales/crowdin/nl.yml | 3 +- config/locales/crowdin/no.yml | 3 +- config/locales/crowdin/pl.yml | 3 +- config/locales/crowdin/pt-BR.yml | 3 +- config/locales/crowdin/pt-PT.yml | 3 +- config/locales/crowdin/ro.yml | 3 +- config/locales/crowdin/ru.yml | 3 +- config/locales/crowdin/rw.yml | 3 +- config/locales/crowdin/si.yml | 3 +- config/locales/crowdin/sk.yml | 3 +- config/locales/crowdin/sl.yml | 3 +- config/locales/crowdin/sr.yml | 3 +- config/locales/crowdin/sv.yml | 3 +- config/locales/crowdin/th.yml | 3 +- config/locales/crowdin/tr.yml | 3 +- config/locales/crowdin/uk.yml | 3 +- config/locales/crowdin/uz.yml | 3 +- config/locales/crowdin/vi.yml | 3 +- config/locales/crowdin/zh-CN.yml | 3 +- config/locales/crowdin/zh-TW.yml | 3 +- .../backlogs/config/locales/crowdin/af.yml | 1 + .../backlogs/config/locales/crowdin/ar.yml | 1 + .../backlogs/config/locales/crowdin/az.yml | 1 + .../backlogs/config/locales/crowdin/be.yml | 1 + .../backlogs/config/locales/crowdin/bg.yml | 1 + .../backlogs/config/locales/crowdin/ca.yml | 1 + .../config/locales/crowdin/ckb-IR.yml | 1 + .../backlogs/config/locales/crowdin/cs.yml | 1 + .../backlogs/config/locales/crowdin/da.yml | 1 + .../backlogs/config/locales/crowdin/de.yml | 1 + .../backlogs/config/locales/crowdin/el.yml | 1 + .../backlogs/config/locales/crowdin/eo.yml | 1 + .../backlogs/config/locales/crowdin/es.yml | 1 + .../backlogs/config/locales/crowdin/et.yml | 1 + .../backlogs/config/locales/crowdin/eu.yml | 1 + .../backlogs/config/locales/crowdin/fa.yml | 1 + .../backlogs/config/locales/crowdin/fi.yml | 1 + .../backlogs/config/locales/crowdin/fil.yml | 1 + .../backlogs/config/locales/crowdin/fr.yml | 1 + .../backlogs/config/locales/crowdin/he.yml | 1 + .../backlogs/config/locales/crowdin/hi.yml | 1 + .../backlogs/config/locales/crowdin/hr.yml | 1 + .../backlogs/config/locales/crowdin/hu.yml | 1 + .../backlogs/config/locales/crowdin/id.yml | 1 + .../backlogs/config/locales/crowdin/it.yml | 1 + .../backlogs/config/locales/crowdin/ja.yml | 1 + .../backlogs/config/locales/crowdin/ka.yml | 1 + .../backlogs/config/locales/crowdin/kk.yml | 1 + .../backlogs/config/locales/crowdin/ko.yml | 1 + .../backlogs/config/locales/crowdin/lt.yml | 1 + .../backlogs/config/locales/crowdin/lv.yml | 1 + .../backlogs/config/locales/crowdin/mn.yml | 1 + .../backlogs/config/locales/crowdin/ms.yml | 1 + .../backlogs/config/locales/crowdin/ne.yml | 1 + .../backlogs/config/locales/crowdin/nl.yml | 1 + .../backlogs/config/locales/crowdin/no.yml | 1 + .../backlogs/config/locales/crowdin/pl.yml | 1 + .../backlogs/config/locales/crowdin/pt-BR.yml | 1 + .../backlogs/config/locales/crowdin/pt-PT.yml | 1 + .../backlogs/config/locales/crowdin/ro.yml | 1 + .../backlogs/config/locales/crowdin/ru.yml | 1 + .../backlogs/config/locales/crowdin/rw.yml | 1 + .../backlogs/config/locales/crowdin/si.yml | 1 + .../backlogs/config/locales/crowdin/sk.yml | 1 + .../backlogs/config/locales/crowdin/sl.yml | 1 + .../backlogs/config/locales/crowdin/sr.yml | 1 + .../backlogs/config/locales/crowdin/sv.yml | 1 + .../backlogs/config/locales/crowdin/th.yml | 1 + .../backlogs/config/locales/crowdin/tr.yml | 1 + .../backlogs/config/locales/crowdin/uk.yml | 1 + .../backlogs/config/locales/crowdin/uz.yml | 1 + .../backlogs/config/locales/crowdin/vi.yml | 1 + .../backlogs/config/locales/crowdin/zh-CN.yml | 1 + .../backlogs/config/locales/crowdin/zh-TW.yml | 1 + modules/costs/config/locales/crowdin/fr.yml | 12 +- 110 files changed, 167 insertions(+), 167 deletions(-) diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index 0a34d6e0828..8bfae590e40 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -3508,7 +3508,6 @@ af: label_float: "Dryf" label_folder: "Folder" label_follows: "volg" - label_force_user_language_to_default: "Stel taal van gebruikers wat 'n nie-toegelate taal gebruik na verstektaal" label_form_configuration: "Vorm konfigurasie" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5004,7 +5003,7 @@ af: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Skrap" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Wat wil jy doen?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index 1130d3d5a0d..a906dd29461 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -3732,7 +3732,6 @@ ar: label_float: "عدد عشري" label_folder: "مجلد" label_follows: "تتبع" - label_force_user_language_to_default: "إعطاء لغة للمستخدمين غير اللغة المسموح بها بشكل افتراضي" label_form_configuration: "تشكيل النموذج" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5234,7 +5233,7 @@ ar: text_default_administrator_account_changed: "تغيير حساب المسؤول الافتراضي" text_default_encoding: "الافتراضي: UTF-8" text_destroy: "احذف" - text_destroy_with_associated: "وهناك كائنات إضافية مرتبطة مع الحزمة (الحزم) العمل الموجودة المراد حذفها. هذه الكائنات من الأنواع التالية: " + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "ماذا تريد أن تفعل؟" text_diff_truncated: "... تم اقتطاعه لأنه يتجاوز الحد الأقصى للحجم التي يمكن عرضها." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index 3b74763ce3f..b78789c47ae 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -3508,7 +3508,6 @@ az: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5004,7 +5003,7 @@ az: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Sil" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index 8500ae7f797..288a3ef04ec 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -3620,7 +3620,6 @@ be: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5120,7 +5119,7 @@ be: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Выдаліць" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index dd8479a766d..87966d32a03 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -3508,7 +3508,6 @@ bg: label_float: "Плаващ" label_folder: "Папка" label_follows: "следва" - label_force_user_language_to_default: "Задаване на език по подразбиране за потребителите с липсващи в системата езици" label_form_configuration: "Конфигурация на формата" label_formula: "Formula" label_gantt_chart: "Диаграма на Гант" @@ -5004,7 +5003,7 @@ bg: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Изтрий" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Какво искате да правите?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index a40108a7a81..a2b501ceda9 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -3505,7 +3505,6 @@ ca: label_float: "Flotant" label_folder: "Carpeta" label_follows: "segueix" - label_force_user_language_to_default: "Definir la llengua pels usuaris que tenen una llengua per defecte no permesa" label_form_configuration: "Configuració del formulari" label_formula: "Formula" label_gantt_chart: "Diagrama de Gantt" @@ -4995,7 +4994,7 @@ ca: text_default_administrator_account_changed: "S'ha canviat el compte d'administrador predeterminat" text_default_encoding: "Per defecte: UTF-8" text_destroy: "Esborrar" - text_destroy_with_associated: "Hi ha objectes addicionals associats amb el(s) paquet(s) de treball que es suprimiran. Aquests objectes són dels tipus següents:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Què vols fer?" text_diff_truncated: "... Aquestes diferències s'han truncat perquè excedeixen la mida màxima que es pot mostrar." text_email_delivery_not_configured: "L'entrega de correu electrònic no està configurada, i les notificacions estan desactivades.\nConfigura el teu servidor SMTP per a habilitar-les." diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index 0c80f1f4bae..cf94a592de7 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -3508,7 +3508,6 @@ ckb-IR: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5004,7 +5003,7 @@ ckb-IR: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Delete" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 5b4a0316dcf..63af32b2769 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -3620,7 +3620,6 @@ cs: label_float: "Desetinné číslo" label_folder: "Složka" label_follows: "sleduje" - label_force_user_language_to_default: "Nastavte jazyk uživatelů, kteří nemají povolený jazyk na výchozí" label_form_configuration: "Konfigurace formuláře" label_formula: "Vzorec" label_gantt_chart: "Ganttův diagram" @@ -5119,7 +5118,7 @@ cs: text_default_administrator_account_changed: "Výchozí účet správce změněn" text_default_encoding: "Výchozí: UTF-8" text_destroy: "Odstranit" - text_destroy_with_associated: "Existují další objekty, které jsou přiřazeny k pracovním balíčkům a které mají být odstraněny. Tyto objekty jsou následující typy:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Co chcete udělat?" text_diff_truncated: "... Toto rozlišení bylo zkráceno, protože přesahuje maximální velikost, kterou lze zobrazit." text_email_delivery_not_configured: "Doručení e-mailu není nakonfigurováno a oznámení jsou zakázána.\nNakonfigurujte váš SMTP server pro jejich povolení." diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index 5e202606b93..c050822af29 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -3506,7 +3506,6 @@ da: label_float: "Flyd" label_folder: "Folder" label_follows: "følger" - label_force_user_language_to_default: "Sæt sprog for brugere, der har forhåndsvalgt et ikke gangbart sprog" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5000,7 +4999,7 @@ da: text_default_administrator_account_changed: "Forhåndsvalgt administratorkonto ændret" text_default_encoding: "Forhåndsvalgt: UTF-8" text_destroy: "Slet" - text_destroy_with_associated: "Der er yderligere objekter tilknyttet arbejdspakken/-kerne som skal slettes. Disse er af følgende art:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Hvad vil du lave?" text_diff_truncated: "... Denne afvigelse blev undertrykt da den overstiger den længde, der kan vises." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 26ad0192aee..c7e643bc574 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -3500,7 +3500,6 @@ de: label_float: "Gleitkommazahl" label_folder: "Ordner" label_follows: "folgt" - label_force_user_language_to_default: "Setze Sprache für Nutzer, die eine nicht erlaubte Sprache gewählt haben, auf die Standard-Sprache" label_form_configuration: "Formularkonfiguration" label_formula: "Formel" label_gantt_chart: "Gantt-Diagramm" @@ -4998,7 +4997,7 @@ de: text_default_administrator_account_changed: "Administrator-Kennwort geändert" text_default_encoding: "Default: UTF-8" text_destroy: "Löschen" - text_destroy_with_associated: "Es sind weitere Datenobjekte mit den bzw. dem zu löschenden Arbeitpaket(en) verbunden. Es handelt sich dabei um Objekte der folgenden Typen:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Was soll mit den Objekten geschehen?" text_diff_truncated: "... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet." text_email_delivery_not_configured: "E-Mail-Zustellung ist nicht konfiguriert und Benachrichtigungen sind deaktiviert.\nKonfigurieren Sie Ihren SMTP-Server, um sie zu aktivieren." diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index 6ce9facfd68..cdae5cbffd0 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -3504,7 +3504,6 @@ el: label_float: "Float" label_folder: "Φάκελος" label_follows: "ακολουθεί" - label_force_user_language_to_default: "Ορίστε την γλώσσα των χρηστών που έχουν μια μη επιτρεπόμενη γλώσσα ως προεπιλογή" label_form_configuration: "Διαμόρφωση φόρμας" label_formula: "Formula" label_gantt_chart: "Διάγραμμα Gantt" @@ -4999,7 +4998,7 @@ el: text_default_administrator_account_changed: "Ο προεπιλεγμένος λογαριασμός του διαχειριστή άλλαξε" text_default_encoding: "Προεπιλογή: UTF-8" text_destroy: "Διαγραφή" - text_destroy_with_associated: "Υπάρχουν επιπλέον αντικείμενα μαζί με το πακέτο εργασίας που πρόκειται να διαγραφεί. Τα αντικείμενα αυτά είναι των παρακάτω τύπων:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Τι θέλετε να κάνετε;" text_diff_truncated: "... Αυτό το diff περικόπηκε επειδή υπερβαίνει το μέγιστο μέγεθος που μπορεί να εμφανιστεί." text_email_delivery_not_configured: "Η διανομή email δεν είναι διαμορφωμένη και οι ειδοποιήσεις είναι απενεργοποιημένες.\nΔιαμορφώστε τον SMTP εξυπηρετητή για τις ενεργοποιήσετε." diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index 21d8970710d..d6a20010d0e 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -3508,7 +3508,6 @@ eo: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Formulara agordo" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5004,7 +5003,7 @@ eo: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Forigi" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 4f3f91b8eb9..69572553b31 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -3505,7 +3505,6 @@ es: label_float: "Desprender" label_folder: "Carpeta" label_follows: "sigue" - label_force_user_language_to_default: "Configurar idioma de usuarios que tienen un lenguaje no permitido por defecto" label_form_configuration: "Configuración del formato" label_formula: "Fórmula" label_gantt_chart: "Diagrama de Gantt" @@ -5000,7 +4999,7 @@ es: text_default_administrator_account_changed: "Se ha cambiado la cuenta de administrador por defecto" text_default_encoding: "Por defecto: UTF-8" text_destroy: "Borrar" - text_destroy_with_associated: "Hay objetos adicionales asociados a los paquetes de trabajo que van a ser eliminados. Esos objetos son de los siguientes tipos:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "¿Qué quieres hacer?" text_diff_truncated: "... Esta diferencia se truncó porque excede el tamaño máximo que puede visualizarse." text_email_delivery_not_configured: "No se ha configurado la entrega de correo electrónico y se han deshabilitado las notificaciones.\nConfigure el servidor SMTP para habilitarlas." diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index a3ad726f9b7..a6100bd3a64 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -3508,7 +3508,6 @@ et: label_float: "Ujuvkomaarv" label_folder: "Kaust" label_follows: "järgneb" - label_force_user_language_to_default: "Sea keel kasutajatele, kellel on vaikimisi keeleks valitud mittelubatud keel" label_form_configuration: "Vormi seadistamine" label_formula: "Formula" label_gantt_chart: "Gantt diagrammi" @@ -5004,7 +5003,7 @@ et: text_default_administrator_account_changed: "Algne administraatori konto on muudetud" text_default_encoding: "Vaikimisi: UTF-8" text_destroy: "Kustuta" - text_destroy_with_associated: "Kustutamiseks määratud teema(de)ga on seostatud veel objekte. Objektid on järgnevate tüüpidega:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Mis sa soovid ette võtta?" text_diff_truncated: "... Osa erinevusi jäi välja, sest neid on näitamiseks liiga palju." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index d61a4405856..6807aaebc7d 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -3508,7 +3508,6 @@ eu: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5004,7 +5003,7 @@ eu: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Delete" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index b6298f323ae..107641a9aa1 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -3508,7 +3508,6 @@ fa: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "نمودار گانت" @@ -5004,7 +5003,7 @@ fa: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "حذف" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index 661ad5324cf..bf0cffe91e9 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -3508,7 +3508,6 @@ fi: label_float: "Liukuluku" label_folder: "Kansio" label_follows: "seuraa" - label_force_user_language_to_default: "Määritä oletuskieli jos käytössä on kieli joka ei ole sallittu" label_form_configuration: "Lomakkeen muokkaus" label_formula: "Formula" label_gantt_chart: "Gantt-kaavio" @@ -5004,7 +5003,7 @@ fi: text_default_administrator_account_changed: "Oletuarvoinen järjestelmävalvoja muutettu" text_default_encoding: "Default: UTF-8" text_destroy: "Poista" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Mitä sinä haluat tehdä?" text_diff_truncated: "... Tämä katkaistiin koska suurin mahdollinen näytettävä määrä tuli täyteen." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index afda3db1d68..80c4f907555 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -3508,7 +3508,6 @@ fil: label_float: "Lumutang" label_folder: "Folder" label_follows: "sundan" - label_force_user_language_to_default: "Magtakda ng linggwahe ng mga gumagamit na mayroon pinayagang linggwahe sa default" label_form_configuration: "Form kompigurasyon" label_formula: "Formula" label_gantt_chart: "Gantt tsart" @@ -5002,7 +5001,7 @@ fil: text_default_administrator_account_changed: "I-default ang tagapangasiwa ng pagbago ng akwant" text_default_encoding: "I-default: UTF-8" text_destroy: "Burahin" - text_destroy_with_associated: "Mayroong karagdagang mga bagay naka-associaye sa work packGe na maaring burahin. Yung mga bagay ay ang mga sumusunod na uri:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Ano gusto mong gawin?" text_diff_truncated: "... Itong diff ay naka-truncatw dahil ito ay lamps na sa pinakamataas na laki na maaring ipakita." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index f0ede2db621..c2de1c2c5c7 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -889,7 +889,7 @@ fr: invited: "Invité" locked: "Verrouillé" project_roles: "Rôles du projet" - wp_shares: "Partages du lot des travaux" + wp_shares: "Partages du lot de travaux" groups: "Groupes" delete_member_dialog: title: "Supprimer le membre" @@ -1064,7 +1064,7 @@ fr: data_consequences: > Toutes les occurrences de l'utilisateur fictif (par exemple, en tant que responsable ou autre valeur utilisateur) seront réaffectées à un compte appelé « Utilisateur supprimé ». Comme les données de chaque compte supprimé sont réaffectées à ce compte, il ne sera pas possible de distinguer les données que l'utilisateur a créées des données d'un autre compte supprimé. irreversible: "Cette action est irréversible" - confirmation: "Saisissez le nom d'utilisateur fictif %{name} pour confirmer ça suppression." + confirmation: "Saisissez le nom d'utilisateur fictif %{name} pour confirmer sa suppression." priorities: edit: priority_color_text: | @@ -1726,7 +1726,7 @@ fr: 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." - error_conflict: "Cette information a été mise a jour par au moin un autre utilisateur pendant la même session" + error_conflict: "Cette information a été mise à jour par au moins un autre utilisateur entre-temps." error_not_found: "introuvable." email: "n'est pas une adresse e-mail valide." empty: "ne peut pas être vide." @@ -2226,7 +2226,7 @@ fr: one: "%{count} heure" other: "%{count} heures" updated: "modifié de %{old_value} à %{value}" - logged_for: "Connecté(e) pendant" + logged_for: "Consigné pour" filter: changeset: "Révisions" message: "Forums" @@ -2374,7 +2374,7 @@ fr: error: invalid_token: Jeton de sauvegarde invalide ou manquant token_cooldown: Le jeton de sauvegarde sera valide dans %{hours} heures. - backup_pending: Une sauvegarde en déjà en attente. + backup_pending: Une sauvegarde est déjà en attente. limit_reached: Vous ne pouvez faire que %{limit} sauvegardes par jour. button_actions: "Actions" button_add: "Ajouter" @@ -2483,7 +2483,7 @@ fr: contact_mail_instructions: Définissez l'adresse mail à laquelle les utilisateurs peuvent joindre un contrôleur de données pour effectuer des modifications de données ou des demandes de suppression. contact_your_administrator: Veuillez contacter votre administrateur si vous souhaitez que votre compte soit supprimé. contact_this_mail_address: Veuillez contacter %{mail_address} si vous voulez que votre compte soit supprimé. - text_update_consent_time: Cochez cette case pour forcer les utilisateurs à accepter à nouveau. Activer le lorsque vous avez modifié l'aspect juridique des informations de l'accord ci-dessus. + text_update_consent_time: Cochez cette case pour forcer les utilisateurs à donner à nouveau leur consentement. Activez-le lorsque vous avez modifié l'aspect juridique des informations de l'accord ci-dessus. update_consent_last_time: "Dernière mise à jour de l'accord: %{update_time}" copy_project: title: 'Copier le projet « %{source_project_name} »' @@ -2650,7 +2650,7 @@ fr: description_active: "Actif ?" description_attachment_toggle: "Afficher/Masquer les pièces jointes" description_autocomplete: > - Ce champ utilise la saisie semi-automatique. Lorsque vous tapez le titre d'un Lot de Travaux, vous recevrez une liste de choix possibles. Choisissez-en un en utilisant les flèches haut et bas et selectionnez-le avec Tab ou Entrée. Sinon, vous pouvez entrer le numéro de Lots de Travaux directement. + Ce champ utilise la saisie semi-automatique. Lorsque vous tapez le titre d'un lot de travaux, vous recevrez une liste de choix possibles. Choisissez-en un en utilisant les flèches haut et bas et selectionnez-le avec Tab ou Entrée. Sinon, vous pouvez entrer le numéro de lot de travaux directement. description_available_columns: "Colonnes disponibles" description_choose_project: "Projets" description_compare_from: "Comparer avec" @@ -2666,14 +2666,14 @@ fr: description_message_content: "Contenu du message" description_my_project: "Vous êtes membre" description_notes: "Notes" - description_parent_work_package: "Parent du Lot de Travaux actuel" + description_parent_work_package: "Parent du lot de travaux actuel" description_project_scope: "Étendue de la recherche" description_query_sort_criteria_attribute: "Classer l'attribut" description_query_sort_criteria_direction: "Classer la direction" description_search: "Champs de recherche" description_select_work_package: "Sélectionner un lot de travaux" description_selected_columns: "Colonnes Sélectionnées" - description_sub_work_package: "Sous-Lot de Travaux de l'actuel" + description_sub_work_package: "Sous-lot de travaux de l'actuel" description_toc_toggle: "Afficher/Masquer la table de matières" description_wiki_subpages_reassign: "Assigner une nouvelle page parente" #Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) @@ -2833,7 +2833,7 @@ fr: disabled: "Activer" enabled: "Désactiver" enumeration_activities: "Activités de suivi du temps" - enumeration_work_package_priorities: "Priorités du Lot de Travaux" + enumeration_work_package_priorities: "Priorités du lot de travaux" enumeration_reported_project_statuses: "Statut signalé" enumeration_caption_order_changed: "La commande a été modifiée avec succès." enumeration_could_not_be_moved: "L'énumération n'a pas pu être déplacée." @@ -2872,7 +2872,7 @@ fr: error_pdf_failed_to_export: "L'export PDF n'a pas pu être enregistré: %{error}" error_token_authenticity: "Impossible de vérifier le jeton de Cross-Site Request Forgery. Avez-vous essayé d'envoyer des données sur plusieurs navigateurs ou onglets ? Veuillez fermer tous les onglets et réessayer." error_reminder_not_found: "Le rappel n'a pas été trouvé ou a déjà été notifié." - error_work_package_not_found_in_project: "Le Lot de Travaux n'a pas été trouvé ou n'appartient pas à ce projet" + error_work_package_not_found_in_project: "Le lot de travaux n'a pas été trouvé ou n'appartient pas à ce projet" error_work_package_id_not_found: "Le lot de travaux n'a pas été trouvé." error_must_be_project_member: "doit être membre du projet" error_migrations_are_pending: "Votre installation OpenProject a des migrations de base de données en attente. Vous n'avez probablement pas exécuté les migrations lors de votre dernière mise à jour. Veuillez consulter le guide de mise à jour afin de mettre votre installation correctement à jour." @@ -2909,8 +2909,8 @@ fr: time_entry: "Journal horaire édité" wiki_page: "Page Wiki éditée" work_package_closed: "Lot de travaux clôturé" - work_package_edit: "Lot de Travaux édité" - work_package_note: "Note de Lot de Travaux ajoutée" + work_package_edit: "Lot de travaux édité" + work_package_note: "Note de lot de travaux ajoutée" title: project: "Projet : %{name}" subproject: "Sous-projet : %{name}" @@ -3043,10 +3043,10 @@ fr: extraction: available: pdftotext: "Pdftotext disponible (optionnel)" - unrtf: "Unrtf disponible (optionel)" - catdoc: "Catdoc disponible (optionel)" - xls2csv: "Xls2csv disponible (optionel)" - catppt: "Catppt disponible (optionel)" + unrtf: "Unrtf disponible (optionnel)" + catdoc: "Catdoc disponible (optionnel)" + xls2csv: "Xls2csv disponible (optionnel)" + catppt: "Catppt disponible (optionnel)" tesseract: "Tesseract disponible (optionnel)" filterable_tree_view: filter_mode: @@ -3114,12 +3114,12 @@ fr: journals: changes_retracted: "Les modifications ont été retirées." caused_changes: - budget_deleted: "La budget a été supprimé" + budget_deleted: "Le budget a été supprimé" dates_changed: "Dates modifiées" default_attribute_written: "Attributs en lecture seule écrits" import: "Importé" progress_mode_changed_to_status_based: "Mise à jour du calcul de la progression" - status_changed: "Statut « %{status_name} »" + status_changed: "Statut « %{status_name} »" system_update: "Mise à jour du système OpenProject :" work_package_duplicate_closed: "Doublon de lot de travaux mis à jour :" total_percent_complete_mode_changed_to_work_weighted_average: "Le calcul des totaux de % d'achèvement est désormais pondéré par le travail." @@ -3127,7 +3127,7 @@ fr: cause_descriptions: import: header: "modifications par %{author}" - field_changed: "%{field} a modifié de %{old_value} à %{new_value}" + field_changed: "%{field} est passé de %{old_value} à %{new_value}" field_set: "%{field} réglé sur %{value}" field_removed: "%{field} supprimé" field_updated: "%{field} mis à jour" @@ -3171,7 +3171,7 @@ fr: links: configuration_guide: "Guide de configuration" get_in_touch: "Vous avez des questions ? Contactez-nous." - instructions_after_registration: "Vous pouvez vous authentifier tant que votre compte a été activé en cliquant sur %{signin}." + instructions_after_registration: "Vous pourrez vous connecter après avoir activé votre compte en cliquant sur %{signin}." instructions_after_logout: "Vous pouvez vous ré-authentifier en cliquant sur %{signin}." instructions_after_error: "Vous pouvez encore essayer de vous authentifier en cliquant sur %{signin}. Si l'erreur persiste, demandez de l'aide à votre administrateur." menus: @@ -3352,7 +3352,7 @@ fr: label_forums_locked: "Verrouillé" label_forum_new: "Nouveau forum" label_forum_plural: "Forums" - label_forum_sticky: "Epinglé" + label_forum_sticky: "Épinglé" label_boolean: "Booléen" label_board_plural: "Tableaux" label_branch: "Branche" @@ -3475,7 +3475,7 @@ fr: label_enterprise_active_users: "%{current}/%{limit} utilisateurs actifs inscrits" label_enterprise_edition: "édition Enterprise" label_enterprise_support: "Support Enterprise" - label_environment: "Environement" + label_environment: "Environnement" label_estimates_and_progress: "Estimations et progression" label_equals: "est" label_equals_with_descendants: "est l'un des éléments avec des descendants" @@ -3506,7 +3506,6 @@ fr: label_float: "Flottant" label_folder: "Dossier" label_follows: "suivi" - label_force_user_language_to_default: "Pour cet utilisateur, revenir au langage par defaut" label_form_configuration: "Configuration du formulaire" label_formula: "Formule" label_gantt_chart: "Diagramme de Gantt" @@ -3568,7 +3567,7 @@ fr: label_jump_to_a_project: "Aller à un projet…" label_jira_import: "Importation de Jira" label_keyword_plural: "Mots clés" - label_language_based: "Basé sur le langage de l'utilisateur" + label_language_based: "Basé sur la langue de l'utilisateur" label_last_activity: "Dernière activité" label_last_change_on: "Dernière modification le" label_last_changes: "les %{count} derniers changements" @@ -3644,7 +3643,7 @@ fr: label_more_than_ago: "il y a plus de quelques jours" label_move_column_left: "Déplacer la colonne à gauche" label_move_column_right: "Déplacer la colonne à droite" - label_move_work_package: "Déplacer le Lot de Travaux" + label_move_work_package: "Déplacer le lot de travaux" label_my_account: "Paramètres du compte" label_my_activity: "Mon activité" label_my_account_data: "Info sur mon compte" @@ -3709,7 +3708,7 @@ fr: label_people: "Participants" label_permissions: "Autorisations" label_permissions_report: "Rapport d'autorisations" - label_personalize_page: "Personaliser cette page" + label_personalize_page: "Personnaliser cette page" label_placeholder_user: "Utilisateur fictif" label_placeholder_user_new: "Nouvel utilisateur fictif" label_placeholder_user_plural: "Utilisateurs fictifs" @@ -3802,7 +3801,7 @@ fr: label_roadmap: "Feuille de route" label_roadmap_edit: "Modifier la feuille de route %{name}" label_roadmap_due_in: "Date limite %{value}" - label_roadmap_no_work_packages: "Aucun Lot de Travaux pour cette version" + label_roadmap_no_work_packages: "Aucun lot de travaux pour cette version" label_roadmap_overdue: "%{value} de retard" label_role_and_permissions: "Rôles et permissions" label_role_new: "Nouveau rôle" @@ -3927,7 +3926,7 @@ fr: label_wiki_navigation: "Navigation wiki" label_wiki_page: "Page wiki" label_wiki_page_plural: "Pages wiki" - label_wiki_show_index_page_link: "Montrer le sous-menu 'Table des Matiéres'" + label_wiki_show_index_page_link: "Montrer l'entrée de sous-menu 'Table des Matières'" label_wiki_show_menu_item: "Afficher en tant qu'élément dans le menu de navigation du projet" label_wiki_show_new_page_link: "Montrer le sous-menu 'Créer une nouvelle page enfant'" label_wiki_show_submenu_item: "Montrer comme sous-menu de " @@ -3939,7 +3938,7 @@ fr: label_work_package_category_plural: "Catégories de Lots de Travaux" label_work_package_comments: "Commentaires du lot de travaux" label_work_package_hierarchy: "Hiérarchie du lot de travaux" - label_work_package_new: "Nouveau Lot de Travaux" + label_work_package_new: "Nouveau lot de travaux" label_work_package_edit: "Éditer le lot de travaux %{name}" label_work_package_plural: "Lots de Travaux" label_work_package_status: "Statut du lot de travaux" @@ -4002,7 +4001,7 @@ fr: errors: no_project_context: "Appel de la macro create_work_package_link depuis un contexte de projet externe." invalid_type: "Aucun type trouvé avec le nom '%{type}' dans le projet '%{project}'." - link_name: "Nouveau Lot de Travaux" + link_name: "Nouveau lot de travaux" link_name_type: "Nouveau %{type_name}" mail: actions: "Actions" @@ -4113,7 +4112,7 @@ fr: Si vous avez d'autres questions, consultez notre documentation (%{documentation_link}) ou contactez votre administrateur. mail_body_register_closing: "Votre équipe OpenProject" mail_body_register_ending: "Restez connecté ! Cordialement," - mail_body_reminder: "%{count} lot(s) de travaux qui vous sont assignés arrivent à échéance dans les %{days} prochains jours:" + mail_body_reminder: "%{count} lot(s) de travaux qui vous sont assignés arrivent à échéance dans les %{days} prochains jours :" mail_body_group_reminder: '%{count} lot(s) de travaux assigné(s) au groupe "%{group}" arrive(nt) à échéance dans %{days} jours :' mail_body_wiki_page_added: "La page wiki '%{id}' a été ajouté par %{author}." mail_body_wiki_page_updated: "La page wiki '%{id}' a été mise à jour par %{author}." @@ -4185,15 +4184,15 @@ fr: notice_custom_options_deleted: "L'option « %{option_value} » et ses %{num_deleted} occurrences ont été supprimées." notice_email_error: "Une erreur est survenue lors de l'envoi du mail (%{value})" notice_email_sent: "Un e-mail a été envoyé à %{value}" - notice_failed_to_save_work_packages: "Échec lors de l'enregistrement de %{count} lot(s) de travaux sur %{total} sélectionnés: %{ids}." + notice_failed_to_save_work_packages: "Échec lors de l'enregistrement de %{count} lot(s) de travaux sur %{total} sélectionnés : %{ids}." notice_failed_to_save_members: "Échec de sauvegarde du ou des membres: %{errors}." notice_deletion_scheduled: "La suppression a été planifiée et est effectuée de manière asynchrone." notice_file_not_found: "La page à laquelle vous essayez d'accéder n'existe pas ou a été supprimée." notice_forced_logout: "Vous avez été déconnecté après %{ttl_time} minutes d'inactivité." notice_internal_server_error: "Une erreur est survenue sur la page à laquelle vous essayez d'accéder. Si le problème persiste, veuillez contacter votre administrateur %{app_title} pour assistance." - notice_locking_conflict: "Cette information a été mise a jour par au moin un autre utilisateur pendant la même session" - notice_locking_conflict_additional_information: "Le(s) mise(s) à jour(s) ont été faite par %{users}." - notice_locking_conflict_reload_page: "Veuillez rafraîchir la page, vérifier les changements et rélancer la mise à jour." + notice_locking_conflict: "Cette information a été mise à jour par au moins un autre utilisateur entre-temps." + notice_locking_conflict_additional_information: "Le(s) mise(s) à jour(s) ont été faite(s) par %{users}." + notice_locking_conflict_reload_page: "Veuillez rafraîchir la page, vérifier les changements et réappliquer vos modifications." notice_locking_conflict_warning: "Cette page a été mise à jour par quelqu'un d'autre. Pour ne pas perdre vos modifications, copiez-les localement et rechargez la page pour afficher la version mise à jour." notice_locking_conflict_danger: "Impossible d'enregistrer vos modifications en raison d'un conflit de modifications. Pour ne pas perdre vos modifications, copiez-les localement et rechargez la page pour afficher la version mise à jour." notice_locking_conflict_action_button: "Annuler les modifications et recharger" @@ -4361,7 +4360,7 @@ fr: permission_view_news: "Voir les nouvelles" permission_view_members: "Afficher les membres" permission_view_reportings: "Voir rapports" - permission_view_shared_work_packages: "Voir les partages du lot des travaux" + permission_view_shared_work_packages: "Voir les partages du lot de travaux" permission_view_time_entries: "Voir temps passé" permission_view_timelines: "Voir les lignes du temps" permission_view_user_email: "Consulter les adresses e-mail des utilisateurs" @@ -4473,7 +4472,7 @@ fr: not_available: "Les instructions de « checkout » ne sont pas définies pour ce dépôt. Demandez à votre administrateur de les activer pour ce dépôt dans les paramètres système." create_managed_delay: "N.B. : le dépôt est géré; il est créé de façon asynchrone sur le disque et sera disponible sous peu." create_successful: "Le dépôt a été enregistré." - delete_sucessful: "Le dépôt à été supprimé." + delete_sucessful: "Le dépôt a été supprimé." destroy: confirmation: "Si vous continuez, cela supprimera définitivement le dépôt géré." info: "La suppression du dépôt est une action irréversible." @@ -4623,7 +4622,7 @@ fr: setting_antivirus_scan_action: "Action sur le fichier infecté" setting_autofetch_changesets: "Rapatrier automatiquement les changements du dépôt" setting_autologin: "Auto-connexion" - setting_available_languages: "Langages disponibles" + setting_available_languages: "Langues disponibles" setting_bcc_recipients: "Destinataires en copie carbone invisible (Cci)" setting_brute_force_block_after_failed_logins: "Bloquer l'utilisateur après ce nombre de tentatives de connexion échouées" setting_brute_force_block_minutes: "Temps de bloquage de l'utilisateur" @@ -4642,7 +4641,7 @@ fr: setting_cross_project_work_package_relations: "Autoriser les relations entre lots de travaux de projets différents" setting_first_week_of_year: "La première semaine de l'année contient" setting_date_format: "Date" - setting_default_language: "Langage par défaut" + setting_default_language: "Langue par défaut" setting_default_projects_modules: "Modules activés par défaut pour les nouveaux projets" setting_default_projects_public: "Les nouveaux projets sont publics par défaut" setting_disable_password_login: "Désactiver l'authentification par mot de passe" @@ -4668,7 +4667,7 @@ fr: setting_hours_per_day: "Heures par jour" setting_hours_per_day_explanation: >- Cela définit ce qui est considéré comme un « jour » lors de l'affichage de la durée en jours et en heures (par exemple, si un jour dure 8 heures, 32 heures représentent 4 jours). - setting_invitation_expiration_days: "L'émail d’activation expire après" + setting_invitation_expiration_days: "L'e-mail d’activation expire après" setting_invitation_expiration_days_caption: "Nombre de jours après l'expiration de l'e-mail d'activation." setting_work_package_done_ratio: "Mode de calcul de l'avancement" setting_work_package_done_ratio_field: "Basé sur le travail" @@ -4679,7 +4678,7 @@ fr: Chaque statut est associé à une valeur de % d'achèvement. Le changement de statut modifie le % d'achèvement. setting_work_package_done_ratio_explanation_html: > En mode Basé sur le travail, le % d'achèvement peut être librement défini sur n'importe quelle valeur. Si vous saisissez une valeur pour le travail, le travail restant sera automatiquement dérivé. En mode Basé sur le statut, chaque état a une valeur de % d'achèvement associée. Le changement de statut changera la valeur de % d'achèvement. - setting_work_package_properties: "Propriétés du Lot de Travaux" + setting_work_package_properties: "Propriétés du lot de travaux" setting_work_package_startdate_is_adddate: "Utiliser la date actuelle comme date de début des nouveaux lots de travaux" setting_work_packages_projects_export_limit: "Limite d'exportation des lots de travaux/projets" setting_journal_aggregation_time_minutes: "Actions utilisateur agrégées dans" @@ -4999,29 +4998,29 @@ fr: text_custom_touch_icon_instructions: > Il s'agit de l'icône qui apparaît dans votre appareil mobile ou tablette lorsque vous placez un signet sur votre écran d'accueil. Il doit s'agir d'une image PNG carrée de 180 pixels x 180 pixels. Veuillez vous assurer que l'arrière-plan de l'image n'est pas transparent, sans quoi son apparence sera peu adaptée sur iOS. text_database_allows_tsv: "La base de données permet TSVector (facultatif)" - text_default_administrator_account_changed: "Changement du compte Administrateur par defaut" + text_default_administrator_account_changed: "Le compte administrateur par défaut a été changé" text_default_encoding: "Défaut: UTF-8" text_destroy: "Supprimer" - text_destroy_with_associated: "Il y a des objéts supplémentaires associés à ce(s) Lot(s) de Travaux qui doivent être supprimés. Ces objets sont des types suivants:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Que voulez-vous faire?" text_diff_truncated: "... Cette « diff » a été tronquée car elle dépasse la taille maximale d'affichage." text_email_delivery_not_configured: "L'envoi d'e-mails n'est pas configuré et les notifications sont désactivées.\nConfigurer votre serveur SMTP pour les activer." text_enumeration_category_reassign_to: "Les réassigner à cette valeur:" - text_enumeration_destroy_question: "%{count} objéts sont assignés à cette valeur." + text_enumeration_destroy_question: "%{count} objets sont assignés à cette valeur." text_file_repository_writable: "Répertoire des pièces jointes accessible en écriture" text_git_repo_example: "un dépôt vide et local (e.x., /gitrepo, c:\\gitrepo)" text_hint_date_format: "Entrez une date au format AAAA-MM-JJ. D'autres formats peuvent engendrer une date non désirée." text_hint_disable_with_0: "Note : Désactivez avec 0" text_hours_between: "Entre %{min} et %{max} heures." - text_work_package_added: "Le Lot de Travaux %{id} a été signalé par %{author}." + text_work_package_added: "Le lot de travaux %{id} a été signalé par %{author}." text_work_package_category_destroy_assignments: "Supprimer les affectations de catégorie" text_work_package_category_destroy_question: "(%{count}) Lots de Travaux sont assignés à cette catégorie. Que voulez-vous faire?" text_work_package_category_reassign_to: "Réassigner les Lots de Travaux de cette catégorie" - text_work_package_updated: "Le Lot de Travaux %{id} a été mis à jour par %{author}." + text_work_package_updated: "Le lot de travaux %{id} a été mis à jour par %{author}." text_work_package_watcher_added: "Vous avez été ajouté comme observateur au lot de travaux %{id} par %{watcher_changer}." text_work_package_watcher_removed: "Vous avez été retiré des observateurs du lot de travaux %{id} par %{watcher_changer}." text_work_packages_destroy_confirmation: "Êtes-vous sûr de vouloir supprimer le(s) lot(s) de travaux sélectionné(s) ?" - text_work_packages_ref_in_commit_messages: "Referencer et réparer les Lot(s) de Travaux dans les messages « commit »" + text_work_packages_ref_in_commit_messages: "Référencer et réparer les lots de travaux dans les messages de « commit »" text_journal_added: "%{label} %{value} ajouté" text_journal_attachment_added: "%{label} %{value} ajouté en pièce jointe" text_journal_attachment_deleted: "%{label} %{old} supprimé en tant que pièce jointe" @@ -5043,7 +5042,7 @@ fr: text_load_default_configuration: "Charger la configuration par défaut" text_no_roles_defined: Il n'y a pas de rôles définis. text_no_access_tokens_configurable: "Il n'y a aucun jeton d'accès qui puisse être configuré." - text_no_configuration_data: "Les rôles, les types, l'état des lots de travaux et les flux de travaux n'ont pas encore été configurés.\nIl est fortement recommandé de charger la configuration par défaut. Vous serrez capable de le modifier, une fois chargé." + text_no_configuration_data: "Les rôles, les types, l'état des lots de travaux et les flux de travaux n'ont pas encore été configurés.\nIl est fortement recommandé de charger la configuration par défaut. Vous serez capable de la modifier une fois chargée." text_no_notes: "Il n'existe aucun commentaire pour ce lot de travaux." text_notice_too_many_values_are_inperformant: "Remarque : L'affichage de plus de 100 articles par page peut augmenter le temps de chargement de la page." text_notice_security_badge_displayed_html: > @@ -5100,12 +5099,12 @@ fr: title_remove_and_delete_user: Retirer du projet l'utilisateur invité et le supprimer. title_enterprise_upgrade: "Mettre à niveau pour débloquer plus d'utilisateurs." tooltip_user_default_timezone: > - Fuseau horaire par défaut des nouveaux utilisateurs. Il peut-être modifié dans les paramètres utilisateur. + Fuseau horaire par défaut des nouveaux utilisateurs. Modifiable dans les paramètres utilisateur. tooltip_resend_invitation: > Envoie un nouvel e-mail d'invitation avec un nouveau jeton, au cas où l'ancien jeton aurait expiré ou l'utilisateur n'aurait pas reçu l'e-mail original. Cette option peut également être utilisée pour permettre aux utilisateurs actifs de choisir une nouvelle méthode d'authentification. Si elle est utilisée avec les utilisateurs actifs, leur statut passera à « invité ». tooltip: setting_email_login: > - Si activé, un utilisateur ne pourra choisir son login lors de son inscription. Dans ce cas, son adresse e-mail servira de login. Un administrateur pourra néanmoins modifier le login par ailleurs. + Si activé, un utilisateur ne pourra pas choisir son login lors de son inscription. Dans ce cas, son adresse e-mail servira de login. Un administrateur pourra néanmoins modifier le login par ailleurs. queries: apply_filter: Appliquer le filtre préconfiguré configure_view: @@ -5169,7 +5168,7 @@ fr: warning_registration_token_expired: | L’émail d’activation a expiré. Nous vous avons envoyé un nouveau lien à l'adresse %{email}. Merci de cliquer sur ce lien pour activer votre compte. warning_user_limit_reached: > - Adding additional users will exceed the current limit. Please contact an administrator to increase the user limit to ensure external users are able to access this instance. + L'ajout d'utilisateurs supplémentaires dépassera la limite actuelle. Veuillez contacter un administrateur pour augmenter la limite d'utilisateurs afin que les utilisateurs externes puissent accéder à cette instance. warning_user_limit_reached_admin: > L'ajout d'utilisateurs supplémentaires dépassera la limite actuelle. Veuillez mettre à niveau votre plan pour que les utilisateurs externes puissent accéder à cette instance. warning_user_limit_reached_instructions: > @@ -5317,7 +5316,7 @@ fr: dates: working: "%{date} est maintenant un jour ouvrable" non_working: "%{date} est maintenant un jour non ouvrable" - nothing_to_preview: "Rien à afficher en apperçu" + nothing_to_preview: "Rien à afficher en aperçu" api_v3: attributes: property: "Propriété" @@ -5393,7 +5392,7 @@ fr: #Common error messages invalid_request: unknown: "Il manque à la requête un paramètre requis, inclut une valeur de paramètre non supportée ou est malformée d'une autre manière." - missing_param: "Parramètre requis manquant : %{value}." + missing_param: "Paramètre requis manquant : %{value}." request_not_authorized: "La requête doit être autorisée. Le paramètre requis pour l'autorisation de la requête est manquant ou non valide." invalid_redirect_uri: "L'URI de redirection demandée est mal formée ou ne correspond pas à l'URI de redirection client." unauthorized_client: "Le client n'est pas autorisé à effectuer cette demande en utilisant cette méthode." diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index 2e8d93e7798..89aeefa2a19 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -3620,7 +3620,6 @@ he: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5120,7 +5119,7 @@ he: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "ברירת מחדל: UTF-8" text_destroy: "מחק" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index 23c8f31ab6e..2a9b5b2b93e 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -3506,7 +3506,6 @@ hi: label_float: "फ्लोट" label_folder: "Folder" label_follows: "फॉलो करें" - label_force_user_language_to_default: "डिफ़ॉल्ट करने के लिए एक गैर अनुमति भाषा वाले उपयोगकर्ताओं की भाषा सेट करें" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "गैंट चार्ट" @@ -5002,7 +5001,7 @@ hi: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "मिटाएँ" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index c8689bdef8b..0117ba4eea5 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -3564,7 +3564,6 @@ hr: label_float: "Plutajući" label_folder: "Mapa" label_follows: "slijedi" - label_force_user_language_to_default: "Postavi zadani jezik za korisnike koji imaju nedozvoljeni jezik kao zadani" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5062,7 +5061,7 @@ hr: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Zadana vrijednost: UTF-8" text_destroy: "Obriši" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Što želite uraditi?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index eab5b9e7a03..3a7c649c0d6 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -3507,7 +3507,6 @@ hu: label_float: "Mozgó" label_folder: "Mappa" label_follows: "követi ezt" - label_force_user_language_to_default: "Nyelv beállitása a felhasználóknak, amelyeknél nem az alapértelmezett nyelv az elfogadott" label_form_configuration: "Űrlap konfiguráció" label_formula: "Formula" label_gantt_chart: "Gantt-diagram" @@ -5002,7 +5001,7 @@ hu: text_default_administrator_account_changed: "Az alapértelmezett rendszergazdai fiók megváltozott" text_default_encoding: "Alapértelmezett érték: UTF-8" text_destroy: "Törlés" - text_destroy_with_associated: "További objektumok vannak hozzárendelve, a feladatcsoport(ok)hoz, amelyeket törölni kell. Ezek az objektumok a következők:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Mit szeretne tenni?" text_diff_truncated: "... Ez a különbség csonkolva lett, mert meghaladja a maximálisan megjeleníthető méretet." text_email_delivery_not_configured: "Email küldés nincs bekonfigurálva, és az értesítések ki vannak kapcsolva.\nÁllítsa be az SMTP szervert, hogy engedélyezze azokat." diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 4b9d4ae7fb6..addd422881c 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -3448,7 +3448,6 @@ id: label_float: "Float" label_folder: "Folder" label_follows: "Berikut" - label_force_user_language_to_default: "Set bahasa user ke default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Bagan Gantt" @@ -4939,7 +4938,7 @@ id: text_default_administrator_account_changed: "Akun administrator default terlah dirubah" text_default_encoding: "Default: UTF-8" text_destroy: "Hapus" - text_destroy_with_associated: "Ada tambahan objek terasosiasi dengan Work Package yang akan dihapus. Objek tersebut adalah Tipe :" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Apa yang ingin Anda lakukan?" text_diff_truncated: "... diff ini telah dipotong karena melebihi batas maks. yang dapat ditampilkan." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index ac619273602..ab1ba6f60f5 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -3505,7 +3505,6 @@ it: label_float: "Virgola mobile" label_folder: "Cartella" label_follows: "segue" - label_force_user_language_to_default: "Imposta la lingua degli utenti che non hanno una lingua consentita a quella predefinita" label_form_configuration: "Configurazione del modulo" label_formula: "Formula" label_gantt_chart: "Diagramma di Gantt" @@ -5001,7 +5000,7 @@ it: text_default_administrator_account_changed: "Account amministratore predefinito cambiato" text_default_encoding: "Predefinito: UTF-8" text_destroy: "Cancella" - text_destroy_with_associated: "Ci sono ulteriori oggetti associati con la/le macro-attività che devono essere eliminati. Tali oggetti sono dei seguenti tipi:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Cosa vuoi fare?" text_diff_truncated: "... Questo diff è stato troncato perché supera la dimensione massima che può essere visualizzata." text_email_delivery_not_configured: "Consegna email non configurata. Le notifiche sono state disabilitate.\nConfigura il tuo server SMTP per abilitarle." diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index bbe8eb7339a..7414c82e6aa 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -3451,7 +3451,6 @@ ja: label_float: "小数" label_folder: "フォルダ" label_follows: "次の項目に後続" - label_force_user_language_to_default: "ユーザーの言語設定が利用許可されていない場合、デフォルト言語を利用する" label_form_configuration: "フォーム設定" label_formula: "数式" label_gantt_chart: "ガントチャート" @@ -4945,7 +4944,7 @@ ja: text_default_administrator_account_changed: "管理者アカウントでデフォルト設定が変更済み" text_default_encoding: "既定値: UTF-8" text_destroy: "削除" - text_destroy_with_associated: "削除されるワークパッケージと追加の対象物が関連付けています。それらの対象物は次の種類です:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "どれかを選択して下さい。" text_diff_truncated: "... 差分の行数が表示可能な上限を超えました。超過分は表示しません。" text_email_delivery_not_configured: "メール配信が設定されておらず、通知が無効になっています。\nSMTPサーバーを有効にしてください。" diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml index 2ea958a21f7..517a25d0bda 100644 --- a/config/locales/crowdin/js-fr.yml +++ b/config/locales/crowdin/js-fr.yml @@ -460,7 +460,7 @@ fr: label_children_derived_duration: "Durée dérivée des enfants du lot de travaux" label_warning: "Attention" label_work_package: "Lot de travaux" - label_work_package_parent: "Lot de Travaux parent" + label_work_package_parent: "Lot de travaux parent" label_work_package_plural: "Lots de Travaux" label_watch: "Suivre" label_watch_work_package: "Suivre le lot de travaux" diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index bc9d9ff0235..022a82ed619 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -3508,7 +3508,6 @@ ka: label_float: "მცურავი" label_folder: "საქაღალდე" label_follows: "მიჰყვება" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "განტის დიაგრამა" @@ -5004,7 +5003,7 @@ ka: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "ნაგულისხმევი: UTF-8" text_destroy: "წაშლა" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index 1a46a94f747..262f5e88981 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -3508,7 +3508,6 @@ kk: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5004,7 +5003,7 @@ kk: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Delete" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index e6df4e64be5..59ff9e346ae 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -3452,7 +3452,6 @@ ko: label_float: "부동" label_folder: "폴더" label_follows: "팔로우" - label_force_user_language_to_default: "허용되지 않는 언어가 있는 사용자의 언어를 기본값으로 설정" label_form_configuration: "양식 구성" label_formula: "공식" label_gantt_chart: "Gantt 차트" @@ -4943,7 +4942,7 @@ ko: text_default_administrator_account_changed: "기본 관리자 계정 변경됨" text_default_encoding: "기본: UTF-8" text_destroy: "삭제" - text_destroy_with_associated: "삭제할 작업 패키지와 연결된 추가 개체가 있습니다. 이러한 개체의 유형은 다음과 같습니다." + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "어떤 작업을 수행하시겠습니까?" text_diff_truncated: "... 이 차이점은 표시할 수 있는 최대 크기를 초과하므로 잘렸습니다." text_email_delivery_not_configured: "이메일 배달이 구성되지 않았고, 알림이 비활성화되었습니다.\nSMTP 서버를 구성하여 활성화하세요." diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index f8e15e171d3..b9bbe962f6f 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -3617,7 +3617,6 @@ lt: label_float: "Skaičius su kableliu" label_folder: "Aplankas" label_follows: "seka" - label_force_user_language_to_default: "Nustatyti numatytąją kalbą vartotojams, kurie nurodo, sistemoje nežinomą kalbą" label_form_configuration: "Formos konfigūracija" label_formula: "Formula" label_gantt_chart: "Ganto grafikas" @@ -5114,7 +5113,7 @@ lt: text_default_administrator_account_changed: "Administratoriaus numatytoji paskyra pakeista" text_default_encoding: "Numatytasis: UTF-8" text_destroy: "Ištrinti" - text_destroy_with_associated: "Yra papildomų objektų, kurie susieti su darbų paketu(-ais), kurie ketinami ištrinti.\nTie objektai yra šių tipų:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Ką norite daryti?" text_diff_truncated: "... Šis diff'as sutrauktas, nes viršija maksimalų rodomų eilučių skaičių." text_email_delivery_not_configured: "El. laiškų pristatymas yra nesukonfigūruotas, dėl to pranešimai yra išjungti.\nSukonfigūruokite prisijungimą prie SMTP serverio pranešimų įjungimui." diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index ce49a22b934..742ae10b659 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -3564,7 +3564,6 @@ lv: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5062,7 +5061,7 @@ lv: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Dzēst" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index 7732a72cbb8..4b1d3b930fc 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -3508,7 +3508,6 @@ mn: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5004,7 +5003,7 @@ mn: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Delete" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index b74881f5fa1..fe6a15eff60 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -3450,7 +3450,6 @@ ms: label_float: "Terapung" label_folder: "Folder" label_follows: "ikuti" - label_force_user_language_to_default: "Tetapkan bahasa pengguna yang mempunyai bahasa yang tidak dibenarkan kepada default" label_form_configuration: "Konfigurasi borang" label_formula: "Formula" label_gantt_chart: "Carta Gantt" @@ -4943,7 +4942,7 @@ ms: text_default_administrator_account_changed: "Akaun default pentadbir diubah" text_default_encoding: "Default: UTF-8" text_destroy: "Padam" - text_destroy_with_associated: "Terdapat objek tambahan yang berkaitan dengan pakej kerja yang perlu dipadam. Objek tersebut adalah daripada jenis berikut:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Apakah yang anda ingin lakukan?" text_diff_truncated: "... Perbezaan ini dipendekkan kerana ia melebihi saiz maksimum yang boleh dipaparkan." text_email_delivery_not_configured: "Penghantaran e-mel belum dikonfigurasi, dan pemberitahuan telah dinyahaktifkan.\nKonfigurasikan server SMTP anda untuk mengaktifkannya." diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index ce21a17a695..7c283c326d1 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -3508,7 +3508,6 @@ ne: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5004,7 +5003,7 @@ ne: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Delete" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index 983bf1a930a..5a744a714d0 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -3504,7 +3504,6 @@ nl: label_float: "Zwevend" label_folder: "Map" label_follows: "volgt" - label_force_user_language_to_default: "Taal van gebruikers met een niet toegestane taal op standaard instellen" label_form_configuration: "Formulierconfiguratie" label_formula: "Formula" label_gantt_chart: "Gantt-grafiek" @@ -4999,7 +4998,7 @@ nl: text_default_administrator_account_changed: "Standaard beheerdersaccount gewijzigd" text_default_encoding: "Standaardinstelling: UTF-8" text_destroy: "Verwijderen" - text_destroy_with_associated: "Er zijn extra objecten gerelateerd aan het/de te verwijderen werkpakket(ten). Deze objecten zijn van de soorten:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Wat wilt u doen?" text_diff_truncated: "... deze diff is truncated vanwege dat de maximale grote is overschreden om te tonen." text_email_delivery_not_configured: "E-mailbezorging is niet geconfigureerd, en meldingen zijn uitgeschakeld.\nConfigureer uw SMTP-server om deze in te schakelen." diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index 8b0a94fcee7..ad1b7b6a948 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -3507,7 +3507,6 @@ label_float: "Flyt" label_folder: "Mappe" label_follows: "følger" - label_force_user_language_to_default: "Sett språk for brukere som har et ikke-tillatt språk som standard" label_form_configuration: "Skjema konfigurering" label_formula: "Formula" label_gantt_chart: "Gantt diagram" @@ -5003,7 +5002,7 @@ text_default_administrator_account_changed: "Standard administratorkonto er endret" text_default_encoding: "Standard: UTF-8" text_destroy: "Slett" - text_destroy_with_associated: "Det er andre objekter tilknyttet arbeidspakken(e) som er i ferd med å bli slettet. Disse objektene er av følgende typer:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Hva vil du gjøre?" text_diff_truncated: "... Denne diff ble forkortet fordi den overstiger maksimalgrensen for hva som kan vises." text_email_delivery_not_configured: "E-postlevering er ikke konfigurert, og varsler er deaktivert.\nKonfigurer SMTP-serveren for å aktivere dem." diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index d1181150809..5ca2853a0a3 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -3616,7 +3616,6 @@ pl: label_float: "Liczba rzeczywista" label_folder: "Katalog" label_follows: "Następujący" - label_force_user_language_to_default: "Ustaw język domyślny dla użytkowników o innych ustawieniach językowych niż dozwolone" label_form_configuration: "Konfiguracja formularza" label_formula: "Wzór" label_gantt_chart: "Wykres Gantta" @@ -5113,7 +5112,7 @@ pl: text_default_administrator_account_changed: "Domyślne konto administratora zostało zmienione" text_default_encoding: "Domyślnie: UTF-8" text_destroy: "Usuń" - text_destroy_with_associated: "Istnieją dodatkowe obiekty powiązane z pakietami roboczymi, które będą usunięte. Te obiekty są następujących typów:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Co chcesz zrobić?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Dostarczanie poczty elektronicznej nie jest skonfigurowane, a powiadomienia są wyłączone.\nSkonfiguruj swój serwer SMTP, aby je włączyć." diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 62c4bdd4543..8dfa7b6e774 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -3505,7 +3505,6 @@ pt-BR: label_float: "Ponto flutuante" label_folder: "Pasta" label_follows: "Segue" - label_force_user_language_to_default: "Configurar o idioma de usuário que tem uma linguagem não permitida como padrão" label_form_configuration: "Configuração do formulário" label_formula: "Fórmula" label_gantt_chart: "Gráfico de Gantt" @@ -5000,7 +4999,7 @@ pt-BR: text_default_administrator_account_changed: "Conta do administrador padrão alterada" text_default_encoding: "Padrão: UTF-8" text_destroy: "Excluir" - text_destroy_with_associated: "Existem objetos adicionais associados com o pacote de trabalho que serão excluídos. Esses objetos são dos seguintes tipos:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "O que você quer fazer?" text_diff_truncated: "... Este diff foi truncado porque excede o tamanho máximo que pode ser exibido." text_email_delivery_not_configured: "O envio de e-mails não está configurado e as notificações estão desativadas.\nConfigure seu servidor de SMTP para ativá-los." diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index dd18e40a3bb..6db30f9d61e 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -3505,7 +3505,6 @@ pt-PT: label_float: "Float" label_folder: "Pasta" label_follows: "segue" - label_force_user_language_to_default: "Idioma de utilizadores definida com uma linguagem não permitida como padrão" label_form_configuration: "Configuração do formulário" label_formula: "Fórmula" label_gantt_chart: "Gráfico de Gantt" @@ -4998,7 +4997,7 @@ pt-PT: text_default_administrator_account_changed: "Conta padrão de administrador alterada" text_default_encoding: "Padrão: UTF-8" text_destroy: "Eliminar" - text_destroy_with_associated: "Existem objetos adicionais associados com o pacote de trabalho que está a ser apagado. Esses objetos são dos seguintes tipos:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "O que deseja fazer?" text_diff_truncated: "... Este diff foi truncado porque excede o tamanho máximo que pode ser mostrado." text_email_delivery_not_configured: "A entrega de emails não está configurada e as notificações estão desativadas.\nConfigure o seu servidor de SMTP para ativar." diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index 5f317d1404a..512e8a058a1 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -3564,7 +3564,6 @@ ro: label_float: "Număr real" label_folder: "Dosar" label_follows: "urmează după" - label_force_user_language_to_default: "Setare limbă pentru utilizatorii care au o limbă implicită nepermisă" label_form_configuration: "Configurare formular" label_formula: "Formulă" label_gantt_chart: "Grafic Gantt" @@ -5061,7 +5060,7 @@ ro: text_default_administrator_account_changed: "Contul de administrator implicit a fost schimbat" text_default_encoding: "Implicit: UTF-8" text_destroy: "Șterge" - text_destroy_with_associated: "Există obiecte suplimentare asociate cu pachetul(ele) de lucru care urmează să fie șters(e). Aceste obiecte sunt de următoarele tipuri:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Ce vrei să faci?" text_diff_truncated: "... Acest diff a fost trunchiat deoarece depășește dimensiunea maximă care poate fi afișată." text_email_delivery_not_configured: "Livrarea e-mailurilor nu este configurată, iar notificările sunt dezactivate.\nConfigurați serverul SMTP pentru a le activa." diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index eb11c6168c7..b70d87e57da 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -3618,7 +3618,6 @@ ru: label_float: "Плавающий" label_folder: "Папка" label_follows: "Следует" - label_force_user_language_to_default: "Язык, который пользователям нельзя установить как действующий по-умолчанию" label_form_configuration: "Настройка форм" label_formula: "Формула" label_gantt_chart: "Диаграмма Ганта" @@ -5115,7 +5114,7 @@ ru: text_default_administrator_account_changed: "Первоначальная учетная запись администратора была изменена" text_default_encoding: "По-умолчанию: UTF-8" text_destroy: "Удалить" - text_destroy_with_associated: "Есть дополнительные объекты, ассоцированные с пакетом(-ами) работ, которые должны быть удалены. Это объекты следующих типов:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Что Вы хотите сделать?" text_diff_truncated: "... Этот разностность(diff) была усечена, так как она превышает максимальный размер, которые может быть отображен." text_email_delivery_not_configured: "Доставка электронной почты не настроена, уведомления отключены.\nНастройте SMTP-сервер, чтобы включить их." diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index e5fcaaad407..ecb919b661e 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -3508,7 +3508,6 @@ rw: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5004,7 +5003,7 @@ rw: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Delete" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index e1d9e202f79..09ef29f2b19 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -3508,7 +3508,6 @@ si: label_float: "පාවෙන" label_folder: "ෆෝල්ඩරය" label_follows: "පහත සඳහන්" - label_force_user_language_to_default: "පෙරනිමියට අවසර නොලත් භාෂාවක් ඇති පරිශීලකයින්ගේ භාෂාව සකසන්න" label_form_configuration: "ආකෘති වින්යාසය" label_formula: "Formula" label_gantt_chart: "ගැන්ට් සටහන" @@ -5004,7 +5003,7 @@ si: text_default_administrator_account_changed: "පෙරනිමි පරිපාලක ගිණුම වෙනස්" text_default_encoding: "පෙරනිමි: UTF-8" text_destroy: "මකන්න" - text_destroy_with_associated: "මකා දැමිය යුතු වැඩ පැකේජය (ය) සමඟ එකතු වී ඇති අතිරේක වස්තු තිබේ. එම වස්තූන් පහත සඳහන් වර්ග වලින් සමන්විත වේ:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "ඔබට කුමක් කිරීමට අවශ්යද?" text_diff_truncated: "... එය ප්රදර්ශනය කළ හැකි උපරිම ප්රමාණය ඉක්මවා යන නිසා මෙම diff ටන්ක කරන ලදී." text_email_delivery_not_configured: "විද්යුත් තැපැල් බෙදා හැරීම වින්යාසගත කර නොමැති අතර දැනුම්දීම් අක්රීය කර ඇත.\nඒවා සක්රීය කිරීම සඳහා ඔබේ SMTP සේවාදායකය සකසන්න." diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index 7cb8d08011a..dc338883c85 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -3620,7 +3620,6 @@ sk: label_float: "Plávajúce (float)" label_folder: "Priečinok" label_follows: "nasleduje" - label_force_user_language_to_default: "Nastavenie jazyka užívateľov ktorí majú nastavený ako predvolený nepovolený jazyk" label_form_configuration: "Konfigurácia formulára" label_formula: "Formula" label_gantt_chart: "Ganttov diagram" @@ -5119,7 +5118,7 @@ sk: text_default_administrator_account_changed: "Predvolené nastavenie administrátorského účtu bolo zmenené" text_default_encoding: "Predvolené: UTF-8" text_destroy: "Odstrániť" - text_destroy_with_associated: "Existujú ďalšie objekty spojené s pracovným balíčkom(-ami), ktoré sa majú vymazať. Tieto objekty sú z týchto typov:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Čo chcete urobiť?" text_diff_truncated: "... Tento výpis rozdielov bol skrátený, pretože prekračuje maximálny počet riadkov, ktorý môže byť zobrazený." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 807fba89de2..8f239b9d875 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -3619,7 +3619,6 @@ sl: label_float: "Lebdeti" label_folder: "Mapa" label_follows: "Sledi" - label_force_user_language_to_default: "Nastavite jezik uporabnikov ki nimajo dovoljenja privzetega jezika" label_form_configuration: "Konfiguracija obrazca" label_formula: "Formula" label_gantt_chart: "Gantogram" @@ -5118,7 +5117,7 @@ sl: text_default_administrator_account_changed: "Spremenjen privzeti administratorski račun" text_default_encoding: "Privzeto: UTF-8" text_destroy: "Izbriši" - text_destroy_with_associated: "Obstajajo dodatni objekti, povezani z delovnim paketom, ki jih je treba izbrisati. Ti predmeti so naslednje vrste:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Kaj želite storiti?" text_diff_truncated: "... Ta sprememba je bila odsekana ker presega največjo velikost ki je lahko prikazana." text_email_delivery_not_configured: "Dostava e-pošte ni konfigurirana in obvestila so onemogočena.\nKonfigurirajte strežnik SMTP, da jih omogočite." diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index ff9d62669ac..a52464d9e72 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -3564,7 +3564,6 @@ sr: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5062,7 +5061,7 @@ sr: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Delete" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index 6a7558f1ce1..1a3d5dc84ba 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -3508,7 +3508,6 @@ sv: label_float: "Flyttal" label_folder: "Mapp" label_follows: "följer" - label_force_user_language_to_default: "Välj standardspråk för användare som har ett icke tillåtet språk" label_form_configuration: "Ställ in formulär" label_formula: "Formel" label_gantt_chart: "Gantt-schema" @@ -5002,7 +5001,7 @@ sv: text_default_administrator_account_changed: "Standardadministratörskontot har ändrats" text_default_encoding: "Standard: UTF-8" text_destroy: "Ta bort" - text_destroy_with_associated: "Det finns ytterligare objekt kopplade med det/de arbetspaket som ska tas bort. Dessa objekt är av följande typer:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Vad vill du göra?" text_diff_truncated: "... Denna diff trunkerades eftersom den överskrider den maximala storleken som kan visas." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index 2527f20db26..535eac05f6f 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -3452,7 +3452,6 @@ th: label_float: "ลอย" label_folder: "Folder" label_follows: "ดังต่อไปนี้" - label_force_user_language_to_default: "พบภาษาที่ไม่อนุญาตให้ใช้เป็นค่าเริ่มต้น ในชุดภาษาของผู้ใช้" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -4946,7 +4945,7 @@ th: text_default_administrator_account_changed: "มีการเปลี่ยนค่าตั้งต้นของผู้ดูแลระบบ" text_default_encoding: "ค่าเริ่มต้น: UTF-8" text_destroy: "ลบ" - text_destroy_with_associated: "มีการลบออบเจคต์ที่เกี่ยวข้องกับชุดภารกิจ ซึ่งเป็นประเภทดังต่อไปนี้:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "คุณต้องการจะทำอะไร ?" text_diff_truncated: "... มีการตัดผลต่างเนื่องจากมีความยาวเกินกว่าที่สามารถแสดงผลได้" text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 5f29be85947..c6761262148 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -3508,7 +3508,6 @@ tr: label_float: "Ondalık" label_folder: "Klasör" label_follows: "takip eder" - label_force_user_language_to_default: "Varsayılan olmayan izin verildi bir dil olan kullanıcı dilini ayarlama" label_form_configuration: "Formu yapılandırma" label_formula: "Formül" label_gantt_chart: "Gantt görünümü" @@ -5002,7 +5001,7 @@ tr: text_default_administrator_account_changed: "Varsayılan yönetici hesabı değişti" text_default_encoding: "Varsayılan: UTF-8" text_destroy: "Sil" - text_destroy_with_associated: "Silinecek iş paketleri ile birlikte ek nesne(ler) vardır. Bu nesneler aşağıdaki türdedir:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Ne yapmak istiyorsun?" text_diff_truncated: "... Bu fark, görüntülenebilecek maksimum boyutu aştığı için kesildi." text_email_delivery_not_configured: "E-posta teslimi yapılandırılmamış ve bildirimler devre dışı bırakılmış.\nSMTP sunucunuzu etkinleştirmek için yapılandırın." diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index bcfec3ccb22..7d12970b337 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -3614,7 +3614,6 @@ uk: label_float: "З плаваючою крапкою" label_folder: "Папка" label_follows: "слідкувати" - label_force_user_language_to_default: "Встановити мову користувачів, які мають не підтримувану мову, за умовчанням" label_form_configuration: "Конфігурація форми" label_formula: "Формула" label_gantt_chart: "Діаграма Ґанта" @@ -5112,7 +5111,7 @@ uk: text_default_administrator_account_changed: "Обліковий запис адміністратора за замовчуванням змінений" text_default_encoding: "По замовчуванню: UTF-8" text_destroy: "Видалити" - text_destroy_with_associated: "Існують додаткові об'єкти, асоційовані з робочими пакетами, які потрібно видалити. Ці об'єкти мають наступні типи:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Що ти хочеш зробити?" text_diff_truncated: "... Це порівняння (diff) було скорочене, оскільки воно перевищує максимальний розмір, який можна відобразити." text_email_delivery_not_configured: "Доставку електронної пошти не налаштовано, і сповіщення вимкнуто.\nНалаштуйте свій SMTP-сервер, щоб увімкнути їх." diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index 4e21c5c4fdc..5575b1d2fb7 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -3508,7 +3508,6 @@ uz: label_float: "Float" label_folder: "Folder" label_follows: "follows" - label_force_user_language_to_default: "Set language of users having a non allowed language to default" label_form_configuration: "Form configuration" label_formula: "Formula" label_gantt_chart: "Gantt chart" @@ -5004,7 +5003,7 @@ uz: text_default_administrator_account_changed: "Default administrator account changed" text_default_encoding: "Default: UTF-8" text_destroy: "Delete" - text_destroy_with_associated: "There are additional objects assossociated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "What do you want to do?" text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index 23a945d5fea..75379ddbdde 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -3450,7 +3450,6 @@ vi: label_float: "Số thực" label_folder: "Thư mục" label_follows: "theo dõi" - label_force_user_language_to_default: "Có một ngôn ngữ không được cho phép để mặc định trong thiết lập ngôn ngữ cho người sử dụng" label_form_configuration: "Mẫu cấu hình" label_formula: "Công thức" label_gantt_chart: "Biểu đồ Gantt" @@ -4944,7 +4943,7 @@ vi: text_default_administrator_account_changed: "Tài khoản quản trị viên mặc định đã thay đổi" text_default_encoding: "Mặc định: UTF-8" text_destroy: "xóa" - text_destroy_with_associated: "Có các đối tượng bổ sung liên quan đến (các) gói công việc sẽ bị xóa. Các đối tượng đó có các loại sau:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "Bạn muốn làm gì?" text_diff_truncated: "... Sự khác biệt này đã bị cắt bớt vì nó vượt quá kích thước tối đa có thể được hiển thị." text_email_delivery_not_configured: "Gửi email không được cấu hình và thông báo bị vô hiệu hóa.\nCấu hình máy chủ SMTP của bạn để kích hoạt chúng." diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index cf6a1ace99f..cc72c176bdc 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -3448,7 +3448,6 @@ zh-CN: label_float: "浮点数" label_folder: "文件夹" label_follows: "跟踪" - label_force_user_language_to_default: "设置拥有非允许语言的用户的默认语言" label_form_configuration: "表格配置" label_formula: "公式" label_gantt_chart: "甘特图" @@ -4937,7 +4936,7 @@ zh-CN: text_default_administrator_account_changed: "更改默认管理员帐户" text_default_encoding: "默认值: UTF-8" text_destroy: "删除" - text_destroy_with_associated: "有额外的对象关联到要删除的工作包。这些对象是以下类型:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "你想做什么?" text_diff_truncated: "...这个比较被截断,因为它超出了可显示的最大大小。" text_email_delivery_not_configured: "电子邮件传送未配置,通知已禁用。\n配置您的 SMTP 服务器将其启用。" diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 5940a10d524..48607e23be6 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -3448,7 +3448,6 @@ zh-TW: label_float: "浮點數" label_folder: "資料夾" label_follows: "關注" - label_force_user_language_to_default: "設置使用者使用預設語言" label_form_configuration: "表單設置" label_formula: "公式" label_gantt_chart: "甘特圖" @@ -4940,7 +4939,7 @@ zh-TW: text_default_administrator_account_changed: "預設管理者帳號已更改" text_default_encoding: "預設值: UTF-8" text_destroy: "删除" - text_destroy_with_associated: "欲刪除的工作套件還關聯有其他物件,這些物件類型如下:" + text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" text_destroy_what_to_do: "您想要做什麼?" text_diff_truncated: "... 此差異被截斷, 因為它超出了可以顯示的最大大小。" text_email_delivery_not_configured: "電子郵件傳送未配置,通知已禁用。\n配置您的 SMTP 服務器將其啓用。" diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml index f8f6e8da8bb..8f5d854a324 100644 --- a/modules/backlogs/config/locales/crowdin/af.yml +++ b/modules/backlogs/config/locales/crowdin/af.yml @@ -56,6 +56,7 @@ af: any: "eenige" column_width: "Column width" definition_of_done: "Definisie van Gedoen" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Belemmering" label_versions_default_fold_state: "Wys weergawe gevou" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/ar.yml b/modules/backlogs/config/locales/crowdin/ar.yml index 56be1c41c56..1de0218f19a 100644 --- a/modules/backlogs/config/locales/crowdin/ar.yml +++ b/modules/backlogs/config/locales/crowdin/ar.yml @@ -56,6 +56,7 @@ ar: any: "أي" column_width: "Column width" definition_of_done: "تعريف ما تم" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "عائق" label_versions_default_fold_state: "إظهار الإصدارات مطوية" caption_versions_default_fold_state: "" diff --git a/modules/backlogs/config/locales/crowdin/az.yml b/modules/backlogs/config/locales/crowdin/az.yml index a616dc69c88..6e7aea2b54f 100644 --- a/modules/backlogs/config/locales/crowdin/az.yml +++ b/modules/backlogs/config/locales/crowdin/az.yml @@ -56,6 +56,7 @@ az: any: "any" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/be.yml b/modules/backlogs/config/locales/crowdin/be.yml index 472cde886d2..771b833a2dc 100644 --- a/modules/backlogs/config/locales/crowdin/be.yml +++ b/modules/backlogs/config/locales/crowdin/be.yml @@ -56,6 +56,7 @@ be: any: "любы" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/bg.yml b/modules/backlogs/config/locales/crowdin/bg.yml index de31fae2f5d..f653c939045 100644 --- a/modules/backlogs/config/locales/crowdin/bg.yml +++ b/modules/backlogs/config/locales/crowdin/bg.yml @@ -56,6 +56,7 @@ bg: any: "всяко" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Препядствие" label_versions_default_fold_state: "Показване на сгънати версиите " caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/ca.yml b/modules/backlogs/config/locales/crowdin/ca.yml index 3c544aa84ed..c7253773dba 100644 --- a/modules/backlogs/config/locales/crowdin/ca.yml +++ b/modules/backlogs/config/locales/crowdin/ca.yml @@ -56,6 +56,7 @@ ca: any: "qualsevol" column_width: "Column width" definition_of_done: "Definició de fet" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Mostra les versions contretes" caption_versions_default_fold_state: "Les versions no s'expandiran per defecte quan es visualitzin els registres enrere. Cada un ha d'ampliar-se manualment." diff --git a/modules/backlogs/config/locales/crowdin/ckb-IR.yml b/modules/backlogs/config/locales/crowdin/ckb-IR.yml index c3051591071..60450ebe853 100644 --- a/modules/backlogs/config/locales/crowdin/ckb-IR.yml +++ b/modules/backlogs/config/locales/crowdin/ckb-IR.yml @@ -56,6 +56,7 @@ ckb-IR: any: "any" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml index 5bec8d49ea3..de225baae06 100644 --- a/modules/backlogs/config/locales/crowdin/cs.yml +++ b/modules/backlogs/config/locales/crowdin/cs.yml @@ -56,6 +56,7 @@ cs: any: "jakákoliv" column_width: "Column width" definition_of_done: "Definice dokončena" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: " Verze zobrazit srolovaně" caption_versions_default_fold_state: "Verze se při prohlížení nevyřízených žádostí ve výchozím nastavení nerozbalují. Každou z nich je třeba rozbalit ručně." diff --git a/modules/backlogs/config/locales/crowdin/da.yml b/modules/backlogs/config/locales/crowdin/da.yml index 6672ec9c913..d29bad1355a 100644 --- a/modules/backlogs/config/locales/crowdin/da.yml +++ b/modules/backlogs/config/locales/crowdin/da.yml @@ -56,6 +56,7 @@ da: any: "alle" column_width: "Column width" definition_of_done: "Definition af Udført" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Hindring" label_versions_default_fold_state: "Vis versioner sammenfoldet" caption_versions_default_fold_state: "Versioner vil ikke blive udvidet som standard, når man ser på backlogs. Hver enkelt version skal udvides manuelt." diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 3ed70909dab..f2e91491024 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -56,6 +56,7 @@ de: any: "beliebig" column_width: "Spaltenbreite" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Hindernis" label_versions_default_fold_state: "Versionen eingeklappt anzeigen" caption_versions_default_fold_state: "Versionen werden beim Anzeigen des Backlogs standardmäßig nicht aufgeklappt. Sie müssen manuell geöffnet werden." diff --git a/modules/backlogs/config/locales/crowdin/el.yml b/modules/backlogs/config/locales/crowdin/el.yml index 7e3ecb7389b..0d1a7eac949 100644 --- a/modules/backlogs/config/locales/crowdin/el.yml +++ b/modules/backlogs/config/locales/crowdin/el.yml @@ -56,6 +56,7 @@ el: any: "οποιoδήποτε" column_width: "Column width" definition_of_done: "Ορισμός των Ολοκληρωμένων" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Εμπόδιο" label_versions_default_fold_state: "Εμφάνιση συμπτυγμένων εκδόσεων" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/eo.yml b/modules/backlogs/config/locales/crowdin/eo.yml index 02993d81e08..82f8ebbb1c3 100644 --- a/modules/backlogs/config/locales/crowdin/eo.yml +++ b/modules/backlogs/config/locales/crowdin/eo.yml @@ -56,6 +56,7 @@ eo: any: "ajna" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index 0eb631ca443..09b6a6aef4f 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -56,6 +56,7 @@ es: any: "cualquiera" column_width: "Ancho de columna" definition_of_done: "Criterio de Aceptación" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impedimento" label_versions_default_fold_state: "Mostrar versiones colapsadas" caption_versions_default_fold_state: "Las versiones no se expandirán por defecto al visualizar los trabajos pendientes. Cada una deberá expandirse manualmente." diff --git a/modules/backlogs/config/locales/crowdin/et.yml b/modules/backlogs/config/locales/crowdin/et.yml index 8699002c53c..7c7d3d3daa6 100644 --- a/modules/backlogs/config/locales/crowdin/et.yml +++ b/modules/backlogs/config/locales/crowdin/et.yml @@ -56,6 +56,7 @@ et: any: "any" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/eu.yml b/modules/backlogs/config/locales/crowdin/eu.yml index 5619b2d95e5..30e0af5f5cb 100644 --- a/modules/backlogs/config/locales/crowdin/eu.yml +++ b/modules/backlogs/config/locales/crowdin/eu.yml @@ -56,6 +56,7 @@ eu: any: "edozein" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/fa.yml b/modules/backlogs/config/locales/crowdin/fa.yml index 9b3097effa6..510a1c9685b 100644 --- a/modules/backlogs/config/locales/crowdin/fa.yml +++ b/modules/backlogs/config/locales/crowdin/fa.yml @@ -56,6 +56,7 @@ fa: any: "any" column_width: "عرض ستون" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "در هنگام مشاهده backlog ها، نسخه‌ها به صورت پیش‌فرض بازنخواهندشد. هر کدام باید به صورت دستی باز شوند." diff --git a/modules/backlogs/config/locales/crowdin/fi.yml b/modules/backlogs/config/locales/crowdin/fi.yml index 552964d1060..853ef47c81f 100644 --- a/modules/backlogs/config/locales/crowdin/fi.yml +++ b/modules/backlogs/config/locales/crowdin/fi.yml @@ -56,6 +56,7 @@ fi: any: "kaikki" column_width: "Column width" definition_of_done: "Valmiin määritelmä" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Este" label_versions_default_fold_state: "Näytä versiot ryhmiteltyinä" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/fil.yml b/modules/backlogs/config/locales/crowdin/fil.yml index ce0ac497154..eaa59519e54 100644 --- a/modules/backlogs/config/locales/crowdin/fil.yml +++ b/modules/backlogs/config/locales/crowdin/fil.yml @@ -56,6 +56,7 @@ fil: any: "any" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index 38bb8715cd3..eb04e9ebdb1 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -56,6 +56,7 @@ fr: any: "tout" column_width: "Largeur de colonne" definition_of_done: "Définition de Fait" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Obstacle" label_versions_default_fold_state: "Afficher les versions de manière repliée" caption_versions_default_fold_state: "Les versions ne seront pas développées par défaut lors de l'affichage des backlogs. Chacune devra être développée manuellement." diff --git a/modules/backlogs/config/locales/crowdin/he.yml b/modules/backlogs/config/locales/crowdin/he.yml index 25c02876e0e..31015e32fb7 100644 --- a/modules/backlogs/config/locales/crowdin/he.yml +++ b/modules/backlogs/config/locales/crowdin/he.yml @@ -56,6 +56,7 @@ he: any: "הכל" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/hi.yml b/modules/backlogs/config/locales/crowdin/hi.yml index a5ad913b84f..c4d105746f4 100644 --- a/modules/backlogs/config/locales/crowdin/hi.yml +++ b/modules/backlogs/config/locales/crowdin/hi.yml @@ -56,6 +56,7 @@ hi: any: "कोई" column_width: "Column width" definition_of_done: "पूर्ण की परिभाषा" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "बाधा" label_versions_default_fold_state: "मुड़े हुए संस्करण दिखाएं" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/hr.yml b/modules/backlogs/config/locales/crowdin/hr.yml index 025b3adcdb4..f4318fddb9e 100644 --- a/modules/backlogs/config/locales/crowdin/hr.yml +++ b/modules/backlogs/config/locales/crowdin/hr.yml @@ -56,6 +56,7 @@ hr: any: "bilo koji" column_width: "Column width" definition_of_done: "Definicija učinjenog" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Teškoće" label_versions_default_fold_state: "Prikaži prikupljene verzije" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/hu.yml b/modules/backlogs/config/locales/crowdin/hu.yml index 47f6f76d91e..2bbdd49a147 100644 --- a/modules/backlogs/config/locales/crowdin/hu.yml +++ b/modules/backlogs/config/locales/crowdin/hu.yml @@ -56,6 +56,7 @@ hu: any: "bármely" column_width: "Column width" definition_of_done: "A \"Kész\" meghatározása" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Akadály" label_versions_default_fold_state: "Összecsukott verziók mutatása" caption_versions_default_fold_state: "A verziók alapértelmezés szerint nem lesznek kibontva a várólista (backlog) megtekintésekor. Mindegyiket manuálisan kell kibontani." diff --git a/modules/backlogs/config/locales/crowdin/id.yml b/modules/backlogs/config/locales/crowdin/id.yml index f2ee1742832..2f03ef740e4 100644 --- a/modules/backlogs/config/locales/crowdin/id.yml +++ b/modules/backlogs/config/locales/crowdin/id.yml @@ -56,6 +56,7 @@ id: any: "apapun" column_width: "Column width" definition_of_done: "Definisi Selesai" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Halangan" label_versions_default_fold_state: "Tampilkan versi terlipat" caption_versions_default_fold_state: "Versi tidak akan diperluas secara default saat melihat daftar tugas yang tertunda. Setiap versi harus diperluas secara manual." diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml index c9d01481205..92bda374c47 100644 --- a/modules/backlogs/config/locales/crowdin/it.yml +++ b/modules/backlogs/config/locales/crowdin/it.yml @@ -56,6 +56,7 @@ it: any: "qualsiasi" column_width: "Larghezza della colonna" definition_of_done: "Definizione di fatto" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impedimento" label_versions_default_fold_state: "Espandi le versioni" caption_versions_default_fold_state: "Le versioni non verranno espanse per impostazione predefinita durante la visualizzazione dei backlog. Ogni versione deve essere espansa manualmente." diff --git a/modules/backlogs/config/locales/crowdin/ja.yml b/modules/backlogs/config/locales/crowdin/ja.yml index ed63a9f9f33..4eb545ca810 100644 --- a/modules/backlogs/config/locales/crowdin/ja.yml +++ b/modules/backlogs/config/locales/crowdin/ja.yml @@ -56,6 +56,7 @@ ja: any: "全て" column_width: "Column width" definition_of_done: "「終了」の定義" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "障害事項" label_versions_default_fold_state: "バージョンを折り畳んで表示" caption_versions_default_fold_state: "バックログを表示する場合、デフォルトではバージョンは展開されません。各バージョンは手動で展開する必要があります。" diff --git a/modules/backlogs/config/locales/crowdin/ka.yml b/modules/backlogs/config/locales/crowdin/ka.yml index 8b3f18a203e..800f0ec5014 100644 --- a/modules/backlogs/config/locales/crowdin/ka.yml +++ b/modules/backlogs/config/locales/crowdin/ka.yml @@ -56,6 +56,7 @@ ka: any: "ნებისმიერი" column_width: "Column width" definition_of_done: "დასრულების აღწერა" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "წინააღმდეგობა" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/kk.yml b/modules/backlogs/config/locales/crowdin/kk.yml index 11946d9011a..8a82b88509c 100644 --- a/modules/backlogs/config/locales/crowdin/kk.yml +++ b/modules/backlogs/config/locales/crowdin/kk.yml @@ -56,6 +56,7 @@ kk: any: "any" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index 9dd153b792a..4b2ee8833fb 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -56,6 +56,7 @@ ko: any: "모두" column_width: "열 너비" definition_of_done: "완료 정의" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "제한" label_versions_default_fold_state: "접힌 버전 표시" caption_versions_default_fold_state: "백로그를 볼 때 버전은 기본적으로 확장되지 않습니다. 각 버전을 수동으로 확장해야 합니다." diff --git a/modules/backlogs/config/locales/crowdin/lt.yml b/modules/backlogs/config/locales/crowdin/lt.yml index 11960b470eb..af7ad730f97 100644 --- a/modules/backlogs/config/locales/crowdin/lt.yml +++ b/modules/backlogs/config/locales/crowdin/lt.yml @@ -56,6 +56,7 @@ lt: any: "bet koks" column_width: "Column width" definition_of_done: "Pabaigimo apibrėžimas" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Kliūtis" label_versions_default_fold_state: "Rodyti suskleistas versijas" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/lv.yml b/modules/backlogs/config/locales/crowdin/lv.yml index eee7672958f..c4ae62c40ed 100644 --- a/modules/backlogs/config/locales/crowdin/lv.yml +++ b/modules/backlogs/config/locales/crowdin/lv.yml @@ -56,6 +56,7 @@ lv: any: "visi" column_width: "Column width" definition_of_done: "Pabeigtības definīcija" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Šķēršļi" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/mn.yml b/modules/backlogs/config/locales/crowdin/mn.yml index 272e06455e7..4b9ae429fe0 100644 --- a/modules/backlogs/config/locales/crowdin/mn.yml +++ b/modules/backlogs/config/locales/crowdin/mn.yml @@ -56,6 +56,7 @@ mn: any: "ямар ч" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/ms.yml b/modules/backlogs/config/locales/crowdin/ms.yml index 96c39f6c261..d93c45c1701 100644 --- a/modules/backlogs/config/locales/crowdin/ms.yml +++ b/modules/backlogs/config/locales/crowdin/ms.yml @@ -56,6 +56,7 @@ ms: any: "sebarang" column_width: "Column width" definition_of_done: "Definisi Selesai" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Halangan" label_versions_default_fold_state: "Paparkan versi dilipat" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/ne.yml b/modules/backlogs/config/locales/crowdin/ne.yml index b0f93c354ff..6e6a574c935 100644 --- a/modules/backlogs/config/locales/crowdin/ne.yml +++ b/modules/backlogs/config/locales/crowdin/ne.yml @@ -56,6 +56,7 @@ ne: any: "any" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml index 441ca57beb9..0fbb1ed4317 100644 --- a/modules/backlogs/config/locales/crowdin/nl.yml +++ b/modules/backlogs/config/locales/crowdin/nl.yml @@ -56,6 +56,7 @@ nl: any: "elke" column_width: "Column width" definition_of_done: "Definitie van Klaar" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Belemmering" label_versions_default_fold_state: "Laat versies samengevouwen zien" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index 73a3c716987..feb3aa9b1be 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -56,6 +56,7 @@ any: "hvilken som helst" column_width: "Column width" definition_of_done: "Definisjon av ferdig" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Hinder" label_versions_default_fold_state: "Vis versjoner kollapset" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index 53a5179b879..a389daa6760 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -56,6 +56,7 @@ pl: any: "którekolwiek" column_width: "Szerokość kolumny" definition_of_done: "Definicja Zrobione" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Przeszkoda" label_versions_default_fold_state: "Pokaż zwinięte wersje" caption_versions_default_fold_state: "Wersje nie będą domyślnie rozwijane podczas przeglądania backlogów. Każdą z nich należy rozwinąć ręcznie." diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index 2c509d53765..55fdce0fae2 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -56,6 +56,7 @@ pt-BR: any: "qualquer" column_width: "Largura da coluna" definition_of_done: "Definição de pronto" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impedimento" label_versions_default_fold_state: "Mostrar versões em modo fechado" caption_versions_default_fold_state: "As versões não serão expandidas por padrão ao visualizar backlogs. Cada uma deve ser expandida manualmente." diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml index a6489bac640..4f37f5ce94d 100644 --- a/modules/backlogs/config/locales/crowdin/pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml @@ -56,6 +56,7 @@ pt-PT: any: "qualquer" column_width: "Largura da coluna" definition_of_done: "Definição de feito" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impedimento" label_versions_default_fold_state: "Mostrar versões dobradas" caption_versions_default_fold_state: "Versões não serão expandidas por predefinição quando visualizar os backlogs. Cada uma tem de ser expandida manualmente." diff --git a/modules/backlogs/config/locales/crowdin/ro.yml b/modules/backlogs/config/locales/crowdin/ro.yml index 32ca7c8f9dc..22597abf6e8 100644 --- a/modules/backlogs/config/locales/crowdin/ro.yml +++ b/modules/backlogs/config/locales/crowdin/ro.yml @@ -56,6 +56,7 @@ ro: any: "Oricare" column_width: "Column width" definition_of_done: "Procent realizat" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Afișare versiuni complete" caption_versions_default_fold_state: "Versiunile nu vor fi extinse în mod implicit la vizualizarea restanțelor. Fiecare versiune trebuie să fie extinsă manual." diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index 51c16f00aa0..01134c1718d 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -56,6 +56,7 @@ ru: any: "любой" column_width: "Ширина столбца" definition_of_done: "Определение термина \"Завершено\"" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Препятствие" label_versions_default_fold_state: "Показать свернутые версии" caption_versions_default_fold_state: "Версии не будут разворачиваться по умолчанию при просмотре бэклогов. Каждая версия должна быть развернута вручную." diff --git a/modules/backlogs/config/locales/crowdin/rw.yml b/modules/backlogs/config/locales/crowdin/rw.yml index 84977e8f10f..c2dbd4ef227 100644 --- a/modules/backlogs/config/locales/crowdin/rw.yml +++ b/modules/backlogs/config/locales/crowdin/rw.yml @@ -56,6 +56,7 @@ rw: any: "any" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/si.yml b/modules/backlogs/config/locales/crowdin/si.yml index af720b892d4..4af952f455c 100644 --- a/modules/backlogs/config/locales/crowdin/si.yml +++ b/modules/backlogs/config/locales/crowdin/si.yml @@ -56,6 +56,7 @@ si: any: "ඔනෑම" column_width: "Column width" definition_of_done: "සිදු කරන ලද අර්ථ දැක්වීම" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "බාධාවන්" label_versions_default_fold_state: "නවනු අනුවාද පෙන්වන්න" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/sk.yml b/modules/backlogs/config/locales/crowdin/sk.yml index 9cbf4ebee8b..5e384c812fd 100644 --- a/modules/backlogs/config/locales/crowdin/sk.yml +++ b/modules/backlogs/config/locales/crowdin/sk.yml @@ -56,6 +56,7 @@ sk: any: "akékoľvek" column_width: "Šírka stĺpca" definition_of_done: "Definícia pojmu Hotovo" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Prekážka" label_versions_default_fold_state: "Zobrazenie zložených verzií" caption_versions_default_fold_state: "Verzie sa pri prezeraní nevybavených dokumentov nebudú predvolene rozbaľovať. Každú z nich je potrebné rozbaliť manuálne." diff --git a/modules/backlogs/config/locales/crowdin/sl.yml b/modules/backlogs/config/locales/crowdin/sl.yml index 012cd93ea8e..953cff09d89 100644 --- a/modules/backlogs/config/locales/crowdin/sl.yml +++ b/modules/backlogs/config/locales/crowdin/sl.yml @@ -56,6 +56,7 @@ sl: any: "katerikoli" column_width: "Column width" definition_of_done: "Opredelitev opravljenega" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Ovira" label_versions_default_fold_state: "Pokaži različice zložene" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/sr.yml b/modules/backlogs/config/locales/crowdin/sr.yml index be7866c9dd0..dc9391b8e13 100644 --- a/modules/backlogs/config/locales/crowdin/sr.yml +++ b/modules/backlogs/config/locales/crowdin/sr.yml @@ -56,6 +56,7 @@ sr: any: "bilo koji" column_width: "Column width" definition_of_done: "Definicija završetka" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Smetnja" label_versions_default_fold_state: "Prikaži verzije skupljene" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/sv.yml b/modules/backlogs/config/locales/crowdin/sv.yml index f0c7feab075..afef125bbc1 100644 --- a/modules/backlogs/config/locales/crowdin/sv.yml +++ b/modules/backlogs/config/locales/crowdin/sv.yml @@ -56,6 +56,7 @@ sv: any: "någon" column_width: "Column width" definition_of_done: "Definition av klart" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Hinder" label_versions_default_fold_state: "Visa ihopfällda versioner" caption_versions_default_fold_state: "Versioner kommer inte att utökas som standard när du visar backloggar. Var och en måste utökas manuellt." diff --git a/modules/backlogs/config/locales/crowdin/th.yml b/modules/backlogs/config/locales/crowdin/th.yml index 4b8ca25454a..e8c928d448f 100644 --- a/modules/backlogs/config/locales/crowdin/th.yml +++ b/modules/backlogs/config/locales/crowdin/th.yml @@ -56,6 +56,7 @@ th: any: "ทั้งหมด" column_width: "ความกว้างของคอลัมน์" definition_of_done: "นิยามของคำว่าเสร็จสิ้น" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "รายการอุปสรรค" label_versions_default_fold_state: "แสดงเวอร์ชันที่พับอยู่" caption_versions_default_fold_state: "เวอร์ชันจะถูกพับไว้เป็นค่าเริ่มต้น กรุณาคลิกเพื่อขยายดูทีละรายการ" diff --git a/modules/backlogs/config/locales/crowdin/tr.yml b/modules/backlogs/config/locales/crowdin/tr.yml index d05622f4299..d0e5ff7103a 100644 --- a/modules/backlogs/config/locales/crowdin/tr.yml +++ b/modules/backlogs/config/locales/crowdin/tr.yml @@ -56,6 +56,7 @@ tr: any: "herhangi bir" column_width: "Sütun genişliği" definition_of_done: "Bitti Tanımı" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Engel" label_versions_default_fold_state: "Katlanmış sürümleri göster" caption_versions_default_fold_state: "Birikmiş işler görüntülenirken sürümler öntanımlı olarak genişletilmeyecektir. Her birinin ayrı ayrı genişletilmesi gerekir." diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml index 2962742c3c8..395ef98c388 100644 --- a/modules/backlogs/config/locales/crowdin/uk.yml +++ b/modules/backlogs/config/locales/crowdin/uk.yml @@ -56,6 +56,7 @@ uk: any: "будь-який" column_width: "Ширина стовпця" definition_of_done: "Визначення завершено" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Перешкода" label_versions_default_fold_state: "Показати складені версії" caption_versions_default_fold_state: "Версії не розгортатимуться за замовчуванням при перегляді невиконаних завдань. Кожну версію потрібно розгортати вручну." diff --git a/modules/backlogs/config/locales/crowdin/uz.yml b/modules/backlogs/config/locales/crowdin/uz.yml index bbe87465454..90ca537e08a 100644 --- a/modules/backlogs/config/locales/crowdin/uz.yml +++ b/modules/backlogs/config/locales/crowdin/uz.yml @@ -56,6 +56,7 @@ uz: any: "any" column_width: "Column width" definition_of_done: "Definition of Done" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/locales/crowdin/vi.yml b/modules/backlogs/config/locales/crowdin/vi.yml index 27dbb107171..55ee9ba1d3f 100644 --- a/modules/backlogs/config/locales/crowdin/vi.yml +++ b/modules/backlogs/config/locales/crowdin/vi.yml @@ -56,6 +56,7 @@ vi: any: "bất kỳ" column_width: "Column width" definition_of_done: "Định nghĩa về Hoàn thành" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "Trở ngại" label_versions_default_fold_state: "Hiển thị các phiên bản \n" caption_versions_default_fold_state: "Các phiên bản sẽ không được mở rộng theo mặc định khi xem hồ sơ tồn đọng. Mỗi cái phải được mở rộng bằng tay." diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index c09e747a66a..4e72f220e5c 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -56,6 +56,7 @@ zh-CN: any: "任一" column_width: "列宽" definition_of_done: "完成的定义" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "障碍" label_versions_default_fold_state: "显示已折叠的版本" caption_versions_default_fold_state: "查看积压工作时,默认情况下不会展开版本。每个版本都必须手动展开。" diff --git a/modules/backlogs/config/locales/crowdin/zh-TW.yml b/modules/backlogs/config/locales/crowdin/zh-TW.yml index b189f405e3d..f183a8b675f 100644 --- a/modules/backlogs/config/locales/crowdin/zh-TW.yml +++ b/modules/backlogs/config/locales/crowdin/zh-TW.yml @@ -56,6 +56,7 @@ zh-TW: any: "任何" column_width: "欄寬" definition_of_done: "定義" + definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." impediment: "阻礙" label_versions_default_fold_state: "顯示精簡版本" caption_versions_default_fold_state: "檢視待辦清單時,版本預設不會展開,需手動逐一展開。" diff --git a/modules/costs/config/locales/crowdin/fr.yml b/modules/costs/config/locales/crowdin/fr.yml index f02d2ee0037..74712cab846 100644 --- a/modules/costs/config/locales/crowdin/fr.yml +++ b/modules/costs/config/locales/crowdin/fr.yml @@ -26,14 +26,14 @@ fr: activerecord: attributes: cost_entry: - work_package: "Lot de Travaux" + work_package: "Lot de travaux" overridden_costs: "Coûts outrepassés" spent: "Consommé" spent_on: "Date" logged_by: "Saisi par" entity: Connecté(e) pour - entity_id: Connecté(e) pendant - entity_gid: Connecté(e) pendant + entity_id: Consigné pour + entity_gid: Consigné pour cost_type: unit: "Nom de l'unité" unit_plural: "Nom pluriel de l'unité" @@ -61,9 +61,9 @@ fr: start_time: Heure de début end_time: Heure de fin time: Heure  - entity: Connecté(e) pendant - entity_id: Connecté(e) pendant - entity_gid: Connecté(e) pendant + entity: Consigné pour + entity_id: Consigné pour + entity_gid: Consigné pour models: time_entry: one: "Saisie du temps" From 474324fb18873c59d09c539df7e0975a14ccf3cb Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Sun, 8 Mar 2026 03:45:06 -0300 Subject: [PATCH 243/334] Add out-of-hours CI failure reporting --- .../testing/handling-flaky-tests/README.md | 15 + script/github_pr_errors | 173 +------- script/report_out_of_hours_ci_failures | 372 ++++++++++++++++++ script/support/github_actions_failures.rb | 172 ++++++++ .../report_builder_spec.rb | 183 +++++++++ 5 files changed, 750 insertions(+), 165 deletions(-) create mode 100755 script/report_out_of_hours_ci_failures create mode 100644 script/support/github_actions_failures.rb create mode 100644 spec/scripts/out_of_hours_ci_failures/report_builder_spec.rb diff --git a/docs/development/testing/handling-flaky-tests/README.md b/docs/development/testing/handling-flaky-tests/README.md index fe23041249b..437d36cdf01 100644 --- a/docs/development/testing/handling-flaky-tests/README.md +++ b/docs/development/testing/handling-flaky-tests/README.md @@ -21,6 +21,10 @@ Developers notice a failing spec in CI runs related to the PR they are working o The failing spec is suspicious as it seems unrelated to the changes introduced by the commits. +Out-of-hours correlation is a lead, not proof of a datetime bug. Evening or weekend failures can still be caused by +ordinary flakiness, branch-specific regressions, or infrastructure issues. Start by separating build/setup failures from +actual `Unit tests` or `Feature tests`, then look for recurring spec names before concluding that time-sensitive logic is involved. + To get the failing spec names, use `script/github_pr_errors` and give it the URL of the failing run as argument, for example: ```bash @@ -29,6 +33,17 @@ script/github_pr_errors https://github.com/opf/openproject/actions/runs/18215876 There are options to display images or display advice to reproduce the failures. Use `--help` to know more. +To aggregate recent `Test suite` failures and highlight specs that skew outside 09:00-18:00 Europe/Berlin Monday to Friday, +use: + +```bash +export GITHUB_USERNAME=... +export GITHUB_TOKEN=... +script/report_out_of_hours_ci_failures --days 30 +``` + +The report focuses on `dev` and `release/*` runs by default and excludes failures that never reached the unit or feature test steps. + ## Confirming the spec is flaky To confirm the flakiness of the spec, either: diff --git a/script/github_pr_errors b/script/github_pr_errors index 82f9abc693d..1c662b7c62b 100755 --- a/script/github_pr_errors +++ b/script/github_pr_errors @@ -17,6 +17,8 @@ require "yaml" require "httpx" require "cgi" +require_relative "support/github_actions_failures" + GITHUB_API_OPENPROJECT_PREFIX = "https://api.github.com/repos/opf/openproject" GITHUB_HTML_OPENPROJECT_PREFIX = "https://github.com/opf/openproject" RAILS_ROOT = Pathname.new(__dir__).dirname @@ -337,170 +339,6 @@ Report = Data.define( end end -class Error - attr_accessor :location, :page_html, :page_screenshot, :tests_group, :loading_error -end - -# rubocop:disable Layout/LineLength -# Looks like this in the job log: -# Process 28: TEST_ENV_NUMBER=28 RUBYOPT=-I/usr/local/bundle/bundler/gems/turbo_tests-3148ae6c3482/lib -r/usr/local/bundle/gems/bundler-2.5.23/lib/bundler/setup -W0 RSPEC_SILENCE_FILTER_ANNOUNCEMENTS=1 /usr/local/bundle/gems/bundler-2.5.23/exe/bundle exec rspec --seed 52674 --format TurboTests::JsonRowsFormatter --out tmp/test-pipes/subprocess-28 --format ParallelTests::RSpec::RuntimeLogger --out spec/support/turbo_runtime_features.log spec/features/api_docs/index_spec.rb spec/features/custom_fields/reorder_options_spec.rb spec/features/projects/projects_portfolio_spec.rb spec/features/projects/template_spec.rb spec/features/versions/edit_spec.rb spec/features/work_packages/details/markdown/description_editor_spec.rb spec/features/work_packages/table/hierarchy/hierarchy_parent_below_spec.rb spec/features/work_packages/table/inline_create/inline_create_refresh_spec.rb spec/features/work_packages/table/invalid_query_spec.rb spec/features/work_packages/tabs/activity_revisions_spec.rb -# rubocop:enable Layout/LineLength -class TestsGroup - attr_accessor :test_env_number, :seed, :files - - def initialize - @files = [] - end - - def include_error?(error) - return false if error.location.nil? - - files.any? { |file| error.location.include?(file) } - end - - def inspect - "#<#{self.class} @test_env_number=#{test_env_number} @seed=#{seed} (#{files.count} files)>" - end -end - -class JobErrorsFinder - SPEC_FAILURES_PATTERN = %r{^\S+ rspec (\S+) #.+$} - SPEC_LOADING_ERRORS_PATTERN = %r{^\S+ An error occurred while loading (\S+)\.\r?$} - SCREENSHOT_PATTERN = /\{"message":"Screenshot captured for failed feature test"[^\n]+$/ - TESTS_GROUP_PATTERN = /Process \d+: TEST_ENV_NUMBER=\d+ [^\n]+$/ - BRANCH_MERGE_PATTERN = /Merge \w{40} into (\w{40})$/ - - attr_reader :failures_explanation, :merge_branch_sha - - def self.scan_logs(report, logs) - finder = new - logs.each do |log| - finder.scan_log(log) - end - report.with( - errors: finder.errors, - failures_explanation: finder.failures_explanation, - merge_branch_sha: finder.merge_branch_sha - ) - end - - def scan_log(log) - find_failures(log) - find_failures_explanation(log) - find_loading_errors(log) - find_screenshots(log) - find_tests_groups(log) - find_merge_branch_info(log) - end - - def errors - @errors.values - end - - protected - - def initialize - @errors = {} - end - - def create_error(location) - return if location.nil? - - error = Error.new - error.location = location - @errors[location] ||= error - end - - def with_matching_error(location: nil, id: nil) - error = @errors[id] || @errors[location] - yield error if error && block_given? - error - end - - def find_failures(log) - log.scan(SPEC_FAILURES_PATTERN) - .flatten - .uniq - .sort - .each do |rerun_location| - create_error(rerun_location) - end - end - - def find_failures_explanation(log) - explanations = [] - log.split("\n").each do |line| - if line.end_with?("Failures:") .. line.end_with?("Failed examples:") - explanations << line - end - end - explanations.map! { it[29..] } # Remove leading timestamp (like "2024-02-05T08:37:54.5175930Z") - explanations.reject! do |line| - line == "Failures:" || - line == "Failed examples:" || - line.include?("gems/rspec-retry-") || - line.include?("gems/webmock-") - end - @failures_explanation = explanations.join("\n") - end - - def find_loading_errors(log) - log.scan(SPEC_LOADING_ERRORS_PATTERN) - .flatten - .uniq - .sort - .each do |location| - error = create_error(location) - error.loading_error = true - end - end - - def find_screenshots(log) - log.scan(SCREENSHOT_PATTERN) - .map { JSON.parse it } - .each do |screenshot_info| - id = screenshot_info["test_id"] - location = screenshot_info["test_location"] - with_matching_error(location:, id:) do |error| - error.page_html = screenshot_info["html"] - error.page_screenshot = screenshot_info["image"] - end - end - end - - def find_tests_groups(log) - tests_groups = log - .scan(TESTS_GROUP_PATTERN) - .flatten - .map { build_tests_group_from_command(it) } - - errors.each do |error| - error.tests_group = tests_groups.find { it.include_error?(error) } - end - end - - def find_merge_branch_info(log) - merge_branch_sha = log.scan(BRANCH_MERGE_PATTERN).flatten.first - @merge_branch_sha = merge_branch_sha if merge_branch_sha - end - - def build_tests_group_from_command(line) - tests_group = TestsGroup.new - parts = line.split - while parts.any? - case part = parts.shift - when /^TEST_ENV_NUMBER=/ - tests_group.test_env_number = part.delete_prefix("TEST_ENV_NUMBER=") - when "--seed" - tests_group.seed = parts.shift - when /_spec.rb$/ - tests_group.files << part - end - end - tests_group - end -end - class Formatter def initialize(compact: false) @compact = compact @@ -798,7 +636,12 @@ formatter = Formatter.new(compact: Options.compact) report = get_failed_jobs_logs(report, formatter) -report = JobErrorsFinder.scan_logs(report, report.failed_job_logs) +scan_result = GithubActionsFailures::JobErrorsFinder.scan_logs(report.failed_job_logs) +report = report.with( + errors: scan_result.errors, + failures_explanation: scan_result.failures_explanation, + merge_branch_sha: scan_result.merge_branch_sha +) case report.run_status when "completed" diff --git a/script/report_out_of_hours_ci_failures b/script/report_out_of_hours_ci_failures new file mode 100755 index 00000000000..07f1fe07c97 --- /dev/null +++ b/script/report_out_of_hours_ci_failures @@ -0,0 +1,372 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "rubygems" +require "bundler" +Bundler.setup(:default, :development) + +require "json" +require "optparse" +require "pathname" +require "time" +require "yaml" +require "httpx" +require "active_support/all" + +require_relative "support/github_actions_failures" + +GITHUB_API_OPENPROJECT_PREFIX = "https://api.github.com/repos/opf/openproject" +RAILS_ROOT = Pathname.new(__dir__).dirname +TEST_WORKFLOW_FILE = "test-core.yml" +PRIMARY_BRANCH_PATTERN = /\A(?:dev|release\/.+)\z/ +TEST_STEP_NAMES = ["Unit tests", "Feature tests"].freeze +DEFAULT_TIMEZONE = "Europe/Berlin" +DEFAULT_LOOKBACK_DAYS = 30 + +module OutOfHoursCiFailures + RunSummary = Data.define(:run_id, :run_number, :html_url, :head_branch, :event, :created_at, :failed_steps, :errors) + SpecSummary = Data.define( + :location, + :test_types, + :out_of_hours_count, + :in_hours_count, + :branches, + :first_seen_at, + :last_seen_at, + :out_of_hours_runs, + :in_hours_runs, + :classification + ) + + class Options + DEFAULTS = { + days: DEFAULT_LOOKBACK_DAYS, + include_pr_runs: false, + json: false, + timezone: DEFAULT_TIMEZONE, + workflow: TEST_WORKFLOW_FILE + }.freeze + + class << self + # rubocop:disable Metrics/AbcSize + def parse!(argv) + options = DEFAULTS.dup + + OptionParser.new do |parser| + parser.banner = "Usage: script/report_out_of_hours_ci_failures [options]" + + parser.on("--days DAYS", Integer, "Look back this many days (default: #{DEFAULT_LOOKBACK_DAYS})") do |value| + options[:days] = value + end + + parser.on("--include-pr-runs", "Include pull_request runs in the report") do + options[:include_pr_runs] = true + end + + parser.on("--json", "Output JSON instead of a table") do + options[:json] = true + end + + parser.on( + "--timezone NAME", + "Timezone for the in-hours/out-of-hours classification (default: #{DEFAULT_TIMEZONE})" + ) do |value| + options[:timezone] = value + end + + parser.on("--workflow FILE", "Workflow file name to inspect (default: #{TEST_WORKFLOW_FILE})") do |value| + options[:workflow] = value + end + + parser.on("-h", "--help", "Print this help") do + puts parser + exit + end + end.parse!(argv) + + options + end + # rubocop:enable Metrics/AbcSize + end + end + + class GithubClient + def initialize(cache_dir:) + @cache_dir = cache_dir + end + + def workflow_runs(workflow_file:, page:) + get_json("actions/workflows/#{workflow_file}/runs?status=completed&per_page=100&page=#{page}") + end + + def jobs(run_id) + get_json("actions/runs/#{run_id}/jobs") + end + + def log(job_id) + cached("job_#{job_id}.log") do + get_http("actions/jobs/#{job_id}/logs") + end + end + + private + + def http + @http ||= HTTPX + .plugin(:follow_redirects) + .plugin(:basic_auth) + .basic_auth(ENV.fetch("GITHUB_USERNAME"), ENV.fetch("GITHUB_TOKEN")) + end + + def github_url(path) + path.start_with?("http") ? path : "#{GITHUB_API_OPENPROJECT_PREFIX}/#{path}" + end + + def get_http(path) + response = http.get(github_url(path)) + response.raise_for_status + response.to_s + end + + def get_json(path) + JSON.parse(get_http(path)) + rescue HTTPX::HTTPError => e + body = e.response.json + raise "#{body['message']} (see #{body['documentation_url']})" + end + + def cached(name) + path = @cache_dir.join(name) + return path.read if path.file? + + content = yield + path.dirname.mkpath + path.write(content) + content + end + end + + class ReportBuilder + def initialize(options:, client:) + @options = options + @client = client + @timezone = ActiveSupport::TimeZone[options[:timezone]] || raise("Unknown timezone #{options[:timezone]}") + @since = Time.current - options[:days].days + end + + # rubocop:disable Metrics/AbcSize + def build + spec_runs = Hash.new { |hash, key| hash[key] = [] } + + each_relevant_run do |workflow_run, failed_jobs| + logs = failed_jobs.map { |job| @client.log(job.fetch("id")) } + scan_result = GithubActionsFailures::JobErrorsFinder.scan_logs(logs) + next if scan_result.errors.empty? + + failed_steps = failed_jobs.flat_map { failing_test_steps(it) }.uniq.sort + summary = RunSummary.new( + run_id: workflow_run.fetch("id"), + run_number: workflow_run.fetch("run_number"), + html_url: workflow_run.fetch("html_url"), + head_branch: workflow_run.fetch("head_branch"), + event: workflow_run.fetch("event"), + created_at: parse_time(workflow_run.fetch("created_at")), + failed_steps:, + errors: scan_result.errors.map(&:location).sort + ) + + summary.errors.each do |location| + spec_runs[location] << summary + end + end + + spec_runs + .sort_by { |location, _| location } + .map { |location, runs| summarize(location, runs) } + .sort_by { |summary| [-summary.out_of_hours_count, -summary.in_hours_count, summary.location] } + end + # rubocop:enable Metrics/AbcSize + + private + + # rubocop:disable Metrics/AbcSize + def each_relevant_run + page = 1 + done = false + + loop do + response = @client.workflow_runs(workflow_file: @options[:workflow], page:) + runs = response.fetch("workflow_runs") + break if runs.empty? + + runs.each do |workflow_run| + created_at = parse_time(workflow_run.fetch("created_at")) + if created_at < @since + done = true + break + end + + next unless include_run?(workflow_run) + + jobs = @client.jobs(workflow_run.fetch("id")).fetch("jobs") + failed_jobs = jobs.select { test_job_failure?(it) } + next if failed_jobs.empty? + + yield workflow_run, failed_jobs + end + + page += 1 + break if done + end + end + # rubocop:enable Metrics/AbcSize + + def include_run?(workflow_run) + branch = workflow_run.fetch("head_branch") + return false unless branch.match?(PRIMARY_BRANCH_PATTERN) || @options[:include_pr_runs] + return false if workflow_run.fetch("event") == "pull_request" && !@options[:include_pr_runs] + + true + end + + def test_job_failure?(job) + job.fetch("conclusion") == "failure" && failing_test_steps(job).any? + end + + def failing_test_steps(job) + job + .fetch("steps") + .filter_map { |step| step["name"] if step["conclusion"] == "failure" && TEST_STEP_NAMES.include?(step["name"]) } + end + + # rubocop:disable Metrics/AbcSize + def summarize(location, runs) + out_of_hours_runs, in_hours_runs = runs.partition { out_of_hours?(it.created_at) } + branches = runs.map(&:head_branch).uniq.sort + test_types = runs.flat_map(&:failed_steps).uniq.sort + + SpecSummary.new( + location:, + test_types:, + out_of_hours_count: out_of_hours_runs.count, + in_hours_count: in_hours_runs.count, + branches:, + first_seen_at: runs.min_by(&:created_at).created_at, + last_seen_at: runs.max_by(&:created_at).created_at, + out_of_hours_runs: out_of_hours_runs.map(&:html_url), + in_hours_runs: in_hours_runs.map(&:html_url), + classification: classify(out_of_hours_runs:, in_hours_runs:, branches:) + ) + end + # rubocop:enable Metrics/AbcSize + + def classify(out_of_hours_runs:, in_hours_runs:, branches:) + total = out_of_hours_runs.count + in_hours_runs.count + return "needs manual review" if total < 2 + return "likely regression" if branches.one? + return "likely datetime-sensitive" if in_hours_runs.empty? + + ratio = out_of_hours_runs.count.to_f / total + return "likely datetime-sensitive" if ratio >= 0.75 && branches.many? + + "likely generic flaky" + end + + def out_of_hours?(time) + local = time.in_time_zone(@timezone) + local.saturday? || local.sunday? || local.hour < 9 || local.hour >= 18 + end + + def parse_time(value) + Time.iso8601(value) + end + end + + class Formatter + def initialize(timezone:) + @timezone = timezone + end + + def print(spec_summaries, json: false) + json ? print_json(spec_summaries) : print_table(spec_summaries) + end + + private + + # rubocop:disable Metrics/AbcSize + def print_json(spec_summaries) + puts JSON.pretty_generate( + spec_summaries.map do |summary| + { + location: summary.location, + test_types: summary.test_types, + out_of_hours_count: summary.out_of_hours_count, + in_hours_count: summary.in_hours_count, + branches: summary.branches, + first_seen_at: summary.first_seen_at.in_time_zone(@timezone).iso8601, + last_seen_at: summary.last_seen_at.in_time_zone(@timezone).iso8601, + classification: summary.classification, + out_of_hours_runs: summary.out_of_hours_runs, + in_hours_runs: summary.in_hours_runs + } + end + ) + end + # rubocop:enable Metrics/AbcSize + + # rubocop:disable Metrics/AbcSize + def print_table(spec_summaries) + puts [ + "Classification".ljust(26), + "OOH".rjust(3), + "IN".rjust(3), + "Type".ljust(16), + "Branches".ljust(18), + "First seen".ljust(17), + "Last seen".ljust(17), + "Spec" + ].join(" ") + + spec_summaries.each do |summary| + puts [ + summary.classification.ljust(26), + summary.out_of_hours_count.to_s.rjust(3), + summary.in_hours_count.to_s.rjust(3), + summary.test_types.join(",").ljust(16), + truncate(summary.branches.join(","), 18).ljust(18), + summary.first_seen_at.in_time_zone(@timezone).strftime("%F %H:%M"), + summary.last_seen_at.in_time_zone(@timezone).strftime("%F %H:%M"), + summary.location + ].join(" ") + end + end + # rubocop:enable Metrics/AbcSize + + def truncate(value, length) + return value if value.length <= length + + "#{value[0, length - 3]}..." + end + end +end + +if $PROGRAM_NAME == __FILE__ + if !ENV["GITHUB_USERNAME"] + raise "Missing GITHUB_USERNAME env" + elsif !ENV["GITHUB_TOKEN"] + raise "Missing GITHUB_TOKEN env, go to https://github.com/settings/tokens and create one with 'repo' access" + end + + # workaround an openssl 3.6.0 issue + # https://github.com/ruby/openssl/issues/949#issuecomment-3367944960 + s = OpenSSL::X509::Store.new.tap(&:set_default_paths) + OpenSSL::SSL::SSLContext.send(:remove_const, :DEFAULT_CERT_STORE) rescue nil # rubocop:disable Style/RescueModifier + OpenSSL::SSL::SSLContext.const_set(:DEFAULT_CERT_STORE, s.freeze) + + options = OutOfHoursCiFailures::Options.parse!(ARGV) + client = OutOfHoursCiFailures::GithubClient.new(cache_dir: RAILS_ROOT.join("tmp/report_out_of_hours_ci_failures")) + builder = OutOfHoursCiFailures::ReportBuilder.new(options:, client:) + formatter = OutOfHoursCiFailures::Formatter.new(timezone: options[:timezone]) + + formatter.print(builder.build, json: options[:json]) +end diff --git a/script/support/github_actions_failures.rb b/script/support/github_actions_failures.rb new file mode 100644 index 00000000000..f6407a3be6f --- /dev/null +++ b/script/support/github_actions_failures.rb @@ -0,0 +1,172 @@ +# frozen_string_literal: true + +require "json" + +module GithubActionsFailures + Result = Data.define(:errors, :failures_explanation, :merge_branch_sha) + + class Error + attr_accessor :location, :page_html, :page_screenshot, :tests_group, :loading_error + end + + class TestsGroup + attr_accessor :test_env_number, :seed, :files + + def initialize + @files = [] + end + + def include_error?(error) + return false if error.location.nil? + + files.any? { |file| error.location.include?(file) } + end + + def inspect + "#<#{self.class} @test_env_number=#{test_env_number} @seed=#{seed} (#{files.count} files)>" + end + end + + class JobErrorsFinder + SPEC_FAILURES_PATTERN = %r{^\S+ rspec (\S+) #.+$} + SPEC_LOADING_ERRORS_PATTERN = %r{^\S+ An error occurred while loading (\S+)\.\r?$} + SCREENSHOT_PATTERN = /\{"message":"Screenshot captured for failed feature test"[^\n]+$/ + # Looks like this in the job log: + # rubocop:disable Layout/LineLength + # Process 28: TEST_ENV_NUMBER=28 RUBYOPT=-I/usr/local/bundle/bundler/gems/turbo_tests-3148ae6c3482/lib -r/usr/local/bundle/gems/bundler-2.5.23/lib/bundler/setup -W0 RSPEC_SILENCE_FILTER_ANNOUNCEMENTS=1 /usr/local/bundle/gems/bundler-2.5.23/exe/bundle exec rspec --seed 52674 --format TurboTests::JsonRowsFormatter --out tmp/test-pipes/subprocess-28 --format ParallelTests::RSpec::RuntimeLogger --out spec/support/turbo_runtime_features.log spec/features/api_docs/index_spec.rb spec/features/custom_fields/reorder_options_spec.rb spec/features/projects/projects_portfolio_spec.rb spec/features/projects/template_spec.rb spec/features/versions/edit_spec.rb spec/features/work_packages/details/markdown/description_editor_spec.rb spec/features/work_packages/table/hierarchy/hierarchy_parent_below_spec.rb spec/features/work_packages/table/inline_create/inline_create_refresh_spec.rb spec/features/work_packages/table/invalid_query_spec.rb spec/features/work_packages/tabs/activity_revisions_spec.rb + # rubocop:enable Layout/LineLength + TESTS_GROUP_PATTERN = /Process \d+: TEST_ENV_NUMBER=\d+ [^\n]+$/ + BRANCH_MERGE_PATTERN = /Merge \w{40} into (\w{40})$/ + + def self.scan_logs(logs) + finder = new + logs.each do |log| + finder.scan_log(log) + end + + Result.new( + errors: finder.errors, + failures_explanation: finder.failures_explanation, + merge_branch_sha: finder.merge_branch_sha + ) + end + + attr_reader :failures_explanation, :merge_branch_sha + + def scan_log(log) + find_failures(log) + find_failures_explanation(log) + find_loading_errors(log) + find_screenshots(log) + find_tests_groups(log) + find_merge_branch_info(log) + end + + def errors + @errors.values + end + + private + + def initialize + @errors = {} + end + + def create_error(location) + return if location.nil? + + error = Error.new + error.location = location + @errors[location] ||= error + end + + def with_matching_error(location: nil, id: nil) + error = @errors[id] || @errors[location] + yield error if error && block_given? + error + end + + def find_failures(log) + log.scan(SPEC_FAILURES_PATTERN) + .flatten + .uniq + .sort + .each do |rerun_location| + create_error(rerun_location) + end + end + + def find_failures_explanation(log) + explanations = [] + log.split("\n").each do |line| + if line.end_with?("Failures:") .. line.end_with?("Failed examples:") + explanations << line + end + end + explanations.map! { it[29..] } # Remove leading GitHub Actions log timestamp (e.g. "2024-02-05T08:37:54.5175930Z ") + explanations.reject! do |line| + line == "Failures:" || + line == "Failed examples:" || + line.include?("gems/rspec-retry-") || + line.include?("gems/webmock-") + end + @failures_explanation = explanations.join("\n") + end + + def find_loading_errors(log) + log.scan(SPEC_LOADING_ERRORS_PATTERN) + .flatten + .uniq + .sort + .each do |location| + error = create_error(location) + error.loading_error = true + end + end + + def find_screenshots(log) + log.scan(SCREENSHOT_PATTERN) + .map { JSON.parse(it) } + .each do |screenshot_info| + id = screenshot_info["test_id"] + location = screenshot_info["test_location"] + with_matching_error(location:, id:) do |error| + error.page_html = screenshot_info["html"] + error.page_screenshot = screenshot_info["image"] + end + end + end + + def find_tests_groups(log) + tests_groups = log + .scan(TESTS_GROUP_PATTERN) + .flatten + .map { build_tests_group_from_command(it) } + + errors.each do |error| + error.tests_group = tests_groups.find { it.include_error?(error) } + end + end + + def find_merge_branch_info(log) + merge_branch_sha = log.scan(BRANCH_MERGE_PATTERN).flatten.first + @merge_branch_sha = merge_branch_sha if merge_branch_sha + end + + def build_tests_group_from_command(line) + tests_group = TestsGroup.new + parts = line.split + while parts.any? + case part = parts.shift + when /^TEST_ENV_NUMBER=/ + tests_group.test_env_number = part.delete_prefix("TEST_ENV_NUMBER=") + when "--seed" + tests_group.seed = parts.shift + when /_spec.rb$/ + tests_group.files << part + end + end + tests_group + end + end +end diff --git a/spec/scripts/out_of_hours_ci_failures/report_builder_spec.rb b/spec/scripts/out_of_hours_ci_failures/report_builder_spec.rb new file mode 100644 index 00000000000..6c08091558c --- /dev/null +++ b/spec/scripts/out_of_hours_ci_failures/report_builder_spec.rb @@ -0,0 +1,183 @@ +# frozen_string_literal: true + +require "spec_helper" + +module OutOfHoursCiFailures +end + +load Rails.root.join("script/report_out_of_hours_ci_failures") + +RSpec.describe OutOfHoursCiFailures::ReportBuilder do + let(:options) do + { + days: 30, + include_pr_runs: false, + json: false, + timezone: "Europe/Berlin", + workflow: "test-core.yml" + } + end + + let(:client) { instance_spy(OutOfHoursCiFailures::GithubClient) } + let(:builder) { described_class.new(options:, client:) } + let(:run_id) { 1001 } + + before do + allow(Time).to receive(:current).and_return(Time.zone.parse("2026-03-08 12:00:00 UTC")) + end + + it "classifies boundary times using the configured timezone" do + stub_runs( + workflow(run_id:, created_at: "2026-03-03T07:59:00Z") + ) + stub_jobs(run_id => failed_jobs("Feature tests")) + stub_logs("spec/features/example_spec.rb:10") + + summary = builder.build.first + + expect(summary.out_of_hours_count).to eq(1) + expect(summary.in_hours_count).to eq(0) + end + + it "ignores build failures and keeps only unit and feature test failures" do + stub_runs( + workflow(run_id:, created_at: "2026-03-03T08:00:00Z"), + workflow(run_id: 1002, created_at: "2026-03-03T09:00:00Z") + ) + stub_jobs( + run_id => build_failure_jobs, + 1002 => failed_jobs("Unit tests") + ) + stub_logs("spec/models/example_spec.rb:12") + + summaries = builder.build + + expect(summaries.map(&:location)).to eq(["spec/models/example_spec.rb:12"]) + end + + it "classifies repeated out-of-hours failures on multiple branches as likely datetime-sensitive" do + stub_runs( + workflow(run_id:, branch: "dev", created_at: "2026-03-03T07:59:00Z"), + workflow( + run_id: 1002, + branch: "release/17.2", + created_at: "2026-03-04T18:00:00Z" + ) + ) + stub_jobs( + run_id => failed_jobs("Feature tests"), + 1002 => failed_jobs("Feature tests") + ) + stub_logs("spec/features/example_spec.rb:10") + + summary = builder.build.first + + expect(summary.classification).to eq("likely datetime-sensitive") + end + + it "classifies failures seen in and out of hours as likely generic flaky" do + stub_runs( + workflow(run_id:, branch: "dev", created_at: "2026-03-03T07:59:00Z"), + workflow( + run_id: 1002, + branch: "release/17.2", + created_at: "2026-03-04T10:00:00Z" + ) + ) + stub_jobs( + run_id => failed_jobs("Feature tests"), + 1002 => failed_jobs("Feature tests") + ) + stub_logs("spec/features/example_spec.rb:10") + + summary = builder.build.first + + expect(summary.classification).to eq("likely generic flaky") + end + + it "classifies repeated failures on a single branch as likely regression" do + stub_runs( + workflow( + run_id:, + created_at: "2026-03-03T07:59:00Z", + branch: "feature/foo", + event: "push" + ), + workflow( + run_id: 1002, + created_at: "2026-03-04T08:30:00Z", + branch: "feature/foo", + event: "push" + ) + ) + stub_jobs( + run_id => failed_jobs("Unit tests"), + 1002 => failed_jobs("Unit tests") + ) + stub_logs("spec/models/example_spec.rb:12") + + summaries = described_class.new(options: options.merge(include_pr_runs: true), client:).build + + expect(summaries.first.classification).to eq("likely regression") + end + + def stub_runs(*runs) + allow(client).to receive(:workflow_runs).and_return( + { "workflow_runs" => runs }, + { "workflow_runs" => [] } + ) + end + + def stub_jobs(jobs_by_run_id) + allow(client).to receive(:jobs) do |id| + jobs_by_run_id.fetch(id) + end + end + + def stub_logs(location) + allow(client).to receive(:log).and_return(job_log(location)) + end + + def workflow(run_id:, created_at:, branch: "dev", event: "push") + { + "id" => run_id, + "run_number" => run_id, + "html_url" => "https://github.com/opf/openproject/actions/runs/#{run_id}", + "head_branch" => branch, + "event" => event, + "created_at" => created_at + } + end + + def failed_jobs(step_name) + { + "jobs" => [ + { + "id" => 9001, + "conclusion" => "failure", + "steps" => [ + { "name" => step_name, "conclusion" => "failure" } + ] + } + ] + } + end + + def build_failure_jobs + { + "jobs" => [ + { + "id" => 9002, + "conclusion" => "failure", + "steps" => [ + { "name" => "Build", "conclusion" => "failure" } + ] + } + ] + } + end + + def job_log(location) + "2026-03-03T08:00:00.0000000Z rspec #{location} # example failure\n" + end +end From 801984e8b96e10a1f43645f533dce1c711e70ebc Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Sun, 8 Mar 2026 03:44:57 -0300 Subject: [PATCH 244/334] Stabilize time-sensitive feature specs Use shared_let for frozen feature spec times --- .../spec/features/meeting_backlogs_spec.rb | 12 ++++------ .../spec/features/meetings_index_spec.rb | 21 ++++++++++++------ .../spec/features/move_to_section_spec.rb | 4 ++++ .../recurring_meeting_create_spec.rb | 4 ++++ .../recurring_meeting_crud_spec.rb | 12 ++++------ .../recurring_meeting_global_crud_spec.rb | 12 ++++------ .../structured_meeting_update_flash_spec.rb | 12 ++++------ .../table/queries/filter_spec.rb | 22 ++++++++++++++----- .../column_type/schedule_spec.rb | 4 ++++ .../table_helpers/example_methods_spec.rb | 4 ++++ 10 files changed, 62 insertions(+), 45 deletions(-) diff --git a/modules/meeting/spec/features/meeting_backlogs_spec.rb b/modules/meeting/spec/features/meeting_backlogs_spec.rb index 88e22a76eea..be53398bb00 100644 --- a/modules/meeting/spec/features/meeting_backlogs_spec.rb +++ b/modules/meeting/spec/features/meeting_backlogs_spec.rb @@ -247,14 +247,6 @@ RSpec.describe "Meeting Backlogs", :js do end describe "for meeting series" do - before_all do - travel_to(Date.new(2024, 12, 1)) - end - - after(:all) do # rubocop:disable RSpec/BeforeAfterAll - travel_back - end - shared_let(:recurring_meeting) do create :recurring_meeting, project:, @@ -276,6 +268,10 @@ RSpec.describe "Meeting Backlogs", :js do RecurringMeetings::InitNextOccurrenceJob.perform_now(recurring_meeting, next_occurrence_time) end + after do + travel_back + end + describe "backlog visibility" do context "when the meeting is 'open'" do it "is expanded" do diff --git a/modules/meeting/spec/features/meetings_index_spec.rb b/modules/meeting/spec/features/meetings_index_spec.rb index fae6aaaa574..88c1b3d81a6 100644 --- a/modules/meeting/spec/features/meetings_index_spec.rb +++ b/modules/meeting/spec/features/meetings_index_spec.rb @@ -32,6 +32,12 @@ require "spec_helper" require_relative "../support/pages/meetings/index" RSpec.describe "Meetings", "Index", :js do + shared_let(:business_day_at_noon) { Time.zone.local(2025, 1, 8, 12, 0, 0) } + + after do + travel_back + end + # The order the Projects are created in is important. By naming `project` alphanumerically # after `other_project`, we can ensure that subsequent specs that assert sorting is # correct for the right reasons (sorting by Project name and not id) @@ -55,14 +61,14 @@ RSpec.describe "Meetings", "Index", :js do :author_participates, project:, title: "Awesome meeting today!", - start_time: Time.current) + start_time: business_day_at_noon - 5.minutes) end shared_let(:tomorrows_meeting) do create(:meeting, :author_participates, project:, title: "Awesome meeting tomorrow!", - start_time: 1.day.from_now, + start_time: business_day_at_noon + 1.day, duration: 2.0, location: "no-protocol.com") end @@ -71,7 +77,7 @@ RSpec.describe "Meetings", "Index", :js do :author_participates, project:, title: "Boring meeting without a location!", - start_time: 1.day.from_now, + start_time: business_day_at_noon + 1.day + 5.minutes, location: "") end shared_let(:meeting_with_malicious_location) do @@ -79,7 +85,7 @@ RSpec.describe "Meetings", "Index", :js do :author_participates, project:, title: "Sneaky meeting!", - start_time: 1.day.from_now, + start_time: business_day_at_noon + 1.day + 10.minutes, location: "") end shared_let(:yesterdays_meeting) do @@ -87,7 +93,7 @@ RSpec.describe "Meetings", "Index", :js do :author_participates, project:, title: "Awesome meeting yesterday!", - start_time: 1.day.ago) + start_time: business_day_at_noon - 1.day) end shared_let(:other_project_meeting) do @@ -95,7 +101,7 @@ RSpec.describe "Meetings", "Index", :js do :author_participates, project: other_project, title: "Awesome other project meeting!", - start_time: 2.days.from_now, + start_time: business_day_at_noon + 2.days, duration: 2.0, location: "not-a-url") end @@ -104,7 +110,7 @@ RSpec.describe "Meetings", "Index", :js do :author_participates, project:, title: "Awesome ongoing meeting!", - start_time: 30.minutes.ago) + start_time: business_day_at_noon - 30.minutes) end def setup_meeting_involvement @@ -120,6 +126,7 @@ RSpec.describe "Meetings", "Index", :js do end before do + travel_to(business_day_at_noon) login_as user end diff --git a/modules/meeting/spec/features/move_to_section_spec.rb b/modules/meeting/spec/features/move_to_section_spec.rb index df2317e5133..64690b0f88a 100644 --- a/modules/meeting/spec/features/move_to_section_spec.rb +++ b/modules/meeting/spec/features/move_to_section_spec.rb @@ -52,6 +52,10 @@ RSpec.describe "Move agenda items to section", :js do login_as current_user end + after do + travel_back + end + describe "for one-time meetings" do shared_let(:meeting) do create :meeting, diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb index 81287ee636c..e91d16f84e6 100644 --- a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb +++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb @@ -74,6 +74,10 @@ RSpec.describe "Recurring meetings creation", travel_to(Date.new(2024, 12, 1)) end + after do + travel_back + end + context "with a user with permissions" do it "can create a recurring meeting" do login_as current_user diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb index a95a70bc171..b91732cfafb 100644 --- a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb +++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb @@ -38,14 +38,6 @@ RSpec.describe "Recurring meetings CRUD", :js do include Components::Autocompleter::NgSelectAutocompleteHelpers - before_all do - travel_to(Date.new(2024, 12, 1)) - end - - after(:all) do # rubocop:disable RSpec/BeforeAfterAll - travel_back - end - shared_let(:project) { create(:project, enabled_module_names: %w[meetings]) } shared_let(:user) do create :user, @@ -85,6 +77,10 @@ RSpec.describe "Recurring meetings CRUD", RecurringMeetings::InitNextOccurrenceJob.perform_now(meeting, meeting.first_occurrence.to_time) end + after do + travel_back + end + it "can delete a recurring meeting from the show page and return to the index page" do show_page.visit! diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_global_crud_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_global_crud_spec.rb index 6f03deb0517..010ae29a69b 100644 --- a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_global_crud_spec.rb +++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_global_crud_spec.rb @@ -37,14 +37,6 @@ require_relative "../../support/pages/meetings/index" RSpec.describe "Recurring meetings global CRUD", :js do include Components::Autocompleter::NgSelectAutocompleteHelpers - before_all do - travel_to(Date.new(2024, 12, 1)) - end - - after(:all) do # rubocop:disable RSpec/BeforeAfterAll - travel_back - end - shared_let(:project) { create(:project, enabled_module_names: %w[meetings]) } shared_let(:user) do create :user, @@ -84,6 +76,10 @@ RSpec.describe "Recurring meetings global CRUD", :js do RecurringMeetings::InitNextOccurrenceJob.perform_now(meeting, meeting.first_occurrence.to_time) end + after do + travel_back + end + it "can delete a recurring meeting from the show page and return to the index page" do show_page.visit! diff --git a/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb b/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb index 5bb68fe2392..77eb0ccf0f8 100644 --- a/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb +++ b/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb @@ -193,14 +193,6 @@ RSpec.describe "Meetings CRUD", end context "for meeting series, across the same occurrence" do - before_all do - travel_to(Date.new(2024, 12, 1)) - end - - after(:all) do # rubocop:disable RSpec/BeforeAfterAll - travel_back - end - let(:recurring_meeting) do create :recurring_meeting, project:, @@ -222,6 +214,10 @@ RSpec.describe "Meetings CRUD", RecurringMeetings::InitNextOccurrenceJob.perform_now(recurring_meeting, first_occurrence_time) end + after do + travel_back + end + it_behaves_like "no flash appears when interacting with backlog in multiple windows" end diff --git a/spec/features/work_packages/table/queries/filter_spec.rb b/spec/features/work_packages/table/queries/filter_spec.rb index 5e70bdda107..0e4ab78b8fb 100644 --- a/spec/features/work_packages/table/queries/filter_spec.rb +++ b/spec/features/work_packages/table/queries/filter_spec.rb @@ -556,26 +556,36 @@ RSpec.describe "filter work packages", :js do end describe "datetime filters" do + shared_let(:business_day_at_noon) { Time.find_zone!("Europe/Kyiv").local(2025, 1, 8, 12, 0, 0) } + + before do + travel_to(business_day_at_noon) + end + + after do + travel_back + end + shared_let(:wp_updated_today) do create(:work_package, subject: "Created today", project:, - created_at: Time.current.change(hour: 12), - updated_at: Time.current.change(hour: 12)) + created_at: business_day_at_noon, + updated_at: business_day_at_noon) end shared_let(:wp_updated_3d_ago) do create(:work_package, subject: "Created 3d ago", project:, - created_at: 3.days.ago, - updated_at: 3.days.ago) + created_at: business_day_at_noon - 3.days, + updated_at: business_day_at_noon - 3.days) end shared_let(:wp_updated_5d_ago) do create(:work_package, subject: "Created 5d ago", project:, - created_at: 5.days.ago, - updated_at: 5.days.ago) + created_at: business_day_at_noon - 5.days, + updated_at: business_day_at_noon - 5.days) end it "filters on date by created_at (Regression #28459)" do diff --git a/spec/support_spec/table_helpers/column_type/schedule_spec.rb b/spec/support_spec/table_helpers/column_type/schedule_spec.rb index f377b7c6947..0d849151808 100644 --- a/spec/support_spec/table_helpers/column_type/schedule_spec.rb +++ b/spec/support_spec/table_helpers/column_type/schedule_spec.rb @@ -50,6 +50,10 @@ module TableHelpers::ColumnType travel_to(fake_today) end + after do + travel_back + end + describe "origin day" do it "is identified by the 'M' in 'MTWTFSS' in the header and corresponds to the next monday" do expect(parsed_attributes(<<~TABLE)) diff --git a/spec/support_spec/table_helpers/example_methods_spec.rb b/spec/support_spec/table_helpers/example_methods_spec.rb index 18f44454e40..b212d8aca97 100644 --- a/spec/support_spec/table_helpers/example_methods_spec.rb +++ b/spec/support_spec/table_helpers/example_methods_spec.rb @@ -45,6 +45,10 @@ module TableHelpers travel_to(fake_today) end + after do + travel_back + end + it "applies attribute changes to a group of work packages from a visual table representation" do main = build_stubbed(:work_package, subject: "main") second = build_stubbed(:work_package, subject: "second") From 0a32be066bfc512c132ed67a93fd76c459ae5524 Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Sun, 8 Mar 2026 04:33:30 -0300 Subject: [PATCH 245/334] Stabilize additional out-of-hours feature specs --- ...fication_center_date_alert_mention_spec.rb | 13 ++++++++---- .../notification_center_reminder_spec.rb | 18 +++++++++++------ .../table/queries/mobile_date_filter_spec.rb | 20 ++++++++++++------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/spec/features/notifications/notification_center/notification_center_date_alert_mention_spec.rb b/spec/features/notifications/notification_center/notification_center_date_alert_mention_spec.rb index 496eebf61b7..94dac8faead 100644 --- a/spec/features/notifications/notification_center/notification_center_date_alert_mention_spec.rb +++ b/spec/features/notifications/notification_center/notification_center_date_alert_mention_spec.rb @@ -12,9 +12,9 @@ RSpec.describe "Notification center date alert and mention", create(:user, member_with_permissions: { project => %w[view_work_packages] }) end - shared_let(:work_package) { create(:work_package, project:, due_date: 1.day.ago) } - - shared_let(:notification_mention) do + let(:reference_time) { Time.zone.local(2025, 1, 8, 12, 0, 0) } + let(:work_package) { create(:work_package, project:, due_date: 1.day.ago.to_date) } + let!(:notification_mention) do create(:notification, reason: :mentioned, recipient: user, @@ -22,7 +22,7 @@ RSpec.describe "Notification center date alert and mention", actor:) end - shared_let(:notification_date_alert) do + let!(:notification_date_alert) do create(:notification, reason: :date_alert_due_date, recipient: user, @@ -32,11 +32,16 @@ RSpec.describe "Notification center date alert and mention", let(:center) { Pages::Notifications::Center.new } before do + travel_to(reference_time) login_as user visit notifications_center_path wait_for_reload end + after do + travel_back + end + context "with date alerts ee", with_ee: %i[date_alerts] do it "shows only the date alert time, not the mentioned author" do center.within_item(notification_date_alert) do diff --git a/spec/features/notifications/notification_center/notification_center_reminder_spec.rb b/spec/features/notifications/notification_center/notification_center_reminder_spec.rb index f2d9ddb7abd..f7b0d877061 100644 --- a/spec/features/notifications/notification_center/notification_center_reminder_spec.rb +++ b/spec/features/notifications/notification_center/notification_center_reminder_spec.rb @@ -13,10 +13,11 @@ RSpec.describe "Notification center reminder, mention and date alert", create(:user, member_with_permissions: { project => %w[view_work_packages] }) end - shared_let(:work_package) { create(:work_package, project:, due_date: 1.day.ago) } - shared_let(:work_package2) { create(:work_package, project:) } + let(:reference_time) { Time.zone.local(2025, 1, 8, 12, 0, 0) } + let(:work_package) { create(:work_package, project:, due_date: 1.day.ago.to_date) } + let(:work_package2) { create(:work_package, project:) } - shared_let(:notification_mentions) do + let!(:notification_mentions) do [create(:notification, reason: :mentioned, recipient: user, @@ -29,29 +30,34 @@ RSpec.describe "Notification center reminder, mention and date alert", actor: actor)] end - shared_let(:notification_date_alert) do + let!(:notification_date_alert) do create(:notification, reason: :date_alert_due_date, recipient: user, resource: work_package) end - shared_let(:notification_reminder) do + let!(:notification_reminder) do create_reminder_notification_for(work_package: work_package, user: user) end - shared_let(:notification_reminder2) do + let!(:notification_reminder2) do create_reminder_notification_for(work_package: work_package2, user: user) end let(:center) { Pages::Notifications::Center.new } before do + travel_to(reference_time) login_as user visit notifications_center_path wait_for_reload end + after do + travel_back + end + context "with a reminder, mention and date alert" do it "shows the reminder alert within aggregation with date alert + reminder note" do center.within_item(notification_reminder) do diff --git a/spec/features/work_packages/table/queries/mobile_date_filter_spec.rb b/spec/features/work_packages/table/queries/mobile_date_filter_spec.rb index 9f09f6e18c2..7cf0cdabc96 100644 --- a/spec/features/work_packages/table/queries/mobile_date_filter_spec.rb +++ b/spec/features/work_packages/table/queries/mobile_date_filter_spec.rb @@ -36,17 +36,23 @@ RSpec.describe "mobile date filter work packages", :js do shared_let(:wp_table) { Pages::WorkPackagesTable.new(project) } shared_let(:wp_cards) { Pages::WorkPackageCards.new(project) } shared_let(:filters) { Components::WorkPackages::Filters.new } - shared_let(:work_package_with_due_date) { create(:work_package, project:, due_date: Date.current) } - shared_let(:work_package_without_due_date) { create(:work_package, project:, due_date: 5.days.from_now) } + shared_let(:business_day_at_noon) { Time.zone.local(2025, 1, 8, 12, 0, 0) } + shared_let(:work_package_with_due_date) { create(:work_package, project:, due_date: business_day_at_noon.to_date) } + shared_let(:work_package_without_due_date) { create(:work_package, project:, due_date: business_day_at_noon.to_date + 5.days) } current_user { user } include_context "with mobile screen size" before do + travel_to(business_day_at_noon) wp_table.visit! end + after do + travel_back + end + context "when filtering between finish date" do it "allows filtering, saving and retrieving and altering the saved filter" do filters.open @@ -59,9 +65,9 @@ RSpec.describe "mobile date filter work packages", :js do clear_input_field_contents(start_field) clear_input_field_contents(end_field) - start_field.set 1.day.ago.to_date + start_field.set business_day_at_noon.to_date - 1.day start_field.send_keys :tab - end_field.set Date.current + end_field.set business_day_at_noon.to_date end_field.send_keys :tab wait_for_reload @@ -76,7 +82,7 @@ RSpec.describe "mobile date filter work packages", :js do last_query = Query.last date_filter = last_query.filters.last - expect(date_filter.values).to eq [1.day.ago.to_date.iso8601, Date.current.iso8601] + expect(date_filter.values).to eq [(business_day_at_noon.to_date - 1.day).iso8601, business_day_at_noon.to_date.iso8601] end end @@ -90,7 +96,7 @@ RSpec.describe "mobile date filter work packages", :js do expect(date_field["type"]).to eq "date" clear_input_field_contents(date_field) - date_field.set Date.current + date_field.set business_day_at_noon.to_date wait_for_reload loading_indicator_saveguard @@ -104,7 +110,7 @@ RSpec.describe "mobile date filter work packages", :js do last_query = Query.last date_filter = last_query.filters.last - expect(date_filter.values).to eq [Date.current.iso8601] + expect(date_filter.values).to eq [business_day_at_noon.to_date.iso8601] end end end From 2c3b50cfa0dbdb96f7dd6cc18a9a2f70f2a84e47 Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Sun, 8 Mar 2026 05:09:46 -0300 Subject: [PATCH 246/334] Stabilize reminders spec --- spec/features/work_packages/reminders_spec.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/spec/features/work_packages/reminders_spec.rb b/spec/features/work_packages/reminders_spec.rb index 9fd51cab04c..ad0b68b9eb1 100644 --- a/spec/features/work_packages/reminders_spec.rb +++ b/spec/features/work_packages/reminders_spec.rb @@ -32,6 +32,7 @@ require "spec_helper" RSpec.describe "Work package reminder modal", :js do + let(:reference_time) { Time.find_zone!("Europe/Berlin").local(2025, 1, 8, 12, 0, 0) } let!(:project) { create(:project) } let!(:work_package) { create(:work_package, project:) } let!(:role_that_allows_managing_own_reminders) do @@ -54,6 +55,14 @@ RSpec.describe "Work package reminder modal", let(:work_package_page) { Pages::FullWorkPackage.new(work_package) } let(:center) { Pages::Notifications::Center.new } + before do + travel_to(reference_time) + end + + after do + travel_back + end + context "with permissions to manage own reminders" do current_user { user_with_permissions } From addb6bc5f639f9c3bcc0059f89704801370cce4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 15:29:55 -0300 Subject: [PATCH 247/334] Bump docker/setup-buildx-action from 3 to 4 (#22258) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3 to 4. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 4 ++-- .github/workflows/hocuspocus-docker.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index a3b170aaba0..8710da37d9f 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -195,7 +195,7 @@ jobs: uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to Docker Hub uses: docker/login-action@v3 with: @@ -324,7 +324,7 @@ jobs: if [ "$suffix" = "-all-in-one" ]; then suffix="" ; fi echo "suffix=$suffix" >> "$GITHUB_OUTPUT" - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Docker meta id: meta uses: docker/metadata-action@v6 diff --git a/.github/workflows/hocuspocus-docker.yml b/.github/workflows/hocuspocus-docker.yml index 8b328c44cae..fc1e60ed6d7 100644 --- a/.github/workflows/hocuspocus-docker.yml +++ b/.github/workflows/hocuspocus-docker.yml @@ -92,7 +92,7 @@ jobs: uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Build and push id: build From 8e3fd6f925b10ff0df623d117cd968c1b21301eb Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Sun, 8 Mar 2026 12:34:00 -0300 Subject: [PATCH 248/334] Stabilize portfolio details component spec --- spec/components/portfolios/details_component_spec.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spec/components/portfolios/details_component_spec.rb b/spec/components/portfolios/details_component_spec.rb index e8a0a74dfd9..31fea1f7d66 100644 --- a/spec/components/portfolios/details_component_spec.rb +++ b/spec/components/portfolios/details_component_spec.rb @@ -38,6 +38,7 @@ RSpec.describe Portfolios::DetailsComponent, type: :component do render_inline(described_class.new(...)) end + let(:reference_time) { Time.zone.local(2025, 2, 1, 12, 0, 0) } let(:user) { create(:admin) } let(:status_code_a) { "on_track" } let(:status_code_b) { "at_risk" } @@ -51,6 +52,8 @@ RSpec.describe Portfolios::DetailsComponent, type: :component do end before do + travel_to(reference_time) + create(:program, parent: portfolio, status_code: status_code_a).tap do |program_a| create(:project, parent: program_a, status_code: status_code_a).tap do |project_a| create(:project, parent: project_a, status_code: status_code_b) @@ -69,6 +72,10 @@ RSpec.describe Portfolios::DetailsComponent, type: :component do def portfolio.favorited?; false; end end + after do + travel_back + end + shared_examples "having a description and last update time" do it { expect(subject).to have_text(portfolio.description) } From 246951d91026cf8dc896c436cded0e94c95edf9d Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Sun, 8 Mar 2026 12:55:55 -0300 Subject: [PATCH 249/334] Stabilize reminder service specs --- .../reminders/set_attributes_service_spec.rb | 9 +++++++++ spec/services/reminders/update_service_spec.rb | 12 +++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/spec/services/reminders/set_attributes_service_spec.rb b/spec/services/reminders/set_attributes_service_spec.rb index 5804ee862d4..b550d9679d7 100644 --- a/spec/services/reminders/set_attributes_service_spec.rb +++ b/spec/services/reminders/set_attributes_service_spec.rb @@ -31,6 +31,7 @@ require "spec_helper" RSpec.describe Reminders::SetAttributesService do + let(:business_day_at_noon) { Time.zone.local(2025, 1, 8, 12, 0, 0) } let(:user) { build_stubbed(:user) } let(:model_instance) { Reminder.new } let(:remindable) { build_stubbed(:work_package) } @@ -44,6 +45,14 @@ RSpec.describe Reminders::SetAttributesService do contract_class:) end + before do + travel_to(business_day_at_noon) + end + + after do + travel_back + end + describe "building remind_at timestamp" do it "sets the remind_at attribute from date and time params" do params = { diff --git a/spec/services/reminders/update_service_spec.rb b/spec/services/reminders/update_service_spec.rb index acd00a363d2..5de4c90e384 100644 --- a/spec/services/reminders/update_service_spec.rb +++ b/spec/services/reminders/update_service_spec.rb @@ -39,18 +39,24 @@ RSpec.describe Reminders::UpdateService do describe "remind_at changed" do subject { described_class.new(user:, model: model_instance).call(call_attributes) } + let(:business_day_at_noon) { Time.zone.local(2025, 1, 8, 12, 0, 0) } let(:model_instance) { create(:reminder, :scheduled, :with_unread_notifications, creator: user) } let(:user) { create(:admin) } - let(:remind_at) { 2.days.from_now.change(hour: 12, min: 0) } + let(:remind_at) { business_day_at_noon + 2.days } let(:call_attributes) { { remind_at_date: remind_at.to_date, remind_at_time: remind_at.strftime("%H:%M") } } before do - model_instance.update(job_id: 1) + travel_to(business_day_at_noon) + model_instance.update!(job_id: 1) allow(Reminders::ScheduleReminderJob).to receive(:schedule) .with(model_instance) .and_return(instance_double(Reminders::ScheduleReminderJob, job_id: 2)) end + after do + travel_back + end + context "with an existing unfinished scheduled job" do let(:job) { instance_double(GoodJob::Job, finished?: false, destroy: true) } @@ -101,7 +107,7 @@ RSpec.describe Reminders::UpdateService do end context "with remind_at attribute in non-utc timezone" do - let(:call_attributes) { { remind_at: 2.days.from_now.in_time_zone("Africa/Nairobi") } } + let(:call_attributes) { { remind_at: remind_at.in_time_zone("Africa/Nairobi") } } it "reschedules the reminder" do expect { subject }.to change(model_instance, :job_id).from("1").to("2") From 5082c42ea9a6e78c91064c8b9eac5fdbb8a5c7c3 Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Mon, 9 Mar 2026 21:34:57 -0300 Subject: [PATCH 250/334] Stabilize out-of-hours unit specs --- .../create_service_integration_spec.rb | 9 ++++++++ .../v3/work_packages/show_resource_spec.rb | 23 ++++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/modules/meeting/spec/services/recurring_meetings/create_service_integration_spec.rb b/modules/meeting/spec/services/recurring_meetings/create_service_integration_spec.rb index d9707c8db01..587b4d75100 100644 --- a/modules/meeting/spec/services/recurring_meetings/create_service_integration_spec.rb +++ b/modules/meeting/spec/services/recurring_meetings/create_service_integration_spec.rb @@ -35,6 +35,7 @@ RSpec.describe RecurringMeetings::CreateService, "integration", type: :model do shared_let(:user) do create(:user, member_with_permissions: { project => %i(view_meetings create_meetings) }) end + let(:business_day_at_noon) { Time.zone.parse("2025-01-08T12:00:00Z") } let(:instance) { described_class.new(user:) } let(:service_result) { subject } let(:series) { service_result.result } @@ -42,6 +43,14 @@ RSpec.describe RecurringMeetings::CreateService, "integration", type: :model do subject { instance.call(**params) } + before do + travel_to(business_day_at_noon) + end + + after do + travel_back + end + shared_examples "creates the series" do it "creates the series and template" do expect(service_result).to be_success diff --git a/spec/requests/api/v3/work_packages/show_resource_spec.rb b/spec/requests/api/v3/work_packages/show_resource_spec.rb index d4f4b971168..5eba4712539 100644 --- a/spec/requests/api/v3/work_packages/show_resource_spec.rb +++ b/spec/requests/api/v3/work_packages/show_resource_spec.rb @@ -412,8 +412,17 @@ RSpec.describe "API v3 Work package resource", end context "when the timestamps are relative date keywords" do + let(:business_day_at_noon) { Time.zone.parse("2025-01-08T12:00:00Z") } let(:timestamps) { [Timestamp.new("oneWeekAgo@12:00+00:00"), Timestamp.now] } + before do + travel_to(business_day_at_noon) + end + + after do + travel_back + end + it "has an embedded link to the baseline work package" do expect(subject) .to be_json_eql(api_v3_paths.work_package(work_package.id, timestamps: timestamps.first).to_json) @@ -421,11 +430,9 @@ RSpec.describe "API v3 Work package resource", end it "has the absolute timestamps within the self link" do - Timecop.freeze do - expect(subject) - .to be_json_eql(api_v3_paths.work_package(work_package.id, timestamps: timestamps.map(&:absolute)).to_json) - .at_path("_links/self/href") - end + expect(subject) + .to be_json_eql(api_v3_paths.work_package(work_package.id, timestamps: timestamps.map(&:absolute)).to_json) + .at_path("_links/self/href") end describe "attributesByTimestamp" do @@ -456,7 +463,7 @@ RSpec.describe "API v3 Work package resource", # Travel 1 day to test the href not being cached, because the # relative date keyword has a fixed hour part, which means the timestamp # will change its value only in 1 day units - Timecop.travel 1.day do + travel 1.day do get get_path end end.to change { @@ -468,7 +475,7 @@ RSpec.describe "API v3 Work package resource", it "does not cache the attributes" do get get_path expect do - Timecop.travel 2.days do + travel 2.days do get get_path end end.to change { @@ -486,7 +493,7 @@ RSpec.describe "API v3 Work package resource", it "is not cached" do get get_path expect do - Timecop.travel 2.days do + travel 2.days do get get_path end end.to change { From b6d2d830ddefc1c02f2254b79896f254fa75c75b Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Tue, 10 Mar 2026 15:52:49 -0300 Subject: [PATCH 251/334] Disable RSpecRails/TravelAround cop --- .rubocop.yml | 4 ++++ modules/costs/spec/features/my_time_tracking_spec.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index 47896294dfe..1815a2c11d1 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -226,6 +226,10 @@ Rails/SkipsModelValidations: RSpecRails/HttpStatus: Enabled: false +# The block form of `travel_to` is often the tighter and safer option in our Rails specs. +RSpecRails/TravelAround: + Enabled: false + # expect not_to change is not working as expected # if you chain it with multiple expected changes RSpec/ChangeByZero: diff --git a/modules/costs/spec/features/my_time_tracking_spec.rb b/modules/costs/spec/features/my_time_tracking_spec.rb index b85bbab5108..bc18a135024 100644 --- a/modules/costs/spec/features/my_time_tracking_spec.rb +++ b/modules/costs/spec/features/my_time_tracking_spec.rb @@ -74,7 +74,7 @@ RSpec.describe "my time tracking", :js do end around do |example| - travel_to "2025-04-09T12:00:00Z" do # rubocop:disable RSpecRails/TravelAround + travel_to "2025-04-09T12:00:00Z" do example.run end end From 338bb59e6c0fb4a3f51194b27669e391e23abb46 Mon Sep 17 00:00:00 2001 From: Kabiru Mwenja Date: Tue, 10 Mar 2026 22:00:14 +0300 Subject: [PATCH 252/334] Update dev hocuspocus compose image version and env (#22019) * Remove deprecated `ALLOWED_DOMAINS` * Point to `openproject/hocuspocus:dev-lates` by default --- .env.example | 5 +++++ docker/dev/hocuspocus/docker-compose.yml | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 1d40114a28a..22069e05a6c 100644 --- a/.env.example +++ b/.env.example @@ -48,10 +48,15 @@ FE_PORT=4200 OPENPROJECT_COLLABORATIVE__EDITING__HOCUSPOCUS__URL=ws://localhost:1234 OPENPROJECT_COLLABORATIVE__EDITING__HOCUSPOCUS__SECRET=secret12345 +# Hocuspocus (collaborative editing) - docker dev development +# OPENPROJECT_COLLABORATIVE__EDITING__HOCUSPOCUS__URL=wss://hocuspocus.local +# OPENPROJECT_COLLABORATIVE__EDITING__HOCUSPOCUS__SECRET=secret12345 + # Default TLD for docker dev stack (e.g. when set to "local", services will be openproject.local, nextcloud.local, etc.) OPENPROJECT_DOCKER_DEV_TLD=local # Use this variables to configure hostnames for frontend and backend, e.g. to enable HTTPS in docker development setup +# For docker development: openproject.local and localhost for "local" development OPENPROJECT_DEV_HOST=localhost OPENPROJECT_DEV_URL=http://${OPENPROJECT_DEV_HOST}:${FE_PORT} diff --git a/docker/dev/hocuspocus/docker-compose.yml b/docker/dev/hocuspocus/docker-compose.yml index 6ff6d5fbda9..bb1eade4c7e 100644 --- a/docker/dev/hocuspocus/docker-compose.yml +++ b/docker/dev/hocuspocus/docker-compose.yml @@ -2,7 +2,7 @@ services: hocuspocus: # In case of MacOS you need to specify the platform in your `docker/dev/hocuspocus/docker-compose.override.yml`: # platform: linux/amd64 - image: openproject/hocuspocus:latest + image: openproject/hocuspocus:dev-latest labels: - "traefik.enable=true" - "traefik.http.routers.hocuspocus.rule=Host(`hocuspocus.${OPENPROJECT_DOCKER_DEV_TLD:-local}`)" @@ -14,7 +14,6 @@ services: networks: - gateway environment: - - ALLOWED_DOMAINS=openproject.${OPENPROJECT_DOCKER_DEV_TLD:-local},localhost - NODE_TLS_REJECT_UNAUTHORIZED=0 - SECRET=secret12345 networks: From 5631d8f2e487de4fd5440d68fc0fa78d33fdf140 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 05:39:56 +0000 Subject: [PATCH 253/334] Bump @primer/primitives from 11.3.2 to 11.5.0 in /frontend Bumps [@primer/primitives](https://github.com/primer/primitives) from 11.3.2 to 11.5.0. - [Release notes](https://github.com/primer/primitives/releases) - [Changelog](https://github.com/primer/primitives/blob/main/CHANGELOG.md) - [Commits](https://github.com/primer/primitives/compare/v11.3.2...v11.5.0) --- updated-dependencies: - dependency-name: "@primer/primitives" dependency-version: 11.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 15 +++++++-------- frontend/package.json | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6dd367bc56a..a80b8f871cf 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -60,7 +60,7 @@ "@openproject/reactivestates": "^3.0.1", "@primer/css": "^22.1.0", "@primer/live-region-element": "^0.8.0", - "@primer/primitives": "^11.3.2", + "@primer/primitives": "^11.5.0", "@primer/view-components": "npm:@openproject/primer-view-components@^0.82.0", "@rails/request.js": "^0.0.13", "@stimulus-components/auto-submit": "^6.0.0", @@ -7823,10 +7823,9 @@ } }, "node_modules/@primer/primitives": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.3.2.tgz", - "integrity": "sha512-/8EDh3MmF9cbmrLETFmIuNFIdvpSCkvBlx6zzD8AZ4dZ5UYExQzFj8QAtIrRtCFJ2ZmW5QrtrPR3+JVb8KEDpg==", - "license": "MIT" + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.5.0.tgz", + "integrity": "sha512-vYx9IJeCEZLluZh7Q+sZZXZU8vY2mY9t699AYc7Z2XA6BrVwdcbLbINIS7vjusxb+kQsIK2FshAGJujpV5OMLw==" }, "node_modules/@primer/view-components": { "name": "@openproject/primer-view-components", @@ -30583,9 +30582,9 @@ "integrity": "sha512-KMWYYEIDKNIY0N3fMmNGPWJGHgoJF5NHkJllpOM3upDXuLtAe26Riogp1cfYdhp+sVjGZMt32DxcUhTX7ZhLOQ==" }, "@primer/primitives": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.3.2.tgz", - "integrity": "sha512-/8EDh3MmF9cbmrLETFmIuNFIdvpSCkvBlx6zzD8AZ4dZ5UYExQzFj8QAtIrRtCFJ2ZmW5QrtrPR3+JVb8KEDpg==" + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.5.0.tgz", + "integrity": "sha512-vYx9IJeCEZLluZh7Q+sZZXZU8vY2mY9t699AYc7Z2XA6BrVwdcbLbINIS7vjusxb+kQsIK2FshAGJujpV5OMLw==" }, "@primer/view-components": { "version": "npm:@openproject/primer-view-components@0.82.0", diff --git a/frontend/package.json b/frontend/package.json index 743f8b84c2d..a125c08e530 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -115,7 +115,7 @@ "@openproject/reactivestates": "^3.0.1", "@primer/css": "^22.1.0", "@primer/live-region-element": "^0.8.0", - "@primer/primitives": "^11.3.2", + "@primer/primitives": "^11.5.0", "@primer/view-components": "npm:@openproject/primer-view-components@^0.82.0", "@rails/request.js": "^0.0.13", "@stimulus-components/auto-submit": "^6.0.0", From 978548b8ec5297436e946fefed54bd65419d5c92 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 05:37:01 -0300 Subject: [PATCH 254/334] Bump hono from 4.12.5 to 4.12.7 in /frontend (#22298) Bumps [hono](https://github.com/honojs/hono) from 4.12.5 to 4.12.7. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.12.5...v4.12.7) --- updated-dependencies: - dependency-name: hono dependency-version: 4.12.7 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6dd367bc56a..2acd7e81bd0 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15751,9 +15751,9 @@ } }, "node_modules/hono": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.5.tgz", - "integrity": "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==", + "version": "4.12.7", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.7.tgz", + "integrity": "sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw==", "engines": { "node": ">=16.9.0" } @@ -36003,9 +36003,9 @@ } }, "hono": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.5.tgz", - "integrity": "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==" + "version": "4.12.7", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.7.tgz", + "integrity": "sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw==" }, "hosted-git-info": { "version": "9.0.2", From c60c1ec7a0d5b2a36e4ba4030c9fac6b1ed2412f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 05:37:13 -0300 Subject: [PATCH 255/334] Bump tar from 7.5.10 to 7.5.11 in /frontend (#22297) Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.10 to 7.5.11. - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-tar/compare/v7.5.10...v7.5.11) --- updated-dependencies: - dependency-name: tar dependency-version: 7.5.11 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2acd7e81bd0..1616e8a14ba 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23595,9 +23595,9 @@ } }, "node_modules/tar": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.10.tgz", - "integrity": "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -41384,9 +41384,9 @@ "dev": true }, "tar": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.10.tgz", - "integrity": "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", From 057ccf242312d3b174e87dc1f4fe2e913ba56137 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 05:38:24 -0300 Subject: [PATCH 256/334] Bump httpx from 1.7.2 to 1.7.3 (#22302) Bumps [httpx](https://gitlab.com/os85/httpx) from 1.7.2 to 1.7.3. - [Commits](https://gitlab.com/os85/httpx/compare/v1.7.2...v1.7.3) --- updated-dependencies: - dependency-name: httpx dependency-version: 1.7.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 0147b491349..14b8a209569 100644 --- a/Gemfile +++ b/Gemfile @@ -256,7 +256,7 @@ gem "turbo-rails", "~> 2.0.20" # There is a problem with version 1.4.0. Do not update until you're sure there is no infinite hang # happenning in failing tests when WebMock or VCR stub cannot be found. -gem "httpx", "~> 1.7.2" +gem "httpx", "~> 1.7.3" # Brings actual deep-freezing to most ruby objects gem "ice_nine" diff --git a/Gemfile.lock b/Gemfile.lock index 9ab34165d48..d15a7277a6c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -697,8 +697,8 @@ GEM htmlentities (4.3.4) http-2 (1.1.3) http_parser.rb (0.8.1) - httpx (1.7.2) - http-2 (>= 1.0.0) + httpx (1.7.3) + http-2 (>= 1.1.3) i18n (1.14.8) concurrent-ruby (~> 1.0) i18n-js (4.2.4) @@ -1629,7 +1629,7 @@ DEPENDENCIES grids! html-pipeline (~> 2.14.0) htmldiff - httpx (~> 1.7.2) + httpx (~> 1.7.3) i18n-js (~> 4.2.4) i18n-tasks (~> 1.1.0) ice_cube (~> 0.17.0) @@ -1966,7 +1966,7 @@ CHECKSUMS htmlentities (4.3.4) sha256=125a73c6c9f2d1b62100b7c3c401e3624441b663762afa7fe428476435a673da http-2 (1.1.3) sha256=1b2f379d35a11dbae94f8a1a52c053d8c161eb4a0c98b5d1605ff1b2bf171c9c http_parser.rb (0.8.1) sha256=9ae8df145b39aa5398b2f90090d651c67bd8e2ebfe4507c966579f641e11097a - httpx (1.7.2) sha256=10cdcd5b03794de743bec87e8cdba2ca93e2124084b6cdb1ad01b00c192a51f7 + httpx (1.7.3) sha256=126914109a58350e5ad0c13786092f35e2419857dad15745f31fc81c371f93a8 i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5 i18n-js (4.2.4) sha256=61390d372f8fa68c495c5907d577657e8cc3a7031f4945db1e91f935e1391355 i18n-tasks (1.1.2) sha256=4dcfba49e52a623f30661cb316cb80d84fbba5cb8c6d88ef5e02545fffa3637a From 90e38c4456c2aead3fc47ab69107b78ada6efb80 Mon Sep 17 00:00:00 2001 From: Klaus Zanders Date: Wed, 11 Mar 2026 11:13:01 +0100 Subject: [PATCH 257/334] Revert "fix https webhooks again" This fix is not needed for the `ssrf_filter` gem version we use on DEV This reverts commit 0dd7da77ab39ef44c678a4f7e57e795aff0fb17d. --- lib/open_project/ssrf_protection.rb | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/lib/open_project/ssrf_protection.rb b/lib/open_project/ssrf_protection.rb index fc2f4f2fb5a..c9e786c2129 100644 --- a/lib/open_project/ssrf_protection.rb +++ b/lib/open_project/ssrf_protection.rb @@ -30,35 +30,6 @@ module OpenProject class SsrfProtection < ::SsrfFilter - # ssrf_filter works by resolving the hostname to a public IP, then connecting to that IP - # directly (to prevent DNS-rebinding attacks). For HTTPS, Net::HTTP must set the SNI hostname - # so the server knows which certificate to serve. - # - # However, modern Net::HTTP (net-http gem) explicitly skips setting SNI when the address is - # an IP (correctly per RFC 6066 §3 — IP literals are not valid in SNI). ssrf_filter 1.0.x - # patches SSLSocket#hostname= to inject the original hostname, but that patch never fires - # because Net::HTTP never calls hostname= for IP addresses. - # - # This patch targets SSLSocket#connect instead, which IS called regardless of address type. - # It sets the SNI hostname from ssrf_filter's thread-local just before the TLS handshake, - # making HTTPS work for SNI-dependent servers (e.g. Cloudflare-hosted webhooks). - # - # This patch can be removed once release/17.2 is retired — on dev we use ssrf_filter ~> 1.3 - # which resolves this differently. - ::OpenSSL::SSL::SSLSocket.class_eval do - # Net::Protocol#ssl_socket_connect uses connect_nonblock when a timeout is set (the common - # case), falling back to connect only when timeout is nil. Patch both to be safe. - %i[connect connect_nonblock].each do |meth| - original = instance_method(meth) - define_method(meth) do |**kwargs| - if (hostname = ::Thread.current[::SsrfFilter::FIBER_LOCAL_KEY]) - self.hostname = hostname - end - original.bind(self).call(**kwargs) - end - end - end - class << self ## # Performs an SSRF-safe HTTP POST request to the given URL. From 3679504e27690a61e3efc0a57cc3ce5190e918ab Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Wed, 11 Mar 2026 12:10:34 +0100 Subject: [PATCH 258/334] Use Bearer token directly for GitHub API requests I got some 403 errors when using Basic auth with username and token. Good thing: it makes the GITHUB_USERNAME env variable useless. --- docs/development/testing/handling-flaky-tests/README.md | 1 - script/github_pr_errors | 9 ++++----- script/report_out_of_hours_ci_failures | 9 ++++----- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/docs/development/testing/handling-flaky-tests/README.md b/docs/development/testing/handling-flaky-tests/README.md index 437d36cdf01..e4332bb5224 100644 --- a/docs/development/testing/handling-flaky-tests/README.md +++ b/docs/development/testing/handling-flaky-tests/README.md @@ -37,7 +37,6 @@ To aggregate recent `Test suite` failures and highlight specs that skew outside use: ```bash -export GITHUB_USERNAME=... export GITHUB_TOKEN=... script/report_out_of_hours_ci_failures --days 30 ``` diff --git a/script/github_pr_errors b/script/github_pr_errors index 1c662b7c62b..fcfb79f81bc 100755 --- a/script/github_pr_errors +++ b/script/github_pr_errors @@ -24,9 +24,7 @@ GITHUB_HTML_OPENPROJECT_PREFIX = "https://github.com/opf/openproject" RAILS_ROOT = Pathname.new(__dir__).dirname EXCLUDED_JOB_NAMES = %w[eslint rubocop].freeze -if !ENV["GITHUB_USERNAME"] - raise "Missing GITHUB_USERNAME env" -elsif !ENV["GITHUB_TOKEN"] +if !ENV["GITHUB_TOKEN"] raise "Missing GITHUB_TOKEN env, go to https://github.com/settings/tokens and create one with 'repo' access" end @@ -181,8 +179,9 @@ end def http HTTPX .plugin(:follow_redirects) - .plugin(:basic_auth) - .basic_auth(ENV.fetch("GITHUB_USERNAME"), ENV.fetch("GITHUB_TOKEN")) + .with_headers( + "Authorization" => "Bearer #{ENV.fetch('GITHUB_TOKEN')}" + ) end def get_http(path) diff --git a/script/report_out_of_hours_ci_failures b/script/report_out_of_hours_ci_failures index 07f1fe07c97..afd2ff9bea2 100755 --- a/script/report_out_of_hours_ci_failures +++ b/script/report_out_of_hours_ci_failures @@ -114,8 +114,9 @@ module OutOfHoursCiFailures def http @http ||= HTTPX .plugin(:follow_redirects) - .plugin(:basic_auth) - .basic_auth(ENV.fetch("GITHUB_USERNAME"), ENV.fetch("GITHUB_TOKEN")) + .with_headers( + "Authorization" => "Bearer #{ENV.fetch('GITHUB_TOKEN')}" + ) end def github_url(path) @@ -351,9 +352,7 @@ module OutOfHoursCiFailures end if $PROGRAM_NAME == __FILE__ - if !ENV["GITHUB_USERNAME"] - raise "Missing GITHUB_USERNAME env" - elsif !ENV["GITHUB_TOKEN"] + if !ENV["GITHUB_TOKEN"] raise "Missing GITHUB_TOKEN env, go to https://github.com/settings/tokens and create one with 'repo' access" end From b8b84bdd945e15dffc745a1d2d2a909d0685486c Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Wed, 11 Mar 2026 12:12:01 +0100 Subject: [PATCH 259/334] Make some meetings features specs faster The "Filters" toggle is clicked regardless of whether the filters are already open or not. When already open, the toggle is clicked and the filters are closed. This causes the method to wait 3 secs for the filters to be opened, fail, and be retried and work, leading to 3 secs of extra wait time. Now it exits early if the filters are already open => faster specs. --- spec/support/components/common/filters.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/spec/support/components/common/filters.rb b/spec/support/components/common/filters.rb index 805ed1081f5..93a946a0cf9 100644 --- a/spec/support/components/common/filters.rb +++ b/spec/support/components/common/filters.rb @@ -198,6 +198,8 @@ module Components end def open_filters + return if filters_expanded? + retry_block do toggle_filters_section expect(page).to have_css(".op-filters-form.-expanded") @@ -213,6 +215,13 @@ module Components filters_toggle.click end + def filters_expanded? + # wait for widgets to be loaded (filters button should be visible) + filters_toggle + + page.has_css?(".op-filters-form.-expanded", wait: 0) + end + def autocomplete_filter?(filter) filter.has_css?('[data-filter-autocomplete="true"]', wait: 0) end From 9cd9ac4c671e4889f11083777a1bc2cd5bd7ed20 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 17 Feb 2026 21:16:11 +0200 Subject: [PATCH 260/334] [#71374] Allow sharing Sprints with other projects https://community.openproject.org/work_packages/71374 --- app/models/project.rb | 1 + app/models/projects/sprint_sharing.rb | 39 ++++++++++ .../settings_header_component.html.erb | 76 +++++++++++++++++++ .../backlogs/settings_header_component.rb | 50 ++++++++++++ .../backlogs/sharing_form_component.html.erb | 44 +++++++++++ .../backlogs/sharing_form_component.rb | 50 ++++++++++++ .../projects/backlog_settings_contract.rb | 52 +++++++++++++ .../settings/backlog_sharings_controller.rb | 55 ++++++++++++++ .../settings/backlogs/sharing_form.rb | 59 ++++++++++++++ .../settings/backlog_sharings/show.html.erb | 37 +++++++++ .../projects/settings/backlogs/show.html.erb | 34 ++------- modules/backlogs/config/locales/en.yml | 5 ++ modules/backlogs/config/routes.rb | 2 + .../lib/open_project/backlogs/engine.rb | 2 +- .../backlog_settings_contract_spec.rb | 56 ++++++++++++++ .../backlog_sharings_controller_spec.rb | 76 +++++++++++++++++++ spec/models/projects/sprint_sharing_spec.rb | 31 ++++++++ 17 files changed, 640 insertions(+), 29 deletions(-) create mode 100644 app/models/projects/sprint_sharing.rb create mode 100644 modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb create mode 100644 modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.rb create mode 100644 modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb create mode 100644 modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.rb create mode 100644 modules/backlogs/app/contracts/projects/backlog_settings_contract.rb create mode 100644 modules/backlogs/app/controllers/projects/settings/backlog_sharings_controller.rb create mode 100644 modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb create mode 100644 modules/backlogs/app/views/projects/settings/backlog_sharings/show.html.erb create mode 100644 modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb create mode 100644 modules/backlogs/spec/controllers/projects/settings/backlog_sharings_controller_spec.rb create mode 100644 spec/models/projects/sprint_sharing_spec.rb diff --git a/app/models/project.rb b/app/models/project.rb index 41fb0312f92..dfdadb1e063 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -40,6 +40,7 @@ class Project < ApplicationRecord include Projects::Versions include Projects::WorkPackageCustomFields include Projects::CreationWizard + include Projects::SprintSharing include ::Scopes::Scoped diff --git a/app/models/projects/sprint_sharing.rb b/app/models/projects/sprint_sharing.rb new file mode 100644 index 00000000000..a2c3ea5c44d --- /dev/null +++ b/app/models/projects/sprint_sharing.rb @@ -0,0 +1,39 @@ +# 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 Projects::SprintSharing + SPRINT_SHARING_OPTIONS = %w[share_all_projects share_subprojects no_sharing receive_shared].freeze + + extend ActiveSupport::Concern + + included do + store_attribute :settings, :sprint_sharing, :string, default: "no_sharing" + end +end diff --git a/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb new file mode 100644 index 00000000000..d6d181fa619 --- /dev/null +++ b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb @@ -0,0 +1,76 @@ +<%#-- 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::OpenProject::PageHeader.new do |header| + header.with_title { t(:label_backlogs) } + header.with_breadcrumbs( + [{ href: project_overview_path(project), text: project.name }, + { href: project_settings_general_path(project), text: I18n.t(:label_project_settings) }, + I18n.t(:label_backlogs)] + ) + + header.with_tab_nav(label: nil) do |tab_nav| + tab_nav.with_tab( + selected: selected_tab == :done_status, + href: project_settings_backlogs_path(project) + ) do |t| + t.with_text { t("backlogs.done_status") } + end + + if User.current.allowed_in_project?(:share_sprint, project) + tab_nav.with_tab( + selected: selected_tab == :sharing, + href: project_settings_backlog_sharing_path(project) + ) do |t| + t.with_text { t("backlogs.sharing") } + end + end + end + + if selected_tab == :done_status + header.with_action_menu( + menu_arguments: { anchor_align: :end }, + button_arguments: { + icon: :"kebab-horizontal", + "aria-label": t(:label_more) + } + ) do |menu| + menu.with_item( + tag: :button, + href: rebuild_positions_project_settings_backlogs_path(@project), + label: t(:"backlogs.rebuild_positions"), + form_arguments: { method: :post } + ) do |item| + item.with_leading_visual_icon(icon: :sync) + end + end + end + end +%> diff --git a/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.rb b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.rb new file mode 100644 index 00000000000..4778b02b32c --- /dev/null +++ b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.rb @@ -0,0 +1,50 @@ +# 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 Projects + module Settings + module Backlogs + class SettingsHeaderComponent < ApplicationComponent + include OpPrimer::ComponentHelpers + + def initialize(project:, selected_tab:) + super + + @project = project + @selected_tab = selected_tab + end + + private + + attr_reader :project, :selected_tab + end + end + end +end diff --git a/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb b/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb new file mode 100644 index 00000000000..c4d08657199 --- /dev/null +++ b/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb @@ -0,0 +1,44 @@ +<%#-- 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::Beta::Text.new(tag: :div, color: :muted, mb: 3)) do + I18n.t("backlogs.sharing_description") + end +%> + +<%= + settings_primer_form_with( + model: project, + url: project_settings_backlog_sharing_path(project), + method: :patch + ) do |f| + render(Projects::Settings::Backlogs::SharingForm.new(f)) + end +%> diff --git a/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.rb b/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.rb new file mode 100644 index 00000000000..94847d32bca --- /dev/null +++ b/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.rb @@ -0,0 +1,50 @@ +# 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 Projects + module Settings + module Backlogs + class SharingFormComponent < ApplicationComponent + include ApplicationHelper + include OpPrimer::ComponentHelpers + + def initialize(project:) + super + + @project = project + end + + private + + attr_reader :project + end + end + end +end diff --git a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb new file mode 100644 index 00000000000..8b41f54aeb6 --- /dev/null +++ b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb @@ -0,0 +1,52 @@ +# 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 Projects + class BacklogSettingsContract < ::BaseContract + attribute :sprint_sharing + + validate :validate_permissions + validate :validate_sharing_settings + + protected + + def validate_permissions + unless user.allowed_in_project?(:share_sprint, model) + errors.add :base, :error_unauthorized + end + end + + def validate_sharing_settings + unless model.sprint_sharing.in?(Project::SPRINT_SHARING_OPTIONS) + errors.add :sprint_sharing, :inclusion + end + end + end +end diff --git a/modules/backlogs/app/controllers/projects/settings/backlog_sharings_controller.rb b/modules/backlogs/app/controllers/projects/settings/backlog_sharings_controller.rb new file mode 100644 index 00000000000..850677bbfa2 --- /dev/null +++ b/modules/backlogs/app/controllers/projects/settings/backlog_sharings_controller.rb @@ -0,0 +1,55 @@ +# 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. +#++ + +class Projects::Settings::BacklogSharingsController < Projects::SettingsController + menu_item :settings_backlogs + + def show; end + + def update + call = Projects::UpdateService + .new(model: @project, user: current_user, contract_class: Projects::BacklogSettingsContract) + .call(backlog_settings_params) + + if call.success? + flash[:notice] = I18n.t(:notice_successful_update) + redirect_to project_settings_backlog_sharing_path(@project) + else + flash.now[:error] = I18n.t(:notice_unsuccessful_update_with_reason, reason: call.message) + render action: :show, status: :unprocessable_entity + end + end + + private + + def backlog_settings_params + params.expect(project: %i[sprint_sharing]) + end +end diff --git a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb new file mode 100644 index 00000000000..3f963697a86 --- /dev/null +++ b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.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 Projects + module Settings + module Backlogs + class SharingForm < ApplicationForm + form do |f| + f.select_list( + name: :sprint_sharing, + label: Project.human_attribute_name(:sprint_sharing), + input_width: :medium + ) do |list| + Project::SPRINT_SHARING_OPTIONS.each do |option| + list.option( + value: option, + label: I18n.t("projects.settings.backlog_sharing.options.#{option}", default: option.humanize), + selected: option == model.sprint_sharing + ) + end + end + + f.submit( + name: :submit, + label: I18n.t("button_save"), + scheme: :primary + ) + end + end + end + end +end diff --git a/modules/backlogs/app/views/projects/settings/backlog_sharings/show.html.erb b/modules/backlogs/app/views/projects/settings/backlog_sharings/show.html.erb new file mode 100644 index 00000000000..e816ac930d4 --- /dev/null +++ b/modules/backlogs/app/views/projects/settings/backlog_sharings/show.html.erb @@ -0,0 +1,37 @@ +<%#-- 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( + Projects::Settings::Backlogs::SettingsHeaderComponent.new( + project: @project, + selected_tab: :sharing + ) + ) %> + +<%= render(Projects::Settings::Backlogs::SharingFormComponent.new(project: @project)) %> diff --git a/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb b/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb index 11ac6fb8e62..3b859a6d1a8 100644 --- a/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb +++ b/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb @@ -27,34 +27,12 @@ See COPYRIGHT and LICENSE files for more details. ++#%> -<%= - render Primer::OpenProject::PageHeader.new do |header| - header.with_title { t(:label_backlogs) } - - header.with_breadcrumbs( - [{ href: project_overview_path(@project), text: @project.name }, - { href: project_settings_general_path(@project), text: I18n.t(:label_project_settings) }, - t(:label_backlogs)] - ) - - header.with_action_menu( - menu_arguments: { anchor_align: :end }, - button_arguments: { - icon: :"kebab-horizontal", - "aria-label": t(:label_more) - } - ) do |menu| - menu.with_item( - tag: :button, - href: rebuild_positions_project_settings_backlogs_path(@project), - label: t(:"backlogs.rebuild_positions"), - form_arguments: { method: :post } - ) do |item| - item.with_leading_visual_icon(icon: :sync) - end - end - end -%> +<%= render( + Projects::Settings::Backlogs::SettingsHeaderComponent.new( + project: @project, + selected_tab: :done_status + ) + ) %> <%= settings_primer_form_with( diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index 3d26e704927..48b6c09dd71 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -40,6 +40,8 @@ en: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -70,6 +72,9 @@ en: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." diff --git a/modules/backlogs/config/routes.rb b/modules/backlogs/config/routes.rb index 25c9eb65019..dad63b3d4bd 100644 --- a/modules/backlogs/config/routes.rb +++ b/modules/backlogs/config/routes.rb @@ -88,6 +88,8 @@ Rails.application.routes.draw do scope "projects/:project_id", as: "project", module: "projects" do namespace "settings" do + resource :backlog_sharing, only: %i[show update] + resource :backlogs, only: %i[show update] do member do post "rebuild_positions" => "backlogs#rebuild_positions" diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index f259da89eeb..6f3f124e129 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -106,7 +106,7 @@ module OpenProject::Backlogs dependencies: :view_sprints permission :share_sprint, - {}, + { "projects/settings/backlog_sharings": %i[show update] }, permissible_on: :project, require: :member, dependencies: :create_sprints, diff --git a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb new file mode 100644 index 00000000000..fe217214908 --- /dev/null +++ b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require "spec_helper" +require "contracts/shared/model_contract_shared_context" + +RSpec.describe Projects::BacklogSettingsContract do + include_context "ModelContract shared context" + + let(:project) { create(:project) } + let(:contract) { described_class.new(project, current_user) } + let(:current_user) { build_stubbed(:user) } + let(:can_share_sprint) { true } + + before do + allow(current_user) + .to receive(:allowed_in_project?) + .with(:share_sprint, project) + .and_return(can_share_sprint) + end + + it_behaves_like "contract is valid" + + context "when sprint_sharing is changed" do + before do + project.sprint_sharing = sprint_sharing + end + + context "with a supported sprint sharing value" do + let(:sprint_sharing) { "share_subprojects" } + + context "when user can share sprint" do + it_behaves_like "contract is valid" + end + + context "when user cannot share sprint" do + let(:can_share_sprint) { false } + + it_behaves_like "contract is invalid", base: :error_unauthorized + end + end + + context "with an unsupported sprint sharing value" do + let(:sprint_sharing) { "invalid_option" } + + it_behaves_like "contract is invalid", sprint_sharing: :inclusion + end + end + + describe "#writable_attributes" do + it "only allows sprint_sharing to be written" do + expect(contract.writable_attributes).to include("sprint_sharing") + expect(contract.writable_attributes).not_to include("settings") + expect(contract.writable_attributes).not_to include("deactivate_work_package_attachments") + end + end +end diff --git a/modules/backlogs/spec/controllers/projects/settings/backlog_sharings_controller_spec.rb b/modules/backlogs/spec/controllers/projects/settings/backlog_sharings_controller_spec.rb new file mode 100644 index 00000000000..f0f9c49f241 --- /dev/null +++ b/modules/backlogs/spec/controllers/projects/settings/backlog_sharings_controller_spec.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe Projects::Settings::BacklogSharingsController do + shared_let(:user) { create(:admin) } + + current_user { user } + + before do + allow(controller).to receive(:set_localization) + end + + describe "PATCH #update" do + let(:project) { build_stubbed(:project, sprint_sharing: "no_sharing") } + + before do + visible_relation = instance_double(ActiveRecord::Relation) + allow(Project).to receive(:visible).and_return(visible_relation) + allow(visible_relation).to receive(:find).with(project.identifier).and_return(project) + end + + context "when service call succeeds" do + let(:service_result) { ServiceResult.success(result: project) } + let(:update_service) { instance_double(Projects::UpdateService, call: service_result) } + + before do + allow(Projects::UpdateService) + .to receive(:new) + .with(model: project, user:, contract_class: Projects::BacklogSettingsContract) + .and_return(update_service) + end + + it "updates sprint sharing and redirects to show", :aggregate_failures do + patch :update, params: { + project_id: project.identifier, + project: { + sprint_sharing: "share_subprojects", + name: "must_be_ignored" + } + } + + expect(update_service).to have_received(:call).with( + ActionController::Parameters.new("sprint_sharing" => "share_subprojects").permit! + ) + expect(response).to redirect_to(project_settings_backlog_sharing_path(project)) + expect(flash[:notice]).to include I18n.t(:notice_successful_update) + end + end + + context "when service call fails" do + let(:service_result) { ServiceResult.failure(result: project, message: "invalid setting") } + let(:update_service) { instance_double(Projects::UpdateService, call: service_result) } + + before do + allow(Projects::UpdateService) + .to receive(:new) + .with(model: project, user:, contract_class: Projects::BacklogSettingsContract) + .and_return(update_service) + end + + it "renders show with an error", :aggregate_failures do + patch :update, params: { + project_id: project.identifier, + project: { + sprint_sharing: "invalid_option" + } + } + + expect(response).to have_http_status(:unprocessable_entity) + expect(response).to render_template("projects/settings/backlog_sharings/show") + expect(flash[:error]).to eq I18n.t(:notice_unsuccessful_update_with_reason, reason: "invalid setting") + end + end + end +end diff --git a/spec/models/projects/sprint_sharing_spec.rb b/spec/models/projects/sprint_sharing_spec.rb new file mode 100644 index 00000000000..c5bf3e2b236 --- /dev/null +++ b/spec/models/projects/sprint_sharing_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe Projects::SprintSharing do + let(:project) { create(:project) } + + describe "SPRINT_SHARING_OPTIONS" do + it "defines all supported sprint sharing options" do + expect(described_class::SPRINT_SHARING_OPTIONS).to match_array( + %w[share_all_projects share_subprojects no_sharing receive_shared] + ) + end + + it "is exposed on Project" do + expect(Project::SPRINT_SHARING_OPTIONS).to eq(described_class::SPRINT_SHARING_OPTIONS) + end + end + + describe "#sprint_sharing" do + it "defaults to no_sharing" do + expect(project.sprint_sharing).to eq("no_sharing") + end + + it "persists configured values" do + project.update!(sprint_sharing: "share_subprojects") + + expect(project.reload.sprint_sharing).to eq("share_subprojects") + end + end +end From fe347aa27880a33ca57fc5ac1a7c609d79d35dd4 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Thu, 19 Feb 2026 21:13:32 +0200 Subject: [PATCH 261/334] Automatically toggle the All projects/Subprojects radio buttons when Sharing is selected. --- app/models/projects/sprint_sharing.rb | 12 ++++- .../show-when-value-selected.controller.ts | 4 +- .../backlogs/sharing_form_component.html.erb | 3 +- .../projects/backlog_settings_contract.rb | 9 +--- .../settings/backlogs/sharing_form.rb | 46 +++++++++++++++++-- modules/backlogs/config/locales/en.yml | 12 +++++ 6 files changed, 73 insertions(+), 13 deletions(-) diff --git a/app/models/projects/sprint_sharing.rb b/app/models/projects/sprint_sharing.rb index a2c3ea5c44d..e51afd6f21a 100644 --- a/app/models/projects/sprint_sharing.rb +++ b/app/models/projects/sprint_sharing.rb @@ -34,6 +34,16 @@ module Projects::SprintSharing extend ActiveSupport::Concern included do - store_attribute :settings, :sprint_sharing, :string, default: "no_sharing" + store_attribute :settings, :sprint_sharing, :string + + # TODO: Change the store_attribute_unset_values_fallback_to_default to true in the + # config/initializers/store_attribute.rb. + # Otherwise defaults set on the setting declaration are not working correctly: + # `store_attribute :settings, :sprint_sharing, :string, default: "no_sharing"`. + # The method getter override below is required to provide the default value. + + def sprint_sharing + super.presence || "no_sharing" + end end end diff --git a/frontend/src/stimulus/controllers/show-when-value-selected.controller.ts b/frontend/src/stimulus/controllers/show-when-value-selected.controller.ts index c9513cba00c..954bfc9a605 100644 --- a/frontend/src/stimulus/controllers/show-when-value-selected.controller.ts +++ b/frontend/src/stimulus/controllers/show-when-value-selected.controller.ts @@ -1,4 +1,4 @@ -import { toggleElement, toggleElementByVisibility } from 'core-app/shared/helpers/dom-helpers'; +import { toggleElement, toggleElementByClass, toggleElementByVisibility } from 'core-app/shared/helpers/dom-helpers'; import { ApplicationController } from 'stimulus-use'; export default class OpShowWhenValueSelectedController extends ApplicationController { @@ -29,6 +29,8 @@ export default class OpShowWhenValueSelectedController extends ApplicationContro if (el.dataset.setVisibility === 'true') { toggleElementByVisibility(el, !disabled); + } else if ('visibilityClass' in el.dataset) { + toggleElementByClass(el, el.dataset.visibilityClass!, !disabled); } else { toggleElement(el, !disabled); } diff --git a/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb b/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb index c4d08657199..6f9254ad933 100644 --- a/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb +++ b/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb @@ -37,7 +37,8 @@ See COPYRIGHT and LICENSE files for more details. settings_primer_form_with( model: project, url: project_settings_backlog_sharing_path(project), - method: :patch + method: :patch, + data: { controller: "show-when-value-selected" } ) do |f| render(Projects::Settings::Backlogs::SharingForm.new(f)) end diff --git a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb index 8b41f54aeb6..7b8e2643f63 100644 --- a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb +++ b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb @@ -33,7 +33,8 @@ module Projects attribute :sprint_sharing validate :validate_permissions - validate :validate_sharing_settings + validates :sprint_sharing, presence: true + validates :sprint_sharing, inclusion: { in: Project::SPRINT_SHARING_OPTIONS }, allow_blank: true protected @@ -42,11 +43,5 @@ module Projects errors.add :base, :error_unauthorized end end - - def validate_sharing_settings - unless model.sprint_sharing.in?(Project::SPRINT_SHARING_OPTIONS) - errors.add :sprint_sharing, :inclusion - end - end end end diff --git a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb index 3f963697a86..920f1d88497 100644 --- a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb +++ b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb @@ -32,21 +32,61 @@ module Projects module Settings module Backlogs class SharingForm < ApplicationForm + SHARING_OPTIONS = %w(no_sharing receive_shared).freeze + SHARING_SCOPE_OPTIONS = %w(share_all_projects share_subprojects).freeze + form do |f| f.select_list( name: :sprint_sharing, label: Project.human_attribute_name(:sprint_sharing), - input_width: :medium + input_width: :medium, + data: { + target_name: "sprint_sharing_scope", + "show-when-value-selected-target": "cause" + } ) do |list| - Project::SPRINT_SHARING_OPTIONS.each do |option| + list.option( + value: nil, + label: I18n.t("projects.settings.backlog_sharing.options.share_sprints"), + selected: model.sprint_sharing.in?(SHARING_SCOPE_OPTIONS) + ) + SHARING_OPTIONS.each do |option| list.option( value: option, - label: I18n.t("projects.settings.backlog_sharing.options.#{option}", default: option.humanize), + label: I18n.t("projects.settings.backlog_sharing.options.#{option}"), selected: option == model.sprint_sharing ) end end + f.radio_button_group( + name: :sprint_sharing, + label: I18n.t("projects.settings.backlog_sharing.sharing_scope"), + # Would have been nicer to use `hidden:` here, but that hides the component wrapper, + # while the stimulus `effect` target is bound to the inner fieldset, because `data:` + # is forwarded there. Since the hidden state and the stimulus `effect` target end up + # on different elements, stimulus cannot unhide the fieldset reliably. + # Using `class: "d-none"` ends up on the same fieldset as the stimulus `effect` target. + # One advantage of the `effect` target being on the fieldset is that, disabling the + # fieldset will also disable the radio buttons inside it. + class: ("d-none" if model.sprint_sharing.in?(SHARING_OPTIONS)), + data: { + target_name: "sprint_sharing_scope", + value: "", + visibility_class: "d-none", + "show-when-value-selected-target": "effect" + } + ) do |group| + SHARING_SCOPE_OPTIONS.each do |option| + group.radio_button( + value: option, + checked: option == model.sprint_sharing, + label: I18n.t("projects.settings.backlog_sharing.options.#{option}"), + caption: I18n.t("projects.settings.backlog_sharing.options.#{option}_caption") + ) + end + end + f.submit( name: :submit, label: I18n.t("button_save"), diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index 48b6c09dd71..2da70ee4397 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -192,6 +192,18 @@ en: project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + share_sprints: "Share sprints" + no_sharing: "Don't share" + receive_shared: "Receive shared sprints" + share_all_projects: "All projects" + share_all_projects_caption: "Sprints created in this project will be available to all projects in this instance" + share_subprojects: "Subprojects" + share_subprojects_caption: "Sprints created in this project will be available to all subprojects of the current project" + sharing_scope: "Sharing scope" rb_burndown_charts: show: blankslate_title: "No burndown data available" From 617c83a558115a8eb69d57a27df45568a6c70bea Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 20 Feb 2026 19:05:41 +0200 Subject: [PATCH 262/334] Add integration spec and pre-select the all projects when sharing is chosen. --- .../settings/backlogs/sharing_form.rb | 7 +- .../settings/backlog_sharing_settings_spec.rb | 120 ++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb diff --git a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb index 920f1d88497..083cd511c9b 100644 --- a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb +++ b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb @@ -80,7 +80,7 @@ module Projects SHARING_SCOPE_OPTIONS.each do |option| group.radio_button( value: option, - checked: option == model.sprint_sharing, + checked: checked?(option), label: I18n.t("projects.settings.backlog_sharing.options.#{option}"), caption: I18n.t("projects.settings.backlog_sharing.options.#{option}_caption") ) @@ -93,6 +93,11 @@ module Projects scheme: :primary ) end + + def checked?(option) + option == model.sprint_sharing || + (option == "share_all_projects" && !model.sprint_sharing.in?(SHARING_SCOPE_OPTIONS)) + end end end end diff --git a/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb b/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb new file mode 100644 index 00000000000..e9ad689b932 --- /dev/null +++ b/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb @@ -0,0 +1,120 @@ +# 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 "Backlogs project settings sprint sharing", :js do + let(:project) { create(:project) } + let(:permissions) { %i[create_sprints share_sprint] } + + let(:current_user) do + create(:user, member_with_permissions: { project => permissions }) + end + + before do + login_as current_user + end + + context "with share_sprint permission" do + it "displays and stores sprint sharing settings" do + visit project_settings_backlog_sharing_path(project) + + expect(page).to have_link( + "Sharing", + href: project_settings_backlog_sharing_path(project) + ) + + # have all the options in the select with No sharing as default + expect(page).to have_select( + Project.human_attribute_name(:sprint_sharing), + with_options: [ + I18n.t("projects.settings.backlog_sharing.options.share_sprints"), + I18n.t("projects.settings.backlog_sharing.options.no_sharing"), + I18n.t("projects.settings.backlog_sharing.options.receive_shared") + ], + selected: I18n.t("projects.settings.backlog_sharing.options.no_sharing") + ) + + expect(page).to have_no_checked_field( + I18n.t("projects.settings.backlog_sharing.options.share_subprojects"), + visible: :visible + ) + + # persists receive_shared + select( + I18n.t("projects.settings.backlog_sharing.options.receive_shared"), + from: Project.human_attribute_name(:sprint_sharing) + ) + + click_button I18n.t("button_save") + + expect_and_dismiss_flash(type: :success, message: I18n.t(:notice_successful_update)) + expect(page).to have_select( + Project.human_attribute_name(:sprint_sharing), + selected: I18n.t("projects.settings.backlog_sharing.options.receive_shared") + ) + expect(project.reload.sprint_sharing).to eq("receive_shared") + + # persists share_subprojects + select( + I18n.t("projects.settings.backlog_sharing.options.share_sprints"), + from: Project.human_attribute_name(:sprint_sharing) + ) + + # share_all_projects is automatically checked when share_sprints is selected + expect(page) + .to have_checked_field( + I18n.t("projects.settings.backlog_sharing.options.share_all_projects") + ) + + choose(I18n.t("projects.settings.backlog_sharing.options.share_subprojects")) + click_button I18n.t("button_save") + + expect_and_dismiss_flash(type: :success, message: I18n.t(:notice_successful_update)) + expect(page).to have_checked_field(I18n.t("projects.settings.backlog_sharing.options.share_subprojects")) + expect(project.reload.sprint_sharing).to eq("share_subprojects") + end + end + + context "without share_sprint permission" do + let(:permissions) { %i[create_sprints] } + + it "does not show the sharing tab and forbids direct route access" do + visit project_settings_backlogs_path(project) + + expect(page).to have_heading(I18n.t(:label_backlogs)) + expect(page).to have_no_link(I18n.t("backlogs.sharing")) + + visit project_settings_backlog_sharing_path(project) + + expect(page).to have_text(I18n.t(:notice_not_authorized)) + end + end +end From 3e3d6989c2e0f38e001f613f88bc834751f9fe6f Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:49:14 +0200 Subject: [PATCH 263/334] Put the backlog sharing settings behind the scrum_projects feature flag. --- .../settings_header_component.html.erb | 2 +- .../settings/backlog_sharings_controller.rb | 6 ++ .../backlog_sharings_controller_spec.rb | 67 +++++++++---------- .../settings/backlog_sharing_settings_spec.rb | 15 ++++- 4 files changed, 51 insertions(+), 39 deletions(-) diff --git a/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb index d6d181fa619..5cec7370cc1 100644 --- a/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb +++ b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb @@ -44,7 +44,7 @@ See COPYRIGHT and LICENSE files for more details. t.with_text { t("backlogs.done_status") } end - if User.current.allowed_in_project?(:share_sprint, project) + if OpenProject::FeatureDecisions.scrum_projects_active? && User.current.allowed_in_project?(:share_sprint, project) tab_nav.with_tab( selected: selected_tab == :sharing, href: project_settings_backlog_sharing_path(project) diff --git a/modules/backlogs/app/controllers/projects/settings/backlog_sharings_controller.rb b/modules/backlogs/app/controllers/projects/settings/backlog_sharings_controller.rb index 850677bbfa2..dc547958a58 100644 --- a/modules/backlogs/app/controllers/projects/settings/backlog_sharings_controller.rb +++ b/modules/backlogs/app/controllers/projects/settings/backlog_sharings_controller.rb @@ -31,6 +31,8 @@ class Projects::Settings::BacklogSharingsController < Projects::SettingsController menu_item :settings_backlogs + before_action :check_scrum_projects_feature_flag + def show; end def update @@ -49,6 +51,10 @@ class Projects::Settings::BacklogSharingsController < Projects::SettingsControll private + def check_scrum_projects_feature_flag + render_404 unless OpenProject::FeatureDecisions.scrum_projects_active? + end + def backlog_settings_params params.expect(project: %i[sprint_sharing]) end diff --git a/modules/backlogs/spec/controllers/projects/settings/backlog_sharings_controller_spec.rb b/modules/backlogs/spec/controllers/projects/settings/backlog_sharings_controller_spec.rb index f0f9c49f241..100e317df11 100644 --- a/modules/backlogs/spec/controllers/projects/settings/backlog_sharings_controller_spec.rb +++ b/modules/backlogs/spec/controllers/projects/settings/backlog_sharings_controller_spec.rb @@ -2,44 +2,35 @@ require "spec_helper" -RSpec.describe Projects::Settings::BacklogSharingsController do +RSpec.describe Projects::Settings::BacklogSharingsController, with_flag: { scrum_projects: true } do shared_let(:user) { create(:admin) } current_user { user } before do - allow(controller).to receive(:set_localization) + visible_relation = instance_double(ActiveRecord::Relation) + allow(Project).to receive(:visible).and_return(visible_relation) + allow(visible_relation).to receive(:find).with(project.identifier).and_return(project) end describe "PATCH #update" do let(:project) { build_stubbed(:project, sprint_sharing: "no_sharing") } + let(:service_result) { ServiceResult.success(result: project) } + let(:update_service) { instance_double(Projects::UpdateService, call: service_result) } before do - visible_relation = instance_double(ActiveRecord::Relation) - allow(Project).to receive(:visible).and_return(visible_relation) - allow(visible_relation).to receive(:find).with(project.identifier).and_return(project) + allow(Projects::UpdateService) + .to receive(:new) + .with(model: project, user:, contract_class: Projects::BacklogSettingsContract) + .and_return(update_service) + + patch :update, params: { project_id: project.identifier, project: project_params } end context "when service call succeeds" do - let(:service_result) { ServiceResult.success(result: project) } - let(:update_service) { instance_double(Projects::UpdateService, call: service_result) } - - before do - allow(Projects::UpdateService) - .to receive(:new) - .with(model: project, user:, contract_class: Projects::BacklogSettingsContract) - .and_return(update_service) - end + let(:project_params) { { sprint_sharing: "share_subprojects", name: "must_be_ignored" } } it "updates sprint sharing and redirects to show", :aggregate_failures do - patch :update, params: { - project_id: project.identifier, - project: { - sprint_sharing: "share_subprojects", - name: "must_be_ignored" - } - } - expect(update_service).to have_received(:call).with( ActionController::Parameters.new("sprint_sharing" => "share_subprojects").permit! ) @@ -50,27 +41,29 @@ RSpec.describe Projects::Settings::BacklogSharingsController do context "when service call fails" do let(:service_result) { ServiceResult.failure(result: project, message: "invalid setting") } - let(:update_service) { instance_double(Projects::UpdateService, call: service_result) } - - before do - allow(Projects::UpdateService) - .to receive(:new) - .with(model: project, user:, contract_class: Projects::BacklogSettingsContract) - .and_return(update_service) - end + let(:project_params) { { sprint_sharing: "invalid_option" } } it "renders show with an error", :aggregate_failures do - patch :update, params: { - project_id: project.identifier, - project: { - sprint_sharing: "invalid_option" - } - } - expect(response).to have_http_status(:unprocessable_entity) expect(response).to render_template("projects/settings/backlog_sharings/show") expect(flash[:error]).to eq I18n.t(:notice_unsuccessful_update_with_reason, reason: "invalid setting") end end end + + context "when scrum_projects feature flag is inactive", with_flag: { scrum_projects: false } do + let(:project) { build_stubbed(:project) } + + it "returns 404 for show" do + get :show, params: { project_id: project.identifier } + + expect(response).to have_http_status(:not_found) + end + + it "returns 404 for update" do + patch :update, params: { project_id: project.identifier, project: { sprint_sharing: "no_sharing" } } + + expect(response).to have_http_status(:not_found) + end + end end diff --git a/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb b/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb index e9ad689b932..0095d3e316a 100644 --- a/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb +++ b/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb @@ -30,7 +30,7 @@ require "rails_helper" -RSpec.describe "Backlogs project settings sprint sharing", :js do +RSpec.describe "Backlogs project settings sprint sharing", :js, with_flag: { scrum_projects: true } do let(:project) { create(:project) } let(:permissions) { %i[create_sprints share_sprint] } @@ -117,4 +117,17 @@ RSpec.describe "Backlogs project settings sprint sharing", :js do expect(page).to have_text(I18n.t(:notice_not_authorized)) end end + + context "when scrum_projects feature flag is inactive", with_flag: { scrum_projects: false } do + it "does not show the sharing tab and returns 404 on direct access" do + visit project_settings_backlogs_path(project) + + expect(page).to have_heading(I18n.t(:label_backlogs)) + expect(page).to have_no_link(I18n.t("backlogs.sharing")) + + visit project_settings_backlog_sharing_path(project) + + expect(page).to have_text(I18n.t(:notice_file_not_found)) + end + end end From cde2ed72c7e14223c135499ea9cda0144212f167 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:33:59 +0200 Subject: [PATCH 264/334] Switch the sharing settings to use all radio buttons, validate unique sprint sharer --- app/models/projects/sprint_sharing.rb | 30 +++++- .../settings/backlogs/sharing_form.rb | 102 +++++++++--------- modules/backlogs/config/locales/en.yml | 28 +++-- .../settings/backlog_sharing_settings_spec.rb | 83 +++++++------- spec/models/projects/sprint_sharing_spec.rb | 54 ++++++++++ 5 files changed, 201 insertions(+), 96 deletions(-) diff --git a/app/models/projects/sprint_sharing.rb b/app/models/projects/sprint_sharing.rb index e51afd6f21a..849beb76a92 100644 --- a/app/models/projects/sprint_sharing.rb +++ b/app/models/projects/sprint_sharing.rb @@ -29,13 +29,22 @@ #++ module Projects::SprintSharing - SPRINT_SHARING_OPTIONS = %w[share_all_projects share_subprojects no_sharing receive_shared].freeze - extend ActiveSupport::Concern + NO_SHARING = "no_sharing" + SHARE_ALL_PROJECTS = "share_all_projects" + SHARE_SUBPROJECTS = "share_subprojects" + RECEIVE_SHARED = "receive_shared" + + SPRINT_SHARING_OPTIONS = [NO_SHARING, SHARE_ALL_PROJECTS, SHARE_SUBPROJECTS, RECEIVE_SHARED].freeze + included do store_attribute :settings, :sprint_sharing, :string + scope :sprint_sharing, ->(value) { where("settings->>'sprint_sharing' = ?", value) } + + validate :validate_sprint_sharer_uniqueness + # TODO: Change the store_attribute_unset_values_fallback_to_default to true in the # config/initializers/store_attribute.rb. # Otherwise defaults set on the setting declaration are not working correctly: @@ -43,7 +52,22 @@ module Projects::SprintSharing # The method getter override below is required to provide the default value. def sprint_sharing - super.presence || "no_sharing" + super.presence || NO_SHARING + end + + def validate_sprint_sharer_uniqueness + if sprint_sharing == SHARE_ALL_PROJECTS && + (sharer = self.class.sprint_sharer) && + sharer != self + + errors.add :sprint_sharing, :share_all_projects_already_taken, name: sharer.name + end + end + end + + class_methods do + def sprint_sharer + sprint_sharing(SHARE_ALL_PROJECTS).first end end end diff --git a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb index 083cd511c9b..3005652ea9e 100644 --- a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb +++ b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb @@ -32,71 +32,75 @@ module Projects module Settings module Backlogs class SharingForm < ApplicationForm - SHARING_OPTIONS = %w(no_sharing receive_shared).freeze - SHARING_SCOPE_OPTIONS = %w(share_all_projects share_subprojects).freeze - - form do |f| - f.select_list( + form do |sharing_form| + sharing_form.radio_button_group( name: :sprint_sharing, - label: Project.human_attribute_name(:sprint_sharing), - input_width: :medium, - data: { - target_name: "sprint_sharing_scope", - "show-when-value-selected-target": "cause" - } - ) do |list| - list.option( - value: nil, - label: I18n.t("projects.settings.backlog_sharing.options.share_sprints"), - selected: model.sprint_sharing.in?(SHARING_SCOPE_OPTIONS) - ) - SHARING_OPTIONS.each do |option| - list.option( - value: option, - label: I18n.t("projects.settings.backlog_sharing.options.#{option}"), - selected: option == model.sprint_sharing - ) - end - end - - f.radio_button_group( - name: :sprint_sharing, - label: I18n.t("projects.settings.backlog_sharing.sharing_scope"), - # Would have been nicer to use `hidden:` here, but that hides the component wrapper, - # while the stimulus `effect` target is bound to the inner fieldset, because `data:` - # is forwarded there. Since the hidden state and the stimulus `effect` target end up - # on different elements, stimulus cannot unhide the fieldset reliably. - # Using `class: "d-none"` ends up on the same fieldset as the stimulus `effect` target. - # One advantage of the `effect` target being on the fieldset is that, disabling the - # fieldset will also disable the radio buttons inside it. - class: ("d-none" if model.sprint_sharing.in?(SHARING_OPTIONS)), - data: { - target_name: "sprint_sharing_scope", - value: "", - visibility_class: "d-none", - "show-when-value-selected-target": "effect" - } + label: I18n.t("projects.settings.backlog_sharing.sprint_sharing") ) do |group| - SHARING_SCOPE_OPTIONS.each do |option| + Project::SPRINT_SHARING_OPTIONS.each do |option| group.radio_button( + label: I18n.t("projects.settings.backlog_sharing.options.#{option}.label"), value: option, checked: checked?(option), - label: I18n.t("projects.settings.backlog_sharing.options.#{option}"), - caption: I18n.t("projects.settings.backlog_sharing.options.#{option}_caption") + disabled: disabled?(option), + caption: caption_for(option), + data: { "show-when-value-selected-target": "cause" } ) end end - f.submit( + sharing_form.html_content { banner_for(Project::SHARE_SUBPROJECTS, type: :info) } + sharing_form.html_content { banner_for(Project::RECEIVE_SHARED, type: :warning) } + + sharing_form.submit( name: :submit, label: I18n.t("button_save"), scheme: :primary ) end + private + def checked?(option) - option == model.sprint_sharing || - (option == "share_all_projects" && !model.sprint_sharing.in?(SHARING_SCOPE_OPTIONS)) + option == model.sprint_sharing + end + + def disabled?(option) + option == Project::SHARE_ALL_PROJECTS && share_all_projects_disabled? + end + + def caption_for(option) + if disabled?(option) + I18n.t( + "projects.settings.backlog_sharing.options.#{option}.disabled_caption", + name: sprint_sharer.name + ) + else + I18n.t("projects.settings.backlog_sharing.options.#{option}.caption") + end + end + + def share_all_projects_disabled? + sprint_sharer && sprint_sharer != model + end + + def sprint_sharer + @sprint_sharer ||= Project.sprint_sharer + end + + def banner_for(option, type: :info) + banner_arguments = + type == :warning ? { scheme: :warning } : { icon: :info } + + render(Primer::BaseComponent.new( + tag: :div, + hidden: model.sprint_sharing != option, + data: { value: option, "show-when-value-selected-target": "effect" } + )) do + render(Primer::Alpha::Banner.new(**banner_arguments)) do + I18n.t("projects.settings.backlog_sharing.options.#{option}.#{type}") + end + end end end end diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index 2da70ee4397..0ba1c467ef9 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -51,6 +51,10 @@ en: errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." work_package: attributes: blocks_ids: @@ -196,14 +200,22 @@ en: settings: backlog_sharing: options: - share_sprints: "Share sprints" - no_sharing: "Don't share" - receive_shared: "Receive shared sprints" - share_all_projects: "All projects" - share_all_projects_caption: "Sprints created in this project will be available to all projects in this instance" - share_subprojects: "Subprojects" - share_subprojects_caption: "Sprints created in this project will be available to all subprojects of the current project" - sharing_scope: "Sharing scope" + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. If any were created in this project in the past, they will not be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb b/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb index 0095d3e316a..82097c4abc8 100644 --- a/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb +++ b/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb @@ -51,55 +51,66 @@ RSpec.describe "Backlogs project settings sprint sharing", :js, with_flag: { scr href: project_settings_backlog_sharing_path(project) ) - # have all the options in the select with No sharing as default - expect(page).to have_select( - Project.human_attribute_name(:sprint_sharing), - with_options: [ - I18n.t("projects.settings.backlog_sharing.options.share_sprints"), - I18n.t("projects.settings.backlog_sharing.options.no_sharing"), - I18n.t("projects.settings.backlog_sharing.options.receive_shared") - ], - selected: I18n.t("projects.settings.backlog_sharing.options.no_sharing") - ) + # all radio buttons are present with no_sharing checked by default + expect(page).to have_checked_field("Don't share") + expect(page).to have_unchecked_field("All projects") + expect(page).to have_unchecked_field("Subprojects") + expect(page).to have_unchecked_field("Receive shared sprints") - expect(page).to have_no_checked_field( - I18n.t("projects.settings.backlog_sharing.options.share_subprojects"), - visible: :visible - ) + # no banners visible by default + expect(page).to have_no_text(I18n.t("projects.settings.backlog_sharing.options.share_subprojects.info")) + expect(page).to have_no_text(I18n.t("projects.settings.backlog_sharing.options.receive_shared.warning")) + + # selecting share_subprojects shows its info banner + choose("Subprojects") + expect(page).to have_text(I18n.t("projects.settings.backlog_sharing.options.share_subprojects.info")) + expect(page).to have_no_text(I18n.t("projects.settings.backlog_sharing.options.receive_shared.warning")) + + # selecting receive_shared shows its warning banner + choose("Receive shared sprints") + expect(page).to have_text(I18n.t("projects.settings.backlog_sharing.options.receive_shared.warning")) + expect(page).to have_no_text(I18n.t("projects.settings.backlog_sharing.options.share_subprojects.info")) # persists receive_shared - select( - I18n.t("projects.settings.backlog_sharing.options.receive_shared"), - from: Project.human_attribute_name(:sprint_sharing) - ) - click_button I18n.t("button_save") expect_and_dismiss_flash(type: :success, message: I18n.t(:notice_successful_update)) - expect(page).to have_select( - Project.human_attribute_name(:sprint_sharing), - selected: I18n.t("projects.settings.backlog_sharing.options.receive_shared") - ) + expect(page).to have_checked_field("Receive shared sprints") expect(project.reload.sprint_sharing).to eq("receive_shared") - # persists share_subprojects - select( - I18n.t("projects.settings.backlog_sharing.options.share_sprints"), - from: Project.human_attribute_name(:sprint_sharing) - ) + # keeps the banner visible after persisting + expect(page).to have_text(I18n.t("projects.settings.backlog_sharing.options.receive_shared.warning")) + expect(page).to have_no_text(I18n.t("projects.settings.backlog_sharing.options.share_subprojects.info")) - # share_all_projects is automatically checked when share_sprints is selected - expect(page) - .to have_checked_field( - I18n.t("projects.settings.backlog_sharing.options.share_all_projects") - ) + # selecting no_sharing hides all banners + choose("Don't share") + expect(page).to have_no_text(I18n.t("projects.settings.backlog_sharing.options.share_subprojects.info")) + expect(page).to have_no_text(I18n.t("projects.settings.backlog_sharing.options.receive_shared.warning")) - choose(I18n.t("projects.settings.backlog_sharing.options.share_subprojects")) + # persists no_sharing click_button I18n.t("button_save") expect_and_dismiss_flash(type: :success, message: I18n.t(:notice_successful_update)) - expect(page).to have_checked_field(I18n.t("projects.settings.backlog_sharing.options.share_subprojects")) - expect(project.reload.sprint_sharing).to eq("share_subprojects") + expect(page).to have_checked_field("Don't share") + expect(project.reload.sprint_sharing).to eq("no_sharing") + + # keeps the banner hidden after persisting + expect(page).to have_no_text(I18n.t("projects.settings.backlog_sharing.options.share_subprojects.info")) + expect(page).to have_no_text(I18n.t("projects.settings.backlog_sharing.options.receive_shared.warning")) + end + + context "when another project already shares with all projects" do + let!(:other_project) { create(:project, name: "Sharer Project", sprint_sharing: "share_all_projects") } + + it "disables the all projects option with an explanation" do + visit project_settings_backlog_sharing_path(project) + + expect(page).to have_field("All projects", disabled: true) + expect(page).to have_text( + I18n.t("projects.settings.backlog_sharing.options.share_all_projects.disabled_caption", + name: other_project.name) + ) + end end end diff --git a/spec/models/projects/sprint_sharing_spec.rb b/spec/models/projects/sprint_sharing_spec.rb index c5bf3e2b236..88d9218afae 100644 --- a/spec/models/projects/sprint_sharing_spec.rb +++ b/spec/models/projects/sprint_sharing_spec.rb @@ -28,4 +28,58 @@ RSpec.describe Projects::SprintSharing do expect(project.reload.sprint_sharing).to eq("share_subprojects") end end + + describe ".sprint_sharer" do + context "when no project shares with all projects" do + it "returns nil" do + expect(Project.sprint_sharer).to be_nil + end + end + + context "when a project shares with all projects" do + before { project.update!(sprint_sharing: "share_all_projects") } + + it "returns that project" do + expect(Project.sprint_sharer).to eq(project) + end + end + end + + describe "#validate_sprint_sharer_uniqueness" do + context "when no other project shares with all projects" do + it "allows setting share_all_projects" do + project.sprint_sharing = "share_all_projects" + + expect(project).to be_valid + end + end + + context "when the project already has share_all_projects" do + before { project.update!(sprint_sharing: "share_all_projects") } + + it "remains valid on re-save" do + expect(project.reload).to be_valid + end + end + + context "when another project already shares with all projects" do + let!(:other_project) { create(:project, sprint_sharing: "share_all_projects") } + + it "is invalid" do + project.sprint_sharing = "share_all_projects" + + expect(project).not_to be_valid + expect(project.errors[:sprint_sharing]).to include( + I18n.t("activerecord.errors.models.project.attributes.sprint_sharing.share_all_projects_already_taken", + name: other_project.name) + ) + end + + it "allows other sharing options" do + project.sprint_sharing = "share_subprojects" + + expect(project).to be_valid + end + end + end end From 74b2ff89d6d0a21d3cd0b037805cb1b6adb8ec77 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 27 Feb 2026 16:41:28 +0200 Subject: [PATCH 265/334] Remove sharing enum from sprints --- ...60227143618_remove_sharing_from_sprints.rb | 39 +++++++++++++++++++ modules/backlogs/app/models/agile/sprint.rb | 13 ------- .../backlogs/spec/models/agile/sprint_spec.rb | 9 ----- 3 files changed, 39 insertions(+), 22 deletions(-) create mode 100644 db/migrate/20260227143618_remove_sharing_from_sprints.rb diff --git a/db/migrate/20260227143618_remove_sharing_from_sprints.rb b/db/migrate/20260227143618_remove_sharing_from_sprints.rb new file mode 100644 index 00000000000..7ee5abbb9db --- /dev/null +++ b/db/migrate/20260227143618_remove_sharing_from_sprints.rb @@ -0,0 +1,39 @@ +# 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. +#++ + +class RemoveSharingFromSprints < ActiveRecord::Migration[8.1] + def up + remove_column :sprints, :sharing + end + + def down + add_column :sprints, :sharing, :string, null: false, default: "none" + end +end diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 8905ffd709d..d77b660852e 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -56,16 +56,6 @@ module Agile default: "in_planning", validate: true - enum :sharing, - { - none: "none", - descendants: "descendants", - system: "system" - }, - default: "none", - prefix: :sharing_with, - validate: true - validates :name, presence: true validates :project, presence: true validates :start_date, presence: true @@ -76,9 +66,6 @@ module Agile validate :validate_only_one_active_sprint_per_project - # TODO: validate sharing is set to an allowed value, e.g. only admins may share systemwide (#71374, #71253) - # TODO: implement sharing logic once it has been defined (#71374) - def date_range_set? start_date? && finish_date? end diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/agile/sprint_spec.rb index 8aef9d36833..5ce79972dea 100644 --- a/modules/backlogs/spec/models/agile/sprint_spec.rb +++ b/modules/backlogs/spec/models/agile/sprint_spec.rb @@ -46,7 +46,6 @@ RSpec.describe Agile::Sprint do it { is_expected.to validate_presence_of(:finish_date) } it { is_expected.to validate_presence_of(:project) } it { is_expected.to validate_inclusion_of(:status).in_array(described_class.statuses.keys) } - it { is_expected.to validate_inclusion_of(:sharing).in_array(described_class.sharings.keys) } it "validates finish_date is after or equal to start_date" do sprint.finish_date = sprint.start_date - 1.day @@ -113,14 +112,6 @@ RSpec.describe Agile::Sprint do it "status defaults to in_planning" do expect(sprint).to be_in_planning end - - it "has sharing enum with correct values" do - expect(described_class.sharings.keys).to contain_exactly("none", "descendants", "system") - end - - it "sharing defaults to none" do - expect(sprint).to be_sharing_with_none - end end describe "associations" do From c1022e292a51f2391f0d7c5e1d2f7f8c0f7154b0 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 27 Feb 2026 16:42:32 +0200 Subject: [PATCH 266/334] Add Agile::Sprint.for_project method to retrieve sprints displayed in a project. --- modules/backlogs/app/models/agile/sprint.rb | 2 +- .../backlogs/spec/models/agile/sprint_spec.rb | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index d77b660852e..8910d36ed92 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -38,7 +38,7 @@ module Agile belongs_to :project has_many :work_packages, dependent: :nullify - scope :for_project, ->(project) { where(project:) } + scope :for_project, ->(project) { where(project_id: [project, Project.sprint_sharer]) } scope :not_completed, -> { !completed } scope :order_by_date, -> do order(arel_table[:start_date].asc.nulls_last, diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/agile/sprint_spec.rb index 5ce79972dea..2443d696fc0 100644 --- a/modules/backlogs/spec/models/agile/sprint_spec.rb +++ b/modules/backlogs/spec/models/agile/sprint_spec.rb @@ -114,6 +114,31 @@ RSpec.describe Agile::Sprint do end end + describe ".for_project" do + let!(:sprint_in_project) { create(:agile_sprint, project:) } + let(:other_project) { create(:project) } + let!(:sprint_in_other_project) { create(:agile_sprint, project: other_project) } + + context "when no sprint sharer project exists" do + it "returns only sprints belonging to the given project" do + expect(described_class.for_project(project)).to contain_exactly(sprint_in_project) + end + end + + context "when a sprint sharer project exists" do + let(:sharer_project) { create(:project, sprint_sharing: "share_all_projects") } + let!(:shared_sprint) { create(:agile_sprint, project: sharer_project) } + + it "returns sprints from both the given project and the sharer project" do + expect(described_class.for_project(project)).to contain_exactly(sprint_in_project, shared_sprint) + end + + it "does not return sprints from unrelated projects" do + expect(described_class.for_project(project)).not_to include(sprint_in_other_project) + end + end + end + describe "associations" do it { is_expected.to have_many(:work_packages).dependent(:nullify) } it { is_expected.to belong_to(:project) } From 6d8947b4bf7bb4aca26007ec934faa42f81e323b Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 27 Feb 2026 21:15:34 +0200 Subject: [PATCH 267/334] Add sprint sharing scopes, predicates and receive_sprints_from --- app/models/projects/sprint_sharing.rb | 39 +++++- modules/backlogs/app/models/agile/sprint.rb | 2 +- .../backlogs/spec/models/agile/sprint_spec.rb | 1 + spec/models/projects/sprint_sharing_spec.rb | 125 ++++++++++++++++++ 4 files changed, 165 insertions(+), 2 deletions(-) diff --git a/app/models/projects/sprint_sharing.rb b/app/models/projects/sprint_sharing.rb index 849beb76a92..4514448d4fb 100644 --- a/app/models/projects/sprint_sharing.rb +++ b/app/models/projects/sprint_sharing.rb @@ -42,6 +42,10 @@ module Projects::SprintSharing store_attribute :settings, :sprint_sharing, :string scope :sprint_sharing, ->(value) { where("settings->>'sprint_sharing' = ?", value) } + scope :share_sprints_with_all_projects, -> { sprint_sharing(SHARE_ALL_PROJECTS) } + scope :share_sprints_with_subprojects, -> { sprint_sharing(SHARE_SUBPROJECTS) } + scope :receive_shared_sprints, -> { sprint_sharing(RECEIVE_SHARED) } + scope :not_sharing_sprints, -> { sprint_sharing(NO_SHARING) } validate :validate_sprint_sharer_uniqueness @@ -55,6 +59,39 @@ module Projects::SprintSharing super.presence || NO_SHARING end + def share_sprints_with_all_projects? + sprint_sharing == SHARE_ALL_PROJECTS + end + + def share_sprints_with_subprojects? + sprint_sharing == SHARE_SUBPROJECTS + end + + def receive_shared_sprints? + sprint_sharing == RECEIVE_SHARED + end + + def not_sharing_sprints? + sprint_sharing == NO_SHARING + end + + def receive_sprints_from + # If there are multiple projects from which a receiving project could take its sprints + # the order of priority is as follows (lowest to highest priority): + # => All projects sharing + # => Subproject sharing higher up the ancestor chain + case sprint_sharing + when NO_SHARING, nil + [self] + when RECEIVE_SHARED, SHARE_SUBPROJECTS + [self, ancestors.share_sprints_with_subprojects.last || self.class.sprint_sharer].compact + when SHARE_ALL_PROJECTS + [self, ancestors.share_sprints_with_subprojects.last].compact + end + end + + private + def validate_sprint_sharer_uniqueness if sprint_sharing == SHARE_ALL_PROJECTS && (sharer = self.class.sprint_sharer) && @@ -67,7 +104,7 @@ module Projects::SprintSharing class_methods do def sprint_sharer - sprint_sharing(SHARE_ALL_PROJECTS).first + share_sprints_with_all_projects.first end end end diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 8910d36ed92..93c01d91874 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -38,7 +38,7 @@ module Agile belongs_to :project has_many :work_packages, dependent: :nullify - scope :for_project, ->(project) { where(project_id: [project, Project.sprint_sharer]) } + scope :for_project, ->(project) { where(project: project.receive_sprints_from) } scope :not_completed, -> { !completed } scope :order_by_date, -> do order(arel_table[:start_date].asc.nulls_last, diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/agile/sprint_spec.rb index 2443d696fc0..ce3f70a9fc5 100644 --- a/modules/backlogs/spec/models/agile/sprint_spec.rb +++ b/modules/backlogs/spec/models/agile/sprint_spec.rb @@ -126,6 +126,7 @@ RSpec.describe Agile::Sprint do end context "when a sprint sharer project exists" do + let(:project) { create(:project, sprint_sharing: "receive_shared") } let(:sharer_project) { create(:project, sprint_sharing: "share_all_projects") } let!(:shared_sprint) { create(:agile_sprint, project: sharer_project) } diff --git a/spec/models/projects/sprint_sharing_spec.rb b/spec/models/projects/sprint_sharing_spec.rb index 88d9218afae..34021901273 100644 --- a/spec/models/projects/sprint_sharing_spec.rb +++ b/spec/models/projects/sprint_sharing_spec.rb @@ -29,6 +29,66 @@ RSpec.describe Projects::SprintSharing do end end + describe "scopes" do + let!(:no_sharing_project) { create(:project, sprint_sharing: "no_sharing") } + let!(:all_projects_sharer) { create(:project, sprint_sharing: "share_all_projects") } + let!(:subprojects_sharer) { create(:project, sprint_sharing: "share_subprojects") } + let!(:receiver) { create(:project, sprint_sharing: "receive_shared") } + + describe ".share_sprints_with_all_projects" do + it "returns projects that share with all projects" do + expect(Project.share_sprints_with_all_projects).to contain_exactly(all_projects_sharer) + end + end + + describe ".share_sprints_with_subprojects" do + it "returns projects that share with subprojects" do + expect(Project.share_sprints_with_subprojects).to contain_exactly(subprojects_sharer) + end + end + + describe ".receive_shared_sprints" do + it "returns projects that receive shared sprints" do + expect(Project.receive_shared_sprints).to contain_exactly(receiver) + end + end + + describe ".not_sharing_sprints" do + it "returns projects with no sharing" do + expect(Project.not_sharing_sprints).to contain_exactly(no_sharing_project) + end + end + end + + describe "predicate methods" do + it "#share_sprints_with_all_projects? returns true when sharing with all projects" do + project.sprint_sharing = "share_all_projects" + expect(project).to be_share_sprints_with_all_projects + end + + it "#share_sprints_with_subprojects? returns true when sharing with subprojects" do + project.sprint_sharing = "share_subprojects" + expect(project).to be_share_sprints_with_subprojects + end + + it "#receive_shared_sprints? returns true when receiving shared sprints" do + project.sprint_sharing = "receive_shared" + expect(project).to be_receive_shared_sprints + end + + it "#not_sharing_sprints? returns true when not sharing (default)" do + expect(project).to be_not_sharing_sprints + end + + it "predicates return false for non-matching values" do + project.sprint_sharing = "share_subprojects" + + expect(project).not_to be_share_sprints_with_all_projects + expect(project).not_to be_receive_shared_sprints + expect(project).not_to be_not_sharing_sprints + end + end + describe ".sprint_sharer" do context "when no project shares with all projects" do it "returns nil" do @@ -82,4 +142,69 @@ RSpec.describe Projects::SprintSharing do end end end + + describe "#receive_sprints_from" do + let(:global_sprint_sharing) { "no_sharing" } + let(:root_sprint_sharing) { "no_sharing" } + let(:parent_sprint_sharing) { "no_sharing" } + let(:project_sprint_sharing) { "no_sharing" } + + let!(:global_sharer) { create(:project, sprint_sharing: global_sprint_sharing) } + let!(:root_project) { create(:project, sprint_sharing: root_sprint_sharing) } + let!(:parent_project) { create(:project, parent: root_project, sprint_sharing: parent_sprint_sharing) } + let!(:project) { create(:project, parent: parent_project, sprint_sharing: project_sprint_sharing) } + + context "when sprint_sharing is no_sharing (default)" do + let(:global_sprint_sharing) { "share_all_projects" } + let(:root_sprint_sharing) { "share_subprojects" } + let(:parent_sprint_sharing) { "share_subprojects" } + let(:project_sprint_sharing) { "no_sharing" } + + it "returns only itself" do + expect(project.receive_sprints_from).to eq([project]) + end + end + + shared_examples "returns itself and the closest sharer" do + context "with only a global sharer" do + let(:global_sprint_sharing) { "share_all_projects" } + + it "returns itself and the global sharer" do + expect(project.receive_sprints_from).to eq([project, global_sharer]) + end + end + + context "with a global sharer and both ancestors sharing subprojects" do + let(:global_sprint_sharing) { "share_all_projects" } + let(:root_sprint_sharing) { "share_subprojects" } + let(:parent_sprint_sharing) { "share_subprojects" } + + it "returns itself and the closest sharing ancestor" do + expect(project.receive_sprints_from).to eq([project, parent_project]) + end + end + end + + context "when sprint_sharing is receive_shared" do + let(:project_sprint_sharing) { "receive_shared" } + + it_behaves_like "returns itself and the closest sharer" + end + + context "when sprint_sharing is share_subprojects" do + let(:project_sprint_sharing) { "share_subprojects" } + + it_behaves_like "returns itself and the closest sharer" + end + + context "when sprint_sharing is share_all_projects" do + let(:root_sprint_sharing) { "share_subprojects" } + let(:parent_sprint_sharing) { "no_sharing" } + let(:project_sprint_sharing) { "share_all_projects" } + + it "returns itself and the root sharer" do + expect(project.receive_sprints_from).to eq([project, root_project]) + end + end + end end From f85df21906e148c2ac133c8a6733651bdb672b20 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 2 Mar 2026 20:54:30 +0200 Subject: [PATCH 268/334] Update project sharing logic to restrict sprint sharer (sender) project to send and receivers to receive only. --- app/models/projects/sprint_sharing.rb | 17 ++-- modules/backlogs/app/models/agile/sprint.rb | 9 +- .../backlogs/spec/models/agile/sprint_spec.rb | 55 ++++++++--- spec/models/projects/sprint_sharing_spec.rb | 96 ++++++++++++------- 4 files changed, 122 insertions(+), 55 deletions(-) diff --git a/app/models/projects/sprint_sharing.rb b/app/models/projects/sprint_sharing.rb index 4514448d4fb..d2c854e9930 100644 --- a/app/models/projects/sprint_sharing.rb +++ b/app/models/projects/sprint_sharing.rb @@ -76,17 +76,14 @@ module Projects::SprintSharing end def receive_sprints_from - # If there are multiple projects from which a receiving project could take its sprints - # the order of priority is as follows (lowest to highest priority): - # => All projects sharing - # => Subproject sharing higher up the ancestor chain + # Senders and non-sharing projects only see their own sprints. + # Receivers see external sprints from the closest ancestor sharing + # subprojects, falling back to the global sharer. case sprint_sharing - when NO_SHARING, nil + when nil, NO_SHARING, SHARE_SUBPROJECTS, SHARE_ALL_PROJECTS [self] - when RECEIVE_SHARED, SHARE_SUBPROJECTS - [self, ancestors.share_sprints_with_subprojects.last || self.class.sprint_sharer].compact - when SHARE_ALL_PROJECTS - [self, ancestors.share_sprints_with_subprojects.last].compact + when RECEIVE_SHARED + [ancestors.share_sprints_with_subprojects.last || self.class.sprint_sharer].compact end end @@ -104,7 +101,7 @@ module Projects::SprintSharing class_methods do def sprint_sharer - share_sprints_with_all_projects.first + share_sprints_with_all_projects.active.first end end end diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 93c01d91874..444460aad46 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -38,7 +38,14 @@ module Agile belongs_to :project has_many :work_packages, dependent: :nullify - scope :for_project, ->(project) { where(project: project.receive_sprints_from) } + scope :for_project, ->(project) do + # Ideally the project.work_packages scope would be used, but unfortunately + # it has some extra includes that are not necessary in this case. + from_work_packages = WorkPackage.where(project:).where.not(sprint_id: nil) + + where(project: project.receive_sprints_from) + .or(where(id: from_work_packages.select(:sprint_id))) + end scope :not_completed, -> { !completed } scope :order_by_date, -> do order(arel_table[:start_date].asc.nulls_last, diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/agile/sprint_spec.rb index ce3f70a9fc5..e05b57c8769 100644 --- a/modules/backlogs/spec/models/agile/sprint_spec.rb +++ b/modules/backlogs/spec/models/agile/sprint_spec.rb @@ -115,27 +115,60 @@ RSpec.describe Agile::Sprint do end describe ".for_project" do - let!(:sprint_in_project) { create(:agile_sprint, project:) } + let(:global_sharer) { create(:project, sprint_sharing: "share_all_projects") } let(:other_project) { create(:project) } + let!(:sprint_in_project) { create(:agile_sprint, project:) } + let!(:global_sprint) { create(:agile_sprint, project: global_sharer) } let!(:sprint_in_other_project) { create(:agile_sprint, project: other_project) } - context "when no sprint sharer project exists" do - it "returns only sprints belonging to the given project" do - expect(described_class.for_project(project)).to contain_exactly(sprint_in_project) + context "when the project does not receive sprints" do + context "and no work package assignments exist" do + it "returns own sprint only" do + expect(described_class.for_project(project)).to contain_exactly(sprint_in_project) + end + end + + context "when the project has work packages assigned to a sprint from another project" do + let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } + let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } + + it "returns the sprint via work package assignment too" do + expect(described_class.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) + end + + context "when the cross-project sprint is completed" do + let!(:completed_sprint) { create(:agile_sprint, project: other_project, status: "completed") } + let!(:work_package) { create(:work_package, project:, sprint: completed_sprint) } + + it "still includes the completed sprint" do + expect(described_class.for_project(project)).to include(completed_sprint) + end + end end end - context "when a sprint sharer project exists" do + context "when the project receives shared sprints" do let(:project) { create(:project, sprint_sharing: "receive_shared") } - let(:sharer_project) { create(:project, sprint_sharing: "share_all_projects") } - let!(:shared_sprint) { create(:agile_sprint, project: sharer_project) } - it "returns sprints from both the given project and the sharer project" do - expect(described_class.for_project(project)).to contain_exactly(sprint_in_project, shared_sprint) + it "returns shared sprints from the sharer project" do + # The sprint_in_project (own) and sprint_in_other_project are excluded + expect(described_class.for_project(project)).to contain_exactly(global_sprint) end - it "does not return sprints from unrelated projects" do - expect(described_class.for_project(project)).not_to include(sprint_in_other_project) + context "and its own sprint has a work package assigned" do + let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } + + it "includes own sprint and the shared sprint" do + expect(described_class.for_project(project)).to contain_exactly(global_sprint, sprint_in_project) + end + end + + context "when the sprint qualifies through both sharing and work package assignment" do + let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } + + it "returns the sprint exactly once" do + expect(described_class.for_project(project)).to contain_exactly(global_sprint) + end end end end diff --git a/spec/models/projects/sprint_sharing_spec.rb b/spec/models/projects/sprint_sharing_spec.rb index 34021901273..932df8a5c34 100644 --- a/spec/models/projects/sprint_sharing_spec.rb +++ b/spec/models/projects/sprint_sharing_spec.rb @@ -103,6 +103,14 @@ RSpec.describe Projects::SprintSharing do expect(Project.sprint_sharer).to eq(project) end end + + context "when the sharing project is archived" do + before { project.update!(sprint_sharing: "share_all_projects", active: false) } + + it "returns nil" do + expect(Project.sprint_sharer).to be_nil + end + end end describe "#validate_sprint_sharer_uniqueness" do @@ -140,37 +148,71 @@ RSpec.describe Projects::SprintSharing do expect(project).to be_valid end + + context "when the other project is archived" do + let!(:other_project) { create(:project, :archived, sprint_sharing: "share_all_projects") } + + it "remains valid" do + project.sprint_sharing = "share_all_projects" + + expect(project).to be_valid + end + end end end describe "#receive_sprints_from" do - let(:global_sprint_sharing) { "no_sharing" } - let(:root_sprint_sharing) { "no_sharing" } - let(:parent_sprint_sharing) { "no_sharing" } - let(:project_sprint_sharing) { "no_sharing" } + let(:global_sprint_sharing) { "share_all_projects" } + let(:root_sprint_sharing) { "share_subprojects" } + let(:parent_sprint_sharing) { "share_subprojects" } + let(:project_sprint_sharing) { "receive_shared" } let!(:global_sharer) { create(:project, sprint_sharing: global_sprint_sharing) } let!(:root_project) { create(:project, sprint_sharing: root_sprint_sharing) } let!(:parent_project) { create(:project, parent: root_project, sprint_sharing: parent_sprint_sharing) } let!(:project) { create(:project, parent: parent_project, sprint_sharing: project_sprint_sharing) } - context "when sprint_sharing is no_sharing (default)" do - let(:global_sprint_sharing) { "share_all_projects" } - let(:root_sprint_sharing) { "share_subprojects" } - let(:parent_sprint_sharing) { "share_subprojects" } - let(:project_sprint_sharing) { "no_sharing" } + # Projects that should not be returned + shared_let(:other_project) { create(:project, sprint_sharing: "share_subprojects") } + shared_let(:archived_global_sharer) { create(:project, :archived, sprint_sharing: "share_all_projects") } + shared_examples "returns the project itself" do it "returns only itself" do expect(project.receive_sprints_from).to eq([project]) end end - shared_examples "returns itself and the closest sharer" do + context "when sprint_sharing is no_sharing (default)" do + let(:project_sprint_sharing) { "no_sharing" } + + it_behaves_like "returns the project itself" + end + + context "when sprint_sharing is share_subprojects" do + let(:project_sprint_sharing) { "share_subprojects" } + + it_behaves_like "returns the project itself" + end + + context "when sprint_sharing is share_all_projects" do + let(:global_sprint_sharing) { "no_sharing" } + let(:root_sprint_sharing) { "share_subprojects" } + let(:parent_sprint_sharing) { "share_subprojects" } + let(:project_sprint_sharing) { "share_all_projects" } + + it_behaves_like "returns the project itself" + end + + context "when sprint_sharing is receive_shared" do + let(:project_sprint_sharing) { "receive_shared" } + context "with only a global sharer" do let(:global_sprint_sharing) { "share_all_projects" } + let(:root_sprint_sharing) { "no_sharing" } + let(:parent_sprint_sharing) { "no_sharing" } - it "returns itself and the global sharer" do - expect(project.receive_sprints_from).to eq([project, global_sharer]) + it "returns only the global sharer" do + expect(project.receive_sprints_from).to eq([global_sharer]) end end @@ -179,31 +221,19 @@ RSpec.describe Projects::SprintSharing do let(:root_sprint_sharing) { "share_subprojects" } let(:parent_sprint_sharing) { "share_subprojects" } - it "returns itself and the closest sharing ancestor" do - expect(project.receive_sprints_from).to eq([project, parent_project]) + it "returns only the closest sharing ancestor" do + expect(project.receive_sprints_from).to eq([parent_project]) end end - end - context "when sprint_sharing is receive_shared" do - let(:project_sprint_sharing) { "receive_shared" } + context "with no sharing sources" do + let(:global_sprint_sharing) { "no_sharing" } + let(:root_sprint_sharing) { "no_sharing" } + let(:parent_sprint_sharing) { "no_sharing" } - it_behaves_like "returns itself and the closest sharer" - end - - context "when sprint_sharing is share_subprojects" do - let(:project_sprint_sharing) { "share_subprojects" } - - it_behaves_like "returns itself and the closest sharer" - end - - context "when sprint_sharing is share_all_projects" do - let(:root_sprint_sharing) { "share_subprojects" } - let(:parent_sprint_sharing) { "no_sharing" } - let(:project_sprint_sharing) { "share_all_projects" } - - it "returns itself and the root sharer" do - expect(project.receive_sprints_from).to eq([project, root_project]) + it "returns an empty array" do + expect(project.receive_sprints_from).to eq([]) + end end end end From 4673a87fb4d94f4af424ff8ebdc1df635659a261 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 2 Mar 2026 21:49:43 +0200 Subject: [PATCH 269/334] Move the Projects::SprintSharing concern to the backlogs module. --- app/models/project.rb | 1 - .../app}/models/projects/sprint_sharing.rb | 97 +++++++++---------- .../backlogs/patches/project_patch.rb | 27 +++--- .../models/projects/sprint_sharing_spec.rb | 0 4 files changed, 60 insertions(+), 65 deletions(-) rename {app => modules/backlogs/app}/models/projects/sprint_sharing.rb (59%) rename {spec => modules/backlogs/spec}/models/projects/sprint_sharing_spec.rb (100%) diff --git a/app/models/project.rb b/app/models/project.rb index dfdadb1e063..41fb0312f92 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -40,7 +40,6 @@ class Project < ApplicationRecord include Projects::Versions include Projects::WorkPackageCustomFields include Projects::CreationWizard - include Projects::SprintSharing include ::Scopes::Scoped diff --git a/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb similarity index 59% rename from app/models/projects/sprint_sharing.rb rename to modules/backlogs/app/models/projects/sprint_sharing.rb index d2c854e9930..c99aa126efb 100644 --- a/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -48,55 +48,6 @@ module Projects::SprintSharing scope :not_sharing_sprints, -> { sprint_sharing(NO_SHARING) } validate :validate_sprint_sharer_uniqueness - - # TODO: Change the store_attribute_unset_values_fallback_to_default to true in the - # config/initializers/store_attribute.rb. - # Otherwise defaults set on the setting declaration are not working correctly: - # `store_attribute :settings, :sprint_sharing, :string, default: "no_sharing"`. - # The method getter override below is required to provide the default value. - - def sprint_sharing - super.presence || NO_SHARING - end - - def share_sprints_with_all_projects? - sprint_sharing == SHARE_ALL_PROJECTS - end - - def share_sprints_with_subprojects? - sprint_sharing == SHARE_SUBPROJECTS - end - - def receive_shared_sprints? - sprint_sharing == RECEIVE_SHARED - end - - def not_sharing_sprints? - sprint_sharing == NO_SHARING - end - - def receive_sprints_from - # Senders and non-sharing projects only see their own sprints. - # Receivers see external sprints from the closest ancestor sharing - # subprojects, falling back to the global sharer. - case sprint_sharing - when nil, NO_SHARING, SHARE_SUBPROJECTS, SHARE_ALL_PROJECTS - [self] - when RECEIVE_SHARED - [ancestors.share_sprints_with_subprojects.last || self.class.sprint_sharer].compact - end - end - - private - - def validate_sprint_sharer_uniqueness - if sprint_sharing == SHARE_ALL_PROJECTS && - (sharer = self.class.sprint_sharer) && - sharer != self - - errors.add :sprint_sharing, :share_all_projects_already_taken, name: sharer.name - end - end end class_methods do @@ -104,4 +55,52 @@ module Projects::SprintSharing share_sprints_with_all_projects.active.first end end + + # TODO: Change the store_attribute_unset_values_fallback_to_default to true in the + # config/initializers/store_attribute.rb. + # Otherwise defaults set on the setting declaration are not working correctly: + # `store_attribute :settings, :sprint_sharing, :string, default: "no_sharing"`. + # The method getter override below is required to provide the default value. + def sprint_sharing + super.presence || NO_SHARING + end + + def share_sprints_with_all_projects? + sprint_sharing == SHARE_ALL_PROJECTS + end + + def share_sprints_with_subprojects? + sprint_sharing == SHARE_SUBPROJECTS + end + + def receive_shared_sprints? + sprint_sharing == RECEIVE_SHARED + end + + def not_sharing_sprints? + sprint_sharing == NO_SHARING + end + + def receive_sprints_from + # Senders and non-sharing projects only see their own sprints. + # Receivers see external sprints from the closest ancestor sharing + # subprojects, falling back to the global sharer. + case sprint_sharing + when nil, NO_SHARING, SHARE_SUBPROJECTS, SHARE_ALL_PROJECTS + [self] + when RECEIVE_SHARED + [ancestors.share_sprints_with_subprojects.last || self.class.sprint_sharer].compact + end + end + + private + + def validate_sprint_sharer_uniqueness + if sprint_sharing == SHARE_ALL_PROJECTS && + (sharer = self.class.sprint_sharer) && + sharer != self + + errors.add :sprint_sharing, :share_all_projects_already_taken, name: sharer.name + end + end end diff --git a/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb index f63de9c4b45..9ddee562a10 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb @@ -29,26 +29,23 @@ #++ module OpenProject::Backlogs::Patches::ProjectPatch - def self.included(base) - base.class_eval do - has_and_belongs_to_many :done_statuses, join_table: :done_statuses_for_project, class_name: "::Status" - has_many :sprints, class_name: "Agile::Sprint", dependent: :destroy + extend ActiveSupport::Concern + include Projects::SprintSharing - include InstanceMethods - end + included do + has_and_belongs_to_many :done_statuses, join_table: :done_statuses_for_project, class_name: "::Status" + has_many :sprints, class_name: "Agile::Sprint", dependent: :destroy end - module InstanceMethods - def rebuild_positions - return unless backlogs_enabled? + def rebuild_positions + return unless backlogs_enabled? - shared_versions.each { |v| v.rebuild_story_positions(self) } - nil - end + shared_versions.each { |v| v.rebuild_story_positions(self) } + nil + end - def backlogs_enabled? - module_enabled? "backlogs" - end + def backlogs_enabled? + module_enabled? "backlogs" end end diff --git a/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb similarity index 100% rename from spec/models/projects/sprint_sharing_spec.rb rename to modules/backlogs/spec/models/projects/sprint_sharing_spec.rb From 254c3e01e5d3ef479740fa22e947aa4c1d800d4a Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 3 Mar 2026 13:13:31 +0200 Subject: [PATCH 270/334] Remove unused visibilityClass attribute from OpShowWhenValueSelectedController. --- .../controllers/show-when-value-selected.controller.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/src/stimulus/controllers/show-when-value-selected.controller.ts b/frontend/src/stimulus/controllers/show-when-value-selected.controller.ts index 954bfc9a605..c9513cba00c 100644 --- a/frontend/src/stimulus/controllers/show-when-value-selected.controller.ts +++ b/frontend/src/stimulus/controllers/show-when-value-selected.controller.ts @@ -1,4 +1,4 @@ -import { toggleElement, toggleElementByClass, toggleElementByVisibility } from 'core-app/shared/helpers/dom-helpers'; +import { toggleElement, toggleElementByVisibility } from 'core-app/shared/helpers/dom-helpers'; import { ApplicationController } from 'stimulus-use'; export default class OpShowWhenValueSelectedController extends ApplicationController { @@ -29,8 +29,6 @@ export default class OpShowWhenValueSelectedController extends ApplicationContro if (el.dataset.setVisibility === 'true') { toggleElementByVisibility(el, !disabled); - } else if ('visibilityClass' in el.dataset) { - toggleElementByClass(el, el.dataset.visibilityClass!, !disabled); } else { toggleElement(el, !disabled); } From 105599fa3cf6b45c2219ee52237a94fe99d14175 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Wed, 4 Mar 2026 12:47:48 +0200 Subject: [PATCH 271/334] Remove sprint sharing related code. --- .../services/sprints/set_attributes_service.rb | 5 ++--- .../contracts/sprints/create_contract_spec.rb | 4 +--- .../sprints/set_attributes_service_spec.rb | 16 ---------------- 3 files changed, 3 insertions(+), 22 deletions(-) diff --git a/modules/backlogs/app/services/sprints/set_attributes_service.rb b/modules/backlogs/app/services/sprints/set_attributes_service.rb index 22625e0b759..2ed6d5974c2 100644 --- a/modules/backlogs/app/services/sprints/set_attributes_service.rb +++ b/modules/backlogs/app/services/sprints/set_attributes_service.rb @@ -41,16 +41,15 @@ module Sprints def set_default_attributes(_params) set_sprint_name - set_status_and_sharing + set_default_status end def set_sprint_name model.name ||= sprint_name_from_predecessor end - def set_status_and_sharing + def set_default_status model.status ||= "in_planning" - model.sharing ||= "none" end def next_name_in_succession(predecessor) diff --git a/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb b/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb index 35828129040..f542fac55b7 100644 --- a/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb +++ b/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb @@ -41,14 +41,12 @@ RSpec.describe Sprints::CreateContract do project:, start_date: sprint_start_date, finish_date: sprint_finish_date, - status: sprint_status, - sharing: sprint_sharing) + status: sprint_status) end let(:sprint_name) { "Sprint 1" } let(:sprint_start_date) { Time.zone.today } let(:sprint_finish_date) { Time.zone.today + 14.days } let(:sprint_status) { "in_planning" } - let(:sprint_sharing) { "none" } let(:permissions) { [:create_sprints] } subject(:contract) { described_class.new(sprint, user) } diff --git a/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb index f08152ad0e8..8ef4e349dfa 100644 --- a/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb +++ b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb @@ -138,12 +138,6 @@ RSpec.describe Sprints::SetAttributesService, type: :model do expect(sprint.status).to eq("in_planning") end - it "sets default sharing to none" do - service_call - - expect(sprint.sharing).to eq("none") - end - context "when status is already set" do let(:sprint) { Agile::Sprint.new(status: "active") } @@ -153,16 +147,6 @@ RSpec.describe Sprints::SetAttributesService, type: :model do expect(sprint.status).to eq("active") end end - - context "when sharing is already set" do - let(:sprint) { Agile::Sprint.new(sharing: "descendants") } - - it "does not override the existing sharing" do - service_call - - expect(sprint.sharing).to eq("descendants") - end - end end end From cfb6d4c845a6abef92259a3829e5ab6cac76b2a3 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Thu, 5 Mar 2026 16:16:29 +0200 Subject: [PATCH 272/334] Move backlog migration to the backlogs module --- .../db}/migrate/20260227143618_remove_sharing_from_sprints.rb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {db => modules/backlogs/db}/migrate/20260227143618_remove_sharing_from_sprints.rb (100%) diff --git a/db/migrate/20260227143618_remove_sharing_from_sprints.rb b/modules/backlogs/db/migrate/20260227143618_remove_sharing_from_sprints.rb similarity index 100% rename from db/migrate/20260227143618_remove_sharing_from_sprints.rb rename to modules/backlogs/db/migrate/20260227143618_remove_sharing_from_sprints.rb From 2551e20c12530f765eedf0c041a5b3e2a0e7cd00 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Thu, 5 Mar 2026 19:03:39 +0200 Subject: [PATCH 273/334] Create method SettingsHeaderComponent#selected_tab? --- .../settings/backlogs/settings_header_component.html.erb | 4 ++-- .../projects/settings/backlogs/settings_header_component.rb | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb index 5cec7370cc1..31b3b63e423 100644 --- a/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb +++ b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb @@ -38,7 +38,7 @@ See COPYRIGHT and LICENSE files for more details. header.with_tab_nav(label: nil) do |tab_nav| tab_nav.with_tab( - selected: selected_tab == :done_status, + selected: selected_tab?(:done_status), href: project_settings_backlogs_path(project) ) do |t| t.with_text { t("backlogs.done_status") } @@ -46,7 +46,7 @@ See COPYRIGHT and LICENSE files for more details. if OpenProject::FeatureDecisions.scrum_projects_active? && User.current.allowed_in_project?(:share_sprint, project) tab_nav.with_tab( - selected: selected_tab == :sharing, + selected: selected_tab?(:sharing), href: project_settings_backlog_sharing_path(project) ) do |t| t.with_text { t("backlogs.sharing") } diff --git a/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.rb b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.rb index 4778b02b32c..25892dbb886 100644 --- a/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.rb +++ b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.rb @@ -41,6 +41,10 @@ module Projects @selected_tab = selected_tab end + def selected_tab?(tab_name) + selected_tab == tab_name + end + private attr_reader :project, :selected_tab From 3f2187fa91d07eed6c94dd8b63e6b503aa7dcb54 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Thu, 5 Mar 2026 19:48:03 +0200 Subject: [PATCH 274/334] Dry up sharing form option text translation logic --- .../projects/settings/backlogs/sharing_form.rb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb index 3005652ea9e..f7fdd6b2a61 100644 --- a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb +++ b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb @@ -39,7 +39,7 @@ module Projects ) do |group| Project::SPRINT_SHARING_OPTIONS.each do |option| group.radio_button( - label: I18n.t("projects.settings.backlog_sharing.options.#{option}.label"), + label: sharing_option_text(option, :label), value: option, checked: checked?(option), disabled: disabled?(option), @@ -69,14 +69,15 @@ module Projects option == Project::SHARE_ALL_PROJECTS && share_all_projects_disabled? end + def sharing_option_text(option, key, **) + I18n.t("projects.settings.backlog_sharing.options.#{option}.#{key}", **) + end + def caption_for(option) if disabled?(option) - I18n.t( - "projects.settings.backlog_sharing.options.#{option}.disabled_caption", - name: sprint_sharer.name - ) + sharing_option_text(option, :disabled_caption, name: global_sprint_sharer.name) else - I18n.t("projects.settings.backlog_sharing.options.#{option}.caption") + sharing_option_text(option, :caption) end end @@ -98,7 +99,7 @@ module Projects data: { value: option, "show-when-value-selected-target": "effect" } )) do render(Primer::Alpha::Banner.new(**banner_arguments)) do - I18n.t("projects.settings.backlog_sharing.options.#{option}.#{type}") + sharing_option_text(option, type) end end end From 945d9f0b1939b5ff7f4a07ebd8b2570f4e841231 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 6 Mar 2026 12:52:30 +0200 Subject: [PATCH 275/334] Add Sprint sharing settings index to projects --- ...dex_to_projects_sprint_sharing_settings.rb | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 db/migrate/20260305175656_add_index_to_projects_sprint_sharing_settings.rb diff --git a/db/migrate/20260305175656_add_index_to_projects_sprint_sharing_settings.rb b/db/migrate/20260305175656_add_index_to_projects_sprint_sharing_settings.rb new file mode 100644 index 00000000000..108c65cd1c1 --- /dev/null +++ b/db/migrate/20260305175656_add_index_to_projects_sprint_sharing_settings.rb @@ -0,0 +1,38 @@ +# 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. +#++ + +class AddIndexToProjectsSprintSharingSettings < ActiveRecord::Migration[8.1] + def change + add_index :projects, + "(settings->'sprint_sharing')", + using: :gin, + name: "index_projects_settings_sprint_sharing" + end +end From 5a72eff8fb2be112af0c270a163317ddad9d7e6b Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 6 Mar 2026 12:53:00 +0200 Subject: [PATCH 276/334] Rename Project.sprint_sharer to Project.global_sprint_sharer --- .../forms/projects/settings/backlogs/sharing_form.rb | 6 +++--- modules/backlogs/app/models/projects/sprint_sharing.rb | 10 +++++----- .../spec/models/projects/sprint_sharing_spec.rb | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb index f7fdd6b2a61..e8e1c96eb27 100644 --- a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb +++ b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb @@ -82,11 +82,11 @@ module Projects end def share_all_projects_disabled? - sprint_sharer && sprint_sharer != model + global_sprint_sharer && global_sprint_sharer != model end - def sprint_sharer - @sprint_sharer ||= Project.sprint_sharer + def global_sprint_sharer + @global_sprint_sharer ||= Project.global_sprint_sharer end def banner_for(option, type: :info) diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index c99aa126efb..54e546a41e7 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -47,11 +47,11 @@ module Projects::SprintSharing scope :receive_shared_sprints, -> { sprint_sharing(RECEIVE_SHARED) } scope :not_sharing_sprints, -> { sprint_sharing(NO_SHARING) } - validate :validate_sprint_sharer_uniqueness + validate :validate_global_sprint_sharer_uniqueness end class_methods do - def sprint_sharer + def global_sprint_sharer share_sprints_with_all_projects.active.first end end @@ -89,15 +89,15 @@ module Projects::SprintSharing when nil, NO_SHARING, SHARE_SUBPROJECTS, SHARE_ALL_PROJECTS [self] when RECEIVE_SHARED - [ancestors.share_sprints_with_subprojects.last || self.class.sprint_sharer].compact + [ancestors.share_sprints_with_subprojects.last || self.class.global_sprint_sharer].compact end end private - def validate_sprint_sharer_uniqueness + def validate_global_sprint_sharer_uniqueness if sprint_sharing == SHARE_ALL_PROJECTS && - (sharer = self.class.sprint_sharer) && + (sharer = self.class.global_sprint_sharer) && sharer != self errors.add :sprint_sharing, :share_all_projects_already_taken, name: sharer.name diff --git a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb index 932df8a5c34..a4a0c068c76 100644 --- a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb +++ b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb @@ -89,10 +89,10 @@ RSpec.describe Projects::SprintSharing do end end - describe ".sprint_sharer" do + describe ".global_sprint_sharer" do context "when no project shares with all projects" do it "returns nil" do - expect(Project.sprint_sharer).to be_nil + expect(Project.global_sprint_sharer).to be_nil end end @@ -100,7 +100,7 @@ RSpec.describe Projects::SprintSharing do before { project.update!(sprint_sharing: "share_all_projects") } it "returns that project" do - expect(Project.sprint_sharer).to eq(project) + expect(Project.global_sprint_sharer).to eq(project) end end @@ -108,12 +108,12 @@ RSpec.describe Projects::SprintSharing do before { project.update!(sprint_sharing: "share_all_projects", active: false) } it "returns nil" do - expect(Project.sprint_sharer).to be_nil + expect(Project.global_sprint_sharer).to be_nil end end end - describe "#validate_sprint_sharer_uniqueness" do + describe "#validate_global_sprint_sharer_uniqueness" do context "when no other project shares with all projects" do it "allows setting share_all_projects" do project.sprint_sharing = "share_all_projects" From ca596a9ab0b1af40a3d80a2d8226f0bfe9bdac61 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 6 Mar 2026 12:53:35 +0200 Subject: [PATCH 277/334] Update receive shared option warning message. --- modules/backlogs/config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index 0ba1c467ef9..7b8eec766be 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -206,7 +206,7 @@ en: receive_shared: label: "Receive shared sprints" caption: "This project can only use sprints shared by other projects." - warning: "This project can only use sprints shared by other projects. If any were created in this project in the past, they will not be visible." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." share_all_projects: label: "All projects" caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." From 2520353a93de5892c845299b7454a1a2ca357f7b Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 6 Mar 2026 12:54:25 +0200 Subject: [PATCH 278/334] Simplify Project.receive_sprints_from method --- modules/backlogs/app/models/projects/sprint_sharing.rb | 9 ++++----- .../backlogs/spec/models/projects/sprint_sharing_spec.rb | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index 54e546a41e7..8d177544ee4 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -85,11 +85,10 @@ module Projects::SprintSharing # Senders and non-sharing projects only see their own sprints. # Receivers see external sprints from the closest ancestor sharing # subprojects, falling back to the global sharer. - case sprint_sharing - when nil, NO_SHARING, SHARE_SUBPROJECTS, SHARE_ALL_PROJECTS - [self] - when RECEIVE_SHARED - [ancestors.share_sprints_with_subprojects.last || self.class.global_sprint_sharer].compact + if receive_shared_sprints? + ancestors.share_sprints_with_subprojects.last || self.class.global_sprint_sharer + else + self end end diff --git a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb index a4a0c068c76..8126457f0dd 100644 --- a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb +++ b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb @@ -178,7 +178,7 @@ RSpec.describe Projects::SprintSharing do shared_examples "returns the project itself" do it "returns only itself" do - expect(project.receive_sprints_from).to eq([project]) + expect(project.receive_sprints_from).to eq(project) end end @@ -212,7 +212,7 @@ RSpec.describe Projects::SprintSharing do let(:parent_sprint_sharing) { "no_sharing" } it "returns only the global sharer" do - expect(project.receive_sprints_from).to eq([global_sharer]) + expect(project.receive_sprints_from).to eq(global_sharer) end end @@ -222,7 +222,7 @@ RSpec.describe Projects::SprintSharing do let(:parent_sprint_sharing) { "share_subprojects" } it "returns only the closest sharing ancestor" do - expect(project.receive_sprints_from).to eq([parent_project]) + expect(project.receive_sprints_from).to eq(parent_project) end end @@ -232,7 +232,7 @@ RSpec.describe Projects::SprintSharing do let(:parent_sprint_sharing) { "no_sharing" } it "returns an empty array" do - expect(project.receive_sprints_from).to eq([]) + expect(project.receive_sprints_from).to be_nil end end end From 042fa9136479588f1dd638c1be50d4cc2e006c3c Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 6 Mar 2026 12:55:04 +0200 Subject: [PATCH 279/334] Move validate_global_sprint_sharer_uniqueness to the BacklogSettingsContract --- .../projects/backlog_settings_contract.rb | 10 ++++ .../app/models/projects/sprint_sharing.rb | 13 ----- .../backlog_settings_contract_spec.rb | 57 +++++++++++++++---- .../models/projects/sprint_sharing_spec.rb | 48 ---------------- 4 files changed, 55 insertions(+), 73 deletions(-) diff --git a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb index 7b8e2643f63..4197b34901b 100644 --- a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb +++ b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb @@ -33,6 +33,7 @@ module Projects attribute :sprint_sharing validate :validate_permissions + validate :validate_global_sprint_sharer_uniqueness validates :sprint_sharing, presence: true validates :sprint_sharing, inclusion: { in: Project::SPRINT_SHARING_OPTIONS }, allow_blank: true @@ -43,5 +44,14 @@ module Projects errors.add :base, :error_unauthorized end end + + def validate_global_sprint_sharer_uniqueness + if model.share_sprints_with_all_projects? && + (sharer = Project.global_sprint_sharer) && + sharer != model + + errors.add :sprint_sharing, :share_all_projects_already_taken, name: sharer.name + end + end end end diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index 8d177544ee4..4d149ead5d3 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -46,8 +46,6 @@ module Projects::SprintSharing scope :share_sprints_with_subprojects, -> { sprint_sharing(SHARE_SUBPROJECTS) } scope :receive_shared_sprints, -> { sprint_sharing(RECEIVE_SHARED) } scope :not_sharing_sprints, -> { sprint_sharing(NO_SHARING) } - - validate :validate_global_sprint_sharer_uniqueness end class_methods do @@ -91,15 +89,4 @@ module Projects::SprintSharing self end end - - private - - def validate_global_sprint_sharer_uniqueness - if sprint_sharing == SHARE_ALL_PROJECTS && - (sharer = self.class.global_sprint_sharer) && - sharer != self - - errors.add :sprint_sharing, :share_all_projects_already_taken, name: sharer.name - end - end end diff --git a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb index fe217214908..149ad37eb9d 100644 --- a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb +++ b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb @@ -3,13 +3,13 @@ require "spec_helper" require "contracts/shared/model_contract_shared_context" -RSpec.describe Projects::BacklogSettingsContract do +RSpec.describe Projects::BacklogSettingsContract, type: :model do include_context "ModelContract shared context" + shared_let(:current_user) { build_stubbed(:user) } let(:project) { create(:project) } - let(:contract) { described_class.new(project, current_user) } - let(:current_user) { build_stubbed(:user) } let(:can_share_sprint) { true } + subject(:contract) { described_class.new(project, current_user) } before do allow(current_user) @@ -20,29 +20,62 @@ RSpec.describe Projects::BacklogSettingsContract do it_behaves_like "contract is valid" - context "when sprint_sharing is changed" do - before do - project.sprint_sharing = sprint_sharing + describe "validations" do + it { is_expected.to validate_presence_of(:sprint_sharing) } + + it do + expect(subject) + .to validate_inclusion_of(:sprint_sharing).in_array(Project::SPRINT_SHARING_OPTIONS) end - context "with a supported sprint sharing value" do - let(:sprint_sharing) { "share_subprojects" } + it_behaves_like "contract is valid" + describe "permissions" do context "when user can share sprint" do + let(:can_share_sprint) { true } + it_behaves_like "contract is valid" end context "when user cannot share sprint" do let(:can_share_sprint) { false } - it_behaves_like "contract is invalid", base: :error_unauthorized + it_behaves_like "contract user is unauthorized" end end - context "with an unsupported sprint sharing value" do - let(:sprint_sharing) { "invalid_option" } + describe "#validate_global_sprint_sharer_uniqueness" do + before do + project.sprint_sharing = "share_all_projects" + end - it_behaves_like "contract is invalid", sprint_sharing: :inclusion + context "when no other project shares with all projects" do + it_behaves_like "contract is valid" + end + + context "when the project already has share_all_projects" do + let(:project) { create(:project, sprint_sharing: "share_all_projects") } + + it_behaves_like "contract is valid" + end + + context "when another project already shares with all projects" do + let!(:other_project) { create(:project, sprint_sharing: "share_all_projects") } + + it_behaves_like "contract is invalid", sprint_sharing: :share_all_projects_already_taken + + context "when sprint_sharing is set to Share subprojects" do + before { project.sprint_sharing = "share_subprojects" } + + it_behaves_like "contract is valid" + end + + context "when the other project is archived" do + let!(:other_project) { create(:project, :archived, sprint_sharing: "share_all_projects") } + + it_behaves_like "contract is valid" + end + end end end diff --git a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb index 8126457f0dd..4a131dd28fd 100644 --- a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb +++ b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb @@ -113,54 +113,6 @@ RSpec.describe Projects::SprintSharing do end end - describe "#validate_global_sprint_sharer_uniqueness" do - context "when no other project shares with all projects" do - it "allows setting share_all_projects" do - project.sprint_sharing = "share_all_projects" - - expect(project).to be_valid - end - end - - context "when the project already has share_all_projects" do - before { project.update!(sprint_sharing: "share_all_projects") } - - it "remains valid on re-save" do - expect(project.reload).to be_valid - end - end - - context "when another project already shares with all projects" do - let!(:other_project) { create(:project, sprint_sharing: "share_all_projects") } - - it "is invalid" do - project.sprint_sharing = "share_all_projects" - - expect(project).not_to be_valid - expect(project.errors[:sprint_sharing]).to include( - I18n.t("activerecord.errors.models.project.attributes.sprint_sharing.share_all_projects_already_taken", - name: other_project.name) - ) - end - - it "allows other sharing options" do - project.sprint_sharing = "share_subprojects" - - expect(project).to be_valid - end - - context "when the other project is archived" do - let!(:other_project) { create(:project, :archived, sprint_sharing: "share_all_projects") } - - it "remains valid" do - project.sprint_sharing = "share_all_projects" - - expect(project).to be_valid - end - end - end - end - describe "#receive_sprints_from" do let(:global_sprint_sharing) { "share_all_projects" } let(:root_sprint_sharing) { "share_subprojects" } From cd7c8e763236f326310628ee3cd1c722fd381443 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Fri, 6 Mar 2026 18:01:38 +0200 Subject: [PATCH 280/334] Enable the store_attribute defaults in the Project instead of overriding the getters. Otherwise the sharing_settings presence validation wouldn't work, because the getter always assigns the default value. Enabling the store_attributes default will set the default value via the settings hash, and not interfering with the getter. Additionally added a presence validation spec that ensures the behaviour works correctly. --- .../projects/settings/backlogs/sharing_form.rb | 10 ++++++++++ .../app/models/projects/sprint_sharing.rb | 18 ++++++++---------- .../projects/backlog_settings_contract_spec.rb | 11 ++++++++--- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb index e8e1c96eb27..cd46d7a96c8 100644 --- a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb +++ b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb @@ -33,6 +33,16 @@ module Projects module Backlogs class SharingForm < ApplicationForm form do |sharing_form| + # TODO: Remove this hidden field, once the `radio_button_group` supports rendering + # the hidden empty field. + # The purpose of the hidden field is to ensure we submit the `sprint_sharing` field + # even if no radio button is chosen. Otherwise, the submitted form will not include + # the field at all and the save request will return success when in fact no setting + # is saved. + # Ideally the hidden field should automatically be rendered by the `radio_button_group` + # helper, similar to how the `collection_radio_buttons` rails helper does. + sharing_form.hidden(name: :sprint_sharing, value: "") + sharing_form.radio_button_group( name: :sprint_sharing, label: I18n.t("projects.settings.backlog_sharing.sprint_sharing") diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index 4d149ead5d3..0edf44f7625 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -39,7 +39,14 @@ module Projects::SprintSharing SPRINT_SHARING_OPTIONS = [NO_SHARING, SHARE_ALL_PROJECTS, SHARE_SUBPROJECTS, RECEIVE_SHARED].freeze included do - store_attribute :settings, :sprint_sharing, :string + # TODO: Change the global store_attribute_unset_values_fallback_to_default to true + # in the config/initializers/store_attribute.rb. + # Otherwise defaults set on the setting declaration are not working correctly: + # `store_attribute :settings, :sprint_sharing, :string, default: "no_sharing"`. + # The method getter override below is required to provide the default value. + self.store_attribute_unset_values_fallback_to_default = true + + store_attribute :settings, :sprint_sharing, :string, default: NO_SHARING scope :sprint_sharing, ->(value) { where("settings->>'sprint_sharing' = ?", value) } scope :share_sprints_with_all_projects, -> { sprint_sharing(SHARE_ALL_PROJECTS) } @@ -54,15 +61,6 @@ module Projects::SprintSharing end end - # TODO: Change the store_attribute_unset_values_fallback_to_default to true in the - # config/initializers/store_attribute.rb. - # Otherwise defaults set on the setting declaration are not working correctly: - # `store_attribute :settings, :sprint_sharing, :string, default: "no_sharing"`. - # The method getter override below is required to provide the default value. - def sprint_sharing - super.presence || NO_SHARING - end - def share_sprints_with_all_projects? sprint_sharing == SHARE_ALL_PROJECTS end diff --git a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb index 149ad37eb9d..ceeaa6cb693 100644 --- a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb +++ b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb @@ -6,9 +6,10 @@ require "contracts/shared/model_contract_shared_context" RSpec.describe Projects::BacklogSettingsContract, type: :model do include_context "ModelContract shared context" - shared_let(:current_user) { build_stubbed(:user) } + let(:current_user) { build_stubbed(:user) } let(:project) { create(:project) } let(:can_share_sprint) { true } + subject(:contract) { described_class.new(project, current_user) } before do @@ -21,14 +22,18 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do it_behaves_like "contract is valid" describe "validations" do - it { is_expected.to validate_presence_of(:sprint_sharing) } + it_behaves_like "contract is valid" it do expect(subject) .to validate_inclusion_of(:sprint_sharing).in_array(Project::SPRINT_SHARING_OPTIONS) end - it_behaves_like "contract is valid" + context "when sprint_sharing is empty" do + before { project.sprint_sharing = "" } + + it_behaves_like "contract is invalid", sprint_sharing: :blank + end describe "permissions" do context "when user can share sprint" do From 518680ca30231da00eef2c636190ca3de0f9b532 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 9 Mar 2026 14:29:32 +0200 Subject: [PATCH 281/334] Inherit the BacklogSettingsContract from ModelContract to have the writable_attributes restricted. Conditionally allow writing the settings attributes too, because the sprint_sharing attribute is written inside the settings json column. --- .../projects/backlog_settings_contract.rb | 9 ++++- .../backlog_settings_contract_spec.rb | 33 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb index 4197b34901b..e4ef7a61a18 100644 --- a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb +++ b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb @@ -29,7 +29,12 @@ #++ module Projects - class BacklogSettingsContract < ::BaseContract + class BacklogSettingsContract < ::ModelContract + # The sprint_sharing setting is stored on the settings column. Hence writing + # the settings column should be allowed, but only for the sprint_sharing setting. + attribute :settings, writable: -> do + model.settings_change&.none? { it.except("sprint_sharing").any? } + end attribute :sprint_sharing validate :validate_permissions @@ -37,6 +42,8 @@ module Projects validates :sprint_sharing, presence: true validates :sprint_sharing, inclusion: { in: Project::SPRINT_SHARING_OPTIONS }, allow_blank: true + def validate_model? = false + protected def validate_permissions diff --git a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb index ceeaa6cb693..d22d22a8002 100644 --- a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb +++ b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb @@ -19,16 +19,24 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do .and_return(can_share_sprint) end - it_behaves_like "contract is valid" + it "is expected to be a subclass of ModelContract" do + expect(described_class).to be < ModelContract + end describe "validations" do it_behaves_like "contract is valid" + it { expect(subject).to validate_presence_of(:sprint_sharing) } + it do expect(subject) .to validate_inclusion_of(:sprint_sharing).in_array(Project::SPRINT_SHARING_OPTIONS) end + # This spec of explicitly setting sprint_sharing to empty is required because the + # simple presence validation spec is not sufficient to catch certain corner cases. + # For example, when the sprint_sharing getter is overriden to provide a default value, + # and the user submits an empty value, the contract should be invalid. context "when sprint_sharing is empty" do before { project.sprint_sharing = "" } @@ -90,5 +98,28 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do expect(contract.writable_attributes).not_to include("settings") expect(contract.writable_attributes).not_to include("deactivate_work_package_attachments") end + + context "when sprint_sharing is the only changed setting" do + before { project.sprint_sharing = "share_subprojects" } + + it "includes the settings column too" do + expect(contract.writable_attributes).to include("settings") + end + + it_behaves_like "contract is valid" + end + + context "when other settings keys are also changed" do + before do + project.sprint_sharing = "share_subprojects" + project.deactivate_work_package_attachments = true + end + + it "excludes the settings column" do + expect(contract.writable_attributes).not_to include("settings") + end + + it_behaves_like "contract is invalid", settings: :error_readonly + end end end From 5905c4c6806ed7fe21a490f4ee3e8158b5cb149e Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:55:07 +0200 Subject: [PATCH 282/334] Disable the store_attribute_unset_values_fallback_to_default setting --- modules/backlogs/app/models/projects/sprint_sharing.rb | 2 +- .../backlogs/spec/models/projects/sprint_sharing_spec.rb | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index 0edf44f7625..8bfe9189156 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -44,7 +44,7 @@ module Projects::SprintSharing # Otherwise defaults set on the setting declaration are not working correctly: # `store_attribute :settings, :sprint_sharing, :string, default: "no_sharing"`. # The method getter override below is required to provide the default value. - self.store_attribute_unset_values_fallback_to_default = true + # self.store_attribute_unset_values_fallback_to_default = true store_attribute :settings, :sprint_sharing, :string, default: NO_SHARING diff --git a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb index 4a131dd28fd..3428276bfaa 100644 --- a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb +++ b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb @@ -30,10 +30,10 @@ RSpec.describe Projects::SprintSharing do end describe "scopes" do - let!(:no_sharing_project) { create(:project, sprint_sharing: "no_sharing") } - let!(:all_projects_sharer) { create(:project, sprint_sharing: "share_all_projects") } - let!(:subprojects_sharer) { create(:project, sprint_sharing: "share_subprojects") } - let!(:receiver) { create(:project, sprint_sharing: "receive_shared") } + shared_let(:no_sharing_project) { create(:project, sprint_sharing: "no_sharing") } + shared_let(:all_projects_sharer) { create(:project, sprint_sharing: "share_all_projects") } + shared_let(:subprojects_sharer) { create(:project, sprint_sharing: "share_subprojects") } + shared_let(:receiver) { create(:project, sprint_sharing: "receive_shared") } describe ".share_sprints_with_all_projects" do it "returns projects that share with all projects" do From 7baef242498d7bfd89669c864c0fa96009927426 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 9 Mar 2026 21:51:28 +0200 Subject: [PATCH 283/334] Include the empty values in the Project.not_sharing_sprints scope Introduce a settings querying scope to make easier to filter projects by settings. --- app/models/project.rb | 12 +++++++++ .../app/models/projects/sprint_sharing.rb | 25 +++++++++++++------ .../models/projects/sprint_sharing_spec.rb | 8 +++++- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index 41fb0312f92..2a0f39d7700 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -128,6 +128,18 @@ class Project < ApplicationRecord store_attribute :settings, :enabled_internal_comments, :boolean store_attribute :settings, :excluded_role_ids_on_copy, :json, default: [] + scope :with_settings, ->(**kwargs) do + raise ArgumentError, "Provide at least one setting" if kwargs.empty? + + kwargs.reduce(all) do |scope, (key, value)| + if value.nil? + scope.where("settings->>? IS NULL", key) + else + scope.where("settings->>? = ?", key, value) + end + end + end + acts_as_favoritable acts_as_customizable validate_on: :saving_custom_fields, comments: true, admin_only_allowed: true diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index 8bfe9189156..4b6d967169b 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -45,14 +45,21 @@ module Projects::SprintSharing # `store_attribute :settings, :sprint_sharing, :string, default: "no_sharing"`. # The method getter override below is required to provide the default value. # self.store_attribute_unset_values_fallback_to_default = true + # Ideally the store_attribute :settings, :sprint_sharing, :string, default: NO_SHARING + # would be used, but using the `default` from the store_attribute triggers an unusual behaviour. + # Whenever the default value is assigned directly (ie self.sprint_sharing = NO_SHARING), + # the value is considered not changed and the settings field is not updated upon saving. + # This means, it is not possible to save the NO_SHARING value to the database as a default. + store_attribute :settings, :sprint_sharing, :string - store_attribute :settings, :sprint_sharing, :string, default: NO_SHARING - - scope :sprint_sharing, ->(value) { where("settings->>'sprint_sharing' = ?", value) } - scope :share_sprints_with_all_projects, -> { sprint_sharing(SHARE_ALL_PROJECTS) } - scope :share_sprints_with_subprojects, -> { sprint_sharing(SHARE_SUBPROJECTS) } - scope :receive_shared_sprints, -> { sprint_sharing(RECEIVE_SHARED) } - scope :not_sharing_sprints, -> { sprint_sharing(NO_SHARING) } + scope :share_sprints_with_all_projects, -> { with_settings(sprint_sharing: SHARE_ALL_PROJECTS) } + scope :share_sprints_with_subprojects, -> { with_settings(sprint_sharing: SHARE_SUBPROJECTS) } + scope :receive_shared_sprints, -> { with_settings(sprint_sharing: RECEIVE_SHARED) } + scope :not_sharing_sprints, -> do + with_settings(sprint_sharing: NO_SHARING) + .or(with_settings(sprint_sharing: "")) + .or(with_settings(sprint_sharing: nil)) + end end class_methods do @@ -61,6 +68,10 @@ module Projects::SprintSharing end end + def sprint_sharing + super || NO_SHARING + end + def share_sprints_with_all_projects? sprint_sharing == SHARE_ALL_PROJECTS end diff --git a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb index 3428276bfaa..a4aaa6ad387 100644 --- a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb +++ b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb @@ -30,6 +30,8 @@ RSpec.describe Projects::SprintSharing do end describe "scopes" do + shared_let(:project_without_settings) { create(:project, sprint_sharing: nil) } + shared_let(:project_with_empty_settings) { create(:project, sprint_sharing: "") } shared_let(:no_sharing_project) { create(:project, sprint_sharing: "no_sharing") } shared_let(:all_projects_sharer) { create(:project, sprint_sharing: "share_all_projects") } shared_let(:subprojects_sharer) { create(:project, sprint_sharing: "share_subprojects") } @@ -55,7 +57,11 @@ RSpec.describe Projects::SprintSharing do describe ".not_sharing_sprints" do it "returns projects with no sharing" do - expect(Project.not_sharing_sprints).to contain_exactly(no_sharing_project) + expect(Project.not_sharing_sprints).to contain_exactly( + project_without_settings, + project_with_empty_settings, + no_sharing_project + ) end end end From 58665d4218f127477e4ddbbc0247bb23cc9c04d8 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 10 Mar 2026 13:43:39 +0200 Subject: [PATCH 284/334] Add explanation about a store_attributes default settings issue --- config/initializers/store_attribute.rb | 5 +++++ .../backlogs/app/models/projects/sprint_sharing.rb | 13 ++----------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/config/initializers/store_attribute.rb b/config/initializers/store_attribute.rb index 37ded4b606b..1fb782ad849 100644 --- a/config/initializers/store_attribute.rb +++ b/config/initializers/store_attribute.rb @@ -31,4 +31,9 @@ # From v1.0 to v2.0 of store_attribute, the value for store_attribute_unset_values_fallback_to_default changed from # false to true. This initializer sets it back to false to keep the behavior consistent with the previous version. +# Keeping this false also avoids a subtle dirty-tracking issue with the `default:` option: assigning the +# default value to an attribute that has never been persisted is a no-op from dirty-tracking's perspective, +# so the store column is never written. Concretely, `create(:project, sprint_sharing: "no_sharing")` leaves +# `project.settings` as `{}` because "no_sharing" equals the declared default and is never saved. + StoreAttribute.store_attribute_unset_values_fallback_to_default = false diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index 4b6d967169b..7f2f16086f6 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -39,17 +39,6 @@ module Projects::SprintSharing SPRINT_SHARING_OPTIONS = [NO_SHARING, SHARE_ALL_PROJECTS, SHARE_SUBPROJECTS, RECEIVE_SHARED].freeze included do - # TODO: Change the global store_attribute_unset_values_fallback_to_default to true - # in the config/initializers/store_attribute.rb. - # Otherwise defaults set on the setting declaration are not working correctly: - # `store_attribute :settings, :sprint_sharing, :string, default: "no_sharing"`. - # The method getter override below is required to provide the default value. - # self.store_attribute_unset_values_fallback_to_default = true - # Ideally the store_attribute :settings, :sprint_sharing, :string, default: NO_SHARING - # would be used, but using the `default` from the store_attribute triggers an unusual behaviour. - # Whenever the default value is assigned directly (ie self.sprint_sharing = NO_SHARING), - # the value is considered not changed and the settings field is not updated upon saving. - # This means, it is not possible to save the NO_SHARING value to the database as a default. store_attribute :settings, :sprint_sharing, :string scope :share_sprints_with_all_projects, -> { with_settings(sprint_sharing: SHARE_ALL_PROJECTS) } @@ -68,6 +57,8 @@ module Projects::SprintSharing end end + # `default:` cannot be reliably used on the store_attribute declaration, + # see config/initializers/store_attribute.rb for more details. def sprint_sharing super || NO_SHARING end From f4588d7de4767660b646c14adf502c20fa21f14d Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 10 Mar 2026 13:44:08 +0200 Subject: [PATCH 285/334] Add Agile::Sprint.for_project specs to cover sub project sharing ancestor too --- .../backlogs/spec/models/agile/sprint_spec.rb | 81 ++++++++++++++----- 1 file changed, 62 insertions(+), 19 deletions(-) diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/agile/sprint_spec.rb index e05b57c8769..63c8ce29fb2 100644 --- a/modules/backlogs/spec/models/agile/sprint_spec.rb +++ b/modules/backlogs/spec/models/agile/sprint_spec.rb @@ -121,18 +121,18 @@ RSpec.describe Agile::Sprint do let!(:global_sprint) { create(:agile_sprint, project: global_sharer) } let!(:sprint_in_other_project) { create(:agile_sprint, project: other_project) } - context "when the project does not receive sprints" do - context "and no work package assignments exist" do - it "returns own sprint only" do + context "when project does not receive sprints" do + context "and there are no work package assignments" do + it "returns only the project's own sprint" do expect(described_class.for_project(project)).to contain_exactly(sprint_in_project) end end - context "when the project has work packages assigned to a sprint from another project" do + context "and the project has a work package assigned to a sprint from another project" do let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } - it "returns the sprint via work package assignment too" do + it "returns both the own sprint and the sprint assigned via work package" do expect(described_class.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) end @@ -140,34 +140,77 @@ RSpec.describe Agile::Sprint do let!(:completed_sprint) { create(:agile_sprint, project: other_project, status: "completed") } let!(:work_package) { create(:work_package, project:, sprint: completed_sprint) } - it "still includes the completed sprint" do + it "returns the completed sprint among the sprints" do expect(described_class.for_project(project)).to include(completed_sprint) end end end end - context "when the project receives shared sprints" do + context "when project receives shared sprints" do let(:project) { create(:project, sprint_sharing: "receive_shared") } - it "returns shared sprints from the sharer project" do - # The sprint_in_project (own) and sprint_in_other_project are excluded - expect(described_class.for_project(project)).to contain_exactly(global_sprint) - end + context "and there is only a global sharer" do + it "returns only the sprints shared from the global sharer project" do + expect(described_class.for_project(project)).to contain_exactly(global_sprint) + end - context "and its own sprint has a work package assigned" do - let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } + context "and a work package is assigned to the project's own sprint" do + let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } - it "includes own sprint and the shared sprint" do - expect(described_class.for_project(project)).to contain_exactly(global_sprint, sprint_in_project) + it "returns both the global shared sprint and the project's own sprint" do + expect(described_class.for_project(project)).to contain_exactly(global_sprint, sprint_in_project) + end + end + + context "and a work package is assigned to the shared sprint from the global sharer" do + let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } + + it "returns the shared sprint only once" do + expect(described_class.for_project(project)).to contain_exactly(global_sprint) + end + end + + context "and a work package is assigned to a sprint from an unrelated project" do + let!(:work_package) { create(:work_package, project:, sprint: sprint_in_other_project) } + + it "returns the global shared sprint and the unrelated project's sprint" do + expect(described_class.for_project(project)).to contain_exactly(global_sprint, sprint_in_other_project) + end end end - context "when the sprint qualifies through both sharing and work package assignment" do - let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } + context "and there is a subproject-sharing ancestor" do + let(:subproject_sharer) { create(:project, sprint_sharing: "share_subprojects") } + let(:project) { create(:project, parent: subproject_sharer, sprint_sharing: "receive_shared") } + let!(:subproject_sprint) { create(:agile_sprint, project: subproject_sharer) } - it "returns the sprint exactly once" do - expect(described_class.for_project(project)).to contain_exactly(global_sprint) + it "returns only the sprints shared from the closest subproject-sharing ancestor" do + expect(described_class.for_project(project)).to contain_exactly(subproject_sprint) + end + + context "and a work package is assigned to the project's own sprint" do + let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } + + it "returns both the ancestor's shared sprint and the project's own sprint" do + expect(described_class.for_project(project)).to contain_exactly(subproject_sprint, sprint_in_project) + end + end + + context "and a work package is assigned to the ancestor's shared sprint" do + let!(:work_package) { create(:work_package, project:, sprint: subproject_sprint) } + + it "returns the ancestor's shared sprint only once" do + expect(described_class.for_project(project)).to contain_exactly(subproject_sprint) + end + end + + context "and a work package is assigned to a sprint from the global sharer" do + let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } + + it "returns both the ancestor's shared sprint and the global sharer's sprint" do + expect(described_class.for_project(project)).to contain_exactly(subproject_sprint, global_sprint) + end end end end From 0a17537e1654ca5f436ce0aa8b65f75621e53d42 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 10 Mar 2026 13:45:08 +0200 Subject: [PATCH 286/334] Move Agile::Sprint scopes to their own scope files --- modules/backlogs/app/models/agile/sprint.rb | 21 +-- .../agile/sprints/scopes/for_project.rb | 44 ++++++ .../agile/sprints/scopes/not_completed.rb | 37 +++++ .../agile/sprints/scopes/order_by_date.rb | 40 ++++++ .../models/agile/sprints/scopes/visible.rb | 38 +++++ .../backlogs/spec/models/agile/sprint_spec.rb | 102 ------------- .../agile/sprints/scopes/for_project_spec.rb | 136 ++++++++++++++++++ 7 files changed, 301 insertions(+), 117 deletions(-) create mode 100644 modules/backlogs/app/models/agile/sprints/scopes/for_project.rb create mode 100644 modules/backlogs/app/models/agile/sprints/scopes/not_completed.rb create mode 100644 modules/backlogs/app/models/agile/sprints/scopes/order_by_date.rb create mode 100644 modules/backlogs/app/models/agile/sprints/scopes/visible.rb create mode 100644 modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb index 444460aad46..cef4d7f6f34 100644 --- a/modules/backlogs/app/models/agile/sprint.rb +++ b/modules/backlogs/app/models/agile/sprint.rb @@ -35,24 +35,15 @@ module Agile class Sprint < ApplicationRecord self.table_name = "sprints" + include ::Scopes::Scoped + belongs_to :project has_many :work_packages, dependent: :nullify - scope :for_project, ->(project) do - # Ideally the project.work_packages scope would be used, but unfortunately - # it has some extra includes that are not necessary in this case. - from_work_packages = WorkPackage.where(project:).where.not(sprint_id: nil) - - where(project: project.receive_sprints_from) - .or(where(id: from_work_packages.select(:sprint_id))) - end - scope :not_completed, -> { !completed } - scope :order_by_date, -> do - order(arel_table[:start_date].asc.nulls_last, - arel_table[:finish_date].asc.nulls_last) - end - # FIXME: replace this stub with a meaningful implementation. - scope :visible, -> { all } + scopes :for_project, + :not_completed, + :order_by_date, + :visible enum :status, { diff --git a/modules/backlogs/app/models/agile/sprints/scopes/for_project.rb b/modules/backlogs/app/models/agile/sprints/scopes/for_project.rb new file mode 100644 index 00000000000..81acbdbe1e0 --- /dev/null +++ b/modules/backlogs/app/models/agile/sprints/scopes/for_project.rb @@ -0,0 +1,44 @@ +# 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 Agile::Sprints::Scopes::ForProject + extend ActiveSupport::Concern + + class_methods do + def for_project(project) + # Ideally the project.work_packages scope would be used, but unfortunately + # it has some extra includes that are not necessary in this case. + from_work_packages = WorkPackage.where(project:).where.not(sprint_id: nil) + + where(project: project.receive_sprints_from) + .or(where(id: from_work_packages.select(:sprint_id))) + end + end +end diff --git a/modules/backlogs/app/models/agile/sprints/scopes/not_completed.rb b/modules/backlogs/app/models/agile/sprints/scopes/not_completed.rb new file mode 100644 index 00000000000..2e68e7f1230 --- /dev/null +++ b/modules/backlogs/app/models/agile/sprints/scopes/not_completed.rb @@ -0,0 +1,37 @@ +# 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 Agile::Sprints::Scopes::NotCompleted + extend ActiveSupport::Concern + + def not_completed # rubocop:disable Naming/PredicateMethod + !completed + end +end diff --git a/modules/backlogs/app/models/agile/sprints/scopes/order_by_date.rb b/modules/backlogs/app/models/agile/sprints/scopes/order_by_date.rb new file mode 100644 index 00000000000..b6aed82b9a1 --- /dev/null +++ b/modules/backlogs/app/models/agile/sprints/scopes/order_by_date.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 Agile::Sprints::Scopes::OrderByDate + extend ActiveSupport::Concern + + class_methods do + def order_by_date + order(arel_table[:start_date].asc.nulls_last, + arel_table[:finish_date].asc.nulls_last) + end + end +end diff --git a/modules/backlogs/app/models/agile/sprints/scopes/visible.rb b/modules/backlogs/app/models/agile/sprints/scopes/visible.rb new file mode 100644 index 00000000000..b9d214d8680 --- /dev/null +++ b/modules/backlogs/app/models/agile/sprints/scopes/visible.rb @@ -0,0 +1,38 @@ +# 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 Agile::Sprints::Scopes::Visible + extend ActiveSupport::Concern + + class_methods do + # FIXME: replace this stub with a meaningful implementation. + def visible = all + end +end diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/agile/sprint_spec.rb index 63c8ce29fb2..5ce79972dea 100644 --- a/modules/backlogs/spec/models/agile/sprint_spec.rb +++ b/modules/backlogs/spec/models/agile/sprint_spec.rb @@ -114,108 +114,6 @@ RSpec.describe Agile::Sprint do end end - describe ".for_project" do - let(:global_sharer) { create(:project, sprint_sharing: "share_all_projects") } - let(:other_project) { create(:project) } - let!(:sprint_in_project) { create(:agile_sprint, project:) } - let!(:global_sprint) { create(:agile_sprint, project: global_sharer) } - let!(:sprint_in_other_project) { create(:agile_sprint, project: other_project) } - - context "when project does not receive sprints" do - context "and there are no work package assignments" do - it "returns only the project's own sprint" do - expect(described_class.for_project(project)).to contain_exactly(sprint_in_project) - end - end - - context "and the project has a work package assigned to a sprint from another project" do - let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } - let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } - - it "returns both the own sprint and the sprint assigned via work package" do - expect(described_class.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) - end - - context "when the cross-project sprint is completed" do - let!(:completed_sprint) { create(:agile_sprint, project: other_project, status: "completed") } - let!(:work_package) { create(:work_package, project:, sprint: completed_sprint) } - - it "returns the completed sprint among the sprints" do - expect(described_class.for_project(project)).to include(completed_sprint) - end - end - end - end - - context "when project receives shared sprints" do - let(:project) { create(:project, sprint_sharing: "receive_shared") } - - context "and there is only a global sharer" do - it "returns only the sprints shared from the global sharer project" do - expect(described_class.for_project(project)).to contain_exactly(global_sprint) - end - - context "and a work package is assigned to the project's own sprint" do - let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } - - it "returns both the global shared sprint and the project's own sprint" do - expect(described_class.for_project(project)).to contain_exactly(global_sprint, sprint_in_project) - end - end - - context "and a work package is assigned to the shared sprint from the global sharer" do - let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } - - it "returns the shared sprint only once" do - expect(described_class.for_project(project)).to contain_exactly(global_sprint) - end - end - - context "and a work package is assigned to a sprint from an unrelated project" do - let!(:work_package) { create(:work_package, project:, sprint: sprint_in_other_project) } - - it "returns the global shared sprint and the unrelated project's sprint" do - expect(described_class.for_project(project)).to contain_exactly(global_sprint, sprint_in_other_project) - end - end - end - - context "and there is a subproject-sharing ancestor" do - let(:subproject_sharer) { create(:project, sprint_sharing: "share_subprojects") } - let(:project) { create(:project, parent: subproject_sharer, sprint_sharing: "receive_shared") } - let!(:subproject_sprint) { create(:agile_sprint, project: subproject_sharer) } - - it "returns only the sprints shared from the closest subproject-sharing ancestor" do - expect(described_class.for_project(project)).to contain_exactly(subproject_sprint) - end - - context "and a work package is assigned to the project's own sprint" do - let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } - - it "returns both the ancestor's shared sprint and the project's own sprint" do - expect(described_class.for_project(project)).to contain_exactly(subproject_sprint, sprint_in_project) - end - end - - context "and a work package is assigned to the ancestor's shared sprint" do - let!(:work_package) { create(:work_package, project:, sprint: subproject_sprint) } - - it "returns the ancestor's shared sprint only once" do - expect(described_class.for_project(project)).to contain_exactly(subproject_sprint) - end - end - - context "and a work package is assigned to a sprint from the global sharer" do - let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } - - it "returns both the ancestor's shared sprint and the global sharer's sprint" do - expect(described_class.for_project(project)).to contain_exactly(subproject_sprint, global_sprint) - end - end - end - end - end - describe "associations" do it { is_expected.to have_many(:work_packages).dependent(:nullify) } it { is_expected.to belong_to(:project) } diff --git a/modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb b/modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb new file mode 100644 index 00000000000..b133619c29c --- /dev/null +++ b/modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb @@ -0,0 +1,136 @@ +# 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 Agile::Sprints::Scopes::ForProject do + let(:project) { create(:project) } + let(:global_sharer) { create(:project, sprint_sharing: "share_all_projects") } + let(:other_project) { create(:project) } + let!(:sprint_in_project) { create(:agile_sprint, project:) } + let!(:global_sprint) { create(:agile_sprint, project: global_sharer) } + let!(:sprint_in_other_project) { create(:agile_sprint, project: other_project) } + + describe ".for_project" do + context "when project does not receive sprints" do + context "and there are no work package assignments" do + it "returns only the project's own sprint" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project) + end + end + + context "and the project has a work package assigned to a sprint from another project" do + let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } + let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } + + it "returns both the own sprint and the sprint assigned via work package" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) + end + + context "when the cross-project sprint is completed" do + let!(:completed_sprint) { create(:agile_sprint, project: other_project, status: "completed") } + let!(:work_package) { create(:work_package, project:, sprint: completed_sprint) } + + it "returns the completed sprint among the sprints" do + expect(Agile::Sprint.for_project(project)).to include(completed_sprint) + end + end + end + end + + context "when project receives shared sprints" do + let(:project) { create(:project, sprint_sharing: "receive_shared") } + + context "and there is only a global sharer" do + it "returns only the sprints shared from the global sharer project" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(global_sprint) + end + + context "and a work package is assigned to the project's own sprint" do + let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } + + it "returns both the global shared sprint and the project's own sprint" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(global_sprint, sprint_in_project) + end + end + + context "and a work package is assigned to the shared sprint from the global sharer" do + let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } + + it "returns the shared sprint only once" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(global_sprint) + end + end + + context "and a work package is assigned to a sprint from an unrelated project" do + let!(:work_package) { create(:work_package, project:, sprint: sprint_in_other_project) } + + it "returns the global shared sprint and the unrelated project's sprint" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(global_sprint, sprint_in_other_project) + end + end + end + + context "and there is a subproject-sharing ancestor" do + let(:subproject_sharer) { create(:project, sprint_sharing: "share_subprojects") } + let(:project) { create(:project, parent: subproject_sharer, sprint_sharing: "receive_shared") } + let!(:subproject_sprint) { create(:agile_sprint, project: subproject_sharer) } + + it "returns only the sprints shared from the closest subproject-sharing ancestor" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(subproject_sprint) + end + + context "and a work package is assigned to the project's own sprint" do + let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } + + it "returns both the ancestor's shared sprint and the project's own sprint" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(subproject_sprint, sprint_in_project) + end + end + + context "and a work package is assigned to the ancestor's shared sprint" do + let!(:work_package) { create(:work_package, project:, sprint: subproject_sprint) } + + it "returns the ancestor's shared sprint only once" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(subproject_sprint) + end + end + + context "and a work package is assigned to a sprint from the global sharer" do + let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } + + it "returns both the ancestor's shared sprint and the global sharer's sprint" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(subproject_sprint, global_sprint) + end + end + end + end + end +end From c7951db6366d48c62b9436651ffe4c4e2c3b6f7b Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 10 Mar 2026 13:45:46 +0200 Subject: [PATCH 287/334] Add Project.with_settings scope --- app/models/project.rb | 15 +------ app/models/projects/scopes/with_settings.rb | 49 +++++++++++++++++++++ 2 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 app/models/projects/scopes/with_settings.rb diff --git a/app/models/project.rb b/app/models/project.rb index 2a0f39d7700..99240b0b953 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -128,18 +128,6 @@ class Project < ApplicationRecord store_attribute :settings, :enabled_internal_comments, :boolean store_attribute :settings, :excluded_role_ids_on_copy, :json, default: [] - scope :with_settings, ->(**kwargs) do - raise ArgumentError, "Provide at least one setting" if kwargs.empty? - - kwargs.reduce(all) do |scope, (key, value)| - if value.nil? - scope.where("settings->>? IS NULL", key) - else - scope.where("settings->>? = ?", key, value) - end - end - end - acts_as_favoritable acts_as_customizable validate_on: :saving_custom_fields, comments: true, admin_only_allowed: true @@ -233,7 +221,8 @@ class Project < ApplicationRecord :assignable_parents, :available_custom_fields, :available_templates, - :visible + :visible, + :with_settings scope :has_module, ->(mod) { where(["#{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name=?)", mod.to_s]) diff --git a/app/models/projects/scopes/with_settings.rb b/app/models/projects/scopes/with_settings.rb new file mode 100644 index 00000000000..461821c873e --- /dev/null +++ b/app/models/projects/scopes/with_settings.rb @@ -0,0 +1,49 @@ +# 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 Projects::Scopes + module WithSettings + extend ActiveSupport::Concern + + class_methods do + def with_settings(**kwargs) + raise ArgumentError, "Provide at least one setting" if kwargs.empty? + + kwargs.reduce(all) do |scope, (key, value)| + if value.nil? + scope.where("settings->>? IS NULL", key) + else + scope.where("settings->>? = ?", key, value) + end + end + end + end + end +end From d352b717f12bdeef1977f63d66941632ffb905a9 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 10 Mar 2026 13:46:10 +0200 Subject: [PATCH 288/334] Move Projects::SprintSharing scopes to their own scope files --- .../projects/scopes/not_sharing_sprints.rb | 41 +++++++++++++++++++ .../projects/scopes/receive_shared_sprints.rb | 39 ++++++++++++++++++ .../scopes/share_sprints_with_all_projects.rb | 39 ++++++++++++++++++ .../scopes/share_sprints_with_subprojects.rb | 39 ++++++++++++++++++ .../app/models/projects/sprint_sharing.rb | 12 ++---- .../spec/models/projects/scopes_spec.rb | 40 ++++++++++++++++++ .../models/projects/sprint_sharing_spec.rb | 37 ----------------- 7 files changed, 202 insertions(+), 45 deletions(-) create mode 100644 modules/backlogs/app/models/projects/scopes/not_sharing_sprints.rb create mode 100644 modules/backlogs/app/models/projects/scopes/receive_shared_sprints.rb create mode 100644 modules/backlogs/app/models/projects/scopes/share_sprints_with_all_projects.rb create mode 100644 modules/backlogs/app/models/projects/scopes/share_sprints_with_subprojects.rb create mode 100644 modules/backlogs/spec/models/projects/scopes_spec.rb diff --git a/modules/backlogs/app/models/projects/scopes/not_sharing_sprints.rb b/modules/backlogs/app/models/projects/scopes/not_sharing_sprints.rb new file mode 100644 index 00000000000..38fab4571bd --- /dev/null +++ b/modules/backlogs/app/models/projects/scopes/not_sharing_sprints.rb @@ -0,0 +1,41 @@ +# 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 Projects::Scopes::NotSharingSprints + extend ActiveSupport::Concern + + class_methods do + def not_sharing_sprints + with_settings(sprint_sharing: Projects::SprintSharing::NO_SHARING) + .or(with_settings(sprint_sharing: "")) + .or(with_settings(sprint_sharing: nil)) + end + end +end diff --git a/modules/backlogs/app/models/projects/scopes/receive_shared_sprints.rb b/modules/backlogs/app/models/projects/scopes/receive_shared_sprints.rb new file mode 100644 index 00000000000..0e023d90da1 --- /dev/null +++ b/modules/backlogs/app/models/projects/scopes/receive_shared_sprints.rb @@ -0,0 +1,39 @@ +# 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 Projects::Scopes::ReceiveSharedSprints + extend ActiveSupport::Concern + + class_methods do + def receive_shared_sprints + with_settings(sprint_sharing: Projects::SprintSharing::RECEIVE_SHARED) + end + end +end diff --git a/modules/backlogs/app/models/projects/scopes/share_sprints_with_all_projects.rb b/modules/backlogs/app/models/projects/scopes/share_sprints_with_all_projects.rb new file mode 100644 index 00000000000..c0c1eb8503b --- /dev/null +++ b/modules/backlogs/app/models/projects/scopes/share_sprints_with_all_projects.rb @@ -0,0 +1,39 @@ +# 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 Projects::Scopes::ShareSprintsWithAllProjects + extend ActiveSupport::Concern + + class_methods do + def share_sprints_with_all_projects + with_settings(sprint_sharing: Projects::SprintSharing::SHARE_ALL_PROJECTS) + end + end +end diff --git a/modules/backlogs/app/models/projects/scopes/share_sprints_with_subprojects.rb b/modules/backlogs/app/models/projects/scopes/share_sprints_with_subprojects.rb new file mode 100644 index 00000000000..c4dce1be4c8 --- /dev/null +++ b/modules/backlogs/app/models/projects/scopes/share_sprints_with_subprojects.rb @@ -0,0 +1,39 @@ +# 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 Projects::Scopes::ShareSprintsWithSubprojects + extend ActiveSupport::Concern + + class_methods do + def share_sprints_with_subprojects + with_settings(sprint_sharing: Projects::SprintSharing::SHARE_SUBPROJECTS) + end + end +end diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index 7f2f16086f6..a1c9d08072e 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -41,14 +41,10 @@ module Projects::SprintSharing included do store_attribute :settings, :sprint_sharing, :string - scope :share_sprints_with_all_projects, -> { with_settings(sprint_sharing: SHARE_ALL_PROJECTS) } - scope :share_sprints_with_subprojects, -> { with_settings(sprint_sharing: SHARE_SUBPROJECTS) } - scope :receive_shared_sprints, -> { with_settings(sprint_sharing: RECEIVE_SHARED) } - scope :not_sharing_sprints, -> do - with_settings(sprint_sharing: NO_SHARING) - .or(with_settings(sprint_sharing: "")) - .or(with_settings(sprint_sharing: nil)) - end + scopes :share_sprints_with_all_projects, + :share_sprints_with_subprojects, + :receive_shared_sprints, + :not_sharing_sprints end class_methods do diff --git a/modules/backlogs/spec/models/projects/scopes_spec.rb b/modules/backlogs/spec/models/projects/scopes_spec.rb new file mode 100644 index 00000000000..79a57256972 --- /dev/null +++ b/modules/backlogs/spec/models/projects/scopes_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe Projects::Scopes, "scopes" do + shared_let(:project_without_settings) { create(:project, sprint_sharing: nil) } + shared_let(:project_with_empty_settings) { create(:project, sprint_sharing: "") } + shared_let(:no_sharing_project) { create(:project, sprint_sharing: "no_sharing") } + shared_let(:all_projects_sharer) { create(:project, sprint_sharing: "share_all_projects") } + shared_let(:subprojects_sharer) { create(:project, sprint_sharing: "share_subprojects") } + shared_let(:receiver) { create(:project, sprint_sharing: "receive_shared") } + + describe ".share_sprints_with_all_projects" do + it "returns projects that share with all projects" do + expect(Project.share_sprints_with_all_projects).to contain_exactly(all_projects_sharer) + end + end + + describe ".share_sprints_with_subprojects" do + it "returns projects that share with subprojects" do + expect(Project.share_sprints_with_subprojects).to contain_exactly(subprojects_sharer) + end + end + + describe ".receive_shared_sprints" do + it "returns projects that receive shared sprints" do + expect(Project.receive_shared_sprints).to contain_exactly(receiver) + end + end + + describe ".not_sharing_sprints" do + it "returns projects with no sharing" do + expect(Project.not_sharing_sprints).to contain_exactly( + project_without_settings, + project_with_empty_settings, + no_sharing_project + ) + end + end +end diff --git a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb index a4aaa6ad387..15b4940eda0 100644 --- a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb +++ b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb @@ -29,43 +29,6 @@ RSpec.describe Projects::SprintSharing do end end - describe "scopes" do - shared_let(:project_without_settings) { create(:project, sprint_sharing: nil) } - shared_let(:project_with_empty_settings) { create(:project, sprint_sharing: "") } - shared_let(:no_sharing_project) { create(:project, sprint_sharing: "no_sharing") } - shared_let(:all_projects_sharer) { create(:project, sprint_sharing: "share_all_projects") } - shared_let(:subprojects_sharer) { create(:project, sprint_sharing: "share_subprojects") } - shared_let(:receiver) { create(:project, sprint_sharing: "receive_shared") } - - describe ".share_sprints_with_all_projects" do - it "returns projects that share with all projects" do - expect(Project.share_sprints_with_all_projects).to contain_exactly(all_projects_sharer) - end - end - - describe ".share_sprints_with_subprojects" do - it "returns projects that share with subprojects" do - expect(Project.share_sprints_with_subprojects).to contain_exactly(subprojects_sharer) - end - end - - describe ".receive_shared_sprints" do - it "returns projects that receive shared sprints" do - expect(Project.receive_shared_sprints).to contain_exactly(receiver) - end - end - - describe ".not_sharing_sprints" do - it "returns projects with no sharing" do - expect(Project.not_sharing_sprints).to contain_exactly( - project_without_settings, - project_with_empty_settings, - no_sharing_project - ) - end - end - end - describe "predicate methods" do it "#share_sprints_with_all_projects? returns true when sharing with all projects" do project.sprint_sharing = "share_all_projects" From 8868f198291d1d46e0b8db17b194fe4bbd796c8c Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 10 Mar 2026 13:46:28 +0200 Subject: [PATCH 289/334] Return a query scope from Project.receive_sprints_from instead of a plain array --- .../app/models/projects/sprint_sharing.rb | 15 +++++++++++++-- .../spec/models/projects/sprint_sharing_spec.rb | 10 +++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index a1c9d08072e..2c5d5040a34 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -80,9 +80,20 @@ module Projects::SprintSharing # Receivers see external sprints from the closest ancestor sharing # subprojects, falling back to the global sharer. if receive_shared_sprints? - ancestors.share_sprints_with_subprojects.last || self.class.global_sprint_sharer + closest_ancestor = ancestors + .share_sprints_with_subprojects + .reorder(lft: :desc) + .limit(1) + + self.class + .where(id: closest_ancestor) + .or( + self.class.share_sprints_with_all_projects + .active + .where.not(Arel::Nodes::Exists.new(closest_ancestor.select(:id).arel)) + ) else - self + self.class.where(id:) end end end diff --git a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb index 15b4940eda0..1f2ed63bfae 100644 --- a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb +++ b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb @@ -99,7 +99,7 @@ RSpec.describe Projects::SprintSharing do shared_examples "returns the project itself" do it "returns only itself" do - expect(project.receive_sprints_from).to eq(project) + expect(project.receive_sprints_from).to contain_exactly(project) end end @@ -133,7 +133,7 @@ RSpec.describe Projects::SprintSharing do let(:parent_sprint_sharing) { "no_sharing" } it "returns only the global sharer" do - expect(project.receive_sprints_from).to eq(global_sharer) + expect(project.receive_sprints_from).to contain_exactly(global_sharer) end end @@ -143,7 +143,7 @@ RSpec.describe Projects::SprintSharing do let(:parent_sprint_sharing) { "share_subprojects" } it "returns only the closest sharing ancestor" do - expect(project.receive_sprints_from).to eq(parent_project) + expect(project.receive_sprints_from).to contain_exactly(parent_project) end end @@ -152,8 +152,8 @@ RSpec.describe Projects::SprintSharing do let(:root_sprint_sharing) { "no_sharing" } let(:parent_sprint_sharing) { "no_sharing" } - it "returns an empty array" do - expect(project.receive_sprints_from).to be_nil + it "returns an empty scope" do + expect(project.receive_sprints_from).to be_empty end end end From 9d0ffe4698dd8b7990f7564805574f25c1bf6ddc Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 10 Mar 2026 13:46:57 +0200 Subject: [PATCH 290/334] Do not expose the sharer project name if the user does not have permission to see it. --- .../projects/backlog_settings_contract.rb | 6 +++++- .../projects/settings/backlogs/sharing_form.rb | 6 +++++- modules/backlogs/config/locales/en.yml | 2 ++ .../projects/backlog_settings_contract_spec.rb | 11 +++++++++++ .../settings/backlog_sharing_settings_spec.rb | 14 ++++++++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb index e4ef7a61a18..40faf7f4f1f 100644 --- a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb +++ b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb @@ -57,7 +57,11 @@ module Projects (sharer = Project.global_sprint_sharer) && sharer != model - errors.add :sprint_sharing, :share_all_projects_already_taken, name: sharer.name + if user.allowed_in_project?(:view_project, sharer) + errors.add :sprint_sharing, :share_all_projects_already_taken, name: sharer.name + else + errors.add :sprint_sharing, :share_all_projects_already_taken_anonymous + end end end end diff --git a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb index cd46d7a96c8..a113da39861 100644 --- a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb +++ b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb @@ -85,7 +85,11 @@ module Projects def caption_for(option) if disabled?(option) - sharing_option_text(option, :disabled_caption, name: global_sprint_sharer.name) + if User.current.allowed_in_project?(:view_project, global_sprint_sharer) + sharing_option_text(option, :disabled_caption, name: global_sprint_sharer.name) + else + sharing_option_text(option, :disabled_caption_anonymous) + end else sharing_option_text(option, :caption) end diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index 7b8eec766be..ef130788c11 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -55,6 +55,7 @@ en: attributes: sprint_sharing: share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -211,6 +212,7 @@ en: label: "All projects" caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." share_subprojects: label: "Subprojects" caption: "Sprints created in this project will be available to all subprojects of the current project." diff --git a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb index d22d22a8002..f3b4dd9ed88 100644 --- a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb +++ b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb @@ -9,6 +9,7 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do let(:current_user) { build_stubbed(:user) } let(:project) { create(:project) } let(:can_share_sprint) { true } + let(:can_view_sharer) { true } subject(:contract) { described_class.new(project, current_user) } @@ -17,6 +18,10 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do .to receive(:allowed_in_project?) .with(:share_sprint, project) .and_return(can_share_sprint) + allow(current_user) + .to receive(:allowed_in_project?) + .with(:view_project, anything) + .and_return(can_view_sharer) end it "is expected to be a subclass of ModelContract" do @@ -88,6 +93,12 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do it_behaves_like "contract is valid" end + + context "when the current user cannot see the other project" do + let(:can_view_sharer) { false } + + it_behaves_like "contract is invalid", sprint_sharing: :share_all_projects_already_taken_anonymous + end end end end diff --git a/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb b/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb index 82097c4abc8..d71e46b6827 100644 --- a/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb +++ b/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb @@ -111,6 +111,20 @@ RSpec.describe "Backlogs project settings sprint sharing", :js, with_flag: { scr name: other_project.name) ) end + + context "when the current user cannot see the other project" do + let!(:other_project) { create(:project, public: false, name: "Sharer Project", sprint_sharing: "share_all_projects") } + + it "disables the all projects option without revealing the project name" do + visit project_settings_backlog_sharing_path(project) + + expect(page).to have_field("All projects", disabled: true) + expect(page).to have_text( + I18n.t("projects.settings.backlog_sharing.options.share_all_projects.disabled_caption_anonymous") + ) + expect(page).to have_no_text("Sharer Project") + end + end end end From 633ecb27fdd8a4ca8026a4d1ef73294f047001f4 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 10 Mar 2026 19:43:45 +0200 Subject: [PATCH 291/334] Use mock_permissions_for helper method in backlog settings contract spec. --- .../backlog_settings_contract_spec.rb | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb index f3b4dd9ed88..ceb81c2524f 100644 --- a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb +++ b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb @@ -8,20 +8,15 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do let(:current_user) { build_stubbed(:user) } let(:project) { create(:project) } - let(:can_share_sprint) { true } - let(:can_view_sharer) { true } + let(:permissions) { %i(share_sprint) } subject(:contract) { described_class.new(project, current_user) } before do - allow(current_user) - .to receive(:allowed_in_project?) - .with(:share_sprint, project) - .and_return(can_share_sprint) - allow(current_user) - .to receive(:allowed_in_project?) - .with(:view_project, anything) - .and_return(can_view_sharer) + mock_permissions_for(current_user) do |mock| + mock.allow_in_project(*permissions, project:) + mock.allow_in_project(*other_permissions, project: other_project) if defined?(other_project) + end end it "is expected to be a subclass of ModelContract" do @@ -50,13 +45,13 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do describe "permissions" do context "when user can share sprint" do - let(:can_share_sprint) { true } + let(:permissions) { %i(share_sprint) } it_behaves_like "contract is valid" end context "when user cannot share sprint" do - let(:can_share_sprint) { false } + let(:permissions) { [] } it_behaves_like "contract user is unauthorized" end @@ -79,6 +74,7 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do context "when another project already shares with all projects" do let!(:other_project) { create(:project, sprint_sharing: "share_all_projects") } + let(:other_permissions) { %i(view_project) } it_behaves_like "contract is invalid", sprint_sharing: :share_all_projects_already_taken @@ -95,7 +91,7 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do end context "when the current user cannot see the other project" do - let(:can_view_sharer) { false } + let(:other_permissions) { [] } it_behaves_like "contract is invalid", sprint_sharing: :share_all_projects_already_taken_anonymous end From 63fecb70d96699130ef7a494546ed6351c2817d8 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 10 Mar 2026 20:24:13 +0200 Subject: [PATCH 292/334] Wrap the backlogs settings into a turbo frame to enable turbo navigation. --- .../settings/backlog_sharings/show.html.erb | 16 +++++----- .../projects/settings/backlogs/show.html.erb | 30 ++++++++++--------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/modules/backlogs/app/views/projects/settings/backlog_sharings/show.html.erb b/modules/backlogs/app/views/projects/settings/backlog_sharings/show.html.erb index e816ac930d4..9bd54844005 100644 --- a/modules/backlogs/app/views/projects/settings/backlog_sharings/show.html.erb +++ b/modules/backlogs/app/views/projects/settings/backlog_sharings/show.html.erb @@ -27,11 +27,13 @@ See COPYRIGHT and LICENSE files for more details. ++#%> -<%= render( - Projects::Settings::Backlogs::SettingsHeaderComponent.new( - project: @project, - selected_tab: :sharing - ) - ) %> +<%= turbo_frame_tag "backlogs-settings" do %> + <%= render( + Projects::Settings::Backlogs::SettingsHeaderComponent.new( + project: @project, + selected_tab: :sharing + ) + ) %> -<%= render(Projects::Settings::Backlogs::SharingFormComponent.new(project: @project)) %> + <%= render(Projects::Settings::Backlogs::SharingFormComponent.new(project: @project)) %> +<% end %> diff --git a/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb b/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb index 3b859a6d1a8..5b03f325b49 100644 --- a/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb +++ b/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb @@ -27,19 +27,21 @@ See COPYRIGHT and LICENSE files for more details. ++#%> -<%= render( - Projects::Settings::Backlogs::SettingsHeaderComponent.new( - project: @project, - selected_tab: :done_status - ) - ) %> +<%= turbo_frame_tag "backlogs-settings" do %> + <%= render( + Projects::Settings::Backlogs::SettingsHeaderComponent.new( + project: @project, + selected_tab: :done_status + ) + ) %> -<%= - settings_primer_form_with( - url: project_settings_backlogs_path(@project), - model: @project, - method: :patch - ) do |f| -%> - <%= render Projects::Settings::BacklogsSettingsForm.new(f) %> + <%= + settings_primer_form_with( + url: project_settings_backlogs_path(@project), + model: @project, + method: :patch + ) do |f| + %> + <%= render Projects::Settings::BacklogsSettingsForm.new(f) %> + <% end %> <% end %> From 3cb9b9b0eb61ade3261ae7e9a8a0ebd77e0013d8 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Tue, 10 Mar 2026 20:27:34 +0200 Subject: [PATCH 293/334] Use a traditional request for submitting the forms, so that flash messages are displayed. --- .../settings/backlogs/settings_header_component.html.erb | 2 +- .../projects/settings/backlogs/sharing_form_component.html.erb | 2 +- .../app/views/projects/settings/backlogs/show.html.erb | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb index 31b3b63e423..985b7d9a585 100644 --- a/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb +++ b/modules/backlogs/app/components/projects/settings/backlogs/settings_header_component.html.erb @@ -66,7 +66,7 @@ See COPYRIGHT and LICENSE files for more details. tag: :button, href: rebuild_positions_project_settings_backlogs_path(@project), label: t(:"backlogs.rebuild_positions"), - form_arguments: { method: :post } + form_arguments: { method: :post, data: { turbo_frame: "_top" } } ) do |item| item.with_leading_visual_icon(icon: :sync) end diff --git a/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb b/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb index 6f9254ad933..0e5b2c1050a 100644 --- a/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb +++ b/modules/backlogs/app/components/projects/settings/backlogs/sharing_form_component.html.erb @@ -38,7 +38,7 @@ See COPYRIGHT and LICENSE files for more details. model: project, url: project_settings_backlog_sharing_path(project), method: :patch, - data: { controller: "show-when-value-selected" } + data: { turbo_frame: "_top", controller: "show-when-value-selected" } ) do |f| render(Projects::Settings::Backlogs::SharingForm.new(f)) end diff --git a/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb b/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb index 5b03f325b49..9b6c15a85f3 100644 --- a/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb +++ b/modules/backlogs/app/views/projects/settings/backlogs/show.html.erb @@ -39,7 +39,8 @@ See COPYRIGHT and LICENSE files for more details. settings_primer_form_with( url: project_settings_backlogs_path(@project), model: @project, - method: :patch + method: :patch, + data: { turbo_frame: "_top" } ) do |f| %> <%= render Projects::Settings::BacklogsSettingsForm.new(f) %> From 8236fd4d705e5a5c84383b1cec4b886894d5d0b6 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Wed, 11 Mar 2026 12:29:02 +0200 Subject: [PATCH 294/334] Rename Project#receive_sprints_from Project#sprint_source, rename SPRINT_SHARING_OPTIONS to SPRINT_SHARING_MODES --- .../projects/backlog_settings_contract.rb | 2 +- .../settings/backlogs/sharing_form.rb | 2 +- .../agile/sprints/scopes/for_project.rb | 2 +- .../app/models/projects/sprint_sharing.rb | 27 +++++++++++-------- .../backlog_settings_contract_spec.rb | 2 +- .../models/projects/sprint_sharing_spec.rb | 16 +++++------ 6 files changed, 28 insertions(+), 23 deletions(-) diff --git a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb index 40faf7f4f1f..ff6ee065517 100644 --- a/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb +++ b/modules/backlogs/app/contracts/projects/backlog_settings_contract.rb @@ -40,7 +40,7 @@ module Projects validate :validate_permissions validate :validate_global_sprint_sharer_uniqueness validates :sprint_sharing, presence: true - validates :sprint_sharing, inclusion: { in: Project::SPRINT_SHARING_OPTIONS }, allow_blank: true + validates :sprint_sharing, inclusion: { in: Project::SPRINT_SHARING_MODES }, allow_blank: true def validate_model? = false diff --git a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb index a113da39861..38eac5f43c5 100644 --- a/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb +++ b/modules/backlogs/app/forms/projects/settings/backlogs/sharing_form.rb @@ -47,7 +47,7 @@ module Projects name: :sprint_sharing, label: I18n.t("projects.settings.backlog_sharing.sprint_sharing") ) do |group| - Project::SPRINT_SHARING_OPTIONS.each do |option| + Project::SPRINT_SHARING_MODES.each do |option| group.radio_button( label: sharing_option_text(option, :label), value: option, diff --git a/modules/backlogs/app/models/agile/sprints/scopes/for_project.rb b/modules/backlogs/app/models/agile/sprints/scopes/for_project.rb index 81acbdbe1e0..1b0a1c65d72 100644 --- a/modules/backlogs/app/models/agile/sprints/scopes/for_project.rb +++ b/modules/backlogs/app/models/agile/sprints/scopes/for_project.rb @@ -37,7 +37,7 @@ module Agile::Sprints::Scopes::ForProject # it has some extra includes that are not necessary in this case. from_work_packages = WorkPackage.where(project:).where.not(sprint_id: nil) - where(project: project.receive_sprints_from) + where(project: project.sprint_source) .or(where(id: from_work_packages.select(:sprint_id))) end end diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index 2c5d5040a34..b59897390fd 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -36,7 +36,7 @@ module Projects::SprintSharing SHARE_SUBPROJECTS = "share_subprojects" RECEIVE_SHARED = "receive_shared" - SPRINT_SHARING_OPTIONS = [NO_SHARING, SHARE_ALL_PROJECTS, SHARE_SUBPROJECTS, RECEIVE_SHARED].freeze + SPRINT_SHARING_MODES = [NO_SHARING, SHARE_ALL_PROJECTS, SHARE_SUBPROJECTS, RECEIVE_SHARED].freeze included do store_attribute :settings, :sprint_sharing, :string @@ -49,7 +49,11 @@ module Projects::SprintSharing class_methods do def global_sprint_sharer - share_sprints_with_all_projects.active.first + global_sprint_sharer_relation.first + end + + def global_sprint_sharer_relation + share_sprints_with_all_projects.active.limit(1) end end @@ -75,25 +79,26 @@ module Projects::SprintSharing sprint_sharing == NO_SHARING end - def receive_sprints_from + def sprint_source # Senders and non-sharing projects only see their own sprints. # Receivers see external sprints from the closest ancestor sharing # subprojects, falling back to the global sharer. if receive_shared_sprints? - closest_ancestor = ancestors - .share_sprints_with_subprojects - .reorder(lft: :desc) - .limit(1) + closest_ancestor = closest_sharing_ancestor self.class - .where(id: closest_ancestor) + .where(id: closest_ancestor).limit(1) # Both sides of `or` must be structurally identical .or( - self.class.share_sprints_with_all_projects - .active - .where.not(Arel::Nodes::Exists.new(closest_ancestor.select(:id).arel)) + self.class.global_sprint_sharer_relation.where.not(closest_ancestor.arel.exists) ) else self.class.where(id:) end end + + private + + def closest_sharing_ancestor + ancestors.share_sprints_with_subprojects.reorder(lft: :desc).limit(1) + end end diff --git a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb index ceb81c2524f..510289290d1 100644 --- a/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb +++ b/modules/backlogs/spec/contracts/projects/backlog_settings_contract_spec.rb @@ -30,7 +30,7 @@ RSpec.describe Projects::BacklogSettingsContract, type: :model do it do expect(subject) - .to validate_inclusion_of(:sprint_sharing).in_array(Project::SPRINT_SHARING_OPTIONS) + .to validate_inclusion_of(:sprint_sharing).in_array(Project::SPRINT_SHARING_MODES) end # This spec of explicitly setting sprint_sharing to empty is required because the diff --git a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb index 1f2ed63bfae..f2e02dc64d0 100644 --- a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb +++ b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb @@ -5,15 +5,15 @@ require "spec_helper" RSpec.describe Projects::SprintSharing do let(:project) { create(:project) } - describe "SPRINT_SHARING_OPTIONS" do + describe "SPRINT_SHARING_MODES" do it "defines all supported sprint sharing options" do - expect(described_class::SPRINT_SHARING_OPTIONS).to match_array( + expect(described_class::SPRINT_SHARING_MODES).to match_array( %w[share_all_projects share_subprojects no_sharing receive_shared] ) end it "is exposed on Project" do - expect(Project::SPRINT_SHARING_OPTIONS).to eq(described_class::SPRINT_SHARING_OPTIONS) + expect(Project::SPRINT_SHARING_MODES).to eq(described_class::SPRINT_SHARING_MODES) end end @@ -82,7 +82,7 @@ RSpec.describe Projects::SprintSharing do end end - describe "#receive_sprints_from" do + describe "#sprint_source" do let(:global_sprint_sharing) { "share_all_projects" } let(:root_sprint_sharing) { "share_subprojects" } let(:parent_sprint_sharing) { "share_subprojects" } @@ -99,7 +99,7 @@ RSpec.describe Projects::SprintSharing do shared_examples "returns the project itself" do it "returns only itself" do - expect(project.receive_sprints_from).to contain_exactly(project) + expect(project.sprint_source).to contain_exactly(project) end end @@ -133,7 +133,7 @@ RSpec.describe Projects::SprintSharing do let(:parent_sprint_sharing) { "no_sharing" } it "returns only the global sharer" do - expect(project.receive_sprints_from).to contain_exactly(global_sharer) + expect(project.sprint_source).to contain_exactly(global_sharer) end end @@ -143,7 +143,7 @@ RSpec.describe Projects::SprintSharing do let(:parent_sprint_sharing) { "share_subprojects" } it "returns only the closest sharing ancestor" do - expect(project.receive_sprints_from).to contain_exactly(parent_project) + expect(project.sprint_source).to contain_exactly(parent_project) end end @@ -153,7 +153,7 @@ RSpec.describe Projects::SprintSharing do let(:parent_sprint_sharing) { "no_sharing" } it "returns an empty scope" do - expect(project.receive_sprints_from).to be_empty + expect(project.sprint_source).to be_empty end end end From 0fa2152ff56b00b547ef0713c9a7e86a2f9edb44 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Wed, 11 Mar 2026 12:29:34 +0200 Subject: [PATCH 295/334] Refactor sprint_source and related specs, add expectation with query limit. --- .../app/models/projects/sprint_sharing.rb | 16 +++-- .../agile/sprints/scopes/for_project_spec.rb | 63 +++++++++++++++++-- .../models/projects/sprint_sharing_spec.rb | 15 +++++ 3 files changed, 81 insertions(+), 13 deletions(-) diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index b59897390fd..c6e7b492073 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -84,13 +84,7 @@ module Projects::SprintSharing # Receivers see external sprints from the closest ancestor sharing # subprojects, falling back to the global sharer. if receive_shared_sprints? - closest_ancestor = closest_sharing_ancestor - - self.class - .where(id: closest_ancestor).limit(1) # Both sides of `or` must be structurally identical - .or( - self.class.global_sprint_sharer_relation.where.not(closest_ancestor.arel.exists) - ) + closest_sharing_ancestor_or_global_sharer else self.class.where(id:) end @@ -98,7 +92,11 @@ module Projects::SprintSharing private - def closest_sharing_ancestor - ancestors.share_sprints_with_subprojects.reorder(lft: :desc).limit(1) + def closest_sharing_ancestor_or_global_sharer + closest_ancestor = ancestors.share_sprints_with_subprojects.reorder(lft: :desc).limit(1) + + self.class + .where(id: closest_ancestor).limit(1) # Both sides of `or` must be structurally identical + .or(self.class.global_sprint_sharer_relation.where.not(closest_ancestor.arel.exists)) end end diff --git a/modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb b/modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb index b133619c29c..bd45f4578ae 100644 --- a/modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb +++ b/modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb @@ -31,15 +31,26 @@ require "spec_helper" RSpec.describe Agile::Sprints::Scopes::ForProject do - let(:project) { create(:project) } + let(:sprint_sharing) { "no_sharing" } + let(:project) { create(:project, sprint_sharing:) } let(:global_sharer) { create(:project, sprint_sharing: "share_all_projects") } let(:other_project) { create(:project) } let!(:sprint_in_project) { create(:agile_sprint, project:) } let!(:global_sprint) { create(:agile_sprint, project: global_sharer) } let!(:sprint_in_other_project) { create(:agile_sprint, project: other_project) } + shared_examples "executes a single SQL query" do + it "resolves for_project in a single query" do + expect { Agile::Sprint.for_project(project).load }.to have_a_query_limit(1) + end + end + describe ".for_project" do - context "when project does not receive sprints" do + context "when project does not receive sprints (no_sharing)" do + let(:sprint_sharing) { "no_sharing" } + + it_behaves_like "executes a single SQL query" + context "and there are no work package assignments" do it "returns only the project's own sprint" do expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project) @@ -65,8 +76,52 @@ RSpec.describe Agile::Sprints::Scopes::ForProject do end end + context "when project is a sender (share_subprojects)" do + let(:sprint_sharing) { "share_subprojects" } + + it_behaves_like "executes a single SQL query" + + context "and there are no work package assignments" do + it "returns only the project's own sprint" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project) + end + end + + context "and a work package in the project is assigned to a sprint from another project" do + let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } + let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } + + it "returns both the own sprint and the cross-project sprint" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) + end + end + end + + context "when project is a sender (share_all_projects)" do + let(:sprint_sharing) { "share_all_projects" } + + it_behaves_like "executes a single SQL query" + + context "and there are no work package assignments" do + it "returns only the project's own sprint" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project) + end + end + + context "and a work package in the project is assigned to a sprint from another project" do + let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } + let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } + + it "returns both the own sprint and the cross-project sprint" do + expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) + end + end + end + context "when project receives shared sprints" do - let(:project) { create(:project, sprint_sharing: "receive_shared") } + let(:sprint_sharing) { "receive_shared" } + + it_behaves_like "executes a single SQL query" context "and there is only a global sharer" do it "returns only the sprints shared from the global sharer project" do @@ -100,7 +155,7 @@ RSpec.describe Agile::Sprints::Scopes::ForProject do context "and there is a subproject-sharing ancestor" do let(:subproject_sharer) { create(:project, sprint_sharing: "share_subprojects") } - let(:project) { create(:project, parent: subproject_sharer, sprint_sharing: "receive_shared") } + let(:project) { create(:project, parent: subproject_sharer, sprint_sharing:) } let!(:subproject_sprint) { create(:agile_sprint, project: subproject_sharer) } it "returns only the sprints shared from the closest subproject-sharing ancestor" do diff --git a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb index f2e02dc64d0..146eb137aff 100644 --- a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb +++ b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb @@ -103,16 +103,24 @@ RSpec.describe Projects::SprintSharing do end end + shared_examples "executes a single SQL query" do + it "resolves sprint_source in a single query" do + expect { project.sprint_source.load }.to have_a_query_limit(1) + end + end + context "when sprint_sharing is no_sharing (default)" do let(:project_sprint_sharing) { "no_sharing" } it_behaves_like "returns the project itself" + it_behaves_like "executes a single SQL query" end context "when sprint_sharing is share_subprojects" do let(:project_sprint_sharing) { "share_subprojects" } it_behaves_like "returns the project itself" + it_behaves_like "executes a single SQL query" end context "when sprint_sharing is share_all_projects" do @@ -122,6 +130,7 @@ RSpec.describe Projects::SprintSharing do let(:project_sprint_sharing) { "share_all_projects" } it_behaves_like "returns the project itself" + it_behaves_like "executes a single SQL query" end context "when sprint_sharing is receive_shared" do @@ -135,6 +144,8 @@ RSpec.describe Projects::SprintSharing do it "returns only the global sharer" do expect(project.sprint_source).to contain_exactly(global_sharer) end + + it_behaves_like "executes a single SQL query" end context "with a global sharer and both ancestors sharing subprojects" do @@ -145,6 +156,8 @@ RSpec.describe Projects::SprintSharing do it "returns only the closest sharing ancestor" do expect(project.sprint_source).to contain_exactly(parent_project) end + + it_behaves_like "executes a single SQL query" end context "with no sharing sources" do @@ -155,6 +168,8 @@ RSpec.describe Projects::SprintSharing do it "returns an empty scope" do expect(project.sprint_source).to be_empty end + + it_behaves_like "executes a single SQL query" end end end From 93c030a60d0ff9216311fdc8418a1a956fe18ba5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:33:32 -0300 Subject: [PATCH 296/334] Bump docker/login-action from 3 to 4 (#22255) Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/login-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 4 ++-- .github/workflows/hocuspocus-docker.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 8710da37d9f..10919e0228b 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -197,7 +197,7 @@ jobs: id: buildx uses: docker/setup-buildx-action@v4 - name: Login to Docker Hub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -342,7 +342,7 @@ jobs: tags: | ${{ needs.setup.outputs.docker_tags }} - name: Login to Docker Hub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.github/workflows/hocuspocus-docker.yml b/.github/workflows/hocuspocus-docker.yml index fc1e60ed6d7..2ac162061b1 100644 --- a/.github/workflows/hocuspocus-docker.yml +++ b/.github/workflows/hocuspocus-docker.yml @@ -83,7 +83,7 @@ jobs: echo $REGISTRY:$LATEST_TAG >> $GITHUB_OUTPUT echo 'EOF' >> $GITHUB_OUTPUT - name: Login to Docker Hub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} From 1e20effb91495e8bf7c98a25b4e3a41a311d335d Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Wed, 11 Mar 2026 13:57:27 +0100 Subject: [PATCH 297/334] Rename "last check" to "last sync" This affects the section for "automatically managed project folders", which actually does not indicate the time at which a dedicated health CHECK was performed, but rather indicates the last time that an AMPF sync was attempted and whether that succeeded or not. This is confusing to users, because seemingly we have two health checks, when in fact there's just a single health check. The AMPF job is a job that performs a task and it can do so successfully or not. Hopefully this change makes it more clear to users that if an error occurs during AMPF sync, that something went wrong. --- .../admin/side_panel/health_notifications_component.html.erb | 2 +- modules/storages/config/locales/en.yml | 1 + .../admin/side_panel/health_notifications_component_spec.rb | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/storages/app/components/storages/admin/side_panel/health_notifications_component.html.erb b/modules/storages/app/components/storages/admin/side_panel/health_notifications_component.html.erb index f0272abe837..0e9592207f0 100644 --- a/modules/storages/app/components/storages/admin/side_panel/health_notifications_component.html.erb +++ b/modules/storages/app/components/storages/admin/side_panel/health_notifications_component.html.erb @@ -36,7 +36,7 @@ See COPYRIGHT and LICENSE files for more details. notifications_container.with_row do concat( render(Primer::Beta::Text.new(pr: 2, test_selector: "storage-health-checked-at")) do - I18n.t("storages.health.checked", datetime: helpers.format_time(@storage.health_checked_at)) + I18n.t("storages.health.synced", datetime: helpers.format_time(@storage.health_checked_at)) end ) diff --git a/modules/storages/config/locales/en.yml b/modules/storages/config/locales/en.yml index 495e3d32266..b2216df015b 100644 --- a/modules/storages/config/locales/en.yml +++ b/modules/storages/config/locales/en.yml @@ -373,6 +373,7 @@ en: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/spec/components/storages/admin/side_panel/health_notifications_component_spec.rb b/modules/storages/spec/components/storages/admin/side_panel/health_notifications_component_spec.rb index 7cf678a7f50..c3dba9cb762 100644 --- a/modules/storages/spec/components/storages/admin/side_panel/health_notifications_component_spec.rb +++ b/modules/storages/spec/components/storages/admin/side_panel/health_notifications_component_spec.rb @@ -58,7 +58,7 @@ RSpec.describe Storages::Admin::SidePanel::HealthNotificationsComponent, type: : it "shows a healthy status" do expect(page).to have_test_selector("storage-health-status", text: "Healthy") - expect(page).to have_test_selector("storage-health-checked-at", text: "Last check: 11/28/2023 01:02 AM") + expect(page).to have_test_selector("storage-health-checked-at", text: "Last sync: 11/28/2023 01:02 AM") end end From a510889d1a374555df79ac1c8d74ec5a2056df07 Mon Sep 17 00:00:00 2001 From: ulferts Date: Wed, 11 Mar 2026 16:02:17 +0100 Subject: [PATCH 298/334] include `add work package attachments` to capabilities api --- config/initializers/permissions.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/initializers/permissions.rb b/config/initializers/permissions.rb index 777e2247c47..beee0e35280 100644 --- a/config/initializers/permissions.rb +++ b/config/initializers/permissions.rb @@ -399,7 +399,8 @@ Rails.application.reloader.to_prepare do wpt.permission :add_work_package_attachments, {}, permissible_on: %i[work_package project], - dependencies: :view_work_packages + dependencies: :view_work_packages, + contract_actions: { work_package_attachments: %i[create] } # WorkPackage categories wpt.permission :manage_categories, From 627755b6b777f6d3135b1ac799c73eb15ffa7de4 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Wed, 11 Mar 2026 19:12:24 +0200 Subject: [PATCH 299/334] Fix specs --- .../projects/settings/backlog_sharing_settings_spec.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb b/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb index d71e46b6827..33ad5f37a6b 100644 --- a/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb +++ b/modules/backlogs/spec/features/projects/settings/backlog_sharing_settings_spec.rb @@ -32,7 +32,7 @@ require "rails_helper" RSpec.describe "Backlogs project settings sprint sharing", :js, with_flag: { scrum_projects: true } do let(:project) { create(:project) } - let(:permissions) { %i[create_sprints share_sprint] } + let(:permissions) { %i[create_sprints share_sprint select_done_statuses] } let(:current_user) do create(:user, member_with_permissions: { project => permissions }) @@ -107,8 +107,7 @@ RSpec.describe "Backlogs project settings sprint sharing", :js, with_flag: { scr expect(page).to have_field("All projects", disabled: true) expect(page).to have_text( - I18n.t("projects.settings.backlog_sharing.options.share_all_projects.disabled_caption", - name: other_project.name) + I18n.t("projects.settings.backlog_sharing.options.share_all_projects.disabled_caption_anonymous") ) end @@ -129,7 +128,7 @@ RSpec.describe "Backlogs project settings sprint sharing", :js, with_flag: { scr end context "without share_sprint permission" do - let(:permissions) { %i[create_sprints] } + let(:permissions) { %i[create_sprints select_done_statuses] } it "does not show the sharing tab and forbids direct route access" do visit project_settings_backlogs_path(project) From 3a896072de93df8caa6f8a691aff92083091cdb7 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Thu, 12 Mar 2026 03:51:39 +0000 Subject: [PATCH 300/334] update locales from crowdin [ci skip] --- config/locales/crowdin/fr.yml | 50 ++++++++++--------- config/locales/crowdin/ru.yml | 10 ++-- .../backlogs/config/locales/crowdin/ru.yml | 2 +- modules/budgets/config/locales/crowdin/ru.yml | 10 ++-- modules/meeting/config/locales/crowdin/ru.yml | 26 +++++----- .../storages/config/locales/crowdin/af.yml | 1 + .../storages/config/locales/crowdin/ar.yml | 1 + .../storages/config/locales/crowdin/az.yml | 1 + .../storages/config/locales/crowdin/be.yml | 1 + .../storages/config/locales/crowdin/bg.yml | 1 + .../storages/config/locales/crowdin/ca.yml | 1 + .../config/locales/crowdin/ckb-IR.yml | 1 + .../storages/config/locales/crowdin/cs.yml | 1 + .../storages/config/locales/crowdin/da.yml | 1 + .../storages/config/locales/crowdin/de.yml | 1 + .../storages/config/locales/crowdin/el.yml | 1 + .../storages/config/locales/crowdin/eo.yml | 1 + .../storages/config/locales/crowdin/es.yml | 1 + .../storages/config/locales/crowdin/et.yml | 1 + .../storages/config/locales/crowdin/eu.yml | 1 + .../storages/config/locales/crowdin/fa.yml | 1 + .../storages/config/locales/crowdin/fi.yml | 1 + .../storages/config/locales/crowdin/fil.yml | 1 + .../storages/config/locales/crowdin/fr.yml | 1 + .../storages/config/locales/crowdin/he.yml | 1 + .../storages/config/locales/crowdin/hi.yml | 1 + .../storages/config/locales/crowdin/hr.yml | 1 + .../storages/config/locales/crowdin/hu.yml | 1 + .../storages/config/locales/crowdin/id.yml | 1 + .../storages/config/locales/crowdin/it.yml | 1 + .../storages/config/locales/crowdin/ja.yml | 1 + .../storages/config/locales/crowdin/ka.yml | 1 + .../storages/config/locales/crowdin/kk.yml | 1 + .../storages/config/locales/crowdin/ko.yml | 1 + .../storages/config/locales/crowdin/lt.yml | 1 + .../storages/config/locales/crowdin/lv.yml | 1 + .../storages/config/locales/crowdin/mn.yml | 1 + .../storages/config/locales/crowdin/ms.yml | 1 + .../storages/config/locales/crowdin/ne.yml | 1 + .../storages/config/locales/crowdin/nl.yml | 1 + .../storages/config/locales/crowdin/no.yml | 1 + .../storages/config/locales/crowdin/pl.yml | 1 + .../storages/config/locales/crowdin/pt-BR.yml | 1 + .../storages/config/locales/crowdin/pt-PT.yml | 1 + .../storages/config/locales/crowdin/ro.yml | 1 + .../storages/config/locales/crowdin/ru.yml | 1 + .../storages/config/locales/crowdin/rw.yml | 1 + .../storages/config/locales/crowdin/si.yml | 1 + .../storages/config/locales/crowdin/sk.yml | 1 + .../storages/config/locales/crowdin/sl.yml | 1 + .../storages/config/locales/crowdin/sr.yml | 1 + .../storages/config/locales/crowdin/sv.yml | 1 + .../storages/config/locales/crowdin/th.yml | 1 + .../storages/config/locales/crowdin/tr.yml | 1 + .../storages/config/locales/crowdin/uk.yml | 1 + .../storages/config/locales/crowdin/uz.yml | 1 + .../storages/config/locales/crowdin/vi.yml | 1 + .../storages/config/locales/crowdin/zh-CN.yml | 1 + .../storages/config/locales/crowdin/zh-TW.yml | 1 + 59 files changed, 105 insertions(+), 47 deletions(-) diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index c2de1c2c5c7..31323475f70 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -615,11 +615,13 @@ fr: op_dry_validation: or: "ou" errors: + unexpected_key: "is not allowed." array?: "doit être un tableau." decimal?: "doit être une décimale." defined: "ne doit pas être défini." eql?: "doit être égal à %{left}." filled?: "doit être rempli." + format?: "is in invalid format." greater_or_equal_zero: "doit être supérieur ou égal à 0." gteq?: "doit être supérieur ou égal à %{num}." hash?: "doit être un hachage." @@ -646,7 +648,9 @@ fr: parent: not_descendant: "doit être un descendant de la racine de la hiérarchie." str?: "doit être une chaîne de caractères." + time?: "must be a time." type?: "doit être de type : %{type}." + uri?: "is not a valid URI." rules: copy_workflow_from: "Type de copie du flux de travail" enabled: "Activé" @@ -1051,7 +1055,7 @@ fr: next_button: "Envoyer une invitation" success_message: user: "L'utilisateur peut maintenant se connecter pour accéder à %{project}. En attendant, vous pouvez déjà compter sur cet utilisateur et l'assigner à des lots de travaux, par exemple." - placeholder_user: "L'utilisateur fictif peut maintenant être utilisé dans %{project}. En attendant, vous pouvez déjà planifier des taches avec cet utilisateur et l'assigner à des lots de travaux, par exemple." + placeholder_user: "L'utilisateur fictif peut maintenant être utilisé dans %{project}. En attendant, vous pouvez déjà planifier des tâches avec cet utilisateur et l'assigner à des lots de travaux, par exemple." group: "Le groupe fait maintenant partie du projet %{project}. En attendant, vous pouvez déjà compter sur ce groupe et l'assigner à des lots de travaux, par exemple." page: text: "Texte" @@ -1178,7 +1182,7 @@ fr: matrix_check_uncheck_all_in_col_label_html: "Activer/désactiver les transitions de tous les anciens statuts vers %{new_status}" work_flows: index: - no_results_title_text: Il n'y a actuellement aucun flux de travaux. + no_results_title_text: Il n'y a actuellement aucun flux de travail. work_packages: datepicker_modal: banner: @@ -1871,7 +1875,7 @@ fr: reason: no_notification_reason: "ne peut pas être vide car IAN est choisi comme canal." reason_mail_digest: - no_notification_reason: "ne peut pas être vide car le digest d'email est est choisi comme un canal." + no_notification_reason: "ne peut pas être vide car le digest d'email est choisi comme un canal." non_working_day: attributes: date: @@ -2207,9 +2211,9 @@ fr: created_on: "créé le %{datetime}" created_on_time_entry: "temps enregistré le %{datetime}" updated_by_on: "mis à jour par %{user} le %{datetime}" - updated_by_on_time_entry: "temps enregistré mis à jour par %{user} le %{datetime}" + updated_by_on_time_entry: "temps consigné mis à jour par %{user} le %{datetime}" updated_on: "mis à jour le %{datetime}" - updated_on_time_entry: "temps enregistré mis à jour le %{datetime}" + updated_on_time_entry: "temps consigné mis à jour le %{datetime}" deleted_on: "supprimé le %{datetime}" deleted_by_on: "supprimé par %{user} le %{datetime}" added_on: "ajouté le %{datetime}" @@ -2633,7 +2637,7 @@ fr: other: "%{count} ans" x_seconds: one: "une seconde" - other: "%{count} seconde" + other: "%{count} secondes" x_seconds_abbreviated: one: "1 s" other: "%{count} s" @@ -2890,8 +2894,8 @@ fr: error_unable_to_connect: "Impossible de se connecter (%{value})" error_unable_delete_wiki: "Impossible de supprimer la page wiki." error_unable_update_wiki: "Impossible de mettre la page wiki à jour." - error_workflow_copy_source: "Veuillez sélectioner un type de source ou rôle" - error_workflow_copy_target: "Veuillez sélectioner une cible type(s) et rôle(s)" + error_workflow_copy_source: "Veuillez sélectionner un type de source ou rôle" + error_workflow_copy_target: "Veuillez sélectionner une cible type(s) et rôle(s)" error_menu_item_not_created: L'élément de menu n'a pas pu être ajouté error_menu_item_not_saved: L'élément de menu n'a pas pu être sauvegardé error_wiki_root_menu_item_conflict: > @@ -3140,7 +3144,7 @@ fr: work_package_related_changed_times: par changement vers %{link} connexe work_package_duplicate_closed: Le statut a été mis à jour automatiquement par le doublon de lot de travaux %{link} unaccessable_work_package_changed: par changement vers un lot de travaux connexe - budget_deleted: La budget a été supprimé + budget_deleted: Le budget a été supprimé working_days_changed: changed: "par changement vers des jours ouvrables (%{changes})" days: @@ -3675,7 +3679,7 @@ fr: label_not_configured: "Non configuré" label_not_found: "non trouvé" label_none: "aucune" - label_none_parentheses: "(none)" + label_none_parentheses: "(aucun)" label_not_contains: "ne contient pas" label_not_equals: "n'est pas" label_life_cycle_step_plural: "Cycle de vie du projet" @@ -3948,7 +3952,7 @@ fr: label_work_package_tracking: "Suivi des lots de travaux" label_work_package_view_all: "Afficher tous les lots de travaux" label_workflow: "Flux de travail" - label_workflow_copy: "Copier le processus d'entreprise" + label_workflow_copy: "Copier le flux de travail" label_workflow_plural: "Flux de travail" label_workflow_summary: "Résumé" label_working_days_and_hours: "Jours et heures travaillés" @@ -4212,7 +4216,7 @@ fr: notice_project_not_deleted: "Le projet n'a pas été supprimé." notice_project_not_found: "Projet introuvable." notice_smtp_address_unsafe: "L'adresse SMTP %{address} n'est pas sûre. Veuillez l'ajouter à OPENPROJECT_SSRF_PROTECTION_ALLOWLIST." - notice_successful_connection: "Connection réussie." + notice_successful_connection: "Connexion réussie." notice_successful_create: "Création réussie." notice_successful_delete: "Suppression réussie." notice_successful_cancel: "Annulation réussie." @@ -4234,7 +4238,7 @@ fr: notice_wont_delete_auth_source: La connexion LDAP ne peut pas être supprimée tant que des utilisateurs l'utilisent. notice_project_cannot_update_custom_fields: "Vous ne pouvez pas mettre à jour les champs personnalisés disponibles du projet. Le projet n’est pas valide : %{errors}" notice_attachment_migration_wiki_page: > - Cette page a été générée automatiquement durant la mise à jour de OpenProject. Il contient toutes les pièces jointes précédemment associées à la %{container_type} « %{container_name} ». + Cette page a été générée automatiquement durant la mise à jour de OpenProject. Elle contient toutes les pièces jointes précédemment associées à la %{container_type} « %{container_name} ». #Default format for numbers number: format: @@ -4630,9 +4634,9 @@ fr: setting_use_wysiwyg_description: "Sélectionnez cette option pour activer l’éditeur CKEditor5 WYSIWYG pour tous les utilisateurs par défaut. CKEditor a des fonctionnalités limitées pour GFM Markdown." setting_column_options: "Colonnes de listes du lot de travaux par défaut" setting_commit_fix_keywords: "Réparer les mots clés" - setting_commit_logs_encoding: "Encoding of the Commit messages" - setting_commit_logtime_activity_id: "Activité pour les « Logged Time »" - setting_commit_logtime_enabled: "Activer « time logging »" + setting_commit_logs_encoding: "Encodage des messages de commit" + setting_commit_logtime_activity_id: "Activité pour le temps consignés" + setting_commit_logtime_enabled: "Activer la consignation de temps" setting_commit_ref_keywords: "Referencement des mots clés" setting_consent_time: "Moment de l'accord" setting_consent_info: "Texte d'information sur l'accord" @@ -4682,7 +4686,7 @@ fr: setting_work_package_startdate_is_adddate: "Utiliser la date actuelle comme date de début des nouveaux lots de travaux" setting_work_packages_projects_export_limit: "Limite d'exportation des lots de travaux/projets" setting_journal_aggregation_time_minutes: "Actions utilisateur agrégées dans" - setting_log_requesting_user: "Enregister le login utilisateur, nom et adresse e-mail pour toutes les requêtes" + setting_log_requesting_user: "Enregistrer le login utilisateur, nom et adresse e-mail pour toutes les requêtes" setting_login_required: "Authentification requise" setting_login_required_caption: "Lorsque cette case est cochée, toutes les requêtes envoyées à l'application doivent être authentifiées." setting_lost_password: "Activer la réinitialisation du mot de passe" @@ -4696,7 +4700,7 @@ fr: setting_new_project_send_confirmation_email: "Envoyer une notification à l'auteur lors de la création d'un nouveau projet" setting_new_project_notification_text: "Texte de la notification" setting_password_active_rules: "Les classes de caractère activées" - setting_password_count_former_banned: "Nombre des plus récent mots des passe utilisé qui sont interdit de réutilisation." + setting_password_count_former_banned: "Nombre de mots de passe récents interdits de réutilisation" setting_password_days_valid: "Nombre de jours après lequel le changement de mot de passe est obligatoire" setting_password_min_length: "Longueur minimale" setting_password_min_adhered_rules: "Nombre minimale des classe de caractère requise" @@ -4722,7 +4726,7 @@ fr: setting_repository_checkout_base_url: "URL de base de « checkout »" setting_repository_checkout_text: "Texte d'instruction de « checkout »" setting_repository_log_display_limit: "Nombre maximal des révisions affichées sur « file log »" - setting_repository_truncate_at: "Le nombre maiximum de fichiers exposes au navigateur" + setting_repository_truncate_at: "Le nombre maximum de fichiers affichés dans le navigateur de dépôt" setting_self_registration: "Auto-enregistrement" setting_self_registration_caption: > Choisissez le mécanisme d'auto-inscription pour les utilisateurs. Faites attention au paramètre que vous choisissez, car certaines options permettent aux utilisateurs d'activer leurs propres comptes pour cette instance. @@ -5042,7 +5046,7 @@ fr: text_load_default_configuration: "Charger la configuration par défaut" text_no_roles_defined: Il n'y a pas de rôles définis. text_no_access_tokens_configurable: "Il n'y a aucun jeton d'accès qui puisse être configuré." - text_no_configuration_data: "Les rôles, les types, l'état des lots de travaux et les flux de travaux n'ont pas encore été configurés.\nIl est fortement recommandé de charger la configuration par défaut. Vous serez capable de la modifier une fois chargée." + text_no_configuration_data: "Les rôles, les types, l'état des lots de travaux et les flux de travail n'ont pas encore été configurés.\nIl est fortement recommandé de charger la configuration par défaut. Vous serez capable de la modifier une fois chargée." text_no_notes: "Il n'existe aucun commentaire pour ce lot de travaux." text_notice_too_many_values_are_inperformant: "Remarque : L'affichage de plus de 100 articles par page peut augmenter le temps de chargement de la page." text_notice_security_badge_displayed_html: > @@ -5471,7 +5475,7 @@ fr: none_given: "Aucune application OAuth n'a été autorisée à accéder à votre compte utilisateur." x_active_tokens: one: "un jeton actif" - other: "un jeton actif %{count}" + other: "%{count} jetons actifs" flows: authorization_code: "Flux de code d'autorisation" client_credentials: "Flux des informations d'identification client" @@ -5527,8 +5531,8 @@ fr: invalid_scope: "Vous n'êtes pas autorisé à accéder à la ressource demandée (invalid_scope)." http: request: - failed_authorization: "La requête côté serveur a échoué en s'autorisant elle-même." - missing_authorization: "La requête latérale du serveur a échoué en raison de l'absence d'informations d'autorisation." + failed_authorization: "La requête côté serveur a échoué lors de l'authentification." + missing_authorization: "La requête côté serveur a échoué en raison de l'absence d'informations d'autorisation." response: unexpected: "Réponse inattendue reçue." you: vous diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index f5d29996295..4901eb09a71 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -626,13 +626,13 @@ ru: op_dry_validation: or: "или" errors: - unexpected_key: "is not allowed." + unexpected_key: "не разрешено." array?: "должно быть массивом." decimal?: "должно быть десятичным." defined: "не должно быть определено." eql?: "должно быть равно %{left}." filled?: "должно быть заполнено." - format?: "is in invalid format." + format?: "неверный формат." greater_or_equal_zero: "должно быть больше или равно 0." gteq?: "должно быть больше или равно %{num}." hash?: "должно быть хэш." @@ -659,9 +659,9 @@ ru: parent: not_descendant: "должно быть потомком корневого уровня иерархии." str?: "должно быть строкой." - time?: "must be a time." + time?: "должно быть единицей времени." type?: "должно быть %{type}." - uri?: "is not a valid URI." + uri?: "не является допустимым URI." rules: copy_workflow_from: "Тип копии рабочего процесса" enabled: "Включено" @@ -5118,7 +5118,7 @@ ru: text_default_administrator_account_changed: "Первоначальная учетная запись администратора была изменена" text_default_encoding: "По-умолчанию: UTF-8" text_destroy: "Удалить" - text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "Есть дополнительные объекты, ассоцированные с пакетом(-ами) работ, которые должны быть удалены. Это объекты следующих типов:" text_destroy_what_to_do: "Что Вы хотите сделать?" text_diff_truncated: "... Этот разностность(diff) была усечена, так как она превышает максимальный размер, которые может быть отображен." text_email_delivery_not_configured: "Доставка электронной почты не настроена, уведомления отключены.\nНастройте SMTP-сервер, чтобы включить их." diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index 01134c1718d..eae4ea8ec96 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -56,7 +56,7 @@ ru: any: "любой" column_width: "Ширина столбца" definition_of_done: "Определение термина \"Завершено\"" - definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + definition_of_done_caption: "Пакеты работ с такими статусами рассматриваются как завершенные в представлениях бэклога и отчетах." impediment: "Препятствие" label_versions_default_fold_state: "Показать свернутые версии" caption_versions_default_fold_state: "Версии не будут разворачиваться по умолчанию при просмотре бэклогов. Каждая версия должна быть развернута вручную." diff --git a/modules/budgets/config/locales/crowdin/ru.yml b/modules/budgets/config/locales/crowdin/ru.yml index a9ca6fc08c1..605e3cd5a26 100644 --- a/modules/budgets/config/locales/crowdin/ru.yml +++ b/modules/budgets/config/locales/crowdin/ru.yml @@ -89,12 +89,12 @@ ru: other: "Данные, собранные из %{count} бюджетов, включены в этот проект и его подпроекты." program: zero: "Нет данных о бюджете." - one: "Data aggregated from %{count} budget included in this program and its subitems." - other: "Data aggregated from %{count} budgets included in this program and its subitems." + one: "Данные, собранные из %{count} бюджета, включены в эту программу и её подпрограммы." + other: "Данные, собранные из %{count} бюджетов, включены в эту программу и её подпрограммы." portfolio: - zero: "No budget data." - one: "Data aggregated from %{count} budget included in this portfolio and its subitems." - other: "Data aggregated from %{count} budgets included in this portfolio and its subitems." + zero: "Нет данных о бюджете." + one: "Данные, собранные из %{count} бюджета, включены в этот портфель и его подпункты." + other: "Данные, собранные из %{count} бюджетов, включены в этот портфель и его подпункты." view_details: "Посмотреть детали бюджета" events: budget: "Бюджет изменен" diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index ab2052d8fb7..3d54f2873fa 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -63,7 +63,7 @@ ru: end_date: "Дате окончания" iterations: "События" recurring_meeting_interim_response: - start_time: "Start time" + start_time: "Время начала" meeting_participant: invited: "Приглашённые" attended: "Участвовал" @@ -76,7 +76,7 @@ ru: section_not_belong_to_meeting: "Раздел не принадлежит к одному и тому же совещанию." user_invalid: "не является действительным участником." recurring_meeting_interim_response: - not_an_occurrence: "is not a valid occurrence time for this recurring meeting" + not_an_occurrence: "не является допустимым временем повторения совещания" recurring_meeting: must_cover_existing_meetings: one: "В серии есть одно открытое совещание, которое не включено в новый график. Измените график, чтобы включить все существующие совещания." @@ -206,7 +206,7 @@ ru: label_start_date: "Дата начала" label_subscribe_icalendar: "Подписаться на календарь" caption_meeting_template_select: "Выберите шаблон для автоматического копирования его повестки дня" - caption_template_project_select: "Please select the project in which to create this meeting template" + caption_template_project_select: "Пожалуйста, выберите проект, в котором будет создан этот шаблон совещания" meeting: participants: label: @@ -226,8 +226,8 @@ ru: heading: "Нет участников" description: "Пока нет участников." attachments: - onetime_template: "These attached files will be included in all future meetings using this template." - series_template: "These attached files will be included in all future meetings in the series." + onetime_template: "Эти прикрепленные файлы будут включены во все последующие совещания, проводимые по этому шаблону." + series_template: "Эти прикрепленные файлы будут включены во все последующие совещания этой серии." text: "Прикрепленные файлы доступны всем участникам совещания. Вы также можете перенести их в примечания к пунктам повестки дня." copy: title: "Копировать совещание %{title}" @@ -259,9 +259,9 @@ ru: header: "Отменено: совещание '%{title}'" header_occurrence: "Отменено: событие совещания '%{title}'" header_series: "Отменено: серия совещаний '%{title}'" - 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" + summary_occurrence: "Начало '%{title}' было отменено %{actor}, или вы были удалены из списка участников" + summary_series: "Серия совещаний '%{title}' была отменена %{actor}, или вы были удалены из списка участников" + summary: "'%{title}' было отменено %{actor}, или вы были удалены из списка участников" date_time: "Запланированная дата/время" participant_added: header: "Совещание '%{title}' - участник добавлен" @@ -275,7 +275,7 @@ ru: summary_series: "%{actor} удалил %{participant} из серии совещаний '%{title}'" ended: header_series: "Завершено: Серия совещаний '%{title}'" - summary_series: "Meeting series '%{title}' has been ended by %{actor}" + summary_series: "Серия совещаний '%{title}' была завершена %{actor}" updated: header: "Встреча '%{title}' была обновлена" summary: "Совещание '%{title}' было обновлено пользователем %{actor}" @@ -304,7 +304,7 @@ ru: title: "Удалить шаблон" heading: "Удалить этот шаблон?" confirmation_message_html: > - This action is not reversible. Please proceed with caution. Existing meetings that were created using this template will not be affected. + Это действие не обратимо. Пожалуйста, действуйте с осторожностью. Существующие совещания, созданные с помощью этого шаблона, не будут затронуты. occurrence: title: "Отменить это событие" heading: "Отменить это событие?" @@ -570,8 +570,8 @@ ru: label_agenda_item_move_up: "Вверх" label_agenda_item_move_down: "Вниз" label_agenda_item_duplicate: "Дубликат" - label_agenda_item_duplicate_in_next: "Duplicate in next meeting" - label_agenda_item_duplicate_in_next_title: "Duplicate in next meeting?" + label_agenda_item_duplicate_in_next: "Продублировать в следующее совещание" + label_agenda_item_duplicate_in_next_title: "Продублировать в следующее совещание?" label_agenda_item_add_notes: "Добавить заметки" label_agenda_item_add_outcome: "Добавить итог" label_agenda_item_work_package_add: "Добавить пакет работ" @@ -632,7 +632,7 @@ ru: text_meeting_draft_banner: "В настоящее время Вы находитесь в режиме черновика. Это совещание не будет рассылать никаких обновлений календаря или приглашений, даже если Вы измените детали совещания или добавите/удалите участников." text_onetime_meeting_template_banner: "В данный момент Вы редактируете шаблон совещания. Вы можете использовать этот шаблон для создания одноразовых совещаний с заранее определенной повесткой дня. Изменения не повлияют на уже созданные совещания." text_onetime_meeting_template_empty_heading: "Этот шаблон совещания пуст" - text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." + text_onetime_meeting_template_empty_description: "Добавьте сюда пункты повестки дня, разделы и вложения. Они будут включены в каждое совещание, созданное с помощью этого шаблона." text_exit_draft_mode_dialog_title: "Открыть это совещание и разослать приглашения?" text_exit_draft_mode_dialog_subtitle: "Вы не можете вернуться в режим черновика после того, как запланировали совещание." text_exit_draft_mode_dialog_template_title: "Открыть первое совещание из этой серии?" diff --git a/modules/storages/config/locales/crowdin/af.yml b/modules/storages/config/locales/crowdin/af.yml index a3e1eae664d..79cc3a1cece 100644 --- a/modules/storages/config/locales/crowdin/af.yml +++ b/modules/storages/config/locales/crowdin/af.yml @@ -372,6 +372,7 @@ af: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/ar.yml b/modules/storages/config/locales/crowdin/ar.yml index 35136372029..1426a11e5c8 100644 --- a/modules/storages/config/locales/crowdin/ar.yml +++ b/modules/storages/config/locales/crowdin/ar.yml @@ -380,6 +380,7 @@ ar: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/az.yml b/modules/storages/config/locales/crowdin/az.yml index 837192548b5..abb249dc335 100644 --- a/modules/storages/config/locales/crowdin/az.yml +++ b/modules/storages/config/locales/crowdin/az.yml @@ -372,6 +372,7 @@ az: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/be.yml b/modules/storages/config/locales/crowdin/be.yml index e5b4ae686bc..47a23120fcb 100644 --- a/modules/storages/config/locales/crowdin/be.yml +++ b/modules/storages/config/locales/crowdin/be.yml @@ -376,6 +376,7 @@ be: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/bg.yml b/modules/storages/config/locales/crowdin/bg.yml index f776454f834..a4b66915d64 100644 --- a/modules/storages/config/locales/crowdin/bg.yml +++ b/modules/storages/config/locales/crowdin/bg.yml @@ -372,6 +372,7 @@ bg: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/ca.yml b/modules/storages/config/locales/crowdin/ca.yml index 73998b14972..aec10002a86 100644 --- a/modules/storages/config/locales/crowdin/ca.yml +++ b/modules/storages/config/locales/crowdin/ca.yml @@ -372,6 +372,7 @@ ca: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/ckb-IR.yml b/modules/storages/config/locales/crowdin/ckb-IR.yml index 8ac9d49712f..8d7ce889f10 100644 --- a/modules/storages/config/locales/crowdin/ckb-IR.yml +++ b/modules/storages/config/locales/crowdin/ckb-IR.yml @@ -372,6 +372,7 @@ ckb-IR: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/cs.yml b/modules/storages/config/locales/crowdin/cs.yml index 4b8eb5d866e..838a06f31ab 100644 --- a/modules/storages/config/locales/crowdin/cs.yml +++ b/modules/storages/config/locales/crowdin/cs.yml @@ -376,6 +376,7 @@ cs: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/da.yml b/modules/storages/config/locales/crowdin/da.yml index e95ef9f15e2..bdc24e0919f 100644 --- a/modules/storages/config/locales/crowdin/da.yml +++ b/modules/storages/config/locales/crowdin/da.yml @@ -372,6 +372,7 @@ da: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/de.yml b/modules/storages/config/locales/crowdin/de.yml index 7abfc15b703..6e08bfba5e4 100644 --- a/modules/storages/config/locales/crowdin/de.yml +++ b/modules/storages/config/locales/crowdin/de.yml @@ -372,6 +372,7 @@ de: failure: Einige Überprüfungen sind fehlgeschlagen und das System funktioniert nicht wie erwartet. success: Alle Verbindungen und Systeme funktionieren wie erwartet. warning: Einige Überprüfungen ergaben eine Warnung. Dies kann zu unerwartetem Verhalten führen. + synced: 'Last sync: %{datetime}' title: Gesundheitsstatusbericht health_email_notifications: description_disabled: Administrator:innen erhalten keine E-Mail-Updates, wenn es wichtige Änderungen gibt. diff --git a/modules/storages/config/locales/crowdin/el.yml b/modules/storages/config/locales/crowdin/el.yml index 1204fd9f2d1..c1cea2088f2 100644 --- a/modules/storages/config/locales/crowdin/el.yml +++ b/modules/storages/config/locales/crowdin/el.yml @@ -372,6 +372,7 @@ el: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/eo.yml b/modules/storages/config/locales/crowdin/eo.yml index b14e36bc75d..070c06456f2 100644 --- a/modules/storages/config/locales/crowdin/eo.yml +++ b/modules/storages/config/locales/crowdin/eo.yml @@ -372,6 +372,7 @@ eo: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/es.yml b/modules/storages/config/locales/crowdin/es.yml index 8e66eb7b4ce..61a3a316e45 100644 --- a/modules/storages/config/locales/crowdin/es.yml +++ b/modules/storages/config/locales/crowdin/es.yml @@ -372,6 +372,7 @@ es: failure: Algunas comprobaciones han fallado y el sistema no funciona como se esperaba. success: Todas las conexiones y sistemas funcionan según lo previsto. warning: Algunas comprobaciones devolvieron una advertencia. Esto puede dar lugar a un comportamiento inesperado. + synced: 'Last sync: %{datetime}' title: Informe de estado de salud health_email_notifications: description_disabled: Los administradores no recibirán actualizaciones por correo electrónico cuando haya actualizaciones importantes. diff --git a/modules/storages/config/locales/crowdin/et.yml b/modules/storages/config/locales/crowdin/et.yml index 9f55d41dffc..b1f956d4b8a 100644 --- a/modules/storages/config/locales/crowdin/et.yml +++ b/modules/storages/config/locales/crowdin/et.yml @@ -372,6 +372,7 @@ et: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/eu.yml b/modules/storages/config/locales/crowdin/eu.yml index 2d727afd2cb..fcd17fadb08 100644 --- a/modules/storages/config/locales/crowdin/eu.yml +++ b/modules/storages/config/locales/crowdin/eu.yml @@ -372,6 +372,7 @@ eu: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/fa.yml b/modules/storages/config/locales/crowdin/fa.yml index 7b258d9059c..79230b765b8 100644 --- a/modules/storages/config/locales/crowdin/fa.yml +++ b/modules/storages/config/locales/crowdin/fa.yml @@ -372,6 +372,7 @@ fa: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/fi.yml b/modules/storages/config/locales/crowdin/fi.yml index aff63ffd958..c51baabbf50 100644 --- a/modules/storages/config/locales/crowdin/fi.yml +++ b/modules/storages/config/locales/crowdin/fi.yml @@ -372,6 +372,7 @@ fi: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/fil.yml b/modules/storages/config/locales/crowdin/fil.yml index 260e7617dc2..19ba729d6d3 100644 --- a/modules/storages/config/locales/crowdin/fil.yml +++ b/modules/storages/config/locales/crowdin/fil.yml @@ -372,6 +372,7 @@ fil: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/fr.yml b/modules/storages/config/locales/crowdin/fr.yml index d858daae69b..3fdb56da991 100644 --- a/modules/storages/config/locales/crowdin/fr.yml +++ b/modules/storages/config/locales/crowdin/fr.yml @@ -372,6 +372,7 @@ fr: failure: Certaines vérifications ont échoué et le système ne fonctionne pas comme prévu. success: Toutes les connexions et les systèmes fonctionnent comme prévu. warning: Certaines vérifications ont renvoyé un avertissement. Cela peut entraîner un comportement inattendu. + synced: 'Last sync: %{datetime}' title: Rapport sur l'état de santé health_email_notifications: description_disabled: Les administrateurs ne recevront pas de mises à jour par e-mail lors des mises à jour importantes. diff --git a/modules/storages/config/locales/crowdin/he.yml b/modules/storages/config/locales/crowdin/he.yml index bdcb7832e4e..09c2a793d07 100644 --- a/modules/storages/config/locales/crowdin/he.yml +++ b/modules/storages/config/locales/crowdin/he.yml @@ -376,6 +376,7 @@ he: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/hi.yml b/modules/storages/config/locales/crowdin/hi.yml index 48343bc1d5b..fc4394b44d5 100644 --- a/modules/storages/config/locales/crowdin/hi.yml +++ b/modules/storages/config/locales/crowdin/hi.yml @@ -372,6 +372,7 @@ hi: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/hr.yml b/modules/storages/config/locales/crowdin/hr.yml index 5b26f9ccc46..62fb37019f5 100644 --- a/modules/storages/config/locales/crowdin/hr.yml +++ b/modules/storages/config/locales/crowdin/hr.yml @@ -374,6 +374,7 @@ hr: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/hu.yml b/modules/storages/config/locales/crowdin/hu.yml index f46bc6960d2..650320d6d38 100644 --- a/modules/storages/config/locales/crowdin/hu.yml +++ b/modules/storages/config/locales/crowdin/hu.yml @@ -372,6 +372,7 @@ hu: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/id.yml b/modules/storages/config/locales/crowdin/id.yml index d2ed1045168..1bec965aa48 100644 --- a/modules/storages/config/locales/crowdin/id.yml +++ b/modules/storages/config/locales/crowdin/id.yml @@ -370,6 +370,7 @@ id: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/it.yml b/modules/storages/config/locales/crowdin/it.yml index 93567eeaa53..edc56765089 100644 --- a/modules/storages/config/locales/crowdin/it.yml +++ b/modules/storages/config/locales/crowdin/it.yml @@ -372,6 +372,7 @@ it: failure: Alcuni controlli non sono riusciti e il sistema non funziona come previsto. success: Tutte le connessioni e i sistemi funzionano come previsto. warning: Alcuni controlli hanno restituito un avviso. Questo può causare comportamenti imprevisti. + synced: 'Last sync: %{datetime}' title: Report sullo stato di salute health_email_notifications: description_disabled: Gli amministratori non riceveranno aggiornamenti via email quando ci sono aggiornamenti importanti. diff --git a/modules/storages/config/locales/crowdin/ja.yml b/modules/storages/config/locales/crowdin/ja.yml index 4708d197140..5fc79945e20 100644 --- a/modules/storages/config/locales/crowdin/ja.yml +++ b/modules/storages/config/locales/crowdin/ja.yml @@ -370,6 +370,7 @@ ja: failure: いくつかのチェックに失敗し、システムが期待どおりに動作しません。 success: すべての接続とシステムは期待どおりに動作しています。 warning: いくつかのチェックが警告を返しました。これは予期しない動作につながる可能性があります。 + synced: 'Last sync: %{datetime}' title: 健康状態レポート health_email_notifications: description_disabled: 管理者は、重要なアップデートがあった場合、メールでアップデートを受け取ることはできません。 diff --git a/modules/storages/config/locales/crowdin/ka.yml b/modules/storages/config/locales/crowdin/ka.yml index c883721ba5a..c9a1c5f6871 100644 --- a/modules/storages/config/locales/crowdin/ka.yml +++ b/modules/storages/config/locales/crowdin/ka.yml @@ -372,6 +372,7 @@ ka: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/kk.yml b/modules/storages/config/locales/crowdin/kk.yml index 531e32cca16..b5598b3c0de 100644 --- a/modules/storages/config/locales/crowdin/kk.yml +++ b/modules/storages/config/locales/crowdin/kk.yml @@ -372,6 +372,7 @@ kk: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/ko.yml b/modules/storages/config/locales/crowdin/ko.yml index 3f79855017b..e9e83ebae83 100644 --- a/modules/storages/config/locales/crowdin/ko.yml +++ b/modules/storages/config/locales/crowdin/ko.yml @@ -370,6 +370,7 @@ ko: failure: 일부 검사가 실패하여 시스템이 예상대로 작동되지 않습니다. success: 모든 연결과 시스템이 예상대로 작동 중입니다. warning: 일부 검사에서 경고가 반환되었습니다. 이로 인해 예상치 못한 동작이 발생할 수 있습니다. + synced: 'Last sync: %{datetime}' title: 상태 보고서 health_email_notifications: description_disabled: 중요 업데이트가 있을 때 관리자에게 이메일로 업데이트가 전송되지 않습니다. diff --git a/modules/storages/config/locales/crowdin/lt.yml b/modules/storages/config/locales/crowdin/lt.yml index 2e3b9618829..74a6941abb8 100644 --- a/modules/storages/config/locales/crowdin/lt.yml +++ b/modules/storages/config/locales/crowdin/lt.yml @@ -376,6 +376,7 @@ lt: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/lv.yml b/modules/storages/config/locales/crowdin/lv.yml index 093dec25b5c..caf10804681 100644 --- a/modules/storages/config/locales/crowdin/lv.yml +++ b/modules/storages/config/locales/crowdin/lv.yml @@ -374,6 +374,7 @@ lv: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/mn.yml b/modules/storages/config/locales/crowdin/mn.yml index 48e64819cfd..388dfd99fc3 100644 --- a/modules/storages/config/locales/crowdin/mn.yml +++ b/modules/storages/config/locales/crowdin/mn.yml @@ -372,6 +372,7 @@ mn: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/ms.yml b/modules/storages/config/locales/crowdin/ms.yml index e1eee9dc10f..63079233a7f 100644 --- a/modules/storages/config/locales/crowdin/ms.yml +++ b/modules/storages/config/locales/crowdin/ms.yml @@ -370,6 +370,7 @@ ms: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/ne.yml b/modules/storages/config/locales/crowdin/ne.yml index 94d3120d062..22ed8cb8d28 100644 --- a/modules/storages/config/locales/crowdin/ne.yml +++ b/modules/storages/config/locales/crowdin/ne.yml @@ -372,6 +372,7 @@ ne: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/nl.yml b/modules/storages/config/locales/crowdin/nl.yml index 3b6609aea4f..e12dc9efee4 100644 --- a/modules/storages/config/locales/crowdin/nl.yml +++ b/modules/storages/config/locales/crowdin/nl.yml @@ -372,6 +372,7 @@ nl: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/no.yml b/modules/storages/config/locales/crowdin/no.yml index d661f246c74..55e2ea331dc 100644 --- a/modules/storages/config/locales/crowdin/no.yml +++ b/modules/storages/config/locales/crowdin/no.yml @@ -372,6 +372,7 @@ failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/pl.yml b/modules/storages/config/locales/crowdin/pl.yml index 340b15a72d4..218db959b31 100644 --- a/modules/storages/config/locales/crowdin/pl.yml +++ b/modules/storages/config/locales/crowdin/pl.yml @@ -376,6 +376,7 @@ pl: failure: Niektóre kontrole nie powiodły się i system nie działa zgodnie z oczekiwaniami. success: Wszystkie połączenia i systemy działają zgodnie z oczekiwaniami. warning: Niektóre kontrole zwróciły ostrzeżenie. Może to prowadzić do nieoczekiwanego sposobu działania. + synced: 'Last sync: %{datetime}' title: Raport o stanie health_email_notifications: description_disabled: Administratorzy nie będą otrzymywać aktualizacji pocztą elektroniczną, gdy pojawią się ważne aktualizacje. diff --git a/modules/storages/config/locales/crowdin/pt-BR.yml b/modules/storages/config/locales/crowdin/pt-BR.yml index 89796811996..758e081c9f0 100644 --- a/modules/storages/config/locales/crowdin/pt-BR.yml +++ b/modules/storages/config/locales/crowdin/pt-BR.yml @@ -372,6 +372,7 @@ pt-BR: failure: Alguns testes não passaram e o sistema não está funcionando corretamente. success: Todas as conexões e sistemas estão operando normalmente. warning: Alguns testes retornaram um alerta. Isso pode causar comportamentos inesperados. + synced: 'Last sync: %{datetime}' title: Relatório de status de integridade health_email_notifications: description_disabled: Os administradores não receberão atualizações por e-mail quando houver atualizações importantes. diff --git a/modules/storages/config/locales/crowdin/pt-PT.yml b/modules/storages/config/locales/crowdin/pt-PT.yml index c19fcc03323..eb9359c31ce 100644 --- a/modules/storages/config/locales/crowdin/pt-PT.yml +++ b/modules/storages/config/locales/crowdin/pt-PT.yml @@ -372,6 +372,7 @@ pt-PT: failure: Algumas verificações não foram aprovadas e o sistema não funciona como esperado. success: Todas as ligações e sistemas estão a funcionar como esperado. warning: Algumas verificações foram devolvidas com um aviso. Isso pode resultar num comportamento inesperado. + synced: 'Last sync: %{datetime}' title: Relatório de estado de saúde health_email_notifications: description_disabled: Os administradores não receberão atualizações por e-mail quando houver atualizações importantes. diff --git a/modules/storages/config/locales/crowdin/ro.yml b/modules/storages/config/locales/crowdin/ro.yml index 80cff04813f..fe53bf33018 100644 --- a/modules/storages/config/locales/crowdin/ro.yml +++ b/modules/storages/config/locales/crowdin/ro.yml @@ -374,6 +374,7 @@ ro: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Raport privind starea de sănătate health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/ru.yml b/modules/storages/config/locales/crowdin/ru.yml index 1cc7b7c77f9..3720a34f7d2 100644 --- a/modules/storages/config/locales/crowdin/ru.yml +++ b/modules/storages/config/locales/crowdin/ru.yml @@ -376,6 +376,7 @@ ru: failure: Некоторые проверки не удались, и система работает не так, как ожидалось. success: Все соединения и системы работают, как и ожидалось. warning: Некоторые проверки вернули предупреждение. Это может привести к неожиданному поведению. + synced: 'Last sync: %{datetime}' title: Отчёт о состоянии хранилища health_email_notifications: description_disabled: Администраторы не будут получать обновления по электронной почте, когда выходят важные обновления. diff --git a/modules/storages/config/locales/crowdin/rw.yml b/modules/storages/config/locales/crowdin/rw.yml index 77291057820..1929534043c 100644 --- a/modules/storages/config/locales/crowdin/rw.yml +++ b/modules/storages/config/locales/crowdin/rw.yml @@ -372,6 +372,7 @@ rw: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/si.yml b/modules/storages/config/locales/crowdin/si.yml index 921673d4932..f507d006da4 100644 --- a/modules/storages/config/locales/crowdin/si.yml +++ b/modules/storages/config/locales/crowdin/si.yml @@ -372,6 +372,7 @@ si: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/sk.yml b/modules/storages/config/locales/crowdin/sk.yml index d5a202cefc8..51ec74a1a9e 100644 --- a/modules/storages/config/locales/crowdin/sk.yml +++ b/modules/storages/config/locales/crowdin/sk.yml @@ -376,6 +376,7 @@ sk: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/sl.yml b/modules/storages/config/locales/crowdin/sl.yml index 1e5c6b58768..8dddda1fdce 100644 --- a/modules/storages/config/locales/crowdin/sl.yml +++ b/modules/storages/config/locales/crowdin/sl.yml @@ -376,6 +376,7 @@ sl: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/sr.yml b/modules/storages/config/locales/crowdin/sr.yml index 8976b18ec45..88fa6a222ad 100644 --- a/modules/storages/config/locales/crowdin/sr.yml +++ b/modules/storages/config/locales/crowdin/sr.yml @@ -374,6 +374,7 @@ sr: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/sv.yml b/modules/storages/config/locales/crowdin/sv.yml index 20189052160..9e7f23b7155 100644 --- a/modules/storages/config/locales/crowdin/sv.yml +++ b/modules/storages/config/locales/crowdin/sv.yml @@ -372,6 +372,7 @@ sv: failure: Vissa kontroller misslyckades och systemet fungerar inte som förväntat. success: Alla anslutningar och system fungerar som förväntat. warning: Vissa kontroller gav tillbaka en varning. Detta kan leda till oväntat beteende. + synced: 'Last sync: %{datetime}' title: Rapport om hälsostatus health_email_notifications: description_disabled: Administratörer kommer inte att få uppdateringar via e-post när det finns viktiga uppdateringar. diff --git a/modules/storages/config/locales/crowdin/th.yml b/modules/storages/config/locales/crowdin/th.yml index e8840da033c..14ebcf67d55 100644 --- a/modules/storages/config/locales/crowdin/th.yml +++ b/modules/storages/config/locales/crowdin/th.yml @@ -370,6 +370,7 @@ th: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/tr.yml b/modules/storages/config/locales/crowdin/tr.yml index ec1eb6a9f7f..6d69727bff5 100644 --- a/modules/storages/config/locales/crowdin/tr.yml +++ b/modules/storages/config/locales/crowdin/tr.yml @@ -372,6 +372,7 @@ tr: failure: Bazı kontroller başarısız oldu ve sistem beklendiği gibi çalışmıyor. success: Tüm bağlantılar ve sistemler beklendiği gibi çalışıyor. warning: Bazı kontroller bir uyarı döndürdü. Bu beklenmedik davranışlara yol açabilir. + synced: 'Last sync: %{datetime}' title: Sağlık durumu raporu health_email_notifications: description_disabled: Önemli güncellemeler olduğunda yöneticiler e-posta ile güncelleme almayacaktır. diff --git a/modules/storages/config/locales/crowdin/uk.yml b/modules/storages/config/locales/crowdin/uk.yml index 9a8cd28b187..cb66081a270 100644 --- a/modules/storages/config/locales/crowdin/uk.yml +++ b/modules/storages/config/locales/crowdin/uk.yml @@ -376,6 +376,7 @@ uk: failure: Деякі перевірки не пройдено, і система працює неналежним чином. success: Усі підключення й системи працють належним чином. warning: Деякі перевірки завершилися з попередженням. Це може призвести до неочікуваної поведінки. + synced: 'Last sync: %{datetime}' title: Звіт про стан справності health_email_notifications: description_disabled: Адміністратори не отримуватимуть електронні листи про важливі оновлення. diff --git a/modules/storages/config/locales/crowdin/uz.yml b/modules/storages/config/locales/crowdin/uz.yml index e9dd7686422..0a70e8d2a64 100644 --- a/modules/storages/config/locales/crowdin/uz.yml +++ b/modules/storages/config/locales/crowdin/uz.yml @@ -372,6 +372,7 @@ uz: failure: Some checks failed and the system does not work as expected. success: All connections and systems are working as expected. warning: Some checks returned a warning. This can lead to unexpected behaviour. + synced: 'Last sync: %{datetime}' title: Health status report health_email_notifications: description_disabled: Admins will not receive updates by email when there are important updates. diff --git a/modules/storages/config/locales/crowdin/vi.yml b/modules/storages/config/locales/crowdin/vi.yml index 215249d05c8..df28cd56424 100644 --- a/modules/storages/config/locales/crowdin/vi.yml +++ b/modules/storages/config/locales/crowdin/vi.yml @@ -370,6 +370,7 @@ vi: failure: Một số lần kiểm tra không thành công và hệ thống không hoạt động như mong đợi. success: Tất cả các kết nối và hệ thống đều hoạt động như mong đợi. warning: Một số kiểm tra trả lại một cảnh báo. Điều này có thể dẫn đến hành vi không mong muốn. + synced: 'Last sync: %{datetime}' title: Báo cáo tình trạng sức khoẻ health_email_notifications: description_disabled: Quản trị viên sẽ không nhận được thông tin cập nhật qua email khi có thông tin cập nhật quan trọng. diff --git a/modules/storages/config/locales/crowdin/zh-CN.yml b/modules/storages/config/locales/crowdin/zh-CN.yml index e227630b5e2..b24edb87242 100644 --- a/modules/storages/config/locales/crowdin/zh-CN.yml +++ b/modules/storages/config/locales/crowdin/zh-CN.yml @@ -370,6 +370,7 @@ zh-CN: failure: 有些检查失败,系统无法按预期运行。 success: 所有连接和系统都按预期运行。 warning: 某些检查返回了警告。这可能导致异常行为。 + synced: 'Last sync: %{datetime}' title: 健康状况报告 health_email_notifications: description_disabled: 当有重要更新时,管理员将不会通过电子邮件收到更新提醒。 diff --git a/modules/storages/config/locales/crowdin/zh-TW.yml b/modules/storages/config/locales/crowdin/zh-TW.yml index c2e5cb16b0f..1f63448d06d 100644 --- a/modules/storages/config/locales/crowdin/zh-TW.yml +++ b/modules/storages/config/locales/crowdin/zh-TW.yml @@ -370,6 +370,7 @@ zh-TW: failure: 部分檢查失敗,系統無法如預期運作。 success: 所有連線與系統均如預期運作。 warning: 某些檢查返回警告,可能會引發預期外的行為。 + synced: 'Last sync: %{datetime}' title: 健康狀況報告 health_email_notifications: description_disabled: 當有重要更新時,管理員將不會透過電子郵件收到更新。 From 82ee68b87a564de824c99fcd2311b98fbbd2e7e5 Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Thu, 12 Mar 2026 10:49:23 +0100 Subject: [PATCH 301/334] Remove dead i18n keys about user mail options Removed in PR #9399, in commit 8e064e5e1, merge commit of PR is 9636a08. --- config/locales/en.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 8269bcee3a7..bf74cc0df08 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -4049,12 +4049,6 @@ en: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" From 1f7de54aee59be5d347e2336b51445ea8a25291f Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Wed, 11 Mar 2026 09:45:46 +0100 Subject: [PATCH 302/334] Remove option to show wiki item as submenu This option seems to have been broken for quite some time and lead to pretty inconsistent results. What it clearly didn't do was to show the item in the project navigation. Some effects were visible in the wiki navigation, some of them only in some views of the wiki. This must have been broken for quite some time without major complaints about it. Since we want to generalize our wiki options going forward and also integrate with external wikis, this is a good chance for simplification. Therefore instead of trying to reverse engineer what this option was supposed to do, it's going to be removed for the time being. --- app/controllers/wiki_menu_items_controller.rb | 11 ++----- app/models/menu_item.rb | 4 ++- app/views/wiki_menu_items/edit.html.erb | 6 ---- config/locales/en.yml | 1 - docs/user-guide/wiki/wiki-menu/README.md | 5 ---- .../wiki/wiki-menu/wiki-show-submenu-item.png | Bin 55141 -> 0 bytes lib/redmine/menu_manager/wiki_menu_helper.rb | 15 ---------- .../projects_settings_menu_controller_spec.rb | 2 -- .../menu_items/wiki_menu_item_spec.rb | 27 ++++++------------ 9 files changed, 14 insertions(+), 57 deletions(-) delete mode 100644 docs/user-guide/wiki/wiki-menu/wiki-show-submenu-item.png diff --git a/app/controllers/wiki_menu_items_controller.rb b/app/controllers/wiki_menu_items_controller.rb index bb7351753e8..ad27f786029 100644 --- a/app/controllers/wiki_menu_items_controller.rb +++ b/app/controllers/wiki_menu_items_controller.rb @@ -67,12 +67,11 @@ class WikiMenuItemsController < ApplicationController def update # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity wiki_menu_setting = wiki_menu_item_params[:setting] - parent_wiki_menu_item = params[:parent_wiki_menu_item] get_data_from_params(params) if wiki_menu_setting == "no_item" - unless @wiki_menu_item.nil? + if @wiki_menu_item if @wiki_menu_item.is_only_main_item? if @page.only_wiki_page? flash.now[:error] = t(:wiki_menu_item_delete_not_permitted) @@ -89,12 +88,8 @@ class WikiMenuItemsController < ApplicationController @wiki_menu_item.name = @page.slug @wiki_menu_item.title = wiki_menu_item_params[:title] || @page_title - if wiki_menu_setting == "sub_item" - @wiki_menu_item.parent_id = parent_wiki_menu_item - elsif wiki_menu_setting == "main_item" - @wiki_menu_item.parent_id = nil - assign_wiki_menu_item_params @wiki_menu_item - end + @wiki_menu_item.parent_id = nil + assign_wiki_menu_item_params @wiki_menu_item end if @wiki_menu_item.destroyed? || @wiki_menu_item.save diff --git a/app/models/menu_item.rb b/app/models/menu_item.rb index 548248343aa..991d1fd1486 100644 --- a/app/models/menu_item.rb +++ b/app/models/menu_item.rb @@ -50,7 +50,9 @@ class MenuItem < ApplicationRecord elsif is_main_item? :main_item else - :sub_item + # backwards compatibility for removed configuration option + # sub items are not offered anymore and are effectively not visible + :no_item end end diff --git a/app/views/wiki_menu_items/edit.html.erb b/app/views/wiki_menu_items/edit.html.erb index b7041d88f1b..2624bcbed04 100644 --- a/app/views/wiki_menu_items/edit.html.erb +++ b/app/views/wiki_menu_items/edit.html.erb @@ -57,12 +57,6 @@ See COPYRIGHT and LICENSE files for more details. <%= form.radio_button "setting", :main_item %> <%= form.label "setting_main_item", t(:label_wiki_show_menu_item) %>

-

- <% disabled = @parent_menu_item_options.empty? %> - <%= form.radio_button "setting", :sub_item, disabled: disabled %> - <%= form.label "setting_sub_item", t(:label_wiki_show_submenu_item), { id: "with-select" } %> - <%= select_tag "parent_wiki_menu_item", options_for_select(@parent_menu_item_options, @selected_parent_menu_item_id), disabled: disabled %> -

<%= styled_button_tag t(:button_save), method: :post, diff --git a/config/locales/en.yml b/config/locales/en.yml index 2d789e00cc8..4fd756ff652 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -4090,7 +4090,6 @@ en: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/docs/user-guide/wiki/wiki-menu/README.md b/docs/user-guide/wiki/wiki-menu/README.md index 10373378cd1..ba6be4d3d58 100644 --- a/docs/user-guide/wiki/wiki-menu/README.md +++ b/docs/user-guide/wiki/wiki-menu/README.md @@ -25,7 +25,6 @@ To add a wiki page as a menu item to the project menu, select the **More** funct - **Do not show this wikipage in the project navigation** will NOT display a separate menu item in the project navigation. The wiki page is just displayed within the wiki module itself. - **Show as menu item in project navigation** will add a separate menu item to the project navigation. -- **Show as submenu item of ...** will display the wiki page a sub-menu item in the project navigation. 3. **Save** your changes to the wiki page menu. @@ -35,8 +34,4 @@ To add a wiki page as a menu item to the project menu, select the **More** funct ![wiki-show-menu-item](wiki-show-menu-item.png) -**Visibility** show as submenu item of project-documentation: - -![wiki-show-submenu-item](wiki-show-submenu-item.png) - The default option is **Do not show this wiki page in project navigation**. Check this option if you want to undo earlier changes and hide the wiki page from the project menu. diff --git a/docs/user-guide/wiki/wiki-menu/wiki-show-submenu-item.png b/docs/user-guide/wiki/wiki-menu/wiki-show-submenu-item.png deleted file mode 100644 index 076bd97d6e6fec25e426f9dffddd20bd54994462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55141 zcmc$FWm8;1(1b250>@F7E-C5ja@x^(0o_l}6 zTXpO9hjZpkcUAXv&rJ99^odkalEy$KLWP5a!;qDcP=kX*g22HcM4}+P^>D;?;laVZ zdsb1=zMe0ho}OM`_OD-F?;oFDpVm&_8uxd% zcd+d@?8Dg0&Ed-v7<&77eSNie`?~o2`f|Rwe{pwvx(Piy8+v|yKIuC;I@&t9em<_B zKYu^u}?|*8THL9(1m*ap&b=wtHaZ zXkmW-c|5UT?_qj+x@qNNXm)LKa&mv9WO=x2Y-|iTwX;8zlr#5y+Zk9tzLT(Y+uz?m z+tH9edJF+&wD(Rl4VRSlt;P-CcY%PLEkW*+x6m5BnTFW%_Ti@1w)pOy-nybc!1>_L z%ehLo+S>ZfLQAi|k5SF@Lq)+^RoyjZNo6G^UJYB)12^*-y1`ZBgTEaNTKCh7D#6J) zb``fx8Gexk?U|XG9!0|=v6?E?r`83lz!>YI#E`KlZq3q_ko2;)NZnTxlla7B_w>Kk ze|k%zoD4F?SSt5Y1InYL!qn52jgmU5{j}Yq^Zt5^TSwJr`5E#2o>Yw)jt+444+v0; zYI6^a$IDqW3&_iJl5e)9FLvM-5AN3TtBi5h75mlX?&?Y(F{$m5>}-{6>Jpe_F0JUA z#}EMG_pJ4?&`LGr2v(1@u(Ap?5@U9&6tGWGv+!0hOH|NrkJVtJb1XAA)DBaXD3oHw zcJJgd%crm{aZ?keviU<`Q>m_FPG_1=Y*i$p8}6^bL}XcLtS&93<%VxwprN7pO+OLG zB+o*I7f(M0OQ#NBFOgftzDs;R< z)Z3m0fZxRdEx?J}HlMz=>Ge{3-QUT7DjaF?{Jgwy;NTXs2zE%}enuw%-~tuJAnR1H^%$^4CN{c|?Hx3CuH>r8w6D|&a^Eg@? zTzT03yWj`y$oduQJE7pmBK+0^dp^Dv6QhFA=YmBxl*X` z5x>Prl$!D-0tFQA+-y{(@0ytrxdZdB5b2;#Y^5q$f7K^Gw08gv#~q;-d$E-JHt2=e z3&9{ioB(ml1FjnOiMS>C3H@kO+W|is%vwgm`Qx`|VZ}?2askN&GgPO!Lg&xA0Sx&OJ2exU=ccd(5j-vWoK=^}K2cw^C&P zs?_;X(&%!+xX|bws#eW4$@=?#?&y70PbEW*1tGvi)P0UBK2SB}R?3#fJz>yF6OPxA zaJC#%TPer%m{r2!N|7wZO>K1k+Nvtj_q@WDDLbb)5zq|NAfp$5GbTxkfz)Fls^G-@ zc%#s_`uNQItBCQ)D1Qc_tExDOxoIxkl;7N4l>GDB{G+AFSx`^*J_hD?uMW(?kfgtu7j+Imo1-@y6}IU;_Tz5a2kMW$HEK#`%@-Pfsc`zTNvWi~*7l^HURqBa8y~u- zLz+yV$EuX1t#kj*>$T@8Az%jqF1|e*wgB{kwZh72q8dWzDGJVKAEP~zr_Y{f8Jo;! zN^o~SXVaWs-#9|ogio^9ZHcuyy2#@=8k)&Skl5`R9e<)67SU)@s-i5>;6*Q61QWfp z<}cPy1TqAF8jQN8^ct-DKpG@#Y(-`lX4jol+O|3(uo%wdyV3Pa{FybN=SA>QQ2NVI zlIfB|ved1=Fm2(VtL;p$hr45F7H`GJm1Nb>-!+anU8&Z@Cby=&Srx>L?U5TCRq0o8 zVrv98?MBB~oW%L)_MeoZ!>p57w;g{Cc@qFP9x2VpyN%et#v(~$@9;Eg-7?>fLHta9 z_f`QNW|)I>81|{0QZDrzX4vv*Lc@sIn0l?-z9D~Ijo8V%71BObyD~@Q^(|CVSaIR& zsm1>5vL@9mQ^jTe-444k8wIBog<*k0V~yJ8zOX~{FFf9=in33#5^?)U+JeKtOgfmo z9j%{kMzJu9XSY_X-{kpGuhOno>DQigf@xRXt^eH#SZ26dCSta+d$7J{IJ3mz!akX& zL#2Z|s+l5miZfV)F9{1@%7vmlwfml`L8gzRd!&Y-&pl$dUyPd1W_AXcDYN$}couo4xyF3-x_H$>tCvq$@)9I4#mq`GPIejN;Tdm&BJ{`(D9G6d@Tq zJ&JURpAdv%A0wT{ye7j?gn|+LH}Ys=8BgtE`s;$vDpeSs9Q;)Q5oNQ6g!`S01_jw6 ztgy(CkT<)Q(>)iY$0hw+=P5%Oac}gKV!lfIgTm!P`08ElpXnuujt0l)y&kaQ=sM2M zV51(Cv)QFzP~{YSz&7sYrT>{n9Y}n~5YCl0D_bw>ersrnnmF6lX*)LwQ2p2I@T%bhPhqYVvw-$@xUMu zf~J*TNbl_#mLhbovom*RNT)B$;ORdbu~|;WW``q|eMb0Y9;$Ct@?hud-{RtR3!xSA zluY=7OdKr7!ZNN>GT6h&hM5Mo#W^l1lN_~3@}eydiK#R$kd-kwUb89pqBtulFJS-^ zdmxnY4<8BP=|Y!>6{yK5n|(hkp{o+h8bL*?JMl1+4O184!--q@1;N1!ly|tt*?@&- z=b*XgMp)0j?Vpr2av@qYZXN<1K%dcCQcxpD>RRegMGGhWRI!^O_gCj6*_x>@c{Gb5 zN*Q)THx#S0SLu{g1Zy`=>K{nYY;}+jt1D*|85;LXEj#1tg@P%h(fdOa3eCVLf~c{FA$(S|;ypBR}6|6GcU$bryg*|TIbW*L1Ve!V-2 zx++~6(OWq-T02^8Qv)_Xk;E-PYuTm@tc_fS+WiAGog@K;ej~3h8S20ryUNE^@bgpU zgXKi~>tEMC)qnT5aw~ok<}hA`cDLh;R}{!|{aVNrOpABpu zdT0U%=0AG$@bJOvAjmO%*1KP}p9&RhewpcC9i8|EK|-Z4Z_ZA~A>X7`ZQquy{;|Pp zTU{;$BNsK039Kc3Js!&ZRiPfz=S@g*ImJkRkp23qoIbP#J_~j=>-I|5_icIp=R3q_ zJf6br&#IpDr4crLb~RG;Q^)K!IcL4qD2H)r?h`&GfsviBG(PiaVq-vne;h94*CzLT zOQ*2T1Cv6#hy~@w*4j6oP@!lLV4tN(n{^)_YPk*ggv76-GzmrdE;-0?(nJ)scfRqv zmtxLaypZ|&-&n^NtZZ;85tl5~;-3~GPHGTB9$b}cuKP`FPs~gcFq&tRT)*~W z?XA!((DR-FJ;0^L>BXVRt>pavXe7BW^!Sv?wa9G<>`~$5f$<)6WeFWmyC=+=EHF*zYxuIDLJ zdJuW-Sh|q)x>2fc${Ba*U_wuy`PYdrgSh$Jw%juH+7!X!`9HBkRYS;ctWzS{SF!FA zmVirVciEUvl>~r;?AW6<7k03mR9VC%;3v41uOsS|`!seE4%f-(Q#LadVWddRSXVF8y!`U8;?w#qwP?onnsr^EED0E{5Yv0nS-X-h< zq4YyaO-=q9j+yt*CiC)iz5zB|e&(njB1qevj6Ms{l!{>ElWG9?%-|ogx3G+J3A%GM zVj%mYl{pmjsJ`YQRmbw2t!yIT6R_VO+6J(RmD*k%^?@}*8dI@Q$@`c30imJ0wMxvZ z3Ho-c)M&7>$t9o7D*`pUtjxB%yYA7G8O0BrM0eOO&zGYN&^Au6wqbe2yxzpf@pQW2+5X5Vo@5GOkrZ;p8{(KLU^)b_o^b{(@1gC24;=)@R|1Ou`{*PaYzH)5_3x)kuJxJN=@-|A zy_myjXCVPY4PSRxgkz4MGu0b&?T65#c%qe&mmY;1YZ$wc+aTn)n}2L*7lc{I!{neE za}Z4tIpF$Os>72bEs$;Hh3vW`^>h}qz~Nbp%2+sr#5(H`z5!7@2P?c7;VX&5qa zLl#ZK&}+K@R4z{Na$=Ukmy%;B<@JGrn{`Pxe>zqR#q~HHqJQ;#`XkJ%{`dN8l)oE! z>Gsm&!~_cgBmlQhzEpmHfhVs479GEpn(5lO-meQadEB*jd2t3cAa-(?G`mQ#wE7ZB zGC@x7N?muJ)_A-HQ!%jVwQYOl>JDYw zJ3YA(7ICv7cD_&zc-B=X)33|+wv@%~bIWLioh7s5*`~l=GnL<8D|zE8l?hsMb@0e4 zEm~R(_U$@@I~NW4WaT{E!@j;$cb=`$gG@W+QTMgD-A)Y#cYt2M9Vb%obM2YHr7Bmy zWG(l8s=@Yv;Er1E++13^y$PYDCrwry8tp%#35Qf@9~hFQcoK{z-}};vPuRCMgJ3^l zfNFfbi@QQi*F0E`Q!-C}_`FXCgJ=!RQ|lJeIpPN55eH|SD&3SIW=;LWU+)W>2Btkq z$8)s>hB+$rm>)hhiaLi`fs;cm^@y=1%JTQgKa5|UklJAdYqfHvMKSv9QyK6T?sqO8 z9UANO6kM4W4%#$7yi#iS8uo$3gtVoC3j^9^D-vbkqsaR?P6yG)XzG&&q?9 ziOQfA@jLnPPkFOEG%T!BTQCjr;j%jc)&Bu+5sP@joIEcJd2Pb}c z0E1F4^hzY})<_)(g=rx3AMIbbF>JD;UDSDEjwmNR9Q`*foTnUD_U1pWrVMMFdN*&z zebuN*X)nw0xKEEs&5Yc(V%SjTD0*c>mRA}muN7(Hrqadg2*Cdtd`V{> z#l_E6%_sJl7?33cD)Ix+`9H`^xkP| zy1eT)E0sh4`%9$xz+h5ao2J+1ui?a^MG|zwQIhM26J7BR7T^GfMyJZ5@nCgOIB;$Wl?p3FE;( z_;-kofZxb`M zT+1o{yaj=#b*f-?DfNS)U?xIhOwy(Ut4{th0HP@5{@N6t<3p)tx&&`a%^d)-e#6oZ+fMPv*_y>)sv zS_Z935vtTT5(~VTxzCu5Fm5!{KhQEjNw3Dv{wERe7nIAEpUxO34hdqvtTtwEsYjCc z8Rqy2K=vOSla-|JcQx}MIEY>&D0?fta40GqG2hvAueEfpU^D!Mv$Z%Tp}23-qBJ1K zM8;J&dSFnR8%(`mc(W`!YC|~=n<||CHDAkooss%4pFHCcDqf3!$~@bhlF(l7LT}5g zhcs(!6J%)$_c!m3a*2<_fhnN1eUF3pr1g&ngS3=P?q%;M)hV`EOuMow6eWlvIg~+? zi0+8)zFM!Nff}Vp;+*?KtiZ%^$hAz0g~}TR$RI>RSS@0mgnp#Ra|V_HFKuz`Jj?&4 zlX}GeNb2%c^o>&xiTrJp6mA4<^ZDKTF`t3hJ32a;)<1($;3#O`a+e}&UXaIdl8dlD{L9O6B?@&AXk|4KuxU>kE79@jw9fwT1)ePK`ius- zY?Gz%usD%|S2_gw>?rI4ibO}N`J6jiO3=CS%_?`e$n>AP2DME`qy;|9k7-Qo7c8kS zTEOPCsX@d}csa=lD{APG-dJjoob&l~)aOS~;tR6G2<-D0E>QZDVB(+zET?6HDp5J} z!~Yeb;xtRS_r~YB$#CC5FvpYQLI&%9QTlsMK7jeb9eHZdu7GD_v@EERd^(kJxkU2`Ylmjd;h49DrE^`zOTCc`4 zbH=~VaEva3N4l#`tFrc$r*lE1MbjY@s~x;*%0MyPtB!*GO9!Gsp#FdPJG3ftzno~5 z%baF$dUBkJK>olM75FmSZW!y+hBRGQ8uuJzUt@9weR>j=tXZ^=GliP1AuE=ROQkTQ z%Y>N|P^qgI_mwhKR`Av|EM#ed~DE5WjkF{&p-`Wgp}h@*daKI8lFr)KR71PL}vU zCR1NOh<$U{wP+F(+y6M8{aN?Xj?cY10dVYxEkRf6W?*!*?p=vn9Z8_g*wL8*OaY`# z_>A2T{DA1uB?6ZIJ32wwb&dk{b#Jy7eXVs&yjN8MARp=NrlhOUV+Refg2!|Ir+aD= zc_Z?lo21%rABA#{u5{>ZnFU)enKd+Z`1@SXsm*3QG3PQUgdH#BaT%7ohsx?bd9{B_ zB34w7XfW2qV}B_tCzn6~8kf-gcP&WW<4qeKVNiwm|f=?O*;G@YdoY!DeDqN+rt zL9AP2ZVqjBY{f{DQF?vVc#I=z{TjxOT`MzdlQ}aahcj!iC~Nh$r}X0TqLaR?6|h~6J1#HUn~q#sCo zDB>)8_>#)!-Na)GOJgmPnYYMf9)CT&%91xI9)%wrY_H9kzD zaW+Q%Zj|X<^)aJ$Qm>fH8g_QtsA{F_Jml<{Y|1T~)G8}#3xH}%3s-#f5czjKl%uz9w+&NC|2)M>QtGw@Mox#a?uzL z@E(~vk-0@~JAHs*$eEZxRH1u!3YQtS)na!J8jcU|G0p4{Cv<^8l=`e6Xh945E|wCVC};^QYv@l0R8Vl(*lf?AuYrEddw_; zEP8W&WxpnzGIr4iw9qrvT4+SuTwNhhOuHTFs%YX*8?Q_}Y%Z#~Rlh)C;)q4ZC~_ky zl9?;f1WXHY&d$zq;BNYUK(cQN#rP8R%H8sGvrNKV=DPumH|lwO(BYg%AC|euA<>Yr_2)@8+ilvl`EBD=zqXT8kQWQaJhPJ-6V7v zgV+X!@?T-~dY5Q4F;8MnH%7ldJ%rj~Pb_ZrI1v_bf#*?;1ONU+_Ily0%x%v)m8!Iy z{35$&JB0T`HxvW=dsUwJYkJx{Eur;tgb;0O)_lE&InvoLA#`WGFWY^zvY0VgL*#*k z0tjA$S*`5`d!SZUW$xRk9Axss!~JUP4Ek--;Bqq9SIsf7pKF(ChY$wkZ(Mx6=wpLP zec6=2Csa5i|H9N+3FGgs4ca@}OYtnum|Mmp-v7FXkTupU7?E zGaHK@6f5$E%+EyRXrerD9A!dyGQ4DN8nOl7E^XoK{66t7&)=K5c^te@2Xd%UL8nxZ5{-=$0XWNy0t zS)Y&9o~dWpu@c#@pP2Di-Kd=XK#E1dmXf3`eEuvTNfjIjh?J-cjanT@D*T59)jFZt zFi6(1Mr26g|^Dwj1e{#g!V3M2o(PcZl)cz?DH<6d(yq`-UZC`~kLcKWPxC>%vQjdjF zaLN~E)l28m?PZVD4?GA59K_Mf+&Ln|0H%E1iT)(x+96C9G|v4HO^~6szRVW&B-c#U zXyO6=YdzQtGz;$LQ!{o!iMwsja*}EAzKc_nv2l$Q)ajT%YMT7x`CCKP*oqp`eD5@w z&W(m&jM_r<H-SvRZPnz8{qm}LV7#_p25(zgdW4GFmc&WwdmgG2e_>pn)du}#$Hco z<3kEh$!~lC+ok`zM!jJE%~C6Zt=*-Jp0ZbxB==-gJk@&zKhC{-Qd1XqYmp#DaVt6A z-gJ3k3fKxjpTvdCd$Sf6FgYpHjd-uKzG7nEH9E1Foy7n6dbwqgdY6jGwkIO>O?xKk ze)Ve7_Y4aJHH+4QPS+)EFtvF}t>5S#aHwjPsq-tv|^sS^zMUM}x z^5+i6^tuG88b9An@%#jX$oi;N*FS99X?_Y0~0ULSRh}nKlu!+SxhJlJJipp zh{XUz5$iO57;4MLii=<*eDe89fv$=O64r%3jTU5yV2OL*83T(Drww03?JtV~gnULp zs1LB#P|N=yozz22$JJR4ws{?f*bQCmWLgSpLzoiv) zM~~u?A;joZK`*?nf>rxg_0q12G*ny86f#C9OyhX?PsL2sz}*mHQu? zQfC~F@v=5f7rs8sGYj!o(_Or_1+g9pq5gA*GHq|AeU+^xAb}g_wFv@j!jsvzi_K+m zqb+w?Ph?V;Z-2RAg>Moz!WK{u4TQ=2zc@^Des3Ii zb_}rZlV8PF+q#WjH-^R2`n`Vt_&MWV#YNyzMERUqXfe`JUB#azrkB4xaGt*kuo#M_ zX_Hqy?gK^FfsU>Sg>o_n%$=>@%rEqY88H2-45^*p+T?j`zL%~!MrmfQInm`5iCmKrl6TIG!>2({#PrJ zyx3R=tw%>Q(3j89jRj z%&|ddwc$rQYM#|~@77=#aVh1f@zsE_m3D@p0bCs(tGtbi`woWYL3cARP0TXRmb%_Hbl180Duvpk@8Ya zpA~Ga!*fHQx~D}^bsq@BafZ4q4E7?vuMfI&M>Mt?;fjMCXF7b0#PXyw_!mTg2|Boj zuLcyU(5LK#omwYvV6lb}LP|mX{rm#DY@R`OK{o44wY3p1xB&_343Hs9M~C}HZn|&!N};(f`5Xw(F|MbxjtHO;a}>dV z(ziQHP}@o16mxC@%j3`mvmSH@r`KcU()+}CE}s%q+U>ex)D&!GbQ6e>17$m}AtZ)| zWd5FlS#<-Ie=a1DLw+f2*#{-Wesg0?8C>_?XI(i7Fq8v+e22V|tYR`5xuJEQ`cCgi z`S$4Ij)okY;aJ?>Sg%z-k$tOo*$Z`JFBGlWEzdrGqn;-K8)vrc#R6uQw#Zu!*dUU>t@!kgT}-xmf>D!|3TEEt z`z4H_cWy|h&#G$LeOwjP?ECgt1s=6{S6m3#*o?bHMnVPpHoqS7^f3k5k`z?Boo?ms zPFL2A;)mzN9`5~Z zM16$!)T7f(4`jdF5HxcGjm-1Y#E~va;RXpJ#iQGp3_!Rjg!}fk%6ptxOAKJ#j>mnp z0X=w;x-b5ott($e00N;g@3f(Cb@>iig$c9N<|Irtzdroz;%_OZL`AWn7Vid9^$5lN zg$Dind{(m2Ch#5t{>AKYVj_(T6>;>cW5L)2`v!VDf;ksFUE1RBl75~~Y3G|5a3*b{{9 zZWi-t`*j@JZk?tdxj^)=VVh!h;1!3H07pnr^XFXyrEU*f;i6hW6(7Lsau7u5W%*W- zz`m8+@@fB@Jb~pbuDuRXD;H4F$wMSxweELOdO%aa%&#nWG$hhMg1`Vjuyol%T3ChYN6vtZCP13exV3<+2i=H`Ej&U zy;6g{a5e*LUon2Vkb)jJ$A;brUf%kp>0SAC;?*pD+ufCyjf2JP*0uEeqNuD=6>~0q zv;ed{ApY0i{KVFmukW-rOExSz;MS+@#)4Q;RM`}BZsH19FlGEOep;>t5^q?7Vd-R_ z@xO}rn$H8RYLd}}KuY_;un4v)*oSQc_SgKi8w&TS*2VlRr#?zUgQTV74cX-9Y_LdoWR~1z23j1{_|Zsl93c^VrU+Xr3Q4)DcH8n8I=()ZAtjz%%2ff41MQdO+*Q z&|)^12HQ z{?`P!&pZ&Xi+Li6B9VwI)cjulr@Jb^IhebJ8#lD@AYkyr9*3>)s1QgBFB>DebZ%L> zDt){8aQyK?f2(i&d$70rDVUd}s!F&+xbR{G*H6Mi)|vSB*NQ(e!ts`^(l^A;y~g-i z(a)9_x~H*NdctCNS1;9CLh%b{2%y}^4}4}X288J;egc}YRMX05SnmnfyphxJThc#k zMC<;fR5V+zrwSG_GdeCOWM%^vJxtxg*vHAZ%fuP|dC20=+s~%K-u5pu#7ztgHi~Ch zrNNr#-u#3UG`{AWZ!x(vBPgLC$ycx}`9i6H(dwEfRjvI0Y-|u8=HtY8Gmz_cBP3rp z{b#2T*?tUBfcY$Jp!?gEVic7L)@b9|IC)oM_(AdDXQ%4u0@BAS1YKwYloaAeHnpna zet8}zZa~!ydxB2d$%tfYHMrz@@Yb*S(UQ_EpC$SEZw=PwRW$3OzZC}%E-3!nF6o-Wtcx|WzL8%Ds~MBp)E$o;tkbnYn`!w z0(O#=l5Jh&lXg6vRmh(iFcew^|G8E;AXf!Nj(3p9t(8wVVzeJ@`D|iyV6?5py&gpa z{8TnYUWMNmcKY!w){C`0jLfu0DDwkzvr*&jwmL*pZ#$_E(KS{cYcJ}sr%vlKPYcXm zeABo(Tdk3F*ACJ~wJfcbpAt&@0{~rxpZBGaRr zL!kB7-t6>A-We*oC_kNx$1b;nUXaM%IX%Gw`1Q}>k3h2=_Nkp>HZdo+-Ctd%QBVJn z{xp)M!%Ab&hy)$DxT=$gi^_!-Z-{DB`sLT{TU77-X#62Cr{kOds`vV_C3stlC14>h zM2)+pZtxGcgz3f_yfKTXltpUoyhY|izcu&^W@6u>Jxkm>>Tg@z{2!#!B90D)5WjT zgo+c|E;7&m{G$0W4<)(@Wd$3RwCAxPlNr>o(5kGA)UaiZj?@F}yisD`7{Uq()gozn zmBNgftqF&FB=FzN+mX8WCqM12hW%`~j!tX$y&n8ri-#R7;z;nZHu3v?TxMx;h4#)U zaUt6|W{#skC7!|L++m>u51YfWpR|;-Ub-J4RKG`9$MXVc^td7D@PVHBo>l41i-cl9 znnS^$wI|+g{?U~xt={lyGc@qmoSRZ~tP1aVvJAB^=~95*&M|fzSlLvhVI(kj#0PdUk$q3Zp>D;Lf;F z5_p|OjR+hT+*O>{c{a0j7;8|#j*gOK}j zguvq6rUsT{G5YuVfriIxXM~ZkIYg*;3_$VBwDc!&14MCL$Z%(%%SR%=9)8&I>|sXU zvvn=3yfY>lS-Kt~X$M|-R+#5U))UAc(?MlTxWM#$FoXL!uj29~6w6;@8W+3!GcaC>Fta)D=jQKRTl(wpf#Uev^bPf*eR4IZ&M} zu!lydOZn>pll$WrL6#VQa0Tg|pP=@ycRJ9BXhFw;b@z&^*8iln-&dzfaMvdp|*w+%QYf9qCTyWMbPk`(Gd zD?(gUd%rb$KddP9!pM@Kq}g1`wwbB_JpdRs52LN0B6ZMdC`8!1tnzogZ7#mA&3F~P zTf;1X!!Rn#7Z5tlj@FN~GkPl!UOYbDtOn^s*{LugNmF%0dvy4baVySg$uQ$Nb<*IU z0|ZXZbBgNPfkgHJ#>yxUTnP6Dl^jMpoTnoQ7$i?$Q}uN@*Z!fA1(MG2vC+1I`vBj- zuJ%DY{G#Lin6RF8@4U~;jGpV?-9AopA9o%Xi;owW@wJxcXYVD7HK-UpKOzf$Tw29~ zQk|`RoL^NjQ=#et4qQzjLRXI-MB`7n`Fgvr6u-CmIFOWiwE1x({*dzDynIUC;=yqd zLw*&`B4i`#`7GW>9t2@EtM%RYw zaj1#dVEL-m4RvKKpho@-+DebP8lLPJpa5 z?#rH}i zTN>mw4sEG9*kKV{J6V8(PZNkrj>To4w|)H6Gk2Ki6O`ftXYcXJ`?0qb_o^F6_Lf_E zL3jEh7cQ1e9<}HV*eKr8pS4q9btMxb2&1sVJP}gj?$qt7jT9!Dm0{Q8*TZmz2I!aX ziCHpf*6)G^TPc@qEq?0)PlrU$ze$w;n-#@|)f9T}zva)!YM);eV#JU_D?WC$2p z>v?R{5G+Mm`|Fx!bMYu&=$0WKa5$*u>S#Ul3Y+^$0?Xkh=0?g`ddE_dC;Ja*;niG! z--F5_)^)vS@kJ8j1@gs|y)54@I!*&voERALcm`G> z-aR;}-|O=-T9_r{cWl%16Q|EA9UT5**U%E!2iwYl*K+(((zz|mxQ&17WsKVBSMwq2 zY6El+Ih|X{DKt~h89s-k)vo8UE}K-7kwcKuEVXr z7gr?v;o{}`PY|IVg0)FWHSe=EW??$RY~?Ql&#)0Dn(b83<`7IKX~spI89#kI!?-aG z7<`7s^>uF?oa}|!Uf9qFaWrF+Ro~!^nKK;-R}d{$hFcFuZTZ=C9OKwU?f)*jsR?&{ zzr_Gi4jp(0dF;($N3&GQ#rgB{P5A<{5MZ+u^O?OMsj?dLYATeyWJ24whf0W#$ERPR zPQ+`p*EZ}kI~998vpf&wl4EIzVy+PTVM!{%=z><*W>OAn{B4-1?s$8I-PQgT74tjD zwq=)L-6?U;`~nb+=g|J|l^2QY6ahrsbg2ATLu{cCuK-N{?(=Y6^fX)cRJ!-5LeeX1 zWI&kmI%_P1px7O{Vm$&6?M}uf{NQ{N5&S9@aV4+nq;ICLzj&T+LjQe*{71g)c7a=w z!VcYQRzBKRk1unyJ~p@BH}1fzXF+}BeLZX|v!#4z=c^PMHXG!pku>>Bi(Ny9(&<{v zCDH1r7`?o!Q+Df)Rvr`_XZR^=gADyjv<{rKEQ)54ie{_&Yfe5qj=a}So@Kmz_;TI~ zGbxt`Kb`Gf*BMx1VD&Uj7Gnx_^)N-1G>7OuDEsrIgI#|vO%zNhvl^UVpPAL<{*Q}; zn!Ko4XXo@+tO0%|Qf{5jD25YU(M0+px-?+p`qys{2k_=DD$X}n#oSH54A(C1HVC+gSf<2`o7am#K0 z<9D`zLEtmW>06J2;JkfVq`q;dOcASuvdi_VPu|-p-kKl>6sM z{vdS(0i}Geznt@Ob0%|!M0Z->(~?4Ms2M2!epkw`Rv}O}!oVm(WlJ%)+E?2D68y6X zffq)I_g-$tsKzp;k`Q7<5Q_}e@BNUR+50C!@NX7O&F!Ex#X^jhn%+2x8zu)@% z`?n$5v#;mA*9%54|G!73~HlfF2TcpV@!Vz$FG-BwzJD? z<2U_=Ez$kK*0Jl7}T%ejJ{5W5$T;=bp~+q@F<#pI>izZ^>spPi+E z&LO}31s(*_B7du;M7cEddn=@*81%XMPg&&u9=SRTa{XbQv4yyMDLMUk zPcXVsRlvbH;z0k#Y|wqo$H6OqXV*itPF}*}c>!;kUfw_H{MeCTAUQOXxAT9P`>Uw9 zo}h0SC4rzJxP@Q=LV^b;xCakTaDoR5I$;J09)f%D;KAJ)+})kQ9cGXj2IrgnpXdG7 zS?j$x=knam?B3m7)m^)~x~qQGjQ>;Bw8b7)TRX#lJ#1wJ#rpc80bdtWZ|&GF-8e<% zTBYV$r_<|ytszEREWUrZ9Pk>7VYf!LZaPNl&;B9YmA1hb>Ye(# zc7cAOHOkug9YY)PLvDyxk}woZS(_DxxhLN`iZIgooz03noe%u;R`Xjy#!kkO{N<-f z=ED4$>R&l{=6NgS0el#YqG|agN>UW(D3tZod&DuN&DSLH0x`wp$-t`cP*V3l^g<|1 z_@|~;-Zy$;mwOek_H-zWc8)h5OhdDZJ{TaR1b-+U`0{mPc@iQRzt`G$^)m^%m&5`l zk8c22Hq4xFmatgB6Wdbw?vXD_DcO;Reg`2L0p283Q3O-T3RCVUf^GpB5;MJ0FyrRJ zAOGn82BeU0o#oH6J+EIop&nE9y|nrcoR~@!9aWvZ`$Ks|kVYHP4}3+^T;)DKBS`Cp zMX`BLzKm42o(gymrgX0N2xT0*%#O;|R|os)-L4)`{<=O4{IvpK0MbS%EIHHwce8~J zhCm&pWGSF}XNy2`y>ps>JQlUuA9kWp3KAKWshH#f^(3R^O^phSJLX-iSDz>Pa*r3-EbWHz0?GSndR1X?_tL* z3C=^)kQJD4dRgYw>A2!mUK^1EQ|gPe9ju}hi^ z>LbU?41$aD=_kgj`t8edC@?*1JTkSpxj97SAx~6IpRO=C_2T!V(2k18S&GfrIjwVz zmvXx49p%>-P+WO{15U{eE@)-eWk9KAz z5%Uz93A*@k>hO}m_T6g&3$&7)UjO3SU<15z(IJ^(i&_udA?<>tg(<1+_s#X(5uQo7 zY$B{5oKm1UW9uC~(xYms`Y8)V{IXx(#DAK?UWOh+A8#{2Ty}G__2ibEDKM7ZOz*wh zF|gnL)$Z=LG(xSRPvS3V{6;2E9)P$U#aaP{S_wT?XeGf{u6A>=|BFVqSVcl}ksAbE zbotT_LEi6n8HSCe1k-V z@|`KzPlGgd(&g+pEo`WZYri1Xd7bpT8>STD_WOhTgMB&#Cpx&>I3?g`UYzlw)KcG( zHmnlnlOb(bFDRmPJD3b(V&%Pr{*1H_3MC%6FnN0|yMP=!@M+TAhnVYu9;(20;y?-F zqKEA?nXvPS!vM>~>eGudbE;cv+&Hp@f6?`#Z@?7>_n;WILS!^C?s)h2ZB45HRtH5^ zZ~Me)5z!y(y_DFZ6@j4?GxJp?3|s^Oin}bXa_DtA0&%GT&LLht0I2r)kY5zT?X9<>x1PYD_Yc)Vl%=AKso240FUyIBOK zHOm(YiNl&%Nli(Hnw~XHo@OzaVn9I~n$UoEpy-)7~?D+cS!}Hmdw#h)|dp!2>?d+e!(^VDpNA73hAKN6^;< zCia1AP2{%oFKJLHl+Qm#${<{`j_>S^{`kFho*Pj`IyD2t(+~%cluCLkF$@f%*Z9Fy z--FRQ@X5I4TDhmVKlI1#zqx(mgoc6fG3ezRzMlnn!^FOy8B_?Q;{ZO2F&HMwC(jtV z4y=D!a=-Y}gsn`7LB!%#jI{4Qt-M^eMJ~Fd4lB0$wOUs}MjNylN6$ zn@KtoR`E4M9-yK1gu`S&Vdb4v7uS_TZ_?k!uCcSI)$4baw&om6(qLB)Dlrd}(wF5< z$PmH+`k$03T3~cR4QR~~gdiXA;bm776#Nqd#=8WU-#fz)X#8GUXXwo50iLoKXpv_l zqhBL0QFMMK_WR@a?E@PJYp_+Tu)4&fu*Rk1nKHgEPinV(4MYeMBbj60 zR`ICqOyyJYy~Dx%(zz?zgh)048>rCp2Y?CpWwP8#oP3Q_2sjvOo8uE`rh(>S?fK$0 zbmStNM)0frdoAvVt<>ux1!aj58xA)=8&w|Lqj7dIWYq$w;Pd`U{*=a5D zG=jBpa4zQK4F6Wk>s){u!e&^vUNy}#NW!bbmGzbL1Zq^Jz!yKIVL^vtuTK&0yWda& z+(K~hV+gGZ5FZ`PpbJEmh+(}plX80cO+Bj=^nSawwrXl^RgL5i1igf>O@TYWRM}}K zKOL#>0+*SlV{v2|xrsp-blkJ=GMgtZp8C6h{5;L75M|hZSB1}XF)9GAS&*>mFyC5M zQ{hV&+@Q?E6NCKnDvF|y->MMWq~O_Z!9Ti|RfD~nQaS2> z_XjDnegwxe4OHP*1vCtMzQmF!t*DUrda~9t+sCg;5lq;{=@bwx4V%854q|uA1rmsU zD`fCKS$JDk+U{!K9|2J=l!PGxFk&@WxDc3)H{>!X+{eI^pd)5Pxn7U(!J8Wr z6L5{hp|K_}r1cHi$6p#mKgi%?to8+L-E=vC5E!Jazkz9T$TG14qIYMBd=Rne#w>p; zMRbx2z&WIm>cKrkCEfwD1VF+>k!S$e;c@`H6bu>ip*u;kyZnOM*U(|#Gy>EHR%S}uR)iBW&m3#pZmB(MQY38=ka!55Ruh!h1e18(;3W5p zxrmD}H7@izN8Aa%+PrLf!-C(OBqDBVuf$Y&{Q#LU%a?9Dd7l0PN-l+b5Ss;^HP|%$ zCr?8EBTur$DyrD8U%5JJk}}R)?>MXJ+L35a^%mg}OD8OC6O!+0GU|7|t)se5o9}=7 z6Rk#wpT)*4?iV4ajP&;e#X($7VmWMMc}(X`Uf1(XW!229H|~`)X2XA+E8V^N8>Vcd}(?8TeeH` zNAz?u+FD^1FB%0iu>n2(1_j|)Ch0fkmhiWh?|H8^4Pa$fjdX39Y9F8Kmw)_tYC;r1 z{{;gj$uIty2!9|HO#jf4XfrL3{y+sn3`y`U>f6PT`f)vT%gw{}4|VutR~a^N_kT*? zVW5_91T>luLn`Ka;@0^wWP}Yy{J(!DU>8FzF9YbYdFX(Cn_-HUZNIC7iBL6WTGswg z1OGMufA#nO!-Mu|)Is&>yS2QecGM76Zy+ZZ-zBGrXp zQX$R)1QF>@-&vTNf|+1beC+EkiyQ4u$wITn2j!%DT!ARbKfApTDaHnvH zOVzl!PMHT_%MI{;2>wv>aBe4-2WnN;Prr*8b-#ue-bF0Br@m;<0CItmxIy%ll;Ul_UAsct{`a2e&Ss9m*gkCm}DG zlfpICMEmljmiUauXcn>BM0c_-{_0nDST6XsY>w65K85@7VPfCc>B)Sa&@~m91q>HO zVJ%;s{RM{3EqlBAouKip{ek?7Bj1|Y?tynMJ&E30ffoDwoddC=`StL>r=yw9RkhSF zZ&Esx+ExWX)(W+{BC?zB{!R)n87vE~wo}8Ma}~)aK#E>j)98DDUj{($T@|iz_QxE> zcEII0e?8W|aum@#yZtU)X1d8OB$Ie+WZNTDa-V4NV-WLt@a#bmYc_f z9yW{yIp?OzJ>rGN4AMtcr;_tk>l1@R>hOBL^L36`g%9bn<?C!$8HW3jJrjb4ludA%e(p| zF5xFMF6Mk$nDvmJd*tj_S1h}<5jZ6^T(Ys%ve{xmBXAp)I5u6e|0yixEVtBy8vXYW*%s-0jnQl($j$1 zUbiJhlen@@&82)S{PKSBk9Q3OCxBk}B#l=z_b7ucrhe^%Gl7aLRj^oLKK+N}0_1+W zZsTWF#G8baw_SRs7IFr!(-7}?Bi za$^b4u1Bi{9uv=B0Hp$$O_WA>=A}+uHQ0a|OoCDM6{rvdvGN#NbM+iL5>LYfi!?(d z7LRZv$02Gk4zX{;R7p>~vDx&C=ztkAF$kIO2e{+k+X4%b`dyy)JY8ESW#$vNF?25` z<$!uY5U)cq!+FIl!z1|n|TaeoTL_D()PTN zgXC2Zes=Rb^f{L@ET$%T3RLnDHbhwfm}#l_ivr_=ivIu*-f1G<<8WyD`nU88Ulb|E zS0A0z@E=4iqz^Laf0A*31cuT()jiR*k?1d(5iL(-|#J3urks8CQf0zckQR}pxytL~!)chPw z^1CCi93W2SJz6CSwm`=QU%ana-C$RQiQ@0J)4C^=LEinF+{1(W=J`b~7UExx>>dQ8 zqfu9e(uxzeJNoQNXkdcA%9tlndYOS+MMUkRVm-=;7hbR0iLy|Uy3$!#WjA?$R%vvC zA=f|G3~~St(pkM|*#K{rp+oipKvc`ynplCo7zb3c2~;=4m>*$;HRH>xS$V>gg0_A~ z1}&o-F2b+;_f@v}8}Hm3pJvq=(r~i(H9dchb#i5Ugv<8r@->|E2SR{?9f~`w1-@Yl z3VK+1cxlDtR9`d}cEF?$Z|cWWcQOi@QoE5fH7yL5{k31-*VfWbLJl(|D_JEMEux81RKP5qQoggZC~#%6?I z3S~Df=yV8+=kdwNXuHNBRB~zJ@IEnkHL)0a{KV5wC{9EM$nw)Q_`jBwr*HGi{+#jm zpX+@cc^+eS?9|UG^mF~W&$rRX@;2|5acv_D&J4X{?vx(BnxYBPf|?Ya^dH|F?a0KZ`xU@k>+dRG0&;^+{m zvS#~uJ%(uh!*)pR_w+vUh;E^3e(8=k94G0x!^@-cd;i!d0%Yb@rdSM_*0;A_m`Ta+ zQcKJO1iZEX2zwg1Z_GL;2i~hTOmp%=zwUjUFZbeYz)rtrj;EyqdvtUOyc+4g=vwA~ zqg&_qa+tSWEUsU8K1-1IPxC>NGj{Xi*(S?GiqBxz-0}EE>*J65mVV$`@J-(lfv%`v zs^i}t-IHlRb7L@EjnE4Je~0wqq&p@0YpN5cng<`O{6kXvOlA3l{=??Q6l3n9 zgm%E{_({F!HS*4MPWiTQk6^~}F83%OpKG@|G|S6c3_b6#px4l^3{(!<*bQ@xZcll% zrCtVX9730DxJKx#Gy%R3J@t_lyA^HhiTkT}#|Ou-uUSCAhN(45<0bI^CoOI4U}rzu zRlLWs@yDW^cYa%^OQF73;VTO;sm18bOo^{^h=(p)PZ1TLb9f?0ni|(DAHu1d=s8`{ z4;eneWMdOjFlT3TomHXDjalgNLUV(=M;3RRL=B4iMgzxJ!l=DnN={ETTu zzXgfZD6VjFM#~S)Y;HG%l>nHZzIjC#gtB%eFcIb4l5nUYSfW_W4`RS4D4joO`$)_# zVtbLxm8+exd>%{xWpxUKPad8>q3L4neOVTs@mjYSsm26W@HjNi-#1QcE~-2olKBi< zMpQ!@0P`)@JhC&QvZ!6CUm#GAk{*Z@2xJPi@6wj)Wc4V7@W(+CvrCMDj}>dJBB0A- zz}kDuw?LQ%_;z3Ht;y8wLb|3%|H{etYDi>CFX80eKdbrif5?Pf3{w43hEWkjr|5L- zf+XA>$L^5WiCqzCWm@Z}Gl#~vM0Z9?6+?}S#;`MqBjXx4MEx_S&bbxJRK61Y3kZIa z190YDC_!eGAh$t!d!1g}rcl_6gVs9Mlls4bSkJH`uZQoWbtay_xP%y-)B!^q*E&0f zK&uE&FXM_SCdsec6w$sC`uVBRAQ<-M-X91V=1+)U5m2u?FjjA)bKt&>K>nfD!P0$q z(RquH4YoQS88%jNVO;F`=Rz(--dgQ#dN~YFksz#n2E?l z48MxiNXz0Rgfk)UZ|!M!!6lwuCu_&=$*TLkLz-VcV!u}zGgoHeB>VSmIY@;T{M4Wt znrNuW8t7U|m;3j9`QAuo4S^(#!0+FTwFmq+V|t+FGd2iaw&th)iZr_zLkkKr{a^KW zxOvajOSq;>w6ntnKI1lw@MHK7PUEo$(><_aXwH+9b3|*IC=s@E_Wqfol+YI-R=OS` z*piMo0I|!3v$QsdN+&jB=FBd^`KP6|Q)g6T_*`zz=L19Y$R&HIwUQMu^2>kQe`3Ji z%xd)plXN}AGvw_FQxRtQAA%6&x+Q@D+9u7HQ%`pA&1KAMjG+D`b>l6a39sq^hKOe}A9^(m&1Fsi7|l%fgZ+^xIiPs9mYu*s6qBn~Dd03qo)%ILZkn z_hI$eJY;4AALYvA)km9<67N`1+qj1rk*)mzX!!fIVYXD0l~VOI|KhTO7HRu3GLE)+ zLzK%TW$A)%*}3)5xeQaiebGe%5QHm5m?weobzeHA48svl6us3>SBNLR#4GI@URvKU z!pey-T}Y%qoBpeq?8EtIV@rxkm02-c`L@E>Z+6WfSnsm!J+Sg$Bc_Ol$j{UwPAiR* zz|n;|j^pX|8!6bzETSlR-?X~j-X_S&tq=mcoM>UqJy`#~>g_ktQml^g>={-GYCn2o z46`^dDb+pNu+r!gP1XBlzsXSr#@~mRL2%Y-m?dq}uH*sX7njY$)+uUU2xufi(dzI8 ztSCG2xf~3VvVu=n!kd~(K%omtzEqob9BsQGMnnnnpz`h{0@cN#L~@gE=82u|dBH+* zog3>bPq!-B;)1kN<3;4Mm0@bJ{wA@ZXd$~|5rLj~6G1|@AG{jYD@Eiew`HHY(9-t3 zn(Fb~Uxy~ChPAKkYCIol@)|M+fJ9&WYm@&#SD+M8Ptbuv6A)1HKPTj2T2n3fYU%9C zH8~$Ur?|ny!(Jctl(!e#&Us2uoAVgGBETs>eWvoX<$`Q+tLMHyfHCoaS=1)ow*zl~b@8rAJljAh zp&%@b#(G5LQE?zb$)9;f)X`*XkW_WVzB@wsNUbX{MM zuGnW+RmBiypZq+U-17kG2e39@{p4H8@G zM+oox_6h3*eAb?Nct)=0kz-hy3JbHswej5O6=_JQ#WV?k?QN`T)YK*F>`w8BhlbDD zX^Yf$7Hi?*VfbMy3(|ijdV+iVUhtANG%Ae{Qi^L~wDI zp5N0mt?aMQgb*I-cKtMmW=36MCCbuz_1K~HwEd`q#~8`YCd7*$5XQ%g?!R#PhW$mm zOh}{UcN0c+pDzP{uVi}MTi!Om=wY6YgX9Oag%E!Gx)~NSyOb!fS!zhblUu;_?t%2= zVYzi8pKrdIRrCT@g1@LI`ud`9a*?0e1!p$>0_DGwU0wy}(nlq(8`MPD%SqQOSV0_o zRbb@^qM~H|uI{o~Wx+U=7TMT#vHseUMFm(aHIDK_s^w7O?t$kDvD{aW{U{0b_ZhC| z&sA%Dp8b>lyB`!K5GhzVJ_$Le(UtS`^RvRXC}nYm8C9HB00*FQrs-4=bDCKZHXkRA ztRqZndOultOW0j@>xQ(2M(gs==kN2+v>0*rY5P61of0hlbV;M9#;B z3~aqSbQp&5#n0<10i14eby0b(uAXq!A|L9^N3tkF)iXKHoUAR_wEN2~hz9v7l5O7% z`_%BJF@d}5Rg2=SQsxpSB0b_DUI*&klyWdNMVRayXeWWec`zOft||zHe5Ts#Ou(_n zYxv!N+<0-dI}$0JEu5(ari-K&(P;}ndd^<&uO@JP1PVH~+6p`vm>kTDI9RzoZypT) zm3DIs_8}Nq-mPoI$lX%bP3-xbF=}+jf{CyirNhJ>~VXLM6&*>LK_}3ub}Zyy}23ow%n}x@q6Jq*}c~ zcqTa-laq)6+X4Y65x*WGoPeQOkwofD@%}$(qNXU*uiCs9L>N>S-F|U8U7#TgC67*9>uPT2E9vu9{`Pd)8if|Fp-2BZ|K zIRsGd8kI|t2z>wel^HN2y36J-ET%&s2ExQg!Rf(sXj+l{KxF`hthYNb1m>7F*nx&T29bMlhI%! zpQ~?R7Y>Ml93j&mR00?`eBJQbr}}Kit?pwp2I084WwRXLq;)>CSw_D1P-5W#!&c?7 zbvzpXc4(UKNy3^%!)Kfr^2j02#)&@`TYtvXG}JGsZ?!FXc5XI@n_4;IaUeNM18FYo z;=D$NCLAanj%P`>-TI5iZG0hYkAGBL zy<`?;E#z(-JKNW}EoX?Q?5K7*dvw3r@XvY)v#EdxPv+8}mquuj+7^bgO#NPFtmbiQ z(qiJqb%|l(uAPa4w>8QAaQPYf{xu6u48u^76G8SWH&sMu5%E)^02w8;s8o`uHAiRX zvB<&JXYt&%hC%L6Dde_w%!rt$-<9p3ou0#GZwNwmltc8_*f!TSY1C|6fnWlwAKKr}UC$hZ#HRqF&kF{>2~sAkgj4 z6944@B>V$}QP|E&{L2LR^baHpo1xS%;D3A&ShWA+lmM;&uh-!JPamA>f#Yq$n72(2 zrj2b>bdI-K;sV}DgW^31pG$qf7tP7IanQxhb&b?;*p^5CRYyHcfNgNIL{lW56mUA zbI@E=#1=9d#k9ez2mWs5s%YS5IgP0nFio>%`fH3@XcBy^N$%&mtl~W+?A5Q>eDtk9 za@lQ=15)z>@^=wGpFXd}DHX+ZyrDbJa8%Ly{PKq%Y5r>U$tS{WHOoBn;~$IxzXAhv z^R+&QM$ujQYsBiLV+7#69DMy!g7DSk54w?3Mxn;a5@^nQ$~Q4DRcz)gIl5y)qVuW^ zD?uP|Lt#Ur;gHi+!yd#iA-b&P{Vn_MT-^>4t`lVA*&Z4>=3&hG zbt2xTS~3b@SAUaUF7oVqYwk#gCfp3+%c(K_3316IJ6Yl6FkbkoKiXuaVs;lG+Bfd0 zovJSjc{`w=mZGK51R8d0>%8V2jgYl_ zCkZk>fwPjTq^pbU8XxC#IOOX&*eshoS95mwf0n9yIfn^Y_&>n2dpA#`^`Q1P-(CO! z+0sR$`e4a8l}bkunJ;xzu|uLHt{FO^T=V6bet8vd^#ch{-ln!h0ApVpw`r!)4?`}^ zmp-_tjB2RR@ba@-x<7g+Bqv=7nW+EFtXbZ} zoHU4fkrab)Z{-aZZ5kHt~HIg#r?g9Koj+lRZl!hhlN$XLE6d2Y$3KI& z%0+x6N6NDLKC_jW?b(apK~!{UF`1I7VGo( zMTxtF7&~ObQUCza>KAM}%sr(AJAOFB%+2MNZF2qrF4v{K@Tv9S04%)muu*|B&v@kWvVn5-xFwkf~6P{ij#W#FwJkTa?)ur84~y$m`u&UNV+74D(>16RT`f)4W`vmdO=8!(}V~bn*Xn?!wg^niLz$PH#ZSMrnd!Q znKK}Y(F_qi(gcH}+6>%P3(JAFpvspbIRg~$%o79kVd!Lsr|KviT@5hyT)$j8Iyf@h z3(QLzdOK+|WI;;IDW4gk)E3DoN`^;5SDKt8s$g`g4Xz=r(QB*2(`eUXp3lSy+nK6} zc;51;Pzv}3%mwIvza_O8#$81cNWu6jkoE41UU)ex8An!op_LG#e}dG}w>C<3o~=e& zPWO$JH6Z8cINo`zXGc$mpD&F)9YXMuih?uu`W%uSzw2=h)a$i&>R+E8H@>*Y%sl|A z`{g2E2e;vw%bE5o)F}?VY@q|UAX&YE?ce2FUlsNr^NOby08+s%ZU`%pxd;SiPNZKS<~CxPRM@z?qk_;rI-S2R>_6H?K&=RqZwGCv1D|hs zruWR=^54OpDm3Df6&YuRLJ!PcYWp?bP6}QBH~?0F->B14_8#=NLW_V%9`(~FCFYjw zdeG^Xh*_P7fWQmyWYQ$(*A9S}s`{|^A!;=lFfi$m7Jkr)Qxa3kl_JZs zW7k$>wdkgSws(H-l2?uSe$eZx;L6z}rfGz43x}evHGOGWZg5qHj3g-G2T%92w(`1&OnPyr}ZQ4=srCyvwa4gfLc4B$> z@Ae2Ywwa+aot<~tX%9Ug1ctZHxsr?d`dZr16nW-uMNMF?V0Bo1JnLdq_)Z#y1GnnT zEpG;VdhOvbEur!*s^tUOJgA+J>Y~@*TMdQ}>2IExnNCKseHmZQMyZo^n;(8)3x|BG zzCq6{O|a>2zZg8paZmX%9Neg~Dv%I3jdFf9Ax2m#uIJ^7E0<2#X|5Z3=GY20Q5(j1 zna2wgy)e1BGOU?FjICld9HKBLAXIS;@{!17-f|B;FRhwFy$mvYl^J=W8K6%}nz_Vt z_g2iw2!>%;O#ZCjghQ1utc#x|8G7{P_S@!Z*|--te)V&#n{1~GbI`N~Q{cY|m)t7@ zvXo)G_nC5F=nEC7>7`g$T(adMNl2R)8CK;JNGmn^Gs`Y2olw?N)!jfIy9>3hnf+Ra zT>_&V(S3>&b}HKWOtcSugV$z6n%1c-@=^a>V(F-u)ib25IuV)I=M*20KO5a4} zjh;VJ(>Z2)b3Nk!Q&Kev4Tm)51?oH_M~Xo20dCR_%NVy>I#bbCW{vc5T_ksmve=A4 z*nDkh1hyfa=3QUoF0FPkc>ii+b4$XW{z0X|e)|0XdgUq$p@t5_{Z~(MgdMzm z1M&ytu3`RLgI@D0!nVy|(SA=Lk#r!ef7Gd%VIE}EBYYqA){U>*=H&xXtrOm-fp77@ zZjR9jJ($Tz(^GB>G2O))U@*$jkd&uCNR9)>4&|U zzCihQfa;l(O6VHShzk}m^_01)=bYkL>NZs6@zrRDem_+cBoO48J@t{$uPdch${ixnpW4eOqa*P>__pOfPLCZL2oB^?j~}`NuX3mPEW7x#$yUKTxJu8{&~afL zCKCrGiQmFM-$eBZy35Qe{rbr^c?2;ckz@$Mz%B%s>=@S`|Gf4D$DMx^`T{mC`}7F8 zq1qP9{?cPdHI>G~F?%+Z9$n^>W;s^pK$U28q`cY<-3>rhW~labMsuRITJ zuw~K9Tc!(E%6Wxuq`Mc{XKL(nNfr}poa#2|kxL(dVuDM&X!M@MJY z-LT)lyhXx!F_uUS~_T2q~csH%-45L)PSQldh-|FWIu*Y~#NMZ@Rw;O~=5Er}?K zNz`C>Ln6#&lufJ6w;+*K7rbLC?pAyCl(fr$5RWUyyOExh5%0jr-3*pNk%rghxOr3J z)tAVd!MmV|T))6O3UC37tq>`N51d+I@?z3yD=>i(?ImZNX(Av?f83A?LKc> zw~I6xN*x(EY~I-OxEKq({20_UU&-4t{G#o3a1(^(=8bE_?a-?K^2KT>zIkd(^rv$* z+7znQ=91-no!GzQJH|`}nCtIZ^1F`9-@+BVE}~pKM*X7=j~kal@8iKR}iDA{M{4(0dP; zw9Xi$*v>^93c9H+rKGBsL9YU_^xA9RX}*fP;yDp&<+*=~PMv@AbTx~H;e|owimx%f z7mNC!yL(!l$ls;|W8w>Cp3ZPFuVnF5B@ICR+fnD{b9Ap{Czu-?M#yZx7*@^gv9^8|Lfc;#cwQTI7Rcif*r_(w1|1by zfd*7HnG7$DzsofUibekTVZ{}tUzXd;^VJEcE+S@k@VCT%%1{CCwfDLBjHVu-)UL-X z*W@4`pzJ(cWznxTXRYJ{RInX9hru}w8(O%zOh{||zJDS!@>qTEqLi6eHyu&N;{c)? zyuA`v1iD#RxVh+`(+yAwq6qM9`;#6d~Hk_b3- zeq!Xxet0%Q5Y{(LSI@6E)YM8%8xNrNuEre}?1Xv0i)qCQNw(z+J|ksN@|BrxQ&dx& z{>t|`6}nT#;GPI51L-r{!6}A0fMkn zL0HdSEA_aQ0v7=e&fQomHP-NEa%fNpHVZ64ALChpsB8|J6BoTCY0HPFQL)DFg(bt@ zs!7tfb{b>pjRkByIZd*?dKYf3#=gEGnuqM|WC$3K;;K4x8?oYrm(;|!no1-GD7?CYC-UF1Pdf3Wv$H_zMZF0^@WQY{VklN=gL(msM_?e1Htbb_xB>F`Z;dyUvt2)=!yw?I{YIldY zYUPXNAD!kl`k;B#Wi{QEQ8?&$EO9cPjIRPNC~trG*IgS8EWPq{ecx(E)AvM(?sDMS z_VWd9K4g8M5wtQM){(LP#|!&^+l@c)Iiuvfo`>i#!DAApf28=mxXTDlSswAjQGqkE z{I(TGtsFt#XK!JaKtH8R8C<0sRyvA43Vc-k%^Esi;2tFxO@%Z6gfaPL1~T(BzaH}-M-Mwf3#blvBI>n)+{GCSAv@V$&uStB4AxU zoLkQ9KO;XGP)qrb&|GdP&`091ux zL`3@Mx*Y^|qyN2nHJ<5gT3PJ;Uo-1AkX6njb_za_zq|*dX$yzN*gHDqO2mIJfB!aKoyyit=iH*WHE&ls6kpP!Beyhqoi{x_vqW(=#3WgYx2pjcZGqdy za$xRc0FokDcokWgM2_kk`;-?3Wynxli+O33O+9rm3g`%A{ILwYYy!}xLfQ|-gg4X0 z4j(iTE2x|!|679xrlp0nwtf&xtvkN2XwOKwzHA%j_kxLgA={RBQbWcKR-uC_x14+M zd(bxr;BJ&U1lF8!dTFrTd>*EER<7#iks-VF@3eZi#$9rX% zh2JmBKKDNA5g4&V)i)d8Pqz-6kqV#!&E%FmF7N8b@UIdi5-rB1VwCdeHvwM2 z$Hc4gjlq)>-j(ww>b3`e3lQJv2~}r^QJD{uhRGl@YhA5Eq`8P}Ki3?sn~IxL4+WHmQX-eO^5`c5_?GW6f1fm?uiRVc{ctwrw@?7Ak;aXPh7ub08k7mWbqS?q0#PCBoN_{h{u?VcLs7j+RUvO+Qez zi<^Od^3Bt*?vXwS#GW5Xa9_*mhcGdMmBecKU3uiXUy0=)Z_gGwega0CR0|7sK7{%V z935ai^_Tn$sX;C{Hsm0A@6JI2pd&@Oac%Znbs0r4SE(h`I(ao@Zr+&ztZt)6%r7Sl z^jjb~-N7^7J6~r1ilRE`D_FSZX6Z61jQ%mQ3fWTM1{5R{p3*mf#U6EH05(|4DtgWi z#e8`+v=VXw(fzXo*ZY0m;#h>(7}ANEU@YG7@tQsgYxR@Gx!cLDsf~$q26SUh*v1)j za=qGc8pQcP*FAU7;!B}4L!6ILGjzH{$4CB&g3!dG`%BV$ZdQg>secQ;#zm@975-?fA6)9fK0sJ_n{COc{J3za!8gfBld9)Q1<3)eD-_HEzIDC zUCIv3W@JJBRubwODZKIj@b;EbaXwF&=wKmuut0(a4NlPD?gS?g2u>gbhrqz#!QBD` z5AF~=zzpsX++}c=fk6gmCx7{!-4A=t-gEEWkKOZj^;6aTR=?d-^>liW`PV-+RSDgl zPoj#ye#7-AlqkXI6A#S ztL}y`VU1SL6YOwejF&j^k$!-iL=>*;-Pd-Yk5WEBMMffqGsV|V*VH3>s|R*$(cC_6DeH!BVBCM==ZV9A*+D$ zq6KdPy2l(GW0-Z;Lcy9`+5dLmPacC*tIZYUEz&Z-{9S4C*Q3T+;UwE}#tmY_&|mWE zrnnTExHpUqbxECmoidO=rY0I=o;t0=8jVk^#Mv^K-G})DS4}aG7P}|!VD0=1UusD~ zy_XP3?>6MChJW|oIev#&m|>M%73Q;!va0(Ux|FcC$36x9*OCi_!ZzP(G>@TW(n^q= z#3!#NT%3;JGVFHBlLxkr;#!YW*0<=8#;k#?*|48l!jIMNH7{86_vS@XTK12<1h-~w zJwF|NLy3^)$AhgEZEY+D;vt9DM@JVHEYYNMaiY|SFr?IvwXVtuthnG@feNWT;(g>lRZhC?t@z7*~1T^|0zmgNI3PD$dr5*Q6Q@+Pm)7ok@1ez|(t= z+1$VJqB9UMBl0TV!}L6>u017AG60IQcfZVe$nn{eMc~oM><5GTukW(xl3R3jzYHZn z8;y1k+*q8U=MI37=UcgS{RP^)vJYlEO^sGS)kD(0B0`(LS);o=H9x8pcg>QfkqZ27>(uJ>);!{MOm)${a))of5_Ef- zF}%qv1Lg1jEPiE}cVfbs#imUA9drD)F`nm~x?buP@;>cy=*s<@6Hc4#Fv?FT49d03 zX7UhuPi zvPnjCpD{S6wR1|S+gbN4lMcRUjqmjA1{_HP##;1{GGpOwQj!-z?yj|Ng_Oy)brPBmG^#K=%R8DZ&z~IGsLj%Au7m`#zD=ex%4ZJD>Rd z#PmRgrgiQ_$ZO|uQYTs9geJ@DHaPix&XgAElP?&NPvzRlp3D*|?6I5hu(NYNjY02k z9aJ2X{ic{q7?3g^ju$8(`!udbT3=C-82VlEiwCjqGxL``X2hG3L1Y@=&E%QRFb`cv z3Z9d{cjieabrqNJSoDH<9*gyDy3%C3f-p|r5LjVHZ@=mOBJ- zGQZF*nHJB&uT!hXM`VaLj6`DuSx_TdJ&wzHel=`xiKz^6i4aSg>b2gpfp5;{Me#n@ z_C0za<|lY^q%q>z70_@7_%^Ub#OM_E6YlV`!pzr3gC&g={|$&ViDN@aC!- z)uz52nd9@}xOA%glgbd@;Fg=vxu_Rj63o?J5@YNQKZ)GzU#`>q{6#`Q8nSYx^UQB2!+Nbrd+1GT@axiN)MSN#z(Z--{6#7qM^ zDfaa;JqYS~8~NiV93HiGSfM}OZaO>S0(K^?)HN(Qrfe*m(Eh~dFr}aM#vAp-h%m=I zS8E6=S+C^cE6P+;d#HKzqnAqOHy?c(-9>Ru8l0|Y(^u$tTZ4+Xal{RQsrudyrt;0T zgCKowf0za$ie7#dEyh+z3k>iF(QuCWpC>Xy-e^s3V8#>0rQOi)J&zz6SeN`y_B^&}(=Di+X*k!D?Gw!q5%t%C#mFl)qLo{lieXd~1zI7Yas zym@@WfLTw6VEaV!nU$2+IEWJ zjZg-F!r}>yYo zn1W;;$HZ28_|k$r{BHTzzK8_{aylwPD}i&cw|*x8yVZ^A0=~Ka?R8a;STU^6M;@2# z&%&VUt4~HFPq{Kh*f0UQm*(LxVMrj|w7{hEMJ*s)N1wcet`OhxrGz|tepS}JPU^(u z0oi9Z^~%n7>aMu7oDdu~>(6;Gbcl+!m*Q_)A&sc*H4Esrh)wXu@9LsJ6aio1+$nU86QN*efgM`LRPE zfzaQg-7}tA@sNa)4&sBp*!Z!U{dusMEG%IA#mhnSiqnc-^R_ZU2MF4D%TfVw&&<2> zNA*M3b)#8$?_4Z_YAI083=vI_xsfJ3F+c)8-P}AolGp;zc$w-s{-Coh9g%qo&Bf^m z0QkQx1omEz?~WMH{mtQ-_jZu*Gki|LR}AB)S8$r4?2e!%Ll&zjPR$~`02T^|9Z z7);%4E}x1slOmu-&vXpCCf)<>X% z2UPjw4(6XK6h}PC)J&c>CLL&nI88n~HGokqPvV)a4nmDUjq~ct(X%amR!rM8J&JcK zJ0e2{RQw(5?GGKfmYvoLn}GCM#4IQU8$=drK`8~J^GQEZVRF7WXXKKCywC-fPd@IzcxVNv#-=dJYfA|?%}ATd8GCt&(;HdSk&G+3_>?TsbzyisX51-dpW0C1ZFio54Kqt!+b!8 zSexRW`Z8_7(B*kAK9-T+H3+h7)&Yw`Ur`0+^J8@@B9EXA*PybPrg}th!}hI1|MBOFZu;6vKJb~fdfp%wc>J!IiegWNrhbvvqY=u# z_D=l_X{hz}5(=qnHc#PIR81J2wpV1xWolyl62(U_zZWyV8^^Rr(Vz*#!3*c*p)Pa- zuRiN(F}>nZ=5%_%b;|thD;~|^)3|pR$M(l9D}jOid&*^#kJwz<|Axm5psQw6kjUQ$VcV z0P;d%rVRbgpSAfFdG8Ox&J4Ky;~+pWk{X0Uk>pDtux?bC+nrf8sOJ8`256m28P|S* zUsm9D{&EKTNOLh#vTjlz6d*7ilJi8qYR@CLR`0VR-%af-Y+&6}=3d!krGC{dn&iXi z!}gvJq$My22Mya^cI9TNEh2eGx2KHMH^L6C{N}?x;u0NJnk2j$sc=(1a~$7+8a*{9 z@ui2e(cZ_t2 zxc!k1@3_}f&&SlKZ|xu0hM}(ZRL{!_yvpB5*-{_STjxM~dMkw#OyV6)XCLLh&1uN3 z$GS1~zXI>kFr%y{R+1r|&k@r3Y|IrxrRtck+03tM>gqJ+u&WWIqEX-Pu^3e~GD~Ft zWZvk3{G>C0tFOTEb5F^EYfe<$09+g#Dyo@~s^6dc@a<6j%{WRD`gvPt9x!vl&O-#Jlk{ zR`tR962DiO<3+~NfS?(uNuOp<(%Qwd`4v=DPlyewdk?$q%-y6OqD8*TaY-~Pb>#L2@8$!OI;I& z2aECJmf+j5O`+09S55A*pB;9~A{$1?RZQs_q>Y%;=|tXRHatuR|M-O>p*jJ)@`F+} zv%1Bao+!avy)rS6Cw*1HMB%a?0$Hz<;xvx0M2|O2m+Pkhoz4sL45(`^OVn89m;`{n zvpIl->n88-RYniS8yP<#d6^UR5$)e@%LLo0;WibVFQAS^= zmcQ81=ar}Ku+`Pd>!sbxj;Pp6zwZ&Y7kkfm$YIQ?FjNs^m0vsUQ$%ww;b)T)ae^3+4vGk>o<*GHp@&)gUN5}K769_J5@R${R8(}8$|DiH z=SKwh>WuVICm>`S;)c5ZfMWcBzE}+XlfdJSjzp#k!+o-W7Px2Rzn9rz>TSvm!QqDR zl1CBX76MTUflmTY13Laf88PJ+=l11-wB`GOKO!icR0fwv}V=8$VoIuXPR4 z_+6X1d0uaw^`v^HEcxjh_>7o>thvbzPmTBQx6HHMOuv2hv8l`RN;ot~dr^n~Ro{S_ zER@ZVIhft|y!Df57URiZJQi$Fb;zjY;Krho)x+75smz56-0UR3?j&eJqwPw<`1GF7 z#>D=d*iZbl%k{~m$VT?zvZEq}HK6a5Og*ZJRh~duueJ5hM^8?5pG+rj$t{-P1V{h*vV$J~%8p!^-K(06bt1UpljbkmsJ(&|9kR*R z&n6tFQF#KPgxKPgZ3M3nOU|23dM4Dr88A=iSkI1YOoZcvujV8SY^^QCN$wP=qiy(S z59aP(`9W>Jd2)q0%0T0RfT!Vu;Ioli&o?{NPr=;UIp**kBk=7p+4y|z zkHbZ?~t)YF^A8^&ePC0%{5+;%WSUQ&v zc4xhC$Y%VYc~EviBgZcy3bn0bHa2SdI1Bj|k8m?9+?whi6)OsHvL*Gz^pD#e78zaX zpUg0H8zCw36>7H{ZJxcEEB7>MY2GAoz7U@toKlOSju!q8=HLl%%dsAJJAY$@&?i`f&~6bGYtq`9NAW%Q)m9lzH89lRa`7<3=>3_Y#WncIe@ zK01ra|GPtbsE-6CbG)3Om?$h`K>JPoS?7DGEjyxlE|+kH1ReuM^C$UocKmQq9x;EV z@}k4IAZG6_gVIPe7ERHs)hG zeFr_ddr*5!Uz@YnFLwnf3N2s689vgGWB8tANUmvG-u{-SNF`IHpmNCCeq1=GG!#YB zDh^19921^Ea3oS*+>1@4ASC`_TG(IeXv-)6yQaD9FqRBYk0oKT^4YdL1^}R6WUF(q zC1Lk%ZNSFwLMF8;!PG%Q4}c_;g=~9Y%=)TCTp>kLQMm72%LO_B;8|p-?>UM*_OYx~ zpJimRaNF7nG3z2k1^9!tIWoX~FAM*?vrN=dnuzXd&e#82J;{~#EPI4f{*!vq4mB!t36ecmj-`%4(@b3QC)ar?2OVpD|>{$4WX{ zJ{umRi+hgM9a6$A85I0{-F*GMv=+Kn5RIxiq4ui~rK|71}1_$#nO!Wh`DjPlny@d3_}T102d=pFCmM0YhE6be*AX9lO*$w zp{NAS8wNi?WN!n2OT_3|RPzNJ%KlWO0;A;T-;H2IL(Yjw_Bj2n*ad)$R@gy5Orl%5 zx*4C3h|O>EX5{(Y^^86>b^$uNLQ(}43(csWWAdq?;YLGrXy)hdoyTV#CDcE(spMkd z98#x?W|pG?AnUia&|n{t3w+GMS)BV~Pf^L47CLr1(=NHRuw7F|A?l}-@N+G3e>!%_ zZ-21QGv0@XJ@v=yMng#;C(I%3{~+rR;7NP>{5|om0^L~O=MTR&+SkL)2n~#*yzbn% z?ZTC5CQz{oz8^fG3asv8?2r~F2ciY)zW){D93f+%Mo3t`sic>yWH-~>%e}iwdGyN* zufcoE%84kwTQ?AwswCn4l(JoznE?@y#_O#X4i8$NU zb(Qr?r@SQD3MBi48R7hH^WnVW_3F3%ip#CNOY%a{XlZh~z3b36gA8H`KAfqjm0w1g zUOW1=SLK=BVwP2!VU_~}p=&4w0jkh>Ln4|K?iUJW;rEU{_kZA879>TE33(y#IQOdR zr7w+1R2&Ij-Dttu-D$^tVb05+dYEo&DtgmNWez2l?~}s$mdMf8dB$GB&led zN)&q%$a76K-ETicxvfp8xpdH8<5Ic0x*Kkk@Fv$waEwOh1fmEp@(k+rW&~eINV5N|{x4jhU7{H&|{YFePmk>LE*_)keaex~leOIzk~zEr6BcYj(hBt3bT%{erC3rFPStxvNM zK|@DLCGOoPx07QGiB-H<`&k(&UGT}6dc4T>Yb8|Og8H4G`yD#1`C(MGX=k2t>v#9$ z*Fr`k(;CmX5^uYIlmODu9kG5u$rke@r+;yO$B!7oIXcZ6IMW#@%`H%YRxh(LgkFMq zuFq*nIJ6)*O^K>7Fu5!$i_%dQy^vB$iw83aZSfZYU1f^Q!S^mN^0*vtJK`M-U-f?` z+W7=gj~Blssq!HO@Pwmr*-A^rzp+sxw0L(=Vcqpj=Em-mFYU{$C^DBC=mnnN@Ow0C z@_VCV^=Wev8|FL9;@z|MI)M#W2;t)w5bG9Mh-?!laYbA|JR< zF~fC@^6l`I1`OAFyhShT4T}5fxLx^!aZabkqOB2qLcT5RVN*EuFm`FBK?@~l?zn`c z`txZ_+cw;8@~K!k2?#B~!sMbG|A)5sO`&qkmo1eKFuV<&cG*MCcB(gc1-lWgB|=F~ z@cUsslaOBb^pYXGSZe|tRoLp72zcC!ThgOT`Jp5z$mIDV4un^g0Ai!}@B@EUyZ$SM zB?$${ulR{6!2m-V_4v7XzI{PlWajtB5@#!^kt@=zNCcz=3Q5RT&ro@rdZM{<7(Ulp z^7ZG_jB?;l4G7n`Gl-N!F9>z?4B%{E%bZWYy#1BPv4+`L>f$){&0}!F65ScoFM}6} zVxc|vd81kZk{8qut1DVc8Zmdoua%NoPHeS|fY+mK@(_A2Y~*zNfXqKa5&`VsEQT3B zWQ(G>x2u4A$Lb{Aool1x85n&)-1%O2L;$1rCigmud>7pZ)S`S}za|679VK>mA1&qQQuY7t5a zREAn2kC^EgmOgmN07B$}9)VLL|Mgjb0ymNO=5%Rg2f1cs9>&@ZRVORC2zmxKOlgg2 zt>C&gd(qqeGi+U5zlZo81XauPF2^4;#*2@(uY=E24~%YOQ}`cH4|5SYBne?F!-?0D z1LqIOAftFb`m7uF*aT8~`$?~RtILP3i`MQ|%Rz3u9>-k>v-|PQ)H|NFlzsrHc z(0DNMw)u7c@=}tYhShna z75j6CA1qCa?gzgG#x2!Q)XuTn%nj~!a9Z|_W`89dGbhx4=0d?$h1t|VcUH0>U2kff zaxZB|@1*^YK#ykgw+}Z35ghYgB+pz{EMX=XPR0z)q2=DRhiQ;A9oU1jy-K5+4c@X2 z?B*t^b10HOhXOR4AN?YlLyw+u)#csBZ0t<}lfVV1-4HZ;*eVYi4?%KcBUK3fqVo72 zqCjzr2mmae-oFkh5~g2Vfi&)B8tCK_`H3dcwWk^zPEKlwHw?`1c}ZiD=q7E&yib^g z2DBfzkg?vG>Osml7u%e6?F=s+3P7Rj*G99@p;@kyfcR_rT13~OLg3frl_1W7%K0P=fb;B96R}`eN>ktPmtit{~3~kCl8~m|7MJ@F1a$Vq(W^ zu;7&yD>iL7yymW<9td|BdOs-+rnQ9?11)2}A-{y;q3XUrX6^2{<7Upq?tM$Dk7WqV zLZLmsnFASjhwA?$z}yySJFe{3i*e~3{IM=xzD&sEOlxgyAH^P zS+az7?rDo%_9l)&>ZBX;_MhU7F~v(&v>ZQprHuS2gx6#8V9o%oV8neZBKzrgo!)Qs zPmM<$EszTgq&AcHw)23@3t#yBcv9ZI!;7jvldlL_+w9_Xi)rwudbH}+^EsEO@Ijdp z8>GLCy8OFbE7@Sz<>9@?@p_6fPirtsE-=j2(CCT>n-b*cF+aWZ5qJg$Ni2_d^|)0H zfU+STuR9Ep-+30kyWni5N_)sK%|*`$F#YUSTEN-EsH-)Jk$zG7;G{D%bA*RwwbB&Z{-CGAcwUs$UE2lMV zYi0RTP&8gaxFMkuoz`pi@hrh$=9ae^<^!5Duhz#r)9ta?C@65FiWEDg^t`|mXzV_F z{H;@1nEiG9ft|lsv3Y1^5X5!k_+LMy1PhW(Xh#_K(|LE?{=xyTdKPqD`M#oz8j(|S@e|-wUdkqig}a<&Hl%n^LeUnjm+uz!C#tR{?c8Y0 zh1y?5AUOz?Y+~vMI+*T=+MZq)@5X>AtWI`aDWf$x=y%rHHHROq6Seq7g_81^<+*{p za&Ei!F@WRE6coNKWip>C-MIHCPV+j0e9@UrE6TQXJV9VX`1tK51c9HN0I0A|q7C`_ zU2ec_Ls2EUGSZj!zzFY|EY1_hVC?g=k1h*J$MFwQAB442p~NjU_lkYIQPMzG(_#zJs-@lOhie~p0c0K zbn2Gh0cn;N&CexM#$#`hjspYfI4nV!s~&M;BVC58qyfrJbWVq9m?*nV@;H=@{6uy# z46)9X%uWp7xWd~-*2kaL!IPPUf~(N;FB>F9u{wrGrR3vmPr&4~0a3krKRJF$9tvfV z*nK=DiF2l;vW4Yai>&Gs8fKt;+bwfL-$G?{mmh41egAAzJU+A$FC>wfx_ADd*Z#Qr^6qk?tr8=~b!p4*@XT&!*wDhoynna* z!&SADBMW}1K|vdHs2(R2-@j32MdN8riWG$RqY})E@N#^@*?}x@fX|r!r>4v z@8w<^;LZ{8Oz+9Xh$N)V@GG-=$r{JWnh*vV9plx!1{k3!B_%b}q$v5HM?|Sw|jrd;+^08e=*MLBvvoQTkd zi6EUSm<{rXaxDUQx*qc{IC@Y1{g?)<68E1c@_c+9oW2nTeFLo^Y3p-W(dmzI{;CJm zMAjlO{_4~6`fW$pEmGi5s1ZqqX}1ruD-9SYwi@?(>%Rn(VK9?BoBUO*CGs0_)Nii8 z=2({Nz>;4=^3bFG|0A|*;QTmUch>GuP+(_^5dcp_^5i(+A*Z!0h>Z4Rqj_IAb$`Ek zA`z8V0&hxWedg~rH6Q37^zg_LjZd%Jg^kVb$AYoRjHJ|AdWoEJ;pfyIyLIDQ&!|rQ z4(I=SNZYpKl0weUJCd(drCd=l7hY>`S-CzKF(j|4Z>YdK;Zl$kQ2S{)GGT$Nr1?1{ zI9d&;FOr;4<8P^fjW5@z4?NpCn==1DT4d!3R+Zz(n$tK}x3VG)4A;1T20|y)NEt zc)$Saf11k=wEQXZFtyRr(<-s#K~lrMLzhb=!tyxLdY&HLbxA8=D30qd^A8ebs0ohy zVX%zByUGs+(Vpz$EOSAsK@xMUO05JLl&l7$B+hgA3^1`0YQs;JaWN@4{n$RLCVi(q z{Y3xiFl3;G{YdJA0&COphw_21on&_MOs+?>v1G*IENv8c76k5CbI&i2n`-Auza?+^ zf!}N0^|pH3JvVXl^7S2yWUmJE3Po=jS$_vde#yg#KHW?!uw;E@QC0kv7Ol<8!}mn> zAbKxUAviYjycF~V#{Ev-r6A?j}pVb&2 zQzF_!6agw`h)4)?8IUD?pJ0I(hnA%)-ErHT1L1% zO-i4n=_QPERJ78|=~)pWy0Hu;i)nVRrpjdb?6kmTKf)!tn z35vN*pz1AN$-d_Pi4VGNHi1nCk}Q3EcmRa?c$_ov6{HmA1+)%ewM{SaP#<9pHhwuj zY-yg(k>p6tuFZ$%WneUXIgi zCtzzEk&U+vFyrA@!2CnnH$)dNj?7>YI}A6m7w%wM6^9JKLd)t`c3H0d9n?krLHY^Q z*M_Hw+hhAk+JE~V#CVuO?YF_efv^Eep z_@x|dI~wCx7E+nS=_IZ7s`TrXkuCAgECAeV_GXwJqY!yL?YT-{X}S zuf09TmaahrsXjKm1~vDCgKqg?WMe0lj^2p_N?s8Ab2KQ`nkcc_bD<4mhN}q=970r0 zX@*w}4$2HKU7U%3lbhpuNuh)r@{dOFif(+9N#U2Td2|jF*QcDSOEL05aJA z0IIQi&d$Hoel@p$jtg5^STP(QoBM^~jkTZaYT>F**+M_x^+L@5%RvQ2nM`_NEEYi8 zVD??)`pLPb&s=M`t6pqK@#Q<%Y#?TI34PZT|BW-r(OZRv=&zd?wJ~WPP?-hxXzBqSAf!lcoc{ubpDGTw4M(Z zPs=ba_r_aOV{O$Fgzi(-BKcFV6eH!TVV+6~P}wFw8u5+l zqr9KD$`bXx3-WQ>k*qs2Ar(HMCxJK7OozpvUAe-dLbo5>yRict@g1`%#J`siVD=wx$MOAj-i1ygC*<9J1f6sCmVcv`Q`Dxhqz0Wo|Wjlvt7OTM0J zk?Z#r)erFFxtuesRXXwr5EG5aK~-61&SQzOpQr#OYq!lg~*>5+*~hJzlDJt3C{K)*BwR5y7$w>!IL63Cr0*&w{DIJP z69GsOFdD=K&xY!PcfCQ#KkI_LO`(joES{mg2g?E;oYT;XK(Y#h?A@1c1jDl-9$R8{ zZq4rjfXhRppw5xCWQuU}g{HM+ER|>6`-9cBSjvhU+TtkMj6RB}8MLpp7MR>^ZDvuz zF8wDHfz5kSOyCtk*uics!sw+FAsAli@X)cBDdDwJaL$gzfI+l!*|;+b6*Pkq!b3b$ z${DxBiaOl~FFROgz8ZZgt*@@uVUAc0WT?;Ld*ek}?Mk4TVGFb?8uwK-(R zv$l&oyBT=;v?{$>;2AR@&rNqq!?Vv!bIa<s=Qg)JmB@xIx9-CS(ZGE3LC zN7boZIAUd^bC6Cw)%_Q5@W1dHk>pZT3Vu&EaK%=(Z#X_i^@#te{3V;>as9iGWdjqD zz(o^0%kMxwcS1*S#!z>hXPdRU0X}{Y`KmrHNZ?0>f~%SI(UpYkI}qxskNb{n(52K1 z#LFic&v#1`iBsAa!z>AEIr};t?`o0AjNCtbzN(FYXDu=lDS2em6ZntKXKeW#dq2r( zljD3WTvsfjSJ@l6T}FY#%{;71_YmIp`;4CZB8F5o9I2XYY}xVOKz_fjIItZ(A9<}> zF-cZBXjmvb!!nOa&x_2Y^ZYv%usnC5wQeR&;;y&KGBPpvcUa2yTlGpi!zUfj{Lg3b z#iFkYAMg!4yO?J)Mp7pilO(qg=asrOXdxUgS5@5*8N3jow%bHGBR<7Zr+HM)ZXE@( zhb=og5$)0Zv+bPh%USuLnR$YGb>Tk0^rsBq3u$TqWh*Fd>we+X?GS-!IGJ7)a5pk) zQ=%)EX?>B)+7`+=Z(=X8p9Q_;Vghu}#tQWj^j>pf6Vf&%K|;rx%lHA5er!d1bCrsY zuy@^H`pp33&=hQC60b6b0lGiOpejGZST*$j<%exCJV^GO_*uuhr@RUglKy7av{^$X zQQNfc+^=%q$agjT;*##%z4i_3yvpjWf6{)C-udGv$&&SR^nmP0a*J=*x%{@Gk>pb6 z_cj<(^-S^`4>__PuK)4mAWuI=sGFax_chOYz3R#Q#)n;3EBCwgtN1Dg59l1x$gU9G zGj5pT3^!~kmK*k2(<6}3oEt{{1MvylkvoBFSR~Zbr10bk{dFhU_5Wq1)<6q+H0nMZ z)5}*vNNHLFw-FqM;<6~`q-U?BU4lG!@)HrJk^$cctmFReynPtA#r*#bE<*<%GwDV9 zk6))MLP#R>WIuHMl_R1C3kdR5s0l%eNC0L)(Xh^9Eb-1plo(-eA(%wlR0A)!GZU4e z&L9GYVUYy>VG-se@Wwf{;y=q>-=0|9|3OE$k3Jyg+}Hk5rqFn#>qf3G_ijZ%^Qf72 z+h@8gCGn_WJb7NoSPPPu=iguuvl&n&cxF-GH&ab?z};=y3<5@_{PgXkN}s!r#51~f zk^kjU(t#BpKc=V88>?EL8#6dif*NFy2m7TN`W5Jo3rsD+TM);!QKWZ-k`A|o>cAhG zCtJ+absLDDBg#Vk01_0pSr}hIvG!gKGYIcBpEC(GfSW^)J095ZA4L)A&~N~W=R;ap z(7n3s>XL}u$?7f1pR=~mou?A7|6~H`u#L&gsxaam%~xcz%bLTz(Fm7BFv5;*Mhz}I zeQ1Yn5AjdrWfA+0$Xx3G*w`0|!u7Ot3EOabL=m7Z)!-a^wDH<}n4@uikcZz+o^!}j zVO++p2TK`1)X?egL(JAT8I2NyBu7<^qHe)*axB=f#9E{b=ZPfNDl?}6VuT<`iQv z(vG5e@4X*rk`TQn1ykuN?__nvzI*zV=JFR-)_y+dvo>5>_WS+FYkaqcUq5+RqBU^` zNe#po)a3s1VEIiijd{q{gZ}ciVGueTimP`uT@-Ff6K{=>O?yYfTA<-~*NOS1F^^P- zwqNA!OE_nF0wUMblSa7@k>om7M6t9MejW&Hus_dMdMED<-c`fd5%c}tmD)`Giu2I4 zqLJ;*qW1ng9AsE*CF<#GW0WdIchxmjLJqe^LkZ0TiT5ZMR0CO?Ztx_%b8tb5nHdIjf#7pl}MJ+ z`zg{EYUfaeKjNU~dt+}sBO{}WEzAtWvFx2``(##}qfKjG>*`km(x-6zm=G{d*``?E zxx+Dsc9P(&_nJPuqAKb4BJ+Bt@OW-cs-RmEu!70GQ3k{NPTihgW*ayduKfJ=_1gqd zrI1SP5GZw|BRqbllygLu*aA;>!8Pv`Qt4z~lc*Ous0goAf-)Zq?w&8b_6ypk0Xab- zpYODFw^pYI)cp9|YLbhaC6@KnDyoOovI^9j1{Osws$)B=J&LS$J90|IIXw8UlVcSl z)s~Cl=jlbPVbVJZ3d$wiaX=@&O(T6qnB3VJ^@^-)##H2|H80>oSlGr#IoYhw>xo)P zKz___kYGrxzjNwRl$@f&GP_4`7CXAUI`=AXB7%S3tty?ZnE z?j5sF-+Ymu#&`~EddwmSqM^39eC?Og3eeo5_e`Ompni~V9uy(`1aD1fBYI=pFfb|M z6&JfNY>iI`1H@9mvpyw($#(j^(xo<+Gp~ZqDnlIhvtM#D&XA^8YI!2ui;lqvf!m7$ zMZLpX)>BuxNL+_A#ex}ycAAJWD*jYnEuE{gSwNTSff zKD;0B8rfT>g~QamGw5M>so=(Mdip80w% zy_q}?Z0q7IuicRx$y*V=GNm0dQ@WrUp$hv@3GJ@HPS{&chrG2g{wlY%KAf>9rU2~< zKd@EY`~kggJ<6tcSV+7=1`G4J`;nbexUJDlBH_RK7yOt#vH1_>oT=$6a3v^<8OYg(U#vW#1^*wV_n29wr*rL za*;#0$2UwgO&*cR*A*YV&pH-;ll-g@VQyqJK0B~@%MCMd-kxE-zMlCa$@}p>oI>{p z6b1XK=V*;GG}2X+TnOSke-qCastvDX6<)6P?$P*CE=3)6{H1q*j9h5GHvbx~Z+)VA zGZVrHma7D}G!viFh-o*9xmVa9BMG?<=WCoHpkI9y(W$9m=2(F?t-?Yee*-gS%CsEu zBqmGH9@S5$I0XB@U*Fcpwyz7|8B2{@$iNfxqzqHzbF*#^&sphIKkBs9!>1a>Ditcm zrGlRc+9D9>il584<t{y-gk9Hqk}IU&?APWOaPxArFWggV}w;`kqDlT8`FZuSr(e zM&ahYGD~oSdj8aYmLwAlZfeQ#=^=a1AShPY!uaO2dl`FqG+WSBaGfS?%}2~oe%d(k z7BvIts!@p0Ce!Mbp9M^KfJ zPg~E=B~dnuy{jCpZy5hH`UHARz#WA*^9XiG|KkLCAbuax%$~91{#Qa}A+Vq9AMk|m zEQS9L0Z+wTRSzOY-OU)gt4H|0;HFQ6WP*8>x^HqvUW0 z31oCB_vW%MGMv=3zvUk3LEGbiw^C3P|5vcfKrk9W26}{v3`7k9FA^XlPjNjPY5uP? ze3TGD&`k8c=ySe{Wo}dTI%_)m95wUDJSt|-s$NduJF8`;MUqrS!zadcqK{^;^Xl>( z>N@jZQ@H88$eFYX#E3Ba5oP*$HK%Xz>7vA~h0IB;O^&O?jY1K(fD`weE45hJOk}vc zN9RrwpQmW-!}a!%>kbMa6uk3Sy|WhcYM#$zh-jk_j>qi7#Zl|GDVknFt)OIOh7F4!J2M8cTb_Yda4Kg%kCCfznbwtE< z!|C+9BJG87K<9!~C|VR_J;LEmTc$9H<04sWf9X0UF?m`86%ZQ?j%0fW_0k?N$_sgS zc6>UP5myogMzcdk`=;o7rnsKu_KUP{Bc+5V0;@t@;3I9HHmOXt`&)i@547|pM*g;N zebP<>=j3#TA5X)x0-OJq(f?gO)yRXvM>x14Xg{Q&J&bD5i#;QC@MRM{GOP&jADI>) zL1^#jqQU9}t3TGJ(Z}`8W!ok4rU$lL49*JF`~YyIN(R_V)E1$0?zlnUf>8(rxFS1m zNC)yKX#rh9vrzf9HxRTi49{7tc%WNdqhHj~@pG5K(-Yqs*=HuIj zv&q}E>rAbbqL8!y(Y=+wC7pF~Dkny*rpB_V6elwsTw6#}Pz6h))}MdAHA^UNRcKJPE@yx$-1_ug|p zpL5QA?z!hVH!G0lv~MngP@Om4fV*k}aH^&-s?fE$TZyF0!()XT!Fy?;*CzrAzD!-u zZmR|wgMk=PG9EMvO#9;xDqCkV-4QOEUIX3M<>7ovi&>`ll@8=|nRVP#whMvZqU*R? zkV6e-PrI8cu>N>ORU(I+m0q=-}}&I2twH>idYS)aZZOx(92mt%f8PwdKt=cc)g}gYI{TdRc)`&6HnC z&^5hshvLjh9i{36jkI0|!;22T+Y3y|VO6d^mr}OQWR%6u!2%-dCEK1Wkn!tnXMskQ zal8=p88B`KOxW5-QG--{@6v5vSf2a&T1?012)CN3pt!nPaWz|!!tbLiGUW!J>=N(s z`>+L7y(2nZ0R)TkyAC@@orMnS6M;AHyG%^iC*CoIm`$;!7f>wA1K7kDPm5uqi4)2~ zl3QrsnFZ7gen4r25NiLZ4Fpv7q_q~e7B$${e*Cz=>HMB$+x~Gx+(hroSWg7{griZK znpKf&LlU)@F>1HDV?wrM=!x_wmQjsAeI9;WIXB8@88`~u+Jcu}C?DpoiZQ4ZYHVEO zsJwoN#j@VpoAl01xg3KT!@PbDJEO3%kau!~I@mG{d-QMC#=?|6-ij3aj5J)mYK42c zb&xu$U7nheK#66Q<6=O_5t(QU(E109uAW3a6U z0$FFp{PZ`BpM+swJaQi|r*@ziW6hNb*qr?qes=GN7igjOPWk~U#e^ml)|}8^lIQfY z!1?oUEYsQ%w_UTbwZnl!Jj;D^q0Ewr;iG!=z@c9g!nr6k+@@F8^_=**+{9(%jeVxX z@u{q@XJK7hw6mBw7ImJ`=KFm83WvAa3X5!u)Jo{?NuWlxJzTG;U$K3E$DzAdRRTAn zgFq>juU=Zd(VS@1x?wEy!vtAH8ppDylR|omJRYi>J~iIluW!LwDu`@{nCu;js|@qV zl3m@@_DV%(i5Zaa-iO$B`hX&b(3K%7Sui=S{P@3(MPI^X+M4DGifpJ>Ex%Oc|( zs9#!;i_WFp)}G``;Z~-OQLx>cX`ajx6?w}O?B(At_a^&MMnf^77<@ZYoE#Q6Pch#w zlnlfp7uiX|KMKzoay}+d&$iQ#;U6*Rr2g!orls{2?hvoKxD2nn`-Tq~pE_lrtd007 zas`)I&>3`S=tF~6DfN7!^rD{0=`1_y>f;vDuXz5~NfY;ElqB&5W=KBbapV#lCUpOda39G)fZYi)Axocj`p04L58oQag8XZL8U~3Xad8g2{gRX_h zK=r!!#rmjKzn5d|sfWT_-!To$(v5kR7FD&~0_@Q!ul$VG*~7GN8?MOWd!|YK3xWz= zBd3pi#+8MUM#TL$VMG|A&9xLnxQmP5)NL1(skyHv8plEPuQ(uV%d80O=U zPvnrq?CQCqx}fOfOH&cG=a6Y%wp3QOofKY~+H@7dr}(xmp5YhX(szjqu*yKzm3Gez zaT}_;dC@UtZ({;--f^475Q4>k8@23->boKHugf=TDwBoIU)Z}!m{Cy*-h>@VC(bqj zH=1c1K`RSISU*BYO&hR;c~9bMd9Gq+acuCGb@hvQ$*iA$$D32>ymhc2g)4{haL_*A zXT~}Hp-7SqtXMO^vU1kV#cPn1NfS1238IT{_(k(8EzguH@e(S0Q=^I>kI zqbi8D7ts0;rwf*g=d8=-4SO;pN7^>nOw{*dM+IX|4WbmT=&7t2;q7`|pAFfwz&#Oa z8IfMhDt~Vt!MPpoUaDPG`m}`J`01IMhPwHYvK=ZVXp z(Ua8Aoa~QjG75&wxeZ>3J?pr#FuqQG-#QpTw5N-XWRf|uSGfMI`6gMvMEl8G&M$V+ z#wzqd+CX4`5jOxg4Q7>>L8ce;@pEf>w)dKiE(4w!HxR-I2F4v_eKSt0g@&`&W3OD? zaqK&QOZ?(|Y)LM5+mV~|&|CugP6=||no<8;fVzo*erY!dbKObl-nF(}zr#=Mw8i7- z?yEuY{*+ex&GhRQC)ZEg@s?Vgc|#xJvjm4(*E9BW@&g1gS`7%p6+WelSsK*STXyGk z{gI{Dv9cO{5K!n~$$<2W@==st;T%_F$|AIHMzTR6f639Ysdnhm%MC$%Xm-h85nmaB zUp4(x)M^D6{=p@Ra@p=i=zyFIH)F^ncwcOh3*`-JE7xdz*)e69WB9+!@ zug}f@HN0$kCgyJFz{znsa$T0nUnGe3{udqqiEK6?f^cKeG<1sDT!rcCKu-aA?4e`4 zrN{TBOn>NNU;4$#VV6pLa=|=k*P0jD^!k8fsU6NI+#uoXgP~DB<l9tNKGf%p{Q>IT}%x0VB1kKL6D)-vON@v7GHWfeTf z=D+@l2r0SkR0`T~Aa#C9Hwo>bs`)NSV-P*0nx(0WF6OF+T|3U-fApHK$_C|nO>%VI zVJ{-Ml}8k4|3DO0;QR#4HeOdQmRG-Z;|-;3tu<#j0D<8|HH|Ej%HpW7=R@geO4!eA%NPs{@hxW8Ed7k0ymn^ x3|@Iv?=_FX2()FL{|AovM@P~B2zce>cmCFe*a!R6Cqck>`otOg^5cF<{|4n2ibDVZ diff --git a/lib/redmine/menu_manager/wiki_menu_helper.rb b/lib/redmine/menu_manager/wiki_menu_helper.rb index 1262b4827fa..6e85ff6d53c 100644 --- a/lib/redmine/menu_manager/wiki_menu_helper.rb +++ b/lib/redmine/menu_manager/wiki_menu_helper.rb @@ -36,10 +36,6 @@ module Redmine::MenuManager::WikiMenuHelper wiki_main_items(project_wiki).reverse_each do |main_item| Redmine::MenuManager.loose :project_menu do |menu| push_wiki_main_menu(menu, main_item, project) - - main_item.children.each do |child| - push_wiki_menu_subitem(menu, main_item, child) - end end end end @@ -60,17 +56,6 @@ module Redmine::MenuManager::WikiMenuHelper main_item.destroy end - def push_wiki_menu_subitem(menu, main_item, child) - menu.push child.menu_identifier, - { controller: "/wiki", action: "show", id: child.slug }, - caption: child.title, - html: { class: "wiki-menu--sub-item" }, - parent: main_item.menu_identifier - rescue ArgumentError => e - Rails.logger.error "Failed to add wiki item #{child.slug} to wiki menu: #{e}. Deleting it." - child.destroy - end - def default_menu_item(page) if (main_item = page.nearest_main_item) main_item diff --git a/spec/controllers/projects_settings_menu_controller_spec.rb b/spec/controllers/projects_settings_menu_controller_spec.rb index 4154892b372..c6a7bbde3ca 100644 --- a/spec/controllers/projects_settings_menu_controller_spec.rb +++ b/spec/controllers/projects_settings_menu_controller_spec.rb @@ -105,8 +105,6 @@ RSpec.describe Projects::Settings::ModulesController, "menu" do it_behaves_like "renders the modules show page" it_behaves_like "has selector", "#main-menu a.wiki-example-menu-item" - - it_behaves_like "has selector", "#main-menu a.wiki-sub-menu-item" end end diff --git a/spec/features/menu_items/wiki_menu_item_spec.rb b/spec/features/menu_items/wiki_menu_item_spec.rb index be9d357814a..dad3558d3ff 100644 --- a/spec/features/menu_items/wiki_menu_item_spec.rb +++ b/spec/features/menu_items/wiki_menu_item_spec.rb @@ -64,11 +64,11 @@ RSpec.describe "Wiki menu items", # Create two items with identical slugs (one with space, which is removed) let(:item1) do MenuItems::WikiMenuItem.new(navigatable_id: wiki.id, - parent: parent_menu, title: "Item 1", name: "slug") + parent: nil, title: "Item 1", name: "slug ") end let(:item2) do MenuItems::WikiMenuItem.new(navigatable_id: wiki.id, - parent: parent_menu, title: "Item 2", name: "slug ") + parent: nil, title: "Item 2", name: "slug") end it "one is invalid and deleted during visit" do @@ -114,38 +114,27 @@ RSpec.describe "Wiki menu items", expect(page) .to have_current_path(project_wiki_path(project, wiki_page)) - # modifying the menu item to a different name and to be a subpage + # modifying the menu item to a different name page.find_test_selector("wiki-more-dropdown-menu").click page.find_test_selector("wiki-configure-menu-action-menu-item").click wait_for_network_idle fill_in "Name of menu item", with: "Custom page name" - choose "Show as submenu item of" - - select other_wiki_page.slug, from: "parent_wiki_menu_item" click_link_or_button "Save" wait_for_network_idle - # the other page is now the main heading + # the custom name is used as the main heading expect(page) - .to have_css(".main-menu--children-menu-header", text: other_wiki_page.title) + .to have_css(".main-menu--children-menu-header", text: "Custom page name") - expect(page) - .to have_css(".wiki-menu--sub-item", text: "Custom page name") - - find(".wiki-menu--sub-item", text: "Custom page name").click - wait_for_network_idle - - expect(page) - .to have_current_path(project_wiki_path(project, wiki_page)) - - # the submenu item is not visible on top level + # the item is visible on top level + visit(project_wiki_path(project, wiki_page)) find(".main-menu--arrow-left-to-project").click expect(page) - .to have_no_css(".main-item-wrapper", text: "Custom page name") + .to have_css(".main-item-wrapper", text: "Custom page name") # deleting the page will remove the menu item visit project_wiki_path(project, wiki_page) From ef08652e6e04a5083393197429a16399bf84d151 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Thu, 12 Mar 2026 11:36:53 +0000 Subject: [PATCH 303/334] update locales from crowdin [ci skip] --- config/locales/crowdin/af.yml | 6 ----- config/locales/crowdin/ar.yml | 6 ----- config/locales/crowdin/az.yml | 6 ----- config/locales/crowdin/be.yml | 6 ----- config/locales/crowdin/bg.yml | 6 ----- config/locales/crowdin/ca.yml | 6 ----- config/locales/crowdin/ckb-IR.yml | 6 ----- config/locales/crowdin/cs.yml | 6 ----- config/locales/crowdin/da.yml | 6 ----- config/locales/crowdin/de.yml | 6 ----- config/locales/crowdin/el.yml | 6 ----- config/locales/crowdin/eo.yml | 6 ----- config/locales/crowdin/es.yml | 6 ----- config/locales/crowdin/et.yml | 6 ----- config/locales/crowdin/eu.yml | 6 ----- config/locales/crowdin/fa.yml | 6 ----- config/locales/crowdin/fi.yml | 6 ----- config/locales/crowdin/fil.yml | 6 ----- config/locales/crowdin/fr.yml | 30 +++++++++------------ config/locales/crowdin/he.yml | 6 ----- config/locales/crowdin/hi.yml | 6 ----- config/locales/crowdin/hr.yml | 6 ----- config/locales/crowdin/hu.yml | 6 ----- config/locales/crowdin/id.yml | 6 ----- config/locales/crowdin/it.yml | 6 ----- config/locales/crowdin/ja.yml | 6 ----- config/locales/crowdin/ka.yml | 6 ----- config/locales/crowdin/kk.yml | 6 ----- config/locales/crowdin/ko.yml | 6 ----- config/locales/crowdin/lt.yml | 6 ----- config/locales/crowdin/lv.yml | 6 ----- config/locales/crowdin/mn.yml | 6 ----- config/locales/crowdin/ms.yml | 6 ----- config/locales/crowdin/ne.yml | 6 ----- config/locales/crowdin/nl.yml | 6 ----- config/locales/crowdin/no.yml | 6 ----- config/locales/crowdin/pl.yml | 6 ----- config/locales/crowdin/pt-BR.yml | 6 ----- config/locales/crowdin/pt-PT.yml | 6 ----- config/locales/crowdin/ro.yml | 6 ----- config/locales/crowdin/ru.yml | 6 ----- config/locales/crowdin/rw.yml | 6 ----- config/locales/crowdin/si.yml | 6 ----- config/locales/crowdin/sk.yml | 6 ----- config/locales/crowdin/sl.yml | 6 ----- config/locales/crowdin/sr.yml | 6 ----- config/locales/crowdin/sv.yml | 6 ----- config/locales/crowdin/th.yml | 6 ----- config/locales/crowdin/tr.yml | 6 ----- config/locales/crowdin/uk.yml | 6 ----- config/locales/crowdin/uz.yml | 6 ----- config/locales/crowdin/vi.yml | 6 ----- config/locales/crowdin/zh-CN.yml | 6 ----- config/locales/crowdin/zh-TW.yml | 6 ----- modules/costs/config/locales/crowdin/de.yml | 2 +- 55 files changed, 13 insertions(+), 337 deletions(-) diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index 7d4ce48ac48..e7df2aac367 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -3890,12 +3890,6 @@ af: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anoniem" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Net vir die dinge wat ek dophou of betrokke in is" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index 6e4aacc3d85..9cfc541fddb 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -4114,12 +4114,6 @@ ar: label_user_named: "User %{name}" label_user_activity: "نشاط %{value}'s" label_user_anonymous: "مجهول" - label_user_mail_option_all: "من أجل أي حدث في كافة المشاريع" - label_user_mail_option_none: "لا يوجد أحداث" - label_user_mail_option_only_assigned: "فقط لأشياء موكلة لي" - label_user_mail_option_only_my_events: "فقط لأشياء أشاهدها أو أشارك فيها" - label_user_mail_option_only_owner: "فقط لأشياء أملكها" - label_user_mail_option_selected: "من أجل أي حدث في المشاريع المحددة فقط" label_user_menu: "User menu" label_user_new: "مستخدم جديد" label_user_plural: "المستخدمين" diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index 5f6e5b90f5f..f852532cf81 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -3890,12 +3890,6 @@ az: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index e759195a542..04d0072c674 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -4002,12 +4002,6 @@ be: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index 50c999cc691..4791405cf31 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -3890,12 +3890,6 @@ bg: label_user_named: "Потребител %{name}" label_user_activity: "дейност на %{value}" label_user_anonymous: "Анонимен" - label_user_mail_option_all: "За всяко събитие на всичките ми проекти" - label_user_mail_option_none: "Няма събития" - label_user_mail_option_only_assigned: "Само за неща, възложени на мен" - label_user_mail_option_only_my_events: "Само за неща, които наблюдавам или съм включен в тях" - label_user_mail_option_only_owner: "Само за неща, на които аз съм собственик" - label_user_mail_option_selected: "За всяко събитие само в избраните проекти" label_user_menu: "User menu" label_user_new: "Нов потребител" label_user_plural: "Потребители" diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index 34ba075e5cf..0e04ebb2194 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -3887,12 +3887,6 @@ ca: label_user_named: "Usuari %{name}" label_user_activity: "Activitat de %{value}" label_user_anonymous: "Anònim" - label_user_mail_option_all: "Per qualsevol esdeveniment en tots els meus projectes" - label_user_mail_option_none: "No hi ha esdeveniments" - label_user_mail_option_only_assigned: "Només pels objectes on estic assignat" - label_user_mail_option_only_my_events: "Només pels objectes que estic en observant o involucrat" - label_user_mail_option_only_owner: "Només pels objectes dels que en sóc propietari" - label_user_mail_option_selected: "Només per qualsevol esdeveniment dels projectes seleccionats" label_user_menu: "User menu" label_user_new: "Nou usuari" label_user_plural: "Usuaris" diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index 59f0899635c..032f25f6631 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -3890,12 +3890,6 @@ ckb-IR: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index f107d4ff779..76324959277 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -4002,12 +4002,6 @@ cs: label_user_named: "Uživatel %{name}" label_user_activity: "Aktivita %{value}" label_user_anonymous: "Anonymní" - label_user_mail_option_all: "Pro všechny události všech mých projektů" - label_user_mail_option_none: "Žádné události" - label_user_mail_option_only_assigned: "Pouze pro věci, na které jsem přidělen" - label_user_mail_option_only_my_events: "Pouze pro věci, které sleduji nebo jsem v nich zapojen" - label_user_mail_option_only_owner: "Pouze pro věci, kde jsem majitelem" - label_user_mail_option_selected: "Pouze pro každou událost na vybraných projektech" label_user_menu: "User menu" label_user_new: "Nový uživatel" label_user_plural: "Uživatelé" diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index 5090f8fe75f..39374ccdf62 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -3888,12 +3888,6 @@ da: label_user_named: "User %{name}" label_user_activity: "%{value}s aktivitet" label_user_anonymous: "Anonymt" - label_user_mail_option_all: "For enhver hændelse i alle mine projekter" - label_user_mail_option_none: "Ingen hændelser" - label_user_mail_option_only_assigned: "Kun i forbindelse med det jeg er tilknyttet" - label_user_mail_option_only_my_events: "Kun for det jeg fører tilsyn med eller er involveret i" - label_user_mail_option_only_owner: "Kun for det jeg er ejer af" - label_user_mail_option_selected: "Kun for hændelser i de valgte projekter" label_user_menu: "User menu" label_user_new: "Ny bruger" label_user_plural: "Brugere" diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 1fa19d1ecc7..269cc42bc94 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -3882,12 +3882,6 @@ de: label_user_named: "Benutzer %{name}" label_user_activity: "Aktivität von %{value}" label_user_anonymous: "Anonym" - label_user_mail_option_all: "Für alle Ereignisse in all meinen Projekten" - label_user_mail_option_none: "Für keine Ereignisse" - label_user_mail_option_only_assigned: "Nur für Aufgaben, für die ich zuständig bin." - label_user_mail_option_only_my_events: "Nur für Aufgaben, die ich beobachte oder an welchen ich mitarbeite" - label_user_mail_option_only_owner: "Nur für Aufgaben, die ich angelegt habe" - label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten" label_user_menu: "Benutzermenü" label_user_new: "Neuer Benutzer" label_user_plural: "Benutzer" diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index b77bd6605be..c914163723e 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -3886,12 +3886,6 @@ el: label_user_named: "Χρήστης %{name}" label_user_activity: "δραστηριότητα του %{value}" label_user_anonymous: "Ανώνυμος" - label_user_mail_option_all: "Για όλα τα συμβάντα σε όλα τα έργα μου" - label_user_mail_option_none: "Κανένα συμβάν" - label_user_mail_option_only_assigned: "Μόνο για αντικείμενα που έχουν ανατεθεί σε μένα" - label_user_mail_option_only_my_events: "Μόνο για αντικείμενα που παρακολουθώ ή συμμετέχω" - label_user_mail_option_only_owner: "Μόνο για αντικείμενα που μου ανήκουν" - label_user_mail_option_selected: "Για όλες τις εξελίξεις μόνο στα επιλεγμένα έργα" label_user_menu: "User menu" label_user_new: "Νέος χρήστης" label_user_plural: "Χρήστες" diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index b6518d29d63..db8742f7263 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -3890,12 +3890,6 @@ eo: label_user_named: "Uzanto %{name}" label_user_activity: "Aktiveco de %{value}" label_user_anonymous: "Aanonima" - label_user_mail_option_all: "Por ajna evento en ĉiuj miaj projektoj" - label_user_mail_option_none: "Ne estas eventoj" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "Nova uzanto" label_user_plural: "Uzantoj" diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 0e5879e962a..3b7055fc29c 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -3887,12 +3887,6 @@ es: label_user_named: "Usuario %{name}" label_user_activity: "Actividad de %{value} " label_user_anonymous: "Anónimo" - label_user_mail_option_all: "Para cualquier evento en todos mis proyectos" - label_user_mail_option_none: "No hay eventos" - label_user_mail_option_only_assigned: "Sólo para cosas asignadas a mí" - label_user_mail_option_only_my_events: "Sólo para cosas que controlo o en las que participo" - label_user_mail_option_only_owner: "Sólo para cosas de las que soy el dueño" - label_user_mail_option_selected: "Únicamente para cualquier evento de los proyectos seleccionados" label_user_menu: "Menú de usuario" label_user_new: "Nuevo usuario" label_user_plural: "Usuarios" diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index a6fcc60babc..dd438088fda 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -3890,12 +3890,6 @@ et: label_user_named: "User %{name}" label_user_activity: "%{value}-s tegevus" label_user_anonymous: "Anonüümne" - label_user_mail_option_all: "Kõigi sündmuste kohta minu projektides" - label_user_mail_option_none: "Sündmusi pole" - label_user_mail_option_only_assigned: "Ainult minule määratud tööde kohta" - label_user_mail_option_only_my_events: "Ainult tööde kohta, mida ma jälgin või millega olen seotud" - label_user_mail_option_only_owner: "Ainult minu omanduses olevate asjade kohta" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "Uus kasutaja" label_user_plural: "Kasutajad" diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index 572dcf3dbad..cf40a689e80 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -3890,12 +3890,6 @@ eu: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index dfb4d8e381c..02ab5737d47 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -3890,12 +3890,6 @@ fa: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index 9bda2f6de4f..c1691d09485 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -3890,12 +3890,6 @@ fi: label_user_named: "Käyttäjä %{name}" label_user_activity: "Käyttäjän %{value} historia" label_user_anonymous: "Anonyymi" - label_user_mail_option_all: "Kaikista tapahtumista kaikissa projekteistani" - label_user_mail_option_none: "Ei tapahtumia" - label_user_mail_option_only_assigned: "Vain niistä joihin olen liittynyt" - label_user_mail_option_only_my_events: "Vain niistä, joita seuraan tai joissa olen mukana" - label_user_mail_option_only_owner: "Vain niistä, jotka omistan" - label_user_mail_option_selected: "Kaikista tapahtumista vain valitsemistani projekteista" label_user_menu: "User menu" label_user_new: "Uusi käyttäjä" label_user_plural: "Käyttäjät" diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index cea711ea957..3c6f69e1555 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -3890,12 +3890,6 @@ fil: label_user_named: "User %{name}" label_user_activity: "%{value} aktibidad" label_user_anonymous: "Hindi kilala" - label_user_mail_option_all: "Sa kahit anong kaganapan sa lahat ng aking proyekto" - label_user_mail_option_none: "Walang mga kaganapan" - label_user_mail_option_only_assigned: "Sa mga bagay lamang ako nakatalaga sa" - label_user_mail_option_only_my_events: "Sa mga bagay ako tumingin o kasama ako sa" - label_user_mail_option_only_owner: "Sa mga bagay lamg ako na ako ang may-ari ng" - label_user_mail_option_selected: "Sa kahit anong kaganapan sa mga napiling proyekto lamang" label_user_menu: "User menu" label_user_new: "Bagong gumagamit" label_user_plural: "Mga gumagamit" diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 31323475f70..a19a2f5a412 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -20,7 +20,7 @@ #See COPYRIGHT and LICENSE files for more details. #++ fr: - no_results_title_text: Il n'y a présentement rien à afficher. + no_results_title_text: Il n'y a actuellement rien à afficher. activities: index: no_results_title_text: Il n’y a pas eu d'activité pour le projet pendant cette période. @@ -108,7 +108,7 @@ fr: jemalloc_allocator: Allocateur de mémoire Jemalloc journal_aggregation: explanation: - text: "Les actions individuelles d'un utilisateur (par ex. mis à jour un lot de travaux deux fois) sont agrégés en une seule action si leur différence d'âge est inférieure à la période spécifiée. Elles seront affichées en une seule action dans l'application. Cela retardera également les notifications du même temps réduisant donc le nombre d'e-mails envoyés et affectera également le délai %{webhook_link}." + text: "Les actions individuelles d'un utilisateur (par ex. un lot de travaux mis à jour deux fois) sont agrégées en une seule action si leur différence d'âge est inférieure à la période spécifiée. Elles seront affichées en une seule action dans l'application. Cela retardera également les notifications du même temps réduisant donc le nombre d'e-mails envoyés et affectera également le délai %{webhook_link}." link: "webhook" import: title: "Importation" @@ -446,7 +446,7 @@ fr: Si vous cochez cette case, OpenProject créera automatiquement de nouveaux utilisateurs à partir de leurs entrées LDAP lorsqu'ils s'authentifieront pour la première fois avec OpenProject. Laissez ceci non coché pour permettre uniquement aux comptes existants dans OpenProject de s'authentifier via LDAP! - connection_encryption: "Cryptage de la connexion" + connection_encryption: "Chiffrement de la connexion" encryption_details: "Options LDAPS / STARTTLS" system_account: "Compte système" system_account_legend: | @@ -2654,7 +2654,7 @@ fr: description_active: "Actif ?" description_attachment_toggle: "Afficher/Masquer les pièces jointes" description_autocomplete: > - Ce champ utilise la saisie semi-automatique. Lorsque vous tapez le titre d'un lot de travaux, vous recevrez une liste de choix possibles. Choisissez-en un en utilisant les flèches haut et bas et selectionnez-le avec Tab ou Entrée. Sinon, vous pouvez entrer le numéro de lot de travaux directement. + Ce champ utilise la saisie semi-automatique. Lorsque vous tapez le titre d'un lot de travaux, vous recevrez une liste de choix possibles. Choisissez-en un en utilisant les flèches haut et bas et sélectionnez-le avec Tab ou Entrée. Sinon, vous pouvez entrer le numéro de lot de travaux directement. description_available_columns: "Colonnes disponibles" description_choose_project: "Projets" description_compare_from: "Comparer avec" @@ -3061,7 +3061,7 @@ fr: no_results_text: "Aucun résultat" toggle_switch: label_on: "Activé" - label_off: "Désactiver" + label_off: "Désactivé" general_csv_decimal_separator: "," general_csv_encoding: "UTF-8" general_csv_separator: "." @@ -3309,11 +3309,11 @@ fr: label_all_words: "Tous les mots" label_all_open_wps: "Tous les ouverts" label_always_visible: "Toujours affiché" - label_announcement: "Annonce ou avis. " + label_announcement: "Annonce" label_angular: "AngularJS" label_app_modules: "Modules %{app_title}" label_api_access_key: "Clé d'accès API" - label_api_access_key_created_on: "Clé d'accès API créé il y a %{value}" + label_api_access_key_created_on: "Clé d'accès API créée il y a %{value}" label_api_access_key_type: "API" label_auto_option: "(auto)" label_ical_access_key_type: "iCalendar" @@ -3362,7 +3362,7 @@ fr: label_branch: "Branche" label_browse: "Parcourir" label_builtin: "Intégré" - label_bulk_edit_selected_work_packages: "Edition en masse des Lots de Travaux selectionnés" + label_bulk_edit_selected_work_packages: "Édition en masse des lots de travaux sélectionnés" label_bundled: "(Inclus)" label_calendar: "Calendrier" label_calendars_and_dates: "Calendriers et dates" @@ -3496,7 +3496,7 @@ fr: label_f_hour: "%{value} heure" label_f_hour_plural: "%{value} heures" label_favorite: "Favori" - label_feed_plural: "Fluxs" + label_feed_plural: "Flux" label_feeds_access_key: "Clé d'accès RSS" label_feeds_access_key_created_on: "Clé d'accès RSS créé il y a %{value}" label_feeds_access_key_type: "RSS" @@ -3888,16 +3888,10 @@ fr: label_user_named: "Utilisateur %{name}" label_user_activity: "Activité de %{value}" label_user_anonymous: "Anonyme" - label_user_mail_option_all: "Tout évènement dans tous mes projets" - label_user_mail_option_none: "Aucun évènement" - label_user_mail_option_only_assigned: "Les éléments qui me sont assignés" - label_user_mail_option_only_my_events: "Uniquement pour les éléments que je suis ou auxquels je participe" - label_user_mail_option_only_owner: "Les éléments dont je suis le propriétaire" - label_user_mail_option_selected: "Pour chaque événement sur le projet selectionné seulement" label_user_menu: "Menu utilisateur" label_user_new: "Nouvel utilisateur" label_user_plural: "Utilisateurs" - label_user_search: "Recherche d'Utilisateurs" + label_user_search: "Recherche d'utilisateurs" label_user_settings: "Paramètres de l'utilisateur" label_users_settings: "Paramètres des utilisateurs" label_value_x: "Valeur : %{x}" @@ -4699,11 +4693,11 @@ fr: setting_new_project_user_role_id: "Rôle donné à un utilisateur non administrateur qui crée un projet" setting_new_project_send_confirmation_email: "Envoyer une notification à l'auteur lors de la création d'un nouveau projet" setting_new_project_notification_text: "Texte de la notification" - setting_password_active_rules: "Les classes de caractère activées" + setting_password_active_rules: "Classes de caractères actives" setting_password_count_former_banned: "Nombre de mots de passe récents interdits de réutilisation" setting_password_days_valid: "Nombre de jours après lequel le changement de mot de passe est obligatoire" setting_password_min_length: "Longueur minimale" - setting_password_min_adhered_rules: "Nombre minimale des classe de caractère requise" + setting_password_min_adhered_rules: "Nombre minimal de classes de caractères requises" setting_per_page_options: "Options des objets par page" setting_percent_complete_on_status_closed: "% d'achèvement lorsque le statut est fermé" setting_percent_complete_on_status_closed_no_change: "Aucun changement" diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index 82f3fd67b62..01a239d01c6 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -4002,12 +4002,6 @@ he: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "אנונימי" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "משתמש חדש" label_user_plural: "משתמשים" diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index ad8fa0e62ed..992a13d4379 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -3888,12 +3888,6 @@ hi: label_user_named: "उपयोगकर्ता %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "अज्ञात" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index 4cd1e2e5d6b..951e1d7726d 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -3946,12 +3946,6 @@ hr: label_user_named: "User %{name}" label_user_activity: "%{value}-a aktivnost" label_user_anonymous: "Anonimno" - label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima" - label_user_mail_option_none: "Nema novih događanja" - label_user_mail_option_only_assigned: "Samo stvari koje su mi dodijeljene" - label_user_mail_option_only_my_events: "Samo stvari koje nadgledam ili u koje sam uključen" - label_user_mail_option_only_owner: "Samo za stvari kojih sam vlasnik" - label_user_mail_option_selected: "Za bilo koji događaj na samo odabranim projektima" label_user_menu: "User menu" label_user_new: "Novi korisnik" label_user_plural: "Korisnici" diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index adf2b2fa51b..08ff4d87a57 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -3889,12 +3889,6 @@ hu: label_user_named: "Felhasználó: %{name}" label_user_activity: "%{value} tevékenység" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "Minden saját projektet érintő esetben" - label_user_mail_option_none: "Nem kérek értesítéseket" - label_user_mail_option_only_assigned: "Csak a hozzám rendelt feladatokról" - label_user_mail_option_only_my_events: "Csak a megfigyelt feladatok vagy amelyben részt veszek" - label_user_mail_option_only_owner: "Csak azok a feladatok, amelyeknek én vagyok a tulajdonosa" - label_user_mail_option_selected: "Minden eseményről a kiválasztott projektekben" label_user_menu: "User menu" label_user_new: "Új felhasználó" label_user_plural: "Felhasználók" diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 2957fc980f8..91684bd5073 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -3830,12 +3830,6 @@ id: label_user_named: "User %{name}" label_user_activity: "%{value} aktivitas" label_user_anonymous: "Anonimus" - label_user_mail_option_all: "Untuk semua Event pada semua proyek saya" - label_user_mail_option_none: "Tidak ada event" - label_user_mail_option_only_assigned: "Hanya untuk hal-hal yang saya ditugaskan untuk" - label_user_mail_option_only_my_events: "Hanya untuk hal-hal yang saya pantau atau saya terlibat didalamnya" - label_user_mail_option_only_owner: "Hanya untuk hal-hal yang saya sebagai Ownernya" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "User baru" label_user_plural: "User" diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index 831602def76..00e3d07dfaf 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -3887,12 +3887,6 @@ it: label_user_named: "Utente %{name}" label_user_activity: "attività di %{value}" label_user_anonymous: "Anonimo" - label_user_mail_option_all: "Per qualsiasi evento su tutti i miei progetti" - label_user_mail_option_none: "Per nessun evento" - label_user_mail_option_only_assigned: "Solo per cose alle quali sono stato assegnato" - label_user_mail_option_only_my_events: "Solo per le cose che osservo o nelle quali sono coinvolto" - label_user_mail_option_only_owner: "Solo per le cose di cui sono proprietario" - label_user_mail_option_selected: "Per qualsiasi evento solo nei progetti selezionati" label_user_menu: "Menu utente" label_user_new: "Nuovo utente" label_user_plural: "Utenti" diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index 41d0383ae59..d2cfbb65d52 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -3833,12 +3833,6 @@ ja: label_user_named: "ユーザー名 %{name}" label_user_activity: "%{value}の活動" label_user_anonymous: "匿名ユーザ" - label_user_mail_option_all: "参加しているプロジェクトの全イベント" - label_user_mail_option_none: "通知しない" - label_user_mail_option_only_assigned: "自分が担当している事柄のみ" - label_user_mail_option_only_my_events: "ウォッチまたは関係している事柄のみ" - label_user_mail_option_only_owner: "自分が作成した事柄のみ" - label_user_mail_option_selected: "選択したプロジェクトのみのイベントに対して" label_user_menu: "ユーザーメニュー" label_user_new: "新規ユーザ" label_user_plural: "ユーザ" diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index 6689745c517..55cbc9c9eb9 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -3890,12 +3890,6 @@ ka: label_user_named: "მომხმარებელი %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "ანონიმური" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "მოვლენების გარეშე" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "ახალი მომხმარებელი" label_user_plural: "მომხმარებლები" diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index 2c7415da883..293ad203354 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -3890,12 +3890,6 @@ kk: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 4697b359e9e..e76150dc080 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -3834,12 +3834,6 @@ ko: label_user_named: "사용자 %{name}" label_user_activity: "%{value}의 작업" label_user_anonymous: "익명" - label_user_mail_option_all: "모든 내 프로젝트의 이벤트에 대해" - label_user_mail_option_none: "이벤트 없음" - label_user_mail_option_only_assigned: "나에게 할당된 사항만" - label_user_mail_option_only_my_events: "내가 주시하거나 관련된 사항만" - label_user_mail_option_only_owner: "내가 소유자인 사항만" - label_user_mail_option_selected: "선택된 프로젝트에서 발생하는 이벤트만" label_user_menu: "사용자 메뉴" label_user_new: "새 사용자" label_user_plural: "사용자" diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index adc352b8586..f505042a3b1 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -3999,12 +3999,6 @@ lt: label_user_named: "Naudotojas %{name}" label_user_activity: "%{value} veikla" label_user_anonymous: "Anonimas" - label_user_mail_option_all: "Bet kokiam įvykiui visuose mano projektuose" - label_user_mail_option_none: "Jokių įvykių" - label_user_mail_option_only_assigned: "Tiktai dalykams, kuriems esu priskirtas" - label_user_mail_option_only_my_events: "Tiktai dalykams, kuriuos stebiu arba esu įtrauktas" - label_user_mail_option_only_owner: "Tiktai dalykams, kurių šeimininkas esu aš" - label_user_mail_option_selected: "Bet kokiam įvykiui tiktai pasirinktuose projektuose" label_user_menu: "User menu" label_user_new: "Naujas vartotojas" label_user_plural: "Naudotojai" diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index 26388cf32d9..0849b133bc6 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -3946,12 +3946,6 @@ lv: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "Par jebkuru notikumu, visos manos projektos" - label_user_mail_option_none: "Nevēlos saņemt e-pasta paziņojumus" - label_user_mail_option_only_assigned: "Tikai par lietām kas piešķirtas man" - label_user_mail_option_only_my_events: "Tikai par lietām, kam sekoju, vai es esmu iesaistīts" - label_user_mail_option_only_owner: "Tikai par lietām, kuras es esmu izveidojis" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Lietotāji" diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index 459ddc86681..bf2b4fac3de 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -3890,12 +3890,6 @@ mn: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index fecb0931294..f9b3586cadd 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -3832,12 +3832,6 @@ ms: label_user_named: "Pengguna %{name}" label_user_activity: "aktiviti %{value}" label_user_anonymous: "Anonim" - label_user_mail_option_all: "Untuk sebarang peristiwa pada semua projek saya" - label_user_mail_option_none: "Tiada peristiwa" - label_user_mail_option_only_assigned: "Hanya untuk perkara yang ditugaskan kepada saya" - label_user_mail_option_only_my_events: "Hanya untuk perkara yang saya perhatikan atau yang saya terlibat dalam" - label_user_mail_option_only_owner: "Hanya untuk perkara yang merupakan saya pemiliknya" - label_user_mail_option_selected: "Untuk sebarang peristiwa pada projek yang terpilih sahaja" label_user_menu: "User menu" label_user_new: "Pengguna baharu" label_user_plural: "Pengguna-pengguna" diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index 687b15e21e0..697d69a9a3c 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -3890,12 +3890,6 @@ ne: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index e81aa4da576..25cc3466a41 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -3886,12 +3886,6 @@ nl: label_user_named: "Gebruiker %{name}" label_user_activity: "%{value} activiteit" label_user_anonymous: "Anoniem" - label_user_mail_option_all: "Voor een evenement op al mijn projecten" - label_user_mail_option_none: "Geen evenementen" - label_user_mail_option_only_assigned: "Alleen voor dingen die aan mij toegewezen zijn" - label_user_mail_option_only_my_events: "Alleen voor dingen die ik kijk of waar ik bij betrokken ben" - label_user_mail_option_only_owner: "Alleen voor dingen waar ik de eigenaar van ben" - label_user_mail_option_selected: "Voor een gebeurtenis op de geselecteerde projecten alleen" label_user_menu: "User menu" label_user_new: "Nieuwe gebruiker" label_user_plural: "Gebruikers" diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index 3dfdb5c7143..4e1c410bbbb 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -3889,12 +3889,6 @@ label_user_named: "Bruker %{name}" label_user_activity: "%{value}s aktivitet" label_user_anonymous: "Anonym" - label_user_mail_option_all: "For enhver hendelse i alle mine prosjekter" - label_user_mail_option_none: "Ingen hendelser" - label_user_mail_option_only_assigned: "Kun for ting jeg er involvert i" - label_user_mail_option_only_my_events: "Kun for ting jeg overvåker eller er involvert i" - label_user_mail_option_only_owner: "Kun for ting jeg står som eier av" - label_user_mail_option_selected: "For alle hendelser kun på valgte prosjekter" label_user_menu: "User menu" label_user_new: "Ny bruker" label_user_plural: "Brukere" diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 033e0aa738c..69ce674574c 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -3998,12 +3998,6 @@ pl: label_user_named: "Użytkownik %{name}" label_user_activity: "Aktywność użytkownika: %{value}" label_user_anonymous: "Anonimowy" - label_user_mail_option_all: "Dla każdego zdarzenia we wszystkich moich projektach" - label_user_mail_option_none: "Brak zdarzeń" - label_user_mail_option_only_assigned: "Tylko do rzeczy do których jestem przydzielony" - label_user_mail_option_only_my_events: "Tylko to co obserwuję lub jestem zaangażowany" - label_user_mail_option_only_owner: "Tylko do rzeczy, których jestem właścicielem" - label_user_mail_option_selected: "Dla każdego zdarzenia w wybranych projektach" label_user_menu: "Menu użytkownika" label_user_new: "Nowy użytkownik" label_user_plural: "Użytkownicy" diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 66dabdb19a8..8cbd1177f89 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -3887,12 +3887,6 @@ pt-BR: label_user_named: "Usuário %{name}" label_user_activity: "atividade do %{value}" label_user_anonymous: "Anônimo" - label_user_mail_option_all: "Para qualquer evento em todos os meus projetos" - label_user_mail_option_none: "Não há eventos" - label_user_mail_option_only_assigned: "Só para coisas que estou designado" - label_user_mail_option_only_my_events: "Somente para as coisas que eu acompanho ou participo" - label_user_mail_option_only_owner: "Somente para as coisas que eu sou o dono" - label_user_mail_option_selected: "Para qualquer evento somente nos projetos selecionados" label_user_menu: "Menu de usuários" label_user_new: "Novo usuário" label_user_plural: "Usuários" diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index b2c08fb5418..9c1f551a51f 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -3887,12 +3887,6 @@ pt-PT: label_user_named: "Utilizador %{name}" label_user_activity: "Atividade de %{value}" label_user_anonymous: "Anónimo" - label_user_mail_option_all: "Para qualquer evento em todos os meus projetos" - label_user_mail_option_none: "Sem eventos" - label_user_mail_option_only_assigned: "Só para coisas que estou designado" - label_user_mail_option_only_my_events: "Apenas para coisas que observo ou em que estou envolvido" - label_user_mail_option_only_owner: "Apenas para coisas das quais sou proprietário" - label_user_mail_option_selected: "Para qualquer evento apenas nos projetos selecionados" label_user_menu: "Menu do utilizador" label_user_new: "Novo Utilizador" label_user_plural: "Utilizadores" diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index 3136130a27f..10459b1b77c 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -3946,12 +3946,6 @@ ro: label_user_named: "Utilizator %{name}" label_user_activity: "Activitatea lui %{value}" label_user_anonymous: "Anonim" - label_user_mail_option_all: "Pentru orice eveniment în toate proiectele mele" - label_user_mail_option_none: "Pentru niciun eveniment" - label_user_mail_option_only_assigned: "Doar pentru tichete pe care trebuie să le execut" - label_user_mail_option_only_my_events: "Doar pentru tichete pentru care sunt observator sau în care sunt implicat" - label_user_mail_option_only_owner: "Doar pentru tichete pentru care sunt responsabil" - label_user_mail_option_selected: "Pentru orice eveniment doar în proiectele selectate" label_user_menu: "User menu" label_user_new: "Utilizator nou" label_user_plural: "Utilizatori" diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 4901eb09a71..62997ee34b3 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -4000,12 +4000,6 @@ ru: label_user_named: "Пользователь %{name}" label_user_activity: "%{value} деятельности" label_user_anonymous: "Анонимно" - label_user_mail_option_all: "Для любого события на моих проектах" - label_user_mail_option_none: "Нет событий" - label_user_mail_option_only_assigned: "Только для тех, которые мне поручены" - label_user_mail_option_only_my_events: "Только для тех, в которых я наблюдатель или участник" - label_user_mail_option_only_owner: "Только для тех, которыми я владею" - label_user_mail_option_selected: "Для любого события, но только для выбранных проектов" label_user_menu: "Пользовательское меню" label_user_new: "Новый пользователь" label_user_plural: "Пользователи" diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index 6e3ab78041c..0615b831d0a 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -3890,12 +3890,6 @@ rw: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index 4b4a440ab02..3d436829be6 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -3890,12 +3890,6 @@ si: label_user_named: "පරිශීලක %{name}" label_user_activity: "%{value}ගේ ක්රියාකාරකම්" label_user_anonymous: "නිර්නාමික" - label_user_mail_option_all: "මගේ සියලු ව්යාපෘතිවල ඕනෑම සිදුවීමක් සඳහා" - label_user_mail_option_none: "සිදුවීම් නැත" - label_user_mail_option_only_assigned: "මට පවරා ඇති දේවල් සඳහා පමණි" - label_user_mail_option_only_my_events: "මම නරඹන දේවල් සඳහා පමණක් හෝ මම සම්බන්ධ වෙනවා" - label_user_mail_option_only_owner: "මම අයිතිකරු වන්නේ දේවල් සඳහා පමණි" - label_user_mail_option_selected: "තෝරාගත් ව්යාපෘතිවල ඕනෑම සිදුවීමක් සඳහා පමණි" label_user_menu: "User menu" label_user_new: "නව පරිශීලක" label_user_plural: "පරිශීලකයන්" diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index aac195608d9..8ebad46e17f 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -4002,12 +4002,6 @@ sk: label_user_named: "Užívateľ %{name}" label_user_activity: "Aktivita používateľa %{value}" label_user_anonymous: "Anonymný" - label_user_mail_option_all: "Pre všetky udalosti všetkých mojich projektov" - label_user_mail_option_none: "Žiadne udalosti" - label_user_mail_option_only_assigned: "Len pre veci, na ktoré som priradený" - label_user_mail_option_only_my_events: "Len pre veci, ktoré sledujem, alebo v ktorých som zapojený" - label_user_mail_option_only_owner: "Len pre veci, ktorých som vlastníkom" - label_user_mail_option_selected: "Pre každú udalosť len na vybraných projektoch" label_user_menu: "User menu" label_user_new: "Nový uživateľ" label_user_plural: "Užívatelia" diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 4cef90ee241..1acb633b5ec 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -4001,12 +4001,6 @@ sl: label_user_named: "Uporabnik %{name}" label_user_activity: "%{value}'s aktivnost" label_user_anonymous: "Anonimno" - label_user_mail_option_all: "Za vsak dogodek na vseh mojih projektih" - label_user_mail_option_none: "Ni dogodkov" - label_user_mail_option_only_assigned: "Samo za stvari, ki smo mi dodeljene" - label_user_mail_option_only_my_events: "Samo za stvari, ki jih opazujem ali v katere sem vpleten" - label_user_mail_option_only_owner: "Samo za stvari katerih lastnik sem" - label_user_mail_option_selected: "Za vsak dogodek samo na izbranih projektih..." label_user_menu: "User menu" label_user_new: "Nov uporabnik" label_user_plural: "Uporabniki" diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index 08d703ac8b2..9cce5d8a114 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -3946,12 +3946,6 @@ sr: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index 7f8fcc46f81..fb8ef2108e1 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -3890,12 +3890,6 @@ sv: label_user_named: "Användare %{name}" label_user_activity: "%{value}s aktivitet" label_user_anonymous: "Anonym" - label_user_mail_option_all: "För alla händelser i alla mina projekt" - label_user_mail_option_none: "Inga händelser" - label_user_mail_option_only_assigned: "Bara är saker jag tilldelade" - label_user_mail_option_only_my_events: "Endast för saker jag bevakar eller deltar i" - label_user_mail_option_only_owner: "Endast för saker är jag ägare till" - label_user_mail_option_selected: "Endast för alla händelser i valda projekt" label_user_menu: "Användarmeny" label_user_new: "Ny användare" label_user_plural: "Användare" diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index 0e77bbd3055..77d76bf3998 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -3834,12 +3834,6 @@ th: label_user_named: "User %{name}" label_user_activity: "กิจกรรมของ %{value}" label_user_anonymous: "ไม่ระบุชื่อ" - label_user_mail_option_all: "สำหรับเหตุการณ์ใด ๆ ก็ตามในโครงการทั้งหมดของฉัน" - label_user_mail_option_none: "ไม่พบเหตุการณ์" - label_user_mail_option_only_assigned: "เฉพาะสิ่งที่ฉันได้รับมอบหมาย" - label_user_mail_option_only_my_events: "เฉพาะสิ่งที่ฉันเฝ้าดูหรือมีความเกี่ยวข้องด้วย" - label_user_mail_option_only_owner: "เฉพาะสิ่งที่ฉันเป็นเจ้าของ" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "ผู้ใช้ใหม่" label_user_plural: "ผู้ใช้" diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 4be1e4dc84f..844fd72c8f6 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -3890,12 +3890,6 @@ tr: label_user_named: "%{name} kullanıcısı" label_user_activity: "%{value}'ın faaliyet" label_user_anonymous: "Anonim" - label_user_mail_option_all: "Tüm projelerimdeki herhangi bir olay için" - label_user_mail_option_none: "Etkinlik yok" - label_user_mail_option_only_assigned: "Sadece bana atanan şeyler için" - label_user_mail_option_only_my_events: "Sadece takip ettiğim ya da dahil olduklarım için" - label_user_mail_option_only_owner: "Sadece sahibi olduğum şeyler için" - label_user_mail_option_selected: "Yalnızca seçilen projelerdeki herhangi bir etkinlik için" label_user_menu: "Kullanıcı menüsü" label_user_new: "Yeni kullanıcı" label_user_plural: "Kullanıcılar" diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index e23a2de4ebc..11c292a0690 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -3996,12 +3996,6 @@ uk: label_user_named: "User %{name}" label_user_activity: "Дії користувача %{value}" label_user_anonymous: "Невідомий" - label_user_mail_option_all: "Для всіх подій у всіх моїх проектах" - label_user_mail_option_none: "Ніяких подій" - label_user_mail_option_only_assigned: "Тільки за те що я призначений" - label_user_mail_option_only_my_events: "Тільки для речей які я дивлюся чи я займаюся" - label_user_mail_option_only_owner: "Тільки для речей, за якими я спостерігаю або є власником" - label_user_mail_option_selected: "Для будь-якої події на вибраних проектах" label_user_menu: "Меню користувача" label_user_new: "Новий користувач" label_user_plural: "Користувачі" diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index 527805d7d3b..0bc43923d33 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -3890,12 +3890,6 @@ uz: label_user_named: "User %{name}" label_user_activity: "%{value}'s activity" label_user_anonymous: "Anonymous" - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_none: "No events" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_option_selected: "For any event on the selected projects only" label_user_menu: "User menu" label_user_new: "New user" label_user_plural: "Users" diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index 618af7ac803..c233aeced74 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -3832,12 +3832,6 @@ vi: label_user_named: "Người dùng %{name}" label_user_activity: "%{value} hoạt động" label_user_anonymous: "vô danh" - label_user_mail_option_all: "Bất kỳ sự kiện trên tất cả dự án của tôi" - label_user_mail_option_none: "Không có sự kiện" - label_user_mail_option_only_assigned: "Chỉ những thứ tôi được phân công" - label_user_mail_option_only_my_events: "Chỉ những thứ tôi theo dõi hoặc liên quan" - label_user_mail_option_only_owner: "Chỉ những thứ tôi sở hữu" - label_user_mail_option_selected: "Chỉ dành cho bất kỳ sự kiện nào trên các dự án đã chọn" label_user_menu: "Trình đơn người dùng" label_user_new: "Người dùng mới" label_user_plural: "Người dùng" diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index cfd97f17da7..5d9faa4354f 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -3830,12 +3830,6 @@ zh-CN: label_user_named: "用户 %{name}" label_user_activity: "%{value} 的活动" label_user_anonymous: "匿名" - label_user_mail_option_all: "对于我所有项目的任何事件" - label_user_mail_option_none: "没有事件" - label_user_mail_option_only_assigned: "仅为指派给我的内容" - label_user_mail_option_only_my_events: "仅为我关注或参与的内容" - label_user_mail_option_only_owner: "仅为我是所有者的内容" - label_user_mail_option_selected: "只对于所选项目的任何事件......" label_user_menu: "用户菜单" label_user_new: "新用户" label_user_plural: "用户" diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 225b8a20937..41e29f2dab0 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -3830,12 +3830,6 @@ zh-TW: label_user_named: "用戶名 %{name}" label_user_activity: "%{value} 的活動" label_user_anonymous: "匿名者" - label_user_mail_option_all: "對於我所有的專案的任何事件" - label_user_mail_option_none: "沒有事件" - label_user_mail_option_only_assigned: "只針對我被指派的事情" - label_user_mail_option_only_my_events: "只針對我關注的或者與我有關的事情" - label_user_mail_option_only_owner: "針對我是擁有者的事情" - label_user_mail_option_selected: "只有在已選取的專案的任何事件" label_user_menu: "使用者選單" label_user_new: "新增使用者" label_user_plural: "使用者" diff --git a/modules/costs/config/locales/crowdin/de.yml b/modules/costs/config/locales/crowdin/de.yml index f4ab9eb9320..8d9d9183c51 100644 --- a/modules/costs/config/locales/crowdin/de.yml +++ b/modules/costs/config/locales/crowdin/de.yml @@ -197,7 +197,7 @@ de: permission_log_costs: "Stückkosten buchen" permission_log_own_costs: "Eigene Stückkosten buchen" permission_view_cost_entries: "Gebuchte Kosten ansehen" - permission_view_cost_rates: "Anzeigen von Stückpreisen" + permission_view_cost_rates: "Stückkosten ansehen" permission_view_hourly_rates: "Alle Stundensätze ansehen" permission_view_own_cost_entries: "Eigene gebuchte Kosten ansehen" permission_view_own_hourly_rate: "Eigene Stundensätze ansehen" From e36d7513cc52605c8dbc6b4460e766b4ce81c394 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Thu, 12 Mar 2026 16:17:46 +0100 Subject: [PATCH 304/334] Add mobile logo to logo_only layout This was omitted previously, resulting in an empty header. That the logo moves to the right hand side seems to be a conscious decision that's baked into the .op-app-header--center class. --- app/views/layouts/only_logo.html.erb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/only_logo.html.erb b/app/views/layouts/only_logo.html.erb index 315db4ec378..7d5694f8730 100644 --- a/app/views/layouts/only_logo.html.erb +++ b/app/views/layouts/only_logo.html.erb @@ -39,8 +39,13 @@ See COPYRIGHT and LICENSE files for more details. data: body_data_attributes(local_assigns) do %>

"> -
From cb2c9ac5a6f574b4418f10201aacea1645922cde Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Thu, 12 Mar 2026 16:31:53 +0100 Subject: [PATCH 305/334] Use custom_home_url in no_logo layout as well Probably another oversight... --- app/views/layouts/only_logo.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/only_logo.html.erb b/app/views/layouts/only_logo.html.erb index 7d5694f8730..311c4ebf6be 100644 --- a/app/views/layouts/only_logo.html.erb +++ b/app/views/layouts/only_logo.html.erb @@ -41,10 +41,10 @@ See COPYRIGHT and LICENSE files for more details.
">
<% if CustomStyle.current&.logo_mobile.present? || !custom_logo? %> - <%= link_to(I18n.t("label_home"), home_url, class: ["op-logo--icon", "op-logo--link"].compact) %> + <%= link_to(I18n.t("label_home"), configurable_home_url, class: ["op-logo--icon", "op-logo--link"].compact) %> <% end %>
From 02c61ef977a4e0fa0d3438f9cb0b3c8af907eb95 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Thu, 12 Mar 2026 17:33:47 +0200 Subject: [PATCH 306/334] Simplify sharing migration --- .../migrate/20260227143618_remove_sharing_from_sprints.rb | 8 ++------ ...75656_add_index_to_projects_sprint_sharing_settings.rb | 0 2 files changed, 2 insertions(+), 6 deletions(-) rename {db => modules/backlogs/db}/migrate/20260305175656_add_index_to_projects_sprint_sharing_settings.rb (100%) diff --git a/modules/backlogs/db/migrate/20260227143618_remove_sharing_from_sprints.rb b/modules/backlogs/db/migrate/20260227143618_remove_sharing_from_sprints.rb index 7ee5abbb9db..2f70e7b6ed4 100644 --- a/modules/backlogs/db/migrate/20260227143618_remove_sharing_from_sprints.rb +++ b/modules/backlogs/db/migrate/20260227143618_remove_sharing_from_sprints.rb @@ -29,11 +29,7 @@ #++ class RemoveSharingFromSprints < ActiveRecord::Migration[8.1] - def up - remove_column :sprints, :sharing - end - - def down - add_column :sprints, :sharing, :string, null: false, default: "none" + def change + remove_column :sprints, :sharing, :string, null: false, default: "none" end end diff --git a/db/migrate/20260305175656_add_index_to_projects_sprint_sharing_settings.rb b/modules/backlogs/db/migrate/20260305175656_add_index_to_projects_sprint_sharing_settings.rb similarity index 100% rename from db/migrate/20260305175656_add_index_to_projects_sprint_sharing_settings.rb rename to modules/backlogs/db/migrate/20260305175656_add_index_to_projects_sprint_sharing_settings.rb From e0d5584fb6b789db270607a669980db57db0a6e7 Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Wed, 11 Mar 2026 13:28:20 +0200 Subject: [PATCH 307/334] [#72878] Reset the project sharing settings when disabling the backlogs module https://community.openproject.org/work_packages/72878 --- app/models/project.rb | 8 +- lib/open_project/events.rb | 2 + .../app/models/projects/sprint_sharing.rb | 6 ++ .../lib/open_project/backlogs/engine.rb | 15 ++++ .../backlogs/event_subscriptions_spec.rb | 89 +++++++++++++++++++ .../models/projects/sprint_sharing_spec.rb | 37 +++++++- spec/models/enabled_module_spec.rb | 39 +++++++- 7 files changed, 188 insertions(+), 8 deletions(-) create mode 100644 modules/backlogs/spec/lib/open_project/backlogs/event_subscriptions_spec.rb diff --git a/app/models/project.rb b/app/models/project.rb index 99240b0b953..5a9479b5c6b 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -77,7 +77,7 @@ class Project < ApplicationRecord has_many :principals, through: :member_principals, source: :principal has_many :calculated_value_errors, dependent: :delete_all, as: :customized - has_many :enabled_modules, dependent: :delete_all + has_many :enabled_modules, dependent: :delete_all, after_remove: :module_disabled has_and_belongs_to_many :types, -> { order("#{::Type.table_name}.position") } @@ -350,4 +350,10 @@ class Project < ApplicationRecord OpenProject::AccessControl.allowed_actions(permission) end end + + def module_disabled(disabled_module) + OpenProject::Notifications.send( + OpenProject::Events::MODULE_DISABLED, disabled_module: + ) + end end diff --git a/lib/open_project/events.rb b/lib/open_project/events.rb index 143cbf70163..c2e7fbb8f9b 100644 --- a/lib/open_project/events.rb +++ b/lib/open_project/events.rb @@ -80,6 +80,8 @@ module OpenProject WATCHER_ADDED = "watcher_added" WATCHER_DESTROYED = "watcher_destroyed" + MODULE_DISABLED = "module_disabled" + WORK_PACKAGE_SHARED = "work_package_shared" end end diff --git a/modules/backlogs/app/models/projects/sprint_sharing.rb b/modules/backlogs/app/models/projects/sprint_sharing.rb index c6e7b492073..547c28808e1 100644 --- a/modules/backlogs/app/models/projects/sprint_sharing.rb +++ b/modules/backlogs/app/models/projects/sprint_sharing.rb @@ -79,6 +79,12 @@ module Projects::SprintSharing sprint_sharing == NO_SHARING end + def not_sharing_sprints! + return if not_sharing_sprints? + + update_column(:settings, settings.merge("sprint_sharing" => NO_SHARING)) + end + def sprint_source # Senders and non-sharing projects only see their own sprints. # Receivers see external sprints from the closest ancestor sharing diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index 6f3f124e129..b58aa476caf 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -185,6 +185,21 @@ module OpenProject::Backlogs OpenProject::Backlogs::Hooks::UserSettingsHook end + initializer "openproject_backlogs.event_subscriptions" do + Rails.application.config.after_initialize do + OpenProject::Notifications.subscribe(OpenProject::Events::MODULE_DISABLED) do |payload| + disabled_module = payload[:disabled_module] + next unless disabled_module.name == "backlogs" + + disabled_module.project.not_sharing_sprints! + end + + OpenProject::Notifications.subscribe(OpenProject::Events::PROJECT_ARCHIVED) do |payload| + payload[:project].not_sharing_sprints! + end + end + end + config.to_prepare do ::Type.add_constraint :position, ->(type, project: nil) do if project.present? diff --git a/modules/backlogs/spec/lib/open_project/backlogs/event_subscriptions_spec.rb b/modules/backlogs/spec/lib/open_project/backlogs/event_subscriptions_spec.rb new file mode 100644 index 00000000000..54a863d0a40 --- /dev/null +++ b/modules/backlogs/spec/lib/open_project/backlogs/event_subscriptions_spec.rb @@ -0,0 +1,89 @@ +# 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 OpenProject::Notifications, "backlogs event subscriptions" do # rubocop:disable RSpec/SpecFilePathFormat + describe "MODULE_DISABLED" do + subject do + described_class.send( + OpenProject::Events::MODULE_DISABLED, + disabled_module: + ) + end + + Projects::SprintSharing::SPRINT_SHARING_MODES.each do |sharing_mode| + context "when the backlogs module is disabled on a project with #{sharing_mode}" do + let(:project) { create(:project, sprint_sharing: sharing_mode) } + let(:disabled_module) { instance_double(EnabledModule, name: "backlogs", project:) } + + it "sets sprint sharing to no_sharing" do + subject + + expect(project.reload.sprint_sharing).to eq(Projects::SprintSharing::NO_SHARING) + end + end + end + + context "when a different module is disabled" do + let(:project) do + create(:project, sprint_sharing: Projects::SprintSharing::SHARE_ALL_PROJECTS) + end + let(:disabled_module) { instance_double(EnabledModule, name: "wiki", project:) } + + it "does not reset sprint sharing" do + subject + + expect(project.reload.sprint_sharing).to eq(Projects::SprintSharing::SHARE_ALL_PROJECTS) + end + end + end + + describe "PROJECT_ARCHIVED" do + subject do + described_class.send( + OpenProject::Events::PROJECT_ARCHIVED, + project: + ) + end + + Projects::SprintSharing::SPRINT_SHARING_MODES.each do |sharing_mode| + context "when a project with #{sharing_mode} is archived" do + let(:project) { create(:project, sprint_sharing: sharing_mode) } + + it "sets sprint sharing to no_sharing" do + subject + + expect(project.reload.sprint_sharing).to eq(Projects::SprintSharing::NO_SHARING) + end + end + end + end +end diff --git a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb index 146eb137aff..bc4a85cb3ae 100644 --- a/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb +++ b/modules/backlogs/spec/models/projects/sprint_sharing_spec.rb @@ -3,7 +3,9 @@ require "spec_helper" RSpec.describe Projects::SprintSharing do - let(:project) { create(:project) } + let(:sprint_sharing) { "no_sharing" } + let(:active) { true } + let!(:project) { create(:project, sprint_sharing:, active:) } describe "SPRINT_SHARING_MODES" do it "defines all supported sprint sharing options" do @@ -18,6 +20,8 @@ RSpec.describe Projects::SprintSharing do end describe "#sprint_sharing" do + let(:sprint_sharing) { nil } + it "defaults to no_sharing" do expect(project.sprint_sharing).to eq("no_sharing") end @@ -58,15 +62,41 @@ RSpec.describe Projects::SprintSharing do end end + describe "#not_sharing_sprints!" do + context "when the project is already set to no_sharing" do + let(:sprint_sharing) { "no_sharing" } + + it "does not update the database" do + allow(project).to receive(:update_column) + + subject + + expect(project).not_to have_received(:update_column) + end + end + + context "when the project has an active sharing mode" do + let(:sprint_sharing) { "share_all_projects" } + + it "resets sprint_sharing to no_sharing" do + project.not_sharing_sprints! + + expect(project.reload.sprint_sharing).to eq("no_sharing") + end + end + end + describe ".global_sprint_sharer" do context "when no project shares with all projects" do + let(:sprint_sharing) { "no_sharing" } + it "returns nil" do expect(Project.global_sprint_sharer).to be_nil end end context "when a project shares with all projects" do - before { project.update!(sprint_sharing: "share_all_projects") } + let(:sprint_sharing) { "share_all_projects" } it "returns that project" do expect(Project.global_sprint_sharer).to eq(project) @@ -74,7 +104,8 @@ RSpec.describe Projects::SprintSharing do end context "when the sharing project is archived" do - before { project.update!(sprint_sharing: "share_all_projects", active: false) } + let(:sprint_sharing) { "share_all_projects" } + let(:active) { false } it "returns nil" do expect(Project.global_sprint_sharer).to be_nil diff --git a/spec/models/enabled_module_spec.rb b/spec/models/enabled_module_spec.rb index 7b1edf59f8e..773f876f722 100644 --- a/spec/models/enabled_module_spec.rb +++ b/spec/models/enabled_module_spec.rb @@ -34,6 +34,37 @@ RSpec.describe EnabledModule do # Force reload, as association is not always(?) showing let(:project) { create(:project, enabled_module_names: modules).reload } + describe "MODULE_DISABLED event" do + let(:modules) { %w[wiki] } + + it "fires the event when a module is removed from the collection" do + disabled_module = project.enabled_modules.find_by(name: "wiki") + + allow(OpenProject::Notifications) + .to receive(:send) + .with(OpenProject::Events::MODULE_DISABLED, disabled_module:) + + project.enabled_module_names = [] + + expect(OpenProject::Notifications) + .to have_received(:send) + .with(OpenProject::Events::MODULE_DISABLED, disabled_module:) + .once + end + + it "does not fire the event when creating a module" do + project.enabled_module_names = [] + + allow(OpenProject::Notifications) + .to receive(:send) + .with(OpenProject::Events::MODULE_DISABLED, disabled_module: anything) + + project.enabled_module_names = ["wiki"] + + expect(OpenProject::Notifications).not_to have_received(:send) + end + end + describe "#wiki" do let(:modules) { %w[wiki] } @@ -48,11 +79,11 @@ RSpec.describe EnabledModule do expect do project.enabled_module_names = [] project.reload - end.not_to change { Wiki.count } + end.not_to change(Wiki, :count) expect do project.enabled_module_names = ["wiki"] - end.not_to change { Wiki.count } + end.not_to change(Wiki, :count) expect(project.wiki).not_to be_nil end @@ -91,11 +122,11 @@ RSpec.describe EnabledModule do expect do project.enabled_module_names = [] project.reload - end.not_to change { Repository.count } + end.not_to change(Repository, :count) expect do project.enabled_module_names = ["repository"] - end.not_to change { Repository.count } + end.not_to change(Repository, :count) expect(project.repository).not_to be_nil end From 06dc794c2c4f036bb0fc89dfb7cc5a4895916649 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Mar 2026 17:43:16 +0000 Subject: [PATCH 308/334] Bump action_text-trix from 2.1.16 to 2.1.17 Bumps [action_text-trix](https://github.com/basecamp/trix) from 2.1.16 to 2.1.17. - [Release notes](https://github.com/basecamp/trix/releases) - [Commits](https://github.com/basecamp/trix/compare/v2.1.16...v2.1.17) --- updated-dependencies: - dependency-name: action_text-trix dependency-version: 2.1.17 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e86c2226f17..95d9acf6b64 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -223,7 +223,7 @@ GEM remote: https://rubygems.org/ specs: Ascii85 (2.0.1) - action_text-trix (2.1.16) + action_text-trix (2.1.17) railties actioncable (8.1.2) actionpack (= 8.1.2) @@ -740,7 +740,7 @@ GEM jmespath (1.6.2) job-iteration (1.12.0) activejob (>= 6.1) - json (2.18.1) + json (2.19.1) json-jwt (1.17.0) activesupport (>= 4.2) aes_key_wrap @@ -1785,7 +1785,7 @@ DEPENDENCIES CHECKSUMS Ascii85 (2.0.1) sha256=15cb5d941808543cbb9e7e6aea3c8ec3877f154c3461e8b3673e97f7ecedbe5a - action_text-trix (2.1.16) sha256=f645a2c21821b8449fd1d6770708f4031c91a2eedf9ef476e9be93c64e703a8a + action_text-trix (2.1.17) sha256=b44691639d77e67169dc054ceacd1edc04d44dc3e4c6a427aa155a2beb4cc951 actioncable (8.1.2) sha256=dc31efc34cca9cdefc5c691ddb8b4b214c0ea5cd1372108cbc1377767fb91969 actionmailbox (8.1.2) sha256=058b2fb1980e5d5a894f675475fcfa45c62631103d5a2596d9610ec81581889b actionmailer (8.1.2) sha256=f4c1d2060f653bfe908aa7fdc5a61c0e5279670de992146582f2e36f8b9175e9 @@ -1981,7 +1981,7 @@ CHECKSUMS iso8601 (0.13.0) sha256=298c2b15b7be5fa95a1372813d36a2257656cd8e906dfbc1f5cb409851425aa2 jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1 job-iteration (1.12.0) sha256=0164057417750f6e9c3ed548f029f1136b18eb53975fa438b09304a525d6c6c0 - json (2.18.1) sha256=fe112755501b8d0466b5ada6cf50c8c3f41e897fa128ac5d263ec09eedc9f986 + json (2.19.1) sha256=dd94fdc59e48bff85913829a32350b3148156bc4fd2a95a2568a78b11344082d json-jwt (1.17.0) sha256=6ff99026b4c54281a9431179f76ceb81faa14772d710ef6169785199caadc4cc json-schema (4.3.1) sha256=d5e68dc32b94408d0b06ad04f9382ccbb6fe5a44910e066f8547f56c471a7825 json_schemer (2.5.0) sha256=2f01fb4cce721a4e08dd068fc2030cffd0702a7f333f1ea2be6e8991f00ae396 From a311623de14df69918cfa7a5cc8b2bbbeaf8a3f4 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Fri, 13 Mar 2026 03:54:41 +0000 Subject: [PATCH 309/334] 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 | 1 - 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/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 - .../backlogs/config/locales/crowdin/af.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/ar.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/az.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/be.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/bg.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/ca.yml | 31 +++++++++++++++++++ .../config/locales/crowdin/ckb-IR.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/cs.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/da.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/de.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/el.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/eo.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/es.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/et.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/eu.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/fa.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/fi.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/fil.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/fr.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/he.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/hi.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/hr.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/hu.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/id.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/it.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/ja.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/ka.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/kk.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/ko.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/lt.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/lv.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/mn.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/ms.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/ne.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/nl.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/no.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/pl.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/pt-BR.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/pt-PT.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/ro.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/ru.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/rw.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/si.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/sk.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/sl.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/sr.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/sv.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/th.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/tr.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/uk.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/uz.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/vi.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/zh-CN.yml | 31 +++++++++++++++++++ .../backlogs/config/locales/crowdin/zh-TW.yml | 31 +++++++++++++++++++ 108 files changed, 1674 insertions(+), 54 deletions(-) diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index e7df2aac367..ddfc4cb7dff 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -3929,7 +3929,6 @@ af: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Begin bladsy" label_work: "Work" label_work_package: "Werkspakket" diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index 9cfc541fddb..c16f41c6f96 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -4153,7 +4153,6 @@ ar: label_wiki_show_index_page_link: "إظهار عنصر القائمة الفرعية ’جدول المحتويات’" label_wiki_show_menu_item: "إظهار كعنصر قائمة في مشروع الملاحة" label_wiki_show_new_page_link: "إظهار عنصر القائمة الفرعية 'إنشاء صفحة فرعية جديدة'" - label_wiki_show_submenu_item: "إظهار كعنصر قائمة فرعية من " label_wiki_start: "صفحة البداية" label_work: "Work" label_work_package: "مجموعة العمل" diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index f852532cf81..3c256c7eb21 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -3929,7 +3929,6 @@ az: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index 04d0072c674..b14d87b18ee 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -4041,7 +4041,6 @@ be: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index 4791405cf31..080b851c54d 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -3929,7 +3929,6 @@ bg: label_wiki_show_index_page_link: "Показване на елемент от подменюто \"Съдържание\"" label_wiki_show_menu_item: "Покажи като меню в проектната навигация" label_wiki_show_new_page_link: "Показване на елемент от подменю \"Създай нова подстраница\"" - label_wiki_show_submenu_item: "Покажи като елемент от подменюто на " label_wiki_start: "Начална страница" label_work: "Работа" label_work_package: "Работен пакет" diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index 0e04ebb2194..1abfd162013 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -3926,7 +3926,6 @@ ca: label_wiki_show_index_page_link: "Mostra l'element del submenú 'Taula de continguts'" label_wiki_show_menu_item: "Mostrar com a element de menú en la navegació del projecte" label_wiki_show_new_page_link: "Mostra l'element submenú 'Crea nova pàgina fill'" - label_wiki_show_submenu_item: "Mostrar com element de submenú de " label_wiki_start: "Pàgina d'inici" label_work: "Treball" label_work_package: "Paquet de treball" diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index 032f25f6631..e2924baff2b 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -3929,7 +3929,6 @@ ckb-IR: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 76324959277..12299379605 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -4041,7 +4041,6 @@ cs: label_wiki_show_index_page_link: "Zobrazit položku podnabídky 'Obsah'" label_wiki_show_menu_item: "Zobrazit jako položku nabídky navigaci projektu" label_wiki_show_new_page_link: "Zobrazit položku menu \"Vytvořit novou podřízenou stránku\"" - label_wiki_show_submenu_item: "Zobrazit jako položku podnabídky " label_wiki_start: "Úvodní stránka" label_work: "Práce" label_work_package: "Pracovní balíček" diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index 39374ccdf62..ce9ff362827 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -3927,7 +3927,6 @@ da: label_wiki_show_index_page_link: "Vis undermenupunkt 'Indhold'" label_wiki_show_menu_item: "Vis som menupunkt i projektnavigeringen" label_wiki_show_new_page_link: "Vis undermenupunktet 'Opret ny underside'" - label_wiki_show_submenu_item: "Vis som punkt i undermenu til " label_wiki_start: "Startside" label_work: "Work" label_work_package: "Arbejdspakke" diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 269cc42bc94..4d4f9569cd6 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -3921,7 +3921,6 @@ de: label_wiki_show_index_page_link: "'Inhaltsverzeichnis' Link als Untermenüpunkt anzeigen" label_wiki_show_menu_item: "als Menüpunkt in der Projektnavigation anzeigen" label_wiki_show_new_page_link: "'Neue Unterseite anlegen' Link als Untermenüpunkt anzeigen" - label_wiki_show_submenu_item: "als Untermenüpunkt anzeigen von " label_wiki_start: "Hauptseite" label_work: "Aufwand" label_work_package: "Arbeitspaket" diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index c914163723e..e6a917d64a3 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -3925,7 +3925,6 @@ el: label_wiki_show_index_page_link: "Εμφάνιση του αντικειμένου υπομενού 'Πίνακας Περιεχομένων'" label_wiki_show_menu_item: "Εμφάνιση ως αντικείμενο μενού στην πλοήγηση έργου" label_wiki_show_new_page_link: "Εμφάνιση του αντικειμένου υπομενού 'Δημιουργία καινούργιας σελίδας παιδιού'" - label_wiki_show_submenu_item: "Εμφάνιση ως αντικείμενο υπομενού του " label_wiki_start: "Σελίδα έναρξης" label_work: "Work" label_work_package: "Εργασία" diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index db8742f7263..5bdb1559816 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -3929,7 +3929,6 @@ eo: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Laborpakaĵo" diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 3b7055fc29c..d45ff55aa46 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -3926,7 +3926,6 @@ es: label_wiki_show_index_page_link: "Mostrar el elemento de submenú 'Tabla de contenidos'" label_wiki_show_menu_item: "Mostrar como elemento de menú de navegación de proyecto" label_wiki_show_new_page_link: "Mostrar el elemento de submenú 'Crear nueva página hija'" - label_wiki_show_submenu_item: "Mostrar como elemento de submenú de " label_wiki_start: "Página de inicio" label_work: "Trabajo" label_work_package: "Paquete de trabajo" diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index dd438088fda..0ea40e65a4d 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -3929,7 +3929,6 @@ et: label_wiki_show_index_page_link: "Kuva alammenüü valik \"Sisukord\"" label_wiki_show_menu_item: "Näita lehe nime projektimenüüs" label_wiki_show_new_page_link: "Näita alammenüüs valikut 'Loo uus alamleht'" - label_wiki_show_submenu_item: "Näita kui alammenüüd (<--) " label_wiki_start: "Esileht" label_work: "Töö" label_work_package: "Teema" diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index cf40a689e80..1df0dc21975 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -3929,7 +3929,6 @@ eu: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index 02ab5737d47..5f646211b46 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -3929,7 +3929,6 @@ fa: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "صفحه‌ی شروع" label_work: "Work" label_work_package: "کاربسته" diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index c1691d09485..47567ef5f29 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -3929,7 +3929,6 @@ fi: label_wiki_show_index_page_link: "Näytä alivalikon vaihtoehto \"Sisällysluettelo\"" label_wiki_show_menu_item: "Näytä valikon kohta projekti navigaatio" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Aloitussivu" label_work: "Work" label_work_package: "Työpaketti" diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index 3c6f69e1555..afc0c11f0ee 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -3929,7 +3929,6 @@ fil: label_wiki_show_index_page_link: "Ipakita ang aytem ng submenu 'Talaan ng Nilalaman'" label_wiki_show_menu_item: "Ipakita bilanh aytem na pagpipilian sa proyektong nabigasyon" label_wiki_show_new_page_link: "Ipakita ang submenu aytem 'Lumikha ng bagong bata na pahina'" - label_wiki_show_submenu_item: "Ipakita bilang submenu. aytem ng " label_wiki_start: "Simulan ang pahina" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index a19a2f5a412..798852086ea 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -3927,7 +3927,6 @@ fr: label_wiki_show_index_page_link: "Montrer l'entrée de sous-menu 'Table des Matières'" label_wiki_show_menu_item: "Afficher en tant qu'élément dans le menu de navigation du projet" label_wiki_show_new_page_link: "Montrer le sous-menu 'Créer une nouvelle page enfant'" - label_wiki_show_submenu_item: "Montrer comme sous-menu de " label_wiki_start: "Page d'accueil" label_work: "Travail" label_work_package: "Lot de travaux" diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index 01a239d01c6..2a8d5793c82 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -4041,7 +4041,6 @@ he: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "דף פתיחה" label_work: "Work" label_work_package: "חבילת עבודה" diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index 992a13d4379..637978a7ecc 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -3927,7 +3927,6 @@ hi: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "प्रारंभ पृष्ठ" label_work: "Work" label_work_package: "कार्य पैकेज" diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index 951e1d7726d..f4589800279 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -3985,7 +3985,6 @@ hr: label_wiki_show_index_page_link: "Prikaži stavku podizbornika 'Kazalo sadržaja'" label_wiki_show_menu_item: "Prikaži kao stavku izbornika u izborniku projekta" label_wiki_show_new_page_link: "Prikaži stavku podizbornika 'Kreiraj novu podređenu stranicu'" - label_wiki_show_submenu_item: "Prikaži kao stavku podizbornika iz " label_wiki_start: "Početna stranica" label_work: "Work" label_work_package: "Radni paket" diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index 08ff4d87a57..cece59e0577 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -3928,7 +3928,6 @@ hu: label_wiki_show_index_page_link: "Megjeleníti az almenüpont feladatainak \"Tartalomjegyzékét\"" label_wiki_show_menu_item: "Megjeleníti mint menüpont a projekt navigációban" label_wiki_show_new_page_link: "Almenüpont megjelenítése \" új gyermekoldal létrehozása\"" - label_wiki_show_submenu_item: "Megjelenítés mint: almenüpont " label_wiki_start: "Kezdő oldal" label_work: "Munka" label_work_package: "Feladatcsoport" diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 91684bd5073..8e2facbad73 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -3869,7 +3869,6 @@ id: label_wiki_show_index_page_link: "Tampilkan item submenu 'Daftar isi'" label_wiki_show_menu_item: "Tampilkan sebagai item menu navigasi Project" label_wiki_show_new_page_link: "Tampilkan submenu item 'Buat sub-halaman baru'" - label_wiki_show_submenu_item: "Tampilkan sebagai submenu item " label_wiki_start: "Homepage" label_work: "Work" label_work_package: "Paket-Penugasan" diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index 00e3d07dfaf..ceca5c46278 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -3926,7 +3926,6 @@ it: label_wiki_show_index_page_link: "Mostra voce del sotto-menù 'Sommario'" label_wiki_show_menu_item: "Mostra come voce del menù nella navigazione del progetto" label_wiki_show_new_page_link: "Mostra voce del sotto-menù 'Crea nuova pagina figlio'" - label_wiki_show_submenu_item: "Mostra come voce di sottomenù di " label_wiki_start: "Pagina iniziale" label_work: "Lavoro" label_work_package: "Macro-attività" diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index d2cfbb65d52..2c8c1e99978 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -3872,7 +3872,6 @@ ja: label_wiki_show_index_page_link: "下位のメニューで「目次」を表示" label_wiki_show_menu_item: "プロジェクトのメニューで項目として表示" label_wiki_show_new_page_link: "下位のメニューで「子ページを新規作成」の項目を表示" - label_wiki_show_submenu_item: "上位のメニュー項目" label_wiki_start: "開始ページ" label_work: "予定時間" label_work_package: "ワーク パッケージ" diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index 55cbc9c9eb9..d51f236c710 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -3929,7 +3929,6 @@ ka: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "საწყისი გვერდი" label_work: "სამუშაო" label_work_package: "სამუშაო პაკეტი" diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index 293ad203354..21bac966abc 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -3929,7 +3929,6 @@ kk: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index e76150dc080..0955c2ff059 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -3873,7 +3873,6 @@ ko: label_wiki_show_index_page_link: "하위 메뉴 항목 '목차' 표시" label_wiki_show_menu_item: "프로젝트 탐색에서 메뉴 항목으로 표시" label_wiki_show_new_page_link: "하위 메뉴 항목 '새 자식 페이지 만들기' 표시" - label_wiki_show_submenu_item: "다음의 하위 메뉴 항목으로 표시: " label_wiki_start: "시작 페이지" label_work: "작업" label_work_package: "작업 패키지" diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index f505042a3b1..c55f12e9ef3 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -4038,7 +4038,6 @@ lt: label_wiki_show_index_page_link: "Rodyti submeniu punktą „Turinys“" label_wiki_show_menu_item: "Rodyti kaip meniu punktą projekto navigacijoje" label_wiki_show_new_page_link: "Rodyti submeniu punktą „Sukurti naują vaiko puslapį“" - label_wiki_show_submenu_item: "Rodyti kaip submeniu punktą " label_wiki_start: "Pradžios puslapis" label_work: "Darbas" label_work_package: "Darbų paketas" diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index 0849b133bc6..54d64b72ece 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -3985,7 +3985,6 @@ lv: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Sākuma lapa" label_work: "Work" label_work_package: "Darba pieteikums" diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index bf2b4fac3de..fdbd5f0e667 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -3929,7 +3929,6 @@ mn: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index f9b3586cadd..416f3e0122e 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -3871,7 +3871,6 @@ ms: label_wiki_show_index_page_link: "Paparkan item submenu 'Jadual Kandungan'" label_wiki_show_menu_item: "Paparkan sebagai item menu dalam navigasi projek" label_wiki_show_new_page_link: "Paparkan item submenu 'Cipta laman anak baharu'" - label_wiki_show_submenu_item: "Paparkan sebagai item submenu " label_wiki_start: "Halaman mula" label_work: "Kerja" label_work_package: "Pakej kerja" diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index 697d69a9a3c..3d523385d38 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -3929,7 +3929,6 @@ ne: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index 25cc3466a41..5c22ef74e12 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -3925,7 +3925,6 @@ nl: label_wiki_show_index_page_link: "Toon submenu item 'Inhoudsopgave'" label_wiki_show_menu_item: "Weergeven als menu-item in project navigatie" label_wiki_show_new_page_link: "Vervolgmenu-item 'Maken nieuwe onderliggende pagina' weergeven" - label_wiki_show_submenu_item: "Toon als submenu-item van " label_wiki_start: "Startpagina" label_work: "Werk" label_work_package: "Werkpakket" diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index 4e1c410bbbb..94dbfd1c93f 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -3928,7 +3928,6 @@ label_wiki_show_index_page_link: "Vis undermenyelement 'Innholdsfortegnelse'" label_wiki_show_menu_item: "Vis som menyelement i prosjektmeny" label_wiki_show_new_page_link: "Vis undermenyelement 'Opprett ny underside'" - label_wiki_show_submenu_item: "Vis som undermenyelement for " label_wiki_start: "Startside" label_work: "Arbeid" label_work_package: "Arbeidspakke" diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 69ce674574c..69769b2c645 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -4037,7 +4037,6 @@ pl: label_wiki_show_index_page_link: "Pokaż element podmenu \"Spis treści\"" label_wiki_show_menu_item: "Pokaż jako element menu w nawigacji projektu" label_wiki_show_new_page_link: "Pokaż element podmenu \"Utwórz nową stronę podrzędną\"" - label_wiki_show_submenu_item: "Pokaż jako pozycję podmenu " label_wiki_start: "Strona startowa" label_work: "Praca" label_work_package: "Zadanie" diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 8cbd1177f89..40d56f96df2 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -3926,7 +3926,6 @@ pt-BR: label_wiki_show_index_page_link: "Mostrar submenu 'Tabela de Conteúdos'" label_wiki_show_menu_item: "Mostrar como item de menu de navegação do projeto" label_wiki_show_new_page_link: "Mostrar o item de submenu 'Criar nova página filho'" - label_wiki_show_submenu_item: "Mostrar como item do submenu de " label_wiki_start: "Página inicial" label_work: "Trabalho" label_work_package: "Pacote de trabalho" diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index 9c1f551a51f..cb776a3c66f 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -3926,7 +3926,6 @@ pt-PT: label_wiki_show_index_page_link: "Mostrar sub-menu 'Tabela de Conteúdos'" label_wiki_show_menu_item: "Mostrar como item de menu de navegação do projecto" label_wiki_show_new_page_link: "Mostrar o item de sub-menu 'Criar nova página filha'" - label_wiki_show_submenu_item: "Mostrar como item do sub-menu de " label_wiki_start: "Página inicial" label_work: "Trabalho" label_work_package: "Pacote de trabalho" diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index 10459b1b77c..252e371b15b 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -3985,7 +3985,6 @@ ro: label_wiki_show_index_page_link: "Afișare submeniu 'Cuprins'" label_wiki_show_menu_item: "Afișare ca meniu în navigarea proiectului" label_wiki_show_new_page_link: "Afișează submeniu 'Creează pagină copil'" - label_wiki_show_submenu_item: "Afișare ca submeniu pentru " label_wiki_start: "Pagina de start" label_work: "Muncă" label_work_package: "Pachet de lucru" diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 62997ee34b3..d20033da957 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -4039,7 +4039,6 @@ ru: label_wiki_show_index_page_link: "Показать пункт подменю «Содержание»" label_wiki_show_menu_item: "Показать как меню в навигации по проекту" label_wiki_show_new_page_link: "Показать пункт подменю «Создать новую дочернюю страницу»" - label_wiki_show_submenu_item: "Показать как пункт подменю " label_wiki_start: "Начальная страница" label_work: "Предполагаемое время" label_work_package: "Пакет работ" diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index 0615b831d0a..227b057148c 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -3929,7 +3929,6 @@ rw: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index 3d436829be6..63170be5a53 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -3929,7 +3929,6 @@ si: label_wiki_show_index_page_link: "උප මෙනු අයිතමය පෙන්වන්න 'අන්තර්ගත වගුව'" label_wiki_show_menu_item: "ව්යාපෘති සංචලනය තුළ මෙනු අයිතමය ලෙස පෙන්වන්න" label_wiki_show_new_page_link: "උප මෙනු අයිතමය පෙන්වන්න 'නව ළමා පිටුව සාදන්න'" - label_wiki_show_submenu_item: "උප මෙනු අයිතමය ලෙස පෙන්වන්න " label_wiki_start: "ආරම්භක පිටුව" label_work: "Work" label_work_package: "වැඩ පැකේජය" diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index 8ebad46e17f..765475b7116 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -4041,7 +4041,6 @@ sk: label_wiki_show_index_page_link: "Zobraziť položku podmenu \"Obsah\"" label_wiki_show_menu_item: "Zobraziť ako položku menu v navigácii projektu" label_wiki_show_new_page_link: "Zobraziť položku submenu \"Vytvoriť novú podradenú stránku\"" - label_wiki_show_submenu_item: "Zobraziť ako položku submenu " label_wiki_start: "Úvodná stránka" label_work: "Work" label_work_package: "Pracovný balíček" diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 1acb633b5ec..6674500245c 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -4040,7 +4040,6 @@ sl: label_wiki_show_index_page_link: "Pokaži postavko podmenija „Vsebina“" label_wiki_show_menu_item: "Prikaži kot element v meniju navigacija projekta" label_wiki_show_new_page_link: "Pokaži element v podmeniju »Ustvari novo podrejeno stran«" - label_wiki_show_submenu_item: "Prikaži kot element podmenija v" label_wiki_start: "Začetna stran" label_work: "Work" label_work_package: "Delovni paket" diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index 9cce5d8a114..f2480277273 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -3985,7 +3985,6 @@ sr: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index fb8ef2108e1..2294b0ff2d2 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -3929,7 +3929,6 @@ sv: label_wiki_show_index_page_link: "Visa undermenyn \"Innehållsförteckning\"" label_wiki_show_menu_item: "Visa som menyobjekt i projektets meny" label_wiki_show_new_page_link: "Visa undermenyn \"Skapa ny underordnad sida\"" - label_wiki_show_submenu_item: "Visa som undermenyalternativ för " label_wiki_start: "Startsida" label_work: "Arbete" label_work_package: "Arbetspaket" diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index 77d76bf3998..98e7cf6183b 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -3873,7 +3873,6 @@ th: label_wiki_show_index_page_link: "แสดงเมนูย่อยของ 'สารบัญ'" label_wiki_show_menu_item: "แสดงเป็นเมนูในการนำทางของโครงการ" label_wiki_show_new_page_link: "แสดงรายการเมนูย่อย 'สร้างหน้าย่อยใหม่'" - label_wiki_show_submenu_item: "แสดงเป็นรายการเมนูย่อยของ " label_wiki_start: "เพจเริ่มต้น" label_work: "Work" label_work_package: "ชุดภารกิจ" diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 844fd72c8f6..c405fda23ec 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -3929,7 +3929,6 @@ tr: label_wiki_show_index_page_link: "Alt menü öğesini göster 'İçindekiler tablosu'" label_wiki_show_menu_item: "Proje gezintisinde menü öğesi olarak göster" label_wiki_show_new_page_link: "Alt menü öğesini göster 'Yeni alt sayfa oluştur'" - label_wiki_show_submenu_item: "Alt menü öğesi olarak göster " label_wiki_start: "Başlangıç sayfası" label_work: "Çalışma" label_work_package: "İş paketi" diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index 11c292a0690..0d277d48485 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -4035,7 +4035,6 @@ uk: label_wiki_show_index_page_link: "Показати пункт підменю \"Зміст\"" label_wiki_show_menu_item: "Показати як пункт меню в навігації по проекту" label_wiki_show_new_page_link: "Показати елемент підменю \"Створити нову початкову сторінку\"" - label_wiki_show_submenu_item: "Показати як пункт підменю " label_wiki_start: "Початкова сторінка" label_work: "Робота" label_work_package: "Робочий пакет" diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index 0bc43923d33..8036f5629e9 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -3929,7 +3929,6 @@ uz: label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" label_wiki_show_menu_item: "Show as menu item in project navigation" label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work: "Work" label_work_package: "Work package" diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index c233aeced74..ae89da48a3b 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -3871,7 +3871,6 @@ vi: label_wiki_show_index_page_link: "Hiển thị mục menu con 'Mục lục'" label_wiki_show_menu_item: "Hiển thị dưới dạng mục menu trong điều hướng dự án" label_wiki_show_new_page_link: "Hiển thị mục menu con 'Tạo trang con mới'" - label_wiki_show_submenu_item: "Hiển thị dưới dạng mục menu con của" label_wiki_start: "Trang bắt đầu" label_work: "làm việc" label_work_package: "Work Package" diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index 5d9faa4354f..47ba8d7fdcf 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -3869,7 +3869,6 @@ zh-CN: label_wiki_show_index_page_link: "显示‘目录’子菜单项" label_wiki_show_menu_item: "显示为项目导航中的菜单项" label_wiki_show_new_page_link: "显示‘创建新的子页面’子菜单项" - label_wiki_show_submenu_item: "显示为子菜单项" label_wiki_start: "起始页" label_work: "工时" label_work_package: "工作包" diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 41e29f2dab0..c5b088ffaac 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -3869,7 +3869,6 @@ zh-TW: label_wiki_show_index_page_link: "顯示子功能表 '表格內容'" label_wiki_show_menu_item: "在專案導覽中以子功能表呈現" label_wiki_show_new_page_link: "顯示子功能表 '新增子頁面'" - label_wiki_show_submenu_item: "呈現於子功能表的 " label_wiki_start: "開始頁面" label_work: "工時" label_work_package: "工作套件" diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml index 8f5d854a324..1e362abd74c 100644 --- a/modules/backlogs/config/locales/crowdin/af.yml +++ b/modules/backlogs/config/locales/crowdin/af.yml @@ -31,6 +31,8 @@ af: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ af: backlogs_work_package_type: "Agterstand tipe" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ af: column_width: "Column width" definition_of_done: "Definisie van Gedoen" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Belemmering" label_versions_default_fold_state: "Wys weergawe gevou" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ af: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Agterstandes" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/ar.yml b/modules/backlogs/config/locales/crowdin/ar.yml index 1de0218f19a..e2de45637d6 100644 --- a/modules/backlogs/config/locales/crowdin/ar.yml +++ b/modules/backlogs/config/locales/crowdin/ar.yml @@ -31,6 +31,8 @@ ar: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ ar: backlogs_work_package_type: "نوع الأعمال المتراكمة غير المنجزة" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ ar: column_width: "Column width" definition_of_done: "تعريف ما تم" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "عائق" label_versions_default_fold_state: "إظهار الإصدارات مطوية" caption_versions_default_fold_state: "" @@ -166,6 +176,27 @@ ar: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "الأعمال المتراكمة غير المنجزة" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/az.yml b/modules/backlogs/config/locales/crowdin/az.yml index 6e7aea2b54f..5279a18085e 100644 --- a/modules/backlogs/config/locales/crowdin/az.yml +++ b/modules/backlogs/config/locales/crowdin/az.yml @@ -31,6 +31,8 @@ az: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ az: backlogs_work_package_type: "" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ az: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ az: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/be.yml b/modules/backlogs/config/locales/crowdin/be.yml index 771b833a2dc..c80bdab0446 100644 --- a/modules/backlogs/config/locales/crowdin/be.yml +++ b/modules/backlogs/config/locales/crowdin/be.yml @@ -31,6 +31,8 @@ be: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ be: backlogs_work_package_type: "Тып бэклогу" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ be: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -162,6 +172,27 @@ be: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/bg.yml b/modules/backlogs/config/locales/crowdin/bg.yml index f653c939045..1ec8a64ba55 100644 --- a/modules/backlogs/config/locales/crowdin/bg.yml +++ b/modules/backlogs/config/locales/crowdin/bg.yml @@ -31,6 +31,8 @@ bg: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ bg: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ bg: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Препядствие" label_versions_default_fold_state: "Показване на сгънати версиите " caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ bg: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Назад" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/ca.yml b/modules/backlogs/config/locales/crowdin/ca.yml index c7253773dba..b88ca17f7e3 100644 --- a/modules/backlogs/config/locales/crowdin/ca.yml +++ b/modules/backlogs/config/locales/crowdin/ca.yml @@ -31,6 +31,8 @@ ca: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ ca: backlogs_work_package_type: "Tipus de backlog" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ ca: column_width: "Column width" definition_of_done: "Definició de fet" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Mostra les versions contretes" caption_versions_default_fold_state: "Les versions no s'expandiran per defecte quan es visualitzin els registres enrere. Cada un ha d'ampliar-se manualment." @@ -158,6 +168,27 @@ ca: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/ckb-IR.yml b/modules/backlogs/config/locales/crowdin/ckb-IR.yml index 60450ebe853..19639bd81e4 100644 --- a/modules/backlogs/config/locales/crowdin/ckb-IR.yml +++ b/modules/backlogs/config/locales/crowdin/ckb-IR.yml @@ -31,6 +31,8 @@ ckb-IR: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ ckb-IR: backlogs_work_package_type: "جۆری Backlog" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ ckb-IR: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ ckb-IR: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml index de225baae06..1ec2ddc71ff 100644 --- a/modules/backlogs/config/locales/crowdin/cs.yml +++ b/modules/backlogs/config/locales/crowdin/cs.yml @@ -31,6 +31,8 @@ cs: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Doba trvání sprintu" work_package: @@ -39,6 +41,11 @@ cs: backlogs_work_package_type: "Typ nevyřízené položky" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ cs: column_width: "Column width" definition_of_done: "Definice dokončena" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: " Verze zobrazit srolovaně" caption_versions_default_fold_state: "Verze se při prohlížení nevyřízených žádostí ve výchozím nastavení nerozbalují. Každou z nich je třeba rozbalit ručně." @@ -162,6 +172,27 @@ cs: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Nevyřízené položky" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/da.yml b/modules/backlogs/config/locales/crowdin/da.yml index d29bad1355a..25c50c99587 100644 --- a/modules/backlogs/config/locales/crowdin/da.yml +++ b/modules/backlogs/config/locales/crowdin/da.yml @@ -31,6 +31,8 @@ da: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ da: backlogs_work_package_type: "Backlog-type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ da: column_width: "Column width" definition_of_done: "Definition af Udført" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Hindring" label_versions_default_fold_state: "Vis versioner sammenfoldet" caption_versions_default_fold_state: "Versioner vil ikke blive udvidet som standard, når man ser på backlogs. Hver enkelt version skal udvides manuelt." @@ -158,6 +168,27 @@ da: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index f2e91491024..7f354321296 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -31,6 +31,8 @@ de: goal: "Sprint-Ziel" name: "Sprint-Name" sharing: "Teilen" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint-Dauer" work_package: @@ -39,6 +41,11 @@ de: backlogs_work_package_type: "Backlog Typ" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ de: column_width: "Spaltenbreite" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Hindernis" label_versions_default_fold_state: "Versionen eingeklappt anzeigen" caption_versions_default_fold_state: "Versionen werden beim Anzeigen des Backlogs standardmäßig nicht aufgeklappt. Sie müssen manuell geöffnet werden." @@ -158,6 +168,27 @@ de: permission_start_complete_sprint: "Sprint starten/abschließen" permission_view_sprints: "Sprints ansehen" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "Keine Burndown-Daten verfügbar" diff --git a/modules/backlogs/config/locales/crowdin/el.yml b/modules/backlogs/config/locales/crowdin/el.yml index 0d1a7eac949..a1770cd1ae8 100644 --- a/modules/backlogs/config/locales/crowdin/el.yml +++ b/modules/backlogs/config/locales/crowdin/el.yml @@ -31,6 +31,8 @@ el: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ el: backlogs_work_package_type: "Τύπος backlog" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ el: column_width: "Column width" definition_of_done: "Ορισμός των Ολοκληρωμένων" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Εμπόδιο" label_versions_default_fold_state: "Εμφάνιση συμπτυγμένων εκδόσεων" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ el: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/eo.yml b/modules/backlogs/config/locales/crowdin/eo.yml index 82f8ebbb1c3..6a9fcac0830 100644 --- a/modules/backlogs/config/locales/crowdin/eo.yml +++ b/modules/backlogs/config/locales/crowdin/eo.yml @@ -31,6 +31,8 @@ eo: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ eo: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ eo: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ eo: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index 09b6a6aef4f..4acfd170279 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -31,6 +31,8 @@ es: goal: "Objetivo del sprint" name: "Nombre del sprint" sharing: "Uso compartido" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Duración del sprint" work_package: @@ -39,6 +41,11 @@ es: backlogs_work_package_type: "Tipo de Backlog" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ es: column_width: "Ancho de columna" definition_of_done: "Criterio de Aceptación" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impedimento" label_versions_default_fold_state: "Mostrar versiones colapsadas" caption_versions_default_fold_state: "Las versiones no se expandirán por defecto al visualizar los trabajos pendientes. Cada una deberá expandirse manualmente." @@ -158,6 +168,27 @@ es: permission_start_complete_sprint: "Iniciar/completar sprint" permission_view_sprints: "Ver sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No hay datos de trabajo pendiente disponibles" diff --git a/modules/backlogs/config/locales/crowdin/et.yml b/modules/backlogs/config/locales/crowdin/et.yml index 7c7d3d3daa6..40e46393441 100644 --- a/modules/backlogs/config/locales/crowdin/et.yml +++ b/modules/backlogs/config/locales/crowdin/et.yml @@ -31,6 +31,8 @@ et: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ et: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ et: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ et: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/eu.yml b/modules/backlogs/config/locales/crowdin/eu.yml index 30e0af5f5cb..fab65bd9e43 100644 --- a/modules/backlogs/config/locales/crowdin/eu.yml +++ b/modules/backlogs/config/locales/crowdin/eu.yml @@ -31,6 +31,8 @@ eu: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ eu: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ eu: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ eu: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/fa.yml b/modules/backlogs/config/locales/crowdin/fa.yml index 510a1c9685b..6b038e250a1 100644 --- a/modules/backlogs/config/locales/crowdin/fa.yml +++ b/modules/backlogs/config/locales/crowdin/fa.yml @@ -31,6 +31,8 @@ fa: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "مدت زمان اسپرینت" work_package: @@ -39,6 +41,11 @@ fa: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ fa: column_width: "عرض ستون" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "در هنگام مشاهده backlog ها، نسخه‌ها به صورت پیش‌فرض بازنخواهندشد. هر کدام باید به صورت دستی باز شوند." @@ -158,6 +168,27 @@ fa: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "وظایف" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/fi.yml b/modules/backlogs/config/locales/crowdin/fi.yml index 853ef47c81f..7139bf3ee61 100644 --- a/modules/backlogs/config/locales/crowdin/fi.yml +++ b/modules/backlogs/config/locales/crowdin/fi.yml @@ -31,6 +31,8 @@ fi: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ fi: backlogs_work_package_type: "Työjonon tyyppi" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ fi: column_width: "Column width" definition_of_done: "Valmiin määritelmä" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Este" label_versions_default_fold_state: "Näytä versiot ryhmiteltyinä" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ fi: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Työjonot" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/fil.yml b/modules/backlogs/config/locales/crowdin/fil.yml index eaa59519e54..2ef0247f2c6 100644 --- a/modules/backlogs/config/locales/crowdin/fil.yml +++ b/modules/backlogs/config/locales/crowdin/fil.yml @@ -31,6 +31,8 @@ fil: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ fil: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ fil: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ fil: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index eb04e9ebdb1..717a7186dc2 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -31,6 +31,8 @@ fr: goal: "Objectif du sprint" name: "Nom du sprint" sharing: "Partage" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Durée du sprint" work_package: @@ -39,6 +41,11 @@ fr: backlogs_work_package_type: "Type de backlog" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ fr: column_width: "Largeur de colonne" definition_of_done: "Définition de Fait" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Obstacle" label_versions_default_fold_state: "Afficher les versions de manière repliée" caption_versions_default_fold_state: "Les versions ne seront pas développées par défaut lors de l'affichage des backlogs. Chacune devra être développée manuellement." @@ -158,6 +168,27 @@ fr: permission_start_complete_sprint: "Commencer/terminer le sprint" permission_view_sprints: "Voir les sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "Aucune donnée disponible sur le burndown" diff --git a/modules/backlogs/config/locales/crowdin/he.yml b/modules/backlogs/config/locales/crowdin/he.yml index 31015e32fb7..f06acdb71fa 100644 --- a/modules/backlogs/config/locales/crowdin/he.yml +++ b/modules/backlogs/config/locales/crowdin/he.yml @@ -31,6 +31,8 @@ he: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ he: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ he: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -162,6 +172,27 @@ he: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/hi.yml b/modules/backlogs/config/locales/crowdin/hi.yml index c4d105746f4..cfe9fafe806 100644 --- a/modules/backlogs/config/locales/crowdin/hi.yml +++ b/modules/backlogs/config/locales/crowdin/hi.yml @@ -31,6 +31,8 @@ hi: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ hi: backlogs_work_package_type: "बैकलॉग प्रकार" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ hi: column_width: "Column width" definition_of_done: "पूर्ण की परिभाषा" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "बाधा" label_versions_default_fold_state: "मुड़े हुए संस्करण दिखाएं" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ hi: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/hr.yml b/modules/backlogs/config/locales/crowdin/hr.yml index f4318fddb9e..2d0f59ea3d7 100644 --- a/modules/backlogs/config/locales/crowdin/hr.yml +++ b/modules/backlogs/config/locales/crowdin/hr.yml @@ -31,6 +31,8 @@ hr: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ hr: backlogs_work_package_type: "Backlog tip" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ hr: column_width: "Column width" definition_of_done: "Definicija učinjenog" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Teškoće" label_versions_default_fold_state: "Prikaži prikupljene verzije" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -160,6 +170,27 @@ hr: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/hu.yml b/modules/backlogs/config/locales/crowdin/hu.yml index 2bbdd49a147..1162b326881 100644 --- a/modules/backlogs/config/locales/crowdin/hu.yml +++ b/modules/backlogs/config/locales/crowdin/hu.yml @@ -31,6 +31,8 @@ hu: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ hu: backlogs_work_package_type: "Backlog típus" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ hu: column_width: "Column width" definition_of_done: "A \"Kész\" meghatározása" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Akadály" label_versions_default_fold_state: "Összecsukott verziók mutatása" caption_versions_default_fold_state: "A verziók alapértelmezés szerint nem lesznek kibontva a várólista (backlog) megtekintésekor. Mindegyiket manuálisan kell kibontani." @@ -158,6 +168,27 @@ hu: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/id.yml b/modules/backlogs/config/locales/crowdin/id.yml index 2f03ef740e4..0358278d122 100644 --- a/modules/backlogs/config/locales/crowdin/id.yml +++ b/modules/backlogs/config/locales/crowdin/id.yml @@ -31,6 +31,8 @@ id: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ id: backlogs_work_package_type: "Jenis jaminan tersimpan" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ id: column_width: "Column width" definition_of_done: "Definisi Selesai" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Halangan" label_versions_default_fold_state: "Tampilkan versi terlipat" caption_versions_default_fold_state: "Versi tidak akan diperluas secara default saat melihat daftar tugas yang tertunda. Setiap versi harus diperluas secara manual." @@ -156,6 +166,27 @@ id: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml index 92bda374c47..09199d2219e 100644 --- a/modules/backlogs/config/locales/crowdin/it.yml +++ b/modules/backlogs/config/locales/crowdin/it.yml @@ -31,6 +31,8 @@ it: goal: "Obiettivo dello sprint" name: "Nome dello sprint" sharing: "Condivisione" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Durata dello sprint" work_package: @@ -39,6 +41,11 @@ it: backlogs_work_package_type: "Tipo di backlog" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ it: column_width: "Larghezza della colonna" definition_of_done: "Definizione di fatto" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impedimento" label_versions_default_fold_state: "Espandi le versioni" caption_versions_default_fold_state: "Le versioni non verranno espanse per impostazione predefinita durante la visualizzazione dei backlog. Ogni versione deve essere espansa manualmente." @@ -158,6 +168,27 @@ it: permission_start_complete_sprint: "Iniziare/completa lo sprint" permission_view_sprints: "Visualizza gli sprint" project_module_backlogs: "Backlog" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "Non sono disponibili dati di burndown" diff --git a/modules/backlogs/config/locales/crowdin/ja.yml b/modules/backlogs/config/locales/crowdin/ja.yml index 4eb545ca810..ed559ad21e0 100644 --- a/modules/backlogs/config/locales/crowdin/ja.yml +++ b/modules/backlogs/config/locales/crowdin/ja.yml @@ -31,6 +31,8 @@ ja: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ ja: backlogs_work_package_type: "バックログの種類" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ ja: column_width: "Column width" definition_of_done: "「終了」の定義" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "障害事項" label_versions_default_fold_state: "バージョンを折り畳んで表示" caption_versions_default_fold_state: "バックログを表示する場合、デフォルトではバージョンは展開されません。各バージョンは手動で展開する必要があります。" @@ -156,6 +166,27 @@ ja: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "バックログ" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/ka.yml b/modules/backlogs/config/locales/crowdin/ka.yml index 800f0ec5014..a29561c677e 100644 --- a/modules/backlogs/config/locales/crowdin/ka.yml +++ b/modules/backlogs/config/locales/crowdin/ka.yml @@ -31,6 +31,8 @@ ka: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ ka: backlogs_work_package_type: "ჩამორჩენის ტიპი" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ ka: column_width: "Column width" definition_of_done: "დასრულების აღწერა" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "წინააღმდეგობა" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ ka: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "შეუსრულებელი ამოცანები" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/kk.yml b/modules/backlogs/config/locales/crowdin/kk.yml index 8a82b88509c..cd93e23a720 100644 --- a/modules/backlogs/config/locales/crowdin/kk.yml +++ b/modules/backlogs/config/locales/crowdin/kk.yml @@ -31,6 +31,8 @@ kk: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ kk: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ kk: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ kk: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index 4b2ee8833fb..57af32fb81a 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -31,6 +31,8 @@ ko: goal: "스프린트 목표" name: "스프린트 이름" sharing: "공유" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "스프린트 기간" work_package: @@ -39,6 +41,11 @@ ko: backlogs_work_package_type: "백로그 유형" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ ko: column_width: "열 너비" definition_of_done: "완료 정의" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "제한" label_versions_default_fold_state: "접힌 버전 표시" caption_versions_default_fold_state: "백로그를 볼 때 버전은 기본적으로 확장되지 않습니다. 각 버전을 수동으로 확장해야 합니다." @@ -156,6 +166,27 @@ ko: permission_start_complete_sprint: "스프린트 시작/완료" permission_view_sprints: "스프린트 보기" project_module_backlogs: "백로그" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "사용 가능한 번다운 데이터 없음" diff --git a/modules/backlogs/config/locales/crowdin/lt.yml b/modules/backlogs/config/locales/crowdin/lt.yml index af7ad730f97..4ccb602b9fa 100644 --- a/modules/backlogs/config/locales/crowdin/lt.yml +++ b/modules/backlogs/config/locales/crowdin/lt.yml @@ -31,6 +31,8 @@ lt: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ lt: backlogs_work_package_type: "Darbų sąrašo tipas" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ lt: column_width: "Column width" definition_of_done: "Pabaigimo apibrėžimas" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Kliūtis" label_versions_default_fold_state: "Rodyti suskleistas versijas" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -162,6 +172,27 @@ lt: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Darbų sąrašai" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/lv.yml b/modules/backlogs/config/locales/crowdin/lv.yml index c4ae62c40ed..6109d4099ee 100644 --- a/modules/backlogs/config/locales/crowdin/lv.yml +++ b/modules/backlogs/config/locales/crowdin/lv.yml @@ -31,6 +31,8 @@ lv: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ lv: backlogs_work_package_type: "Produkta darbu krātuves tips" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ lv: column_width: "Column width" definition_of_done: "Pabeigtības definīcija" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Šķēršļi" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -160,6 +170,27 @@ lv: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Darbu krātuve" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/mn.yml b/modules/backlogs/config/locales/crowdin/mn.yml index 4b9ae429fe0..34332e35397 100644 --- a/modules/backlogs/config/locales/crowdin/mn.yml +++ b/modules/backlogs/config/locales/crowdin/mn.yml @@ -31,6 +31,8 @@ mn: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ mn: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ mn: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ mn: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/ms.yml b/modules/backlogs/config/locales/crowdin/ms.yml index d93c45c1701..d17ec5b7404 100644 --- a/modules/backlogs/config/locales/crowdin/ms.yml +++ b/modules/backlogs/config/locales/crowdin/ms.yml @@ -31,6 +31,8 @@ ms: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ ms: backlogs_work_package_type: "Jenis tunggakan kerja" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ ms: column_width: "Column width" definition_of_done: "Definisi Selesai" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Halangan" label_versions_default_fold_state: "Paparkan versi dilipat" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -156,6 +166,27 @@ ms: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Tunggakan" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/ne.yml b/modules/backlogs/config/locales/crowdin/ne.yml index 6e6a574c935..da2c8ce48bd 100644 --- a/modules/backlogs/config/locales/crowdin/ne.yml +++ b/modules/backlogs/config/locales/crowdin/ne.yml @@ -31,6 +31,8 @@ ne: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ ne: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ ne: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ ne: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml index 0fbb1ed4317..11907683026 100644 --- a/modules/backlogs/config/locales/crowdin/nl.yml +++ b/modules/backlogs/config/locales/crowdin/nl.yml @@ -31,6 +31,8 @@ nl: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ nl: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ nl: column_width: "Column width" definition_of_done: "Definitie van Klaar" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Belemmering" label_versions_default_fold_state: "Laat versies samengevouwen zien" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ nl: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index feb3aa9b1be..03a46a7a196 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -31,6 +31,8 @@ goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ backlogs_work_package_type: "Forsinkelser type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ column_width: "Column width" definition_of_done: "Definisjon av ferdig" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Hinder" label_versions_default_fold_state: "Vis versjoner kollapset" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Forsinkelser" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index a389daa6760..cd0b8696e42 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -31,6 +31,8 @@ pl: goal: "Cel sprintu" name: "Nazwa sprintu" sharing: "Udostępnianie" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Czas trwania sprintu" work_package: @@ -39,6 +41,11 @@ pl: backlogs_work_package_type: "Typ backlogu" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ pl: column_width: "Szerokość kolumny" definition_of_done: "Definicja Zrobione" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Przeszkoda" label_versions_default_fold_state: "Pokaż zwinięte wersje" caption_versions_default_fold_state: "Wersje nie będą domyślnie rozwijane podczas przeglądania backlogów. Każdą z nich należy rozwinąć ręcznie." @@ -162,6 +172,27 @@ pl: permission_start_complete_sprint: "Rozpocznij/ukończ sprint" permission_view_sprints: "Wyświetl sprinty" project_module_backlogs: "Backlogi" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "Brak dostępnych danych spalania" diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index 55fdce0fae2..6178178d0eb 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -31,6 +31,8 @@ pt-BR: goal: "Objetivo da sprint" name: "Nome da sprint" sharing: "Compartilhamento" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Duração da sprint" work_package: @@ -39,6 +41,11 @@ pt-BR: backlogs_work_package_type: "Tipo de backlog" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ pt-BR: column_width: "Largura da coluna" definition_of_done: "Definição de pronto" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impedimento" label_versions_default_fold_state: "Mostrar versões em modo fechado" caption_versions_default_fold_state: "As versões não serão expandidas por padrão ao visualizar backlogs. Cada uma deve ser expandida manualmente." @@ -158,6 +168,27 @@ pt-BR: permission_start_complete_sprint: "Iniciar/concluir sprint" permission_view_sprints: "Ver sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "Nenhum dado de burndown disponível" diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml index 4f37f5ce94d..377207d9045 100644 --- a/modules/backlogs/config/locales/crowdin/pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml @@ -31,6 +31,8 @@ pt-PT: goal: "Objetivo do sprint" name: "Nome do sprint" sharing: "Partilhar" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Duração do sprint" work_package: @@ -39,6 +41,11 @@ pt-PT: backlogs_work_package_type: "Tipo de backlog" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ pt-PT: column_width: "Largura da coluna" definition_of_done: "Definição de feito" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impedimento" label_versions_default_fold_state: "Mostrar versões dobradas" caption_versions_default_fold_state: "Versões não serão expandidas por predefinição quando visualizar os backlogs. Cada uma tem de ser expandida manualmente." @@ -158,6 +168,27 @@ pt-PT: permission_start_complete_sprint: "Iniciar/completar sprint" permission_view_sprints: "Ver sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "Não há dados de burndown disponíveis" diff --git a/modules/backlogs/config/locales/crowdin/ro.yml b/modules/backlogs/config/locales/crowdin/ro.yml index 22597abf6e8..c569e875c4b 100644 --- a/modules/backlogs/config/locales/crowdin/ro.yml +++ b/modules/backlogs/config/locales/crowdin/ro.yml @@ -31,6 +31,8 @@ ro: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ ro: backlogs_work_package_type: "Tip restanță" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ ro: column_width: "Column width" definition_of_done: "Procent realizat" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Afișare versiuni complete" caption_versions_default_fold_state: "Versiunile nu vor fi extinse în mod implicit la vizualizarea restanțelor. Fiecare versiune trebuie să fie extinsă manual." @@ -160,6 +170,27 @@ ro: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Restanțe" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index eae4ea8ec96..a3009ca7867 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -31,6 +31,8 @@ ru: goal: "Цель спринта" name: "Название спринта" sharing: "Совместное использование" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Продолжительность спринта" work_package: @@ -39,6 +41,11 @@ ru: backlogs_work_package_type: "Тип невыполненной работы" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ ru: column_width: "Ширина столбца" definition_of_done: "Определение термина \"Завершено\"" definition_of_done_caption: "Пакеты работ с такими статусами рассматриваются как завершенные в представлениях бэклога и отчетах." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Препятствие" label_versions_default_fold_state: "Показать свернутые версии" caption_versions_default_fold_state: "Версии не будут разворачиваться по умолчанию при просмотре бэклогов. Каждая версия должна быть развернута вручную." @@ -162,6 +172,27 @@ ru: permission_start_complete_sprint: "Начать/завершить спринт" permission_view_sprints: "Просмотр спринтов" project_module_backlogs: "Бэклоги" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "Нет сводных данных" diff --git a/modules/backlogs/config/locales/crowdin/rw.yml b/modules/backlogs/config/locales/crowdin/rw.yml index c2dbd4ef227..377e44fc915 100644 --- a/modules/backlogs/config/locales/crowdin/rw.yml +++ b/modules/backlogs/config/locales/crowdin/rw.yml @@ -31,6 +31,8 @@ rw: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ rw: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ rw: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ rw: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/si.yml b/modules/backlogs/config/locales/crowdin/si.yml index 4af952f455c..cef2feee69e 100644 --- a/modules/backlogs/config/locales/crowdin/si.yml +++ b/modules/backlogs/config/locales/crowdin/si.yml @@ -31,6 +31,8 @@ si: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ si: backlogs_work_package_type: "බැක්ලොග් වර්ගය" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ si: column_width: "Column width" definition_of_done: "සිදු කරන ලද අර්ථ දැක්වීම" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "බාධාවන්" label_versions_default_fold_state: "නවනු අනුවාද පෙන්වන්න" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ si: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "බැක්ලොග්ස්" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/sk.yml b/modules/backlogs/config/locales/crowdin/sk.yml index 5e384c812fd..867697ba38d 100644 --- a/modules/backlogs/config/locales/crowdin/sk.yml +++ b/modules/backlogs/config/locales/crowdin/sk.yml @@ -31,6 +31,8 @@ sk: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Trvanie šprintu" work_package: @@ -39,6 +41,11 @@ sk: backlogs_work_package_type: "Typ oneskorenia" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ sk: column_width: "Šírka stĺpca" definition_of_done: "Definícia pojmu Hotovo" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Prekážka" label_versions_default_fold_state: "Zobrazenie zložených verzií" caption_versions_default_fold_state: "Verzie sa pri prezeraní nevybavených dokumentov nebudú predvolene rozbaľovať. Každú z nich je potrebné rozbaliť manuálne." @@ -162,6 +172,27 @@ sk: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/sl.yml b/modules/backlogs/config/locales/crowdin/sl.yml index 953cff09d89..5fafed62682 100644 --- a/modules/backlogs/config/locales/crowdin/sl.yml +++ b/modules/backlogs/config/locales/crowdin/sl.yml @@ -31,6 +31,8 @@ sl: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ sl: backlogs_work_package_type: "Tip opravila na čakanju" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ sl: column_width: "Column width" definition_of_done: "Opredelitev opravljenega" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Ovira" label_versions_default_fold_state: "Pokaži različice zložene" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -162,6 +172,27 @@ sl: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Zaostanki" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/sr.yml b/modules/backlogs/config/locales/crowdin/sr.yml index dc9391b8e13..f849101982e 100644 --- a/modules/backlogs/config/locales/crowdin/sr.yml +++ b/modules/backlogs/config/locales/crowdin/sr.yml @@ -31,6 +31,8 @@ sr: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ sr: backlogs_work_package_type: "Tip backlog-a" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ sr: column_width: "Column width" definition_of_done: "Definicija završetka" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Smetnja" label_versions_default_fold_state: "Prikaži verzije skupljene" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -160,6 +170,27 @@ sr: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/sv.yml b/modules/backlogs/config/locales/crowdin/sv.yml index afef125bbc1..fb3fc262b39 100644 --- a/modules/backlogs/config/locales/crowdin/sv.yml +++ b/modules/backlogs/config/locales/crowdin/sv.yml @@ -31,6 +31,8 @@ sv: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ sv: backlogs_work_package_type: "Typ av backlogg" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ sv: column_width: "Column width" definition_of_done: "Definition av klart" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Hinder" label_versions_default_fold_state: "Visa ihopfällda versioner" caption_versions_default_fold_state: "Versioner kommer inte att utökas som standard när du visar backloggar. Var och en måste utökas manuellt." @@ -158,6 +168,27 @@ sv: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backloggar" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/th.yml b/modules/backlogs/config/locales/crowdin/th.yml index e8c928d448f..089c7feccb0 100644 --- a/modules/backlogs/config/locales/crowdin/th.yml +++ b/modules/backlogs/config/locales/crowdin/th.yml @@ -31,6 +31,8 @@ th: goal: "เป้าหมายสปริ๊นต์" name: "ชื่อสปรินต์" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "ระยะเวลาการสปรินต์" work_package: @@ -39,6 +41,11 @@ th: backlogs_work_package_type: "ประเภทงานค้าง" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ th: column_width: "ความกว้างของคอลัมน์" definition_of_done: "นิยามของคำว่าเสร็จสิ้น" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "รายการอุปสรรค" label_versions_default_fold_state: "แสดงเวอร์ชันที่พับอยู่" caption_versions_default_fold_state: "เวอร์ชันจะถูกพับไว้เป็นค่าเริ่มต้น กรุณาคลิกเพื่อขยายดูทีละรายการ" @@ -156,6 +166,27 @@ th: permission_start_complete_sprint: "เริ่มต้น/เสร็จสิ้นสปรินท์" permission_view_sprints: "ดูสปรินท์" project_module_backlogs: "รายการงานคงค้าง" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "ไม่มีข้อมูลกราฟติดตามงาน (Burndown)" diff --git a/modules/backlogs/config/locales/crowdin/tr.yml b/modules/backlogs/config/locales/crowdin/tr.yml index d0e5ff7103a..6e2ee977b0d 100644 --- a/modules/backlogs/config/locales/crowdin/tr.yml +++ b/modules/backlogs/config/locales/crowdin/tr.yml @@ -31,6 +31,8 @@ tr: goal: "Sprint goal" name: "Sprint name" sharing: "Paylaşım" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint süresi" work_package: @@ -39,6 +41,11 @@ tr: backlogs_work_package_type: "Bekleme listesi türü" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ tr: column_width: "Sütun genişliği" definition_of_done: "Bitti Tanımı" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Engel" label_versions_default_fold_state: "Katlanmış sürümleri göster" caption_versions_default_fold_state: "Birikmiş işler görüntülenirken sürümler öntanımlı olarak genişletilmeyecektir. Her birinin ayrı ayrı genişletilmesi gerekir." @@ -158,6 +168,27 @@ tr: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "İş listesi" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "Burndown verisi yok" diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml index 395ef98c388..5cf85e3fc10 100644 --- a/modules/backlogs/config/locales/crowdin/uk.yml +++ b/modules/backlogs/config/locales/crowdin/uk.yml @@ -31,6 +31,8 @@ uk: goal: "Ціль спринту" name: "Ім’я спринту" sharing: "Надання доступу" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Тривалість спринту" work_package: @@ -39,6 +41,11 @@ uk: backlogs_work_package_type: "Тип Backlog-у" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ uk: column_width: "Ширина стовпця" definition_of_done: "Визначення завершено" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Перешкода" label_versions_default_fold_state: "Показати складені версії" caption_versions_default_fold_state: "Версії не розгортатимуться за замовчуванням при перегляді невиконаних завдань. Кожну версію потрібно розгортати вручну." @@ -162,6 +172,27 @@ uk: permission_start_complete_sprint: "Початок/завершення спринтів" permission_view_sprints: "Перегляд спринтів" project_module_backlogs: "Невиконані завдання" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "Немає даних про згорання завдань" diff --git a/modules/backlogs/config/locales/crowdin/uz.yml b/modules/backlogs/config/locales/crowdin/uz.yml index 90ca537e08a..4b5d038b3f7 100644 --- a/modules/backlogs/config/locales/crowdin/uz.yml +++ b/modules/backlogs/config/locales/crowdin/uz.yml @@ -31,6 +31,8 @@ uz: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ uz: backlogs_work_package_type: "Backlog type" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ uz: column_width: "Column width" definition_of_done: "Definition of Done" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded." @@ -158,6 +168,27 @@ uz: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "Backlogs" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/vi.yml b/modules/backlogs/config/locales/crowdin/vi.yml index 55ee9ba1d3f..681c24b2418 100644 --- a/modules/backlogs/config/locales/crowdin/vi.yml +++ b/modules/backlogs/config/locales/crowdin/vi.yml @@ -31,6 +31,8 @@ vi: goal: "Sprint goal" name: "Sprint name" sharing: "Sharing" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "Sprint duration" work_package: @@ -39,6 +41,11 @@ vi: backlogs_work_package_type: "Loại Backlog" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ vi: column_width: "Column width" definition_of_done: "Định nghĩa về Hoàn thành" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "Trở ngại" label_versions_default_fold_state: "Hiển thị các phiên bản \n" caption_versions_default_fold_state: "Các phiên bản sẽ không được mở rộng theo mặc định khi xem hồ sơ tồn đọng. Mỗi cái phải được mở rộng bằng tay." @@ -156,6 +166,27 @@ vi: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "tồn đọng" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "No burndown data available" diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index 4e72f220e5c..ae92da0c00c 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -31,6 +31,8 @@ zh-CN: goal: "冲刺目标" name: "冲刺名称" sharing: "共享" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "冲刺持续时间" work_package: @@ -39,6 +41,11 @@ zh-CN: backlogs_work_package_type: "待办清单类型" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ zh-CN: column_width: "列宽" definition_of_done: "完成的定义" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "障碍" label_versions_default_fold_state: "显示已折叠的版本" caption_versions_default_fold_state: "查看积压工作时,默认情况下不会展开版本。每个版本都必须手动展开。" @@ -156,6 +166,27 @@ zh-CN: permission_start_complete_sprint: "开始/完成冲刺" permission_view_sprints: "查看冲刺" project_module_backlogs: "待办清单" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "没有可用的燃尽数据" diff --git a/modules/backlogs/config/locales/crowdin/zh-TW.yml b/modules/backlogs/config/locales/crowdin/zh-TW.yml index f183a8b675f..483f6689f6b 100644 --- a/modules/backlogs/config/locales/crowdin/zh-TW.yml +++ b/modules/backlogs/config/locales/crowdin/zh-TW.yml @@ -31,6 +31,8 @@ zh-TW: goal: "Sprint goal" name: "Sprint name" sharing: "分享" + project: + sprint_sharing: "Sprint sharing" sprint: duration: "衝刺時間" work_package: @@ -39,6 +41,11 @@ zh-TW: backlogs_work_package_type: "待辦事項類型" errors: models: + project: + attributes: + sprint_sharing: + share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." + share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." work_package: attributes: blocks_ids: @@ -57,6 +64,9 @@ zh-TW: column_width: "欄寬" definition_of_done: "定義" definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." + done_status: "Done status" + sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." + sharing: "Sharing" impediment: "阻礙" label_versions_default_fold_state: "顯示精簡版本" caption_versions_default_fold_state: "檢視待辦清單時,版本預設不會展開,需手動逐一展開。" @@ -156,6 +166,27 @@ zh-TW: permission_start_complete_sprint: "Start/complete sprint" permission_view_sprints: "View sprints" project_module_backlogs: "待辦事項" + projects: + settings: + backlog_sharing: + options: + no_sharing: + label: "Don't share" + caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + receive_shared: + label: "Receive shared sprints" + caption: "This project can only use sprints shared by other projects." + warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + share_all_projects: + label: "All projects" + caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." + disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." + disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + share_subprojects: + label: "Subprojects" + caption: "Sprints created in this project will be available to all subprojects of the current project." + info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." + sprint_sharing: Share sprints rb_burndown_charts: show: blankslate_title: "沒有可用的燃盡圖資料" From 41df2edc2c93b91a8bd92f6a0f86e93b823df27a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 05:36:31 +0000 Subject: [PATCH 310/334] Bump lefthook from 2.1.2 to 2.1.3 Bumps [lefthook](https://github.com/evilmartians/lefthook) from 2.1.2 to 2.1.3. - [Release notes](https://github.com/evilmartians/lefthook/releases) - [Changelog](https://github.com/evilmartians/lefthook/blob/master/CHANGELOG.md) - [Commits](https://github.com/evilmartians/lefthook/compare/v2.1.2...v2.1.3) --- updated-dependencies: - dependency-name: lefthook dependency-version: 2.1.3 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 95d9acf6b64..4bd80de8c82 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -767,7 +767,7 @@ GEM addressable (~> 2.8) childprocess (~> 5.0) logger (~> 1.6) - lefthook (2.1.2) + lefthook (2.1.3) letter_opener (1.10.0) launchy (>= 2.2, < 4) letter_opener_web (3.0.0) @@ -1990,7 +1990,7 @@ CHECKSUMS ladle (1.0.1) sha256=e8586964108c798d48bf57d2a65bd5602e8e5223a176b6602a0fb36c0bda90dc language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc launchy (3.1.1) sha256=72b847b5cc961589dde2c395af0108c86ff0119f42d4648d25b5440ebb10059e - lefthook (2.1.2) sha256=da5a2484d68ee00d7fcc7e072e925c0246363eb20d77499d536bea209ae6ae06 + lefthook (2.1.3) sha256=399eae9411d5a65fbeff38230a685073fefac6ef9ae18165a81f5f7ffa2df7a7 letter_opener (1.10.0) sha256=2ff33f2e3b5c3c26d1959be54b395c086ca6d44826e8bf41a14ff96fdf1bdbb2 letter_opener_web (3.0.0) sha256=3f391efe0e8b9b24becfab5537dfb17a5cf5eb532038f947daab58cb4b749860 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 From ed8a4df0610f10bc2092b00cdba844fb54a37b18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 05:43:50 +0000 Subject: [PATCH 311/334] Bump closure_tree from 9.6.0 to 9.6.1 Bumps [closure_tree](https://github.com/ClosureTree/closure_tree) from 9.6.0 to 9.6.1. - [Release notes](https://github.com/ClosureTree/closure_tree/releases) - [Changelog](https://github.com/ClosureTree/closure_tree/blob/master/CHANGELOG.md) - [Commits](https://github.com/ClosureTree/closure_tree/compare/closure_tree/v9.6.0...closure_tree/v9.6.1) --- updated-dependencies: - dependency-name: closure_tree dependency-version: 9.6.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 14b8a209569..94edc6c3f3e 100644 --- a/Gemfile +++ b/Gemfile @@ -69,7 +69,7 @@ gem "scimitar", "~> 2.13" gem "acts_as_list", "~> 1.2.6" gem "acts_as_tree", "~> 2.9.0" gem "awesome_nested_set", "~> 3.9.0" -gem "closure_tree", "~> 9.6.0" +gem "closure_tree", "~> 9.6.1" gem "rubytree", "~> 2.2.0" gem "addressable", "~> 2.8.9" diff --git a/Gemfile.lock b/Gemfile.lock index 95d9acf6b64..9e18cb34d56 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -424,7 +424,7 @@ GEM childprocess (5.1.0) logger (~> 1.5) climate_control (1.2.0) - closure_tree (9.6.0) + closure_tree (9.6.1) activerecord (>= 7.2.0) with_advisory_lock (>= 7.5.0) zeitwerk (~> 2.7) @@ -1452,7 +1452,7 @@ GEM thor (1.5.0) thread_safe (0.3.6) timecop (0.9.10) - timeout (0.6.0) + timeout (0.6.1) tpm-key_attestation (0.14.1) bindata (~> 2.4) openssl (> 2.0) @@ -1588,7 +1588,7 @@ DEPENDENCIES carrierwave (~> 2.2.6) carrierwave_direct (~> 3.0.0) climate_control - closure_tree (~> 9.6.0) + closure_tree (~> 9.6.1) colored2 commonmarker (~> 2.6.0) compare-xml (~> 0.66) @@ -1848,7 +1848,7 @@ CHECKSUMS cgi (0.5.1) sha256=e93fcafc69b8a934fe1e6146121fa35430efa8b4a4047c4893764067036f18e9 childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec climate_control (1.2.0) sha256=36b21896193fa8c8536fa1cd843a07cf8ddbd03aaba43665e26c53ec1bd70aa5 - closure_tree (9.6.0) sha256=75aac8f058597b0d96f2052f1419c912e8f4e92425e56273db122913cdae5d1e + closure_tree (9.6.1) sha256=f6af11243dea13d888788ffb0fd28014bd1077abe3a4233ea1e7044e52fc6377 coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b coercible (1.0.0) sha256=5081ad24352cc8435ce5472bc2faa30260c7ea7f2102cc6a9f167c4d9bffaadc color_conversion (0.1.2) sha256=99bea5fa412e1527a11389975aa6ad445ff8528ebae202c11d08c45ea2b94c96 @@ -2274,7 +2274,7 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 thread_safe (0.3.6) sha256=9ed7072821b51c57e8d6b7011a8e282e25aeea3a4065eab326e43f66f063b05a timecop (0.9.10) sha256=12ba45ce57cdcf6b1043cb6cdffa6381fd89ce10d369c28a7f6f04dc1b0cd8eb - timeout (0.6.0) sha256=6d722ad619f96ee383a0c557ec6eb8c4ecb08af3af62098a0be5057bf00de1af + timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb tpm-key_attestation (0.14.1) sha256=7fd4e4653a7afd0a386632ddfb05d10ecfdd47678299c5e69165bc9ae111193f trailblazer-option (0.1.2) sha256=20e4f12ea4e1f718c8007e7944ca21a329eee4eed9e0fa5dde6e8ad8ac4344a3 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f From 1fe143f8ca9796c2510958cf59e86eccf07af2fe Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Fri, 13 Mar 2026 13:37:46 +0100 Subject: [PATCH 312/334] Revert "Bump @primer/primitives from 11.3.2 to 11.5.0 in /frontend" This reverts commit 5631d8f2e487de4fd5440d68fc0fa78d33fdf140. --- frontend/package-lock.json | 15 ++++++++------- frontend/package.json | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2ecba74787f..1616e8a14ba 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -60,7 +60,7 @@ "@openproject/reactivestates": "^3.0.1", "@primer/css": "^22.1.0", "@primer/live-region-element": "^0.8.0", - "@primer/primitives": "^11.5.0", + "@primer/primitives": "^11.3.2", "@primer/view-components": "npm:@openproject/primer-view-components@^0.82.0", "@rails/request.js": "^0.0.13", "@stimulus-components/auto-submit": "^6.0.0", @@ -7823,9 +7823,10 @@ } }, "node_modules/@primer/primitives": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.5.0.tgz", - "integrity": "sha512-vYx9IJeCEZLluZh7Q+sZZXZU8vY2mY9t699AYc7Z2XA6BrVwdcbLbINIS7vjusxb+kQsIK2FshAGJujpV5OMLw==" + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.3.2.tgz", + "integrity": "sha512-/8EDh3MmF9cbmrLETFmIuNFIdvpSCkvBlx6zzD8AZ4dZ5UYExQzFj8QAtIrRtCFJ2ZmW5QrtrPR3+JVb8KEDpg==", + "license": "MIT" }, "node_modules/@primer/view-components": { "name": "@openproject/primer-view-components", @@ -30582,9 +30583,9 @@ "integrity": "sha512-KMWYYEIDKNIY0N3fMmNGPWJGHgoJF5NHkJllpOM3upDXuLtAe26Riogp1cfYdhp+sVjGZMt32DxcUhTX7ZhLOQ==" }, "@primer/primitives": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.5.0.tgz", - "integrity": "sha512-vYx9IJeCEZLluZh7Q+sZZXZU8vY2mY9t699AYc7Z2XA6BrVwdcbLbINIS7vjusxb+kQsIK2FshAGJujpV5OMLw==" + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.3.2.tgz", + "integrity": "sha512-/8EDh3MmF9cbmrLETFmIuNFIdvpSCkvBlx6zzD8AZ4dZ5UYExQzFj8QAtIrRtCFJ2ZmW5QrtrPR3+JVb8KEDpg==" }, "@primer/view-components": { "version": "npm:@openproject/primer-view-components@0.82.0", diff --git a/frontend/package.json b/frontend/package.json index a125c08e530..743f8b84c2d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -115,7 +115,7 @@ "@openproject/reactivestates": "^3.0.1", "@primer/css": "^22.1.0", "@primer/live-region-element": "^0.8.0", - "@primer/primitives": "^11.5.0", + "@primer/primitives": "^11.3.2", "@primer/view-components": "npm:@openproject/primer-view-components@^0.82.0", "@rails/request.js": "^0.0.13", "@stimulus-components/auto-submit": "^6.0.0", From fd6218f61bca3bb57e819500acf2fb89954ab396 Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Fri, 13 Mar 2026 13:40:44 +0100 Subject: [PATCH 313/334] Add primer primitives and css to the ignored list of dependabot --- .github/dependabot.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 84c9f0eebe9..9f8fb33d8d7 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -40,6 +40,8 @@ updates: update-types: ["version-update:semver-major"] - dependency-name: "@openproject/octicons" - dependency-name: "@openproject/primer-view-components" + - dependency-name: "@primer/primitives" + - dependency-name: "@primer/css" - package-ecosystem: "bundler" directory: "/" schedule: From 42ec4baddf55ce8c747d04ad218394f649915bf3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 08:41:46 -0500 Subject: [PATCH 314/334] Bump the html-eslint group in /frontend with 2 updates (#22300) Bumps the html-eslint group in /frontend with 2 updates: [@html-eslint/eslint-plugin](https://github.com/yeonjuan/html-eslint) and [@html-eslint/parser](https://github.com/yeonjuan/html-eslint). Updates `@html-eslint/eslint-plugin` from 0.57.0 to 0.57.1 - [Release notes](https://github.com/yeonjuan/html-eslint/releases) - [Commits](https://github.com/yeonjuan/html-eslint/compare/v0.57.0...v0.57.1) Updates `@html-eslint/parser` from 0.57.0 to 0.57.1 - [Release notes](https://github.com/yeonjuan/html-eslint/releases) - [Commits](https://github.com/yeonjuan/html-eslint/compare/v0.57.0...v0.57.1) --- updated-dependencies: - dependency-name: "@html-eslint/eslint-plugin" dependency-version: 0.57.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: html-eslint - dependency-name: "@html-eslint/parser" dependency-version: 0.57.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: html-eslint ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 62 +++++++++++--------------------------- frontend/package.json | 4 +-- 2 files changed, 20 insertions(+), 46 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2ecba74787f..4419fce1b6f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -138,8 +138,8 @@ "@angular-eslint/template-parser": "20.7.0", "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", - "@html-eslint/eslint-plugin": "^0.57.0", - "@html-eslint/parser": "^0.57.0", + "@html-eslint/eslint-plugin": "^0.57.1", + "@html-eslint/parser": "^0.57.1", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@stylistic/eslint-plugin": "^5.7.1", "@types/codemirror": "5.60.5", @@ -5302,18 +5302,19 @@ } }, "node_modules/@html-eslint/eslint-plugin": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.57.0.tgz", - "integrity": "sha512-9/sjZ2KHsZmco45Z9rGySOocJ734rhjjt1ofXJve7lzzBY+t8FF7fwVp9EmcXSer+0zDUb5hGBHWbgIZ0SEnJA==", + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.57.1.tgz", + "integrity": "sha512-IDfdk3V27eebNpdXD2NLy/lnTSbUuKrro/6YJICBn/9aiXPXagNqWJB38qcSWEoxADbXfSSn17DJWcXvQTkHBg==", "dev": true, "dependencies": { "@eslint/plugin-kit": "^0.4.1", "@html-eslint/core": "^0.57.0", - "@html-eslint/parser": "^0.57.0", + "@html-eslint/parser": "^0.57.1", "@html-eslint/template-parser": "^0.57.0", "@html-eslint/template-syntax-parser": "^0.57.0", "@html-eslint/types": "^0.57.0", - "@rviscomi/capo.js": "^2.1.0" + "@rviscomi/capo.js": "^2.1.0", + "html-standard": "^0.0.13" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5322,7 +5323,7 @@ "eslint": ">=8.0.0 || ^10.0.0-0" } }, - "node_modules/@html-eslint/eslint-plugin/node_modules/@html-eslint/parser": { + "node_modules/@html-eslint/parser": { "version": "0.57.1", "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.1.tgz", "integrity": "sha512-nQ5vw7Os+Snjxq9hLLBak2bv502Obn77BNOWfGK2+GIrShxtGd8w1ehlKW3EB5/RQzqBk6VDK8nPfexlR3M7kg==", @@ -5335,19 +5336,6 @@ "es-html-parser": "0.3.1" } }, - "node_modules/@html-eslint/parser": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.0.tgz", - "integrity": "sha512-guzD7QJFM0UOGnOZco7I9WEZOBQCmXR3abt6sIhznq4x7Ws6l/KwnNo7im6r0g7/ftLTmuKnLjyNEbW8seQyMQ==", - "dev": true, - "dependencies": { - "@eslint/css-tree": "^3.6.9", - "@html-eslint/template-syntax-parser": "^0.57.0", - "@html-eslint/types": "^0.57.0", - "css-tree": "^3.1.0", - "es-html-parser": "0.3.1" - } - }, "node_modules/@html-eslint/template-parser": { "version": "0.57.0", "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.57.0.tgz", @@ -29107,39 +29095,25 @@ } }, "@html-eslint/eslint-plugin": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.57.0.tgz", - "integrity": "sha512-9/sjZ2KHsZmco45Z9rGySOocJ734rhjjt1ofXJve7lzzBY+t8FF7fwVp9EmcXSer+0zDUb5hGBHWbgIZ0SEnJA==", + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.57.1.tgz", + "integrity": "sha512-IDfdk3V27eebNpdXD2NLy/lnTSbUuKrro/6YJICBn/9aiXPXagNqWJB38qcSWEoxADbXfSSn17DJWcXvQTkHBg==", "dev": true, "requires": { "@eslint/plugin-kit": "^0.4.1", "@html-eslint/core": "^0.57.0", - "@html-eslint/parser": "^0.57.0", + "@html-eslint/parser": "^0.57.1", "@html-eslint/template-parser": "^0.57.0", "@html-eslint/template-syntax-parser": "^0.57.0", "@html-eslint/types": "^0.57.0", - "@rviscomi/capo.js": "^2.1.0" - }, - "dependencies": { - "@html-eslint/parser": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.1.tgz", - "integrity": "sha512-nQ5vw7Os+Snjxq9hLLBak2bv502Obn77BNOWfGK2+GIrShxtGd8w1ehlKW3EB5/RQzqBk6VDK8nPfexlR3M7kg==", - "dev": true, - "requires": { - "@eslint/css-tree": "^3.6.9", - "@html-eslint/template-syntax-parser": "^0.57.0", - "@html-eslint/types": "^0.57.0", - "css-tree": "^3.1.0", - "es-html-parser": "0.3.1" - } - } + "@rviscomi/capo.js": "^2.1.0", + "html-standard": "^0.0.13" } }, "@html-eslint/parser": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.0.tgz", - "integrity": "sha512-guzD7QJFM0UOGnOZco7I9WEZOBQCmXR3abt6sIhznq4x7Ws6l/KwnNo7im6r0g7/ftLTmuKnLjyNEbW8seQyMQ==", + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.1.tgz", + "integrity": "sha512-nQ5vw7Os+Snjxq9hLLBak2bv502Obn77BNOWfGK2+GIrShxtGd8w1ehlKW3EB5/RQzqBk6VDK8nPfexlR3M7kg==", "dev": true, "requires": { "@eslint/css-tree": "^3.6.9", diff --git a/frontend/package.json b/frontend/package.json index a125c08e530..e164a09c5e9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,8 +14,8 @@ "@angular-eslint/template-parser": "20.7.0", "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", - "@html-eslint/eslint-plugin": "^0.57.0", - "@html-eslint/parser": "^0.57.0", + "@html-eslint/eslint-plugin": "^0.57.1", + "@html-eslint/parser": "^0.57.1", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@stylistic/eslint-plugin": "^5.7.1", "@types/codemirror": "5.60.5", From 71372b8ff22cb4e5245487755dfd02c80a99b806 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Mon, 9 Mar 2026 15:24:30 +0100 Subject: [PATCH 315/334] [#72849] Rename `Stories#move` action to `#move_legacy` This method will be responsible for handling versions --- modules/backlogs/app/components/backlogs/backlog_component.rb | 3 ++- modules/backlogs/app/controllers/rb_stories_controller.rb | 2 +- modules/backlogs/config/routes.rb | 2 +- modules/backlogs/lib/open_project/backlogs/engine.rb | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/backlog_component.rb b/modules/backlogs/app/components/backlogs/backlog_component.rb index a25366262a3..4962e26583c 100644 --- a/modules/backlogs/app/components/backlogs/backlog_component.rb +++ b/modules/backlogs/app/components/backlogs/backlog_component.rb @@ -82,7 +82,8 @@ module Backlogs { draggable_id: story.id, draggable_type: "story", - drop_url: move_backlogs_project_sprint_story_path(project, sprint, story) + # TODO: this URL is called must be called for agile_sprint instead! + drop_url: move_legacy_backlogs_project_sprint_story_path(project, sprint, story) } end end diff --git a/modules/backlogs/app/controllers/rb_stories_controller.rb b/modules/backlogs/app/controllers/rb_stories_controller.rb index 6386fccd5af..de2a57ba522 100644 --- a/modules/backlogs/app/controllers/rb_stories_controller.rb +++ b/modules/backlogs/app/controllers/rb_stories_controller.rb @@ -33,7 +33,7 @@ class RbStoriesController < RbApplicationController before_action :load_story - def move # rubocop:disable Metrics/AbcSize + def move_legacy # rubocop:disable Metrics/AbcSize # The update service reloads the story internally (via #move_after), # so we memoize the previous version_id before the call. version_id_was = @story.version_id diff --git a/modules/backlogs/config/routes.rb b/modules/backlogs/config/routes.rb index dad63b3d4bd..f12ed84ae57 100644 --- a/modules/backlogs/config/routes.rb +++ b/modules/backlogs/config/routes.rb @@ -71,7 +71,7 @@ Rails.application.routes.draw do resources :stories, controller: :rb_stories, only: [] do member do - put :move + put :move_legacy post :reorder end end diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index b58aa476caf..e9b0daef535 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -100,7 +100,7 @@ module OpenProject::Backlogs visible: -> { OpenProject::FeatureDecisions.scrum_projects_active? } permission :manage_sprint_items, - { rb_stories: %i[move reorder] }, + { rb_stories: %i[move move_legacy reorder] }, permissible_on: :project, require: :member, dependencies: :view_sprints From bb4b23cab3dc006ecd32d495ba3d97e227662078 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Tue, 10 Mar 2026 12:58:02 +0100 Subject: [PATCH 316/334] [#72849] Move #load_project to RbApplicationController --- .../backlogs/app/controllers/rb_application_controller.rb | 6 +++++- modules/backlogs/app/controllers/rb_sprints_controller.rb | 4 ---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_application_controller.rb b/modules/backlogs/app/controllers/rb_application_controller.rb index 83906ae31a7..5efcf887455 100644 --- a/modules/backlogs/app/controllers/rb_application_controller.rb +++ b/modules/backlogs/app/controllers/rb_application_controller.rb @@ -41,7 +41,7 @@ class RbApplicationController < ApplicationController # Loads the project to be used by the authorize filter to determine if # User.current has permission to invoke the method in question. def load_sprint_and_project - @project = Project.visible.find(params[:project_id]) + load_project # because of strong params, we want to pluck this variable out right now, # otherwise it causes issues where we are doing `attributes=`. @@ -50,6 +50,10 @@ class RbApplicationController < ApplicationController end end + def load_project + @project = Project.visible.find(params[:project_id]) + end + def check_if_plugin_is_configured settings = Setting.plugin_openproject_backlogs if settings["story_types"].blank? || settings["task_type"].blank? diff --git a/modules/backlogs/app/controllers/rb_sprints_controller.rb b/modules/backlogs/app/controllers/rb_sprints_controller.rb index 0dbbe03a5b5..2978ea374b9 100644 --- a/modules/backlogs/app/controllers/rb_sprints_controller.rb +++ b/modules/backlogs/app/controllers/rb_sprints_controller.rb @@ -176,10 +176,6 @@ class RbSprintsController < RbApplicationController load_project end - def load_project - @project = Project.visible.find(params[:project_id]) - end - def sprint_params params.expect(sprint: %i[name start_date effective_date]) end From af082557eea8798600734dddeaf2221776c189ca Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Tue, 10 Mar 2026 13:02:14 +0100 Subject: [PATCH 317/334] [#72849] Fix drag and drop implementation for Agile::Sprint Also makes it work between Version and Agile::Sprint --- .../components/backlogs/backlog_component.rb | 3 +- .../components/backlogs/sprint_component.rb | 4 +- .../app/controllers/rb_stories_controller.rb | 101 +++++++++++++++++- modules/backlogs/config/routes.rb | 4 + 4 files changed, 104 insertions(+), 8 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/backlog_component.rb b/modules/backlogs/app/components/backlogs/backlog_component.rb index 4962e26583c..888de7921d6 100644 --- a/modules/backlogs/app/components/backlogs/backlog_component.rb +++ b/modules/backlogs/app/components/backlogs/backlog_component.rb @@ -73,7 +73,7 @@ module Backlogs { generic_drag_and_drop_target: "container", target_container_accessor: ":scope > ul", - target_id: backlog.sprint_id, + target_id: "version:#{backlog.sprint_id}", target_allowed_drag_type: "story" } end @@ -82,7 +82,6 @@ module Backlogs { draggable_id: story.id, draggable_type: "story", - # TODO: this URL is called must be called for agile_sprint instead! drop_url: move_legacy_backlogs_project_sprint_story_path(project, sprint, story) } end diff --git a/modules/backlogs/app/components/backlogs/sprint_component.rb b/modules/backlogs/app/components/backlogs/sprint_component.rb index 96dddd58110..bc00a403ce3 100644 --- a/modules/backlogs/app/components/backlogs/sprint_component.rb +++ b/modules/backlogs/app/components/backlogs/sprint_component.rb @@ -76,7 +76,7 @@ module Backlogs { generic_drag_and_drop_target: "container", target_container_accessor: ":scope > ul", - target_id: sprint.id, + target_id: "sprint:#{sprint.id}", target_allowed_drag_type: "story" } end @@ -85,7 +85,7 @@ module Backlogs { draggable_id: story.id, draggable_type: "story", - drop_url: move_backlogs_project_sprint_story_path(project, sprint, story) + drop_url: project_sprint_story_move_path(project, sprint, story) } end end diff --git a/modules/backlogs/app/controllers/rb_stories_controller.rb b/modules/backlogs/app/controllers/rb_stories_controller.rb index de2a57ba522..2c727008a2e 100644 --- a/modules/backlogs/app/controllers/rb_stories_controller.rb +++ b/modules/backlogs/app/controllers/rb_stories_controller.rb @@ -31,9 +31,17 @@ class RbStoriesController < RbApplicationController include OpTurbo::ComponentStream - before_action :load_story + NEW_SPRINT_ACTIONS = %i[move].freeze + skip_before_action :load_sprint_and_project, only: NEW_SPRINT_ACTIONS + + before_action :legacy_load_story, except: NEW_SPRINT_ACTIONS + before_action :load_project, :load_sprint, :load_story, only: NEW_SPRINT_ACTIONS + + # Move a story from a Sprint to another Sprint or an Agile::Sprint. def move_legacy # rubocop:disable Metrics/AbcSize + move_attributes = infer_attributes_from_target + # The update service reloads the story internally (via #move_after), # so we memoize the previous version_id before the call. version_id_was = @story.version_id @@ -41,7 +49,7 @@ class RbStoriesController < RbApplicationController call = Stories::UpdateService .new(user: current_user, story: @story) .call( - attributes: { version_id: move_params[:target_id] }, + attributes: move_attributes, position: move_params[:position].to_i ) @@ -54,7 +62,15 @@ class RbStoriesController < RbApplicationController replace_backlog_component_via_turbo_stream(sprint: @sprint) - if @story.version_id != version_id_was + if target_sprint?(move_attributes) + new_sprint = @story.sprint.becomes(Agile::Sprint) + + render_success_flash_message_via_turbo_stream( + message: I18n.t(:notice_successful_move, from: @sprint.name, to: new_sprint.name) + ) + + replace_sprint_component_via_turbo_stream(sprint: new_sprint) + elsif target_version?(move_attributes) && @story.version_id != version_id_was new_sprint = @story.version.becomes(Sprint) render_success_flash_message_via_turbo_stream( @@ -66,6 +82,50 @@ class RbStoriesController < RbApplicationController respond_with_turbo_streams end + # Move a story from an Agile::Sprint to another Agile::Sprint or a Sprint. + def move # rubocop:disable Metrics/AbcSize + move_attributes = infer_attributes_from_target + + # The update service reloads the story internally (via #move_after), + # so we memoize the previous sprint_id before the call. + sprint_id_was = @story.sprint_id + + call = Stories::UpdateService + .new(user: current_user, story: @story) + .call( + attributes: move_attributes, + position: move_params[:position].to_i + ) + + unless call.success? + render_error_flash_message_via_turbo_stream( + message: I18n.t(:notice_unsuccessful_update_with_reason, reason: call.message) + ) + end + + replace_sprint_component_via_turbo_stream(sprint: @sprint) + + if target_version?(move_attributes) + new_sprint = @story.version.becomes(Sprint) + + render_success_flash_message_via_turbo_stream( + message: I18n.t(:notice_successful_move, from: @sprint.name, to: new_sprint.name) + ) + + replace_backlog_component_via_turbo_stream(sprint: new_sprint) + elsif target_sprint?(move_attributes) && @story.sprint_id != sprint_id_was + new_sprint = @story.sprint.becomes(Agile::Sprint) + + render_success_flash_message_via_turbo_stream( + message: I18n.t(:notice_successful_move, from: @sprint.name, to: new_sprint.name) + ) + + replace_sprint_component_via_turbo_stream(sprint: new_sprint) + end + + respond_with_turbo_streams + end + def reorder call = Stories::UpdateService .new(user: current_user, story: @story) @@ -85,6 +145,27 @@ class RbStoriesController < RbApplicationController private + def infer_attributes_from_target + target_type, target_id = move_params[:target_id].split(":") + + case target_type + when "version" + { version_id: target_id, sprint_id: nil } + when "sprint" + { version_id: nil, sprint_id: target_id } + else + raise ArgumentError, "target_id must include one of: version, sprint." + end + end + + def target_version?(move_attributes) + move_attributes[:version_id].present? + end + + def target_sprint?(move_attributes) + move_attributes[:sprint_id].present? + end + def replace_backlog_component_via_turbo_stream(sprint:) @backlog = Backlog.for(sprint:, project: @project) replace_via_turbo_stream( @@ -93,10 +174,22 @@ class RbStoriesController < RbApplicationController ) end - def load_story + def replace_sprint_component_via_turbo_stream(sprint:) + replace_via_turbo_stream(component: Backlogs::SprintComponent.new(sprint: sprint)) + end + + def legacy_load_story @story = Story.visible.find(params[:id]) end + def load_story + @story = WorkPackage.visible.find(params[:story_id]) + end + + def load_sprint + @sprint = Agile::Sprint.for_project(@project).visible.find(params[:sprint_id]) + end + def move_params params.require(%i[position target_id]) params.permit(:position, :target_id) diff --git a/modules/backlogs/config/routes.rb b/modules/backlogs/config/routes.rb index f12ed84ae57..097f1a5e3a5 100644 --- a/modules/backlogs/config/routes.rb +++ b/modules/backlogs/config/routes.rb @@ -40,6 +40,10 @@ Rails.application.routes.draw do get :edit_dialog put :update_agile_sprint end + + resources :stories, controller: :rb_stories, only: [] do + put :move + end end end From 2f884bd90cfdade896ec4336d15f9921564a765a Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 11 Mar 2026 08:53:47 +0100 Subject: [PATCH 318/334] [#72849] Story move -> return early in case of error --- modules/backlogs/app/controllers/rb_stories_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/backlogs/app/controllers/rb_stories_controller.rb b/modules/backlogs/app/controllers/rb_stories_controller.rb index 2c727008a2e..b733ccb73eb 100644 --- a/modules/backlogs/app/controllers/rb_stories_controller.rb +++ b/modules/backlogs/app/controllers/rb_stories_controller.rb @@ -101,6 +101,7 @@ class RbStoriesController < RbApplicationController render_error_flash_message_via_turbo_stream( message: I18n.t(:notice_unsuccessful_update_with_reason, reason: call.message) ) + return respond_with_turbo_streams(status: :unprocessable_entity) end replace_sprint_component_via_turbo_stream(sprint: @sprint) From b26f162b19d3c4f1a82494ed9132b6d14e4494f9 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 11 Mar 2026 09:37:20 +0100 Subject: [PATCH 319/334] [#72849] Refactor so that #move and #move_legacy have less code duplication --- .../app/controllers/rb_stories_controller.rb | 117 +++++++++--------- 1 file changed, 58 insertions(+), 59 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_stories_controller.rb b/modules/backlogs/app/controllers/rb_stories_controller.rb index b733ccb73eb..dc4f60423b9 100644 --- a/modules/backlogs/app/controllers/rb_stories_controller.rb +++ b/modules/backlogs/app/controllers/rb_stories_controller.rb @@ -39,89 +39,40 @@ class RbStoriesController < RbApplicationController before_action :load_project, :load_sprint, :load_story, only: NEW_SPRINT_ACTIONS # Move a story from a Sprint to another Sprint or an Agile::Sprint. - def move_legacy # rubocop:disable Metrics/AbcSize - move_attributes = infer_attributes_from_target - + def move_legacy # The update service reloads the story internally (via #move_after), # so we memoize the previous version_id before the call. version_id_was = @story.version_id - call = Stories::UpdateService - .new(user: current_user, story: @story) - .call( - attributes: move_attributes, - position: move_params[:position].to_i - ) - - unless call.success? - render_error_flash_message_via_turbo_stream( - message: I18n.t(:notice_unsuccessful_update_with_reason, reason: call.message) - ) + move_attributes = infer_attributes_from_target + unless move_story(move_attributes) return respond_with_turbo_streams(status: :unprocessable_entity) end - replace_backlog_component_via_turbo_stream(sprint: @sprint) - if target_sprint?(move_attributes) - new_sprint = @story.sprint.becomes(Agile::Sprint) - - render_success_flash_message_via_turbo_stream( - message: I18n.t(:notice_successful_move, from: @sprint.name, to: new_sprint.name) - ) - - replace_sprint_component_via_turbo_stream(sprint: new_sprint) + moved_to_sprint elsif target_version?(move_attributes) && @story.version_id != version_id_was - new_sprint = @story.version.becomes(Sprint) - - render_success_flash_message_via_turbo_stream( - message: I18n.t(:notice_successful_move, from: @sprint.name, to: new_sprint.name) - ) - replace_backlog_component_via_turbo_stream(sprint: new_sprint) + moved_to_version end respond_with_turbo_streams end # Move a story from an Agile::Sprint to another Agile::Sprint or a Sprint. - def move # rubocop:disable Metrics/AbcSize - move_attributes = infer_attributes_from_target - + def move # The update service reloads the story internally (via #move_after), # so we memoize the previous sprint_id before the call. sprint_id_was = @story.sprint_id - call = Stories::UpdateService - .new(user: current_user, story: @story) - .call( - attributes: move_attributes, - position: move_params[:position].to_i - ) - - unless call.success? - render_error_flash_message_via_turbo_stream( - message: I18n.t(:notice_unsuccessful_update_with_reason, reason: call.message) - ) + move_attributes = infer_attributes_from_target + unless move_story(move_attributes) return respond_with_turbo_streams(status: :unprocessable_entity) end - replace_sprint_component_via_turbo_stream(sprint: @sprint) - if target_version?(move_attributes) - new_sprint = @story.version.becomes(Sprint) - - render_success_flash_message_via_turbo_stream( - message: I18n.t(:notice_successful_move, from: @sprint.name, to: new_sprint.name) - ) - - replace_backlog_component_via_turbo_stream(sprint: new_sprint) + moved_to_version elsif target_sprint?(move_attributes) && @story.sprint_id != sprint_id_was - new_sprint = @story.sprint.becomes(Agile::Sprint) - - render_success_flash_message_via_turbo_stream( - message: I18n.t(:notice_successful_move, from: @sprint.name, to: new_sprint.name) - ) - - replace_sprint_component_via_turbo_stream(sprint: new_sprint) + moved_to_sprint end respond_with_turbo_streams @@ -146,6 +97,54 @@ class RbStoriesController < RbApplicationController private + def move_story(move_attributes) + call = update_story_with_target_and_position(attributes: move_attributes) + + unless call.success? + render_error_flash_message_via_turbo_stream( + message: I18n.t(:notice_unsuccessful_update_with_reason, reason: call.message) + ) + return false + end + + # Update source component so that the moved story disappears + replace_typed_component_via_turbo_stream(sprint: @sprint) + end + + def update_story_with_target_and_position(attributes:) + Stories::UpdateService + .new(user: current_user, story: @story) + .call( + attributes:, + position: move_params[:position].to_i + ) + end + + def replace_typed_component_via_turbo_stream(sprint:) + if sprint.is_a?(Agile::Sprint) + replace_sprint_component_via_turbo_stream(sprint:) + else + replace_backlog_component_via_turbo_stream(sprint:) + end + end + + def moved_to_version + moved_to(new_sprint: @story.version.becomes(Sprint)) + end + + def moved_to_sprint + moved_to(new_sprint: @story.sprint.becomes(Agile::Sprint)) + end + + def moved_to(new_sprint:) + render_success_flash_message_via_turbo_stream( + message: I18n.t(:notice_successful_move, from: @sprint.name, to: new_sprint.name) + ) + + # Update the target component so that the moved story shows up + replace_typed_component_via_turbo_stream(sprint: new_sprint) + end + def infer_attributes_from_target target_type, target_id = move_params[:target_id].split(":") From de36ddceb7eab5e810da774b10073288d325ee2a Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 11 Mar 2026 09:57:59 +0100 Subject: [PATCH 320/334] [#72849] Only nullify version if it is a backlog --- .../app/controllers/rb_stories_controller.rb | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_stories_controller.rb b/modules/backlogs/app/controllers/rb_stories_controller.rb index dc4f60423b9..ceadd87faec 100644 --- a/modules/backlogs/app/controllers/rb_stories_controller.rb +++ b/modules/backlogs/app/controllers/rb_stories_controller.rb @@ -152,12 +152,28 @@ class RbStoriesController < RbApplicationController when "version" { version_id: target_id, sprint_id: nil } when "sprint" - { version_id: nil, sprint_id: target_id } + # If the story is assigned to a version, we will only nullify the version + # if it is used as a backlog. We will keep a "regular" version reference. + # Otherwise, moving a story to a sprint would delete it from any version it is + # assigned to. + if version_is_backlog?(@story.version) + { version_id: nil, sprint_id: target_id } + else + { sprint_id: target_id } + end else - raise ArgumentError, "target_id must include one of: version, sprint." + raise ArgumentError, "target_type must include one of: version, sprint." end end + def version_is_backlog?(version) + return false unless version + + settings = version.version_settings&.where(project: @project)&.first + + settings&.display_right? + end + def target_version?(move_attributes) move_attributes[:version_id].present? end From 9bb0ee7c031a020224615d0edd80df6995478b1a Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Wed, 11 Mar 2026 10:06:29 +0100 Subject: [PATCH 321/334] [#72849] Move backlog helper to Version --- .../backlogs/app/controllers/rb_stories_controller.rb | 10 +--------- .../lib/open_project/backlogs/patches/version_patch.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_stories_controller.rb b/modules/backlogs/app/controllers/rb_stories_controller.rb index ceadd87faec..969bcb96487 100644 --- a/modules/backlogs/app/controllers/rb_stories_controller.rb +++ b/modules/backlogs/app/controllers/rb_stories_controller.rb @@ -156,7 +156,7 @@ class RbStoriesController < RbApplicationController # if it is used as a backlog. We will keep a "regular" version reference. # Otherwise, moving a story to a sprint would delete it from any version it is # assigned to. - if version_is_backlog?(@story.version) + if @story.version&.used_as_backlog? { version_id: nil, sprint_id: target_id } else { sprint_id: target_id } @@ -166,14 +166,6 @@ class RbStoriesController < RbApplicationController end end - def version_is_backlog?(version) - return false unless version - - settings = version.version_settings&.where(project: @project)&.first - - settings&.display_right? - end - def target_version?(move_attributes) move_attributes[:version_id].present? end diff --git a/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb index 2730388c184..1cd4fba8a1e 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb @@ -37,6 +37,14 @@ module OpenProject::Backlogs::Patches::VersionPatch end module InstanceMethods + def used_as_backlog?(project = self.project) + return false unless project.backlogs_enabled? + + settings = version_settings&.where(project:)&.first + + settings&.display_right? + end + def rebuild_story_positions(project = self.project) return unless project.backlogs_enabled? From 5298fa8f3728ee918cd96f93b41d0cd0e881c132 Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 12 Mar 2026 09:31:35 +0100 Subject: [PATCH 322/334] [#72849] Fix component specs --- .../app/components/backlogs/sprint_component.rb | 2 +- .../backlogs/app/controllers/rb_stories_controller.rb | 2 +- modules/backlogs/config/routes.rb | 4 +++- .../spec/components/backlogs/backlog_component_spec.rb | 4 ++-- .../spec/components/backlogs/sprint_component_spec.rb | 4 ++-- .../backlogs/spec/routing/rb_stories_routing_spec.rb | 10 ++++++++++ 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/sprint_component.rb b/modules/backlogs/app/components/backlogs/sprint_component.rb index bc00a403ce3..19758de4839 100644 --- a/modules/backlogs/app/components/backlogs/sprint_component.rb +++ b/modules/backlogs/app/components/backlogs/sprint_component.rb @@ -85,7 +85,7 @@ module Backlogs { draggable_id: story.id, draggable_type: "story", - drop_url: project_sprint_story_move_path(project, sprint, story) + drop_url: move_project_sprint_story_path(project, sprint, story) } end end diff --git a/modules/backlogs/app/controllers/rb_stories_controller.rb b/modules/backlogs/app/controllers/rb_stories_controller.rb index 969bcb96487..e72c11dabc1 100644 --- a/modules/backlogs/app/controllers/rb_stories_controller.rb +++ b/modules/backlogs/app/controllers/rb_stories_controller.rb @@ -191,7 +191,7 @@ class RbStoriesController < RbApplicationController end def load_story - @story = WorkPackage.visible.find(params[:story_id]) + @story = WorkPackage.visible.find(params[:id]) end def load_sprint diff --git a/modules/backlogs/config/routes.rb b/modules/backlogs/config/routes.rb index 097f1a5e3a5..f4a3e0436d5 100644 --- a/modules/backlogs/config/routes.rb +++ b/modules/backlogs/config/routes.rb @@ -42,7 +42,9 @@ Rails.application.routes.draw do end resources :stories, controller: :rb_stories, only: [] do - put :move + member do + put :move + end end end end diff --git a/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb b/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb index 4a9e1ccb2bb..a963c3dcf30 100644 --- a/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb @@ -119,7 +119,7 @@ RSpec.describe Backlogs::BacklogComponent, type: :component do box = page.find(".Box") expect(box["data-generic-drag-and-drop-target"]).to eq("container") expect(box["data-target-container-accessor"]).to eq(":scope > ul") - expect(box["data-target-id"]).to eq(sprint.id.to_s) + expect(box["data-target-id"]).to eq("version:#{sprint.id}") expect(box["data-target-allowed-drag-type"]).to eq("story") end @@ -129,7 +129,7 @@ RSpec.describe Backlogs::BacklogComponent, type: :component do story_row = page.find(".Box-row[id='story_#{story1.id}']") expect(story_row["data-draggable-id"]).to eq(story1.id.to_s) expect(story_row["data-draggable-type"]).to eq("story") - expect(story_row["data-drop-url"]).to end_with(move_backlogs_project_sprint_story_path(project, sprint, story1)) + expect(story_row["data-drop-url"]).to end_with(move_legacy_backlogs_project_sprint_story_path(project, sprint, story1)) end it "renders story rows with proper classes" do diff --git a/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb index 9eb127060ed..bc56e0db62e 100644 --- a/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb @@ -116,7 +116,7 @@ RSpec.describe Backlogs::SprintComponent, type: :component do box = page.find(".Box") expect(box["data-generic-drag-and-drop-target"]).to eq("container") expect(box["data-target-container-accessor"]).to eq(":scope > ul") - expect(box["data-target-id"]).to eq(sprint.id.to_s) + expect(box["data-target-id"]).to eq("sprint:#{sprint.id}") expect(box["data-target-allowed-drag-type"]).to eq("story") end @@ -126,7 +126,7 @@ RSpec.describe Backlogs::SprintComponent, type: :component do story_row = page.find(".Box-row[id='work_package_#{story1.id}']") expect(story_row["data-draggable-id"]).to eq(story1.id.to_s) expect(story_row["data-draggable-type"]).to eq("story") - expect(story_row["data-drop-url"]).to end_with(move_backlogs_project_sprint_story_path(project, sprint, story1)) + expect(story_row["data-drop-url"]).to end_with(move_project_sprint_story_path(project, sprint, story1)) end it "renders story rows with proper classes" do diff --git a/modules/backlogs/spec/routing/rb_stories_routing_spec.rb b/modules/backlogs/spec/routing/rb_stories_routing_spec.rb index d0af15bece9..e484c850e36 100644 --- a/modules/backlogs/spec/routing/rb_stories_routing_spec.rb +++ b/modules/backlogs/spec/routing/rb_stories_routing_spec.rb @@ -30,6 +30,16 @@ require "spec_helper" RSpec.describe RbStoriesController do describe "routing" do + it { + expect(put("/projects/project_42/sprints/21/stories/85/move_legacy")).to route_to( + controller: "rb_stories", + action: "move_legacy", + project_id: "project_42", + sprint_id: "21", + id: "85" + ) + } + it { expect(put("/projects/project_42/sprints/21/stories/85/move")).to route_to( controller: "rb_stories", From 180ef009581f605f78b4f8e4a779d15563b0351b Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 12 Mar 2026 09:34:11 +0100 Subject: [PATCH 323/334] [#72849] Fix RbStoriesControllerSpec --- .../controllers/rb_stories_controller_spec.rb | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb b/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb index dd59a5b2903..ba815177e7b 100644 --- a/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb @@ -47,19 +47,19 @@ RSpec.describe RbStoriesController do .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id }) end - describe "PUT #move" do + describe "PUT #move_legacy" do context "with a version from the same project" do let(:other_sprint) { create(:sprint, name: "Sprint 2", project:) } it "responds with success", :aggregate_failures do - put :move, params: { - project_id: project.id, - sprint_id: sprint.id, - id: story.id, - target_id: other_sprint.id, - position: 1 - }, - format: :turbo_stream + put :move_legacy, params: { + project_id: project.id, + sprint_id: sprint.id, + id: story.id, + target_id: "version:#{other_sprint.id}", + position: 1 + }, + format: :turbo_stream expect(response).to be_successful expect(response).to have_http_status :ok @@ -81,14 +81,14 @@ RSpec.describe RbStoriesController do let(:story) { create(:story, status:, version: other_sprint, project:) } it "responds with success", :aggregate_failures do - put :move, params: { - project_id: project.id, - sprint_id: other_sprint.id, - id: story.id, - target_id: sprint.id, - position: 1 - }, - format: :turbo_stream + put :move_legacy, params: { + project_id: project.id, + sprint_id: other_sprint.id, + id: story.id, + target_id: "version:#{sprint.id}", + position: 1 + }, + format: :turbo_stream expect(response).to be_successful expect(response).to have_http_status :ok @@ -117,14 +117,14 @@ RSpec.describe RbStoriesController do end it "renders an error flash with 422", :aggregate_failures do - put :move, params: { - project_id: project.id, - sprint_id: sprint.id, - id: story.id, - target_id: other_sprint.id, - position: 1 - }, - format: :turbo_stream + put :move_legacy, params: { + project_id: project.id, + sprint_id: sprint.id, + id: story.id, + target_id: "version:#{other_sprint.id}", + position: 1 + }, + format: :turbo_stream expect(response).to have_http_status :unprocessable_entity expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" From 549179070047d23f0c112e388e29c091912273ec Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 12 Mar 2026 09:51:13 +0100 Subject: [PATCH 324/334] [#72849] Rename old style sprint to `version_sprint` in spec --- .../controllers/rb_stories_controller_spec.rb | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb b/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb index ba815177e7b..ce988205b3e 100644 --- a/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb @@ -37,9 +37,9 @@ RSpec.describe RbStoriesController do current_user { user } let(:project) { create(:project) } - let(:status) { create(:status, name: "status 1", is_default: true) } - let(:sprint) { create(:sprint, project:) } - let(:story) { create(:story, status:, version: sprint, project:) } + let(:status) { create(:status, name: "status 1", is_default: true) } + let(:version_sprint) { create(:sprint, project:) } + let(:story) { create(:story, status:, version: version_sprint, project:) } before do allow(Setting) @@ -49,27 +49,27 @@ RSpec.describe RbStoriesController do describe "PUT #move_legacy" do context "with a version from the same project" do - let(:other_sprint) { create(:sprint, name: "Sprint 2", project:) } + let(:other_version_sprint) { create(:sprint, name: "Sprint 2", project:) } it "responds with success", :aggregate_failures do put :move_legacy, params: { project_id: project.id, - sprint_id: sprint.id, + sprint_id: version_sprint.id, id: story.id, - target_id: "version:#{other_sprint.id}", + target_id: "version:#{other_version_sprint.id}", position: 1 }, format: :turbo_stream expect(response).to be_successful expect(response).to have_http_status :ok - expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{sprint.id}" - expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{other_sprint.id}" - assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{sprint.id}"][method="morph"]) - assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{other_sprint.id}"][method="morph"]) + expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{version_sprint.id}" + expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{other_version_sprint.id}" + assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{version_sprint.id}"][method="morph"]) + assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{other_version_sprint.id}"][method="morph"]) # rubocop:disable Layout/LineLength expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" expect(assigns(:project)).to eq(project) - expect(assigns(:sprint)).to eq(sprint) + expect(assigns(:sprint)).to eq(version_sprint) expect(assigns(:story)).to eq(story) expect(assigns(:backlog)).to be_a(Backlog) end @@ -77,35 +77,35 @@ RSpec.describe RbStoriesController do context "with a version from another project" do let(:other_project) { create(:project) } - let(:other_sprint) { create(:sprint, name: "Sprint 2", project: other_project, sharing: "system") } - let(:story) { create(:story, status:, version: other_sprint, project:) } + let(:other_version_sprint) { create(:sprint, name: "Sprint 2", project: other_project, sharing: "system") } + let(:story) { create(:story, status:, version: other_version_sprint, project:) } it "responds with success", :aggregate_failures do put :move_legacy, params: { project_id: project.id, - sprint_id: other_sprint.id, + sprint_id: other_version_sprint.id, id: story.id, - target_id: "version:#{sprint.id}", + target_id: "version:#{version_sprint.id}", position: 1 }, format: :turbo_stream expect(response).to be_successful expect(response).to have_http_status :ok - expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{other_sprint.id}" - expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{sprint.id}" - assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{other_sprint.id}"][method="morph"]) - assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{sprint.id}"][method="morph"]) + expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{other_version_sprint.id}" + expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{version_sprint.id}" + assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{other_version_sprint.id}"][method="morph"]) # rubocop:disable Layout/LineLength + assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{version_sprint.id}"][method="morph"]) expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" expect(assigns(:project)).to eq(project) - expect(assigns(:sprint)).to eq(other_sprint) + expect(assigns(:sprint)).to eq(other_version_sprint) expect(assigns(:story)).to eq(story) expect(assigns(:backlog)).to be_a(Backlog) end end context "when service call fails" do - let(:other_sprint) { create(:sprint, name: "Sprint 2", project:) } + let(:other_version_sprint) { create(:sprint, name: "Sprint 2", project:) } let(:service_result) { ServiceResult.failure(message: "Something went wrong") } before do @@ -119,31 +119,31 @@ RSpec.describe RbStoriesController do it "renders an error flash with 422", :aggregate_failures do put :move_legacy, params: { project_id: project.id, - sprint_id: sprint.id, + sprint_id: version_sprint.id, id: story.id, - target_id: "version:#{other_sprint.id}", + target_id: "version:#{other_version_sprint.id}", position: 1 }, format: :turbo_stream expect(response).to have_http_status :unprocessable_entity expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" - expect(response).not_to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{sprint.id}" + expect(response).not_to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{version_sprint.id}" end end end describe "POST #reorder" do it "responds with success", :aggregate_failures do - post :reorder, params: { project_id: project.id, sprint_id: sprint.id, id: story.id, direction: "highest" }, + post :reorder, params: { project_id: project.id, sprint_id: version_sprint.id, id: story.id, direction: "highest" }, format: :turbo_stream expect(response).to be_successful expect(response).to have_http_status :ok - expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{sprint.id}" - assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{sprint.id}"][method="morph"]) + expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{version_sprint.id}" + assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{version_sprint.id}"][method="morph"]) expect(assigns(:project)).to eq(project) - expect(assigns(:sprint)).to eq(sprint) + expect(assigns(:sprint)).to eq(version_sprint) expect(assigns(:story)).to eq(story) expect(assigns(:backlog)).to be_a(Backlog) end @@ -160,12 +160,12 @@ RSpec.describe RbStoriesController do end it "renders an error flash with 422", :aggregate_failures do - post :reorder, params: { project_id: project.id, sprint_id: sprint.id, id: story.id, direction: "highest" }, + post :reorder, params: { project_id: project.id, sprint_id: version_sprint.id, id: story.id, direction: "highest" }, format: :turbo_stream expect(response).to have_http_status :unprocessable_entity expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" - expect(response).not_to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{sprint.id}" + expect(response).not_to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{version_sprint.id}" end end end From 5dc4ccbedd2e9091e1f18fe6b32428bad73edb3f Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Thu, 12 Mar 2026 10:14:45 +0100 Subject: [PATCH 325/334] [#72849] RbStoriesController #move specs --- .../backlogs/patches/version_patch.rb | 2 +- .../controllers/rb_stories_controller_spec.rb | 149 +++++++++++++++++- modules/backlogs/spec/models/version_spec.rb | 89 +++++++++++ 3 files changed, 238 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb index 1cd4fba8a1e..0adb1ee5ad3 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb @@ -42,7 +42,7 @@ module OpenProject::Backlogs::Patches::VersionPatch settings = version_settings&.where(project:)&.first - settings&.display_right? + !!settings&.display_right? end def rebuild_story_positions(project = self.project) diff --git a/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb b/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb index ce988205b3e..da4fafebc37 100644 --- a/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb @@ -41,10 +41,13 @@ RSpec.describe RbStoriesController do let(:version_sprint) { create(:sprint, project:) } let(:story) { create(:story, status:, version: version_sprint, project:) } + # Via this setting, version_sprint is used as backlog: + let!(:version_setting) { create(:version_setting, version: version_sprint, project:, display: VersionSetting::DISPLAY_RIGHT) } + before do allow(Setting) .to receive(:plugin_openproject_backlogs) - .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id }) + .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id }) end describe "PUT #move_legacy" do @@ -104,6 +107,35 @@ RSpec.describe RbStoriesController do end end + context "with an Agile::Sprint as target" do + let(:agile_sprint) { create(:agile_sprint, name: "Agile Sprint 1", project:) } + + it "responds with success and moves story to Agile::Sprint, removing the association to the version", :aggregate_failures do + put :move_legacy, params: { + project_id: project.id, + sprint_id: version_sprint.id, + id: story.id, + target_id: "sprint:#{agile_sprint.id}", + position: 1 + }, + format: :turbo_stream + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{version_sprint.id}" + expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" + assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{version_sprint.id}"][method="morph"]) + assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{agile_sprint.id}"]) + expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" + expect(assigns(:project)).to eq(project) + expect(assigns(:sprint)).to eq(version_sprint) + expect(assigns(:story)).to eq(story) + + # It will remove the association to the version since the version is used as backlog: + expect(story.reload.version).to be_nil + end + end + context "when service call fails" do let(:other_version_sprint) { create(:sprint, name: "Sprint 2", project:) } let(:service_result) { ServiceResult.failure(message: "Something went wrong") } @@ -169,4 +201,119 @@ RSpec.describe RbStoriesController do end end end + + describe "PUT #move" do + let(:agile_sprint) { create(:agile_sprint, name: "Agile Sprint 1", project:) } + let(:story_in_agile_sprint) { create(:work_package, status:, sprint: agile_sprint, project:) } + + context "with another Agile::Sprint as target" do + let(:other_agile_sprint) { create(:agile_sprint, name: "Agile Sprint 2", project:) } + + it "responds with success and moves story to another Agile::Sprint", :aggregate_failures do + put :move, params: { + project_id: project.id, + sprint_id: agile_sprint.id, + id: story_in_agile_sprint.id, + target_id: "sprint:#{other_agile_sprint.id}", + position: 1 + }, + format: :turbo_stream + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" + expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{other_agile_sprint.id}" + assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{agile_sprint.id}"]) + assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{other_agile_sprint.id}"]) + expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" + expect(assigns(:project)).to eq(project) + expect(assigns(:sprint)).to eq(agile_sprint) + expect(assigns(:story)).to eq(story_in_agile_sprint) + end + + context "when the story has a version that is not used as backlog" do + let(:story_in_agile_sprint) { create(:work_package, status:, sprint: agile_sprint, version: version_sprint, project:) } + # Via this setting, version_sprint is NOT used as backlog: + let!(:version_setting) { create(:version_setting, version: version_sprint, project:, display: VersionSetting::DISPLAY_NONE) } + + it "responds with success and moves story to Agile::Sprint, keeping the version", :aggregate_failures do + put :move, params: { + project_id: project.id, + sprint_id: agile_sprint.id, + id: story_in_agile_sprint.id, + target_id: "sprint:#{other_agile_sprint.id}", + position: 1 + }, + format: :turbo_stream + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" + expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{other_agile_sprint.id}" + assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{agile_sprint.id}"]) + assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{other_agile_sprint.id}"]) + expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" + expect(assigns(:project)).to eq(project) + expect(assigns(:sprint)).to eq(agile_sprint) + expect(assigns(:story)).to eq(story_in_agile_sprint) + + # It will preserve the version since it is not used as backlog/sprint. + expect(story_in_agile_sprint.reload.version).to eq(version_sprint) + end + end + end + + context "with a Sprint (Version) as target" do + it "responds with success and moves story to Sprint", :aggregate_failures do + put :move, params: { + project_id: project.id, + sprint_id: agile_sprint.id, + id: story_in_agile_sprint.id, + target_id: "version:#{version_sprint.id}", + position: 1 + }, + format: :turbo_stream + + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" + expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlog-component-#{version_sprint.id}" + assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{agile_sprint.id}"]) + assert_select %(turbo-stream[action="replace"][target="backlogs-backlog-component-#{version_sprint.id}"][method="morph"]) + expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" + expect(assigns(:project)).to eq(project) + expect(assigns(:sprint)).to eq(agile_sprint) + expect(assigns(:story)).to eq(story_in_agile_sprint) + expect(assigns(:backlog)).to be_a(Backlog) + end + end + + context "when service call fails" do + let(:other_agile_sprint) { create(:agile_sprint, name: "Agile Sprint 2", project:) } + let(:service_result) { ServiceResult.failure(message: "Something went wrong") } + + before do + update_service = instance_double(Stories::UpdateService, call: service_result) + + allow(Stories::UpdateService) + .to receive(:new) + .and_return(update_service) + end + + it "renders an error flash with 422", :aggregate_failures do + put :move, params: { + project_id: project.id, + sprint_id: agile_sprint.id, + id: story_in_agile_sprint.id, + target_id: "sprint:#{other_agile_sprint.id}", + position: 1 + }, + format: :turbo_stream + + expect(response).to have_http_status :unprocessable_entity + expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" + expect(response).not_to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" + end + end + end end diff --git a/modules/backlogs/spec/models/version_spec.rb b/modules/backlogs/spec/models/version_spec.rb index bbaa95de5ce..46435be8a20 100644 --- a/modules/backlogs/spec/models/version_spec.rb +++ b/modules/backlogs/spec/models/version_spec.rb @@ -31,6 +31,95 @@ require "spec_helper" RSpec.describe Version do it { is_expected.to have_many :version_settings } + describe "#used_as_backlog?" do + let(:project) { create(:project) } + let(:version) { create(:version, project:) } + + context "when backlogs is not enabled" do + before do + project.enabled_module_names = project.enabled_module_names - ["backlogs"] + end + + it "returns false" do + expect(version.used_as_backlog?(project)).to be false + end + end + + context "when backlogs is enabled" do + before do + project.enabled_module_names = project.enabled_module_names + ["backlogs"] + end + + context "when no version_settings exist" do + it "returns false" do + expect(version.used_as_backlog?(project)).to be false + end + end + + context "when version_settings exist with display_right" do + before do + create(:version_setting, version:, project:, display: VersionSetting::DISPLAY_RIGHT) + end + + it "returns true" do + expect(version.used_as_backlog?(project)).to be true + end + end + + context "when version_settings exist with display_left" do + before do + create(:version_setting, version:, project:, display: VersionSetting::DISPLAY_LEFT) + end + + it "returns false" do + expect(version.used_as_backlog?(project)).to be false + end + end + + context "when version_settings exist with display_none" do + before do + create(:version_setting, version:, project:, display: VersionSetting::DISPLAY_NONE) + end + + it "returns false" do + expect(version.used_as_backlog?(project)).to be false + end + end + + context "when multiple version_settings exist for different projects" do + let(:other_project) { create(:project) } + + before do + project.enabled_module_names = project.enabled_module_names + ["backlogs"] + other_project.enabled_module_names = other_project.enabled_module_names + ["backlogs"] + create(:version_setting, version:, project:, display: VersionSetting::DISPLAY_RIGHT) + create(:version_setting, version:, project: other_project, display: VersionSetting::DISPLAY_LEFT) + end + + it "returns true for the project with display_right" do + expect(version.used_as_backlog?(project)).to be true + end + + it "returns false for the project with display_left" do + expect(version.used_as_backlog?(other_project)).to be false + end + end + + context "when project parameter is not provided" do + context "and version has a project" do + before do + project.enabled_module_names = project.enabled_module_names + ["backlogs"] + create(:version_setting, version:, project:, display: VersionSetting::DISPLAY_RIGHT) + end + + it "uses the version's project" do + expect(version.used_as_backlog?).to be true + end + end + end + end + end + describe "rebuild positions" do def build_work_package(options = {}) build(:work_package, options.reverse_merge(version_id: version.id, From d17a63862733155d759f92fc46ea5a973f86bc0e Mon Sep 17 00:00:00 2001 From: Tobias Dillmann Date: Fri, 13 Mar 2026 15:23:07 +0100 Subject: [PATCH 326/334] [#72849] Refactor `move_story` --- .../app/controllers/rb_stories_controller.rb | 15 ++++++------- .../controllers/rb_stories_controller_spec.rb | 21 ++++++++++++++++++- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/modules/backlogs/app/controllers/rb_stories_controller.rb b/modules/backlogs/app/controllers/rb_stories_controller.rb index e72c11dabc1..c9ab6c288b2 100644 --- a/modules/backlogs/app/controllers/rb_stories_controller.rb +++ b/modules/backlogs/app/controllers/rb_stories_controller.rb @@ -36,7 +36,7 @@ class RbStoriesController < RbApplicationController skip_before_action :load_sprint_and_project, only: NEW_SPRINT_ACTIONS before_action :legacy_load_story, except: NEW_SPRINT_ACTIONS - before_action :load_project, :load_sprint, :load_story, only: NEW_SPRINT_ACTIONS + prepend_before_action :load_sprint, :load_project, :load_story, only: NEW_SPRINT_ACTIONS # Move a story from a Sprint to another Sprint or an Agile::Sprint. def move_legacy @@ -45,7 +45,7 @@ class RbStoriesController < RbApplicationController version_id_was = @story.version_id move_attributes = infer_attributes_from_target - unless move_story(move_attributes) + unless move_story(move_attributes).success? return respond_with_turbo_streams(status: :unprocessable_entity) end @@ -65,7 +65,7 @@ class RbStoriesController < RbApplicationController sprint_id_was = @story.sprint_id move_attributes = infer_attributes_from_target - unless move_story(move_attributes) + unless move_story(move_attributes).success? return respond_with_turbo_streams(status: :unprocessable_entity) end @@ -100,15 +100,16 @@ class RbStoriesController < RbApplicationController def move_story(move_attributes) call = update_story_with_target_and_position(attributes: move_attributes) - unless call.success? + if call.success? + # Update source component so that the moved story disappears + replace_typed_component_via_turbo_stream(sprint: @sprint) + else render_error_flash_message_via_turbo_stream( message: I18n.t(:notice_unsuccessful_update_with_reason, reason: call.message) ) - return false end - # Update source component so that the moved story disappears - replace_typed_component_via_turbo_stream(sprint: @sprint) + call end def update_story_with_target_and_position(attributes:) diff --git a/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb b/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb index da4fafebc37..6fd8581ca2c 100644 --- a/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb @@ -33,9 +33,10 @@ require "rails_helper" RSpec.describe RbStoriesController do shared_let(:type_feature) { create(:type_feature) } shared_let(:type_task) { create(:type_task) } - shared_let(:user) { create(:admin) } + current_user { user } + let(:user) { create(:admin) } let(:project) { create(:project) } let(:status) { create(:status, name: "status 1", is_default: true) } let(:version_sprint) { create(:sprint, project:) } @@ -51,6 +52,24 @@ RSpec.describe RbStoriesController do end describe "PUT #move_legacy" do + context "with a user lacking project permission" do + let(:user) { create(:user) } + + it "responds with 403" do + put :move_legacy, params: { + project_id: project.id, + sprint_id: version_sprint.id, + id: story.id, + target_id: "foo", + position: 1 + }, + format: :turbo_stream + + expect(response).not_to be_successful + expect(response).to have_http_status :not_found + end + end + context "with a version from the same project" do let(:other_version_sprint) { create(:sprint, name: "Sprint 2", project:) } From 8742f150c9f9643922d0449de9c1c893364bfa23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 12:33:57 -0500 Subject: [PATCH 327/334] Bump typescript-eslint from 8.54.0 to 8.56.1 in /frontend (#22344) Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.54.0 to 8.56.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.56.1/packages/typescript-eslint) --- updated-dependencies: - dependency-name: typescript-eslint dependency-version: 8.56.1 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 510 ++++++++++++++++++++----------------- frontend/package.json | 2 +- 2 files changed, 274 insertions(+), 238 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a7f121002f4..2978a88ee46 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -184,7 +184,7 @@ "source-map-explorer": "^2.5.2", "ts-node": "~10.9.2", "typescript": "^5.9.3", - "typescript-eslint": "^8.54.0", + "typescript-eslint": "^8.56.1", "wscat": "^6.1.0" }, "optionalDependencies": { @@ -10283,15 +10283,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", - "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0" + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10301,18 +10301,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/project-service": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", "dev": true, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.54.0", - "@typescript-eslint/types": "^8.54.0", + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", "debug": "^4.4.3" }, "engines": { @@ -10327,13 +10327,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10344,9 +10344,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10360,9 +10360,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10373,17 +10373,17 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", "dev": true, "dependencies": { - "@typescript-eslint/project-service": "8.54.0", - "@typescript-eslint/tsconfig-utils": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" @@ -10400,13 +10400,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.54.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10416,13 +10416,25 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/utils/node_modules/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, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/@typescript-eslint/utils/node_modules/debug": { @@ -10443,27 +10455,27 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/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==", + "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, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -24164,15 +24176,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", - "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.54.0", - "@typescript-eslint/parser": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0" + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24182,21 +24194,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", - "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/type-utils": "8.54.0", - "@typescript-eslint/utils": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -24209,21 +24221,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.54.0", - "eslint": "^8.57.0 || ^9.0.0", + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", - "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3" }, "engines": { @@ -24234,18 +24246,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/project-service": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", "dev": true, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.54.0", - "@typescript-eslint/types": "^8.54.0", + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", "debug": "^4.4.3" }, "engines": { @@ -24260,13 +24272,13 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24277,9 +24289,9 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24293,14 +24305,14 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", - "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -24312,14 +24324,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24330,17 +24342,17 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", "dev": true, "dependencies": { - "@typescript-eslint/project-service": "8.54.0", - "@typescript-eslint/tsconfig-utils": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" @@ -24357,13 +24369,13 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.54.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24373,13 +24385,25 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/typescript-eslint/node_modules/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, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/typescript-eslint/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/typescript-eslint/node_modules/debug": { @@ -24400,12 +24424,12 @@ } }, "node_modules/typescript-eslint/node_modules/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==", + "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, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -24421,15 +24445,15 @@ } }, "node_modules/typescript-eslint/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -32153,84 +32177,90 @@ } }, "@typescript-eslint/utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", - "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0" + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" }, "dependencies": { "@typescript-eslint/project-service": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", "dev": true, "requires": { - "@typescript-eslint/tsconfig-utils": "^8.54.0", - "@typescript-eslint/types": "^8.54.0", + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", "debug": "^4.4.3" } }, "@typescript-eslint/scope-manager": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", "dev": true, "requires": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", "dev": true }, "@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", "dev": true, "requires": { - "@typescript-eslint/project-service": "8.54.0", - "@typescript-eslint/tsconfig-utils": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" } }, "@typescript-eslint/visitor-keys": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", "dev": true, "requires": { - "@typescript-eslint/types": "8.54.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.56.1", + "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": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" } }, "debug": { @@ -32243,18 +32273,18 @@ } }, "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==", + "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": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "requires": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^5.0.2" } } } @@ -41736,126 +41766,132 @@ "dev": true }, "typescript-eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", - "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "8.54.0", - "@typescript-eslint/parser": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0" + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" }, "dependencies": { "@typescript-eslint/eslint-plugin": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", - "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/type-utils": "8.54.0", - "@typescript-eslint/utils": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" } }, "@typescript-eslint/parser": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", - "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3" } }, "@typescript-eslint/project-service": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", "dev": true, "requires": { - "@typescript-eslint/tsconfig-utils": "^8.54.0", - "@typescript-eslint/types": "^8.54.0", + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", "debug": "^4.4.3" } }, "@typescript-eslint/scope-manager": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", "dev": true, "requires": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", "dev": true }, "@typescript-eslint/type-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", - "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", "dev": true, "requires": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" } }, "@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", "dev": true, "requires": { - "@typescript-eslint/project-service": "8.54.0", - "@typescript-eslint/tsconfig-utils": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" } }, "@typescript-eslint/visitor-keys": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", "dev": true, "requires": { - "@typescript-eslint/types": "8.54.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.56.1", + "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": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" } }, "debug": { @@ -41868,9 +41904,9 @@ } }, "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==", + "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": { @@ -41880,12 +41916,12 @@ "dev": true }, "minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "requires": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^5.0.2" } } } diff --git a/frontend/package.json b/frontend/package.json index 59e3e461632..586bb3e5919 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -60,7 +60,7 @@ "source-map-explorer": "^2.5.2", "ts-node": "~10.9.2", "typescript": "^5.9.3", - "typescript-eslint": "^8.54.0", + "typescript-eslint": "^8.56.1", "wscat": "^6.1.0" }, "dependencies": { From 2d16e3175a7ede56bd80a2a50cf308ae0e511a6e Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Sat, 14 Mar 2026 03:48:56 +0000 Subject: [PATCH 328/334] update locales from crowdin [ci skip] --- config/locales/crowdin/fr.seeders.yml | 2 +- config/locales/crowdin/fr.yml | 24 +++++------ .../backlogs/config/locales/crowdin/fr.yml | 40 +++++++++---------- .../storages/config/locales/crowdin/de.yml | 2 +- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/config/locales/crowdin/fr.seeders.yml b/config/locales/crowdin/fr.seeders.yml index b3e98234eb6..f9014f51e5b 100644 --- a/config/locales/crowdin/fr.seeders.yml +++ b/config/locales/crowdin/fr.seeders.yml @@ -154,7 +154,7 @@ fr: 5. *Activez d'autres modules* : → Accédez à [Paramètres du projet → Modules]({{opSetting:base_url}}/projects/demo-project/settings/modules). 6. *Complétez vos tâches dans le projet* : → Accédez à [Lots de travaux → Tâches]({{opSetting:base_url}}/projects/demo-project/work_packages/details/##wp.id:set_date_and_location_of_conference/overview?query_id=##query.id:demo_project__query__tasks). - Vous trouverez ici nos [Guides de l'utilisateur] (https://www.openproject.org/docs/user-guide/). + Vous trouverez ici nos [Guides de l'utilisateur](https://www.openproject.org/docs/user-guide/). Si vous avez des questions ou si avez besoin d'aide, n'hésitez pas à nous contacter : [support[at]openproject.com](mailto:support@openproject.com). item_5: options: diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 798852086ea..ea7d51dbfec 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -185,8 +185,8 @@ fr: imported: "Mode révision" reverting: "Rétablissement en cours" revert_error: "Erreur lors de la restauration" - revert_cancelling: "Cancelling revert" - revert_cancelled: "Revert cancelled" + revert_cancelling: "Annulation de la réversion" + revert_cancelled: "Annulation de l'annulation" reverted: "Restauré" finalizing: "Finalisation" finalizing_error: "Erreur lors de la finalisation" @@ -615,13 +615,13 @@ fr: op_dry_validation: or: "ou" errors: - unexpected_key: "is not allowed." + unexpected_key: "n'est pas autorisé." array?: "doit être un tableau." decimal?: "doit être une décimale." defined: "ne doit pas être défini." eql?: "doit être égal à %{left}." filled?: "doit être rempli." - format?: "is in invalid format." + format?: "est dans un format non valide." greater_or_equal_zero: "doit être supérieur ou égal à 0." gteq?: "doit être supérieur ou égal à %{num}." hash?: "doit être un hachage." @@ -648,9 +648,9 @@ fr: parent: not_descendant: "doit être un descendant de la racine de la hiérarchie." str?: "doit être une chaîne de caractères." - time?: "must be a time." + time?: "doit être un moment." type?: "doit être de type : %{type}." - uri?: "is not a valid URI." + uri?: "n’est pas une URL valide." rules: copy_workflow_from: "Type de copie du flux de travail" enabled: "Activé" @@ -1035,7 +1035,7 @@ fr: no_results_user: "Aucun utilisateur n'a été trouvé" invite_user: "Invité :" no_results_placeholder: "Aucun utilisateur fictif n'a été trouvé" - create_new_placeholder: "Créer un nouveau utilisateur fictif :" + create_new_placeholder: "Créer un nouvel utilisateur fictif :" no_results_group: "Aucun groupe n'a été trouvé" invite_to_project: "Inviter à rejoindre %{project_name}" required: @@ -4998,7 +4998,7 @@ fr: text_default_administrator_account_changed: "Le compte administrateur par défaut a été changé" text_default_encoding: "Défaut: UTF-8" text_destroy: "Supprimer" - text_destroy_with_associated: "There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:" + text_destroy_with_associated: "Il y a des objets supplémentaires associés à ce(s) lot(s) de travaux qui doivent être supprimés. Ces objets sont des types suivants :" text_destroy_what_to_do: "Que voulez-vous faire?" text_diff_truncated: "... Cette « diff » a été tronquée car elle dépasse la taille maximale d'affichage." text_email_delivery_not_configured: "L'envoi d'e-mails n'est pas configuré et les notifications sont désactivées.\nConfigurer votre serveur SMTP pour les activer." @@ -5044,7 +5044,7 @@ fr: text_notice_too_many_values_are_inperformant: "Remarque : L'affichage de plus de 100 articles par page peut augmenter le temps de chargement de la page." text_notice_security_badge_displayed_html: > Remarque : si cette option est activée, un badge indiquant l'état de votre installation s'affichera dans le panneau %{information_panel_label} administration et sur la page d'accueil. Il n'est affiché que pour les administrateurs.
Le badge vérifiera votre version actuelle d'OpenProject par rapport à la base de données officielle d'OpenProject pour vous avertir de toute mise à jour ou vulnérabilité connue. Pour plus d'informations sur ce que la vérification fournit, quelles données sont nécessaires pour fournir les mises à jour disponibles, et comment désactiver cette vérification, veuillez visiter la documentation de configuration. - text_own_membership_delete_confirmation: "Vous êtes sur le point de retirer tout ou partie de vos permissions et ne pourrez peut-être plus modifier le projet par la suite.\nÊtes vous sûr de vouloir continuer?" + text_own_membership_delete_confirmation: "Vous êtes sur le point de retirer tout ou partie de vos permissions et ne pourrez peut-être plus modifier le projet par la suite.\nVoulez-vous vraiment continuer?" text_permanent_delete_confirmation_checkbox_label: "Je comprends que cette suppression ne peut pas être annulée" text_permanent_remove_confirmation_checkbox_label: "Je comprends que cette suppression ne peut pas être annulée" text_plugin_assets_writable: "Répertoire des « plugin assets » est accessible en écriture" @@ -5066,7 +5066,7 @@ fr: text_wrote: "a écrit" text_warn_on_leaving_unsaved: "Le lot de travaux contient du texte non sauvegardé qui sera perdu si vous quittez cette page." text_what_did_you_change_click_to_add_comment: "Qu’avez-vous changé ? Cliquez ici pour ajouter un commentaire" - text_wiki_destroy_confirmation: "Êtes vous sur de vouloir supprimer ce wiki et tout son contenu?" + text_wiki_destroy_confirmation: "Voulez-vous vraiment supprimer ce wiki et tout son contenu?" text_wiki_page_destroy_children: "Supprimer les pages enfants et toute leur descendance" text_wiki_page_destroy_question: "Cette page possède %{descendants} page(s) enfant et descendant(s). Que voulez vous faire?" text_wiki_page_nullify_children: "Garder les pages enfants en tant que pages d'origine" @@ -5123,7 +5123,7 @@ fr: all: "tous" active: "actif" activate: "Activer" - activate_and_reset_failed_logins: "Activer et réinitialiser les connexions echouées" + activate_and_reset_failed_logins: "Activer et réinitialiser les connexions échouées" authentication_provider: "Fournisseur d'authentification" identity_url_text: "L'identifiant unique interne fourni par le fournisseur d'authentification." authentication_settings_disabled_due_to_external_authentication: > @@ -5146,7 +5146,7 @@ fr: no_login: "Cet utilisateur s'authentifie avec un mot de passe. Tant que cela est désactivé, il ne peut s'authentifier." password_change_unsupported: Le changement de mot de passe n'est pas supporté. registered: "enregistré" - reset_failed_logins: "Réinitialiser les connexions echouées" + reset_failed_logins: "Réinitialiser les connexions échouées" status_user_and_brute_force: "%{user} et %{brute_force}" status_change: "Changement de statut" text_change_disabled_for_provider_login: "Le nom et l'adresse électronique sont définis par votre fournisseur d'accès et ne peuvent donc pas être modifiés." diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index 717a7186dc2..14b3d5ce931 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -32,7 +32,7 @@ fr: name: "Nom du sprint" sharing: "Partage" project: - sprint_sharing: "Sprint sharing" + sprint_sharing: "Partage de sprint" sprint: duration: "Durée du sprint" work_package: @@ -44,8 +44,8 @@ fr: project: attributes: sprint_sharing: - share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." - share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." + share_all_projects_already_taken: "ne peut pas être défini car le projet \"%{name}\" est déjà partagé avec tous les projets." + share_all_projects_already_taken_anonymous: "ne peut pas être défini parce qu'un autre projet est déjà partagé avec tous les projets." work_package: attributes: blocks_ids: @@ -63,10 +63,10 @@ fr: any: "tout" column_width: "Largeur de colonne" definition_of_done: "Définition de Fait" - definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting." - done_status: "Done status" - sharing_description: "This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing)." - sharing: "Sharing" + definition_of_done_caption: "Les work packages ayant ces statuts sont traités comme terminés dans les vues du carnet de commandes et dans les rapports." + done_status: "État terminé" + sharing_description: "Ce projet peut soit partager ses propres sprints, soit recevoir des sprints partagés, soit gérer les sprints de manière indépendante (sans partage)." + sharing: "Partage" impediment: "Obstacle" label_versions_default_fold_state: "Afficher les versions de manière repliée" caption_versions_default_fold_state: "Les versions ne seront pas développées par défaut lors de l'affichage des backlogs. Chacune devra être développée manuellement." @@ -173,22 +173,22 @@ fr: backlog_sharing: options: no_sharing: - label: "Don't share" - caption: "Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects." + label: "Ne pas partager" + caption: "Les sprints créés dans ce projet ne seront disponibles et visibles que pour ce projet. Ils ne seront pas non plus visibles par les sous-projets." receive_shared: - label: "Receive shared sprints" - caption: "This project can only use sprints shared by other projects." - warning: "This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible." + label: "Recevoir des sprints partagés" + caption: "Ce projet ne peut utiliser que des sprints partagés par d'autres projets." + warning: "Ce projet ne peut utiliser que des sprints partagés par d'autres projets. Les sprints inutilisés créés dans ce projet par le passé ne seront plus visibles." share_all_projects: - label: "All projects" - caption: "Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects." - disabled_caption: "Option not available since project \"%{name}\" is currently sharing with all projects and only one project can do this." - disabled_caption_anonymous: "Option not available since another project is currently sharing with all projects and only one project can do this." + label: "Tous les projets" + caption: "Les sprints créés dans ce projet seront disponibles pour tous les projets de cette instance. Si vous sélectionnez cette option, les sprints ne seront plus disponibles pour les autres projets." + disabled_caption: "L'option n'est pas disponible car le projet \"%{name}\" est actuellement partagé avec tous les projets et seul un projet peut le faire." + disabled_caption_anonymous: "Option non disponible car un autre projet est actuellement en train de partager avec tous les projets et seul un projet peut le faire." share_subprojects: - label: "Subprojects" - caption: "Sprints created in this project will be available to all subprojects of the current project." - info: "Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints." - sprint_sharing: Share sprints + label: "Sous-projets" + caption: "Les sprints créés dans ce projet seront disponibles pour tous les sous-projets du projet en cours." + info: "Le partage d'un sprint entraîne le partage du nom, du statut et des dates de début et de fin dans tous les projets. Ceux-ci ne peuvent pas être modifiés dans les projets qui reçoivent et utilisent ces sprints." + sprint_sharing: Partager les sprints rb_burndown_charts: show: blankslate_title: "Aucune donnée disponible sur le burndown" diff --git a/modules/storages/config/locales/crowdin/de.yml b/modules/storages/config/locales/crowdin/de.yml index 6e08bfba5e4..e15f8ff11e6 100644 --- a/modules/storages/config/locales/crowdin/de.yml +++ b/modules/storages/config/locales/crowdin/de.yml @@ -372,7 +372,7 @@ de: failure: Einige Überprüfungen sind fehlgeschlagen und das System funktioniert nicht wie erwartet. success: Alle Verbindungen und Systeme funktionieren wie erwartet. warning: Einige Überprüfungen ergaben eine Warnung. Dies kann zu unerwartetem Verhalten führen. - synced: 'Last sync: %{datetime}' + synced: 'Zuletzt aktualisiert: %{datetime}' title: Gesundheitsstatusbericht health_email_notifications: description_disabled: Administrator:innen erhalten keine E-Mail-Updates, wenn es wichtige Änderungen gibt. From 08a38844e5fc047a20734ac51202d272950ffc27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 14 Mar 2026 10:54:26 -0700 Subject: [PATCH 329/334] Bump undici from 6.23.0 to 6.24.1 (#22352) Bumps [undici](https://github.com/nodejs/undici) from 6.23.0 to 6.24.1. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v6.23.0...v6.24.1) --- updated-dependencies: - dependency-name: undici dependency-version: 6.24.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd5b9d00cbb..451db8f1fe3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2428,11 +2428,10 @@ } }, "node_modules/undici": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz", + "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.17" } From 26293063712e7f94c4faeaf99d0c2dbd73def580 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Mon, 16 Mar 2026 04:02:53 +0000 Subject: [PATCH 330/334] update locales from crowdin [ci skip] --- modules/storages/config/locales/crowdin/fr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/storages/config/locales/crowdin/fr.yml b/modules/storages/config/locales/crowdin/fr.yml index 3fdb56da991..67723cacaca 100644 --- a/modules/storages/config/locales/crowdin/fr.yml +++ b/modules/storages/config/locales/crowdin/fr.yml @@ -372,7 +372,7 @@ fr: failure: Certaines vérifications ont échoué et le système ne fonctionne pas comme prévu. success: Toutes les connexions et les systèmes fonctionnent comme prévu. warning: Certaines vérifications ont renvoyé un avertissement. Cela peut entraîner un comportement inattendu. - synced: 'Last sync: %{datetime}' + synced: 'Dernière synchronisation : %{datetime}' title: Rapport sur l'état de santé health_email_notifications: description_disabled: Les administrateurs ne recevront pas de mises à jour par e-mail lors des mises à jour importantes. From d77ebe8d50a710ec46a29a55fea5ef339ff9d9bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 05:41:54 +0000 Subject: [PATCH 331/334] Bump actions/create-github-app-token from 2 to 3 Bumps [actions/create-github-app-token](https://github.com/actions/create-github-app-token) from 2 to 3. - [Release notes](https://github.com/actions/create-github-app-token/releases) - [Commits](https://github.com/actions/create-github-app-token/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/create-github-app-token dependency-version: '3' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/hocuspocus-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/hocuspocus-docker.yml b/.github/workflows/hocuspocus-docker.yml index 2ac162061b1..27b93b9d085 100644 --- a/.github/workflows/hocuspocus-docker.yml +++ b/.github/workflows/hocuspocus-docker.yml @@ -112,7 +112,7 @@ jobs: - name: Generate GHA token id: generate-gha-token - uses: actions/create-github-app-token@v2 + uses: actions/create-github-app-token@v3 with: app-id: ${{ vars.DEPLOY_APP_ID }} private-key: ${{ secrets.DEPLOY_APP_PRIVATE_KEY }} From 2c4adb8a0ad8c792948597cc6c905492ce055313 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Fri, 13 Mar 2026 14:03:09 +0100 Subject: [PATCH 332/334] Add special class to move things to the right on mobile The previous behaviour of op-app-header--center was to not be centered on mobile, but be right-aligned. This was confusing and also led to undesired behaviour in the logo_only layout, where the logo moved to the right unexpectedly. The behaviour was originally intended for the search bar in the base layout. To make the behaviour more clear, a new op-app-header--center_mobile-right was introduced, making it clear that the behaviour of the box in the base layout is to be centered normally, but right aligned on mobile. --- app/views/layouts/base.html.erb | 2 +- frontend/src/global_styles/common/header/app-header.sass | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/base.html.erb b/app/views/layouts/base.html.erb index 96f97626981..4ccba595b04 100644 --- a/app/views/layouts/base.html.erb +++ b/app/views/layouts/base.html.erb @@ -74,7 +74,7 @@ See COPYRIGHT and LICENSE files for more details. <%= render_top_menu_left %>
-
+
<%= render_top_menu_center %>
diff --git a/frontend/src/global_styles/common/header/app-header.sass b/frontend/src/global_styles/common/header/app-header.sass index c93df1a4edb..789b3052e0a 100644 --- a/frontend/src/global_styles/common/header/app-header.sass +++ b/frontend/src/global_styles/common/header/app-header.sass @@ -45,6 +45,7 @@ grid-area: center justify-content: center + &--center_mobile-end @media screen and (max-width: $breakpoint-md) justify-content: flex-end From 6ddaee31b82c556504ef88eff1b6e40efcd3dfa2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 05:41:58 +0000 Subject: [PATCH 333/334] Bump dawidd6/action-send-mail from 11 to 15 Bumps [dawidd6/action-send-mail](https://github.com/dawidd6/action-send-mail) from 11 to 15. - [Release notes](https://github.com/dawidd6/action-send-mail/releases) - [Commits](https://github.com/dawidd6/action-send-mail/compare/v11...v15) --- updated-dependencies: - dependency-name: dawidd6/action-send-mail dependency-version: '15' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/email-notification.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/email-notification.yml b/.github/workflows/email-notification.yml index 0f2d3cb0b9c..b4c532c89f6 100644 --- a/.github/workflows/email-notification.yml +++ b/.github/workflows/email-notification.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Send mail - uses: dawidd6/action-send-mail@v11 + uses: dawidd6/action-send-mail@v15 with: subject: ${{ inputs.subject }} body: ${{ inputs.body }} From 073305f00d29af173c94f08b536e6f0029e207cb Mon Sep 17 00:00:00 2001 From: Klaus Zanders Date: Mon, 16 Mar 2026 12:13:57 +0100 Subject: [PATCH 334/334] Fix repositories spec --- spec/controllers/repositories_controller_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/controllers/repositories_controller_spec.rb b/spec/controllers/repositories_controller_spec.rb index cab6ce08d3a..01267fdeac2 100644 --- a/spec/controllers/repositories_controller_spec.rb +++ b/spec/controllers/repositories_controller_spec.rb @@ -288,7 +288,7 @@ RSpec.describe RepositoriesController do end describe "#entry" do - let(:role) { create(:project_role, permissions: [:browse_repository]) } + let(:permissions) { [:browse_repository] } it "serves raw files as application/octet-stream attachment" do get :entry, params: { project_id: project.identifier, repo_path: "subversion_test/textfile.txt", format: "raw" }