- <%= styled_button_tag t(:button_save), class: "-primary -with-icon icon-checkmark" %>
-
-
-<% end %>
-
-
+ <% if @owner_backlogs.empty? && @sprints.empty? %>
+ <%=
+ render(Primer::Beta::Blankslate.new(border: true, spacious: true)) do |blankslate|
+ blankslate.with_visual_icon(icon: :versions)
+ blankslate.with_heading(tag: :h2).with_content(t(:backlogs_empty_title))
+
+ if current_user.allowed_in_project?(:manage_versions, @project)
+ blankslate.with_description_content(t(:backlogs_empty_action_text))
+ end
+ end
+ %>
+ <% else %>
+
+
+ <%= render(Backlogs::SprintComponent.with_collection(@sprints)) %>
+
+
+ <%= render(Backlogs::BacklogComponent.with_collection(@owner_backlogs, project: @project)) %>
+
+
+ <% end %>
+
diff --git a/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb b/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb
index ecc41d09447..78341f2997c 100644
--- a/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb
+++ b/modules/backlogs/app/views/rb_master_backlogs/_list.html.erb
@@ -1,3 +1,32 @@
+<%# -- 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.
+
+++# %>
+
<%= turbo_frame_tag :backlogs_container, refresh: :morph, class: "op-backlogs-page" do %>
<% if @owner_backlogs.empty? && @sprint_backlogs.empty? %>
<%=
@@ -5,7 +34,7 @@
blankslate.with_visual_icon(icon: :versions)
blankslate.with_heading(tag: :h2).with_content(t(:backlogs_empty_title))
- if current_user.allowed_in_project?(:manage_versions, @project)
+ if current_user.allowed_in_project?(:create_sprints, @project)
blankslate.with_description_content(t(:backlogs_empty_action_text))
end
end
diff --git a/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb
new file mode 100644
index 00000000000..16194aa9c77
--- /dev/null
+++ b/modules/backlogs/app/views/rb_master_backlogs/agile_index.html.erb
@@ -0,0 +1,95 @@
+<%#-- copyright
+OpenProject is an open source project management software.
+Copyright (C) the OpenProject GmbH
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License version 3.
+
+OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+Copyright (C) 2006-2013 Jean-Philippe Lang
+Copyright (C) 2010-2013 the ChiliProject Team
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+See COPYRIGHT and LICENSE files for more details.
+
+++#%>
+
+<% html_title t(:label_backlogs) %>
+
+<% content_controller "backlogs",
+ "backlogs-list-url-value": backlogs_project_backlogs_path(@project),
+ "backlogs-backlogs--story-outlet": "li[data-story]" %>
+
+<% content_for :content_header do %>
+ <%=
+ render Primer::OpenProject::PageHeader.new do |header|
+ header.with_title { t(:label_backlogs) }
+ header.with_breadcrumbs(
+ [{ href: project_overview_path(@project), text: @project.name },
+ t(:label_backlogs)]
+ )
+ end
+ %>
+
+ <%=
+ render(Primer::OpenProject::SubHeader.new) do |subheader|
+ if allow_sprint_creation?(@project)
+ # Scrum sprints are available, show an action menu to create Sprints and Versions
+ subheader.with_action_menu(
+ leading_icon: :plus,
+ trailing_icon: :"triangle-down",
+ label: t(:button_create),
+ button_arguments: { scheme: :primary }
+ ) do |menu|
+ menu.with_item(
+ label: Version.human_model_name,
+ href: new_project_version_path(@project)
+ )
+
+ menu.with_item(
+ label: Agile::Sprint.human_model_name,
+ href: new_dialog_project_sprints_path(@project),
+ content_arguments: {
+ data: {
+ controller: "async-dialog",
+ test_selector: "op-sprints--new-sprint-button"
+ }
+ }
+ )
+ end
+ else
+ # No scrum sprints, we only show a "+ Version" button
+ subheader.with_action_button(
+ scheme: :primary,
+ leading_icon: :plus,
+ label: I18n.t(:label_version_new),
+ tag: :a,
+ href: new_project_version_path(@project)
+ ) do
+ Version.human_model_name
+ end
+ end
+ end
+ %>
+<% end %>
+
+<% content_for :content_body do %>
+ <%= render partial: "agile_list" %>
+<% end %>
+
+<% content_for :content_body_right do %>
+ <%= render(split_view_instance) if render_work_package_split_view? %>
+<% end %>
diff --git a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb
index f35c81f31a6..f6d59c4d4a7 100644
--- a/modules/backlogs/app/views/rb_master_backlogs/index.html.erb
+++ b/modules/backlogs/app/views/rb_master_backlogs/index.html.erb
@@ -43,17 +43,46 @@ See COPYRIGHT and LICENSE files for more details.
end
%>
- <%= render(Primer::OpenProject::SubHeader.new) do |subheader|
+ <%=
+ render(Primer::OpenProject::SubHeader.new) do |subheader|
+ if allow_sprint_creation?(@project)
+ # Scrum sprints are available, show an action menu to create Sprints and Versions
+ subheader.with_action_menu(
+ leading_icon: :plus,
+ trailing_icon: :"triangle-down",
+ label: t(:button_create),
+ button_arguments: { scheme: :primary }
+ ) do |menu|
+ menu.with_item(
+ label: Version.human_model_name,
+ href: new_project_version_path(@project)
+ )
+
+ menu.with_item(
+ label: Agile::Sprint.human_model_name,
+ href: new_dialog_project_sprints_path(@project),
+ content_arguments: {
+ data: {
+ controller: "async-dialog",
+ test_selector: "op-sprints--new-sprint-button"
+ }
+ }
+ )
+ end
+ else
+ # No scrum sprints, we only show a "+ Version" button
subheader.with_action_button(
scheme: :primary,
leading_icon: :plus,
label: I18n.t(:label_version_new),
tag: :a,
- href: url_for({ controller: "/versions", action: "new", project_id: @project })
+ href: new_project_version_path(@project)
) do
- t("activerecord.models.version")
+ Version.human_model_name
end
- end %>
+ end
+ end
+ %>
<% end %>
<% content_for :content_body do %>
diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml
index 20d24018589..8f5d854a324 100644
--- a/modules/backlogs/config/locales/crowdin/af.yml
+++ b/modules/backlogs/config/locales/crowdin/af.yml
@@ -25,6 +25,12 @@ af:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ af:
task_version_must_be_the_same_as_story_version: "moet dieselfde wees as die ouer storie se weergawe"
sprint:
cannot_end_before_it_starts: "sprint kan nie uinding voor dit begin het nie"
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "eenige"
column_width: "Column width"
definition_of_done: "Definisie van Gedoen"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Belemmering"
label_versions_default_fold_state: "Wys weergawe gevou"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ af:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ af:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ af:
label_backlogs_unconfigured: "Jy het nog nie Agterstandes opgestel nie. Gaan asseblief na %{administration} > %{plugins}, klik dan op die %{configure}-skakel vir hierdie plugin. Sodra jy die velde gestel het, kom terug na hierdie bladsy om die instrument te begin gebruik."
label_blocks_ids: "ID's van geblokkeerde werkspakkette"
label_column_in_backlog: "Kolom in agterstand"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Af"
label_points_burn_up: "Op"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint belemmerings"
+ label_sprint_new: "New sprint"
label_task_board: "Taak bord"
- permission_view_master_backlog: "Kyk na meester-agterstand"
- permission_view_taskboards: "Kyk na taakborde"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Kies gedoen statusse"
- permission_update_sprints: "Opdateer sprinte"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Agterstandes"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/ar.yml b/modules/backlogs/config/locales/crowdin/ar.yml
index a00c06b69cd..1de0218f19a 100644
--- a/modules/backlogs/config/locales/crowdin/ar.yml
+++ b/modules/backlogs/config/locales/crowdin/ar.yml
@@ -25,6 +25,12 @@ ar:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ ar:
task_version_must_be_the_same_as_story_version: "يجب أن يكون نفس نسخة القصة الأصلية."
sprint:
cannot_end_before_it_starts: "لا يمكن أن ينتهي السباق قبل أن يبدأ."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "أي"
column_width: "Column width"
definition_of_done: "تعريف ما تم"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "عائق"
label_versions_default_fold_state: "إظهار الإصدارات مطوية"
caption_versions_default_fold_state: ""
@@ -83,12 +92,21 @@ ar:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -99,6 +117,14 @@ ar:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -126,14 +152,19 @@ ar:
label_backlogs_unconfigured: "لم تقم بإنشاء الأعمال المتراكمة غير المنجزة بعد. من فضلك اذهب إلى %{administration} > %{plugins}، ثم اضغط على رابط %{configure} لهذا البرنامج المساعد. عندما تنتهي من تعيين الحقول، ارجع إلى هذه الصفحة لتبدأ باستخدام الأداة."
label_blocks_ids: "الهويات المعرِّفة لمجموعات العمل المحظورة"
label_column_in_backlog: "عمود في العمل المتراكم غير المنجز"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "الأسفل"
label_points_burn_up: "الأعلى"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "عوائق السباق"
+ label_sprint_new: "New sprint"
label_task_board: "لوحة المهمة"
- permission_view_master_backlog: "عرض العمل الرئيسي المتراكم غير المنجز"
- permission_view_taskboards: "شاهد لوحات المهمات"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "حدد حالات الاتمام"
- permission_update_sprints: "قم بتحديث السباقات"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "الأعمال المتراكمة غير المنجزة"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/az.yml b/modules/backlogs/config/locales/crowdin/az.yml
index 309b5b19a3f..6e7aea2b54f 100644
--- a/modules/backlogs/config/locales/crowdin/az.yml
+++ b/modules/backlogs/config/locales/crowdin/az.yml
@@ -25,6 +25,12 @@ az:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ az:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "any"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ az:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ az:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ az:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/be.yml b/modules/backlogs/config/locales/crowdin/be.yml
index 12c334f48a8..771b833a2dc 100644
--- a/modules/backlogs/config/locales/crowdin/be.yml
+++ b/modules/backlogs/config/locales/crowdin/be.yml
@@ -25,6 +25,12 @@ be:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ be:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "любы"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -79,12 +88,21 @@ be:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -95,6 +113,14 @@ be:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -122,14 +148,19 @@ be:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/bg.yml b/modules/backlogs/config/locales/crowdin/bg.yml
index e16dce07c86..f653c939045 100644
--- a/modules/backlogs/config/locales/crowdin/bg.yml
+++ b/modules/backlogs/config/locales/crowdin/bg.yml
@@ -25,6 +25,12 @@ bg:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ bg:
task_version_must_be_the_same_as_story_version: "трябва да бъде същата като версията на родителската история."
sprint:
cannot_end_before_it_starts: "Спринтът не може да приключи, преди да започне."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "всяко"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Препядствие"
label_versions_default_fold_state: "Показване на сгънати версиите "
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ bg:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ bg:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ bg:
label_backlogs_unconfigured: "Все още не сте конфигурирали Неизпълнени задачи. Моля, отидете на %{administration} > %{plugins}, след което щракнете върху връзката %{configure} за този плъгин. След като зададете полетата, върнете се на тази страница, за да започнете да използвате инструмента."
label_blocks_ids: "ID на блокирани работни пакети"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Надолу"
label_points_burn_up: "Нагоре"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Пречки за спринт"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Изберете готови състояния"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Назад"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/ca.yml b/modules/backlogs/config/locales/crowdin/ca.yml
index 4d52aad8369..c7253773dba 100644
--- a/modules/backlogs/config/locales/crowdin/ca.yml
+++ b/modules/backlogs/config/locales/crowdin/ca.yml
@@ -25,6 +25,12 @@ ca:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ ca:
task_version_must_be_the_same_as_story_version: "ha de ser la mateixa que la versió de la història pare."
sprint:
cannot_end_before_it_starts: "El sprint no pot acabar abans de que comenci."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "qualsevol"
column_width: "Column width"
definition_of_done: "Definició de fet"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Mostra les versions contretes"
caption_versions_default_fold_state: "Les versions no s'expandiran per defecte quan es visualitzin els registres enrere. Cada un ha d'ampliar-se manualment."
@@ -75,12 +84,21 @@ ca:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ ca:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ ca:
label_backlogs_unconfigured: "No has configurat les llistes de pendents encara. Si us plau, ves a %{administration} > %{plugins}, a continuació, fes clic a l'enllaç de %{configure} per a aquest plugin. Una vegada hagis omplert els camps, torna a aquesta pàgina per començar a utilitzar l'eina."
label_blocks_ids: "Identificadors dels paquets de treball bloquejats"
label_column_in_backlog: "Columna al backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "A baix"
label_points_burn_up: "Amunt"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Impediments de sprint"
+ label_sprint_new: "New sprint"
label_task_board: "Tauler de tasques"
- permission_view_master_backlog: "Visualitza el backlog mestre"
- permission_view_taskboards: "Visualitza els taulers de tasques"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Selecciona els estats acabats"
- permission_update_sprints: "Actualitza els sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/ckb-IR.yml b/modules/backlogs/config/locales/crowdin/ckb-IR.yml
index 3bc24142a22..60450ebe853 100644
--- a/modules/backlogs/config/locales/crowdin/ckb-IR.yml
+++ b/modules/backlogs/config/locales/crowdin/ckb-IR.yml
@@ -25,6 +25,12 @@ ckb-IR:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ ckb-IR:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "any"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ ckb-IR:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ ckb-IR:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ ckb-IR:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml
index f5a7fbc7a36..de225baae06 100644
--- a/modules/backlogs/config/locales/crowdin/cs.yml
+++ b/modules/backlogs/config/locales/crowdin/cs.yml
@@ -25,6 +25,12 @@ cs:
description: "Tento modul přidává funkce umožňující agilním týmům pracovat s OpenProject v Scrum projektech."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Doba trvání sprintu"
work_package:
@@ -42,12 +48,15 @@ cs:
task_version_must_be_the_same_as_story_version: "musí být stejná jako verze nadřazeného příběhu."
sprint:
cannot_end_before_it_starts: "Sprint nemůže končit dříve, než začne."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Typ úlohy"
backlogs:
any: "jakákoliv"
column_width: "Column width"
definition_of_done: "Definice dokončena"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: " Verze zobrazit srolovaně"
caption_versions_default_fold_state: "Verze se při prohlížení nevyřízených žádostí ve výchozím nastavení nerozbalují. Každou z nich je třeba rozbalit ručně."
@@ -79,12 +88,21 @@ cs:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -95,6 +113,14 @@ cs:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -122,14 +148,19 @@ cs:
label_backlogs_unconfigured: "Zatím nemáte nakonfigurované nevyřízené záznamy. Přejděte na %{administration} > %{plugins}a poté klikněte na odkaz %{configure} pro tento plugin. Jakmile nastavíte pole, vraťte se na tuto stránku a začněte používat nástroj."
label_blocks_ids: "ID blokovaných pracovních balíčků"
label_column_in_backlog: "Sloupec v nevyřízené pozici"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Dolů"
label_points_burn_up: "Nahoru"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Běh impedimenty"
+ label_sprint_new: "New sprint"
label_task_board: "Tabule úkolů"
- permission_view_master_backlog: "Zobrazit hlavní nevyřízené položky"
- permission_view_taskboards: "Zobrazit tabuly úkolů"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Vybrat stavy dokončených"
- permission_update_sprints: "Aktualizovat běhy"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Nevyřízené položky"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/da.yml b/modules/backlogs/config/locales/crowdin/da.yml
index b903386f5d8..d29bad1355a 100644
--- a/modules/backlogs/config/locales/crowdin/da.yml
+++ b/modules/backlogs/config/locales/crowdin/da.yml
@@ -25,6 +25,12 @@ da:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ da:
task_version_must_be_the_same_as_story_version: "skal være identisk med hovedhistorieversionen."
sprint:
cannot_end_before_it_starts: "Sprint kan ikke afsluttes før det starter."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Opgavetype"
backlogs:
any: "alle"
column_width: "Column width"
definition_of_done: "Definition af Udført"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Hindring"
label_versions_default_fold_state: "Vis versioner sammenfoldet"
caption_versions_default_fold_state: "Versioner vil ikke blive udvidet som standard, når man ser på backlogs. Hver enkelt version skal udvides manuelt."
@@ -75,12 +84,21 @@ da:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ da:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ da:
label_backlogs_unconfigured: "Man har ikke opsat Backlogs endnu. Gå til %{administration} > %{plugins}, og klik dernæst på linket %{configure} til dette plugin. Når man har indstillet feltindhold, vend tilbage til denne side for at begynde at bruge værktøjet."
label_blocks_ids: "ID'er for blokerede arbejdspakker"
label_column_in_backlog: "Kolonne i backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Ned"
label_points_burn_up: "Op"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint-hindringer"
+ label_sprint_new: "New sprint"
label_task_board: "Opgaveoversigt"
- permission_view_master_backlog: "Se hoved-backlog"
- permission_view_taskboards: "Vis opgaveoversigter"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Vælg udført-statusser"
- permission_update_sprints: "Opdatere sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml
index ef0b991f0af..f2e91491024 100644
--- a/modules/backlogs/config/locales/crowdin/de.yml
+++ b/modules/backlogs/config/locales/crowdin/de.yml
@@ -25,6 +25,12 @@ de:
description: "Dieses Modul fügt Funktionen hinzu, die es agilen Teams ermöglichen, mit OpenProject in Scrum-Projekten zu arbeiten."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Dauer"
+ finish_date: "Endtermin"
+ goal: "Sprint-Ziel"
+ name: "Sprint-Name"
+ sharing: "Teilen"
sprint:
duration: "Sprint-Dauer"
work_package:
@@ -42,12 +48,15 @@ de:
task_version_must_be_the_same_as_story_version: "muss der Version der übergeordneten Story entsprechen."
sprint:
cannot_end_before_it_starts: "Sprint kann nicht enden, bevor er begonnen hat."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Aufgaben-Typ"
backlogs:
any: "beliebig"
column_width: "Spaltenbreite"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Hindernis"
label_versions_default_fold_state: "Versionen eingeklappt anzeigen"
caption_versions_default_fold_state: "Versionen werden beim Anzeigen des Backlogs standardmäßig nicht aufgeklappt. Sie müssen manuell geöffnet werden."
@@ -75,12 +84,21 @@ de:
backlog_component:
blankslate_title: "%{name} ist leer"
blankslate_description: "Noch keine Arbeitspakete geplant. Ziehen Sie Arbeitspakete hierher, um sie hinzuzufügen."
+ sprint_component:
+ blankslate_title: "%{name} ist leer"
+ blankslate_description: "Noch keine Arbeitspakete geplant. Ziehen Sie Arbeitspakete hierher, um sie hinzuzufügen."
backlog_header_component:
label_toggle_backlog: "%{name} ein-/ausklappen"
label_story_count:
zero: "Keine Arbeitspakete im Backlog"
one: "%{count} Arbeitspakete im Backlog"
other: "%{count} Geschichten im Backlog"
+ sprint_header_component:
+ label_toggle_backlog: "%{name} ein-/ausklappen"
+ label_story_count:
+ zero: "Keine Stories im Sprint"
+ one: "%{count} Stories im Sprint"
+ other: "%{count} Stories im Sprint"
backlog_menu_component:
label_actions: "Backlog-Aktionen"
action_menu:
@@ -91,6 +109,14 @@ de:
burndown_chart: "Burndown-Diagramm"
wiki: "Wiki"
properties: "Eigenschaften"
+ sprint_menu_component:
+ label_actions: "Sprint-Aktionen"
+ action_menu:
+ edit_sprint: "Sprint bearbeiten"
+ new_story: "Neue Story"
+ stories_tasks: "Stories/Aufgaben"
+ task_board: "Taskboard"
+ burndown_chart: "Burndown-Diagramm"
story_component:
label_drag_story: "%{name} verschieben"
story_menu_component:
@@ -118,14 +144,19 @@ de:
label_backlogs_unconfigured: "Sie haben noch keine Backlogs konfiguriert. Bitte gehen Sie auf %{administration} > %{plugins}, klicken Sie dann auf den %{configure} Link für dieses Plugin. Kommen Sie hierher zurück, sobald sie die Felder konfiguriert haben."
label_blocks_ids: "IDs der blockierten Arbeitspakete"
label_column_in_backlog: "Spalte im Backlog"
+ label_used_as_backlog: "Als Backlog verwendet"
label_points_burn_down: "Runter"
label_points_burn_up: "Hoch"
+ label_sprint_edit: "Sprint bearbeiten"
label_sprint_impediments: "Sprint Hindernisse"
+ label_sprint_new: "Neuer Sprint"
label_task_board: "Taskboard"
- permission_view_master_backlog: "Master Backlog ansehen"
- permission_view_taskboards: "Taskboard ansehen"
+ permission_create_sprints: "Sprints erstellen"
+ permission_manage_sprint_items: "Sprint-Elemente verwalten"
permission_select_done_statuses: "Abgeschlossene Status auswählen"
- permission_update_sprints: "Sprints bearbeiten"
+ permission_share_sprint: "Sprint teilen"
+ permission_start_complete_sprint: "Sprint starten/abschließen"
+ permission_view_sprints: "Sprints ansehen"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/el.yml b/modules/backlogs/config/locales/crowdin/el.yml
index 53021e93381..0d1a7eac949 100644
--- a/modules/backlogs/config/locales/crowdin/el.yml
+++ b/modules/backlogs/config/locales/crowdin/el.yml
@@ -25,6 +25,12 @@ el:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ el:
task_version_must_be_the_same_as_story_version: "πρέπει να είναι το ίδιο με την έκδοση ιστορίας του γονέα."
sprint:
cannot_end_before_it_starts: "Το sprint δεν μπορεί να λήξει πριν αρχίσει."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "οποιoδήποτε"
column_width: "Column width"
definition_of_done: "Ορισμός των Ολοκληρωμένων"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Εμπόδιο"
label_versions_default_fold_state: "Εμφάνιση συμπτυγμένων εκδόσεων"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ el:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ el:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ el:
label_backlogs_unconfigured: "Δεν έχετε διαμορφώσει τα Backlogs ακόμη. Παρακαλούμε πηγαίνετε στο %{administration} > %{plugins}, έπειτα κάντε κλικ στον σύνδεσμο %{configure} για αυτό το πρόσθετο. Μόλις έχετε ορίσει τα πεδία, επιστρέψτε σε αυτή την σελίδα για να αρχίσετε να χρησιμοποιείτε το εργαλείο."
label_blocks_ids: "Ταυτότητες μπλοκαρισμένων πακέτων εργασίας"
label_column_in_backlog: "Στήλη στο backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Κάτω"
label_points_burn_up: "Πάνω"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Εμπόδια Sprint"
+ label_sprint_new: "New sprint"
label_task_board: "Πίνακας εργασιών"
- permission_view_master_backlog: "Εμφάνιση του κύριου backlog"
- permission_view_taskboards: "Εμφάνιση πινάκων εργασίας"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Ενημέρωση των sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/eo.yml b/modules/backlogs/config/locales/crowdin/eo.yml
index 9823ba39aec..82f8ebbb1c3 100644
--- a/modules/backlogs/config/locales/crowdin/eo.yml
+++ b/modules/backlogs/config/locales/crowdin/eo.yml
@@ -25,6 +25,12 @@ eo:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ eo:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "ajna"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ eo:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ eo:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ eo:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "ID de baritaj laborpakaĵoj"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Malsupren"
label_points_burn_up: "Supren"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml
index f019f9814a1..09b6a6aef4f 100644
--- a/modules/backlogs/config/locales/crowdin/es.yml
+++ b/modules/backlogs/config/locales/crowdin/es.yml
@@ -25,6 +25,12 @@ es:
description: "Este módulo añade funciones que permiten a los equipos Agile trabajar con OpenProject en proyectos Scrum."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duración"
+ finish_date: "Fecha de finalización"
+ goal: "Objetivo del sprint"
+ name: "Nombre del sprint"
+ sharing: "Uso compartido"
sprint:
duration: "Duración del sprint"
work_package:
@@ -42,12 +48,15 @@ es:
task_version_must_be_the_same_as_story_version: "debe coincidir con la versión de la historia principal."
sprint:
cannot_end_before_it_starts: "El sprint no puede terminar antes del inicio."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Tipo de tarea"
backlogs:
any: "cualquiera"
column_width: "Ancho de columna"
definition_of_done: "Criterio de Aceptación"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impedimento"
label_versions_default_fold_state: "Mostrar versiones colapsadas"
caption_versions_default_fold_state: "Las versiones no se expandirán por defecto al visualizar los trabajos pendientes. Cada una deberá expandirse manualmente."
@@ -75,12 +84,21 @@ es:
backlog_component:
blankslate_title: "%{name} está vacío"
blankslate_description: "Aún no hay elementos previstos. Arrastre los elementos aquí para añadirlos."
+ sprint_component:
+ blankslate_title: "%{name} está vacío"
+ blankslate_description: "Aún no hay elementos previstos. Arrastre los elementos aquí para añadirlos."
backlog_header_component:
label_toggle_backlog: "Contraer/expandir %{name}"
label_story_count:
zero: "No hay historias en backlog"
one: "%{count} historia en backlog"
other: "%{count} historias en backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Contraer/expandir %{name}"
+ label_story_count:
+ zero: "No hay historias en sprint"
+ one: "%{count} historia en sprint"
+ other: "%{count} historias en sprint"
backlog_menu_component:
label_actions: "Acciones de backlog"
action_menu:
@@ -91,6 +109,14 @@ es:
burndown_chart: "Diagrama Burndown"
wiki: "Wiki"
properties: "Propiedades"
+ sprint_menu_component:
+ label_actions: "Acciones de sprint"
+ action_menu:
+ edit_sprint: "Editar sprint"
+ new_story: "Nueva historia"
+ stories_tasks: "Historias/tareas"
+ task_board: "Panel de tareas"
+ burndown_chart: "Diagrama Burndown"
story_component:
label_drag_story: "Mover %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ es:
label_backlogs_unconfigured: "Todavía no ha configurado backlogs. Por favor, visite %{administration} > %{plugins}, luego haga clic en el enlace de %{configure} para esta extensión. Cuando haya establecido los campos, vuelva a esta página para empezar a usar la herramienta."
label_blocks_ids: "ID de los paquetes de trabajo bloqueados"
label_column_in_backlog: "Columna en backlog"
+ label_used_as_backlog: "Se usa como backlog"
label_points_burn_down: "Abajo"
label_points_burn_up: "Arriba"
+ label_sprint_edit: "Editar sprint"
label_sprint_impediments: "Impedimentos de sprint"
+ label_sprint_new: "Nuevo sprint"
label_task_board: "Tablero de tareas"
- permission_view_master_backlog: "Ver backlog maestro"
- permission_view_taskboards: "Ver tablero de tareas"
+ permission_create_sprints: "Crear sprints"
+ permission_manage_sprint_items: "Gestionar elementos de sprint"
permission_select_done_statuses: "Seleccionar estados de finalización"
- permission_update_sprints: "Actualizar sprints"
+ permission_share_sprint: "Compartir sprint"
+ permission_start_complete_sprint: "Iniciar/completar sprint"
+ permission_view_sprints: "Ver sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/et.yml b/modules/backlogs/config/locales/crowdin/et.yml
index 70ca6ef2f2f..7c7d3d3daa6 100644
--- a/modules/backlogs/config/locales/crowdin/et.yml
+++ b/modules/backlogs/config/locales/crowdin/et.yml
@@ -25,6 +25,12 @@ et:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ et:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "any"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ et:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ et:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ et:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Alla"
label_points_burn_up: "Üles"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Vali valmis staatused"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/eu.yml b/modules/backlogs/config/locales/crowdin/eu.yml
index aee74542e1a..30e0af5f5cb 100644
--- a/modules/backlogs/config/locales/crowdin/eu.yml
+++ b/modules/backlogs/config/locales/crowdin/eu.yml
@@ -25,6 +25,12 @@ eu:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ eu:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "edozein"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ eu:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ eu:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ eu:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Behera"
label_points_burn_up: "Gora"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/fa.yml b/modules/backlogs/config/locales/crowdin/fa.yml
index f6111ae7bb9..510a1c9685b 100644
--- a/modules/backlogs/config/locales/crowdin/fa.yml
+++ b/modules/backlogs/config/locales/crowdin/fa.yml
@@ -25,6 +25,12 @@ fa:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "مدت زمان اسپرینت"
work_package:
@@ -42,12 +48,15 @@ fa:
task_version_must_be_the_same_as_story_version: "باید از همان نگارش داستان زادآوران باشد."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "نوع وظیفه"
backlogs:
any: "any"
column_width: "عرض ستون"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "در هنگام مشاهده backlog ها، نسخهها به صورت پیشفرض بازنخواهندشد. هر کدام باید به صورت دستی باز شوند."
@@ -75,12 +84,21 @@ fa:
backlog_component:
blankslate_title: "%{name} خالی است"
blankslate_description: "هنوز موردی برنامه ریزی نشده است. موارد را برای اضافه کردن به اینجا بکشید."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "جمع کردن/باز کردن %{name}"
label_story_count:
zero: "هیچ داستانی در لیست انتظار نیست"
one: "%{count} داستان در لیست کار های عقب افتاده"
other: "%{count} داستان های در لیست کارهای عقب افتاده"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "اقدامات عقب افتاده"
action_menu:
@@ -91,6 +109,14 @@ fa:
burndown_chart: "نمودار خلاصه"
wiki: "ویکی"
properties: "ویژگی ها"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "انتقال %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ fa:
label_backlogs_unconfigured: "شما هنوز پسافتها را پیکربندی نکردهاید. لطفاً به %{administration} > %{plugins} بروید، سپس برای این افزونه روی %{configure} کلیک کنید. وقتی همۀ قسمتها را تکمیل کردید، برای استفاده از این ابزار به همین صفحه برگردید. "
label_blocks_ids: "شناسههای مسدود کاربستهها"
label_column_in_backlog: "ستون در پسافت"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "پایین"
label_points_burn_up: "بالا"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: " موانع تاخت"
+ label_sprint_new: "New sprint"
label_task_board: "تابلوی وظیفه"
- permission_view_master_backlog: "نمایش بک لاگ اصلی"
- permission_view_taskboards: "مشاهده تابلو وظایف"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "انتخاب وضعیت های انجام شده"
- permission_update_sprints: "بروزرسانی دورهها"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "وظایف"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/fi.yml b/modules/backlogs/config/locales/crowdin/fi.yml
index b2b927ccdc8..853ef47c81f 100644
--- a/modules/backlogs/config/locales/crowdin/fi.yml
+++ b/modules/backlogs/config/locales/crowdin/fi.yml
@@ -25,6 +25,12 @@ fi:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ fi:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprintti ei voi päättyä, ennen kuin se alkaa."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "kaikki"
column_width: "Column width"
definition_of_done: "Valmiin määritelmä"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Este"
label_versions_default_fold_state: "Näytä versiot ryhmiteltyinä"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ fi:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ fi:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ fi:
label_backlogs_unconfigured: "Et ole määrittänyt vielä työjonoja. Siirry menuun %{administration} > %{plugins}, sitten klikkaa %{configure} linkkiä tälle liitännäiselle. Kun olet määrittänyt kentät, tule takaisin tälle sivulle aloittaaksesi työkalun käytön."
label_blocks_ids: "Estettyjen työpakettien tunnukset"
label_column_in_backlog: "Sarake työjonossa"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Alas"
label_points_burn_up: "Ylös"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprintin esteet"
+ label_sprint_new: "New sprint"
label_task_board: "Tehtävätaulu"
- permission_view_master_backlog: "Näytä pääasiallinen työjono"
- permission_view_taskboards: "Näytä työtaulut"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Päivitä sprinttejä"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Työjonot"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/fil.yml b/modules/backlogs/config/locales/crowdin/fil.yml
index 6f0109336b2..eaa59519e54 100644
--- a/modules/backlogs/config/locales/crowdin/fil.yml
+++ b/modules/backlogs/config/locales/crowdin/fil.yml
@@ -25,6 +25,12 @@ fil:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ fil:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "any"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ fil:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ fil:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ fil:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "Mga ID ng naka-block na mga pakete sa gumagawa"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml
index 16aacdfeab4..eb04e9ebdb1 100644
--- a/modules/backlogs/config/locales/crowdin/fr.yml
+++ b/modules/backlogs/config/locales/crowdin/fr.yml
@@ -25,6 +25,12 @@ fr:
description: "Ce module ajoute des fonctionnalités permettant aux équipes agiles de travailler avec OpenProject dans le cadre de projets Scrum."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Durée"
+ finish_date: "Date de fin"
+ goal: "Objectif du sprint"
+ name: "Nom du sprint"
+ sharing: "Partage"
sprint:
duration: "Durée du sprint"
work_package:
@@ -42,12 +48,15 @@ fr:
task_version_must_be_the_same_as_story_version: "doit être identique à la version de l'histoire parente."
sprint:
cannot_end_before_it_starts: "Un sprint ne peut pas se terminer avant d'avoir débuté."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Type de tâche"
backlogs:
any: "tout"
column_width: "Largeur de colonne"
definition_of_done: "Définition de Fait"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Obstacle"
label_versions_default_fold_state: "Afficher les versions de manière repliée"
caption_versions_default_fold_state: "Les versions ne seront pas développées par défaut lors de l'affichage des backlogs. Chacune devra être développée manuellement."
@@ -75,12 +84,21 @@ fr:
backlog_component:
blankslate_title: "%{name} est vide"
blankslate_description: "Aucun élément n'a encore été planifié. Faites glisser les éléments ici pour les ajouter."
+ sprint_component:
+ blankslate_title: "%{name} est vide"
+ blankslate_description: "Aucun élément n'a encore été planifié. Faites glisser les éléments ici pour les ajouter."
backlog_header_component:
label_toggle_backlog: "Réduire/développer %{name}"
label_story_count:
zero: "Aucune histoire dans le backlog"
one: "%{count} histoire dans le backlog"
other: "%{count} histoires dans le backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Réduire/développer %{name}"
+ label_story_count:
+ zero: "Aucune story dans le sprint"
+ one: "%{count} story dans le sprint"
+ other: "%{count} stories dans le sprint"
backlog_menu_component:
label_actions: "Actions dans le backlog"
action_menu:
@@ -91,6 +109,14 @@ fr:
burndown_chart: "Graphique burndown"
wiki: "Wiki"
properties: "Propriétés"
+ sprint_menu_component:
+ label_actions: "Actions du sprint"
+ action_menu:
+ edit_sprint: "Modifier le sprint"
+ new_story: "Nouvelle story"
+ stories_tasks: "Stories/tâches"
+ task_board: "Tableau des tâches"
+ burndown_chart: "Graphique burndown"
story_component:
label_drag_story: "Déplacer %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ fr:
label_backlogs_unconfigured: "Vous n'avez pas encore configuré Backlogs. Veuillez vous rendre dans %{administration} > %{plugins}, puis cliquer sur le lien %{configure} pour ce plugin. Une fois que vous avez défini les champs, revenez sur cette page pour commencer à utiliser l'outil."
label_blocks_ids: "ID des lots de travaux bloqués"
label_column_in_backlog: "Colonne dans le backlog"
+ label_used_as_backlog: "Utilisé comme backlog"
label_points_burn_down: "Vers le bas"
label_points_burn_up: "Vers le haut"
+ label_sprint_edit: "Modifier le sprint"
label_sprint_impediments: "Obstacles de sprint"
+ label_sprint_new: "Nouveau sprint"
label_task_board: "Tableau des tâches"
- permission_view_master_backlog: "Afficher le backlog principal"
- permission_view_taskboards: "Voir les tableaux des tâches"
+ permission_create_sprints: "Créer des sprints"
+ permission_manage_sprint_items: "Gérer les éléments du sprint"
permission_select_done_statuses: "Sélectionner les statuts terminés"
- permission_update_sprints: "Éditer les sprints"
+ permission_share_sprint: "Partager le sprint"
+ permission_start_complete_sprint: "Commencer/terminer le sprint"
+ permission_view_sprints: "Voir les sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/he.yml b/modules/backlogs/config/locales/crowdin/he.yml
index a3d2729ba67..31015e32fb7 100644
--- a/modules/backlogs/config/locales/crowdin/he.yml
+++ b/modules/backlogs/config/locales/crowdin/he.yml
@@ -25,6 +25,12 @@ he:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ he:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "הכל"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -79,12 +88,21 @@ he:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -95,6 +113,14 @@ he:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -122,14 +148,19 @@ he:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "המזהים של חבילות עבודה חסומים"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/hi.yml b/modules/backlogs/config/locales/crowdin/hi.yml
index c1624aaae8f..c4d105746f4 100644
--- a/modules/backlogs/config/locales/crowdin/hi.yml
+++ b/modules/backlogs/config/locales/crowdin/hi.yml
@@ -25,6 +25,12 @@ hi:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ hi:
task_version_must_be_the_same_as_story_version: "मूल कहानी के संस्करण के समान होना चाहिए।"
sprint:
cannot_end_before_it_starts: "स्प्रिंट शुरू होने से पहले खत्म नहीं हो सकता।"
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "कोई"
column_width: "Column width"
definition_of_done: "पूर्ण की परिभाषा"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "बाधा"
label_versions_default_fold_state: "मुड़े हुए संस्करण दिखाएं"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ hi:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ hi:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ hi:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/hr.yml b/modules/backlogs/config/locales/crowdin/hr.yml
index 4a46ad8f6c5..f4318fddb9e 100644
--- a/modules/backlogs/config/locales/crowdin/hr.yml
+++ b/modules/backlogs/config/locales/crowdin/hr.yml
@@ -25,6 +25,12 @@ hr:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ hr:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Period razvoja ne može završiti prije nego li je započeo."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "bilo koji"
column_width: "Column width"
definition_of_done: "Definicija učinjenog"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Teškoće"
label_versions_default_fold_state: "Prikaži prikupljene verzije"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -77,12 +86,21 @@ hr:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -93,6 +111,14 @@ hr:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -120,14 +146,19 @@ hr:
label_backlogs_unconfigured: "Niste još konfigurirali Backlog. Za konfiguraciju odaberite %{administration}>%{plugins}, zatim %{configure} Backlog dodatak. Nakon što ste uredili potrebna polja, vratite se na ovu stranicu da biste započeli s korištenjem ovog alata."
label_blocks_ids: "ID blokiranih radnih paketa"
label_column_in_backlog: "Stupac u backlogu"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Dolje"
label_points_burn_up: "Gore"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Prepreke perioda razvoja"
+ label_sprint_new: "New sprint"
label_task_board: "Upravitelj zadatcima"
- permission_view_master_backlog: "Pogledaj glavni backlog"
- permission_view_taskboards: "Pogledaj upravitelj zadatcima"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Ažuriraj periode razvoja"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/hu.yml b/modules/backlogs/config/locales/crowdin/hu.yml
index 7aab8818879..2bbdd49a147 100644
--- a/modules/backlogs/config/locales/crowdin/hu.yml
+++ b/modules/backlogs/config/locales/crowdin/hu.yml
@@ -25,6 +25,12 @@ hu:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ hu:
task_version_must_be_the_same_as_story_version: "a szülő story verziójával megegyezőnek kell lennie."
sprint:
cannot_end_before_it_starts: "Sprint nem érhet véget, mielőtt elindul."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Feladat típusa"
backlogs:
any: "bármely"
column_width: "Column width"
definition_of_done: "A \"Kész\" meghatározása"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Akadály"
label_versions_default_fold_state: "Összecsukott verziók mutatása"
caption_versions_default_fold_state: "A verziók alapértelmezés szerint nem lesznek kibontva a várólista (backlog) megtekintésekor. Mindegyiket manuálisan kell kibontani."
@@ -75,12 +84,21 @@ hu:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ hu:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ hu:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Le"
label_points_burn_up: "Fel"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint akadályai"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Elkészültek kiválasztása"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/id.yml b/modules/backlogs/config/locales/crowdin/id.yml
index 39f4116d3c8..2f03ef740e4 100644
--- a/modules/backlogs/config/locales/crowdin/id.yml
+++ b/modules/backlogs/config/locales/crowdin/id.yml
@@ -25,6 +25,12 @@ id:
description: "Modul ini menambahkan fitur yang memungkinkan tim yang gesit bekerja dengan OpenProject dalam proyek Scrum."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ id:
task_version_must_be_the_same_as_story_version: "harus sama seperti versi kisah orang tua."
sprint:
cannot_end_before_it_starts: "Sprint tidak bisa berakhir sebelum mulai."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Jenis tugas"
backlogs:
any: "apapun"
column_width: "Column width"
definition_of_done: "Definisi Selesai"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Halangan"
label_versions_default_fold_state: "Tampilkan versi terlipat"
caption_versions_default_fold_state: "Versi tidak akan diperluas secara default saat melihat daftar tugas yang tertunda. Setiap versi harus diperluas secara manual."
@@ -73,12 +82,21 @@ id:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -89,6 +107,14 @@ id:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -116,14 +142,19 @@ id:
label_backlogs_unconfigured: "Anda belum mengkonfigurasi Backlogs. Silakan masuk ke %{administration}> %{plugins}, lalu klik pada link %{configure} untuk plugin ini. Setelah Anda menyetel bidang, kembali ke halaman ini untuk mulai menggunakan alat ini."
label_blocks_ids: "ID dari paket pekerjaan yang diblokir"
label_column_in_backlog: "Kolom di backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Menurun"
label_points_burn_up: "Naik"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Hanbatan kekuatan"
+ label_sprint_new: "New sprint"
label_task_board: "Papan tugas"
- permission_view_master_backlog: "Lihat backlog master"
- permission_view_taskboards: "Lihat papan tugas"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Pilih status selesai"
- permission_update_sprints: "Perbarui sprint"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml
index 4caea4de2d5..92bda374c47 100644
--- a/modules/backlogs/config/locales/crowdin/it.yml
+++ b/modules/backlogs/config/locales/crowdin/it.yml
@@ -25,6 +25,12 @@ it:
description: "Questo modulo aggiunge funzionalità che consentono ai team agili di lavorare con i progetti OpenProject in Scrum."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Durata"
+ finish_date: "Data di fine"
+ goal: "Obiettivo dello sprint"
+ name: "Nome dello sprint"
+ sharing: "Condivisione"
sprint:
duration: "Durata dello sprint"
work_package:
@@ -42,12 +48,15 @@ it:
task_version_must_be_the_same_as_story_version: "deve essere uguale alla versione della storia del genitore."
sprint:
cannot_end_before_it_starts: "Uno sprint non può terminare prima che venga avviato."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Tipo di attività"
backlogs:
any: "qualsiasi"
column_width: "Larghezza della colonna"
definition_of_done: "Definizione di fatto"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impedimento"
label_versions_default_fold_state: "Espandi le versioni"
caption_versions_default_fold_state: "Le versioni non verranno espanse per impostazione predefinita durante la visualizzazione dei backlog. Ogni versione deve essere espansa manualmente."
@@ -75,12 +84,21 @@ it:
backlog_component:
blankslate_title: "%{name} è vuoto"
blankslate_description: "Nessun elemento pianificato ancora. Trascina gli elementi qui per aggiungerli."
+ sprint_component:
+ blankslate_title: "%{name} è vuoto"
+ blankslate_description: "Nessun elemento pianificato ancora. Trascina gli elementi qui per aggiungerli."
backlog_header_component:
label_toggle_backlog: "Comprimi/Espandi %{name}"
label_story_count:
zero: "Nessuna story nel backlog"
one: "%{count} story nel backlog"
other: "%{count} story nel backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Comprimi/Espandi %{name}"
+ label_story_count:
+ zero: "Nessuna story nello sprint"
+ one: "%{count} story nello sprint"
+ other: "%{count} story nello sprint"
backlog_menu_component:
label_actions: "Azioni nel backlog"
action_menu:
@@ -91,6 +109,14 @@ it:
burndown_chart: "Grafico Burndown"
wiki: "Wiki"
properties: "Proprietà"
+ sprint_menu_component:
+ label_actions: "Azioni dello sprint"
+ action_menu:
+ edit_sprint: "Modifica sprint"
+ new_story: "Nuova story"
+ stories_tasks: "Story/Task"
+ task_board: "Bacheca dei task"
+ burndown_chart: "Grafico Burndown"
story_component:
label_drag_story: "Sposta %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ it:
label_backlogs_unconfigured: "Non hai ancora configurato i Backlog. Vai su %{administration} > %{plugins}, quindi fai clic sul link %{configure} per il plugin. Dopo aver impostato i campi, torna su questa pagina per iniziare a utilizzare lo strumento."
label_blocks_ids: "ID dei pacchetti di lavoro bloccati"
label_column_in_backlog: "Colonna nel backlog"
+ label_used_as_backlog: "Usato come backlog"
label_points_burn_down: "Verso il basso"
label_points_burn_up: "Verso l'alto"
+ label_sprint_edit: "Modifica sprint"
label_sprint_impediments: "Impedimenti allo sprint"
+ label_sprint_new: "Nuovo sprint"
label_task_board: "Pannello delle attività"
- permission_view_master_backlog: "Visualizza il master backlog"
- permission_view_taskboards: "Visualizza i pannelli delle attività"
+ permission_create_sprints: "Crea gli sprint"
+ permission_manage_sprint_items: "Gestisci gli elementi dello sprint"
permission_select_done_statuses: "Seleziona gli stati terminati"
- permission_update_sprints: "Aggiorna gli sprint"
+ permission_share_sprint: "Condividi lo sprint"
+ permission_start_complete_sprint: "Iniziare/completa lo sprint"
+ permission_view_sprints: "Visualizza gli sprint"
project_module_backlogs: "Backlog"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/ja.yml b/modules/backlogs/config/locales/crowdin/ja.yml
index 5af9e30d172..4eb545ca810 100644
--- a/modules/backlogs/config/locales/crowdin/ja.yml
+++ b/modules/backlogs/config/locales/crowdin/ja.yml
@@ -25,6 +25,12 @@ ja:
description: "このモジュールには、アジャイルチームがスクラムプロジェクトでOpenProjectを使用できるようにする機能が追加されています。"
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ ja:
task_version_must_be_the_same_as_story_version: "親ストーリーのバージョンと同じでなければなりません。"
sprint:
cannot_end_before_it_starts: "スプリントは開始する前に終了できません。"
+ models:
+ sprint: "Sprint"
attributes:
task_type: "タスクのタイプ"
backlogs:
any: "全て"
column_width: "Column width"
definition_of_done: "「終了」の定義"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "障害事項"
label_versions_default_fold_state: "バージョンを折り畳んで表示"
caption_versions_default_fold_state: "バックログを表示する場合、デフォルトではバージョンは展開されません。各バージョンは手動で展開する必要があります。"
@@ -73,12 +82,21 @@ ja:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -89,6 +107,14 @@ ja:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -116,14 +142,19 @@ ja:
label_backlogs_unconfigured: "バックログは未設定です。%{administration} > %{plugins}をアクセスして、このプラグインの%{configure}リンクをクリックしてください。フィールドを設定した後、このページに戻ってツールを使用開始してください。"
label_blocks_ids: "ブロックされているワークパッケージのID"
label_column_in_backlog: "バックログの列"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "ダウン"
label_points_burn_up: "アップ"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "スプリント障害事項"
+ label_sprint_new: "New sprint"
label_task_board: "かんばん"
- permission_view_master_backlog: "マスター バックログの表示"
- permission_view_taskboards: "かんばんの表示"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "完了ステータスを選択"
- permission_update_sprints: "スプリントの更新"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "バックログ"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/ka.yml b/modules/backlogs/config/locales/crowdin/ka.yml
index 9939b839c08..800f0ec5014 100644
--- a/modules/backlogs/config/locales/crowdin/ka.yml
+++ b/modules/backlogs/config/locales/crowdin/ka.yml
@@ -25,6 +25,12 @@ ka:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ ka:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "ნებისმიერი"
column_width: "Column width"
definition_of_done: "დასრულების აღწერა"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "წინააღმდეგობა"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ ka:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ ka:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ ka:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "ქვემოთ"
label_points_burn_up: "ზემოთ"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "ამოცანების დაფა"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "აირჩიეთ დასრულების სტატუსები"
- permission_update_sprints: "სპრინტების განახლება"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "შეუსრულებელი ამოცანები"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/kk.yml b/modules/backlogs/config/locales/crowdin/kk.yml
index 584b33393b7..8a82b88509c 100644
--- a/modules/backlogs/config/locales/crowdin/kk.yml
+++ b/modules/backlogs/config/locales/crowdin/kk.yml
@@ -25,6 +25,12 @@ kk:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ kk:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "any"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ kk:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ kk:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ kk:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml
index 3127941ab0c..4b2ee8833fb 100644
--- a/modules/backlogs/config/locales/crowdin/ko.yml
+++ b/modules/backlogs/config/locales/crowdin/ko.yml
@@ -25,6 +25,12 @@ ko:
description: "이 모듈은 애자일 팀이 Scrum 프로젝트에서 OpenProject로 작업할 수 있도록 하는 기능을 추가합니다."
activerecord:
attributes:
+ agile/sprint:
+ duration: "기간"
+ finish_date: "완료 날짜"
+ goal: "스프린트 목표"
+ name: "스프린트 이름"
+ sharing: "공유"
sprint:
duration: "스프린트 기간"
work_package:
@@ -42,12 +48,15 @@ ko:
task_version_must_be_the_same_as_story_version: "은(는) 부모 스토리의 버전과 동일해야 합니다."
sprint:
cannot_end_before_it_starts: "스프린트는 시작되기 전에 끝날 수 없습니다."
+ models:
+ sprint: "스프린트"
attributes:
task_type: "작업 유형"
backlogs:
any: "모두"
column_width: "열 너비"
definition_of_done: "완료 정의"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "제한"
label_versions_default_fold_state: "접힌 버전 표시"
caption_versions_default_fold_state: "백로그를 볼 때 버전은 기본적으로 확장되지 않습니다. 각 버전을 수동으로 확장해야 합니다."
@@ -73,12 +82,21 @@ ko:
backlog_component:
blankslate_title: "%{name}이(가) 비어 있습니다"
blankslate_description: "아직 계획된 항목이 없습니다. 항목을 추가하려면 여기로 드래그하세요."
+ sprint_component:
+ blankslate_title: "%{name}이(가) 비어 있습니다"
+ blankslate_description: "아직 계획된 항목이 없습니다. 항목을 추가하려면 여기로 드래그하세요."
backlog_header_component:
label_toggle_backlog: "%{name} 축소/확장"
label_story_count:
zero: "백로그에 스토리 없음"
one: "백로그의 %{count}개 스토리"
other: "백로그의 %{count}개 스토리"
+ sprint_header_component:
+ label_toggle_backlog: "%{name} 축소/확장"
+ label_story_count:
+ zero: "스프린트의 스토리 없음"
+ one: "스프린트의 %{count}개 스토리"
+ other: "스프린트의 %{count}개 스토리"
backlog_menu_component:
label_actions: "백로그 작업"
action_menu:
@@ -89,6 +107,14 @@ ko:
burndown_chart: "번다운 차트"
wiki: "위키"
properties: "속성"
+ sprint_menu_component:
+ label_actions: "스프린트 작업"
+ action_menu:
+ edit_sprint: "스프린트 편집"
+ new_story: "새로운 스토리"
+ stories_tasks: "스토리/작업"
+ task_board: "작업 보드"
+ burndown_chart: "번다운 차트"
story_component:
label_drag_story: "%{name} 이동"
story_menu_component:
@@ -116,14 +142,19 @@ ko:
label_backlogs_unconfigured: "백로그를 아직 구성하지 않았습니다. %{administration} > %{plugins}(으)로 이동한 다음 이 플러그인의 %{configure} 링크를 클릭하세요. 필드를 설정한 후 이 페이지로 돌아가서 해당 도구 사용을 시작하세요."
label_blocks_ids: "차단된 작업 패키지의 ID"
label_column_in_backlog: "백로그의 열"
+ label_used_as_backlog: "백로그로 사용됨"
label_points_burn_down: "아래"
label_points_burn_up: "위"
+ label_sprint_edit: "스프린트 편집"
label_sprint_impediments: "스프린트 제한"
+ label_sprint_new: "새로운 스프린트"
label_task_board: "작업 보드"
- permission_view_master_backlog: "마스터 백로그 보기"
- permission_view_taskboards: "작업 보드 보기"
+ permission_create_sprints: "스프린트 만들기"
+ permission_manage_sprint_items: "스프린트 항목 관리"
permission_select_done_statuses: "완료 상태 선택"
- permission_update_sprints: "스프린트 업데이트"
+ permission_share_sprint: "스프린트 공유"
+ permission_start_complete_sprint: "스프린트 시작/완료"
+ permission_view_sprints: "스프린트 보기"
project_module_backlogs: "백로그"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/lt.yml b/modules/backlogs/config/locales/crowdin/lt.yml
index 47f4923d387..af7ad730f97 100644
--- a/modules/backlogs/config/locales/crowdin/lt.yml
+++ b/modules/backlogs/config/locales/crowdin/lt.yml
@@ -25,6 +25,12 @@ lt:
description: "Šis modulis prideda funkcionalumą, leidžianti agile komandoms dirbti su OpenProject Scrum projektuose."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ lt:
task_version_must_be_the_same_as_story_version: "turi būti tokia pati kaip ir tėvinės istorijos versija."
sprint:
cannot_end_before_it_starts: "Sprintas negali baigtis prieš prasidėdamas."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "bet koks"
column_width: "Column width"
definition_of_done: "Pabaigimo apibrėžimas"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Kliūtis"
label_versions_default_fold_state: "Rodyti suskleistas versijas"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -79,12 +88,21 @@ lt:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -95,6 +113,14 @@ lt:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -122,14 +148,19 @@ lt:
label_backlogs_unconfigured: "Jūs dar nesukonfigūravote Darbų sąrašų. Prašome eiti į %{administration} > %{plugins}, tada nuspausti ant %{configure} nuorodos šiam įskiepiui. Kai nustatysite laukus, grįžkite čia ir pradėkite naudoti instrumentą."
label_blocks_ids: "Blokuotų darbų paketų ID reikšmės"
label_column_in_backlog: "Stulpelis darbų sąraše"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Žemyn"
label_points_burn_up: "Aukštyn"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprinto trukdžiai"
+ label_sprint_new: "New sprint"
label_task_board: "Užduočių lenta"
- permission_view_master_backlog: "Peržiūrėti pagrindinį darbų sąrašą"
- permission_view_taskboards: "Peržiūrėti užduočių lentas"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Parinkite atliktas būsenas"
- permission_update_sprints: "Atnaujinti sprintus"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Darbų sąrašai"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/lv.yml b/modules/backlogs/config/locales/crowdin/lv.yml
index 2adefaeaf7a..c4ae62c40ed 100644
--- a/modules/backlogs/config/locales/crowdin/lv.yml
+++ b/modules/backlogs/config/locales/crowdin/lv.yml
@@ -25,6 +25,12 @@ lv:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ lv:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprints nevar beigties, pirms tas ir sācies."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "visi"
column_width: "Column width"
definition_of_done: "Pabeigtības definīcija"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Šķēršļi"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -77,12 +86,21 @@ lv:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -93,6 +111,14 @@ lv:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -120,14 +146,19 @@ lv:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Atlikušo darbu backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Lejup"
label_points_burn_up: "Augšup"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprinta šķēršļi"
+ label_sprint_new: "New sprint"
label_task_board: "Pieteikumu tāfele"
- permission_view_master_backlog: "Skatīt visus nepabeigtos darbus"
- permission_view_taskboards: "Apskatīt uzdevumu dēļus"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Izvēlieties pabeigtības statusu"
- permission_update_sprints: "Atjaunināt sprintus"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Darbu krātuve"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/mn.yml b/modules/backlogs/config/locales/crowdin/mn.yml
index 3bc7baea066..4b9ae429fe0 100644
--- a/modules/backlogs/config/locales/crowdin/mn.yml
+++ b/modules/backlogs/config/locales/crowdin/mn.yml
@@ -25,6 +25,12 @@ mn:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ mn:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "ямар ч"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ mn:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ mn:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ mn:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/ms.yml b/modules/backlogs/config/locales/crowdin/ms.yml
index d3ea60be5c1..d93c45c1701 100644
--- a/modules/backlogs/config/locales/crowdin/ms.yml
+++ b/modules/backlogs/config/locales/crowdin/ms.yml
@@ -25,6 +25,12 @@ ms:
description: "Modul ini menambahkan fitur-fitur yang membolehkan kumpulan-kumpulan yang tangkas untuk bekerja menggunakan OpenProject di projek Scrum."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ ms:
task_version_must_be_the_same_as_story_version: "perlu sama dengan versi cerita induk."
sprint:
cannot_end_before_it_starts: "Pecutan tidak boleh berakhir lebih awal sebelum ia bermula."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "sebarang"
column_width: "Column width"
definition_of_done: "Definisi Selesai"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Halangan"
label_versions_default_fold_state: "Paparkan versi dilipat"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -73,12 +82,21 @@ ms:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -89,6 +107,14 @@ ms:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -116,14 +142,19 @@ ms:
label_backlogs_unconfigured: "Anda masih belum mengkonfigurasi tunggakan. Sila pergi ke %{administration} > %{plugins}, kemudian klik pautan %{configure} untuk plugin ini. Setelah anda menetapkan ruangan, kembali ke halaman ini untuk mula menggunakan alat ini."
label_blocks_ids: "ID pakej kerja yang disekat"
label_column_in_backlog: "Kolum dalam tunggakan"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Bawah"
label_points_burn_up: "Atas"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Halangan Pecutan"
+ label_sprint_new: "New sprint"
label_task_board: "Papan tugasan"
- permission_view_master_backlog: "Paparkan tunggakan utama"
- permission_view_taskboards: "Lihat papan tugasan"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Pilih status selesai"
- permission_update_sprints: "Kemas kini pecutan"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Tunggakan"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/ne.yml b/modules/backlogs/config/locales/crowdin/ne.yml
index 5b907ae6b84..6e6a574c935 100644
--- a/modules/backlogs/config/locales/crowdin/ne.yml
+++ b/modules/backlogs/config/locales/crowdin/ne.yml
@@ -25,6 +25,12 @@ ne:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ ne:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "any"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ ne:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ ne:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ ne:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml
index 50c125516ba..0fbb1ed4317 100644
--- a/modules/backlogs/config/locales/crowdin/nl.yml
+++ b/modules/backlogs/config/locales/crowdin/nl.yml
@@ -25,6 +25,12 @@ nl:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ nl:
task_version_must_be_the_same_as_story_version: "moet hetzelfde zijn als de bovenliggende verhaalversie."
sprint:
cannot_end_before_it_starts: "De sprint kan niet eindigen voordat het start."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "elke"
column_width: "Column width"
definition_of_done: "Definitie van Klaar"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Belemmering"
label_versions_default_fold_state: "Laat versies samengevouwen zien"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ nl:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ nl:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ nl:
label_backlogs_unconfigured: "Je hebt Backlogs nog niet geconfigureerd. Ga naar %{administration} >%{plugins}, en klik op de %{configure} voor deze plug-in. Kom hier terug nadat u de velden hebt geconfigureerd."
label_blocks_ids: "ID's van geblokkeerde werkpakketten"
label_column_in_backlog: "Kolom in achterstand"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Omlaag"
label_points_burn_up: "Omhoog"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Obstakels"
+ label_sprint_new: "New sprint"
label_task_board: "Taakbord"
- permission_view_master_backlog: "Toon Máster Backlog"
- permission_view_taskboards: "Bekijk taakborden"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Selecteer voltooide statussen"
- permission_update_sprints: "Sprints bijwerken"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml
index d463b97f8e9..feb3aa9b1be 100644
--- a/modules/backlogs/config/locales/crowdin/no.yml
+++ b/modules/backlogs/config/locales/crowdin/no.yml
@@ -25,6 +25,12 @@
description: "Denne modulen legger til funksjoner som setter dynamiske team i stand til å arbeide med OpenProject i Scrum prosjekter."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@
task_version_must_be_the_same_as_story_version: "må være det samme som den overordnete historiens versjon."
sprint:
cannot_end_before_it_starts: "Sprinten kan ikke avsluttes før den starter."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "hvilken som helst"
column_width: "Column width"
definition_of_done: "Definisjon av ferdig"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Hinder"
label_versions_default_fold_state: "Vis versjoner kollapset"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@
label_backlogs_unconfigured: "Du har ikke konfigurert Forsinkelser enda. Gå til %{administration} > %{plugins}og klikk deretter på %{configure} lenken for denne utvidelsen. Når du har angitt felter, går du tilbake til denne siden for å begynne å bruke verktøyet."
label_blocks_ids: "ID'er for blokkerte arbeidspakker"
label_column_in_backlog: "Kolonne i forsinkelse"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Ned"
label_points_burn_up: "Opp"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Hindring i etappe"
+ label_sprint_new: "New sprint"
label_task_board: "Oppgavetavle"
- permission_view_master_backlog: "Vis master forsinkelse"
- permission_view_taskboards: "Vis oppgavetavler"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Velg ferdige statuser"
- permission_update_sprints: "Oppdater etapper"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Forsinkelser"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml
index 8cab7c56f21..a389daa6760 100644
--- a/modules/backlogs/config/locales/crowdin/pl.yml
+++ b/modules/backlogs/config/locales/crowdin/pl.yml
@@ -25,6 +25,12 @@ pl:
description: "Moduł ten dodaje funkcje umożliwiające zwinnym zespołom pracę z OpenProject w projektach Scrum."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Czas trwania"
+ finish_date: "Data zakończenia"
+ goal: "Cel sprintu"
+ name: "Nazwa sprintu"
+ sharing: "Udostępnianie"
sprint:
duration: "Czas trwania sprintu"
work_package:
@@ -42,12 +48,15 @@ pl:
task_version_must_be_the_same_as_story_version: "musi być taka sama jak wersja story nadrzędnej."
sprint:
cannot_end_before_it_starts: "Sprint nie może się skończyć przed swoim rozpoczęciem."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Typ zadania"
backlogs:
any: "którekolwiek"
column_width: "Szerokość kolumny"
definition_of_done: "Definicja Zrobione"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Przeszkoda"
label_versions_default_fold_state: "Pokaż zwinięte wersje"
caption_versions_default_fold_state: "Wersje nie będą domyślnie rozwijane podczas przeglądania backlogów. Każdą z nich należy rozwinąć ręcznie."
@@ -79,12 +88,21 @@ pl:
backlog_component:
blankslate_title: "Element %{name} jest pusty"
blankslate_description: "Nie zaplanowano jeszcze żadnych punktów. Przeciągnij punkty tutaj, aby je dodać."
+ sprint_component:
+ blankslate_title: "Element %{name} jest pusty"
+ blankslate_description: "Nie zaplanowano jeszcze żadnych punktów. Przeciągnij punkty tutaj, aby je dodać."
backlog_header_component:
label_toggle_backlog: "Zwiń/rozwiń %{name}"
label_story_count:
zero: "Brak historii w backlogu"
one: "%{count} historia w backlogu"
other: "Liczba historii w backlogu: %{count}"
+ sprint_header_component:
+ label_toggle_backlog: "Zwiń/rozwiń %{name}"
+ label_story_count:
+ zero: "Brak historii w sprincie"
+ one: "%{count} historia w sprincie"
+ other: "Liczba historii w sprincie: %{count}"
backlog_menu_component:
label_actions: "Działania backlogu"
action_menu:
@@ -95,6 +113,14 @@ pl:
burndown_chart: "Wykres spalania (burndown)"
wiki: "Wiki"
properties: "Właściwości"
+ sprint_menu_component:
+ label_actions: "Działania w ramach sprintu"
+ action_menu:
+ edit_sprint: "Edytuj sprint"
+ new_story: "Nowa historia"
+ stories_tasks: "Historie/zadania"
+ task_board: "Panel zadań"
+ burndown_chart: "Wykres spalania (burndown)"
story_component:
label_drag_story: "Przenieś %{name}"
story_menu_component:
@@ -122,14 +148,19 @@ pl:
label_backlogs_unconfigured: "Jeszcze nie skonfigurowałeś backlogów. Przejdź do %{administration} > %{plugins}, następnie kliknij link %{configure} dla otrzymania tego dodatku. Po ustawieniu pól, wróć na tę stronę, aby zacząć korzystanie z narzędzia."
label_blocks_ids: "Identyfikatory zablokowanych pakietów prac"
label_column_in_backlog: "Kolumna w backlogu"
+ label_used_as_backlog: "Służy jako backlog"
label_points_burn_down: "W dół"
label_points_burn_up: "W górę"
+ label_sprint_edit: "Edytuj sprint"
label_sprint_impediments: "Przeszkody sprintu"
+ label_sprint_new: "Nowy sprint"
label_task_board: "Panel zadań"
- permission_view_master_backlog: "Wyświetl master backlog"
- permission_view_taskboards: "Wyświetl panel zadań"
+ permission_create_sprints: "Utwórz sprinty"
+ permission_manage_sprint_items: "Zarządzaj elementami sprintu"
permission_select_done_statuses: "Wybierz wykonane statusy"
- permission_update_sprints: "Aktualizuj sprint"
+ permission_share_sprint: "Udostępnij sprint"
+ permission_start_complete_sprint: "Rozpocznij/ukończ sprint"
+ permission_view_sprints: "Wyświetl sprinty"
project_module_backlogs: "Backlogi"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml
index 941be3e4c9d..55fdce0fae2 100644
--- a/modules/backlogs/config/locales/crowdin/pt-BR.yml
+++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml
@@ -25,6 +25,12 @@ pt-BR:
description: "Este módulo acrescenta recursos que permitem que as equipes ágeis trabalhem com o OpenProject em projetos Scrum."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duração"
+ finish_date: "Data de conclusão"
+ goal: "Objetivo da sprint"
+ name: "Nome da sprint"
+ sharing: "Compartilhamento"
sprint:
duration: "Duração da sprint"
work_package:
@@ -42,12 +48,15 @@ pt-BR:
task_version_must_be_the_same_as_story_version: "deve ser igual à versão da história dos pais."
sprint:
cannot_end_before_it_starts: "A sprint não pode terminar antes de começar."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Tipo de tarefa"
backlogs:
any: "qualquer"
column_width: "Largura da coluna"
definition_of_done: "Definição de pronto"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impedimento"
label_versions_default_fold_state: "Mostrar versões em modo fechado"
caption_versions_default_fold_state: "As versões não serão expandidas por padrão ao visualizar backlogs. Cada uma deve ser expandida manualmente."
@@ -75,12 +84,21 @@ pt-BR:
backlog_component:
blankslate_title: "%{name} está vazio"
blankslate_description: "Ainda não há itens planejados. Arraste os itens para este espaço para adicioná-los."
+ sprint_component:
+ blankslate_title: "%{name} está vazio"
+ blankslate_description: "Ainda não há itens planejados. Arraste os itens para este espaço para adicioná-los."
backlog_header_component:
label_toggle_backlog: "Recolher/Expandir %{name}"
label_story_count:
zero: "Nenhuma história no backlog"
one: "%{count} história no backlog"
other: "%{count} histórias no backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Recolher/Expandir %{name}"
+ label_story_count:
+ zero: "Nenhuma história na sprint"
+ one: "%{count} história na sprint"
+ other: "%{count} histórias na sprint"
backlog_menu_component:
label_actions: "Ações do backlog"
action_menu:
@@ -91,6 +109,14 @@ pt-BR:
burndown_chart: "Gráfico de burndown"
wiki: "Wiki"
properties: "Propriedades"
+ sprint_menu_component:
+ label_actions: "Ações da sprint"
+ action_menu:
+ edit_sprint: "Editar sprint"
+ new_story: "Nova história"
+ stories_tasks: "Histórias/tarefas"
+ task_board: "Quadro de tarefas"
+ burndown_chart: "Gráfico de burndown"
story_component:
label_drag_story: "Mover %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ pt-BR:
label_backlogs_unconfigured: "Você ainda não configurou o Backlog. Por favor, vá para %{administration} > %{plugins} e, em seguida, clique em %{configure} o link para este plugin. Uma vez que você definiu os campos, volte a esta página para começar a usar a ferramenta."
label_blocks_ids: "IDs dos pacotes de trabalho bloqueados"
label_column_in_backlog: "Coluna no backlog"
+ label_used_as_backlog: "Usado como backlog"
label_points_burn_down: "Abaixo"
label_points_burn_up: "Acima"
+ label_sprint_edit: "Editar sprint"
label_sprint_impediments: "Impedimentos da Sprint"
+ label_sprint_new: "Nova sprint"
label_task_board: "Quadro de tarefas"
- permission_view_master_backlog: "Visualizar backlog principal"
- permission_view_taskboards: "Visualizar quadro de tarefas"
+ permission_create_sprints: "Criar sprints"
+ permission_manage_sprint_items: "Gerenciar itens da sprint"
permission_select_done_statuses: "Selecione situações concluídas"
- permission_update_sprints: "Editar sprints"
+ permission_share_sprint: "Compartilhar sprint"
+ permission_start_complete_sprint: "Iniciar/concluir sprint"
+ permission_view_sprints: "Ver sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml
index 5f50d045ed9..4f37f5ce94d 100644
--- a/modules/backlogs/config/locales/crowdin/pt-PT.yml
+++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml
@@ -25,6 +25,12 @@ pt-PT:
description: "Este módulo acrescenta funcionalidades que permitem às equipas Agile trabalhar com o OpenProject em projetos Scrum."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duração"
+ finish_date: "Data de término"
+ goal: "Objetivo do sprint"
+ name: "Nome do sprint"
+ sharing: "Partilhar"
sprint:
duration: "Duração do sprint"
work_package:
@@ -42,12 +48,15 @@ pt-PT:
task_version_must_be_the_same_as_story_version: "tem ser o mesmo que a versão da história do pai."
sprint:
cannot_end_before_it_starts: "Sprint não pode terminar antes de começar."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Tipo de tarefa"
backlogs:
any: "qualquer"
column_width: "Largura da coluna"
definition_of_done: "Definição de feito"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impedimento"
label_versions_default_fold_state: "Mostrar versões dobradas"
caption_versions_default_fold_state: "Versões não serão expandidas por predefinição quando visualizar os backlogs. Cada uma tem de ser expandida manualmente."
@@ -75,12 +84,21 @@ pt-PT:
backlog_component:
blankslate_title: "%{name} está vazio"
blankslate_description: "Ainda não existem elementos planeados. Arraste elementos para aqui para os adicionar."
+ sprint_component:
+ blankslate_title: "%{name} está vazio"
+ blankslate_description: "Ainda não existem elementos planeados. Arraste elementos para aqui para os adicionar."
backlog_header_component:
label_toggle_backlog: "Recolher/expandir %{name}"
label_story_count:
zero: "Não há histórias no backlog"
one: "%{count} história no backlog"
other: "%{count} histórias no backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Recolher/expandir %{name}"
+ label_story_count:
+ zero: "Não há histórias no sprint"
+ one: "%{count} história em sprint"
+ other: "%{count} histórias em sprint"
backlog_menu_component:
label_actions: "Ações de backlog"
action_menu:
@@ -91,6 +109,14 @@ pt-PT:
burndown_chart: "Gráfico de burndown"
wiki: "Wiki"
properties: "Propriedades"
+ sprint_menu_component:
+ label_actions: "Ações do sprint"
+ action_menu:
+ edit_sprint: "Editar sprint"
+ new_story: "Nova história"
+ stories_tasks: "Histórias/tarefas"
+ task_board: "Quadro de tarefas"
+ burndown_chart: "Gráfico de burndown"
story_component:
label_drag_story: "Mover %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ pt-PT:
label_backlogs_unconfigured: "Ainda não configurou os backlogs. Vá a %{administration} > %{plugins}, e depois clique no link %{configure} para este plugin. Após definir os campos, volte a esta página para começar a utilizar a ferramenta."
label_blocks_ids: "Identificações de pacotes de trabalho bloqueados"
label_column_in_backlog: "Coluna no backlog"
+ label_used_as_backlog: "Utilizado como backlog"
label_points_burn_down: "Abaixo"
label_points_burn_up: "Acima"
+ label_sprint_edit: "Editar sprint"
label_sprint_impediments: "Impedimentos de Sprint"
+ label_sprint_new: "Novo sprint"
label_task_board: "Quadro de tarefas"
- permission_view_master_backlog: "Ver o backlog principal"
- permission_view_taskboards: "Ver quadros de tarefas"
+ permission_create_sprints: "Criar sprints"
+ permission_manage_sprint_items: "Gerir elementos de sprint"
permission_select_done_statuses: "Selecione os estados concluídos"
- permission_update_sprints: "Atualizar sprints"
+ permission_share_sprint: "Partilhar sprint"
+ permission_start_complete_sprint: "Iniciar/completar sprint"
+ permission_view_sprints: "Ver sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/ro.yml b/modules/backlogs/config/locales/crowdin/ro.yml
index 1a32c9370b0..22597abf6e8 100644
--- a/modules/backlogs/config/locales/crowdin/ro.yml
+++ b/modules/backlogs/config/locales/crowdin/ro.yml
@@ -25,12 +25,18 @@ ro:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
position: "Poziție"
story_points: "Puncte"
- backlogs_work_package_type: "Tipul de restante"
+ backlogs_work_package_type: "Tip restanță"
errors:
models:
work_package:
@@ -42,12 +48,15 @@ ro:
task_version_must_be_the_same_as_story_version: "trebuie să fie aceeași cu versiunea cerinței părinte."
sprint:
cannot_end_before_it_starts: "Sprint nu se poate termina înainte de a începe."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Tip de sarcină"
backlogs:
any: "Oricare"
column_width: "Column width"
definition_of_done: "Procent realizat"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Afișare versiuni complete"
caption_versions_default_fold_state: "Versiunile nu vor fi extinse în mod implicit la vizualizarea restanțelor. Fiecare versiune trebuie să fie extinsă manual."
@@ -77,12 +86,21 @@ ro:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -93,6 +111,14 @@ ro:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -120,14 +146,19 @@ ro:
label_backlogs_unconfigured: "Nu ai configurat încă Backlogs. Te rog să mergi la %{administration} > %{plugins}, apoi dă clic pe link-ul %{configure} pentru acest plugin. După ce ai configurat câmpurile, revino la această pagină pentru a începe să utilizezi instrumentul."
label_blocks_ids: "ID-urile pachetelor de lucru blocate"
label_column_in_backlog: "Coloană în backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Jos"
label_points_burn_up: "Sus"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Impedimentele Sprint"
+ label_sprint_new: "New sprint"
label_task_board: "Tablă de sarcini"
- permission_view_master_backlog: "Vizualizare master backlog"
- permission_view_taskboards: "Vizualizați tablourile de sarcini"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Selectează stările realizate"
- permission_update_sprints: "Sprinturi"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Restanțe"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml
index 87b53de1666..01134c1718d 100644
--- a/modules/backlogs/config/locales/crowdin/ru.yml
+++ b/modules/backlogs/config/locales/crowdin/ru.yml
@@ -25,6 +25,12 @@ ru:
description: "Этот модуль добавляет функции, позволяющие agile-командам работать с OpenProject в Scrum проектах."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Продолжительность"
+ finish_date: "Дата окончания"
+ goal: "Цель спринта"
+ name: "Название спринта"
+ sharing: "Совместное использование"
sprint:
duration: "Продолжительность спринта"
work_package:
@@ -42,12 +48,15 @@ ru:
task_version_must_be_the_same_as_story_version: "должен совпадать с версией родительской истории."
sprint:
cannot_end_before_it_starts: "Спринт не может заканчиваться до того, как начнется."
+ models:
+ sprint: "Спринт"
attributes:
task_type: "Тип задачи"
backlogs:
any: "любой"
column_width: "Ширина столбца"
definition_of_done: "Определение термина \"Завершено\""
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Препятствие"
label_versions_default_fold_state: "Показать свернутые версии"
caption_versions_default_fold_state: "Версии не будут разворачиваться по умолчанию при просмотре бэклогов. Каждая версия должна быть развернута вручную."
@@ -79,12 +88,21 @@ ru:
backlog_component:
blankslate_title: "%{name} пустой"
blankslate_description: "Пока ничего не запланировано. Перетащите элементы сюда, чтобы добавить их."
+ sprint_component:
+ blankslate_title: "%{name} пустой"
+ blankslate_description: "Пока ничего не запланировано. Перетащите элементы сюда, чтобы добавить их."
backlog_header_component:
label_toggle_backlog: "Свернуть/Развернуть %{name}"
label_story_count:
zero: "Нет историй в бэклоге"
one: "%{count} история в бэклоге"
other: "%{count} историй в бэклоге"
+ sprint_header_component:
+ label_toggle_backlog: "Свернуть/Развернуть %{name}"
+ label_story_count:
+ zero: "Нет историй в спринте"
+ one: "%{count} история в спринте"
+ other: "%{count} историй в спринте"
backlog_menu_component:
label_actions: "Действия в рамках бэклога"
action_menu:
@@ -95,6 +113,14 @@ ru:
burndown_chart: "Сводная таблица"
wiki: "Wiki"
properties: "Свойства"
+ sprint_menu_component:
+ label_actions: "Действия в спринте"
+ action_menu:
+ edit_sprint: "Редактировать спринт"
+ new_story: "Новая история"
+ stories_tasks: "Истории/задачи"
+ task_board: "Панель задач"
+ burndown_chart: "Сводная таблица"
story_component:
label_drag_story: "Переместить %{name}"
story_menu_component:
@@ -122,14 +148,19 @@ ru:
label_backlogs_unconfigured: "Вы еще не настроили Невыполненные работы. Перейдите на страницу %{administration} > %{plugins}, а затем нажмите на ссылку %{configure} для получения этого дополнения. После того как вы настроите поля, возвратитесь на эту страницу, чтобы начать пользоваться инструментом."
label_blocks_ids: "Идентификаторы заблокированных рабочих пакетов"
label_column_in_backlog: "Колонка в бэклоге"
+ label_used_as_backlog: "Используется как бэклог"
label_points_burn_down: "Вниз"
label_points_burn_up: "Вверх"
+ label_sprint_edit: "Редактировать спринт"
label_sprint_impediments: "Препятствия спринта"
+ label_sprint_new: "Новый спринт"
label_task_board: "Панель задач"
- permission_view_master_backlog: "Просмотреть главную невыполненную работу"
- permission_view_taskboards: "Просмотреть панели задач"
+ permission_create_sprints: "Создание спринтов"
+ permission_manage_sprint_items: "Управление пунктами спринта"
permission_select_done_statuses: "Выберите завершенные статусы"
- permission_update_sprints: "Обновить спринты"
+ permission_share_sprint: "Поделиться спринтом"
+ permission_start_complete_sprint: "Начать/завершить спринт"
+ permission_view_sprints: "Просмотр спринтов"
project_module_backlogs: "Бэклоги"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/rw.yml b/modules/backlogs/config/locales/crowdin/rw.yml
index 83a8442ce8f..c2dbd4ef227 100644
--- a/modules/backlogs/config/locales/crowdin/rw.yml
+++ b/modules/backlogs/config/locales/crowdin/rw.yml
@@ -25,6 +25,12 @@ rw:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ rw:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "any"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ rw:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ rw:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ rw:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/si.yml b/modules/backlogs/config/locales/crowdin/si.yml
index f2789c8f7b8..4af952f455c 100644
--- a/modules/backlogs/config/locales/crowdin/si.yml
+++ b/modules/backlogs/config/locales/crowdin/si.yml
@@ -25,6 +25,12 @@ si:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ si:
task_version_must_be_the_same_as_story_version: "මව් කතාවේ අනුවාදයට සමාන විය යුතුය."
sprint:
cannot_end_before_it_starts: "ස්ප්රින්ට් ආරම්භ වීමට පෙර අවසන් කළ නොහැක."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "ඔනෑම"
column_width: "Column width"
definition_of_done: "සිදු කරන ලද අර්ථ දැක්වීම"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "බාධාවන්"
label_versions_default_fold_state: "නවනු අනුවාද පෙන්වන්න"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ si:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ si:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ si:
label_backlogs_unconfigured: "ඔබ තවමත් Backlogs වින්යාස කර නැත. කරුණාකර යන්න %{administration} > %{plugins}, ඉන්පසු මෙම ප්ලගිනය සඳහා %{configure} සබැඳිය ක්ලික් කරන්න. ඔබ ක්ෂේත්ර සකස් කළ පසු, මෙවලම භාවිතා කිරීම ආරම්භ කිරීමට මෙම පිටුවට නැවත එන්න."
label_blocks_ids: "අවහිර කරන ලද වැඩ පැකේජ වල IDS"
label_column_in_backlog: "පසුබිම තුළ තීරුව"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "පහළට"
label_points_burn_up: "ඉහළට"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "ස්ප්රින්ට් බාධාවන්"
+ label_sprint_new: "New sprint"
label_task_board: "කාර්ය මණ්ඩලය"
- permission_view_master_backlog: "ස්වාමියා බැක්ලොග් දැක්ම"
- permission_view_taskboards: "දැක්ම කාර්ය මණ්ඩල"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "ස්ප්රින්ට් යාවත්කාලීන"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "බැක්ලොග්ස්"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/sk.yml b/modules/backlogs/config/locales/crowdin/sk.yml
index 2e9db70d37f..5e384c812fd 100644
--- a/modules/backlogs/config/locales/crowdin/sk.yml
+++ b/modules/backlogs/config/locales/crowdin/sk.yml
@@ -25,6 +25,12 @@ sk:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Trvanie šprintu"
work_package:
@@ -42,12 +48,15 @@ sk:
task_version_must_be_the_same_as_story_version: "musí byť rovnaká ako verzia nadradeného článku."
sprint:
cannot_end_before_it_starts: "Šprint nemôže byť ukončený ešte pred jeho spustením."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Typ úlohy"
backlogs:
any: "akékoľvek"
column_width: "Šírka stĺpca"
definition_of_done: "Definícia pojmu Hotovo"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Prekážka"
label_versions_default_fold_state: "Zobrazenie zložených verzií"
caption_versions_default_fold_state: "Verzie sa pri prezeraní nevybavených dokumentov nebudú predvolene rozbaľovať. Každú z nich je potrebné rozbaliť manuálne."
@@ -79,12 +88,21 @@ sk:
backlog_component:
blankslate_title: "%{name} je prázdne"
blankslate_description: "Zatiaľ nie sú plánované žiadne položky. Ak chcete pridať položky, potiahnite ich sem."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Zbaliť/rozšíriť %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -95,6 +113,14 @@ sk:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -122,14 +148,19 @@ sk:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "Identifikátory blokovaných pracovných balíkov"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Nadol"
label_points_burn_up: "Nahor"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "Zobrazenie tabúľ úloh"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Výber stavov hotovo"
- permission_update_sprints: "Aktualizácia šprinty"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/sl.yml b/modules/backlogs/config/locales/crowdin/sl.yml
index 75de0f0bad3..953cff09d89 100644
--- a/modules/backlogs/config/locales/crowdin/sl.yml
+++ b/modules/backlogs/config/locales/crowdin/sl.yml
@@ -25,6 +25,12 @@ sl:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ sl:
task_version_must_be_the_same_as_story_version: "mora biti enako različici nadrejene zgodbe."
sprint:
cannot_end_before_it_starts: "Tek se ne mora končati preden se začne"
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "katerikoli"
column_width: "Column width"
definition_of_done: "Opredelitev opravljenega"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Ovira"
label_versions_default_fold_state: "Pokaži različice zložene"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -79,12 +88,21 @@ sl:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -95,6 +113,14 @@ sl:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -122,14 +148,19 @@ sl:
label_backlogs_unconfigured: "Zaostankov še niste konfigurirali. Pojdite na %{administration} > %{plugins}, nato kliknite povezavo %{configure} za ta vtičnik. Ko nastavite polja, se vrnite na to stran, da začnete uporabljati orodje."
label_blocks_ids: "ID blokiranih delovnih paketov"
label_column_in_backlog: "Stolpec v zaostanku"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Navzdol"
label_points_burn_up: "Navzgor"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Motnje sprinta"
+ label_sprint_new: "New sprint"
label_task_board: "Tabla opravil"
- permission_view_master_backlog: "glavni zaostanek prejšnje poizvedbe"
- permission_view_taskboards: "Prikaz delovne table"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Označi statuse narejeno"
- permission_update_sprints: "Posodobi šprinte"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Zaostanki"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/sr.yml b/modules/backlogs/config/locales/crowdin/sr.yml
index 58043dd441a..dc9391b8e13 100644
--- a/modules/backlogs/config/locales/crowdin/sr.yml
+++ b/modules/backlogs/config/locales/crowdin/sr.yml
@@ -25,6 +25,12 @@ sr:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ sr:
task_version_must_be_the_same_as_story_version: "mora biti ista kao verzija priče roditelja."
sprint:
cannot_end_before_it_starts: "Sprint se ne može završiti pre nego što počne."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "bilo koji"
column_width: "Column width"
definition_of_done: "Definicija završetka"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Smetnja"
label_versions_default_fold_state: "Prikaži verzije skupljene"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -77,12 +86,21 @@ sr:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -93,6 +111,14 @@ sr:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -120,14 +146,19 @@ sr:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/sv.yml b/modules/backlogs/config/locales/crowdin/sv.yml
index 399d2b9b27f..afef125bbc1 100644
--- a/modules/backlogs/config/locales/crowdin/sv.yml
+++ b/modules/backlogs/config/locales/crowdin/sv.yml
@@ -25,6 +25,12 @@ sv:
description: "Modulen lägger till funktioner som gör det möjligt för agila team att arbeta med OpenProject i Scrum-projekt."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ sv:
task_version_must_be_the_same_as_story_version: "måste vara samma som föräldraberättelsens version."
sprint:
cannot_end_before_it_starts: "En sprint kan inte avslutas innan den startar."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "någon"
column_width: "Column width"
definition_of_done: "Definition av klart"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Hinder"
label_versions_default_fold_state: "Visa ihopfällda versioner"
caption_versions_default_fold_state: "Versioner kommer inte att utökas som standard när du visar backloggar. Var och en måste utökas manuellt."
@@ -75,12 +84,21 @@ sv:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ sv:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ sv:
label_backlogs_unconfigured: "Du har inte konfigurerat backloggar ännu. Gå till %{administration} > %{plugins}, klicka på %{configure} länken för denna plugin. När du har ställt in fälten, kan du komma tillbaka till denna sida för att börja använda verktyget."
label_blocks_ids: "ID:n för blockerade arbetspaket"
label_column_in_backlog: "Kolumn i backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Ner"
label_points_burn_up: "Upp"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint hinder"
+ label_sprint_new: "New sprint"
label_task_board: "Aktivitetstavla"
- permission_view_master_backlog: "Visa master backlog"
- permission_view_taskboards: "Visa aktivitetstavlor"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Välj klar status"
- permission_update_sprints: "Uppdatera sprinter"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backloggar"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/th.yml b/modules/backlogs/config/locales/crowdin/th.yml
index f438571c80c..e8c928d448f 100644
--- a/modules/backlogs/config/locales/crowdin/th.yml
+++ b/modules/backlogs/config/locales/crowdin/th.yml
@@ -25,6 +25,12 @@ th:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "ระยะเวลา"
+ finish_date: "วันที่เสร็จสิ้น"
+ goal: "เป้าหมายสปริ๊นต์"
+ name: "ชื่อสปรินต์"
+ sharing: "Sharing"
sprint:
duration: "ระยะเวลาการสปรินต์"
work_package:
@@ -42,12 +48,15 @@ th:
task_version_must_be_the_same_as_story_version: "เวอร์ชันต้องตรงกับสตอรี่หลัก"
sprint:
cannot_end_before_it_starts: "กรุณาระบุวันสิ้นสุดให้หลังจากวันเริ่มต้นสปรินต์"
+ models:
+ sprint: "สปรินท์"
attributes:
task_type: "ประเภทงาน"
backlogs:
any: "ทั้งหมด"
column_width: "ความกว้างของคอลัมน์"
definition_of_done: "นิยามของคำว่าเสร็จสิ้น"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "รายการอุปสรรค"
label_versions_default_fold_state: "แสดงเวอร์ชันที่พับอยู่"
caption_versions_default_fold_state: "เวอร์ชันจะถูกพับไว้เป็นค่าเริ่มต้น กรุณาคลิกเพื่อขยายดูทีละรายการ"
@@ -73,12 +82,21 @@ th:
backlog_component:
blankslate_title: "%{name} ว่างอยู่"
blankslate_description: "ยังไม่มีรายการที่วางแผนไว้ ลากรายการมาวางที่นี่เพื่อเพิ่ม"
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "พับ/ขยาย %{name}"
label_story_count:
zero: "ไม่มีสตอรี่ในรายการงานคงค้าง"
one: "%{count} สตอรี่ในรายการงานคงค้าง"
other: "%{count} สตอรี่ในรายการงานคงค้าง"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "การจัดการรายการงานคงค้าง"
action_menu:
@@ -89,6 +107,14 @@ th:
burndown_chart: "กราฟติดตามงาน (Burndown)"
wiki: "วิกิ"
properties: "คุณสมบัติ"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "ย้าย %{name}"
story_menu_component:
@@ -116,14 +142,19 @@ th:
label_backlogs_unconfigured: "คุณยังไม่ได้ตั้งค่ารายการงานคงค้าง กรุณาไปที่ %{administration} > %{plugins} จากนั้นคลิกที่ลิงก์ %{configure} ของปลั๊กอินนี้ เมื่อคุณตั้งค่าฟิลด์ต่าง ๆ เรียบร้อยแล้ว ให้กลับมาที่หน้านี้เพื่อเริ่มใช้งานเครื่องมือ"
label_blocks_ids: "Id ของแพคเกจการทำงานที่ถูกบล็อก"
label_column_in_backlog: "คอลัมน์ในรายการงานคงค้าง"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "ลง"
label_points_burn_up: "ขึ้น"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "อุปสรรคของสปรินท์"
+ label_sprint_new: "สปรินท์ใหม่"
label_task_board: "กระดานงาน"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "สร้างสปรินท์"
+ permission_manage_sprint_items: "จัดการรายการในสปรินท์"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "แชร์สปรินท์"
+ permission_start_complete_sprint: "เริ่มต้น/เสร็จสิ้นสปรินท์"
+ permission_view_sprints: "ดูสปรินท์"
project_module_backlogs: "รายการงานคงค้าง"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/tr.yml b/modules/backlogs/config/locales/crowdin/tr.yml
index ebd436c906f..d0e5ff7103a 100644
--- a/modules/backlogs/config/locales/crowdin/tr.yml
+++ b/modules/backlogs/config/locales/crowdin/tr.yml
@@ -25,6 +25,12 @@ tr:
description: "Bu modül, çevik ekiplerin Scrum projelerinde OpenProject ile çalışmasını sağlayan özellikler ekler."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Paylaşım"
sprint:
duration: "Sprint süresi"
work_package:
@@ -42,12 +48,15 @@ tr:
task_version_must_be_the_same_as_story_version: "ana hikaye sürümüyle aynı olmalıdır."
sprint:
cannot_end_before_it_starts: "Sprint başlamadan önce bitemez."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Görev türü"
backlogs:
any: "herhangi bir"
column_width: "Sütun genişliği"
definition_of_done: "Bitti Tanımı"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Engel"
label_versions_default_fold_state: "Katlanmış sürümleri göster"
caption_versions_default_fold_state: "Birikmiş işler görüntülenirken sürümler öntanımlı olarak genişletilmeyecektir. Her birinin ayrı ayrı genişletilmesi gerekir."
@@ -75,12 +84,21 @@ tr:
backlog_component:
blankslate_title: "%{name} boş"
blankslate_description: "Henüz planlanan öğe yok. Eklemek için öğeleri buraya sürükleyin."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Daralt/Genişlet %{name}"
label_story_count:
zero: "Kuyrukta hikaye yok"
one: "%{count} kuyruktaki hikaye"
other: "%{count} kuyruktaki hikayeler"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Kuyruk eylemleri"
action_menu:
@@ -91,6 +109,14 @@ tr:
burndown_chart: "Burndown grafiği"
wiki: "Wiki"
properties: "Özellikler"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Taşı %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ tr:
label_backlogs_unconfigured: "Backlog'ları henüz yapılandırmadınız. Lütfen% %{administration}> %{plugins} adresine gidin, ardından bu eklenti için %{configure} bağlantısını tıklayın. Alanları belirledikten sonra, aracı kullanmaya başlamak için bu sayfaya geri dönün."
label_blocks_ids: "Bloke iş paketleri kimlikleri"
label_column_in_backlog: "Sütununda birikim var"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Aşağı"
label_points_burn_up: "Yukarı"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Engelleri"
+ label_sprint_new: "New sprint"
label_task_board: "Görev panosu"
- permission_view_master_backlog: "Ana bekleme günlüğünü görüntüleme"
- permission_view_taskboards: "Görev tahtalarını görüntüleme"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Tamamlanan durumları seçiniz"
- permission_update_sprints: "Süratleri güncelle"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "İş listesi"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml
index 175b9af4e09..395ef98c388 100644
--- a/modules/backlogs/config/locales/crowdin/uk.yml
+++ b/modules/backlogs/config/locales/crowdin/uk.yml
@@ -25,6 +25,12 @@ uk:
description: "Цей модуль додає функції, завдяки яким agile-команди можуть працювати над проєктами Scrum в OpenProject."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Тривалість"
+ finish_date: "Дата закінчення"
+ goal: "Ціль спринту"
+ name: "Ім’я спринту"
+ sharing: "Надання доступу"
sprint:
duration: "Тривалість спринту"
work_package:
@@ -42,12 +48,15 @@ uk:
task_version_must_be_the_same_as_story_version: "має збігатись із версією батьківської історії."
sprint:
cannot_end_before_it_starts: "Спринт не може закінчитися, перш ніж він почне працювати."
+ models:
+ sprint: "Спринт"
attributes:
task_type: "Тип завдання"
backlogs:
any: "будь-який"
column_width: "Ширина стовпця"
definition_of_done: "Визначення завершено"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Перешкода"
label_versions_default_fold_state: "Показати складені версії"
caption_versions_default_fold_state: "Версії не розгортатимуться за замовчуванням при перегляді невиконаних завдань. Кожну версію потрібно розгортати вручну."
@@ -79,12 +88,21 @@ uk:
backlog_component:
blankslate_title: "%{name} нічого не містить"
blankslate_description: "Ще нічого не заплановано. Перетягніть елементи сюди, щоб додати їх."
+ sprint_component:
+ blankslate_title: "%{name} нічого не містить"
+ blankslate_description: "Ще нічого не заплановано. Перетягніть елементи сюди, щоб додати їх."
backlog_header_component:
label_toggle_backlog: "Згорнути/розгорнути %{name}"
label_story_count:
zero: "У беклозі немає історій"
one: "У беклозі %{count} історія"
other: "У беклозі стільки історій: %{count}"
+ sprint_header_component:
+ label_toggle_backlog: "Згорнути/розгорнути %{name}"
+ label_story_count:
+ zero: "У спринті немає історій"
+ one: "У спринті %{count} історія"
+ other: "У спринті стільки історій: %{count}"
backlog_menu_component:
label_actions: "Дії беклогу"
action_menu:
@@ -95,6 +113,14 @@ uk:
burndown_chart: "Діаграма згорання завдань"
wiki: "Wiki"
properties: "Властивості"
+ sprint_menu_component:
+ label_actions: "Дії спринту"
+ action_menu:
+ edit_sprint: "Редагувати спринт"
+ new_story: "Нова історія"
+ stories_tasks: "Історії/завдання"
+ task_board: "Дошка завдань"
+ burndown_chart: "Діаграма згорання завдань"
story_component:
label_drag_story: "Перемістити історію «%{name}»"
story_menu_component:
@@ -122,14 +148,19 @@ uk:
label_backlogs_unconfigured: "Ви ще не настроїли Backlogs. Перейдіть на %{administration}>%{plugins}, потім натисніть посилання %{configure} для цього плагіна. Після того, як ви встановите поля, поверніться на цю сторінку, щоб розпочати використання інструмента."
label_blocks_ids: "Ідентифікатори заблокованих робочих пакетів"
label_column_in_backlog: "Стовпець у backlog-у"
+ label_used_as_backlog: "Використовується як беклог"
label_points_burn_down: "Вниз"
label_points_burn_up: "Вгору"
+ label_sprint_edit: "Редагувати спринт"
label_sprint_impediments: "Перешкоди спринту"
+ label_sprint_new: "Новий спринт"
label_task_board: "Дошка завдань"
- permission_view_master_backlog: "Перегляд головного backlog-у"
- permission_view_taskboards: "Перегляд панелі завдань"
+ permission_create_sprints: "Створення спринтів"
+ permission_manage_sprint_items: "Керування елементами спринтів"
permission_select_done_statuses: "Виберіть завершені статуси"
- permission_update_sprints: "Оновлення спринту"
+ permission_share_sprint: "Надання доступу до спринтів"
+ permission_start_complete_sprint: "Початок/завершення спринтів"
+ permission_view_sprints: "Перегляд спринтів"
project_module_backlogs: "Невиконані завдання"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/uz.yml b/modules/backlogs/config/locales/crowdin/uz.yml
index 1d784af9e97..90ca537e08a 100644
--- a/modules/backlogs/config/locales/crowdin/uz.yml
+++ b/modules/backlogs/config/locales/crowdin/uz.yml
@@ -25,6 +25,12 @@ uz:
description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ uz:
task_version_must_be_the_same_as_story_version: "must be the same as the parent story's version."
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Task type"
backlogs:
any: "any"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -75,12 +84,21 @@ uz:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -91,6 +109,14 @@ uz:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -118,14 +144,19 @@ uz:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/vi.yml b/modules/backlogs/config/locales/crowdin/vi.yml
index 4c8ca2e4f8f..55ee9ba1d3f 100644
--- a/modules/backlogs/config/locales/crowdin/vi.yml
+++ b/modules/backlogs/config/locales/crowdin/vi.yml
@@ -25,6 +25,12 @@ vi:
description: "Mô-đun này bổ sung các tính năng cho phép các nhóm linh hoạt làm việc với OpenProject trong các dự án Scrum."
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -42,12 +48,15 @@ vi:
task_version_must_be_the_same_as_story_version: "phải giống với phiên bản của bảng cha."
sprint:
cannot_end_before_it_starts: "Sprint không thể kết thúc trước khi nó bắt đầu."
+ models:
+ sprint: "Sprint"
attributes:
task_type: "Loại nhiệm vụ"
backlogs:
any: "bất kỳ"
column_width: "Column width"
definition_of_done: "Định nghĩa về Hoàn thành"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Trở ngại"
label_versions_default_fold_state: "Hiển thị các phiên bản \n"
caption_versions_default_fold_state: "Các phiên bản sẽ không được mở rộng theo mặc định khi xem hồ sơ tồn đọng. Mỗi cái phải được mở rộng bằng tay."
@@ -73,12 +82,21 @@ vi:
backlog_component:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
zero: "No stories in backlog"
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -89,6 +107,14 @@ vi:
burndown_chart: "Burndown chart"
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "Move %{name}"
story_menu_component:
@@ -116,14 +142,19 @@ vi:
label_backlogs_unconfigured: "Bạn chưa cấu hình Bảng nhiệm vụ tồn đọng. Vui lòng vào %{administration} > %{plugins}, sau đó nhấp vào liên kết %{configure} cho gắn thêm này. Khi bạn đã thiết lập các trường, quay lại trang này để bắt đầu sử dụng công cụ."
label_blocks_ids: "ID của các work package bị chặn"
label_column_in_backlog: "Cột tồn đọng"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Xuống"
label_points_burn_up: "lên"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Trở ngại nước rút"
+ label_sprint_new: "New sprint"
label_task_board: "Bảng nhiệm vụ"
- permission_view_master_backlog: "Xem tồn đọng chính"
- permission_view_taskboards: "Xem bảng tác vụ"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Chọn trạng thái hoàn thành"
- permission_update_sprints: "Cập nhật các lần chạy nước rút"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "tồn đọng"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml
index 148af750cd9..4e72f220e5c 100644
--- a/modules/backlogs/config/locales/crowdin/zh-CN.yml
+++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml
@@ -25,6 +25,12 @@ zh-CN:
description: "该模块为敏捷团队在敏捷项目中使用 OpenProject 添加了功能。"
activerecord:
attributes:
+ agile/sprint:
+ duration: "持续时间"
+ finish_date: "完成日期"
+ goal: "冲刺目标"
+ name: "冲刺名称"
+ sharing: "共享"
sprint:
duration: "冲刺持续时间"
work_package:
@@ -42,12 +48,15 @@ zh-CN:
task_version_must_be_the_same_as_story_version: "必须与父级故事的版本相同。"
sprint:
cannot_end_before_it_starts: "比赛不可以在开始前结束。"
+ models:
+ sprint: "冲刺"
attributes:
task_type: "任务类型"
backlogs:
any: "任一"
column_width: "列宽"
definition_of_done: "完成的定义"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "障碍"
label_versions_default_fold_state: "显示已折叠的版本"
caption_versions_default_fold_state: "查看积压工作时,默认情况下不会展开版本。每个版本都必须手动展开。"
@@ -73,12 +82,21 @@ zh-CN:
backlog_component:
blankslate_title: "%{name} 为空"
blankslate_description: "尚未计划条目。请将条目拖到此处以添加。"
+ sprint_component:
+ blankslate_title: "%{name} 为空"
+ blankslate_description: "尚未计划条目。请将条目拖到此处以添加。"
backlog_header_component:
label_toggle_backlog: "折叠/展开 %{name}"
label_story_count:
zero: "积压工作中没有故事"
one: "积压工作中有 %{count} 个故事"
other: "积压工作中有 %{count} 个故事"
+ sprint_header_component:
+ label_toggle_backlog: "折叠/展开 %{name}"
+ label_story_count:
+ zero: "冲刺中没有故事"
+ one: "冲刺中有 %{count} 个故事"
+ other: "冲刺中有 %{count} 个故事"
backlog_menu_component:
label_actions: "积压工作操作"
action_menu:
@@ -89,6 +107,14 @@ zh-CN:
burndown_chart: "燃尽图"
wiki: "维基"
properties: "属性"
+ sprint_menu_component:
+ label_actions: "冲刺操作"
+ action_menu:
+ edit_sprint: "编辑冲刺"
+ new_story: "新建故事"
+ stories_tasks: "故事/任务"
+ task_board: "任务面板"
+ burndown_chart: "燃尽图"
story_component:
label_drag_story: "移动 %{name}"
story_menu_component:
@@ -116,14 +142,19 @@ zh-CN:
label_backlogs_unconfigured: "您尚未配置待办清单。请转到“%{administration} > %{plugins}”,然后单击此插件的 %{configure} 链接。设置字段后,返回到此页面开始使用工具。"
label_blocks_ids: "被阻止的工作包 ID"
label_column_in_backlog: "待办清单中的列"
+ label_used_as_backlog: "用作积压工作"
label_points_burn_down: "减少"
label_points_burn_up: "增加"
+ label_sprint_edit: "编辑冲刺"
label_sprint_impediments: "冲刺 (sprint) 障碍"
+ label_sprint_new: "新冲刺"
label_task_board: "任务板"
- permission_view_master_backlog: "查看主待办清单"
- permission_view_taskboards: "查看任务板"
+ permission_create_sprints: "创建冲刺"
+ permission_manage_sprint_items: "管理冲刺条目"
permission_select_done_statuses: "选择完成状态"
- permission_update_sprints: "更新迭代"
+ permission_share_sprint: "共享冲刺"
+ permission_start_complete_sprint: "开始/完成冲刺"
+ permission_view_sprints: "查看冲刺"
project_module_backlogs: "待办清单"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/crowdin/zh-TW.yml b/modules/backlogs/config/locales/crowdin/zh-TW.yml
index 6058a1249a7..f183a8b675f 100644
--- a/modules/backlogs/config/locales/crowdin/zh-TW.yml
+++ b/modules/backlogs/config/locales/crowdin/zh-TW.yml
@@ -21,10 +21,16 @@
#++
zh-TW:
plugin_openproject_backlogs:
- name: "OpenProject待辦事項"
+ name: "OpenProject代辦事項"
description: "此模組新增了讓敏捷團隊能夠在 Scrum 專案中使用 OpenProject 的功能。"
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "分享"
sprint:
duration: "衝刺時間"
work_package:
@@ -42,12 +48,15 @@ zh-TW:
task_version_must_be_the_same_as_story_version: "必須與上層「使用者需求」(User Story)的版本相同。"
sprint:
cannot_end_before_it_starts: "進度不可以在開始前結束"
+ models:
+ sprint: "Sprint"
attributes:
task_type: "任務類型"
backlogs:
any: "任何"
column_width: "欄寬"
definition_of_done: "定義"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "阻礙"
label_versions_default_fold_state: "顯示精簡版本"
caption_versions_default_fold_state: "檢視待辦清單時,版本預設不會展開,需手動逐一展開。"
@@ -73,12 +82,21 @@ zh-TW:
backlog_component:
blankslate_title: "%{name} 為空"
blankslate_description: "尚未規劃任何項目。將項目拖曳至此即可新增。"
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
backlog_header_component:
label_toggle_backlog: "折疊/展開 %{name}"
label_story_count:
zero: "目前沒有待辦故事"
one: "待辦清單中有 %{count} 個故事"
other: "待辦清單中有 %{count} 個故事"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
backlog_menu_component:
label_actions: "待辦清單操作"
action_menu:
@@ -89,6 +107,14 @@ zh-TW:
burndown_chart: "燃盡圖"
wiki: "維基"
properties: "屬性"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
story_component:
label_drag_story: "移動 %{name}"
story_menu_component:
@@ -116,14 +142,19 @@ zh-TW:
label_backlogs_unconfigured: "您尚未設定待辦事項。請前往 '%{administration} -> %{plugins}' 然後在 %{configure} 連結上按一下。當你設定欄位後,再返回這個頁面使用這個工具。"
label_blocks_ids: "被禁止的工作套件 IDs"
label_column_in_backlog: "待辦事項的欄位"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "減少"
label_points_burn_up: "增加"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "進度阻礙"
+ label_sprint_new: "New sprint"
label_task_board: "任務看板"
- permission_view_master_backlog: "檢視主待辦事項"
- permission_view_taskboards: "檢視任務看板"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "選擇完成狀態"
- permission_update_sprints: "更新進度"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "待辦事項"
rb_burndown_charts:
show:
diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml
index c36d4b44210..3d26e704927 100644
--- a/modules/backlogs/config/locales/en.yml
+++ b/modules/backlogs/config/locales/en.yml
@@ -34,6 +34,12 @@ en:
activerecord:
attributes:
+ agile/sprint:
+ duration: "Duration"
+ finish_date: "Finish date"
+ goal: "Sprint goal"
+ name: "Sprint name"
+ sharing: "Sharing"
sprint:
duration: "Sprint duration"
work_package:
@@ -53,6 +59,9 @@ en:
sprint:
cannot_end_before_it_starts: "Sprint cannot end before it starts."
+ models:
+ sprint: "Sprint"
+
attributes:
task_type: "Task type"
@@ -60,6 +69,7 @@ en:
any: "any"
column_width: "Column width"
definition_of_done: "Definition of Done"
+ definition_of_done_caption: "Work packages with these statuses are treated as completed in backlog views and reporting."
impediment: "Impediment"
label_versions_default_fold_state: "Show versions folded"
caption_versions_default_fold_state: "Versions will not be expanded by default when viewing backlogs. Each one has to be manually expanded."
@@ -89,6 +99,10 @@ en:
blankslate_title: "%{name} is empty"
blankslate_description: "No items planned yet. Drag items here to add them."
+ sprint_component:
+ blankslate_title: "%{name} is empty"
+ blankslate_description: "No items planned yet. Drag items here to add them."
+
backlog_header_component:
label_toggle_backlog: "Collapse/Expand %{name}"
label_story_count:
@@ -96,6 +110,13 @@ en:
one: "%{count} story in backlog"
other: "%{count} stories in backlog"
+ sprint_header_component:
+ label_toggle_backlog: "Collapse/Expand %{name}"
+ label_story_count:
+ zero: "No stories in sprint"
+ one: "%{count} story in sprint"
+ other: "%{count} stories in sprint"
+
backlog_menu_component:
label_actions: "Backlog actions"
action_menu:
@@ -107,6 +128,15 @@ en:
wiki: "Wiki"
properties: "Properties"
+ sprint_menu_component:
+ label_actions: "Sprint actions"
+ action_menu:
+ edit_sprint: "Edit sprint"
+ new_story: "New story"
+ stories_tasks: "Stories/Tasks"
+ task_board: "Task board"
+ burndown_chart: "Burndown chart"
+
story_component:
label_drag_story: "Move %{name}"
@@ -140,15 +170,20 @@ en:
label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool."
label_blocks_ids: "IDs of blocked work packages"
label_column_in_backlog: "Column in backlog"
+ label_used_as_backlog: "Used as backlog"
label_points_burn_down: "Down"
label_points_burn_up: "Up"
+ label_sprint_edit: "Edit sprint"
label_sprint_impediments: "Sprint Impediments"
+ label_sprint_new: "New sprint"
label_task_board: "Task board"
- permission_view_master_backlog: "View master backlog"
- permission_view_taskboards: "View taskboards"
+ permission_create_sprints: "Create sprints"
+ permission_manage_sprint_items: "Manage sprint items"
permission_select_done_statuses: "Select done statuses"
- permission_update_sprints: "Update sprints"
+ permission_share_sprint: "Share sprint"
+ permission_start_complete_sprint: "Start/complete sprint"
+ permission_view_sprints: "View sprints"
project_module_backlogs: "Backlogs"
diff --git a/modules/backlogs/config/routes.rb b/modules/backlogs/config/routes.rb
index ee9d1aba906..25c9eb65019 100644
--- a/modules/backlogs/config/routes.rb
+++ b/modules/backlogs/config/routes.rb
@@ -27,6 +27,23 @@
#++
Rails.application.routes.draw do
+ # Routes for the new Agile::Sprint
+ # Scoped under projects for permissions:
+ resources :projects, only: [] do
+ resources :sprints, controller: :rb_sprints, only: %i[create] do
+ collection do
+ get :new_dialog
+ get :refresh_form
+ end
+
+ member do
+ get :edit_dialog
+ put :update_agile_sprint
+ end
+ end
+ end
+
+ # Legacy routes
scope "", as: "backlogs" do
scope "projects/:project_id", as: "project" do
resources :backlogs, controller: :rb_master_backlogs, only: :index do
diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb
index 18210c6e1e0..f259da89eeb 100644
--- a/modules/backlogs/lib/open_project/backlogs/engine.rb
+++ b/modules/backlogs/lib/open_project/backlogs/engine.rb
@@ -59,33 +59,24 @@ module OpenProject::Backlogs
end
OpenProject::AccessControl.permission(:edit_work_packages).tap do |edit|
- edit.controller_actions << "rb_stories/move"
- edit.controller_actions << "rb_stories/reorder"
edit.controller_actions << "rb_tasks/update"
edit.controller_actions << "rb_impediments/update"
end
end
project_module :backlogs, dependencies: :work_package_tracking do
- # Master backlog permissions
- permission :view_master_backlog,
+ permission :view_sprints,
{ rb_master_backlogs: %i[index details],
rb_sprints: %i[index show show_name],
rb_wikis: :show,
rb_stories: %i[index show],
rb_queries: :show,
- rb_burndown_charts: :show },
- permissible_on: :project
-
- permission :view_taskboards,
- { rb_taskboards: :show,
- rb_sprints: :show,
- rb_stories: :show,
+ rb_burndown_charts: :show,
+ rb_taskboards: :show,
rb_tasks: %i[index show],
- rb_impediments: %i[index show],
- rb_wikis: :show,
- rb_burndown_charts: :show },
- permissible_on: :project
+ rb_impediments: %i[index show] },
+ permissible_on: :project,
+ dependencies: :view_work_packages
permission :select_done_statuses,
{
@@ -94,15 +85,32 @@ module OpenProject::Backlogs
permissible_on: :project,
require: :member
- # Sprint permissions
- # :show_sprints and :list_sprints are implicit in :view_master_backlog permission
- permission :update_sprints,
- {
- rb_sprints: %i[edit_name update],
- rb_wikis: %i[edit update]
- },
+ permission :create_sprints,
+ { rb_sprints: %i[new_dialog refresh_form create edit_name update edit_dialog update_agile_sprint],
+ rb_wikis: %i[edit update] },
permissible_on: :project,
- require: :member
+ require: :member,
+ dependencies: :view_sprints
+
+ permission :start_complete_sprint,
+ {},
+ permissible_on: :project,
+ require: :member,
+ dependencies: :view_sprints,
+ visible: -> { OpenProject::FeatureDecisions.scrum_projects_active? }
+
+ permission :manage_sprint_items,
+ { rb_stories: %i[move reorder] },
+ permissible_on: :project,
+ require: :member,
+ dependencies: :view_sprints
+
+ permission :share_sprint,
+ {},
+ permissible_on: :project,
+ require: :member,
+ dependencies: :create_sprints,
+ visible: -> { OpenProject::FeatureDecisions.scrum_projects_active? }
end
menu :project_menu,
diff --git a/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb b/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb
index 1eebc30e9f0..4a9e1ccb2bb 100644
--- a/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb
+++ b/modules/backlogs/spec/components/backlogs/backlog_component_spec.rb
@@ -31,6 +31,8 @@
require "rails_helper"
RSpec.describe Backlogs::BacklogComponent, type: :component do
+ include Rails.application.routes.url_helpers
+
shared_let(:type_feature) { create(:type_feature) }
shared_let(:type_task) { create(:type_task) }
shared_let(:default_status) { create(:default_status) }
@@ -115,6 +117,8 @@ RSpec.describe Backlogs::BacklogComponent, type: :component do
render_component
box = page.find(".Box")
+ expect(box["data-generic-drag-and-drop-target"]).to eq("container")
+ expect(box["data-target-container-accessor"]).to eq(":scope > ul")
expect(box["data-target-id"]).to eq(sprint.id.to_s)
expect(box["data-target-allowed-drag-type"]).to eq("story")
end
@@ -125,7 +129,7 @@ RSpec.describe Backlogs::BacklogComponent, type: :component do
story_row = page.find(".Box-row[id='story_#{story1.id}']")
expect(story_row["data-draggable-id"]).to eq(story1.id.to_s)
expect(story_row["data-draggable-type"]).to eq("story")
- expect(story_row["data-drop-url"]).to include("move")
+ expect(story_row["data-drop-url"]).to end_with(move_backlogs_project_sprint_story_path(project, sprint, story1))
end
it "renders story rows with proper classes" do
diff --git a/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb b/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb
index 310642d19d2..d9dfac1d79a 100644
--- a/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb
+++ b/modules/backlogs/spec/components/backlogs/backlog_menu_component_spec.rb
@@ -59,8 +59,36 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do
end
describe "permission-based items" do
- context "with :update_sprints permission" do
- let(:permissions) { %i[view_master_backlog update_sprints] }
+ context "with :manage_sprint_items permission" do
+ let(:permissions) { %i[view_sprints manage_sprint_items] }
+
+ it "shows Add new story item with compose icon" do
+ render_component
+
+ expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.new_story"))
+ expect(page).to have_octicon(:compose)
+ end
+ end
+
+ context "without :manage_sprint_items permission" do
+ let(:permissions) { [:view_sprints] }
+
+ it "does not show Add new story item" do
+ render_component
+
+ expect(page).to have_no_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.new_story"))
+ end
+ end
+
+ context "with :create_sprints permission" do
+ let(:permissions) { %i[view_sprints create_sprints] }
+
+ it "shows Properties item with gear icon" do
+ render_component
+
+ expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.properties"))
+ expect(page).to have_octicon(:gear)
+ end
it "shows Edit item with pencil icon" do
render_component
@@ -71,8 +99,14 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do
end
end
- context "without :update_sprints permission" do
- let(:permissions) { [:view_master_backlog] }
+ context "without :create_sprints permission" do
+ let(:permissions) { [:view_sprints] }
+
+ it "does not show Properties item" do
+ render_component
+
+ expect(page).to have_no_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.properties"))
+ end
it "does not show Edit item" do
render_component
@@ -81,50 +115,8 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do
end
end
- context "with :add_work_packages permission" do
- let(:permissions) { %i[view_master_backlog add_work_packages] }
-
- it "shows Add new story item with compose icon" do
- render_component
-
- expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.new_story"))
- expect(page).to have_octicon(:compose)
- end
- end
-
- context "without :add_work_packages permission" do
- let(:permissions) { [:view_master_backlog] }
-
- it "does not show Add new story item" do
- render_component
-
- expect(page).to have_no_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.new_story"))
- end
- end
-
- context "with :manage_versions permission" do
- let(:permissions) { %i[view_master_backlog manage_versions] }
-
- it "shows Properties item with gear icon" do
- render_component
-
- expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.properties"))
- expect(page).to have_octicon(:gear)
- end
- end
-
- context "without :manage_versions permission" do
- let(:permissions) { [:view_master_backlog] }
-
- it "does not show Properties item" do
- render_component
-
- expect(page).to have_no_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.properties"))
- end
- end
-
- context "with :view_taskboards permission" do
- let(:permissions) { %i[view_master_backlog view_taskboards] }
+ context "with :view_sprints permission" do
+ let(:permissions) { %i[view_sprints] }
it "shows Task board item" do
render_component
@@ -132,20 +124,10 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do
expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.task_board"))
end
end
-
- context "without :view_taskboards permission" do
- let(:permissions) { [:view_master_backlog] }
-
- it "does not show Task board item" do
- render_component
-
- expect(page).to have_no_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.task_board"))
- end
- end
end
describe "always-visible items" do
- let(:permissions) { [:view_master_backlog] }
+ let(:permissions) { [:view_sprints] }
it "renders a stable id on the action menu and stories/tasks item" do
render_component
@@ -190,7 +172,7 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do
describe "module-based items" do
context "when wiki module is enabled" do
- let(:permissions) { [:view_master_backlog] }
+ let(:permissions) { [:view_sprints] }
let(:project) { create(:project, types: [type_feature, type_task], enabled_module_names: %w[backlogs wiki]) }
it "shows Wiki item" do
@@ -202,7 +184,7 @@ RSpec.describe Backlogs::BacklogMenuComponent, type: :component do
end
context "when wiki module is disabled" do
- let(:permissions) { [:view_master_backlog] }
+ let(:permissions) { [:view_sprints] }
let(:project) { create(:project, types: [type_feature, type_task], enabled_module_names: %w[backlogs]) }
it "does not show Wiki item" do
diff --git a/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb
new file mode 100644
index 00000000000..9eb127060ed
--- /dev/null
+++ b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb
@@ -0,0 +1,148 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "rails_helper"
+
+RSpec.describe Backlogs::SprintComponent, type: :component do
+ include Rails.application.routes.url_helpers
+
+ shared_let(:type_feature) { create(:type_feature) }
+ shared_let(:type_task) { create(:type_task) }
+ shared_let(:default_status) { create(:default_status) }
+ shared_let(:default_priority) { create(:default_priority) }
+ shared_let(:user) { create(:admin) }
+ current_user { user }
+
+ let(:project) { create(:project, types: [type_feature, type_task]) }
+ let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) }
+
+ before do
+ allow(Setting)
+ .to receive(:plugin_openproject_backlogs)
+ .and_return("story_types" => [type_feature.id.to_s], "task_type" => type_task.id.to_s)
+
+ allow(user).to receive(:backlogs_preference).with(:versions_default_fold_state).and_return("open")
+ end
+
+ def render_component
+ render_inline(described_class.new(sprint:, current_user: user))
+ end
+
+ describe "rendering" do
+ context "with stories" do
+ let!(:story1) do
+ create(:work_package,
+ project:,
+ type: type_feature,
+ status: default_status,
+ priority: default_priority,
+ story_points: 5,
+ position: 1,
+ sprint: sprint)
+ end
+ let!(:story2) do
+ create(:work_package,
+ project:,
+ type: type_feature,
+ status: default_status,
+ priority: default_priority,
+ story_points: 3,
+ position: 2,
+ sprint: sprint)
+ end
+
+ it "renders a Primer::Beta::BorderBox" do
+ render_component
+
+ expect(page).to have_css(".Box")
+ end
+
+ it "has the sprint ID in the DOM id" do
+ render_component
+
+ expect(page).to have_css(".Box#agile_sprint_#{sprint.id}")
+ end
+
+ it "renders BacklogHeaderComponent in header" do
+ render_component
+
+ expect(page).to have_css(".Box-header h3", text: "Sprint 1")
+ end
+
+ it "renders a stable id on the sprint header" do
+ render_component
+
+ expect(page).to have_element(:div, class: "Box-header", id: /\Aagile_sprint_#{sprint.id}_header\z/)
+ end
+
+ it "renders StoryComponent for each story" do
+ render_component
+
+ expect(page).to have_css(".Box-row", count: 2) # 2 stories
+ expect(page).to have_text(story1.subject)
+ expect(page).to have_text(story2.subject)
+ end
+
+ it "has drop target data attributes" do
+ render_component
+
+ box = page.find(".Box")
+ expect(box["data-generic-drag-and-drop-target"]).to eq("container")
+ expect(box["data-target-container-accessor"]).to eq(":scope > ul")
+ expect(box["data-target-id"]).to eq(sprint.id.to_s)
+ expect(box["data-target-allowed-drag-type"]).to eq("story")
+ end
+
+ it "has draggable data attributes on story rows" do
+ render_component
+
+ story_row = page.find(".Box-row[id='work_package_#{story1.id}']")
+ expect(story_row["data-draggable-id"]).to eq(story1.id.to_s)
+ expect(story_row["data-draggable-type"]).to eq("story")
+ expect(story_row["data-drop-url"]).to end_with(move_backlogs_project_sprint_story_path(project, sprint, story1))
+ end
+
+ it "renders story rows with proper classes" do
+ render_component
+
+ story_row = page.find(".Box-row[id='work_package_#{story1.id}']")
+ expect(story_row[:class]).to include("Box-row--hover-blue")
+ expect(story_row[:class]).to include("Box-row--focus-gray")
+ expect(story_row[:class]).to include("Box-row--clickable")
+ end
+ end
+
+ context "without stories" do
+ let(:rendered_component) { render_component }
+
+ it_behaves_like "rendering Blank Slate", heading: "Sprint 1 is empty"
+ end
+ end
+end
diff --git a/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb
new file mode 100644
index 00000000000..2318fd41172
--- /dev/null
+++ b/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb
@@ -0,0 +1,184 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "rails_helper"
+
+RSpec.describe Backlogs::SprintHeaderComponent, type: :component do
+ shared_let(:type_feature) { create(:type_feature) }
+ shared_let(:type_task) { create(:type_task) }
+ shared_let(:default_status) { create(:default_status) }
+ shared_let(:default_priority) { create(:default_priority) }
+ shared_let(:user) { create(:admin) }
+ current_user { user }
+
+ let(:project) { create(:project, types: [type_feature, type_task]) }
+ let(:start_date) { Date.new(2024, 1, 15) }
+ let(:finish_date) { Date.new(2024, 1, 29) }
+ let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date:, finish_date:) }
+ let(:state) { :show }
+ let(:folded) { false }
+
+ before do
+ allow(Setting)
+ .to receive(:plugin_openproject_backlogs)
+ .and_return("story_types" => [type_feature.id.to_s], "task_type" => type_task.id.to_s)
+ end
+
+ def render_component(folded: false)
+ render_inline(described_class.new(sprint:, folded:, current_user: user))
+ end
+
+ describe "show state (default)" do
+ context "with stories" do
+ let!(:story1) do
+ create(:story,
+ project:,
+ type: type_feature,
+ status: default_status,
+ priority: default_priority,
+ story_points: 5,
+ sprint:)
+ end
+ let!(:story2) do
+ create(:story,
+ project:,
+ type: type_feature,
+ status: default_status,
+ priority: default_priority,
+ story_points: 3,
+ sprint:)
+ end
+ let!(:story_with_nil_points) do
+ create(:story,
+ project:,
+ type: type_feature,
+ status: default_status,
+ priority: default_priority,
+ story_points: nil,
+ sprint:)
+ end
+
+ it "displays sprint name in h4" do
+ render_component
+
+ expect(page).to have_css("h3", text: "Sprint 1")
+ end
+
+ it "shows story count via Primer::Beta::Counter" do
+ render_component
+
+ expect(page).to have_css(".Counter", text: "3")
+ end
+
+ it "shows formatted date range with time tags" do
+ render_component
+
+ expect(page).to have_css("time[datetime='2024-01-15']")
+ expect(page).to have_css("time[datetime='2024-01-29']")
+ end
+
+ it "shows story points total (nil treated as 0)" do
+ render_component
+
+ # 5 + 3 + 0 = 8 points
+ expect(page).to have_text("8 points", normalize_ws: true)
+ end
+
+ it "renders collapse/expand chevrons" do
+ render_component
+
+ expect(page).to have_octicon(:"chevron-up", visible: :all)
+ expect(page).to have_octicon(:"chevron-down", visible: :all)
+ end
+
+ it "renders BacklogMenuComponent" do
+ render_component
+
+ expect(page).to have_css("action-menu")
+ end
+
+ it "renders a stable id on the sprint menu trigger" do
+ render_component
+
+ expect(page).to have_element(:button, id: /\Aagile_sprint_#{sprint.id}_menu-button\z/)
+ end
+ end
+
+ context "with no stories" do
+ let(:stories) { [] }
+
+ it "shows 0 story count" do
+ render_component
+
+ expect(page).to have_css(".Counter", text: "0")
+ end
+
+ it "shows 0 points" do
+ render_component
+
+ expect(page).to have_text("0 points", normalize_ws: true)
+ end
+ end
+
+ context "when sprint has no dates" do
+ let(:sprint) { build_stubbed(:agile_sprint, project:, name: "Sprint 1", start_date: nil, finish_date: nil) }
+
+ it "renders without date range" do
+ render_component
+
+ expect(page).to have_no_css("time")
+ end
+ end
+ end
+
+ describe "folded state" do
+ context "when folded is true" do
+ it "renders chevron-up hidden and chevron-down visible" do
+ render_component(folded: true)
+
+ # When folded, chevron-up is hidden (has hidden attribute on svg)
+ # and chevron-down is visible (for expanding)
+ expect(page).to have_css("svg[hidden][data-target='collapsible-header.arrowUp']", visible: :hidden)
+ expect(page).to have_css("svg[data-target='collapsible-header.arrowDown']:not([hidden])", visible: :all)
+ end
+ end
+
+ context "when folded is false" do
+ it "renders chevron-down hidden and chevron-up visible" do
+ render_component(folded: false)
+
+ # When expanded, chevron-down is hidden (has hidden attribute)
+ # and chevron-up is visible (for collapsing)
+ expect(page).to have_css("svg[hidden][data-target='collapsible-header.arrowDown']", visible: :hidden)
+ expect(page).to have_css("svg[data-target='collapsible-header.arrowUp']:not([hidden])", visible: :all)
+ end
+ end
+ end
+end
diff --git a/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb
new file mode 100644
index 00000000000..c2c96a07263
--- /dev/null
+++ b/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb
@@ -0,0 +1,122 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "rails_helper"
+
+RSpec.describe Backlogs::SprintMenuComponent, type: :component do
+ shared_let(:type_feature) { create(:type_feature) }
+ shared_let(:type_task) { create(:type_task) }
+
+ let(:project) { create(:project, types: [type_feature, type_task]) }
+ let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) }
+ let(:stories) { [] }
+ let(:user) { create(:user) }
+ let(:permissions) { [] }
+
+ before do
+ allow(Setting)
+ .to receive(:plugin_openproject_backlogs)
+ .and_return("story_types" => [type_feature.id.to_s], "task_type" => type_task.id.to_s)
+
+ # Set up user with specific permissions
+ create(:member,
+ project:,
+ principal: user,
+ roles: [create(:project_role, permissions:)])
+ login_as(user)
+ end
+
+ def render_component
+ render_inline(described_class.new(sprint:, project:, current_user: user))
+ end
+
+ describe "permission-based items" do
+ context "with :manage_sprint_items permission" do
+ let(:permissions) { %i[view_sprints manage_sprint_items] }
+
+ it "shows Add new story item with compose icon" do
+ render_component
+
+ expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.new_story"))
+ expect(page).to have_octicon(:compose)
+ end
+ end
+
+ context "without :manage_sprint_items permission" do
+ let(:permissions) { [:view_sprints] }
+
+ it "does not show Add new story item" do
+ render_component
+
+ expect(page).to have_no_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.new_story"))
+ end
+ end
+
+ context "with :create_sprints permission" do
+ let(:permissions) { %i[view_sprints create_sprints] }
+
+ it "shows Edit item with pencil icon" do
+ render_component
+
+ expect(page).to have_css("action-menu")
+ expect(page).to have_text(I18n.t("backlogs.backlog_menu_component.action_menu.edit_sprint"))
+ expect(page).to have_octicon(:pencil)
+ end
+ end
+
+ context "without :create_sprints permission" do
+ let(:permissions) { [:view_sprints] }
+
+ it "does not show Edit item" do
+ render_component
+
+ expect(page).to have_no_text(I18n.t("backlogs.backlog_menu_component.action_menu.edit_sprint"))
+ end
+ end
+ end
+
+ describe "always-visible items" do
+ let(:permissions) { [:view_sprints] }
+
+ it "renders stable ids on the action menu and stories/tasks item" do
+ render_component
+
+ expect(page).to have_element(:button, id: /\Aagile_sprint_#{sprint.id}_menu-button\z/)
+ expect(page).to have_element(:ul, id: /\Aagile_sprint_#{sprint.id}_menu-list\z/)
+ expect(page).to have_element(:a, id: /\Aagile_sprint_#{sprint.id}_menu_stories_tasks\z/)
+ end
+
+ it "shows Stories/Tasks link" do
+ render_component
+
+ expect(page).to have_text(I18n.t(:"backlogs.backlog_menu_component.action_menu.stories_tasks"))
+ end
+ end
+end
diff --git a/modules/backlogs/spec/components/backlogs/story_component_spec.rb b/modules/backlogs/spec/components/backlogs/story_component_spec.rb
index 5481e6bfcbf..8cd5e3207eb 100644
--- a/modules/backlogs/spec/components/backlogs/story_component_spec.rb
+++ b/modules/backlogs/spec/components/backlogs/story_component_spec.rb
@@ -97,6 +97,13 @@ RSpec.describe Backlogs::StoryComponent, type: :component do
expect(page).to have_css("action-menu")
end
+
+ it "renders a drag handle compatible with GenericDragAndDropController" do
+ render_component
+
+ expect(page).to have_css(".DragHandle[role='button'][tabindex='0']")
+ expect(page).to have_css(".DragHandle[aria-label='Move Test Story Subject']")
+ end
end
describe "story points handling" do
diff --git a/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb b/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb
new file mode 100644
index 00000000000..35828129040
--- /dev/null
+++ b/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb
@@ -0,0 +1,117 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "spec_helper"
+require "contracts/shared/model_contract_shared_context"
+
+RSpec.describe Sprints::CreateContract do
+ include_context "ModelContract shared context"
+
+ let(:project) { build_stubbed(:project) }
+ let(:user) { build_stubbed(:user) }
+ let(:sprint) do
+ Agile::Sprint.new(name: sprint_name,
+ project:,
+ start_date: sprint_start_date,
+ finish_date: sprint_finish_date,
+ status: sprint_status,
+ sharing: sprint_sharing)
+ end
+ let(:sprint_name) { "Sprint 1" }
+ let(:sprint_start_date) { Time.zone.today }
+ let(:sprint_finish_date) { Time.zone.today + 14.days }
+ let(:sprint_status) { "in_planning" }
+ let(:sprint_sharing) { "none" }
+ let(:permissions) { [:create_sprints] }
+
+ subject(:contract) { described_class.new(sprint, user) }
+
+ before do
+ mock_permissions_for(user) do |mock|
+ mock.allow_in_project(*permissions, project:) if project
+ end
+ end
+
+ describe "validation" do
+ context "with valid attributes and permissions" do
+ it_behaves_like "contract is valid"
+ end
+
+ context "when project is nil" do
+ let(:project) { nil }
+
+ it_behaves_like "contract is invalid", project: :blank
+ end
+
+ context "when user does not have create_sprints permission" do
+ let(:permissions) { [:view_work_packages] }
+
+ it_behaves_like "contract is invalid", base: :error_unauthorized
+ end
+
+ context "when user has no permissions in project" do
+ let(:permissions) { [] }
+
+ it_behaves_like "contract is invalid", base: :error_unauthorized
+ end
+
+ context "when name is blank" do
+ let(:sprint_name) { "" }
+
+ it_behaves_like "contract is invalid", name: :blank
+ end
+
+ context "when start_date is blank" do
+ let(:sprint_start_date) { nil }
+
+ it_behaves_like "contract is invalid", start_date: :blank
+ end
+
+ context "when finish_date is blank" do
+ let(:sprint_finish_date) { nil }
+
+ it_behaves_like "contract is invalid", finish_date: %i[blank blank]
+ end
+
+ context "when finish_date is before start_date" do
+ let(:sprint_start_date) { Time.zone.today }
+ let(:sprint_finish_date) { Time.zone.today - 1.day }
+
+ it_behaves_like "contract is invalid", finish_date: %i[greater_than_or_equal_to]
+ end
+
+ context "when user is admin without project permission" do
+ let(:user) { build_stubbed(:admin) }
+ let(:permissions) { [] }
+
+ it_behaves_like "contract is valid"
+ end
+ end
+end
diff --git a/modules/backlogs/spec/controllers/rb_sprints_controller_permissions_spec.rb b/modules/backlogs/spec/controllers/rb_sprints_controller_permissions_spec.rb
index e0a372b0f3c..d415deb0221 100644
--- a/modules/backlogs/spec/controllers/rb_sprints_controller_permissions_spec.rb
+++ b/modules/backlogs/spec/controllers/rb_sprints_controller_permissions_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe RbSprintsController, "permissions" do
create(:project, enabled_module_names: %w[work_package_tracking backlogs]).tap do |p|
create(:member,
user: current_user,
- roles: [create(:project_role, permissions: [:update_sprints])],
+ roles: [create(:project_role, permissions: [:create_sprints])],
project: p)
end
end
@@ -80,7 +80,7 @@ RSpec.describe RbSprintsController, "permissions" do
before do
create(:member,
user: current_user,
- roles: [create(:project_role, permissions: %i[view_work_packages view_versions update_sprints])],
+ roles: [create(:project_role, permissions: %i[view_work_packages view_versions create_sprints])],
project: sprint_project)
end
diff --git a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb
index 4219debbf88..396fb2b9e1b 100644
--- a/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb
+++ b/modules/backlogs/spec/controllers/rb_sprints_controller_spec.rb
@@ -31,123 +31,362 @@
require "rails_helper"
RSpec.describe RbSprintsController do
- shared_let(:type_feature) { create(:type_feature) }
- shared_let(:type_task) { create(:type_task) }
- shared_let(:user) { create(:admin) }
- current_user { user }
+ describe "inline name actions" do
+ shared_let(:type_feature) { create(:type_feature) }
+ shared_let(:type_task) { create(:type_task) }
+ shared_let(:user) { create(:admin) }
+ current_user { user }
- let(:visible_projects_scope) { instance_double(ActiveRecord::Relation) }
- let(:visible_sprints_scope) { instance_double(ActiveRecord::Relation) }
-
- before do
- allow(Setting)
- .to receive(:plugin_openproject_backlogs)
- .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id })
-
- allow(Project)
- .to receive(:visible)
- .and_return(visible_projects_scope)
-
- allow(visible_projects_scope)
- .to receive(:find)
- .with(project.identifier)
- .and_return(project)
-
- allow(Sprint)
- .to receive(:visible)
- .and_return(visible_sprints_scope)
-
- allow(visible_sprints_scope)
- .to receive(:find)
- .with(sprint.id.to_s)
- .and_return(sprint)
- end
-
- describe "GET #edit_name" do
- let(:project) { build_stubbed(:project) }
- let(:sprint) { build_stubbed(:sprint) }
-
- it "responds with success", :aggregate_failures do
- get :edit_name, params: { project_id: project.identifier, id: sprint.id }, format: :turbo_stream
-
- expect(response).to be_successful
- expect(response).to have_http_status :ok
- expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}"
- assert_select %(turbo-stream[action="update"][target="backlogs-backlog-header-component-#{sprint.id}"][method="morph"])
- expect(assigns(:project)).to eq(project)
- expect(assigns(:sprint)).to eq(sprint)
- expect(assigns(:backlog)).to be_a(Backlog)
- end
- end
-
- describe "GET #show_name" do
- let(:project) { build_stubbed(:project) }
- let(:sprint) { build_stubbed(:sprint) }
-
- it "responds with success", :aggregate_failures do
- get :show_name, params: { project_id: project.identifier, id: sprint.id }, format: :turbo_stream
-
- expect(response).to be_successful
- expect(response).to have_http_status :ok
- expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}"
- assert_select %(turbo-stream[action="update"][target="backlogs-backlog-header-component-#{sprint.id}"][method="morph"])
- expect(assigns(:project)).to eq(project)
- expect(assigns(:sprint)).to eq(sprint)
- expect(assigns(:backlog)).to be_a(Backlog)
- end
- end
-
- describe "PATCH #update" do
- let(:project) { build_stubbed(:project) }
- let(:sprint) { build_stubbed(:sprint) }
+ let(:visible_projects_scope) { instance_double(ActiveRecord::Relation) }
+ let(:visible_sprints_scope) { instance_double(ActiveRecord::Relation) }
before do
- update_service = instance_double(Versions::UpdateService, call: service_result)
+ allow(Setting)
+ .to receive(:plugin_openproject_backlogs)
+ .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id })
- allow(Versions::UpdateService)
- .to receive(:new)
- .with(user:, model: sprint)
- .and_return(update_service)
+ allow(Project)
+ .to receive(:visible)
+ .and_return(visible_projects_scope)
+
+ allow(visible_projects_scope)
+ .to receive(:find)
+ .with(project.identifier)
+ .and_return(project)
+
+ allow(Sprint)
+ .to receive(:visible)
+ .and_return(visible_sprints_scope)
+
+ allow(visible_sprints_scope)
+ .to receive(:find)
+ .with(sprint.id.to_s)
+ .and_return(sprint)
end
- context "when service call succeeds" do
- let(:service_result) { ServiceResult.success(result: sprint) }
+ describe "GET #edit_name" do
+ let(:project) { build_stubbed(:project) }
+ let(:sprint) { build_stubbed(:sprint) }
it "responds with success", :aggregate_failures do
- patch :update, params: { project_id: project.identifier, id: sprint.id, sprint: { name: "Updated Sprint" } },
- format: :turbo_stream
+ get :edit_name, params: { project_id: project.identifier, id: sprint.id }, format: :turbo_stream
expect(response).to be_successful
expect(response).to have_http_status :ok
expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}"
assert_select %(turbo-stream[action="update"][target="backlogs-backlog-header-component-#{sprint.id}"][method="morph"])
- expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component"
expect(assigns(:project)).to eq(project)
expect(assigns(:sprint)).to eq(sprint)
expect(assigns(:backlog)).to be_a(Backlog)
end
end
- context "when service call fails" do
- let(:service_result) { ServiceResult.failure(result: sprint) }
+ describe "GET #show_name" do
+ let(:project) { build_stubbed(:project) }
+ let(:sprint) { build_stubbed(:sprint) }
- before do
- project.name = ""
- end
+ it "responds with success", :aggregate_failures do
+ get :show_name, params: { project_id: project.identifier, id: sprint.id }, format: :turbo_stream
- it "responds with 422", :aggregate_failures do
- patch :update, params: { project_id: project.identifier, id: sprint.id, sprint: { name: "" } },
- format: :turbo_stream
-
- expect(response).not_to be_successful
- expect(response).to have_http_status :unprocessable_entity
+ expect(response).to be_successful
+ expect(response).to have_http_status :ok
expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}"
assert_select %(turbo-stream[action="update"][target="backlogs-backlog-header-component-#{sprint.id}"][method="morph"])
- expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component"
expect(assigns(:project)).to eq(project)
expect(assigns(:sprint)).to eq(sprint)
expect(assigns(:backlog)).to be_a(Backlog)
end
end
+
+ describe "PATCH #update" do
+ let(:project) { build_stubbed(:project) }
+ let(:sprint) { build_stubbed(:sprint) }
+
+ before do
+ update_service = instance_double(Versions::UpdateService, call: service_result)
+
+ allow(Versions::UpdateService)
+ .to receive(:new)
+ .with(user:, model: sprint)
+ .and_return(update_service)
+ end
+
+ context "when service call succeeds" do
+ let(:service_result) { ServiceResult.success(result: sprint) }
+
+ it "responds with success", :aggregate_failures do
+ patch :update, params: { project_id: project.identifier, id: sprint.id, sprint: { name: "Updated Sprint" } },
+ format: :turbo_stream
+
+ expect(response).to be_successful
+ expect(response).to have_http_status :ok
+ expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}"
+ assert_select %(turbo-stream[action="update"][target="backlogs-backlog-header-component-#{sprint.id}"][method="morph"])
+ expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component"
+ expect(assigns(:project)).to eq(project)
+ expect(assigns(:sprint)).to eq(sprint)
+ expect(assigns(:backlog)).to be_a(Backlog)
+ end
+ end
+
+ context "when service call fails" do
+ let(:service_result) { ServiceResult.failure(result: sprint) }
+
+ before do
+ project.name = ""
+ end
+
+ it "responds with 422", :aggregate_failures do
+ patch :update, params: { project_id: project.identifier, id: sprint.id, sprint: { name: "" } },
+ format: :turbo_stream
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :unprocessable_entity
+ expect(response).to have_turbo_stream action: "update", target: "backlogs-backlog-header-component-#{sprint.id}"
+ assert_select %(turbo-stream[action="update"][target="backlogs-backlog-header-component-#{sprint.id}"][method="morph"])
+ expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component"
+ expect(assigns(:project)).to eq(project)
+ expect(assigns(:sprint)).to eq(sprint)
+ expect(assigns(:backlog)).to be_a(Backlog)
+ end
+ end
+ end
+ end
+
+ describe "new actions" do
+ shared_let(:type_feature) { create(:type_feature) }
+ shared_let(:type_task) { create(:type_task) }
+
+ let(:all_permissions) { %i[view_sprints view_work_packages create_sprints] }
+ let(:permissions) { all_permissions }
+ let(:user) do
+ create(:user, member_with_permissions: { project => permissions })
+ end
+ let(:project) { create(:project) }
+
+ current_user { user }
+
+ before do
+ # Necessary to get the controller running due to check_if_plugin_is_configured
+ allow(Setting)
+ .to receive(:plugin_openproject_backlogs)
+ .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id })
+ end
+
+ describe "GET #new_dialog" do
+ context "with the feature flag inactive" do
+ it "responds with forbidden" do
+ get :new_dialog, params: { project_id: project.id }, format: :turbo_stream
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :forbidden
+ end
+ end
+
+ context "with the feature flag active", with_flag: { scrum_projects: true } do
+ it "responds with success", :aggregate_failures do
+ get :new_dialog, params: { project_id: project.id }, format: :turbo_stream
+
+ expect(response).to be_successful
+ expect(response).to have_http_status :ok
+ expect(response).to have_turbo_stream action: "dialog", target: "backlogs-new-sprint-dialog-component"
+ expect(assigns(:project)).to eq(project)
+ end
+
+ context "without the 'create_sprints' permission" do
+ let(:permissions) { all_permissions - [:create_sprints] }
+
+ it "responds with forbidden", :aggregate_failures do
+ get :new_dialog, params: { project_id: project.id }, format: :turbo_stream
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :forbidden
+ end
+ end
+ end
+ end
+
+ describe "GET #edit_dialog" do
+ let!(:sprint) { create(:agile_sprint, project:) }
+
+ context "with the feature flag inactive" do
+ it "responds with forbidden" do
+ get :edit_dialog, params: { project_id: project.id, id: sprint.id }, format: :turbo_stream
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :forbidden
+ end
+ end
+
+ context "with the feature flag active", with_flag: { scrum_projects: true } do
+ it "responds with success", :aggregate_failures do
+ get :edit_dialog, params: { project_id: project.id, id: sprint.id }, format: :turbo_stream
+
+ expect(response).to be_successful
+ expect(response).to have_http_status :ok
+ expect(response).to have_turbo_stream action: "dialog", target: "backlogs-new-sprint-dialog-component"
+ expect(assigns(:project)).to eq(project)
+ expect(assigns(:sprint)).to eq(sprint)
+ end
+
+ context "without the 'create_sprints' permission" do
+ let(:permissions) { all_permissions - [:create_sprints] }
+
+ it "responds with forbidden", :aggregate_failures do
+ get :edit_dialog, params: { project_id: project.id, id: sprint.id }, format: :turbo_stream
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :forbidden
+ end
+ end
+ end
+ end
+
+ describe "POST #create" do
+ context "with the feature flag inactive" do
+ it "responds with forbidden" do
+ post :create, params: { project_id: project.id }, format: :turbo_stream
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :forbidden
+ end
+ end
+
+ context "with the feature flag active", with_flag: { scrum_projects: true } do
+ let(:params) do
+ {
+ project_id: project.id,
+ sprint: { name: "My Sprint", start_date: "2025-10-05", finish_date: "2025-10-15" }
+ }
+ end
+
+ it "responds with success, creates a sprint, and redirects to backlogs", :aggregate_failures do
+ post :create, format: :turbo_stream, params: params
+
+ expect(response).to be_successful
+ expect(response).to have_http_status :ok
+ expect(response.body).to include("turbo-stream")
+ expect(response.body).to include("action=\"redirect_to\"")
+ expect(response.body).to include(backlogs_project_backlogs_path(project))
+ expect(project.reload.sprints.last.name).to eq("My Sprint")
+ expect(flash[:notice]).to eq(I18n.t(:notice_successful_create))
+ end
+
+ context "without the 'create_sprints' permission" do
+ let(:permissions) { all_permissions - [:create_sprints] }
+
+ it "responds with forbidden", :aggregate_failures do
+ post :create, format: :turbo_stream, params: params
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :forbidden
+ end
+ end
+ end
+ end
+
+ describe "PUT #update_agile_sprint" do
+ let!(:sprint) { create(:agile_sprint, name: "Original sprint name", project:) }
+
+ context "with the feature flag inactive" do
+ it "responds with forbidden" do
+ put :update_agile_sprint, params: { id: sprint.id, project_id: project.id }, format: :turbo_stream
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :forbidden
+ end
+ end
+
+ context "with the feature flag active", with_flag: { scrum_projects: true } do
+ let(:params) do
+ {
+ id: sprint.id,
+ project_id: project.id,
+ sprint: { name: "Changed sprint name" }
+ }
+ end
+
+ it "responds with success", :aggregate_failures do
+ put :update_agile_sprint, format: :turbo_stream, params: params
+
+ expect(response).to be_successful
+ expect(response).to have_http_status :ok
+ expect(response.body).to have_turbo_stream action: "flash"
+ expect(response.body).to have_turbo_stream action: "update", target: "backlogs-sprint-header-component-#{sprint.id}"
+ assert_select %(turbo-stream[action="update"][target="backlogs-sprint-header-component-#{sprint.id}"][method="morph"])
+ expect(response.body).to include("Successful update.")
+ expect(sprint.reload.name).to eq("Changed sprint name")
+ end
+
+ context "without the 'create_sprints' permission" do
+ let(:permissions) { all_permissions - [:create_sprints] }
+
+ it "responds with forbidden", :aggregate_failures do
+ put :update_agile_sprint, format: :turbo_stream, params: params
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :forbidden
+ end
+ end
+ end
+ end
+
+ describe "GET #refresh_form" do
+ context "with the feature flag inactive" do
+ it "responds with forbidden" do
+ get :refresh_form, params: { project_id: project.id }, format: :turbo_stream
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :forbidden
+ end
+ end
+
+ context "with the feature flag active", with_flag: { scrum_projects: true } do
+ let(:params) do
+ {
+ project_id: project.id,
+ sprint: { name: "My Sprint", start_date: "2025-10-05", finish_date: "2025-10-15" }
+ }
+ end
+
+ it "responds with success", :aggregate_failures do
+ get :refresh_form, format: :turbo_stream, params: params
+
+ expect(response).to be_successful
+ expect(response).to have_http_status :ok
+ expect(response).to have_turbo_stream action: "update", target: "backlogs-new-sprint-form-component"
+ expect(assigns(:sprint)).to be_nil
+ end
+
+ context "without the 'create_sprints' permission" do
+ let(:permissions) { all_permissions - [:create_sprints] }
+
+ it "responds with forbidden", :aggregate_failures do
+ get :refresh_form, format: :turbo_stream, params: params
+
+ expect(response).not_to be_successful
+ expect(response).to have_http_status :forbidden
+ end
+ end
+
+ context "when refreshing the form in edit mode by passing a sprint id" do
+ let!(:sprint) { create(:agile_sprint, project:) }
+ let(:params) do
+ {
+ project_id: project.id,
+ sprint: { id: sprint.id, name: "My Sprint", start_date: "2025-10-05", finish_date: "2025-10-15" }
+ }
+ end
+
+ it "responds with success", :aggregate_failures do
+ get :refresh_form, format: :turbo_stream, params: params
+
+ expect(response).to be_successful
+ expect(response).to have_http_status :ok
+ expect(response).to have_turbo_stream action: "update", target: "backlogs-new-sprint-form-component"
+ end
+ end
+ end
+ end
end
end
diff --git a/modules/backlogs/spec/controllers/rb_taskboards_controller_spec.rb b/modules/backlogs/spec/controllers/rb_taskboards_controller_spec.rb
new file mode 100644
index 00000000000..b474ea826a8
--- /dev/null
+++ b/modules/backlogs/spec/controllers/rb_taskboards_controller_spec.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "spec_helper"
+
+RSpec.describe RbTaskboardsController do
+ shared_let(:type_feature) { create(:type_feature) }
+ shared_let(:type_task) { create(:type_task) }
+ shared_let(:user) { create(:admin) }
+ current_user { user }
+
+ let(:permissions) { [] }
+ let(:project) { create(:project, member_with_permissions: { user => permissions }) }
+ let(:status) { create(:status, name: "status 1", is_default: true) }
+ let(:sprint) { create(:sprint, project:) }
+ let(:story) { create(:story, status:, version: sprint, project:) }
+
+ before do
+ allow(Setting)
+ .to receive(:plugin_openproject_backlogs)
+ .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id })
+ end
+
+ describe "GET show" do
+ before do
+ get :show, params: { project_id: project.identifier, sprint_id: sprint.id }
+ end
+
+ it "performs that request" do
+ expect(response).to be_successful
+ expect(response).to render_template :show
+ end
+
+ context "as a member with view_sprints permission" do
+ let(:user) { create(:user) }
+ let(:permissions) { %i[view_sprints view_work_packages] }
+
+ it "grants access" do
+ expect(response).to be_successful
+ expect(response).to render_template :show
+ end
+ end
+
+ context "as a member without view_sprints permission" do
+ let(:user) { create(:user) }
+ let(:permissions) { [:view_project] }
+
+ it "denies access" do
+ expect(response).to have_http_status(:not_found)
+ end
+ end
+
+ context "as a non-member" do
+ current_user { create(:user) }
+
+ it "denies access" do
+ expect(response).to have_http_status(:not_found)
+ end
+ end
+ end
+end
diff --git a/modules/backlogs/spec/features/backlogs/context_menu_spec.rb b/modules/backlogs/spec/features/backlogs/context_menu_spec.rb
index 540699b5aea..5800e48d2ca 100644
--- a/modules/backlogs/spec/features/backlogs/context_menu_spec.rb
+++ b/modules/backlogs/spec/features/backlogs/context_menu_spec.rb
@@ -38,9 +38,9 @@ RSpec.describe "Backlogs context menu", :js do
shared_let(:user) do
create(:user,
member_with_permissions: { project => %i[add_work_packages
- view_master_backlog
- view_taskboards
- view_work_packages] })
+ view_sprints
+ view_work_packages
+ manage_sprint_items] })
end
shared_let(:sprint) do
create(:version,
@@ -134,9 +134,9 @@ RSpec.describe "Backlogs context menu", :js do
end
end
- context "when the user does not have add_work_packages permission" do
+ context "when the user does not have manage_sprint_items permission" do
before do
- RolePermission.where(permission: "add_work_packages").delete_all
+ RolePermission.where(permission: "manage_sprint_items").delete_all
end
it 'does not display the "New story" menu entry' do
@@ -146,18 +146,6 @@ RSpec.describe "Backlogs context menu", :js do
end
end
- context "when the user does not have view_taskboards permission" do
- before do
- RolePermission.where(permission: "view_taskboards").delete_all
- end
-
- it 'does not display the "Task board" menu entry' do
- within_backlog_context_menu do |menu|
- expect(menu).to have_no_selector :menuitem, "Task board"
- end
- end
- end
-
context "when the wiki module is not enabled" do
before do
project.enabled_module_names -= ["wiki"]
diff --git a/modules/backlogs/spec/features/backlogs/create_story_spec.rb b/modules/backlogs/spec/features/backlogs/create_story_spec.rb
index 8563a3dd03b..37e3d888493 100644
--- a/modules/backlogs/spec/features/backlogs/create_story_spec.rb
+++ b/modules/backlogs/spec/features/backlogs/create_story_spec.rb
@@ -54,9 +54,9 @@ RSpec.describe "Backlogs", :js do
let(:user) do
create(:user,
member_with_permissions: { project => %i(add_work_packages
- view_master_backlog
+ view_sprints
view_work_packages
- assign_versions) })
+ manage_sprint_items) })
end
let(:project) { create(:project) }
diff --git a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb
index 0cd6e4093eb..d79c85f67f6 100644
--- a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb
+++ b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb
@@ -52,14 +52,14 @@ RSpec.describe "Backlogs in backlog view", :js do
create(:project_role,
permissions: %i(
view_project
- view_master_backlog
+ view_sprints
+ create_sprints
+ manage_sprint_items
add_work_packages
view_work_packages
edit_work_packages
manage_subtasks
manage_versions
- update_sprints
- assign_versions
))
end
let!(:current_user) do
@@ -123,13 +123,13 @@ RSpec.describe "Backlogs in backlog view", :js do
# Versions can be folded
backlogs_page
- .expect_story_in_sprint(sprint_story1, sprint)
+ .expect_story_in_backlog(sprint_story1, sprint)
backlogs_page
.fold_backlog(sprint)
backlogs_page
- .expect_story_not_in_sprint(sprint_story1, sprint)
+ .expect_story_not_in_backlog(sprint_story1, sprint)
# The backlogs can be folded by default
visit my_interface_path
@@ -142,13 +142,13 @@ RSpec.describe "Backlogs in backlog view", :js do
backlogs_page.visit!
backlogs_page
- .expect_story_not_in_sprint(sprint_story1, sprint)
+ .expect_story_not_in_backlog(sprint_story1, sprint)
backlogs_page
.fold_backlog(sprint)
backlogs_page
- .expect_story_in_sprint(sprint_story1, sprint)
+ .expect_story_in_backlog(sprint_story1, sprint)
# Alter the attributes of the sprint
sleep(0.5)
diff --git a/modules/backlogs/spec/features/empty_backlogs_spec.rb b/modules/backlogs/spec/features/empty_backlogs_spec.rb
index b558b1914ac..9e4ba698e67 100644
--- a/modules/backlogs/spec/features/empty_backlogs_spec.rb
+++ b/modules/backlogs/spec/features/empty_backlogs_spec.rb
@@ -57,7 +57,7 @@ RSpec.describe "Empty backlogs project",
end
context "as regular member" do
- let(:role) { create(:project_role, permissions: %i(view_master_backlog)) }
+ let(:role) { create(:project_role, permissions: %i(view_sprints)) }
let(:current_user) { create(:user, member_with_roles: { project => role }) }
it "shows a blankslate without description" do
diff --git a/modules/backlogs/spec/features/impediments_spec.rb b/modules/backlogs/spec/features/impediments_spec.rb
index 814071a1a3a..725bacfd8bb 100644
--- a/modules/backlogs/spec/features/impediments_spec.rb
+++ b/modules/backlogs/spec/features/impediments_spec.rb
@@ -54,12 +54,12 @@ RSpec.describe "Impediments on taskboard", :js,
end
let(:role) do
create(:project_role,
- permissions: %i(view_taskboards
+ permissions: %i(view_sprints
add_work_packages
view_work_packages
edit_work_packages
manage_subtasks
- assign_versions
+ manage_sprint_items
work_package_assigned))
end
let!(:current_user) do
diff --git a/modules/backlogs/spec/features/projects/backlogs_settings_spec.rb b/modules/backlogs/spec/features/projects/backlogs_settings_spec.rb
new file mode 100644
index 00000000000..32e090f3137
--- /dev/null
+++ b/modules/backlogs/spec/features/projects/backlogs_settings_spec.rb
@@ -0,0 +1,96 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "spec_helper"
+require_relative "../../support/pages/projects/settings/backlogs"
+
+RSpec.describe "Backlogs Project Settings", :js do
+ let!(:project) do
+ create(:project,
+ enabled_module_names: %w(backlogs))
+ end
+ let!(:closed_status) { create(:status, name: "Closed", is_closed: true) }
+ let!(:closed_like_status) { create(:status, name: "Sorta kinda Finished", is_default: true) }
+ let(:role) do
+ create(:project_role,
+ permissions: %i[select_done_statuses])
+ end
+ let!(:current_user) do
+ create(:user,
+ member_with_roles: { project => role })
+ end
+ let(:settings_page) { Pages::Projects::Settings::Backlogs.new(project) }
+ let(:done_status_ids_autocompleter) { FormFields::Primerized::AutocompleteField.new("story_types", selector: "[data-test-selector='done_status_ids_autocomplete']") }
+
+ before do
+ login_as current_user
+ end
+
+ it "allows setting a status as done although it is not closed" do
+ settings_page.visit!
+
+ expect(page).to have_heading "Backlogs"
+
+ wait_for_network_idle
+ wait_for_autocompleter_options_to_be_loaded
+
+ done_status_ids_autocompleter.expect_blank
+ done_status_ids_autocompleter.select_option "Closed"
+ done_status_ids_autocompleter.select_option "Sorta kinda Finished"
+
+ done_status_ids_autocompleter.expect_selected "Closed"
+ done_status_ids_autocompleter.expect_selected "Sorta kinda Finished"
+ done_status_ids_autocompleter.expect_not_disabled "Definition of Done"
+
+ done_status_ids_autocompleter.close_autocompleter
+
+ click_button "Save"
+
+ expect_flash(type: :success, message: "Successful update")
+
+ wait_for_network_idle
+ wait_for_autocompleter_options_to_be_loaded
+
+ done_status_ids_autocompleter.expect_selected "Closed"
+ done_status_ids_autocompleter.expect_selected "Sorta kinda Finished"
+
+ done_status_ids_autocompleter.deselect_option "Sorta kinda Finished"
+
+ click_button "Save"
+
+ wait_for_network_idle
+ wait_for_autocompleter_options_to_be_loaded
+
+ expect_flash(type: :success, message: "Successful update")
+
+ done_status_ids_autocompleter.expect_selected "Closed"
+ done_status_ids_autocompleter.expect_not_selected "Sorta kinda Finished"
+ end
+end
diff --git a/modules/backlogs/spec/features/sprints/create_spec.rb b/modules/backlogs/spec/features/sprints/create_spec.rb
new file mode 100644
index 00000000000..2a3b3a4de17
--- /dev/null
+++ b/modules/backlogs/spec/features/sprints/create_spec.rb
@@ -0,0 +1,208 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "spec_helper"
+require_relative "../../support/pages/backlogs"
+
+RSpec.describe "Create", :js do
+ let(:project) { create(:project) }
+ let(:all_permissions) { %i[view_sprints view_work_packages create_sprints] }
+ let(:permissions) { all_permissions }
+ let(:user) do
+ create(:user, member_with_permissions: { project => permissions })
+ end
+ let(:backlogs_page) { Pages::Backlogs.new(project) }
+
+ let!(:initial_sprint) do
+ create(:agile_sprint,
+ project:,
+ name: "Initial sprint",
+ start_date: Date.new(2025, 9, 5),
+ finish_date: Date.new(2025, 9, 15))
+ end
+
+ let(:story_type) do
+ create(:type_feature)
+ end
+ let(:story_type2) do
+ type = create(:type)
+
+ project.types << type
+
+ type
+ end
+ let(:inactive_story_type) do
+ create(:type)
+ end
+
+ let(:task_type) do
+ type = create(:type_task)
+ project.types << type
+
+ type
+ end
+
+ before do
+ login_as(user)
+
+ # Legacy backlogs module requires type configuration
+ allow(Setting)
+ .to receive(:plugin_openproject_backlogs)
+ .and_return("story_types" => [story_type.id.to_s,
+ story_type2.id.to_s,
+ inactive_story_type.id.to_s],
+ "task_type" => task_type.id.to_s)
+
+ backlogs_page.visit!
+ end
+
+ context "with the feature flag active", with_flag: { scrum_projects: true } do
+ context "with the 'create_sprints' permissions" do
+ let(:start_date) { Date.new(2025, 10, 5) }
+ let(:start_date_fmt) { start_date.strftime("%Y-%m-%d") }
+ let(:finish_date) { Date.new(2025, 10, 20) }
+ let(:finish_date_fmt) { finish_date.strftime("%Y-%m-%d") }
+
+ it "allows creating a new sprint" do
+ backlogs_page.expect_sprint_names_in_order(initial_sprint.name)
+
+ backlogs_page.open_create_sprint_dialog
+
+ within_dialog "New sprint" do
+ page.fill_in "Sprint name", with: "Created sprint"
+ page.fill_in "Start date", with: start_date_fmt
+ page.fill_in "Finish date", with: finish_date_fmt
+
+ click_on "Create"
+ end
+
+ expect_and_dismiss_flash(message: "Successful creation.")
+ backlogs_page.expect_sprint_names_in_order(initial_sprint.name, "Created sprint")
+
+ sprint = project.reload.sprints.last
+ expect(sprint).to be_present
+ expect(sprint.name).to eq "Created sprint"
+ expect(sprint.start_date).to eq start_date
+ expect(sprint.finish_date).to eq finish_date
+ end
+
+ it "previews the sprint duration when changing the dates" do
+ backlogs_page.open_create_sprint_dialog
+
+ within_dialog "New sprint" do
+ expect(page).to have_field "Duration", with: "", readonly: true
+
+ page.fill_in "Start date", with: start_date_fmt
+ page.fill_in "Finish date", with: finish_date_fmt
+
+ expect(page).to have_field "Duration", with: "16 days", readonly: true
+ end
+ end
+
+ describe "validations" do
+ let(:too_early_finish_date) { start_date - 1.day }
+
+ it "validates required fields are present" do
+ backlogs_page.open_create_sprint_dialog
+
+ within_dialog "New sprint" do
+ page.fill_in "Sprint name", with: ""
+
+ click_on "Create"
+
+ expect(page).to have_field "Sprint name", validation_error: "can't be blank"
+ expect(page).to have_field "Start date", validation_error: "can't be blank"
+ expect(page).to have_field "Finish date", validation_error: "can't be blank"
+ end
+ end
+
+ it "validates finish date is not before start date" do
+ backlogs_page.open_create_sprint_dialog
+
+ within_dialog "New sprint" do
+ page.fill_in "Start date", with: start_date_fmt
+ page.fill_in "Finish date", with: too_early_finish_date.strftime("%Y-%m-%d")
+
+ # Shows duration as zero if finish date is before start date:
+ expect(page).to have_field "Duration", with: "0 days", readonly: true
+
+ click_on "Create"
+
+ expect(page).to have_field("Finish date",
+ validation_error: "must be greater than or equal to #{start_date_fmt}")
+ end
+ end
+ end
+
+ describe "proposed sprint names" do
+ let!(:initial_sprint) { nil } # override so that initial sprint is not present
+
+ it "prefilled with 'Sprint 1' if there are no previous sprints" do
+ backlogs_page.open_create_sprint_dialog
+
+ within_dialog "New sprint" do
+ expect(page).to have_field "Sprint name *", with: "Sprint 1", required: true, focused: true
+ end
+ end
+
+ context "with a previous sprint" do
+ before do
+ create(:agile_sprint, name: "Be ambitious 42", project:)
+
+ backlogs_page.visit!
+ backlogs_page.open_create_sprint_dialog
+ end
+
+ it "offers the next sprint name with a number increment" do
+ within_dialog "New sprint" do
+ expect(page).to have_field "Sprint name *", with: "Be ambitious 43"
+ end
+ end
+ end
+ end
+ end
+
+ context "without the necessary permissions" do
+ let(:permissions) { all_permissions - [:create_sprints] }
+
+ it "is missing the 'new sprint' button" do
+ expect(page).to have_no_button "Create"
+ expect(page).not_to have_test_selector("op-sprints--new-sprint-button")
+ end
+ end
+ end
+
+ context "with the feature flag inactive" do
+ it "is missing the 'new sprint' button" do
+ expect(page).to have_no_button "Create"
+ expect(page).not_to have_test_selector("op-sprints--new-sprint-button")
+ end
+ end
+end
diff --git a/modules/backlogs/spec/features/sprints/edit_spec.rb b/modules/backlogs/spec/features/sprints/edit_spec.rb
new file mode 100644
index 00000000000..a41ba4f2ff3
--- /dev/null
+++ b/modules/backlogs/spec/features/sprints/edit_spec.rb
@@ -0,0 +1,192 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "spec_helper"
+require_relative "../../support/pages/backlogs"
+
+RSpec.describe "Edit", :js do
+ let(:project) { create(:project) }
+ let(:all_permissions) { %i[view_sprints add_work_packages view_work_packages create_sprints manage_sprint_items] }
+ let(:permissions) { all_permissions }
+ let(:user) do
+ create(:user, member_with_permissions: { project => permissions })
+ end
+ let(:backlogs_page) { Pages::Backlogs.new(project) }
+
+ let(:story_type) do
+ create(:type_feature)
+ end
+ let(:story_type2) do
+ type = create(:type)
+
+ project.types << type
+
+ type
+ end
+ let(:inactive_story_type) do
+ create(:type)
+ end
+
+ let(:task_type) do
+ type = create(:type_task)
+ project.types << type
+
+ type
+ end
+
+ let!(:closed_sprint) do
+ create(:agile_sprint,
+ project:,
+ status: "completed",
+ start_date: Date.new(2025, 8, 25),
+ finish_date: Date.new(2025, 9, 4))
+ end
+
+ let!(:first_sprint) do
+ create(:agile_sprint,
+ project:,
+ start_date: Date.new(2025, 9, 5),
+ finish_date: Date.new(2025, 9, 15))
+ end
+
+ let!(:second_sprint) do
+ create(:agile_sprint,
+ project:,
+ start_date: Date.new(2025, 9, 16),
+ finish_date: Date.new(2025, 9, 26))
+ end
+
+ let!(:work_package) do
+ create(:work_package, subject: "First work package", project:, sprint: first_sprint, type: story_type)
+ end
+
+ # Necessary so that work packages can be created via dialog
+ shared_let(:default_status) { create(:default_status) }
+ shared_let(:default_priority) { create(:default_priority) }
+
+ before do
+ login_as(user)
+
+ # Legacy backlogs module requires type configuration
+ allow(Setting)
+ .to receive(:plugin_openproject_backlogs)
+ .and_return("story_types" => [story_type.id.to_s,
+ story_type2.id.to_s,
+ inactive_story_type.id.to_s],
+ "task_type" => task_type.id.to_s)
+
+ backlogs_page.visit!
+ end
+
+ context "with the feature flag active", with_flag: { scrum_projects: true } do
+ it "lists all open sprints" do
+ backlogs_page.expect_sprint_names_in_order(first_sprint.name, second_sprint.name)
+
+ backlogs_page.expect_story_in_sprint(work_package, first_sprint)
+ backlogs_page.expect_story_not_in_sprint(work_package, second_sprint)
+ end
+
+ it "adds a work package to a sprint" do
+ backlogs_page.click_in_sprint_menu(first_sprint, "New story")
+ backlogs_page.expect_create_work_package_dialog
+
+ page.within("#create-work-package-dialog") do
+ page.fill_in "Subject", with: "Story created in sprint"
+
+ click_on "Create"
+ end
+
+ wait_for_reload
+
+ expect_and_dismiss_flash type: :success, message: "New work package created and added as a child"
+ created_wp = first_sprint.reload.work_packages.last
+ expect(created_wp.subject).to eq("Story created in sprint")
+ backlogs_page.expect_story_in_sprint(created_wp, first_sprint)
+ end
+
+ context "with the 'create_sprints' permissions" do
+ context "when editing a sprint" do
+ it "displays all menu entries" do
+ backlogs_page.within_sprint_menu(first_sprint) do |menu|
+ expect(menu).to have_selector :menuitem, count: 3
+ expect(menu).to have_selector :menuitem, "Edit sprint"
+ expect(menu).to have_selector :menuitem, "New story"
+ expect(menu).to have_selector :menuitem, "Stories/Tasks"
+ end
+ end
+
+ it "edits the sprint name" do
+ backlogs_page.expect_sprint_names_in_order(first_sprint.name, second_sprint.name)
+
+ backlogs_page.click_in_sprint_menu(first_sprint, "Edit sprint")
+ backlogs_page.expect_sprint_dialog
+
+ within_dialog "Edit sprint" do
+ page.fill_in "Sprint name", with: "Changed name"
+ page.click_button "Save"
+ end
+
+ wait_for_reload
+ backlogs_page.expect_sprint_names_in_order("Changed name", second_sprint.name)
+ end
+
+ context "when lacking the 'manage_sprint_items' permission" do
+ let(:permissions) { all_permissions - %i[manage_sprint_items] }
+
+ it "has no menu entry for creating a new story" do
+ backlogs_page.within_sprint_menu(first_sprint) do |menu|
+ expect(menu).to have_selector :menuitem, count: 2
+ expect(menu).to have_selector :menuitem, "Edit sprint"
+ expect(menu).to have_selector :menuitem, "Stories/Tasks"
+
+ expect(menu).to have_no_selector :menuitem, "New story"
+ end
+ end
+ end
+ end
+ end
+
+ context "without the necessary permissions" do
+ let(:permissions) { all_permissions - [:create_sprints] }
+
+ it "is missing the 'new sprint' button" do
+ expect(page).to have_no_button "Create"
+ expect(page).not_to have_test_selector("op-sprints--new-sprint-button")
+ end
+
+ it "has no menu entry for editing a sprint" do
+ backlogs_page.within_sprint_menu(first_sprint) do |menu|
+ expect(menu).to have_selector :menuitem, "Stories/Tasks"
+ expect(menu).to have_no_selector :menuitem, "Edit sprint"
+ end
+ end
+ end
+ end
+end
diff --git a/modules/backlogs/spec/features/stories_in_backlog_spec.rb b/modules/backlogs/spec/features/stories_in_backlog_spec.rb
index 9c554cb6e21..37dc5efc407 100644
--- a/modules/backlogs/spec/features/stories_in_backlog_spec.rb
+++ b/modules/backlogs/spec/features/stories_in_backlog_spec.rb
@@ -52,12 +52,12 @@ RSpec.describe "Stories in backlog", :js, :settings_reset do
end
let(:role) do
create(:project_role,
- permissions: %i(view_master_backlog
+ permissions: %i(view_sprints
+ manage_sprint_items
add_work_packages
view_work_packages
edit_work_packages
- manage_subtasks
- assign_versions))
+ manage_subtasks))
end
let!(:current_user) do
create(:user,
@@ -144,22 +144,22 @@ RSpec.describe "Stories in backlog", :js, :settings_reset do
it "displays stories in correct order, calculates velocity, and allows editing story points" do
backlogs_page
- .expect_story_in_sprint(sprint_story1, sprint)
+ .expect_story_in_backlog(sprint_story1, sprint)
backlogs_page
- .expect_story_in_sprint(sprint_story2, sprint)
+ .expect_story_in_backlog(sprint_story2, sprint)
backlogs_page
- .expect_story_in_sprint(backlog_story1, backlog)
+ .expect_story_in_backlog(backlog_story1, backlog)
backlogs_page
- .expect_story_not_in_sprint(sprint_story2_parent, sprint)
+ .expect_story_not_in_backlog(sprint_story2_parent, sprint)
backlogs_page
- .expect_story_not_in_sprint(sprint_story1_task, sprint)
+ .expect_story_not_in_backlog(sprint_story1_task, sprint)
backlogs_page
- .expect_story_not_in_sprint(sprint_story_in_other_project, sprint)
+ .expect_story_not_in_backlog(sprint_story_in_other_project, sprint)
backlogs_page
.expect_stories_in_order(sprint, sprint_story1, sprint_story2)
@@ -182,8 +182,8 @@ RSpec.describe "Stories in backlog", :js, :settings_reset do
backlogs_page
.edit_story_in_details_view(sprint_story1, version: backlog)
- backlogs_page.expect_story_not_in_sprint(sprint_story1, sprint)
- backlogs_page.expect_story_in_sprint(sprint_story1, backlog)
+ backlogs_page.expect_story_not_in_backlog(sprint_story1, sprint)
+ backlogs_page.expect_story_in_backlog(sprint_story1, backlog)
end
it "switches the details view from one story to another" do
@@ -191,19 +191,19 @@ RSpec.describe "Stories in backlog", :js, :settings_reset do
.click_in_story_menu(sprint_story1, "Open details view")
backlogs_page.expect_details_view(sprint_story1)
- backlogs_page.expect_story_in_sprint(sprint_story2, sprint)
+ backlogs_page.expect_story_in_backlog(sprint_story2, sprint)
backlogs_page
.click_in_story_menu(sprint_story2, "Open details view")
backlogs_page.expect_details_view(sprint_story2)
- backlogs_page.expect_story_in_sprint(sprint_story1, sprint)
+ backlogs_page.expect_story_in_backlog(sprint_story1, sprint)
end
it "removes story from sprint when type is changed to non-story type via details view" do
backlogs_page
.edit_story_in_details_view(sprint_story2, type: task.name)
- backlogs_page.expect_story_not_in_sprint(sprint_story2, sprint)
+ backlogs_page.expect_story_not_in_backlog(sprint_story2, sprint)
end
end
diff --git a/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb b/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb
index 42af6abe007..f9539baf4c2 100644
--- a/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb
+++ b/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb
@@ -51,12 +51,12 @@ RSpec.describe "Tasks on taskboard", :js,
end
let(:role) do
create(:project_role,
- permissions: %i(view_taskboards
+ permissions: %i(view_sprints
add_work_packages
view_work_packages
edit_work_packages
manage_subtasks
- assign_versions
+ manage_sprint_items
work_package_assigned))
end
let!(:current_user) do
diff --git a/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb b/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb
new file mode 100644
index 00000000000..8d32adaaf88
--- /dev/null
+++ b/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "spec_helper"
+
+RSpec.describe OpenProject::AccessControl, "Backlogs module permissions" do # rubocop:disable RSpec/SpecFilePathFormat
+ describe "view_sprints" do
+ subject { described_class.permission(:view_sprints) }
+
+ it "depends on view_work_packages" do
+ expect(subject.dependencies).to contain_exactly(:view_work_packages)
+ end
+ end
+
+ describe "create_sprints" do
+ subject { described_class.permission(:create_sprints) }
+
+ it "depends on view_sprints" do
+ expect(subject.dependencies).to contain_exactly(:view_sprints)
+ end
+ end
+
+ describe "manage_sprint_items" do
+ subject { described_class.permission(:manage_sprint_items) }
+
+ it "depends on view_sprints, add_work_packages, and edit_work_packages" do
+ expect(subject.dependencies).to contain_exactly(:view_sprints)
+ end
+ end
+
+ describe "start_complete_sprint" do
+ subject { described_class.permission(:start_complete_sprint) }
+
+ it "depends on view_sprints" do
+ expect(subject.dependencies).to contain_exactly(:view_sprints)
+ end
+
+ context "when scrum_projects feature flag is active", with_flag: { scrum_projects: true } do
+ it { is_expected.to be_visible }
+ end
+
+ context "when scrum_projects feature flag is inactive", with_flag: { scrum_projects: false } do
+ it { is_expected.to be_hidden }
+ end
+ end
+
+ describe "share_sprint" do
+ subject { described_class.permission(:share_sprint) }
+
+ it "depends on create_sprints" do
+ expect(subject.dependencies).to contain_exactly(:create_sprints)
+ end
+
+ context "when scrum_projects feature flag is active", with_flag: { scrum_projects: true } do
+ it { is_expected.to be_visible }
+ end
+
+ context "when scrum_projects feature flag is inactive", with_flag: { scrum_projects: false } do
+ it { is_expected.to be_hidden }
+ end
+ end
+end
diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/agile/sprint_spec.rb
index ed1fc3b5628..8aef9d36833 100644
--- a/modules/backlogs/spec/models/agile/sprint_spec.rb
+++ b/modules/backlogs/spec/models/agile/sprint_spec.rb
@@ -54,6 +54,21 @@ RSpec.describe Agile::Sprint do
expect(sprint.errors[:finish_date]).to include(/must be greater than or equal to/)
end
+ it "does not validate finish_date comparison when start_date is nil" do
+ sprint.start_date = nil
+ sprint.finish_date = Time.zone.today
+ expect(sprint).not_to be_valid
+ expect(sprint.errors[:start_date]).to be_present
+ expect(sprint.errors[:finish_date]).not_to include(/must be greater than or equal to/)
+ end
+
+ it "still validates finish_date presence even when start_date is nil" do
+ sprint.start_date = nil
+ sprint.finish_date = nil
+ expect(sprint).not_to be_valid
+ expect(sprint.errors[:finish_date]).to be_present
+ end
+
context "with active sprint validation" do
it "allows one active sprint per project" do
sprint.status = "active"
diff --git a/modules/backlogs/spec/services/impediments/create_services_spec.rb b/modules/backlogs/spec/services/impediments/create_services_spec.rb
index 21012fa323a..da7317501a4 100644
--- a/modules/backlogs/spec/services/impediments/create_services_spec.rb
+++ b/modules/backlogs/spec/services/impediments/create_services_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe Impediments::CreateService do
let(:impediment_subject) { "Impediment A" }
let(:user) { create(:user) }
- let(:role) { create(:project_role, permissions: %i(add_work_packages assign_versions work_package_assigned)) }
+ let(:role) { create(:project_role, permissions: %i(add_work_packages manage_sprint_items work_package_assigned)) }
let(:type_feature) { create(:type_feature) }
let(:type_task) { create(:type_task) }
let(:priority) { create(:priority, is_default: true) }
diff --git a/modules/backlogs/spec/features/resolved_status_spec.rb b/modules/backlogs/spec/services/sprints/create_service_spec.rb
similarity index 59%
rename from modules/backlogs/spec/features/resolved_status_spec.rb
rename to modules/backlogs/spec/services/sprints/create_service_spec.rb
index 3e094570a96..0971ecf565d 100644
--- a/modules/backlogs/spec/features/resolved_status_spec.rb
+++ b/modules/backlogs/spec/services/sprints/create_service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) the OpenProject GmbH
@@ -27,37 +29,11 @@
#++
require "spec_helper"
-require_relative "../support/pages/projects/settings/backlogs"
+require "services/base_services/behaves_like_create_service"
-RSpec.describe "Resolved status" do
- let!(:project) do
- create(:project,
- enabled_module_names: %w(backlogs))
- end
- let!(:status) { create(:status, is_default: true) }
- let(:role) do
- create(:project_role,
- permissions: %i[select_done_statuses])
- end
- let!(:current_user) do
- create(:user,
- member_with_roles: { project => role })
- end
- let(:settings_page) { Pages::Projects::Settings::Backlogs.new(project) }
-
- before do
- login_as current_user
- end
-
- it "allows setting a status as done although it is not closed" do
- settings_page.visit!
-
- check status.name
- click_button "Save"
-
- expect_flash(type: :success, message: "Successful update")
-
- expect(page)
- .to have_checked_field(status.name)
+RSpec.describe Sprints::CreateService, type: :model do
+ it_behaves_like "BaseServices create service" do
+ let(:model_class) { Agile::Sprint }
+ let(:factory) { :agile_sprint }
end
end
diff --git a/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb
new file mode 100644
index 00000000000..f08152ad0e8
--- /dev/null
+++ b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb
@@ -0,0 +1,297 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "spec_helper"
+
+RSpec.describe Sprints::SetAttributesService, type: :model do
+ let(:user) { build_stubbed(:user) }
+ let(:contract_class) do
+ contract = class_double(Sprints::CreateContract)
+
+ allow(contract)
+ .to receive(:new)
+ .with(sprint, user, options: {})
+ .and_return(contract_instance)
+
+ contract
+ end
+ let(:contract_instance) do
+ instance_double(ModelContract, validate: contract_valid, errors: contract_errors)
+ end
+ let(:contract_valid) { true }
+ let(:contract_errors) do
+ instance_double(ActiveModel::Errors)
+ end
+ let(:sprint_valid) { true }
+ let(:instance) do
+ described_class.new(user:,
+ model: sprint,
+ contract_class:,
+ contract_options: {})
+ end
+ let(:project) { create(:project) }
+ let(:sprint) { Agile::Sprint.new }
+ let(:params) { { project: } }
+
+ subject(:service_call) { instance.call(params) }
+
+ describe "call" do
+ before do
+ allow(sprint)
+ .to receive(:valid?)
+ .and_return(sprint_valid)
+
+ allow(sprint).to receive(:save)
+ end
+
+ context "when contract validates and sprint is valid" do
+ it "is successful" do
+ expect(service_call).to be_success
+ end
+
+ it "sets the attributes on the sprint" do
+ service_call
+
+ # Default attributes set include:
+ # * the project, since passed as argument
+ # * a generated sprint sequence name if applicable, see `sprint_name_from_predecessor` specs.
+ expect(sprint.changed_attributes).to include("project_id", "name")
+
+ expect(sprint.project_id).to eq(project.id)
+ expect(sprint.name).to eq("Sprint 1")
+ end
+
+ it "does not persist the sprint" do
+ expect(sprint).not_to have_received(:save)
+
+ service_call
+ end
+ end
+
+ context "when contract does not validate" do
+ let(:contract_valid) { false }
+
+ it "is not successful" do
+ expect(service_call).not_to be_success
+ end
+ end
+
+ context "with params" do
+ let(:params) do
+ {
+ name: "New Sprint Name",
+ start_date: Time.zone.today,
+ finish_date: Time.zone.today + 21.days,
+ status: "active"
+ }
+ end
+
+ before do
+ allow(contract_instance)
+ .to receive(:validate)
+ .and_return(true)
+ end
+
+ it "passes the params to the sprint" do
+ service_call
+
+ expect(sprint.name).to eq("New Sprint Name")
+ expect(sprint.start_date).to eq(Time.zone.today)
+ expect(sprint.finish_date).to eq(Time.zone.today + 21.days)
+ expect(sprint.status).to eq("active")
+ end
+ end
+
+ describe "default attributes" do
+ let(:sprint) { Agile::Sprint.new }
+
+ it "sets default status to in_planning" do
+ service_call
+
+ expect(sprint.status).to eq("in_planning")
+ end
+
+ it "sets default sharing to none" do
+ service_call
+
+ expect(sprint.sharing).to eq("none")
+ end
+
+ context "when status is already set" do
+ let(:sprint) { Agile::Sprint.new(status: "active") }
+
+ it "does not override the existing status" do
+ service_call
+
+ expect(sprint.status).to eq("active")
+ end
+ end
+
+ context "when sharing is already set" do
+ let(:sprint) { Agile::Sprint.new(sharing: "descendants") }
+
+ it "does not override the existing sharing" do
+ service_call
+
+ expect(sprint.sharing).to eq("descendants")
+ end
+ end
+ end
+ end
+
+ describe "assigning a name" do
+ context "when sprint is not a new record" do
+ let(:sprint) { create(:agile_sprint, project:, name: "Existing Sprint") }
+
+ it "assigns the current name" do
+ service_call
+
+ expect(sprint.name).to eq("Existing Sprint")
+ end
+ end
+
+ context "when sprint is a new record" do
+ let(:sprint) { Agile::Sprint.new(project:) }
+
+ context "when there is no predecessor sprint" do
+ it "assigns a default name for the first sprint" do
+ service_call
+
+ expected_name = "#{I18n.t('activerecord.models.sprint')} 1"
+ expect(sprint.name).to eq(expected_name)
+ end
+ end
+
+ context "when there is a predecessor sprint with a name ending in a number" do
+ it "increments the number for single-digit numbers" do
+ create(:agile_sprint, project:, name: "Sprint 1")
+
+ service_call
+ expect(sprint.name).to eq("Sprint 2")
+ end
+
+ it "increments the number for multi-digit numbers" do
+ create(:agile_sprint, project:, name: "Sprint 42")
+
+ service_call
+ expect(sprint.name).to eq("Sprint 43")
+ end
+
+ it "increments the number for custom names ending in numbers" do
+ create(:agile_sprint, project:, name: "Be ambitious 42")
+
+ service_call
+ expect(sprint.name).to eq("Be ambitious 43")
+ end
+
+ it "handles names with multiple spaces before the number" do
+ create(:agile_sprint, project:, name: "Release 99")
+
+ service_call
+ expect(sprint.name).to eq("Release 100")
+ end
+
+ it "increments from 9 to 10" do
+ create(:agile_sprint, project:, name: "Sprint 9")
+
+ service_call
+ expect(sprint.name).to eq("Sprint 10")
+ end
+
+ it "increments from 99 to 100" do
+ create(:agile_sprint, project:, name: "Sprint 99")
+
+ service_call
+ expect(sprint.name).to eq("Sprint 100")
+ end
+ end
+
+ context "when there is a predecessor sprint with a custom name not ending in a number" do
+ it "assigns an empty string" do
+ create(:agile_sprint, project:, name: "Custom Sprint Name")
+
+ service_call
+ expect(sprint.name).to eq("")
+ end
+
+ it "assigns an empty string for names with numbers in the middle" do
+ create(:agile_sprint, project:, name: "Sprint 2023 Planning")
+
+ service_call
+ expect(sprint.name).to eq("")
+ end
+
+ it "assigns an empty string for names ending with non-numeric characters" do
+ create(:agile_sprint, project:, name: "Sprint Alpha")
+
+ service_call
+ expect(sprint.name).to eq("")
+ end
+ end
+
+ context "when there are multiple predecessor sprints" do
+ it "uses the most recent sprint" do
+ create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago)
+ create(:agile_sprint, project:, name: "Sprint 2", created_at: 1.day.ago)
+
+ service_call
+ expect(sprint.name).to eq("Sprint 3")
+ end
+
+ it "handles mixed naming patterns by using the most recent" do
+ create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago)
+ create(:agile_sprint, project:, name: "Custom Name", created_at: 1.day.ago)
+
+ service_call
+ expect(sprint.name).to eq("")
+ end
+ end
+
+ context "when there are sprints in other projects" do
+ let(:other_project) { create(:project) }
+
+ it "ignores sprints from other projects" do
+ create(:agile_sprint, project: other_project, name: "Other Sprint 5")
+
+ service_call
+ expect(sprint.name).to eq("#{I18n.t('activerecord.models.sprint')} 1")
+ end
+
+ it "only considers sprints from the same project" do
+ create(:agile_sprint, project: other_project, name: "Other Sprint 5")
+ create(:agile_sprint, project:, name: "Sprint 3")
+
+ service_call
+ expect(sprint.name).to eq("Sprint 4")
+ end
+ end
+ end
+ end
+end
diff --git a/modules/backlogs/spec/services/stories/create_service_spec.rb b/modules/backlogs/spec/services/stories/create_service_spec.rb
index 0ee06ac9d8f..87483c4a055 100644
--- a/modules/backlogs/spec/services/stories/create_service_spec.rb
+++ b/modules/backlogs/spec/services/stories/create_service_spec.rb
@@ -35,7 +35,7 @@ RSpec.describe Stories::CreateService, type: :model do
let(:type_feature) { create(:type_feature) }
let(:user) do
- create(:user, member_with_permissions: { project => %i(add_work_packages manage_subtasks assign_versions) })
+ create(:user, member_with_permissions: { project => %i(add_work_packages manage_subtasks manage_sprint_items) })
end
let(:instance) do
diff --git a/modules/backlogs/spec/support/pages/backlogs.rb b/modules/backlogs/spec/support/pages/backlogs.rb
index d3c88f85406..2006e49fb4b 100644
--- a/modules/backlogs/spec/support/pages/backlogs.rb
+++ b/modules/backlogs/spec/support/pages/backlogs.rb
@@ -100,6 +100,12 @@ module Pages
end
end
+ def click_in_sprint_menu(sprint, item_name)
+ within_sprint_menu(sprint) do |menu|
+ menu.find(:menuitem, text: item_name).click
+ end
+ end
+
def click_in_story_menu(story, item_name)
within_story_menu(story) do |menu|
menu.find(:menuitem, text: item_name).click
@@ -119,6 +125,14 @@ module Pages
end
end
+ def sprint_names_in_order
+ page.find_all("#sprint_backlogs_container > section .CollapsibleHeader-title").map(&:text)
+ end
+
+ def expect_sprint_names_in_order(*sprint_names)
+ expect(sprint_names_in_order).to eq(sprint_names)
+ end
+
def expect_sprint(sprint)
expect(page)
.to have_css("#sprint_backlogs_container #{backlog_selector(sprint)}")
@@ -130,14 +144,28 @@ module Pages
end
def expect_story_in_sprint(story, sprint)
- within_backlog(sprint) do
+ within_sprint(sprint) do
+ expect(page)
+ .to have_selector(work_package_selector(story).to_s)
+ end
+ end
+
+ def expect_story_in_backlog(story, backlog)
+ within_backlog(backlog) do
expect(page)
.to have_selector(story_selector(story).to_s)
end
end
def expect_story_not_in_sprint(story, sprint)
- within_backlog(sprint) do
+ within_sprint(sprint) do
+ expect(page)
+ .to have_no_selector(work_package_selector(story).to_s)
+ end
+ end
+
+ def expect_story_not_in_backlog(story, backlog)
+ within_backlog(backlog) do
expect(page)
.to have_no_selector(story_selector(story).to_s)
end
@@ -205,6 +233,30 @@ module Pages
details_view
end
+ def open_create_sprint_dialog
+ find(:button, accessible_name: "Create").click
+
+ within(:menu) do |menu|
+ menu.find(:menuitem, "Sprint").click
+ end
+ end
+
+ def expect_sprint_dialog
+ expect(page).to have_css("#new-sprint-dialog")
+ end
+
+ def expect_create_work_package_dialog
+ expect(page).to have_css("#create-work-package-dialog")
+ end
+
+ def within_sprint_menu(backlog, &)
+ within_sprint(backlog) do
+ find(:button, accessible_name: "Sprint actions").click
+
+ within(:menu, &)
+ end
+ end
+
private
def within_story(story, &)
@@ -215,6 +267,14 @@ module Pages
within(backlog_selector(backlog), &)
end
+ def within_sprint(sprint, &)
+ within(sprint_selector(sprint), &)
+ end
+
+ def sprint_selector(sprint)
+ "#agile_sprint_#{sprint.id}"
+ end
+
def backlog_selector(backlog)
"#backlog_#{backlog.id}"
end
@@ -223,6 +283,10 @@ module Pages
"#story_#{story.id}"
end
+ def work_package_selector(story)
+ "#work_package_#{story.id}"
+ end
+
def within_menu_controlled_by(button)
menu_id = button[:controls] || button["aria-controls"]
diff --git a/modules/backlogs/spec/views/rb_master_backlogs/index.html.erb_spec.rb b/modules/backlogs/spec/views/rb_master_backlogs/index.html.erb_spec.rb
index 251ffd4eb36..ae8002731e9 100644
--- a/modules/backlogs/spec/views/rb_master_backlogs/index.html.erb_spec.rb
+++ b/modules/backlogs/spec/views/rb_master_backlogs/index.html.erb_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe "rb_master_backlogs/index" do
let(:user) { create(:user) }
let(:role_allowed) do
create(:project_role,
- permissions: %i[view_master_backlog view_taskboards])
+ permissions: %i[view_sprints])
end
let(:statuses) do
[create(:status, is_default: true),
diff --git a/modules/bim/config/locales/crowdin/fr.yml b/modules/bim/config/locales/crowdin/fr.yml
index 717608ff597..288904f98e5 100644
--- a/modules/bim/config/locales/crowdin/fr.yml
+++ b/modules/bim/config/locales/crowdin/fr.yml
@@ -59,7 +59,7 @@ fr:
perform_description: "Voulez-vous importer ou mettre à jour les problèmes repris ci-dessus ?"
replace_with_system_user: 'Les remplacer par l''utilisateur "Système"'
import_as_system_user: 'Les importer comme utilisateur "Système".'
- what_to_do: "Que voulez-vous faire ?"
+ what_to_do: "Que voulez-vous faire?"
work_package_has_newer_changes: "Obsolète ! Ce sujet n'a pas été mis à jour, car les derniers changements sur le serveur étaient plus récents que la \"ModifiedDate\" du sujet importé. Toutefois, les commentaires sur le sujet ont été importés."
bcf_file_not_found: "Impossible de localiser le fichier BCF. Veuillez recommencer le processus de téléversement."
export:
diff --git a/modules/budgets/config/locales/crowdin/cs.yml b/modules/budgets/config/locales/crowdin/cs.yml
index 04414639a22..765bb62a1c2 100644
--- a/modules/budgets/config/locales/crowdin/cs.yml
+++ b/modules/budgets/config/locales/crowdin/cs.yml
@@ -27,7 +27,7 @@ cs:
budget:
author: "Autor"
available: "Dostupné"
- budget: "Plánované"
+ budget: "Rozpočet"
budget_ratio: "Stráveno (poměr)"
description: "Popis"
spent: "Strávený čas"
diff --git a/modules/costs/app/views/admin/costs_settings/show.html.erb b/modules/costs/app/views/admin/costs_settings/show.html.erb
index dab2f65b85f..bce17b94489 100644
--- a/modules/costs/app/views/admin/costs_settings/show.html.erb
+++ b/modules/costs/app/views/admin/costs_settings/show.html.erb
@@ -42,8 +42,19 @@ See COPYRIGHT and LICENSE files for more details.
subhead.with_description { I18n.t(:description_costs_settings) }
end
end
- form.text_field(name: :costs_currency, input_width: :small)
- form.text_field(name: :costs_currency_format, input_width: :small)
+ form.text_field(
+ name: :costs_currency,
+ input_width: :xsmall,
+ caption: I18n.t(:setting_costs_currency_caption)
+ )
+ form.select_list(
+ name: :costs_currency_format,
+ values: [
+ [I18n.t(:setting_costs_currency_format_prefix), "%u %n"],
+ [I18n.t(:setting_costs_currency_format_suffix), "%n %u"]
+ ],
+ input_width: :small
+ )
form.submit
end
diff --git a/modules/costs/config/locales/crowdin/af.yml b/modules/costs/config/locales/crowdin/af.yml
index 47f433ce4a2..751d3217cb5 100644
--- a/modules/costs/config/locales/crowdin/af.yml
+++ b/modules/costs/config/locales/crowdin/af.yml
@@ -205,7 +205,10 @@ af:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/ar.yml b/modules/costs/config/locales/crowdin/ar.yml
index 4ed12ceec3f..da16cf9e48b 100644
--- a/modules/costs/config/locales/crowdin/ar.yml
+++ b/modules/costs/config/locales/crowdin/ar.yml
@@ -221,7 +221,10 @@ ar:
project_module_costs: "الوقت والتكاليف"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "العملة"
- setting_costs_currency_format: "شكل العملة"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/az.yml b/modules/costs/config/locales/crowdin/az.yml
index 8dd172a1778..65ed5f3dc8d 100644
--- a/modules/costs/config/locales/crowdin/az.yml
+++ b/modules/costs/config/locales/crowdin/az.yml
@@ -205,7 +205,10 @@ az:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/be.yml b/modules/costs/config/locales/crowdin/be.yml
index 1d3ed4a73f5..81fb4101aa6 100644
--- a/modules/costs/config/locales/crowdin/be.yml
+++ b/modules/costs/config/locales/crowdin/be.yml
@@ -213,7 +213,10 @@ be:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/bg.yml b/modules/costs/config/locales/crowdin/bg.yml
index 04d8a0d1140..6333adb7007 100644
--- a/modules/costs/config/locales/crowdin/bg.yml
+++ b/modules/costs/config/locales/crowdin/bg.yml
@@ -205,7 +205,10 @@ bg:
project_module_costs: "Време и разходи"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Валута"
- setting_costs_currency_format: "Формат на валутата"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/ca.yml b/modules/costs/config/locales/crowdin/ca.yml
index 4cc7f217213..d821577627d 100644
--- a/modules/costs/config/locales/crowdin/ca.yml
+++ b/modules/costs/config/locales/crowdin/ca.yml
@@ -205,7 +205,10 @@ ca:
project_module_costs: "Temps i costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Divisa"
- setting_costs_currency_format: "Format de divisa"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/ckb-IR.yml b/modules/costs/config/locales/crowdin/ckb-IR.yml
index eec8fb8766c..7edece35005 100644
--- a/modules/costs/config/locales/crowdin/ckb-IR.yml
+++ b/modules/costs/config/locales/crowdin/ckb-IR.yml
@@ -205,7 +205,10 @@ ckb-IR:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/cs.yml b/modules/costs/config/locales/crowdin/cs.yml
index 44770e3f145..85d249a63ce 100644
--- a/modules/costs/config/locales/crowdin/cs.yml
+++ b/modules/costs/config/locales/crowdin/cs.yml
@@ -213,7 +213,10 @@ cs:
project_module_costs: "Čas a náklady"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Měna"
- setting_costs_currency_format: "Formát měny"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/da.yml b/modules/costs/config/locales/crowdin/da.yml
index f7259e00f2c..7b576f85061 100644
--- a/modules/costs/config/locales/crowdin/da.yml
+++ b/modules/costs/config/locales/crowdin/da.yml
@@ -205,7 +205,10 @@ da:
project_module_costs: "Tid og omkostninger"
setting_allow_tracking_start_and_end_times: "Tillad start- og sluttider"
setting_costs_currency: "Valuta"
- setting_costs_currency_format: "Valutaformat"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Kræv start- og sluttider"
setting_enforce_without_allow: "Det er ikke muligt at kræve start- og sluttider uden at tillade dem"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/de.yml b/modules/costs/config/locales/crowdin/de.yml
index 67123a735df..f4ab9eb9320 100644
--- a/modules/costs/config/locales/crowdin/de.yml
+++ b/modules/costs/config/locales/crowdin/de.yml
@@ -205,7 +205,10 @@ de:
project_module_costs: "Zeit und Kosten"
setting_allow_tracking_start_and_end_times: "Start- und Endzeiten erlaubt"
setting_costs_currency: "Währung"
+ setting_costs_currency_caption: "Dies ist die Einheit der Währung. Es kann ein ISO-Code mit drei Buchstaben wie EUR, USD oder JPY sein oder ein Symbol wie €, $ oder ¥."
setting_costs_currency_format: "Format der Währung"
+ setting_costs_currency_format_prefix: "Vor der Zahl (z.B. EUR 100)"
+ setting_costs_currency_format_suffix: "Nach der Zahl (z.B. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Start- und Endzeiten erforderlich"
setting_enforce_without_allow: "Start und Endzeiten können nur erforderlich sein, wenn ihre Angabe erlaubt ist"
setting_allow_tracking_start_and_end_times_caption: "Erlaubt es bei der Zeitbuchung die genaue Start- und Endzeiten der Buchung zu erfassen."
diff --git a/modules/costs/config/locales/crowdin/el.yml b/modules/costs/config/locales/crowdin/el.yml
index 32a780bbc69..efef01b9b87 100644
--- a/modules/costs/config/locales/crowdin/el.yml
+++ b/modules/costs/config/locales/crowdin/el.yml
@@ -205,7 +205,10 @@ el:
project_module_costs: "Χρόνος και κόστος"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Νόμισμα"
- setting_costs_currency_format: "Μορφοποίηση του νομίσματος"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/eo.yml b/modules/costs/config/locales/crowdin/eo.yml
index aa4d5f4f3db..841aa1a8e71 100644
--- a/modules/costs/config/locales/crowdin/eo.yml
+++ b/modules/costs/config/locales/crowdin/eo.yml
@@ -205,7 +205,10 @@ eo:
project_module_costs: "Tempo kaj kostoj"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Valuto"
- setting_costs_currency_format: "Formato de valuto"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/es.yml b/modules/costs/config/locales/crowdin/es.yml
index 2760820cf51..26f864fe58c 100644
--- a/modules/costs/config/locales/crowdin/es.yml
+++ b/modules/costs/config/locales/crowdin/es.yml
@@ -205,7 +205,10 @@ es:
project_module_costs: "Tiempo y costos"
setting_allow_tracking_start_and_end_times: "Permitir horas de inicio y finalización"
setting_costs_currency: "Moneda"
- setting_costs_currency_format: "Formato de moneda"
+ setting_costs_currency_caption: "Se refiere a la unidad monetaria. Puede ser un código ISO de tres letras, como EUR, USD o JPY, o un símbolo, como €, $ o ¥."
+ setting_costs_currency_format: "Formato de la moneda"
+ setting_costs_currency_format_prefix: "Antes del importe (por ejemplo, EUR 100)"
+ setting_costs_currency_format_suffix: "Después del importe (por ejemplo, 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Requerir horas de inicio y finalización"
setting_enforce_without_allow: "No es posible requerir horas de inicio y finalización sin permitirlas antes"
setting_allow_tracking_start_and_end_times_caption: "Habilita la introducción de las horas de inicio y finalización cuando se registra tiempo."
diff --git a/modules/costs/config/locales/crowdin/et.yml b/modules/costs/config/locales/crowdin/et.yml
index 7048db1c4f0..a16f0a3a120 100644
--- a/modules/costs/config/locales/crowdin/et.yml
+++ b/modules/costs/config/locales/crowdin/et.yml
@@ -205,7 +205,10 @@ et:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Valuuta"
- setting_costs_currency_format: "Valuuta vorming"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/eu.yml b/modules/costs/config/locales/crowdin/eu.yml
index 85fa6da2032..b98c75d8e89 100644
--- a/modules/costs/config/locales/crowdin/eu.yml
+++ b/modules/costs/config/locales/crowdin/eu.yml
@@ -205,7 +205,10 @@ eu:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/fa.yml b/modules/costs/config/locales/crowdin/fa.yml
index e34f625945c..887fb6e5159 100644
--- a/modules/costs/config/locales/crowdin/fa.yml
+++ b/modules/costs/config/locales/crowdin/fa.yml
@@ -205,7 +205,10 @@ fa:
project_module_costs: "زمان و هزینهها"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "واحد پول"
- setting_costs_currency_format: "فرمت واحد پول"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "درخواست زمان های شروع و پایان"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/fi.yml b/modules/costs/config/locales/crowdin/fi.yml
index 015e9ba4d91..2a157dd17f8 100644
--- a/modules/costs/config/locales/crowdin/fi.yml
+++ b/modules/costs/config/locales/crowdin/fi.yml
@@ -205,7 +205,10 @@ fi:
project_module_costs: "Työaika ja kustannukset"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Valuutta"
- setting_costs_currency_format: "Valuuttamuotoilu"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/fil.yml b/modules/costs/config/locales/crowdin/fil.yml
index db83689193b..85d811e3543 100644
--- a/modules/costs/config/locales/crowdin/fil.yml
+++ b/modules/costs/config/locales/crowdin/fil.yml
@@ -205,7 +205,10 @@ fil:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/fr.yml b/modules/costs/config/locales/crowdin/fr.yml
index 0164a551c16..74712cab846 100644
--- a/modules/costs/config/locales/crowdin/fr.yml
+++ b/modules/costs/config/locales/crowdin/fr.yml
@@ -205,7 +205,10 @@ fr:
project_module_costs: "Temps et coûts"
setting_allow_tracking_start_and_end_times: "Autoriser les heures de début et de fin"
setting_costs_currency: "Devise"
+ setting_costs_currency_caption: "Il s'agit de l'unité monétaire. Il peut s'agir d'un code ISO à trois lettres comme EUR, USD ou JPY ou d'un symbole comme €, $ ou ¥."
setting_costs_currency_format: "Format de devise"
+ setting_costs_currency_format_prefix: "Avant le nombre (par exemple 100 EUR)"
+ setting_costs_currency_format_suffix: "Après le nombre (par exemple 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Exiger les heures de début et de fin"
setting_enforce_without_allow: "Il est nécessaire d'autoriser les heures de début et de fin pour pouvoir les exiger"
setting_allow_tracking_start_and_end_times_caption: "Active la saisie des heures de début et de fin lors de la journalisation."
diff --git a/modules/costs/config/locales/crowdin/he.yml b/modules/costs/config/locales/crowdin/he.yml
index 53257a7a46e..b4369f9a43c 100644
--- a/modules/costs/config/locales/crowdin/he.yml
+++ b/modules/costs/config/locales/crowdin/he.yml
@@ -213,7 +213,10 @@ he:
project_module_costs: "עלויות"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/hi.yml b/modules/costs/config/locales/crowdin/hi.yml
index 53b1f3f0ecf..19a1e050859 100644
--- a/modules/costs/config/locales/crowdin/hi.yml
+++ b/modules/costs/config/locales/crowdin/hi.yml
@@ -205,7 +205,10 @@ hi:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/hr.yml b/modules/costs/config/locales/crowdin/hr.yml
index af8cb7a88c7..06377b288c7 100644
--- a/modules/costs/config/locales/crowdin/hr.yml
+++ b/modules/costs/config/locales/crowdin/hr.yml
@@ -209,7 +209,10 @@ hr:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Valuta"
- setting_costs_currency_format: "Oblik valute"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/hu.yml b/modules/costs/config/locales/crowdin/hu.yml
index b6c633e2a7e..ab70582879a 100644
--- a/modules/costs/config/locales/crowdin/hu.yml
+++ b/modules/costs/config/locales/crowdin/hu.yml
@@ -205,7 +205,10 @@ hu:
project_module_costs: "Idő és költség"
setting_allow_tracking_start_and_end_times: "Engedélyezze a kezdési és befejezési időpontokat"
setting_costs_currency: "Pénznem"
- setting_costs_currency_format: "Pénznem formátuma"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Kezdési és befejezési idő megadása kötelező"
setting_enforce_without_allow: "A kezdési és befejezési idő megkövetelése nem lehetséges anélkül, hogy engedélyeznénk azok megadását"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/id.yml b/modules/costs/config/locales/crowdin/id.yml
index 05efe611b10..fa8b2ca0329 100644
--- a/modules/costs/config/locales/crowdin/id.yml
+++ b/modules/costs/config/locales/crowdin/id.yml
@@ -201,7 +201,10 @@ id:
project_module_costs: "Waktu dan biaya"
setting_allow_tracking_start_and_end_times: "Izinkan waktu mulai dan waktu selesai"
setting_costs_currency: "Mata Uang"
- setting_costs_currency_format: "Format mata uang"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Butuh waktu mulai dan selesai"
setting_enforce_without_allow: "Membutuhkan waktu mulai dan selesai tidak mungkin dilakukan tanpa mengizinkannya"
setting_allow_tracking_start_and_end_times_caption: "Memungkinkan untuk memasukkan waktu mulai dan selesai saat mencatat waktu."
diff --git a/modules/costs/config/locales/crowdin/it.yml b/modules/costs/config/locales/crowdin/it.yml
index f7c0cf849d7..bd91938ee28 100644
--- a/modules/costs/config/locales/crowdin/it.yml
+++ b/modules/costs/config/locales/crowdin/it.yml
@@ -205,7 +205,10 @@ it:
project_module_costs: "Tempi e costi"
setting_allow_tracking_start_and_end_times: "Consenti orari di inizio e fine"
setting_costs_currency: "Valuta"
- setting_costs_currency_format: "Formato della valuta"
+ setting_costs_currency_caption: "Questa è l'unità di valuta. Può essere un codice ISO a tre lettere come EUR, USD o JPY o un simbolo come €, $ o 한."
+ setting_costs_currency_format: "Formato valuta"
+ setting_costs_currency_format_prefix: "Prima del numero (ad esempio, EUR 100)"
+ setting_costs_currency_format_suffix: "Dopo il numero (ad esempio, 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Richiede orari di inizio e di fine"
setting_enforce_without_allow: "Non è possibile richiedere orari di inizio e fine senza consentirli"
setting_allow_tracking_start_and_end_times_caption: "Consente di inserire gli orari di inizio e di fine durante la registrazione dell'orario."
diff --git a/modules/costs/config/locales/crowdin/ja.yml b/modules/costs/config/locales/crowdin/ja.yml
index a5c5f462667..20532a2611f 100644
--- a/modules/costs/config/locales/crowdin/ja.yml
+++ b/modules/costs/config/locales/crowdin/ja.yml
@@ -201,11 +201,14 @@ ja:
project_module_costs: "時間とコスト"
setting_allow_tracking_start_and_end_times: "開始時間と終了時間を許可する"
setting_costs_currency: "通貨"
- setting_costs_currency_format: "通貨の形式"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "開始/終了時間を必須とする"
setting_enforce_without_allow: "開始時間と終了時間を要求することは許可されていないとできません"
setting_allow_tracking_start_and_end_times_caption: "時間を記録する際に、開始時間と終了時間を入力できるようにする。"
- setting_enforce_tracking_start_and_end_times_caption: "時間を記録する際、開始時間と終了時間の入力を必須にします。"
+ setting_enforce_tracking_start_and_end_times_caption: "時間を記録する際、開始時間と終了時間の入力が必須となる。"
text_assign_time_and_cost_entries_to_project: "報告された時間とコストをプロジェクトに割り当てる"
text_destroy_cost_entries_question: "削除しようとしているワークパッケージが%{cost_entries} 件報告されました。どうしますか?"
text_destroy_time_and_cost_entries: "報告された時間とコストを削除する"
diff --git a/modules/costs/config/locales/crowdin/ka.yml b/modules/costs/config/locales/crowdin/ka.yml
index 3db3c1d8f2a..82f1853414e 100644
--- a/modules/costs/config/locales/crowdin/ka.yml
+++ b/modules/costs/config/locales/crowdin/ka.yml
@@ -205,7 +205,10 @@ ka:
project_module_costs: "დრო და ღირებულებები"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "ფული"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/kk.yml b/modules/costs/config/locales/crowdin/kk.yml
index 57d9130f893..ad2aa157d7b 100644
--- a/modules/costs/config/locales/crowdin/kk.yml
+++ b/modules/costs/config/locales/crowdin/kk.yml
@@ -205,7 +205,10 @@ kk:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/ko.yml b/modules/costs/config/locales/crowdin/ko.yml
index 9d67d328248..3d1a75f7ab3 100644
--- a/modules/costs/config/locales/crowdin/ko.yml
+++ b/modules/costs/config/locales/crowdin/ko.yml
@@ -201,7 +201,10 @@ ko:
project_module_costs: "시간 및 비용"
setting_allow_tracking_start_and_end_times: "시작 및 완료 시간 허용"
setting_costs_currency: "통화"
+ setting_costs_currency_caption: "통화 단위입니다. EUR, USD, JPY 같은 문자 세 개의 ISO 코드 또는 €, $, ¥ 같은 기호일 수 있습니다."
setting_costs_currency_format: "통화 형식"
+ setting_costs_currency_format_prefix: "숫자 앞(예: EUR 100)"
+ setting_costs_currency_format_suffix: "숫자 뒤(예: 100 EUR)"
setting_enforce_tracking_start_and_end_times: "시작 및 완료 시간 필요"
setting_enforce_without_allow: "이 옵션을 허용하지 않으면 시작 및 완료 시간 요구가 가능하지 않습니다"
setting_allow_tracking_start_and_end_times_caption: "시간을 기록할 때 시작 및 완료 시간 입력을 활성화합니다."
diff --git a/modules/costs/config/locales/crowdin/lt.yml b/modules/costs/config/locales/crowdin/lt.yml
index 31165c017ae..e8fac6161b9 100644
--- a/modules/costs/config/locales/crowdin/lt.yml
+++ b/modules/costs/config/locales/crowdin/lt.yml
@@ -213,7 +213,10 @@ lt:
project_module_costs: "Laikas ir išlaidos"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Valiuta"
- setting_costs_currency_format: "Valiutos formatas"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/lv.yml b/modules/costs/config/locales/crowdin/lv.yml
index 09984b6795f..c9acdae640b 100644
--- a/modules/costs/config/locales/crowdin/lv.yml
+++ b/modules/costs/config/locales/crowdin/lv.yml
@@ -209,7 +209,10 @@ lv:
project_module_costs: "Laiks un izmaksas"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Valūta"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/mn.yml b/modules/costs/config/locales/crowdin/mn.yml
index c3962b2b876..f5ba49c5f68 100644
--- a/modules/costs/config/locales/crowdin/mn.yml
+++ b/modules/costs/config/locales/crowdin/mn.yml
@@ -205,7 +205,10 @@ mn:
project_module_costs: "Цаг хугацаа ба зардал"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/ms.yml b/modules/costs/config/locales/crowdin/ms.yml
index 328e1d78d0c..17eb61b6ee3 100644
--- a/modules/costs/config/locales/crowdin/ms.yml
+++ b/modules/costs/config/locales/crowdin/ms.yml
@@ -201,7 +201,10 @@ ms:
project_module_costs: "Masa dan kos"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Mata Wang"
- setting_costs_currency_format: "Format mata wang"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/ne.yml b/modules/costs/config/locales/crowdin/ne.yml
index 29448b1bb88..3ec82ad2b7f 100644
--- a/modules/costs/config/locales/crowdin/ne.yml
+++ b/modules/costs/config/locales/crowdin/ne.yml
@@ -205,7 +205,10 @@ ne:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/nl.yml b/modules/costs/config/locales/crowdin/nl.yml
index b8b072b92b7..657b6b1045c 100644
--- a/modules/costs/config/locales/crowdin/nl.yml
+++ b/modules/costs/config/locales/crowdin/nl.yml
@@ -205,7 +205,10 @@ nl:
project_module_costs: "Tijd en kosten"
setting_allow_tracking_start_and_end_times: "Begin- en eindtijden toestaan"
setting_costs_currency: "Valuta"
- setting_costs_currency_format: "Formaat van valuta"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Begin- en eindtijden vereisen"
setting_enforce_without_allow: "Het is niet mogelijk om begin- en eindtijden te vereisen zonder ze toe te staan"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/no.yml b/modules/costs/config/locales/crowdin/no.yml
index 9b230900978..04be7016cc3 100644
--- a/modules/costs/config/locales/crowdin/no.yml
+++ b/modules/costs/config/locales/crowdin/no.yml
@@ -205,7 +205,10 @@
project_module_costs: "Tid og kostnader"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Valuta"
- setting_costs_currency_format: "Formatet på valuta"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/pl.yml b/modules/costs/config/locales/crowdin/pl.yml
index 21fdaf3ba2b..b5baf20cc3e 100644
--- a/modules/costs/config/locales/crowdin/pl.yml
+++ b/modules/costs/config/locales/crowdin/pl.yml
@@ -213,7 +213,10 @@ pl:
project_module_costs: "Czas i koszty"
setting_allow_tracking_start_and_end_times: "Zezwól na czasy rozpoczęcia i zakończenia"
setting_costs_currency: "Waluta"
+ setting_costs_currency_caption: "Jest to jednostka waluty. Może to być trzyliterowy kod ISO, taki jak EUR, USD lub JPY albo symbol, taki jak €, $ lub ¥."
setting_costs_currency_format: "Format waluty"
+ setting_costs_currency_format_prefix: "Przed liczbą (np. EUR 100)"
+ setting_costs_currency_format_suffix: "Po liczbie (np. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Wymagaj czasów rozpoczęcia i zakończenia"
setting_enforce_without_allow: "Nie można wymagać czasów rozpoczęcia i zakończenia bez zezwolenia na nie"
setting_allow_tracking_start_and_end_times_caption: "Umożliwia wprowadzenie czasów rozpoczęcia i zakończenia w razie rejestrowania czasu."
diff --git a/modules/costs/config/locales/crowdin/pt-BR.yml b/modules/costs/config/locales/crowdin/pt-BR.yml
index a80308e2a7b..85049ad6152 100644
--- a/modules/costs/config/locales/crowdin/pt-BR.yml
+++ b/modules/costs/config/locales/crowdin/pt-BR.yml
@@ -205,7 +205,10 @@ pt-BR:
project_module_costs: "Tempo e custos"
setting_allow_tracking_start_and_end_times: "Permitir horários de início e de término"
setting_costs_currency: "Moeda"
- setting_costs_currency_format: "Formato de moeda"
+ setting_costs_currency_caption: "Esta é a moeda utilizada. Pode ser representada por um código ISO de três letras, como EUR, USD ou JPY, ou por um símbolo, como €, $ ou ¥."
+ setting_costs_currency_format: "Formato da moeda"
+ setting_costs_currency_format_prefix: "Antes do valor (por exemplo: EUR 100)"
+ setting_costs_currency_format_suffix: "Após o valor (por exemplo: 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Exigir horários de início e término"
setting_enforce_without_allow: "Exigir os horários de início e término não é possível sem habilitá-los"
setting_allow_tracking_start_and_end_times_caption: "Ativa a inserção de horários de início e término ao registrar o tempo."
diff --git a/modules/costs/config/locales/crowdin/pt-PT.yml b/modules/costs/config/locales/crowdin/pt-PT.yml
index f54963fc1f2..80651578281 100644
--- a/modules/costs/config/locales/crowdin/pt-PT.yml
+++ b/modules/costs/config/locales/crowdin/pt-PT.yml
@@ -205,7 +205,10 @@ pt-PT:
project_module_costs: "Tempo e custos"
setting_allow_tracking_start_and_end_times: "Permitir horário de início e término"
setting_costs_currency: "Moeda"
- setting_costs_currency_format: "Formato de moeda"
+ setting_costs_currency_caption: "Esta é a unidade monetária. Pode ser um código ISO de três letras como EUR, USD ou JPY ou um símbolo como €, $ ou ¥."
+ setting_costs_currency_format: "Formato da moeda"
+ setting_costs_currency_format_prefix: "Antes do número (por exemplo, 100 euros)"
+ setting_costs_currency_format_suffix: "Após o número (por exemplo, 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Exigir hora de início e término"
setting_enforce_without_allow: "Não é possível exigir horas de início e de fim sem as autorizar"
setting_allow_tracking_start_and_end_times_caption: "Permite introduzir as horas de início e de término ao registar o tempo."
diff --git a/modules/costs/config/locales/crowdin/ro.yml b/modules/costs/config/locales/crowdin/ro.yml
index 3cce081e02b..e1e0ace856c 100644
--- a/modules/costs/config/locales/crowdin/ro.yml
+++ b/modules/costs/config/locales/crowdin/ro.yml
@@ -209,7 +209,10 @@ ro:
project_module_costs: "Timp și costuri"
setting_allow_tracking_start_and_end_times: "Permite orele de început și de sfârșit"
setting_costs_currency: "Monedă"
- setting_costs_currency_format: "Format monedă"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Cere orele de început și de sfârșit"
setting_enforce_without_allow: "Solicitarea orelor de început și de sfârșit nu este posibilă fără a le permite"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/ru.yml b/modules/costs/config/locales/crowdin/ru.yml
index 244a4596166..69f9ca319be 100644
--- a/modules/costs/config/locales/crowdin/ru.yml
+++ b/modules/costs/config/locales/crowdin/ru.yml
@@ -213,7 +213,10 @@ ru:
project_module_costs: "Время и затраты"
setting_allow_tracking_start_and_end_times: "Разрешить время начала и окончания"
setting_costs_currency: "Валюта"
+ setting_costs_currency_caption: "Это единица валюты. Это может быть трехбуквенный код ISO, например, EUR, USD или JPY, или символ, например, €, $ или ¥."
setting_costs_currency_format: "Формат валюты"
+ setting_costs_currency_format_prefix: "Перед числом (например, EUR 100)"
+ setting_costs_currency_format_suffix: "После числа (например, 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Требуется время начала и окончания"
setting_enforce_without_allow: "Требование точного времени невозможно без соответствующего разрешения"
setting_allow_tracking_start_and_end_times_caption: "Включает время начала и окончания учета."
diff --git a/modules/costs/config/locales/crowdin/rw.yml b/modules/costs/config/locales/crowdin/rw.yml
index 5e4e44e7a8e..20e2547d233 100644
--- a/modules/costs/config/locales/crowdin/rw.yml
+++ b/modules/costs/config/locales/crowdin/rw.yml
@@ -205,7 +205,10 @@ rw:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/si.yml b/modules/costs/config/locales/crowdin/si.yml
index 2308be376ca..208b3042c6e 100644
--- a/modules/costs/config/locales/crowdin/si.yml
+++ b/modules/costs/config/locales/crowdin/si.yml
@@ -205,7 +205,10 @@ si:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/sk.yml b/modules/costs/config/locales/crowdin/sk.yml
index 18439ac2f68..6c8bc919c75 100644
--- a/modules/costs/config/locales/crowdin/sk.yml
+++ b/modules/costs/config/locales/crowdin/sk.yml
@@ -213,7 +213,10 @@ sk:
project_module_costs: "Čas a náklady"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Mena"
- setting_costs_currency_format: "Formát meny"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/sl.yml b/modules/costs/config/locales/crowdin/sl.yml
index 40c9a106483..304ccd44bb6 100644
--- a/modules/costs/config/locales/crowdin/sl.yml
+++ b/modules/costs/config/locales/crowdin/sl.yml
@@ -213,7 +213,10 @@ sl:
project_module_costs: "Čas in stroški"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Valuta"
- setting_costs_currency_format: "Oblika valute"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/sr.yml b/modules/costs/config/locales/crowdin/sr.yml
index 5b4d2d2aca4..6638b4d33a3 100644
--- a/modules/costs/config/locales/crowdin/sr.yml
+++ b/modules/costs/config/locales/crowdin/sr.yml
@@ -209,7 +209,10 @@ sr:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/sv.yml b/modules/costs/config/locales/crowdin/sv.yml
index bf37e762df9..bd40b4b80c9 100644
--- a/modules/costs/config/locales/crowdin/sv.yml
+++ b/modules/costs/config/locales/crowdin/sv.yml
@@ -205,7 +205,10 @@ sv:
project_module_costs: "Tid och kostnader"
setting_allow_tracking_start_and_end_times: "Tillåt start- och sluttider"
setting_costs_currency: "Valuta"
- setting_costs_currency_format: "Formatet för valuta"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Kräv start- och sluttider"
setting_enforce_without_allow: "Det är inte möjligt att begära start- och sluttider utan att låta dem"
setting_allow_tracking_start_and_end_times_caption: "Gör det möjligt att ange start- och sluttider vid tidsloggning."
diff --git a/modules/costs/config/locales/crowdin/th.yml b/modules/costs/config/locales/crowdin/th.yml
index 772a41d8e0c..9f04b5cf116 100644
--- a/modules/costs/config/locales/crowdin/th.yml
+++ b/modules/costs/config/locales/crowdin/th.yml
@@ -201,7 +201,10 @@ th:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/tr.yml b/modules/costs/config/locales/crowdin/tr.yml
index c959bb4b05b..2b758d6a338 100644
--- a/modules/costs/config/locales/crowdin/tr.yml
+++ b/modules/costs/config/locales/crowdin/tr.yml
@@ -205,7 +205,10 @@ tr:
project_module_costs: "Zaman ve maliyetler"
setting_allow_tracking_start_and_end_times: "Başlangıç ve bitiş saatlerine izin verin"
setting_costs_currency: "Para birimi"
- setting_costs_currency_format: "Para biriminin biçimi"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Başlangıç ve bitiş saatleri gerektir"
setting_enforce_without_allow: "Başlangıç ve bitiş saatlerini zorunlu tutmak, bunlara izin vermeden mümkün değildir"
setting_allow_tracking_start_and_end_times_caption: "Zaman kaydı yaparken başlangıç ve bitiş zamanlarının girilmesini sağlar."
diff --git a/modules/costs/config/locales/crowdin/uk.yml b/modules/costs/config/locales/crowdin/uk.yml
index 95cb3cbd8dd..d0ca340d910 100644
--- a/modules/costs/config/locales/crowdin/uk.yml
+++ b/modules/costs/config/locales/crowdin/uk.yml
@@ -213,7 +213,10 @@ uk:
project_module_costs: "Час і витрати"
setting_allow_tracking_start_and_end_times: "Дозволити час початку й закінчення"
setting_costs_currency: "Валюта"
+ setting_costs_currency_caption: "Це одиниця валюти. На її позначення може використовуватися трилітерний код ISO (наприклад, EUR, USD чи JPY) або символ (€, $, ¥ тощо)."
setting_costs_currency_format: "Формат валюти"
+ setting_costs_currency_format_prefix: "Перед числом (наприклад, EUR 100)"
+ setting_costs_currency_format_suffix: "Після числа (наприклад, 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Вимагати час початку й закінчення"
setting_enforce_without_allow: "Вимога часу початку й закінчення неможлива без відповідного налаштування"
setting_allow_tracking_start_and_end_times_caption: "Дає змогу вводити час початку й закінчення в журнал обліку часу."
diff --git a/modules/costs/config/locales/crowdin/uz.yml b/modules/costs/config/locales/crowdin/uz.yml
index a75e486fe67..b245e161da9 100644
--- a/modules/costs/config/locales/crowdin/uz.yml
+++ b/modules/costs/config/locales/crowdin/uz.yml
@@ -205,7 +205,10 @@ uz:
project_module_costs: "Time and costs"
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/config/locales/crowdin/vi.yml b/modules/costs/config/locales/crowdin/vi.yml
index e7c0268d25b..bac89a48180 100644
--- a/modules/costs/config/locales/crowdin/vi.yml
+++ b/modules/costs/config/locales/crowdin/vi.yml
@@ -201,7 +201,10 @@ vi:
project_module_costs: "Thời gian và chi phí"
setting_allow_tracking_start_and_end_times: "Cho phép thời gian bắt đầu và kết thúc"
setting_costs_currency: "tiền tệ"
- setting_costs_currency_format: "Định dạng tiền tệ"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Yêu cầu thời gian bắt đầu và kết thúc"
setting_enforce_without_allow: "Không thể yêu cầu thời gian bắt đầu và kết thúc nếu không cho phép chúng"
setting_allow_tracking_start_and_end_times_caption: "Cho phép nhập thời gian bắt đầu và kết thúc khi ghi thời gian."
diff --git a/modules/costs/config/locales/crowdin/zh-CN.yml b/modules/costs/config/locales/crowdin/zh-CN.yml
index 8c5dff2879a..f221761a2e3 100644
--- a/modules/costs/config/locales/crowdin/zh-CN.yml
+++ b/modules/costs/config/locales/crowdin/zh-CN.yml
@@ -201,7 +201,10 @@ zh-CN:
project_module_costs: "工时和成本"
setting_allow_tracking_start_and_end_times: "允许开始和完成时间"
setting_costs_currency: "货币"
+ setting_costs_currency_caption: "这是货币单位。可以是 EUR、USD 或 JPY 等三个字母的 ISO 代码,也可以是 €、$ 或 ¥ 等符号。"
setting_costs_currency_format: "货币格式"
+ setting_costs_currency_format_prefix: "在数字前(例如 EUR 100)"
+ setting_costs_currency_format_suffix: "在数字后(例如 100 EUR)"
setting_enforce_tracking_start_and_end_times: "需要开始和完成时间"
setting_enforce_without_allow: "如果不允许,则无法要求开始和结束时间"
setting_allow_tracking_start_and_end_times_caption: "启用在记录时间时输入开始和结束时间。"
diff --git a/modules/costs/config/locales/crowdin/zh-TW.yml b/modules/costs/config/locales/crowdin/zh-TW.yml
index 2209da088d6..d55463b7e1a 100644
--- a/modules/costs/config/locales/crowdin/zh-TW.yml
+++ b/modules/costs/config/locales/crowdin/zh-TW.yml
@@ -201,7 +201,10 @@ zh-TW:
project_module_costs: "時間與費用"
setting_allow_tracking_start_and_end_times: "允許起迄時間"
setting_costs_currency: "貨幣"
- setting_costs_currency_format: " 貨幣格式"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "需要起迄時間"
setting_enforce_without_allow: "在不允許的情況下,要求開始和結束時間是不可能的"
setting_allow_tracking_start_and_end_times_caption: "啟用記錄工時時輸入開始與結束時間的功能。"
diff --git a/modules/costs/config/locales/en.yml b/modules/costs/config/locales/en.yml
index f6d3a09f635..1ebae1bde1a 100644
--- a/modules/costs/config/locales/en.yml
+++ b/modules/costs/config/locales/en.yml
@@ -224,7 +224,10 @@ en:
setting_allow_tracking_start_and_end_times: "Allow start and finish times"
setting_costs_currency: "Currency"
- setting_costs_currency_format: "Format of currency"
+ setting_costs_currency_caption: "This is the unit of currency. It can be a three-letter ISO code like EUR, USD or JPY or a symbol like €, $ or ¥."
+ setting_costs_currency_format: "Currency format"
+ setting_costs_currency_format_prefix: "Before the number (e.g. EUR 100)"
+ setting_costs_currency_format_suffix: "After the number (e.g. 100 EUR)"
setting_enforce_tracking_start_and_end_times: "Require start and finish times"
setting_enforce_without_allow: "Requiring start and finish times is not possible without allowing them"
setting_allow_tracking_start_and_end_times_caption: "Enables entering start and finish times when logging time."
diff --git a/modules/costs/db/migrate/20260303172517_suffix_or_prefix_currency_format.rb b/modules/costs/db/migrate/20260303172517_suffix_or_prefix_currency_format.rb
new file mode 100644
index 00000000000..ee9ac1560b6
--- /dev/null
+++ b/modules/costs/db/migrate/20260303172517_suffix_or_prefix_currency_format.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class SuffixOrPrefixCurrencyFormat < ActiveRecord::Migration[8.1]
+ def up
+ execute <<~SQL.squish
+ UPDATE settings
+ SET value = '%n %u'
+ WHERE name = 'costs_currency_format'
+ AND value NOT IN ('%u %n', '%n %u');
+ SQL
+ end
+end
diff --git a/modules/costs/lib/costs/engine.rb b/modules/costs/lib/costs/engine.rb
index 698b425fba4..1fe57a590fd 100644
--- a/modules/costs/lib/costs/engine.rb
+++ b/modules/costs/lib/costs/engine.rb
@@ -167,7 +167,7 @@ module Costs
initializer "costs.settings" do
::Settings::Definition.add "costs_currency", default: "€", format: :string
- ::Settings::Definition.add "costs_currency_format", default: "%n %u", format: :string
+ ::Settings::Definition.add "costs_currency_format", default: "%n %u", format: :string, allowed: ["%u %n", "%n %u"]
::Settings::Definition.add "allow_tracking_start_and_end_times", default: false, format: :boolean
::Settings::Definition.add "enforce_tracking_start_and_end_times", default: false, format: :boolean
end
diff --git a/modules/costs/spec/features/my_time_tracking_spec.rb b/modules/costs/spec/features/my_time_tracking_spec.rb
index b85bbab5108..bc18a135024 100644
--- a/modules/costs/spec/features/my_time_tracking_spec.rb
+++ b/modules/costs/spec/features/my_time_tracking_spec.rb
@@ -74,7 +74,7 @@ RSpec.describe "my time tracking", :js do
end
around do |example|
- travel_to "2025-04-09T12:00:00Z" do # rubocop:disable RSpecRails/TravelAround
+ travel_to "2025-04-09T12:00:00Z" do
example.run
end
end
diff --git a/modules/github_integration/app/workers/cron/check_deploy_status_job.rb b/modules/github_integration/app/workers/cron/check_deploy_status_job.rb
index 6a27e3e5bd6..f8ea9bae7a0 100644
--- a/modules/github_integration/app/workers/cron/check_deploy_status_job.rb
+++ b/modules/github_integration/app/workers/cron/check_deploy_status_job.rb
@@ -157,7 +157,7 @@ module Cron
end
def introspection_request(host, api_token)
- OpenProject.httpx.basic_auth("apikey", api_token).get("https://#{host}/api/v3")
+ OpenProject.httpx.plugin(:basic_auth).basic_auth("apikey", api_token).get("https://#{host}/api/v3")
end
##
@@ -188,7 +188,7 @@ module Cron
ahead_by = data["ahead_by"].presence
behind_by = data["behind_by"].presence
- status == "behind" && ahead_by == 0 && (behind_by.present? && behind_by > 0)
+ status == "behind" && ahead_by == 0 && behind_by.present? && behind_by > 0
end
def compare_commits(sha_a, sha_b)
diff --git a/modules/gitlab_integration/config/locales/crowdin/rw.yml b/modules/gitlab_integration/config/locales/crowdin/rw.yml
index 4b58a358650..a5ae5154287 100644
--- a/modules/gitlab_integration/config/locales/crowdin/rw.yml
+++ b/modules/gitlab_integration/config/locales/crowdin/rw.yml
@@ -60,17 +60,23 @@ rw:
merge_request_reopened_comment: >
**MR Reopened:** Merge request %{mr_number} [%{mr_title}](%{mr_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}).
note_commit_referenced_comment: >
- **Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}): %{commit_note}
+ **Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}):
+ %{commit_note}
note_mr_referenced_comment: >
- **Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note}
+ **Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}):
+ %{mr_note}
note_mr_commented_comment: >
- **Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note}
+ **Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}):
+ %{mr_note}
note_issue_referenced_comment: >
- **Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note}
+ **Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}):
+ %{issue_note}
note_issue_commented_comment: >
- **Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note}
+ **Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}):
+ %{issue_note}
note_snippet_referenced_comment: >
- **Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}): %{snippet_note}
+ **Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}):
+ %{snippet_note}
issue_opened_referenced_comment: >
**Issue Opened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been opened by [%{gitlab_user}](%{gitlab_user_url}).
issue_closed_referenced_comment: >
@@ -78,8 +84,11 @@ rw:
issue_reopened_referenced_comment: >
**Issue Reopened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}).
push_single_commit_comment: >
- **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
+ **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
+ %{commit_note}
push_single_commit_comment_with_ref: >
- **Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
+ **Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
+ %{commit_note}
push_multiple_commits_comment: >
- **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
+ **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
+ %{commit_note}
diff --git a/modules/gitlab_integration/config/locales/crowdin/uz.yml b/modules/gitlab_integration/config/locales/crowdin/uz.yml
index 8159949474f..26da96002b9 100644
--- a/modules/gitlab_integration/config/locales/crowdin/uz.yml
+++ b/modules/gitlab_integration/config/locales/crowdin/uz.yml
@@ -60,17 +60,23 @@ uz:
merge_request_reopened_comment: >
**MR Reopened:** Merge request %{mr_number} [%{mr_title}](%{mr_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}).
note_commit_referenced_comment: >
- **Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}): %{commit_note}
+ **Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}):
+ %{commit_note}
note_mr_referenced_comment: >
- **Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note}
+ **Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}):
+ %{mr_note}
note_mr_commented_comment: >
- **Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note}
+ **Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}):
+ %{mr_note}
note_issue_referenced_comment: >
- **Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note}
+ **Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}):
+ %{issue_note}
note_issue_commented_comment: >
- **Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note}
+ **Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}):
+ %{issue_note}
note_snippet_referenced_comment: >
- **Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}): %{snippet_note}
+ **Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}):
+ %{snippet_note}
issue_opened_referenced_comment: >
**Issue Opened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been opened by [%{gitlab_user}](%{gitlab_user_url}).
issue_closed_referenced_comment: >
@@ -78,8 +84,11 @@ uz:
issue_reopened_referenced_comment: >
**Issue Reopened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}).
push_single_commit_comment: >
- **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
+ **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
+ %{commit_note}
push_single_commit_comment_with_ref: >
- **Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
+ **Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
+ %{commit_note}
push_multiple_commits_comment: >
- **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
+ **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
+ %{commit_note}
diff --git a/modules/grids/app/components/grids/widgets/members.rb b/modules/grids/app/components/grids/widgets/members.rb
index 7d5d07acc7b..8366b4ae2ed 100644
--- a/modules/grids/app/components/grids/widgets/members.rb
+++ b/modules/grids/app/components/grids/widgets/members.rb
@@ -49,7 +49,7 @@ module Grids
.map do |role|
members_query = members_for_role(role.id)
total_count = members_query.count
- members = members_query.limit(limit).to_a.map(&:user)
+ members = members_query.limit(limit).to_a.map(&:principal)
{
role:,
diff --git a/modules/ldap_groups/config/locales/crowdin/zh-CN.yml b/modules/ldap_groups/config/locales/crowdin/zh-CN.yml
index cec35d2ee7b..de9f185509c 100644
--- a/modules/ldap_groups/config/locales/crowdin/zh-CN.yml
+++ b/modules/ldap_groups/config/locales/crowdin/zh-CN.yml
@@ -6,7 +6,7 @@ zh-CN:
description: '与 OpenProject 组同步 LDAP 组以管理用户,更改他们的权限以便不同组的用户管理。'
plugin_openproject_ldap_groups:
name: "OpenProject LDAP 组"
- description: "LDAP组成员同步。"
+ description: "LDAP 组成员同步。"
activerecord:
attributes:
ldap_groups/synchronized_group:
diff --git a/modules/ldap_groups/config/locales/crowdin/zh-TW.yml b/modules/ldap_groups/config/locales/crowdin/zh-TW.yml
index 1a4720ebcaf..15ce71c0dc6 100644
--- a/modules/ldap_groups/config/locales/crowdin/zh-TW.yml
+++ b/modules/ldap_groups/config/locales/crowdin/zh-TW.yml
@@ -15,7 +15,7 @@ zh-TW:
ldap_auth_source: 'LDAP 連線'
sync_users: '同步使用者'
ldap_groups/synchronized_filter:
- filter_string: 'LDAP篩選條件'
+ filter_string: '簡約登入目錄制約(LDAP)篩選'
auth_source: '驗證來源'
ldap_auth_source: 'LDAP 連線'
group_name_attribute: "群組名字屬性"
diff --git a/modules/meeting/app/components/meetings/index/form_component.rb b/modules/meeting/app/components/meetings/index/form_component.rb
index 119128c8f43..6e3e1dfe2ed 100644
--- a/modules/meeting/app/components/meetings/index/form_component.rb
+++ b/modules/meeting/app/components/meetings/index/form_component.rb
@@ -83,7 +83,7 @@ module Meetings
def available_templates
return [] unless @project
- @available_templates ||= Meeting.onetime_templates.where(project: @project).visible
+ @available_templates ||= Meeting.templates_visible_in_project(@project)
end
end
end
diff --git a/modules/meeting/app/components/meetings/side_panel/sharing_component.html.erb b/modules/meeting/app/components/meetings/side_panel/sharing_component.html.erb
new file mode 100644
index 00000000000..b1364f077a5
--- /dev/null
+++ b/modules/meeting/app/components/meetings/side_panel/sharing_component.html.erb
@@ -0,0 +1,66 @@
+<%#-- copyright
+OpenProject is an open source project management software.
+Copyright (C) the OpenProject GmbH
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License version 3.
+
+OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+Copyright (C) 2006-2013 Jean-Philippe Lang
+Copyright (C) 2010-2013 the ChiliProject Team
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+See COPYRIGHT and LICENSE files for more details.
+
+++#%>
+
+<%=
+ component_wrapper do
+ render(Primer::OpenProject::SidePanel::Section.new) do |section|
+ section.with_title { t(:label_meeting_template_sharing) }
+
+ flex_layout do |content|
+ content.with_row do
+ render(Primer::Beta::Text.new(color: :subtle)) do
+ t(:text_meeting_template_sharing_description)
+ end
+ end
+
+ content.with_row(mt: 3) do
+ render(Primer::Alpha::ActionMenu.new) do |menu|
+ menu.with_show_button(scheme: :secondary) do |button|
+ button.with_trailing_visual_icon(icon: :"triangle-down")
+ sharing_label(@meeting.sharing)
+ end
+
+ Meeting.sharings.each_key do |sharing|
+ menu.with_item(
+ label: sharing_label(sharing),
+ tag: :a,
+ href: change_sharing_path(sharing),
+ content_arguments: { data: {
+ action: "click->meetings--submit#intercept",
+ href: change_sharing_path(sharing),
+ method: "PUT"
+ } }
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+%>
diff --git a/modules/meeting/app/components/meetings/side_panel/sharing_component.rb b/modules/meeting/app/components/meetings/side_panel/sharing_component.rb
new file mode 100644
index 00000000000..89547b5620a
--- /dev/null
+++ b/modules/meeting/app/components/meetings/side_panel/sharing_component.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module Meetings
+ class SidePanel::SharingComponent < ApplicationComponent
+ include ApplicationHelper
+ include OpTurbo::Streamable
+ include OpPrimer::ComponentHelpers
+
+ def initialize(meeting:)
+ super
+
+ @meeting = meeting
+ @project = meeting.project
+ end
+
+ def render?
+ User.current.allowed_in_project?(:edit_meetings, @project)
+ end
+
+ private
+
+ def sharing_label(sharing)
+ I18n.t("label_meeting_template_sharing_#{sharing}")
+ end
+
+ def change_sharing_path(sharing)
+ change_sharing_project_meeting_path(@project, @meeting, sharing:)
+ end
+ end
+end
diff --git a/modules/meeting/app/components/meetings/side_panel_component.html.erb b/modules/meeting/app/components/meetings/side_panel_component.html.erb
index c8ceb86e01f..1280f39c3b7 100644
--- a/modules/meeting/app/components/meetings/side_panel_component.html.erb
+++ b/modules/meeting/app/components/meetings/side_panel_component.html.erb
@@ -20,6 +20,10 @@
)
end
+ if @meeting.onetime_template?
+ panel.with_section(Meetings::SidePanel::SharingComponent.new(meeting: @meeting))
+ end
+
panel.with_section(
Meetings::SidePanel::AttachmentsComponent.new(meeting: @meeting),
grid_row_arguments: desktop_grid_row_arguments
diff --git a/modules/meeting/app/contracts/meetings/base_contract.rb b/modules/meeting/app/contracts/meetings/base_contract.rb
index 8e51766fad3..25400c061fb 100644
--- a/modules/meeting/app/contracts/meetings/base_contract.rb
+++ b/modules/meeting/app/contracts/meetings/base_contract.rb
@@ -44,5 +44,16 @@ module Meetings
attribute :start_time_hour
attribute :template
attribute :notify
+ attribute :sharing do
+ validate_sharing_only_on_onetime_templates
+ end
+
+ private
+
+ def validate_sharing_only_on_onetime_templates
+ return if model.onetime_template?
+
+ errors.add :sharing, :not_allowed if model.sharing.present?
+ end
end
end
diff --git a/modules/meeting/app/controllers/concerns/meetings/agenda_component_streams.rb b/modules/meeting/app/controllers/concerns/meetings/agenda_component_streams.rb
index 4f6792e8d26..b38ec1790b5 100644
--- a/modules/meeting/app/controllers/concerns/meetings/agenda_component_streams.rb
+++ b/modules/meeting/app/controllers/concerns/meetings/agenda_component_streams.rb
@@ -89,6 +89,16 @@ module Meetings
)
end
+ def update_sidebar_sharing_component_via_turbo_stream(meeting: @meeting)
+ return unless meeting.onetime_template?
+
+ update_via_turbo_stream(
+ component: Meetings::SidePanel::SharingComponent.new(
+ meeting:
+ )
+ )
+ end
+
def update_add_user_form_component_via_turbo_stream(meeting: @meeting)
update_via_turbo_stream(
component: Meetings::Participants::AddUserFormComponent.new(meeting:)
diff --git a/modules/meeting/app/controllers/meeting_templates_controller.rb b/modules/meeting/app/controllers/meeting_templates_controller.rb
index 0e8b706fda4..0e6bb7074f4 100644
--- a/modules/meeting/app/controllers/meeting_templates_controller.rb
+++ b/modules/meeting/app/controllers/meeting_templates_controller.rb
@@ -40,11 +40,13 @@ class MeetingTemplatesController < ApplicationController
menu_item :meetings
def index
- @templates = Meeting.onetime_templates
- .visible
- .order(:title)
-
- @templates = @templates.where(project_id: @project.id) if @project
+ @templates = if @project
+ Meeting.available_onetime_templates.where(project_id: @project.id).order(:title)
+ else
+ accessible_ids = Project.allowed_to(User.current, :view_meetings).select(:id)
+ base = Meeting.available_onetime_templates
+ base.where(project_id: accessible_ids).or(base.where(sharing: :system)).order(:title)
+ end
render "meeting_templates/index",
locals: { menu_name: project_or_global_menu }
diff --git a/modules/meeting/app/controllers/meetings_controller.rb b/modules/meeting/app/controllers/meetings_controller.rb
index e14950d30d3..3180d9a62f5 100644
--- a/modules/meeting/app/controllers/meetings_controller.rb
+++ b/modules/meeting/app/controllers/meetings_controller.rb
@@ -294,6 +294,23 @@ class MeetingsController < ApplicationController
respond_with_turbo_streams
end
+ def change_sharing
+ sharing = params[:sharing]
+
+ if Meeting.sharings.key?(sharing)
+ call = ::Meetings::UpdateService
+ .new(user: current_user, model: @meeting)
+ .call(sharing:)
+
+ render_base_error_in_flash_message_via_turbo_stream(call.errors) unless call.success?
+ end
+
+ update_header_component_via_turbo_stream
+ update_sidebar_sharing_component_via_turbo_stream
+
+ respond_with_turbo_streams
+ end
+
def download_ics
::Meetings::ICalService
.new(user: current_user, meeting: @meeting)
@@ -469,7 +486,7 @@ class MeetingsController < ApplicationController
@meeting = call.result
# When coming from the "Create from template" button, load the template to hide the form field
- @copy_from = Meeting.onetime_templates.visible.find_by(id: params[:template_id]) if params[:template_id].present?
+ @copy_from = Meeting.templates_visible_in_project(@project).find_by(id: params[:template_id]) if params[:template_id].present?
end
def global_upcoming_meetings
@@ -563,7 +580,7 @@ class MeetingsController < ApplicationController
# Check for template selection from form submission
template_id = params[:meeting][:template_id]
if template_id.present?
- @copy_from = Meeting.onetime_templates.visible.find_by(id: template_id)
+ @copy_from = Meeting.templates_visible_in_project(@project).find_by(id: template_id)
return
end
diff --git a/modules/meeting/app/forms/meeting/template_autocompleter.rb b/modules/meeting/app/forms/meeting/template_autocompleter.rb
index e236a3d1ec5..3a4f94ea3a0 100644
--- a/modules/meeting/app/forms/meeting/template_autocompleter.rb
+++ b/modules/meeting/app/forms/meeting/template_autocompleter.rb
@@ -61,6 +61,6 @@ class Meeting::TemplateAutocompleter < ApplicationForm
private
def templates
- Meeting.onetime_templates.where(project: @project).visible.order(:title)
+ Meeting.templates_visible_in_project(@project).order(:title)
end
end
diff --git a/modules/meeting/app/models/meeting.rb b/modules/meeting/app/models/meeting.rb
index d5af7813fbf..8bc03bce7b7 100644
--- a/modules/meeting/app/models/meeting.rb
+++ b/modules/meeting/app/models/meeting.rb
@@ -91,6 +91,10 @@ class Meeting < ApplicationRecord
joins(:participants).where(meeting_participants: { user_id: user.id })
}
+ scope :available_onetime_templates, -> {
+ onetime_templates.where(project_id: Project.active.select(:id))
+ }
+
acts_as_attachable(
after_remove: :attachments_changed,
order: "#{Attachment.table_name}.file",
@@ -118,6 +122,7 @@ class Meeting < ApplicationRecord
accepts_nested_attributes_for :participants, allow_destroy: true
validates :title, :project_id, presence: true
+ validates :sharing, absence: true, unless: :onetime_template?
validates :duration, numericality: { greater_than: 0 }
@@ -135,6 +140,21 @@ class Meeting < ApplicationRecord
closed: 5
}
+ enum :sharing, {
+ none: "none",
+ descendants: "descendants",
+ system: "system"
+ }, prefix: :sharing, validate: { allow_nil: true }
+
+ def self.templates_visible_in_project(project, user = User.current)
+ accessible_ids = Project.allowed_to(user, :view_meetings).select(:id)
+
+ available_onetime_templates
+ .where(project_id: project.id).where(project_id: accessible_ids)
+ .or(available_onetime_templates.where(sharing: :descendants, project_id: project.ancestors.select(:id)))
+ .or(available_onetime_templates.where(sharing: :system))
+ end
+
def recurring?
recurring_meeting_id.present?
end
diff --git a/modules/meeting/app/services/meetings/copy_service.rb b/modules/meeting/app/services/meetings/copy_service.rb
index 2d39db05136..eaa751e1e10 100644
--- a/modules/meeting/app/services/meetings/copy_service.rb
+++ b/modules/meeting/app/services/meetings/copy_service.rb
@@ -94,7 +94,7 @@ module Meetings
end
def writable_meeting_attributes(meeting)
- instantiate_contract(meeting, user).writable_attributes - %w[start_date start_time_hour uid]
+ instantiate_contract(meeting, user).writable_attributes - %w[start_date start_time_hour uid sharing]
end
def copy_meeting_attachment(copy)
diff --git a/modules/meeting/app/services/meetings/set_attributes_service.rb b/modules/meeting/app/services/meetings/set_attributes_service.rb
index b8cd8b93a4b..dd5784d8586 100644
--- a/modules/meeting/app/services/meetings/set_attributes_service.rb
+++ b/modules/meeting/app/services/meetings/set_attributes_service.rb
@@ -41,12 +41,13 @@ module Meetings
end
end
- def set_default_attributes(_params)
+ def set_default_attributes(_params) # rubocop:disable Metrics/AbcSize
model.change_by_system do
model.author = user
model.duration ||= 1
model.state = "draft" if !model.recurring? || model.template?
model.notify = false
+ model.sharing = "none" if model.onetime_template?
end
end
diff --git a/modules/meeting/app/services/recurring_meetings/update_service.rb b/modules/meeting/app/services/recurring_meetings/update_service.rb
index ea2dd48f60e..9f8db456784 100644
--- a/modules/meeting/app/services/recurring_meetings/update_service.rb
+++ b/modules/meeting/app/services/recurring_meetings/update_service.rb
@@ -162,10 +162,10 @@ module RecurringMeetings
return if new_title == @old_title
recurring_meeting
- .scheduled_instances(upcoming: true)
- .instantiated
- .each do |scheduled|
- scheduled.meeting.update_column(:title, new_title)
+ .scheduled_instances(upcoming: true)
+ .instantiated
+ .each do |scheduled|
+ scheduled.meeting.update_column(:title, new_title)
end
end
diff --git a/modules/meeting/config/locales/crowdin/af.yml b/modules/meeting/config/locales/crowdin/af.yml
index 2280c7bc4e4..b9944dd98a2 100644
--- a/modules/meeting/config/locales/crowdin/af.yml
+++ b/modules/meeting/config/locales/crowdin/af.yml
@@ -42,6 +42,7 @@ af:
start_date: "Datum"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Titel"
author: "Outeur"
@@ -622,6 +623,11 @@ af:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/ar.yml b/modules/meeting/config/locales/crowdin/ar.yml
index 91d10268cfa..f5649e72c52 100644
--- a/modules/meeting/config/locales/crowdin/ar.yml
+++ b/modules/meeting/config/locales/crowdin/ar.yml
@@ -46,6 +46,7 @@ ar:
start_date: "التاريخ"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "العنوان"
author: "المؤلف"
@@ -650,6 +651,11 @@ ar:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/az.yml b/modules/meeting/config/locales/crowdin/az.yml
index 116e3ba1ccd..0080a00552b 100644
--- a/modules/meeting/config/locales/crowdin/az.yml
+++ b/modules/meeting/config/locales/crowdin/az.yml
@@ -42,6 +42,7 @@ az:
start_date: "Date"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -622,6 +623,11 @@ az:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/be.yml b/modules/meeting/config/locales/crowdin/be.yml
index 7a57c008f84..716ad1c6f06 100644
--- a/modules/meeting/config/locales/crowdin/be.yml
+++ b/modules/meeting/config/locales/crowdin/be.yml
@@ -44,6 +44,7 @@ be:
start_date: "Дата"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -636,6 +637,11 @@ be:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/bg.yml b/modules/meeting/config/locales/crowdin/bg.yml
index c5ce3462081..19becde207a 100644
--- a/modules/meeting/config/locales/crowdin/bg.yml
+++ b/modules/meeting/config/locales/crowdin/bg.yml
@@ -42,6 +42,7 @@ bg:
start_date: "Дата"
start_time: "Начален час"
start_time_hour: "Начален час"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Заглавие"
author: "Автор"
@@ -622,6 +623,11 @@ bg:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Тази среща вече не може да се редактира."
text_meeting_not_present_anymore: "Тази среща е заличена. Моля, изберете друга среща."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/ca.yml b/modules/meeting/config/locales/crowdin/ca.yml
index 498d0dba6b6..bb9dfaa504e 100644
--- a/modules/meeting/config/locales/crowdin/ca.yml
+++ b/modules/meeting/config/locales/crowdin/ca.yml
@@ -42,6 +42,7 @@ ca:
start_date: "Data"
start_time: "Hora d'inici"
start_time_hour: "Hora d'inici"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Títol"
author: "Autor/a"
@@ -622,6 +623,11 @@ ca:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Aquesta reunió ja no es pot editar."
text_meeting_not_present_anymore: "Aquesta reunió es va eliminar. Si us plau, selecciona una altra reunió."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/ckb-IR.yml b/modules/meeting/config/locales/crowdin/ckb-IR.yml
index c3db5261d4a..8bd93fc2b45 100644
--- a/modules/meeting/config/locales/crowdin/ckb-IR.yml
+++ b/modules/meeting/config/locales/crowdin/ckb-IR.yml
@@ -42,6 +42,7 @@ ckb-IR:
start_date: "Date"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -622,6 +623,11 @@ ckb-IR:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml
index 2dc71cf04e3..a335c7f279e 100644
--- a/modules/meeting/config/locales/crowdin/cs.yml
+++ b/modules/meeting/config/locales/crowdin/cs.yml
@@ -44,6 +44,7 @@ cs:
start_date: "Datum"
start_time: "Čas zahájení"
start_time_hour: "Čas zahájení"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Název"
author: "Autor"
@@ -512,7 +513,7 @@ cs:
notice_meeting_updated: "Tato stránka byla aktualizována někým jiným. Pro zobrazení změn znovu načtena."
permission_create_meetings: "Vytvořit schůzku\n"
permission_edit_meetings: "Upravit schůzku"
- permission_delete_meetings: "Odstranit schůzky"
+ permission_delete_meetings: "Smazat schůzku"
permission_view_meetings: "Zobrazit schůzky"
permission_manage_agendas: "Správa zápisů"
permission_manage_agendas_explanation: "Allows creating, editing and removing agenda items"
@@ -636,6 +637,11 @@ cs:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Tato schůzka již není upravitelná."
text_meeting_not_present_anymore: "Tato schůzka byla odstraněna. Vyberte prosím jinou schůzku."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/da.yml b/modules/meeting/config/locales/crowdin/da.yml
index d478adfcc8d..21ebd450c36 100644
--- a/modules/meeting/config/locales/crowdin/da.yml
+++ b/modules/meeting/config/locales/crowdin/da.yml
@@ -42,6 +42,7 @@ da:
start_date: "Dato"
start_time: "Starttidspunkt"
start_time_hour: "Starttidspunkt"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Titel"
author: "Forfatter"
@@ -622,6 +623,11 @@ da:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml
index 74f623fe432..f47e26c306b 100644
--- a/modules/meeting/config/locales/crowdin/de.yml
+++ b/modules/meeting/config/locales/crowdin/de.yml
@@ -22,9 +22,9 @@
#English strings go here for Rails i18n
de:
plugin_openproject_meeting:
- name: "OpenProject Besprechung"
+ name: "OpenProject Besprechungen"
description: >-
- Besprechungen für OpenProject
+ Dieses Modul fügt Funktionen zur Unterstützung von Besprechungen zu OpenProject hinzu. Sie können Besprechungen planen und dabei Teilnehmer aus demselben Projekt auswählen, die an der Besprechung teilnehmen sollen. Es kann eine Tagesordnung erstellt und an die Eingeladenen gesendet werden. Nach der Besprechung können die Teilnehmer ausgewählt und Protokolle auf der Grundlage der Tagesordnung erstellt werden. Schließlich kann das Protokoll an alle Teilnehmer und Eingeladenen gesendet werden.
activerecord:
attributes:
meeting:
@@ -42,6 +42,7 @@ de:
start_date: "Datum"
start_time: "Startzeit"
start_time_hour: "Startzeit"
+ sharing: "Teilen"
meeting_agenda_item:
title: "Titel"
author: "Autor"
@@ -73,7 +74,7 @@ de:
section_not_belong_to_meeting: "Die Sektion gehört nicht zur gleichen Besprechung."
user_invalid: "ist kein gültiger Teilnehmer."
recurring_meeting_interim_response:
- not_an_occurrence: "ist keine gültige Uhrzeit für diese wiederkehrende Besprechung"
+ not_an_occurrence: "ist keine gültige Uhrzeit für dieses wiederkehrende Treffen"
recurring_meeting:
must_cover_existing_meetings:
one: "Es gibt eine offene Besprechung in der Terminserie, die nicht durch den neuen Zeitplan abgedeckt ist. Passen Sie den Zeitplan an, um alle bestehenden Meetings einzuschließen."
@@ -622,6 +623,11 @@ de:
text_exit_draft_mode_dialog_subtitle: "Sie können nicht mehr zum Entwurfsmodus zurückkehren, sobald Sie die Besprechung eröffnen."
text_exit_draft_mode_dialog_template_title: "Das erste Vorkommen dieser Terminserie öffnen?"
text_exit_draft_mode_dialog_template_subtitle: "Sie können danach nicht mehr in den Entwurfsmodus zurückkehren."
+ label_meeting_template_sharing: "Teilen"
+ label_meeting_template_sharing_none: "Nur dieses Projekt"
+ label_meeting_template_sharing_descendants: "Unterprojekte"
+ label_meeting_template_sharing_system: "Alle Projekte"
+ text_meeting_template_sharing_description: "Diese Vorlage kann mit Unterprojekten oder anderen Projekten geteilt werden. Es werden nur die Tagesordnungspunkte und Anhänge kopiert."
text_meeting_not_editable_anymore: "Diese Besprechung ist nicht mehr bearbeitbar."
text_meeting_not_present_anymore: "Dieses Meeting wurde gelöscht. Bitte wählen Sie eine andere Besprechung."
label_add_work_package_to_meeting_dialog_title: "Besprechung auswählen"
diff --git a/modules/meeting/config/locales/crowdin/el.yml b/modules/meeting/config/locales/crowdin/el.yml
index 35d2c1451a3..cceed748c90 100644
--- a/modules/meeting/config/locales/crowdin/el.yml
+++ b/modules/meeting/config/locales/crowdin/el.yml
@@ -42,6 +42,7 @@ el:
start_date: "Ημερομηνία"
start_time: "Ώρα έναρξης"
start_time_hour: "Ώρα έναρξης"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Τίτλος"
author: "Συγγραφέας"
@@ -622,6 +623,11 @@ el:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/eo.yml b/modules/meeting/config/locales/crowdin/eo.yml
index df83d8804ef..9788d9f8586 100644
--- a/modules/meeting/config/locales/crowdin/eo.yml
+++ b/modules/meeting/config/locales/crowdin/eo.yml
@@ -42,6 +42,7 @@ eo:
start_date: "Dato"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Titolo"
author: "Aŭtoro"
@@ -622,6 +623,11 @@ eo:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml
index 385a537fdad..f3445f3f7b1 100644
--- a/modules/meeting/config/locales/crowdin/es.yml
+++ b/modules/meeting/config/locales/crowdin/es.yml
@@ -42,6 +42,7 @@ es:
start_date: "Fecha"
start_time: "Hora de inicio"
start_time_hour: "Hora de inicio"
+ sharing: "Compartiendo"
meeting_agenda_item:
title: "Título"
author: "Autor"
@@ -622,6 +623,11 @@ es:
text_exit_draft_mode_dialog_subtitle: "Una vez programada una reunión, no puedes volver al modo Borrador."
text_exit_draft_mode_dialog_template_title: "¿Abrir la primera repetición de esta serie de reuniones?"
text_exit_draft_mode_dialog_template_subtitle: "No podrás volver al modo Borrador después de esto."
+ label_meeting_template_sharing: "Compartiendo"
+ label_meeting_template_sharing_none: "Solo este proyecto"
+ label_meeting_template_sharing_descendants: "Subproyectos"
+ label_meeting_template_sharing_system: "Todos los proyectos"
+ text_meeting_template_sharing_description: "Esta plantilla se puede compartir con subproyectos u otros proyectos en esta instancia. Solo se copiarán los elementos del orden del día y los archivos adjuntos."
text_meeting_not_editable_anymore: "Esta reunión ya no es editable."
text_meeting_not_present_anymore: "Esta reunión ha sido eliminada. Por favor, seleccione otra reunión."
label_add_work_package_to_meeting_dialog_title: "Seleccionar reunión"
diff --git a/modules/meeting/config/locales/crowdin/et.yml b/modules/meeting/config/locales/crowdin/et.yml
index 13937747e2c..5a9aa0e2fd4 100644
--- a/modules/meeting/config/locales/crowdin/et.yml
+++ b/modules/meeting/config/locales/crowdin/et.yml
@@ -42,6 +42,7 @@ et:
start_date: "Kuupäev"
start_time: "Algusaeg"
start_time_hour: "Algusaeg"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Pealkiri"
author: "Autor"
@@ -622,6 +623,11 @@ et:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/eu.yml b/modules/meeting/config/locales/crowdin/eu.yml
index 0ac3ac3193c..be9cf5b754a 100644
--- a/modules/meeting/config/locales/crowdin/eu.yml
+++ b/modules/meeting/config/locales/crowdin/eu.yml
@@ -42,6 +42,7 @@ eu:
start_date: "Date"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -622,6 +623,11 @@ eu:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/fa.yml b/modules/meeting/config/locales/crowdin/fa.yml
index 4ea7f27f7d7..7be582e9779 100644
--- a/modules/meeting/config/locales/crowdin/fa.yml
+++ b/modules/meeting/config/locales/crowdin/fa.yml
@@ -42,6 +42,7 @@ fa:
start_date: "تاریخ"
start_time: "زمان شروع"
start_time_hour: "زمان شروع"
+ sharing: "Sharing"
meeting_agenda_item:
title: "عنوان"
author: "نویسنده"
@@ -622,6 +623,11 @@ fa:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/fi.yml b/modules/meeting/config/locales/crowdin/fi.yml
index 747db12dc1e..33f17c593a8 100644
--- a/modules/meeting/config/locales/crowdin/fi.yml
+++ b/modules/meeting/config/locales/crowdin/fi.yml
@@ -42,6 +42,7 @@ fi:
start_date: "Päivämäärä"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Otsikko"
author: "Tekijä"
@@ -622,6 +623,11 @@ fi:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/fil.yml b/modules/meeting/config/locales/crowdin/fil.yml
index f2636920aa4..a94dda552b5 100644
--- a/modules/meeting/config/locales/crowdin/fil.yml
+++ b/modules/meeting/config/locales/crowdin/fil.yml
@@ -42,6 +42,7 @@ fil:
start_date: "Petsa"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Pamagat"
author: "May-akda"
@@ -622,6 +623,11 @@ fil:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml
index a0351465412..3409978e1d7 100644
--- a/modules/meeting/config/locales/crowdin/fr.yml
+++ b/modules/meeting/config/locales/crowdin/fr.yml
@@ -42,6 +42,7 @@ fr:
start_date: "Date"
start_time: "Heure de début"
start_time_hour: "Heure de début"
+ sharing: "Partage"
meeting_agenda_item:
title: "Titre"
author: "Auteur"
@@ -622,6 +623,11 @@ fr:
text_exit_draft_mode_dialog_subtitle: "Vous ne pouvez pas revenir au mode brouillon une fois que vous avez planifié une réunion."
text_exit_draft_mode_dialog_template_title: "Ouvrez la première occurrence de cette série de réunions ?"
text_exit_draft_mode_dialog_template_subtitle: "Vous ne pouvez plus revenir au mode brouillon après cette opération."
+ label_meeting_template_sharing: "Partage"
+ label_meeting_template_sharing_none: "Seulement ce projet"
+ label_meeting_template_sharing_descendants: "Sous-projets"
+ label_meeting_template_sharing_system: "Tous les projets"
+ text_meeting_template_sharing_description: "Ce modèle peut être partagé avec des sous-projets ou d'autres projets dans cette instance. Seuls les points de l'ordre du jour et les pièces jointes seront copiés."
text_meeting_not_editable_anymore: "Cette réunion n'est plus modifiable."
text_meeting_not_present_anymore: "Cette réunion a été supprimée. Veuillez sélectionner une autre réunion."
label_add_work_package_to_meeting_dialog_title: "Sélectionner la réunion"
diff --git a/modules/meeting/config/locales/crowdin/he.yml b/modules/meeting/config/locales/crowdin/he.yml
index 2a5c9078b99..77c964875b9 100644
--- a/modules/meeting/config/locales/crowdin/he.yml
+++ b/modules/meeting/config/locales/crowdin/he.yml
@@ -44,6 +44,7 @@ he:
start_date: "תאריך"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "כותרת"
author: "מחבר"
@@ -636,6 +637,11 @@ he:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/hi.yml b/modules/meeting/config/locales/crowdin/hi.yml
index 074ce5eb6b0..4ee59debe29 100644
--- a/modules/meeting/config/locales/crowdin/hi.yml
+++ b/modules/meeting/config/locales/crowdin/hi.yml
@@ -42,6 +42,7 @@ hi:
start_date: "तिथि"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "शीर्षक"
author: "Author"
@@ -622,6 +623,11 @@ hi:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/hr.yml b/modules/meeting/config/locales/crowdin/hr.yml
index 95c8d1347fd..8d4fc4b7392 100644
--- a/modules/meeting/config/locales/crowdin/hr.yml
+++ b/modules/meeting/config/locales/crowdin/hr.yml
@@ -43,6 +43,7 @@ hr:
start_date: "Datum"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Naziv"
author: "Autor"
@@ -629,6 +630,11 @@ hr:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/hu.yml b/modules/meeting/config/locales/crowdin/hu.yml
index 2a5fe60004c..5f01ebfc10e 100644
--- a/modules/meeting/config/locales/crowdin/hu.yml
+++ b/modules/meeting/config/locales/crowdin/hu.yml
@@ -42,6 +42,7 @@ hu:
start_date: "dátum"
start_time: "Kezdés"
start_time_hour: "Kezdés"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Cím"
author: "Szerző"
@@ -622,6 +623,11 @@ hu:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Ez a megbeszélés már nem szerkeszthető."
text_meeting_not_present_anymore: "Ez a megbeszélés törlésre került. Kérjük, válasszon ki egy másik megbeszélést."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/id.yml b/modules/meeting/config/locales/crowdin/id.yml
index 67981c91aee..2fcfd63659e 100644
--- a/modules/meeting/config/locales/crowdin/id.yml
+++ b/modules/meeting/config/locales/crowdin/id.yml
@@ -41,6 +41,7 @@ id:
start_date: "Tanggal"
start_time: "Waktu mulai"
start_time_hour: "Waktu mulai"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Judul"
author: "Penulis"
@@ -615,6 +616,11 @@ id:
text_exit_draft_mode_dialog_subtitle: "Anda tidak dapat kembali ke mode draf setellah Anda menjadwalkan rapat."
text_exit_draft_mode_dialog_template_title: "Buka acara yang pertama dalam seri rapat ini?"
text_exit_draft_mode_dialog_template_subtitle: "Anda tidak dapat kembali ke mode draf setelah ini."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Rapat ini tidak dapat disunting kembali."
text_meeting_not_present_anymore: "Rapat ini telah dihapus. Silakan pilih rapat yang lain."
label_add_work_package_to_meeting_dialog_title: "Pilih rapat"
diff --git a/modules/meeting/config/locales/crowdin/it.yml b/modules/meeting/config/locales/crowdin/it.yml
index 53522226fc6..6c324b54246 100644
--- a/modules/meeting/config/locales/crowdin/it.yml
+++ b/modules/meeting/config/locales/crowdin/it.yml
@@ -42,6 +42,7 @@ it:
start_date: "Data"
start_time: "Ora di inizio"
start_time_hour: "Ora di inizio"
+ sharing: "Condivisione"
meeting_agenda_item:
title: "Titolo"
author: "Autore"
@@ -622,6 +623,11 @@ it:
text_exit_draft_mode_dialog_subtitle: "Non può tornare alla modalità bozza una volta programmata una riunione."
text_exit_draft_mode_dialog_template_title: "Aprire la prima occorrenza di questa serie di riunioni?"
text_exit_draft_mode_dialog_template_subtitle: "Non puoi tornare alla modalità bozza dopo averlo fatto."
+ label_meeting_template_sharing: "Condivisione"
+ label_meeting_template_sharing_none: "Solo questo progetto"
+ label_meeting_template_sharing_descendants: "Sottoprogetti"
+ label_meeting_template_sharing_system: "Tutti i progetti"
+ text_meeting_template_sharing_description: "In questa istanza, questo modello può essere condiviso con sottoprogetti o altri progetti. Verranno copiati solo gli elementi dell'ordine del giorno e gli allegati."
text_meeting_not_editable_anymore: "Questa riunione non è più modificabile."
text_meeting_not_present_anymore: "Questa riunione è stata eliminata. Seleziona un'altra riunione."
label_add_work_package_to_meeting_dialog_title: "Seleziona riunione"
diff --git a/modules/meeting/config/locales/crowdin/ja.yml b/modules/meeting/config/locales/crowdin/ja.yml
index 1e454b00896..4c390388639 100644
--- a/modules/meeting/config/locales/crowdin/ja.yml
+++ b/modules/meeting/config/locales/crowdin/ja.yml
@@ -41,6 +41,7 @@ ja:
start_date: "日付"
start_time: "開始時間"
start_time_hour: "開始時間"
+ sharing: "Sharing"
meeting_agenda_item:
title: "タイトル"
author: "作成者"
@@ -246,7 +247,7 @@ ja:
summary_occurrence: "An occurrence of '%{title}' has been cancelled by %{actor}, or you have been removed as a participant"
summary_series: "Meeting series '%{title}' has been cancelled by %{actor}, or you have been removed as a participant"
summary: "'%{title}' has been cancelled by %{actor}, or you have been removed as a participant"
- date_time: "予定日時"
+ date_time: "スケジュールされた日時"
participant_added:
header: "Meeting '%{title}' - Participant added"
header_series: "Meeting series '%{title}' - Participant added"
@@ -293,7 +294,7 @@ ja:
title: "会議のキャンセル"
heading: "この会議をキャンセルしますか?"
confirmation_message_html: >
- テンプレートにない会議情報は失われます。 続行しますか?
+ テンプレートにない会議情報は失われます。 続けますか?
confirm_button: "発生をキャンセル"
blankslate:
title: "表示する会議がありません"
@@ -485,7 +486,7 @@ ja:
confirm_button: "この予定をキャンセル"
end_series_dialog:
title: "一連の会議を終了"
- notice_successful_notification: "参加者全員にカレンダー更新の電子メールを送信"
+ notice_successful_notification: "すべての出席者にカレンダーの更新をメールしました"
notice_meeting_template_created: "Template successfully created"
notice_timezone_missing: タイムゾーンが設定されていない場合、%{zone} が使用されます。タイムゾーンを選択するには、ここをクリックしてください。
notice_meeting_updated: "このページは他の誰かによって更新されました。変更を表示するには再読み込みしてください。"
@@ -573,7 +574,7 @@ ja:
このバックログは、このワンタイム会議に固有のものです.アイテムをドラッグして追加または会議の議題から削除することができます.
label_agenda_backlog_clear_title: "議題のバックログをクリアしますか?"
text_agenda_backlog_clear_description: >
- 現在アジェンダバックログにあるすべての項目を削除してもよろしいですか?このアクションは元に戻せません。
+ 議題のバックログ内のすべての項目を削除してもよろしいですか?この操作は取り消せません。
label_series_backlog: "シリーズバックログ"
text_series_backlog: >
バックログはこのシリーズのすべての出現と共有されます。 項目をドラッグして、特定の会議から項目を追加または削除できます。
@@ -605,7 +606,7 @@ ja:
text_meeting_closed_description: "この会議は終了しています。これ以上、議題項目の追加/削除はできません。"
text_meeting_in_progress_description: "議題を変更したり、各項目のアウトカムを記録したり、参加者の出席を追跡することができます。 会議が完了すると、会議をクローズとしてマークしてロックできます。"
text_meeting_open_dropdown_description: "既存の結果は残りますが、ユーザーは新しい結果を追加することはできません。"
- text_meeting_in_progress_dropdown_description: "会議中に必要な情報や決定事項などの成果を文書化する。"
+ text_meeting_in_progress_dropdown_description: "会議中に取られた情報のニーズや意思決定などの成果を記録します。"
text_meeting_closed_dropdown_description: "この会議は終了しました。これ以上、議題や結果を変更することはできません。"
text_meeting_draft_banner: "現在下書きモードです。 会議の詳細を変更したり出席者を追加/削除したりしても,この会議はカレンダーの更新や招待状を送信しません。"
text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings."
@@ -615,6 +616,11 @@ ja:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "この会議はもう編集できません。"
text_meeting_not_present_anymore: "この会議は削除されました。別の会議を選択してください。"
label_add_work_package_to_meeting_dialog_title: "会議の選択"
diff --git a/modules/meeting/config/locales/crowdin/ka.yml b/modules/meeting/config/locales/crowdin/ka.yml
index 1fffeca46f5..bd2e6a5a181 100644
--- a/modules/meeting/config/locales/crowdin/ka.yml
+++ b/modules/meeting/config/locales/crowdin/ka.yml
@@ -42,6 +42,7 @@ ka:
start_date: "თარიღი"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "სათაური"
author: "ავტორი"
@@ -622,6 +623,11 @@ ka:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/kk.yml b/modules/meeting/config/locales/crowdin/kk.yml
index f30132835af..2a9a0513c55 100644
--- a/modules/meeting/config/locales/crowdin/kk.yml
+++ b/modules/meeting/config/locales/crowdin/kk.yml
@@ -42,6 +42,7 @@ kk:
start_date: "Date"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -622,6 +623,11 @@ kk:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/ko.yml b/modules/meeting/config/locales/crowdin/ko.yml
index 98cd86be342..f624df287a7 100644
--- a/modules/meeting/config/locales/crowdin/ko.yml
+++ b/modules/meeting/config/locales/crowdin/ko.yml
@@ -41,6 +41,7 @@ ko:
start_date: "날짜"
start_time: "시작 시간"
start_time_hour: "시작 시간"
+ sharing: "공유"
meeting_agenda_item:
title: "제목"
author: "작성자"
@@ -615,6 +616,11 @@ ko:
text_exit_draft_mode_dialog_subtitle: "미팅을 예약한 후에는 초안 모드로 돌아갈 수 없습니다."
text_exit_draft_mode_dialog_template_title: "이 미팅 시리즈의 첫 번째 항목을 열어보시겠습니까?"
text_exit_draft_mode_dialog_template_subtitle: "이후에는 초안 모드로 돌아갈 수 없습니다."
+ label_meeting_template_sharing: "공유"
+ label_meeting_template_sharing_none: "이 프로젝트만"
+ label_meeting_template_sharing_descendants: "하위 프로젝트"
+ label_meeting_template_sharing_system: "모든 프로젝트"
+ text_meeting_template_sharing_description: "이 템플릿은 해당 인스턴스의 하위 프로젝트 또는 다른 프로젝트와 공유할 수 있습니다. 의제 항목과 첨부 파일만 복사됩니다."
text_meeting_not_editable_anymore: "이 미팅은 더 이상 편집할 수 없습니다."
text_meeting_not_present_anymore: "이 미팅은 삭제되었습니다. 다른 미팅을 선택해 주세요."
label_add_work_package_to_meeting_dialog_title: "미팅 선택"
diff --git a/modules/meeting/config/locales/crowdin/lt.yml b/modules/meeting/config/locales/crowdin/lt.yml
index 525672df94f..91b3f801a5f 100644
--- a/modules/meeting/config/locales/crowdin/lt.yml
+++ b/modules/meeting/config/locales/crowdin/lt.yml
@@ -44,6 +44,7 @@ lt:
start_date: "Data"
start_time: "Pradžios laikas"
start_time_hour: "Pradžios laikas"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Pavadinimas"
author: "Autorius"
@@ -636,6 +637,11 @@ lt:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Šis susitikimas daugiau neberedaguojamas"
text_meeting_not_present_anymore: "Šis susitikimas buvo ištrintas. Prašome parinkti kitą susitikimą."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/lv.yml b/modules/meeting/config/locales/crowdin/lv.yml
index 217d983e044..5998f60280c 100644
--- a/modules/meeting/config/locales/crowdin/lv.yml
+++ b/modules/meeting/config/locales/crowdin/lv.yml
@@ -43,6 +43,7 @@ lv:
start_date: "Datums"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Virsraksts"
author: "Autors"
@@ -629,6 +630,11 @@ lv:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/mn.yml b/modules/meeting/config/locales/crowdin/mn.yml
index 0cad0db0661..c644fac93f1 100644
--- a/modules/meeting/config/locales/crowdin/mn.yml
+++ b/modules/meeting/config/locales/crowdin/mn.yml
@@ -42,6 +42,7 @@ mn:
start_date: "Date"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -622,6 +623,11 @@ mn:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/ms.yml b/modules/meeting/config/locales/crowdin/ms.yml
index 0b532677465..66e80c49f9c 100644
--- a/modules/meeting/config/locales/crowdin/ms.yml
+++ b/modules/meeting/config/locales/crowdin/ms.yml
@@ -41,6 +41,7 @@ ms:
start_date: "Tarikh"
start_time: "Masa mula"
start_time_hour: "Masa mula"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Tajuk"
author: "Pengarang"
@@ -615,6 +616,11 @@ ms:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Mesyuarat ini tidak boleh diedit lagi."
text_meeting_not_present_anymore: "Mesyuarat ini telah dipadamkan. Sila pilih mesyuarat lain."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/ne.yml b/modules/meeting/config/locales/crowdin/ne.yml
index 1ac65742bd4..bcc2c2aa0bc 100644
--- a/modules/meeting/config/locales/crowdin/ne.yml
+++ b/modules/meeting/config/locales/crowdin/ne.yml
@@ -42,6 +42,7 @@ ne:
start_date: "Date"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -622,6 +623,11 @@ ne:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/nl.yml b/modules/meeting/config/locales/crowdin/nl.yml
index eedbdaadb4d..75ee48f568c 100644
--- a/modules/meeting/config/locales/crowdin/nl.yml
+++ b/modules/meeting/config/locales/crowdin/nl.yml
@@ -42,6 +42,7 @@ nl:
start_date: "Datum"
start_time: "Starttijd"
start_time_hour: "Starttijd"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Titel"
author: "Auteur"
@@ -622,6 +623,11 @@ nl:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Deze vergadering kan niet meer bewerkt worden."
text_meeting_not_present_anymore: "Deze vergadering is verwijderd. Selecteer een andere vergadering."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/no.yml b/modules/meeting/config/locales/crowdin/no.yml
index a01f411dd63..315f1ff0db7 100644
--- a/modules/meeting/config/locales/crowdin/no.yml
+++ b/modules/meeting/config/locales/crowdin/no.yml
@@ -42,6 +42,7 @@
start_date: "Dato"
start_time: "Starttid"
start_time_hour: "Starttid"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Tittel"
author: "Forfatter"
@@ -622,6 +623,11 @@
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Dette møtet er ikke lenger redigerbart."
text_meeting_not_present_anymore: "Dette møtet ble slettet. Velg et annet møte."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/pl.yml b/modules/meeting/config/locales/crowdin/pl.yml
index 63058498157..9b1ae56c1df 100644
--- a/modules/meeting/config/locales/crowdin/pl.yml
+++ b/modules/meeting/config/locales/crowdin/pl.yml
@@ -44,6 +44,7 @@ pl:
start_date: "Data"
start_time: "Data rozpoczęcia"
start_time_hour: "Godzina rozpoczęcia"
+ sharing: "Udostępnianie"
meeting_agenda_item:
title: "Tytuł"
author: "Autor"
@@ -636,6 +637,11 @@ pl:
text_exit_draft_mode_dialog_subtitle: "Po zaplanowaniu spotkania nie można powrócić do trybu wersji roboczej."
text_exit_draft_mode_dialog_template_title: "Otworzyć pierwsze wystąpienie z tej serii spotkań?"
text_exit_draft_mode_dialog_template_subtitle: "Po tym nie możesz powrócić do trybu wersji roboczej."
+ label_meeting_template_sharing: "Udostępnianie"
+ label_meeting_template_sharing_none: "Tylko ten projekt"
+ label_meeting_template_sharing_descendants: "Podprojekty"
+ label_meeting_template_sharing_system: "Wszystkie projekty"
+ text_meeting_template_sharing_description: "Ten szablon można udostępniać podprojektom lub innym projektom w tym wystąpieniu. Skopiowane zostaną tylko pozycje planu spotkania i załączniki."
text_meeting_not_editable_anymore: "Tego spotkania nie można już edytować."
text_meeting_not_present_anymore: "To spotkanie zostało usunięte. Wybierz inne spotkanie."
label_add_work_package_to_meeting_dialog_title: "Wybierz spotkanie"
diff --git a/modules/meeting/config/locales/crowdin/pt-BR.yml b/modules/meeting/config/locales/crowdin/pt-BR.yml
index f738c3ad94f..88f509605ac 100644
--- a/modules/meeting/config/locales/crowdin/pt-BR.yml
+++ b/modules/meeting/config/locales/crowdin/pt-BR.yml
@@ -42,6 +42,7 @@ pt-BR:
start_date: "Data"
start_time: "Hora de início"
start_time_hour: "Hora de início"
+ sharing: "Compartilhamento"
meeting_agenda_item:
title: "Título"
author: "Autor"
@@ -622,6 +623,11 @@ pt-BR:
text_exit_draft_mode_dialog_subtitle: "Não é possível voltar ao modo rascunho depois de agendar uma reunião."
text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?"
text_exit_draft_mode_dialog_template_subtitle: "Você não pode retornar ao modo rascunho após isto."
+ label_meeting_template_sharing: "Compartilhamento"
+ label_meeting_template_sharing_none: "Apenas neste projeto"
+ label_meeting_template_sharing_descendants: "Subprojetos"
+ label_meeting_template_sharing_system: "Todos os projetos"
+ text_meeting_template_sharing_description: "Este modelo pode ser compartilhado com subprojetos ou outros projetos nesta instância. Apenas os itens de pauta e os anexos serão copiados."
text_meeting_not_editable_anymore: "A reunião não pode mais ser editada."
text_meeting_not_present_anymore: "Esta reunião foi excluída. Selecione outra reunião."
label_add_work_package_to_meeting_dialog_title: "Selecionar reunião"
diff --git a/modules/meeting/config/locales/crowdin/pt-PT.yml b/modules/meeting/config/locales/crowdin/pt-PT.yml
index 4949f4cd24e..3ff2ab89a9d 100644
--- a/modules/meeting/config/locales/crowdin/pt-PT.yml
+++ b/modules/meeting/config/locales/crowdin/pt-PT.yml
@@ -42,6 +42,7 @@ pt-PT:
start_date: "Data"
start_time: "Hora de início"
start_time_hour: "Hora de início"
+ sharing: "Partilhar"
meeting_agenda_item:
title: "Título"
author: "Autor"
@@ -622,6 +623,11 @@ pt-PT:
text_exit_draft_mode_dialog_subtitle: "Não pode regressar ao modo de rascunho após agendar uma reunião."
text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?"
text_exit_draft_mode_dialog_template_subtitle: "Depois disso, não pode voltar ao modo de rascunho."
+ label_meeting_template_sharing: "Partilhar"
+ label_meeting_template_sharing_none: "Apenas este projeto"
+ label_meeting_template_sharing_descendants: "Sub-projetos"
+ label_meeting_template_sharing_system: "Todos os projetos"
+ text_meeting_template_sharing_description: "Este modelo pode ser partilhado com sub-projetos ou outros projetos nesta instância. Só os elementos da agenda e os anexos serão copiados."
text_meeting_not_editable_anymore: "Esta reunião não é mais editável."
text_meeting_not_present_anymore: "Esta reunião foi excluída. Por favor, selecione outra reunião."
label_add_work_package_to_meeting_dialog_title: "Selecionar reunião"
diff --git a/modules/meeting/config/locales/crowdin/ro.yml b/modules/meeting/config/locales/crowdin/ro.yml
index 827903fd42b..919502a6d40 100644
--- a/modules/meeting/config/locales/crowdin/ro.yml
+++ b/modules/meeting/config/locales/crowdin/ro.yml
@@ -43,6 +43,7 @@ ro:
start_date: "Dată"
start_time: "Dată început"
start_time_hour: "Dată început"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Titlu"
author: "Autor"
@@ -629,6 +630,11 @@ ro:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml
index e3a11f1299b..ab2052d8fb7 100644
--- a/modules/meeting/config/locales/crowdin/ru.yml
+++ b/modules/meeting/config/locales/crowdin/ru.yml
@@ -44,6 +44,7 @@ ru:
start_date: "Дата"
start_time: "Время начала"
start_time_hour: "Время начала"
+ sharing: "Совместное использование"
meeting_agenda_item:
title: "Заголовок"
author: "Автор"
@@ -636,6 +637,11 @@ ru:
text_exit_draft_mode_dialog_subtitle: "Вы не можете вернуться в режим черновика после того, как запланировали совещание."
text_exit_draft_mode_dialog_template_title: "Открыть первое совещание из этой серии?"
text_exit_draft_mode_dialog_template_subtitle: "После этого Вы не сможете вернуться в режим черновика."
+ label_meeting_template_sharing: "Совместное использование"
+ label_meeting_template_sharing_none: "Только этот проект"
+ label_meeting_template_sharing_descendants: "Подпроекты"
+ label_meeting_template_sharing_system: "Все проекты"
+ text_meeting_template_sharing_description: "Этот шаблон можно использовать совместно с подпроектами или другими проектами. Будут скопированы только пункты повестки дня и вложения."
text_meeting_not_editable_anymore: "Это совещание больше нельзя редактировать."
text_meeting_not_present_anymore: "Это совещание было удалено. Пожалуйста, выберите другое."
label_add_work_package_to_meeting_dialog_title: "Выберите совещание"
diff --git a/modules/meeting/config/locales/crowdin/rw.yml b/modules/meeting/config/locales/crowdin/rw.yml
index d571d5898da..257865c0a66 100644
--- a/modules/meeting/config/locales/crowdin/rw.yml
+++ b/modules/meeting/config/locales/crowdin/rw.yml
@@ -42,6 +42,7 @@ rw:
start_date: "Date"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -622,6 +623,11 @@ rw:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/si.yml b/modules/meeting/config/locales/crowdin/si.yml
index 0a559a1c509..36d11e30472 100644
--- a/modules/meeting/config/locales/crowdin/si.yml
+++ b/modules/meeting/config/locales/crowdin/si.yml
@@ -42,6 +42,7 @@ si:
start_date: "දිනය"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "මාතෘකාව"
author: "කර්තෘ"
@@ -622,6 +623,11 @@ si:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/sk.yml b/modules/meeting/config/locales/crowdin/sk.yml
index 8627fc7c99a..25e8114fbb9 100644
--- a/modules/meeting/config/locales/crowdin/sk.yml
+++ b/modules/meeting/config/locales/crowdin/sk.yml
@@ -44,6 +44,7 @@ sk:
start_date: "Dátum"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Nadpis"
author: "Autor"
@@ -636,6 +637,11 @@ sk:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/sl.yml b/modules/meeting/config/locales/crowdin/sl.yml
index f1c13874f33..88cb32dc8a5 100644
--- a/modules/meeting/config/locales/crowdin/sl.yml
+++ b/modules/meeting/config/locales/crowdin/sl.yml
@@ -44,6 +44,7 @@ sl:
start_date: "Datum"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Naslov"
author: "Avtor"
@@ -636,6 +637,11 @@ sl:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/sr.yml b/modules/meeting/config/locales/crowdin/sr.yml
index cc001255629..86c904021be 100644
--- a/modules/meeting/config/locales/crowdin/sr.yml
+++ b/modules/meeting/config/locales/crowdin/sr.yml
@@ -43,6 +43,7 @@ sr:
start_date: "Date"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -629,6 +630,11 @@ sr:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/sv.yml b/modules/meeting/config/locales/crowdin/sv.yml
index 4ffa38c02b7..bb4ab06ea8b 100644
--- a/modules/meeting/config/locales/crowdin/sv.yml
+++ b/modules/meeting/config/locales/crowdin/sv.yml
@@ -42,6 +42,7 @@ sv:
start_date: "Datum"
start_time: "Starttid"
start_time_hour: "Starttid"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Titel"
author: "Upphovsman"
@@ -622,6 +623,11 @@ sv:
text_exit_draft_mode_dialog_subtitle: "Du kan inte gå tillbaka till utkastet när du schemalägger ett möte."
text_exit_draft_mode_dialog_template_title: "Öppna den första förekomsten av denna mötesserie?"
text_exit_draft_mode_dialog_template_subtitle: "Du kan inte återgå till utkastläget efter detta."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Detta möte är inte längre redigerbart."
text_meeting_not_present_anymore: "Detta möte har tagits bort. Vänligen välj ett annat möte."
label_add_work_package_to_meeting_dialog_title: "Välj möte"
diff --git a/modules/meeting/config/locales/crowdin/th.yml b/modules/meeting/config/locales/crowdin/th.yml
index e6748e372cc..7e481e714e7 100644
--- a/modules/meeting/config/locales/crowdin/th.yml
+++ b/modules/meeting/config/locales/crowdin/th.yml
@@ -41,6 +41,7 @@ th:
start_date: "วันที่"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "ชื่อเรื่อง"
author: "ผู้เขียน"
@@ -615,6 +616,11 @@ th:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/tr.yml b/modules/meeting/config/locales/crowdin/tr.yml
index bc3c97dbf78..71a1418677a 100644
--- a/modules/meeting/config/locales/crowdin/tr.yml
+++ b/modules/meeting/config/locales/crowdin/tr.yml
@@ -42,6 +42,7 @@ tr:
start_date: "Tarih"
start_time: "Başlama tarihi"
start_time_hour: "Başlama saati"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Başlık"
author: "Yazar"
@@ -622,6 +623,11 @@ tr:
text_exit_draft_mode_dialog_subtitle: "Bir toplantı planladıktan sonra taslak moduna geri dönemezsiniz."
text_exit_draft_mode_dialog_template_title: "Bu toplantı serisinin ilkini açar mısınız?"
text_exit_draft_mode_dialog_template_subtitle: "Bundan sonra taslak moduna geri dönemezsiniz."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Bu toplantıyı artık düzenleyemezsiniz."
text_meeting_not_present_anymore: "Toplantı silinmiş. Başka bir toplantı seçin lütfen."
label_add_work_package_to_meeting_dialog_title: "Toplantı seç"
diff --git a/modules/meeting/config/locales/crowdin/uk.yml b/modules/meeting/config/locales/crowdin/uk.yml
index fa8017c3968..3ab697eafbb 100644
--- a/modules/meeting/config/locales/crowdin/uk.yml
+++ b/modules/meeting/config/locales/crowdin/uk.yml
@@ -44,6 +44,7 @@ uk:
start_date: "Дата"
start_time: "Час початку"
start_time_hour: "Час початку"
+ sharing: "Надання доступу"
meeting_agenda_item:
title: "Назва "
author: "Автор"
@@ -636,6 +637,11 @@ uk:
text_exit_draft_mode_dialog_subtitle: "Запланувавши нараду, не можна повернутися в режим чернетки."
text_exit_draft_mode_dialog_template_title: "Відкрити першу нараду цієї серії?"
text_exit_draft_mode_dialog_template_subtitle: "Після цього не можна буде повернутися в режим чернетки."
+ label_meeting_template_sharing: "Надання доступу"
+ label_meeting_template_sharing_none: "Лише цей проєкт"
+ label_meeting_template_sharing_descendants: "Підпроєкти"
+ label_meeting_template_sharing_system: "Усі проєкти"
+ text_meeting_template_sharing_description: "Цим шаблоном можна поділитися з підпроєктами або іншими проєктами цього екземпляра. Буде скопійовано лише пункти порядку денного й вкладення."
text_meeting_not_editable_anymore: "Цю нараду більше не можна редагувати."
text_meeting_not_present_anymore: "Цю нараду видалено. Виберіть іншу нараду."
label_add_work_package_to_meeting_dialog_title: "Вибрати нараду"
diff --git a/modules/meeting/config/locales/crowdin/uz.yml b/modules/meeting/config/locales/crowdin/uz.yml
index 4e1e7562442..274fb9613e5 100644
--- a/modules/meeting/config/locales/crowdin/uz.yml
+++ b/modules/meeting/config/locales/crowdin/uz.yml
@@ -42,6 +42,7 @@ uz:
start_date: "Date"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -622,6 +623,11 @@ uz:
text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting."
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
label_add_work_package_to_meeting_dialog_title: "Select meeting"
diff --git a/modules/meeting/config/locales/crowdin/vi.yml b/modules/meeting/config/locales/crowdin/vi.yml
index f632f5f3599..19540bead09 100644
--- a/modules/meeting/config/locales/crowdin/vi.yml
+++ b/modules/meeting/config/locales/crowdin/vi.yml
@@ -41,6 +41,7 @@ vi:
start_date: "ngày"
start_time: "Thời gian bắt đầu"
start_time_hour: "Thời gian bắt đầu"
+ sharing: "Sharing"
meeting_agenda_item:
title: "tiêu đề"
author: "tác giả"
@@ -615,6 +616,11 @@ vi:
text_exit_draft_mode_dialog_subtitle: "Bạn không thể quay lại chế độ nháp sau khi lên lịch cuộc họp."
text_exit_draft_mode_dialog_template_title: "Mở lần xuất hiện đầu tiên của chuỗi cuộc họp này?"
text_exit_draft_mode_dialog_template_subtitle: "Bạn không thể quay lại chế độ nháp sau này."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "Cuộc họp này không thể chỉnh sửa được nữa."
text_meeting_not_present_anymore: "Cuộc họp này đã bị xóa. Vui lòng chọn một cuộc họp khác."
label_add_work_package_to_meeting_dialog_title: "Chọn cuộc họp"
diff --git a/modules/meeting/config/locales/crowdin/zh-CN.yml b/modules/meeting/config/locales/crowdin/zh-CN.yml
index 639016e481a..6ad4209c0e4 100644
--- a/modules/meeting/config/locales/crowdin/zh-CN.yml
+++ b/modules/meeting/config/locales/crowdin/zh-CN.yml
@@ -41,6 +41,7 @@ zh-CN:
start_date: "日期"
start_time: "开始时间"
start_time_hour: "开始时间"
+ sharing: "共享中"
meeting_agenda_item:
title: "标题"
author: "作者"
@@ -615,6 +616,11 @@ zh-CN:
text_exit_draft_mode_dialog_subtitle: "会议安排完成后,您将无法返回到草稿模式。"
text_exit_draft_mode_dialog_template_title: "是否打开此会议系列的第一个会议?"
text_exit_draft_mode_dialog_template_subtitle: "在此之后,您将无法返回到草稿模式。"
+ label_meeting_template_sharing: "共享中"
+ label_meeting_template_sharing_none: "仅此项目"
+ label_meeting_template_sharing_descendants: "子项目"
+ label_meeting_template_sharing_system: "所有项目"
+ text_meeting_template_sharing_description: "此模板可以与此实例中的子项目或其他项目共享。仅复制议程条目和附件。"
text_meeting_not_editable_anymore: "本次会议已不可编辑。"
text_meeting_not_present_anymore: "此次会议已被删除。请选择另一次会议。"
label_add_work_package_to_meeting_dialog_title: "选择会议"
diff --git a/modules/meeting/config/locales/crowdin/zh-TW.yml b/modules/meeting/config/locales/crowdin/zh-TW.yml
index b26d49712c9..d922d064442 100644
--- a/modules/meeting/config/locales/crowdin/zh-TW.yml
+++ b/modules/meeting/config/locales/crowdin/zh-TW.yml
@@ -41,6 +41,7 @@ zh-TW:
start_date: "日期"
start_time: "開始時間"
start_time_hour: "開始時間"
+ sharing: "Sharing"
meeting_agenda_item:
title: "標題"
author: "會議發起者"
@@ -615,6 +616,11 @@ zh-TW:
text_exit_draft_mode_dialog_subtitle: "一旦排定會議,就無法返回草稿模式。"
text_exit_draft_mode_dialog_template_title: "要開啟此會議系列的第一場會議嗎?"
text_exit_draft_mode_dialog_template_subtitle: "之後您就無法回到草稿模式。"
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
text_meeting_not_editable_anymore: "本次會議已不可編輯。"
text_meeting_not_present_anymore: "此次會議已被刪除。請選擇另一場會議。"
label_add_work_package_to_meeting_dialog_title: "選擇會議"
diff --git a/modules/meeting/config/locales/en.yml b/modules/meeting/config/locales/en.yml
index ead5e53ff23..cb21d7eae97 100644
--- a/modules/meeting/config/locales/en.yml
+++ b/modules/meeting/config/locales/en.yml
@@ -53,6 +53,7 @@ en:
start_date: "Date"
start_time: "Start time"
start_time_hour: "Start time"
+ sharing: "Sharing"
meeting_agenda_item:
title: "Title"
author: "Author"
@@ -693,6 +694,12 @@ en:
text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?"
text_exit_draft_mode_dialog_template_subtitle: "You cannot return to draft mode after this."
+ label_meeting_template_sharing: "Sharing"
+ label_meeting_template_sharing_none: "Only this project"
+ label_meeting_template_sharing_descendants: "Subprojects"
+ label_meeting_template_sharing_system: "All projects"
+ text_meeting_template_sharing_description: "This template can be shared with subprojects or other projects in this instance. Only the agenda items and attachments will be copied."
+
text_meeting_not_editable_anymore: "This meeting is not editable anymore."
text_meeting_not_present_anymore: "This meeting was deleted. Please select another meeting."
diff --git a/modules/meeting/config/routes.rb b/modules/meeting/config/routes.rb
index 6679305e5f2..fecf73d4ee0 100644
--- a/modules/meeting/config/routes.rb
+++ b/modules/meeting/config/routes.rb
@@ -73,6 +73,7 @@ Rails.application.routes.draw do
get :details_dialog
put :update_details
put :change_state
+ put :change_sharing
post :notify
get :history
get :delete_dialog
diff --git a/modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb b/modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb
new file mode 100644
index 00000000000..96725388a20
--- /dev/null
+++ b/modules/meeting/db/migrate/20260302152255_add_sharing_to_meetings.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+class AddSharingToMeetings < ActiveRecord::Migration[8.1]
+ def change
+ add_column :meetings, :sharing, :string, null: true, default: nil
+ end
+end
diff --git a/modules/meeting/lib/open_project/meeting/engine.rb b/modules/meeting/lib/open_project/meeting/engine.rb
index ea092bf9af0..da1df3a357e 100644
--- a/modules/meeting/lib/open_project/meeting/engine.rb
+++ b/modules/meeting/lib/open_project/meeting/engine.rb
@@ -65,7 +65,7 @@ module OpenProject::Meeting
contract_actions: { meetings: %i[create] }
permission :edit_meetings,
{
- meetings: %i[edit cancel_edit update update_title change_state toggle_notifications_dialog
+ meetings: %i[edit cancel_edit update update_title change_state change_sharing toggle_notifications_dialog
details_dialog update_details toggle_notifications exit_draft_mode_dialog exit_draft_mode],
recurring_meetings: %i[edit cancel_edit update update_title details_dialog update_details
notify end_series end_series_dialog],
diff --git a/modules/meeting/spec/contracts/meetings/create_contract_spec.rb b/modules/meeting/spec/contracts/meetings/create_contract_spec.rb
index be7a26635ae..4858a65b5ae 100644
--- a/modules/meeting/spec/contracts/meetings/create_contract_spec.rb
+++ b/modules/meeting/spec/contracts/meetings/create_contract_spec.rb
@@ -44,6 +44,18 @@ RSpec.describe Meetings::CreateContract do
end
it_behaves_like "contract is valid"
+
+ context "when setting sharing on a non-template" do
+ let(:meeting) { build(:meeting, project:, sharing: :none) }
+
+ it_behaves_like "contract is invalid", sharing: %i[present not_allowed]
+ end
+
+ context "when setting sharing on a onetime template" do
+ let(:meeting) { build(:onetime_template, project:, sharing: :none) }
+
+ it_behaves_like "contract is valid"
+ end
end
context "without permission" do
diff --git a/modules/meeting/spec/contracts/meetings/update_contract_spec.rb b/modules/meeting/spec/contracts/meetings/update_contract_spec.rb
index 29d95655bfd..c8aef61331d 100644
--- a/modules/meeting/spec/contracts/meetings/update_contract_spec.rb
+++ b/modules/meeting/spec/contracts/meetings/update_contract_spec.rb
@@ -45,6 +45,20 @@ RSpec.describe Meetings::UpdateContract do
it_behaves_like "contract is valid"
+ context "when setting sharing on a non-template" do
+ let(:meeting) { create(:meeting, project:, sharing: nil) }
+
+ before { meeting.sharing = "none" }
+
+ it_behaves_like "contract is invalid", sharing: %i[present not_allowed]
+ end
+
+ context "when setting sharing on a onetime template" do
+ let(:meeting) { create(:onetime_template, project:, sharing: :none) }
+
+ it_behaves_like "contract is valid"
+ end
+
context "when lock_version is changed" do
before do
allow(meeting).to receive(:lock_version_changed?).and_return(true)
diff --git a/modules/meeting/spec/factories/meeting_factory.rb b/modules/meeting/spec/factories/meeting_factory.rb
index 1711cc37caa..9aabde5eda9 100644
--- a/modules/meeting/spec/factories/meeting_factory.rb
+++ b/modules/meeting/spec/factories/meeting_factory.rb
@@ -67,6 +67,7 @@ FactoryBot.define do
meeting.sequence(:title) { |n| "Onetime template #{n}" }
template { true }
recurring_meeting { nil }
+ sharing { :none }
end
end
end
diff --git a/modules/meeting/spec/features/meeting_backlogs_spec.rb b/modules/meeting/spec/features/meeting_backlogs_spec.rb
index 88e22a76eea..be53398bb00 100644
--- a/modules/meeting/spec/features/meeting_backlogs_spec.rb
+++ b/modules/meeting/spec/features/meeting_backlogs_spec.rb
@@ -247,14 +247,6 @@ RSpec.describe "Meeting Backlogs", :js do
end
describe "for meeting series" do
- before_all do
- travel_to(Date.new(2024, 12, 1))
- end
-
- after(:all) do # rubocop:disable RSpec/BeforeAfterAll
- travel_back
- end
-
shared_let(:recurring_meeting) do
create :recurring_meeting,
project:,
@@ -276,6 +268,10 @@ RSpec.describe "Meeting Backlogs", :js do
RecurringMeetings::InitNextOccurrenceJob.perform_now(recurring_meeting, next_occurrence_time)
end
+ after do
+ travel_back
+ end
+
describe "backlog visibility" do
context "when the meeting is 'open'" do
it "is expanded" do
diff --git a/modules/meeting/spec/features/meeting_templates/template_sharing_spec.rb b/modules/meeting/spec/features/meeting_templates/template_sharing_spec.rb
new file mode 100644
index 00000000000..8442ed84632
--- /dev/null
+++ b/modules/meeting/spec/features/meeting_templates/template_sharing_spec.rb
@@ -0,0 +1,159 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "spec_helper"
+
+require_relative "../../support/pages/meetings/show"
+require_relative "../../support/pages/meetings/index"
+
+RSpec.describe "Template sharing", :js do
+ shared_let(:project) { create(:project, enabled_module_names: %i[meetings]) }
+ shared_let(:template) { create(:onetime_template, project:, title: "My template", sharing: :none) }
+
+ let(:show_page) { Pages::Meetings::Show.new(template) }
+
+ context "as user with edit_meetings permission" do
+ shared_let(:editor) do
+ create(:user, member_with_permissions: { project => %i[view_meetings edit_meetings] })
+ end
+
+ before do
+ login_as editor
+ show_page.visit!
+ end
+
+ it "shows the sharing section in the sidebar" do
+ expect(page).to have_text(I18n.t(:label_meeting_template_sharing))
+ expect(page).to have_text(I18n.t(:label_meeting_template_sharing_none))
+ end
+
+ it "can change sharing to subprojects" do
+ within("#meetings-side-panel-sharing-component") do
+ click_button I18n.t(:label_meeting_template_sharing_none)
+ click_link_or_button I18n.t(:label_meeting_template_sharing_descendants)
+ end
+
+ wait_for_network_idle
+
+ expect(page).to have_text(I18n.t(:label_meeting_template_sharing_descendants))
+ expect(template.reload.sharing).to eq("descendants")
+ end
+
+ it "can change sharing to all projects" do
+ within("#meetings-side-panel-sharing-component") do
+ click_button I18n.t(:label_meeting_template_sharing_none)
+ click_link_or_button I18n.t(:label_meeting_template_sharing_system)
+ end
+
+ wait_for_network_idle
+
+ expect(page).to have_text(I18n.t(:label_meeting_template_sharing_system))
+ expect(template.reload.sharing).to eq("system")
+ end
+
+ it "can change sharing back to only this project" do
+ template.update!(sharing: :descendants)
+ show_page.visit!
+
+ within("#meetings-side-panel-sharing-component") do
+ click_button I18n.t(:label_meeting_template_sharing_descendants)
+ click_link_or_button I18n.t(:label_meeting_template_sharing_none)
+ end
+
+ wait_for_network_idle
+
+ expect(page).to have_text(I18n.t(:label_meeting_template_sharing_none))
+ expect(template.reload.sharing).to eq("none")
+ end
+ end
+
+ context "as user with view_meetings only" do
+ shared_let(:viewer) do
+ create(:user, member_with_permissions: { project => %i[view_meetings] })
+ end
+
+ before do
+ login_as viewer
+ show_page.visit!
+ end
+
+ it "does not show the sharing section" do
+ expect(page).to have_no_css("#meetings-side-panel-sharing-component")
+ end
+ end
+
+ # Happy path
+ context "when sharing level is changed", with_ee: [:meeting_templates] do
+ shared_let(:child_project) { create(:project, enabled_module_names: %i[meetings], parent: project) }
+ shared_let(:user) do
+ create(:user, member_with_permissions: {
+ project => %i[view_meetings edit_meetings],
+ child_project => %i[view_meetings create_meetings]
+ })
+ end
+
+ let(:child_meetings_page) { Pages::Meetings::Index.new(project: child_project) }
+
+ before { login_as user }
+
+ it "toggles visibility in child project's new meeting form" do
+ # Template not visible before sharing change
+ child_meetings_page.visit!
+ child_meetings_page.click_on "add-meeting-button"
+ child_meetings_page.click_on "One-time"
+
+ within_dialog "New one-time meeting" do
+ expect(page).to have_no_css('[data-test-selector="template_id"]')
+ end
+
+ # Change sharing to descendants
+ visit project_meeting_path(project, template)
+
+ within("#meetings-side-panel-sharing-component") do
+ click_button I18n.t(:label_meeting_template_sharing_none)
+ click_link_or_button I18n.t(:label_meeting_template_sharing_descendants)
+ end
+
+ wait_for_network_idle
+
+ expect(template.reload.sharing).to eq("descendants")
+
+ # Template is now visible in child project form
+ child_meetings_page.visit!
+ child_meetings_page.click_on "add-meeting-button"
+ child_meetings_page.click_on "One-time"
+
+ within_dialog "New one-time meeting" do
+ find('[data-test-selector="template_id"]').click
+ expect(page).to have_text(template.title)
+ end
+ end
+ end
+end
diff --git a/modules/meeting/spec/features/meetings_index_spec.rb b/modules/meeting/spec/features/meetings_index_spec.rb
index fae6aaaa574..88c1b3d81a6 100644
--- a/modules/meeting/spec/features/meetings_index_spec.rb
+++ b/modules/meeting/spec/features/meetings_index_spec.rb
@@ -32,6 +32,12 @@ require "spec_helper"
require_relative "../support/pages/meetings/index"
RSpec.describe "Meetings", "Index", :js do
+ shared_let(:business_day_at_noon) { Time.zone.local(2025, 1, 8, 12, 0, 0) }
+
+ after do
+ travel_back
+ end
+
# The order the Projects are created in is important. By naming `project` alphanumerically
# after `other_project`, we can ensure that subsequent specs that assert sorting is
# correct for the right reasons (sorting by Project name and not id)
@@ -55,14 +61,14 @@ RSpec.describe "Meetings", "Index", :js do
:author_participates,
project:,
title: "Awesome meeting today!",
- start_time: Time.current)
+ start_time: business_day_at_noon - 5.minutes)
end
shared_let(:tomorrows_meeting) do
create(:meeting,
:author_participates,
project:,
title: "Awesome meeting tomorrow!",
- start_time: 1.day.from_now,
+ start_time: business_day_at_noon + 1.day,
duration: 2.0,
location: "no-protocol.com")
end
@@ -71,7 +77,7 @@ RSpec.describe "Meetings", "Index", :js do
:author_participates,
project:,
title: "Boring meeting without a location!",
- start_time: 1.day.from_now,
+ start_time: business_day_at_noon + 1.day + 5.minutes,
location: "")
end
shared_let(:meeting_with_malicious_location) do
@@ -79,7 +85,7 @@ RSpec.describe "Meetings", "Index", :js do
:author_participates,
project:,
title: "Sneaky meeting!",
- start_time: 1.day.from_now,
+ start_time: business_day_at_noon + 1.day + 10.minutes,
location: "")
end
shared_let(:yesterdays_meeting) do
@@ -87,7 +93,7 @@ RSpec.describe "Meetings", "Index", :js do
:author_participates,
project:,
title: "Awesome meeting yesterday!",
- start_time: 1.day.ago)
+ start_time: business_day_at_noon - 1.day)
end
shared_let(:other_project_meeting) do
@@ -95,7 +101,7 @@ RSpec.describe "Meetings", "Index", :js do
:author_participates,
project: other_project,
title: "Awesome other project meeting!",
- start_time: 2.days.from_now,
+ start_time: business_day_at_noon + 2.days,
duration: 2.0,
location: "not-a-url")
end
@@ -104,7 +110,7 @@ RSpec.describe "Meetings", "Index", :js do
:author_participates,
project:,
title: "Awesome ongoing meeting!",
- start_time: 30.minutes.ago)
+ start_time: business_day_at_noon - 30.minutes)
end
def setup_meeting_involvement
@@ -120,6 +126,7 @@ RSpec.describe "Meetings", "Index", :js do
end
before do
+ travel_to(business_day_at_noon)
login_as user
end
diff --git a/modules/meeting/spec/features/move_to_section_spec.rb b/modules/meeting/spec/features/move_to_section_spec.rb
index df2317e5133..64690b0f88a 100644
--- a/modules/meeting/spec/features/move_to_section_spec.rb
+++ b/modules/meeting/spec/features/move_to_section_spec.rb
@@ -52,6 +52,10 @@ RSpec.describe "Move agenda items to section", :js do
login_as current_user
end
+ after do
+ travel_back
+ end
+
describe "for one-time meetings" do
shared_let(:meeting) do
create :meeting,
diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb
index 81287ee636c..e91d16f84e6 100644
--- a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb
+++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb
@@ -74,6 +74,10 @@ RSpec.describe "Recurring meetings creation",
travel_to(Date.new(2024, 12, 1))
end
+ after do
+ travel_back
+ end
+
context "with a user with permissions" do
it "can create a recurring meeting" do
login_as current_user
diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb
index a95a70bc171..b91732cfafb 100644
--- a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb
+++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb
@@ -38,14 +38,6 @@ RSpec.describe "Recurring meetings CRUD",
:js do
include Components::Autocompleter::NgSelectAutocompleteHelpers
- before_all do
- travel_to(Date.new(2024, 12, 1))
- end
-
- after(:all) do # rubocop:disable RSpec/BeforeAfterAll
- travel_back
- end
-
shared_let(:project) { create(:project, enabled_module_names: %w[meetings]) }
shared_let(:user) do
create :user,
@@ -85,6 +77,10 @@ RSpec.describe "Recurring meetings CRUD",
RecurringMeetings::InitNextOccurrenceJob.perform_now(meeting, meeting.first_occurrence.to_time)
end
+ after do
+ travel_back
+ end
+
it "can delete a recurring meeting from the show page and return to the index page" do
show_page.visit!
diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_global_crud_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_global_crud_spec.rb
index 6f03deb0517..010ae29a69b 100644
--- a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_global_crud_spec.rb
+++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_global_crud_spec.rb
@@ -37,14 +37,6 @@ require_relative "../../support/pages/meetings/index"
RSpec.describe "Recurring meetings global CRUD", :js do
include Components::Autocompleter::NgSelectAutocompleteHelpers
- before_all do
- travel_to(Date.new(2024, 12, 1))
- end
-
- after(:all) do # rubocop:disable RSpec/BeforeAfterAll
- travel_back
- end
-
shared_let(:project) { create(:project, enabled_module_names: %w[meetings]) }
shared_let(:user) do
create :user,
@@ -84,6 +76,10 @@ RSpec.describe "Recurring meetings global CRUD", :js do
RecurringMeetings::InitNextOccurrenceJob.perform_now(meeting, meeting.first_occurrence.to_time)
end
+ after do
+ travel_back
+ end
+
it "can delete a recurring meeting from the show page and return to the index page" do
show_page.visit!
diff --git a/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb b/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb
index 5bb68fe2392..77eb0ccf0f8 100644
--- a/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb
+++ b/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb
@@ -193,14 +193,6 @@ RSpec.describe "Meetings CRUD",
end
context "for meeting series, across the same occurrence" do
- before_all do
- travel_to(Date.new(2024, 12, 1))
- end
-
- after(:all) do # rubocop:disable RSpec/BeforeAfterAll
- travel_back
- end
-
let(:recurring_meeting) do
create :recurring_meeting,
project:,
@@ -222,6 +214,10 @@ RSpec.describe "Meetings CRUD",
RecurringMeetings::InitNextOccurrenceJob.perform_now(recurring_meeting, first_occurrence_time)
end
+ after do
+ travel_back
+ end
+
it_behaves_like "no flash appears when interacting with backlog in multiple windows"
end
diff --git a/modules/meeting/spec/models/meeting_spec.rb b/modules/meeting/spec/models/meeting_spec.rb
index 50e3395aff5..2e3b34d9222 100644
--- a/modules/meeting/spec/models/meeting_spec.rb
+++ b/modules/meeting/spec/models/meeting_spec.rb
@@ -1,4 +1,5 @@
# frozen_string_literal: true
+
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) the OpenProject GmbH
@@ -189,4 +190,84 @@ RSpec.describe Meeting do
end
end
end
+
+ describe ".templates_visible_in_project" do
+ shared_let(:ancestor_project) { create(:project) }
+ shared_let(:current_project) { create(:project, parent: ancestor_project) }
+ shared_let(:descendant_project) { create(:project, parent: current_project) }
+ shared_let(:unrelated_project) { create(:project) }
+
+ shared_let(:user) { create(:user, member_with_permissions: { current_project => [:view_meetings] }) }
+
+ subject { described_class.templates_visible_in_project(current_project, user) }
+
+ context "with templates in the same project" do
+ shared_let(:template_none) { create(:onetime_template, project: current_project, sharing: :none) }
+ shared_let(:template_descendants) { create(:onetime_template, project: current_project, sharing: :descendants) }
+ shared_let(:template_system) { create(:onetime_template, project: current_project, sharing: :system) }
+
+ it { expect(subject).to include(template_none) }
+ it { expect(subject).to include(template_descendants) }
+ it { expect(subject).to include(template_system) }
+ end
+
+ context "with templates in an unrelated project" do
+ shared_let(:template_none) { create(:onetime_template, project: unrelated_project, sharing: :none) }
+ shared_let(:template_descendants) { create(:onetime_template, project: unrelated_project, sharing: :descendants) }
+ shared_let(:template_system) { create(:onetime_template, project: unrelated_project, sharing: :system) }
+
+ it { expect(subject).not_to include(template_none) }
+ it { expect(subject).not_to include(template_descendants) }
+ it { expect(subject).to include(template_system) }
+ end
+
+ context "with templates in a descendant project" do
+ shared_let(:template_none) { create(:onetime_template, project: descendant_project, sharing: :none) }
+ shared_let(:template_descendants) { create(:onetime_template, project: descendant_project, sharing: :descendants) }
+ shared_let(:template_system) { create(:onetime_template, project: descendant_project, sharing: :system) }
+
+ it { expect(subject).not_to include(template_none) }
+ it { expect(subject).not_to include(template_descendants) }
+ it { expect(subject).to include(template_system) }
+ end
+
+ context "with templates in an ancestor project" do
+ shared_let(:template_none) { create(:onetime_template, project: ancestor_project, sharing: :none) }
+ shared_let(:template_descendants) { create(:onetime_template, project: ancestor_project, sharing: :descendants) }
+ shared_let(:template_system) { create(:onetime_template, project: ancestor_project, sharing: :system) }
+
+ it { expect(subject).not_to include(template_none) }
+ it { expect(subject).to include(template_descendants) }
+ it { expect(subject).to include(template_system) }
+ end
+ end
+
+ describe "sharing" do
+ context "for a regular meeting" do
+ let(:meeting) { build(:meeting, project:, sharing: :none) }
+
+ it "is invalid" do
+ expect(meeting).not_to be_valid
+ expect(meeting.errors[:sharing]).to be_present
+ end
+ end
+
+ context "for a series template" do
+ let(:recurring) { create(:recurring_meeting, project:) }
+ let(:meeting) { build(:meeting_template, sharing: :none, recurring_meeting: recurring) }
+
+ it "is invalid" do
+ expect(meeting).not_to be_valid
+ expect(meeting.errors[:sharing]).to be_present
+ end
+ end
+
+ context "for an onetime template" do
+ let(:meeting) { build(:onetime_template, project:, sharing: :none) }
+
+ it "is valid" do
+ expect(meeting).to be_valid
+ end
+ end
+ end
end
diff --git a/modules/meeting/spec/requests/meeting_templates_spec.rb b/modules/meeting/spec/requests/meeting_templates_spec.rb
index 10bbb49baed..0c0c9b1cc75 100644
--- a/modules/meeting/spec/requests/meeting_templates_spec.rb
+++ b/modules/meeting/spec/requests/meeting_templates_spec.rb
@@ -204,4 +204,74 @@ RSpec.describe "Meeting templates requests",
end
end
end
+
+ describe "GET /projects/:id/meetings/templates (project templates index page)" do
+ shared_let(:ancestor_project) { create(:project, enabled_module_names: %i[meetings]) }
+ shared_let(:current_project) { create(:project, enabled_module_names: %i[meetings], parent: ancestor_project) }
+ shared_let(:descendant_project) { create(:project, enabled_module_names: %i[meetings], parent: current_project) }
+ shared_let(:unrelated_project) { create(:project, enabled_module_names: %i[meetings]) }
+
+ shared_let(:user) do
+ create(:user, member_with_permissions: { current_project => %i[view_meetings] })
+ end
+
+ shared_let(:own_template) { create(:onetime_template, project: current_project, title: "Own template") }
+ shared_let(:ancestor_none_template) do
+ create(:onetime_template, project: ancestor_project, sharing: :none, title: "Ancestor none")
+ end
+ shared_let(:ancestor_descendants_template) do
+ create(:onetime_template, project: ancestor_project, sharing: :descendants, title: "Ancestor descendants")
+ end
+ shared_let(:descendant_template) do
+ create(:onetime_template, project: descendant_project, sharing: :descendants, title: "Descendant template")
+ end
+ shared_let(:system_template) do
+ create(:onetime_template, project: unrelated_project, sharing: :system, title: "System template")
+ end
+
+ before { login_as user }
+
+ it "shows only templates belonging to the project, regardless of sharing level" do
+ get templates_project_meetings_path(current_project)
+
+ expect(response.body).to include("Own template")
+
+ expect(response.body).not_to include("Ancestor none")
+ expect(response.body).not_to include("Ancestor descendants")
+ expect(response.body).not_to include("Descendant template")
+ expect(response.body).not_to include("System template")
+ end
+ end
+
+ describe "GET /meetings/templates (global templates index page)" do
+ shared_let(:accessible_project) { create(:project, enabled_module_names: %i[meetings]) }
+ shared_let(:inaccessible_project) { create(:project, enabled_module_names: %i[meetings]) }
+
+ shared_let(:user) do
+ create(:user, member_with_permissions: { accessible_project => %i[view_meetings] })
+ end
+
+ shared_let(:own_template) { create(:onetime_template, project: accessible_project, title: "Own template") }
+ shared_let(:inaccessible_none_template) do
+ create(:onetime_template, project: inaccessible_project, sharing: :none, title: "Inaccessible none")
+ end
+ shared_let(:inaccessible_descendants_template) do
+ create(:onetime_template, project: inaccessible_project, sharing: :descendants, title: "Inaccessible descendants")
+ end
+ shared_let(:system_template) do
+ create(:onetime_template, project: inaccessible_project, sharing: :system, title: "System template")
+ end
+
+ before { login_as user }
+
+ it "shows system templates and templates from accessible projects" do
+ get templates_meetings_path
+
+ expect(response.body).to include("Own template")
+ expect(response.body).to include("System template")
+
+ expect(response.body).not_to include("Inaccessible none")
+ expect(response.body).not_to include("Inaccessible descendants")
+ end
+ end
end
diff --git a/modules/meeting/spec/requests/meetings_spec.rb b/modules/meeting/spec/requests/meetings_spec.rb
index 86c060c4946..38b95110020 100644
--- a/modules/meeting/spec/requests/meetings_spec.rb
+++ b/modules/meeting/spec/requests/meetings_spec.rb
@@ -201,4 +201,50 @@ RSpec.describe "Meeting requests",
end
end
end
+
+ describe "GET new_dialog - template selector visibility", with_ee: [:meeting_templates] do
+ shared_let(:ancestor_project) { create(:project, enabled_module_names: %i[meetings]) }
+ shared_let(:current_project) { create(:project, enabled_module_names: %i[meetings], parent: ancestor_project) }
+ shared_let(:descendant_project) { create(:project, enabled_module_names: %i[meetings], parent: current_project) }
+ shared_let(:unrelated_project) { create(:project, enabled_module_names: %i[meetings]) }
+
+ shared_let(:user) do
+ create(:user, member_with_permissions: { current_project => %i[view_meetings create_meetings] })
+ end
+
+ shared_let(:own_template) { create(:onetime_template, project: current_project, title: "Own template") }
+ shared_let(:ancestor_none_template) do
+ create(:onetime_template, project: ancestor_project, sharing: :none, title: "Ancestor none")
+ end
+ shared_let(:ancestor_descendants_template) do
+ create(:onetime_template, project: ancestor_project, sharing: :descendants, title: "Ancestor descendants")
+ end
+ shared_let(:descendant_none_template) do
+ create(:onetime_template, project: descendant_project, sharing: :none, title: "Descendant none")
+ end
+ shared_let(:descendant_descendants_template) do
+ create(:onetime_template, project: descendant_project, sharing: :descendants, title: "Descendant descendants")
+ end
+ shared_let(:unrelated_none_template) do
+ create(:onetime_template, project: unrelated_project, sharing: :none, title: "Unrelated none")
+ end
+ shared_let(:system_template) do
+ create(:onetime_template, project: unrelated_project, sharing: :system, title: "System template")
+ end
+
+ before { login_as user }
+
+ it "shows own and those shared with descendants and all projects" do
+ get new_dialog_project_meetings_path(current_project), as: :turbo_stream
+
+ expect(response.body).to include("Own template")
+ expect(response.body).to include("Ancestor descendants")
+ expect(response.body).to include("System template")
+
+ expect(response.body).not_to include("Ancestor none")
+ expect(response.body).not_to include("Descendant none")
+ expect(response.body).not_to include("Descendant descendants")
+ expect(response.body).not_to include("Unrelated none")
+ end
+ end
end
diff --git a/modules/meeting/spec/services/meetings/create_service_integration_spec.rb b/modules/meeting/spec/services/meetings/create_service_integration_spec.rb
index 26dc2e991c4..508e3b60954 100644
--- a/modules/meeting/spec/services/meetings/create_service_integration_spec.rb
+++ b/modules/meeting/spec/services/meetings/create_service_integration_spec.rb
@@ -109,4 +109,22 @@ RSpec.describe Meetings::CreateService, "integration", type: :model do
end
end
end
+
+ describe "sharing" do
+ context "when creating a regular meeting" do
+ it "does not set sharing" do
+ expect(subject).to be_success
+ expect(subject.result.sharing).to be_nil
+ end
+ end
+
+ context "when creating an onetime template" do
+ let(:default_params) { { project:, title: "My template", template: true } }
+
+ it "sets sharing to none by default" do
+ expect(subject).to be_success
+ expect(subject.result.sharing).to eq("none")
+ end
+ end
+ end
end
diff --git a/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb b/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb
index 0246817d18b..c22de3556b2 100644
--- a/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb
+++ b/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb
@@ -9,7 +9,7 @@
end
collection.with_component(
- OpPrimer::CopyToClipboardComponent.new(provider.slug, scheme: :input)
+ OpPrimer::CopyToClipboardComponent.new(provider.slug, scheme: :value)
)
collection.with_component(Primer::Beta::Heading.new(tag: :h5, mt: 4, mb: 1)) do
@@ -17,7 +17,7 @@
end
collection.with_component(
- OpPrimer::CopyToClipboardComponent.new(provider.callback_url, scheme: :input)
+ OpPrimer::CopyToClipboardComponent.new(provider.callback_url, scheme: :value)
)
collection.with_component(Primer::Beta::Heading.new(tag: :h5, mt: 4, mb: 1)) do
@@ -25,7 +25,7 @@
end
collection.with_component(
- OpPrimer::CopyToClipboardComponent.new(provider.backchannel_logout_url, scheme: :input)
+ OpPrimer::CopyToClipboardComponent.new(provider.backchannel_logout_url, scheme: :value)
)
end
end
diff --git a/modules/openid_connect/app/services/openid_connect/user_tokens/token_request.rb b/modules/openid_connect/app/services/openid_connect/user_tokens/token_request.rb
index f774185c546..3d43de64ec9 100644
--- a/modules/openid_connect/app/services/openid_connect/user_tokens/token_request.rb
+++ b/modules/openid_connect/app/services/openid_connect/user_tokens/token_request.rb
@@ -78,7 +78,7 @@ module OpenIDConnect
# Client ID and Client Secret must be form-encoded. Otherwise characters such as colon (:)
# would not be allowed in the Client ID, since HTTP Basic Auth does not support it
# as per https://datatracker.ietf.org/doc/html/rfc7617#section-2
- OpenProject.httpx.basic_auth(CGI.escape(provider.client_id), CGI.escape(provider.client_secret))
+ OpenProject.httpx.plugin(:basic_auth).basic_auth(CGI.escape(provider.client_id), CGI.escape(provider.client_secret))
end
end
end
diff --git a/modules/overviews/spec/migrations/rename_manage_overview_to_manage_dashboards_spec.rb b/modules/overviews/spec/migrations/rename_manage_overview_to_manage_dashboards_spec.rb
new file mode 100644
index 00000000000..2aff50081ef
--- /dev/null
+++ b/modules/overviews/spec/migrations/rename_manage_overview_to_manage_dashboards_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require "spec_helper"
+require Rails.root.join("modules/overviews/db/migrate/20250910085916_rename_manage_overview_to_manage_dashboards")
+
+RSpec.describe RenameManageOverviewToManageDashboards, type: :model do
+ subject(:migrate) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:up) } }
+
+ let!(:empty_role) { create(:project_role) }
+ let!(:role_with_permission) do
+ create(:project_role, permissions: %i[manage_overview], add_public_permissions: false)
+ end
+
+ describe "migrating up" do
+ it "does not add permissions to a role without manage_overview" do
+ expect { migrate }.not_to change { empty_role.reload.permissions }
+ end
+
+ it "renames manage_overview to manage_dashboards" do
+ expect { migrate }
+ .to change { role_with_permission.reload.permissions }
+ .from(match_array(%i[manage_overview]))
+ .to(match_array(%i[manage_dashboards]))
+ end
+ end
+
+ describe "migrating down" do
+ subject(:rollback) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:down) } }
+
+ before { migrate }
+
+ it "reverts manage_dashboards to manage_overview" do
+ expect { rollback }
+ .to change { role_with_permission.reload.permissions }
+ .from(match_array(%i[manage_dashboards]))
+ .to(match_array(%i[manage_overview]))
+ end
+ end
+end
diff --git a/modules/reporting/config/locales/crowdin/ro.yml b/modules/reporting/config/locales/crowdin/ro.yml
index c113cc4a5d4..ddd90658fff 100644
--- a/modules/reporting/config/locales/crowdin/ro.yml
+++ b/modules/reporting/config/locales/crowdin/ro.yml
@@ -70,7 +70,7 @@ ro:
label_filter: "Filtrează"
label_filter_add: "Adaugă filtru"
label_filter_plural: "Filtre"
- label_group_by: "Grupează după"
+ label_group_by: "Grupare după"
label_group_by_add: "Adaugă atributul Grupează-după"
label_inactive: "Inactiv"
label_no: "Nu"
diff --git a/modules/reporting/config/locales/crowdin/vi.yml b/modules/reporting/config/locales/crowdin/vi.yml
index 0b864f3df4a..43bd0a017d5 100644
--- a/modules/reporting/config/locales/crowdin/vi.yml
+++ b/modules/reporting/config/locales/crowdin/vi.yml
@@ -73,7 +73,7 @@ vi:
label_group_by: "Nhóm theo"
label_group_by_add: "Thêm thuộc tính theo nhóm"
label_inactive: "«không hoạt động»"
- label_no: "không"
+ label_no: "Không"
label_none: "(không có dữ liệu)"
label_no_reports: "Chưa có báo cáo chi phí."
label_report: "Báo cáo"
diff --git a/modules/reporting/config/locales/crowdin/zh-TW.yml b/modules/reporting/config/locales/crowdin/zh-TW.yml
index 6a0980310d3..014919fb7f9 100644
--- a/modules/reporting/config/locales/crowdin/zh-TW.yml
+++ b/modules/reporting/config/locales/crowdin/zh-TW.yml
@@ -53,7 +53,7 @@ zh-TW:
label_money: "金額"
label_month_reporting: "月"
label_new_report: "新建成本報表"
- label_open: "開啟"
+ label_open: "開啟中"
label_operator: "操作員"
label_private_report_plural: "私密成本報告"
label_progress_bar_explanation: "產生報告中..."
@@ -70,7 +70,7 @@ zh-TW:
label_filter: "篩選條件"
label_filter_add: "新增篩選條件"
label_filter_plural: "篩選條件"
- label_group_by: "分類"
+ label_group_by: "分組依據"
label_group_by_add: "新增群組欄位"
label_inactive: "«不活動»"
label_no: "否"
diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/basic_auth.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/basic_auth.rb
index cea3bb61c9a..7a47f8684bd 100644
--- a/modules/storages/app/common/storages/adapters/authentication_strategies/basic_auth.rb
+++ b/modules/storages/app/common/storages/adapters/authentication_strategies/basic_auth.rb
@@ -40,7 +40,7 @@ module Storages
return build_failure(storage) if username.blank? || password.blank?
- yield OpenProject.httpx.basic_auth(username, password).with(http_options)
+ yield OpenProject.httpx.plugin(:basic_auth).basic_auth(username, password).with(http_options)
end
private
diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb
index ac771777fdd..083c36ee3e0 100644
--- a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb
+++ b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_client_credentials.rb
@@ -39,21 +39,21 @@ module Storages
@use_cache = use_cache
end
- def call(storage:, http_options: {})
+ def call(storage:, http_options: {}) # rubocop:disable Metrics/AbcSize
config = validate_configuration(storage).value_or { return Failure(it) }
token_cache_key = TOKEN_CACHE_KEY % storage.id
access_token = @use_cache ? Rails.cache.read(token_cache_key) : nil
- http = build_http_session(access_token, config, http_options).value_or { return Failure(it) }
+ session = build_http_session(access_token, config, http_options).value_or { Failure(it) }
- operation_result = yield http
+ operation_result = yield session
return operation_result unless @use_cache
case operation_result
in Success if @use_cache && access_token.blank?
- write_cache(token_cache_key, http)
+ write_cache(token_cache_key, session)
in Failure(code: :forbidden)
clear_cache(token_cache_key)
else
@@ -61,6 +61,18 @@ module Storages
end
operation_result
+ # HTTPX default behaviour is to return error responses and not raise errors unless
+ # explicitly asked by using the `#raise_for_status`method.
+ #
+ # On Storages codebase we handle the error responses, but the OAuth
+ # plugin raises and exception when it fails to get a Token..
+ # The handling below will only apply to authentication errors.
+ rescue HTTPX::HTTPError => e
+ error("Error while refreshing OAuth token - Payload: #{e.response}")
+
+ Failure(Results::Error.new(code: :unauthorized, payload: e.response, source: self.class))
+ rescue HTTPX::TimeoutError => e
+ Failure(Results::Error.new(code: :timeout, payload: e.to_s, source: self.class))
end
private
@@ -73,35 +85,15 @@ module Storages
end
def write_cache(key, httpx_session)
- access_token = httpx_session.instance_variable_get(:@options).oauth_session.access_token
+ access_token = httpx_session.send(:oauth_session).access_token
Rails.cache.write(key, access_token, expires_in: 50.minutes)
end
def clear_cache(key) = Rails.cache.delete(key)
def build_http_session(access_token, config, http_options)
- if access_token.present?
- http_with_current_token(access_token:, http_options:)
- else
- http_with_new_token(config:, http_options:)
- end
- end
-
- def http_with_current_token(access_token:, http_options:)
- opts = http_options.deep_merge({ headers: { "Authorization" => "Bearer #{access_token}" } })
- Success(OpenProject.httpx.with(opts))
- end
-
- def http_with_new_token(config:, http_options:)
- http = OpenProject.httpx
- .oauth_auth(**config.to_h, token_endpoint_auth_method: "client_secret_post")
- .with_access_token
- .with(http_options)
- Success(http)
- rescue HTTPX::HTTPError => e
- Failure(Results::Error.new(code: :unauthorized, payload: e.response, source: self.class))
- rescue HTTPX::TimeoutError => e
- Failure(Results::Error.new(code: :timeout, payload: e.to_s, source: self.class))
+ Success(OpenProject.httpx.plugin(:oauth)
+ .with(**http_options, oauth_options: { **config, access_token: access_token }))
end
end
end
diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_configuration.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_configuration.rb
index 3eb74f53a28..cddf79f3077 100644
--- a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_configuration.rb
+++ b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_configuration.rb
@@ -49,6 +49,7 @@ module Storages
def to_h
{ issuer:, client_id:, client_secret:, scope: }
end
+ alias_method :to_hash, :to_h
end
end
end
diff --git a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb
index 650f4951fc6..036841b5fe7 100644
--- a/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb
+++ b/modules/storages/app/common/storages/adapters/authentication_strategies/oauth_user_token.rb
@@ -39,22 +39,15 @@ module Storages
@error_data = Results::Error.new(source: self.class, code: :error)
end
- # rubocop:disable Metrics/AbcSize
def call(storage:, http_options: {}, &)
oauth_client = validate_oauth_client(storage).value_or { return Failure(it) }
token = current_token(oauth_client).value_or { return Failure(it) }
- original_response = yield(httpx_with_auth(token.access_token, http_options))
-
- case original_response
- in Failure(code: :unauthorized)
- updated_token = refresh_token!(storage.oauth_configuration.to_httpx_oauth_config.to_h,
- http_options,
- token).value_or { return Failure(it) }
- yield(httpx_with_auth(updated_token.access_token, http_options))
- else
- original_response
- end
+ perform_request(
+ httpx_oauth_session(storage.oauth_configuration.to_httpx_oauth_config, token, http_options),
+ token,
+ &
+ )
rescue ActiveRecord::StaleObjectError => e
raise e if @retried
@@ -62,14 +55,33 @@ module Storages
@retried = true
retry
end
- # rubocop:enable Metrics/AbcSize
private
- def httpx_with_auth(access_token, http_options)
- OpenProject
- .httpx
- .with(http_options.deep_merge(headers: { "Authorization" => "Bearer #{access_token}" }))
+ def perform_request(session, token, &)
+ response = yield(session)
+
+ response.bind { update_token(session, token) }
+
+ response
+ rescue HTTPX::TimeoutError => e
+ handle_timeout(token, e)
+ rescue HTTPX::Error => e
+ handle_http_error(token, e)
+ end
+
+ def update_token(session, token)
+ oauth_session = session.send(:oauth_session)
+ token.update!(access_token: oauth_session.access_token, refresh_token: oauth_session.refresh_token)
+ end
+
+ def httpx_oauth_session(oauth_config, token, http_options)
+ OpenProject.httpx
+ .plugin(:retries)
+ .plugin(:oauth)
+ .with(**http_options,
+ oauth_options: { **oauth_config,
+ access_token: token.access_token, refresh_token: token.refresh_token })
end
def validate_oauth_client(storage)
@@ -78,34 +90,16 @@ module Storages
Failure(@error_data.with(code: :missing_oauth_client, payload: storage))
end
- def refresh_token!(oauth_config, http_options, token)
- oauth_session = OpenProject
- .httpx
- .oauth_auth(**oauth_config,
- refresh_token: token.refresh_token,
- token_endpoint_auth_method: "client_secret_post")
- .with(http_options)
- .with_access_token
- .instance_variable_get(:@options)
- .oauth_session
- token.update!(access_token: oauth_session.access_token, refresh_token: oauth_session.refresh_token)
- Success(token)
- rescue HTTPX::HTTPError => e
- handle_http_error(token, e)
- rescue HTTPX::TimeoutError => e
- handle_timeout(token, e)
- end
-
def handle_timeout(token, exception)
- Rails.logger.error("Timeout while refreshing OAuth token. - Payload: #{exception.message}")
- token.destroy
+ error("Timeout while refreshing OAuth token. - Payload: #{exception.message}")
+ token.destroy!
Failure(@error_data.with(error: :timeout_on_refresh, payload: exception))
end
- def handle_http_error(token, error)
- Rails.logger.error("Error while refreshing OAuth token - Payload: #{error.response}")
- token.destroy
- Failure(@error_data.with(code: :unauthorized, payload: error.response))
+ def handle_http_error(token, exception)
+ error("Error while refreshing OAuth token - Payload: #{exception.response}")
+ token.destroy!
+ Failure(@error_data.with(code: :unauthorized, payload: exception.response))
end
def current_token(client)
diff --git a/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb b/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb
index 5c5d34ad56b..7ee86871c57 100644
--- a/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb
+++ b/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/download_link_query.rb
@@ -35,11 +35,9 @@ module Storages
module Queries
class DownloadLinkQuery < Base
def call(auth_strategy:, input_data:)
- Authentication[auth_strategy].call(storage: @storage, http_options:) do |http|
- fetch_origin_name(input_data, auth_strategy).bind do |origin_name|
- fetch_download_token(auth_strategy, input_data.file_id).fmap do |token|
- URI(download_link(token, origin_name))
- end
+ fetch_origin_name(input_data, auth_strategy).bind do |origin_name|
+ fetch_download_token(auth_strategy, input_data.file_id).fmap do |token|
+ URI(download_link(token, origin_name))
end
end
end
@@ -55,11 +53,7 @@ module Storages
case response
in { status: 200..299 }
- if response.body.blank?
- Failure(error.with(code: :unauthorized))
- else
- build_download_link(response, error)
- end
+ build_download_link(response, error)
in { status: 404 }
Failure(error.with(code: :not_found))
in { status: 401 }
@@ -70,14 +64,12 @@ module Storages
end
def fetch_origin_name(input_data, auth_strategy)
- FileInfoQuery.call(storage: @storage, auth_strategy:, input_data:)
- .bind do |file_info|
- file_name = file_info.name
- return Success(file_name) if file_name.present?
+ FileInfoQuery.call(storage: @storage, auth_strategy:, input_data:).bind do |file_info|
+ file_name = file_info.name
+ return Success(file_name) if file_name.present?
- error = Results::Error.new(source: self.class, payload: file_info)
- Failure(error.with(code: :not_found))
- end
+ Failure(Results::Error.new(source: self.class, payload: file_info, code: :not_found))
+ end
end
def fetch_download_token(auth_strategy, file_id)
@@ -100,6 +92,8 @@ module Storages
return parsing_error if token.blank?
Success(token)
+ rescue HTTPX::Error
+ parsing_error
end
def download_link(token, origin_name)
diff --git a/modules/storages/app/validator/nextcloud_application_credentials_validator.rb b/modules/storages/app/validator/nextcloud_application_credentials_validator.rb
index 794a10937b6..8aa7e1e5ed9 100644
--- a/modules/storages/app/validator/nextcloud_application_credentials_validator.rb
+++ b/modules/storages/app/validator/nextcloud_application_credentials_validator.rb
@@ -40,6 +40,7 @@ class NextcloudApplicationCredentialsValidator
response = OpenProject
.httpx
+ .plugin(:basic_auth)
.basic_auth(contract.username, contract.password)
.head(Storages::UrlBuilder.url(contract.model.uri, "remote.php/dav"))
case response
diff --git a/modules/storages/config/locales/crowdin/ja.yml b/modules/storages/config/locales/crowdin/ja.yml
index 86bc0b213bc..4708d197140 100644
--- a/modules/storages/config/locales/crowdin/ja.yml
+++ b/modules/storages/config/locales/crowdin/ja.yml
@@ -18,7 +18,7 @@ ja:
token_exchange_scope: ストレージスコープ
storages/project_storage:
project_folder: プロジェクトフォルダ
- project_folder_mode: プロジェクトフォルダーモード
+ project_folder_mode: プロジェクトフォルダモード
storage: ストレージ
storage_url: ストレージURL
storages/sharepoint_storage:
@@ -29,53 +29,53 @@ ja:
storages/storage:
authentication_method: 認証方法
creator: 作成者
- drive: ドライブID
+ drive: ドライブ ID
host: ホスト
name: 名称
password: アプリケーションのパスワード
- provider_type: プロバイダー・タイプ
- tenant: ディレクトリ(テナント)ID
+ provider_type: プロバイダーの種類
+ tenant: ディレクトリ (テナント) ID
errors:
messages:
invalid_host_url: は有効な URL ではありません。
- invalid_sharepoint_url: は有効なSharePointサイト、ライブラリ、ドキュメントのURLではありません。
- not_linked_to_project: はプロジェクトにリンクされていない。
+ invalid_sharepoint_url: は有効なSharePointサイト、ライブラリ、またはドキュメントのURLではありません。
+ not_linked_to_project: はプロジェクトにリンクされていません。
models:
storages/file_link:
attributes:
origin_id:
- only_numeric_or_uuid: には数値かuuidしか指定できない。
+ only_numeric_or_uuid: は数値またはuuidのみとなります。
storages/project_storage:
attributes:
project_folder_id:
blank: フォルダーを選択してください。
project_folder_mode:
- mode_unavailable: はこのストレージでは使用できない。
+ mode_unavailable: このストレージでは使用できません。
project_ids:
blank: プロジェクトを選択してください。
storages/storage:
attributes:
host:
- authorization_header_missing: が完全にセットアップされていません。APIリクエストのベアラートークンベースの認証に必要な "Authorization "ヘッダーをNextcloudインスタンスが受け取っていません。HTTPサーバーの設定を再度ご確認ください。
- cannot_be_connected_to: に到達できませんでした。ホストに到達可能で、OpenProject 統合アプリがインストールされていることを確認してください。
- minimal_nextcloud_version_unmet: 最小バージョン要件を満たしていない(Nextcloud 23以上である必要があります。)
- not_nextcloud_server: はNextcloudサーバーではありません。
- op_application_not_installed: は、アプリ「OpenProject integration」がインストールされていないようです。インストールしてからもう一度お試しください。
+ authorization_header_missing: 完全には設定されていません。 Nextcloudインスタンスは、APIリクエストのベアラートークンベースの認可に必要な「Authorization」ヘッダーを受け取りません。 HTTPサーバーの設定を再確認してください。
+ cannot_be_connected_to: に到達できませんでした。ホストが到達可能で、OpenProject 統合アプリがインストールされていることを確認してください。
+ minimal_nextcloud_version_unmet: 最小バージョン要件を満たしていません(Nextcloud23以上でなければなりません)
+ not_nextcloud_server: はNextcloudサーバーではありません
+ op_application_not_installed: アプリ「OpenProject統合」がインストールされていません。最初にインストールしてからもう一度お試しください。
password:
- invalid_password: は無効である。
+ invalid_password: は無効です。
unknown_error: could not be validated with the file storage provider. Please verify that the connection is functioning properly.
models:
file_link: ファイル
storages/storage: ストレージ
api_v3:
errors:
- too_many_elements_created_at_once: 一度に作成される要素が多すぎる。最大でも %{max} 、 %{actual}。
+ too_many_elements_created_at_once: 一度に作成された要素が多すぎます。 %{max} の期待値は %{actual} です。
external_file_storages: 外部ファイルストレージ
permission_create_files: '自動的に管理されたプロジェクトフォルダ: ファイルの作成'
permission_create_files_explanation: この権限はNextcloudストレージでのみ利用できます
permission_delete_files: '自動的に管理されたプロジェクトフォルダ: ファイルの削除'
permission_delete_files_explanation: この権限はNextcloudストレージでのみ利用できます
- permission_header_for_project_module_storages: 自動的に管理されるプロジェクトフォルダ
+ permission_header_for_project_module_storages: 自動的に管理されたプロジェクトフォルダ
permission_manage_file_links: ファイルへのリンク管理
permission_manage_files_in_project: プロジェクト内のファイル管理
permission_read_files: '自動的に管理されたプロジェクトフォルダ: ファイルの読み込み'
@@ -86,16 +86,16 @@ ja:
project_module_storages: ファイルを添付する
project_storages:
edit_project_folder:
- label: プロジェクトフォルダの編集
+ label: プロジェクトフォルダを編集
open:
- contact_admin: このエラーを解決するには、管理者に連絡してください。
- remote_identity_error: ストレージへの接続中に予期せぬエラーが発生しました。
+ contact_admin: このエラーを解決するには管理者に問い合わせてください。
+ remote_identity_error: ストレージへの接続中に予期しないエラーが発生しました。
project_folder_mode:
- automatic: 自動的に管理される
- inactive: 特定のフォルダなし
+ automatic: 自動的に管理
+ inactive: 特定のフォルダがありません
manual: 既存のフォルダを手動で管理
remove_project:
- deletion_failure_flash: ストレージからのプロジェクトの削除に失敗しました。 %{error}
+ deletion_failure_flash: プロジェクトをストレージから削除できませんでした。 %{error}
label: プロジェクトを削除
services:
attributes:
@@ -110,7 +110,7 @@ ja:
one_drive_sync_service:
create_folder: 'プロジェクトフォルダの作成を管理:'
ensure_root_folder_permissions: 'ベースフォルダの権限を設定:'
- hide_inactive_folders: '非アクティブフォルダを隠す ステップ:'
+ hide_inactive_folders: '非アクティブフォルダを隠す ステップ'
remote_folders: 'Read contents of the drive root folder:'
rename_project_folder: '管理プロジェクトフォルダの名前を変更します:'
sharepoint_sync_service:
@@ -121,16 +121,16 @@ ja:
rename_project_folder: '管理プロジェクトフォルダの名前を変更します:'
errors:
messages:
- error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください
+ error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください。
forbidden: OpenProject could not access the requested resource. Please check your permissions configuration on the Storage Provider.
unauthorized: OpenProjectはストレージプロバイダと認証できませんでした。アクセスできることを確認してください。
models:
copy_project_folders_service:
conflict: フォルダ %{destination_path} は既に存在する。上書きを避けるために処理を中断しています。
- error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください
- forbidden: OpenProject はソースフォルダにアクセスできませんでした。ストレージ・プロバイダの権限設定を確認してください
+ error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください。
+ forbidden: OpenProject はソースフォルダにアクセスできませんでした。ストレージ・プロバイダの権限設定を確認してください。
not_found: ソース・テンプレートの場所 %{source_path} が見つかりませんでした。
- unauthorized: OpenProject はストレージプロバイダと認証できませんでした。ストレージの設定を確認してください
+ unauthorized: OpenProject はストレージプロバイダと認証できませんでした。ストレージの設定を確認してください。
nextcloud_sync_service:
attributes:
add_user_to_group:
@@ -151,31 +151,31 @@ ja:
conflict: '以下の理由により、 %{user} のユーザーを %{group} グループから削除できませんでした: %{reason}'
failed_to_remove: '以下の理由により、 %{user} のユーザーを %{group} グループから削除できませんでした: %{reason}'
rename_project_folder:
- conflict: OpenProjectは、同じ名前のフォルダが既に存在するため、プロジェクトフォルダの名前を %{current_path} に変更できませんでした
- forbidden: OpenProject ユーザーは %{current_path} フォルダにアクセスできません。
- not_found: "%{current_path} は見つからなかった。"
+ conflict: OpenProjectは、同じ名前のフォルダが既に存在するため、プロジェクトフォルダの名前を %{current_path} に変更できませんでした。
+ forbidden: OpenProjectユーザーは %{current_path} フォルダにアクセスできません。
+ not_found: "%{current_path} は見つかりませんでした。"
set_folders_permissions:
- permission_not_set: '%{path}にパーミッションを設定できなかった。'
- error: 予期しないエラーが発生しました。Nextcloud インスタンスに到達可能であることを確認し、OpenProject ワーカーのログを確認してください
+ permission_not_set: '%{path} に権限を設定できませんでした。'
+ error: 予期しないエラーが発生しました。Nextcloudインスタンスがアクセス可能であることを確認し、詳細についてはOpenProjectワーカーログを確認してください。
group_does_not_exist: "%{group} は存在しません。Nextcloudインスタンスの設定を確認してください。"
- insufficient_privileges: OpenProjectには、 %{group}に %{user} を追加するのに十分な権限がありません。Nextcloudのグループ設定を確認してください。
- not_allowed: ネクストクラウドはリクエストをブロックする。
+ insufficient_privileges: OpenProjectには %{user} を %{group}に追加するための十分な権限がありません。Nextcloudでグループ設定を確認してください。
+ not_allowed: Nextcloudはリクエストをブロックします。
not_found: OpenProject could not find the file on the Nextcloud Storage Provider. Please check if it wasn't deleted.
unauthorized: OpenProjectがNextcloudと同期できませんでした。ストレージとNextcloudの設定を確認してください。
- user_does_not_exist: "%{user} はNextcloudには存在しません。"
+ user_does_not_exist: "Nextcloudには%{user} は存在しません。"
one_drive_sync_service:
attributes:
create_folder:
- conflict: '%{folder_name} はすでに %{parent_location}に存在している。'
- not_found: "%{parent_location} は見つからなかった。"
+ conflict: '%{folder_name} は %{parent_location} に既に存在します。'
+ not_found: "%{parent_location} は見つかりませんでした。"
hide_inactive_folders:
- permission_not_set: '%{path}にパーミッションを設定できなかった。'
+ permission_not_set: '%{path} に権限を設定できませんでした。'
remote_folders:
- request_error: OpenProject は %{drive_id}ドライブにアクセスできませんでした。ストレージの設定が正しいかどうか確認してください。
+ request_error: OpenProjectがドライブ %{drive_id}にアクセスできませんでした。ストレージの設定が正しいか確認してください。
rename_project_folder:
conflict: OpenProject could not rename the folder %{current_path} to %{project_folder_name} as a folder with the same name already exists.
- forbidden: OpenProject は、 %{current_path} にアクセスできず、名前を変更できません。
- not_found: "%{current_path} は見つからなかった。"
+ forbidden: OpenProject は名前を変更するために %{current_path} にアクセスできません。
+ not_found: "%{current_path} は見つかりませんでした。"
set_folders_permissions:
permission_not_set: '%{path} に権限を設定できませんでした。'
error: An unexpected error occurred. Please ensure that OneDrive is reachable and check OpenProject worker logs for more information.
@@ -303,41 +303,41 @@ ja:
drive_id_format: ドライブIDフォーマット
header: 構成
host: ホスト URL
- host_url_accessible: アクセス可能なホストURL
+ host_url_accessible: ホスト URL アクセス
storage_configured: 設定完了
- tenant_id: テナントID
+ tenant_id: Tenant ID
failures:
- other: "%{count} チェック失敗"
+ other: "%{count} チェックに失敗しました"
success: すべてのチェックに合格
warnings:
other: "%{count} は警告を返しました"
connection_validation:
client_id_invalid: 設定されたOAuth 2クライアントIDが無効です。設定を確認してください。
client_secret_invalid: 設定されたOAuth 2クライアントシークレットが無効です。設定を確認してください。
- nc_dependency_missing: 'ファイルストレージに必要な依存関係がありません。次の依存関係を追加してください: %{dependency}。'
+ nc_dependency_missing: 'ファイルストレージに必要な依存関係がありません。次の依存関係を追加してください: %{dependency}。'
nc_dependency_version_mismatch: '%{dependency} アプリのバージョンがサポートされていません。Nextcloudサーバーをアップデートしてください。'
nc_host_not_found: 設定されたホストURLにNextcloudサーバーが見つかりません。設定を確認してください。
nc_oauth_request_not_found: 現在接続しているユーザーを取得するエンドポイントが見つかりませんでした。詳細については、サーバーのログを確認してください。
nc_oauth_request_unauthorized: 現在のユーザーにはリモートファイルストレージにアクセスする権限がありません。サーバーのログを確認してください。
- nc_oauth_token_missing: OpenProjectでは、ユーザーがNextcloudアカウントをリンクしていないため、ユーザーレベルのNextcloudとの通信をテストできません。
+ nc_oauth_token_missing: OpenProject は、Nextcloudアカウントへのリンクがまだないため、Nextcloudとのユーザーレベルの通信をテストできません。
nc_team_folder_not_found: The team folder could not be found.
nc_unexpected_content: Unexpected content found in the managed team folder.
nc_userless_access_denied: 設定されているアプリのパスワードが無効です。
not_configured: 接続を検証できませんでした。先に設定を完了してください。
- od_client_cant_delete_folder: クライアントがフォルダの削除に失敗しています。お使いのストレージのセットアップドキュメントを確認してください。
- od_client_write_permission_missing: クライアントの書き込み権限が不足しているようです。お使いのストレージのセットアップドキュメントを確認してください。
- od_drive_id_invalid: 設定されたドライブIDが無効のようです。設定を確認してください。
- od_drive_id_not_found: 設定されたドライブIDが見つかりません。設定を確認してください。
- od_oauth_request_not_found: 現在接続しているユーザーを取得するエンドポイントが見つかりませんでした。詳細については、サーバーのログを確認してください。
- od_oauth_request_unauthorized: 現在のユーザーにはリモートファイルストレージにアクセスする権限がありません。サーバーのログを確認してください。
- od_oauth_token_missing: OpenProjectは、ユーザーがまだMicrosoftアカウントをリンクしていないため、OneDriveとのユーザーレベルの通信をテストできません。
- od_tenant_id_wrong: 設定されたディレクトリ(テナント)IDが無効です。設定を確認してください。
+ od_client_cant_delete_folder: クライアントがフォルダを削除できません。ストレージのセットアップドキュメントを確認してください。
+ od_client_write_permission_missing: クライアントは書き込み権限がありません。ストレージの設定ドキュメントを確認してください。
+ od_drive_id_invalid: 設定されたドライブ ID が無効です。設定を確認してください。
+ od_drive_id_not_found: 設定されたドライブ ID が見つかりません。設定を確認してください。
+ od_oauth_request_not_found: 現在接続されているユーザーを取得するエンドポイントが見つかりませんでした。詳細についてはサーバーログを確認してください。
+ od_oauth_request_unauthorized: 現在のユーザーはリモートファイルストレージにアクセスする権限がありません。詳細についてはサーバーログを確認してください。
+ od_oauth_token_missing: OpenProject は、ユーザーが Microsoft アカウントをまだリンクしていないため、OneDrive とのユーザー レベルの通信をテストできません。
+ od_tenant_id_wrong: 設定されたディレクトリ (テナント) IDは無効です。設定を確認してください。
od_test_folder_exists: テストに必要なフォルダ %{folder_name} はすでに存在します。削除して再度お試しください。
od_unexpected_content: ドライブに予期しないコンテンツが見つかりました。
- offline_access_scope_missing: OpenID Connectプロバイダがoffline_accessスコープを要求するように設定することをお勧めします。統合はまだ機能するかもしれませんが、リフレッシュトークンの有効期限が切れていないことを確認してください。
+ offline_access_scope_missing: offline_access スコープを要求するために OpenID Connect プロバイダを設定することをお勧めします。 統合はまだ動作するかもしれませんが、更新トークンが期限切れでないことを確認してください。
oidc_cant_refresh_token: ストレージへのアクセスを確認中にエラーが発生しました。詳細についてはサーバーログを確認してください。
- oidc_non_oidc_user: 現在のユーザーはプロビジョニングされていますが、OpenID Connect (OIDC) Identity Providerによってプロビジョニングされていません。OIDCプロビジョニングされたユーザーでチェックを再実行してください。
- oidc_non_provisioned_user: 現在のユーザはOpenID Connect Identity Providerから提供されていません。提供されたユーザーでチェックを再実行してください。
+ oidc_non_oidc_user: 現在のユーザは、プロビジョニング中にOpenID Connect(OIDC)アイデンティティプロバイダによってプロビジョニングされていませんでした。OIDCプロビジョニングされたユーザでチェックを再実行してください。
+ oidc_non_provisioned_user: 現在のユーザーはOpenID Connectアイデンティティプロバイダーによって提供されていません。指定されたユーザーとチェックを再実行してください。
oidc_provider_cant_exchange: OpenID Connectプロバイダはトークン交換をサポートしていないようですが、トークン交換はストレージ用に設定されています。
oidc_token_acquisition_failed: OpenID Connectのセットアップでは、必要なオーディエンスが提供されておらず、トークン交換機能も提供されていません。詳しくはドキュメントをご覧ください。
oidc_token_exchange_failed: OpenID Connect ProviderのToken Exchange設定に問題があるようです。設定を確認し、再度お試しください。
@@ -352,7 +352,7 @@ ja:
sp_oauth_token_missing: OpenProject は、ユーザーがまだ SharePoint アカウントをリンクしていないため、ユーザーレベルの SharePoint との通信をテストできません。
sp_tenant_id_missing: 構成されたディレクトリ(テナント)IDがSharePointにありません。設定を確認してください。
sp_unexpected_content: Unexpected content found in the SharePoint Document Library.
- unknown_error: 接続を検証できませんでした。不明なエラーが発生しました。詳細については、サーバーのログを確認してください。
+ unknown_error: 接続を検証できませんでした。不明なエラーが発生しました。詳細についてはサーバーログを確認してください。
label_error: エラー
label_failed: 失敗しました
label_healthy: 健康的
@@ -360,55 +360,55 @@ ja:
label_pending: 保留中
label_skipped: スキップ
label_warning: 注意
- no_report: 報告書なし
- no_report_description: 今すぐチェックを実行し、このファイル・ストレージの完全な健全性ステータスをレポートする。
+ no_report: 利用可能なレポートがありません
+ no_report_description: 今すぐこのファイルストレージの完全な健康状態レポートを確認します。
open_report: 完全な健康報告を開く
project_folders:
subtitle: 自動的に管理されるプロジェクトフォルダ
- since: '%{datetime}より'
+ since: '%{datetime} 以降'
summary:
- failure: いくつかのチェックに失敗し、システムが期待通りに機能しない。
- success: すべての接続とシステムは期待通りに機能している。
- warning: いくつかのチェックは警告を返した。これは予期せぬ動作につながる可能性がある。
- title: 健康状態報告
+ failure: いくつかのチェックに失敗し、システムが期待どおりに動作しません。
+ success: すべての接続とシステムは期待どおりに動作しています。
+ warning: いくつかのチェックが警告を返しました。これは予期しない動作につながる可能性があります。
+ title: 健康状態レポート
health_email_notifications:
description_disabled: 管理者は、重要なアップデートがあった場合、メールでアップデートを受け取ることはできません。
description_enabled: 管理者は、重要なアップデートがあった場合、メールで最新情報を受け取ります。
- error_could_not_be_saved: 電子メール通知の設定を保存できませんでした。もう一度お試しください。
+ error_could_not_be_saved: メール通知設定を保存できませんでした。もう一度やり直してください。
title: 管理者にメールで更新する
help_texts:
- project_folder: プロジェクトフォルダは、このプロジェクトのファイルアップロード用のデフォルトフォルダです。それでも、ユーザーは他の場所にファイルをアップロードすることができます。
- project_folder_bulk: プロジェクトフォルダは、選択したすべてのプロジェクトのファイルアップロード用のデフォルトフォルダです。これは、各プロジェクト設定で個別に変更できます。それでも、ユーザーは他の場所にファイルをアップロードすることができます。
+ project_folder: プロジェクトフォルダは、このプロジェクトのファイルアップロードのデフォルトフォルダです。ただし、ユーザーは他の場所にファイルをアップロードすることができます。
+ project_folder_bulk: プロジェクトフォルダは、選択したすべてのプロジェクトのファイルアップロードのデフォルトフォルダです。 プロジェクトごとの設定で個別に変更することができますが、ユーザーは別の場所にファイルをアップロードすることもできます。
instructions:
- all_available_storages_already_added: 利用可能なすべてのストレージはすでにプロジェクトに追加されている。
- authentication_method: OpenProject とストレージ間のリクエストの認証方法。
- automatic_folder: これにより、このプロジェクトのルート・フォルダーが自動的に作成され、各プロジェクト・メンバーのアクセス権が管理されます。
- empty_project_folder_validation: 続行するには、フォルダの選択が必須です。
- existing_manual_folder: 既存のフォルダをこのプロジェクトのルートフォルダとして指定することができます。ただし、パーミッションは自動的に管理されないため、管理者は関連するユーザーがアクセスできることを手動で確認する必要があります。選択したフォルダは、複数のプロジェクトで使用できます。
- host: https:// を含むストレージのホスト・アドレスを追加してください。255文字以内にしてください。
- managed_project_folders_application_password_caption: '%{provider_type_link}からこの値をコピーして、自動管理フォルダを有効にする。'
- name: ユーザーが複数のストレージを区別できるように、ストレージに名前を付ける。
+ all_available_storages_already_added: 利用可能なすべてのストレージが既にプロジェクトに追加されています。
+ authentication_method: OpenProjectとストレージ間のリクエストは認証されます。
+ automatic_folder: これにより、このプロジェクトのルートフォルダが自動的に作成され、各プロジェクトメンバーのアクセス権限が管理されます。
+ empty_project_folder_validation: フォルダの選択は必須です。
+ existing_manual_folder: このプロジェクトのルートフォルダとして既存のフォルダを指定できます。 ただし、権限は自動的に管理されておらず、管理者は関連するユーザーに手動でアクセス権があることを確認する必要があります。 選択したフォルダは複数のプロジェクトで使用できます。
+ host: https://を含むストレージのホストアドレスを追加してください。255文字以内にしてください。
+ managed_project_folders_application_password_caption: '%{provider_type_link} からこの値をコピーすることで、自動管理フォルダを有効にします。'
+ name: ユーザーが複数のストレージを区別できるように、ストレージに名前を付けます。
new_storage: 詳しくは、