diff --git a/Gemfile.lock b/Gemfile.lock index 84538cb351d1..fa36feac69ac 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -344,7 +344,7 @@ GEM awesome_nested_set (3.7.0) activerecord (>= 4.0.0, < 8.0) aws-eventstream (1.3.0) - aws-partitions (1.1013.0) + aws-partitions (1.1015.0) aws-sdk-core (3.214.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -353,7 +353,7 @@ GEM aws-sdk-kms (1.96.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.174.0) + aws-sdk-s3 (1.175.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -652,7 +652,7 @@ GEM http-2 (1.0.2) http_parser.rb (0.6.0) httpclient (2.8.3) - httpx (1.3.3) + httpx (1.3.4) http-2 (>= 1.0.0) i18n (1.14.6) concurrent-ruby (~> 1.0) @@ -962,7 +962,7 @@ GEM rbtree3 (0.7.1) rdoc (6.8.1) psych (>= 4.0.0) - recaptcha (5.17.0) + recaptcha (5.17.1) redcarpet (3.6.0) redis (5.3.0) redis-client (>= 0.22.0) @@ -1067,7 +1067,7 @@ GEM securerandom (0.3.2) selenium-devtools (0.131.0) selenium-webdriver (~> 4.2) - selenium-webdriver (4.26.0) + selenium-webdriver (4.27.0) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) diff --git a/app/components/admin/custom_fields/custom_field_projects/new_custom_field_projects_form_modal_component.html.erb b/app/components/admin/custom_fields/custom_field_projects/new_custom_field_projects_form_modal_component.html.erb index a7596230ea1c..3950d4e83b5b 100644 --- a/app/components/admin/custom_fields/custom_field_projects/new_custom_field_projects_form_modal_component.html.erb +++ b/app/components/admin/custom_fields/custom_field_projects/new_custom_field_projects_form_modal_component.html.erb @@ -37,7 +37,7 @@ See COPYRIGHT and LICENSE files for more details. ) do |form| concat(render(Primer::Alpha::Dialog::Body.new( id: dialog_body_id, test_selector: dialog_body_id, aria: { label: title }, - style: "min-height: 300px" + classes: "Overlay-body_autocomplete_height" )) do render(Projects::CustomFields::CustomFieldMappingForm.new(form, project_mapping: @custom_field_project_mapping)) end) diff --git a/app/components/work_package_relations_tab/add_work_package_child_form_component.html.erb b/app/components/work_package_relations_tab/add_work_package_child_form_component.html.erb index affa7550c3ea..17142756557b 100644 --- a/app/components/work_package_relations_tab/add_work_package_child_form_component.html.erb +++ b/app/components/work_package_relations_tab/add_work_package_child_form_component.html.erb @@ -25,7 +25,7 @@ resource: 'work_packages', searchKey: 'subjectOrId', openDirectly: false, - focusDirectly: false, + focusDirectly: true, dropdownPosition: 'bottom', appendTo: "##{DIALOG_ID}", data: { test_selector: ID_FIELD_TEST_SELECTOR } diff --git a/app/components/work_package_relations_tab/index_component.html.erb b/app/components/work_package_relations_tab/index_component.html.erb index 804d2da67809..e78e21510bbf 100644 --- a/app/components/work_package_relations_tab/index_component.html.erb +++ b/app/components/work_package_relations_tab/index_component.html.erb @@ -1,15 +1,15 @@ <%= component_wrapper(tag: "turbo-frame") do %> <%= if should_render_create_button? - flex_layout(justify_content: :space_between, mb: 4) do |action_bar| - action_bar.with_column do + flex_layout(justify_content: :space_between, align_items: :center, mb: 4) do |action_bar| + action_bar.with_column(pr: 1) do render(Primer::Beta::Text.new(color: :muted)) do t("#{I18N_NAMESPACE}.index.action_bar_title") end end # Prevent the menu from overflowing on Safari - action_bar.with_column(flex_shrink: 0) do + action_bar.with_column(flex_shrink: 0, ml: 2) do render(Primer::Alpha::ActionMenu.new(test_selector: NEW_RELATION_ACTION_MENU, menu_id: NEW_RELATION_ACTION_MENU)) do |menu| menu.with_show_button do |button| diff --git a/app/components/work_package_relations_tab/index_component.rb b/app/components/work_package_relations_tab/index_component.rb index f96171becfb1..083455043601 100644 --- a/app/components/work_package_relations_tab/index_component.rb +++ b/app/components/work_package_relations_tab/index_component.rb @@ -61,7 +61,7 @@ def render_relation_group(title:, relation_type:, items:, &_block) end items.each do |item| - border_box.with_row(py: 3, test_selector: row_test_selector(item)) do + border_box.with_row(test_selector: row_test_selector(item)) do yield(item) end end diff --git a/app/components/work_package_relations_tab/index_component.sass b/app/components/work_package_relations_tab/index_component.sass index 853f0f9a520f..32a1e670cced 100644 --- a/app/components/work_package_relations_tab/index_component.sass +++ b/app/components/work_package_relations_tab/index_component.sass @@ -1,5 +1,5 @@ // We reference an ID as one is required to be specified for the action menu list. // It can't be nested inside the BEM model as it's placed as a #top-layer element. #new-relation-action-menu-list - max-height: 380px + max-height: 450px max-width: 280px diff --git a/app/components/work_package_relations_tab/relation_component.html.erb b/app/components/work_package_relations_tab/relation_component.html.erb index 2c2dc4acf5dd..12788bdb76d0 100644 --- a/app/components/work_package_relations_tab/relation_component.html.erb +++ b/app/components/work_package_relations_tab/relation_component.html.erb @@ -1,21 +1,12 @@ <%= flex_layout do |flex| - flex.with_row do - render(WorkPackages::InfoLineComponent.new(work_package: related_work_package)) - end - - flex.with_row(flex_layout: true, justify_content: :space_between, align_items: :flex_start) do |subject_line_row| - subject_line_row.with_column(py: 2) do - render(Primer::Beta::Link.new(href: work_package_path(related_work_package), - color: :default, - underline: false, - font_size: :normal, - font_weight: :bold, - target: "_blank")) { related_work_package.subject } + flex.with_row(flex_layout: true, justify_content: :space_between, align_items: :center) do |row| + row.with_column do + render(WorkPackages::InfoLineComponent.new(work_package: related_work_package)) end if should_render_action_menu? - subject_line_row.with_column do + row.with_column do render(Primer::Alpha::ActionMenu.new(test_selector: action_menu_test_selector)) do |menu| menu.with_show_button(icon: "kebab-horizontal", "aria-label": I18n.t(:label_relation_actions), @@ -52,16 +43,23 @@ flex_layout do |flex| end end + flex.with_row(mb: 2) do + render(Primer::Beta::Link.new(href: work_package_path(related_work_package), + color: :default, + underline: false, + font_size: :normal, + font_weight: :bold, + target: "_blank")) { related_work_package.subject } + end + if should_display_description? - flex.with_row(flex_layout: true, mb: 2) do |description_row| - description_row.with_column do - render(Primer::Beta::Text.new(font_size: :small, color: :muted)) { format_text(relation, :description) } - end + flex.with_row(mb: 2) do + render(Primer::Beta::Text.new(font_size: :small, color: :muted)) { format_text(relation, :description) } end end if should_display_start_and_end_dates? - flex.with_row(flex_layout: true, align_items: :center) do |start_and_end_dates_row| + flex.with_row(flex_layout: true, align_items: :center, mb: 2) do |start_and_end_dates_row| start_and_end_dates_row.with_column(mr: 1) do icon = if follows? :calendar diff --git a/app/components/work_package_relations_tab/work_package_relation_form_component.html.erb b/app/components/work_package_relations_tab/work_package_relation_form_component.html.erb index ea3d88f96afe..0a6f63688a42 100644 --- a/app/components/work_package_relations_tab/work_package_relation_form_component.html.erb +++ b/app/components/work_package_relations_tab/work_package_relation_form_component.html.erb @@ -45,7 +45,7 @@ url:, relations: true, # Activates relations fetch mode in the autocomplete openDirectly: false, - focusDirectly: false, + focusDirectly: true, dropdownPosition: 'bottom', appendTo: "##{DIALOG_ID}", data: { test_selector: TO_ID_FIELD_TEST_SELECTOR} @@ -56,6 +56,7 @@ my_form.text_field( name: :description, label: Relation.human_attribute_name(:description), + autofocus: relation.persisted? ) end end diff --git a/app/components/work_package_relations_tab/work_package_relation_form_component.rb b/app/components/work_package_relations_tab/work_package_relation_form_component.rb index 7dd778e13ac7..938ce175ddf6 100644 --- a/app/components/work_package_relations_tab/work_package_relation_form_component.rb +++ b/app/components/work_package_relations_tab/work_package_relation_form_component.rb @@ -47,7 +47,12 @@ def initialize(work_package:, relation:, base_errors: nil) end def related_work_package - @related_work_package ||= @relation.to + @related_work_package ||= begin + related = @relation.to + # We cannot rely on the related WorkPackage being the "to", + # depending on the relation it can also be "from" + related.id == @work_package.id ? @relation.from : related + end end def submit_url_options diff --git a/app/forms/custom_fields/hierarchy/item_form.rb b/app/forms/custom_fields/hierarchy/item_form.rb index 96f66e73aa73..50f9d41e8529 100644 --- a/app/forms/custom_fields/hierarchy/item_form.rb +++ b/app/forms/custom_fields/hierarchy/item_form.rb @@ -39,6 +39,7 @@ class ItemForm < ApplicationForm value: @target_item.label, visually_hide_label: true, required: true, + autofocus: true, placeholder: I18n.t("custom_fields.admin.items.placeholder.label"), validation_message: validation_message_for(:label) ) diff --git a/app/forms/projects/custom_fields/custom_field_mapping_form.rb b/app/forms/projects/custom_fields/custom_field_mapping_form.rb index f637ea059934..1a3f71f3dbe6 100644 --- a/app/forms/projects/custom_fields/custom_field_mapping_form.rb +++ b/app/forms/projects/custom_fields/custom_field_mapping_form.rb @@ -31,8 +31,7 @@ class CustomFieldMappingForm < ApplicationForm include OpPrimer::ComponentHelpers form do |form| - form.group(layout: :vertical) do |group| - group.project_autocompleter( + form.project_autocompleter( name: :id, label: Project.model_name.human, visually_hide_label: true, @@ -48,13 +47,12 @@ class CustomFieldMappingForm < ApplicationForm } ) - group.check_box( + form.check_box( name: :include_sub_projects, label: I18n.t(:label_include_sub_projects), checked: false, label_arguments: { class: "no-wrap" } ) - end end def initialize(project_mapping:) diff --git a/app/helpers/custom_fields_helper.rb b/app/helpers/custom_fields_helper.rb index 9a7607bb245a..1c9d15ae2087 100644 --- a/app/helpers/custom_fields_helper.rb +++ b/app/helpers/custom_fields_helper.rb @@ -172,6 +172,19 @@ def custom_field_tag_for_bulk_edit(name, custom_field, project = nil) # rubocop: options_for_select(base_options + custom_field.possible_values_options(project)), id: field_id, multiple: custom_field.multi_value?) + when "hierarchy" + base_options = [[I18n.t(:label_no_change_option), ""]] + result = CustomFields::Hierarchy::HierarchicalItemService.new + .get_descendants(item: custom_field.hierarchy_root, include_self: false) + .either( + ->(items) { items }, + ->(_) { [] } + ) + options = base_options + result.map do |item| + label = item.short.present? ? "#{item.label} (#{item.short})" : item.label + [label, item.id] + end + styled_select_tag(field_name, options_for_select(options), id: field_id, multiple: custom_field.multi_value?) else styled_text_field_tag(field_name, "", id: field_id) end diff --git a/app/models/custom_actions/actions/custom_field.rb b/app/models/custom_actions/actions/custom_field.rb index c1b0a82eba89..374b3406218a 100644 --- a/app/models/custom_actions/actions/custom_field.rb +++ b/app/models/custom_actions/actions/custom_field.rb @@ -49,7 +49,7 @@ def apply(work_package) def self.all WorkPackageCustomField - .order(:name) + .usable_as_custom_action .map do |cf| create_subclass(cf) end diff --git a/app/models/custom_field/order_statements.rb b/app/models/custom_field/order_statements.rb index 86984954feea..0e4da57f8f52 100644 --- a/app/models/custom_field/order_statements.rb +++ b/app/models/custom_field/order_statements.rb @@ -31,7 +31,7 @@ module CustomField::OrderStatements # value of the custom field. def order_statement case field_format - when "string", "date", "bool", "link", "int", "float", "list", "user", "version" + when "string", "date", "bool", "link", "int", "float", "list", "user", "version", "hierarchy" "cf_order_#{id}.value" end end @@ -52,6 +52,8 @@ def order_join_statement join_for_order_by_user_sql when "version" join_for_order_by_version_sql + when "hierarchy" + join_for_order_by_hierarchy_sql end end @@ -167,4 +169,9 @@ def join_for_order_by_version_sql multi_value: ) end + + def join_for_order_by_hierarchy_sql + table_name = CustomField::Hierarchy::Item.quoted_table_name + join_for_order_sql(value: "item.label", join: "INNER JOIN #{table_name} item ON item.id = cv.value::bigint") + end end diff --git a/app/models/work_package_custom_field.rb b/app/models/work_package_custom_field.rb index 1b1a68fe5bc8..0c1776abe2ad 100644 --- a/app/models/work_package_custom_field.rb +++ b/app/models/work_package_custom_field.rb @@ -49,6 +49,11 @@ class WorkPackageCustomField < CustomField end } + scope :usable_as_custom_action, -> { + where.not(field_format: %w[hierarchy]) + order(:name) + } + def self.summable where(field_format: %w[int float]) end diff --git a/app/services/custom_fields/hierarchy/hierarchical_item_service.rb b/app/services/custom_fields/hierarchy/hierarchical_item_service.rb index 415caf1ed0cc..8d9421054652 100644 --- a/app/services/custom_fields/hierarchy/hierarchical_item_service.rb +++ b/app/services/custom_fields/hierarchy/hierarchical_item_service.rb @@ -90,9 +90,14 @@ def get_branch(item:) # Gets all descendant nodes in a tree starting from the item/node. # @param item [CustomField::Hierarchy::Item] the node + # @param include_self [Boolean] flag # @return [Success(Array)] - def get_descendants(item:) - Success(item.self_and_descendants) + def get_descendants(item:, include_self: true) + if include_self + Success(item.self_and_descendants) + else + Success(item.descendants) + end end # Move an item/node to a new parent item/node diff --git a/config/locales/crowdin/de.seeders.yml b/config/locales/crowdin/de.seeders.yml index cef9f2fbc031..eb4a94235c39 100644 --- a/config/locales/crowdin/de.seeders.yml +++ b/config/locales/crowdin/de.seeders.yml @@ -38,13 +38,13 @@ de: item_0: name: PM2 Orange item_1: - name: PM2 Purple + name: PM2 Lila item_2: - name: PM2 Red + name: PM2 Rot item_3: - name: PM2 Magenta + name: PM2 Rosa item_4: - name: PM2 Green Yellow + name: PM2 Grüngelb document_categories: item_0: name: Dokumentation @@ -83,19 +83,19 @@ de: standard: life_cycles: item_0: - name: Initiating + name: Initiierung item_1: - name: Ready for Planning + name: Bereit für Planung item_2: - name: Planning + name: Planung item_3: - name: Ready for Executing + name: Bereit für Durchführung item_4: - name: Executing + name: Durchführung item_5: - name: Ready for Closing + name: Bereit für Abschluss item_6: - name: Closing + name: Abschluss priorities: item_0: name: Niedrig diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index ebacf2fbe7f4..f0ce8b5fb5d6 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -33,7 +33,7 @@ de: label_activity_show_only_changes: "Nur Änderungen anzeigen" label_sort_asc: "Neueste unten" label_sort_desc: "Neueste oben" - label_type_to_comment: "Add a comment. Type @ to notify people." + label_type_to_comment: "Einen Kommentar hinzufügen. @ tippen, um Personen zu benachrichtigen." label_submit_comment: "Kommentar absenden" changed_on: "geändert am" created_on: "erstellte dies am" @@ -237,7 +237,7 @@ de: one: 1 Unterelement other: "%{count} Unterelemente" upsale: - custom_field_format_hierarchy: "Need a hierarchy in your custom fields for work packages?" + custom_field_format_hierarchy: "Benötigen Sie eine Hierarchie in den benutzerdefinierten Feldern ihrer Arbeitspakete?" 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" @@ -270,20 +270,20 @@ de: not_found: "nicht gefunden." rules: item: - root_item: "cannot be a root item." + root_item: "kann keine Hierarchiewurzel sein." not_persisted: "muss ein bereits vorhandenes Element sein." label: not_unique: "muss innerhalb der gleichen Hierarchieebene eindeutig sein." short: not_unique: "muss innerhalb der gleichen Hierarchieebene eindeutig sein." parent: - not_descendant: "must be a descendant of the hierarchy root." + not_descendant: "muss ein Abkömmling der Hierarchiewurzel sein." rules: depth: "Tiefe" item: "Element" label: "Bezeichnung" short: "Kurzname" - parent: "Parent" + parent: "Übergeordnetes Arbeitspaket" global_search: placeholder: "Suche in %{app_title}" overwritten_tabs: @@ -629,64 +629,64 @@ de: no_results_title_text: Derzeit sind keine Versionen verfügbar. work_package_relations_tab: index: - action_bar_title: "Add relations to other work packages to create a link between them." - no_results_title_text: There are currently no relations available. - blankslate_heading: "No relations" - blankslate_description: "This work package does not have any relations yet." - label_add_x: "Add %{x}" - label_edit_x: "Edit %{x}" - label_add_description: "Add description" + 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_x: "%{x} hinzufügen" + label_edit_x: "%{x} editieren" + label_add_description: "Beschreibung hinzufügen" relations: - label_relates_singular: "related to" - label_relates_plural: "related to" - label_relates_to_singular: "related to" - label_relates_to_plural: "related to" - relates_description: "Creates a visible link between the two work packages with no additional effect" - relates_to_description: "Creates a visible link between the two work packages with no additional effect" - label_precedes_singular: "successor (after)" - label_precedes_plural: "successors (after)" - precedes_description: "The related work package necessarily needs to start after this one finishes" - label_follows_singular: "predecessor (before)" - label_follows_plural: "predecessors (before)" - follows_description: "The related work package necessarily needs to finish before this one can start" - label_child_singular: "child" - label_child_plural: "children" - child_description: "Makes the related a work package a sub-item of the current (parent) work package" - label_blocks_singular: "blocks" - label_blocks_plural: "blocks" - blocks_description: "The related work package cannot be closed until this one is closed first" - label_blocked_singular: "blocked by" - label_blocked_plural: "blocked by" - label_blocked_by_singular: "blocked by" - label_blocked__by_plural: "blocked by" - blocked_description: "This work package cannot be closed until the related one is closed first" - blocked_by_description: "This work package cannot be closed until the related one is closed first" - label_duplicates_singular: "duplicates" - label_duplicates_plural: "duplicates" - duplicates_description: "This is a copy of the related work package" - label_duplicated_singular: "duplicated by" - label_duplicated_plural: "duplicated by" - label_duplicated_by_singular: "duplicated by" - label_duplicated_by_plural: "duplicated by" - duplicated_by_description: "The related work package is a copy of this" - duplicated_description: "The related work package is a copy of this" - label_includes_singular: "includes" - label_includes_plural: "includes" - includes_description: "Marks the related work package as including this one with no additional effect" - label_partof_singular: "part of" - label_partof_plural: "part of" - label_part_of_singular: "part of" - label_part_of_plural: "part of" - partof_description: "Marks the related work package as being part of this one with no additional effect" - part_of_description: "Marks the related work package as being part of this one with no additional effect" - label_requires_singular: "requires" - label_requires_plural: "requires" - requires_description: "Marks the related work package as a requirement to this one" - label_required_singular: "required by" - label_required_plural: "required by" - required_description: "Marks this work package as being a requirement to the related one" - label_parent_singular: "parent" - label_parent_plural: "parent" + label_relates_singular: "Beziehung mit" + label_relates_plural: "Beziehungen mit" + label_relates_to_singular: "Beziehung mit" + label_relates_to_plural: "Beziehung 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: "Untergeordnetes Arbeitspaket" + label_child_plural: "Untergeordnete Arbeitspakete" + child_description: "Ordnet das verknüpfte Arbeitspaket diesem Arbeitspaket unter" + 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: "Dupliziert" + label_duplicates_plural: "Dupliziert" + 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: "Beinhaltet" + label_includes_plural: "Beinhaltet" + includes_description: "Das verknüpfte Arbeitspaket beinhaltet dieses Arbeitspaket, ohne dass dies zusätzliche Auswirkungen hat" + label_partof_singular: "Teil von" + label_partof_plural: "Teil von" + label_part_of_singular: "Teil von" + label_part_of_plural: "Teil von" + 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: "Benötigt von" + label_required_plural: "Benötigt von" + required_description: "Markiert dieses Arbeitspaket als Voraussetzung für das verknüpfte Arbeitspaket" + label_parent_singular: "Übergeordnetes Arbeitspaket" + label_parent_plural: "Übergeordnete Arbeitspakete" label_invitation: Einladung account: delete: "Konto löschen" @@ -1086,17 +1086,17 @@ de: project/life_cycle_step_definition: attributes: type: - must_be_a_stage_or_gate: "must be either Project::StageDefinition or Project::GateDefinition" + must_be_a_stage_or_gate: "muss entweder ein Project::StageDefinition oder Project::GateDefinition sein" project/life_cycle_step: attributes: type: - must_be_a_stage_or_gate: "must be either Project::Stage or Project::Gate" - must_be_a_stage: "must be a Project::Stage" - must_be_a_gate: "must be a Project::Gate" + must_be_a_stage_or_gate: "muss entweder ein Project::Stage oder Project::Gate sein" + must_be_a_stage: "muss ein Project::Stage sein" + must_be_a_gate: "muss ein Project::Gate sein" project/gate: attributes: base: - end_date_not_allowed: "Cannot assign `end_date` to a Project::Gate" + end_date_not_allowed: "Einem Project::Gate kann kein `end_date` zugewiesen werden" query: attributes: project: @@ -2267,7 +2267,7 @@ de: label_environment: "Umgebung" label_estimates_and_progress: "Schätzungen und Fortschritt" label_equals: "ist" - label_equals_with_descendants: "is any with descendants" + label_equals_with_descendants: "ist (ODER) inkl. Unterelementen " label_everywhere: "überall" label_example: "Beispiel" label_experimental: "Experimentel" @@ -2532,8 +2532,8 @@ de: label_related_work_packages: "Zugehörige Arbeitspakete" label_relates: "Verwandt mit" label_relates_to: "Verwandt mit" - label_relation: "Relation" - label_relation_actions: "Relation actions" + label_relation: "Beziehung" + label_relation_actions: "Beziehungsaktionen" label_relation_delete: "Beziehung löschen" label_relation_new: "Neue Beziehung" label_release_notes: "Release Notes" diff --git a/config/locales/crowdin/js-af.yml b/config/locales/crowdin/js-af.yml index 26d718f80818..1b7233869545 100644 --- a/config/locales/crowdin/js-af.yml +++ b/config/locales/crowdin/js-af.yml @@ -357,10 +357,10 @@ af: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-ar.yml b/config/locales/crowdin/js-ar.yml index 0c7a0daa857d..0578854d62a2 100644 --- a/config/locales/crowdin/js-ar.yml +++ b/config/locales/crowdin/js-ar.yml @@ -357,10 +357,10 @@ ar: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-az.yml b/config/locales/crowdin/js-az.yml index 46d54a4b7858..5d74c5a26ca3 100644 --- a/config/locales/crowdin/js-az.yml +++ b/config/locales/crowdin/js-az.yml @@ -357,10 +357,10 @@ az: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-be.yml b/config/locales/crowdin/js-be.yml index 7ff86dc719c8..c97a47def68d 100644 --- a/config/locales/crowdin/js-be.yml +++ b/config/locales/crowdin/js-be.yml @@ -357,10 +357,10 @@ be: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-bg.yml b/config/locales/crowdin/js-bg.yml index 449c04569386..dc746f1faec3 100644 --- a/config/locales/crowdin/js-bg.yml +++ b/config/locales/crowdin/js-bg.yml @@ -357,10 +357,10 @@ bg: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-ca.yml b/config/locales/crowdin/js-ca.yml index eedba654c29c..ff9ce8e274ce 100644 --- a/config/locales/crowdin/js-ca.yml +++ b/config/locales/crowdin/js-ca.yml @@ -357,10 +357,10 @@ ca: learn_about: "Més informació sobre les noves funcions" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "S'ha produït un error en carregar les dades." diff --git a/config/locales/crowdin/js-ckb-IR.yml b/config/locales/crowdin/js-ckb-IR.yml index 7792e89f7283..76c5fcc7be48 100644 --- a/config/locales/crowdin/js-ckb-IR.yml +++ b/config/locales/crowdin/js-ckb-IR.yml @@ -357,10 +357,10 @@ ckb-IR: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-cs.yml b/config/locales/crowdin/js-cs.yml index 392e45599ab5..9f3493c02919 100644 --- a/config/locales/crowdin/js-cs.yml +++ b/config/locales/crowdin/js-cs.yml @@ -356,10 +356,10 @@ cs: learn_about: "Další informace o nových funkcích" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Přihlásit kalendář k odběru" inital_setup_error_message: "Při načítání dat došlo k chybě." diff --git a/config/locales/crowdin/js-da.yml b/config/locales/crowdin/js-da.yml index 4b4690d6a21c..451ef1c4b401 100644 --- a/config/locales/crowdin/js-da.yml +++ b/config/locales/crowdin/js-da.yml @@ -356,10 +356,10 @@ da: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-de.yml b/config/locales/crowdin/js-de.yml index 80dbc44574c5..c407e2777724 100644 --- a/config/locales/crowdin/js-de.yml +++ b/config/locales/crowdin/js-de.yml @@ -356,10 +356,10 @@ de: learn_about: "Erfahren Sie mehr über die neuen Funktionen" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - Das Release beinhaltet verschiedene neue Funktionen und Verbesserungen für Sie, z.B.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Kalender abonnieren" inital_setup_error_message: "Beim Abrufen der Daten ist ein Fehler aufgetreten." @@ -575,7 +575,7 @@ de: members: "Sie können hier neue Mitglieder zu Ihrem Projekt hinzufügen." quick_add_button: "Klicken Sie auf das Plus (+) Symbol in der Navigationsleiste um neue Projekte zu erzeugen oder MitarbeiterInnen einzuladen." sidebar_arrow: "Benutzen Sie den Pfeil in der oberen linken Ecke um zum Hauptmenü des Projekts zurückzukehren." - welcome: "Take a three-minute introduction tour to learn the most important features.
We recommend completing the steps until the end. You can restart the tour any time." + welcome: "Lernen Sie in drei Minuten die wichtigen Funktionen kennen.
Wir empfehlen Ihnen, die Tour vollständig abzuschließen. Sie können diese jederzeit wieder neu starten." wiki: "Im Wiki können Sie gemeinsam mit dem Team Informationen dokumentieren und eine Wissensdatenbank aufbauen." backlogs: overview: "Verwalten Sie Ihre Arbeit in der -Backlogs Ansicht." diff --git a/config/locales/crowdin/js-el.yml b/config/locales/crowdin/js-el.yml index b07327f7f325..ce944329bdec 100644 --- a/config/locales/crowdin/js-el.yml +++ b/config/locales/crowdin/js-el.yml @@ -356,10 +356,10 @@ el: learn_about: "Μάθετε περισσότερα για τις νέες λειτουργίες" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-eo.yml b/config/locales/crowdin/js-eo.yml index 511e38d6f0dc..00f11c8d6d45 100644 --- a/config/locales/crowdin/js-eo.yml +++ b/config/locales/crowdin/js-eo.yml @@ -357,10 +357,10 @@ eo: learn_about: "Lerni pli pri la novaj plibonigoj" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-es.yml b/config/locales/crowdin/js-es.yml index 7e09b9c4a021..b2fd8f5bb9ca 100644 --- a/config/locales/crowdin/js-es.yml +++ b/config/locales/crowdin/js-es.yml @@ -357,10 +357,10 @@ es: learn_about: "Más información sobre las nuevas funciones" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - La versión trae varias características y mejoras para usted, por ejemplo
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Suscribirse al calendario" inital_setup_error_message: "Se ha producido un error al obtener los datos." diff --git a/config/locales/crowdin/js-et.yml b/config/locales/crowdin/js-et.yml index de1c13f8ffde..acf06de0967d 100644 --- a/config/locales/crowdin/js-et.yml +++ b/config/locales/crowdin/js-et.yml @@ -357,10 +357,10 @@ et: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-eu.yml b/config/locales/crowdin/js-eu.yml index 5ae9e1fd7e37..a0f4fd38aace 100644 --- a/config/locales/crowdin/js-eu.yml +++ b/config/locales/crowdin/js-eu.yml @@ -357,10 +357,10 @@ eu: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-fa.yml b/config/locales/crowdin/js-fa.yml index 5ef1dc12dbe9..56a14dc267cb 100644 --- a/config/locales/crowdin/js-fa.yml +++ b/config/locales/crowdin/js-fa.yml @@ -357,10 +357,10 @@ fa: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-fi.yml b/config/locales/crowdin/js-fi.yml index 14a86b98a4dd..52a5b29a49aa 100644 --- a/config/locales/crowdin/js-fi.yml +++ b/config/locales/crowdin/js-fi.yml @@ -357,10 +357,10 @@ fi: learn_about: "Lisätietoja uusista ominaisuuksista" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-fil.yml b/config/locales/crowdin/js-fil.yml index f8246d62f2eb..d1c475adf801 100644 --- a/config/locales/crowdin/js-fil.yml +++ b/config/locales/crowdin/js-fil.yml @@ -357,10 +357,10 @@ fil: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml index 62ac3265f18d..7b00b593544a 100644 --- a/config/locales/crowdin/js-fr.yml +++ b/config/locales/crowdin/js-fr.yml @@ -357,10 +357,10 @@ fr: learn_about: "En savoir plus sur les nouvelles fonctionnalités" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - Cette version apporte diverses fonctionnalités et améliorations, notamment :
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "S'abonner au calendrier" inital_setup_error_message: "Une erreur est survenue lors de la récupération des données." diff --git a/config/locales/crowdin/js-he.yml b/config/locales/crowdin/js-he.yml index 024e8857ca3e..9ccb008bddb1 100644 --- a/config/locales/crowdin/js-he.yml +++ b/config/locales/crowdin/js-he.yml @@ -357,10 +357,10 @@ he: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-hi.yml b/config/locales/crowdin/js-hi.yml index b52d35648ba9..a739f006dd74 100644 --- a/config/locales/crowdin/js-hi.yml +++ b/config/locales/crowdin/js-hi.yml @@ -357,10 +357,10 @@ hi: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-hr.yml b/config/locales/crowdin/js-hr.yml index 3222581a2c60..1382033ba64c 100644 --- a/config/locales/crowdin/js-hr.yml +++ b/config/locales/crowdin/js-hr.yml @@ -357,10 +357,10 @@ hr: learn_about: "Saznaj više o novim značajkama" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-hu.yml b/config/locales/crowdin/js-hu.yml index 613dac3c2f74..d796727faf32 100644 --- a/config/locales/crowdin/js-hu.yml +++ b/config/locales/crowdin/js-hu.yml @@ -357,10 +357,10 @@ hu: learn_about: "Tudjon meg többet az új funkciókról" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-id.yml b/config/locales/crowdin/js-id.yml index 4c08a0446287..f9cdd02ce311 100644 --- a/config/locales/crowdin/js-id.yml +++ b/config/locales/crowdin/js-id.yml @@ -357,10 +357,10 @@ id: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-it.yml b/config/locales/crowdin/js-it.yml index 1bea09cdd4d1..41e9de7e47b9 100644 --- a/config/locales/crowdin/js-it.yml +++ b/config/locales/crowdin/js-it.yml @@ -357,10 +357,10 @@ it: learn_about: "Scopri di più sulle nuove funzionalità" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - Questa versione offre diverse funzionalità e miglioramenti, ad esempio
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Iscriviti al calendario" inital_setup_error_message: "Si è verificato un errore recuperando i dati." diff --git a/config/locales/crowdin/js-ja.yml b/config/locales/crowdin/js-ja.yml index 3572da0769a2..2d53bbd958f4 100644 --- a/config/locales/crowdin/js-ja.yml +++ b/config/locales/crowdin/js-ja.yml @@ -358,10 +358,10 @@ ja: learn_about: "新機能の詳細はこちら" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-ka.yml b/config/locales/crowdin/js-ka.yml index 0b038cd3d253..526cbd906243 100644 --- a/config/locales/crowdin/js-ka.yml +++ b/config/locales/crowdin/js-ka.yml @@ -357,10 +357,10 @@ ka: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-kk.yml b/config/locales/crowdin/js-kk.yml index 5840074ea858..1118b73a2826 100644 --- a/config/locales/crowdin/js-kk.yml +++ b/config/locales/crowdin/js-kk.yml @@ -357,10 +357,10 @@ kk: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-ko.yml b/config/locales/crowdin/js-ko.yml index 692695e968fd..c29d57085ced 100644 --- a/config/locales/crowdin/js-ko.yml +++ b/config/locales/crowdin/js-ko.yml @@ -357,10 +357,10 @@ ko: learn_about: "새로운 기능에 대해 자세히 알아보기" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - 이 릴리즈는 다음과 같은 다양한 기능과 개선 사항을 제공합니다.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "캘린더 구독" inital_setup_error_message: "데이터를 가져오는 중에 오류가 발생했습니다." diff --git a/config/locales/crowdin/js-lt.yml b/config/locales/crowdin/js-lt.yml index 3204ee92ba07..a85ccb593784 100644 --- a/config/locales/crowdin/js-lt.yml +++ b/config/locales/crowdin/js-lt.yml @@ -357,10 +357,10 @@ lt: learn_about: "Sužinokite daugiau apie naujas galimybes" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Prenumeruoti kalendorių" inital_setup_error_message: "Gaunant duomenis įvyko klaida." diff --git a/config/locales/crowdin/js-lv.yml b/config/locales/crowdin/js-lv.yml index 76fc5f1ec0e6..9d70db165667 100644 --- a/config/locales/crowdin/js-lv.yml +++ b/config/locales/crowdin/js-lv.yml @@ -357,10 +357,10 @@ lv: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-mn.yml b/config/locales/crowdin/js-mn.yml index 6998fea95619..03e95456cf42 100644 --- a/config/locales/crowdin/js-mn.yml +++ b/config/locales/crowdin/js-mn.yml @@ -357,10 +357,10 @@ mn: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-ms.yml b/config/locales/crowdin/js-ms.yml index 8973fb8f64a5..94472d471e24 100644 --- a/config/locales/crowdin/js-ms.yml +++ b/config/locales/crowdin/js-ms.yml @@ -357,10 +357,10 @@ ms: learn_about: "Ketahui lebih lanjut mengenai fitur-fitur baharu." #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Langgan kalendar" inital_setup_error_message: "Ralat berlaku ketika sedang mengambil data." diff --git a/config/locales/crowdin/js-ne.yml b/config/locales/crowdin/js-ne.yml index 8dad01d65f2a..8fba28800552 100644 --- a/config/locales/crowdin/js-ne.yml +++ b/config/locales/crowdin/js-ne.yml @@ -357,10 +357,10 @@ ne: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-nl.yml b/config/locales/crowdin/js-nl.yml index 15fe33cbeb87..1d811294c413 100644 --- a/config/locales/crowdin/js-nl.yml +++ b/config/locales/crowdin/js-nl.yml @@ -357,10 +357,10 @@ nl: learn_about: "Meer informatie over de nieuwe functies" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Abonneren op agenda" inital_setup_error_message: "Er is een fout opgetreden tijdens het ophalen van gegevens." diff --git a/config/locales/crowdin/js-no.yml b/config/locales/crowdin/js-no.yml index 26e7df81cc47..c671d6a2d25f 100644 --- a/config/locales/crowdin/js-no.yml +++ b/config/locales/crowdin/js-no.yml @@ -357,10 +357,10 @@ learn_about: "Lær mer om de nye funksjonene" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Abonner på kalender" inital_setup_error_message: "En feil oppstod under henting av data." diff --git a/config/locales/crowdin/js-pl.yml b/config/locales/crowdin/js-pl.yml index 522d0d058cc4..15a751e25827 100644 --- a/config/locales/crowdin/js-pl.yml +++ b/config/locales/crowdin/js-pl.yml @@ -357,10 +357,10 @@ pl: learn_about: "Dowiedz się więcej o nowych funkcjach" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - Ta wersja wprowadza różne funkcje i ulepszenia, takie jak:
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subskrybuj kalendarz" inital_setup_error_message: "Podczas pobierania danych wystąpił błąd." diff --git a/config/locales/crowdin/js-pt-BR.yml b/config/locales/crowdin/js-pt-BR.yml index 3858224a93b0..0d354c51128e 100644 --- a/config/locales/crowdin/js-pt-BR.yml +++ b/config/locales/crowdin/js-pt-BR.yml @@ -356,10 +356,10 @@ pt-BR: learn_about: "Saiba mais sobre os novos recursos" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - A versão traz vários recursos e melhorias para você, por exemplo:
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Assinar calendário" inital_setup_error_message: "Ocorreu um erro ao buscar dados." diff --git a/config/locales/crowdin/js-pt-PT.yml b/config/locales/crowdin/js-pt-PT.yml index e7815ce30a05..b6804f138edf 100644 --- a/config/locales/crowdin/js-pt-PT.yml +++ b/config/locales/crowdin/js-pt-PT.yml @@ -357,10 +357,10 @@ pt-PT: learn_about: "Saiba mais sobre os novos recursos" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - A versão traz várias funcionalidades e melhorias para si, por exemplo,
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscrever o calendário" inital_setup_error_message: "Ocorreu um erro ao recuperar os dados." diff --git a/config/locales/crowdin/js-ro.yml b/config/locales/crowdin/js-ro.yml index 2a8b0ff596b2..d04b14c5cac4 100644 --- a/config/locales/crowdin/js-ro.yml +++ b/config/locales/crowdin/js-ro.yml @@ -356,10 +356,10 @@ ro: learn_about: "Aflați mai multe despre noile caracteristici" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - Versiunea aduce diverse caracteristici și îmbunătățiri pentru tine, de exemplu:
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index 51678a9b9afc..a2df51fce925 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -356,10 +356,10 @@ ru: learn_about: "Подробнее о новых функциях" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - Релиз содержит новые возможности и различные улучшения, такие как,
. + The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Подписаться на календарь" inital_setup_error_message: "Произошла ошибка при получении данных." diff --git a/config/locales/crowdin/js-rw.yml b/config/locales/crowdin/js-rw.yml index 262eecb8f9fd..0c608006cb32 100644 --- a/config/locales/crowdin/js-rw.yml +++ b/config/locales/crowdin/js-rw.yml @@ -357,10 +357,10 @@ rw: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-si.yml b/config/locales/crowdin/js-si.yml index 7007a80fd54a..d171399479a5 100644 --- a/config/locales/crowdin/js-si.yml +++ b/config/locales/crowdin/js-si.yml @@ -357,10 +357,10 @@ si: learn_about: "නව විශේෂාංග ගැන වැඩි විස්තර දැනගන්න" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-sk.yml b/config/locales/crowdin/js-sk.yml index 02b3bf092d4b..d9a1ceab5154 100644 --- a/config/locales/crowdin/js-sk.yml +++ b/config/locales/crowdin/js-sk.yml @@ -357,10 +357,10 @@ sk: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-sl.yml b/config/locales/crowdin/js-sl.yml index 6f5442e3f9c3..fc3107744c86 100644 --- a/config/locales/crowdin/js-sl.yml +++ b/config/locales/crowdin/js-sl.yml @@ -356,10 +356,10 @@ sl: learn_about: "Preberite več o novostih" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-sr.yml b/config/locales/crowdin/js-sr.yml index f5c569974268..0cc01275c54e 100644 --- a/config/locales/crowdin/js-sr.yml +++ b/config/locales/crowdin/js-sr.yml @@ -357,10 +357,10 @@ sr: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-sv.yml b/config/locales/crowdin/js-sv.yml index 30796ce19fa1..ad3d5a52bcf0 100644 --- a/config/locales/crowdin/js-sv.yml +++ b/config/locales/crowdin/js-sv.yml @@ -356,10 +356,10 @@ sv: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-th.yml b/config/locales/crowdin/js-th.yml index b31d7e82cc67..67cb2ae5a9ff 100644 --- a/config/locales/crowdin/js-th.yml +++ b/config/locales/crowdin/js-th.yml @@ -357,10 +357,10 @@ th: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-tr.yml b/config/locales/crowdin/js-tr.yml index c72f093f5fd7..e6aa0cfac3ce 100644 --- a/config/locales/crowdin/js-tr.yml +++ b/config/locales/crowdin/js-tr.yml @@ -356,10 +356,10 @@ tr: learn_about: "Yeni özellikler hakkında daha fazla bilgi edinin" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-uk.yml b/config/locales/crowdin/js-uk.yml index 55c8fe674552..1e351902fcd1 100644 --- a/config/locales/crowdin/js-uk.yml +++ b/config/locales/crowdin/js-uk.yml @@ -357,10 +357,10 @@ uk: learn_about: "Дізнатися більше про нові функції" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - Цей випуск містить багато функцій і покращень, наприклад:
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Підписатися на календар" inital_setup_error_message: "Під час отримання даних сталася помилка." diff --git a/config/locales/crowdin/js-uz.yml b/config/locales/crowdin/js-uz.yml index fb018f798a9e..a35f5a7117ca 100644 --- a/config/locales/crowdin/js-uz.yml +++ b/config/locales/crowdin/js-uz.yml @@ -357,10 +357,10 @@ uz: learn_about: "Learn more about the new features" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Subscribe to calendar" inital_setup_error_message: "An error occured while fetching data." diff --git a/config/locales/crowdin/js-vi.yml b/config/locales/crowdin/js-vi.yml index c4417652bdc8..8111aee623c7 100644 --- a/config/locales/crowdin/js-vi.yml +++ b/config/locales/crowdin/js-vi.yml @@ -357,10 +357,10 @@ vi: learn_about: "Tìm hiểu thêm về các tính năng mới" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - The release brings various features and improvements for you, e.g.
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "Đăng ký lịch" inital_setup_error_message: "Đã xảy ra lỗi khi lấy dữ liệu." diff --git a/config/locales/crowdin/js-zh-CN.yml b/config/locales/crowdin/js-zh-CN.yml index 6207d3ac209c..0e82904e0fef 100644 --- a/config/locales/crowdin/js-zh-CN.yml +++ b/config/locales/crowdin/js-zh-CN.yml @@ -356,10 +356,10 @@ zh-CN: learn_about: "详细了解新功能" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - 该版本带来了各种功能和改进,例如
+ The release brings various features and improvements for you, e.g.
ical_sharing_modal: title: "订阅日历" inital_setup_error_message: "获取数据时发生错误。" diff --git a/config/locales/crowdin/js-zh-TW.yml b/config/locales/crowdin/js-zh-TW.yml index cc41b13c3a17..4313803c0d73 100644 --- a/config/locales/crowdin/js-zh-TW.yml +++ b/config/locales/crowdin/js-zh-TW.yml @@ -355,10 +355,10 @@ zh-TW: learn_about: "瞭解更多新功能的資訊" #Include the version to invalidate outdated translations in other locales. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > - 此版本為您帶來各種功能與改進,例如
+ 該版本為您帶來了各種功能和改進,例如
ical_sharing_modal: title: "訂閱日曆" inital_setup_error_message: "更新資料時發生錯誤" diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index 0ab8ca740d1e..2978b0cbc53d 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -27,31 +27,31 @@ nl: work_packages: activity_tab: no_results_title_text: No activity to display - no_results_description_text: "Choose \"Show everything\" to show all activity and comments" - label_activity_show_all: "Show everything" - label_activity_show_only_comments: "Show comments only" - label_activity_show_only_changes: "Show changes only" - label_sort_asc: "Newest at the bottom" - label_sort_desc: "Newest on top" + no_results_description_text: "Kies \"Alles tonen\" om alle activiteiten en opmerkingen te tonen" + label_activity_show_all: "Alles tonen" + label_activity_show_only_comments: "Alleen opmerkingen tonen" + label_activity_show_only_changes: "Alleen wijzigingen weergeven" + label_sort_asc: "Nieuwste onderaan" + label_sort_desc: "Nieuwste bovenaan" label_type_to_comment: "Add a comment. Type @ to notify people." - label_submit_comment: "Submit comment" - changed_on: "changed on" - created_on: "created this on" - changed: "changed" - created: "created" - commented: "commented" + label_submit_comment: "Verstuur reactie" + changed_on: "gewijzigd op" + created_on: "creëerde dit op" + changed: "gewijzigd" + created: "aangemaakt" + commented: "gaf commentaar op" admin: plugins: - no_results_title_text: There are currently no plugins installed. - no_results_content_text: See our integrations and plugins page for more information. + no_results_title_text: Er zijn momenteel geen plugins geïnstalleerd. + no_results_content_text: Zie onze pagina met integraties en plugins voor meer informatie. custom_styles: color_theme: "Kleurenschema" color_theme_custom: "(Custom)" tab_interface: "Interface" - tab_branding: "Branding" - tab_pdf_export_styles: "PDF export styles" + tab_branding: "Huisstijl" + tab_pdf_export_styles: "PDF-exportstijlen" colors: - primary-button-color: "Primary button" + primary-button-color: "Primaire knop" accent-color: "Accent" header-bg-color: "Koptekst achtergrond" header-item-bg-hover-color: "Header background on hover" @@ -91,7 +91,7 @@ nl: contact: "Neem contact met ons op voor een demo" enterprise_info_html: "is een Enterprise add-on." upgrade_info: "Gelieve te upgraden naar een betaald abonnement om het te activeren en te beginnen met het gebruik ervan in uw team." - jemalloc_allocator: Jemalloc memory allocator + jemalloc_allocator: Jemalloc geheugentoewijzer journal_aggregation: explanation: text: "Individuele acties van een gebruiker (bijv. het bijwerken van een werkpakket twee keer) wordt samengevoegd tot een enkele actie als hun leeftijdverschil minder is dan de aangegeven timespat. Ze worden weergegeven als een enkele actie binnen de applicatie. Dit zal ook meldingen vertragen met dezelfde tijd die het aantal verstuurde e-mails vermindert en zal ook %{webhook_link} vertraging beïnvloeden." @@ -102,15 +102,15 @@ nl: is_inactive: momenteel niet getoond antivirus_scan: not_processed_yet_message: "Downloaden is geblokkeerd, omdat het bestand nog niet op virussen is gescand. Probeer het later nog eens." - quarantined_message: "A virus was detected in file '%{filename}'. It has been quarantined and is not available for download." + quarantined_message: "Er is een virus gedetecteerd in bestand '%{filename}'. Het is in quarantaine geplaatst en kan niet worden gedownload." deleted_message: "Er is een virus gedetecteerd in bestand '%{filename}'. Het bestand is verwijderd." deleted_by_admin: "Het in quarantaine geplaatste bestand '%{filename}' is verwijderd door een beheerder." - overridden_by_admin: "The quarantine for file '%{filename}' has been removed by %{user}. The file can now be acccessed." + overridden_by_admin: "De quarantaine voor bestand '%{filename}' is verwijderd door %{user}. Het bestand kan nu worden geopend." quarantined_attachments: container: "Container" - delete: "Delete the quarantined file" - title: "Quarantined attachments" - error_cannot_act_self: "Cannot perform actions on your own uploaded files." + delete: "Verwijder het quarantaine bestand" + title: "In quarantaine geplaatste bijlagen" + error_cannot_act_self: "Kan geen acties uitvoeren op uw eigen geüploade bestanden." attribute_help_texts: note_public: "Alle tekst en afbeeldingen die u toevoegt aan dit veld zijn openbaar zichtbaar voor alle ingelogde gebruikers!" text_overview: "In deze weergave kunt u aangepaste helpteksten voor kenmerken weergave. Wanneer gedefinieerd, worden deze teksten door te klikken op het help-pictogram naast het behoren kenmerk weergegeven." @@ -125,8 +125,8 @@ nl: ldap_auth_sources: ldap_error: "LDAP-fout: %{error_message}" ldap_auth_failed: "Kon niet authenticeren met LDAP-server." - sync_failed: "Failed to synchronize from LDAP: %{message}." - back_to_index: "Click here to go back to the list of connection." + sync_failed: "Synchronisatie met LDAP mislukt: %{message}." + back_to_index: "Klik hier om terug te gaan naar de connectielijst." technical_warning_html: | Dit LDAP-formulier vereist technische kennis van uw LDAP / Active Directory-configuratie.
@@ -215,16 +215,16 @@ nl: admin: custom_field_projects: is_for_all_blank_slate: - heading: For all projects - description: This custom field is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + heading: Voor alle projecten + description: Dit aangepaste veld is ingeschakeld in alle projecten omdat de optie "Voor alle projecten" is aangevinkt. Het kan niet worden uitgeschakeld voor individuele projecten. items: - actions: "Item actions" + actions: "Item acties" blankslate: root: - title: "Your list of items is empty" - description: "Start by adding items to the custom field of type hierarchy. Each item can be used to create a hierarchy bellow it. To navigate and create sub-items inside a hierarchy click on the created item." + title: "Uw lijst met items is leeg" + description: "Begin met het toevoegen van items aan het aangepaste veld van het type hiërarchie. Elk item kan gebruikt worden om een hiërarchie eronder te maken. Om te navigeren en subitems aan te maken binnen een hiërarchie klikt u op het aangemaakte item." item: - title: This item doesn't have any hierarchy level below + title: Dit item heeft geen onderstaand hiërarchie niveau description: Add items to this list to create sub-items inside another one placeholder: label: "Item label" diff --git a/config/locales/crowdin/ru.seeders.yml b/config/locales/crowdin/ru.seeders.yml index 30ce080459a9..faa5a996758a 100644 --- a/config/locales/crowdin/ru.seeders.yml +++ b/config/locales/crowdin/ru.seeders.yml @@ -36,15 +36,15 @@ ru: name: Чёрный life_cycle_colors: item_0: - name: PM2 Orange + name: PM2 Оранжевый item_1: - name: PM2 Purple + name: PM2 Фиолетовый item_2: - name: PM2 Red + name: PM2 Красный item_3: - name: PM2 Magenta + name: PM2 Пурпурный item_4: - name: PM2 Green Yellow + name: PM2 Зелено-жёлтый document_categories: item_0: name: Документация @@ -83,19 +83,19 @@ ru: standard: life_cycles: item_0: - name: Initiating + name: Запуск item_1: - name: Ready for Planning + name: Готов к планированию item_2: - name: Planning + name: Планирование item_3: - name: Ready for Executing + name: Готово к выполнению item_4: - name: Executing + name: Выполнение item_5: - name: Ready for Closing + name: Готов к закрытию item_6: - name: Closing + name: Закрытие priorities: item_0: name: Низкое diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 8eb7318c80a5..951a6cb66fd0 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -239,7 +239,7 @@ ru: one: 1 подпункт other: "%{count} подпунктов" upsale: - custom_field_format_hierarchy: "Need a hierarchy in your custom fields for work packages?" + custom_field_format_hierarchy: "Вам нужна иерархия в пользовательских полях для пакетов работ?" text_add_new_custom_field: > Прежде чем добавлять настраиваемые поля в проект, нужно создать их. is_enabled_globally: "Разрешено в глобальном масштабе" @@ -537,7 +537,7 @@ ru: react_with: "Реакция %{reaction}" and_user: "и %{user}" and_others: - one: and 1 other + one: и еще 1 few: and %{count} others many: and %{count} others other: и еще %{count} @@ -651,64 +651,64 @@ ru: no_results_title_text: На данный момент этапы отсутствуют. work_package_relations_tab: index: - action_bar_title: "Add relations to other work packages to create a link between them." - no_results_title_text: There are currently no relations available. - blankslate_heading: "No relations" - blankslate_description: "This work package does not have any relations yet." - label_add_x: "Add %{x}" - label_edit_x: "Edit %{x}" - label_add_description: "Add description" + action_bar_title: "Добавьте отношения к другим рабочим пакетам, чтобы создать связь между ними." + no_results_title_text: На данный момент связи отсутствуют. + blankslate_heading: "Нет связей" + blankslate_description: "У этого пакета работ пока нет никаких связей." + label_add_x: "Добавить %{x}" + label_edit_x: "Редактировать %{x}" + label_add_description: "Добавить описание" relations: - label_relates_singular: "related to" - label_relates_plural: "related to" - label_relates_to_singular: "related to" - label_relates_to_plural: "related to" - relates_description: "Creates a visible link between the two work packages with no additional effect" - relates_to_description: "Creates a visible link between the two work packages with no additional effect" - label_precedes_singular: "successor (after)" - label_precedes_plural: "successors (after)" - precedes_description: "The related work package necessarily needs to start after this one finishes" - label_follows_singular: "predecessor (before)" - label_follows_plural: "predecessors (before)" - follows_description: "The related work package necessarily needs to finish before this one can start" - label_child_singular: "child" - label_child_plural: "children" - child_description: "Makes the related a work package a sub-item of the current (parent) work package" - label_blocks_singular: "blocks" - label_blocks_plural: "blocks" - blocks_description: "The related work package cannot be closed until this one is closed first" - label_blocked_singular: "blocked by" - label_blocked_plural: "blocked by" - label_blocked_by_singular: "blocked by" - label_blocked__by_plural: "blocked by" - blocked_description: "This work package cannot be closed until the related one is closed first" - blocked_by_description: "This work package cannot be closed until the related one is closed first" - label_duplicates_singular: "duplicates" - label_duplicates_plural: "duplicates" - duplicates_description: "This is a copy of the related work package" - label_duplicated_singular: "duplicated by" - label_duplicated_plural: "duplicated by" - label_duplicated_by_singular: "duplicated by" - label_duplicated_by_plural: "duplicated by" - duplicated_by_description: "The related work package is a copy of this" - duplicated_description: "The related work package is a copy of this" - label_includes_singular: "includes" - label_includes_plural: "includes" - includes_description: "Marks the related work package as including this one with no additional effect" - label_partof_singular: "part of" - label_partof_plural: "part of" - label_part_of_singular: "part of" - label_part_of_plural: "part of" - partof_description: "Marks the related work package as being part of this one with no additional effect" - part_of_description: "Marks the related work package as being part of this one with no additional effect" - label_requires_singular: "requires" - label_requires_plural: "requires" - requires_description: "Marks the related work package as a requirement to this one" - label_required_singular: "required by" - label_required_plural: "required by" - required_description: "Marks this work package as being a requirement to the related one" - label_parent_singular: "parent" - label_parent_plural: "parent" + 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: "наследники (после)\n" + precedes_description: "Связанный пакет работ обязательно должен начаться после завершения этого пакета" + label_follows_singular: "предшественник (до)" + label_follows_plural: "предшественники (до)" + follows_description: "Соответствующий пакет работ обязательно должен быть завершен до того, как начнется этот пакет" + label_child_singular: "дочерний пакет работ" + label_child_plural: "дочерние пакеты работ" + child_description: "Делает связанный пакет работ дочерним текущему (родительскому) пакету работ" + 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_invitation: Приглашение account: delete: "Удалить учётную запись" @@ -1108,17 +1108,17 @@ ru: project/life_cycle_step_definition: attributes: type: - must_be_a_stage_or_gate: "must be either Project::StageDefinition or Project::GateDefinition" + must_be_a_stage_or_gate: "должен быть либо Project::StageDefinition, либо Project::GateDefinition" project/life_cycle_step: attributes: type: - must_be_a_stage_or_gate: "must be either Project::Stage or Project::Gate" - must_be_a_stage: "must be a Project::Stage" - must_be_a_gate: "must be a Project::Gate" + must_be_a_stage_or_gate: "должен быть либо Project::Stage, либо Project::Gate" + must_be_a_stage: "должен быть Project::Stage" + must_be_a_gate: "должен быть Project::Stage" project/gate: attributes: base: - end_date_not_allowed: "Cannot assign `end_date` to a Project::Gate" + end_date_not_allowed: "Невозможно присвоить `end_date` проекту Project::Gate" query: attributes: project: @@ -2345,7 +2345,7 @@ ru: label_environment: "Переменные среды" label_estimates_and_progress: "Оценки и прогресс" label_equals: "—" - label_equals_with_descendants: "is any with descendants" + label_equals_with_descendants: "любой с потомками" label_everywhere: "везде" label_example: "Пример" label_experimental: "Экспериментально" @@ -2610,8 +2610,8 @@ ru: label_related_work_packages: "Связанные пакеты работ" label_relates: "Связан с" label_relates_to: "Связан с" - label_relation: "Relation" - label_relation_actions: "Relation actions" + label_relation: "Связь" + label_relation_actions: "Действия со связями" label_relation_delete: "Удалить связь" label_relation_new: "Новая связь" label_release_notes: "Список изменений" diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index d180387fd172..4224afbc7d15 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -623,64 +623,64 @@ zh-CN: no_results_title_text: 目前有可用的版本。 work_package_relations_tab: index: - action_bar_title: "Add relations to other work packages to create a link between them." - no_results_title_text: There are currently no relations available. - blankslate_heading: "No relations" - blankslate_description: "This work package does not have any relations yet." - label_add_x: "Add %{x}" - label_edit_x: "Edit %{x}" - label_add_description: "Add description" + action_bar_title: "将关系添加到其他工作包以创建它们之间的链接。" + no_results_title_text: 目前没有任何关系。 + blankslate_heading: "没有关系" + blankslate_description: "此工作包还没有任何关系。" + label_add_x: "添加 %{x}" + label_edit_x: "编辑 %{x}" + label_add_description: "添加说明" relations: - label_relates_singular: "related to" - label_relates_plural: "related to" - label_relates_to_singular: "related to" - label_relates_to_plural: "related to" - relates_description: "Creates a visible link between the two work packages with no additional effect" - relates_to_description: "Creates a visible link between the two work packages with no additional effect" - label_precedes_singular: "successor (after)" - label_precedes_plural: "successors (after)" - precedes_description: "The related work package necessarily needs to start after this one finishes" - label_follows_singular: "predecessor (before)" - label_follows_plural: "predecessors (before)" - follows_description: "The related work package necessarily needs to finish before this one can start" - label_child_singular: "child" - label_child_plural: "children" - child_description: "Makes the related a work package a sub-item of the current (parent) work package" - label_blocks_singular: "blocks" - label_blocks_plural: "blocks" - blocks_description: "The related work package cannot be closed until this one is closed first" - label_blocked_singular: "blocked by" - label_blocked_plural: "blocked by" - label_blocked_by_singular: "blocked by" - label_blocked__by_plural: "blocked by" - blocked_description: "This work package cannot be closed until the related one is closed first" - blocked_by_description: "This work package cannot be closed until the related one is closed first" - label_duplicates_singular: "duplicates" - label_duplicates_plural: "duplicates" - duplicates_description: "This is a copy of the related work package" - label_duplicated_singular: "duplicated by" - label_duplicated_plural: "duplicated by" - label_duplicated_by_singular: "duplicated by" - label_duplicated_by_plural: "duplicated by" - duplicated_by_description: "The related work package is a copy of this" - duplicated_description: "The related work package is a copy of this" - label_includes_singular: "includes" - label_includes_plural: "includes" - includes_description: "Marks the related work package as including this one with no additional effect" - label_partof_singular: "part of" - label_partof_plural: "part of" - label_part_of_singular: "part of" - label_part_of_plural: "part of" - partof_description: "Marks the related work package as being part of this one with no additional effect" - part_of_description: "Marks the related work package as being part of this one with no additional effect" - label_requires_singular: "requires" - label_requires_plural: "requires" - requires_description: "Marks the related work package as a requirement to this one" - label_required_singular: "required by" - label_required_plural: "required by" - required_description: "Marks this work package as being a requirement to the related one" - label_parent_singular: "parent" - label_parent_plural: "parent" + 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: "子节点" + child_description: "使相关工作包成为当前(父) 工作包的子项目" + 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_invitation: 邀请 account: delete: "删除帐户" @@ -2233,7 +2233,7 @@ zh-CN: label_environment: "环境" label_estimates_and_progress: "预估和进度" label_equals: "是" - label_equals_with_descendants: "is any with descendants" + label_equals_with_descendants: "是任何与子节点相关的" label_everywhere: "任何位置" label_example: "示例" label_experimental: "实验" @@ -2498,8 +2498,8 @@ zh-CN: label_related_work_packages: "相关的工作包" label_relates: "关于" label_relates_to: "关于" - label_relation: "Relation" - label_relation_actions: "Relation actions" + label_relation: "关系" + label_relation_actions: "关联操作" label_relation_delete: "删除关系" label_relation_new: "新的关系" label_release_notes: "更新日志" diff --git a/config/locales/crowdin/zh-TW.seeders.yml b/config/locales/crowdin/zh-TW.seeders.yml index 59c0e9afc996..cd67529e5141 100644 --- a/config/locales/crowdin/zh-TW.seeders.yml +++ b/config/locales/crowdin/zh-TW.seeders.yml @@ -36,15 +36,15 @@ zh-TW: name: 黑色 life_cycle_colors: item_0: - name: PM2 Orange + name: PM2 橙色 item_1: - name: PM2 Purple + name: PM2 紫色 item_2: - name: PM2 Red + name: PM2 紅色 item_3: - name: PM2 Magenta + name: PM2 紅紫色 item_4: - name: PM2 Green Yellow + name: PM2 黃綠色 document_categories: item_0: name: 說明文件 @@ -83,19 +83,19 @@ zh-TW: standard: life_cycles: item_0: - name: Initiating + name: 初始化中 item_1: - name: Ready for Planning + name: 準備規劃 item_2: - name: Planning + name: 計劃中 item_3: - name: Ready for Executing + name: 準備執行 item_4: - name: Executing + name: 執行 item_5: - name: Ready for Closing + name: 準備關閉 item_6: - name: Closing + name: 正在關閉 priorities: item_0: name: 低 diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 5e85bffdf7e4..e4050a26a0c6 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -625,64 +625,64 @@ zh-TW: no_results_title_text: 目前沒有可用的版本 work_package_relations_tab: index: - action_bar_title: "Add relations to other work packages to create a link between them." - no_results_title_text: There are currently no relations available. - blankslate_heading: "No relations" - blankslate_description: "This work package does not have any relations yet." - label_add_x: "Add %{x}" - label_edit_x: "Edit %{x}" - label_add_description: "Add description" + action_bar_title: "新增關係至其他工作項目,以建立它們之間的連結。" + no_results_title_text: 目前沒有相關工作項目 + blankslate_heading: "沒有關聯" + blankslate_description: "此工作項目尚未建立任何關係。" + label_add_x: "新增 %{x}" + label_edit_x: "編輯:%{x}" + label_add_description: "新增說明" relations: - label_relates_singular: "related to" - label_relates_plural: "related to" - label_relates_to_singular: "related to" - label_relates_to_plural: "related to" - relates_description: "Creates a visible link between the two work packages with no additional effect" - relates_to_description: "Creates a visible link between the two work packages with no additional effect" - label_precedes_singular: "successor (after)" - label_precedes_plural: "successors (after)" - precedes_description: "The related work package necessarily needs to start after this one finishes" - label_follows_singular: "predecessor (before)" - label_follows_plural: "predecessors (before)" - follows_description: "The related work package necessarily needs to finish before this one can start" - label_child_singular: "child" - label_child_plural: "children" - child_description: "Makes the related a work package a sub-item of the current (parent) work package" - label_blocks_singular: "blocks" - label_blocks_plural: "blocks" - blocks_description: "The related work package cannot be closed until this one is closed first" - label_blocked_singular: "blocked by" - label_blocked_plural: "blocked by" - label_blocked_by_singular: "blocked by" - label_blocked__by_plural: "blocked by" - blocked_description: "This work package cannot be closed until the related one is closed first" - blocked_by_description: "This work package cannot be closed until the related one is closed first" - label_duplicates_singular: "duplicates" - label_duplicates_plural: "duplicates" - duplicates_description: "This is a copy of the related work package" - label_duplicated_singular: "duplicated by" - label_duplicated_plural: "duplicated by" - label_duplicated_by_singular: "duplicated by" - label_duplicated_by_plural: "duplicated by" - duplicated_by_description: "The related work package is a copy of this" - duplicated_description: "The related work package is a copy of this" - label_includes_singular: "includes" - label_includes_plural: "includes" - includes_description: "Marks the related work package as including this one with no additional effect" - label_partof_singular: "part of" - label_partof_plural: "part of" - label_part_of_singular: "part of" - label_part_of_plural: "part of" - partof_description: "Marks the related work package as being part of this one with no additional effect" - part_of_description: "Marks the related work package as being part of this one with no additional effect" - label_requires_singular: "requires" - label_requires_plural: "requires" - requires_description: "Marks the related work package as a requirement to this one" - label_required_singular: "required by" - label_required_plural: "required by" - required_description: "Marks this work package as being a requirement to the related one" - label_parent_singular: "parent" - label_parent_plural: "parent" + 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: "子項目" + child_description: "使相關工作項目成為目前(父)工作子項目" + 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_invitation: 邀請 account: delete: "刪除帳號" @@ -1082,17 +1082,17 @@ zh-TW: project/life_cycle_step_definition: attributes: type: - must_be_a_stage_or_gate: "must be either Project::StageDefinition or Project::GateDefinition" + must_be_a_stage_or_gate: "" project/life_cycle_step: attributes: type: - must_be_a_stage_or_gate: "must be either Project::Stage or Project::Gate" - must_be_a_stage: "must be a Project::Stage" - must_be_a_gate: "must be a Project::Gate" + must_be_a_stage_or_gate: "" + must_be_a_stage: "" + must_be_a_gate: "必須是 Project::Gate" project/gate: attributes: base: - end_date_not_allowed: "Cannot assign `end_date` to a Project::Gate" + end_date_not_allowed: "無法指定 `end_date` 到 Project::Gate" query: attributes: project: @@ -2235,7 +2235,7 @@ zh-TW: label_environment: "環境" label_estimates_and_progress: "預估和進度" label_equals: "是" - label_equals_with_descendants: "is any with descendants" + label_equals_with_descendants: "任何子項目" label_everywhere: "全部" label_example: "範例" label_experimental: "實驗性" @@ -2500,8 +2500,8 @@ zh-TW: label_related_work_packages: "相關的工作項目" label_relates: "相關於" label_relates_to: "相關於" - label_relation: "Relation" - label_relation_actions: "Relation actions" + label_relation: "關聯" + label_relation_actions: "關聯動作" label_relation_delete: "刪除關聯" label_relation_new: "新增關聯" label_release_notes: "發行說明" diff --git a/config/locales/js-en.yml b/config/locales/js-en.yml index fdae57b86244..9ed3ae60a345 100644 --- a/config/locales/js-en.yml +++ b/config/locales/js-en.yml @@ -400,18 +400,16 @@ en: learn_about: "Learn more about the new features" # Include the version to invalidate outdated translations in other locales. # Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. - "15_0": + "15_1": standard: new_features_html: > The release brings various features and improvements for you, e.g.
ical_sharing_modal: diff --git a/docs/development/development-environment/docker/README.md b/docs/development/development-environment/docker/README.md index a16792714f2e..cdb667db5232 100644 --- a/docs/development/development-environment/docker/README.md +++ b/docs/development/development-environment/docker/README.md @@ -218,6 +218,18 @@ you want to see what the browsers are doing. `gvncviewer` or `vinagre` on Linux the `docker-compose.override.yml` to access a container of a specific browser. As a default, the `chrome` container is exposed on port 5900. The password is `secret` for all. +Adding additional external docker networks to the test services like `backend-test` (e.g. inside the +`docker-compose.override.yml`) breaks the functionality of the Selenium service. This results in failing tests running +inside a Selenium context, like feature and UI tests. + +``` +Selenium::WebDriver::Error::UnknownError: + unknown error: net::ERR_CONNECTION_REFUSED + (Session info: chrome=130.0.6723.91) +``` + +If this happens just comment out the network overrides. + ## TLS support Within `docker/dev/tls` compose files are provided, that elevate the development stack to be run under full TLS diff --git a/docs/installation-and-operations/configuration/README.md b/docs/installation-and-operations/configuration/README.md index 8ff6d3f58672..7c30eb8c10ff 100644 --- a/docs/installation-and-operations/configuration/README.md +++ b/docs/installation-and-operations/configuration/README.md @@ -175,8 +175,6 @@ OPENPROJECT_SEED_ADMIN_USER_MAIL="admin@example.net" # Email attribute to assign Optionally, you can also lock the admin user that gets created right away. This is useful when you have an LDAP or SSO integration set up and you want to prevent the admin user from logging in. -```shell - > [!WARNING] > With the admin user seeding disabled, you need to have an LDAP or SSO integration set up through environment variables. > Otherwise, you will not be able to retain access to the system. diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 80711257051e..84ad47af62a9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1147,9 +1147,9 @@ } }, "node_modules/@appsignal/javascript": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@appsignal/javascript/-/javascript-1.4.1.tgz", - "integrity": "sha512-jdZdXvMWLVdCVtVUbgK45WpxK/FQguQL4EI21ebUib4ySQXU1Hdy2Z6uU8AOcM/CfGtmCIil7EcjEwJMH5UFQg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@appsignal/javascript/-/javascript-1.5.0.tgz", + "integrity": "sha512-Wbf7pzUtksK70ci8kTOhVjd3zgeGFSwXqsGH8Pa/D9b3opJwUwDjbDLhdH7dFSE/lIKWKPoynzOIG+nRHND3vQ==", "dependencies": { "@appsignal/core": "=1.1.24", "@appsignal/types": "=3.0.1", @@ -1157,11 +1157,11 @@ } }, "node_modules/@appsignal/plugin-breadcrumbs-console": { - "version": "1.1.34", - "resolved": "https://registry.npmjs.org/@appsignal/plugin-breadcrumbs-console/-/plugin-breadcrumbs-console-1.1.34.tgz", - "integrity": "sha512-BcfiQ9NEqxVKeZrG/tPWf+VVwwpe/DDZemfYel6X2X2Q5E26fDqmE997dpeo4S5xoPhZnWvs/fMBX6sdTxJ0xg==", + "version": "1.1.35", + "resolved": "https://registry.npmjs.org/@appsignal/plugin-breadcrumbs-console/-/plugin-breadcrumbs-console-1.1.35.tgz", + "integrity": "sha512-3dtblBrWDewQZvipBmwEka44Y+pgQpHQpnu/P9kZqtMuNNuRDRom1+0nIL2PV73jsmbxz+En2rwqTRBxahFZxQ==", "dependencies": { - "@appsignal/javascript": "=1.4.1" + "@appsignal/javascript": "=1.5.0" } }, "node_modules/@appsignal/plugin-breadcrumbs-network": { @@ -22792,9 +22792,9 @@ } }, "@appsignal/javascript": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@appsignal/javascript/-/javascript-1.4.1.tgz", - "integrity": "sha512-jdZdXvMWLVdCVtVUbgK45WpxK/FQguQL4EI21ebUib4ySQXU1Hdy2Z6uU8AOcM/CfGtmCIil7EcjEwJMH5UFQg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@appsignal/javascript/-/javascript-1.5.0.tgz", + "integrity": "sha512-Wbf7pzUtksK70ci8kTOhVjd3zgeGFSwXqsGH8Pa/D9b3opJwUwDjbDLhdH7dFSE/lIKWKPoynzOIG+nRHND3vQ==", "requires": { "@appsignal/core": "=1.1.24", "@appsignal/types": "=3.0.1", @@ -22802,11 +22802,11 @@ } }, "@appsignal/plugin-breadcrumbs-console": { - "version": "1.1.34", - "resolved": "https://registry.npmjs.org/@appsignal/plugin-breadcrumbs-console/-/plugin-breadcrumbs-console-1.1.34.tgz", - "integrity": "sha512-BcfiQ9NEqxVKeZrG/tPWf+VVwwpe/DDZemfYel6X2X2Q5E26fDqmE997dpeo4S5xoPhZnWvs/fMBX6sdTxJ0xg==", + "version": "1.1.35", + "resolved": "https://registry.npmjs.org/@appsignal/plugin-breadcrumbs-console/-/plugin-breadcrumbs-console-1.1.35.tgz", + "integrity": "sha512-3dtblBrWDewQZvipBmwEka44Y+pgQpHQpnu/P9kZqtMuNNuRDRom1+0nIL2PV73jsmbxz+En2rwqTRBxahFZxQ==", "requires": { - "@appsignal/javascript": "=1.4.1" + "@appsignal/javascript": "=1.5.0" } }, "@appsignal/plugin-breadcrumbs-network": { diff --git a/frontend/src/app/features/homescreen/blocks/new-features.component.ts b/frontend/src/app/features/homescreen/blocks/new-features.component.ts index 3b0847db4439..204f008bbee5 100644 --- a/frontend/src/app/features/homescreen/blocks/new-features.component.ts +++ b/frontend/src/app/features/homescreen/blocks/new-features.component.ts @@ -33,9 +33,9 @@ import { I18nService } from 'core-app/core/i18n/i18n.service'; import { imagePath } from 'core-app/shared/helpers/images/path-helper'; // The key used in the I18n files to distinguish between versions. -const OpVersionI18n = '15_0'; +const OpVersionI18n = '15_1'; -const OpReleaseURL = 'https://www.openproject.org/docs/release-notes/15-0-0/'; +const OpReleaseURL = 'https://www.openproject.org/docs/release-notes/15-1-0/'; /** Update the teaser image to the next version */ const featureTeaserImage = `${OpVersionI18n}_features.svg`; diff --git a/frontend/src/app/features/work-packages/components/wp-relations/wp-relations.component.ts b/frontend/src/app/features/work-packages/components/wp-relations/wp-relations.component.ts index de6591921ebe..b1f93d9f1718 100644 --- a/frontend/src/app/features/work-packages/components/wp-relations/wp-relations.component.ts +++ b/frontend/src/app/features/work-packages/components/wp-relations/wp-relations.component.ts @@ -32,6 +32,7 @@ import { Component, ElementRef, Input, + OnDestroy, OnInit, ViewChild, } from '@angular/core'; @@ -56,13 +57,15 @@ import { changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './wp-relations.template.html', }) -export class WorkPackageRelationsComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit { +export class WorkPackageRelationsComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit, OnDestroy { @Input() public workPackage:WorkPackageResource; @ViewChild('frameElement') readonly relationTurboFrame:ElementRef; turboFrameSrc:string; + private turboFrameListener:EventListener = this.updateFrontendData.bind(this); + constructor( private wpRelations:WorkPackageRelationsService, private apiV3Service:ApiV3Service, @@ -77,6 +80,12 @@ export class WorkPackageRelationsComponent extends UntilDestroyedMixin implement this.turboFrameSrc = `${this.PathHelper.staticBase}/work_packages/${this.workPackage.id}/relations_tab`; } + ngOnDestroy() { + super.ngOnDestroy(); + + document.removeEventListener('turbo:submit-end', this.turboFrameListener); + } + ngAfterViewInit() { // Listen to any changes to the relations and update the frame this @@ -104,7 +113,16 @@ export class WorkPackageRelationsComponent extends UntilDestroyedMixin implement cannot listen to the submit end event on the relationTurboFrame element and have to rely on the form action URL. */ - document.addEventListener('turbo:submit-end', (event:CustomEvent) => { + document.addEventListener('turbo:submit-end', this.turboFrameListener); + } + + public updateCounter() { + const url = this.PathHelper.workPackageUpdateCounterPath(this.workPackage.id!, 'relations'); + void this.turboRequests.request(url); + } + + private updateFrontendData(event:CustomEvent) { + if (event) { const form = event.target as HTMLFormElement; const updateWorkPackage = !!form.dataset?.updateWorkPackage; @@ -124,12 +142,7 @@ export class WorkPackageRelationsComponent extends UntilDestroyedMixin implement this.updateCounter(); } } - }); - } - - public updateCounter() { - const url = this.PathHelper.workPackageUpdateCounterPath(this.workPackage.id!, 'relations'); - void this.turboRequests.request(url); + } } private updateRelationsTab() { diff --git a/frontend/src/assets/images/15_0_features.svg b/frontend/src/assets/images/15_1_features.svg similarity index 100% rename from frontend/src/assets/images/15_0_features.svg rename to frontend/src/assets/images/15_1_features.svg diff --git a/modules/avatars/config/locales/crowdin/js-pl.yml b/modules/avatars/config/locales/crowdin/js-pl.yml index aef4746963b9..55c72afa6802 100644 --- a/modules/avatars/config/locales/crowdin/js-pl.yml +++ b/modules/avatars/config/locales/crowdin/js-pl.yml @@ -7,8 +7,8 @@ pl: label_choose_avatar: "Wybierz awatar z pliku" uploading_avatar: "Przesyłanie tego awatara." text_upload_instructions: | - Prześlij swój własny awatar 128 na 128 pikseli. Rozmiar większych plików zostanie zmieniony i zostaną one odpowiednio przycięte. - Podgląd awatara zostanie wyświetlony przed przesłaniem, po wybraniu obrazu. + Prześlij swój awatar rozmiaru 128 na 128 pikseli. Większe pliki zostaną zmniejszone o dopasowane. + Podgląd awatara zostanie wyświetlony przed przesłaniem po wybraniu obrazu. error_image_too_large: "Obraz jest zbyt duży." wrong_file_format: "Dozwolone są formaty jpg, png, gif" empty_file_error: "Prześlij prawidłowy obraz (jpg, png, gif)" diff --git a/modules/bim/app/controllers/bim/bcf/issues_controller.rb b/modules/bim/app/controllers/bim/bcf/issues_controller.rb index 6ae7a6681fa1..b9cb9066c739 100644 --- a/modules/bim/app/controllers/bim/bcf/issues_controller.rb +++ b/modules/bim/app/controllers/bim/bcf/issues_controller.rb @@ -46,10 +46,6 @@ class IssuesController < BaseController def upload; end - def index - redirect_to action: :upload - end - def prepare_import render_next rescue StandardError => e diff --git a/modules/bim/app/views/bim/bcf/issues/index.html.erb b/modules/bim/app/views/bim/bcf/issues/index.html.erb deleted file mode 100644 index 7001d48e0dda..000000000000 --- a/modules/bim/app/views/bim/bcf/issues/index.html.erb +++ /dev/null @@ -1,28 +0,0 @@ - - -<%= toolbar title: t('bcf.issues'), html: {class: '-with-dropdown'} do %> - -
  • - <%= link_to({ action: 'upload' }, - title: I18n.t(:label_import), - class: 'button import-bcf-button') do %> - <%= op_icon('button--icon icon-import') %> - <%= t(:label_import) %> - <% end %> -
  • -
  • - <% query = { f: ['bcfIssueAssociated', '=', ['t']] } %> - <%= link_to(project_work_packages_with_query_path(@project, query, format: :bcf), - title: t('bcf.bcf_xml.export'), - class: 'button export-bcf-button') do %> - <%= op_icon('button--icon icon-export') %> - <%= t('bcf.bcf_xml.export') %> - <% end %> -
  • -<% end %> - -<%= render partial: 'render_issues', locals: { issues: @issues } %> - -<%= pagination_links_full @issues %> diff --git a/modules/bim/config/locales/crowdin/ru.seeders.yml b/modules/bim/config/locales/crowdin/ru.seeders.yml index 46fe7461889d..fc7dd977d2fe 100644 --- a/modules/bim/config/locales/crowdin/ru.seeders.yml +++ b/modules/bim/config/locales/crowdin/ru.seeders.yml @@ -433,24 +433,24 @@ ru: options: name: Приступая к работе text: | - We are glad you joined! We suggest to try a few things to get started in OpenProject. + Мы рады, что Вы присоединились! Мы предлагаем Вам попробовать несколько вещей, чтобы начать работу в OpenProject. - This demo project offers roles, workflows and work packages that are specialized for BIM. + Этот демонстрационный проект предлагает роли, рабочие процессы и рабочие пакеты, специализированные для BIM. - _Try the following steps:_ - - 1. _Invite new members to your project:_ → Go to [Members]({{opSetting:base_url}}/projects/demo-bim-project/members) in the project navigation. - 2. _Upload and view 3D-models in IFC format:_ → Go to [BCF]({{opSetting:base_url}}/projects/demo-bim-project/bcf) in the project navigation. - 3. _Create and manage BCF issues linked directly in the IFC model:_ → Go to [BCF]({{opSetting:base_url}}/projects/demo-bim-project/bcf) → Create. - 4. _View the work in your projects:_ → Go to [Work packages]({{opSetting:base_url}}/projects/demo-bim-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%7B%22n%22%3A%22bcfIssueAssociated%22%2C%22o%22%3A%22%3D%22%2C%22v%22%3A%5B%22f%22%5D%7D%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22list%22%7D) in the project navigation. - 5. _Create a new work package:_ → Go to [Work packages → Create]({{opSetting:base_url}}/projects/demo-bim-project/work_packages/new?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%7B%22n%22%3A%22bcfIssueAssociated%22%2C%22o%22%3A%22%3D%22%2C%22v%22%3A%5B%22f%22%5D%7D%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22list%22%7D&type=11). - 6. _Create and update a Gantt chart:_ → Go to [Gantt chart]({{opSetting:base_url}}/projects/demo-bim-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22assignee%22%2C%22responsible%22%5D%2C%22tv%22%3Atrue%2C%22tzl%22%3A%22weeks%22%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22list%22%7D) in the project navigation. - 7. _Activate further modules:_ → Go to [Project settings → Modules]({{opSetting:base_url}}/projects/demo-bim-project/settings/modules). - 8. _Check out the tile view to get an overview of your BCF issues:_ → Go to [Work packages]({{opSetting:base_url}}/projects/demo-bim-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22id%3Aasc%22%2C%22f%22%3A%5B%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22card%22%7D) - 9. _Working agile? Create a new board:_ → Go to [Boards]({{opSetting:base_url}}/projects/demo-bim-project/boards) + _Попробуйте выполнить следующие шаги:_ - Here you will find our [User Guides](https://www.openproject.org/docs/user-guide/). - Please let us know if you have any questions or need support. Contact us: [support\[at\]openproject.com](mailto:support@openproject.com). + 1. _Пригласите новых участников в Ваш проект:_ → Перейдите в раздел [Участники]({{opSetting:base_url}}/projects/demo-bim-project/members) в навигации проекта. + 2. _Загрузка и просмотр 3D-моделей в формате IFC:_ → Перейдите к разделу [BCF]({{opSetting:base_url}}/projects/demo-bim-project/bcf) в навигации проекта. + 3. _Создание и управление вопросами BCF, связанными непосредственно с моделью IFC:_ → Перейдите к [BCF]({{opSetting:base_url}}/projects/demo-bim-project/bcf) → Создать. + 4. _Просмотр работ в Ваших проектах:_ → Перейдите в раздел [Рабочие пакеты]({{opSetting:base_url}}/projects/demo-bim-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%7B%22n%22%3A%22bcfIssueAssociated%22%2C%22o%22%3A%22%3D%22%2C%22v%22%3A%5B%22f%22%5D%7D%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22list%22%7D) в навигации проекта. + 5. _Создайте новый рабочий пакет:_ → Перейдите в раздел [Рабочие пакеты → Создать]({{opSetting:base_url}}/projects/demo-bim-project/work_packages/new?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%7B%22n%22%3A%22bcfIssueAssociated%22%2C%22o%22%3A%22%3D%22%2C%22v%22%3A%5B%22f%22%5D%7D%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22list%22%7D&type=11). + 6. _Создание и обновление диаграммы Ганта:_ → Перейдите на страницу [Диаграмма Ганта]({{opSetting:base_url}}/projects/demo-bim-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22assignee%22%2C%22responsible%22%5D%2C%22tv%22%3Atrue%2C%22tzl%22%3A%22weeks%22%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22list%22%7D) в навигации проекта. + 7. _Активируйте дальнейшие модули:_ → Перейдите в раздел [Настройки проекта → Модули]({{opSetting:base_url}}/projects/demo-bim-project/settings/modules). + 8. _Проверьте плиточный вид, чтобы получить обзор Ваших BCF-проблем:_ → Перейдите в раздел [Рабочие пакеты]({{opSetting:base_url}}/projects/demo-bim-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22id%3Aasc%22%2C%22f%22%3A%5B%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22card%22%7D) + 9. _Работаете в стиле agile? Создайте новую доску:_ → Перейдите в раздел [Доски]({{opSetting:base_url}}/projects/demo-bim-project/boards) + + Здесь Вы найдете наши [Руководства пользователя](https://www.openproject.org/docs/user-guide/). + Пожалуйста, сообщите нам, если у Вас возникнут вопросы или Вам понадобится поддержка. Свяжитесь с нами: [support\[at\]openproject.com](mailto:support@openproject.com). item_4: options: name: Участники @@ -709,23 +709,23 @@ ru: options: name: Приступая к работе text: | - We are glad you joined! We suggest to try a few things to get started in OpenProject. + Мы рады, что Вы присоединились! Мы предлагаем Вам попробовать несколько вещей, чтобы начать работу в OpenProject. - This demo project shows BCF management functionalities. + Этот демо-проект демонстрирует функциональные возможности управления BCF. - _Try the following steps:_ - - 1. _Invite new members to your project:_ → Go to [Members]({{opSetting:base_url}}/projects/demo-bcf-management-project/members?show_add_members=true) in the project navigation. - 2. _Upload and view 3D-models in IFC format:_ → Go to [BCF]({{opSetting:base_url}}/projects/demo-bim-project/bcf) in the project navigation. - 3. _Create and manage BCF issues linked directly in the IFC model:_ → Go to [BCF]({{opSetting:base_url}}/projects/demo-bim-project/bcf) → Create. - 4. _View the BCF files in your project:_ → Go to [BCF]({{opSetting:base_url}}/projects/demo-bcf-management-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22status%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22id%3Aasc%22%2C%22f%22%3A%5B%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22card%22%7D) in the project navigation. - 5. _Load your BCF files:_ → Go to [BCF → Import.]({{opSetting:base_url}}/projects/demo-bcf-management-project/issues/upload) - 6. _Create and update a Gantt chart:_ → Go to [Gantt chart]({{opSetting:base_url}}/projects/demo-bcf-management-project/work_packages?query_props=%7B%22c%22%3A%5B%22id%22%2C%22subject%22%2C%22startDate%22%2C%22dueDate%22%5D%2C%22tv%22%3Atrue%2C%22tzl%22%3A%22days%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%7B%22n%22%3A%22status%22%2C%22o%22%3A%22o%22%2C%22v%22%3A%5B%5D%7D%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%7D) in the project navigation. - 7. _Activate further modules:_ → Go to [Project settings → Modules.]({{opSetting:base_url}}/projects/demo-bcf-management-project/settings/modules) - 8. _You love the agile approach? Create a board:_ → Go to [Boards]({{opSetting:base_url}}/projects/demo-bcf-management-project/boards). + _Попробуйте выполнить следующие шаги:_ - Here you will find our [User Guides](https://www.openproject.org/docs/user-guide/). - Please let us know if you have any questions or need support. Contact us: [support\[at\]openproject.com](mailto:support@openproject.com). + 1. _Пригласите новых участников в Ваш проект:_ → Перейдите в [Участники]({{opSetting:base_url}}/projects/demo-bcf-management-project/members?show_add_members=true) в навигации проекта. + 2. _Загрузка и просмотр 3D-моделей в формате IFC:_ → Перейдите к [BCF]({{opSetting:base_url}}/projects/demo-bim-project/bcf) в навигации проекта. + 3. _Создание и управление вопросами BCF, связанными непосредственно с моделью IFC:_ → Перейдите к [BCF]({{opSetting:base_url}}/projects/demo-bim-project/bcf) → Создать. + 4. _Просмотр файлов BCF в Вашем проекте:_ → Перейдите к [BCF]({{opSetting:base_url}}/projects/demo-bcf-management-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22status%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22id%3Aasc%22%2C%22f%22%3A%5B%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22card%22%7D) в навигации проекта. + 5. _Загрузите файлы BCF:_ → Перейдите по ссылке [BCF → Импорт.]({{opSetting:base_url}}/projects/demo-bcf-management-project/issues/upload) + 6. _Создание и обновление диаграммы Ганта:_ → Перейдите к [Диаграмма Ганта]({{opSetting:base_url}}/projects/demo-bcf-management-project/work_packages?query_props=%7B%22c%22%3A%5B%22id%22%2C%22subject%22%2C%22startDate%22%2C%22dueDate%22%5D%2C%22tv%22%3Atrue%2C%22tzl%22%3A%22days%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%7B%22n%22%3A%22status%22%2C%22o%22%3A%22o%22%2C%22v%22%3A%5B%5D%7D%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%7D) в навигации проекта. + 7. _Активируйте дальнейшие модули:_ → Перейдите в раздел [Настройки проекта → Модули.]({{opSetting:base_url}}/projects/demo-bcf-management-project/settings/modules) + 8. _Вам нравится agile-подход? Создайте доску:_ → Перейдите в раздел [Доски]({{opSetting:base_url}}/projects/demo-bcf-management-project/boards). + + Здесь Вы найдете наши [Руководства пользователя](https://www.openproject.org/docs/user-guide/). + Пожалуйста, сообщите нам, если у Вас возникнут вопросы или Вам понадобится поддержка. Свяжитесь с нами: [support\[at\]openproject.com](mailto:support@openproject.com). item_4: options: name: Участники diff --git a/modules/bim/config/routes.rb b/modules/bim/config/routes.rb index 18ced9377ee2..b6e8c749e3af 100644 --- a/modules/bim/config/routes.rb +++ b/modules/bim/config/routes.rb @@ -33,7 +33,7 @@ scope "projects/:project_id", as: "project" do get "bcf/menu" => "bim/menus#show" - resources :issues, controller: "bim/bcf/issues" do + resources :issues, controller: "bim/bcf/issues", except: :index do get :upload, action: :upload, on: :collection post :prepare_import, action: :prepare_import, on: :collection post :configure_import, action: :configure_import, on: :collection diff --git a/modules/bim/lib/open_project/bim/engine.rb b/modules/bim/lib/open_project/bim/engine.rb index fb7deae4ad75..53e9e5a3aff8 100644 --- a/modules/bim/lib/open_project/bim/engine.rb +++ b/modules/bim/lib/open_project/bim/engine.rb @@ -57,12 +57,12 @@ class Engine < ::Rails::Engine dependencies: %i[view_ifc_models], contract_actions: { ifc_models: %i[create update destroy] } permission :view_linked_issues, - { "bim/bcf/issues": %i[index] }, + {}, permissible_on: :project, dependencies: %i[view_work_packages], contract_actions: { bcf: %i[read] } permission :manage_bcf, - { "bim/bcf/issues": %i[index upload prepare_import configure_import perform_import] }, + { "bim/bcf/issues": %i[upload prepare_import configure_import perform_import] }, permissible_on: :project, dependencies: %i[view_linked_issues view_work_packages diff --git a/modules/boards/app/views/boards/boards/overview.html.erb b/modules/boards/app/views/boards/boards/overview.html.erb deleted file mode 100644 index 95736aa6903f..000000000000 --- a/modules/boards/app/views/boards/boards/overview.html.erb +++ /dev/null @@ -1,40 +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. - -++#%> - -<% html_title(t('boards.label_boards')) -%> - -<%= toolbar title: t('boards.label_boards') do %> - <%= render Boards::AddButtonComponent.new %> -<% end %> - -<% if @board_grids.empty? -%> - <%= no_results_box %> -<% else -%> -<%= render Boards::TableComponent.new(rows: @board_grids, current_user: User.current) %> -<% end -%> diff --git a/modules/costs/config/locales/crowdin/de.yml b/modules/costs/config/locales/crowdin/de.yml index 7adc1c821350..add466c5965a 100644 --- a/modules/costs/config/locales/crowdin/de.yml +++ b/modules/costs/config/locales/crowdin/de.yml @@ -133,10 +133,10 @@ de: permission_view_own_hourly_rate: "Eigene Stundensätze ansehen" permission_view_own_time_entries: "Eigene gebuchte Aufwände ansehen" project_module_costs: "Zeit und Kosten" - setting_allow_tracking_start_and_end_times: "Allow users to track start and end time on time records" - setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" - setting_enforce_tracking_start_and_end_times: "Force users to set start and end time on time records" + setting_allow_tracking_start_and_end_times: "Nutzern erlauben Start- und Endzeiten bei Zeitbuchungen zu erfassen." + setting_costs_currency: "Währung" + setting_costs_currency_format: "Format der Währung" + setting_enforce_tracking_start_and_end_times: "Das Setzen von Start- und Endzeiten bei Zeitbuchungen erzwingen." text_assign_time_and_cost_entries_to_project: "Gebuchte Aufwände dem Projekt zuweisen" text_destroy_cost_entries_question: "Es wurden bereits %{cost_entries} auf dieses Ticket gebucht. Was soll mit den Aufwänden geschehen?" text_destroy_time_and_cost_entries: "Gebuchte Aufwände löschen" diff --git a/modules/costs/config/locales/crowdin/nl.yml b/modules/costs/config/locales/crowdin/nl.yml index 0f3bb09fe49a..505efed26764 100644 --- a/modules/costs/config/locales/crowdin/nl.yml +++ b/modules/costs/config/locales/crowdin/nl.yml @@ -109,7 +109,7 @@ nl: label_rate: "Tarief" label_rate_plural: "Tarieven" label_status_finished: "Afgewerkt" - label_show: "Show" + label_show: "Toon" label_units: "Kosten eenheden" label_user: "Gebruiker" label_until: "tot" @@ -133,10 +133,10 @@ nl: permission_view_own_hourly_rate: "Bekijk eigen uurtarief" permission_view_own_time_entries: "Bekijk eigen bestede tijd" project_module_costs: "Tijd en kosten" - setting_allow_tracking_start_and_end_times: "Allow users to track start and end time on time records" - setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" - setting_enforce_tracking_start_and_end_times: "Force users to set start and end time on time records" + setting_allow_tracking_start_and_end_times: "Gebruikers toestaan om begin- en eindtijd bij te houden op tijdregistraties" + setting_costs_currency: "Valuta" + setting_costs_currency_format: "Formaat van valuta" + setting_enforce_tracking_start_and_end_times: "Forceer gebruikers om de start- en eindtijd op tijdrecords in te stellen" text_assign_time_and_cost_entries_to_project: "Gerapporteerde uren en kosten aan het project toewijzen" text_destroy_cost_entries_question: "%{cost_entries} werd gerapporteerd op de werkpakketten die je gaat verwijderen. Wat wil je doen?" text_destroy_time_and_cost_entries: "Gerapporteerde uren en kosten verwijderen" diff --git a/modules/costs/config/locales/crowdin/ru.yml b/modules/costs/config/locales/crowdin/ru.yml index b6affba400c4..0978d24827af 100644 --- a/modules/costs/config/locales/crowdin/ru.yml +++ b/modules/costs/config/locales/crowdin/ru.yml @@ -135,10 +135,10 @@ ru: permission_view_own_hourly_rate: "Просмотр своей почасовой ставки" permission_view_own_time_entries: "Просмотр своего отработанного времени" project_module_costs: "Время и затраты" - setting_allow_tracking_start_and_end_times: "Allow users to track start and end time on time records" + setting_allow_tracking_start_and_end_times: "Разрешить пользователям отслеживать время начала и окончания учёта рабочего времени" setting_costs_currency: "Валюта" setting_costs_currency_format: "Формат валюты" - setting_enforce_tracking_start_and_end_times: "Force users to set start and end time on time records" + setting_enforce_tracking_start_and_end_times: "Обязательное время начала и окончания учёта рабочего времени" 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/costs/config/locales/crowdin/zh-TW.yml b/modules/costs/config/locales/crowdin/zh-TW.yml index 08d5d86aec78..8920221aa598 100644 --- a/modules/costs/config/locales/crowdin/zh-TW.yml +++ b/modules/costs/config/locales/crowdin/zh-TW.yml @@ -132,10 +132,10 @@ zh-TW: permission_view_own_hourly_rate: "查看自己的小時費率" permission_view_own_time_entries: "查看自己的耗時" project_module_costs: "時間與費用" - setting_allow_tracking_start_and_end_times: "Allow users to track start and end time on time records" + setting_allow_tracking_start_and_end_times: "" setting_costs_currency: "貨幣" setting_costs_currency_format: " 貨幣格式" - setting_enforce_tracking_start_and_end_times: "Force users to set start and end time on time records" + setting_enforce_tracking_start_and_end_times: "強制使用者在時間記錄上設定開始和結束時間" 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/github_integration/spec/workers/cron/check_deploy_status_job_spec.rb b/modules/github_integration/spec/workers/cron/check_deploy_status_job_spec.rb index c4d9999186a5..5843b87e0404 100644 --- a/modules/github_integration/spec/workers/cron/check_deploy_status_job_spec.rb +++ b/modules/github_integration/spec/workers/cron/check_deploy_status_job_spec.rb @@ -101,7 +101,7 @@ { "Accept" => "*/*", "Accept-Encoding" => "gzip, deflate", - "User-Agent" => "httpx.rb/1.3.3" + "User-Agent" => "httpx.rb/1.3.4" } end diff --git a/modules/meeting/config/locales/crowdin/ja.yml b/modules/meeting/config/locales/crowdin/ja.yml index 50e4951963fb..dfa3e09c76e7 100644 --- a/modules/meeting/config/locales/crowdin/ja.yml +++ b/modules/meeting/config/locales/crowdin/ja.yml @@ -132,7 +132,7 @@ ja: send_invitation_emails: > Send an email invitation immediately to the participants selected above. You can also do this manually at any time later. send_invitation_emails_structured: "Send an email invitation immediately to all participants. You can also do this manually at any time later." - open_meeting_link: "Open meeting" + open_meeting_link: "会議を開く" invited: summary: "%{actor} has sent you an invitation for the meeting %{title}" rescheduled: @@ -147,8 +147,8 @@ ja: classic_text: "Organize your meeting in a formattable text agenda and protocol." structured: "Dynamic" structured_text: "Organize your meeting as a list of agenda items, optionally linking them to a work package." - structured_text_copy: "Copying a meeting will currently not copy the associated meeting agenda items, just the details" - copied: "ミーティング#%{id}からコピーしました" + structured_text_copy: "会議をコピーする場合、現在は関連する議題項目はコピーされず、詳細のみがコピーされます。" + copied: "ミーティング#%{id} からコピーしました" meeting_section: untitled_title: "Untitled section" delete_confirmation: "Deleting the section will also delete all of its agenda items. Are you sure you want to do this?" diff --git a/modules/meeting/config/locales/crowdin/js-ja.yml b/modules/meeting/config/locales/crowdin/js-ja.yml index 0e11b465830e..f48b8d41e5c1 100644 --- a/modules/meeting/config/locales/crowdin/js-ja.yml +++ b/modules/meeting/config/locales/crowdin/js-ja.yml @@ -24,4 +24,4 @@ ja: label_meetings: '会議' work_packages: tabs: - meetings: 'Meetings' + meetings: '会議' diff --git a/modules/meeting/config/locales/crowdin/nl.yml b/modules/meeting/config/locales/crowdin/nl.yml index 5f25c50a86dc..e26043e0b8ff 100644 --- a/modules/meeting/config/locales/crowdin/nl.yml +++ b/modules/meeting/config/locales/crowdin/nl.yml @@ -71,7 +71,7 @@ nl: updated: "veranderd van %{old_value} naar %{value}" updated_html: "gewijzigd van %{old_value} naar %{value}" position: - updated: "reordered" + updated: "herschikken" work_package: updated: "veranderd van %{old_value} naar %{value}" updated_html: "gewijzigd van %{old_value} naar %{value}" @@ -88,19 +88,19 @@ nl: label_meeting: "Vergadering" label_meeting_plural: "Vergaderingen" label_meeting_new: "Nieuwe vergadering" - label_meeting_new_dynamic: "New dynamic meeting" - label_meeting_create: "Create meeting" - label_meeting_copy: "Copy meeting" + label_meeting_new_dynamic: "Nieuwe dynamische vergadering" + label_meeting_create: "Creëer vergadering" + label_meeting_copy: "Kopie vergadering" label_meeting_edit: "Vergadering bewerken" label_meeting_agenda: "Agenda" label_meeting_minutes: "Notulen" label_meeting_close: "Sluiten" label_meeting_open: "Open" - label_meeting_index_delete: "Delete" - label_meeting_open_this_meeting: "Open this meeting" + label_meeting_index_delete: "Verwijderen" + label_meeting_open_this_meeting: "Open deze vergadering" label_meeting_agenda_close: "Sluit de agenda om de notulen te beginnen" label_meeting_date_time: "Datum/Tijd" - label_meeting_date_and_time: "Date and time" + label_meeting_date_and_time: "Datum en tijd" label_meeting_diff: "Diff" label_upcoming_meetings: "Geplande vergaderingen" label_past_meetings: "Eerdere vergaderingen" @@ -119,20 +119,20 @@ nl: label_start_date: "Startdatum" meeting: attachments: - text: "Attached files are available to all meeting participants. You can also drag and drop these into agenda item notes." + text: "Bijgevoegde bestanden zijn beschikbaar voor alle deelnemers aan de vergadering. U kunt deze ook naar agendapunt notities slepen." copy: title: "Kopieer vergadering: %{title}" attachments: "Bijlagen kopiëren" - attachments_text: "Copy over all attached files to the new meeting" + attachments_text: "Kopieer alle bijgevoegde bestanden naar de nieuwe vergadering" agenda: "Agenda kopiëren" - agenda_items: "Copy agenda items" + agenda_items: "Agendapunten kopiëren" agenda_text: "Kopieer de agenda van de oude vergadering" - participants: "Copy list of participants" + participants: "Kopieer lijst van deelnemers" email: send_emails: "Email participants" send_invitation_emails: > - Send an email invitation immediately to the participants selected above. You can also do this manually at any time later. - send_invitation_emails_structured: "Send an email invitation immediately to all participants. You can also do this manually at any time later." + Stuur onmiddellijk een e-mailuitnodiging naar de hierboven geselecteerde deelnemers. U kunt dit ook later op elk gewenst moment handmatig doen. + send_invitation_emails_structured: "Stuur onmiddellijk een e-mailuitnodiging naar de hierboven geselecteerde deelnemers. U kunt dit ook later op elk gewenst moment handmatig doen." open_meeting_link: "Open vergadering" invited: summary: "%{actor} heeft je een uitnodiging gestuurd voor de meeting %{title}" @@ -154,10 +154,10 @@ nl: untitled_title: "Naamloze sectie" delete_confirmation: "Deleting the section will also delete all of its agenda items. Are you sure you want to do this?" placeholder_title: "Nieuwe Sectie" - empty_text: "Drag items here or create a new one" + empty_text: "Sleep items hierheen of maak een nieuwe" notice_successful_notification: "Notificatie succesvol verzonden" notice_timezone_missing: Geen tijdzone is ingesteld en %{zone} is aangenomen. Om uw tijdzone te kiezen, klik dan hier. - notice_meeting_updated: "This page has been updated by someone else. Reload to view changes." + notice_meeting_updated: "Deze pagina is door iemand anders bijgewerkt. Herlaad om wijzigingen te bekijken." permission_create_meetings: "Creëer vergaderingen" permission_edit_meetings: "Vergaderingen bewerken" permission_delete_meetings: "Verwijder vergaderingen" @@ -181,7 +181,7 @@ nl: text_meeting_minutes_for_meeting: 'minuten voor de vergadering "%{meeting}"' text_notificiation_invited: "Deze mail bevat een ics item voor de vergadering hieronder:" text_meeting_empty_heading: "Je vergadering is leeg" - text_meeting_empty_description_1: "Start by adding agenda items below. Each item can be as simple as just a title, but you can also add additional details like duration and notes." + text_meeting_empty_description_1: "Begin met het toevoegen van agendapunten hieronder. Elk item kan zo eenvoudig zijn als alleen een titel, maar u kunt ook extra gegevens toevoegen, zoals duur en aantekeningen." text_meeting_empty_description_2: 'Je kunt ook verwijzingen naar bestaande werkpakketten toevoegen. Wanneer je dit doet, zullen gerelateerde notities automatisch zichtbaar zijn in het tabblad "Vergaderingen" van het werkpakket.' label_meeting_empty_action: "Agendapunt toevoegen" label_meeting_actions: "Vergadering acties" @@ -189,9 +189,9 @@ nl: label_meeting_delete: "Verwijder vergadering" label_meeting_created_by: "Gemaakt door" label_meeting_last_updated: "Laatst bijgewerkt" - label_meeting_reload: "Reload" + label_meeting_reload: "Herladen" label_agenda_items: "Agendapunten" - label_agenda_items_reordered: "reordered" + label_agenda_items_reordered: "herschikken" label_agenda_item_remove: "Van de agenda schrappen" label_agenda_item_undisclosed_wp: "Werkpakket #%{id} niet zichtbaar" label_agenda_item_deleted_wp: "Verwijderde verwijzing naar het werkpakket" @@ -227,9 +227,9 @@ nl: label_add_work_package_to_meeting_dialog_title: "Werkpakket aan vergadering toevoegen" label_add_work_package_to_meeting_dialog_button: "Toevoegen aan vergadering" label_meeting_selection_caption: "It's only possible to add this work package to upcoming or ongoing open meetings." - text_add_work_package_to_meeting_description: "A work package can be added to one or multiple meetings for discussion. Any notes concerning it are also visible here." + text_add_work_package_to_meeting_description: "Een werkpakket kan worden toegevoegd aan één of meerdere vergaderingen voor bespreking. Eventuele notities zijn hier ook zichtbaar." text_agenda_item_no_notes: "Geen aantekeningen voorzien" text_agenda_item_not_editable_anymore: "Dit agendapunt kan niet meer bewerkt worden." text_work_package_has_no_upcoming_meeting_agenda_items: "Dit werkpakket staat nog niet op de agenda van een komende vergadering." - text_work_package_add_to_meeting_hint: 'Use the "Add to meeting" button to add this work package to an upcoming meeting.' + text_work_package_add_to_meeting_hint: 'Gebruik de knop "Aan vergadering toevoegen" om dit werkpakket aan een komende vergadering toe te voegen.' text_work_package_has_no_past_meeting_agenda_items: "Dit werkpakket werd tijdens een vorige vergadering niet genoemd." diff --git a/modules/openid_connect/config/locales/crowdin/de.yml b/modules/openid_connect/config/locales/crowdin/de.yml index 8a14fcc37266..b58b9f09b335 100644 --- a/modules/openid_connect/config/locales/crowdin/de.yml +++ b/modules/openid_connect/config/locales/crowdin/de.yml @@ -62,7 +62,7 @@ de: limit_self_registration: Wenn diese Option aktiviert ist, können sich Benutzer nur dann über diesen Anbieter registrieren, wenn die Konfiguration aufseiten des Anbieters dies zulässt. display_name: Der Name des Anbieters. Dieser wird als Anmeldeschaltfläche und in der Liste der Anbieter angezeigt. tenant: 'Bitte ersetzen Sie den vorgegebenen Mandanten durch Ihren eigenen, falls zutreffend. Siehe diese Dokumentation von Microsoft Entra.' - scope: If you want to request custom scopes, you can add one or multiple scope values separated by spaces here. For more information, see the [OpenID Connect documentation](docs_url). + scope: Wenn Sie benutzerdefinierte Scopes anfordern möchten, können Sie hier einen oder mehrere durch Leerzeichen getrennte Werte hinzufügen. Weitere Informationen finden Sie in der [OpenID Connect Dokumentation](docs_url). post_logout_redirect_uri: Die URL, an die der OpenID Connect-Anbieter nach einer erfolgreichen Abmeldung weiterleiten soll. claims: > Sie können zusätzliche Ansprüche (Claims) für die Endpunkte userinfo und id token anfordern. Weitere Informationen finden Sie in [unserer OpenID Connect Dokumentation](docs_url). @@ -83,7 +83,7 @@ de: metadata_url: Ich habe eine Discovery-Endpunkt-URL endpoint_url: Endpunkt-URL providers: - label_providers: "Providers" + label_providers: "Provider" seeded_from_env: "Dieser Anbieter wurde über Umgebungsvariablen konfiguriert. Er kann nicht in der Oberfläche bearbeitet werden." google: name: Google diff --git a/modules/openid_connect/config/locales/crowdin/nl.yml b/modules/openid_connect/config/locales/crowdin/nl.yml index bc911eb93e8b..796203bf7f2b 100644 --- a/modules/openid_connect/config/locales/crowdin/nl.yml +++ b/modules/openid_connect/config/locales/crowdin/nl.yml @@ -1,7 +1,7 @@ nl: plugin_openproject_openid_connect: name: "OpenProject OpenID Connect" - description: "Adds OmniAuth OpenID Connect strategy providers to OpenProject." + description: "Voegt OmniAuth OpenID Connect strategieproviders toe aan OpenProject." logout_warning: > U bent uitgelogd. De inhoud van uw formulier kan verloren gaan. Alstublieft [log in]. activemodel: @@ -15,18 +15,18 @@ nl: secret: Geheim scope: Scope limit_self_registration: Beperk zelf-registratie - authorization_endpoint: Authorization endpoint - userinfo_endpoint: User information endpoint - token_endpoint: Token endpoint - end_session_endpoint: End session endpoint - post_logout_redirect_uri: Post logout redirect URI + authorization_endpoint: Autorisatie eindpunt + userinfo_endpoint: Eindpunt gebruikersinformatie + token_endpoint: Eindpunt token + end_session_endpoint: End sessie endpoint + post_logout_redirect_uri: URI voor doorsturen na uitloggen jwks_uri: JWKS URI - issuer: Issuer - tenant: Tenant - metadata_url: Metadata URL - icon: Custom icon + issuer: Uitgever + tenant: Huurder + metadata_url: Metagegevens URL + icon: Aangepast icoon claims: Claims - acr_values: ACR values + acr_values: ACR waarden redirect_url: Redirect URL activerecord: errors: @@ -35,17 +35,17 @@ nl: attributes: metadata_url: format: "Discovery endpoint URL %{message}" - response_is_not_successful: " responds with %{status}." - response_is_not_json: " does not return JSON body." - response_misses_required_attributes: " does not return required attributes. Missing attributes are: %{missing_attributes}." + response_is_not_successful: " reageert met %{status}." + response_is_not_json: " retourneert geen JSON body." + response_misses_required_attributes: " geeft niet de vereiste attributen terug. Ontbrekende attributen zijn: %{missing_attributes}." provider: delete_warning: - input_delete_confirmation: Enter the provider name %{name} to confirm deletion. - irreversible_notice: Deleting an SSO provider is an irreversible action. - provider: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' - delete_result_1: Remove the provider from the list of available providers. + input_delete_confirmation: Voer de providernaam %{name} in om de verwijdering te bevestigen. + irreversible_notice: Het verwijderen van een SSO provider is een onomkeerbare actie. + provider: 'Weet u zeker dat u de SSO provider %{name} wilt verwijderen? Voer de naam van de provider in het onderstaande veld in om deze actie te bevestigen, dit wil:' + delete_result_1: Verwijder de provider uit de lijst met beschikbare providers. delete_result_user_count: - zero: No users are currently using this provider. No further action is required. + zero: Er zijn momenteel geen gebruikers die deze provider gebruiken. Er is geen verdere actie vereist. one: "One user is currently still using this provider. They will need to be re-invited or logging in with another provider." other: "%{count} users are currently still using this provider. They will need to be re-invited or logging in with another provider." delete_result_direct: This provider is marked as a direct login provider. The setting will be removed and users will no longer be redirected to the provider for login. diff --git a/modules/openid_connect/config/locales/crowdin/ru.yml b/modules/openid_connect/config/locales/crowdin/ru.yml index 3732d4ac1c30..09d5c477af7e 100644 --- a/modules/openid_connect/config/locales/crowdin/ru.yml +++ b/modules/openid_connect/config/locales/crowdin/ru.yml @@ -62,7 +62,7 @@ ru: limit_self_registration: Если эта опция включена, пользователи смогут регистрироваться у этого провайдера только в том случае, если конфигурация провайдера позволяет это делать. display_name: Это имя провайдера. Оно будет отображаться как кнопка входа и в списке провайдеров. tenant: 'Пожалуйста, замените владельца по умолчанию на своего собственного, если это применимо. См. это.' - scope: If you want to request custom scopes, you can add one or multiple scope values separated by spaces here. For more information, see the [OpenID Connect documentation](docs_url). + scope: Если Вы хотите запросить пользовательские области видимости, Вы можете добавить здесь одно или несколько значений диапазона, разделенных пробелами. Более подробную информацию Вы найдете в [документации OpenID Connect](docs_url). post_logout_redirect_uri: URL-адрес, на который провайдер OpenID Connect должен перенаправить Вас после запроса на выход из системы. claims: > Вы можете запросить дополнительные требования к конечным точкам пользовательской информации и id токена. Пожалуйста, обратитесь к [нашей документации для OpenID подключения](docs_url) для получения дополнительной информации. diff --git a/modules/recaptcha/config/locales/crowdin/nl.yml b/modules/recaptcha/config/locales/crowdin/nl.yml index 6f6a09791fac..863c3886c5f8 100644 --- a/modules/recaptcha/config/locales/crowdin/nl.yml +++ b/modules/recaptcha/config/locales/crowdin/nl.yml @@ -9,7 +9,7 @@ nl: verify_account: "Verifieer je account" error_captcha: "Uw account kon niet worden geverifieerd. Neem contact op met een beheerder." settings: - website_key: 'Website key (May also be called "Site key")' + website_key: 'Websleutel (Kan ook "Site key" worden genoemd)' response_limit: 'Antwoordlimiet voor HCaptcha' response_limit_text: 'Het maximum aantal tekens om het HCaptcha antwoord als geldig te behandelen.' website_key_text: 'Vul de website sleutel in die je hebt gemaakt op de reCAPTCHA admin console voor dit domein.' @@ -22,4 +22,4 @@ nl: type_hcaptcha: 'HCaptcha' type_turnstile: 'Cloudflare Turnstile™' captcha_description_html: > - reCAPTCHA is a free service by Google that can be enabled for your OpenProject instance. If enabled, a captcha form will be rendered upon login for all users that have not verified a captcha yet.
    Please see the following link for more details on reCAPTCHA and their versions, and how to create the website and secret keys: %{recaptcha_link}
    HCaptcha is a Google-free alternative that you can use if you do not want to use reCAPTCHA. See this link for more information: %{hcaptcha_link}
    Cloudflare Turnstile™ is another alternative that is more convenient for users while still providing the same level of security. See this link for more information: %{turnstile_link} + reCAPTCHA is een gratis service van Google die ingeschakeld kan worden voor uw OpenProject-instantie. Indien ingeschakeld, wordt er bij het inloggen een captcha-formulier weergegeven voor alle gebruikers die nog geen captcha hebben geverifieerd.
    Zie de volgende link voor meer details over reCAPTCHA en hun versies, en hoe u de website en geheime sleutels aanmaakt: %{recaptcha_link}
    HCaptcha is een Google-vrij alternatief dat u kunt gebruiken als u reCAPTCHA niet wilt gebruiken. Zie deze link voor meer informatie: %{hcaptcha_link}
    Cloudflare Turnstile™ is een ander alternatief dat handiger is voor gebruikers en toch hetzelfde beveiligingsniveau biedt. Zie deze koppeling voor meer informatie: %{turnstile_link} diff --git a/modules/reporting/config/locales/crowdin/nl.yml b/modules/reporting/config/locales/crowdin/nl.yml index 6caa6021b612..13c1214251bd 100644 --- a/modules/reporting/config/locales/crowdin/nl.yml +++ b/modules/reporting/config/locales/crowdin/nl.yml @@ -23,7 +23,7 @@ nl: plugin_openproject_reporting: name: "OpenProject Rapportage" description: "This plugin allows creating custom cost reports with filtering and grouping created by the OpenProject Time and costs plugin." - button_save_report_as: "Save report as..." + button_save_report_as: "Rapport opslaan als..." comments: "Commentaar" cost_reports_title: "Tijd en kosten" label_cost_report: "Kostenrapport" diff --git a/modules/storages/spec/common/storages/peripherals/storage_interaction/nextcloud/remove_user_from_group_command_spec.rb b/modules/storages/spec/common/storages/peripherals/storage_interaction/nextcloud/remove_user_from_group_command_spec.rb index 993d769f68d6..498de7cca273 100644 --- a/modules/storages/spec/common/storages/peripherals/storage_interaction/nextcloud/remove_user_from_group_command_spec.rb +++ b/modules/storages/spec/common/storages/peripherals/storage_interaction/nextcloud/remove_user_from_group_command_spec.rb @@ -72,16 +72,10 @@ before do create_group(auth, storage, group) add_user_to_group(user, group) - - # There is a bug in the group folder API that does not allow to remove a user from a group, - # if this is its last group - create_group(auth, storage, "Sith Assassins Backup") - add_user_to_group(user, "Sith Assassins Backup") end after do remove_group(auth, storage, group) - remove_group(auth, storage, "Sith Assassins Backup") end it "returns a success" do diff --git a/modules/storages/spec/support/fixtures/vcr_cassettes/nextcloud/remove_user_from_group_success.yml b/modules/storages/spec/support/fixtures/vcr_cassettes/nextcloud/remove_user_from_group_success.yml index 3622540470ff..9f567bfdc12b 100644 --- a/modules/storages/spec/support/fixtures/vcr_cassettes/nextcloud/remove_user_from_group_success.yml +++ b/modules/storages/spec/support/fixtures/vcr_cassettes/nextcloud/remove_user_from_group_success.yml @@ -12,7 +12,7 @@ http_interactions: Ocs-Apirequest: - 'true' User-Agent: - - httpx.rb/1.3.1 + - httpx.rb/1.3.3 Accept: - "*/*" Accept-Encoding: @@ -35,30 +35,26 @@ http_interactions: Content-Type: - application/xml; charset=utf-8 Date: - - Wed, 02 Oct 2024 08:50:34 GMT - Expires: - - Thu, 19 Nov 1981 08:52:00 GMT + - Thu, 28 Nov 2024 14:30:01 GMT Feature-Policy: - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';payment 'none' - Pragma: - - no-cache Referrer-Policy: - no-referrer Server: - - Apache/2.4.59 (Debian) + - Apache/2.4.62 (Debian) Set-Cookie: - - oc07ul6b4oaw=9762849c349fec419d4d915242d15e12; path=/; secure; HttpOnly; SameSite=Lax, - oc_sessionPassphrase=DZ6L8GHmQgY2z%2B3foy2pUqmyeMgyiphLjNdRgVJ730AI27UtJHnhpTapN6kiLCTtskMoKUaXrPc15eL3LtZwYfw4Eve42BLZMzJG8s2unmeF%2B4cqZz%2FvWFGsYrDU4gj3; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=9762849c349fec419d4d915242d15e12; + - oc07ul6b4oaw=21c9dc077368b09dd0ccef059539746a; path=/; secure; HttpOnly; SameSite=Lax, + oc_sessionPassphrase=9emV%2BdNp8kCMiTlMOsInpolUEx1yOWHm5HiBNoUBCxec5k%2BktQuDYj4aO38QEtHfO3zTck5ACGzgZ3PV4xJZom77Ac6qy9%2BABSxeAxMqtE4ta4dpp2jBrk3r%2Fzhwb0mE; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=21c9dc077368b09dd0ccef059539746a; 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, oc07ul6b4oaw=9762849c349fec419d4d915242d15e12; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=9762849c349fec419d4d915242d15e12; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=1e76183d834700018922edb625e879e2; - path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Wed, 02 - Oct 2024 09:50:35 GMT; Max-Age=3600 + 31-Dec-2100 23:59:59 GMT; SameSite=strict, oc07ul6b4oaw=21c9dc077368b09dd0ccef059539746a; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=21c9dc077368b09dd0ccef059539746a; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=311d0429cc20407278845a667f6d80ad; + path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Thu, 28 + Nov 2024 15:30:01 GMT; Max-Age=3600 X-Content-Type-Options: - nosniff X-Frame-Options: @@ -66,9 +62,9 @@ http_interactions: X-Permitted-Cross-Domain-Policies: - none X-Powered-By: - - PHP/8.2.21 + - PHP/8.2.26 X-Request-Id: - - TBw85AYaMZcZNiY5oEru + - q3Y1SCVKkQfEiwzGjVCW X-Robots-Tag: - noindex, nofollow X-Xss-Protection: @@ -89,7 +85,7 @@ http_interactions: - recorded_at: Wed, 02 Oct 2024 08:50:35 GMT + recorded_at: Thu, 28 Nov 2024 14:30:01 GMT - request: method: post uri: https://nextcloud.local/ocs/v1.php/cloud/users/m.jade@death.star/groups @@ -102,7 +98,7 @@ http_interactions: Ocs-Apirequest: - 'true' User-Agent: - - httpx.rb/1.3.1 + - httpx.rb/1.3.3 Accept: - "*/*" Accept-Encoding: @@ -125,30 +121,26 @@ http_interactions: Content-Type: - application/xml; charset=utf-8 Date: - - Wed, 02 Oct 2024 08:50:35 GMT - Expires: - - Thu, 19 Nov 1981 08:52:00 GMT + - Thu, 28 Nov 2024 14:30:01 GMT Feature-Policy: - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';payment 'none' - Pragma: - - no-cache Referrer-Policy: - no-referrer Server: - - Apache/2.4.59 (Debian) + - Apache/2.4.62 (Debian) Set-Cookie: - - oc07ul6b4oaw=6cc4b771ce27bb97b8f3238e7653da31; path=/; secure; HttpOnly; SameSite=Lax, - oc_sessionPassphrase=B2I0t1BGIs1gvjZeGy7jqq8c%2FIxKtkypUxnIhP5m2lJhvyGp5k8CDf%2F1Cqn4YtKlIkIH3nT%2Fm5WD3ShkVPf5pnCupGYQqyWEp3GCkGuQXt5i6QhhP3XNfD%2FU4VtGxUgf; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=6cc4b771ce27bb97b8f3238e7653da31; + - oc07ul6b4oaw=3a9639c066a5fa86a27273fc0dc3581a; path=/; secure; HttpOnly; SameSite=Lax, + oc_sessionPassphrase=P2uApN%2FWNxMYjUzW%2FkwSEqI7ux9QUNzTnHWuHmzBE%2B2PZrv2PQPK4gVsz6jc7Y8FvfZOfVv%2B%2FX%2FOX5PyVW%2BZ9JpNIFxVFRibrRzGnIMvKGAJ%2BASlkF0MWBgrY3M0qeEg; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=3a9639c066a5fa86a27273fc0dc3581a; 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, oc07ul6b4oaw=6cc4b771ce27bb97b8f3238e7653da31; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=6cc4b771ce27bb97b8f3238e7653da31; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=de374ccc4540ad2b501264cf9d57d7b0; - path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Wed, 02 - Oct 2024 09:50:35 GMT; Max-Age=3600 + 31-Dec-2100 23:59:59 GMT; SameSite=strict, oc07ul6b4oaw=3a9639c066a5fa86a27273fc0dc3581a; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=3a9639c066a5fa86a27273fc0dc3581a; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=9a493de5794ac6c0ab0ec728d82afc07; + path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Thu, 28 + Nov 2024 15:30:02 GMT; Max-Age=3600 X-Content-Type-Options: - nosniff X-Frame-Options: @@ -156,9 +148,9 @@ http_interactions: X-Permitted-Cross-Domain-Policies: - none X-Powered-By: - - PHP/8.2.21 + - PHP/8.2.26 X-Request-Id: - - 2OHmy14Z2uyX80wetXYp + - PyoqZuyOeHHxNYg0IqiT X-Robots-Tag: - noindex, nofollow X-Xss-Protection: @@ -179,187 +171,7 @@ http_interactions: - recorded_at: Wed, 02 Oct 2024 08:50:36 GMT -- request: - method: post - uri: https://nextcloud.local/ocs/v1.php/cloud/groups - body: - encoding: ASCII-8BIT - string: groupid=Sith+Assassins+Backup - headers: - Authorization: - - Basic - Ocs-Apirequest: - - 'true' - User-Agent: - - httpx.rb/1.3.1 - Accept: - - "*/*" - Accept-Encoding: - - gzip, deflate - Content-Type: - - application/x-www-form-urlencoded - Content-Length: - - '29' - 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: - - Wed, 02 Oct 2024 08:50:36 GMT - Expires: - - Thu, 19 Nov 1981 08:52:00 GMT - Feature-Policy: - - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone - 'none';payment 'none' - Pragma: - - no-cache - Referrer-Policy: - - no-referrer - Server: - - Apache/2.4.59 (Debian) - Set-Cookie: - - oc07ul6b4oaw=a59820aa38fc321b9f172ac4176c1d55; path=/; secure; HttpOnly; SameSite=Lax, - oc_sessionPassphrase=tOAFguNR0Jp%2FxNtxIOqXQ%2F6DNz%2FxwIkdRbte7S0BC8lnDIib3RD3DxuoFtc0FxIsQEim0fze6h0sofcgU%2BhLps1nghETPItFWjqn75oa1BdUTk9lacQyzV3IlPGH6fEG; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=a59820aa38fc321b9f172ac4176c1d55; - 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, oc07ul6b4oaw=a59820aa38fc321b9f172ac4176c1d55; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=a59820aa38fc321b9f172ac4176c1d55; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=b8539104cd9a4e13ad6a8bad9d1ac0e5; - path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Wed, 02 - Oct 2024 09:50:36 GMT; Max-Age=3600 - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-Permitted-Cross-Domain-Policies: - - none - X-Powered-By: - - PHP/8.2.21 - X-Request-Id: - - Rhr2ktjrVgX7DNPKUMQ0 - X-Robots-Tag: - - noindex, nofollow - X-Xss-Protection: - - 1; mode=block - Content-Length: - - '140' - body: - encoding: UTF-8 - string: | - - - - ok - 100 - OK - - - - - - recorded_at: Wed, 02 Oct 2024 08:50:36 GMT -- request: - method: post - uri: https://nextcloud.local/ocs/v1.php/cloud/users/m.jade@death.star/groups - body: - encoding: ASCII-8BIT - string: groupid=Sith+Assassins+Backup - headers: - Authorization: - - Basic - Ocs-Apirequest: - - 'true' - User-Agent: - - httpx.rb/1.3.1 - Accept: - - "*/*" - Accept-Encoding: - - gzip, deflate - Content-Type: - - application/x-www-form-urlencoded - Content-Length: - - '29' - 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: - - Wed, 02 Oct 2024 08:50:36 GMT - Expires: - - Thu, 19 Nov 1981 08:52:00 GMT - Feature-Policy: - - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone - 'none';payment 'none' - Pragma: - - no-cache - Referrer-Policy: - - no-referrer - Server: - - Apache/2.4.59 (Debian) - Set-Cookie: - - oc07ul6b4oaw=c1b3c3f4214d9d8966f07f16711725ed; path=/; secure; HttpOnly; SameSite=Lax, - oc_sessionPassphrase=Y9itI1jA1U7ht32uGGWcKURt1KGYrNnp2bG2uJPZ3y9Te7JXG4vcw5ZBf6ZrZTLKv9dLwEnmABA0OlKdh10jEyMxWVJXYRgXrsdLiDlaTAFHC9%2FMz4bQ7Cy%2BoQ71jekj; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=c1b3c3f4214d9d8966f07f16711725ed; - 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, oc07ul6b4oaw=c1b3c3f4214d9d8966f07f16711725ed; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=c1b3c3f4214d9d8966f07f16711725ed; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=fb555d0ca125d098bfe72a357f752fb0; - path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Wed, 02 - Oct 2024 09:50:37 GMT; Max-Age=3600 - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-Permitted-Cross-Domain-Policies: - - none - X-Powered-By: - - PHP/8.2.21 - X-Request-Id: - - 0QVHV77irKMx1GSbQPVW - X-Robots-Tag: - - noindex, nofollow - X-Xss-Protection: - - 1; mode=block - Content-Length: - - '140' - body: - encoding: UTF-8 - string: | - - - - ok - 100 - OK - - - - - - recorded_at: Wed, 02 Oct 2024 08:50:37 GMT + recorded_at: Thu, 28 Nov 2024 14:30:02 GMT - request: method: get uri: https://nextcloud.local/ocs/v1.php/cloud/groups/Sith%20Assassins @@ -372,7 +184,7 @@ http_interactions: Ocs-Apirequest: - 'true' User-Agent: - - httpx.rb/1.3.1 + - httpx.rb/1.3.3 Accept: - "*/*" Accept-Encoding: @@ -391,30 +203,26 @@ http_interactions: Content-Type: - application/xml; charset=utf-8 Date: - - Wed, 02 Oct 2024 08:50:37 GMT - Expires: - - Thu, 19 Nov 1981 08:52:00 GMT + - Thu, 28 Nov 2024 14:30:02 GMT Feature-Policy: - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';payment 'none' - Pragma: - - no-cache Referrer-Policy: - no-referrer Server: - - Apache/2.4.59 (Debian) + - Apache/2.4.62 (Debian) Set-Cookie: - - oc07ul6b4oaw=01da2b49d5abec2a8999bd0070130b04; path=/; secure; HttpOnly; SameSite=Lax, - oc_sessionPassphrase=LNjDQi4jb3HBPgwLDak3PZLcefxXWs1BL1%2FeQ0HB3ocStx7NYlMWsR6IrIfg8NqysVn%2BaDcibaS%2Bz72Go2OZw3kWyTF7hoEwPejH2nL3u7Pa%2FG708ecz3HUI%2FztROvZc; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=01da2b49d5abec2a8999bd0070130b04; + - oc07ul6b4oaw=97730690484ff8d8bc16bf8fc836e192; path=/; secure; HttpOnly; SameSite=Lax, + oc_sessionPassphrase=3ydCf8F7NM%2F2VCcqBKJzCm01GTLiQCKt%2Fz91Z8O2gMhhGnKbHF7oCWjtdsRj3witWmPLU8mtODjXwpHzYQwxfTBmfYOuoCpQiLTGBJikmgriSmIoHBvA%2BE3DqeHYxRE%2F; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=97730690484ff8d8bc16bf8fc836e192; 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, oc07ul6b4oaw=01da2b49d5abec2a8999bd0070130b04; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=01da2b49d5abec2a8999bd0070130b04; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=615d677637cb137e351629b49d573d0c; - path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Wed, 02 - Oct 2024 09:50:37 GMT; Max-Age=3600 + 31-Dec-2100 23:59:59 GMT; SameSite=strict, oc07ul6b4oaw=97730690484ff8d8bc16bf8fc836e192; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=97730690484ff8d8bc16bf8fc836e192; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=dd4c6a90f94ad0eb4f374f306a9664d1; + path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Thu, 28 + Nov 2024 15:30:02 GMT; Max-Age=3600 X-Content-Type-Options: - nosniff X-Frame-Options: @@ -422,9 +230,9 @@ http_interactions: X-Permitted-Cross-Domain-Policies: - none X-Powered-By: - - PHP/8.2.21 + - PHP/8.2.26 X-Request-Id: - - dGJ5c48eHtcbGlNhi6fw + - bNfP3fO1q5cVdXC3LA6B X-Robots-Tag: - noindex, nofollow X-Xss-Protection: @@ -449,7 +257,7 @@ http_interactions: - recorded_at: Wed, 02 Oct 2024 08:50:37 GMT + recorded_at: Thu, 28 Nov 2024 14:30:02 GMT - request: method: delete uri: https://nextcloud.local/ocs/v1.php/cloud/users/m.jade@death.star/groups?groupid=Sith%20Assassins @@ -462,7 +270,7 @@ http_interactions: Ocs-Apirequest: - 'true' User-Agent: - - httpx.rb/1.3.1 + - httpx.rb/1.3.3 Accept: - "*/*" Accept-Encoding: @@ -481,30 +289,26 @@ http_interactions: Content-Type: - application/xml; charset=utf-8 Date: - - Wed, 02 Oct 2024 08:50:37 GMT - Expires: - - Thu, 19 Nov 1981 08:52:00 GMT + - Thu, 28 Nov 2024 14:30:02 GMT Feature-Policy: - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';payment 'none' - Pragma: - - no-cache Referrer-Policy: - no-referrer Server: - - Apache/2.4.59 (Debian) + - Apache/2.4.62 (Debian) Set-Cookie: - - oc07ul6b4oaw=85dfa52e03afb69fbe548d3053d08e15; path=/; secure; HttpOnly; SameSite=Lax, - oc_sessionPassphrase=kOE0o2v1ep7XtIKKVnmqy8ck7Rbukw9NitYKaRPsLSS9b8mWIW%2Bwuw2dCZtEDmQdBZzItzOHZdRZim0v%2Bu06yNhj8xeY7dU0xqXzLKez9Zj%2BrA2KKmZl1jw6c9Ubx4PX; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=85dfa52e03afb69fbe548d3053d08e15; + - oc07ul6b4oaw=3c61a0db6149722cc6a95d3f42230f55; path=/; secure; HttpOnly; SameSite=Lax, + oc_sessionPassphrase=gw8mGeh8Fu0rKt%2BIzOD%2Brnwku6prDLtJC6DpOm5YTTp4Pbw7uETlDw3alKWSkn4%2BmMjjhOk5KkngEf527gY7b7ACVUFutHhvEdphAyYx5hSpQwulPU5R55wJDLQPCs52; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=3c61a0db6149722cc6a95d3f42230f55; 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, oc07ul6b4oaw=85dfa52e03afb69fbe548d3053d08e15; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=85dfa52e03afb69fbe548d3053d08e15; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=9f9f2207d2c10825f6ba2d6c07d2658b; - path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Wed, 02 - Oct 2024 09:50:38 GMT; Max-Age=3600 + 31-Dec-2100 23:59:59 GMT; SameSite=strict, oc07ul6b4oaw=3c61a0db6149722cc6a95d3f42230f55; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=3c61a0db6149722cc6a95d3f42230f55; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=64e2322d4338def4292ea6fe248ecfd6; + path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Thu, 28 + Nov 2024 15:30:03 GMT; Max-Age=3600 X-Content-Type-Options: - nosniff X-Frame-Options: @@ -512,9 +316,9 @@ http_interactions: X-Permitted-Cross-Domain-Policies: - none X-Powered-By: - - PHP/8.2.21 + - PHP/8.2.26 X-Request-Id: - - HL85t6eG92CsTVcZzlkl + - RfCII0YdCOpcI72nKP3u X-Robots-Tag: - noindex, nofollow X-Xss-Protection: @@ -535,7 +339,7 @@ http_interactions: - recorded_at: Wed, 02 Oct 2024 08:50:38 GMT + recorded_at: Thu, 28 Nov 2024 14:30:03 GMT - request: method: get uri: https://nextcloud.local/ocs/v1.php/cloud/groups/Sith%20Assassins @@ -548,7 +352,7 @@ http_interactions: Ocs-Apirequest: - 'true' User-Agent: - - httpx.rb/1.3.1 + - httpx.rb/1.3.3 Accept: - "*/*" Accept-Encoding: @@ -567,30 +371,26 @@ http_interactions: Content-Type: - application/xml; charset=utf-8 Date: - - Wed, 02 Oct 2024 08:50:38 GMT - Expires: - - Thu, 19 Nov 1981 08:52:00 GMT + - Thu, 28 Nov 2024 14:30:03 GMT Feature-Policy: - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';payment 'none' - Pragma: - - no-cache Referrer-Policy: - no-referrer Server: - - Apache/2.4.59 (Debian) + - Apache/2.4.62 (Debian) Set-Cookie: - - oc07ul6b4oaw=4311d7d8a7e8b3ba35b5d1fcff7d1b7a; path=/; secure; HttpOnly; SameSite=Lax, - oc_sessionPassphrase=GAzp%2FwJNf3dp%2BnY3U%2B4F4SXwmgC7f3Jqms%2FbwvIn2L7ztvCw3fPyMF8CAwno8o3xJ7O7Pbeu7IDG0ElNxKwl%2FBKviLvxlW4sa5woQEos5FRHFpMy93eMkNOsJjfBziTe; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=4311d7d8a7e8b3ba35b5d1fcff7d1b7a; + - oc07ul6b4oaw=2bd34228d8722fb511ac830b7af8d150; path=/; secure; HttpOnly; SameSite=Lax, + oc_sessionPassphrase=qTfCH0VUr5Q4zNJInH3WreCzodbpF9Stp14DQEYJovF46QRnj9wSZEyMB6ztRQgTe2RAnjhM8kXzgacZlyDnOnqiweJNbxau%2B9qZ83SkqqGBMSbYULa1pVHaNZVZ3fnl; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=2bd34228d8722fb511ac830b7af8d150; 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, oc07ul6b4oaw=4311d7d8a7e8b3ba35b5d1fcff7d1b7a; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=4311d7d8a7e8b3ba35b5d1fcff7d1b7a; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=f7715138d243dc8627e3b3647a74b419; - path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Wed, 02 - Oct 2024 09:50:38 GMT; Max-Age=3600 + 31-Dec-2100 23:59:59 GMT; SameSite=strict, oc07ul6b4oaw=2bd34228d8722fb511ac830b7af8d150; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=2bd34228d8722fb511ac830b7af8d150; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=df99da2ec87f19ccad9529158f642ec4; + path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Thu, 28 + Nov 2024 15:30:04 GMT; Max-Age=3600 X-Content-Type-Options: - nosniff X-Frame-Options: @@ -598,9 +398,9 @@ http_interactions: X-Permitted-Cross-Domain-Policies: - none X-Powered-By: - - PHP/8.2.21 + - PHP/8.2.26 X-Request-Id: - - DaZNZ94HD5CWPkX9ZTgQ + - rEa0uC587txch3ofMyqm X-Robots-Tag: - noindex, nofollow X-Xss-Protection: @@ -623,7 +423,7 @@ http_interactions: - recorded_at: Wed, 02 Oct 2024 08:50:38 GMT + recorded_at: Thu, 28 Nov 2024 14:30:04 GMT - request: method: delete uri: https://nextcloud.local/ocs/v1.php/cloud/groups/Sith%20Assassins @@ -636,93 +436,7 @@ http_interactions: Ocs-Apirequest: - 'true' User-Agent: - - httpx.rb/1.3.1 - Accept: - - "*/*" - Accept-Encoding: - - gzip, deflate - 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: - - Wed, 02 Oct 2024 08:50:38 GMT - Expires: - - Thu, 19 Nov 1981 08:52:00 GMT - Feature-Policy: - - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone - 'none';payment 'none' - Pragma: - - no-cache - Referrer-Policy: - - no-referrer - Server: - - Apache/2.4.59 (Debian) - Set-Cookie: - - oc07ul6b4oaw=fd4ecbd33c8c4056f827d54926c7d7e1; path=/; secure; HttpOnly; SameSite=Lax, - oc_sessionPassphrase=dIlm6nPh4GMsA38cZj2SyDxlQhuyL1CP86iZATnMY6OqdehoRJUgPfH27xShrr1yg5Hd2tC7h79f9lzwPh8DMjnmy%2FzR5qpY%2BkPmvvFohO00pSSbkhgIRVuJBJygpAJm; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=fd4ecbd33c8c4056f827d54926c7d7e1; - 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, oc07ul6b4oaw=fd4ecbd33c8c4056f827d54926c7d7e1; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=fd4ecbd33c8c4056f827d54926c7d7e1; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=9fb44996d3f7d257f11f151473b7b955; - path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Wed, 02 - Oct 2024 09:50:39 GMT; Max-Age=3600 - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-Permitted-Cross-Domain-Policies: - - none - X-Powered-By: - - PHP/8.2.21 - X-Request-Id: - - 4EQLXfbKAVqZkKshqVYc - X-Robots-Tag: - - noindex, nofollow - X-Xss-Protection: - - 1; mode=block - Content-Length: - - '140' - body: - encoding: UTF-8 - string: | - - - - ok - 100 - OK - - - - - - recorded_at: Wed, 02 Oct 2024 08:50:39 GMT -- request: - method: delete - uri: https://nextcloud.local/ocs/v1.php/cloud/groups/Sith%20Assassins%20Backup - body: - encoding: US-ASCII - string: '' - headers: - Authorization: - - Basic - Ocs-Apirequest: - - 'true' - User-Agent: - - httpx.rb/1.3.1 + - httpx.rb/1.3.3 Accept: - "*/*" Accept-Encoding: @@ -741,30 +455,26 @@ http_interactions: Content-Type: - application/xml; charset=utf-8 Date: - - Wed, 02 Oct 2024 08:50:39 GMT - Expires: - - Thu, 19 Nov 1981 08:52:00 GMT + - Thu, 28 Nov 2024 14:30:04 GMT Feature-Policy: - autoplay 'none';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';payment 'none' - Pragma: - - no-cache Referrer-Policy: - no-referrer Server: - - Apache/2.4.59 (Debian) + - Apache/2.4.62 (Debian) Set-Cookie: - - oc07ul6b4oaw=38a807de0bfea4578a190796ea3679bf; path=/; secure; HttpOnly; SameSite=Lax, - oc_sessionPassphrase=ykYwdbn02mf%2B2FIYpFHhFhySmy5y1j4D9kX1We59HLdc50Otjzyj03S%2Fg11ZjBeD13%2BShKDXhMDDDQBf7K%2F%2B7cZjzB12b1LGlwjEIwGnIhBykM0QeIB2htLjvWZ1DdHw; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=38a807de0bfea4578a190796ea3679bf; + - oc07ul6b4oaw=0067f072357c13bc15a002ee0f531c38; path=/; secure; HttpOnly; SameSite=Lax, + oc_sessionPassphrase=lF9u%2Bt37SHRU7rCTB0UOObOoFgF1nSi3576l1M%2BYHicFwsOWSy43n7IE8usNib8PnxalqewI6xAdAQR11GmbJASdh8ysogMD2l7JEJMEl%2Ff03xn9u%2BPKSe5uEWrT1tcV; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=0067f072357c13bc15a002ee0f531c38; 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, oc07ul6b4oaw=38a807de0bfea4578a190796ea3679bf; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=38a807de0bfea4578a190796ea3679bf; - path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=899b9aecb6d1dc7c35ef9a847d0e7bfc; - path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Wed, 02 - Oct 2024 09:50:39 GMT; Max-Age=3600 + 31-Dec-2100 23:59:59 GMT; SameSite=strict, oc07ul6b4oaw=0067f072357c13bc15a002ee0f531c38; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=0067f072357c13bc15a002ee0f531c38; + path=/; secure; HttpOnly; SameSite=Lax, oc07ul6b4oaw=3f7baf5f27c60be23f6465d9ee4b55e9; + path=/; secure; HttpOnly; SameSite=Lax, cookie_test=test; expires=Thu, 28 + Nov 2024 15:30:04 GMT; Max-Age=3600 X-Content-Type-Options: - nosniff X-Frame-Options: @@ -772,9 +482,9 @@ http_interactions: X-Permitted-Cross-Domain-Policies: - none X-Powered-By: - - PHP/8.2.21 + - PHP/8.2.26 X-Request-Id: - - 52hU39z1usAaL575cnKp + - 1M6gPBPREUgx1DOsIdtJ X-Robots-Tag: - noindex, nofollow X-Xss-Protection: @@ -795,5 +505,5 @@ http_interactions: - recorded_at: Wed, 02 Oct 2024 08:50:39 GMT + recorded_at: Thu, 28 Nov 2024 14:30:04 GMT recorded_with: VCR 6.3.1 diff --git a/spec/features/news/creation_and_commenting_spec.rb b/spec/features/news/creation_and_commenting_spec.rb index 36cf66c114d6..e99afdc2a61a 100644 --- a/spec/features/news/creation_and_commenting_spec.rb +++ b/spec/features/news/creation_and_commenting_spec.rb @@ -43,6 +43,8 @@ member_with_permissions: { project => %i[manage_news comment_news] }) end + include Flash::Expectations + it "allows creating new and commenting it all of which will result in notifications and mails" do visit project_news_index_path(project) @@ -81,8 +83,11 @@ perform_enqueued_jobs do click_button "Add comment" + wait_for_network_idle end + expect_and_dismiss_flash message: "Comment added" + # The new comment is visible on the show page expect(page) .to have_content "A new text" diff --git a/spec/features/work_packages/details/relations/primerized_relations_spec.rb b/spec/features/work_packages/details/relations/primerized_relations_spec.rb index 29e0ed75821c..56bc66d3699e 100644 --- a/spec/features/work_packages/details/relations/primerized_relations_spec.rb +++ b/spec/features/work_packages/details/relations/primerized_relations_spec.rb @@ -170,6 +170,29 @@ def label_for_relation_type(relation_type) expect(page).to have_no_css("[data-test-selector='op-relation-row-#{child_wp.id}-edit-button']") end end + + context "with the shown WorkPackage being the 'to' relation part" do + let(:another_wp) { create(:work_package, type: type2, subject: "related to main") } + + let(:relation_to) do + create(:relation, + from: another_wp, + to: work_package, + relation_type: Relation::TYPE_FOLLOWS) + end + + it "shows the correct related WorkPackage in the dialog (regression #59771)" do + scroll_to_element relations_panel + + relations_tab.open_relation_dialog(relation_to) + + within "##{WorkPackageRelationsTab::WorkPackageRelationDialogComponent::DIALOG_ID}" do + expect(page).to have_field("Work package", + readonly: true, + with: "#{another_wp.type.name.upcase} ##{another_wp.id} - #{another_wp.subject}") + end + end + end end describe "creating a relation" do diff --git a/spec/models/custom_actions/actions/custom_field_spec.rb b/spec/models/custom_actions/actions/custom_field_spec.rb index e8cea930e9ab..05c68c594384 100644 --- a/spec/models/custom_actions/actions/custom_field_spec.rb +++ b/spec/models/custom_actions/actions/custom_field_spec.rb @@ -98,7 +98,7 @@ describe ".all" do before do allow(WorkPackageCustomField) - .to receive(:order) + .to receive(:usable_as_custom_action) .and_return(custom_fields) end diff --git a/spec/models/custom_field/order_statements_spec.rb b/spec/models/custom_field/order_statements_spec.rb new file mode 100644 index 000000000000..79f724ee1fd8 --- /dev/null +++ b/spec/models/custom_field/order_statements_spec.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. +#++ + +require "spec_helper" + +RSpec.describe CustomField::OrderStatements do + # integration tests at spec/models/query/results_cf_sorting_integration_spec.rb + context "when hierarchy" do + subject(:custom_field) { create(:hierarchy_wp_custom_field) } + + describe "#order_statement" do + it { expect(subject.order_statement).to eq("cf_order_#{custom_field.id}.value") } + end + + describe "#order_join_statement" do + it do + expect(custom_field.order_join_statement).to eq( + <<-SQL.squish + LEFT OUTER JOIN ( + SELECT DISTINCT ON (cv.customized_id) cv.customized_id , item.label "value" + FROM "custom_values" cv + INNER JOIN "hierarchical_items" item ON item.id = cv.value::bigint + WHERE cv.customized_type = 'WorkPackage' + AND cv.custom_field_id = #{custom_field.id} + AND cv.value IS NOT NULL + AND cv.value != '' + ORDER BY cv.customized_id, cv.id + ) cf_order_#{custom_field.id} ON cf_order_#{custom_field.id}.customized_id = "work_packages".id + SQL + ) + end + end + end +end diff --git a/spec/models/query/results_cf_sorting_integration_spec.rb b/spec/models/query/results_cf_sorting_integration_spec.rb index 461e9ba3c738..49711dab3365 100644 --- a/spec/models/query/results_cf_sorting_integration_spec.rb +++ b/spec/models/query/results_cf_sorting_integration_spec.rb @@ -343,4 +343,33 @@ def wp_without_cf_value end end end + + context "for hierarchy format" do + include_examples "it sorts" do + let(:custom_field) { create(:hierarchy_wp_custom_field, hierarchy_root: nil) } + let(:root) { service.generate_root(custom_field).value! } + let(:service) { CustomFields::Hierarchy::HierarchicalItemService.new } + + let!(:item_first) { service.insert_item(parent: root, label: "aa item").value! } + let!(:item_a) { service.insert_item(parent: root, label: "item_a").value! } + let!(:item_a1) { service.insert_item(parent: item_a, label: "item_a1").value! } + let!(:item_a2) { service.insert_item(parent: item_a, label: "item_a2").value! } + let!(:item_c) { service.insert_item(parent: root, label: "item_c").value! } + let!(:item_b) { service.insert_item(parent: root, label: "item_b").value! } + let!(:item_last) { service.insert_item(parent: root, label: "zz item").value! } + + let(:work_packages) do + [ + wp_without_cf_value, + wp_with_cf_value(item_first.id), + wp_with_cf_value(item_a.id), + wp_with_cf_value(item_a1.id), + wp_with_cf_value(item_a2.id), + wp_with_cf_value(item_b.id), + wp_with_cf_value(item_c.id), + wp_with_cf_value(item_last.id) + ] + end + end + end end diff --git a/spec/services/custom_fields/hierarchy/hierarchical_item_service_spec.rb b/spec/services/custom_fields/hierarchy/hierarchical_item_service_spec.rb index 2756565477ef..e88ed99bf4e1 100644 --- a/spec/services/custom_fields/hierarchy/hierarchical_item_service_spec.rb +++ b/spec/services/custom_fields/hierarchy/hierarchical_item_service_spec.rb @@ -188,6 +188,17 @@ expect(result.value!).to match_array(subitem2) end end + + context "when does not include self" do + it "returns all descendants not including the item passed" do + result = service.get_descendants(item: mara, include_self: false) + expect(result).to be_success + + descendants = result.value! + expect(descendants.size).to eq(2) + expect(descendants).to contain_exactly(subitem, subitem2) + end + end end describe "#move_item" do diff --git a/spec/support/components/work_packages/relations.rb b/spec/support/components/work_packages/relations.rb index 48369bf45d42..2c992d574349 100644 --- a/spec/support/components/work_packages/relations.rb +++ b/spec/support/components/work_packages/relations.rb @@ -169,15 +169,7 @@ def add_relation(type:, relatable:, description: nil) end def add_description_to_relation(relatable, description) - actual_relatable = find_relatable(relatable) - relation_row = find_row(actual_relatable) - - within relation_row do - page.find_test_selector("op-relation-row-#{actual_relatable.id}-action-menu").click - page.find_test_selector("op-relation-row-#{actual_relatable.id}-edit-button").click - end - - wait_for_reload if using_cuprite? + open_relation_dialog(relatable) within "##{WorkPackageRelationsTab::WorkPackageRelationDialogComponent::DIALOG_ID}" do expect(page).to have_field("Work package", readonly: true) @@ -192,15 +184,7 @@ def add_description_to_relation(relatable, description) end def edit_relation_description(relatable, description) - actual_relatable = find_relatable(relatable) - relation_row = find_row(actual_relatable) - - within relation_row do - page.find_test_selector("op-relation-row-#{actual_relatable.id}-action-menu").click - page.find_test_selector("op-relation-row-#{actual_relatable.id}-edit-button").click - end - - wait_for_reload if using_cuprite? + open_relation_dialog(relatable) within "##{WorkPackageRelationsTab::WorkPackageRelationDialogComponent::DIALOG_ID}" do expect(page).to have_field("Work package", readonly: true) @@ -214,6 +198,18 @@ def edit_relation_description(relatable, description) end end + def open_relation_dialog(relatable) + actual_relatable = find_relatable(relatable) + relation_row = find_row(actual_relatable) + + within relation_row do + page.find_test_selector("op-relation-row-#{actual_relatable.id}-action-menu").click + page.find_test_selector("op-relation-row-#{actual_relatable.id}-edit-button").click + end + + wait_for_reload if using_cuprite? + end + def expect_relation(relatable) find_row(relatable) end