diff options
author | Christopher Geelen <christopher.geelen@vinotion.nl> | 2016-07-27 13:58:23 +0200 |
---|---|---|
committer | Christopher Geelen <christopher.geelen@vinotion.nl> | 2016-07-27 13:58:23 +0200 |
commit | 24745182724ca69092554eb5946e31584420f68a (patch) | |
tree | 386cdf7a8d7bf7ad2d80d938333bafbaf0fedcbc /app | |
parent | 160c0b885eb4f1a1a1baa2b6b9fc6d99fdb80d0c (diff) | |
parent | 9649f7ba82ba7fe6a470abfe9f65e214cc68fa34 (diff) |
Merge remote-tracking branch 'upstream/master'
Conflicts:
app/Job/NotificationJob.php
Diffstat (limited to 'app')
174 files changed, 3577 insertions, 1994 deletions
diff --git a/app/Action/Base.php b/app/Action/Base.php index e5c65a17..9a502a08 100644 --- a/app/Action/Base.php +++ b/app/Action/Base.php @@ -7,7 +7,7 @@ use Kanboard\Event\GenericEvent; /** * Base class for automatic actions * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ abstract class Base extends \Kanboard\Core\Base @@ -216,7 +216,8 @@ abstract class Base extends \Kanboard\Core\Base */ public function hasRequiredProject(array $data) { - return isset($data['project_id']) && $data['project_id'] == $this->getProjectId(); + return (isset($data['project_id']) && $data['project_id'] == $this->getProjectId()) || + (isset($data['task']['project_id']) && $data['task']['project_id'] == $this->getProjectId()); } /** @@ -226,10 +227,14 @@ abstract class Base extends \Kanboard\Core\Base * @param array $data Event data dictionary * @return bool True if all keys are there */ - public function hasRequiredParameters(array $data) + public function hasRequiredParameters(array $data, array $parameters = array()) { - foreach ($this->getEventRequiredParameters() as $parameter) { - if (! isset($data[$parameter])) { + $parameters = $parameters ?: $this->getEventRequiredParameters(); + + foreach ($parameters as $key => $value) { + if (is_array($value)) { + return isset($data[$key]) && $this->hasRequiredParameters($data[$key], $value); + } else if (! isset($data[$value])) { return false; } } diff --git a/app/Action/CommentCreation.php b/app/Action/CommentCreation.php index 60ca24f7..301d2cf9 100644 --- a/app/Action/CommentCreation.php +++ b/app/Action/CommentCreation.php @@ -5,7 +5,7 @@ namespace Kanboard\Action; /** * Create automatically a comment from a webhook * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class CommentCreation extends Base diff --git a/app/Action/CommentCreationMoveTaskColumn.php b/app/Action/CommentCreationMoveTaskColumn.php index 1b16f481..d5bdd807 100644 --- a/app/Action/CommentCreationMoveTaskColumn.php +++ b/app/Action/CommentCreationMoveTaskColumn.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Add a comment of the triggering event to the task description. * - * @package action + * @package Kanboard\Action * @author Oren Ben-Kiki */ class CommentCreationMoveTaskColumn extends Base @@ -55,7 +55,13 @@ class CommentCreationMoveTaskColumn extends Base */ public function getEventRequiredParameters() { - return array('task_id', 'column_id'); + return array( + 'task_id', + 'task' => array( + 'column_id', + 'project_id', + ), + ); } /** @@ -71,7 +77,7 @@ class CommentCreationMoveTaskColumn extends Base return false; } - $column = $this->columnModel->getById($data['column_id']); + $column = $this->columnModel->getById($data['task']['column_id']); return (bool) $this->commentModel->create(array( 'comment' => t('Moved to column %s', $column['title']), @@ -89,6 +95,6 @@ class CommentCreationMoveTaskColumn extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('column_id'); + return $data['task']['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Action/TaskAssignCategoryColor.php b/app/Action/TaskAssignCategoryColor.php index fc486870..9228e1ff 100644 --- a/app/Action/TaskAssignCategoryColor.php +++ b/app/Action/TaskAssignCategoryColor.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Set a category automatically according to the color * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskAssignCategoryColor extends Base @@ -60,7 +60,10 @@ class TaskAssignCategoryColor extends Base { return array( 'task_id', - 'color_id', + 'task' => array( + 'project_id', + 'color_id', + ), ); } @@ -90,6 +93,6 @@ class TaskAssignCategoryColor extends Base */ public function hasRequiredCondition(array $data) { - return $data['color_id'] == $this->getParam('color_id'); + return $data['task']['color_id'] == $this->getParam('color_id'); } } diff --git a/app/Action/TaskAssignCategoryLabel.php b/app/Action/TaskAssignCategoryLabel.php index 48299010..c390414e 100644 --- a/app/Action/TaskAssignCategoryLabel.php +++ b/app/Action/TaskAssignCategoryLabel.php @@ -5,7 +5,7 @@ namespace Kanboard\Action; /** * Set a category automatically according to a label * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskAssignCategoryLabel extends Base diff --git a/app/Action/TaskAssignCategoryLink.php b/app/Action/TaskAssignCategoryLink.php index 6937edd1..6c4b6c96 100644 --- a/app/Action/TaskAssignCategoryLink.php +++ b/app/Action/TaskAssignCategoryLink.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskLinkModel; /** * Set a category automatically according to a task link * - * @package action + * @package Kanboard\Action * @author Olivier Maridat * @author Frederic Guillot */ @@ -60,8 +60,10 @@ class TaskAssignCategoryLink extends Base public function getEventRequiredParameters() { return array( - 'task_id', - 'link_id', + 'task_link' => array( + 'task_id', + 'link_id', + ) ); } @@ -75,7 +77,7 @@ class TaskAssignCategoryLink extends Base public function doAction(array $data) { $values = array( - 'id' => $data['task_id'], + 'id' => $data['task_link']['task_id'], 'category_id' => $this->getParam('category_id'), ); @@ -91,9 +93,8 @@ class TaskAssignCategoryLink extends Base */ public function hasRequiredCondition(array $data) { - if ($data['link_id'] == $this->getParam('link_id')) { - $task = $this->taskFinderModel->getById($data['task_id']); - return empty($task['category_id']); + if ($data['task_link']['link_id'] == $this->getParam('link_id')) { + return empty($data['task']['category_id']); } return false; diff --git a/app/Action/TaskAssignColorCategory.php b/app/Action/TaskAssignColorCategory.php index 284b8f40..a136ffd2 100644 --- a/app/Action/TaskAssignColorCategory.php +++ b/app/Action/TaskAssignColorCategory.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Assign a color to a specific category * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskAssignColorCategory extends Base @@ -60,7 +60,10 @@ class TaskAssignColorCategory extends Base { return array( 'task_id', - 'category_id', + 'task' => array( + 'project_id', + 'category_id', + ), ); } @@ -90,6 +93,6 @@ class TaskAssignColorCategory extends Base */ public function hasRequiredCondition(array $data) { - return $data['category_id'] == $this->getParam('category_id'); + return $data['task']['category_id'] == $this->getParam('category_id'); } } diff --git a/app/Action/TaskAssignColorColumn.php b/app/Action/TaskAssignColorColumn.php index 57fd6f44..da6e3aed 100644 --- a/app/Action/TaskAssignColorColumn.php +++ b/app/Action/TaskAssignColorColumn.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Assign a color to a task * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskAssignColorColumn extends Base @@ -61,7 +61,10 @@ class TaskAssignColorColumn extends Base { return array( 'task_id', - 'column_id', + 'task' => array( + 'project_id', + 'column_id', + ), ); } @@ -91,6 +94,6 @@ class TaskAssignColorColumn extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('column_id'); + return $data['task']['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Action/TaskAssignColorLink.php b/app/Action/TaskAssignColorLink.php index 9ab5458b..19c37afe 100644 --- a/app/Action/TaskAssignColorLink.php +++ b/app/Action/TaskAssignColorLink.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskLinkModel; /** * Assign a color to a specific task link * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskAssignColorLink extends Base @@ -59,8 +59,10 @@ class TaskAssignColorLink extends Base public function getEventRequiredParameters() { return array( - 'task_id', - 'link_id', + 'task_link' => array( + 'task_id', + 'link_id', + ) ); } @@ -74,7 +76,7 @@ class TaskAssignColorLink extends Base public function doAction(array $data) { $values = array( - 'id' => $data['task_id'], + 'id' => $data['task_link']['task_id'], 'color_id' => $this->getParam('color_id'), ); @@ -90,6 +92,6 @@ class TaskAssignColorLink extends Base */ public function hasRequiredCondition(array $data) { - return $data['link_id'] == $this->getParam('link_id'); + return $data['task_link']['link_id'] == $this->getParam('link_id'); } } diff --git a/app/Action/TaskAssignColorPriority.php b/app/Action/TaskAssignColorPriority.php index eae1b771..37f7ffed 100644 --- a/app/Action/TaskAssignColorPriority.php +++ b/app/Action/TaskAssignColorPriority.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Assign a color to a priority * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskAssignColorPriority extends Base @@ -60,7 +60,10 @@ class TaskAssignColorPriority extends Base { return array( 'task_id', - 'priority', + 'task' => array( + 'project_id', + 'priority', + ), ); } @@ -90,6 +93,6 @@ class TaskAssignColorPriority extends Base */ public function hasRequiredCondition(array $data) { - return $data['priority'] == $this->getParam('priority'); + return $data['task']['priority'] == $this->getParam('priority'); } } diff --git a/app/Action/TaskAssignColorUser.php b/app/Action/TaskAssignColorUser.php index 4bcf7a5c..468d0198 100644 --- a/app/Action/TaskAssignColorUser.php +++ b/app/Action/TaskAssignColorUser.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Assign a color to a specific user * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskAssignColorUser extends Base @@ -61,7 +61,10 @@ class TaskAssignColorUser extends Base { return array( 'task_id', - 'owner_id', + 'task' => array( + 'project_id', + 'owner_id', + ), ); } @@ -91,6 +94,6 @@ class TaskAssignColorUser extends Base */ public function hasRequiredCondition(array $data) { - return $data['owner_id'] == $this->getParam('user_id'); + return $data['task']['owner_id'] == $this->getParam('user_id'); } } diff --git a/app/Action/TaskAssignCurrentUser.php b/app/Action/TaskAssignCurrentUser.php index 997aa98f..dee5e7db 100644 --- a/app/Action/TaskAssignCurrentUser.php +++ b/app/Action/TaskAssignCurrentUser.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Assign a task to the logged user * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskAssignCurrentUser extends Base diff --git a/app/Action/TaskAssignCurrentUserColumn.php b/app/Action/TaskAssignCurrentUserColumn.php index bc28a90b..60ada7ef 100644 --- a/app/Action/TaskAssignCurrentUserColumn.php +++ b/app/Action/TaskAssignCurrentUserColumn.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Assign a task to the logged user on column change * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskAssignCurrentUserColumn extends Base @@ -59,7 +59,10 @@ class TaskAssignCurrentUserColumn extends Base { return array( 'task_id', - 'column_id', + 'task' => array( + 'project_id', + 'column_id', + ), ); } @@ -93,6 +96,6 @@ class TaskAssignCurrentUserColumn extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('column_id'); + return $data['task']['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Action/TaskAssignDueDateOnCreation.php b/app/Action/TaskAssignDueDateOnCreation.php new file mode 100644 index 00000000..5c6e2b61 --- /dev/null +++ b/app/Action/TaskAssignDueDateOnCreation.php @@ -0,0 +1,96 @@ +<?php + +namespace Kanboard\Action; + +use Kanboard\Model\TaskModel; + +/** + * Set the due date of task + * + * @package Kanboard\Action + * @author Frederic Guillot + */ +class TaskAssignDueDateOnCreation extends Base +{ + /** + * Get automatic action description + * + * @access public + * @return string + */ + public function getDescription() + { + return t('Automatically set the due date on task creation'); + } + + /** + * Get the list of compatible events + * + * @access public + * @return array + */ + public function getCompatibleEvents() + { + return array( + TaskModel::EVENT_CREATE, + ); + } + + /** + * Get the required parameter for the action (defined by the user) + * + * @access public + * @return array + */ + public function getActionRequiredParameters() + { + return array( + 'duration' => t('Duration in days') + ); + } + + /** + * Get the required parameter for the event + * + * @access public + * @return string[] + */ + public function getEventRequiredParameters() + { + return array( + 'task_id', + 'task' => array( + 'project_id', + ), + ); + } + + /** + * Execute the action (set the task color) + * + * @access public + * @param array $data Event data dictionary + * @return bool True if the action was executed or false when not executed + */ + public function doAction(array $data) + { + $values = array( + 'id' => $data['task_id'], + 'date_due' => strtotime('+'.$this->getParam('duration').'days'), + ); + + return $this->taskModificationModel->update($values, false); + } + + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + return true; + } +} diff --git a/app/Action/TaskAssignSpecificUser.php b/app/Action/TaskAssignSpecificUser.php index 50a2b2ae..daf9e1df 100644 --- a/app/Action/TaskAssignSpecificUser.php +++ b/app/Action/TaskAssignSpecificUser.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Assign a task to a specific user * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskAssignSpecificUser extends Base @@ -61,7 +61,10 @@ class TaskAssignSpecificUser extends Base { return array( 'task_id', - 'column_id', + 'task' => array( + 'project_id', + 'column_id', + ), ); } @@ -91,6 +94,6 @@ class TaskAssignSpecificUser extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('column_id'); + return $data['task']['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Action/TaskAssignUser.php b/app/Action/TaskAssignUser.php index 9ea22986..8727b672 100644 --- a/app/Action/TaskAssignUser.php +++ b/app/Action/TaskAssignUser.php @@ -5,7 +5,7 @@ namespace Kanboard\Action; /** * Assign a task to someone * - * @package action + * @package Kanboard\Actionv * @author Frederic Guillot */ class TaskAssignUser extends Base diff --git a/app/Action/TaskClose.php b/app/Action/TaskClose.php index 91e8cf43..e476e9ba 100644 --- a/app/Action/TaskClose.php +++ b/app/Action/TaskClose.php @@ -5,7 +5,7 @@ namespace Kanboard\Action; /** * Close automatically a task * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskClose extends Base diff --git a/app/Action/TaskCloseColumn.php b/app/Action/TaskCloseColumn.php index 1edce8fa..523996f4 100644 --- a/app/Action/TaskCloseColumn.php +++ b/app/Action/TaskCloseColumn.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Close automatically a task in a specific column * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskCloseColumn extends Base @@ -55,7 +55,13 @@ class TaskCloseColumn extends Base */ public function getEventRequiredParameters() { - return array('task_id', 'column_id'); + return array( + 'task_id', + 'task' => array( + 'project_id', + 'column_id', + ) + ); } /** @@ -79,6 +85,6 @@ class TaskCloseColumn extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('column_id'); + return $data['task']['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Action/TaskCloseNoActivity.php b/app/Action/TaskCloseNoActivity.php index 5a10510f..ea724d8c 100644 --- a/app/Action/TaskCloseNoActivity.php +++ b/app/Action/TaskCloseNoActivity.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Close automatically a task after when inactive * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskCloseNoActivity extends Base diff --git a/app/Action/TaskCloseNoActivityColumn.php b/app/Action/TaskCloseNoActivityColumn.php index 7af0b7fc..b2ee5224 100644 --- a/app/Action/TaskCloseNoActivityColumn.php +++ b/app/Action/TaskCloseNoActivityColumn.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Close automatically a task after inactive and in an defined column * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskCloseNoActivityColumn extends Base diff --git a/app/Action/TaskCreation.php b/app/Action/TaskCreation.php index e9e5c5f3..01d91228 100644 --- a/app/Action/TaskCreation.php +++ b/app/Action/TaskCreation.php @@ -5,7 +5,7 @@ namespace Kanboard\Action; /** * Create automatically a task from a webhook * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskCreation extends Base @@ -52,6 +52,7 @@ class TaskCreation extends Base public function getEventRequiredParameters() { return array( + 'project_id', 'reference', 'title', ); diff --git a/app/Action/TaskDuplicateAnotherProject.php b/app/Action/TaskDuplicateAnotherProject.php index d70d2ee8..0ad7713c 100644 --- a/app/Action/TaskDuplicateAnotherProject.php +++ b/app/Action/TaskDuplicateAnotherProject.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Duplicate a task to another project * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskDuplicateAnotherProject extends Base @@ -62,7 +62,10 @@ class TaskDuplicateAnotherProject extends Base { return array( 'task_id', - 'column_id', + 'task' => array( + 'project_id', + 'column_id', + ) ); } @@ -76,7 +79,12 @@ class TaskDuplicateAnotherProject extends Base public function doAction(array $data) { $destination_column_id = $this->columnModel->getFirstColumnId($this->getParam('project_id')); - return (bool) $this->taskProjectDuplicationModel->duplicateToProject($data['task_id'], $this->getParam('project_id'), null, $destination_column_id); + return (bool) $this->taskProjectDuplicationModel->duplicateToProject( + $data['task_id'], + $this->getParam('project_id'), + null, + $destination_column_id + ); } /** @@ -88,6 +96,6 @@ class TaskDuplicateAnotherProject extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('column_id') && $data['project_id'] != $this->getParam('project_id'); + return $data['task']['column_id'] == $this->getParam('column_id') && $data['task']['project_id'] != $this->getParam('project_id'); } } diff --git a/app/Action/TaskEmail.php b/app/Action/TaskEmail.php index 7f9ba416..fdfe7987 100644 --- a/app/Action/TaskEmail.php +++ b/app/Action/TaskEmail.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Email a task to someone * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskEmail extends Base @@ -62,7 +62,10 @@ class TaskEmail extends Base { return array( 'task_id', - 'column_id', + 'task' => array( + 'project_id', + 'column_id', + ), ); } @@ -78,13 +81,14 @@ class TaskEmail extends Base $user = $this->userModel->getById($this->getParam('user_id')); if (! empty($user['email'])) { - $task = $this->taskFinderModel->getDetails($data['task_id']); - $this->emailClient->send( $user['email'], $user['name'] ?: $user['username'], $this->getParam('subject'), - $this->template->render('notification/task_create', array('task' => $task, 'application_url' => $this->configModel->get('application_url'))) + $this->template->render('notification/task_create', array( + 'task' => $data['task'], + 'application_url' => $this->configModel->get('application_url'), + )) ); return true; @@ -102,6 +106,6 @@ class TaskEmail extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('column_id'); + return $data['task']['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Action/TaskEmailNoActivity.php b/app/Action/TaskEmailNoActivity.php index c60702fb..cac4281e 100644 --- a/app/Action/TaskEmailNoActivity.php +++ b/app/Action/TaskEmailNoActivity.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Email a task with no activity * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskEmailNoActivity extends Base diff --git a/app/Action/TaskMoveAnotherProject.php b/app/Action/TaskMoveAnotherProject.php index 66635a63..0fa22b1b 100644 --- a/app/Action/TaskMoveAnotherProject.php +++ b/app/Action/TaskMoveAnotherProject.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Move a task to another project * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskMoveAnotherProject extends Base @@ -61,8 +61,10 @@ class TaskMoveAnotherProject extends Base { return array( 'task_id', - 'column_id', - 'project_id', + 'task' => array( + 'project_id', + 'column_id', + ) ); } @@ -87,6 +89,6 @@ class TaskMoveAnotherProject extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('column_id') && $data['project_id'] != $this->getParam('project_id'); + return $data['task']['column_id'] == $this->getParam('column_id') && $data['task']['project_id'] != $this->getParam('project_id'); } } diff --git a/app/Action/TaskMoveColumnAssigned.php b/app/Action/TaskMoveColumnAssigned.php index 7e3db9c5..1cfe6743 100644 --- a/app/Action/TaskMoveColumnAssigned.php +++ b/app/Action/TaskMoveColumnAssigned.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Move a task to another column when an assignee is set * - * @package action + * @package Kanboard\Action * @author Francois Ferrand */ class TaskMoveColumnAssigned extends Base @@ -61,8 +61,13 @@ class TaskMoveColumnAssigned extends Base { return array( 'task_id', - 'column_id', - 'owner_id' + 'task' => array( + 'project_id', + 'column_id', + 'owner_id', + 'position', + 'swimlane_id', + ) ); } @@ -75,14 +80,12 @@ class TaskMoveColumnAssigned extends Base */ public function doAction(array $data) { - $original_task = $this->taskFinderModel->getById($data['task_id']); - return $this->taskPositionModel->movePosition( - $data['project_id'], + $data['task']['project_id'], $data['task_id'], $this->getParam('dest_column_id'), - $original_task['position'], - $original_task['swimlane_id'], + $data['task']['position'], + $data['task']['swimlane_id'], false ); } @@ -96,6 +99,6 @@ class TaskMoveColumnAssigned extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('src_column_id') && $data['owner_id'] > 0; + return $data['task']['column_id'] == $this->getParam('src_column_id') && $data['task']['owner_id'] > 0; } } diff --git a/app/Action/TaskMoveColumnCategoryChange.php b/app/Action/TaskMoveColumnCategoryChange.php index e4f88760..13d6ee4f 100644 --- a/app/Action/TaskMoveColumnCategoryChange.php +++ b/app/Action/TaskMoveColumnCategoryChange.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Move a task to another column when the category is changed * - * @package action + * @package Kanboard\Action * @author Francois Ferrand */ class TaskMoveColumnCategoryChange extends Base @@ -60,8 +60,13 @@ class TaskMoveColumnCategoryChange extends Base { return array( 'task_id', - 'column_id', - 'category_id', + 'task' => array( + 'project_id', + 'column_id', + 'category_id', + 'position', + 'swimlane_id', + ) ); } @@ -74,14 +79,12 @@ class TaskMoveColumnCategoryChange extends Base */ public function doAction(array $data) { - $original_task = $this->taskFinderModel->getById($data['task_id']); - return $this->taskPositionModel->movePosition( - $data['project_id'], + $data['task']['project_id'], $data['task_id'], $this->getParam('dest_column_id'), - $original_task['position'], - $original_task['swimlane_id'], + $data['task']['position'], + $data['task']['swimlane_id'], false ); } @@ -95,6 +98,6 @@ class TaskMoveColumnCategoryChange extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] != $this->getParam('dest_column_id') && $data['category_id'] == $this->getParam('category_id'); + return $data['task']['column_id'] != $this->getParam('dest_column_id') && $data['task']['category_id'] == $this->getParam('category_id'); } } diff --git a/app/Action/TaskMoveColumnClosed.php b/app/Action/TaskMoveColumnClosed.php new file mode 100644 index 00000000..3f3e2124 --- /dev/null +++ b/app/Action/TaskMoveColumnClosed.php @@ -0,0 +1,102 @@ +<?php + +namespace Kanboard\Action; + +use Kanboard\Model\TaskModel; + +/** + * Move a task to another column when the task is closed + * + * @package Kanboard\Action + * @author Frederic Guillot + */ +class TaskMoveColumnClosed extends Base +{ + /** + * Get automatic action description + * + * @access public + * @return string + */ + public function getDescription() + { + return t('Move the task to another column when closed'); + } + + /** + * Get the list of compatible events + * + * @access public + * @return array + */ + public function getCompatibleEvents() + { + return array( + TaskModel::EVENT_CLOSE, + ); + } + + /** + * Get the required parameter for the action (defined by the user) + * + * @access public + * @return array + */ + public function getActionRequiredParameters() + { + return array( + 'dest_column_id' => t('Destination column'), + ); + } + + /** + * Get the required parameter for the event + * + * @access public + * @return string[] + */ + public function getEventRequiredParameters() + { + return array( + 'task_id', + 'task' => array( + 'project_id', + 'column_id', + 'swimlane_id', + 'is_active', + ) + ); + } + + /** + * Execute the action (move the task to another column) + * + * @access public + * @param array $data Event data dictionary + * @return bool True if the action was executed or false when not executed + */ + public function doAction(array $data) + { + return $this->taskPositionModel->movePosition( + $data['task']['project_id'], + $data['task']['id'], + $this->getParam('dest_column_id'), + 1, + $data['task']['swimlane_id'], + false, + false + ); + } + + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + return $data['task']['column_id'] != $this->getParam('dest_column_id') && $data['task']['is_active'] == 0; + } +} diff --git a/app/Action/TaskMoveColumnNotMovedPeriod.php b/app/Action/TaskMoveColumnNotMovedPeriod.php new file mode 100644 index 00000000..87e7e405 --- /dev/null +++ b/app/Action/TaskMoveColumnNotMovedPeriod.php @@ -0,0 +1,104 @@ +<?php + +namespace Kanboard\Action; + +use Kanboard\Model\TaskModel; + +/** + * Move a task to another column when not moved during a given period + * + * @package Kanboard\Action + * @author Frederic Guillot + */ +class TaskMoveColumnNotMovedPeriod extends Base +{ + /** + * Get automatic action description + * + * @access public + * @return string + */ + public function getDescription() + { + return t('Move the task to another column when not moved during a given period'); + } + + /** + * Get the list of compatible events + * + * @access public + * @return array + */ + public function getCompatibleEvents() + { + return array(TaskModel::EVENT_DAILY_CRONJOB); + } + + /** + * Get the required parameter for the action (defined by the user) + * + * @access public + * @return array + */ + public function getActionRequiredParameters() + { + return array( + 'duration' => t('Duration in days'), + 'src_column_id' => t('Source column'), + 'dest_column_id' => t('Destination column'), + ); + } + + /** + * Get the required parameter for the event + * + * @access public + * @return string[] + */ + public function getEventRequiredParameters() + { + return array('tasks'); + } + + /** + * Execute the action (close the task) + * + * @access public + * @param array $data Event data dictionary + * @return bool True if the action was executed or false when not executed + */ + public function doAction(array $data) + { + $results = array(); + $max = $this->getParam('duration') * 86400; + + foreach ($data['tasks'] as $task) { + $duration = time() - $task['date_moved']; + + if ($duration > $max && $task['column_id'] == $this->getParam('src_column_id')) { + $results[] = $this->taskPositionModel->movePosition( + $task['project_id'], + $task['id'], + $this->getParam('dest_column_id'), + 1, + $task['swimlane_id'], + false + ); + } + } + + return in_array(true, $results, true); + } + + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + return count($data['tasks']) > 0; + } +} diff --git a/app/Action/TaskMoveColumnUnAssigned.php b/app/Action/TaskMoveColumnUnAssigned.php index c3ae9e1d..ab63d624 100644 --- a/app/Action/TaskMoveColumnUnAssigned.php +++ b/app/Action/TaskMoveColumnUnAssigned.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Move a task to another column when an assignee is cleared * - * @package action + * @package Kanboard\Action * @author Francois Ferrand */ class TaskMoveColumnUnAssigned extends Base @@ -61,8 +61,13 @@ class TaskMoveColumnUnAssigned extends Base { return array( 'task_id', - 'column_id', - 'owner_id' + 'task' => array( + 'project_id', + 'column_id', + 'owner_id', + 'position', + 'swimlane_id', + ) ); } @@ -75,14 +80,12 @@ class TaskMoveColumnUnAssigned extends Base */ public function doAction(array $data) { - $original_task = $this->taskFinderModel->getById($data['task_id']); - return $this->taskPositionModel->movePosition( - $data['project_id'], + $data['task']['project_id'], $data['task_id'], $this->getParam('dest_column_id'), - $original_task['position'], - $original_task['swimlane_id'], + $data['task']['position'], + $data['task']['swimlane_id'], false ); } @@ -96,6 +99,6 @@ class TaskMoveColumnUnAssigned extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('src_column_id') && $data['owner_id'] == 0; + return $data['task']['column_id'] == $this->getParam('src_column_id') && $data['task']['owner_id'] == 0; } } diff --git a/app/Action/TaskOpen.php b/app/Action/TaskOpen.php index 8e847b8e..49017831 100644 --- a/app/Action/TaskOpen.php +++ b/app/Action/TaskOpen.php @@ -5,7 +5,7 @@ namespace Kanboard\Action; /** * Open automatically a task * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskOpen extends Base diff --git a/app/Action/TaskUpdateStartDate.php b/app/Action/TaskUpdateStartDate.php index e5410a87..160f6ee5 100644 --- a/app/Action/TaskUpdateStartDate.php +++ b/app/Action/TaskUpdateStartDate.php @@ -7,7 +7,7 @@ use Kanboard\Model\TaskModel; /** * Set the start date of task * - * @package action + * @package Kanboard\Action * @author Frederic Guillot */ class TaskUpdateStartDate extends Base @@ -59,7 +59,10 @@ class TaskUpdateStartDate extends Base { return array( 'task_id', - 'column_id', + 'task' => array( + 'project_id', + 'column_id', + ), ); } @@ -89,6 +92,6 @@ class TaskUpdateStartDate extends Base */ public function hasRequiredCondition(array $data) { - return $data['column_id'] == $this->getParam('column_id'); + return $data['task']['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Controller/AnalyticController.php b/app/Controller/AnalyticController.php index cf3ba034..ab0646a2 100644 --- a/app/Controller/AnalyticController.php +++ b/app/Controller/AnalyticController.php @@ -33,7 +33,7 @@ class AnalyticController extends BaseController 'metrics' => $this->projectDailyStatsModel->getRawMetrics($project['id'], $from, $to), 'date_format' => $this->configModel->get('application_date_format'), 'date_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getDateFormats()), - 'title' => t('Lead and Cycle time for "%s"', $project['name']), + 'title' => t('Lead and cycle time'), ))); } @@ -60,7 +60,7 @@ class AnalyticController extends BaseController 'project' => $project, 'paginator' => $paginator, 'metrics' => $this->estimatedTimeComparisonAnalytic->build($project['id']), - 'title' => t('Compare hours for "%s"', $project['name']), + 'title' => t('Estimated vs actual time'), ))); } @@ -76,7 +76,7 @@ class AnalyticController extends BaseController $this->response->html($this->helper->layout->analytic('analytic/avg_time_columns', array( 'project' => $project, 'metrics' => $this->averageTimeSpentColumnAnalytic->build($project['id']), - 'title' => t('Average time spent into each column for "%s"', $project['name']), + 'title' => t('Average time into each column'), ))); } @@ -92,7 +92,7 @@ class AnalyticController extends BaseController $this->response->html($this->helper->layout->analytic('analytic/tasks', array( 'project' => $project, 'metrics' => $this->taskDistributionAnalytic->build($project['id']), - 'title' => t('Task repartition for "%s"', $project['name']), + 'title' => t('Task distribution'), ))); } @@ -108,7 +108,7 @@ class AnalyticController extends BaseController $this->response->html($this->helper->layout->analytic('analytic/users', array( 'project' => $project, 'metrics' => $this->userDistributionAnalytic->build($project['id']), - 'title' => t('User repartition for "%s"', $project['name']), + 'title' => t('User repartition'), ))); } @@ -119,7 +119,7 @@ class AnalyticController extends BaseController */ public function cfd() { - $this->commonAggregateMetrics('analytic/cfd', 'total', 'Cumulative flow diagram for "%s"'); + $this->commonAggregateMetrics('analytic/cfd', 'total', t('Cumulative flow diagram')); } /** @@ -129,7 +129,7 @@ class AnalyticController extends BaseController */ public function burndown() { - $this->commonAggregateMetrics('analytic/burndown', 'score', 'Burndown chart for "%s"'); + $this->commonAggregateMetrics('analytic/burndown', 'score', t('Burndown chart')); } /** @@ -157,7 +157,7 @@ class AnalyticController extends BaseController 'project' => $project, 'date_format' => $this->configModel->get('application_date_format'), 'date_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getDateFormats()), - 'title' => t($title, $project['name']), + 'title' => $title, ))); } diff --git a/app/Controller/DashboardController.php b/app/Controller/DashboardController.php index 44874546..f32f8552 100644 --- a/app/Controller/DashboardController.php +++ b/app/Controller/DashboardController.php @@ -2,9 +2,6 @@ namespace Kanboard\Controller; -use Kanboard\Model\ProjectModel; -use Kanboard\Model\SubtaskModel; - /** * Dashboard Controller * @@ -14,63 +11,6 @@ use Kanboard\Model\SubtaskModel; class DashboardController extends BaseController { /** - * Get project pagination - * - * @access private - * @param integer $user_id - * @param string $action - * @param integer $max - * @return \Kanboard\Core\Paginator - */ - private function getProjectPaginator($user_id, $action, $max) - { - return $this->paginator - ->setUrl('DashboardController', $action, array('pagination' => 'projects', 'user_id' => $user_id)) - ->setMax($max) - ->setOrder(ProjectModel::TABLE.'.name') - ->setQuery($this->projectModel->getQueryColumnStats($this->projectPermissionModel->getActiveProjectIds($user_id))) - ->calculateOnlyIf($this->request->getStringParam('pagination') === 'projects'); - } - - /** - * Get task pagination - * - * @access private - * @param integer $user_id - * @param string $action - * @param integer $max - * @return \Kanboard\Core\Paginator - */ - private function getTaskPaginator($user_id, $action, $max) - { - return $this->paginator - ->setUrl('DashboardController', $action, array('pagination' => 'tasks', 'user_id' => $user_id)) - ->setMax($max) - ->setOrder('tasks.id') - ->setQuery($this->taskFinderModel->getUserQuery($user_id)) - ->calculateOnlyIf($this->request->getStringParam('pagination') === 'tasks'); - } - - /** - * Get subtask pagination - * - * @access private - * @param integer $user_id - * @param string $action - * @param integer $max - * @return \Kanboard\Core\Paginator - */ - private function getSubtaskPaginator($user_id, $action, $max) - { - return $this->paginator - ->setUrl('DashboardController', $action, array('pagination' => 'subtasks', 'user_id' => $user_id)) - ->setMax($max) - ->setOrder('tasks.id') - ->setQuery($this->subtaskModel->getUserQuery($user_id, array(SubTaskModel::STATUS_TODO, SubtaskModel::STATUS_INPROGRESS))) - ->calculateOnlyIf($this->request->getStringParam('pagination') === 'subtasks'); - } - - /** * Dashboard overview * * @access public @@ -80,10 +20,10 @@ class DashboardController extends BaseController $user = $this->getUser(); $this->response->html($this->helper->layout->dashboard('dashboard/show', array( - 'title' => t('Dashboard'), - 'project_paginator' => $this->getProjectPaginator($user['id'], 'show', 10), - 'task_paginator' => $this->getTaskPaginator($user['id'], 'show', 10), - 'subtask_paginator' => $this->getSubtaskPaginator($user['id'], 'show', 10), + 'title' => t('Dashboard for %s', $this->helper->user->getFullname($user)), + 'project_paginator' => $this->projectPagination->getDashboardPaginator($user['id'], 'show', 10), + 'task_paginator' => $this->taskPagination->getDashboardPaginator($user['id'], 'show', 10), + 'subtask_paginator' => $this->subtaskPagination->getDashboardPaginator($user['id'], 'show', 10), 'user' => $user, ))); } @@ -98,8 +38,8 @@ class DashboardController extends BaseController $user = $this->getUser(); $this->response->html($this->helper->layout->dashboard('dashboard/tasks', array( - 'title' => t('My tasks'), - 'paginator' => $this->getTaskPaginator($user['id'], 'tasks', 50), + 'title' => t('Tasks overview for %s', $this->helper->user->getFullname($user)), + 'paginator' => $this->taskPagination->getDashboardPaginator($user['id'], 'tasks', 50), 'user' => $user, ))); } @@ -114,8 +54,8 @@ class DashboardController extends BaseController $user = $this->getUser(); $this->response->html($this->helper->layout->dashboard('dashboard/subtasks', array( - 'title' => t('My subtasks'), - 'paginator' => $this->getSubtaskPaginator($user['id'], 'subtasks', 50), + 'title' => t('Subtasks overview for %s', $this->helper->user->getFullname($user)), + 'paginator' => $this->subtaskPagination->getDashboardPaginator($user['id'], 'subtasks', 50), 'user' => $user, ))); } @@ -130,8 +70,8 @@ class DashboardController extends BaseController $user = $this->getUser(); $this->response->html($this->helper->layout->dashboard('dashboard/projects', array( - 'title' => t('My projects'), - 'paginator' => $this->getProjectPaginator($user['id'], 'projects', 25), + 'title' => t('Projects overview for %s', $this->helper->user->getFullname($user)), + 'paginator' => $this->projectPagination->getDashboardPaginator($user['id'], 'projects', 25), 'user' => $user, ))); } @@ -146,7 +86,7 @@ class DashboardController extends BaseController $user = $this->getUser(); $this->response->html($this->helper->layout->dashboard('dashboard/activity', array( - 'title' => t('My activity stream'), + 'title' => t('Activity stream for %s', $this->helper->user->getFullname($user)), 'events' => $this->helper->projectActivity->getProjectsEvents($this->projectPermissionModel->getActiveProjectIds($user['id']), 100), 'user' => $user, ))); @@ -159,9 +99,11 @@ class DashboardController extends BaseController */ public function calendar() { + $user = $this->getUser(); + $this->response->html($this->helper->layout->dashboard('dashboard/calendar', array( - 'title' => t('My calendar'), - 'user' => $this->getUser(), + 'title' => t('Calendar for %s', $this->helper->user->getFullname($user)), + 'user' => $user, ))); } @@ -175,7 +117,7 @@ class DashboardController extends BaseController $user = $this->getUser(); $this->response->html($this->helper->layout->dashboard('dashboard/notifications', array( - 'title' => t('My notifications'), + 'title' => t('Notifications for %s', $this->helper->user->getFullname($user)), 'notifications' => $this->userUnreadNotificationModel->getAll($user['id']), 'user' => $user, ))); diff --git a/app/Controller/FeedController.php b/app/Controller/FeedController.php index cf2b1088..f9b0ed7c 100644 --- a/app/Controller/FeedController.php +++ b/app/Controller/FeedController.php @@ -2,7 +2,11 @@ namespace Kanboard\Controller; +use DateTime; use Kanboard\Core\Controller\AccessForbiddenException; +use PicoFeed\Syndication\AtomFeedBuilder; +use PicoFeed\Syndication\AtomItemBuilder; +use PicoFeed\Syndication\FeedBuilder; /** * Atom/RSS Feed controller @@ -27,10 +31,15 @@ class FeedController extends BaseController throw AccessForbiddenException::getInstance()->withoutLayout(); } - $this->response->xml($this->template->render('feed/user', array( - 'events' => $this->helper->projectActivity->getProjectsEvents($this->projectPermissionModel->getActiveProjectIds($user['id'])), - 'user' => $user, - ))); + $events = $this->helper->projectActivity->getProjectsEvents($this->projectPermissionModel->getActiveProjectIds($user['id'])); + + $feedBuilder = AtomFeedBuilder::create() + ->withTitle(e('Project activities for %s', $this->helper->user->getFullname($user))) + ->withFeedUrl($this->helper->url->to('FeedController', 'user', array('token' => $user['token']), '', true)) + ->withSiteUrl($this->helper->url->base()) + ->withDate(new DateTime()); + + $this->response->xml($this->buildFeedItems($events, $feedBuilder)->build()); } /** @@ -47,9 +56,44 @@ class FeedController extends BaseController throw AccessForbiddenException::getInstance()->withoutLayout(); } - $this->response->xml($this->template->render('feed/project', array( - 'events' => $this->helper->projectActivity->getProjectEvents($project['id']), - 'project' => $project, - ))); + $events = $this->helper->projectActivity->getProjectEvents($project['id']); + + $feedBuilder = AtomFeedBuilder::create() + ->withTitle(e('%s\'s activity', $project['name'])) + ->withFeedUrl($this->helper->url->to('FeedController', 'project', array('token' => $project['token']), '', true)) + ->withSiteUrl($this->helper->url->base()) + ->withDate(new DateTime()); + + $this->response->xml($this->buildFeedItems($events, $feedBuilder)->build()); + } + + /** + * Build feed items + * + * @access protected + * @param array $events + * @param FeedBuilder $feedBuilder + * @return FeedBuilder + */ + protected function buildFeedItems(array $events, FeedBuilder $feedBuilder) + { + foreach ($events as $event) { + $itemDate = new DateTime(); + $itemDate->setTimestamp($event['date_creation']); + + $itemUrl = $this->helper->url->to('TaskViewController', 'show', array('task_id' => $event['task_id']), '', true); + + $feedBuilder + ->withItem(AtomItemBuilder::create($feedBuilder) + ->withTitle($event['event_title']) + ->withUrl($itemUrl.'#event-'.$event['id']) + ->withAuthor($event['author']) + ->withPublishedDate($itemDate) + ->withUpdatedDate($itemDate) + ->withContent($event['event_content']) + ); + } + + return $feedBuilder; } } diff --git a/app/Controller/ProjectPermissionController.php b/app/Controller/ProjectPermissionController.php index f3ca6ed9..99f556e8 100644 --- a/app/Controller/ProjectPermissionController.php +++ b/app/Controller/ProjectPermissionController.php @@ -147,7 +147,7 @@ class ProjectPermissionController extends BaseController $values = $this->request->getValues(); if (empty($values['group_id']) && ! empty($values['external_id'])) { - $values['group_id'] = $this->groupModel->create($values['name'], $values['external_id']); + $values['group_id'] = $this->groupModel->getOrCreateExternalGroupId($values['name'], $values['external_id']); } if ($this->projectGroupRoleModel->addGroup($project['id'], $values['group_id'], $values['role'])) { diff --git a/app/Controller/SubtaskController.php b/app/Controller/SubtaskController.php index 93dab5cd..7502d84f 100644 --- a/app/Controller/SubtaskController.php +++ b/app/Controller/SubtaskController.php @@ -168,7 +168,7 @@ class SubtaskController extends BaseController $values = $this->request->getJson(); if (! empty($values) && $this->helper->user->hasProjectAccess('SubtaskController', 'movePosition', $project_id)) { - $result = $this->subtaskModel->changePosition($task_id, $values['subtask_id'], $values['position']); + $result = $this->subtaskPositionModel->changePosition($task_id, $values['subtask_id'], $values['position']); $this->response->json(array('result' => $result)); } else { throw new AccessForbiddenException(); diff --git a/app/Controller/SubtaskConverterController.php b/app/Controller/SubtaskConverterController.php index 65bcd2da..404c50d0 100644 --- a/app/Controller/SubtaskConverterController.php +++ b/app/Controller/SubtaskConverterController.php @@ -26,7 +26,7 @@ class SubtaskConverterController extends BaseController $project = $this->getProject(); $subtask = $this->getSubtask(); - $task_id = $this->subtaskModel->convertToTask($project['id'], $subtask['id']); + $task_id = $this->subtaskTaskConversionModel->convertToTask($project['id'], $subtask['id']); if ($task_id !== false) { $this->flash->success(t('Subtask converted to task successfully.')); diff --git a/app/Controller/SubtaskRestrictionController.php b/app/Controller/SubtaskRestrictionController.php index 084fc0d9..cb642e1c 100644 --- a/app/Controller/SubtaskRestrictionController.php +++ b/app/Controller/SubtaskRestrictionController.php @@ -27,7 +27,7 @@ class SubtaskRestrictionController extends BaseController SubtaskModel::STATUS_TODO => t('Todo'), SubtaskModel::STATUS_DONE => t('Done'), ), - 'subtask_inprogress' => $this->subtaskModel->getSubtaskInProgress($this->userSession->getId()), + 'subtask_inprogress' => $this->subtaskStatusModel->getSubtaskInProgress($this->userSession->getId()), 'subtask' => $subtask, 'task' => $task, ))); diff --git a/app/Controller/SubtaskStatusController.php b/app/Controller/SubtaskStatusController.php index 699951fe..d4d356c3 100644 --- a/app/Controller/SubtaskStatusController.php +++ b/app/Controller/SubtaskStatusController.php @@ -20,7 +20,7 @@ class SubtaskStatusController extends BaseController $task = $this->getTask(); $subtask = $this->getSubtask(); - $status = $this->subtaskModel->toggleStatus($subtask['id']); + $status = $this->subtaskStatusModel->toggleStatus($subtask['id']); if ($this->request->getIntegerParam('refresh-table') === 0) { $subtask['status'] = $status; diff --git a/app/Controller/UserListController.php b/app/Controller/UserListController.php index 31fcdd44..888583fa 100644 --- a/app/Controller/UserListController.php +++ b/app/Controller/UserListController.php @@ -17,12 +17,7 @@ class UserListController extends BaseController */ public function show() { - $paginator = $this->paginator - ->setUrl('UserListController', 'show') - ->setMax(30) - ->setOrder('username') - ->setQuery($this->userModel->getQuery()) - ->calculate(); + $paginator = $this->userPagination->getListingPaginator(); $this->response->html($this->helper->layout->app('user_list/show', array( 'title' => t('Users').' ('.$paginator->getTotal().')', diff --git a/app/Core/Base.php b/app/Core/Base.php index 8103ec14..68604785 100644 --- a/app/Core/Base.php +++ b/app/Core/Base.php @@ -90,6 +90,9 @@ use Pimple\Container; * @property \Kanboard\Model\ProjectTaskPriorityModel $projectTaskPriorityModel * @property \Kanboard\Model\RememberMeSessionModel $rememberMeSessionModel * @property \Kanboard\Model\SubtaskModel $subtaskModel + * @property \Kanboard\Model\SubtaskPositionModel $subtaskPositionModel + * @property \Kanboard\Model\SubtaskStatusModel $subtaskStatusModel + * @property \Kanboard\Model\SubtaskTaskConversionModel $subtaskTaskConversionModel * @property \Kanboard\Model\SubtaskTimeTrackingModel $subtaskTimeTrackingModel * @property \Kanboard\Model\SwimlaneModel $swimlaneModel * @property \Kanboard\Model\TagDuplicationModel $tagDuplicationModel @@ -119,6 +122,10 @@ use Pimple\Container; * @property \Kanboard\Model\UserNotificationFilterModel $userNotificationFilterModel * @property \Kanboard\Model\UserUnreadNotificationModel $userUnreadNotificationModel * @property \Kanboard\Model\UserMetadataModel $userMetadataModel + * @property \Kanboard\Pagination\TaskPagination $taskPagination + * @property \Kanboard\Pagination\SubtaskPagination $subtaskPagination + * @property \Kanboard\Pagination\ProjectPagination $projectPagination + * @property \Kanboard\Pagination\UserPagination $userPagination * @property \Kanboard\Validator\ActionValidator $actionValidator * @property \Kanboard\Validator\AuthValidator $authValidator * @property \Kanboard\Validator\ColumnValidator $columnValidator @@ -150,6 +157,14 @@ use Pimple\Container; * @property \Kanboard\Core\Filter\QueryBuilder $taskQuery * @property \Kanboard\Core\Filter\LexerBuilder $taskLexer * @property \Kanboard\Core\Filter\LexerBuilder $projectActivityLexer + * @property \Kanboard\Job\CommentEventJob $commentEventJob + * @property \Kanboard\Job\SubtaskEventJob $subtaskEventJob + * @property \Kanboard\Job\TaskEventJob $taskEventJob + * @property \Kanboard\Job\TaskFileEventJob $taskFileEventJob + * @property \Kanboard\Job\TaskLinkEventJob $taskLinkEventJob + * @property \Kanboard\Job\ProjectFileEventJob $projectFileEventJob + * @property \Kanboard\Job\NotificationJob $notificationJob + * @property \Kanboard\Job\ProjectMetricJob $projectMetricJob * @property \Psr\Log\LoggerInterface $logger * @property \PicoDb\Database $db * @property \Symfony\Component\EventDispatcher\EventDispatcher $dispatcher @@ -178,10 +193,10 @@ abstract class Base } /** - * Load automatically models + * Load automatically dependencies * * @access public - * @param string $name Model name + * @param string $name Class name * @return mixed */ public function __get($name) @@ -199,7 +214,6 @@ abstract class Base */ public static function getInstance(Container $container) { - $self = new static($container); - return $self; + return new static($container); } } diff --git a/app/Core/Filter/LexerBuilder.php b/app/Core/Filter/LexerBuilder.php index 7a9a714f..626d7614 100644 --- a/app/Core/Filter/LexerBuilder.php +++ b/app/Core/Filter/LexerBuilder.php @@ -69,7 +69,7 @@ class LexerBuilder foreach ($attributes as $attribute) { $this->filters[$attribute] = $filter; - $this->lexer->addToken(sprintf("/^(%s:)/", $attribute), $attribute); + $this->lexer->addToken(sprintf("/^(%s:)/i", $attribute), $attribute); if ($default) { $this->lexer->setDefaultToken($attribute); diff --git a/app/Core/Http/Request.php b/app/Core/Http/Request.php index e0df2d3c..2e84958d 100644 --- a/app/Core/Http/Request.php +++ b/app/Core/Http/Request.php @@ -301,6 +301,7 @@ class Request extends Base public function getIpAddress() { $keys = array( + 'HTTP_X_REAL_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', diff --git a/app/Core/Queue/JobHandler.php b/app/Core/Queue/JobHandler.php index 7ca36328..326f3cef 100644 --- a/app/Core/Queue/JobHandler.php +++ b/app/Core/Queue/JobHandler.php @@ -2,6 +2,7 @@ namespace Kanboard\Core\Queue; +use Exception; use Kanboard\Core\Base; use Kanboard\Job\BaseJob; use SimpleQueue\Job; @@ -39,16 +40,23 @@ class JobHandler extends Base public function executeJob(Job $job) { $payload = $job->getBody(); - $className = $payload['class']; - $this->memoryCache->flush(); - $this->prepareJobSession($payload['user_id']); - if (DEBUG) { - $this->logger->debug(__METHOD__.' Received job => '.$className.' ('.getmypid().')'); - } + try { + $className = $payload['class']; + $this->memoryCache->flush(); + $this->prepareJobSession($payload['user_id']); + + if (DEBUG) { + $this->logger->debug(__METHOD__.' Received job => '.$className.' ('.getmypid().')'); + $this->logger->debug(__METHOD__.' => '.json_encode($payload)); + } - $worker = new $className($this->container); - call_user_func_array(array($worker, 'execute'), $payload['params']); + $worker = new $className($this->container); + call_user_func_array(array($worker, 'execute'), $payload['params']); + } catch (Exception $e) { + $this->logger->error(__METHOD__.': Error during job execution: '.$e->getMessage()); + $this->logger->error(__METHOD__ .' => '.json_encode($payload)); + } } /** diff --git a/app/Core/Queue/QueueManager.php b/app/Core/Queue/QueueManager.php index f34cb220..dcf0ebf5 100644 --- a/app/Core/Queue/QueueManager.php +++ b/app/Core/Queue/QueueManager.php @@ -42,9 +42,13 @@ class QueueManager extends Base */ public function push(BaseJob $job) { + $jobClassName = get_class($job); + if ($this->queue !== null) { + $this->logger->debug(__METHOD__.': Job pushed in queue: '.$jobClassName); $this->queue->push(JobHandler::getInstance($this->container)->serializeJob($job)); } else { + $this->logger->debug(__METHOD__.': Job executed synchronously: '.$jobClassName); call_user_func_array(array($job, 'execute'), $job->getJobParams()); } @@ -60,7 +64,7 @@ class QueueManager extends Base public function listen() { if ($this->queue === null) { - throw new LogicException('No Queue Driver defined!'); + throw new LogicException('No queue driver defined!'); } while ($job = $this->queue->pull()) { diff --git a/app/Event/FileEvent.php b/app/Event/FileEvent.php deleted file mode 100644 index 482a4eab..00000000 --- a/app/Event/FileEvent.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace Kanboard\Event; - -class FileEvent extends GenericEvent -{ -} diff --git a/app/Event/ProjectFileEvent.php b/app/Event/ProjectFileEvent.php new file mode 100644 index 00000000..5d57e463 --- /dev/null +++ b/app/Event/ProjectFileEvent.php @@ -0,0 +1,7 @@ +<?php + +namespace Kanboard\Event; + +class ProjectFileEvent extends GenericEvent +{ +} diff --git a/app/Event/TaskFileEvent.php b/app/Event/TaskFileEvent.php new file mode 100644 index 00000000..fa3bdde9 --- /dev/null +++ b/app/Event/TaskFileEvent.php @@ -0,0 +1,7 @@ +<?php + +namespace Kanboard\Event; + +class TaskFileEvent extends GenericEvent +{ +} diff --git a/app/EventBuilder/BaseEventBuilder.php b/app/EventBuilder/BaseEventBuilder.php new file mode 100644 index 00000000..5aa777a0 --- /dev/null +++ b/app/EventBuilder/BaseEventBuilder.php @@ -0,0 +1,44 @@ +<?php + +namespace Kanboard\EventBuilder; + +use Kanboard\Core\Base; +use Kanboard\Event\GenericEvent; + +/** + * Class BaseEventBuilder + * + * @package Kanboard\EventBuilder + * @author Frederic Guillot + */ +abstract class BaseEventBuilder extends Base +{ + /** + * Build event data + * + * @access public + * @return GenericEvent|null + */ + abstract public function buildEvent(); + + /** + * Get event title with author + * + * @access public + * @param string $author + * @param string $eventName + * @param array $eventData + * @return string + */ + abstract public function buildTitleWithAuthor($author, $eventName, array $eventData); + + /** + * Get event title without author + * + * @access public + * @param string $eventName + * @param array $eventData + * @return string + */ + abstract public function buildTitleWithoutAuthor($eventName, array $eventData); +} diff --git a/app/EventBuilder/CommentEventBuilder.php b/app/EventBuilder/CommentEventBuilder.php new file mode 100644 index 00000000..ba5842a4 --- /dev/null +++ b/app/EventBuilder/CommentEventBuilder.php @@ -0,0 +1,98 @@ +<?php + +namespace Kanboard\EventBuilder; + +use Kanboard\Event\CommentEvent; +use Kanboard\Model\CommentModel; + +/** + * Class CommentEventBuilder + * + * @package Kanboard\EventBuilder + * @author Frederic Guillot + */ +class CommentEventBuilder extends BaseEventBuilder +{ + protected $commentId = 0; + + /** + * Set commentId + * + * @param int $commentId + * @return $this + */ + public function withCommentId($commentId) + { + $this->commentId = $commentId; + return $this; + } + + /** + * Build event data + * + * @access public + * @return CommentEvent|null + */ + public function buildEvent() + { + $comment = $this->commentModel->getById($this->commentId); + + if (empty($comment)) { + return null; + } + + return new CommentEvent(array( + 'comment' => $comment, + 'task' => $this->taskFinderModel->getDetails($comment['task_id']), + )); + } + + /** + * Get event title with author + * + * @access public + * @param string $author + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithAuthor($author, $eventName, array $eventData) + { + switch ($eventName) { + case CommentModel::EVENT_UPDATE: + return e('%s updated a comment on the task #%d', $author, $eventData['task']['id']); + case CommentModel::EVENT_CREATE: + return e('%s commented on the task #%d', $author, $eventData['task']['id']); + case CommentModel::EVENT_DELETE: + return e('%s removed a comment on the task #%d', $author, $eventData['task']['id']); + case CommentModel::EVENT_USER_MENTION: + return e('%s mentioned you in a comment on the task #%d', $author, $eventData['task']['id']); + default: + return ''; + } + } + + /** + * Get event title without author + * + * @access public + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithoutAuthor($eventName, array $eventData) + { + switch ($eventName) { + case CommentModel::EVENT_CREATE: + return e('New comment on task #%d', $eventData['comment']['task_id']); + case CommentModel::EVENT_UPDATE: + return e('Comment updated on task #%d', $eventData['comment']['task_id']); + case CommentModel::EVENT_DELETE: + return e('Comment removed on task #%d', $eventData['comment']['task_id']); + case CommentModel::EVENT_USER_MENTION: + return e('You were mentioned in a comment on the task #%d', $eventData['task']['id']); + default: + return ''; + } + } +} diff --git a/app/EventBuilder/EventIteratorBuilder.php b/app/EventBuilder/EventIteratorBuilder.php new file mode 100644 index 00000000..ba821753 --- /dev/null +++ b/app/EventBuilder/EventIteratorBuilder.php @@ -0,0 +1,52 @@ +<?php + +namespace Kanboard\EventBuilder; + +use Iterator; + +/** + * Class EventIteratorBuilder + * + * @package Kanboard\EventBuilder + * @author Frederic Guillot + */ +class EventIteratorBuilder implements Iterator { + private $position = 0; + private $builders = array(); + + /** + * Set builder + * + * @access public + * @param BaseEventBuilder $builder + * @return $this + */ + public function withBuilder(BaseEventBuilder $builder) + { + $this->builders[] = $builder; + return $this; + } + + public function rewind() { + $this->position = 0; + } + + /** + * @return BaseEventBuilder + */ + public function current() { + return $this->builders[$this->position]; + } + + public function key() { + return $this->position; + } + + public function next() { + ++$this->position; + } + + public function valid() { + return isset($this->builders[$this->position]); + } +} diff --git a/app/EventBuilder/ProjectFileEventBuilder.php b/app/EventBuilder/ProjectFileEventBuilder.php new file mode 100644 index 00000000..6698f78a --- /dev/null +++ b/app/EventBuilder/ProjectFileEventBuilder.php @@ -0,0 +1,77 @@ +<?php + +namespace Kanboard\EventBuilder; + +use Kanboard\Event\ProjectFileEvent; +use Kanboard\Event\GenericEvent; + +/** + * Class ProjectFileEventBuilder + * + * @package Kanboard\EventBuilder + * @author Frederic Guillot + */ +class ProjectFileEventBuilder extends BaseEventBuilder +{ + protected $fileId = 0; + + /** + * Set fileId + * + * @param int $fileId + * @return $this + */ + public function withFileId($fileId) + { + $this->fileId = $fileId; + return $this; + } + + /** + * Build event data + * + * @access public + * @return GenericEvent|null + */ + public function buildEvent() + { + $file = $this->projectFileModel->getById($this->fileId); + + if (empty($file)) { + $this->logger->debug(__METHOD__.': File not found'); + return null; + } + + return new ProjectFileEvent(array( + 'file' => $file, + 'project' => $this->projectModel->getById($file['project_id']), + )); + } + + /** + * Get event title with author + * + * @access public + * @param string $author + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithAuthor($author, $eventName, array $eventData) + { + return ''; + } + + /** + * Get event title without author + * + * @access public + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithoutAuthor($eventName, array $eventData) + { + return ''; + } +} diff --git a/app/EventBuilder/SubtaskEventBuilder.php b/app/EventBuilder/SubtaskEventBuilder.php new file mode 100644 index 00000000..5f7e831d --- /dev/null +++ b/app/EventBuilder/SubtaskEventBuilder.php @@ -0,0 +1,125 @@ +<?php + +namespace Kanboard\EventBuilder; + +use Kanboard\Event\SubtaskEvent; +use Kanboard\Event\GenericEvent; +use Kanboard\Model\SubtaskModel; + +/** + * Class SubtaskEventBuilder + * + * @package Kanboard\EventBuilder + * @author Frederic Guillot + */ +class SubtaskEventBuilder extends BaseEventBuilder +{ + /** + * SubtaskId + * + * @access protected + * @var int + */ + protected $subtaskId = 0; + + /** + * Changed values + * + * @access protected + * @var array + */ + protected $values = array(); + + /** + * Set SubtaskId + * + * @param int $subtaskId + * @return $this + */ + public function withSubtaskId($subtaskId) + { + $this->subtaskId = $subtaskId; + return $this; + } + + /** + * Set values + * + * @param array $values + * @return $this + */ + public function withValues(array $values) + { + $this->values = $values; + return $this; + } + + /** + * Build event data + * + * @access public + * @return GenericEvent|null + */ + public function buildEvent() + { + $eventData = array(); + $eventData['subtask'] = $this->subtaskModel->getById($this->subtaskId, true); + + if (empty($eventData['subtask'])) { + $this->logger->debug(__METHOD__.': Subtask not found'); + return null; + } + + if (! empty($this->values)) { + $eventData['changes'] = array_diff_assoc($this->values, $eventData['subtask']); + } + + $eventData['task'] = $this->taskFinderModel->getDetails($eventData['subtask']['task_id']); + return new SubtaskEvent($eventData); + } + + /** + * Get event title with author + * + * @access public + * @param string $author + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithAuthor($author, $eventName, array $eventData) + { + switch ($eventName) { + case SubtaskModel::EVENT_UPDATE: + return e('%s updated a subtask for the task #%d', $author, $eventData['task']['id']); + case SubtaskModel::EVENT_CREATE: + return e('%s created a subtask for the task #%d', $author, $eventData['task']['id']); + case SubtaskModel::EVENT_DELETE: + return e('%s removed a subtask for the task #%d', $author, $eventData['task']['id']); + default: + return ''; + } + } + + /** + * Get event title without author + * + * @access public + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithoutAuthor($eventName, array $eventData) + { + switch ($eventName) { + case SubtaskModel::EVENT_CREATE: + return e('New subtask on task #%d', $eventData['subtask']['task_id']); + case SubtaskModel::EVENT_UPDATE: + return e('Subtask updated on task #%d', $eventData['subtask']['task_id']); + case SubtaskModel::EVENT_DELETE: + return e('Subtask removed on task #%d', $eventData['subtask']['task_id']); + default: + return ''; + } + } +} diff --git a/app/EventBuilder/TaskEventBuilder.php b/app/EventBuilder/TaskEventBuilder.php new file mode 100644 index 00000000..aa897632 --- /dev/null +++ b/app/EventBuilder/TaskEventBuilder.php @@ -0,0 +1,223 @@ +<?php + +namespace Kanboard\EventBuilder; + +use Kanboard\Event\TaskEvent; +use Kanboard\Model\TaskModel; + +/** + * Class TaskEventBuilder + * + * @package Kanboard\EventBuilder + * @author Frederic Guillot + */ +class TaskEventBuilder extends BaseEventBuilder +{ + /** + * TaskId + * + * @access protected + * @var int + */ + protected $taskId = 0; + + /** + * Task + * + * @access protected + * @var array + */ + protected $task = array(); + + /** + * Extra values + * + * @access protected + * @var array + */ + protected $values = array(); + + /** + * Changed values + * + * @access protected + * @var array + */ + protected $changes = array(); + + /** + * Set TaskId + * + * @param int $taskId + * @return $this + */ + public function withTaskId($taskId) + { + $this->taskId = $taskId; + return $this; + } + + /** + * Set task + * + * @param array $task + * @return $this + */ + public function withTask(array $task) + { + $this->task = $task; + return $this; + } + + /** + * Set values + * + * @param array $values + * @return $this + */ + public function withValues(array $values) + { + $this->values = $values; + return $this; + } + + /** + * Set changes + * + * @param array $changes + * @return $this + */ + public function withChanges(array $changes) + { + $this->changes = $changes; + return $this; + } + + /** + * Build event data + * + * @access public + * @return TaskEvent|null + */ + public function buildEvent() + { + $eventData = array(); + $eventData['task_id'] = $this->taskId; + $eventData['task'] = $this->taskFinderModel->getDetails($this->taskId); + + if (empty($eventData['task'])) { + $this->logger->debug(__METHOD__.': Task not found'); + return null; + } + + if (! empty($this->changes)) { + if (empty($this->task)) { + $this->task = $eventData['task']; + } + + $eventData['changes'] = array_diff_assoc($this->changes, $this->task); + unset($eventData['changes']['date_modification']); + } + + return new TaskEvent(array_merge($eventData, $this->values)); + } + + /** + * Get event title with author + * + * @access public + * @param string $author + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithAuthor($author, $eventName, array $eventData) + { + switch ($eventName) { + case TaskModel::EVENT_ASSIGNEE_CHANGE: + $assignee = $eventData['task']['assignee_name'] ?: $eventData['task']['assignee_username']; + + if (! empty($assignee)) { + return e('%s changed the assignee of the task #%d to %s', $author, $eventData['task']['id'], $assignee); + } + + return e('%s removed the assignee of the task %s', $author, e('#%d', $eventData['task']['id'])); + case TaskModel::EVENT_UPDATE: + return e('%s updated the task #%d', $author, $eventData['task']['id']); + case TaskModel::EVENT_CREATE: + return e('%s created the task #%d', $author, $eventData['task']['id']); + case TaskModel::EVENT_CLOSE: + return e('%s closed the task #%d', $author, $eventData['task']['id']); + case TaskModel::EVENT_OPEN: + return e('%s opened the task #%d', $author, $eventData['task']['id']); + case TaskModel::EVENT_MOVE_COLUMN: + return e( + '%s moved the task #%d to the column "%s"', + $author, + $eventData['task']['id'], + $eventData['task']['column_title'] + ); + case TaskModel::EVENT_MOVE_POSITION: + return e( + '%s moved the task #%d to the position %d in the column "%s"', + $author, + $eventData['task']['id'], + $eventData['task']['position'], + $eventData['task']['column_title'] + ); + case TaskModel::EVENT_MOVE_SWIMLANE: + if ($eventData['task']['swimlane_id'] == 0) { + return e('%s moved the task #%d to the first swimlane', $author, $eventData['task']['id']); + } + + return e( + '%s moved the task #%d to the swimlane "%s"', + $author, + $eventData['task']['id'], + $eventData['task']['swimlane_name'] + ); + + case TaskModel::EVENT_USER_MENTION: + return e('%s mentioned you in the task #%d', $author, $eventData['task']['id']); + default: + return ''; + } + } + + /** + * Get event title without author + * + * @access public + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithoutAuthor($eventName, array $eventData) + { + switch ($eventName) { + case TaskModel::EVENT_CREATE: + return e('New task #%d: %s', $eventData['task']['id'], $eventData['task']['title']); + case TaskModel::EVENT_UPDATE: + return e('Task updated #%d', $eventData['task']['id']); + case TaskModel::EVENT_CLOSE: + return e('Task #%d closed', $eventData['task']['id']); + case TaskModel::EVENT_OPEN: + return e('Task #%d opened', $eventData['task']['id']); + case TaskModel::EVENT_MOVE_COLUMN: + return e('Column changed for task #%d', $eventData['task']['id']); + case TaskModel::EVENT_MOVE_POSITION: + return e('New position for task #%d', $eventData['task']['id']); + case TaskModel::EVENT_MOVE_SWIMLANE: + return e('Swimlane changed for task #%d', $eventData['task']['id']); + case TaskModel::EVENT_ASSIGNEE_CHANGE: + return e('Assignee changed on task #%d', $eventData['task']['id']); + case TaskModel::EVENT_OVERDUE: + $nb = count($eventData['tasks']); + return $nb > 1 ? e('%d overdue tasks', $nb) : e('Task #%d is overdue', $eventData['tasks'][0]['id']); + case TaskModel::EVENT_USER_MENTION: + return e('You were mentioned in the task #%d', $eventData['task']['id']); + default: + return ''; + } + } +} diff --git a/app/EventBuilder/TaskFileEventBuilder.php b/app/EventBuilder/TaskFileEventBuilder.php new file mode 100644 index 00000000..8c985cc0 --- /dev/null +++ b/app/EventBuilder/TaskFileEventBuilder.php @@ -0,0 +1,86 @@ +<?php + +namespace Kanboard\EventBuilder; + +use Kanboard\Event\TaskFileEvent; +use Kanboard\Event\GenericEvent; +use Kanboard\Model\TaskFileModel; + +/** + * Class TaskFileEventBuilder + * + * @package Kanboard\EventBuilder + * @author Frederic Guillot + */ +class TaskFileEventBuilder extends BaseEventBuilder +{ + protected $fileId = 0; + + /** + * Set fileId + * + * @param int $fileId + * @return $this + */ + public function withFileId($fileId) + { + $this->fileId = $fileId; + return $this; + } + + /** + * Build event data + * + * @access public + * @return GenericEvent|null + */ + public function buildEvent() + { + $file = $this->taskFileModel->getById($this->fileId); + + if (empty($file)) { + $this->logger->debug(__METHOD__.': File not found'); + return null; + } + + return new TaskFileEvent(array( + 'file' => $file, + 'task' => $this->taskFinderModel->getDetails($file['task_id']), + )); + } + + /** + * Get event title with author + * + * @access public + * @param string $author + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithAuthor($author, $eventName, array $eventData) + { + if ($eventName === TaskFileModel::EVENT_CREATE) { + return e('%s attached a file to the task #%d', $author, $eventData['task']['id']); + } + + return ''; + } + + /** + * Get event title without author + * + * @access public + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithoutAuthor($eventName, array $eventData) + { + if ($eventName === TaskFileModel::EVENT_CREATE) { + return e('New attachment on task #%d: %s', $eventData['file']['task_id'], $eventData['file']['name']); + } + + return ''; + } +} diff --git a/app/EventBuilder/TaskLinkEventBuilder.php b/app/EventBuilder/TaskLinkEventBuilder.php new file mode 100644 index 00000000..f1a3fba2 --- /dev/null +++ b/app/EventBuilder/TaskLinkEventBuilder.php @@ -0,0 +1,89 @@ +<?php + +namespace Kanboard\EventBuilder; + +use Kanboard\Event\TaskLinkEvent; +use Kanboard\Model\TaskLinkModel; + +/** + * Class TaskLinkEventBuilder + * + * @package Kanboard\EventBuilder + * @author Frederic Guillot + */ +class TaskLinkEventBuilder extends BaseEventBuilder +{ + protected $taskLinkId = 0; + + /** + * Set taskLinkId + * + * @param int $taskLinkId + * @return $this + */ + public function withTaskLinkId($taskLinkId) + { + $this->taskLinkId = $taskLinkId; + return $this; + } + + /** + * Build event data + * + * @access public + * @return TaskLinkEvent|null + */ + public function buildEvent() + { + $taskLink = $this->taskLinkModel->getById($this->taskLinkId); + + if (empty($taskLink)) { + $this->logger->debug(__METHOD__.': TaskLink not found'); + return null; + } + + return new TaskLinkEvent(array( + 'task_link' => $taskLink, + 'task' => $this->taskFinderModel->getDetails($taskLink['task_id']), + )); + } + + /** + * Get event title with author + * + * @access public + * @param string $author + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithAuthor($author, $eventName, array $eventData) + { + if ($eventName === TaskLinkModel::EVENT_CREATE_UPDATE) { + return e('%s set a new internal link for the task #%d', $author, $eventData['task']['id']); + } elseif ($eventName === TaskLinkModel::EVENT_DELETE) { + return e('%s removed an internal link for the task #%d', $author, $eventData['task']['id']); + } + + return ''; + } + + /** + * Get event title without author + * + * @access public + * @param string $eventName + * @param array $eventData + * @return string + */ + public function buildTitleWithoutAuthor($eventName, array $eventData) + { + if ($eventName === TaskLinkModel::EVENT_CREATE_UPDATE) { + return e('A new internal link for the task #%d have been defined', $eventData['task']['id']); + } elseif ($eventName === TaskLinkModel::EVENT_DELETE) { + return e('Internal link removed for the task #%d', $eventData['task']['id']); + } + + return ''; + } +} diff --git a/app/Filter/TaskPriorityFilter.php b/app/Filter/TaskPriorityFilter.php new file mode 100644 index 00000000..75f6ae3d --- /dev/null +++ b/app/Filter/TaskPriorityFilter.php @@ -0,0 +1,38 @@ +<?php + +namespace Kanboard\Filter; + +use Kanboard\Core\Filter\FilterInterface; +use Kanboard\Model\TaskModel; + +/** + * Class TaskPriorityFilter + * + * @package Kanboard\Filter + * @author Frederic Guillot + */ +class TaskPriorityFilter extends BaseFilter implements FilterInterface +{ + /** + * Get search attribute + * + * @access public + * @return string[] + */ + public function getAttributes() + { + return array('priority'); + } + + /** + * Apply filter + * + * @access public + * @return FilterInterface + */ + public function apply() + { + $this->query->eq(TaskModel::TABLE.'.priority', $this->value); + return $this; + } +} diff --git a/app/Formatter/TaskAutoCompleteFormatter.php b/app/Formatter/TaskAutoCompleteFormatter.php index 4f1c4c69..2d9f7341 100644 --- a/app/Formatter/TaskAutoCompleteFormatter.php +++ b/app/Formatter/TaskAutoCompleteFormatter.php @@ -3,6 +3,7 @@ namespace Kanboard\Formatter; use Kanboard\Core\Filter\FormatterInterface; +use Kanboard\Model\ProjectModel; use Kanboard\Model\TaskModel; /** @@ -21,11 +22,15 @@ class TaskAutoCompleteFormatter extends BaseFormatter implements FormatterInterf */ public function format() { - $tasks = $this->query->columns(TaskModel::TABLE.'.id', TaskModel::TABLE.'.title')->findAll(); + $tasks = $this->query->columns( + TaskModel::TABLE.'.id', + TaskModel::TABLE.'.title', + ProjectModel::TABLE.'.name AS project_name' + )->asc(TaskModel::TABLE.'.id')->findAll(); foreach ($tasks as &$task) { $task['value'] = $task['title']; - $task['label'] = '#'.$task['id'].' - '.$task['title']; + $task['label'] = $task['project_name'].' > #'.$task['id'].' '.$task['title']; } return $tasks; diff --git a/app/Helper/HookHelper.php b/app/Helper/HookHelper.php index 2d13ebcc..cb4dc1ef 100644 --- a/app/Helper/HookHelper.php +++ b/app/Helper/HookHelper.php @@ -56,7 +56,7 @@ class HookHelper extends Base * @access public * @param string $hook * @param string $template - * @return \Kanboard\Helper\Hook + * @return $this */ public function attach($hook, $template) { diff --git a/app/Helper/LayoutHelper.php b/app/Helper/LayoutHelper.php index 8ebb05d4..8d2e7e00 100644 --- a/app/Helper/LayoutHelper.php +++ b/app/Helper/LayoutHelper.php @@ -156,6 +156,10 @@ class LayoutHelper extends Base */ public function analytic($template, array $params) { + if (isset($params['project']['name'])) { + $params['title'] = $params['project']['name'].' > '.$params['title']; + } + return $this->subLayout('analytic/layout', 'analytic/sidebar', $template, $params); } diff --git a/app/Helper/TaskHelper.php b/app/Helper/TaskHelper.php index e1d65cca..481a5efb 100644 --- a/app/Helper/TaskHelper.php +++ b/app/Helper/TaskHelper.php @@ -50,6 +50,7 @@ class TaskHelper extends Base public function selectDescription(array $values, array $errors) { $html = $this->helper->form->label(t('Description'), 'description'); + $html .= '<div class="markdown-editor-container">'; $html .= $this->helper->form->textarea( 'description', $values, @@ -62,6 +63,7 @@ class TaskHelper extends Base 'markdown-editor' ); + $html .= '</div>'; return $html; } diff --git a/app/Helper/UserHelper.php b/app/Helper/UserHelper.php index ab259a62..e42bafe4 100644 --- a/app/Helper/UserHelper.php +++ b/app/Helper/UserHelper.php @@ -50,7 +50,8 @@ class UserHelper extends Base */ public function getFullname(array $user = array()) { - return $this->userModel->getFullname(empty($user) ? $this->userSession->getAll() : $user); + $user = empty($user) ? $this->userSession->getAll() : $user; + return $user['name'] ?: $user['username']; } /** diff --git a/app/Job/CommentEventJob.php b/app/Job/CommentEventJob.php new file mode 100644 index 00000000..47cf8020 --- /dev/null +++ b/app/Job/CommentEventJob.php @@ -0,0 +1,50 @@ +<?php + +namespace Kanboard\Job; + +use Kanboard\EventBuilder\CommentEventBuilder; +use Kanboard\Model\CommentModel; + +/** + * Class CommentEventJob + * + * @package Kanboard\Job + * @author Frederic Guillot + */ +class CommentEventJob extends BaseJob +{ + /** + * Set job params + * + * @param int $commentId + * @param string $eventName + * @return $this + */ + public function withParams($commentId, $eventName) + { + $this->jobParams = array($commentId, $eventName); + return $this; + } + + /** + * Execute job + * + * @param int $commentId + * @param string $eventName + * @return $this + */ + public function execute($commentId, $eventName) + { + $event = CommentEventBuilder::getInstance($this->container) + ->withCommentId($commentId) + ->buildEvent(); + + if ($event !== null) { + $this->dispatcher->dispatch($eventName, $event); + + if ($eventName === CommentModel::EVENT_CREATE) { + $this->userMentionModel->fireEvents($event['comment']['comment'], CommentModel::EVENT_USER_MENTION, $event); + } + } + } +} diff --git a/app/Job/NotificationJob.php b/app/Job/NotificationJob.php index 907e543b..8fb260e8 100644 --- a/app/Job/NotificationJob.php +++ b/app/Job/NotificationJob.php @@ -17,72 +17,27 @@ class NotificationJob extends BaseJob * * @param GenericEvent $event * @param string $eventName - * @param string $eventObjectName * @return $this */ - public function withParams(GenericEvent $event, $eventName, $eventObjectName) + public function withParams(GenericEvent $event, $eventName) { - $this->jobParams = array($event->getAll(), $eventName, $eventObjectName); + $this->jobParams = array($event->getAll(), $eventName); return $this; } /** * Execute job * - * @param array $event + * @param array $eventData * @param string $eventName - * @param string $eventObjectName */ - public function execute(array $event, $eventName, $eventObjectName) + public function execute(array $eventData, $eventName) { - $eventData = $this->getEventData($event, $eventObjectName); - - if (! empty($eventData)) { - if (! empty($event['mention'])) { - $this->userNotificationModel->sendUserNotification($event['mention'], $eventName, $eventData); - } else { - $this->userNotificationModel->sendNotifications($eventName, $eventData); - $this->projectNotificationModel->sendNotifications($eventData['task']['project_id'], $eventName, $eventData); - } - } - } - - /** - * Get event data - * - * @param array $event - * @param string $eventObjectName - * @return array - */ - public function getEventData(array $event, $eventObjectName) - { - $values = array(); - - switch ($eventObjectName) { - case 'Kanboard\Event\TaskEvent': - $values['task'] = $this->taskFinderModel->getDetails($event['task_id']); - break; - case 'Kanboard\Event\SubtaskEvent': - $values['subtask'] = $this->subtaskModel->getById($event['id'], true); - $values['task'] = $this->taskFinderModel->getDetails($values['subtask']['task_id']); - break; - case 'Kanboard\Event\FileEvent': - $values['file'] = $event; - $values['task'] = $this->taskFinderModel->getDetails($values['file']['task_id']); - break; - case 'Kanboard\Event\CommentEvent': - $values['comment'] = $this->commentModel->getById($event['id']); - $values['task'] = $this->taskFinderModel->getDetails($values['comment']['task_id']); - break; - } - - // Need to use an array filter to remove any unset/null values in $values. This can happen e.g. - // when receiving an event for a task, but the task is already removed. This can happen when - // using the Kanboard background worker thread. - $values = array_filter($values); - if (!empty($values) && !empty($event['changes'])) { - $values['changes'] = $event['changes']; + if (! empty($eventData['mention'])) { + $this->userNotificationModel->sendUserNotification($eventData['mention'], $eventName, $eventData); + } else { + $this->userNotificationModel->sendNotifications($eventName, $eventData); + $this->projectNotificationModel->sendNotifications($eventData['task']['project_id'], $eventName, $eventData); } - return $values; } } diff --git a/app/Job/ProjectFileEventJob.php b/app/Job/ProjectFileEventJob.php new file mode 100644 index 00000000..45e6ece3 --- /dev/null +++ b/app/Job/ProjectFileEventJob.php @@ -0,0 +1,45 @@ +<?php + +namespace Kanboard\Job; + +use Kanboard\EventBuilder\ProjectFileEventBuilder; + +/** + * Class ProjectFileEventJob + * + * @package Kanboard\Job + * @author Frederic Guillot + */ +class ProjectFileEventJob extends BaseJob +{ + /** + * Set job params + * + * @param int $fileId + * @param string $eventName + * @return $this + */ + public function withParams($fileId, $eventName) + { + $this->jobParams = array($fileId, $eventName); + return $this; + } + + /** + * Execute job + * + * @param int $fileId + * @param string $eventName + * @return $this + */ + public function execute($fileId, $eventName) + { + $event = ProjectFileEventBuilder::getInstance($this->container) + ->withFileId($fileId) + ->buildEvent(); + + if ($event !== null) { + $this->dispatcher->dispatch($eventName, $event); + } + } +} diff --git a/app/Job/SubtaskEventJob.php b/app/Job/SubtaskEventJob.php new file mode 100644 index 00000000..85c4d73e --- /dev/null +++ b/app/Job/SubtaskEventJob.php @@ -0,0 +1,48 @@ +<?php + +namespace Kanboard\Job; + +use Kanboard\EventBuilder\SubtaskEventBuilder; + +/** + * Class SubtaskEventJob + * + * @package Kanboard\Job + * @author Frederic Guillot + */ +class SubtaskEventJob extends BaseJob +{ + /** + * Set job params + * + * @param int $subtaskId + * @param string $eventName + * @param array $values + * @return $this + */ + public function withParams($subtaskId, $eventName, array $values = array()) + { + $this->jobParams = array($subtaskId, $eventName, $values); + return $this; + } + + /** + * Execute job + * + * @param int $subtaskId + * @param string $eventName + * @param array $values + * @return $this + */ + public function execute($subtaskId, $eventName, array $values = array()) + { + $event = SubtaskEventBuilder::getInstance($this->container) + ->withSubtaskId($subtaskId) + ->withValues($values) + ->buildEvent(); + + if ($event !== null) { + $this->dispatcher->dispatch($eventName, $event); + } + } +} diff --git a/app/Job/TaskEventJob.php b/app/Job/TaskEventJob.php new file mode 100644 index 00000000..7d026a68 --- /dev/null +++ b/app/Job/TaskEventJob.php @@ -0,0 +1,75 @@ +<?php + +namespace Kanboard\Job; + +use Kanboard\Event\TaskEvent; +use Kanboard\EventBuilder\TaskEventBuilder; +use Kanboard\Model\TaskModel; + +/** + * Class TaskEventJob + * + * @package Kanboard\Job + * @author Frederic Guillot + */ +class TaskEventJob extends BaseJob +{ + /** + * Set job params + * + * @param int $taskId + * @param array $eventNames + * @param array $changes + * @param array $values + * @param array $task + * @return $this + */ + public function withParams($taskId, array $eventNames, array $changes = array(), array $values = array(), array $task = array()) + { + $this->jobParams = array($taskId, $eventNames, $changes, $values, $task); + return $this; + } + + /** + * Execute job + * + * @param int $taskId + * @param array $eventNames + * @param array $changes + * @param array $values + * @param array $task + * @return $this + */ + public function execute($taskId, array $eventNames, array $changes = array(), array $values = array(), array $task = array()) + { + $event = TaskEventBuilder::getInstance($this->container) + ->withTaskId($taskId) + ->withChanges($changes) + ->withValues($values) + ->withTask($task) + ->buildEvent(); + + if ($event !== null) { + foreach ($eventNames as $eventName) { + $this->fireEvent($eventName, $event); + } + } + } + + /** + * Trigger event + * + * @access protected + * @param string $eventName + * @param TaskEvent $event + */ + protected function fireEvent($eventName, TaskEvent $event) + { + $this->logger->debug(__METHOD__.' Event fired: '.$eventName); + $this->dispatcher->dispatch($eventName, $event); + + if ($eventName === TaskModel::EVENT_CREATE) { + $this->userMentionModel->fireEvents($event['task']['description'], TaskModel::EVENT_USER_MENTION, $event); + } + } +} diff --git a/app/Job/TaskFileEventJob.php b/app/Job/TaskFileEventJob.php new file mode 100644 index 00000000..293dbf27 --- /dev/null +++ b/app/Job/TaskFileEventJob.php @@ -0,0 +1,45 @@ +<?php + +namespace Kanboard\Job; + +use Kanboard\EventBuilder\TaskFileEventBuilder; + +/** + * Class TaskFileEventJob + * + * @package Kanboard\Job + * @author Frederic Guillot + */ +class TaskFileEventJob extends BaseJob +{ + /** + * Set job params + * + * @param int $fileId + * @param string $eventName + * @return $this + */ + public function withParams($fileId, $eventName) + { + $this->jobParams = array($fileId, $eventName); + return $this; + } + + /** + * Execute job + * + * @param int $fileId + * @param string $eventName + * @return $this + */ + public function execute($fileId, $eventName) + { + $event = TaskFileEventBuilder::getInstance($this->container) + ->withFileId($fileId) + ->buildEvent(); + + if ($event !== null) { + $this->dispatcher->dispatch($eventName, $event); + } + } +} diff --git a/app/Job/TaskLinkEventJob.php b/app/Job/TaskLinkEventJob.php new file mode 100644 index 00000000..31f62f07 --- /dev/null +++ b/app/Job/TaskLinkEventJob.php @@ -0,0 +1,45 @@ +<?php + +namespace Kanboard\Job; + +use Kanboard\EventBuilder\TaskLinkEventBuilder; + +/** + * Class TaskLinkEventJob + * + * @package Kanboard\Job + * @author Frederic Guillot + */ +class TaskLinkEventJob extends BaseJob +{ + /** + * Set job params + * + * @param int $taskLinkId + * @param string $eventName + * @return $this + */ + public function withParams($taskLinkId, $eventName) + { + $this->jobParams = array($taskLinkId, $eventName); + return $this; + } + + /** + * Execute job + * + * @param int $taskLinkId + * @param string $eventName + * @return $this + */ + public function execute($taskLinkId, $eventName) + { + $event = TaskLinkEventBuilder::getInstance($this->container) + ->withTaskLinkId($taskLinkId) + ->buildEvent(); + + if ($event !== null) { + $this->dispatcher->dispatch($eventName, $event); + } + } +} diff --git a/app/Locale/bs_BA/translations.php b/app/Locale/bs_BA/translations.php index 5f513347..898e4d66 100644 --- a/app/Locale/bs_BA/translations.php +++ b/app/Locale/bs_BA/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Prikaži drugi projekat', 'Created by %s' => 'Kreirao %s', 'Tasks Export' => 'Izvoz zadataka', - 'Tasks exportation for "%s"' => 'Izvoz zadataka za "%s"', 'Start Date' => 'Početni datum', 'End Date' => 'Datum završetka', 'Execute' => 'Izvrši', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Novi pod-zadatak', 'New attachment added "%s"' => 'Ubačen novi prilog "%s"', 'New comment posted by %s' => '%s ostavio novi komentar', - 'New attachment' => 'Novi prilog', 'New comment' => 'Novi komentar', 'Comment updated' => 'Komentar ažuriran', 'New subtask' => 'Novi pod-zadatak', - 'Subtask updated' => 'Pod-zadatak ažuriran', - 'Task updated' => 'Zadatak ažuriran', - 'Task closed' => 'Zadatak je zatvoren', - 'Task opened' => 'Zadatak je otvoren', 'I want to receive notifications only for those projects:' => 'Želim obavještenja samo za ove projekte:', 'view the task on Kanboard' => 'Pregledaj zadatke', 'Public access' => 'Javni pristup', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s ažurirao zadatak #%d', '%s created the task #%d' => '%s kreirao zadatak #%d', '%s closed the task #%d' => '%s zatvorio zadatak #%d', - '%s open the task #%d' => '%s otvorio zadatak #%d', - '%s moved the task #%d to the column "%s"' => '%s premjestio zadatak #%d u kolonu "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s premjestio zadatak #%d na poziciju %d u koloni "%s"', + '%s opened the task #%d' => '%s otvorio zadatak #%d', 'Activity' => 'Aktivnosti', 'Default values are "%s"' => 'Podrazumijevane vrijednosti su: "%s"', 'Default columns for new projects (Comma-separated)' => 'Podrazumijevane kolone za novi projekat (Odvojene zarezom)', 'Task assignee change' => 'Promijena izvršioca zadatka', - '%s change the assignee of the task #%d to %s' => '%s zamijeni izvršioca za zadatak #%d u %s', + '%s changed the assignee of the task #%d to %s' => '%s zamijeni izvršioca za zadatak #%d u %s', '%s changed the assignee of the task %s to %s' => '%s promijenio izvršioca za zadatak %s u %s', 'New password for the user "%s"' => 'Nova šifra korisnika "%s"', 'Choose an event' => 'Izaberi događaj', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Procenat', 'Number of tasks' => 'Broj zadataka', 'Task distribution' => 'Podjela zadataka', - 'Reportings' => 'Izveštaji', - 'Task repartition for "%s"' => 'Zaduženja zadataka za "%s"', 'Analytics' => 'Analiza', 'Subtask' => 'Pod-zadatak', 'My subtasks' => 'Moji pod-zadaci', 'User repartition' => 'Zaduženja korisnika', - 'User repartition for "%s"' => 'Zaduženja korisnika za "%s"', 'Clone this project' => 'Kloniraj ovaj projekat', 'Column removed successfully.' => 'Kolona uspješno uklonjena.', 'Not enough data to show the graph.' => 'Nedovoljno podataka za prikaz na grafikonu.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Vrijednost mora biti broj', 'Unable to create this task.' => 'Nije moguće kreirati zadatak.', 'Cumulative flow diagram' => 'Zbirni dijagram toka', - 'Cumulative flow diagram for "%s"' => 'Zbirni dijagram toka za "%s"', 'Daily project summary' => 'Zbirni pregled po danima', 'Daily project summary export' => 'Izvoz zbirnog pregleda po danima', - 'Daily project summary export for "%s"' => 'Izvoz zbirnog pregleda po danima za "%s"', 'Exports' => 'Izvozi', 'This export contains the number of tasks per column grouped per day.' => 'Ovaj izvoz sadržava broj zadataka po koloni grupisanih po danima.', 'Active swimlanes' => 'Aktivne swimline trake', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'ID pod-zadatka', 'Subtasks' => 'Pod-zadaci', 'Subtasks Export' => 'Izvoz pod-zadataka', - 'Subtasks exportation for "%s"' => 'Izvoz pod-zadataka za "%s"', 'Task Title' => 'Naslov zadatka', 'Untitled' => 'Bez naslova', 'Application default' => 'Podrazumijevano od aplikacije', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Stopa valute je uspješno dodana.', 'Unable to add this currency rate.' => 'Nemoguće dodati stopu valute.', 'Webhook URL' => 'Webhook URL', - '%s remove the assignee of the task %s' => '%s je uklonio izvršioca zadatka %s', + '%s removed the assignee of the task %s' => '%s je uklonio izvršioca zadatka %s', 'Enable Gravatar images' => 'Omogući Gravatar slike', 'Information' => 'Informacije', 'Check two factor authentication code' => 'Provjera faktor-dva autentifikacionog koda', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Testiraj svoj uređaj', 'Assign a color when the task is moved to a specific column' => 'Dodijeli boju kada je zadatak pomjeren u odabranu kolonu', '%s via Kanboard' => '%s uz pomoć Kanboard-a', - 'Burndown chart for "%s"' => 'Grafikon izgaranja za "%s"', 'Burndown chart' => 'Grafikon izgaranja', 'This chart show the task complexity over the time (Work Remaining).' => 'Ovaj grafikon pokazuje kompleksnost zadatka u vremenu (Preostalo vremena)', 'Screenshot taken %s' => 'Slika ekrana uzeta %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Pomjeri zadatak u drugu kolonu kada je kategorija promijenjena', 'Send a task by email to someone' => 'Pošalji zadatak nekome emailom', 'Reopen a task' => 'Ponovo otvori zadatak', - 'Column change' => 'Promijena kolone', - 'Position change' => 'Promjena pozicije', - 'Swimlane change' => 'Promjena swimline trake', - 'Assignee change' => 'Promijenjen izvršilac', - '[%s] Overdue tasks' => '[%s] Zaostali zadaci', 'Notification' => 'Obavještenja', '%s moved the task #%d to the first swimlane' => '%s je premjestio zadatak #%d u prvu swimline traku', - '%s moved the task #%d to the swimlane "%s"' => '%s je premjestio zadatak #%d u swimline traku "%s"', 'Swimlane' => 'Swimline traka', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s je premjestio zadatak %s u prvi swimline traku', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Pretraga po kategoriji: ', 'Search by description: ' => 'Pretraga po opisu: ', 'Search by due date: ' => 'Pretraga po datumu završetka: ', - 'Lead and Cycle time for "%s"' => 'Vrijeme upravljanje i vremenski ciklus za "%s"', - 'Average time spent into each column for "%s"' => 'Prosjek utrošenog vremena u svakoj koloni za "%s"', 'Average time spent into each column' => 'Prosjek utrošenog vrmena u svakoj koloni', 'Average time spent' => 'Prosjek utrošenog vremena', 'This chart show the average time spent into each column for the last %d tasks.' => 'Ovaj grafik pokazuje prosjek utrošenog vremena u svakoj koloni za posljednjih %d zadataka.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Licenca:', 'License' => 'Licenca', 'Enter the text below' => 'Unesi tekst ispod', - 'Gantt chart for %s' => 'Gantogram za %s', 'Sort by position' => 'Sortiraj po poziciji', 'Sort by date' => 'Sortiraj po datumu', 'Add task' => 'Dodaj zadatak', @@ -841,8 +817,6 @@ return array( 'Version' => 'Verzija', 'Plugins' => 'Dodaci', 'There is no plugin loaded.' => 'Nema učitanih dodataka.', - 'Set maximum column height' => 'Postavi maksimalnu visinu kolone', - 'Remove maximum column height' => 'Ukloni maksimalnu visinu kolone', 'My notifications' => 'Moja obavještenja', 'Custom filters' => 'Prilagođeni filteri', 'Your custom filter have been created successfully.' => 'Tvoj prilagođeni filter je uspješno napravljen.', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'Pogrešna captcha', 'The name must be unique' => 'Ime mora biti jedinstveno', 'View all groups' => 'Pregledaj sve grupe', - 'View group members' => 'Pregledaj članove grupe', 'There is no user available.' => 'Trenutno nema dostupnih korisnika.', 'Do you really want to remove the user "%s" from the group "%s"?' => 'Da li zaista želiš ukloniti korisnika "%s" iz grupe "%s"?', 'There is no group.' => 'Trenutno nema grupa.', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Unesi ime grupe...', 'Role:' => 'Uloga:', 'Project members' => 'Članovi projekta', - 'Compare hours for "%s"' => 'Poredi sate za "%s"', '%s mentioned you in the task #%d' => '%s te spomenuo u zadatku #%d', '%s mentioned you in a comment on the task #%d' => '%s te spomenuo u komentaru zadatka #%d', 'You were mentioned in the task #%d' => 'Spomenut si u zadatku #%d', 'You were mentioned in a comment on the task #%d' => 'Spomenut si u komentaru zadatka #%d', - 'Mentioned' => 'Spominjanja', - 'Compare Estimated Time vs Actual Time' => 'Poređenje očekivanog i aktuelnog vremena', 'Estimated hours: ' => 'Očekivani sati:', 'Actual hours: ' => 'Aktuelni sati:', 'Hours Spent' => 'Utrošeni sati:', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/cs_CZ/translations.php b/app/Locale/cs_CZ/translations.php index 1c28f4f9..565f92f5 100644 --- a/app/Locale/cs_CZ/translations.php +++ b/app/Locale/cs_CZ/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Zobrazit jiný projekt', 'Created by %s' => 'Vytvořeno uživatelem %s', 'Tasks Export' => 'Export úkolů', - 'Tasks exportation for "%s"' => 'Export úkolů pro "%s"', 'Start Date' => 'Počáteční datum', 'End Date' => 'Konečné datum', 'Execute' => 'Spustit', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Nový dílčí úkol', 'New attachment added "%s"' => 'Byla přidána nová příloha "%s".', 'New comment posted by %s' => 'Nový komentář publikovaný uživatelem %s', - 'New attachment' => 'Nová příloha', 'New comment' => 'Nový komentář', 'Comment updated' => 'Komentář byl aktualizován.', 'New subtask' => 'Nový dílčí úkol', - 'Subtask updated' => 'Dílčí úkol byl aktualizován', - 'Task updated' => 'Úkol byl aktualizován', - 'Task closed' => 'Úkol byl uzavřen', - 'Task opened' => 'Úkol byl otevřen', 'I want to receive notifications only for those projects:' => 'Přeji si dostávat upozornění pouze pro následující projekty:', 'view the task on Kanboard' => 'Zobrazit úkol na Kanboard', 'Public access' => 'Veřejný přístup', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s aktualizoval úkol #%d ', '%s created the task #%d' => '%s vytvořil úkol #%d ', '%s closed the task #%d' => '%s uzavřel úkol #%d ', - '%s open the task #%d' => '%s znovu otevřel úkol #%d ', - '%s moved the task #%d to the column "%s"' => '%s přesunul úkol #%d do sloupce "%s" ', - '%s moved the task #%d to the position %d in the column "%s"' => '%s přesunul úkol #%d na pozici %d ve sloupci "%s" ', + '%s opened the task #%d' => '%s znovu otevřel úkol #%d ', 'Activity' => 'Aktivity', 'Default values are "%s"' => 'Standardní hodnoty jsou: "%s"', 'Default columns for new projects (Comma-separated)' => 'Výchozí sloupce pro nové projekty (odděleny čárkou)', 'Task assignee change' => 'Změna přiřazení uživatelů', - '%s change the assignee of the task #%d to %s' => '%s změnil přidělení úkolu #%d na uživatele %s', + '%s changed the assignee of the task #%d to %s' => '%s změnil přidělení úkolu #%d na uživatele %s', '%s changed the assignee of the task %s to %s' => '%s změnil přidělení úkolu %s na uživatele %s', 'New password for the user "%s"' => 'Nové heslo pro uživatele "%s"', 'Choose an event' => 'Vybrat událost', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Procenta', 'Number of tasks' => 'Počet úkolů', 'Task distribution' => 'Rozdělení úkolů', - 'Reportings' => 'Reporty', - 'Task repartition for "%s"' => 'Rozdělení úkolů pro "%s"', 'Analytics' => 'Analýza', 'Subtask' => 'Dílčí úkoly', 'My subtasks' => 'Moje dílčí úkoly', 'User repartition' => 'Rozdělení podle uživatelů', - 'User repartition for "%s"' => 'Rozdělení podle uživatelů pro "%s"', 'Clone this project' => 'Duplokovat projekt', 'Column removed successfully.' => 'Sloupec byl odstraněn.', 'Not enough data to show the graph.' => 'Pro zobrazení grafu není dostatek dat.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Hodnota musí být číselná', 'Unable to create this task.' => 'Nelze vytvořit tento úkol', 'Cumulative flow diagram' => 'Kumulativní diagram', - 'Cumulative flow diagram for "%s"' => 'Kumulativní diagram pro "%s"', 'Daily project summary' => 'Denní přehledy', 'Daily project summary export' => 'Export denních přehledů', - 'Daily project summary export for "%s"' => 'Export denních přehledů pro "%s"', 'Exports' => 'Exporty', 'This export contains the number of tasks per column grouped per day.' => 'Tento export obsahuje počet úkolů pro jednotlivé sloupce seskupených podle dní.', 'Active swimlanes' => 'Aktivní dráhy', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Dílčí úkol Id', 'Subtasks' => 'Dílčí úkoly', 'Subtasks Export' => 'Export dílčích úkolů', - 'Subtasks exportation for "%s"' => 'Export dílčích úkolů pro "%s"', 'Task Title' => 'Název úkolu', 'Untitled' => 'bez názvu', 'Application default' => 'Standardní hodnoty', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Směnný kurz byl úspěšně přidán.', 'Unable to add this currency rate.' => 'Nelze přidat tento směnný kurz', 'Webhook URL' => 'Webhook URL', - '%s remove the assignee of the task %s' => '%s odstranil přiřazení úkolu %s ', + '%s removed the assignee of the task %s' => '%s odstranil přiřazení úkolu %s ', 'Enable Gravatar images' => 'Aktiviere Gravatar Bilder', 'Information' => 'Informace', 'Check two factor authentication code' => 'Zkontrolujte dvouúrovňový autentifikační klíč', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Test Vašeho zařízení', 'Assign a color when the task is moved to a specific column' => 'Přiřadit barvu, když je úkol přesunut do konkrétního sloupce', '%s via Kanboard' => '%s via Kanboard', - 'Burndown chart for "%s"' => 'Burndown-Chart pro "%s"', 'Burndown chart' => 'Burndown-Chart', 'This chart show the task complexity over the time (Work Remaining).' => 'Graf zobrazuje složitost úkolů v čase (Zbývající práce).', 'Screenshot taken %s' => 'Screenshot aufgenommen %s ', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Přesun úkolu do jiného sloupce když je změněna kategorie', 'Send a task by email to someone' => 'Poslat někomu úkol poštou', 'Reopen a task' => 'Znovu otevřít úkol', - 'Column change' => 'Změna sloupce', - 'Position change' => 'Změna pozice', - 'Swimlane change' => 'Změna dráhy', - 'Assignee change' => 'Změna přidělení', - '[%s] Overdue tasks' => '[%s] přetažených úkolů', 'Notification' => 'Upozornění', '%s moved the task #%d to the first swimlane' => '%s přesunul úkol #%d do první dráhy', - '%s moved the task #%d to the swimlane "%s"' => '%s přesunul úkol #%d do dráhy "%s"', // 'Swimlane' => '', // 'Gravatar' => '', '%s moved the task %s to the first swimlane' => '%s přesunul úkol %s do první dráhy', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Hledat podle kategorie: ', 'Search by description: ' => 'Hledat podle popisu: ', 'Search by due date: ' => 'Hledat podle termínu: ', - 'Lead and Cycle time for "%s"' => 'Dodací lhůta a doba cyklu pro "%s"', - 'Average time spent into each column for "%s"' => 'Průměrná doba strávená v každé fázi pro "%s"', 'Average time spent into each column' => 'Průměrná doba strávená v každé fázi', 'Average time spent' => 'Průměrná strávená doba', // 'This chart show the average time spent into each column for the last %d tasks.' => '', @@ -800,7 +777,6 @@ return array( 'License:' => 'Licence:', 'License' => 'Licence', 'Enter the text below' => 'Zadejte text níže', - 'Gantt chart for %s' => 'Gantt graf pro %s', 'Sort by position' => 'Třídit podle pozice', 'Sort by date' => 'Třídit podle datumu', 'Add task' => 'Přidat úkol', @@ -841,8 +817,6 @@ return array( // 'Version' => '', // 'Plugins' => '', // 'There is no plugin loaded.' => '', - // 'Set maximum column height' => '', - // 'Remove maximum column height' => '', // 'My notifications' => '', // 'Custom filters' => '', // 'Your custom filter have been created successfully.' => '', @@ -947,7 +921,6 @@ return array( // 'Invalid captcha' => '', // 'The name must be unique' => '', // 'View all groups' => '', - // 'View group members' => '', // 'There is no user available.' => '', // 'Do you really want to remove the user "%s" from the group "%s"?' => '', // 'There is no group.' => '', @@ -968,13 +941,10 @@ return array( // 'Enter group name...' => '', // 'Role:' => '', // 'Project members' => '', - // 'Compare hours for "%s"' => '', // '%s mentioned you in the task #%d' => '', // '%s mentioned you in a comment on the task #%d' => '', // 'You were mentioned in the task #%d' => '', // 'You were mentioned in a comment on the task #%d' => '', - // 'Mentioned' => '', - // 'Compare Estimated Time vs Actual Time' => '', // 'Estimated hours: ' => '', // 'Actual hours: ' => '', // 'Hours Spent' => '', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php index abebd394..0ff4253e 100644 --- a/app/Locale/da_DK/translations.php +++ b/app/Locale/da_DK/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Vis et andet projekt...', 'Created by %s' => 'Oprettet af %s', 'Tasks Export' => 'Opgave eksport', - 'Tasks exportation for "%s"' => 'Opgave eksport for "%s"', 'Start Date' => 'Start-dato', 'End Date' => 'Slut-dato', 'Execute' => 'Udfør', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Ny under-opgave', 'New attachment added "%s"' => 'Ny vedhæftning tilføjet "%s"', 'New comment posted by %s' => 'Ny kommentar af %s', - // 'New attachment' => '', // 'New comment' => '', 'Comment updated' => 'Kommentar opdateret', // 'New subtask' => '', - // 'Subtask updated' => '', - // 'Task updated' => '', - // 'Task closed' => '', - // 'Task opened' => '', 'I want to receive notifications only for those projects:' => 'Jeg vil kun have notifikationer for disse projekter:', 'view the task on Kanboard' => 'se opgaven på Kanboard', 'Public access' => 'Offentlig adgang', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s opdaterede opgaven #%d', '%s created the task #%d' => '%s oprettede opgaven #%d', '%s closed the task #%d' => '%s lukkede opgaven #%d', - '%s open the task #%d' => '%s åbnede opgaven #%d', - '%s moved the task #%d to the column "%s"' => '%s flyttede opgaven #%d til kolonnen "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s flyttede opgaven #%d til position %d i kolonnen "%s"', + '%s opened the task #%d' => '%s åbnede opgaven #%d', 'Activity' => 'Aktivitet', 'Default values are "%s"' => 'Standard værdier er "%s"', 'Default columns for new projects (Comma-separated)' => 'Standard kolonne for nye projekter (kommasepareret)', 'Task assignee change' => 'Opgaven ansvarlig ændring', - '%s change the assignee of the task #%d to %s' => '%s skrift ansvarlig for opgaven #%d til %s', + '%s changed the assignee of the task #%d to %s' => '%s skrift ansvarlig for opgaven #%d til %s', '%s changed the assignee of the task %s to %s' => '%s skift ansvarlig for opgaven %s til %s', 'New password for the user "%s"' => 'Ny adgangskode for brugeren "%s"', 'Choose an event' => 'Vælg et event', @@ -442,13 +434,10 @@ return array( // 'Percentage' => '', // 'Number of tasks' => '', // 'Task distribution' => '', - // 'Reportings' => '', - // 'Task repartition for "%s"' => '', // 'Analytics' => '', // 'Subtask' => '', // 'My subtasks' => '', // 'User repartition' => '', - // 'User repartition for "%s"' => '', // 'Clone this project' => '', // 'Column removed successfully.' => '', // 'Not enough data to show the graph.' => '', @@ -465,10 +454,8 @@ return array( // 'This value must be numeric' => '', // 'Unable to create this task.' => '', // 'Cumulative flow diagram' => '', - // 'Cumulative flow diagram for "%s"' => '', // 'Daily project summary' => '', // 'Daily project summary export' => '', - // 'Daily project summary export for "%s"' => '', // 'Exports' => '', // 'This export contains the number of tasks per column grouped per day.' => '', // 'Active swimlanes' => '', @@ -494,7 +481,6 @@ return array( // 'Subtask Id' => '', // 'Subtasks' => '', // 'Subtasks Export' => '', - // 'Subtasks exportation for "%s"' => '', // 'Task Title' => '', // 'Untitled' => '', // 'Application default' => '', @@ -601,7 +587,7 @@ return array( // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', // 'Webhook URL' => '', - // '%s remove the assignee of the task %s' => '', + // '%s removed the assignee of the task %s' => '', // 'Enable Gravatar images' => '', // 'Information' => '', // 'Check two factor authentication code' => '', @@ -615,7 +601,6 @@ return array( // 'Test your device' => '', // 'Assign a color when the task is moved to a specific column' => '', // '%s via Kanboard' => '', - // 'Burndown chart for "%s"' => '', // 'Burndown chart' => '', // 'This chart show the task complexity over the time (Work Remaining).' => '', // 'Screenshot taken %s' => '', @@ -680,14 +665,8 @@ return array( // 'Move the task to another column when the category is changed' => '', // 'Send a task by email to someone' => '', // 'Reopen a task' => '', - // 'Column change' => '', - // 'Position change' => '', - // 'Swimlane change' => '', - // 'Assignee change' => '', - // '[%s] Overdue tasks' => '', // 'Notification' => '', // '%s moved the task #%d to the first swimlane' => '', - // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', // 'Gravatar' => '', // '%s moved the task %s to the first swimlane' => '', @@ -758,8 +737,6 @@ return array( // 'Search by category: ' => '', // 'Search by description: ' => '', // 'Search by due date: ' => '', - // 'Lead and Cycle time for "%s"' => '', - // 'Average time spent into each column for "%s"' => '', // 'Average time spent into each column' => '', // 'Average time spent' => '', // 'This chart show the average time spent into each column for the last %d tasks.' => '', @@ -800,7 +777,6 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Gantt chart for %s' => '', // 'Sort by position' => '', // 'Sort by date' => '', // 'Add task' => '', @@ -841,8 +817,6 @@ return array( // 'Version' => '', // 'Plugins' => '', // 'There is no plugin loaded.' => '', - // 'Set maximum column height' => '', - // 'Remove maximum column height' => '', // 'My notifications' => '', // 'Custom filters' => '', // 'Your custom filter have been created successfully.' => '', @@ -947,7 +921,6 @@ return array( // 'Invalid captcha' => '', // 'The name must be unique' => '', // 'View all groups' => '', - // 'View group members' => '', // 'There is no user available.' => '', // 'Do you really want to remove the user "%s" from the group "%s"?' => '', // 'There is no group.' => '', @@ -968,13 +941,10 @@ return array( // 'Enter group name...' => '', // 'Role:' => '', // 'Project members' => '', - // 'Compare hours for "%s"' => '', // '%s mentioned you in the task #%d' => '', // '%s mentioned you in a comment on the task #%d' => '', // 'You were mentioned in the task #%d' => '', // 'You were mentioned in a comment on the task #%d' => '', - // 'Mentioned' => '', - // 'Compare Estimated Time vs Actual Time' => '', // 'Estimated hours: ' => '', // 'Actual hours: ' => '', // 'Hours Spent' => '', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php index f569206b..59de2956 100644 --- a/app/Locale/de_DE/translations.php +++ b/app/Locale/de_DE/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Zu Projekt wechseln', 'Created by %s' => 'Erstellt durch %s', 'Tasks Export' => 'Aufgaben exportieren', - 'Tasks exportation for "%s"' => 'Aufgaben exportieren für "%s"', 'Start Date' => 'Anfangsdatum', 'End Date' => 'Enddatum', 'Execute' => 'Ausführen', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Neue Teilaufgabe', 'New attachment added "%s"' => 'Neuer Anhang "%s" wurde hinzugefügt.', 'New comment posted by %s' => 'Neuer Kommentar verfasst durch %s', - 'New attachment' => 'Neuer Anhang', 'New comment' => 'Neuer Kommentar', 'Comment updated' => 'Kommentar wurde aktualisiert', 'New subtask' => 'Neue Teilaufgabe', - 'Subtask updated' => 'Teilaufgabe aktualisiert', - 'Task updated' => 'Aufgabe aktualisiert', - 'Task closed' => 'Aufgabe geschlossen', - 'Task opened' => 'Aufgabe geöffnet', 'I want to receive notifications only for those projects:' => 'Ich möchte nur für diese Projekte Benachrichtigungen erhalten:', 'view the task on Kanboard' => 'diese Aufgabe auf dem Kanboard zeigen', 'Public access' => 'Öffentlicher Zugriff', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s hat die Aufgabe #%d aktualisiert', '%s created the task #%d' => '%s hat die Aufgabe #%d angelegt', '%s closed the task #%d' => '%s hat die Aufgabe #%d geschlossen', - '%s open the task #%d' => '%s hat die Aufgabe #%d geöffnet', - '%s moved the task #%d to the column "%s"' => '%s hat die Aufgabe #%d in die Spalte "%s" verschoben', - '%s moved the task #%d to the position %d in the column "%s"' => '%s hat die Aufgabe #%d an die Position %d in der Spalte "%s" verschoben', + '%s opened the task #%d' => '%s hat die Aufgabe #%d geöffnet', 'Activity' => 'Aktivität', 'Default values are "%s"' => 'Die Standardwerte sind "%s"', 'Default columns for new projects (Comma-separated)' => 'Standardspalten für neue Projekte (komma-getrennt)', 'Task assignee change' => 'Zuständigkeit geändert', - '%s change the assignee of the task #%d to %s' => '%s hat die Zusständigkeit der Aufgabe #%d geändert um %s', + '%s changed the assignee of the task #%d to %s' => '%s hat die Zusständigkeit der Aufgabe #%d geändert um %s', '%s changed the assignee of the task %s to %s' => '%s hat die Zuständigkeit der Aufgabe %s geändert um %s', 'New password for the user "%s"' => 'Neues Passwort des Benutzers "%s"', 'Choose an event' => 'Aktion wählen', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Prozentsatz', 'Number of tasks' => 'Anzahl an Aufgaben', 'Task distribution' => 'Aufgabenverteilung', - 'Reportings' => 'Berichte', - 'Task repartition for "%s"' => 'Aufgabenzuweisung für "%s"', 'Analytics' => 'Analyse', 'Subtask' => 'Teilaufgabe', 'My subtasks' => 'Meine Teilaufgaben', 'User repartition' => 'Benutzerverteilung', - 'User repartition for "%s"' => 'Benutzerverteilung für "%s"', 'Clone this project' => 'Projekt kopieren', 'Column removed successfully.' => 'Spalte erfolgreich entfernt.', 'Not enough data to show the graph.' => 'Nicht genügend Daten, um die Grafik zu zeigen.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Dieser Wert muss nummerisch sein', 'Unable to create this task.' => 'Diese Aufgabe kann nicht erstellt werden', 'Cumulative flow diagram' => 'Kumulatives Flussdiagramm', - 'Cumulative flow diagram for "%s"' => 'Kumulatives Flussdiagramm für "%s"', 'Daily project summary' => 'Tägliche Projektzusammenfassung', 'Daily project summary export' => 'Export der täglichen Projektzusammenfassung', - 'Daily project summary export for "%s"' => 'Export der täglichen Projektzusammenfassung für "%s"', 'Exports' => 'Exporte', 'This export contains the number of tasks per column grouped per day.' => 'Dieser Export enthält die Anzahl der Aufgaben pro Spalte nach Tagen gruppiert.', 'Active swimlanes' => 'Aktive Swimlane', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Teilaufgaben-ID', 'Subtasks' => 'Teilaufgaben', 'Subtasks Export' => 'Export von Teilaufgaben', - 'Subtasks exportation for "%s"' => 'Export von Teilaufgaben für "%s"', 'Task Title' => 'Aufgaben-Titel', 'Untitled' => 'unbetitelt', 'Application default' => 'Anwendungsstandard', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Der Währungskurs wurde erfolgreich hinzugefügt.', 'Unable to add this currency rate.' => 'Währungskurs konnte nicht hinzugefügt werden', 'Webhook URL' => 'Webhook-URL', - '%s remove the assignee of the task %s' => '%s Zuordnung für die Aufgabe %s entfernen', + '%s removed the assignee of the task %s' => '%s Zuordnung für die Aufgabe %s entfernen', 'Enable Gravatar images' => 'Aktiviere Gravatar-Bilder', 'Information' => 'Information', 'Check two factor authentication code' => 'Prüfe Zwei-Faktor-Authentifizierungscode', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Teste dein Gerät', 'Assign a color when the task is moved to a specific column' => 'Weise eine Farbe zu, wenn die Aufgabe zu einer bestimmten Spalte bewegt wird', '%s via Kanboard' => '%s via Kanboard', - 'Burndown chart for "%s"' => 'Burndown-Diagramm für "%s"', 'Burndown chart' => 'Burndown-Diagramm', 'This chart show the task complexity over the time (Work Remaining).' => 'Dieses Diagramm zeigt die Aufgabenkomplexität über den Faktor Zeit (Verbleibende Arbeit).', 'Screenshot taken %s' => 'Screenshot aufgenommen %s ', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Aufgabe in andere Spalte verschieben, wenn Kategorie geändert wird', 'Send a task by email to someone' => 'Aufgabe per E-Mail versenden', 'Reopen a task' => 'Aufgabe wieder öffnen', - 'Column change' => 'Spalte geändert', - 'Position change' => 'Position geändert', - 'Swimlane change' => 'Swimlane geändert', - 'Assignee change' => 'Zuordnung geändert', - '[%s] Overdue tasks' => '[%s] überfallige Aufgaben', 'Notification' => 'Benachrichtigungen', '%s moved the task #%d to the first swimlane' => '%s hat die Aufgabe #%d in die erste Swimlane verschoben', - '%s moved the task #%d to the swimlane "%s"' => '%s hat die Aufgabe #%d in die Swimlane "%s" verschoben', 'Swimlane' => 'Swimlane', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s hat die Aufgabe %s in die erste Swimlane verschoben', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Suche nach Kategorie: ', 'Search by description: ' => 'Suche nach Beschreibung: ', 'Search by due date: ' => 'Suche nach Fälligkeitsdatum: ', - 'Lead and Cycle time for "%s"' => 'Durchlauf und Zykluszeit für "%s"', - 'Average time spent into each column for "%s"' => 'Durchschnittliche Zeit in jeder Spalte für "%s"', 'Average time spent into each column' => 'Durchschnittszeit in jeder Spalte', 'Average time spent' => 'Durchschnittlicher Zeitverbrauch', 'This chart show the average time spent into each column for the last %d tasks.' => 'Dieses Diagramm zeigt die durchschnittliche Zeit in jeder Spalte der letzten %d Aufgaben.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Lizenz:', 'License' => 'Lizenz', 'Enter the text below' => 'Text unten eingeben', - 'Gantt chart for %s' => 'Gantt Diagramm für %s', 'Sort by position' => 'Nach Position sortieren', 'Sort by date' => 'Nach Datum sortieren', 'Add task' => 'Aufgabe hinzufügen', @@ -841,8 +817,6 @@ return array( 'Version' => 'Version', 'Plugins' => 'Plugins', 'There is no plugin loaded.' => 'Es ist kein Plugin geladen.', - 'Set maximum column height' => 'Setze maximale Spaltenhöhe', - 'Remove maximum column height' => 'Entferne maximale Spaltenhöhe', 'My notifications' => 'Meine Benachrichtigungen', 'Custom filters' => 'Benutzerdefinierte Filter', 'Your custom filter have been created successfully.' => 'Benutzerdefinierten Filter erfolgreich erstellt.', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'Ungültiges Captcha', 'The name must be unique' => 'Der Name muss eindeutig sein', 'View all groups' => 'Alle Gruppen anzeigen', - 'View group members' => 'Gruppenmitglieder anzeigen', 'There is no user available.' => 'Es ist kein Benutzer verfügbar.', 'Do you really want to remove the user "%s" from the group "%s"?' => 'Wollen Sie den Benutzer "%s" wirklich aus der Gruppe "%s" löschen?', 'There is no group.' => 'Es gibt keine Gruppe.', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Geben Sie den Gruppennamen ein...', 'Role:' => 'Rolle:', 'Project members' => 'Projektmitglieder', - 'Compare hours for "%s"' => 'Vergleich der Stunden für %s', '%s mentioned you in the task #%d' => '%s erwähnte Sie in Aufgabe #%d', '%s mentioned you in a comment on the task #%d' => '%s erwähnte Sie in einem Kommentar zur Aufgabe #%d', 'You were mentioned in the task #%d' => 'Sie wurden in der Aufgabe #%d erwähnt', 'You were mentioned in a comment on the task #%d' => 'Sie wurden in einem Kommentar zur Aufgabe #%d erwähnt', - 'Mentioned' => 'Erwähnt', - 'Compare Estimated Time vs Actual Time' => 'Vergleich zwischen erwartetem und tatsächlichem Zeitaufwand', 'Estimated hours: ' => 'Erwarteter Zeitaufwand (Stunden): ', 'Actual hours: ' => 'Tatsächlich aufgewändete Stunden: ', 'Hours Spent' => 'Stunden aufgewändet', @@ -1216,5 +1186,32 @@ return array( 'Global tags' => 'Globale Schlagwörter', 'There is no global tag at the moment.' => 'Es gibt zur Zeit kein globales Schlagwort', 'This field cannot be empty' => 'Dieses Feld kann nicht leer sein', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', 'Hide tasks in this column in the dashboard' => 'Aufgaben in dieser Spalte im Dashboard ausblenden', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/el_GR/translations.php b/app/Locale/el_GR/translations.php index c1d7c579..cf3bb588 100644 --- a/app/Locale/el_GR/translations.php +++ b/app/Locale/el_GR/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Εμφάνιση άλλου έργου', 'Created by %s' => 'Δημιουργήθηκε από %s', 'Tasks Export' => 'Εξαγωγή εργασιών', - 'Tasks exportation for "%s"' => 'Εξαγωγή εργασιών για το έργο « %s »', 'Start Date' => 'Ημερομηνία έναρξης', 'End Date' => 'ημερομηνία λήξης', 'Execute' => 'Εκτέλεση', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Νέα υπο-εργασία', 'New attachment added "%s"' => 'Νέα επικόλληση προστέθηκε « %s »', 'New comment posted by %s' => 'Νέο σχόλιο από τον χρήστη « %s »', - 'New attachment' => 'New attachment', 'New comment' => 'Νέο σχόλιο', 'Comment updated' => 'Το σχόλιο ενημερώθηκε', 'New subtask' => 'Νέα υπο-εργασία', - 'Subtask updated' => 'Η Υπο-Εργασία ενημερώθηκε', - 'Task updated' => 'Η εργασία ενημερώθηκε', - 'Task closed' => 'Η εργασία έκλεισε', - 'Task opened' => 'Η εργασία άνοιξε', 'I want to receive notifications only for those projects:' => 'Θέλω να ενημερώνομαι αποκλειστικά για:', 'view the task on Kanboard' => 'Προβολή της εργασίας στο Kanboard', 'Public access' => 'Ανοιχτή πρόσβαση', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s ενημέρωσε την εργασία n°%d', '%s created the task #%d' => '%s δημιούργησε την εργασία n°%d', '%s closed the task #%d' => '%s έκλεισε την εργασία n°%d', - '%s open the task #%d' => '%s άνοιξε την εργασία n°%d', - '%s moved the task #%d to the column "%s"' => '%s μετακίνησε την εργασία n°%d στη στήλη « %s »', - '%s moved the task #%d to the position %d in the column "%s"' => '%s μετακίνησε την εργασία n°%d στη θέση n°%d της στήλης « %s »', + '%s opened the task #%d' => '%s άνοιξε την εργασία n°%d', 'Activity' => 'Δραστηριότητα', 'Default values are "%s"' => 'Οι προεπιλεγμένες τιμές είναι « %s »', 'Default columns for new projects (Comma-separated)' => 'Προεπιλεγμένες στήλες για νέα έργα (Comma-separated)', 'Task assignee change' => 'Αλλαγή εκδοχέα εργασίας', - '%s change the assignee of the task #%d to %s' => '%s άλλαξε τον εκδοχέα της εργασίας n˚%d σε %s', + '%s changed the assignee of the task #%d to %s' => '%s άλλαξε τον εκδοχέα της εργασίας n˚%d σε %s', '%s changed the assignee of the task %s to %s' => '%s ενημέρωσε τον εκδοχέα της εργασίας %s σε %s', 'New password for the user "%s"' => 'Νέο password του χρήστη « %s »', 'Choose an event' => 'Επιλογή event', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Ποσοστό', 'Number of tasks' => 'Αριθμός εργασιών', 'Task distribution' => 'Κατανομή εργασιών', - 'Reportings' => 'Αναφορές', - 'Task repartition for "%s"' => 'Επανάληψη εργασιών για « %s »', 'Analytics' => 'Αναλύσεις', 'Subtask' => 'Υπο-Εργασία', 'My subtasks' => 'Οι υπο-εργασίες μου', 'User repartition' => 'Επαναλήψεις χρηστών', - 'User repartition for "%s"' => 'Επαναλήψεις χρηστών για « %s »', 'Clone this project' => 'Κλωνοποίηση έργου', 'Column removed successfully.' => 'Η στήλη αφαιρέθηκε με επιτυχία.', 'Not enough data to show the graph.' => 'Ελλειπή δεδομένα για να εμφανιστεί το γράφημα.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Η τιμή πρέπει να είναι αριθμός', 'Unable to create this task.' => 'Αδύνατο να δημιουργηθεί αυτή η εργασία.', 'Cumulative flow diagram' => 'Συγκεντρωτικό διάγραμμα ροής', - 'Cumulative flow diagram for "%s"' => 'Συγκεντρωτικό διάγραμμα ροής για « %s »', 'Daily project summary' => 'Καθημερινή περίληψη του έργου', 'Daily project summary export' => 'Εξαγωγή της καθημερινής περίληψης του έργου', - 'Daily project summary export for "%s"' => 'Εξαγωγή της καθημερινής περίληψης του έργου « %s »', 'Exports' => 'Εξαγωγές', 'This export contains the number of tasks per column grouped per day.' => 'Αυτή η κατάσταση περιέχει τον αριθμό των εργασιών ανά στήλη ομαδοποιημένα ανά ημέρα.', 'Active swimlanes' => 'Ενεργές λωρίδες', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Id υπο-εργασίας', 'Subtasks' => 'Υπο-Εργασίες', 'Subtasks Export' => 'Εξαγωγή υπο-εργασίων', - 'Subtasks exportation for "%s"' => 'Εξαγωγή υπο-εργασίων για το έργο « %s »', 'Task Title' => 'Τίτλος εργασίας', 'Untitled' => 'Χωρίς τίτλο', 'Application default' => 'Προεπιλογή από την εφαρμογή', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Η ισοτιμία προστέθηκε με επιτυχία.', 'Unable to add this currency rate.' => 'Αδύνατο να προστεθεί αυτή η ισοτιμία.', 'Webhook URL' => 'Webhook URL', - '%s remove the assignee of the task %s' => '%s αφαίρεσε τον εκδοχέα της εργασίας %s', + '%s removed the assignee of the task %s' => '%s αφαίρεσε τον εκδοχέα της εργασίας %s', 'Enable Gravatar images' => 'Ενεργοποίηση εικόνων Gravatar', 'Information' => 'Πληροφορίες', 'Check two factor authentication code' => 'Ελέγξτε δύο παράγοντες ελέγχου ταυτότητας κωδικού', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Ελέγξτε τη συσκευή σας', 'Assign a color when the task is moved to a specific column' => 'Αντιστοίχιση χρώματος όταν η εργασία κινείται σε μια συγκεκριμένη στήλη', '%s via Kanboard' => '%s via Kanboard', - 'Burndown chart for "%s"' => 'Δημιουργία διαγράμματος για « %s »', 'Burndown chart' => 'Δημιουργία διαγράμματος', 'This chart show the task complexity over the time (Work Remaining).' => 'Αυτό το γράφημα δείχνει την πολυπλοκότητα του έργου κατά την πάροδο του χρόνου (Εργασία που παραμένει).', 'Screenshot taken %s' => 'Το screenshot αποθηκεύτηκε από %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Μετακινήστε την εργασία σε άλλη στήλη, όταν η κατηγορία έχει αλλάξει', 'Send a task by email to someone' => 'Στείλτε μια εργασία μέσω ηλεκτρονικού ταχυδρομείου σε κάποιον', 'Reopen a task' => 'Ξανα-ανοίξτε μια εργασία', - 'Column change' => 'Αλλαγή στήλης', - 'Position change' => 'Αλλαγή θέσης', - 'Swimlane change' => 'Αλλαγή λωρίδας', - 'Assignee change' => 'Αλλαγή εκδοχέα', - '[%s] Overdue tasks' => '[%s] Εκπρόθεσμες εργασίες', 'Notification' => 'Κοινοποίηση', '%s moved the task #%d to the first swimlane' => '%s μετέφερε την εργασία n°%d στην 1η λωρίδα', - '%s moved the task #%d to the swimlane "%s"' => '%s μετέφερε την εργασία n°%d στη λωρίδα « %s »', 'Swimlane' => 'Λωρίδα', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s μετέφερε την εργασία %s στην 1η λωρίδα', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Αναζήτηση βάση κατηγορίας: ', 'Search by description: ' => 'Αναζήτηση βάση περιγραφής: ', 'Search by due date: ' => 'Αναζήτηση βάση ημέρας λήξης: ', - 'Lead and Cycle time for "%s"' => 'Lead & cycle time για « %s »', - 'Average time spent into each column for "%s"' => 'Μέσος χρόνος παραμονής σε κάθε στήλη για « %s »', 'Average time spent into each column' => 'Μέσος χρόνος παραμονής σε κάθε στήλη', 'Average time spent' => 'Μέσος χρόνος που δαπανήθηκε', 'This chart show the average time spent into each column for the last %d tasks.' => 'Αυτό το γράφημα δείχνει ότι ο μέσος χρόνος που δαπανάται σε κάθε στήλη για τις τελευταίες %d εργασίες', @@ -800,7 +777,6 @@ return array( 'License:' => 'Άδεια:', 'License' => 'Άδεια', 'Enter the text below' => 'Πληκτρολογήστε το παρακάτω κείμενο', - 'Gantt chart for %s' => 'Gantt διάγραμμα για %s', 'Sort by position' => 'Ταξινόμηση κατά Θέση', 'Sort by date' => 'Ταξινόμηση κατά ημέρα', 'Add task' => 'Προσθήκη εργασίας', @@ -841,8 +817,6 @@ return array( 'Version' => 'Έκδοση', 'Plugins' => 'Πρόσθετα', 'There is no plugin loaded.' => 'Δεν έχει φορτωθεί plugin', - 'Set maximum column height' => 'Ορισμός μέγιστου ύψους στήλης', - 'Remove maximum column height' => 'Αφαίρεση μέγιστου ύψους στήλης', 'My notifications' => 'Οι ειδοποιήσεις μου', 'Custom filters' => 'Φίλτρα ορισμένα από τον χρήστη', 'Your custom filter have been created successfully.' => 'Το παρεμετροποιημένο από τον χρήστη φίλτρο δημιουργήθηκε με επιτυχία', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'Μη αποδεκτό Captcha', 'The name must be unique' => 'Το όνομα πρέπει να είναι μοναδικό', 'View all groups' => 'Προβολή όλων των ομάδων', - 'View group members' => 'Προβολή των μελών της ομάδας', 'There is no user available.' => 'Δεν υπάρχει διαθέσιμος χρήστης', 'Do you really want to remove the user "%s" from the group "%s"?' => 'Αφαίρεση του χρήστη « %s » από την ομάδα « %s » ?', 'There is no group.' => 'Δεν υπάρχει ομάδα.', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Εισαγωγή ονομασίας ομάδας...', 'Role:' => 'Ρόλος:', 'Project members' => 'Μέλη έργου', - 'Compare hours for "%s"' => 'Σύγκριση ωρών για « %s »', '%s mentioned you in the task #%d' => '%s αναφέρονται σε εσάς, στη εργασία n°%d', '%s mentioned you in a comment on the task #%d' => '%s αναφέρονται σε εσάς σε σχόλιο, στη εργασίας n°%d', 'You were mentioned in the task #%d' => 'Αναφέρεστε στην εργασία n°%d', 'You were mentioned in a comment on the task #%d' => 'Αναφέρεστε σε σχόλιο, στην εργασία n°%d', - 'Mentioned' => 'Αναφέρεται', - 'Compare Estimated Time vs Actual Time' => 'Σύγκριση προβλεπόμενου χρόνου vs πραγματικού χρόνου', 'Estimated hours: ' => 'Προβλεπόμενες ώρες: ', 'Actual hours: ' => 'Πραγματικές ώρες: ', 'Hours Spent' => 'Δαπανόμενες ώρες', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php index 5699ce6f..5a2c16c0 100644 --- a/app/Locale/es_ES/translations.php +++ b/app/Locale/es_ES/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Mostrar otro proyecto', 'Created by %s' => 'Creado por %s', 'Tasks Export' => 'Exportar tareas', - 'Tasks exportation for "%s"' => 'Exportación de tareas para «%s»', 'Start Date' => 'Fecha de inicio', 'End Date' => 'Fecha final', 'Execute' => 'Ejecutar', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Nueva subtarea', 'New attachment added "%s"' => 'Nuevo adjunto añadido «%s»', 'New comment posted by %s' => 'Nuevo comentario añadido por %s', - 'New attachment' => 'Nuevo adjunto', 'New comment' => 'Nuevo comentario', 'Comment updated' => 'Comentario actualizado', 'New subtask' => 'Nueva subtarea', - 'Subtask updated' => 'Subtarea actualizada', - 'Task updated' => 'Tarea actualizada', - 'Task closed' => 'Tarea cerrada', - 'Task opened' => 'Tarea abierta', 'I want to receive notifications only for those projects:' => 'Quiero recibir notificaciones sólo de estos proyectos:', 'view the task on Kanboard' => 'ver la tarea en Kanboard', 'Public access' => 'Acceso público', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s actualizó la tarea #%d', '%s created the task #%d' => '%s creó la tarea #%d', '%s closed the task #%d' => '%s cerró la tarea #%d', - '%s open the task #%d' => '%s abrió la tarea #%d', - '%s moved the task #%d to the column "%s"' => '%s movió la tarea #%d a la columna «%s»', - '%s moved the task #%d to the position %d in the column "%s"' => '%s movió la tarea #%d a la posición %d de la columna «%s»', + '%s opened the task #%d' => '%s abrió la tarea #%d', 'Activity' => 'Actividad', 'Default values are "%s"' => 'Los valores por defecto son «%s»', 'Default columns for new projects (Comma-separated)' => 'Columnas por defecto para los nuevos proyectos (separadas mediante comas)', 'Task assignee change' => 'Cambiar responsable de la tarea', - '%s change the assignee of the task #%d to %s' => '%s cambió el responsable de la tarea #%d por %s', + '%s changed the assignee of the task #%d to %s' => '%s cambió el responsable de la tarea #%d por %s', '%s changed the assignee of the task %s to %s' => '%s cambió el responsable de la tarea %s por %s', 'New password for the user "%s"' => 'Nueva contraseña para el usuario «%s»', 'Choose an event' => 'Seleccione un evento', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Porcentaje', 'Number of tasks' => 'Número de tareas', 'Task distribution' => 'Distribución de tareas', - 'Reportings' => 'Informes', - 'Task repartition for "%s"' => 'Repartición de tareas para «%s»', 'Analytics' => 'Analítica', 'Subtask' => 'Subtarea', 'My subtasks' => 'Mis subtareas', 'User repartition' => 'Repartición de usuarios', - 'User repartition for "%s"' => 'Repartición de usuarios para «%s»', 'Clone this project' => 'Clonar este proyecto', 'Column removed successfully.' => 'Columna eliminada correctamente.', 'Not enough data to show the graph.' => 'No hay suficiente información para mostrar el gráfico.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Este valor debe ser numérico', 'Unable to create this task.' => 'No se puede crear esta tarea.', 'Cumulative flow diagram' => 'Diagrama de flujo acumulativo', - 'Cumulative flow diagram for "%s"' => 'Diagrama de flujo acumulativo para «%s»', 'Daily project summary' => 'Resumen diario del proyecto', 'Daily project summary export' => 'Exportar resumen diario del proyecto', - 'Daily project summary export for "%s"' => 'Exportar resumen diario del proyecto para «%s»', 'Exports' => 'Exportaciones', 'This export contains the number of tasks per column grouped per day.' => 'Esta exportación contiene el número de tareas por columna agrupadas por día.', 'Active swimlanes' => 'Calles activas', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Identificador de subtarea', 'Subtasks' => 'Subtareas', 'Subtasks Export' => 'Exportación de subtareas', - 'Subtasks exportation for "%s"' => 'Exportación de subtareas para «%s»', 'Task Title' => 'Título de la tarea', 'Untitled' => 'Sin título', 'Application default' => 'Predefinido por la aplicación', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'El cambio de moneda se ha añadido correctamente.', 'Unable to add this currency rate.' => 'No se puede añadir este cambio de moneda.', 'Webhook URL' => 'URL del disparador web (webhook)', - '%s remove the assignee of the task %s' => '%s quita el responsable de la tarea %s', + '%s removed the assignee of the task %s' => '%s quita el responsable de la tarea %s', 'Enable Gravatar images' => 'Activar imágenes Gravatar', 'Information' => 'Información', 'Check two factor authentication code' => 'Revisar código de autenticación en dos pasos', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Probar su dispositivo', 'Assign a color when the task is moved to a specific column' => 'Asignar un color al mover la tarea a una columna específica', '%s via Kanboard' => '%s vía Kanboard', - 'Burndown chart for "%s"' => 'Trabajo pendiente para «%s»', 'Burndown chart' => 'Trabajo pendiente', 'This chart show the task complexity over the time (Work Remaining).' => 'Este diagrama muestra la complejidad de la tarea a lo largo del tiempo (trabajo restante).', 'Screenshot taken %s' => 'Pantallazo tomado el %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Mover la tarea a otra columna cuando cambie la categoría', 'Send a task by email to someone' => 'Enviar una tarea a alguien por correo', 'Reopen a task' => 'Reabrir tarea', - 'Column change' => 'Cambio de columna', - 'Position change' => 'Cambio de posición', - 'Swimlane change' => 'Cambio de calle', - 'Assignee change' => 'Cambio de responsable', - '[%s] Overdue tasks' => '[%s] Tareas vencidas', 'Notification' => 'Notificación', '%s moved the task #%d to the first swimlane' => '%s movió la tarea #%d a la primera calle', - '%s moved the task #%d to the swimlane "%s"' => '%s movió la tarea #%d a la calle «%s»', 'Swimlane' => 'Calle', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s movió la tarea %s a la primera calle', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Buscar por categoría: ', 'Search by description: ' => 'Buscar por descripción: ', 'Search by due date: ' => 'Buscar por fecha de entrega: ', - 'Lead and Cycle time for "%s"' => 'Plazo de entrega y ciclo para «%s»', - 'Average time spent into each column for "%s"' => 'Tiempo medio empleado en cada columna para «%s»', 'Average time spent into each column' => 'Tiempo medio empleado en cada columna', 'Average time spent' => 'Tiempo medio empleado', 'This chart show the average time spent into each column for the last %d tasks.' => 'Esta gráfica muestra el tiempo medio empleado en cada columna para las últimas %d tareas.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Licencia:', 'License' => 'Licencia', 'Enter the text below' => 'Introduzca el texto a continuación', - 'Gantt chart for %s' => 'Diagrama de Gantt para %s', 'Sort by position' => 'Ordenar por posición', 'Sort by date' => 'Ordenar por fecha', 'Add task' => 'Añadir tarea', @@ -841,8 +817,6 @@ return array( 'Version' => 'Versión', 'Plugins' => 'Plugins', 'There is no plugin loaded.' => 'No hay ningún plugin cargado.', - 'Set maximum column height' => 'Establecer altura máxima de la columna', - 'Remove maximum column height' => 'Eliminar altura máxima de la columna', 'My notifications' => 'Mis notificaciones', 'Custom filters' => 'Filtros personalizados', 'Your custom filter have been created successfully.' => 'Tus filtros personalizados han sido creados correctamente.', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'CAPTCHA inválido', 'The name must be unique' => 'El nombre debe ser único', 'View all groups' => 'Ver todos los grupos', - 'View group members' => 'Ver miembros del grupo', 'There is no user available.' => 'No hay usuario disponible.', 'Do you really want to remove the user "%s" from the group "%s"?' => '¿Realmente desea eliminar el usuario «%s» del grupo «%s»?', 'There is no group.' => 'No hay grupo.', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Ingresa el nombre del grupo...', 'Role:' => 'Rol:', 'Project members' => 'Miembros del proyecto', - 'Compare hours for "%s"' => 'Compara horas con «%s»', '%s mentioned you in the task #%d' => '%s te mencionó en la tarea #%d', '%s mentioned you in a comment on the task #%d' => '%s te mencionó en un comentario en la tarea #%d', 'You were mentioned in the task #%d' => 'Fuiste mencionado en la tarea #%d', 'You were mentioned in a comment on the task #%d' => 'Fuiste mencionado en un comentario de la tarea #%d', - 'Mentioned' => 'Mencionado', - 'Compare Estimated Time vs Actual Time' => 'Comparar tiempo estimado vs tiempo actual', 'Estimated hours: ' => 'Horas estimadas: ', 'Actual hours: ' => 'Horas actuales: ', 'Hours Spent' => 'Horas gastadas', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php index 6fe4852c..ed38fb56 100644 --- a/app/Locale/fi_FI/translations.php +++ b/app/Locale/fi_FI/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Näytä toinen projekti', 'Created by %s' => 'Luonut: %s', 'Tasks Export' => 'Tehtävien vienti', - 'Tasks exportation for "%s"' => 'Tehtävien vienti projektilta "%s"', 'Start Date' => 'Aloituspäivä', 'End Date' => 'Lopetuspäivä', 'Execute' => 'Suorita', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Uusi alitehtävä', 'New attachment added "%s"' => 'Uusi liite lisätty "%s"', 'New comment posted by %s' => '%s lisäsi uuden kommentin', - // 'New attachment' => '', // 'New comment' => '', 'Comment updated' => 'Kommentti päivitetty', // 'New subtask' => '', - // 'Subtask updated' => '', - // 'Task updated' => '', - // 'Task closed' => '', - // 'Task opened' => '', 'I want to receive notifications only for those projects:' => 'Haluan vastaanottaa ilmoituksia ainoastaan näistä projekteista:', 'view the task on Kanboard' => 'katso tehtävää Kanboardissa', 'Public access' => 'Julkinen käyttöoikeus', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s päivitti tehtävää #%d', '%s created the task #%d' => '%s loi tehtävän #%d', '%s closed the task #%d' => '%s sulki tehtävän #%d', - '%s open the task #%d' => '%s avasi tehtävän #%d', - '%s moved the task #%d to the column "%s"' => '%s siirsi tehtävän #%d sarakkeeseen "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s siirsi tehtävän #%d %d. sarakkeessa %s', + '%s opened the task #%d' => '%s avasi tehtävän #%d', 'Activity' => 'Toiminta', 'Default values are "%s"' => 'Oletusarvot ovat "%s"', 'Default columns for new projects (Comma-separated)' => 'Oletussarakkeet uusille projekteille', 'Task assignee change' => 'Tehtävän saajan vaihto', - '%s change the assignee of the task #%d to %s' => '%s vaihtoi tehtävän #%d saajaksi %s', + '%s changed the assignee of the task #%d to %s' => '%s vaihtoi tehtävän #%d saajaksi %s', '%s changed the assignee of the task %s to %s' => '%s vaihtoi tehtävän %s saajaksi %s', 'New password for the user "%s"' => 'Uusi salasana käyttäjälle "%s"', 'Choose an event' => 'Valitse toiminta', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Prosentti', 'Number of tasks' => 'Tehtävien määrä', 'Task distribution' => 'Tehtävien jakauma', - 'Reportings' => 'Raportoinnit', - // 'Task repartition for "%s"' => '', 'Analytics' => 'Analytiikka', 'Subtask' => 'Alitehtävä', 'My subtasks' => 'Minun alitehtäväni', // 'User repartition' => '', - // 'User repartition for "%s"' => '', 'Clone this project' => 'Kahdenna projekti', 'Column removed successfully.' => 'Sarake poistettu onnstuneesti.', 'Not enough data to show the graph.' => 'Ei riittävästi dataa graafin näyttämiseksi.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Tämän arvon tulee olla numeerinen', 'Unable to create this task.' => 'Tehtävän luonti epäonnistui', 'Cumulative flow diagram' => 'Kumulatiivinen vuokaavio', - 'Cumulative flow diagram for "%s"' => 'Kumulatiivinen vuokaavio kohteelle "%s"', 'Daily project summary' => 'Päivittäinen yhteenveto', 'Daily project summary export' => 'Päivittäisen yhteenvedon vienti', - 'Daily project summary export for "%s"' => 'Päivittäisen yhteenvedon vienti kohteeseen "%s"', 'Exports' => 'Viennit', 'This export contains the number of tasks per column grouped per day.' => 'Tämä tiedosto sisältää tehtäviä sarakkeisiin päiväkohtaisesti ryhmilteltyinä', 'Active swimlanes' => 'Aktiiviset kaistat', @@ -494,7 +481,6 @@ return array( // 'Subtask Id' => '', // 'Subtasks' => '', // 'Subtasks Export' => '', - // 'Subtasks exportation for "%s"' => '', // 'Task Title' => '', // 'Untitled' => '', // 'Application default' => '', @@ -601,7 +587,7 @@ return array( // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', // 'Webhook URL' => '', - // '%s remove the assignee of the task %s' => '', + // '%s removed the assignee of the task %s' => '', // 'Enable Gravatar images' => '', // 'Information' => '', // 'Check two factor authentication code' => '', @@ -615,7 +601,6 @@ return array( // 'Test your device' => '', // 'Assign a color when the task is moved to a specific column' => '', // '%s via Kanboard' => '', - // 'Burndown chart for "%s"' => '', // 'Burndown chart' => '', // 'This chart show the task complexity over the time (Work Remaining).' => '', // 'Screenshot taken %s' => '', @@ -680,14 +665,8 @@ return array( // 'Move the task to another column when the category is changed' => '', // 'Send a task by email to someone' => '', // 'Reopen a task' => '', - // 'Column change' => '', - // 'Position change' => '', - // 'Swimlane change' => '', - // 'Assignee change' => '', - // '[%s] Overdue tasks' => '', // 'Notification' => '', // '%s moved the task #%d to the first swimlane' => '', - // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', // 'Gravatar' => '', // '%s moved the task %s to the first swimlane' => '', @@ -758,8 +737,6 @@ return array( // 'Search by category: ' => '', // 'Search by description: ' => '', // 'Search by due date: ' => '', - // 'Lead and Cycle time for "%s"' => '', - // 'Average time spent into each column for "%s"' => '', // 'Average time spent into each column' => '', // 'Average time spent' => '', // 'This chart show the average time spent into each column for the last %d tasks.' => '', @@ -800,7 +777,6 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Gantt chart for %s' => '', // 'Sort by position' => '', // 'Sort by date' => '', // 'Add task' => '', @@ -841,8 +817,6 @@ return array( // 'Version' => '', // 'Plugins' => '', // 'There is no plugin loaded.' => '', - // 'Set maximum column height' => '', - // 'Remove maximum column height' => '', // 'My notifications' => '', // 'Custom filters' => '', // 'Your custom filter have been created successfully.' => '', @@ -947,7 +921,6 @@ return array( // 'Invalid captcha' => '', // 'The name must be unique' => '', // 'View all groups' => '', - // 'View group members' => '', // 'There is no user available.' => '', // 'Do you really want to remove the user "%s" from the group "%s"?' => '', // 'There is no group.' => '', @@ -968,13 +941,10 @@ return array( // 'Enter group name...' => '', // 'Role:' => '', // 'Project members' => '', - // 'Compare hours for "%s"' => '', // '%s mentioned you in the task #%d' => '', // '%s mentioned you in a comment on the task #%d' => '', // 'You were mentioned in the task #%d' => '', // 'You were mentioned in a comment on the task #%d' => '', - // 'Mentioned' => '', - // 'Compare Estimated Time vs Actual Time' => '', // 'Estimated hours: ' => '', // 'Actual hours: ' => '', // 'Hours Spent' => '', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/fr_FR/translations.php b/app/Locale/fr_FR/translations.php index 7663da0f..e7184949 100644 --- a/app/Locale/fr_FR/translations.php +++ b/app/Locale/fr_FR/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Afficher un autre projet', 'Created by %s' => 'Créé par %s', 'Tasks Export' => 'Exportation des tâches', - 'Tasks exportation for "%s"' => 'Exportation des tâches pour « %s »', 'Start Date' => 'Date de début', 'End Date' => 'Date de fin', 'Execute' => 'Exécuter', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Nouvelle sous-tâche', 'New attachment added "%s"' => 'Nouvelle pièce-jointe ajoutée « %s »', 'New comment posted by %s' => 'Nouveau commentaire ajouté par « %s »', - 'New attachment' => 'Nouveau document', 'New comment' => 'Nouveau commentaire', 'Comment updated' => 'Commentaire mis à jour', 'New subtask' => 'Nouvelle sous-tâche', - 'Subtask updated' => 'Sous-tâche mise à jour', - 'Task updated' => 'Tâche mise à jour', - 'Task closed' => 'Tâche fermée', - 'Task opened' => 'Tâche ouverte', 'I want to receive notifications only for those projects:' => 'Je souhaite reçevoir les notifications uniquement pour les projets sélectionnés :', 'view the task on Kanboard' => 'voir la tâche sur Kanboard', 'Public access' => 'Accès public', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s a mis à jour la tâche n°%d', '%s created the task #%d' => '%s a créé la tâche n°%d', '%s closed the task #%d' => '%s a fermé la tâche n°%d', - '%s open the task #%d' => '%s a ouvert la tâche n°%d', - '%s moved the task #%d to the column "%s"' => '%s a déplacé la tâche n°%d dans la colonne « %s »', - '%s moved the task #%d to the position %d in the column "%s"' => '%s a déplacé la tâche n°%d à la position n°%d dans la colonne « %s »', + '%s opened the task #%d' => '%s a ouvert la tâche n°%d', 'Activity' => 'Activité', 'Default values are "%s"' => 'Les valeurs par défaut sont « %s »', 'Default columns for new projects (Comma-separated)' => 'Colonnes par défaut pour les nouveaux projets (séparation par des virgules)', 'Task assignee change' => 'Modification de la personne assignée à une tâche', - '%s change the assignee of the task #%d to %s' => '%s a changé la personne assignée à la tâche n˚%d pour %s', + '%s changed the assignee of the task #%d to %s' => '%s a changé la personne assignée à la tâche n˚%d pour %s', '%s changed the assignee of the task %s to %s' => '%s a changé la personne assignée à la tâche %s pour %s', 'New password for the user "%s"' => 'Nouveau mot de passe pour l\'utilisateur « %s »', 'Choose an event' => 'Choisir un événement', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Pourcentage', 'Number of tasks' => 'Nombre de tâches', 'Task distribution' => 'Répartition des tâches', - 'Reportings' => 'Rapports', - 'Task repartition for "%s"' => 'Répartition des tâches pour « %s »', 'Analytics' => 'Analytique', 'Subtask' => 'Sous-tâche', 'My subtasks' => 'Mes sous-tâches', 'User repartition' => 'Répartition des utilisateurs', - 'User repartition for "%s"' => 'Répartition des utilisateurs pour « %s »', 'Clone this project' => 'Cloner ce projet', 'Column removed successfully.' => 'Colonne supprimée avec succès.', 'Not enough data to show the graph.' => 'Pas assez de données pour afficher le graphique.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Cette valeur doit être numérique', 'Unable to create this task.' => 'Impossible de créer cette tâche', 'Cumulative flow diagram' => 'Diagramme de flux cumulé', - 'Cumulative flow diagram for "%s"' => 'Diagramme de flux cumulé pour « %s »', 'Daily project summary' => 'Résumé journalier du projet', 'Daily project summary export' => 'Export du résumé journalier du projet', - 'Daily project summary export for "%s"' => 'Export du résumé quotidien du projet pour « %s »', 'Exports' => 'Exports', 'This export contains the number of tasks per column grouped per day.' => 'Cet export contient le nombre de tâches par colonne groupé par jour.', 'Active swimlanes' => 'Swimlanes actives', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Identifiant de la sous-tâche', 'Subtasks' => 'Sous-tâches', 'Subtasks Export' => 'Exportation des sous-tâches', - 'Subtasks exportation for "%s"' => 'Exportation des sous-tâches pour le projet « %s »', 'Task Title' => 'Titre de la tâche', 'Untitled' => 'Sans nom', 'Application default' => 'Valeur par défaut de l\'application', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Le taux de change a été ajouté avec succès.', 'Unable to add this currency rate.' => 'Impossible d\'ajouter ce taux de change', 'Webhook URL' => 'URL du webhook', - '%s remove the assignee of the task %s' => '%s a enlevé la personne assignée à la tâche %s', + '%s removed the assignee of the task %s' => '%s a enlevé la personne assignée à la tâche %s', 'Enable Gravatar images' => 'Activer les images Gravatar', 'Information' => 'Informations', 'Check two factor authentication code' => 'Vérification du code pour l\'authentification à deux-facteurs', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Testez votre appareil', 'Assign a color when the task is moved to a specific column' => 'Assigner une couleur lorsque la tâche est déplacée dans une colonne spécifique', '%s via Kanboard' => '%s via Kanboard', - 'Burndown chart for "%s"' => 'Graphique d\'avancement pour « %s »', 'Burndown chart' => 'Graphique d\'avancement', 'This chart show the task complexity over the time (Work Remaining).' => 'Ce graphique représente la complexité des tâches en fonction du temps (travail restant).', 'Screenshot taken %s' => 'Capture d\'écran prise le %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Déplacer une tâche vers une autre colonne lorsque la catégorie a changé', 'Send a task by email to someone' => 'Envoyer une tâche par email à quelqu\'un', 'Reopen a task' => 'Rouvrir une tâche', - 'Column change' => 'Changement de colonne', - 'Position change' => 'Changement de position', - 'Swimlane change' => 'Changement de swimlane', - 'Assignee change' => 'Changement d\'assigné', - '[%s] Overdue tasks' => '[%s] Tâches en retard', 'Notification' => 'Notification', '%s moved the task #%d to the first swimlane' => '%s a déplacé la tâche n°%d dans la première swimlane', - '%s moved the task #%d to the swimlane "%s"' => '%s a déplacé la tâche n°%d dans la swimlane « %s »', 'Swimlane' => 'Swimlane', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s a déplacé la tâche %s dans la première swimlane', @@ -759,8 +738,6 @@ return array( 'Search by category: ' => 'Rechercher par catégorie : ', 'Search by description: ' => 'Rechercher par description : ', 'Search by due date: ' => 'Rechercher par date d\'échéance : ', - 'Lead and Cycle time for "%s"' => 'Lead et cycle time pour « %s »', - 'Average time spent into each column for "%s"' => 'Temps passé moyen dans chaque colonne pour « %s »', 'Average time spent into each column' => 'Temps moyen passé dans chaque colonne', 'Average time spent' => 'Temps moyen passé', 'This chart show the average time spent into each column for the last %d tasks.' => 'Ce graphique montre le temps passé moyen dans chaque colonne pour les %d dernières tâches.', @@ -801,7 +778,6 @@ return array( 'License:' => 'Licence :', 'License' => 'Licence', 'Enter the text below' => 'Entrez le texte ci-dessous', - 'Gantt chart for %s' => 'Diagramme de Gantt pour %s', 'Sort by position' => 'Trier par position', 'Sort by date' => 'Trier par date', 'Add task' => 'Ajouter une tâche', @@ -842,8 +818,6 @@ return array( 'Version' => 'Version', 'Plugins' => 'Extensions', 'There is no plugin loaded.' => 'Il n\'y a aucune extension chargée.', - 'Set maximum column height' => 'Définir la hauteur max. des colonnes', - 'Remove maximum column height' => 'Enlever la hauteur max. des colonnes', 'My notifications' => 'Mes notifications', 'Custom filters' => 'Filtres personalisés', 'Your custom filter have been created successfully.' => 'Votre filter personalisé a été créé avec succès.', @@ -948,7 +922,6 @@ return array( 'Invalid captcha' => 'Captcha invalid', 'The name must be unique' => 'Le nom doit être unique', 'View all groups' => 'Voir tous les groupes', - 'View group members' => 'Voir les membres du groupe', 'There is no user available.' => 'Il n\'y a aucun utilisateur disponible', 'Do you really want to remove the user "%s" from the group "%s"?' => 'Voulez-vous vraiment supprimer l\'utilisateur « %s » du groupe « %s » ?', 'There is no group.' => 'Il n\'y a aucun groupe.', @@ -969,13 +942,10 @@ return array( 'Enter group name...' => 'Entrez le nom du groupe...', 'Role:' => 'Rôle :', 'Project members' => 'Membres du projet', - 'Compare hours for "%s"' => 'Comparer les heures pour « %s »', '%s mentioned you in the task #%d' => '%s vous a mentionné dans la tâche n°%d', '%s mentioned you in a comment on the task #%d' => '%s vous a mentionné dans un commentaire de la tâche n°%d', 'You were mentioned in the task #%d' => 'Vous avez été mentionné dans la tâche n°%d', 'You were mentioned in a comment on the task #%d' => 'Vous avez été mentionné dans un commentaire de la tâche n°%d', - 'Mentioned' => 'Mentionné', - 'Compare Estimated Time vs Actual Time' => 'Comparer le temps estimé et le temps actuel', 'Estimated hours: ' => 'Heures estimées : ', 'Actual hours: ' => 'Heures actuelles : ', 'Hours Spent' => 'Heures passées', @@ -1217,5 +1187,32 @@ return array( 'Global tags' => 'Libellés globaux', 'There is no global tag at the moment.' => 'Il n\'y a aucun libellé global pour le moment.', 'This field cannot be empty' => 'Ce champ ne peut être vide', - // 'Hide tasks in this column in the dashboard' => '', + 'Close a task when there is no activity in an specific column' => 'Fermer une tâche lorsqu\'il n\'y a aucune activité dans une colonne spécifique', + '%s removed a subtask for the task #%d' => '%s a supprimé une sous-tâche de la tâche n°%d', + '%s removed a comment on the task #%d' => '%s a supprimé un commentaire de la tâche n°%d', + 'Comment removed on task #%d' => 'Commentaire supprimé sur la tâche n°%d', + 'Subtask removed on task #%d' => 'Sous-tâche supprimée sur la tâche n°%d', + 'Hide tasks in this column in the dashboard' => 'Cacher les tâches de cette colonne dans le tableau de bord', + '%s removed a comment on the task %s' => '%s a supprimé un commentaire de la tâche %s', + '%s removed a subtask for the task %s' => '%s a supprimé une sous-tâche de la tâche %s', + 'Comment removed' => 'Commentaire supprimé', + 'Subtask removed' => 'Sous-tâche supprimée', + '%s set a new internal link for the task #%d' => '%s a défini un nouveau lien interne pour la tâche n°%d', + '%s removed an internal link for the task #%d' => '%s a supprimé un lien interne pour la tâche n°%d', + 'A new internal link for the task #%d have been defined' => 'Un nouveau lien interne pour la tâche n°%d a été défini', + 'Internal link removed for the task #%d' => 'Lien interne supprimé pour la tâche n°%d', + '%s set a new internal link for the task %s' => '%s a défini un nouveau lien interne pour la tâche %s', + '%s removed an internal link for the task %s' => '%s a supprimé un lien interne pour la tâche %s', + 'Automatically set the due date on task creation' => 'Définir automatiquement la date d\'échéance lors de la création de la tâche', + 'Move the task to another column when closed' => 'Déplacer la tâche vers une autre colonne lorsque celle-ci est fermée', + 'Move the task to another column when not moved during a given period' => 'Déplacer la tâche vers une autre colonne lorsque celle-ci n\'a pas été bougée pendant une certaine période', + 'Dashboard for %s' => 'Tableau de bord pour %s', + 'Tasks overview for %s' => 'Aperçu des tâches pour %s', + 'Subtasks overview for %s' => 'Aperçu des sous-tâches pour %s', + 'Projects overview for %s' => 'Aperçu des projets pour %s', + 'Activity stream for %s' => 'Flux d\'activité pour %s', + 'Calendar for %s' => 'Calendrier pour %s', + 'Notifications for %s' => 'Notifications pour %s', + 'Subtasks export' => 'Export des sous-tâches', + 'Tasks exportation' => 'Export des tâches', ); diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php index 96db72ef..32e34857 100644 --- a/app/Locale/hu_HU/translations.php +++ b/app/Locale/hu_HU/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Másik projekt megjelenítése', 'Created by %s' => 'Készítette: %s', 'Tasks Export' => 'Feladatok exportálása', - 'Tasks exportation for "%s"' => 'Feladatok exportálása: "%s"', 'Start Date' => 'Kezdés dátuma', 'End Date' => 'Befejezés dátuma', 'Execute' => 'Végrehajt', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Új részfeladat', 'New attachment added "%s"' => 'Új melléklet "%s" hozzáadva.', 'New comment posted by %s' => 'Új megjegyzés %s', - 'New attachment' => 'Új melléklet', 'New comment' => 'Új megjegyzés', 'Comment updated' => 'Megjegyzés frissítve', 'New subtask' => 'Új részfeladat', - 'Subtask updated' => 'Részfeladat frissítve', - 'Task updated' => 'Feladat frissítve', - 'Task closed' => 'Feladat lezárva', - 'Task opened' => 'Feladat megnyitva', 'I want to receive notifications only for those projects:' => 'Csak ezekről a projektekről kérek értesítést:', 'view the task on Kanboard' => 'feladat megtekintése a Kanboardon', 'Public access' => 'Nyilvános hozzáférés', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s frissítette a feladatot #%d', '%s created the task #%d' => '%s létrehozta a feladatot #%d', '%s closed the task #%d' => '%s lezárta a feladatot #%d', - '%s open the task #%d' => '%s megnyitotta a feladatot #%d', - '%s moved the task #%d to the column "%s"' => '%s átmozgatta a feladatot #%d a "%s" oszlopba', - '%s moved the task #%d to the position %d in the column "%s"' => '%s átmozgatta a feladatot #%d a %d pozícióba a "%s" oszlopban', + '%s opened the task #%d' => '%s megnyitotta a feladatot #%d', 'Activity' => 'Tevékenységek', 'Default values are "%s"' => 'Az alapértelmezett értékek: %s', 'Default columns for new projects (Comma-separated)' => 'Alapértelmezett oszlopok az új projektekben (vesszővel elválasztva)', 'Task assignee change' => 'Felelős módosítása', - '%s change the assignee of the task #%d to %s' => '%s a felelőst módosította #%d %s', + '%s changed the assignee of the task #%d to %s' => '%s a felelőst módosította #%d %s', '%s changed the assignee of the task %s to %s' => '%s a felelőst %s módosította: %s', 'New password for the user "%s"' => 'Felhasználó új jelszava: %s', 'Choose an event' => 'Válasszon eseményt', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Százalék', 'Number of tasks' => 'A feladatok száma', 'Task distribution' => 'Feladatelosztás', - 'Reportings' => 'Jelentések', - 'Task repartition for "%s"' => 'Feladat újraosztása: %s', 'Analytics' => 'Analitika', 'Subtask' => 'Részfeladat', 'My subtasks' => 'Részfeladataim', 'User repartition' => 'Felhasználó újrafelosztás', - 'User repartition for "%s"' => 'Felhasználó újrafelosztás: %s', 'Clone this project' => 'Projekt másolása', 'Column removed successfully.' => 'Oszlop sikeresen törölve.', 'Not enough data to show the graph.' => 'Nincs elég adat a grafikonhoz.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Ez a mező csak szám lehet', 'Unable to create this task.' => 'A feladat nem hozható létre,', 'Cumulative flow diagram' => 'Kumulatív folyamatábra', - 'Cumulative flow diagram for "%s"' => 'Kumulatív folyamatábra: %s', 'Daily project summary' => 'Napi projektösszefoglaló', 'Daily project summary export' => 'Napi projektösszefoglaló exportálása', - 'Daily project summary export for "%s"' => 'Napi projektösszefoglaló exportálása: %s', 'Exports' => 'Exportálások', 'This export contains the number of tasks per column grouped per day.' => 'Ez az export tartalmazza a feladatok számát oszloponként összesítve, napokra lebontva.', 'Active swimlanes' => 'Aktív sávok', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Részfeladat id', 'Subtasks' => 'Részfeladatok', 'Subtasks Export' => 'Részfeladat exportálás', - 'Subtasks exportation for "%s"' => 'Részfeladatok exportálása: %s', 'Task Title' => 'Feladat címe', 'Untitled' => 'Névtelen', 'Application default' => 'Alkalmazás alapértelmezett', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Az átváltási árfolyammal történő bővítés sikerült', 'Unable to add this currency rate.' => 'Nem sikerült az átváltási árfolyam felvétele', 'Webhook URL' => 'Webhook URL', - '%s remove the assignee of the task %s' => '%s eltávolította a %s feladathoz rendelt személyt', + '%s removed the assignee of the task %s' => '%s eltávolította a %s feladathoz rendelt személyt', 'Enable Gravatar images' => 'Gravatár képek engedélyezése', 'Information' => 'Információ', 'Check two factor authentication code' => 'Két fázisú beléptető kód ellenőrzése', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Az eszköz ellenőrzése', 'Assign a color when the task is moved to a specific column' => 'Szín hozzárendelése, ha a feladatot egy adott oszlopba mozgatták', '%s via Kanboard' => '%s a Kanboard-on keresztül', - // 'Burndown chart for "%s"' => '', // 'Burndown chart' => '', 'This chart show the task complexity over the time (Work Remaining).' => 'Ez a diagram a feladat időbeli bonyolultságát ábrázolja (mennyi munka van hátra)', 'Screenshot taken %s' => 'A képernyőmentés megtörtént, %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'A feladat átmozgatása egy másik oszlopba, ha megváltozik a kategória', 'Send a task by email to someone' => 'Email-en egy feladat küldése valakinek', 'Reopen a task' => 'Egy feladat újbóli megnyitása', - 'Column change' => 'Oszlop módosítás', - 'Position change' => 'Helyzet módosítás', - 'Swimlane change' => 'Sáv módosítás', - 'Assignee change' => 'Felelős módosítása', - '[%s] Overdue tasks' => '[%s] késésben lévő feladat', 'Notification' => 'Értesítés', '%s moved the task #%d to the first swimlane' => '%s a #%d feladatot az első sávba mozgatta', - '%s moved the task #%d to the swimlane "%s"' => '%s a #%d feladatot a "%s" sávba mozgatta', 'Swimlane' => 'Sáv', 'Gravatar' => 'Gravatár', '%s moved the task %s to the first swimlane' => '%s a %s feladatot az első sávba mozgatta', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Keresés kategória alapján: ', 'Search by description: ' => 'Keresés leírás alapján: ', 'Search by due date: ' => 'Keresés határidő alapján: ', - 'Lead and Cycle time for "%s"' => 'A "%s" átfutási ideje és ciklusideje', - 'Average time spent into each column for "%s"' => 'A "%s" során az egyes oszlopokban töltött átlagos idő', 'Average time spent into each column' => 'Az egyes oszlopokban töltött átlagos idő', 'Average time spent' => 'Az eltöltött átlagos idő', 'This chart show the average time spent into each column for the last %d tasks.' => 'Ez az ábra az utolsó %d feladatra vonatkozóan mutatja az egyes oszlopkban eltöltött átlagos időt.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Engedély:', 'License' => 'Engedély', 'Enter the text below' => 'Adja be a lenti szöveget', - 'Gantt chart for %s' => 'Gantt diagram a %s számára', 'Sort by position' => 'Rendezés hely szerint', 'Sort by date' => 'Rendezés idő szerint', 'Add task' => 'Feladat hozzáadása', @@ -841,8 +817,6 @@ return array( 'Version' => 'Verzió', 'Plugins' => 'Plugin-ek', 'There is no plugin loaded.' => 'Nincs betöltött plugin.', - 'Set maximum column height' => 'Max. oszlopmagasság beállítása', - 'Remove maximum column height' => 'Max. oszlopmagasság törlése', 'My notifications' => 'Emlékeztetőim', 'Custom filters' => 'Egyedi szűrők', 'Your custom filter have been created successfully.' => 'Az ön egyedi szűrője sikeresen létrejött.', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'Érvénytelen captcha', 'The name must be unique' => 'A névnek egyedinek kell lennie', 'View all groups' => 'Az összes csoport megtekintése', - 'View group members' => 'A csoporttagok megtekintése', 'There is no user available.' => 'Nincs ilyen felhasználó.', 'Do you really want to remove the user "%s" from the group "%s"?' => 'Valóban el kívánja távolítani a "%s" felhasználót a "%s" csoportból?', 'There is no group.' => 'Nincs ilyen csoport.', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Adja meg a csoport nevét...', 'Role:' => 'Szerepkör:', 'Project members' => 'Projekt tagok', - 'Compare hours for "%s"' => 'Az órák összehasonlítása "%s" számára', '%s mentioned you in the task #%d' => '%s megemlítette önt a #%d feladatban', '%s mentioned you in a comment on the task #%d' => '%s megemlítette önt a #%d feladathoz fűzött megjegyzésben', 'You were mentioned in the task #%d' => 'Ön meg lett említve a #%d feladatban', 'You were mentioned in a comment on the task #%d' => 'Ön meg lett említve a #%d feladathoz fűzött megjegyzésben', - 'Mentioned' => 'Meg lett említve', - 'Compare Estimated Time vs Actual Time' => 'A becsült és a tényleges idő összehasonlítása', 'Estimated hours: ' => 'Becsült órák: ', 'Actual hours: ' => 'Tényleges órák: ', 'Hours Spent' => 'Ráfordítás órákban', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/id_ID/translations.php b/app/Locale/id_ID/translations.php index 2d6e5aa3..28f590a9 100644 --- a/app/Locale/id_ID/translations.php +++ b/app/Locale/id_ID/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Lihat proyek lain', 'Created by %s' => 'Dibuat oleh %s', 'Tasks Export' => 'Ekspor Tugas', - 'Tasks exportation for "%s"' => 'Tugas di ekspor untuk « %s »', 'Start Date' => 'Tanggal Mulai', 'End Date' => 'Tanggal Berakhir', 'Execute' => 'Eksekusi', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Sub-tugas baru', 'New attachment added "%s"' => 'Lampiran baru ditambahkan « %s »', 'New comment posted by %s' => 'Komentar baru ditambahkan oleh « %s »', - 'New attachment' => 'Lampirkan baru', 'New comment' => 'Komentar baru', 'Comment updated' => 'Komentar diperbaharui', 'New subtask' => 'Sub-tugas baru', - 'Subtask updated' => 'Sub-tugas diperbaharui', - 'Task updated' => 'Tugas diperbaharui', - 'Task closed' => 'Tugas ditutup', - 'Task opened' => 'Tugas dibuka', 'I want to receive notifications only for those projects:' => 'Saya ingin menerima pemberitahuan hanya untuk proyek-proyek yang dipilih :', 'view the task on Kanboard' => 'lihat tugas di Kanboard', 'Public access' => 'Akses publik', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s memperbaharui tugas n°%d', '%s created the task #%d' => '%s membuat tugas n°%d', '%s closed the task #%d' => '%s menutup tugas n°%d', - '%s open the task #%d' => '%s membuka tugas n°%d', - '%s moved the task #%d to the column "%s"' => '%s memindahkan tugas n°%d ke kolom « %s »', - '%s moved the task #%d to the position %d in the column "%s"' => '%s memindahkan tugas n°%d ke posisi n°%d dalam kolom « %s »', + '%s opened the task #%d' => '%s membuka tugas n°%d', 'Activity' => 'Aktifitas', 'Default values are "%s"' => 'Standar nilai adalah« %s »', 'Default columns for new projects (Comma-separated)' => 'Kolom default untuk proyek baru (dipisahkan dengan koma)', 'Task assignee change' => 'Mengubah orang ditugaskan untuk tugas', - '%s change the assignee of the task #%d to %s' => '%s rubah orang yang ditugaskan dari tugas n%d ke %s', + '%s changed the assignee of the task #%d to %s' => '%s rubah orang yang ditugaskan dari tugas n%d ke %s', '%s changed the assignee of the task %s to %s' => '%s mengubah orang yang ditugaskan dari tugas %s ke %s', 'New password for the user "%s"' => 'Kata sandi baru untuk pengguna « %s »', 'Choose an event' => 'Pilih acara', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Persentasi', 'Number of tasks' => 'Jumlah dari tugas', 'Task distribution' => 'Pembagian tugas', - 'Reportings' => 'Pelaporan', - 'Task repartition for "%s"' => 'Pembagian tugas untuk « %s »', 'Analytics' => 'Analitis', 'Subtask' => 'Subtugas', 'My subtasks' => 'Subtugas saya', 'User repartition' => 'Partisi ulang pengguna', - 'User repartition for "%s"' => 'Partisi ulang pengguna untuk « %s »', 'Clone this project' => 'Gandakan proyek ini', 'Column removed successfully.' => 'Kolom berhasil dihapus.', 'Not enough data to show the graph.' => 'Tidak cukup data untuk menampilkan grafik.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Nilai ini harus angka', 'Unable to create this task.' => 'Tidak dapat membuat tugas ini', 'Cumulative flow diagram' => 'Diagram alir kumulatif', - 'Cumulative flow diagram for "%s"' => 'Diagram alir kumulatif untuk « %s »', 'Daily project summary' => 'Ringkasan proyek harian', 'Daily project summary export' => 'Ekspor ringkasan proyek harian', - 'Daily project summary export for "%s"' => 'Ekspor ringkasan proyek harian untuk « %s »', 'Exports' => 'Ekspor', 'This export contains the number of tasks per column grouped per day.' => 'Ekspor ini berisi jumlah dari tugas per kolom dikelompokan perhari.', 'Active swimlanes' => 'Swimlanes aktif', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Id Subtugas', 'Subtasks' => 'Subtugas', 'Subtasks Export' => 'Ekspor Subtugas', - 'Subtasks exportation for "%s"' => 'Ekspor subtugas untuk « %s »', 'Task Title' => 'Judul Tugas', 'Untitled' => 'Tanpa nama', 'Application default' => 'Aplikasi standar', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Nilai tukar mata uang berhasil ditambahkan.', 'Unable to add this currency rate.' => 'Tidak dapat menambahkan nilai tukar mata uang', 'Webhook URL' => 'URL webhook', - '%s remove the assignee of the task %s' => '%s menghapus penugasan dari tugas %s', + '%s removed the assignee of the task %s' => '%s menghapus penugasan dari tugas %s', 'Enable Gravatar images' => 'Mengaktifkan gambar Gravatar', 'Information' => 'Informasi', 'Check two factor authentication code' => 'Cek dua faktor kode otentifikasi', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Menguji perangkat anda', 'Assign a color when the task is moved to a specific column' => 'Menetapkan warna ketika tugas tersebut dipindahkan ke kolom tertentu', '%s via Kanboard' => '%s via Kanboard', - 'Burndown chart for "%s"' => 'Grafik Burndown untku « %s »', 'Burndown chart' => 'Grafik Burndown', 'This chart show the task complexity over the time (Work Remaining).' => 'Grafik ini menunjukkan kompleksitas tugas dari waktu ke waktu (Sisa Pekerjaan).', 'Screenshot taken %s' => 'Screenshot diambil %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Pindahkan tugas ke kolom lain ketika kategori berubah', 'Send a task by email to someone' => 'Kirim tugas melalui email ke seseorang', 'Reopen a task' => 'Membuka kembali tugas', - 'Column change' => 'Kolom berubah', - 'Position change' => 'Posisi berubah', - 'Swimlane change' => 'Swimlane berubah', - 'Assignee change' => 'Penerima berubah', - '[%s] Overdue tasks' => '[%s] Tugas terlambat', 'Notification' => 'Pemberitahuan', '%s moved the task #%d to the first swimlane' => '%s memindahkan tugas n°%d ke swimlane pertama', - '%s moved the task #%d to the swimlane "%s"' => '%s memindahkan tugas n°%d ke swimlane « %s »', 'Swimlane' => 'Swimlane', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s memindahkan tugas %s ke swimlane pertama', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Pencarian berdasarkan kategori : ', 'Search by description: ' => 'Pencarian berdasarkan deskripsi : ', 'Search by due date: ' => 'Pencarian berdasarkan tanggal jatuh tempo : ', - 'Lead and Cycle time for "%s"' => 'Memimpin dan Siklus waktu untuk « %s »', - 'Average time spent into each column for "%s"' => 'Rata-rata waktu yang dihabiskan dalam setiap kolom untuk « %s »', 'Average time spent into each column' => 'Rata-rata waktu yang dihabiskan dalam setiap kolom', 'Average time spent' => 'Rata-rata waktu yang dihabiskan', 'This chart show the average time spent into each column for the last %d tasks.' => 'Grafik ini menunjukkan rata-rata waktu yang dihabiskan dalam setiap kolom untuk %d tugas.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Lisensi :', 'License' => 'Lisensi', 'Enter the text below' => 'Masukkan teks di bawah', - 'Gantt chart for %s' => 'Grafik Gantt untuk %s', 'Sort by position' => 'Urutkan berdasarkan posisi', 'Sort by date' => 'Urutkan berdasarkan tanggal', 'Add task' => 'Tambah tugas', @@ -841,8 +817,6 @@ return array( // 'Version' => '', // 'Plugins' => '', // 'There is no plugin loaded.' => '', - // 'Set maximum column height' => '', - // 'Remove maximum column height' => '', // 'My notifications' => '', // 'Custom filters' => '', // 'Your custom filter have been created successfully.' => '', @@ -947,7 +921,6 @@ return array( // 'Invalid captcha' => '', // 'The name must be unique' => '', // 'View all groups' => '', - // 'View group members' => '', // 'There is no user available.' => '', // 'Do you really want to remove the user "%s" from the group "%s"?' => '', // 'There is no group.' => '', @@ -968,13 +941,10 @@ return array( // 'Enter group name...' => '', // 'Role:' => '', 'Project members' => 'Anggota proyek', - // 'Compare hours for "%s"' => '', // '%s mentioned you in the task #%d' => '', // '%s mentioned you in a comment on the task #%d' => '', // 'You were mentioned in the task #%d' => '', // 'You were mentioned in a comment on the task #%d' => '', - // 'Mentioned' => '', - // 'Compare Estimated Time vs Actual Time' => '', // 'Estimated hours: ' => '', // 'Actual hours: ' => '', // 'Hours Spent' => '', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/it_IT/translations.php b/app/Locale/it_IT/translations.php index e10b61da..b72ca181 100644 --- a/app/Locale/it_IT/translations.php +++ b/app/Locale/it_IT/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Mostra un altro progetto', 'Created by %s' => 'Creato da %s', 'Tasks Export' => 'Export dei task', - 'Tasks exportation for "%s"' => 'Export dei task per "%s"', 'Start Date' => 'Data d\'inizio', 'End Date' => 'Data di fine', 'Execute' => 'Esegui', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Nuovo sotto-task', 'New attachment added "%s"' => 'Nuovo allegato aggiunto "%s"', 'New comment posted by %s' => 'Nuovo commento aggiunto da "%s"', - 'New attachment' => 'Nuovo allegato', 'New comment' => 'Nuovo commento', 'Comment updated' => 'Commento aggiornato', 'New subtask' => 'Nuovo sotto-task', - 'Subtask updated' => 'Sotto-task aggiornato', - 'Task updated' => 'Task aggiornato', - 'Task closed' => 'Task chiuso', - 'Task opened' => 'Task aperto', 'I want to receive notifications only for those projects:' => 'Vorrei ricevere le notifiche solo da questi progetti:', 'view the task on Kanboard' => 'visualizza il task su Kanboard', 'Public access' => 'Accesso pubblico', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s ha aggiornato il task #%d', '%s created the task #%d' => '%s ha creato il task #%d', '%s closed the task #%d' => '%s ha chiuso il task #%d', - '%s open the task #%d' => '%s ha aperto il task #%d', - '%s moved the task #%d to the column "%s"' => '%s ha spostato il task #%d nella colonna "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s ha spostato il task #%d nella posizione %d della colonna "%s"', + '%s opened the task #%d' => '%s ha aperto il task #%d', 'Activity' => 'Attività', 'Default values are "%s"' => 'Valori di default "%s"', 'Default columns for new projects (Comma-separated)' => 'Colonne di default per i nuovi progetti (Separati da virgola)', 'Task assignee change' => 'Cambia l\'assegnatario del task', - '%s change the assignee of the task #%d to %s' => '%s dai l\'assegnazione del task #%d a %s', + '%s changed the assignee of the task #%d to %s' => '%s dai l\'assegnazione del task #%d a %s', '%s changed the assignee of the task %s to %s' => '%s ha cambiato l\'assegnatario del task %s a %s', 'New password for the user "%s"' => 'Nuova password per l\'utente "%s"', 'Choose an event' => 'Scegli un evento', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Percentuale', 'Number of tasks' => 'Numero di task', 'Task distribution' => 'Distribuzione dei task', - 'Reportings' => 'Rapporti', - 'Task repartition for "%s"' => 'Ripartizione task per "%s"', // 'Analytics' => '', 'Subtask' => 'Sotto-task', 'My subtasks' => 'I miei sotto-task', 'User repartition' => 'Ripartizione per utente', - 'User repartition for "%s"' => 'Ripartizione utente per "%s"', 'Clone this project' => 'Clona questo progetto', 'Column removed successfully.' => 'Colonna rimossa con successo', 'Not enough data to show the graph.' => 'Non ci sono abbastanza dati per visualizzare il grafico.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Questo valore deve essere numerico', 'Unable to create this task.' => 'Impossibile creare questo task', 'Cumulative flow diagram' => 'Diagramma di flusso cumulativo', - 'Cumulative flow diagram for "%s"' => 'Diagramma di flusso comulativo per "%s"', 'Daily project summary' => 'Sommario giornaliero del progetto', 'Daily project summary export' => 'Export del sommario giornaliero del progetto', - 'Daily project summary export for "%s"' => 'Export del sommario giornaliero del progetto per "%s"', 'Exports' => 'Esporta', 'This export contains the number of tasks per column grouped per day.' => 'Questo export contiene il numero di task per colonna raggruppati per giorno', 'Active swimlanes' => 'Corsie attive', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Id del sotto-task', 'Subtasks' => 'Sotto-task', 'Subtasks Export' => 'Esporta i sotto-task', - 'Subtasks exportation for "%s"' => 'Export dei sotto-task per "%s"', 'Task Title' => 'Titolo del task', 'Untitled' => 'Senza titolo', 'Application default' => 'Default dell\'applicazione', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Il tasso di cambio è stato aggiunto con successo.', 'Unable to add this currency rate.' => 'Impossibile aggiungere questo tasso di cambio.', 'Webhook URL' => 'URL Webhook', - '%s remove the assignee of the task %s' => '%s rimuove l\'assegnatario del task %s', + '%s removed the assignee of the task %s' => '%s rimuove l\'assegnatario del task %s', 'Enable Gravatar images' => 'Abilita immagini Gravatar', 'Information' => 'Informazioni', 'Check two factor authentication code' => 'Controlla il codice di autenticazione "two-factor"', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Testa il tuo dispositivo', 'Assign a color when the task is moved to a specific column' => 'Assegna un colore quando il task viene spostato in una colonna specifica', '%s via Kanboard' => '%s tramite Kanboard', - 'Burndown chart for "%s"' => 'Grafico Burndown per "%s"', 'Burndown chart' => 'Grafico Burndown', 'This chart show the task complexity over the time (Work Remaining).' => 'Questo grafico mostra la complessità dei task nel tempo (Lavoro residuo).', 'Screenshot taken %s' => 'Schermata catturata %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Sposta il task in un\'altra colonna quando la categoria viene modificata', 'Send a task by email to someone' => 'Invia un task via email a qualcuno', 'Reopen a task' => 'Riapri un task', - 'Column change' => 'Cambio di colonna', - 'Position change' => 'Cambio di posizione', - 'Swimlane change' => 'Cambio di corsia', - 'Assignee change' => 'Cambio assegnatario', - '[%s] Overdue tasks' => '[%s] Task scaduti', 'Notification' => 'Notifica', '%s moved the task #%d to the first swimlane' => '%s ha spostato il task #%d nella prima corsia', - '%s moved the task #%d to the swimlane "%s"' => '%s ha spostato il task #%d nella corsia "%s"', 'Swimlane' => 'Corsia', // 'Gravatar' => '', '%s moved the task %s to the first swimlane' => '%s ha spostato il task %s nella prima corsia', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Ricerca per categoria: ', 'Search by description: ' => 'Ricerca per descrizione: ', 'Search by due date: ' => 'Ricerca per data di scadenza: ', - 'Lead and Cycle time for "%s"' => 'Tempo di consegna (Lead Time) e lavorazione (Cycle Time) per "%s"', - 'Average time spent into each column for "%s"' => 'Tempo medio trascorso in ogni colonna per "%s"', 'Average time spent into each column' => 'Tempo medio trascorso in ogni colonna', 'Average time spent' => 'Tempo medio trascorso', 'This chart show the average time spent into each column for the last %d tasks.' => 'Questo grafico mostra il tempo medio trascorso in ogni colonna per gli ultimi %d task.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Licenza:', 'License' => 'Licenza', 'Enter the text below' => 'Inserisci il testo qui sotto', - 'Gantt chart for %s' => 'Grafico Gantt per %s', 'Sort by position' => 'Ordina per posizione', 'Sort by date' => 'Ordina per data', 'Add task' => 'Aggiungi task', @@ -841,8 +817,6 @@ return array( 'Version' => 'Versione', 'Plugins' => 'Plugin', 'There is no plugin loaded.' => 'Nessun plugin è stato caricato.', - 'Set maximum column height' => 'Imposta l\'altezza massima della colonna', - 'Remove maximum column height' => 'Rimuovi l\'altezza massima della colonna', 'My notifications' => 'Le mie notifiche', 'Custom filters' => 'Filtri personalizzati', 'Your custom filter have been created successfully.' => 'Il filtro personalizzato è stato creato con successo.', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'Captcha non valido', 'The name must be unique' => 'Il nome deve essere univoco', 'View all groups' => 'Visualiza tutti i gruppi', - 'View group members' => 'Visualizza i membri del gruppo', 'There is no user available.' => 'Nessun utente disponibile.', 'Do you really want to remove the user "%s" from the group "%s"?' => 'Vuoi davvero rimuovere l\'utente "%s" dal gruppo "%s"?', 'There is no group.' => 'Nessun gruppo presente', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Inserisci il nome del gruppo...', 'Role:' => 'Ruolo:', 'Project members' => 'Membri di progetto', - 'Compare hours for "%s"' => 'Confronta le ore per "%s"', '%s mentioned you in the task #%d' => '%s ti ha menzionato nel task #%d', '%s mentioned you in a comment on the task #%d' => '%s ti ha menzionato in un commento del task #%d', 'You were mentioned in the task #%d' => 'Sei stato menzionato nel task #%d', 'You were mentioned in a comment on the task #%d' => 'Sei stato menzionato in un commento del task #%d', - 'Mentioned' => 'Menzionato', - 'Compare Estimated Time vs Actual Time' => 'Confronta il Tempo Stimato vs Tempo Effettivo', 'Estimated hours: ' => 'Ore stimate: ', 'Actual hours: ' => 'Ore effettive: ', 'Hours Spent' => 'Ore impiegate', @@ -1216,5 +1186,32 @@ return array( 'Global tags' => 'Tag globali', 'There is no global tag at the moment.' => 'Non sono definiti tag globali al momento.', 'This field cannot be empty' => 'Questo campo non può essere vuoto', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php index 2fe13ac9..d3a11fc8 100644 --- a/app/Locale/ja_JP/translations.php +++ b/app/Locale/ja_JP/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => '別のプロジェクトを表示', 'Created by %s' => '%s が作成', 'Tasks Export' => 'タスクの出力', - 'Tasks exportation for "%s"' => '「%s」のタスク出力', 'Start Date' => '開始日', 'End Date' => '終了日', 'Execute' => '実行', @@ -322,14 +321,9 @@ return array( 'New sub-task' => '新しいサブタスク', 'New attachment added "%s"' => '添付ファイル「%s」が追加されました', 'New comment posted by %s' => '「%s」の新しいコメントが追加されました', - 'New attachment' => '新しい添付ファイル', 'New comment' => '新しいコメント', 'Comment updated' => 'コメントが更新されました', 'New subtask' => '新しいサブタスク', - 'Subtask updated' => 'サブタスクの更新', - 'Task updated' => 'タスクの更新', - 'Task closed' => 'タスクのクローズ', - 'Task opened' => 'タスクのオープン', 'I want to receive notifications only for those projects:' => '以下のプロジェクトにのみ通知を受け取る:', 'view the task on Kanboard' => 'Kanboard でタスクを見る', 'Public access' => '公開アクセス設定', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s がタスク #%d を更新しました', '%s created the task #%d' => '%s がタスク #%d を追加しました', '%s closed the task #%d' => '%s がタスク #%d をクローズしました', - '%s open the task #%d' => '%s がタスク #%d をオープンしました', - '%s moved the task #%d to the column "%s"' => '%s がタスク #%d をカラム「%s」に移動しました', - '%s moved the task #%d to the position %d in the column "%s"' => '%s がタスク #%d を位置 %d カラム「%s」移動しました', + '%s opened the task #%d' => '%s がタスク #%d をオープンしました', 'Activity' => 'アクティビティ', 'Default values are "%s"' => 'デフォルト値は「%s」', 'Default columns for new projects (Comma-separated)' => '新規プロジェクトのデフォルトカラム (コンマで区切って入力)', 'Task assignee change' => '担当者の変更', - '%s change the assignee of the task #%d to %s' => '%s がタスク #%d の担当を %s に変更しました', + '%s changed the assignee of the task #%d to %s' => '%s がタスク #%d の担当を %s に変更しました', '%s changed the assignee of the task %s to %s' => '%s がタスク %s の担当を %s に変更しました', 'New password for the user "%s"' => 'ユーザ「%s」の新しいパスワード', 'Choose an event' => 'イベントの選択', @@ -442,13 +434,10 @@ return array( 'Percentage' => '割合', 'Number of tasks' => 'タスク数', 'Task distribution' => 'タスク分布', - 'Reportings' => 'レポート', - 'Task repartition for "%s"' => '「%s」のタスク分布', 'Analytics' => '分析', 'Subtask' => 'サブタスク', 'My subtasks' => '自分のサブタスク', 'User repartition' => '担当者分布', - 'User repartition for "%s"' => '「%s」の担当者分布', 'Clone this project' => 'このプロジェクトを複製する', 'Column removed successfully.' => 'カラムを削除しました', 'Not enough data to show the graph.' => 'グラフを描画するには出たが足りません', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'この値は数字でなければなりません', 'Unable to create this task.' => 'このタスクを作成できませんでした', 'Cumulative flow diagram' => '蓄積フロー図', - 'Cumulative flow diagram for "%s"' => '「%s」の蓄積フロー図', 'Daily project summary' => '日時プロジェクトサマリー', 'Daily project summary export' => '日時プロジェクトサマリーの出力', - 'Daily project summary export for "%s"' => '「%s」の日時プロジェクトサマリーの出力', 'Exports' => '出力', 'This export contains the number of tasks per column grouped per day.' => 'この出力は日時のカラムごとのタスク数を集計したものです', 'Active swimlanes' => 'アクティブなスイムレーン', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'サブタスク Id', 'Subtasks' => 'サブタスク', 'Subtasks Export' => 'サブタスクの出力', - 'Subtasks exportation for "%s"' => '「%s」のサブタスク出力', 'Task Title' => 'タスクタイトル', 'Untitled' => 'タイトル無し', 'Application default' => 'アプリケーションデフォルト', @@ -601,7 +587,7 @@ return array( // 'The currency rate have been added successfully.' => '', 'Unable to add this currency rate.' => 'この通貨レートを追加できません。', 'Webhook URL' => 'Webhook URL', - '%s remove the assignee of the task %s' => '%s がタスク「%s」の担当を解除しました。', + '%s removed the assignee of the task %s' => '%s がタスク「%s」の担当を解除しました。', 'Enable Gravatar images' => 'Gravatar イメージを有効化', 'Information' => '情報 ', 'Check two factor authentication code' => '2 段認証をチェックする', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'デバイスをテストする', // 'Assign a color when the task is moved to a specific column' => '', // '%s via Kanboard' => '', - // 'Burndown chart for "%s"' => '', // 'Burndown chart' => '', // 'This chart show the task complexity over the time (Work Remaining).' => '', // 'Screenshot taken %s' => '', @@ -680,14 +665,8 @@ return array( // 'Move the task to another column when the category is changed' => '', // 'Send a task by email to someone' => '', // 'Reopen a task' => '', - // 'Column change' => '', - // 'Position change' => '', - // 'Swimlane change' => '', - // 'Assignee change' => '', - // '[%s] Overdue tasks' => '', // 'Notification' => '', // '%s moved the task #%d to the first swimlane' => '', - // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', // 'Gravatar' => '', // '%s moved the task %s to the first swimlane' => '', @@ -758,8 +737,6 @@ return array( // 'Search by category: ' => '', // 'Search by description: ' => '', // 'Search by due date: ' => '', - // 'Lead and Cycle time for "%s"' => '', - // 'Average time spent into each column for "%s"' => '', // 'Average time spent into each column' => '', // 'Average time spent' => '', // 'This chart show the average time spent into each column for the last %d tasks.' => '', @@ -800,7 +777,6 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Gantt chart for %s' => '', // 'Sort by position' => '', // 'Sort by date' => '', // 'Add task' => '', @@ -841,8 +817,6 @@ return array( // 'Version' => '', // 'Plugins' => '', // 'There is no plugin loaded.' => '', - // 'Set maximum column height' => '', - // 'Remove maximum column height' => '', // 'My notifications' => '', // 'Custom filters' => '', // 'Your custom filter have been created successfully.' => '', @@ -947,7 +921,6 @@ return array( // 'Invalid captcha' => '', // 'The name must be unique' => '', // 'View all groups' => '', - // 'View group members' => '', // 'There is no user available.' => '', // 'Do you really want to remove the user "%s" from the group "%s"?' => '', // 'There is no group.' => '', @@ -968,13 +941,10 @@ return array( // 'Enter group name...' => '', // 'Role:' => '', // 'Project members' => '', - // 'Compare hours for "%s"' => '', // '%s mentioned you in the task #%d' => '', // '%s mentioned you in a comment on the task #%d' => '', // 'You were mentioned in the task #%d' => '', // 'You were mentioned in a comment on the task #%d' => '', - // 'Mentioned' => '', - // 'Compare Estimated Time vs Actual Time' => '', // 'Estimated hours: ' => '', // 'Actual hours: ' => '', // 'Hours Spent' => '', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/ko_KR/translations.php b/app/Locale/ko_KR/translations.php index 4f062221..b8ec0c81 100644 --- a/app/Locale/ko_KR/translations.php +++ b/app/Locale/ko_KR/translations.php @@ -154,8 +154,6 @@ return array( '%d closed tasks' => '%d개의 마친 할일', 'No task for this project' => '이 프로젝트에 할일이 없습니다', 'Public link' => '공개 접속 링크', - 'Change assignee' => '담당자 변경', - 'Change assignee for the task "%s"' => '할일 "%s"의 담당자를 변경', 'Timezone' => '시간대', 'Sorry, I didn\'t find this information in my database!' => '데이터베이스에서 정보가 발견되지 않았습니다!', 'Page not found' => '페이지가 발견되지 않는다', @@ -248,7 +246,6 @@ return array( 'Category' => '카테고리', 'Category:' => '카테고리:', 'Categories' => '카테고리', - 'Category not found.' => '카테고리가 발견되지 않습니다', 'Your category have been created successfully.' => '카테고리를 작성했습니다.', 'Unable to create your category.' => '카테고리의 작성에 실패했습니다.', 'Your category have been updated successfully.' => '카테고리를 갱신했습니다.', @@ -270,7 +267,6 @@ return array( 'Do you really want to remove this file: "%s"?' => '파일 "%s" 을 삭제할까요?', 'Attachments' => '첨부', 'Edit the task' => '할일 수정', - 'Edit the description' => '설명 수정', 'Add a comment' => '댓글 추가', 'Edit a comment' => '댓글 수정', 'Summary' => '개요', @@ -303,7 +299,6 @@ return array( 'Display another project' => '프로젝트 보기', 'Created by %s' => '작성자 %s', 'Tasks Export' => '할일 내보내기', - 'Tasks exportation for "%s"' => '"%s" 할일 내보내기', 'Start Date' => '시작일', 'End Date' => '종료일', 'Execute' => '실행', @@ -326,14 +321,9 @@ return array( 'New sub-task' => '새로운 서브 할일', 'New attachment added "%s"' => '"%s"의 새로운 첨부 파일', 'New comment posted by %s' => '"%s"님이 댓글을 추가하였습니다', - 'New attachment' => ' 새로운 첨부 파일', 'New comment' => ' 새로운 댓글', 'Comment updated' => '댓글가 갱신되었습니다', 'New subtask' => ' 새로운 서브 할일', - 'Subtask updated' => '서브 할일 갱신', - 'Task updated' => '할일 갱신', - 'Task closed' => '할일 마침', - 'Task opened' => '할일 시작', 'I want to receive notifications only for those projects:' => '다음 프로젝트의 알림만 받겠습니다:', 'view the task on Kanboard' => 'Kanboard에서 할일을 본다', 'Public access' => '공개 접속 설정', @@ -368,7 +358,6 @@ return array( 'No external authentication enabled.' => '외부 인증이 설정되어 있지 않습니다.', 'Password modified successfully.' => '패스워드를 변경했습니다.', 'Unable to change the password.' => '비밀 번호가 변경할 수 없었습니다.', - 'Change category for the task "%s"' => '할일 "%s"의 카테고리의 변경', 'Change category' => '카테고리 수정', '%s updated the task %s' => '%s이 할일 %s을 갱신 하였습니다', '%s opened the task %s' => '%s이 할일 %s을 시작시켰습니다', @@ -391,14 +380,12 @@ return array( '%s updated the task #%d' => '%s이 할일#%d을 갱신했습니다', '%s created the task #%d' => '%s이 할일#%d을 추가했습니다', '%s closed the task #%d' => '%s이 할일#%d을 닫혔습니다', - '%s open the task #%d' => '%s이 할일#%d를 오픈했습니다', - '%s moved the task #%d to the column "%s"' => '%s이 할일#%d을 칼럼"%s"로 옮겼습니다', - '%s moved the task #%d to the position %d in the column "%s"' => '%s이 할일#%d을 칼럼 "%s"의 %d 위치로 이동시켰습니다', + '%s opened the task #%d' => '%s이 할일#%d를 오픈했습니다', 'Activity' => '활동', 'Default values are "%s"' => '기본 값은 "%s" 입니다', 'Default columns for new projects (Comma-separated)' => '새로운 프로젝트의 기본 칼럼 (콤마(,)로 분리됨)', 'Task assignee change' => '담당자의 변경', - '%s change the assignee of the task #%d to %s' => '%s이 할일 #%d의 담당을 %s로 변경합니다', + '%s changed the assignee of the task #%d to %s' => '%s이 할일 #%d의 담당을 %s로 변경합니다', '%s changed the assignee of the task %s to %s' => '%s이 할일 %s의 담당을 %s로 변경했습니다', 'New password for the user "%s"' => '사용자 "%s"의 새로운 패스워드', 'Choose an event' => '행사의 선택', @@ -447,13 +434,10 @@ return array( 'Percentage' => '비중', 'Number of tasks' => '할일 수', 'Task distribution' => '할일 분포', - 'Reportings' => '리포트', - 'Task repartition for "%s"' => '"%s"의 할일 분포', 'Analytics' => '분석', 'Subtask' => '서브 할일', 'My subtasks' => '내 서브 할일', 'User repartition' => '담당자 분포', - 'User repartition for "%s"' => '"%s"의 담당자 분포', 'Clone this project' => '이 프로젝트를 복제하는 ', 'Column removed successfully.' => '(※)컬럼을 삭제했습니다', 'Not enough data to show the graph.' => '그래프를 선묘화하려면 나왔지만 부족합니다', @@ -470,10 +454,8 @@ return array( 'This value must be numeric' => '이 값은 숫자가 아니면 안 됩니다', 'Unable to create this task.' => '이 할일을 작성할 수 없었습니다', 'Cumulative flow diagram' => '축적 흐름', - 'Cumulative flow diagram for "%s"' => '"%s"의 축적 흐름', 'Daily project summary' => '하루 프로젝트 개요', 'Daily project summary export' => '하루 프로젝트 개요의 출력', - 'Daily project summary export for "%s"' => '"%s" 하루 프로젝트 개요의 출력', 'Exports' => '출력', 'This export contains the number of tasks per column grouped per day.' => '이 출력은 날짜의 칼람별 할일 수를 집계한 것입니다', 'Active swimlanes' => '액티브한 스윔레인', @@ -485,7 +467,6 @@ return array( 'Remove a swimlane' => '스윔레인의 삭제', 'Show default swimlane' => '기본 스윔레인의 표시', 'Swimlane modification for the project "%s"' => '"%s" 프로젝트의 스웜레인 수정', - 'Swimlane not found.' => '스윔레인이 발견되지 않습니다.', 'Swimlane removed successfully.' => '스윔레인을 삭제했습니다.', 'Swimlanes' => '스윔레인', 'Swimlane updated successfully.' => '스윔레인을 갱신했습니다.', @@ -500,7 +481,6 @@ return array( 'Subtask Id' => '서브 할일 Id', 'Subtasks' => '서브 할일', 'Subtasks Export' => '서브 할일 출력', - 'Subtasks exportation for "%s"' => '"%s"의 서브 할일 출력', 'Task Title' => '할일 제목', 'Untitled' => '제목 없음', 'Application default' => '애플리케이션 기본', @@ -607,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => '통화가 성공적으로 추가되었습니다', 'Unable to add this currency rate.' => '이 통화 환율을 추가할 수 없습니다.', 'Webhook URL' => 'Webhook URL', - '%s remove the assignee of the task %s' => '%s이 할일 %s의 담당을 삭제했습니다', + '%s removed the assignee of the task %s' => '%s이 할일 %s의 담당을 삭제했습니다', 'Enable Gravatar images' => 'Gravatar이미지를 활성화', 'Information' => '정보', 'Check two factor authentication code' => '2단 인증을 체크한다', @@ -621,7 +601,6 @@ return array( 'Test your device' => '디바이스 테스트', 'Assign a color when the task is moved to a specific column' => '상세 칼럼으로 이동할 할일의 색깔을 지정하세요', '%s via Kanboard' => '%s via E-board', - 'Burndown chart for "%s"' => '"%s" 번다운 차트', 'Burndown chart' => '번다운 차트', // 'This chart show the task complexity over the time (Work Remaining).' => '', 'Screenshot taken %s' => '스크린샷_%s', @@ -686,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => '카테고리 변경시 할일을 다른 칼럼으로 이동', 'Send a task by email to someone' => '할일을 이메일로 보내기', 'Reopen a task' => '할일 다시 시작', - 'Column change' => '칼럼 이동', - 'Position change' => '위치 이동', - 'Swimlane change' => '스윔레인 변경', - 'Assignee change' => '담당자 변경', - '[%s] Overdue tasks' => '[%s] 마감시간 지남', 'Notification' => '알림', '%s moved the task #%d to the first swimlane' => '%s가 할일 #%d를 첫번째 스웜레인으로 이동시켰습니다', - '%s moved the task #%d to the swimlane "%s"' => '%s가 할일 #%d를 "%s" 스웜레인으로 이동시켰습니다', 'Swimlane' => '스윔레인', // 'Gravatar' => '', '%s moved the task %s to the first swimlane' => '%s가 할일 %s를 첫번째 스웜레인으로 이동시켰습니다', @@ -764,8 +737,6 @@ return array( 'Search by category: ' => '카테고리로 찾기 ', 'Search by description: ' => '설명으로 찾기 ', 'Search by due date: ' => '마감날짜로 찾기 ', - 'Lead and Cycle time for "%s"' => '"%s"의 리드와 사이클 시간', - 'Average time spent into each column for "%s"' => '"%s"의 각 칼럼 평균 소요시간', 'Average time spent into each column' => '각 칼럼의 평균 소요시간', 'Average time spent' => '평균 소요시간', 'This chart show the average time spent into each column for the last %d tasks.' => '마지막 %d 할일의 칼럼 평균 소요시간을 차트에 표시합니다', @@ -806,7 +777,6 @@ return array( 'License:' => '라이센스:', 'License' => '라이센스', 'Enter the text below' => '아랫글로 들어가기', - 'Gantt chart for %s' => '%s의 간트 차트', 'Sort by position' => '위치별 정렬', 'Sort by date' => '날짜별 정렬', 'Add task' => '할일 추가', @@ -847,8 +817,6 @@ return array( 'Version' => '버전', 'Plugins' => '플러그인', 'There is no plugin loaded.' => '플러그인이 로드되지 않았습니다', - 'Set maximum column height' => '최대 칼럼 높이 제한하기', - 'Remove maximum column height' => '최대 칼럼 높이 없애기', 'My notifications' => '내 알림', 'Custom filters' => '사용자 정의 필터', 'Your custom filter have been created successfully.' => '사용자 정의 필터가 성공적으로 생성되었습니다', @@ -953,7 +921,6 @@ return array( // 'Invalid captcha' => '', 'The name must be unique' => '이름은 유일해야 합니다', 'View all groups' => '모든그룹보기', - 'View group members' => '그룹맴버 보기', 'There is no user available.' => '가능한 사용자가 없습니다', 'Do you really want to remove the user "%s" from the group "%s"?' => '"%s" 사용자를 "%s" 에서 삭제하시겠습니까?', 'There is no group.' => '그룹이 없습니다', @@ -974,13 +941,10 @@ return array( 'Enter group name...' => '그룹명을 입력합니다...', 'Role:' => '역할: ', 'Project members' => '프로젝트 멤버', - 'Compare hours for "%s"' => '"%s" 시간동안 비교', '%s mentioned you in the task #%d' => '#%d 할일에서 %s가 당신을 언급하였습니다', '%s mentioned you in a comment on the task #%d' => '#%d 할일에서 %s가 당신의 댓글을 언급하였습니다', 'You were mentioned in the task #%d' => '#%d 할일에서 당신이 언급되었습니다', 'You were mentioned in a comment on the task #%d' => '할일 #%d의 댓글에서 언급되었습니다', - 'Mentioned' => '언급된', - 'Compare Estimated Time vs Actual Time' => '예상 시간과 실제 시간 비교', 'Estimated hours: ' => '예상 시간: ', 'Actual hours: ' => '실제 시간: ', 'Hours Spent' => '소요 시간', @@ -1200,5 +1164,54 @@ return array( 'Email settings' => '이메일 설정', 'Email sender address' => '이메일 보낸이 주소', 'Email transport' => '이메일 전송', + // 'Webhook token' => '', 'Imports' => '가져오기', + // 'Project tags management' => '', + // 'Tag created successfully.' => '', + // 'Unable to create this tag.' => '', + // 'Tag updated successfully.' => '', + // 'Unable to update this tag.' => '', + // 'Tag removed successfully.' => '', + // 'Unable to remove this tag.' => '', + // 'Global tags management' => '', + // 'Tags' => '', + // 'Tags management' => '', + // 'Add new tag' => '', + // 'Edit a tag' => '', + // 'Project tags' => '', + // 'There is no specific tag for this project at the moment.' => '', + // 'Tag' => '', + // 'Remove a tag' => '', + // 'Do you really want to remove this tag: "%s"?' => '', + // 'Global tags' => '', + // 'There is no global tag at the moment.' => '', + // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', + // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/my_MY/translations.php b/app/Locale/my_MY/translations.php index ff8960aa..79baadf7 100644 --- a/app/Locale/my_MY/translations.php +++ b/app/Locale/my_MY/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Lihat projek lain', 'Created by %s' => 'Dibuat oleh %s', 'Tasks Export' => 'Ekspor Tugas', - 'Tasks exportation for "%s"' => 'Tugas di ekspor untuk « %s »', 'Start Date' => 'Tanggal Mulai', 'End Date' => 'Tanggal Berakhir', 'Execute' => 'Eksekusi', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Sub-tugas baru', 'New attachment added "%s"' => 'Lampiran baru ditambahkan « %s »', 'New comment posted by %s' => 'Komentar baru ditambahkan oleh « %s »', - 'New attachment' => 'Lampirkan baru', 'New comment' => 'Komentar baru', 'Comment updated' => 'Komentar diperbaharui', 'New subtask' => 'Sub-tugas baru', - 'Subtask updated' => 'Sub-tugas diperbaharui', - 'Task updated' => 'Tugas diperbaharui', - 'Task closed' => 'Tugas ditutup', - 'Task opened' => 'Tugas dibuka', 'I want to receive notifications only for those projects:' => 'Saya ingin menerima pemberitahuan hanya untuk projek-projek yang dipilih :', 'view the task on Kanboard' => 'lihat tugas di Kanboard', 'Public access' => 'Akses awam', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s memperbaharui tugas n°%d', '%s created the task #%d' => '%s membuat tugas n°%d', '%s closed the task #%d' => '%s menutup tugas n°%d', - '%s open the task #%d' => '%s membuka tugas n°%d', - '%s moved the task #%d to the column "%s"' => '%s memindahkan tugas n°%d ke kolom « %s »', - '%s moved the task #%d to the position %d in the column "%s"' => '%s memindahkan tugas n°%d ke posisi n°%d dalam kolom « %s »', + '%s opened the task #%d' => '%s membuka tugas n°%d', 'Activity' => 'Aktifitas', 'Default values are "%s"' => 'Standar nilai adalah« %s »', 'Default columns for new projects (Comma-separated)' => 'Kolom default untuk projek baru (dipisahkan dengan koma)', 'Task assignee change' => 'Mengubah orang ditugaskan untuk tugas', - '%s change the assignee of the task #%d to %s' => '%s rubah orang yang ditugaskan dari tugas n%d ke %s', + '%s changed the assignee of the task #%d to %s' => '%s rubah orang yang ditugaskan dari tugas n%d ke %s', '%s changed the assignee of the task %s to %s' => '%s mengubah orang yang ditugaskan dari tugas %s ke %s', 'New password for the user "%s"' => 'Kata laluan baru untuk pengguna « %s »', 'Choose an event' => 'Pilih sebuah acara', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Persentasi', 'Number of tasks' => 'Jumlah dari tugas', 'Task distribution' => 'Pembagian tugas', - 'Reportings' => 'Pelaporan', - 'Task repartition for "%s"' => 'Pembagian tugas untuk « %s »', 'Analytics' => 'Analitis', 'Subtask' => 'Subtugas', 'My subtasks' => 'Subtugas saya', 'User repartition' => 'Partisi ulang pengguna', - 'User repartition for "%s"' => 'Partisi ulang pengguna untuk « %s »', 'Clone this project' => 'Gandakan projek ini', 'Column removed successfully.' => 'Kolom berhasil dihapus.', 'Not enough data to show the graph.' => 'Tidak cukup data untuk menampilkan grafik.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Nilai ini harus angka', 'Unable to create this task.' => 'Tidak dapat membuat tugas ini', 'Cumulative flow diagram' => 'Diagram alir kumulatif', - 'Cumulative flow diagram for "%s"' => 'Diagram alir kumulatif untuk « %s »', 'Daily project summary' => 'Ringkasan projek harian', 'Daily project summary export' => 'Ekspot ringkasan projek harian', - 'Daily project summary export for "%s"' => 'Ekspor ringkasan projek harian untuk « %s »', 'Exports' => 'Ekspor', 'This export contains the number of tasks per column grouped per day.' => 'Ekspor ini berisi jumlah dari tugas per kolom dikelompokan perhari.', 'Active swimlanes' => 'Swimlanes aktif', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Id Subtugas', 'Subtasks' => 'Subtugas', 'Subtasks Export' => 'Ekspot Subtugas', - 'Subtasks exportation for "%s"' => 'Ekspor subtugas untuk « %s »', 'Task Title' => 'Judul Tugas', 'Untitled' => 'Tanpa nama', 'Application default' => 'Aplikasi Piawaian', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Nilai tukar mata uang berhasil ditambahkan.', 'Unable to add this currency rate.' => 'Tidak dapat menambahkan nilai tukar mata uang', 'Webhook URL' => 'URL webhook', - '%s remove the assignee of the task %s' => '%s menghapus penugasan dari tugas %s', + '%s removed the assignee of the task %s' => '%s menghapus penugasan dari tugas %s', 'Enable Gravatar images' => 'Mengaktifkan gambar Gravatar', 'Information' => 'Informasi', 'Check two factor authentication code' => 'Cek dua faktor kode otentifikasi', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Menguji perangkat anda', 'Assign a color when the task is moved to a specific column' => 'Menetapkan warna ketika tugas tersebut dipindahkan ke kolom tertentu', '%s via Kanboard' => '%s via Kanboard', - 'Burndown chart for "%s"' => 'Grafik Burndown untku « %s »', 'Burndown chart' => 'Grafik Burndown', 'This chart show the task complexity over the time (Work Remaining).' => 'Grafik ini menunjukkan kompleksitas tugas dari waktu ke waktu (Sisa Pekerjaan).', 'Screenshot taken %s' => 'Screenshot diambil %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Pindahkan tugas ke kolom lain ketika kategori berubah', 'Send a task by email to someone' => 'Kirim tugas melalui email ke seseorang', 'Reopen a task' => 'Membuka kembali tugas', - 'Column change' => 'Kolom berubah', - 'Position change' => 'Posisi berubah', - 'Swimlane change' => 'Swimlane berubah', - 'Assignee change' => 'Penerima berubah', - '[%s] Overdue tasks' => '[%s] Tugas terlambat', 'Notification' => 'Pemberitahuan', '%s moved the task #%d to the first swimlane' => '%s memindahkan tugas n°%d ke swimlane pertama', - '%s moved the task #%d to the swimlane "%s"' => '%s memindahkan tugas n°%d ke swimlane « %s »', 'Swimlane' => 'Swimlane', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s memindahkan tugas %s ke swimlane pertama', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Pencarian berdasarkan kategori : ', 'Search by description: ' => 'Pencarian berdasarkan deskripsi : ', 'Search by due date: ' => 'Pencarian berdasarkan tanggal jatuh tempo : ', - 'Lead and Cycle time for "%s"' => 'Memimpin dan Siklus waktu untuk « %s »', - 'Average time spent into each column for "%s"' => 'Rata-rata waktu yang dihabiskan dalam setiap kolom untuk « %s »', 'Average time spent into each column' => 'Rata-rata waktu yang dihabiskan dalam setiap kolom', 'Average time spent' => 'Rata-rata waktu yang dihabiskan', 'This chart show the average time spent into each column for the last %d tasks.' => 'Grafik ini menunjukkan rata-rata waktu yang dihabiskan dalam setiap kolom untuk %d tugas.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Lesen:', 'License' => 'Lesen', 'Enter the text below' => 'Masukkan teks di bawah', - 'Gantt chart for %s' => 'Carta Gantt untuk %s', 'Sort by position' => 'Urutkan berdasarkan posisi', 'Sort by date' => 'Urutkan berdasarkan tanggal', 'Add task' => 'Tambah tugas', @@ -841,8 +817,6 @@ return array( // 'Version' => '', // 'Plugins' => '', // 'There is no plugin loaded.' => '', - // 'Set maximum column height' => '', - // 'Remove maximum column height' => '', // 'My notifications' => '', // 'Custom filters' => '', // 'Your custom filter have been created successfully.' => '', @@ -947,7 +921,6 @@ return array( // 'Invalid captcha' => '', // 'The name must be unique' => '', // 'View all groups' => '', - // 'View group members' => '', // 'There is no user available.' => '', // 'Do you really want to remove the user "%s" from the group "%s"?' => '', // 'There is no group.' => '', @@ -968,13 +941,10 @@ return array( // 'Enter group name...' => '', 'Role:' => 'Peranan', 'Project members' => 'Anggota projek', - // 'Compare hours for "%s"' => '', // '%s mentioned you in the task #%d' => '', // '%s mentioned you in a comment on the task #%d' => '', // 'You were mentioned in the task #%d' => '', // 'You were mentioned in a comment on the task #%d' => '', - // 'Mentioned' => '', - // 'Compare Estimated Time vs Actual Time' => '', // 'Estimated hours: ' => '', // 'Actual hours: ' => '', // 'Hours Spent' => '', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/nb_NO/translations.php b/app/Locale/nb_NO/translations.php index 8752a159..3a0c3353 100644 --- a/app/Locale/nb_NO/translations.php +++ b/app/Locale/nb_NO/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Vis annet prosjekt...', 'Created by %s' => 'Opprettet av %s', 'Tasks Export' => 'Oppgave eksport', - 'Tasks exportation for "%s"' => 'Oppgaveeksportering for "%s"', 'Start Date' => 'Start-dato', 'End Date' => 'Slutt-dato', 'Execute' => 'KKjør', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Ny deloppgave', 'New attachment added "%s"' => 'Nytt vedlegg er lagt tilet "%s"', 'New comment posted by %s' => 'Ny kommentar fra %s', - 'New attachment' => 'Nytt vedlegg', 'New comment' => 'Ny kommentar', 'Comment updated' => 'Kommentar oppdatert', 'New subtask' => 'Ny deloppgave', - 'Subtask updated' => 'Deloppgave oppdatert', - 'Task updated' => 'Oppgave oppdatert', - 'Task closed' => 'Oppgave lukket', - 'Task opened' => 'Oppgave åpnet', 'I want to receive notifications only for those projects:' => 'Jeg vil kun ha varslinger for disse prosjekter:', 'view the task on Kanboard' => 'se oppgaven påhovedsiden', 'Public access' => 'Offentlig tilgang', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s oppdaterte oppgaven #%d', '%s created the task #%d' => '%s opprettet oppgaven #%d', '%s closed the task #%d' => '%s lukket oppgaven #%d', - '%s open the task #%d' => '%s åpnet oppgaven #%d', - '%s moved the task #%d to the column "%s"' => '%s flyttet oppgaven #%d til kolonnen "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s flyttet oppgaven #%d til posisjonen %d i kolonnen "%s"', + '%s opened the task #%d' => '%s åpnet oppgaven #%d', 'Activity' => 'Aktivitetslogg', 'Default values are "%s"' => 'Standardverdier er "%s"', 'Default columns for new projects (Comma-separated)' => 'Standard kolonne for nye prosjekter (komma-separert)', 'Task assignee change' => 'Endring av oppgaveansvarlig', - '%s change the assignee of the task #%d to %s' => '%s endre ansvarlig for oppgaven #%d til %s', + '%s changed the assignee of the task #%d to %s' => '%s endre ansvarlig for oppgaven #%d til %s', '%s changed the assignee of the task %s to %s' => '%s endret ansvarlig for oppgaven %s til %s', 'New password for the user "%s"' => 'Nytt passord for brukeren "%s"', 'Choose an event' => 'Velg en hendelse', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Prosent', 'Number of tasks' => 'Antall oppgaver', 'Task distribution' => 'Kolonnefordeling', - 'Reportings' => 'Rapportering', - // 'Task repartition for "%s"' => '', 'Analytics' => 'Analyser', 'Subtask' => 'Deloppgave', 'My subtasks' => 'Mine deloppgaver', 'User repartition' => 'Brukerfordeling', - // 'User repartition for "%s"' => '', 'Clone this project' => 'Kopier dette prosjektet', 'Column removed successfully.' => 'Kolonne flyttet', // 'Not enough data to show the graph.' => '', @@ -465,10 +454,8 @@ return array( // 'This value must be numeric' => '', // 'Unable to create this task.' => '', 'Cumulative flow diagram' => 'Kumulativt flytdiagram', - // 'Cumulative flow diagram for "%s"' => '', 'Daily project summary' => 'Daglig prosjektsammendrag', // 'Daily project summary export' => '', - // 'Daily project summary export for "%s"' => '', 'Exports' => 'Eksporter', // 'This export contains the number of tasks per column grouped per day.' => '', 'Active swimlanes' => 'Aktive svømmebaner', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Deloppgave ID', 'Subtasks' => 'Deloppgaver', 'Subtasks Export' => 'Eksporter deloppgaver', - // 'Subtasks exportation for "%s"' => '', 'Task Title' => 'Oppgavetittel', // 'Untitled' => '', 'Application default' => 'Standardinstilling', @@ -601,7 +587,7 @@ return array( // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', // 'Webhook URL' => '', - // '%s remove the assignee of the task %s' => '', + // '%s removed the assignee of the task %s' => '', // 'Enable Gravatar images' => '', // 'Information' => '', // 'Check two factor authentication code' => '', @@ -615,7 +601,6 @@ return array( // 'Test your device' => '', 'Assign a color when the task is moved to a specific column' => 'Endre til en valgt farge hvis en oppgave flyttes til en spesifikk kolonne', // '%s via Kanboard' => '', - // 'Burndown chart for "%s"' => '', // 'Burndown chart' => '', // 'This chart show the task complexity over the time (Work Remaining).' => '', // 'Screenshot taken %s' => '', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Flytt oppgaven til en annen kolonne når kategorien endres', 'Send a task by email to someone' => 'Send en oppgave på epost til noen', // 'Reopen a task' => '', - 'Column change' => 'Endret kolonne', - 'Position change' => 'Posisjonsendring', - 'Swimlane change' => 'Endret svømmebane', - 'Assignee change' => 'Endret eier', - // '[%s] Overdue tasks' => '', 'Notification' => 'Varsel', // '%s moved the task #%d to the first swimlane' => '', - // '%s moved the task #%d to the swimlane "%s"' => '', 'Swimlane' => 'Svømmebane', // 'Gravatar' => '', // '%s moved the task %s to the first swimlane' => '', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Søk etter kategori', 'Search by description: ' => 'Søk etter beskrivelse', 'Search by due date: ' => 'Søk etter frist', - // 'Lead and Cycle time for "%s"' => '', - // 'Average time spent into each column for "%s"' => '', // 'Average time spent into each column' => '', // 'Average time spent' => '', // 'This chart show the average time spent into each column for the last %d tasks.' => '', @@ -800,7 +777,6 @@ return array( 'License:' => 'Lisens:', 'License' => 'Lisens', 'Enter the text below' => 'Legg inn teksten nedenfor', - 'Gantt chart for %s' => 'Gantt skjema for %s', // 'Sort by position' => '', 'Sort by date' => 'Sorter etter dato', 'Add task' => 'Legg til oppgave', @@ -841,8 +817,6 @@ return array( // 'Version' => '', // 'Plugins' => '', // 'There is no plugin loaded.' => '', - // 'Set maximum column height' => '', - // 'Remove maximum column height' => '', // 'My notifications' => '', // 'Custom filters' => '', // 'Your custom filter have been created successfully.' => '', @@ -947,7 +921,6 @@ return array( // 'Invalid captcha' => '', // 'The name must be unique' => '', // 'View all groups' => '', - // 'View group members' => '', // 'There is no user available.' => '', // 'Do you really want to remove the user "%s" from the group "%s"?' => '', // 'There is no group.' => '', @@ -968,13 +941,10 @@ return array( // 'Enter group name...' => '', // 'Role:' => '', 'Project members' => 'Prosjektmedlemmer', - // 'Compare hours for "%s"' => '', // '%s mentioned you in the task #%d' => '', // '%s mentioned you in a comment on the task #%d' => '', // 'You were mentioned in the task #%d' => '', // 'You were mentioned in a comment on the task #%d' => '', - // 'Mentioned' => '', - // 'Compare Estimated Time vs Actual Time' => '', // 'Estimated hours: ' => '', // 'Actual hours: ' => '', // 'Hours Spent' => '', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php index e07ea32c..5a026092 100644 --- a/app/Locale/nl_NL/translations.php +++ b/app/Locale/nl_NL/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Een ander project weergeven', 'Created by %s' => 'Aangemaakt door %s', 'Tasks Export' => 'Taken exporteren', - 'Tasks exportation for "%s"' => 'Taken exporteren voor « %s »', 'Start Date' => 'Startdatum', 'End Date' => 'Einddatum', 'Execute' => 'Uitvoeren', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Nieuwe subtaak', 'New attachment added "%s"' => 'Nieuwe bijlage toegevoegd « %s »', 'New comment posted by %s' => 'Nieuw commentaar geplaatst door « %s »', - 'New attachment' => 'Nieuwe bijlage', 'New comment' => 'Nieuw commentaar', 'Comment updated' => 'Commentaar aangepast', 'New subtask' => 'Nieuwe subtaak', - 'Subtask updated' => 'Subtaak aangepast', - 'Task updated' => 'Taak aangepast', - 'Task closed' => 'Taak gesloten', - 'Task opened' => 'Taak geopend', 'I want to receive notifications only for those projects:' => 'Ik wil notificaties ontvangen van de volgende projecten :', 'view the task on Kanboard' => 'taak bekijken op Kanboard', 'Public access' => 'Publieke toegang', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s heeft taak %d aangepast', '%s created the task #%d' => '%s heeft taak %d aangemaakt', '%s closed the task #%d' => '%s heeft taak %d gesloten', - '%s open the task #%d' => '%s a heeft taak %d geopend', - '%s moved the task #%d to the column "%s"' => '%s heeft taak %d verplaatst naar kolom « %s »', - '%s moved the task #%d to the position %d in the column "%s"' => '%s heeft taak %d verplaatst naar positie %d in kolom « %s »', + '%s opened the task #%d' => '%s a heeft taak %d geopend', 'Activity' => 'Activiteit', 'Default values are "%s"' => 'Standaardwaarden zijn « %s »', 'Default columns for new projects (Comma-separated)' => 'Standaard kolommen voor nieuw projecten (komma gescheiden)', 'Task assignee change' => 'Taak toegewezene verandering', - '%s change the assignee of the task #%d to %s' => '%s heeft de toegewezene voor taak %d veranderd in %s', + '%s changed the assignee of the task #%d to %s' => '%s heeft de toegewezene voor taak %d veranderd in %s', '%s changed the assignee of the task %s to %s' => '%s heeft de toegewezene voor taak %s veranderd in %s', 'New password for the user "%s"' => 'Nieuw wachtwoord voor gebruiker « %s »', 'Choose an event' => 'Kies een gebeurtenis', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Percentage', 'Number of tasks' => 'Aantal taken', 'Task distribution' => 'Distributie van taken', - 'Reportings' => 'Rapporten', - 'Task repartition for "%s"' => 'Taakverdeling voor « %s »', 'Analytics' => 'Analytics', 'Subtask' => 'Subtaak', 'My subtasks' => 'Mijn subtaken', 'User repartition' => 'Gebruikerverdeling', - 'User repartition for "%s"' => 'Gebruikerverdeling voor « %s »', 'Clone this project' => 'Kloon dit project', 'Column removed successfully.' => 'Kolom succesvol verwijderd.', 'Not enough data to show the graph.' => 'Niet genoeg data om de grafiek te laten zien.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Deze waarde moet numeriek zijn', 'Unable to create this task.' => 'Aanmaken van de taak mislukt', 'Cumulative flow diagram' => 'Cummulatief stroomdiagram', - 'Cumulative flow diagram for "%s"' => 'Cummulatief stroomdiagram voor « %s »', 'Daily project summary' => 'Dagelijkse project samenvatting', 'Daily project summary export' => 'Dagelijkse project samenvatting export', - 'Daily project summary export for "%s"' => 'Dagelijkse project samenvatting voor « %s »', 'Exports' => 'Exports', 'This export contains the number of tasks per column grouped per day.' => 'Dit rapport bevat het aantal taken per kolom gegroupeerd per dag.', 'Active swimlanes' => 'Actieve swinlanes', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Subtaak id', 'Subtasks' => 'Subtaken', 'Subtasks Export' => 'Subtaken exporteren', - 'Subtasks exportation for "%s"' => 'Subtaken exporteren voor project « %s »', 'Task Title' => 'Taak title', 'Untitled' => 'Geen titel', 'Application default' => 'Standaard taal voor applicatie', @@ -601,7 +587,7 @@ return array( // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', 'Webhook URL' => 'Webhook URL', - // '%s remove the assignee of the task %s' => '', + // '%s removed the assignee of the task %s' => '', // 'Enable Gravatar images' => '', // 'Information' => '', // 'Check two factor authentication code' => '', @@ -615,7 +601,6 @@ return array( // 'Test your device' => '', // 'Assign a color when the task is moved to a specific column' => '', // '%s via Kanboard' => '', - // 'Burndown chart for "%s"' => '', // 'Burndown chart' => '', // 'This chart show the task complexity over the time (Work Remaining).' => '', // 'Screenshot taken %s' => '', @@ -680,14 +665,8 @@ return array( // 'Move the task to another column when the category is changed' => '', // 'Send a task by email to someone' => '', 'Reopen a task' => 'Heropen een taak', - // 'Column change' => '', - // 'Position change' => '', - // 'Swimlane change' => '', - // 'Assignee change' => '', - // '[%s] Overdue tasks' => '', // 'Notification' => '', // '%s moved the task #%d to the first swimlane' => '', - // '%s moved the task #%d to the swimlane "%s"' => '', 'Swimlane' => 'Swimlane', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s heeft de taak %s naar de eerste swimlane verplaatst', @@ -758,8 +737,6 @@ return array( // 'Search by category: ' => '', // 'Search by description: ' => '', // 'Search by due date: ' => '', - // 'Lead and Cycle time for "%s"' => '', - // 'Average time spent into each column for "%s"' => '', // 'Average time spent into each column' => '', // 'Average time spent' => '', // 'This chart show the average time spent into each column for the last %d tasks.' => '', @@ -800,7 +777,6 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Gantt chart for %s' => '', // 'Sort by position' => '', // 'Sort by date' => '', // 'Add task' => '', @@ -841,8 +817,6 @@ return array( // 'Version' => '', // 'Plugins' => '', // 'There is no plugin loaded.' => '', - // 'Set maximum column height' => '', - // 'Remove maximum column height' => '', // 'My notifications' => '', // 'Custom filters' => '', // 'Your custom filter have been created successfully.' => '', @@ -947,7 +921,6 @@ return array( // 'Invalid captcha' => '', // 'The name must be unique' => '', // 'View all groups' => '', - // 'View group members' => '', // 'There is no user available.' => '', // 'Do you really want to remove the user "%s" from the group "%s"?' => '', // 'There is no group.' => '', @@ -968,13 +941,10 @@ return array( // 'Enter group name...' => '', // 'Role:' => '', // 'Project members' => '', - // 'Compare hours for "%s"' => '', // '%s mentioned you in the task #%d' => '', // '%s mentioned you in a comment on the task #%d' => '', // 'You were mentioned in the task #%d' => '', // 'You were mentioned in a comment on the task #%d' => '', - // 'Mentioned' => '', - // 'Compare Estimated Time vs Actual Time' => '', // 'Estimated hours: ' => '', // 'Actual hours: ' => '', // 'Hours Spent' => '', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', - //' Hide tasks in this column in the dashboard' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', + // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php index 896d2ed4..af3bcd4e 100644 --- a/app/Locale/pl_PL/translations.php +++ b/app/Locale/pl_PL/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Wyświetl inny projekt', 'Created by %s' => 'Utworzone przez %s', 'Tasks Export' => 'Eksport zadań', - 'Tasks exportation for "%s"' => 'Eksport zadań dla "%s"', 'Start Date' => 'Data początkowa', 'End Date' => 'Data Końcowa', 'Execute' => 'Wykonaj', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Nowe Pod-zadanie', 'New attachment added "%s"' => 'Nowy załącznik dodany "%s"', 'New comment posted by %s' => 'Nowy komentarz dodany przez %s', - 'New attachment' => 'Nowy załącznik', 'New comment' => 'Nowy Komentarz', 'Comment updated' => 'Komentarz zaktualizowany', 'New subtask' => 'Nowe pod-zadanie', - 'Subtask updated' => 'Zaktualizowane pod-zadanie', - 'Task updated' => 'Zaktualizowane zadanie', - 'Task closed' => 'Zadanie zamknięte', - 'Task opened' => 'Zadanie otwarte', 'I want to receive notifications only for those projects:' => 'Chcę otrzymywać powiadomienia tylko dla poniższych projektów:', 'view the task on Kanboard' => 'Zobacz zadanie', 'Public access' => 'Dostęp publiczny', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s zaktualizował zadanie #%d', '%s created the task #%d' => '%s utworzył zadanie #%d', '%s closed the task #%d' => '%s zamknął zadanie #%d', - '%s open the task #%d' => '%s otworzył zadanie #%d', - '%s moved the task #%d to the column "%s"' => '%s przeniósł zadanie #%d do kolumny "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s przeniósł zadanie #%d na pozycję %d w kolmnie "%s"', + '%s opened the task #%d' => '%s otworzył zadanie #%d', 'Activity' => 'Aktywność', 'Default values are "%s"' => 'Domyślne wartości: "%s"', 'Default columns for new projects (Comma-separated)' => 'Domyślne kolumny dla nowych projektów (oddzielone przecinkiem)', 'Task assignee change' => 'Zmień osobę odpowiedzialną', - '%s change the assignee of the task #%d to %s' => '%s zmienił osobę odpowiedzialną za zadanie #%d na %s', + '%s changed the assignee of the task #%d to %s' => '%s zmienił osobę odpowiedzialną za zadanie #%d na %s', '%s changed the assignee of the task %s to %s' => '%s zmienił osobę odpowiedzialną za zadanie %s na %s', 'New password for the user "%s"' => 'Nowe hasło użytkownika "%s"', 'Choose an event' => 'Wybierz zdarzenie', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Procent', 'Number of tasks' => 'Liczba zadań', 'Task distribution' => 'Rozmieszczenie zadań', - 'Reportings' => 'Raporty', - 'Task repartition for "%s"' => 'Przydział zadań dla "%s"', 'Analytics' => 'Analizy', 'Subtask' => 'Pod-zadanie', 'My subtasks' => 'Moje pod-zadania', 'User repartition' => 'Przydział użytkownika', - 'User repartition for "%s"' => 'Przydział użytkownika dla "%s"', 'Clone this project' => 'Sklonuj ten projekt', 'Column removed successfully.' => 'Kolumna usunięta pomyślnie.', 'Not enough data to show the graph.' => 'Za mało danych do utworzenia wykresu.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Wartość musi być liczbą', 'Unable to create this task.' => 'Nie można tworzyć zadania.', 'Cumulative flow diagram' => 'Zbiorowy diagram przepływu', - 'Cumulative flow diagram for "%s"' => 'Zbiorowy diagram przepływu dla "%s"', 'Daily project summary' => 'Dzienne raport z projektu', 'Daily project summary export' => 'Eksport dziennego podsumowania projektu', - 'Daily project summary export for "%s"' => 'Wygeneruj dzienny raport dla projektu: "%s"', 'Exports' => 'Eksporty', 'This export contains the number of tasks per column grouped per day.' => 'Ten eksport zawiera ilość zadań zgrupowanych w kolumnach na dzień', 'Active swimlanes' => 'Aktywne tory', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'ID pod-zadania', 'Subtasks' => 'Pod-zadania', 'Subtasks Export' => 'Eksport pod-zadań', - 'Subtasks exportation for "%s"' => 'Wygeneruj raport pod-zadań dla projektu "%s"', 'Task Title' => 'Nazwa zadania', 'Untitled' => 'Bez nazwy', 'Application default' => 'Domyślne dla aplikacji', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Dodano kurs waluty', 'Unable to add this currency rate.' => 'Nie można dodać kursu waluty', 'Webhook URL' => 'Adres webhooka', - '%s remove the assignee of the task %s' => '%s usunął osobę przypisaną do zadania %s', + '%s removed the assignee of the task %s' => '%s usunął osobę przypisaną do zadania %s', 'Enable Gravatar images' => 'Włącz Gravatar', 'Information' => 'Informacje', 'Check two factor authentication code' => 'Sprawdź kod weryfikujący', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Przetestuj urządzenie', 'Assign a color when the task is moved to a specific column' => 'Przypisz kolor gdy zadanie jest przeniesione do danej kolumny', '%s via Kanboard' => '%s poprzez Kanboard', - 'Burndown chart for "%s"' => 'Wykres Burndown dla "%s"', 'Burndown chart' => 'Wykres Burndown', 'This chart show the task complexity over the time (Work Remaining).' => 'Ten wykres pokazuje złożoność zadania na przestrzeni czasu (pozostała praca).', 'Screenshot taken %s' => 'Zrzut ekranu zapisany %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Przenieś zadanie do innej kolumny gdy kategoria ulegnie zmianie', 'Send a task by email to someone' => 'Wyślij zadanie emailem do kogoś', 'Reopen a task' => 'Otwórz ponownie zadanie', - 'Column change' => 'Zmiana kolumny', - 'Position change' => 'Zmiana pozycji', - 'Swimlane change' => 'Zmiana toru', - 'Assignee change' => 'Zmiana przypisanego użytkownika', - '[%s] Overdue tasks' => '[%s] zaległych zadań', 'Notification' => 'Powiadomienie', '%s moved the task #%d to the first swimlane' => '%s przeniosł zadanie #%d na pierwszy tor', - '%s moved the task #%d to the swimlane "%s"' => '%s przeniosł zadanie #%d na tor "%s"', 'Swimlane' => 'Tor', // 'Gravatar' => '', '%s moved the task %s to the first swimlane' => '%s przeniosł zadanie %s na pierwszy tor', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Szukaj wg kategorii:', 'Search by description: ' => 'Szukaj wg opisu:', 'Search by due date: ' => 'Szukaj wg terminu:', - 'Lead and Cycle time for "%s"' => 'Czas cyklu i realizacji dla "%s"', - 'Average time spent into each column for "%s"' => 'Średni czas spędzony w każdej z kolumn dla "%s"', 'Average time spent into each column' => 'Średni czas spędzony w każdej z kolumn', 'Average time spent' => 'Średni spędzony czas', 'This chart show the average time spent into each column for the last %d tasks.' => 'Niniejszy wykres pokazuje średni czas spędzony w każdej z kolumn dla ostatnich %d zadań.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Licencja:', 'License' => 'Licencja', 'Enter the text below' => 'Wpisz tekst poniżej', - 'Gantt chart for %s' => 'Wykres Gantt dla %s', 'Sort by position' => 'Sortuj wg pozycji', 'Sort by date' => 'Sortuj wg daty', 'Add task' => 'Dodaj zadanie', @@ -841,8 +817,6 @@ return array( 'Version' => 'Wersja', 'Plugins' => 'Wtyczki', 'There is no plugin loaded.' => 'Nie wykryto żadnych wtyczek.', - 'Set maximum column height' => 'Rozwiń kolumny', - 'Remove maximum column height' => 'Zwiń kolumny', 'My notifications' => 'Powiadomienia', 'Custom filters' => 'Dostosuj filtry', 'Your custom filter have been created successfully.' => 'Niestandardowy filtr został utworzony.', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'Błędny kod z obrazka (captcha)', 'The name must be unique' => 'Nazwa musi być unikatowa', 'View all groups' => 'Wyświetl wszystkie grupy', - 'View group members' => 'Wyświetl wszystkich członków grupy', 'There is no user available.' => 'Żaden użytkownik nie jest dostępny.', 'Do you really want to remove the user "%s" from the group "%s"?' => 'Czy na pewno chcesz usunąć użytkownika "%s" z grupy "%s"?', 'There is no group.' => 'Nie utworzono jeszcze żadnej grupy.', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Wprowadź nazwę grupy...', 'Role:' => 'Rola:', 'Project members' => 'Uczestnicy projektu', - 'Compare hours for "%s"' => 'Porównaj godziny dla "%s"', '%s mentioned you in the task #%d' => '%s wspomiał o Tobie w zadaniu #%d', '%s mentioned you in a comment on the task #%d' => '%s wspomiał o Tobie w komentarzu do zadania #%d', 'You were mentioned in the task #%d' => 'Wspomiano o Tobie w zadaniu #%d', 'You were mentioned in a comment on the task #%d' => 'Wspomiano o Tobie w komentarzu do zadania #%d', - 'Mentioned' => 'Wspomiano', - 'Compare Estimated Time vs Actual Time' => 'Porównaj szacowany czas z rzeczywistym', 'Estimated hours: ' => 'Szacowane godziny: ', 'Actual hours: ' => 'Rzeczywiste godziny: ', 'Hours Spent' => 'Spędzone godziny', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php index 40f3bb4d..2772d8bb 100644 --- a/app/Locale/pt_BR/translations.php +++ b/app/Locale/pt_BR/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Exibir outro projeto', 'Created by %s' => 'Criado por %s', 'Tasks Export' => 'Exportar Tarefas', - 'Tasks exportation for "%s"' => 'As tarefas foram exportadas para "%s"', 'Start Date' => 'Data inicial', 'End Date' => 'Data final', 'Execute' => 'Executar', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Nova subtarefa', 'New attachment added "%s"' => 'Novo anexo adicionado "%s"', 'New comment posted by %s' => 'Novo comentário postado por %s', - 'New attachment' => 'Novo anexo', 'New comment' => 'Novo comentário', 'Comment updated' => 'Comentário atualizado', 'New subtask' => 'Nova subtarefa', - 'Subtask updated' => 'Subtarefa alterada', - 'Task updated' => 'Tarefa alterada', - 'Task closed' => 'Tarefa finalizada', - 'Task opened' => 'Tarefa aberta', 'I want to receive notifications only for those projects:' => 'Quero receber notificações apenas destes projetos:', 'view the task on Kanboard' => 'ver a tarefa no Kanboard', 'Public access' => 'Acesso público', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s atualizou a tarefa #%d', '%s created the task #%d' => '%s criou a tarefa #%d', '%s closed the task #%d' => '%s finalizou a tarefa #%d', - '%s open the task #%d' => '%s abriu a tarefa #%d', - '%s moved the task #%d to the column "%s"' => '%s moveu a tarefa #%d para a coluna "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s moveu a tarefa #%d para a posição %d na coluna "%s"', + '%s opened the task #%d' => '%s abriu a tarefa #%d', 'Activity' => 'Atividade', 'Default values are "%s"' => 'Os valores padrão são "%s"', 'Default columns for new projects (Comma-separated)' => 'Colunas padrão para novos projetos (Separado por vírgula)', 'Task assignee change' => 'Mudar designação da tarefa', - '%s change the assignee of the task #%d to %s' => '%s mudou a designação da tarefa #%d para %s', + '%s changed the assignee of the task #%d to %s' => '%s mudou a designação da tarefa #%d para %s', '%s changed the assignee of the task %s to %s' => '%s mudou a designação da tarefa %s para %s', 'New password for the user "%s"' => 'Nova senha para o usuário "%s"', 'Choose an event' => 'Escolher um evento', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Porcentagem', 'Number of tasks' => 'Número de tarefas', 'Task distribution' => 'Distribuição de tarefas', - 'Reportings' => 'Relatórios', - 'Task repartition for "%s"' => 'Redistribuição da tarefa para "%s"', 'Analytics' => 'Estatísticas', 'Subtask' => 'Subtarefa', 'My subtasks' => 'Minhas subtarefas', 'User repartition' => 'Redistribuição de usuário', - 'User repartition for "%s"' => 'Redistribuição de usuário para "%s"', 'Clone this project' => 'Clonar este projeto', 'Column removed successfully.' => 'Coluna removida com sucesso.', 'Not enough data to show the graph.' => 'Não há dados suficientes para mostrar o gráfico.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Este valor deve ser numérico', 'Unable to create this task.' => 'Não foi possível criar esta tarefa.', 'Cumulative flow diagram' => 'Fluxograma cumulativo', - 'Cumulative flow diagram for "%s"' => 'Fluxograma cumulativo para "%s"', 'Daily project summary' => 'Resumo diário do projeto', 'Daily project summary export' => 'Exportação diária do resumo do projeto', - 'Daily project summary export for "%s"' => 'Exportação diária do resumo do projeto para "%s"', 'Exports' => 'Exportar', 'This export contains the number of tasks per column grouped per day.' => 'Esta exportação contém o número de tarefas por coluna agrupada por dia.', 'Active swimlanes' => 'Ativar swimlanes', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'ID da subtarefa', 'Subtasks' => 'Subtarefas', 'Subtasks Export' => 'Exportar subtarefas', - 'Subtasks exportation for "%s"' => 'Subtarefas exportadas para "%s"', 'Task Title' => 'Título da Tarefa', 'Untitled' => 'Sem título', 'Application default' => 'Padrão da aplicação', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'A taxa de câmbio foi adicionada com sucesso.', 'Unable to add this currency rate.' => 'Impossível de adicionar essa taxa de câmbio.', 'Webhook URL' => 'URL do webhook', - '%s remove the assignee of the task %s' => '%s removeu a pessoa designada para a tarefa %s', + '%s removed the assignee of the task %s' => '%s removeu a pessoa designada para a tarefa %s', 'Enable Gravatar images' => 'Ativar imagens do Gravatar', 'Information' => 'Informações', 'Check two factor authentication code' => 'Verifique o código de autenticação em duas etapas', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Teste o seu dispositivo', 'Assign a color when the task is moved to a specific column' => 'Atribuir uma cor quando a tarefa é movida em uma coluna específica', '%s via Kanboard' => '%s via Kanboard', - 'Burndown chart for "%s"' => 'Gráfico de Burndown para "%s"', 'Burndown chart' => 'Gráfico de Burndown', 'This chart show the task complexity over the time (Work Remaining).' => 'Este gráfico mostra a complexidade da tarefa ao longo do tempo (Trabalho Restante).', 'Screenshot taken %s' => 'Captura de tela tirada em %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Mover uma tarefa para outra coluna quando a categoria mudou', 'Send a task by email to someone' => 'Enviar uma tarefa por e-mail a alguém', 'Reopen a task' => 'Reabrir uma tarefa', - 'Column change' => 'Mudança de coluna', - 'Position change' => 'Mudança de posição', - 'Swimlane change' => 'Mudança de swimlane', - 'Assignee change' => 'Mudança de designação', - '[%s] Overdue tasks' => '[%s] Tarefas atrasadas', 'Notification' => 'Notificação', '%s moved the task #%d to the first swimlane' => '%s moveu a tarefa #%d para a primeira swimlane', - '%s moved the task #%d to the swimlane "%s"' => '%s moveu a tarefa #%d para a swimlane "%s"', 'Swimlane' => 'Swimlane', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s moveu a tarefa %s para a primeira swimlane', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Pesquisar por categoria: ', 'Search by description: ' => 'Pesquisar por descrição: ', 'Search by due date: ' => 'Pesquisar por data de expiração: ', - 'Lead and Cycle time for "%s"' => 'Lead and Cycle time para "%s"', - 'Average time spent into each column for "%s"' => 'Tempo médio gasto em cada coluna para "%s"', 'Average time spent into each column' => 'Tempo médio gasto em cada coluna', 'Average time spent' => 'Tempo médio gasto', 'This chart show the average time spent into each column for the last %d tasks.' => 'Este gráfico mostra o tempo médio gasto em cada coluna para as %d últimas tarefas.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Licença:', 'License' => 'Licença', 'Enter the text below' => 'Entre o texto abaixo', - 'Gantt chart for %s' => 'Gráfico de Gantt para %s', 'Sort by position' => 'Ordenar por posição', 'Sort by date' => 'Ordenar por data', 'Add task' => 'Adicionar uma tarefa', @@ -841,8 +817,6 @@ return array( 'Version' => 'Versão', 'Plugins' => 'Extensões', 'There is no plugin loaded.' => 'Não há extensões carregadas.', - 'Set maximum column height' => 'Definir a altura máxima das colunas', - 'Remove maximum column height' => 'Retirar a altura máxima das colunas', 'My notifications' => 'Minhas notificações', 'Custom filters' => 'Filtros personalizados', 'Your custom filter have been created successfully.' => 'Seu filtro personalizado foi criado com sucesso.', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'Captcha inválido', 'The name must be unique' => 'O nome deve ser único', 'View all groups' => 'Ver todos os grupos', - 'View group members' => 'Ver os membros do grupo', 'There is no user available.' => 'Não há nenhum usuário disponível', 'Do you really want to remove the user "%s" from the group "%s"?' => 'Você realmente deseja remover o usuário "%s" do grupo "%s"?', 'There is no group.' => 'Não há nenhum grupo.', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Digite o nome do grupo', 'Role:' => 'Função:', 'Project members' => 'Membros de projeto', - 'Compare hours for "%s"' => 'Comparar as horas para "%s"', '%s mentioned you in the task #%d' => '%s mencionou você na tarefa #%d', '%s mentioned you in a comment on the task #%d' => '%s mencionou você num comentário da tarefa #%d', 'You were mentioned in the task #%d' => 'Você foi mencionado na tarefa #%d', 'You were mentioned in a comment on the task #%d' => 'Você foi mencionado num comentário da tarefa #%d', - 'Mentioned' => 'Mencionado', - 'Compare Estimated Time vs Actual Time' => 'Comparar o tempo estimado e o tempo atual', 'Estimated hours: ' => 'Horas estimadas: ', 'Actual hours: ' => 'Horas reais: ', 'Hours Spent' => 'Horas gastas', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/pt_PT/translations.php b/app/Locale/pt_PT/translations.php index 08375ad0..280edd8d 100644 --- a/app/Locale/pt_PT/translations.php +++ b/app/Locale/pt_PT/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Mostrar outro projecto', 'Created by %s' => 'Criado por %s', 'Tasks Export' => 'Exportar Tarefas', - 'Tasks exportation for "%s"' => 'As tarefas foram exportadas para "%s"', 'Start Date' => 'Data inicial', 'End Date' => 'Data final', 'Execute' => 'Executar', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Nova subtarefa', 'New attachment added "%s"' => 'Novo anexo adicionado "%s"', 'New comment posted by %s' => 'Novo comentário por %s', - 'New attachment' => 'Novo anexo', 'New comment' => 'Novo comentário', 'Comment updated' => 'Comentário actualizado', 'New subtask' => 'Nova subtarefa', - 'Subtask updated' => 'Subtarefa alterada', - 'Task updated' => 'Tarefa alterada', - 'Task closed' => 'Tarefa finalizada', - 'Task opened' => 'Tarefa aberta', 'I want to receive notifications only for those projects:' => 'Quero receber notificações apenas destes projectos:', 'view the task on Kanboard' => 'ver a tarefa no Kanboard', 'Public access' => 'Acesso público', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s actualizou a tarefa #%d', '%s created the task #%d' => '%s criou a tarefa #%d', '%s closed the task #%d' => '%s finalizou a tarefa #%d', - '%s open the task #%d' => '%s abriu a tarefa #%d', - '%s moved the task #%d to the column "%s"' => '%s moveu a tarefa #%d para a coluna "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s moveu a tarefa #%d para a posição %d na coluna "%s"', + '%s opened the task #%d' => '%s abriu a tarefa #%d', 'Activity' => 'Actividade', 'Default values are "%s"' => 'Os valores padrão são "%s"', 'Default columns for new projects (Comma-separated)' => 'Colunas padrão para novos projectos (Separado por vírgula)', 'Task assignee change' => 'Mudar assignação da tarefa', - '%s change the assignee of the task #%d to %s' => '%s mudou a assignação da tarefa #%d para %s', + '%s changed the assignee of the task #%d to %s' => '%s mudou a assignação da tarefa #%d para %s', '%s changed the assignee of the task %s to %s' => '%s mudou a assignação da tarefa %s para %s', 'New password for the user "%s"' => 'Nova senha para o utilizador "%s"', 'Choose an event' => 'Escolher um evento', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Percentagem', 'Number of tasks' => 'Número de tarefas', 'Task distribution' => 'Distribuição de tarefas', - 'Reportings' => 'Relatórios', - 'Task repartition for "%s"' => 'Redistribuição da tarefa para "%s"', 'Analytics' => 'Estatísticas', 'Subtask' => 'Subtarefa', 'My subtasks' => 'As minhas subtarefas', 'User repartition' => 'Redistribuição de utilizador', - 'User repartition for "%s"' => 'Redistribuição de utilizador para "%s"', 'Clone this project' => 'Clonar este projecto', 'Column removed successfully.' => 'Coluna removida com sucesso.', 'Not enough data to show the graph.' => 'Não há dados suficientes para mostrar o gráfico.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Este valor deve ser numérico', 'Unable to create this task.' => 'Não foi possível criar esta tarefa.', 'Cumulative flow diagram' => 'Fluxograma cumulativo', - 'Cumulative flow diagram for "%s"' => 'Fluxograma cumulativo para "%s"', 'Daily project summary' => 'Resumo diário do projecto', 'Daily project summary export' => 'Exportação diária do resumo do projecto', - 'Daily project summary export for "%s"' => 'Exportação diária do resumo do projecto para "%s"', 'Exports' => 'Exportar', 'This export contains the number of tasks per column grouped per day.' => 'Esta exportação contém o número de tarefas por coluna agrupada por dia.', 'Active swimlanes' => 'Activar swimlanes', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'ID da subtarefa', 'Subtasks' => 'Subtarefas', 'Subtasks Export' => 'Exportar subtarefas', - 'Subtasks exportation for "%s"' => 'Subtarefas exportadas para "%s"', 'Task Title' => 'Título da Tarefa', 'Untitled' => 'Sem título', 'Application default' => 'Aplicação padrão', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'A taxa de câmbio foi adicionada com sucesso.', 'Unable to add this currency rate.' => 'Impossível adicionar essa taxa de câmbio.', 'Webhook URL' => 'URL do webhook', - '%s remove the assignee of the task %s' => '%s removeu a pessoa assignada à tarefa %s', + '%s removed the assignee of the task %s' => '%s removeu a pessoa assignada à tarefa %s', 'Enable Gravatar images' => 'Activar imagem Gravatar', 'Information' => 'Informações', 'Check two factor authentication code' => 'Verificação do código de autenticação com factor duplo', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Teste o seu dispositivo', 'Assign a color when the task is moved to a specific column' => 'Atribuir uma cor quando a tarefa é movida em uma coluna específica', '%s via Kanboard' => '%s via Kanboard', - 'Burndown chart for "%s"' => 'Gráfico de Burndown para "%s"', 'Burndown chart' => 'Gráfico de Burndown', 'This chart show the task complexity over the time (Work Remaining).' => 'Este gráfico mostra a complexidade da tarefa ao longo do tempo (Trabalho Restante).', 'Screenshot taken %s' => 'Screenshot tirada a %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Mover uma tarefa para outra coluna quando a categoria mudar', 'Send a task by email to someone' => 'Enviar uma tarefa por e-mail a alguém', 'Reopen a task' => 'Reabrir uma tarefa', - 'Column change' => 'Mudança de coluna', - 'Position change' => 'Mudança de posição', - 'Swimlane change' => 'Mudança de swimlane', - 'Assignee change' => 'Mudança de assignação', - '[%s] Overdue tasks' => '[%s] Tarefas atrasadas', 'Notification' => 'Notificação', '%s moved the task #%d to the first swimlane' => '%s moveu a tarefa n° %d no primeiro swimlane', - '%s moved the task #%d to the swimlane "%s"' => '%s moveu a tarefa n° %d no swimlane "%s"', 'Swimlane' => 'Swimlane', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s moveu a tarefa %s no primeiro swimlane', @@ -758,9 +737,7 @@ return array( 'Search by category: ' => 'Pesquisar por categoria: ', 'Search by description: ' => 'Pesquisar por descrição: ', 'Search by due date: ' => 'Pesquisar por data de vencimento: ', - 'Lead and Cycle time for "%s"' => 'Tempo de Espera e Ciclo para "%s"', - 'Average time spent into each column for "%s"' => 'Tempo médio gasto em cada coluna para "%s"', - 'Average time spent into each column' => 'Tempo médio gasto em cada coluna', + 'Average time spent into each column' => 'Tempo médio gasto por coluna', 'Average time spent' => 'Tempo médio gasto', 'This chart show the average time spent into each column for the last %d tasks.' => 'Este gráfico mostra o tempo médio gasto em cada coluna nas últimas %d tarefas.', 'Average Lead and Cycle time' => 'Tempo de Espera e Ciclo médio', @@ -800,7 +777,6 @@ return array( 'License:' => 'Licença:', 'License' => 'Licença', 'Enter the text below' => 'Escreva o texto em baixo', - 'Gantt chart for %s' => 'Gráfico de Gantt para %s', 'Sort by position' => 'Ordenar por posição', 'Sort by date' => 'Ordenar por data', 'Add task' => 'Adicionar tarefa', @@ -841,8 +817,6 @@ return array( 'Version' => 'Versão', 'Plugins' => 'Plugins', 'There is no plugin loaded.' => 'Não existem extras carregados', - 'Set maximum column height' => 'Definir altura máxima da coluna', - 'Remove maximum column height' => 'Remover altura máxima da coluna', 'My notifications' => 'As minhas notificações', 'Custom filters' => 'Filtros personalizados', 'Your custom filter have been created successfully.' => 'O seu filtro personalizado foi criado com sucesso.', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'Captcha inválido', 'The name must be unique' => 'O nome deve ser único', 'View all groups' => 'Ver todos os grupos', - 'View group members' => 'Ver membros do grupo', 'There is no user available.' => 'Não existe utilizador disponivel.', 'Do you really want to remove the user "%s" from the group "%s"?' => 'Tem a certeza que quer remover o utilizador "%s" do grupo "%s"?', 'There is no group.' => 'Não existe grupo.', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Escreva o nome do Grupo', 'Role:' => 'Função:', 'Project members' => 'Membros do projecto', - 'Compare hours for "%s"' => 'Comparar horas para "%s"', '%s mentioned you in the task #%d' => '%s mencionou-te na tarefa #%d', '%s mentioned you in a comment on the task #%d' => '%s mencionou-te num comentário na tarefa #%d', 'You were mentioned in the task #%d' => 'Foi mencionado na tarefa #%d', 'You were mentioned in a comment on the task #%d' => 'Foi mencionado num comentário na tarefa #%d', - 'Mentioned' => 'Mencionado', - 'Compare Estimated Time vs Actual Time' => 'Comparar Tempo Estimado vs Tempo Real', 'Estimated hours: ' => 'Horas estimadas: ', 'Actual hours: ' => 'Horas reais: ', 'Hours Spent' => 'Horas Gastas', @@ -1215,6 +1185,33 @@ return array( 'Do you really want to remove this tag: "%s"?' => 'Tem a certeza que pretende remover esta etiqueta: "%s"?', 'Global tags' => 'Etiquetas globais', 'There is no global tag at the moment.' => 'De momento não existe nenhuma etiqueta global.', - // 'This field cannot be empty' => '', - //'Hide tasks in this column in the dashboard' => '', + 'This field cannot be empty' => 'Este campo não pode ficar vazio', + 'Close a task when there is no activity in an specific column' => 'Fechar tarefa quando não houver actividade numa coluna especifica', + '%s removed a subtask for the task #%d' => '%s removeu uma sub-tarefa da tarefa #%d', + '%s removed a comment on the task #%d' => '%s removeu um comentário da tarefa #%d ', + 'Comment removed on task #%d' => 'Comentário removido da tarefa #%d', + 'Subtask removed on task #%d' => 'Sub-tarefa removida da tarefa #%d', + 'Hide tasks in this column in the dashboard' => 'Esconder do meu painel tarefas nesta coluna', + '%s removed a comment on the task %s' => '%s removeu um comentário da tarefa %s', + '%s removed a subtask for the task %s' => '%s removeu uma sub-tarefa da tarefa %s', + 'Comment removed' => 'Comentário removido', + 'Subtask removed' => 'Sub-tarefa removida', + '%s set a new internal link for the task #%d' => '%s definiu uma nova ligação interna para a tarefa #%d', + '%s removed an internal link for the task #%d' => '%s removeu uma ligação interna da tarefa #%d', + 'A new internal link for the task #%d have been defined' => 'Uma nova ligação para a tarea #%d foi definida', + 'Internal link removed for the task #%d' => 'Ligação interna removida da tarefa #%d', + '%s set a new internal link for the task %s' => '%s definiu uma nova ligação interna para a tarefa %s', + '%s removed an internal link for the task %s' => '%s removeu uma ligação interna da tarefa %s', + 'Automatically set the due date on task creation' => 'Definir data de vencimento automáticamente ao criar uma tarefa', + 'Move the task to another column when closed' => 'Mover a tarefa para outra coluna quando fechada', + 'Move the task to another column when not moved during a given period' => 'Mover a tarefa para outra coluna quando não movida dentro de determinado periodo', + 'Dashboard for %s' => 'Painel de %s', + 'Tasks overview for %s' => 'Vista geral das tarefas de %s', + 'Subtasks overview for %s' => 'Vista geral das sub-tarefas de %s', + 'Projects overview for %s' => 'Vista geral dos projectos de %s', + 'Activity stream for %s' => 'Fluxo de actividade de %s', + 'Calendar for %s' => 'Calendário de %s', + 'Notifications for %s' => 'Notificações de %s', + 'Subtasks export' => 'Exportar sub-tarefas', + 'Tasks exportation' => 'Exportação de tarefas', ); diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php index c6285f6a..1669ce9b 100644 --- a/app/Locale/ru_RU/translations.php +++ b/app/Locale/ru_RU/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Показать другой проект', 'Created by %s' => 'Создано %s', 'Tasks Export' => 'Экспорт задач', - 'Tasks exportation for "%s"' => 'Задача экспортирована для « %s »', 'Start Date' => 'Дата начала', 'End Date' => 'Дата завершения', 'Execute' => 'Выполнить', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Новая подзадача', 'New attachment added "%s"' => 'Добавлено вложение « %s »', 'New comment posted by %s' => 'Новый комментарий написан « %s »', - 'New attachment' => 'Новое вложение', 'New comment' => 'Новый комментарий', 'Comment updated' => 'Комментарий обновлен', 'New subtask' => 'Новая подзадача', - 'Subtask updated' => 'Подзадача обновлена', - 'Task updated' => 'Задача обновлена', - 'Task closed' => 'Задача закрыта', - 'Task opened' => 'Задача открыта', 'I want to receive notifications only for those projects:' => 'Я хочу получать уведомления только по этим проектам:', 'view the task on Kanboard' => 'посмотреть задачу на Kanboard', 'Public access' => 'Общий доступ', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s обновил задачу #%d', '%s created the task #%d' => '%s создал задачу #%d', '%s closed the task #%d' => '%s закрыл задачу #%d', - '%s open the task #%d' => '%s открыл задачу #%d', - '%s moved the task #%d to the column "%s"' => '%s переместил задачу #%d в колонку "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s переместил задачу #%d на позицию %d в колонке "%s"', + '%s opened the task #%d' => '%s открыл задачу #%d', 'Activity' => 'Активность', 'Default values are "%s"' => 'Колонки по умолчанию: "%s"', 'Default columns for new projects (Comma-separated)' => 'Колонки по умолчанию для новых проектов (разделять запятой)', 'Task assignee change' => 'Изменен назначенный', - '%s change the assignee of the task #%d to %s' => '%s сменил назначенного для задачи #%d на %s', + '%s changed the assignee of the task #%d to %s' => '%s сменил назначенного для задачи #%d на %s', '%s changed the assignee of the task %s to %s' => '%s сменил назначенного для задачи %s на %s', 'New password for the user "%s"' => 'Новый пароль для пользователя "%s"', 'Choose an event' => 'Выберите событие', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Процент', 'Number of tasks' => 'Количество задач', 'Task distribution' => 'Распределение задач', - 'Reportings' => 'Отчетность', - 'Task repartition for "%s"' => 'Распределение задач для "%s"', 'Analytics' => 'Аналитика', 'Subtask' => 'Подзадача', 'My subtasks' => 'Мои подзадачи', 'User repartition' => 'Перераспределение пользователей', - 'User repartition for "%s"' => 'Перераспределение пользователей для "%s"', 'Clone this project' => 'Клонировать проект', 'Column removed successfully.' => 'Колонка успешно удалена.', 'Not enough data to show the graph.' => 'Недостаточно данных, чтобы показать график.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Это значение должно быть цифровым', 'Unable to create this task.' => 'Невозможно создать задачу.', 'Cumulative flow diagram' => 'Накопительная диаграма', - 'Cumulative flow diagram for "%s"' => 'Накопительная диаграма для "%s"', 'Daily project summary' => 'Ежедневное состояние проекта', 'Daily project summary export' => 'Экспорт ежедневного резюме проекта', - 'Daily project summary export for "%s"' => 'Экспорт ежедневного резюме проекта "%s"', 'Exports' => 'Экспорт', 'This export contains the number of tasks per column grouped per day.' => 'Этот экспорт содержит ряд задач в колонках, сгруппированные по дням.', 'Active swimlanes' => 'Активные дорожки', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Id подзадачи', 'Subtasks' => 'Подзадачи', 'Subtasks Export' => 'Экспортировать подзадачи', - 'Subtasks exportation for "%s"' => 'Экспорт подзадач для "%s"', 'Task Title' => 'Загловок задачи', 'Untitled' => 'Заголовок отсутствует', 'Application default' => 'Приложение по умолчанию', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Курс валюты был успешно добавлен.', 'Unable to add this currency rate.' => 'Невозможно добавить этот курс валюты.', 'Webhook URL' => 'Webhook URL', - '%s remove the assignee of the task %s' => '%s удалить назначенную задачу %s', + '%s removed the assignee of the task %s' => '%s удалить назначенную задачу %s', 'Enable Gravatar images' => 'Включить Gravatar изображения', 'Information' => 'Информация', 'Check two factor authentication code' => 'Проверка кода двухфакторной авторизации', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Проверьте свое устройство', 'Assign a color when the task is moved to a specific column' => 'Назначить цвет, когда задача перемещается в определенную колонку', '%s via Kanboard' => '%s через Канборд', - 'Burndown chart for "%s"' => 'Диаграмма сгорания для « %s »', 'Burndown chart' => 'Диаграмма сгорания', 'This chart show the task complexity over the time (Work Remaining).' => 'Эта диаграмма показывают сложность задачи по времени (оставшейся работы).', 'Screenshot taken %s' => 'Принято скриншотов %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Переносить задачи в другую колонку при изменении категории', 'Send a task by email to someone' => 'Отправить задачу по email', 'Reopen a task' => 'Переоткрыть задачу', - 'Column change' => 'Изменение колонки', - 'Position change' => 'Позиция изменена', - 'Swimlane change' => 'Дорожка изменена', - 'Assignee change' => 'Назначенный пользователь изменен', - '[%s] Overdue tasks' => '[%s] просроченные задачи', 'Notification' => 'Уведомления', '%s moved the task #%d to the first swimlane' => '%s задач перемещено #%d в первой дорожке', - '%s moved the task #%d to the swimlane "%s"' => '%s задач перемещено #%d в дорожке "%s"', 'Swimlane' => 'Дорожки', 'Gravatar' => 'Граватар', '%s moved the task %s to the first swimlane' => '%s переместил задачу %s на первую дорожку', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Поиск по категориям: ', 'Search by description: ' => 'Поиск по описанию: ', 'Search by due date: ' => 'Поиск по дате завершения: ', - 'Lead and Cycle time for "%s"' => 'Затраченное время и время цикла для "%s"', - 'Average time spent into each column for "%s"' => 'Затрачено времени в среднем в каждой колонке для "%s"', 'Average time spent into each column' => 'Затрачено времени в среднем в каждой колонке', 'Average time spent' => 'Затрачено времени в среднем', 'This chart show the average time spent into each column for the last %d tasks.' => 'Эта диаграмма показывает среднее время, проведенное задачами в каждой колонке за последний %d.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Лицензия:', 'License' => 'Лицензия', 'Enter the text below' => 'Введите текст ниже', - 'Gantt chart for %s' => 'Диаграмма Ганта для %s', 'Sort by position' => 'Сортировать по позиции', 'Sort by date' => 'Сортировать по дате', 'Add task' => 'Добавить задачу', @@ -841,8 +817,6 @@ return array( 'Version' => 'Версия', 'Plugins' => 'Плагины', 'There is no plugin loaded.' => 'Нет установленных плагинов.', - 'Set maximum column height' => 'Установить максимальную высоту колонки', - 'Remove maximum column height' => 'Сбросить максимальную высоту колонки', 'My notifications' => 'Мои уведомления', 'Custom filters' => 'Пользовательские фильтры', 'Your custom filter have been created successfully.' => 'Фильтр был успешно создан.', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'Неверный код подтверждения', 'The name must be unique' => 'Имя должно быть уникальным', 'View all groups' => 'Просмотр всех групп', - 'View group members' => 'Просмотр участников группы', 'There is no user available.' => 'Нет доступных пользователей.', 'Do you really want to remove the user "%s" from the group "%s"?' => 'Вы действительно хотите удалить пользователя "%s" из группы "%s"?', 'There is no group.' => 'Нет созданных групп.', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Введите имя группы...', 'Role:' => 'Роль:', 'Project members' => 'Участники проекта', - 'Compare hours for "%s"' => 'Сравнить часы для "%s"', '%s mentioned you in the task #%d' => '%s упомянул вас в задаче #%d', '%s mentioned you in a comment on the task #%d' => '%s упомянул вас в комментарии к задаче #%d', 'You were mentioned in the task #%d' => 'Вы упомянуты в задаче #%d', 'You were mentioned in a comment on the task #%d' => 'Вы упомянуты в комментарии к задаче #%d', - 'Mentioned' => 'Упоминания', - 'Compare Estimated Time vs Actual Time' => 'Сравнить запланированное время и реальное', 'Estimated hours: ' => 'Запланировано часов: ', 'Actual hours: ' => 'Реально затрачено часов: ', 'Hours Spent' => 'Затрачено часов', @@ -1216,5 +1186,32 @@ return array( 'Global tags' => 'Глобальные метка', 'There is no global tag at the moment.' => 'Нет глобальных меток.', 'This field cannot be empty' => 'Это поле не может быть пустым', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', 'Hide tasks in this column in the dashboard' => 'Не показывать задачи из этой колонки в кабинете', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php index 92ed3424..7e28e9a9 100644 --- a/app/Locale/sr_Latn_RS/translations.php +++ b/app/Locale/sr_Latn_RS/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Prikaži drugi projekat', 'Created by %s' => 'Kreirao %s', 'Tasks Export' => 'Izvoz zadataka', - 'Tasks exportation for "%s"' => 'Izvoz zadataka za "%s"', 'Start Date' => 'Početni datum', 'End Date' => 'Krajni datum', 'Execute' => 'Izvrši', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Novi Pod-zadatak', 'New attachment added "%s"' => 'Novi prilog ubačen "%s"', 'New comment posted by %s' => 'Novi komentar ostavio %s', - // 'New attachment' => '', // 'New comment' => '', 'Comment updated' => 'Komentar izmenjen', // 'New subtask' => '', - // 'Subtask updated' => '', - // 'Task updated' => '', - 'Task closed' => 'Zadatak je zatvoren', - 'Task opened' => 'Zadatak je otvoren', 'I want to receive notifications only for those projects:' => 'Želim obaveštenja samo za ovaj projekat:', 'view the task on Kanboard' => 'Pregledaj zadatke', 'Public access' => 'Javni pristup', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s izmenjen zadatak #%d', '%s created the task #%d' => '%s kreirao zadatak #%d', '%s closed the task #%d' => '%s zatvorio zadatak #%d', - '%s open the task #%d' => '%s otvorio zadatak #%d', - '%s moved the task #%d to the column "%s"' => '%s premestio zadatak #%d u kolonu "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s premestio zadatak #%d na pozycję %d w kolmnie "%s"', + '%s opened the task #%d' => '%s otvorio zadatak #%d', 'Activity' => 'Aktivnosti', 'Default values are "%s"' => 'Osnovne vrednosti su: "%s"', 'Default columns for new projects (Comma-separated)' => 'Osnovne kolone za novi projekat (Odvojeni zarezom)', 'Task assignee change' => 'Zmień osobę odpowiedzialną', - '%s change the assignee of the task #%d to %s' => '%s zamena dodele za zadatak #%d na %s', + '%s changed the assignee of the task #%d to %s' => '%s zamena dodele za zadatak #%d na %s', '%s changed the assignee of the task %s to %s' => '%s zamena dodele za zadatak %s na %s', 'New password for the user "%s"' => 'Nova lozinka za korisnika "%s"', 'Choose an event' => 'Izaberi događaj', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Procenat', 'Number of tasks' => 'Broj zadataka', 'Task distribution' => 'Podela zadataka', - 'Reportings' => 'Izveštaji', - 'Task repartition for "%s"' => 'Zaduženja zadataka za "%s"', 'Analytics' => 'Analiza', 'Subtask' => 'Pod-zadatak', 'My subtasks' => 'Moji pod-zadaci', 'User repartition' => 'Zaduženja korisnika', - 'User repartition for "%s"' => 'Zaduženja korisnika za "%s"', 'Clone this project' => 'Kopiraj projekat', 'Column removed successfully.' => 'Kolumna usunięta pomyslnie.', 'Not enough data to show the graph.' => 'Nedovoljno podataka za grafikon.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Vrednost mora biti broj', 'Unable to create this task.' => 'Nije moguće kreirati zadatak.', 'Cumulative flow diagram' => 'Zbirni dijagram toka', - 'Cumulative flow diagram for "%s"' => 'Zbirni dijagram toka za "%s"', 'Daily project summary' => 'Zbirni pregled po danima', 'Daily project summary export' => 'Izvoz zbirnog pregleda po danima', - 'Daily project summary export for "%s"' => 'Izvoz zbirnig pregleda po danima za "%s"', 'Exports' => 'Izvoz', // 'This export contains the number of tasks per column grouped per day.' => '', 'Active swimlanes' => 'Aktivni razdelnik', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'ID pod-zadania', 'Subtasks' => 'Pod-zadataka', 'Subtasks Export' => 'Eksport pod-zadań', - 'Subtasks exportation for "%s"' => 'Izvoz pod-zadań dla "%s"', 'Task Title' => 'Naslov zadatka', 'Untitled' => 'Bez naslova', 'Application default' => 'Postavke aplikacje', @@ -601,7 +587,7 @@ return array( // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', // 'Webhook URL' => '', - // '%s remove the assignee of the task %s' => '', + // '%s removed the assignee of the task %s' => '', // 'Enable Gravatar images' => '', // 'Information' => '', // 'Check two factor authentication code' => '', @@ -615,7 +601,6 @@ return array( // 'Test your device' => '', // 'Assign a color when the task is moved to a specific column' => '', // '%s via Kanboard' => '', - // 'Burndown chart for "%s"' => '', // 'Burndown chart' => '', // 'This chart show the task complexity over the time (Work Remaining).' => '', // 'Screenshot taken %s' => '', @@ -680,14 +665,8 @@ return array( // 'Move the task to another column when the category is changed' => '', // 'Send a task by email to someone' => '', // 'Reopen a task' => '', - // 'Column change' => '', - // 'Position change' => '', - // 'Swimlane change' => '', - // 'Assignee change' => '', - // '[%s] Overdue tasks' => '', // 'Notification' => '', // '%s moved the task #%d to the first swimlane' => '', - // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', // 'Gravatar' => '', // '%s moved the task %s to the first swimlane' => '', @@ -758,8 +737,6 @@ return array( // 'Search by category: ' => '', // 'Search by description: ' => '', // 'Search by due date: ' => '', - // 'Lead and Cycle time for "%s"' => '', - // 'Average time spent into each column for "%s"' => '', // 'Average time spent into each column' => '', // 'Average time spent' => '', // 'This chart show the average time spent into each column for the last %d tasks.' => '', @@ -800,7 +777,6 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Gantt chart for %s' => '', // 'Sort by position' => '', // 'Sort by date' => '', // 'Add task' => '', @@ -841,8 +817,6 @@ return array( // 'Version' => '', // 'Plugins' => '', // 'There is no plugin loaded.' => '', - // 'Set maximum column height' => '', - // 'Remove maximum column height' => '', // 'My notifications' => '', // 'Custom filters' => '', // 'Your custom filter have been created successfully.' => '', @@ -947,7 +921,6 @@ return array( // 'Invalid captcha' => '', // 'The name must be unique' => '', // 'View all groups' => '', - // 'View group members' => '', // 'There is no user available.' => '', // 'Do you really want to remove the user "%s" from the group "%s"?' => '', // 'There is no group.' => '', @@ -968,13 +941,10 @@ return array( // 'Enter group name...' => '', // 'Role:' => '', // 'Project members' => '', - // 'Compare hours for "%s"' => '', // '%s mentioned you in the task #%d' => '', // '%s mentioned you in a comment on the task #%d' => '', // 'You were mentioned in the task #%d' => '', // 'You were mentioned in a comment on the task #%d' => '', - // 'Mentioned' => '', - // 'Compare Estimated Time vs Actual Time' => '', // 'Estimated hours: ' => '', // 'Actual hours: ' => '', // 'Hours Spent' => '', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php index eedcf0fc..5ad2938c 100644 --- a/app/Locale/sv_SE/translations.php +++ b/app/Locale/sv_SE/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Visa ett annat projekt', 'Created by %s' => 'Skapad av %s', 'Tasks Export' => 'Exportera uppgifter', - 'Tasks exportation for "%s"' => 'Exportera uppgifter för "%s"', 'Start Date' => 'Startdatum', 'End Date' => 'Slutdatum', 'Execute' => 'Utför', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Ny deluppgift', 'New attachment added "%s"' => 'Ny bifogning tillagd "%s"', 'New comment posted by %s' => 'Ny kommentar postad av %s', - 'New attachment' => 'Ny bifogning', 'New comment' => 'Ny kommentar', 'Comment updated' => 'Kommentaren har uppdaterats', 'New subtask' => 'Ny deluppgift', - 'Subtask updated' => 'Deluppgiften har uppdaterats', - 'Task updated' => 'Uppgiften har uppdaterats', - 'Task closed' => 'Uppgiften har stängts', - 'Task opened' => 'Uppgiften har öppnats', 'I want to receive notifications only for those projects:' => 'Jag vill endast få notiser för dessa projekt:', 'view the task on Kanboard' => 'Visa uppgiften på Kanboard', 'Public access' => 'Publik åtkomst', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s uppdaterade uppgiften #%d', '%s created the task #%d' => '%s skapade uppgiften #%d', '%s closed the task #%d' => '%s stängde uppgiften #%d', - '%s open the task #%d' => '%s öppnade uppgiften #%d', - '%s moved the task #%d to the column "%s"' => '%s flyttade uppgiften #%d till kolumnen "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s flyttade uppgiften #%d till positionen %d i kolumnen "%s"', + '%s opened the task #%d' => '%s öppnade uppgiften #%d', 'Activity' => 'Aktivitet', 'Default values are "%s"' => 'Standardvärden är "%s"', 'Default columns for new projects (Comma-separated)' => 'Standardkolumner för nya projekt (kommaseparerade)', 'Task assignee change' => 'Ändra tilldelning av uppgiften', - '%s change the assignee of the task #%d to %s' => '%s byt tilldelning av uppgiften #%d till %s', + '%s changed the assignee of the task #%d to %s' => '%s byt tilldelning av uppgiften #%d till %s', '%s changed the assignee of the task %s to %s' => '%s byt tilldelning av uppgiften %s till %s', 'New password for the user "%s"' => 'Nytt lösenord för användaren "%s"', 'Choose an event' => 'Välj en händelse', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Procent', 'Number of tasks' => 'Antal uppgifter', 'Task distribution' => 'Uppgiftsfördelning', - 'Reportings' => 'Rapportering', - 'Task repartition for "%s"' => 'Uppgiftsdeltagande för "%s"', 'Analytics' => 'Analyser', 'Subtask' => 'Deluppgift', 'My subtasks' => 'Mina deluppgifter', 'User repartition' => 'Användardeltagande', - 'User repartition for "%s"' => 'Användardeltagande för "%s"', 'Clone this project' => 'Klona projektet', 'Column removed successfully.' => 'Kolumnen togs bort', 'Not enough data to show the graph.' => 'Inte tillräckligt med data för att visa graf', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Värdet måste vara numeriskt', 'Unable to create this task.' => 'Kunde inte skapa uppgiften.', 'Cumulative flow diagram' => 'Diagram med kumulativt flöde', - 'Cumulative flow diagram for "%s"' => 'Diagram med kumulativt flöde för "%s"', 'Daily project summary' => 'Daglig projektsummering', 'Daily project summary export' => 'Export av daglig projektsummering', - 'Daily project summary export for "%s"' => 'Export av daglig projektsummering för "%s"', 'Exports' => 'Exporter', 'This export contains the number of tasks per column grouped per day.' => 'Denna export innehåller antalet uppgifter per kolumn grupperade per dag.', 'Active swimlanes' => 'Aktiva swimlanes', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Deluppgifts-ID', 'Subtasks' => 'Deluppgift', 'Subtasks Export' => 'Export av deluppgifter', - 'Subtasks exportation for "%s"' => 'Export av deluppgifter för "%s"', 'Task Title' => 'Uppgiftstitel', 'Untitled' => 'Titel saknas', 'Application default' => 'Applikationsstandard', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Valutakursen har lagts till.', 'Unable to add this currency rate.' => 'Kunde inte lägga till valutakursen.', 'Webhook URL' => 'Webhook URL', - '%s remove the assignee of the task %s' => '%s ta bort tilldelningen av uppgiften %s', + '%s removed the assignee of the task %s' => '%s ta bort tilldelningen av uppgiften %s', 'Enable Gravatar images' => 'Aktivera Gravatar bilder', 'Information' => 'Information', 'Check two factor authentication code' => 'Kolla tvåfaktorsverifieringskod', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Testa din enhet', 'Assign a color when the task is moved to a specific column' => 'Tilldela en färg när uppgiften flyttas till en specifik kolumn', '%s via Kanboard' => '%s via Kanboard', - 'Burndown chart for "%s"' => 'Burndown diagram för "%s"', 'Burndown chart' => 'Burndown diagram', 'This chart show the task complexity over the time (Work Remaining).' => 'Diagrammet visar uppgiftens svårighet över tid (återstående arbete).', 'Screenshot taken %s' => 'Skärmdump tagen %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Flyttas uppgiften till en annan kolumn när kategorin ändras', 'Send a task by email to someone' => 'Skicka en uppgift med e-post till någon', 'Reopen a task' => 'Återöppna en uppgift', - 'Column change' => 'Kolumnändring', - 'Position change' => 'Positionsändring', - 'Swimlane change' => 'Swimlaneändring', - 'Assignee change' => 'Tilldelningsändring', - '[%s] Overdue tasks' => '[%s] Försenade uppgifter', 'Notification' => 'Notis', '%s moved the task #%d to the first swimlane' => '%s flyttade uppgiften #%d till första swimlane', - '%s moved the task #%d to the swimlane "%s"' => '%s flyttade uppgiften #%d till swimlane "%s"', 'Swimlane' => 'Swimlane', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s flyttade uppgiften %s till första swimlane', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Sök efter kategori:', 'Search by description: ' => 'Sök efter beskrivning', 'Search by due date: ' => 'Sök efter förfallodatum', - 'Lead and Cycle time for "%s"' => 'Led- och cykeltid för "%s"', - 'Average time spent into each column for "%s"' => 'Medeltidsåtgång i varje kolumn för "%s"', 'Average time spent into each column' => 'Medeltidsåtgång i varje kolumn', 'Average time spent' => 'Medeltidsåtgång', 'This chart show the average time spent into each column for the last %d tasks.' => 'Diagramet visar medeltidsåtgång i varje kolumn för de senaste %d uppgifterna.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Licens:', 'License' => 'Licens', 'Enter the text below' => 'Fyll i texten nedan', - 'Gantt chart for %s' => 'Gantt-schema för %s', 'Sort by position' => 'Sortera efter position', 'Sort by date' => 'Sortera efter datum', 'Add task' => 'Lägg till uppgift', @@ -841,8 +817,6 @@ return array( // 'Version' => '', // 'Plugins' => '', // 'There is no plugin loaded.' => '', - // 'Set maximum column height' => '', - // 'Remove maximum column height' => '', // 'My notifications' => '', // 'Custom filters' => '', // 'Your custom filter have been created successfully.' => '', @@ -947,7 +921,6 @@ return array( // 'Invalid captcha' => '', // 'The name must be unique' => '', // 'View all groups' => '', - // 'View group members' => '', // 'There is no user available.' => '', // 'Do you really want to remove the user "%s" from the group "%s"?' => '', // 'There is no group.' => '', @@ -968,13 +941,10 @@ return array( // 'Enter group name...' => '', // 'Role:' => '', // 'Project members' => '', - // 'Compare hours for "%s"' => '', // '%s mentioned you in the task #%d' => '', // '%s mentioned you in a comment on the task #%d' => '', // 'You were mentioned in the task #%d' => '', // 'You were mentioned in a comment on the task #%d' => '', - // 'Mentioned' => '', - // 'Compare Estimated Time vs Actual Time' => '', // 'Estimated hours: ' => '', // 'Actual hours: ' => '', // 'Hours Spent' => '', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php index a6de8bce..2aee696b 100644 --- a/app/Locale/th_TH/translations.php +++ b/app/Locale/th_TH/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'แสดงโปรเจคอื่น', 'Created by %s' => 'สร้างโดย %s', 'Tasks Export' => 'ส่งออกงาน', - 'Tasks exportation for "%s"' => 'ส่งออกงานสำหรับ "%s"', 'Start Date' => 'เริ่มวันที่', 'End Date' => 'สิ้นสุดวันที่', 'Execute' => 'ประมวลผล', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'งานย่อยใหม่', 'New attachment added "%s"' => 'เพิ่มการแนบใหม่ "%s"', 'New comment posted by %s' => 'ความคิดเห็นใหม่จาก %s', - 'New attachment' => 'การแนบใหม่', 'New comment' => 'ความคิดเห็นใหม่', 'Comment updated' => 'ปรับปรุงความคิดเห็น', 'New subtask' => 'งานย่อยใหม่', - 'Subtask updated' => 'ปรับปรุงงานย่อยแล้ว', - 'Task updated' => 'ปรับปรุงงานแล้ว', - 'Task closed' => 'ปิดงาน', - 'Task opened' => 'เปิดงาน', 'I want to receive notifications only for those projects:' => 'ฉันต้องการรับการแจ้งเตือนสำหรับโปรเจค:', 'view the task on Kanboard' => 'แสดงงานบน Kanboard', 'Public access' => 'การเข้าถึงสาธารณะ', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s ปรับปรุงงานแล้ว #%d', '%s created the task #%d' => '%s สร้างงานแล้ว #%d', '%s closed the task #%d' => '%s ปิดงานแล้ว #%d', - '%s open the task #%d' => '%s เปิดงานแล้ว #%d', - '%s moved the task #%d to the column "%s"' => '%s ย้ายงานแล้ว #%d ไปที่คอลัมน์ "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s ย้ายงานแล้ว #%d ไปตำแหน่ง %d ในคอลัมน์ที่ "%s"', + '%s opened the task #%d' => '%s เปิดงานแล้ว #%d', 'Activity' => 'กิจกรรม', 'Default values are "%s"' => 'ค่าเริ่มต้น "%s"', 'Default columns for new projects (Comma-separated)' => 'คอลัมน์เริ่มต้นสำหรับโปรเจคใหม่ (Comma-separated)', 'Task assignee change' => 'เปลี่ยนการกำหนดบุคคลของงาน', - '%s change the assignee of the task #%d to %s' => '%s เปลี่ยนผู้รับผิดชอบของงาน #%d เป็น %s', + '%s changed the assignee of the task #%d to %s' => '%s เปลี่ยนผู้รับผิดชอบของงาน #%d เป็น %s', '%s changed the assignee of the task %s to %s' => '%s เปลี่ยนผู้รับผิดชอบของงาน %s เป็น %s', 'New password for the user "%s"' => 'รหัสผ่านใหม่สำหรับผู้ใช้ "%s"', 'Choose an event' => 'เลือกเหตุการณ์', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'เปอร์เซ็นต์', 'Number of tasks' => 'จำนวนงาน', 'Task distribution' => 'การกระจายงาน', - 'Reportings' => 'รายงาน', - // 'Task repartition for "%s"' => '', 'Analytics' => 'การวิเคราะห์', 'Subtask' => 'งานย่อย', 'My subtasks' => 'งานย่อยของฉัน', 'User repartition' => 'การแบ่งงานของผู้ใช้', - 'User repartition for "%s"' => 'การแบ่งงานของผู้ใช้ "%s"', 'Clone this project' => 'เลียนแบบโปรเจคนี้', 'Column removed successfully.' => 'ลบคอลัมน์สำเร็จ', 'Not enough data to show the graph.' => 'ไม่มีข้อมูลแสดงเป็นกราฟ', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'ค่านี้ต้องเป็นตัวเลข', 'Unable to create this task.' => 'ไม่สามารถสร้างงานนี้', 'Cumulative flow diagram' => 'แผนภาพงานสะสม', - 'Cumulative flow diagram for "%s"' => 'แผนภาพงานสะสม "%s"', 'Daily project summary' => 'สรุปโปรเจครายวัน', 'Daily project summary export' => 'ส่งออกสรุปโปรเจครายวัน', - 'Daily project summary export for "%s"' => 'ส่งออกสรุปโปรเจครายวันสำหรับ "%s"', 'Exports' => 'ส่งออก', 'This export contains the number of tasks per column grouped per day.' => 'การส่งออกนี้เป็นการนับจำนวนงานในแต่ละคอลัมน์ในแต่ละวัน', 'Active swimlanes' => 'สวิมเลนพร้อมใช้งาน', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'รหัสงานย่อย', 'Subtasks' => 'งานย่อย', 'Subtasks Export' => 'ส่งออก งานย่อย', - 'Subtasks exportation for "%s"' => 'ส่งออกงานย่อยสำหรับ "%s"', 'Task Title' => 'ชื่องาน', 'Untitled' => 'ไม่มีชื่อ', 'Application default' => 'แอพพลิเคชันเริ่มต้น', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'เพิ่มอัตราค่าเงินเรียบร้อย', 'Unable to add this currency rate.' => 'ไม่สามารถเพิ่มค่าเงินนี้', // 'Webhook URL' => '', - '%s remove the assignee of the task %s' => '%s เอาผู้รับผิดชอบออกจากงาน %s', + '%s removed the assignee of the task %s' => '%s เอาผู้รับผิดชอบออกจากงาน %s', 'Enable Gravatar images' => 'สามารถใช้งานภาพ Gravatar', 'Information' => 'ข้อมูลสารสนเทศ', // 'Check two factor authentication code' => '', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'ทดสอบอุปกรณ์ของคุณ', 'Assign a color when the task is moved to a specific column' => 'กำหนดสีเมื่องานถูกย้ายไปคอลัมน์ที่กำหนดไว้', // '%s via Kanboard' => '', - 'Burndown chart for "%s"' => 'แผนภูมิงานกับเวลา "%s"', 'Burndown chart' => 'แผนภูมิงานกับเวลา', 'This chart show the task complexity over the time (Work Remaining).' => 'แผนภูมิแสดงความซับซ้อนของงานตามเวลา (งานที่เหลือ)', 'Screenshot taken %s' => 'จับภาพหน้าจอ %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'ย้ายงานไปคอลัมน์อื่นเมื่อหมวดถูกเปลี่ยน', 'Send a task by email to someone' => 'ส่งงานโดยถึงบางคน', 'Reopen a task' => 'เปิดงานอีกครั้ง', - 'Column change' => 'เปลี่ยนคอลัมน์', - 'Position change' => 'เปลี่ยนตำแหน่ง', - 'Swimlane change' => 'เปลี่ยนสวิมเลน', - 'Assignee change' => 'เปลี่ยนการผู้รับผิดชอบ', - '[%s] Overdue tasks' => '[%s] งานที่เกินกำหนด', 'Notification' => 'แจ้งเตือน', '%s moved the task #%d to the first swimlane' => '%s ย้ายงาน #%d ไปสวินเลนแรก', - '%s moved the task #%d to the swimlane "%s"' => '%s ย้ายงาน #%d ไปสวินเลน "%s"', 'Swimlane' => 'สวิมเลน', 'Gravatar' => 'รูปแทนตัว', '%s moved the task %s to the first swimlane' => '%s ย้ายงาน %s ไปสวินเลนแรก', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'ค้นหาตามหมวด: ', 'Search by description: ' => 'ค้นหาตามคำอธิบาย: ', 'Search by due date: ' => 'ค้นหาตามวันครบกำหนด: ', - 'Lead and Cycle time for "%s"' => 'เวลานำและรอบเวลาสำหรับ "%s"', - 'Average time spent into each column for "%s"' => 'ค่าเฉลี่ยเวลาที่ใช้แต่ละคอลัมน์สำหรับ "%s"', 'Average time spent into each column' => 'ค่าเฉลี่ยเวลาที่ใช้แต่ละคอลัมน์', 'Average time spent' => 'ค่าเฉลี่ยเวลาที่ใช้', 'This chart show the average time spent into each column for the last %d tasks.' => 'แผนภูมิแสดงค่าเฉลี่ยเวลาที่ใช้แต่ละคอลัมน์สำหรับ %d งานล่าสุด', @@ -800,7 +777,6 @@ return array( 'License:' => 'สัญญาอนุญาต:', 'License' => 'สัญญาอนุญาต', 'Enter the text below' => 'พิมพ์ข้อความด้านล่าง', - 'Gantt chart for %s' => 'แผนภูมิแกรนท์สำหรับ %s', 'Sort by position' => 'เรียงตามตำแหน่ง', 'Sort by date' => 'เรียงตามวัน', 'Add task' => 'เพิ่มงาน', @@ -841,8 +817,6 @@ return array( 'Version' => 'เวอร์ชัน', 'Plugins' => 'ปลั๊กอิน', 'There is no plugin loaded.' => 'ไม่มีปลั๊กอินถูกโหลดไว้', - 'Set maximum column height' => 'กำหนดความสูงสูงสุดของคอลัมน์', - 'Remove maximum column height' => 'เอาความสูงสูงสุดของคอลัมน์ออก', 'My notifications' => 'การแจ้งเตือนของฉัน', 'Custom filters' => 'ตัวกรองกำหนดเอง', 'Your custom filter have been created successfully.' => 'ตัวกรองกำหนดเองของคุณสร้างเรียบร้อย', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'captcha ไม่ถูกต้อง', 'The name must be unique' => 'ชื่อต้องไม่ซ้ำ', 'View all groups' => 'แสดงกลุ่มทั้งหมด', - 'View group members' => 'แสดงสมาชิกกลุ่ม', // 'There is no user available.' => '', 'Do you really want to remove the user "%s" from the group "%s"?' => 'คุณต้องการลบผู้ใช้ "%s" ออกจากกลุ่ม "%s"?', 'There is no group.' => 'ไม่มีกลุ่ม', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'พิมพ์ชื่อกลุ่ม...', 'Role:' => 'บทบาท:', 'Project members' => 'สมาชิกโปรเจค', - 'Compare hours for "%s"' => 'เปรียบเทียบรายชั่วโมงสำหรับ %s', '%s mentioned you in the task #%d' => '%s กล่าวถึงคุณในงาน #%d', '%s mentioned you in a comment on the task #%d' => '%s กล่าวถึงคุณในความคิดเห็นของงาน #%d', 'You were mentioned in the task #%d' => 'คุณได้รับการกล่าวถึงในงาน #%d', 'You were mentioned in a comment on the task #%d' => 'คุณได้รับการกล่าวถึงในความคิดเห็นของงาน #%d', - 'Mentioned' => 'กล่าวถึง', - 'Compare Estimated Time vs Actual Time' => 'เปรียบเทียบเวลาโดยประมาณกับเวลาที่เกิดขึ้นจริง', 'Estimated hours: ' => 'เวลาโดยประมาณ:', 'Actual hours: ' => 'เวลาที่เกิดขึ้นจริง:', 'Hours Spent' => 'เวลาที่ใช้', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php index 35e29649..69642b58 100644 --- a/app/Locale/tr_TR/translations.php +++ b/app/Locale/tr_TR/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => 'Başka bir proje göster', 'Created by %s' => '%s tarafından oluşturuldu', 'Tasks Export' => 'Görevleri dışa aktar', - 'Tasks exportation for "%s"' => '"%s" için görevleri dışa aktar', 'Start Date' => 'Başlangıç tarihi', 'End Date' => 'Bitiş tarihi', 'Execute' => 'Gerçekleştir', @@ -322,14 +321,9 @@ return array( 'New sub-task' => 'Yeni alt görev', 'New attachment added "%s"' => 'Yeni dosya "%s" eklendi.', 'New comment posted by %s' => '%s tarafından yeni yorum eklendi', - 'New attachment' => 'Yeni dosya eki', 'New comment' => 'Yeni yorum', 'Comment updated' => 'Yorum güncellendi', 'New subtask' => 'Yeni alt görev', - 'Subtask updated' => 'Alt görev güncellendi', - 'Task updated' => 'Görev güncellendi', - 'Task closed' => 'Görev kapatıldı', - 'Task opened' => 'Görev açıldı', 'I want to receive notifications only for those projects:' => 'Yalnızca bu projelerle ilgili bildirim almak istiyorum:', 'view the task on Kanboard' => 'bu görevi Kanboard üzerinde göster', 'Public access' => 'Dışa açık erişim', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s kullanıcısı #%d nolu görevi güncelledi', '%s created the task #%d' => '%s kullanıcısı #%d nolu görevi oluşturdu', '%s closed the task #%d' => '%s kullanıcısı #%d nolu görevi kapattı', - '%s open the task #%d' => '%s kullanıcısı #%d nolu görevi açtı', - '%s moved the task #%d to the column "%s"' => '%s kullanıcısı #%d nolu görevi "%s" sütununa taşıdı', - '%s moved the task #%d to the position %d in the column "%s"' => '%s kullanıcısı #%d nolu görevi %d pozisyonu "%s" sütununa taşıdı', + '%s opened the task #%d' => '%s kullanıcısı #%d nolu görevi açtı', 'Activity' => 'Aktivite', 'Default values are "%s"' => 'Varsayılan değerler "%s"', 'Default columns for new projects (Comma-separated)' => 'Yeni projeler için varsayılan sütunlar (virgül ile ayrılmış)', 'Task assignee change' => 'Göreve atanan kullanıcı değişikliği', - '%s change the assignee of the task #%d to %s' => '%s kullanıcısı #%d nolu görevin sorumlusunu %s olarak değiştirdi', + '%s changed the assignee of the task #%d to %s' => '%s kullanıcısı #%d nolu görevin sorumlusunu %s olarak değiştirdi', '%s changed the assignee of the task %s to %s' => '%s kullanıcısı %s görevinin sorumlusunu %s olarak değiştirdi', 'New password for the user "%s"' => '"%s" kullanıcısı için yeni şifre', 'Choose an event' => 'Bir durum seçin', @@ -442,13 +434,10 @@ return array( 'Percentage' => 'Yüzde', 'Number of tasks' => 'Görev sayısı', 'Task distribution' => 'Görev dağılımı', - 'Reportings' => 'Raporlar', - 'Task repartition for "%s"' => '"%s" için görev dağılımı', 'Analytics' => 'Analiz', 'Subtask' => 'Alt görev', 'My subtasks' => 'Alt görevlerim', 'User repartition' => 'Kullanıcı dağılımı', - 'User repartition for "%s"' => '"%s" için kullanıcı dağılımı', 'Clone this project' => 'Projenin kopyasını oluştur', 'Column removed successfully.' => 'Sütun başarıyla kaldırıldı.', 'Not enough data to show the graph.' => 'Grafik gösterimi için yeterli veri yok.', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => 'Bu değer sayı olmalı', 'Unable to create this task.' => 'Bu görev oluşturulamıyor.', 'Cumulative flow diagram' => 'Kümülatif akış diyagramı', - 'Cumulative flow diagram for "%s"' => '"%s" için kümülatif akış diyagramı', 'Daily project summary' => 'Günlük proje özeti', 'Daily project summary export' => 'Günlük proje özetini dışa aktar', - 'Daily project summary export for "%s"' => '"%s" için günlük proje özetinin dışa', 'Exports' => 'Dışa aktarımlar', 'This export contains the number of tasks per column grouped per day.' => 'Bu dışa aktarım günlük gruplanmış olarak her sütundaki görev sayısını içerir.', 'Active swimlanes' => 'Aktif Kulvar', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => 'Alt görev No:', 'Subtasks' => 'Alt görevler', 'Subtasks Export' => 'Alt görevleri dışa aktar', - 'Subtasks exportation for "%s"' => '"%s" için alt görevleri dışa aktarımı', 'Task Title' => 'Görev Başlığı', 'Untitled' => 'Başlıksız', 'Application default' => 'Uygulama varsayılanları', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => 'Kur başarıyla eklendi', 'Unable to add this currency rate.' => 'Bu kur eklenemedi', // 'Webhook URL' => '', - '%s remove the assignee of the task %s' => '%s, %s görevinin atanan bilgisini kaldırdı', + '%s removed the assignee of the task %s' => '%s, %s görevinin atanan bilgisini kaldırdı', 'Enable Gravatar images' => 'Gravatar resimlerini kullanıma aç', 'Information' => 'Bilgi', 'Check two factor authentication code' => 'İki kademeli doğrulama kodunu kontrol et', @@ -615,7 +601,6 @@ return array( 'Test your device' => 'Cihazınızı test edin', 'Assign a color when the task is moved to a specific column' => 'Görev belirli bir sütuna taşındığında rengini değiştir', '%s via Kanboard' => '%s Kanboard ile', - 'Burndown chart for "%s"' => '%s icin kalan iş grafiği', 'Burndown chart' => 'Kalan iş grafiği', 'This chart show the task complexity over the time (Work Remaining).' => 'Bu grafik zorluk seviyesini zamana göre gösterir (kalan iş)', 'Screenshot taken %s' => 'Ekran görüntüsü alındı %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => 'Kategori değiştirildiğinde görevi başka sütuna taşı', 'Send a task by email to someone' => 'Bir görevi email ile birine gönder', 'Reopen a task' => 'Bir görevi tekrar aç', - 'Column change' => 'Sütun değişikliği', - 'Position change' => 'Konum değişikliği', - 'Swimlane change' => 'Kulvar değişikliği', - 'Assignee change' => 'Atanan değişikliği', - '[%s] Overdue tasks' => '[%s] Gecikmiş görevler', 'Notification' => 'Uyarılar', '%s moved the task #%d to the first swimlane' => '%s, #%d görevini birinci kulvara taşıdı', - '%s moved the task #%d to the swimlane "%s"' => '%s, #%d görevini "%s" kulvarına taşıdı', 'Swimlane' => 'Kulvar', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s, %s görevini ilk kulvara taşıdı', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => 'Kategoriye göre ara', 'Search by description: ' => 'Açıklamaya göre ara', 'Search by due date: ' => 'Tamamlanma tarihine göre ara', - 'Lead and Cycle time for "%s"' => '"%s" için teslim ve çevrim süresi', - 'Average time spent into each column for "%s"' => '"%s" için her bir sütunda geçirilen ortalama zaman', 'Average time spent into each column' => 'Her bir sütunda geçirilen ortalama zaman', 'Average time spent' => 'Harcanan ortalama zaman', 'This chart show the average time spent into each column for the last %d tasks.' => 'Bu grafik son %d görev için her bir sütunda geçirilen ortalama zamanı gösterir.', @@ -800,7 +777,6 @@ return array( 'License:' => 'Lisans:', 'License' => 'Lisans', 'Enter the text below' => 'Aşağıdaki metni girin', - 'Gantt chart for %s' => '%s için Gantt diyagramı', 'Sort by position' => 'Pozisyona göre sırala', 'Sort by date' => 'Tarihe göre sırala', 'Add task' => 'Görev ekle', @@ -841,8 +817,6 @@ return array( 'Version' => 'Versiyon', 'Plugins' => 'Eklentiler', 'There is no plugin loaded.' => 'Yüklenmiş bir eklendi yok', - 'Set maximum column height' => 'Maksimum sütun yüksekliğini belirle', - 'Remove maximum column height' => 'Maksimum sütun yüksekliğini iptal et', 'My notifications' => 'Bildirimlerim', 'Custom filters' => 'Özel filtreler', 'Your custom filter have been created successfully.' => 'Özel filtreleriniz başarıyla oluşturuldu.', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => 'Geçersiz captcha', 'The name must be unique' => 'İsim tekil olmalı', 'View all groups' => 'Tüm grupları görüntüle', - 'View group members' => 'Grup üyelerini görüntüle', 'There is no user available.' => 'Uygun üye yok', 'Do you really want to remove the user "%s" from the group "%s"?' => '"%s" kullanıcısını "%s" grubundan çıkarmak istediğinize emin misiniz?', 'There is no group.' => 'Hiç grup yok.', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => 'Grup adını girin...', 'Role:' => 'Rol:', 'Project members' => 'Proje üyeleri', - 'Compare hours for "%s"' => '"%s" için saatleri karşılaştır', '%s mentioned you in the task #%d' => '%s sizden #%d görevinde bahsetti', '%s mentioned you in a comment on the task #%d' => '%s sizden #%d görevindeki bir yorumda bahsetti', 'You were mentioned in the task #%d' => '#%d görevinde sizden bahsedildi', 'You were mentioned in a comment on the task #%d' => '#%d görevindeki bir yorumda sizden bahsedildi', - 'Mentioned' => 'Bahsedilmiş', - 'Compare Estimated Time vs Actual Time' => 'Tahmini süre ile gerçekleşen süreyi karşılaştır', 'Estimated hours: ' => 'Tahmini saat:', 'Actual hours: ' => 'Gerçekleşen saat:', 'Hours Spent' => 'Harcanan saat', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php index 0ef01ef7..a4adece7 100644 --- a/app/Locale/zh_CN/translations.php +++ b/app/Locale/zh_CN/translations.php @@ -299,7 +299,6 @@ return array( 'Display another project' => '显示其它项目', 'Created by %s' => '创建者:%s', 'Tasks Export' => '任务导出', - 'Tasks exportation for "%s"' => '导出"%s"的任务', 'Start Date' => '开始时间', 'End Date' => '结束时间', 'Execute' => '执行', @@ -322,14 +321,9 @@ return array( 'New sub-task' => '新建子任务', 'New attachment added "%s"' => '新附件已添加"%s"', 'New comment posted by %s' => '%s 的新评论', - 'New attachment' => '新建附件', 'New comment' => '新建评论', 'Comment updated' => '更新了评论', 'New subtask' => '新建子任务', - 'Subtask updated' => '子任务更新', - 'Task updated' => '任务更新', - 'Task closed' => '任务关闭', - 'Task opened' => '任务开启', 'I want to receive notifications only for those projects:' => '我仅需要收到下面项目的通知:', 'view the task on Kanboard' => '在看板中查看此任务', 'Public access' => '公开访问', @@ -386,14 +380,12 @@ return array( '%s updated the task #%d' => '%s 更新了任务 #%d', '%s created the task #%d' => '%s 创建了任务 #%d', '%s closed the task #%d' => '%s 关闭了任务 #%d', - '%s open the task #%d' => '%s 开启了任务 #%d', - '%s moved the task #%d to the column "%s"' => '%s 将任务 #%d 移动到栏目 "%s"', - '%s moved the task #%d to the position %d in the column "%s"' => '%s将任务#%d移动到"%s"的第 %d 列', + '%s opened the task #%d' => '%s 开启了任务 #%d', 'Activity' => '动态', 'Default values are "%s"' => '默认值为 "%s"', 'Default columns for new projects (Comma-separated)' => '新建项目的默认栏目(用逗号分开)', 'Task assignee change' => '任务分配变更', - '%s change the assignee of the task #%d to %s' => '%s 将任务 #%d 分配给了 %s', + '%s changed the assignee of the task #%d to %s' => '%s 将任务 #%d 分配给了 %s', '%s changed the assignee of the task %s to %s' => '%s 将任务 %s 分配给 %s', 'New password for the user "%s"' => '用户"%s"的新密码', 'Choose an event' => '选择一个事件', @@ -442,13 +434,10 @@ return array( 'Percentage' => '百分比', 'Number of tasks' => '任务数', 'Task distribution' => '任务分布', - 'Reportings' => '报告', - 'Task repartition for "%s"' => '"%s"的任务分析', 'Analytics' => '分析', 'Subtask' => '子任务', 'My subtasks' => '我的子任务', 'User repartition' => '用户分析', - 'User repartition for "%s"' => '"%s"的用户分析', 'Clone this project' => '复制此项目', 'Column removed successfully.' => '成功删除了栏目。', 'Not enough data to show the graph.' => '数据不足,无法绘图。', @@ -465,10 +454,8 @@ return array( 'This value must be numeric' => '这个值必须为数字', 'Unable to create this task.' => '无法创建此任务。', 'Cumulative flow diagram' => '累积流图表', - 'Cumulative flow diagram for "%s"' => '"%s"的累积流图表', 'Daily project summary' => '每日项目汇总', 'Daily project summary export' => '导出每日项目汇总', - 'Daily project summary export for "%s"' => '导出项目"%s"的每日汇总', 'Exports' => '导出', 'This export contains the number of tasks per column grouped per day.' => '此导出包含每列的任务数,按天分组', 'Active swimlanes' => '活动里程碑', @@ -494,7 +481,6 @@ return array( 'Subtask Id' => '子任务 Id', 'Subtasks' => '子任务', 'Subtasks Export' => '子任务导出', - 'Subtasks exportation for "%s"' => '导出"%s"的子任务', 'Task Title' => '任务标题', 'Untitled' => '无标题', 'Application default' => '程序默认', @@ -601,7 +587,7 @@ return array( 'The currency rate have been added successfully.' => '成功添加汇率。', 'Unable to add this currency rate.' => '无法添加此汇率', 'Webhook URL' => '网络钩子 URL', - '%s remove the assignee of the task %s' => '%s删除了任务%s的负责人', + '%s removed the assignee of the task %s' => '%s删除了任务%s的负责人', 'Enable Gravatar images' => '启用 Gravatar 图像', 'Information' => '信息', 'Check two factor authentication code' => '检查双重认证码', @@ -615,7 +601,6 @@ return array( 'Test your device' => '测试设备', 'Assign a color when the task is moved to a specific column' => '任务移动到指定栏目时设置颜色', '%s via Kanboard' => '%s 通过KanBoard', - 'Burndown chart for "%s"' => '燃尽图:"%s"', 'Burndown chart' => '燃尽图', 'This chart show the task complexity over the time (Work Remaining).' => '图表显示任务随时间(剩余时间)的复杂度', 'Screenshot taken %s' => '已截图 %s', @@ -680,14 +665,8 @@ return array( 'Move the task to another column when the category is changed' => '当任务分类改变时移动到任务栏', 'Send a task by email to someone' => '发送任务邮件到用户', 'Reopen a task' => '重新开始一个任务', - 'Column change' => '任务栏改变', - 'Position change' => '位置改变', - 'Swimlane change' => '里程碑改变', - 'Assignee change' => '指派人改变', - '[%s] Overdue tasks' => '[%s] 超期任务', 'Notification' => '通知', '%s moved the task #%d to the first swimlane' => '%s将任务#%d移动到了首个里程碑', - '%s moved the task #%d to the swimlane "%s"' => '%s将任务#%d移动到了里程碑"%s"下', 'Swimlane' => '里程碑', 'Gravatar' => 'Gravatar头像', '%s moved the task %s to the first swimlane' => '%s将任务%s移动到了首个里程碑', @@ -758,8 +737,6 @@ return array( 'Search by category: ' => '按分类:', 'Search by description: ' => '按描述:', 'Search by due date: ' => '按超期时间:', - // 'Lead and Cycle time for "%s"' => '', - 'Average time spent into each column for "%s"' => '"%s"在每个任务栏下平均花费时间', 'Average time spent into each column' => '每个任务栏平均花费时间', 'Average time spent' => '平均花费时间', 'This chart show the average time spent into each column for the last %d tasks.' => '当前柱状图表示最新%d条任务在每个任务栏下的平均花费时间', @@ -800,7 +777,6 @@ return array( 'License:' => '授权许可:', 'License' => '授权许可', 'Enter the text below' => '输入下方的文本', - 'Gantt chart for %s' => '%s的甘特图', 'Sort by position' => '按位置排序', 'Sort by date' => '按日期排序', 'Add task' => '添加任务', @@ -841,8 +817,6 @@ return array( 'Version' => '版本', 'Plugins' => '插件', 'There is no plugin loaded.' => '当前没有插件载入', - 'Set maximum column height' => '设置任务栏最大高度', - 'Remove maximum column height' => '移除任务栏最大高度', 'My notifications' => '我的通知', 'Custom filters' => '自定义过滤器', 'Your custom filter have been created successfully.' => '成功创建过滤器', @@ -947,7 +921,6 @@ return array( 'Invalid captcha' => '验证码无效', 'The name must be unique' => '请确保用户名唯一', 'View all groups' => '查看所有用户组', - 'View group members' => '查看该组所有用户', 'There is no user available.' => '当前没有有效用户', 'Do you really want to remove the user "%s" from the group "%s"?' => '你确定把用户"%s"从"%s"中移除?', 'There is no group.' => '当前没有用户组', @@ -968,13 +941,10 @@ return array( 'Enter group name...' => '输入用户组名称...', 'Role:' => '角色:', 'Project members' => '项目成员', - 'Compare hours for "%s"' => '比较"%s"的时间', '%s mentioned you in the task #%d' => '%s在任务#%d里提及你', '%s mentioned you in a comment on the task #%d' => '%s在任务#%d的评论里提及你', 'You were mentioned in the task #%d' => '你在任务#%d里被提及', 'You were mentioned in a comment on the task #%d' => '你在任务#%d的评论里被提及', - 'Mentioned' => '被提及', - 'Compare Estimated Time vs Actual Time' => '对比预估时间VS实际时间', 'Estimated hours: ' => '预估小时数', 'Actual hours: ' => '实际小时数', 'Hours Spent' => '花费小时数', @@ -1216,5 +1186,32 @@ return array( // 'Global tags' => '', // 'There is no global tag at the moment.' => '', // 'This field cannot be empty' => '', + // 'Close a task when there is no activity in an specific column' => '', + // '%s removed a subtask for the task #%d' => '', + // '%s removed a comment on the task #%d' => '', + // 'Comment removed on task #%d' => '', + // 'Subtask removed on task #%d' => '', // 'Hide tasks in this column in the dashboard' => '', + // '%s removed a comment on the task %s' => '', + // '%s removed a subtask for the task %s' => '', + // 'Comment removed' => '', + // 'Subtask removed' => '', + // '%s set a new internal link for the task #%d' => '', + // '%s removed an internal link for the task #%d' => '', + // 'A new internal link for the task #%d have been defined' => '', + // 'Internal link removed for the task #%d' => '', + // '%s set a new internal link for the task %s' => '', + // '%s removed an internal link for the task %s' => '', + // 'Automatically set the due date on task creation' => '', + // 'Move the task to another column when closed' => '', + // 'Move the task to another column when not moved during a given period' => '', + // 'Dashboard for %s' => '', + // 'Tasks overview for %s' => '', + // 'Subtasks overview for %s' => '', + // 'Projects overview for %s' => '', + // 'Activity stream for %s' => '', + // 'Calendar for %s' => '', + // 'Notifications for %s' => '', + // 'Subtasks export' => '', + // 'Tasks exportation' => '', ); diff --git a/app/Model/CommentModel.php b/app/Model/CommentModel.php index 4231f29d..a9e48bd3 100644 --- a/app/Model/CommentModel.php +++ b/app/Model/CommentModel.php @@ -2,7 +2,6 @@ namespace Kanboard\Model; -use Kanboard\Event\CommentEvent; use Kanboard\Core\Base; /** @@ -27,6 +26,7 @@ class CommentModel extends Base */ const EVENT_UPDATE = 'comment.update'; const EVENT_CREATE = 'comment.create'; + const EVENT_DELETE = 'comment.delete'; const EVENT_USER_MENTION = 'comment.user.mention'; /** @@ -130,9 +130,7 @@ class CommentModel extends Base $comment_id = $this->db->table(self::TABLE)->persist($values); if ($comment_id !== false) { - $event = new CommentEvent(array('id' => $comment_id) + $values); - $this->dispatcher->dispatch(self::EVENT_CREATE, $event); - $this->userMentionModel->fireEvents($values['comment'], self::EVENT_USER_MENTION, $event); + $this->queueManager->push($this->commentEventJob->withParams($comment_id, self::EVENT_CREATE)); } return $comment_id; @@ -153,7 +151,7 @@ class CommentModel extends Base ->update(array('comment' => $values['comment'])); if ($result) { - $this->container['dispatcher']->dispatch(self::EVENT_UPDATE, new CommentEvent($values)); + $this->queueManager->push($this->commentEventJob->withParams($values['id'], self::EVENT_UPDATE)); } return $result; @@ -168,6 +166,7 @@ class CommentModel extends Base */ public function remove($comment_id) { + $this->commentEventJob->execute($comment_id, self::EVENT_DELETE); return $this->db->table(self::TABLE)->eq('id', $comment_id)->remove(); } } diff --git a/app/Model/FileModel.php b/app/Model/FileModel.php index 8cdea9a0..98032f9d 100644 --- a/app/Model/FileModel.php +++ b/app/Model/FileModel.php @@ -5,7 +5,6 @@ namespace Kanboard\Model; use Exception; use Kanboard\Core\Base; use Kanboard\Core\Thumbnail; -use Kanboard\Event\FileEvent; use Kanboard\Core\ObjectStorage\ObjectStorageException; /** @@ -44,13 +43,13 @@ abstract class FileModel extends Base abstract protected function getPathPrefix(); /** - * Get event name + * Fire file creation event * * @abstract * @access protected - * @return string + * @param integer $file_id */ - abstract protected function getEventName(); + abstract protected function fireCreationEvent($file_id); /** * Get PicoDb query to get all files @@ -130,16 +129,16 @@ abstract class FileModel extends Base * Create a file entry in the database * * @access public - * @param integer $id Foreign key - * @param string $name Filename - * @param string $path Path on the disk - * @param integer $size File size + * @param integer $foreign_key_id Foreign key + * @param string $name Filename + * @param string $path Path on the disk + * @param integer $size File size * @return bool|integer */ - public function create($id, $name, $path, $size) + public function create($foreign_key_id, $name, $path, $size) { $values = array( - $this->getForeignKey() => $id, + $this->getForeignKey() => $foreign_key_id, 'name' => substr($name, 0, 255), 'path' => $path, 'is_image' => $this->isImage($name) ? 1 : 0, @@ -152,8 +151,7 @@ abstract class FileModel extends Base if ($result) { $file_id = (int) $this->db->getLastId(); - $event = new FileEvent($values + array('file_id' => $file_id)); - $this->dispatcher->dispatch($this->getEventName(), $event); + $this->fireCreationEvent($file_id); return $file_id; } diff --git a/app/Model/GroupModel.php b/app/Model/GroupModel.php index 0a975570..b43423b3 100644 --- a/app/Model/GroupModel.php +++ b/app/Model/GroupModel.php @@ -116,4 +116,23 @@ class GroupModel extends Base { return $this->db->table(self::TABLE)->eq('id', $values['id'])->update($values); } + + /** + * Get groupId from externalGroupId and create the group if not found + * + * @access public + * @param string $name + * @param string $external_id + * @return bool|integer + */ + public function getOrCreateExternalGroupId($name, $external_id) + { + $group_id = $this->db->table(self::TABLE)->eq('external_id', $external_id)->findOneColumn('id'); + + if (empty($group_id)) { + $group_id = $this->create($name, $external_id); + } + + return $group_id; + } } diff --git a/app/Model/NotificationModel.php b/app/Model/NotificationModel.php index 4d697b5e..803d4f18 100644 --- a/app/Model/NotificationModel.php +++ b/app/Model/NotificationModel.php @@ -3,9 +3,15 @@ namespace Kanboard\Model; use Kanboard\Core\Base; +use Kanboard\EventBuilder\CommentEventBuilder; +use Kanboard\EventBuilder\EventIteratorBuilder; +use Kanboard\EventBuilder\SubtaskEventBuilder; +use Kanboard\EventBuilder\TaskEventBuilder; +use Kanboard\EventBuilder\TaskFileEventBuilder; +use Kanboard\EventBuilder\TaskLinkEventBuilder; /** - * Notification + * Notification Model * * @package Kanboard\Model * @author Frederic Guillot @@ -16,158 +22,79 @@ class NotificationModel extends Base * Get the event title with author * * @access public - * @param string $event_author - * @param string $event_name - * @param array $event_data + * @param string $eventAuthor + * @param string $eventName + * @param array $eventData * @return string */ - public function getTitleWithAuthor($event_author, $event_name, array $event_data) + public function getTitleWithAuthor($eventAuthor, $eventName, array $eventData) { - switch ($event_name) { - case TaskModel::EVENT_ASSIGNEE_CHANGE: - $assignee = $event_data['task']['assignee_name'] ?: $event_data['task']['assignee_username']; + foreach ($this->getIteratorBuilder() as $builder) { + $title = $builder->buildTitleWithAuthor($eventAuthor, $eventName, $eventData); - if (! empty($assignee)) { - return e('%s change the assignee of the task #%d to %s', $event_author, $event_data['task']['id'], $assignee); - } - - return e('%s remove the assignee of the task %s', $event_author, e('#%d', $event_data['task']['id'])); - case TaskModel::EVENT_UPDATE: - return e('%s updated the task #%d', $event_author, $event_data['task']['id']); - case TaskModel::EVENT_CREATE: - return e('%s created the task #%d', $event_author, $event_data['task']['id']); - case TaskModel::EVENT_CLOSE: - return e('%s closed the task #%d', $event_author, $event_data['task']['id']); - case TaskModel::EVENT_OPEN: - return e('%s open the task #%d', $event_author, $event_data['task']['id']); - case TaskModel::EVENT_MOVE_COLUMN: - return e( - '%s moved the task #%d to the column "%s"', - $event_author, - $event_data['task']['id'], - $event_data['task']['column_title'] - ); - case TaskModel::EVENT_MOVE_POSITION: - return e( - '%s moved the task #%d to the position %d in the column "%s"', - $event_author, - $event_data['task']['id'], - $event_data['task']['position'], - $event_data['task']['column_title'] - ); - case TaskModel::EVENT_MOVE_SWIMLANE: - if ($event_data['task']['swimlane_id'] == 0) { - return e('%s moved the task #%d to the first swimlane', $event_author, $event_data['task']['id']); - } - - return e( - '%s moved the task #%d to the swimlane "%s"', - $event_author, - $event_data['task']['id'], - $event_data['task']['swimlane_name'] - ); - case SubtaskModel::EVENT_UPDATE: - return e('%s updated a subtask for the task #%d', $event_author, $event_data['task']['id']); - case SubtaskModel::EVENT_CREATE: - return e('%s created a subtask for the task #%d', $event_author, $event_data['task']['id']); - case CommentModel::EVENT_UPDATE: - return e('%s updated a comment on the task #%d', $event_author, $event_data['task']['id']); - case CommentModel::EVENT_CREATE: - return e('%s commented on the task #%d', $event_author, $event_data['task']['id']); - case TaskFileModel::EVENT_CREATE: - return e('%s attached a file to the task #%d', $event_author, $event_data['task']['id']); - case TaskModel::EVENT_USER_MENTION: - return e('%s mentioned you in the task #%d', $event_author, $event_data['task']['id']); - case CommentModel::EVENT_USER_MENTION: - return e('%s mentioned you in a comment on the task #%d', $event_author, $event_data['task']['id']); - default: - return e('Notification'); + if ($title !== '') { + return $title; + } } + + return e('Notification'); } /** * Get the event title without author * * @access public - * @param string $event_name - * @param array $event_data + * @param string $eventName + * @param array $eventData * @return string */ - public function getTitleWithoutAuthor($event_name, array $event_data) + public function getTitleWithoutAuthor($eventName, array $eventData) { - switch ($event_name) { - case TaskFileModel::EVENT_CREATE: - return e('New attachment on task #%d: %s', $event_data['file']['task_id'], $event_data['file']['name']); - case CommentModel::EVENT_CREATE: - return e('New comment on task #%d', $event_data['comment']['task_id']); - case CommentModel::EVENT_UPDATE: - return e('Comment updated on task #%d', $event_data['comment']['task_id']); - case SubtaskModel::EVENT_CREATE: - return e('New subtask on task #%d', $event_data['subtask']['task_id']); - case SubtaskModel::EVENT_UPDATE: - return e('Subtask updated on task #%d', $event_data['subtask']['task_id']); - case TaskModel::EVENT_CREATE: - return e('New task #%d: %s', $event_data['task']['id'], $event_data['task']['title']); - case TaskModel::EVENT_UPDATE: - return e('Task updated #%d', $event_data['task']['id']); - case TaskModel::EVENT_CLOSE: - return e('Task #%d closed', $event_data['task']['id']); - case TaskModel::EVENT_OPEN: - return e('Task #%d opened', $event_data['task']['id']); - case TaskModel::EVENT_MOVE_COLUMN: - return e('Column changed for task #%d', $event_data['task']['id']); - case TaskModel::EVENT_MOVE_POSITION: - return e('New position for task #%d', $event_data['task']['id']); - case TaskModel::EVENT_MOVE_SWIMLANE: - return e('Swimlane changed for task #%d', $event_data['task']['id']); - case TaskModel::EVENT_ASSIGNEE_CHANGE: - return e('Assignee changed on task #%d', $event_data['task']['id']); - case TaskModel::EVENT_OVERDUE: - $nb = count($event_data['tasks']); - return $nb > 1 ? e('%d overdue tasks', $nb) : e('Task #%d is overdue', $event_data['tasks'][0]['id']); - case TaskModel::EVENT_USER_MENTION: - return e('You were mentioned in the task #%d', $event_data['task']['id']); - case CommentModel::EVENT_USER_MENTION: - return e('You were mentioned in a comment on the task #%d', $event_data['task']['id']); - default: - return e('Notification'); + foreach ($this->getIteratorBuilder() as $builder) { + $title = $builder->buildTitleWithoutAuthor($eventName, $eventData); + + if ($title !== '') { + return $title; + } } + + return e('Notification'); } /** * Get task id from event * * @access public - * @param string $event_name - * @param array $event_data + * @param string $eventName + * @param array $eventData * @return integer */ - public function getTaskIdFromEvent($event_name, array $event_data) + public function getTaskIdFromEvent($eventName, array $eventData) { - switch ($event_name) { - case TaskFileModel::EVENT_CREATE: - return $event_data['file']['task_id']; - case CommentModel::EVENT_CREATE: - case CommentModel::EVENT_UPDATE: - return $event_data['comment']['task_id']; - case SubtaskModel::EVENT_CREATE: - case SubtaskModel::EVENT_UPDATE: - return $event_data['subtask']['task_id']; - case TaskModel::EVENT_CREATE: - case TaskModel::EVENT_UPDATE: - case TaskModel::EVENT_CLOSE: - case TaskModel::EVENT_OPEN: - case TaskModel::EVENT_MOVE_COLUMN: - case TaskModel::EVENT_MOVE_POSITION: - case TaskModel::EVENT_MOVE_SWIMLANE: - case TaskModel::EVENT_ASSIGNEE_CHANGE: - case CommentModel::EVENT_USER_MENTION: - case TaskModel::EVENT_USER_MENTION: - return $event_data['task']['id']; - case TaskModel::EVENT_OVERDUE: - return $event_data['tasks'][0]['id']; - default: - return 0; + if ($eventName === TaskModel::EVENT_OVERDUE) { + return $eventData['tasks'][0]['id']; } + + return isset($eventData['task']['id']) ? $eventData['task']['id'] : 0; + } + + /** + * Get iterator builder + * + * @access protected + * @return EventIteratorBuilder + */ + protected function getIteratorBuilder() + { + $iterator = new EventIteratorBuilder(); + $iterator + ->withBuilder(TaskEventBuilder::getInstance($this->container)) + ->withBuilder(CommentEventBuilder::getInstance($this->container)) + ->withBuilder(SubtaskEventBuilder::getInstance($this->container)) + ->withBuilder(TaskFileEventBuilder::getInstance($this->container)) + ->withBuilder(TaskLinkEventBuilder::getInstance($this->container)) + ; + + return $iterator; } } diff --git a/app/Model/ProjectDuplicationModel.php b/app/Model/ProjectDuplicationModel.php index 94b83c80..d32fa367 100644 --- a/app/Model/ProjectDuplicationModel.php +++ b/app/Model/ProjectDuplicationModel.php @@ -159,7 +159,7 @@ class ProjectDuplicationModel extends Base } /** - * Make sure that the creator of the duplicated project is alsp owner + * Make sure that the creator of the duplicated project is also owner * * @access private * @param integer $dst_project_id diff --git a/app/Model/ProjectFileModel.php b/app/Model/ProjectFileModel.php index b464bb2a..4de4d66d 100644 --- a/app/Model/ProjectFileModel.php +++ b/app/Model/ProjectFileModel.php @@ -61,14 +61,13 @@ class ProjectFileModel extends FileModel } /** - * Get event name + * Fire file creation event * - * @abstract * @access protected - * @return string + * @param integer $file_id */ - protected function getEventName() + protected function fireCreationEvent($file_id) { - return self::EVENT_CREATE; + $this->queueManager->push($this->projectFileEventJob->withParams($file_id, self::EVENT_CREATE)); } } diff --git a/app/Model/ProjectModel.php b/app/Model/ProjectModel.php index 850531c9..d2019b72 100644 --- a/app/Model/ProjectModel.php +++ b/app/Model/ProjectModel.php @@ -318,7 +318,7 @@ class ProjectModel extends Base public function getQueryColumnStats(array $project_ids) { if (empty($project_ids)) { - return $this->db->table(ProjectModel::TABLE)->limit(0); + return $this->db->table(ProjectModel::TABLE)->eq(ProjectModel::TABLE.'.id', 0); } return $this->db diff --git a/app/Model/SubtaskModel.php b/app/Model/SubtaskModel.php index a97bddbf..608ffce7 100644 --- a/app/Model/SubtaskModel.php +++ b/app/Model/SubtaskModel.php @@ -4,7 +4,6 @@ namespace Kanboard\Model; use PicoDb\Database; use Kanboard\Core\Base; -use Kanboard\Event\SubtaskEvent; /** * Subtask Model @@ -22,25 +21,13 @@ class SubtaskModel extends Base const TABLE = 'subtasks'; /** - * Task "done" status - * - * @var integer - */ - const STATUS_DONE = 2; - - /** - * Task "in progress" status - * - * @var integer - */ - const STATUS_INPROGRESS = 1; - - /** - * Task "todo" status + * Subtask status * * @var integer */ const STATUS_TODO = 0; + const STATUS_INPROGRESS = 1; + const STATUS_DONE = 2; /** * Events @@ -66,7 +53,7 @@ class SubtaskModel extends Base ->join(TaskModel::TABLE, 'id', 'task_id') ->findOneColumn(TaskModel::TABLE . '.project_id') ?: 0; } - + /** * Get available status * @@ -83,26 +70,6 @@ class SubtaskModel extends Base } /** - * Add subtask status status to the resultset - * - * @access public - * @param array $subtasks Subtasks - * @return array - */ - public function addStatusName(array $subtasks) - { - $status = $this->getStatusList(); - - foreach ($subtasks as &$subtask) { - $subtask['status_name'] = $status[$subtask['status']]; - $subtask['timer_start_date'] = isset($subtask['timer_start_date']) ? $subtask['timer_start_date'] : 0; - $subtask['is_timer_started'] = ! empty($subtask['timer_start_date']); - } - - return $subtasks; - } - - /** * Get the query to fetch subtasks assigned to a user * * @access public @@ -178,35 +145,6 @@ class SubtaskModel extends Base } /** - * Prepare data before insert/update - * - * @access public - * @param array $values Form values - */ - public function prepare(array &$values) - { - $this->helper->model->removeFields($values, array('another_subtask')); - $this->helper->model->resetFields($values, array('time_estimated', 'time_spent')); - } - - /** - * Prepare data before insert - * - * @access public - * @param array $values Form values - */ - public function prepareCreation(array &$values) - { - $this->prepare($values); - - $values['position'] = $this->getLastPosition($values['task_id']) + 1; - $values['status'] = isset($values['status']) ? $values['status'] : self::STATUS_TODO; - $values['time_estimated'] = isset($values['time_estimated']) ? $values['time_estimated'] : 0; - $values['time_spent'] = isset($values['time_spent']) ? $values['time_spent'] : 0; - $values['user_id'] = isset($values['user_id']) ? $values['user_id'] : 0; - } - - /** * Get the position of the last column for a given project * * @access public @@ -235,10 +173,8 @@ class SubtaskModel extends Base $subtask_id = $this->db->table(self::TABLE)->persist($values); if ($subtask_id !== false) { - $this->container['dispatcher']->dispatch( - self::EVENT_CREATE, - new SubtaskEvent(array('id' => $subtask_id) + $values) - ); + $this->subtaskTimeTrackingModel->updateTaskTimeTracking($values['task_id']); + $this->queueManager->push($this->subtaskEventJob->withParams($subtask_id, self::EVENT_CREATE)); } return $subtask_id; @@ -248,124 +184,24 @@ class SubtaskModel extends Base * Update * * @access public - * @param array $values Form values - * @param bool $fire_events If true, will be called an event + * @param array $values + * @param bool $fire_event * @return bool */ - public function update(array $values, $fire_events = true) + public function update(array $values, $fire_event = true) { $this->prepare($values); - $subtask = $this->getById($values['id']); $result = $this->db->table(self::TABLE)->eq('id', $values['id'])->save($values); - if ($result && $fire_events) { - $event = $subtask; - $event['changes'] = array_diff_assoc($values, $subtask); - $this->container['dispatcher']->dispatch(self::EVENT_UPDATE, new SubtaskEvent($event)); - } - - return $result; - } - - /** - * Close all subtasks of a task - * - * @access public - * @param integer $task_id - * @return boolean - */ - public function closeAll($task_id) - { - return $this->db->table(self::TABLE)->eq('task_id', $task_id)->update(array('status' => self::STATUS_DONE)); - } - - /** - * Save subtask position - * - * @access public - * @param integer $task_id - * @param integer $subtask_id - * @param integer $position - * @return boolean - */ - public function changePosition($task_id, $subtask_id, $position) - { - if ($position < 1 || $position > $this->db->table(self::TABLE)->eq('task_id', $task_id)->count()) { - return false; - } - - $subtask_ids = $this->db->table(self::TABLE)->eq('task_id', $task_id)->neq('id', $subtask_id)->asc('position')->findAllByColumn('id'); - $offset = 1; - $results = array(); + if ($result) { + $this->subtaskTimeTrackingModel->updateTaskTimeTracking($values['task_id']); - foreach ($subtask_ids as $current_subtask_id) { - if ($offset == $position) { - $offset++; + if ($fire_event) { + $this->queueManager->push($this->subtaskEventJob->withParams($values['id'], self::EVENT_UPDATE, $values)); } - - $results[] = $this->db->table(self::TABLE)->eq('id', $current_subtask_id)->update(array('position' => $offset)); - $offset++; - } - - $results[] = $this->db->table(self::TABLE)->eq('id', $subtask_id)->update(array('position' => $position)); - - return !in_array(false, $results, true); - } - - /** - * Change the status of subtask - * - * @access public - * @param integer $subtask_id - * @return boolean|integer - */ - public function toggleStatus($subtask_id) - { - $subtask = $this->getById($subtask_id); - $status = ($subtask['status'] + 1) % 3; - - $values = array( - 'id' => $subtask['id'], - 'status' => $status, - 'task_id' => $subtask['task_id'], - ); - - if (empty($subtask['user_id']) && $this->userSession->isLogged()) { - $values['user_id'] = $this->userSession->getId(); } - return $this->update($values) ? $status : false; - } - - /** - * Get the subtask in progress for this user - * - * @access public - * @param integer $user_id - * @return array - */ - public function getSubtaskInProgress($user_id) - { - return $this->db->table(self::TABLE) - ->eq('status', self::STATUS_INPROGRESS) - ->eq('user_id', $user_id) - ->findOne(); - } - - /** - * Return true if the user have a subtask in progress - * - * @access public - * @param integer $user_id - * @return boolean - */ - public function hasSubtaskInProgress($user_id) - { - return $this->configModel->get('subtask_restriction') == 1 && - $this->db->table(self::TABLE) - ->eq('status', self::STATUS_INPROGRESS) - ->eq('user_id', $user_id) - ->exists(); + return $result; } /** @@ -377,14 +213,8 @@ class SubtaskModel extends Base */ public function remove($subtask_id) { - $subtask = $this->getById($subtask_id); - $result = $this->db->table(self::TABLE)->eq('id', $subtask_id)->remove(); - - if ($result) { - $this->container['dispatcher']->dispatch(self::EVENT_DELETE, new SubtaskEvent($subtask)); - } - - return $result; + $this->subtaskEventJob->execute($subtask_id, self::EVENT_DELETE); + return $this->db->table(self::TABLE)->eq('id', $subtask_id)->remove(); } /** @@ -416,29 +246,51 @@ class SubtaskModel extends Base } /** - * Convert a subtask to a task + * Prepare data before insert/update * - * @access public - * @param integer $project_id - * @param integer $subtask_id - * @return integer + * @access protected + * @param array $values Form values */ - public function convertToTask($project_id, $subtask_id) + protected function prepare(array &$values) { - $subtask = $this->getById($subtask_id); + $this->helper->model->removeFields($values, array('another_subtask')); + $this->helper->model->resetFields($values, array('time_estimated', 'time_spent')); + } - $task_id = $this->taskCreationModel->create(array( - 'project_id' => $project_id, - 'title' => $subtask['title'], - 'time_estimated' => $subtask['time_estimated'], - 'time_spent' => $subtask['time_spent'], - 'owner_id' => $subtask['user_id'], - )); + /** + * Prepare data before insert + * + * @access protected + * @param array $values Form values + */ + protected function prepareCreation(array &$values) + { + $this->prepare($values); - if ($task_id !== false) { - $this->remove($subtask_id); + $values['position'] = $this->getLastPosition($values['task_id']) + 1; + $values['status'] = isset($values['status']) ? $values['status'] : self::STATUS_TODO; + $values['time_estimated'] = isset($values['time_estimated']) ? $values['time_estimated'] : 0; + $values['time_spent'] = isset($values['time_spent']) ? $values['time_spent'] : 0; + $values['user_id'] = isset($values['user_id']) ? $values['user_id'] : 0; + } + + /** + * Add subtask status status to the resultset + * + * @access public + * @param array $subtasks Subtasks + * @return array + */ + public function addStatusName(array $subtasks) + { + $status = $this->getStatusList(); + + foreach ($subtasks as &$subtask) { + $subtask['status_name'] = $status[$subtask['status']]; + $subtask['timer_start_date'] = isset($subtask['timer_start_date']) ? $subtask['timer_start_date'] : 0; + $subtask['is_timer_started'] = ! empty($subtask['timer_start_date']); } - return $task_id; + return $subtasks; } } diff --git a/app/Model/SubtaskPositionModel.php b/app/Model/SubtaskPositionModel.php new file mode 100644 index 00000000..3c26465d --- /dev/null +++ b/app/Model/SubtaskPositionModel.php @@ -0,0 +1,47 @@ +<?php + +namespace Kanboard\Model; + +use Kanboard\Core\Base; + +/** + * Class SubtaskPositionModel + * + * @package Kanboard\Model + * @author Frederic Guillot + */ +class SubtaskPositionModel extends Base +{ + /** + * Change subtask position + * + * @access public + * @param integer $task_id + * @param integer $subtask_id + * @param integer $position + * @return boolean + */ + public function changePosition($task_id, $subtask_id, $position) + { + if ($position < 1 || $position > $this->db->table(SubtaskModel::TABLE)->eq('task_id', $task_id)->count()) { + return false; + } + + $subtask_ids = $this->db->table(SubtaskModel::TABLE)->eq('task_id', $task_id)->neq('id', $subtask_id)->asc('position')->findAllByColumn('id'); + $offset = 1; + $results = array(); + + foreach ($subtask_ids as $current_subtask_id) { + if ($offset == $position) { + $offset++; + } + + $results[] = $this->db->table(SubtaskModel::TABLE)->eq('id', $current_subtask_id)->update(array('position' => $offset)); + $offset++; + } + + $results[] = $this->db->table(SubtaskModel::TABLE)->eq('id', $subtask_id)->update(array('position' => $position)); + + return !in_array(false, $results, true); + } +} diff --git a/app/Model/SubtaskStatusModel.php b/app/Model/SubtaskStatusModel.php new file mode 100644 index 00000000..c99d6055 --- /dev/null +++ b/app/Model/SubtaskStatusModel.php @@ -0,0 +1,88 @@ +<?php + +namespace Kanboard\Model; + +use Kanboard\Core\Base; + +/** + * Class SubtaskStatusModel + * + * @package Kanboard\Model + * @author Frederic Guillot + */ +class SubtaskStatusModel extends Base +{ + /** + * Get the subtask in progress for this user + * + * @access public + * @param integer $user_id + * @return array + */ + public function getSubtaskInProgress($user_id) + { + return $this->db->table(SubtaskModel::TABLE) + ->eq('status', SubtaskModel::STATUS_INPROGRESS) + ->eq('user_id', $user_id) + ->findOne(); + } + + /** + * Return true if the user have a subtask in progress + * + * @access public + * @param integer $user_id + * @return boolean + */ + public function hasSubtaskInProgress($user_id) + { + return $this->configModel->get('subtask_restriction') == 1 && + $this->db->table(SubtaskModel::TABLE) + ->eq('status', SubtaskModel::STATUS_INPROGRESS) + ->eq('user_id', $user_id) + ->exists(); + } + + /** + * Change the status of subtask + * + * @access public + * @param integer $subtask_id + * @return boolean|integer + */ + public function toggleStatus($subtask_id) + { + $subtask = $this->subtaskModel->getById($subtask_id); + $status = ($subtask['status'] + 1) % 3; + + $values = array( + 'id' => $subtask['id'], + 'status' => $status, + 'task_id' => $subtask['task_id'], + ); + + if (empty($subtask['user_id']) && $this->userSession->isLogged()) { + $values['user_id'] = $this->userSession->getId(); + $subtask['user_id'] = $values['user_id']; + } + + $this->subtaskTimeTrackingModel->toggleTimer($subtask_id, $subtask['user_id'], $status); + + return $this->subtaskModel->update($values) ? $status : false; + } + + /** + * Close all subtasks of a task + * + * @access public + * @param integer $task_id + * @return boolean + */ + public function closeAll($task_id) + { + return $this->db + ->table(SubtaskModel::TABLE) + ->eq('task_id', $task_id) + ->update(array('status' => SubtaskModel::STATUS_DONE)); + } +} diff --git a/app/Model/SubtaskTaskConversionModel.php b/app/Model/SubtaskTaskConversionModel.php new file mode 100644 index 00000000..8bf83d76 --- /dev/null +++ b/app/Model/SubtaskTaskConversionModel.php @@ -0,0 +1,41 @@ +<?php + +namespace Kanboard\Model; + +use Kanboard\Core\Base; + +/** + * Class SubtaskTaskConversionModel + * + * @package Kanboard\Model + * @author Frederic Guillot + */ +class SubtaskTaskConversionModel extends Base +{ + /** + * Convert a subtask to a task + * + * @access public + * @param integer $project_id + * @param integer $subtask_id + * @return integer + */ + public function convertToTask($project_id, $subtask_id) + { + $subtask = $this->subtaskModel->getById($subtask_id); + + $task_id = $this->taskCreationModel->create(array( + 'project_id' => $project_id, + 'title' => $subtask['title'], + 'time_estimated' => $subtask['time_estimated'], + 'time_spent' => $subtask['time_spent'], + 'owner_id' => $subtask['user_id'], + )); + + if ($task_id !== false) { + $this->subtaskModel->remove($subtask_id); + } + + return $task_id; + } +} diff --git a/app/Model/SubtaskTimeTrackingModel.php b/app/Model/SubtaskTimeTrackingModel.php index 062e594a..3b1b97e4 100644 --- a/app/Model/SubtaskTimeTrackingModel.php +++ b/app/Model/SubtaskTimeTrackingModel.php @@ -160,6 +160,28 @@ class SubtaskTimeTrackingModel extends Base } /** + * Start or stop timer according to subtask status + * + * @access public + * @param integer $subtask_id + * @param integer $user_id + * @param integer $status + * @return boolean + */ + public function toggleTimer($subtask_id, $user_id, $status) + { + if ($this->configModel->get('subtask_time_tracking') == 1) { + if ($status == SubtaskModel::STATUS_INPROGRESS) { + return $this->subtaskTimeTrackingModel->logStartTime($subtask_id, $user_id); + } elseif ($status == SubtaskModel::STATUS_DONE) { + return $this->subtaskTimeTrackingModel->logEndTime($subtask_id, $user_id); + } + } + + return false; + } + + /** * Log start time * * @access public @@ -252,7 +274,6 @@ class SubtaskTimeTrackingModel extends Base { $subtask = $this->subtaskModel->getById($subtask_id); - // Fire the event subtask.update return $this->subtaskModel->update(array( 'id' => $subtask['id'], 'time_spent' => $subtask['time_spent'] + $time_spent, diff --git a/app/Model/TaskCreationModel.php b/app/Model/TaskCreationModel.php index cd70a028..1c0fd7d9 100644 --- a/app/Model/TaskCreationModel.php +++ b/app/Model/TaskCreationModel.php @@ -3,7 +3,6 @@ namespace Kanboard\Model; use Kanboard\Core\Base; -use Kanboard\Event\TaskEvent; /** * Task Creation @@ -42,7 +41,10 @@ class TaskCreationModel extends Base $this->taskTagModel->save($values['project_id'], $task_id, $tags); } - $this->fireEvents($task_id, $values); + $this->queueManager->push($this->taskEventJob->withParams( + $task_id, + array(TaskModel::EVENT_CREATE_UPDATE, TaskModel::EVENT_CREATE) + )); } return (int) $task_id; @@ -51,10 +53,10 @@ class TaskCreationModel extends Base /** * Prepare data * - * @access public + * @access protected * @param array $values Form values */ - public function prepare(array &$values) + protected function prepare(array &$values) { $values = $this->dateParser->convert($values, array('date_due')); $values = $this->dateParser->convert($values, array('date_started'), true); @@ -84,26 +86,4 @@ class TaskCreationModel extends Base $values['date_moved'] = $values['date_creation']; $values['position'] = $this->taskFinderModel->countByColumnAndSwimlaneId($values['project_id'], $values['column_id'], $values['swimlane_id']) + 1; } - - /** - * Fire events - * - * @access private - * @param integer $task_id Task id - * @param array $values Form values - */ - private function fireEvents($task_id, array $values) - { - $event = new TaskEvent(array('task_id' => $task_id) + $values); - - $this->logger->debug('Event fired: '.TaskModel::EVENT_CREATE_UPDATE); - $this->logger->debug('Event fired: '.TaskModel::EVENT_CREATE); - - $this->dispatcher->dispatch(TaskModel::EVENT_CREATE_UPDATE, $event); - $this->dispatcher->dispatch(TaskModel::EVENT_CREATE, $event); - - if (! empty($values['description'])) { - $this->userMentionModel->fireEvents($values['description'], TaskModel::EVENT_USER_MENTION, $event); - } - } } diff --git a/app/Model/TaskFileModel.php b/app/Model/TaskFileModel.php index 7603019a..0163da28 100644 --- a/app/Model/TaskFileModel.php +++ b/app/Model/TaskFileModel.php @@ -61,18 +61,6 @@ class TaskFileModel extends FileModel } /** - * Get event name - * - * @abstract - * @access protected - * @return string - */ - protected function getEventName() - { - return self::EVENT_CREATE; - } - - /** * Get projectId from fileId * * @access public @@ -101,4 +89,15 @@ class TaskFileModel extends FileModel $original_filename = e('Screenshot taken %s', $this->helper->dt->datetime(time())).'.png'; return $this->uploadContent($task_id, $original_filename, $blob); } + + /** + * Fire file creation event + * + * @access protected + * @param integer $file_id + */ + protected function fireCreationEvent($file_id) + { + $this->queueManager->push($this->taskFileEventJob->withParams($file_id, self::EVENT_CREATE)); + } } diff --git a/app/Model/TaskFinderModel.php b/app/Model/TaskFinderModel.php index 7268052c..924f339b 100644 --- a/app/Model/TaskFinderModel.php +++ b/app/Model/TaskFinderModel.php @@ -63,19 +63,19 @@ class TaskFinderModel extends Base return $this->db ->table(TaskModel::TABLE) ->columns( - 'tasks.id', - 'tasks.title', - 'tasks.date_due', - 'tasks.date_creation', - 'tasks.project_id', - 'tasks.color_id', - 'tasks.priority', - 'tasks.time_spent', - 'tasks.time_estimated', - 'tasks.is_active', - 'tasks.creator_id', - 'projects.name AS project_name', - 'columns.title AS column_title' + TaskModel::TABLE.'.id', + TaskModel::TABLE.'.title', + TaskModel::TABLE.'.date_due', + TaskModel::TABLE.'.date_creation', + TaskModel::TABLE.'.project_id', + TaskModel::TABLE.'.color_id', + TaskModel::TABLE.'.priority', + TaskModel::TABLE.'.time_spent', + TaskModel::TABLE.'.time_estimated', + TaskModel::TABLE.'.is_active', + TaskModel::TABLE.'.creator_id', + ProjectModel::TABLE.'.name AS project_name', + ColumnModel::TABLE.'.title AS column_title' ) ->join(ProjectModel::TABLE, 'id', 'project_id') ->join(ColumnModel::TABLE, 'id', 'column_id') @@ -103,36 +103,36 @@ class TaskFinderModel extends Base '(SELECT COUNT(*) FROM '.TaskLinkModel::TABLE.' WHERE '.TaskLinkModel::TABLE.'.task_id = tasks.id) AS nb_links', '(SELECT COUNT(*) FROM '.TaskExternalLinkModel::TABLE.' WHERE '.TaskExternalLinkModel::TABLE.'.task_id = tasks.id) AS nb_external_links', '(SELECT DISTINCT 1 FROM '.TaskLinkModel::TABLE.' WHERE '.TaskLinkModel::TABLE.'.task_id = tasks.id AND '.TaskLinkModel::TABLE.'.link_id = 9) AS is_milestone', - 'tasks.id', - 'tasks.reference', - 'tasks.title', - 'tasks.description', - 'tasks.date_creation', - 'tasks.date_modification', - 'tasks.date_completed', - 'tasks.date_started', - 'tasks.date_due', - 'tasks.color_id', - 'tasks.project_id', - 'tasks.column_id', - 'tasks.swimlane_id', - 'tasks.owner_id', - 'tasks.creator_id', - 'tasks.position', - 'tasks.is_active', - 'tasks.score', - 'tasks.category_id', - 'tasks.priority', - 'tasks.date_moved', - 'tasks.recurrence_status', - 'tasks.recurrence_trigger', - 'tasks.recurrence_factor', - 'tasks.recurrence_timeframe', - 'tasks.recurrence_basedate', - 'tasks.recurrence_parent', - 'tasks.recurrence_child', - 'tasks.time_estimated', - 'tasks.time_spent', + TaskModel::TABLE.'.id', + TaskModel::TABLE.'.reference', + TaskModel::TABLE.'.title', + TaskModel::TABLE.'.description', + TaskModel::TABLE.'.date_creation', + TaskModel::TABLE.'.date_modification', + TaskModel::TABLE.'.date_completed', + TaskModel::TABLE.'.date_started', + TaskModel::TABLE.'.date_due', + TaskModel::TABLE.'.color_id', + TaskModel::TABLE.'.project_id', + TaskModel::TABLE.'.column_id', + TaskModel::TABLE.'.swimlane_id', + TaskModel::TABLE.'.owner_id', + TaskModel::TABLE.'.creator_id', + TaskModel::TABLE.'.position', + TaskModel::TABLE.'.is_active', + TaskModel::TABLE.'.score', + TaskModel::TABLE.'.category_id', + TaskModel::TABLE.'.priority', + TaskModel::TABLE.'.date_moved', + TaskModel::TABLE.'.recurrence_status', + TaskModel::TABLE.'.recurrence_trigger', + TaskModel::TABLE.'.recurrence_factor', + TaskModel::TABLE.'.recurrence_timeframe', + TaskModel::TABLE.'.recurrence_basedate', + TaskModel::TABLE.'.recurrence_parent', + TaskModel::TABLE.'.recurrence_child', + TaskModel::TABLE.'.time_estimated', + TaskModel::TABLE.'.time_spent', UserModel::TABLE.'.username AS assignee_username', UserModel::TABLE.'.name AS assignee_name', UserModel::TABLE.'.email AS assignee_email', diff --git a/app/Model/TaskLinkModel.php b/app/Model/TaskLinkModel.php index 09978eae..e8d3c5df 100644 --- a/app/Model/TaskLinkModel.php +++ b/app/Model/TaskLinkModel.php @@ -3,7 +3,6 @@ namespace Kanboard\Model; use Kanboard\Core\Base; -use Kanboard\Event\TaskLinkEvent; /** * TaskLink model @@ -26,7 +25,8 @@ class TaskLinkModel extends Base * * @var string */ - const EVENT_CREATE_UPDATE = 'tasklink.create_update'; + const EVENT_CREATE_UPDATE = 'task_internal_link.create_update'; + const EVENT_DELETE = 'task_internal_link.delete'; /** * Get projectId from $task_link_id @@ -53,7 +53,19 @@ class TaskLinkModel extends Base */ public function getById($task_link_id) { - return $this->db->table(self::TABLE)->eq('id', $task_link_id)->findOne(); + return $this->db + ->table(self::TABLE) + ->columns( + self::TABLE.'.id', + self::TABLE.'.opposite_task_id', + self::TABLE.'.task_id', + self::TABLE.'.link_id', + LinkModel::TABLE.'.label', + LinkModel::TABLE.'.opposite_id AS opposite_link_id' + ) + ->eq(self::TABLE.'.id', $task_link_id) + ->join(LinkModel::TABLE, 'id', 'link_id') + ->findOne(); } /** @@ -140,62 +152,31 @@ class TaskLinkModel extends Base } /** - * Publish events - * - * @access private - * @param array $events - */ - private function fireEvents(array $events) - { - foreach ($events as $event) { - $event['project_id'] = $this->taskFinderModel->getProjectId($event['task_id']); - $this->container['dispatcher']->dispatch(self::EVENT_CREATE_UPDATE, new TaskLinkEvent($event)); - } - } - - /** * Create a new link * * @access public * @param integer $task_id Task id * @param integer $opposite_task_id Opposite task id * @param integer $link_id Link id - * @return integer Task link id + * @return integer|boolean */ public function create($task_id, $opposite_task_id, $link_id) { - $events = array(); $this->db->startTransaction(); - // Get opposite link $opposite_link_id = $this->linkModel->getOppositeLinkId($link_id); + $task_link_id1 = $this->createTaskLink($task_id, $opposite_task_id, $link_id); + $task_link_id2 = $this->createTaskLink($opposite_task_id, $task_id, $opposite_link_id); - $values = array( - 'task_id' => $task_id, - 'opposite_task_id' => $opposite_task_id, - 'link_id' => $link_id, - ); - - // Create the original task link - $this->db->table(self::TABLE)->insert($values); - $task_link_id = $this->db->getLastId(); - $events[] = $values; - - // Create the opposite task link - $values = array( - 'task_id' => $opposite_task_id, - 'opposite_task_id' => $task_id, - 'link_id' => $opposite_link_id, - ); - - $this->db->table(self::TABLE)->insert($values); - $events[] = $values; + if ($task_link_id1 === false || $task_link_id2 === false) { + $this->db->cancelTransaction(); + return false; + } $this->db->closeTransaction(); + $this->fireEvents(array($task_link_id1, $task_link_id2), self::EVENT_CREATE_UPDATE); - $this->fireEvents($events); - - return (int) $task_link_id; + return $task_link_id1; } /** @@ -210,46 +191,24 @@ class TaskLinkModel extends Base */ public function update($task_link_id, $task_id, $opposite_task_id, $link_id) { - $events = array(); $this->db->startTransaction(); - // Get original task link $task_link = $this->getById($task_link_id); - - // Find opposite task link $opposite_task_link = $this->getOppositeTaskLink($task_link); - - // Get opposite link $opposite_link_id = $this->linkModel->getOppositeLinkId($link_id); - // Update the original task link - $values = array( - 'task_id' => $task_id, - 'opposite_task_id' => $opposite_task_id, - 'link_id' => $link_id, - ); - - $rs1 = $this->db->table(self::TABLE)->eq('id', $task_link_id)->update($values); - $events[] = $values; + $result1 = $this->updateTaskLink($task_link_id, $task_id, $opposite_task_id, $link_id); + $result2 = $this->updateTaskLink($opposite_task_link['id'], $opposite_task_id, $task_id, $opposite_link_id); - // Update the opposite link - $values = array( - 'task_id' => $opposite_task_id, - 'opposite_task_id' => $task_id, - 'link_id' => $opposite_link_id, - ); - - $rs2 = $this->db->table(self::TABLE)->eq('id', $opposite_task_link['id'])->update($values); - $events[] = $values; + if ($result1 === false || $result2 === false) { + $this->db->cancelTransaction(); + return false; + } $this->db->closeTransaction(); + $this->fireEvents(array($task_link_id, $opposite_task_link['id']), self::EVENT_CREATE_UPDATE); - if ($rs1 && $rs2) { - $this->fireEvents($events); - return true; - } - - return false; + return true; } /** @@ -261,21 +220,83 @@ class TaskLinkModel extends Base */ public function remove($task_link_id) { + $this->taskLinkEventJob->execute($task_link_id, self::EVENT_DELETE); + $this->db->startTransaction(); $link = $this->getById($task_link_id); $link_id = $this->linkModel->getOppositeLinkId($link['link_id']); - $this->db->table(self::TABLE)->eq('id', $task_link_id)->remove(); + $result1 = $this->db + ->table(self::TABLE) + ->eq('id', $task_link_id) + ->remove(); - $this->db + $result2 = $this->db ->table(self::TABLE) ->eq('opposite_task_id', $link['task_id']) ->eq('task_id', $link['opposite_task_id']) - ->eq('link_id', $link_id)->remove(); + ->eq('link_id', $link_id) + ->remove(); + + if ($result1 === false || $result2 === false) { + $this->db->cancelTransaction(); + return false; + } $this->db->closeTransaction(); return true; } + + /** + * Publish events + * + * @access protected + * @param integer[] $task_link_ids + * @param string $eventName + */ + protected function fireEvents(array $task_link_ids, $eventName) + { + foreach ($task_link_ids as $task_link_id) { + $this->queueManager->push($this->taskLinkEventJob->withParams($task_link_id, $eventName)); + } + } + + /** + * Create task link + * + * @access protected + * @param integer $task_id + * @param integer $opposite_task_id + * @param integer $link_id + * @return integer|boolean + */ + protected function createTaskLink($task_id, $opposite_task_id, $link_id) + { + return $this->db->table(self::TABLE)->persist(array( + 'task_id' => $task_id, + 'opposite_task_id' => $opposite_task_id, + 'link_id' => $link_id, + )); + } + + /** + * Update task link + * + * @access protected + * @param integer $task_link_id + * @param integer $task_id + * @param integer $opposite_task_id + * @param integer $link_id + * @return boolean + */ + protected function updateTaskLink($task_link_id, $task_id, $opposite_task_id, $link_id) + { + return $this->db->table(self::TABLE)->eq('id', $task_link_id)->update(array( + 'task_id' => $task_id, + 'opposite_task_id' => $opposite_task_id, + 'link_id' => $link_id, + )); + } } diff --git a/app/Model/TaskModificationModel.php b/app/Model/TaskModificationModel.php index be5f53c8..16b48f3d 100644 --- a/app/Model/TaskModificationModel.php +++ b/app/Model/TaskModificationModel.php @@ -3,7 +3,6 @@ namespace Kanboard\Model; use Kanboard\Core\Base; -use Kanboard\Event\TaskEvent; /** * Task Modification @@ -23,14 +22,14 @@ class TaskModificationModel extends Base */ public function update(array $values, $fire_events = true) { - $original_task = $this->taskFinderModel->getById($values['id']); + $task = $this->taskFinderModel->getById($values['id']); - $this->updateTags($values, $original_task); + $this->updateTags($values, $task); $this->prepare($values); - $result = $this->db->table(TaskModel::TABLE)->eq('id', $original_task['id'])->update($values); + $result = $this->db->table(TaskModel::TABLE)->eq('id', $task['id'])->update($values); if ($fire_events && $result) { - $this->fireEvents($original_task, $values); + $this->fireEvents($task, $values); } return $result; @@ -39,43 +38,56 @@ class TaskModificationModel extends Base /** * Fire events * - * @access public - * @param array $task - * @param array $new_values + * @access protected + * @param array $task + * @param array $changes */ - public function fireEvents(array $task, array $new_values) + protected function fireEvents(array $task, array $changes) { $events = array(); - $event_data = array_merge($task, $new_values, array('task_id' => $task['id'])); - // Values changed - $event_data['changes'] = array_diff_assoc($new_values, $task); - unset($event_data['changes']['date_modification']); - - if ($this->isFieldModified('owner_id', $event_data['changes'])) { + if ($this->isAssigneeChanged($task, $changes)) { $events[] = TaskModel::EVENT_ASSIGNEE_CHANGE; - } elseif (! empty($event_data['changes'])) { + } elseif ($this->isModified($task, $changes)) { $events[] = TaskModel::EVENT_CREATE_UPDATE; $events[] = TaskModel::EVENT_UPDATE; } - foreach ($events as $event) { - $this->logger->debug('Event fired: '.$event); - $this->dispatcher->dispatch($event, new TaskEvent($event_data)); + if (! empty($events)) { + $this->queueManager->push($this->taskEventJob + ->withParams($task['id'], $events, $changes, array(), $task) + ); } } /** + * Return true if the task have been modified + * + * @access protected + * @param array $task + * @param array $changes + * @return bool + */ + protected function isModified(array $task, array $changes) + { + $diff = array_diff_assoc($changes, $task); + unset($diff['date_modification']); + return count($diff) > 0; + } + + /** * Return true if the field is the only modified value * - * @access public - * @param string $field - * @param array $changes - * @return boolean + * @access protected + * @param array $task + * @param array $changes + * @return bool */ - public function isFieldModified($field, array $changes) + protected function isAssigneeChanged(array $task, array $changes) { - return isset($changes[$field]) && count($changes) === 1; + $diff = array_diff_assoc($changes, $task); + unset($diff['date_modification']); + return isset($changes['owner_id']) && $task['owner_id'] != $changes['owner_id'] && count($diff) === 1; } /** diff --git a/app/Model/TaskPositionModel.php b/app/Model/TaskPositionModel.php index 9fdb8f7d..3d95a763 100644 --- a/app/Model/TaskPositionModel.php +++ b/app/Model/TaskPositionModel.php @@ -3,7 +3,6 @@ namespace Kanboard\Model; use Kanboard\Core\Base; -use Kanboard\Event\TaskEvent; /** * Task Position @@ -17,15 +16,16 @@ class TaskPositionModel extends Base * Move a task to another column or to another position * * @access public - * @param integer $project_id Project id - * @param integer $task_id Task id - * @param integer $column_id Column id - * @param integer $position Position (must be >= 1) - * @param integer $swimlane_id Swimlane id - * @param boolean $fire_events Fire events - * @return boolean + * @param integer $project_id Project id + * @param integer $task_id Task id + * @param integer $column_id Column id + * @param integer $position Position (must be >= 1) + * @param integer $swimlane_id Swimlane id + * @param boolean $fire_events Fire events + * @param bool $onlyOpen Do not move closed tasks + * @return bool */ - public function movePosition($project_id, $task_id, $column_id, $position, $swimlane_id = 0, $fire_events = true) + public function movePosition($project_id, $task_id, $column_id, $position, $swimlane_id = 0, $fire_events = true, $onlyOpen = true) { if ($position < 1) { return false; @@ -33,7 +33,7 @@ class TaskPositionModel extends Base $task = $this->taskFinderModel->getById($task_id); - if ($task['is_active'] == TaskModel::STATUS_CLOSED) { + if ($onlyOpen && $task['is_active'] == TaskModel::STATUS_CLOSED) { return true; } @@ -212,8 +212,7 @@ class TaskPositionModel extends Base */ private function fireEvents(array $task, $new_column_id, $new_position, $new_swimlane_id) { - $event_data = array( - 'task_id' => $task['id'], + $changes = array( 'project_id' => $task['project_id'], 'position' => $new_position, 'column_id' => $new_column_id, @@ -226,14 +225,26 @@ class TaskPositionModel extends Base ); if ($task['swimlane_id'] != $new_swimlane_id) { - $this->logger->debug('Event fired: '.TaskModel::EVENT_MOVE_SWIMLANE); - $this->dispatcher->dispatch(TaskModel::EVENT_MOVE_SWIMLANE, new TaskEvent($event_data)); + $this->queueManager->push($this->taskEventJob->withParams( + $task['id'], + array(TaskModel::EVENT_MOVE_SWIMLANE), + $changes, + $changes + )); } elseif ($task['column_id'] != $new_column_id) { - $this->logger->debug('Event fired: '.TaskModel::EVENT_MOVE_COLUMN); - $this->dispatcher->dispatch(TaskModel::EVENT_MOVE_COLUMN, new TaskEvent($event_data)); + $this->queueManager->push($this->taskEventJob->withParams( + $task['id'], + array(TaskModel::EVENT_MOVE_COLUMN), + $changes, + $changes + )); } elseif ($task['position'] != $new_position) { - $this->logger->debug('Event fired: '.TaskModel::EVENT_MOVE_POSITION); - $this->dispatcher->dispatch(TaskModel::EVENT_MOVE_POSITION, new TaskEvent($event_data)); + $this->queueManager->push($this->taskEventJob->withParams( + $task['id'], + array(TaskModel::EVENT_MOVE_POSITION), + $changes, + $changes + )); } } } diff --git a/app/Model/TaskProjectMoveModel.php b/app/Model/TaskProjectMoveModel.php index eda23c0b..ae3ae084 100644 --- a/app/Model/TaskProjectMoveModel.php +++ b/app/Model/TaskProjectMoveModel.php @@ -2,8 +2,6 @@ namespace Kanboard\Model; -use Kanboard\Event\TaskEvent; - /** * Task Project Move * @@ -32,9 +30,8 @@ class TaskProjectMoveModel extends TaskDuplicationModel $this->checkDestinationProjectValues($values); $this->tagDuplicationModel->syncTaskTagsToAnotherProject($task_id, $project_id); - if ($this->db->table(TaskModel::TABLE)->eq('id', $task['id'])->update($values)) { - $event = new TaskEvent(array_merge($task, $values, array('task_id' => $task['id']))); - $this->dispatcher->dispatch(TaskModel::EVENT_MOVE_PROJECT, $event); + if ($this->db->table(TaskModel::TABLE)->eq('id', $task_id)->update($values)) { + $this->queueManager->push($this->taskEventJob->withParams($task_id, array(TaskModel::EVENT_MOVE_PROJECT), $values)); } return true; diff --git a/app/Model/TaskStatusModel.php b/app/Model/TaskStatusModel.php index 4d573f0e..dc114698 100644 --- a/app/Model/TaskStatusModel.php +++ b/app/Model/TaskStatusModel.php @@ -3,7 +3,6 @@ namespace Kanboard\Model; use Kanboard\Core\Base; -use Kanboard\Event\TaskEvent; /** * Task Status @@ -46,7 +45,7 @@ class TaskStatusModel extends Base */ public function close($task_id) { - $this->subtaskModel->closeAll($task_id); + $this->subtaskStatusModel->closeAll($task_id); return $this->changeStatus($task_id, TaskModel::STATUS_CLOSED, time(), TaskModel::EVENT_CLOSE); } @@ -101,10 +100,10 @@ class TaskStatusModel extends Base * @param integer $task_id Task id * @param integer $status Task status * @param integer $date_completed Timestamp - * @param string $event Event name + * @param string $event_name Event name * @return boolean */ - private function changeStatus($task_id, $status, $date_completed, $event) + private function changeStatus($task_id, $status, $date_completed, $event_name) { if (! $this->taskFinderModel->exists($task_id)) { return false; @@ -120,8 +119,7 @@ class TaskStatusModel extends Base )); if ($result) { - $this->logger->debug('Event fired: '.$event); - $this->dispatcher->dispatch($event, new TaskEvent(array('task_id' => $task_id) + $this->taskFinderModel->getById($task_id))); + $this->queueManager->push($this->taskEventJob->withParams($task_id, array($event_name))); } return $result; diff --git a/app/Model/UserModel.php b/app/Model/UserModel.php index f7a051c5..56b1a960 100644 --- a/app/Model/UserModel.php +++ b/app/Model/UserModel.php @@ -65,17 +65,6 @@ class UserModel extends Base } /** - * Return the full name - * - * @param array $user User properties - * @return string - */ - public function getFullname(array $user) - { - return $user['name'] ?: $user['username']; - } - - /** * Return true is the given user id is administrator * * @access public @@ -230,7 +219,7 @@ class UserModel extends Base $result = array(); foreach ($users as $user) { - $result[$user['id']] = $this->getFullname($user); + $result[$user['id']] = $this->helper->user->getFullname($user); } asort($result); diff --git a/app/Notification/MailNotification.php b/app/Notification/MailNotification.php index 2d27179c..a5f51b89 100644 --- a/app/Notification/MailNotification.php +++ b/app/Notification/MailNotification.php @@ -4,10 +4,6 @@ namespace Kanboard\Notification; use Kanboard\Core\Base; use Kanboard\Core\Notification\NotificationInterface; -use Kanboard\Model\TaskModel; -use Kanboard\Model\TaskFileModel; -use Kanboard\Model\CommentModel; -use Kanboard\Model\SubtaskModel; /** * Email Notification @@ -76,76 +72,16 @@ class MailNotification extends Base implements NotificationInterface * Get the mail subject for a given template name * * @access public - * @param string $event_name Event name - * @param array $event_data Event data - * @return string - */ - public function getMailSubject($event_name, array $event_data) - { - switch ($event_name) { - case TaskFileModel::EVENT_CREATE: - $subject = $this->getStandardMailSubject(e('New attachment'), $event_data); - break; - case CommentModel::EVENT_CREATE: - $subject = $this->getStandardMailSubject(e('New comment'), $event_data); - break; - case CommentModel::EVENT_UPDATE: - $subject = $this->getStandardMailSubject(e('Comment updated'), $event_data); - break; - case SubtaskModel::EVENT_CREATE: - $subject = $this->getStandardMailSubject(e('New subtask'), $event_data); - break; - case SubtaskModel::EVENT_UPDATE: - $subject = $this->getStandardMailSubject(e('Subtask updated'), $event_data); - break; - case TaskModel::EVENT_CREATE: - $subject = $this->getStandardMailSubject(e('New task'), $event_data); - break; - case TaskModel::EVENT_UPDATE: - $subject = $this->getStandardMailSubject(e('Task updated'), $event_data); - break; - case TaskModel::EVENT_CLOSE: - $subject = $this->getStandardMailSubject(e('Task closed'), $event_data); - break; - case TaskModel::EVENT_OPEN: - $subject = $this->getStandardMailSubject(e('Task opened'), $event_data); - break; - case TaskModel::EVENT_MOVE_COLUMN: - $subject = $this->getStandardMailSubject(e('Column change'), $event_data); - break; - case TaskModel::EVENT_MOVE_POSITION: - $subject = $this->getStandardMailSubject(e('Position change'), $event_data); - break; - case TaskModel::EVENT_MOVE_SWIMLANE: - $subject = $this->getStandardMailSubject(e('Swimlane change'), $event_data); - break; - case TaskModel::EVENT_ASSIGNEE_CHANGE: - $subject = $this->getStandardMailSubject(e('Assignee change'), $event_data); - break; - case TaskModel::EVENT_USER_MENTION: - case CommentModel::EVENT_USER_MENTION: - $subject = $this->getStandardMailSubject(e('Mentioned'), $event_data); - break; - case TaskModel::EVENT_OVERDUE: - $subject = e('[%s] Overdue tasks', $event_data['project_name']); - break; - default: - $subject = e('Notification'); - } - - return $subject; - } - - /** - * Get the mail subject for a given label - * - * @access private - * @param string $label Label - * @param array $data Template data + * @param string $eventName Event name + * @param array $eventData Event data * @return string */ - private function getStandardMailSubject($label, array $data) + public function getMailSubject($eventName, array $eventData) { - return sprintf('[%s][%s] %s (#%d)', $data['task']['project_name'], $label, $data['task']['title'], $data['task']['id']); + return sprintf( + '[%s] %s', + $eventData['task']['project_name'], + $this->notificationModel->getTitleWithoutAuthor($eventName, $eventData) + ); } } diff --git a/app/Pagination/ProjectPagination.php b/app/Pagination/ProjectPagination.php new file mode 100644 index 00000000..8f1fa87c --- /dev/null +++ b/app/Pagination/ProjectPagination.php @@ -0,0 +1,35 @@ +<?php + +namespace Kanboard\Pagination; + +use Kanboard\Core\Base; +use Kanboard\Core\Paginator; +use Kanboard\Model\ProjectModel; + +/** + * Class ProjectPagination + * + * @package Kanboard\Pagination + * @author Frederic Guillot + */ +class ProjectPagination extends Base +{ + /** + * Get dashboard pagination + * + * @access public + * @param integer $user_id + * @param string $method + * @param integer $max + * @return Paginator + */ + public function getDashboardPaginator($user_id, $method, $max) + { + return $this->paginator + ->setUrl('DashboardController', $method, array('pagination' => 'projects', 'user_id' => $user_id)) + ->setMax($max) + ->setOrder(ProjectModel::TABLE.'.name') + ->setQuery($this->projectModel->getQueryColumnStats($this->projectPermissionModel->getActiveProjectIds($user_id))) + ->calculateOnlyIf($this->request->getStringParam('pagination') === 'projects'); + } +} diff --git a/app/Pagination/SubtaskPagination.php b/app/Pagination/SubtaskPagination.php new file mode 100644 index 00000000..f0cd6148 --- /dev/null +++ b/app/Pagination/SubtaskPagination.php @@ -0,0 +1,36 @@ +<?php + +namespace Kanboard\Pagination; + +use Kanboard\Core\Base; +use Kanboard\Core\Paginator; +use Kanboard\Model\SubtaskModel; +use Kanboard\Model\TaskModel; + +/** + * Class SubtaskPagination + * + * @package Kanboard\Pagination + * @author Frederic Guillot + */ +class SubtaskPagination extends Base +{ + /** + * Get dashboard pagination + * + * @access public + * @param integer $user_id + * @param string $method + * @param integer $max + * @return Paginator + */ + public function getDashboardPaginator($user_id, $method, $max) + { + return $this->paginator + ->setUrl('DashboardController', $method, array('pagination' => 'subtasks', 'user_id' => $user_id)) + ->setMax($max) + ->setOrder(TaskModel::TABLE.'.id') + ->setQuery($this->subtaskModel->getUserQuery($user_id, array(SubtaskModel::STATUS_TODO, SubtaskModel::STATUS_INPROGRESS))) + ->calculateOnlyIf($this->request->getStringParam('pagination') === 'subtasks'); + } +} diff --git a/app/Pagination/TaskPagination.php b/app/Pagination/TaskPagination.php new file mode 100644 index 00000000..a395ab84 --- /dev/null +++ b/app/Pagination/TaskPagination.php @@ -0,0 +1,35 @@ +<?php + +namespace Kanboard\Pagination; + +use Kanboard\Core\Base; +use Kanboard\Core\Paginator; +use Kanboard\Model\TaskModel; + +/** + * Class TaskPagination + * + * @package Kanboard\Pagination + * @author Frederic Guillot + */ +class TaskPagination extends Base +{ + /** + * Get dashboard pagination + * + * @access public + * @param integer $user_id + * @param string $method + * @param integer $max + * @return Paginator + */ + public function getDashboardPaginator($user_id, $method, $max) + { + return $this->paginator + ->setUrl('DashboardController', $method, array('pagination' => 'tasks', 'user_id' => $user_id)) + ->setMax($max) + ->setOrder(TaskModel::TABLE.'.id') + ->setQuery($this->taskFinderModel->getUserQuery($user_id)) + ->calculateOnlyIf($this->request->getStringParam('pagination') === 'tasks'); + } +} diff --git a/app/Pagination/UserPagination.php b/app/Pagination/UserPagination.php new file mode 100644 index 00000000..430b7d2f --- /dev/null +++ b/app/Pagination/UserPagination.php @@ -0,0 +1,32 @@ +<?php + +namespace Kanboard\Pagination; + +use Kanboard\Core\Base; +use Kanboard\Core\Paginator; +use Kanboard\Model\UserModel; + +/** + * Class UserPagination + * + * @package Kanboard\Pagination + * @author Frederic Guillot + */ +class UserPagination extends Base +{ + /** + * Get user listing paginator + * + * @access public + * @return Paginator + */ + public function getListingPaginator() + { + return $this->paginator + ->setUrl('UserListController', 'show') + ->setMax(30) + ->setOrder(UserModel::TABLE.'.username') + ->setQuery($this->userModel->getQuery()) + ->calculate(); + } +} diff --git a/app/ServiceProvider/ActionProvider.php b/app/ServiceProvider/ActionProvider.php index 9383be12..946fbf41 100644 --- a/app/ServiceProvider/ActionProvider.php +++ b/app/ServiceProvider/ActionProvider.php @@ -3,6 +3,9 @@ namespace Kanboard\ServiceProvider; use Kanboard\Action\TaskAssignColorPriority; +use Kanboard\Action\TaskAssignDueDateOnCreation; +use Kanboard\Action\TaskMoveColumnClosed; +use Kanboard\Action\TaskMoveColumnNotMovedPeriod; use Pimple\Container; use Pimple\ServiceProviderInterface; use Kanboard\Core\Action\ActionManager; @@ -77,9 +80,12 @@ class ActionProvider implements ServiceProviderInterface $container['actionManager']->register(new TaskMoveAnotherProject($container)); $container['actionManager']->register(new TaskMoveColumnAssigned($container)); $container['actionManager']->register(new TaskMoveColumnCategoryChange($container)); + $container['actionManager']->register(new TaskMoveColumnClosed($container)); + $container['actionManager']->register(new TaskMoveColumnNotMovedPeriod($container)); $container['actionManager']->register(new TaskMoveColumnUnAssigned($container)); $container['actionManager']->register(new TaskOpen($container)); $container['actionManager']->register(new TaskUpdateStartDate($container)); + $container['actionManager']->register(new TaskAssignDueDateOnCreation($container)); return $container; } diff --git a/app/ServiceProvider/ClassProvider.php b/app/ServiceProvider/ClassProvider.php index e32c0d43..aab41c74 100644 --- a/app/ServiceProvider/ClassProvider.php +++ b/app/ServiceProvider/ClassProvider.php @@ -60,6 +60,9 @@ class ClassProvider implements ServiceProviderInterface 'ProjectUserRoleModel', 'RememberMeSessionModel', 'SubtaskModel', + 'SubtaskPositionModel', + 'SubtaskStatusModel', + 'SubtaskTaskConversionModel', 'SubtaskTimeTrackingModel', 'SwimlaneModel', 'TagDuplicationModel', @@ -119,6 +122,12 @@ class ClassProvider implements ServiceProviderInterface 'TaskExport', 'TransitionExport', ), + 'Pagination' => array( + 'TaskPagination', + 'SubtaskPagination', + 'ProjectPagination', + 'UserPagination', + ), 'Core' => array( 'DateParser', 'Lexer', diff --git a/app/ServiceProvider/EventDispatcherProvider.php b/app/ServiceProvider/EventDispatcherProvider.php index 57543fe4..ebf42cbf 100644 --- a/app/ServiceProvider/EventDispatcherProvider.php +++ b/app/ServiceProvider/EventDispatcherProvider.php @@ -11,7 +11,6 @@ use Kanboard\Subscriber\BootstrapSubscriber; use Kanboard\Subscriber\NotificationSubscriber; use Kanboard\Subscriber\ProjectDailySummarySubscriber; use Kanboard\Subscriber\ProjectModificationDateSubscriber; -use Kanboard\Subscriber\SubtaskTimeTrackingSubscriber; use Kanboard\Subscriber\TransitionSubscriber; use Kanboard\Subscriber\RecurringTaskSubscriber; @@ -31,7 +30,6 @@ class EventDispatcherProvider implements ServiceProviderInterface $container['dispatcher']->addSubscriber(new ProjectDailySummarySubscriber($container)); $container['dispatcher']->addSubscriber(new ProjectModificationDateSubscriber($container)); $container['dispatcher']->addSubscriber(new NotificationSubscriber($container)); - $container['dispatcher']->addSubscriber(new SubtaskTimeTrackingSubscriber($container)); $container['dispatcher']->addSubscriber(new TransitionSubscriber($container)); $container['dispatcher']->addSubscriber(new RecurringTaskSubscriber($container)); diff --git a/app/ServiceProvider/FilterProvider.php b/app/ServiceProvider/FilterProvider.php index 20281a09..436288dc 100644 --- a/app/ServiceProvider/FilterProvider.php +++ b/app/ServiceProvider/FilterProvider.php @@ -21,6 +21,7 @@ use Kanboard\Filter\TaskDueDateFilter; use Kanboard\Filter\TaskIdFilter; use Kanboard\Filter\TaskLinkFilter; use Kanboard\Filter\TaskModificationDateFilter; +use Kanboard\Filter\TaskPriorityFilter; use Kanboard\Filter\TaskProjectFilter; use Kanboard\Filter\TaskReferenceFilter; use Kanboard\Filter\TaskStatusFilter; @@ -137,6 +138,7 @@ class FilterProvider implements ServiceProviderInterface ->withFilter(TaskColorFilter::getInstance() ->setColorModel($c['colorModel']) ) + ->withFilter(new TaskPriorityFilter()) ->withFilter(new TaskColumnFilter()) ->withFilter(new TaskCommentFilter()) ->withFilter(TaskCreationDateFilter::getInstance() diff --git a/app/ServiceProvider/JobProvider.php b/app/ServiceProvider/JobProvider.php new file mode 100644 index 00000000..2194b11c --- /dev/null +++ b/app/ServiceProvider/JobProvider.php @@ -0,0 +1,67 @@ +<?php + +namespace Kanboard\ServiceProvider; + +use Kanboard\Job\CommentEventJob; +use Kanboard\Job\NotificationJob; +use Kanboard\Job\ProjectFileEventJob; +use Kanboard\Job\ProjectMetricJob; +use Kanboard\Job\SubtaskEventJob; +use Kanboard\Job\TaskEventJob; +use Kanboard\Job\TaskFileEventJob; +use Kanboard\Job\TaskLinkEventJob; +use Pimple\Container; +use Pimple\ServiceProviderInterface; + +/** + * Class JobProvider + * + * @package Kanboard\ServiceProvider + * @author Frederic Guillot + */ +class JobProvider implements ServiceProviderInterface +{ + /** + * Register providers + * + * @access public + * @param \Pimple\Container $container + * @return \Pimple\Container + */ + public function register(Container $container) + { + $container['commentEventJob'] = $container->factory(function ($c) { + return new CommentEventJob($c); + }); + + $container['subtaskEventJob'] = $container->factory(function ($c) { + return new SubtaskEventJob($c); + }); + + $container['taskEventJob'] = $container->factory(function ($c) { + return new TaskEventJob($c); + }); + + $container['taskFileEventJob'] = $container->factory(function ($c) { + return new TaskFileEventJob($c); + }); + + $container['taskLinkEventJob'] = $container->factory(function ($c) { + return new TaskLinkEventJob($c); + }); + + $container['projectFileEventJob'] = $container->factory(function ($c) { + return new ProjectFileEventJob($c); + }); + + $container['notificationJob'] = $container->factory(function ($c) { + return new NotificationJob($c); + }); + + $container['projectMetricJob'] = $container->factory(function ($c) { + return new ProjectMetricJob($c); + }); + + return $container; + } +} diff --git a/app/ServiceProvider/QueueProvider.php b/app/ServiceProvider/QueueProvider.php index 946b436a..570f2e77 100644 --- a/app/ServiceProvider/QueueProvider.php +++ b/app/ServiceProvider/QueueProvider.php @@ -15,9 +15,11 @@ use Pimple\ServiceProviderInterface; class QueueProvider implements ServiceProviderInterface { /** - * Registers services on the given container. + * Register providers * - * @param Container $container + * @access public + * @param \Pimple\Container $container + * @return \Pimple\Container */ public function register(Container $container) { diff --git a/app/Subscriber/BaseSubscriber.php b/app/Subscriber/BaseSubscriber.php index fdea29f6..92441962 100644 --- a/app/Subscriber/BaseSubscriber.php +++ b/app/Subscriber/BaseSubscriber.php @@ -12,28 +12,4 @@ use Kanboard\Core\Base; */ class BaseSubscriber extends Base { - /** - * Method called - * - * @access private - * @var array - */ - private $called = array(); - - /** - * Check if a listener has been executed - * - * @access public - * @param string $key - * @return boolean - */ - public function isExecuted($key = '') - { - if (isset($this->called[$key])) { - return true; - } - - $this->called[$key] = true; - return false; - } } diff --git a/app/Subscriber/BootstrapSubscriber.php b/app/Subscriber/BootstrapSubscriber.php index 7d12e9ae..3618f30f 100644 --- a/app/Subscriber/BootstrapSubscriber.php +++ b/app/Subscriber/BootstrapSubscriber.php @@ -21,7 +21,7 @@ class BootstrapSubscriber extends BaseSubscriber implements EventSubscriberInter $this->actionManager->attachEvents(); if ($this->userSession->isLogged()) { - $this->sessionStorage->hasSubtaskInProgress = $this->subtaskModel->hasSubtaskInProgress($this->userSession->getId()); + $this->sessionStorage->hasSubtaskInProgress = $this->subtaskStatusModel->hasSubtaskInProgress($this->userSession->getId()); } } diff --git a/app/Subscriber/NotificationSubscriber.php b/app/Subscriber/NotificationSubscriber.php index db11e585..7cc68b26 100644 --- a/app/Subscriber/NotificationSubscriber.php +++ b/app/Subscriber/NotificationSubscriber.php @@ -3,7 +3,7 @@ namespace Kanboard\Subscriber; use Kanboard\Event\GenericEvent; -use Kanboard\Job\NotificationJob; +use Kanboard\Model\TaskLinkModel; use Kanboard\Model\TaskModel; use Kanboard\Model\CommentModel; use Kanboard\Model\SubtaskModel; @@ -26,21 +26,20 @@ class NotificationSubscriber extends BaseSubscriber implements EventSubscriberIn TaskModel::EVENT_ASSIGNEE_CHANGE => 'handleEvent', SubtaskModel::EVENT_CREATE => 'handleEvent', SubtaskModel::EVENT_UPDATE => 'handleEvent', + SubtaskModel::EVENT_DELETE => 'handleEvent', CommentModel::EVENT_CREATE => 'handleEvent', CommentModel::EVENT_UPDATE => 'handleEvent', + CommentModel::EVENT_DELETE => 'handleEvent', CommentModel::EVENT_USER_MENTION => 'handleEvent', TaskFileModel::EVENT_CREATE => 'handleEvent', + TaskLinkModel::EVENT_CREATE_UPDATE => 'handleEvent', + TaskLinkModel::EVENT_DELETE => 'handleEvent', ); } public function handleEvent(GenericEvent $event, $eventName) { - if (!$this->isExecuted($eventName)) { - $this->logger->debug('Subscriber executed: ' . __METHOD__); - - $this->queueManager->push(NotificationJob::getInstance($this->container) - ->withParams($event, $eventName, get_class($event)) - ); - } + $this->logger->debug('Subscriber executed: ' . __METHOD__); + $this->queueManager->push($this->notificationJob->withParams($event, $eventName)); } } diff --git a/app/Subscriber/ProjectDailySummarySubscriber.php b/app/Subscriber/ProjectDailySummarySubscriber.php index 6971a121..eaa9d468 100644 --- a/app/Subscriber/ProjectDailySummarySubscriber.php +++ b/app/Subscriber/ProjectDailySummarySubscriber.php @@ -3,7 +3,6 @@ namespace Kanboard\Subscriber; use Kanboard\Event\TaskEvent; -use Kanboard\Job\ProjectMetricJob; use Kanboard\Model\TaskModel; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -22,9 +21,7 @@ class ProjectDailySummarySubscriber extends BaseSubscriber implements EventSubsc public function execute(TaskEvent $event) { - if (isset($event['project_id']) && !$this->isExecuted()) { - $this->logger->debug('Subscriber executed: '.__METHOD__); - $this->queueManager->push(ProjectMetricJob::getInstance($this->container)->withParams($event['project_id'])); - } + $this->logger->debug('Subscriber executed: '.__METHOD__); + $this->queueManager->push($this->projectMetricJob->withParams($event['task']['project_id'])); } } diff --git a/app/Subscriber/ProjectModificationDateSubscriber.php b/app/Subscriber/ProjectModificationDateSubscriber.php index fee04eaa..1ffe0248 100644 --- a/app/Subscriber/ProjectModificationDateSubscriber.php +++ b/app/Subscriber/ProjectModificationDateSubscriber.php @@ -24,9 +24,7 @@ class ProjectModificationDateSubscriber extends BaseSubscriber implements EventS public function execute(GenericEvent $event) { - if (isset($event['project_id']) && !$this->isExecuted()) { - $this->logger->debug('Subscriber executed: '.__METHOD__); - $this->projectModel->updateModificationDate($event['project_id']); - } + $this->logger->debug('Subscriber executed: '.__METHOD__); + $this->projectModel->updateModificationDate($event['task']['project_id']); } } diff --git a/app/Subscriber/RecurringTaskSubscriber.php b/app/Subscriber/RecurringTaskSubscriber.php index 21cd3996..3e2848f8 100644 --- a/app/Subscriber/RecurringTaskSubscriber.php +++ b/app/Subscriber/RecurringTaskSubscriber.php @@ -19,12 +19,13 @@ class RecurringTaskSubscriber extends BaseSubscriber implements EventSubscriberI public function onMove(TaskEvent $event) { $this->logger->debug('Subscriber executed: '.__METHOD__); + $task = $event['task']; - if ($event['recurrence_status'] == TaskModel::RECURRING_STATUS_PENDING) { - if ($event['recurrence_trigger'] == TaskModel::RECURRING_TRIGGER_FIRST_COLUMN && $this->columnModel->getFirstColumnId($event['project_id']) == $event['src_column_id']) { - $this->taskRecurrenceModel->duplicateRecurringTask($event['task_id']); - } elseif ($event['recurrence_trigger'] == TaskModel::RECURRING_TRIGGER_LAST_COLUMN && $this->columnModel->getLastColumnId($event['project_id']) == $event['dst_column_id']) { - $this->taskRecurrenceModel->duplicateRecurringTask($event['task_id']); + if ($task['recurrence_status'] == TaskModel::RECURRING_STATUS_PENDING) { + if ($task['recurrence_trigger'] == TaskModel::RECURRING_TRIGGER_FIRST_COLUMN && $this->columnModel->getFirstColumnId($task['project_id']) == $event['src_column_id']) { + $this->taskRecurrenceModel->duplicateRecurringTask($task['id']); + } elseif ($task['recurrence_trigger'] == TaskModel::RECURRING_TRIGGER_LAST_COLUMN && $this->columnModel->getLastColumnId($task['project_id']) == $event['dst_column_id']) { + $this->taskRecurrenceModel->duplicateRecurringTask($task['id']); } } } @@ -32,8 +33,9 @@ class RecurringTaskSubscriber extends BaseSubscriber implements EventSubscriberI public function onClose(TaskEvent $event) { $this->logger->debug('Subscriber executed: '.__METHOD__); + $task = $event['task']; - if ($event['recurrence_status'] == TaskModel::RECURRING_STATUS_PENDING && $event['recurrence_trigger'] == TaskModel::RECURRING_TRIGGER_CLOSE) { + if ($task['recurrence_status'] == TaskModel::RECURRING_STATUS_PENDING && $task['recurrence_trigger'] == TaskModel::RECURRING_TRIGGER_CLOSE) { $this->taskRecurrenceModel->duplicateRecurringTask($event['task_id']); } } diff --git a/app/Subscriber/SubtaskTimeTrackingSubscriber.php b/app/Subscriber/SubtaskTimeTrackingSubscriber.php deleted file mode 100644 index 7e39c126..00000000 --- a/app/Subscriber/SubtaskTimeTrackingSubscriber.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php - -namespace Kanboard\Subscriber; - -use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Kanboard\Model\SubtaskModel; -use Kanboard\Event\SubtaskEvent; - -class SubtaskTimeTrackingSubscriber extends BaseSubscriber implements EventSubscriberInterface -{ - public static function getSubscribedEvents() - { - return array( - SubtaskModel::EVENT_CREATE => 'updateTaskTime', - SubtaskModel::EVENT_DELETE => 'updateTaskTime', - SubtaskModel::EVENT_UPDATE => array( - array('logStartEnd', 10), - array('updateTaskTime', 0), - ) - ); - } - - public function updateTaskTime(SubtaskEvent $event) - { - if (isset($event['task_id'])) { - $this->logger->debug('Subscriber executed: '.__METHOD__); - $this->subtaskTimeTrackingModel->updateTaskTimeTracking($event['task_id']); - } - } - - public function logStartEnd(SubtaskEvent $event) - { - if (isset($event['status']) && $this->configModel->get('subtask_time_tracking') == 1) { - $this->logger->debug('Subscriber executed: '.__METHOD__); - $subtask = $this->subtaskModel->getById($event['id']); - - if (empty($subtask['user_id'])) { - return false; - } - - if ($subtask['status'] == SubtaskModel::STATUS_INPROGRESS) { - return $this->subtaskTimeTrackingModel->logStartTime($subtask['id'], $subtask['user_id']); - } else { - return $this->subtaskTimeTrackingModel->logEndTime($subtask['id'], $subtask['user_id']); - } - } - } -} diff --git a/app/Template/analytic/compare_hours.php b/app/Template/analytic/compare_hours.php index 70d8d02b..e4a0b60e 100644 --- a/app/Template/analytic/compare_hours.php +++ b/app/Template/analytic/compare_hours.php @@ -1,5 +1,5 @@ <div class="page-header"> - <h2><?= t('Compare Estimated Time vs Actual Time') ?></h2> + <h2><?= t('Estimated vs actual time') ?></h2> </div> <div class="listing"> diff --git a/app/Template/analytic/sidebar.php b/app/Template/analytic/sidebar.php index de3dccf8..0f5ee101 100644 --- a/app/Template/analytic/sidebar.php +++ b/app/Template/analytic/sidebar.php @@ -1,5 +1,4 @@ <div class="sidebar"> - <h2><?= t('Reportings') ?></h2> <ul> <li <?= $this->app->checkMenuSelection('AnalyticController', 'tasks') ?>> <?= $this->url->link(t('Task distribution'), 'AnalyticController', 'tasks', array('project_id' => $project['id'])) ?> diff --git a/app/Template/board/table_column.php b/app/Template/board/table_column.php index 6336234a..75a6eb4c 100644 --- a/app/Template/board/table_column.php +++ b/app/Template/board/table_column.php @@ -47,6 +47,7 @@ </li> <?php endif ?> <?php endif ?> + <?= $this->hook->render('template:board:column:dropdown', array('swimlane' => $swimlane, 'column' => $column)) ?> </ul> </span> <?php endif ?> diff --git a/app/Template/board/table_tasks.php b/app/Template/board/table_tasks.php index fd9ce5e7..1651f5d6 100644 --- a/app/Template/board/table_tasks.php +++ b/app/Template/board/table_tasks.php @@ -4,7 +4,8 @@ <td class=" board-column-<?= $column['id'] ?> <?= $column['task_limit'] > 0 && $column['nb_tasks'] > $column['task_limit'] ? 'board-task-list-limit' : '' ?> - "> + " + > <!-- tasks list --> <div class="board-task-list board-column-expanded" data-column-id="<?= $column['id'] ?>" data-swimlane-id="<?= $swimlane['id'] ?>" data-task-limit="<?= $column['task_limit'] ?>"> diff --git a/app/Template/config/about.php b/app/Template/config/about.php index 8e2d1325..8d5a575d 100644 --- a/app/Template/config/about.php +++ b/app/Template/config/about.php @@ -9,7 +9,7 @@ </li> <li> <?= t('Author:') ?> - <strong>Frédéric Guillot</strong> (<a href="https://github.com/fguillot/kanboard/blob/master/CONTRIBUTORS.md" target="_blank"><?= t('contributors') ?></a>) + <strong>Frédéric Guillot</strong> (<a href="https://github.com/kanboard/kanboard/blob/master/CONTRIBUTORS.md" target="_blank"><?= t('contributors') ?></a>) </li> <li> <?= t('License:') ?> diff --git a/app/Template/config/sidebar.php b/app/Template/config/sidebar.php index e304f0d0..239edc19 100644 --- a/app/Template/config/sidebar.php +++ b/app/Template/config/sidebar.php @@ -1,5 +1,4 @@ <div class="sidebar"> - <h2><?= t('Actions') ?></h2> <ul> <li <?= $this->app->checkMenuSelection('ConfigController', 'index') ?>> <?= $this->url->link(t('About'), 'ConfigController', 'index') ?> diff --git a/app/Template/dashboard/projects.php b/app/Template/dashboard/projects.php index 962e4d83..3a7f1d86 100644 --- a/app/Template/dashboard/projects.php +++ b/app/Template/dashboard/projects.php @@ -6,8 +6,8 @@ <?php else: ?> <table class="table-fixed table-small"> <tr> - <th class="column-5"><?= $paginator->order('Id', 'id') ?></th> - <th class="column-3"><?= $paginator->order('<i class="fa fa-lock fa-fw" title="'.t('Private project').'"></i>', 'is_private') ?></th> + <th class="column-5"><?= $paginator->order('Id', \Kanboard\Model\ProjectModel::TABLE.'.id') ?></th> + <th class="column-3"><?= $paginator->order('<i class="fa fa-lock fa-fw" title="'.t('Private project').'"></i>', \Kanboard\Model\ProjectModel::TABLE.'.is_private') ?></th> <th class="column-25"><?= $paginator->order(t('Project'), \Kanboard\Model\ProjectModel::TABLE.'.name') ?></th> <th class="column-10"><?= t('Tasks') ?></th> <th><?= t('Columns') ?></th> diff --git a/app/Template/dashboard/sidebar.php b/app/Template/dashboard/sidebar.php index 86cc20f8..df4e91a5 100644 --- a/app/Template/dashboard/sidebar.php +++ b/app/Template/dashboard/sidebar.php @@ -1,5 +1,4 @@ <div class="sidebar"> - <h2><?= $this->text->e($user['name'] ?: $user['username']) ?></h2> <ul> <li <?= $this->app->checkMenuSelection('DashboardController', 'show') ?>> <?= $this->url->link(t('Overview'), 'DashboardController', 'show', array('user_id' => $user['id'])) ?> diff --git a/app/Template/dashboard/subtasks.php b/app/Template/dashboard/subtasks.php index 8e0aa3ce..ca550e4c 100644 --- a/app/Template/dashboard/subtasks.php +++ b/app/Template/dashboard/subtasks.php @@ -6,10 +6,10 @@ <?php else: ?> <table class="table-fixed table-small"> <tr> - <th class="column-5"><?= $paginator->order('Id', 'tasks.id') ?></th> + <th class="column-5"><?= $paginator->order('Id', \Kanboard\Model\TaskModel::TABLE.'.id') ?></th> <th class="column-20"><?= $paginator->order(t('Project'), 'project_name') ?></th> <th><?= $paginator->order(t('Task'), 'task_name') ?></th> - <th><?= $paginator->order(t('Subtask'), 'title') ?></th> + <th><?= $paginator->order(t('Subtask'), \Kanboard\Model\SubtaskModel::TABLE.'.title') ?></th> <th class="column-20"><?= t('Time tracking') ?></th> </tr> <?php foreach ($paginator->getCollection() as $subtask): ?> diff --git a/app/Template/dashboard/tasks.php b/app/Template/dashboard/tasks.php index b3257c33..d9cb4f9e 100644 --- a/app/Template/dashboard/tasks.php +++ b/app/Template/dashboard/tasks.php @@ -6,12 +6,12 @@ <?php else: ?> <table class="table-fixed table-small"> <tr> - <th class="column-5"><?= $paginator->order('Id', 'tasks.id') ?></th> + <th class="column-5"><?= $paginator->order('Id', \Kanboard\Model\TaskModel::TABLE.'.id') ?></th> <th class="column-20"><?= $paginator->order(t('Project'), 'project_name') ?></th> - <th><?= $paginator->order(t('Task'), 'title') ?></th> - <th class="column-5"><?= $paginator->order(t('Priority'), 'tasks.priority') ?></th> + <th><?= $paginator->order(t('Task'), \Kanboard\Model\TaskModel::TABLE.'.title') ?></th> + <th class="column-5"><?= $paginator->order(t('Priority'), \Kanboard\Model\TaskModel::TABLE.'.priority') ?></th> <th class="column-20"><?= t('Time tracking') ?></th> - <th class="column-10"><?= $paginator->order(t('Due date'), 'date_due') ?></th> + <th class="column-10"><?= $paginator->order(t('Due date'), \Kanboard\Model\TaskModel::TABLE.'.date_due') ?></th> <th class="column-10"><?= $paginator->order(t('Column'), 'column_title') ?></th> </tr> <?php foreach ($paginator->getCollection() as $task): ?> diff --git a/app/Template/event/comment_delete.php b/app/Template/event/comment_delete.php new file mode 100644 index 00000000..ead7d56a --- /dev/null +++ b/app/Template/event/comment_delete.php @@ -0,0 +1,11 @@ +<p class="activity-title"> + <?= e('%s removed a comment on the task %s', + $this->text->e($author), + $this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) + ) ?> + <span class="activity-date"><?= $this->dt->datetime($date_creation) ?></span> +</p> +<div class="activity-description"> + <p class="activity-task-title"><?= $this->text->e($task['title']) ?></p> + <div class="markdown"><?= $this->text->markdown($comment['comment']) ?></div> +</div> diff --git a/app/Template/event/comment_update.php b/app/Template/event/comment_update.php index 5a0821bd..5be598ac 100644 --- a/app/Template/event/comment_update.php +++ b/app/Template/event/comment_update.php @@ -7,4 +7,7 @@ </p> <div class="activity-description"> <p class="activity-task-title"><?= $this->text->e($task['title']) ?></p> + <?php if (! empty($comment['comment'])): ?> + <div class="markdown"><?= $this->text->markdown($comment['comment']) ?></div> + <?php endif ?> </div> diff --git a/app/Template/event/subtask_delete.php b/app/Template/event/subtask_delete.php new file mode 100644 index 00000000..8ac11853 --- /dev/null +++ b/app/Template/event/subtask_delete.php @@ -0,0 +1,15 @@ +<p class="activity-title"> + <?= e('%s removed a subtask for the task %s', + $this->text->e($author), + $this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) + ) ?> + <span class="activity-date"><?= $this->dt->datetime($date_creation) ?></span> +</p> +<div class="activity-description"> + <p class="activity-task-title"><?= $this->text->e($task['title']) ?></p> + <ul> + <li> + <?= $this->text->e($subtask['title']) ?> (<strong><?= $this->text->e($subtask['status_name']) ?></strong>) + </li> + </ul> +</div> diff --git a/app/Template/event/task_assignee_change.php b/app/Template/event/task_assignee_change.php index 7c962223..7539cd0b 100644 --- a/app/Template/event/task_assignee_change.php +++ b/app/Template/event/task_assignee_change.php @@ -8,7 +8,7 @@ $this->text->e($assignee) ) ?> <?php else: ?> - <?= e('%s remove the assignee of the task %s', $this->text->e($author), $this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))) ?> + <?= e('%s removed the assignee of the task %s', $this->text->e($author), $this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))) ?> <?php endif ?> <span class="activity-date"><?= $this->dt->datetime($date_creation) ?></span> </p> diff --git a/app/Template/event/task_internal_link_create_update.php b/app/Template/event/task_internal_link_create_update.php new file mode 100644 index 00000000..de257977 --- /dev/null +++ b/app/Template/event/task_internal_link_create_update.php @@ -0,0 +1,16 @@ +<p class="activity-title"> + <?= e('%s set a new internal link for the task %s', + $this->text->e($author), + $this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) + ) ?> + <span class="activity-date"><?= $this->dt->datetime($date_creation) ?></span> +</p> +<div class="activity-description"> + <p class="activity-task-title"> + <?= e( + 'This task is now linked to the task %s with the relation "%s"', + $this->url->link(t('#%d', $task_link['opposite_task_id']), 'TaskViewController', 'show', array('task_id' => $task_link['opposite_task_id'])), + $this->text->e($task_link['label']) + ) ?> + </p> +</div> diff --git a/app/Template/event/task_internal_link_delete.php b/app/Template/event/task_internal_link_delete.php new file mode 100644 index 00000000..e537bf81 --- /dev/null +++ b/app/Template/event/task_internal_link_delete.php @@ -0,0 +1,16 @@ +<p class="activity-title"> + <?= e('%s removed an internal link for the task %s', + $this->text->e($author), + $this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) + ) ?> + <span class="activity-date"><?= $this->dt->datetime($date_creation) ?></span> +</p> +<div class="activity-description"> + <p class="activity-task-title"> + <?= e( + 'The link with the relation "%s" to the task %s have been removed', + $this->text->e($task_link['label']), + $this->url->link(t('#%d', $task_link['opposite_task_id']), 'TaskViewController', 'show', array('task_id' => $task_link['opposite_task_id'])) + ) ?> + </p> +</div> diff --git a/app/Template/export/sidebar.php b/app/Template/export/sidebar.php index 55fbaeef..463c0cee 100644 --- a/app/Template/export/sidebar.php +++ b/app/Template/export/sidebar.php @@ -1,5 +1,4 @@ <div class="sidebar"> - <h2><?= t('Exports') ?></h2> <ul> <li <?= $this->app->checkMenuSelection('ExportController', 'tasks') ?>> <?= $this->url->link(t('Tasks'), 'ExportController', 'tasks', array('project_id' => $project['id'])) ?> diff --git a/app/Template/export/subtasks.php b/app/Template/export/subtasks.php index a82cb3d1..878a7132 100644 --- a/app/Template/export/subtasks.php +++ b/app/Template/export/subtasks.php @@ -1,5 +1,5 @@ <div class="page-header"> - <h2><?= t('Subtasks exportation for "%s"', $project['name']) ?></h2> + <h2><?= t('Subtasks export') ?></h2> </div> <p class="alert alert-info"><?= t('This report contains all subtasks information for the given date range.') ?></p> @@ -21,4 +21,4 @@ <div class="form-actions"> <button type="submit" class="btn btn-blue"><?= t('Execute') ?></button> </div> -</form>
\ No newline at end of file +</form> diff --git a/app/Template/export/summary.php b/app/Template/export/summary.php index 60aa306f..d9362a9b 100644 --- a/app/Template/export/summary.php +++ b/app/Template/export/summary.php @@ -1,5 +1,5 @@ <div class="page-header"> - <h2><?= t('Daily project summary export for "%s"', $project['name']) ?></h2> + <h2><?= t('Daily project summary export') ?></h2> </div> <p class="alert alert-info"><?= t('This export contains the number of tasks per column grouped per day.') ?></p> @@ -21,4 +21,4 @@ <div class="form-actions"> <button type="submit" class="btn btn-blue"><?= t('Execute') ?></button> </div> -</form>
\ No newline at end of file +</form> diff --git a/app/Template/export/tasks.php b/app/Template/export/tasks.php index bed8ab90..ae411326 100644 --- a/app/Template/export/tasks.php +++ b/app/Template/export/tasks.php @@ -1,5 +1,5 @@ <div class="page-header"> - <h2><?= t('Tasks exportation for "%s"', $project['name']) ?></h2> + <h2><?= t('Tasks exportation') ?></h2> </div> <p class="alert alert-info"><?= t('This report contains all tasks information for the given date range.') ?></p> @@ -21,4 +21,4 @@ <div class="form-actions"> <button type="submit" class="btn btn-blue"><?= t('Execute') ?></button> </div> -</form>
\ No newline at end of file +</form> diff --git a/app/Template/feed/project.php b/app/Template/feed/project.php deleted file mode 100644 index 213a04d4..00000000 --- a/app/Template/feed/project.php +++ /dev/null @@ -1,27 +0,0 @@ -<?= '<?xml version="1.0" encoding="utf-8"?>' ?> -<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom"> - <title><?= t('%s\'s activity', $project['name']) ?></title> - <link rel="alternate" type="text/html" href="<?= $this->url->base() ?>"/> - <link rel="self" type="application/atom+xml" href="<?= $this->url->href('FeedController', 'project', array('token' => $project['token']), false, '', true) ?>"/> - <updated><?= date(DATE_ATOM) ?></updated> - <id><?= $this->url->href('FeedController', 'project', array('token' => $project['token']), false, '', true) ?></id> - <icon><?= $this->url->base() ?>assets/img/favicon.png</icon> - - <?php foreach ($events as $e): ?> - <entry> - <title type="text"><?= $e['event_title'] ?></title> - <link rel="alternate" href="<?= $this->url->href('TaskViewController', 'show', array('task_id' => $e['task_id']), false, '', true) ?>"/> - <id><?= $e['id'].'-'.$e['event_name'].'-'.$e['task_id'].'-'.$e['date_creation'] ?></id> - <published><?= date(DATE_ATOM, $e['date_creation']) ?></published> - <updated><?= date(DATE_ATOM, $e['date_creation']) ?></updated> - <author> - <name><?= $this->text->e($e['author']) ?></name> - </author> - <content type="html"> - <![CDATA[ - <?= $e['event_content'] ?> - ]]> - </content> - </entry> - <?php endforeach ?> -</feed> diff --git a/app/Template/feed/user.php b/app/Template/feed/user.php deleted file mode 100644 index 0c45f03c..00000000 --- a/app/Template/feed/user.php +++ /dev/null @@ -1,27 +0,0 @@ -<?= '<?xml version="1.0" encoding="utf-8"?>' ?> -<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom"> - <title><?= t('Project activities for %s', $user['name'] ?: $user['username']) ?></title> - <link rel="alternate" type="text/html" href="<?= $this->url->base() ?>"/> - <link rel="self" type="application/atom+xml" href="<?= $this->url->href('FeedController', 'user', array('token' => $user['token']), false, '', true) ?>"/> - <updated><?= date(DATE_ATOM) ?></updated> - <id><?= $this->url->href('FeedController', 'user', array('token' => $user['token']), false, '', true) ?></id> - <icon><?= $this->url->base() ?>assets/img/favicon.png</icon> - - <?php foreach ($events as $e): ?> - <entry> - <title type="text"><?= $e['event_title'] ?></title> - <link rel="alternate" href="<?= $this->url->href('TaskViewController', 'show', array('task_id' => $e['task_id']), false, '', true) ?>"/> - <id><?= $e['id'].'-'.$e['event_name'].'-'.$e['task_id'].'-'.$e['date_creation'] ?></id> - <published><?= date(DATE_ATOM, $e['date_creation']) ?></published> - <updated><?= date(DATE_ATOM, $e['date_creation']) ?></updated> - <author> - <name><?= $this->text->e($e['author']) ?></name> - </author> - <content type="html"> - <![CDATA[ - <?= $e['event_content'] ?> - ]]> - </content> - </entry> - <?php endforeach ?> -</feed> diff --git a/app/Template/header.php b/app/Template/header.php index 13521ae7..a2b3fcb3 100644 --- a/app/Template/header.php +++ b/app/Template/header.php @@ -5,7 +5,7 @@ <?= $this->url->link('K<span>B</span>', 'DashboardController', 'show', array(), false, '', t('Dashboard')) ?> </span> <span class="title"> - <?php if (isset($project) && ! empty($project)): ?> + <?php if (! empty($project) && ! empty($task)): ?> <?= $this->url->link($this->text->e($project['name']), 'BoardViewController', 'show', array('project_id' => $project['id'])) ?> <?php else: ?> <?= $this->text->e($title) ?> @@ -59,6 +59,7 @@ <?= $this->url->link(t('New private project'), 'ProjectCreationController', 'createPrivate', array(), false, 'popover') ?> </li> <?php endif ?> + <?= $this->hook->render('template:header:creation-dropdown') ?> </ul> </div> <?php endif ?> diff --git a/app/Template/notification/comment_delete.php b/app/Template/notification/comment_delete.php new file mode 100644 index 00000000..928623ec --- /dev/null +++ b/app/Template/notification/comment_delete.php @@ -0,0 +1,7 @@ +<h2><?= $this->text->e($task['title']) ?> (#<?= $task['id'] ?>)</h2> + +<h3><?= t('Comment removed') ?></h3> + +<?= $this->text->markdown($comment['comment']) ?> + +<?= $this->render('notification/footer', array('task' => $task, 'application_url' => $application_url)) ?> diff --git a/app/Template/notification/subtask_delete.php b/app/Template/notification/subtask_delete.php new file mode 100644 index 00000000..8c5f262c --- /dev/null +++ b/app/Template/notification/subtask_delete.php @@ -0,0 +1,11 @@ +<h2><?= $this->text->e($task['title']) ?> (#<?= $task['id'] ?>)</h2> + +<h3><?= t('Subtask removed') ?></h3> + +<ul> + <li><?= t('Title:') ?> <?= $this->text->e($subtask['title']) ?></li> + <li><?= t('Status:') ?> <?= $this->text->e($subtask['status_name']) ?></li> + <li><?= t('Assignee:') ?> <?= $this->text->e($subtask['name'] ?: $subtask['username'] ?: '?') ?></li> +</ul> + +<?= $this->render('notification/footer', array('task' => $task, 'application_url' => $application_url)) ?> diff --git a/app/Template/notification/task_file_create.php b/app/Template/notification/task_file_create.php index feab8dd2..c19f7279 100644 --- a/app/Template/notification/task_file_create.php +++ b/app/Template/notification/task_file_create.php @@ -2,4 +2,4 @@ <p><?= t('New attachment added "%s"', $file['name']) ?></p> -<?= $this->render('notification/footer', array('task' => $task, 'application_url' => $application_url)) ?>
\ No newline at end of file +<?= $this->render('notification/footer', array('task' => $task, 'application_url' => $application_url)) ?> diff --git a/app/Template/notification/task_internal_link_create_update.php b/app/Template/notification/task_internal_link_create_update.php new file mode 100644 index 00000000..73cad84d --- /dev/null +++ b/app/Template/notification/task_internal_link_create_update.php @@ -0,0 +1,11 @@ +<h2><?= $this->text->e($task['title']) ?> (#<?= $task['id'] ?>)</h2> + +<p> + <?= e( + 'This task is now linked to the task %s with the relation "%s"', + $this->url->link(t('#%d', $task_link['opposite_task_id']), 'TaskViewController', 'show', array('task_id' => $task_link['opposite_task_id'])), + $this->text->e($task_link['label']) + ) ?> +</p> + +<?= $this->render('notification/footer', array('task' => $task, 'application_url' => $application_url)) ?> diff --git a/app/Template/notification/task_internal_link_delete.php b/app/Template/notification/task_internal_link_delete.php new file mode 100644 index 00000000..bb54e0a7 --- /dev/null +++ b/app/Template/notification/task_internal_link_delete.php @@ -0,0 +1,11 @@ +<h2><?= $this->text->e($task['title']) ?> (#<?= $task['id'] ?>)</h2> + +<p> + <?= e( + 'The link with the relation "%s" to the task %s have been removed', + $this->text->e($task_link['label']), + $this->url->link(t('#%d', $task_link['opposite_task_id']), 'TaskViewController', 'show', array('task_id' => $task_link['opposite_task_id'])) + ) ?> +</p> + +<?= $this->render('notification/footer', array('task' => $task, 'application_url' => $application_url)) ?> diff --git a/app/Template/plugin/sidebar.php b/app/Template/plugin/sidebar.php index e1b47632..dd1a2a6b 100644 --- a/app/Template/plugin/sidebar.php +++ b/app/Template/plugin/sidebar.php @@ -1,5 +1,4 @@ <div class="sidebar"> - <h2><?= t('Actions') ?></h2> <ul> <li <?= $this->app->checkMenuSelection('PluginController', 'show') ?>> <?= $this->url->link(t('Installed Plugins'), 'PluginController', 'show') ?> diff --git a/app/Template/project/sidebar.php b/app/Template/project/sidebar.php index d0f50596..3be0da48 100644 --- a/app/Template/project/sidebar.php +++ b/app/Template/project/sidebar.php @@ -1,5 +1,4 @@ <div class="sidebar"> - <h2><?= t('Actions') ?></h2> <ul> <li <?= $this->app->checkMenuSelection('ProjectViewController', 'show') ?>> <?= $this->url->link(t('Summary'), 'ProjectViewController', 'show', array('project_id' => $project['id'])) ?> diff --git a/app/Template/project_creation/create.php b/app/Template/project_creation/create.php index d00883ba..b90b15c4 100644 --- a/app/Template/project_creation/create.php +++ b/app/Template/project_creation/create.php @@ -19,7 +19,7 @@ <p class="alert"><?= t('Which parts of the project do you want to duplicate?') ?></p> <?php if (! $is_private): ?> - <?= $this->form->checkbox('projectPermission', t('Permissions'), 1, true) ?> + <?= $this->form->checkbox('projectPermissionModel', t('Permissions'), 1, true) ?> <?php endif ?> <?= $this->form->checkbox('categoryModel', t('Categories'), 1, true) ?> diff --git a/app/Template/project_header/dropdown.php b/app/Template/project_header/dropdown.php index 79a1b389..f8901289 100644 --- a/app/Template/project_header/dropdown.php +++ b/app/Template/project_header/dropdown.php @@ -20,14 +20,6 @@ <i class="fa fa-arrows-h fa-fw"></i> <a href="#" class="filter-toggle-scrolling" title="<?= t('Keyboard shortcut: "%s"', 'c') ?>"><?= t('Horizontal scrolling') ?></a> </span> </li> - <li> - <span class="filter-max-height" style="display: none"> - <i class="fa fa-arrows-v fa-fw"></i> <a href="#" class="filter-toggle-height"><?= t('Set maximum column height') ?></a> - </span> - <span class="filter-min-height"> - <i class="fa fa-arrows-v fa-fw"></i> <a href="#" class="filter-toggle-height"><?= t('Remove maximum column height') ?></a> - </span> - </li> <?php endif ?> <?php if ($this->user->hasProjectAccess('TaskCreationController', 'show', $project['id'])): ?> diff --git a/app/Template/project_user_overview/sidebar.php b/app/Template/project_user_overview/sidebar.php index 9a87d4eb..ccbf9cab 100644 --- a/app/Template/project_user_overview/sidebar.php +++ b/app/Template/project_user_overview/sidebar.php @@ -1,6 +1,4 @@ <div class="sidebar"> - <h2><?= t('Actions') ?></h2> - <?= $this->form->select( 'user_id', $users, diff --git a/app/Template/project_view/duplicate.php b/app/Template/project_view/duplicate.php index d66ff591..561378d1 100644 --- a/app/Template/project_view/duplicate.php +++ b/app/Template/project_view/duplicate.php @@ -11,7 +11,7 @@ <?= $this->form->csrf() ?> <?php if ($project['is_private'] == 0): ?> - <?= $this->form->checkbox('projectPermission', t('Permissions'), 1, true) ?> + <?= $this->form->checkbox('projectPermissionModel', t('Permissions'), 1, true) ?> <?php endif ?> <?= $this->form->checkbox('categoryModel', t('Categories'), 1, true) ?> diff --git a/app/Template/task/show.php b/app/Template/task/show.php index 80786715..76c572a1 100644 --- a/app/Template/task/show.php +++ b/app/Template/task/show.php @@ -7,9 +7,12 @@ 'editable' => $this->user->hasProjectAccess('TaskModificationController', 'edit', $project['id']), )) ?> +<?php if(!empty($task['description'])): ?> <?= $this->hook->render('template:task:show:before-description', array('task' => $task, 'project' => $project)) ?> <?= $this->render('task/description', array('task' => $task)) ?> +<?php endif ?> +<?php if(!empty($subtasks)): ?> <?= $this->hook->render('template:task:show:before-subtasks', array('task' => $task, 'project' => $project)) ?> <?= $this->render('subtask/show', array( 'task' => $task, @@ -17,7 +20,9 @@ 'project' => $project, 'editable' => true, )) ?> +<?php endif ?> +<?php if(!empty($internal_links)): ?> <?= $this->hook->render('template:task:show:before-internal-links', array('task' => $task, 'project' => $project)) ?> <?= $this->render('task_internal_link/show', array( 'task' => $task, @@ -27,21 +32,27 @@ 'editable' => true, 'is_public' => false, )) ?> +<?php endif ?> +<?php if(!empty($external_links)): ?> <?= $this->hook->render('template:task:show:before-external-links', array('task' => $task, 'project' => $project)) ?> <?= $this->render('task_external_link/show', array( 'task' => $task, 'links' => $external_links, 'project' => $project, )) ?> +<?php endif ?> +<?php if(!empty($files)): ?> <?= $this->hook->render('template:task:show:before-attachments', array('task' => $task, 'project' => $project)) ?> <?= $this->render('task_file/show', array( 'task' => $task, 'files' => $files, 'images' => $images )) ?> +<?php endif ?> +<?php if(!empty($comments)): ?> <?= $this->hook->render('template:task:show:before-comments', array('task' => $task, 'project' => $project)) ?> <?= $this->render('comments/show', array( 'task' => $task, @@ -49,5 +60,6 @@ 'project' => $project, 'editable' => $this->user->hasProjectAccess('CommentController', 'edit', $project['id']), )) ?> +<?php endif ?> <?= $this->hook->render('template:task:show:bottom', array('task' => $task, 'project' => $project)) ?> diff --git a/app/Template/task/sidebar.php b/app/Template/task/sidebar.php index b44e6f0b..728741ba 100644 --- a/app/Template/task/sidebar.php +++ b/app/Template/task/sidebar.php @@ -1,5 +1,7 @@ <div class="sidebar sidebar-icons"> - <h2><?= t('Task #%d', $task['id']) ?></h2> + <div class="sidebar-title"> + <h2><?= t('Task #%d', $task['id']) ?></h2> + </div> <ul> <li <?= $this->app->checkMenuSelection('TaskViewController', 'show') ?>> <i class="fa fa-newspaper-o fa-fw"></i> @@ -28,7 +30,9 @@ </ul> <?php if ($this->user->hasProjectAccess('TaskModificationController', 'edit', $task['project_id'])): ?> - <h2><?= t('Actions') ?></h2> + <div class="sidebar-title"> + <h2><?= t('Actions') ?></h2> + </div> <ul> <li> <i class="fa fa-pencil-square-o fa-fw"></i> diff --git a/app/Template/task_import/sidebar.php b/app/Template/task_import/sidebar.php index 4cd92af8..04896948 100644 --- a/app/Template/task_import/sidebar.php +++ b/app/Template/task_import/sidebar.php @@ -1,5 +1,4 @@ <div class="sidebar"> - <h2><?= t('Imports') ?></h2> <ul> <li <?= $this->app->checkMenuSelection('TaskImportController', 'show') ?>> <?= $this->url->link(t('Tasks').' (CSV)', 'TaskImportController', 'show', array('project_id' => $project['id'])) ?> diff --git a/app/Template/user_modification/show.php b/app/Template/user_modification/show.php index 396d550d..506c9161 100644 --- a/app/Template/user_modification/show.php +++ b/app/Template/user_modification/show.php @@ -11,16 +11,16 @@ <?= $this->form->text('username', $values, $errors, array('required', isset($values['is_ldap_user']) && $values['is_ldap_user'] == 1 ? 'readonly' : '', 'maxlength="50"')) ?> <?= $this->form->label(t('Name'), 'name') ?> - <?= $this->form->text('name', $values, $errors) ?> + <?= $this->form->text('name', $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_name') ? '' : 'readonly')) ?> <?= $this->form->label(t('Email'), 'email') ?> - <?= $this->form->email('email', $values, $errors) ?> + <?= $this->form->email('email', $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_email') ? '' : 'readonly')) ?> <?= $this->form->label(t('Timezone'), 'timezone') ?> - <?= $this->form->select('timezone', $timezones, $values, $errors) ?> + <?= $this->form->select('timezone', $timezones, $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_timezone') ? '' : 'disabled')) ?> <?= $this->form->label(t('Language'), 'language') ?> - <?= $this->form->select('language', $languages, $values, $errors) ?> + <?= $this->form->select('language', $languages, $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_language') ? '' : 'disabled')) ?> <?php if ($this->user->isAdmin()): ?> <?= $this->form->label(t('Role'), 'role') ?> diff --git a/app/Template/user_view/sidebar.php b/app/Template/user_view/sidebar.php index d200a7f5..a80daefa 100644 --- a/app/Template/user_view/sidebar.php +++ b/app/Template/user_view/sidebar.php @@ -1,5 +1,7 @@ <div class="sidebar"> - <h2><?= t('Information') ?></h2> + <div class="sidebar-title"> + <h2><?= t('Information') ?></h2> + </div> <ul> <?php if ($this->user->hasAccess('UserViewController', 'show')): ?> <li <?= $this->app->checkMenuSelection('UserViewController', 'show') ?>> @@ -12,24 +14,34 @@ </li> <?php endif ?> <?php if ($this->user->isAdmin() || $this->user->isCurrentUser($user['id'])): ?> - <li <?= $this->app->checkMenuSelection('UserViewController', 'timesheet') ?>> - <?= $this->url->link(t('Time tracking'), 'UserViewController', 'timesheet', array('user_id' => $user['id'])) ?> - </li> - <li <?= $this->app->checkMenuSelection('UserViewController', 'lastLogin') ?>> - <?= $this->url->link(t('Last logins'), 'UserViewController', 'lastLogin', array('user_id' => $user['id'])) ?> - </li> - <li <?= $this->app->checkMenuSelection('UserViewController', 'sessions') ?>> - <?= $this->url->link(t('Persistent connections'), 'UserViewController', 'sessions', array('user_id' => $user['id'])) ?> - </li> - <li <?= $this->app->checkMenuSelection('UserViewController', 'passwordReset') ?>> - <?= $this->url->link(t('Password reset history'), 'UserViewController', 'passwordReset', array('user_id' => $user['id'])) ?> - </li> + <?php if ($this->user->hasAccess('UserViewController', 'timesheet')): ?> + <li <?= $this->app->checkMenuSelection('UserViewController', 'timesheet') ?>> + <?= $this->url->link(t('Time tracking'), 'UserViewController', 'timesheet', array('user_id' => $user['id'])) ?> + </li> + <?php endif ?> + <?php if ($this->user->hasAccess('UserViewController', 'lastLogin')): ?> + <li <?= $this->app->checkMenuSelection('UserViewController', 'lastLogin') ?>> + <?= $this->url->link(t('Last logins'), 'UserViewController', 'lastLogin', array('user_id' => $user['id'])) ?> + </li> + <?php endif ?> + <?php if ($this->user->hasAccess('UserViewController', 'sessions')): ?> + <li <?= $this->app->checkMenuSelection('UserViewController', 'sessions') ?>> + <?= $this->url->link(t('Persistent connections'), 'UserViewController', 'sessions', array('user_id' => $user['id'])) ?> + </li> + <?php endif ?> + <?php if ($this->user->hasAccess('UserViewController', 'passwordReset')): ?> + <li <?= $this->app->checkMenuSelection('UserViewController', 'passwordReset') ?>> + <?= $this->url->link(t('Password reset history'), 'UserViewController', 'passwordReset', array('user_id' => $user['id'])) ?> + </li> + <?php endif ?> <?php endif ?> <?= $this->hook->render('template:user:sidebar:information', array('user' => $user)) ?> </ul> - <h2><?= t('Actions') ?></h2> + <div class="sidebar-title"> + <h2><?= t('Actions') ?></h2> + </div> <ul> <?php if ($this->user->isAdmin() || $this->user->isCurrentUser($user['id'])): ?> @@ -42,13 +54,13 @@ </li> <?php endif ?> - <?php if ($user['is_ldap_user'] == 0): ?> + <?php if ($user['is_ldap_user'] == 0 && $this->user->hasAccess('UserCredentialController', 'changePassword')): ?> <li <?= $this->app->checkMenuSelection('UserCredentialController', 'changePassword') ?>> <?= $this->url->link(t('Change password'), 'UserCredentialController', 'changePassword', array('user_id' => $user['id'])) ?> </li> <?php endif ?> - <?php if ($this->user->isCurrentUser($user['id'])): ?> + <?php if ($this->user->isCurrentUser($user['id']) && $this->user->hasAccess('TwoFactorController', 'index')): ?> <li <?= $this->app->checkMenuSelection('TwoFactorController', 'index') ?>> <?= $this->url->link(t('Two factor authentication'), 'TwoFactorController', 'index', array('user_id' => $user['id'])) ?> </li> @@ -58,18 +70,26 @@ </li> <?php endif ?> - <li <?= $this->app->checkMenuSelection('UserViewController', 'share') ?>> - <?= $this->url->link(t('Public access'), 'UserViewController', 'share', array('user_id' => $user['id'])) ?> - </li> - <li <?= $this->app->checkMenuSelection('UserViewController', 'notifications') ?>> - <?= $this->url->link(t('Notifications'), 'UserViewController', 'notifications', array('user_id' => $user['id'])) ?> - </li> - <li <?= $this->app->checkMenuSelection('UserViewController', 'external') ?>> - <?= $this->url->link(t('External accounts'), 'UserViewController', 'external', array('user_id' => $user['id'])) ?> - </li> - <li <?= $this->app->checkMenuSelection('UserViewController', 'integrations') ?>> - <?= $this->url->link(t('Integrations'), 'UserViewController', 'integrations', array('user_id' => $user['id'])) ?> - </li> + <?php if ($this->user->hasAccess('UserViewController', 'share')): ?> + <li <?= $this->app->checkMenuSelection('UserViewController', 'share') ?>> + <?= $this->url->link(t('Public access'), 'UserViewController', 'share', array('user_id' => $user['id'])) ?> + </li> + <?php endif ?> + <?php if ($this->user->hasAccess('UserViewController', 'notifications')): ?> + <li <?= $this->app->checkMenuSelection('UserViewController', 'notifications') ?>> + <?= $this->url->link(t('Notifications'), 'UserViewController', 'notifications', array('user_id' => $user['id'])) ?> + </li> + <?php endif ?> + <?php if ($this->user->hasAccess('UserViewController', 'external')): ?> + <li <?= $this->app->checkMenuSelection('UserViewController', 'external') ?>> + <?= $this->url->link(t('External accounts'), 'UserViewController', 'external', array('user_id' => $user['id'])) ?> + </li> + <?php endif ?> + <?php if ($this->user->hasAccess('UserViewController', 'integrations')): ?> + <li <?= $this->app->checkMenuSelection('UserViewController', 'integrations') ?>> + <?= $this->url->link(t('Integrations'), 'UserViewController', 'integrations', array('user_id' => $user['id'])) ?> + </li> + <?php endif ?> <?php endif ?> <?php if ($this->user->hasAccess('UserCredentialController', 'changeAuthentication')): ?> diff --git a/app/common.php b/app/common.php index 72be3603..15fd7a75 100644 --- a/app/common.php +++ b/app/common.php @@ -46,6 +46,7 @@ $container->register(new Kanboard\ServiceProvider\ActionProvider()); $container->register(new Kanboard\ServiceProvider\ExternalLinkProvider()); $container->register(new Kanboard\ServiceProvider\AvatarProvider()); $container->register(new Kanboard\ServiceProvider\FilterProvider()); +$container->register(new Kanboard\ServiceProvider\JobProvider()); $container->register(new Kanboard\ServiceProvider\QueueProvider()); $container->register(new Kanboard\ServiceProvider\ApiProvider()); $container->register(new Kanboard\ServiceProvider\CommandProvider()); |