diff options
Diffstat (limited to 'app')
311 files changed, 4158 insertions, 3434 deletions
diff --git a/app/Action/TaskEmail.php b/app/Action/TaskEmail.php index fdfe7987..559c2c0b 100644 --- a/app/Action/TaskEmail.php +++ b/app/Action/TaskEmail.php @@ -34,6 +34,7 @@ class TaskEmail extends Base return array( TaskModel::EVENT_MOVE_COLUMN, TaskModel::EVENT_CLOSE, + TaskModel::EVENT_CREATE, ); } diff --git a/app/Api/Procedure/ActionProcedure.php b/app/Api/Procedure/ActionProcedure.php index 4043dbb9..72fb9bbe 100644 --- a/app/Api/Procedure/ActionProcedure.php +++ b/app/Api/Procedure/ActionProcedure.php @@ -15,17 +15,17 @@ class ActionProcedure extends BaseProcedure { public function getAvailableActions() { - return $this->actionManager->getAvailableActions(); + return (object) $this->actionManager->getAvailableActions(); } public function getAvailableActionEvents() { - return $this->eventManager->getAll(); + return (object) $this->eventManager->getAll(); } public function getCompatibleActionEvents($action_name) { - return $this->actionManager->getCompatibleEvents($action_name); + return (object) $this->actionManager->getCompatibleEvents($action_name); } public function removeAction($action_id) diff --git a/app/Api/Procedure/BoardProcedure.php b/app/Api/Procedure/BoardProcedure.php index 674b5466..69daaf09 100644 --- a/app/Api/Procedure/BoardProcedure.php +++ b/app/Api/Procedure/BoardProcedure.php @@ -3,7 +3,6 @@ namespace Kanboard\Api\Procedure; use Kanboard\Api\Authorization\ProjectAuthorization; -use Kanboard\Formatter\BoardFormatter; /** * Board API controller @@ -17,7 +16,7 @@ class BoardProcedure extends BaseProcedure { ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getBoard', $project_id); - return BoardFormatter::getInstance($this->container) + return $this->boardFormatter ->withProjectId($project_id) ->withQuery($this->taskFinderModel->getExtendedQuery()) ->format(); diff --git a/app/Api/Procedure/MeProcedure.php b/app/Api/Procedure/MeProcedure.php index e59e6522..71d5555b 100644 --- a/app/Api/Procedure/MeProcedure.php +++ b/app/Api/Procedure/MeProcedure.php @@ -54,7 +54,7 @@ class MeProcedure extends BaseProcedure public function getMyProjectsList() { - return $this->projectUserRoleModel->getProjectsByUser($this->userSession->getId()); + return (object) $this->projectUserRoleModel->getProjectsByUser($this->userSession->getId()); } public function getMyOverdueTasks() diff --git a/app/Api/Procedure/ProjectPermissionProcedure.php b/app/Api/Procedure/ProjectPermissionProcedure.php index e22e1d62..1938a067 100644 --- a/app/Api/Procedure/ProjectPermissionProcedure.php +++ b/app/Api/Procedure/ProjectPermissionProcedure.php @@ -16,13 +16,13 @@ class ProjectPermissionProcedure extends BaseProcedure public function getProjectUsers($project_id) { ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getProjectUsers', $project_id); - return $this->projectUserRoleModel->getAllUsers($project_id); + return (object) $this->projectUserRoleModel->getAllUsers($project_id); } public function getAssignableUsers($project_id, $prepend_unassigned = false) { ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getAssignableUsers', $project_id); - return $this->projectUserRoleModel->getAssignableUsersList($project_id, $prepend_unassigned); + return (object) $this->projectUserRoleModel->getAssignableUsersList($project_id, $prepend_unassigned); } public function addProjectUser($project_id, $user_id, $role = Role::PROJECT_MEMBER) diff --git a/app/Api/Procedure/TaskMetadataProcedure.php b/app/Api/Procedure/TaskMetadataProcedure.php index 169482f5..ab6c32d0 100644 --- a/app/Api/Procedure/TaskMetadataProcedure.php +++ b/app/Api/Procedure/TaskMetadataProcedure.php @@ -15,7 +15,7 @@ class TaskMetadataProcedure extends BaseProcedure public function getTaskMetadata($task_id) { TaskAuthorization::getInstance($this->container)->check($this->getClassName(), 'getTask', $task_id); - return $this->taskMetadataModel->getAll($task_id); + return (object) $this->taskMetadataModel->getAll($task_id); } public function getTaskMetadataByName($task_id, $name) diff --git a/app/Api/Procedure/TaskProcedure.php b/app/Api/Procedure/TaskProcedure.php index ee9242d1..af67f3de 100644 --- a/app/Api/Procedure/TaskProcedure.php +++ b/app/Api/Procedure/TaskProcedure.php @@ -87,9 +87,9 @@ class TaskProcedure extends BaseProcedure } public function createTask($title, $project_id, $color_id = '', $column_id = 0, $owner_id = 0, $creator_id = 0, - $date_due = '', $description = '', $category_id = 0, $score = 0, $swimlane_id = 0, $priority = 0, - $recurrence_status = 0, $recurrence_trigger = 0, $recurrence_factor = 0, $recurrence_timeframe = 0, - $recurrence_basedate = 0, $reference = '') + $date_due = '', $description = '', $category_id = 0, $score = 0, $swimlane_id = 0, $priority = 0, + $recurrence_status = 0, $recurrence_trigger = 0, $recurrence_factor = 0, $recurrence_timeframe = 0, + $recurrence_basedate = 0, $reference = '', array $tags = array()) { ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'createTask', $project_id); @@ -120,6 +120,7 @@ class TaskProcedure extends BaseProcedure 'recurrence_basedate' => $recurrence_basedate, 'reference' => $reference, 'priority' => $priority, + 'tags' => $tags, ); list($valid, ) = $this->taskValidator->validateCreation($values); @@ -128,9 +129,9 @@ class TaskProcedure extends BaseProcedure } public function updateTask($id, $title = null, $color_id = null, $owner_id = null, - $date_due = null, $description = null, $category_id = null, $score = null, $priority = null, - $recurrence_status = null, $recurrence_trigger = null, $recurrence_factor = null, - $recurrence_timeframe = null, $recurrence_basedate = null, $reference = null) + $date_due = null, $description = null, $category_id = null, $score = null, $priority = null, + $recurrence_status = null, $recurrence_trigger = null, $recurrence_factor = null, + $recurrence_timeframe = null, $recurrence_basedate = null, $reference = null, $tags = null) { TaskAuthorization::getInstance($this->container)->check($this->getClassName(), 'updateTask', $id); $project_id = $this->taskFinderModel->getProjectId($id); @@ -159,6 +160,7 @@ class TaskProcedure extends BaseProcedure 'recurrence_basedate' => $recurrence_basedate, 'reference' => $reference, 'priority' => $priority, + 'tags' => $tags, )); list($valid) = $this->taskValidator->validateApiModification($values); diff --git a/app/Api/Procedure/TaskTagProcedure.php b/app/Api/Procedure/TaskTagProcedure.php index 8596f507..55dac8d4 100644 --- a/app/Api/Procedure/TaskTagProcedure.php +++ b/app/Api/Procedure/TaskTagProcedure.php @@ -21,6 +21,6 @@ class TaskTagProcedure extends BaseProcedure public function getTaskTags($task_id) { TaskAuthorization::getInstance($this->container)->check($this->getClassName(), 'getTaskTags', $task_id); - return $this->taskTagModel->getList($task_id); + return (object) $this->taskTagModel->getList($task_id); } } diff --git a/app/Console/JobCommand.php b/app/Console/JobCommand.php new file mode 100644 index 00000000..bdaae32f --- /dev/null +++ b/app/Console/JobCommand.php @@ -0,0 +1,35 @@ +<?php + +namespace Kanboard\Console; + +use Kanboard\Core\Queue\JobHandler; +use SimpleQueue\Job; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Class JobCommand + * + * @package Kanboard\Console + * @author Frederic Guillot + */ +class JobCommand extends BaseCommand +{ + protected function configure() + { + $this + ->setName('job') + ->setDescription('Execute individual job (read payload from stdin)') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $payload = fgets(STDIN); + + $job = new Job(); + $job->unserialize($payload); + + JobHandler::getInstance($this->container)->executeJob($job); + } +} diff --git a/app/Controller/BoardAjaxController.php b/app/Controller/BoardAjaxController.php index 484ef67d..ecb76e9c 100644 --- a/app/Controller/BoardAjaxController.php +++ b/app/Controller/BoardAjaxController.php @@ -3,7 +3,6 @@ namespace Kanboard\Controller; use Kanboard\Core\Controller\AccessForbiddenException; -use Kanboard\Formatter\BoardFormatter; use Kanboard\Model\UserMetadataModel; /** @@ -139,7 +138,7 @@ class BoardAjaxController extends BaseController 'board_highlight_period' => $this->configModel->get('board_highlight_period'), 'swimlanes' => $this->taskLexer ->build($this->userSession->getFilters($project_id)) - ->format(BoardFormatter::getInstance($this->container)->withProjectId($project_id)) + ->format($this->boardFormatter->withProjectId($project_id)) )); } } diff --git a/app/Controller/BoardViewController.php b/app/Controller/BoardViewController.php index 10165908..9ef77e54 100644 --- a/app/Controller/BoardViewController.php +++ b/app/Controller/BoardViewController.php @@ -3,7 +3,6 @@ namespace Kanboard\Controller; use Kanboard\Core\Controller\AccessForbiddenException; -use Kanboard\Formatter\BoardFormatter; use Kanboard\Model\TaskModel; /** @@ -35,7 +34,7 @@ class BoardViewController extends BaseController $this->response->html($this->helper->layout->app('board/view_public', array( 'project' => $project, - 'swimlanes' => BoardFormatter::getInstance($this->container) + 'swimlanes' => $this->boardFormatter ->withProjectId($project['id']) ->withQuery($query) ->format() @@ -68,7 +67,7 @@ class BoardViewController extends BaseController 'board_highlight_period' => $this->configModel->get('board_highlight_period'), 'swimlanes' => $this->taskLexer ->build($search) - ->format(BoardFormatter::getInstance($this->container)->withProjectId($project['id'])) + ->format($this->boardFormatter->withProjectId($project['id'])) ))); } } diff --git a/app/Controller/ColumnController.php b/app/Controller/ColumnController.php index 8c366c6e..69167976 100644 --- a/app/Controller/ColumnController.php +++ b/app/Controller/ColumnController.php @@ -60,7 +60,7 @@ class ColumnController extends BaseController public function save() { $project = $this->getProject(); - $values = $this->request->getValues(); + $values = $this->request->getValues() + array('hide_in_dashboard' => 0); list($valid, $errors) = $this->columnValidator->validateCreation($values); @@ -70,18 +70,19 @@ class ColumnController extends BaseController $values['title'], $values['task_limit'], $values['description'], - isset($values['hide_in_dashboard']) ? $values['hide_in_dashboard'] : 0 + $values['hide_in_dashboard'] ); if ($result !== false) { $this->flash->success(t('Column created successfully.')); - return $this->response->redirect($this->helper->url->to('ColumnController', 'index', array('project_id' => $project['id'])), true); + $this->response->redirect($this->helper->url->to('ColumnController', 'index', array('project_id' => $project['id'])), true); + return; } else { $errors['title'] = array(t('Another column with the same name exists in the project')); } } - return $this->create($values, $errors); + $this->create($values, $errors); } /** @@ -112,7 +113,7 @@ class ColumnController extends BaseController public function update() { $project = $this->getProject(); - $values = $this->request->getValues(); + $values = $this->request->getValues() + array('hide_in_dashboard' => 0); list($valid, $errors) = $this->columnValidator->validateModification($values); @@ -122,18 +123,19 @@ class ColumnController extends BaseController $values['title'], $values['task_limit'], $values['description'], - isset($values['hide_in_dashboard']) ? $values['hide_in_dashboard'] : 0 + $values['hide_in_dashboard'] ); if ($result) { $this->flash->success(t('Board updated successfully.')); - return $this->response->redirect($this->helper->url->to('ColumnController', 'index', array('project_id' => $project['id']))); + $this->response->redirect($this->helper->url->to('ColumnController', 'index', array('project_id' => $project['id'])), true); + return; } else { $this->flash->failure(t('Unable to update this board.')); } } - return $this->edit($values, $errors); + $this->edit($values, $errors); } /** diff --git a/app/Controller/ConfigController.php b/app/Controller/ConfigController.php index 8285ee13..8572316e 100644 --- a/app/Controller/ConfigController.php +++ b/app/Controller/ConfigController.php @@ -76,7 +76,6 @@ class ConfigController extends BaseController 'languages' => $this->languageModel->getLanguages(), 'timezones' => $this->timezoneModel->getTimezones(), 'date_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getDateFormats()), - 'datetime_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getDateTimeFormats()), 'time_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getTimeFormats()), 'title' => t('Settings').' > '.t('Application settings'), ))); diff --git a/app/Controller/CurrencyController.php b/app/Controller/CurrencyController.php index ad590035..155e229e 100644 --- a/app/Controller/CurrencyController.php +++ b/app/Controller/CurrencyController.php @@ -11,21 +11,33 @@ namespace Kanboard\Controller; class CurrencyController extends BaseController { /** - * Display all currency rates and form + * Display all currency rates + * + * @access public + */ + public function show() + { + $this->response->html($this->helper->layout->config('currency/show', array( + 'application_currency' => $this->configModel->get('application_currency'), + 'rates' => $this->currencyModel->getAll(), + 'currencies' => $this->currencyModel->getCurrencies(), + 'title' => t('Settings') . ' > ' . t('Currency rates'), + ))); + } + + /** + * Add or change currency rate * * @access public * @param array $values * @param array $errors */ - public function index(array $values = array(), array $errors = array()) + public function create(array $values = array(), array $errors = array()) { - $this->response->html($this->helper->layout->config('currency/index', array( - 'config_values' => array('application_currency' => $this->configModel->get('application_currency')), - 'values' => $values, - 'errors' => $errors, - 'rates' => $this->currencyModel->getAll(), + $this->response->html($this->template->render('currency/create', array( + 'values' => $values, + 'errors' => $errors, 'currencies' => $this->currencyModel->getCurrencies(), - 'title' => t('Settings').' > '.t('Currency rates'), ))); } @@ -34,7 +46,7 @@ class CurrencyController extends BaseController * * @access public */ - public function create() + public function save() { $values = $this->request->getValues(); list($valid, $errors) = $this->currencyValidator->validateCreation($values); @@ -42,13 +54,34 @@ class CurrencyController extends BaseController if ($valid) { if ($this->currencyModel->create($values['currency'], $values['rate'])) { $this->flash->success(t('The currency rate have been added successfully.')); - return $this->response->redirect($this->helper->url->to('CurrencyController', 'index')); + $this->response->redirect($this->helper->url->to('CurrencyController', 'show'), true); + return; } else { $this->flash->failure(t('Unable to add this currency rate.')); } } - return $this->index($values, $errors); + $this->create($values, $errors); + } + + /** + * Change reference currency + * + * @access public + * @param array $values + * @param array $errors + */ + public function change(array $values = array(), array $errors = array()) + { + if (empty($values)) { + $values['application_currency'] = $this->configModel->get('application_currency'); + } + + $this->response->html($this->template->render('currency/change', array( + 'values' => $values, + 'errors' => $errors, + 'currencies' => $this->currencyModel->getCurrencies(), + ))); } /** @@ -56,7 +89,7 @@ class CurrencyController extends BaseController * * @access public */ - public function reference() + public function update() { $values = $this->request->getValues(); @@ -66,6 +99,6 @@ class CurrencyController extends BaseController $this->flash->failure(t('Unable to save your settings.')); } - $this->response->redirect($this->helper->url->to('CurrencyController', 'index')); + $this->response->redirect($this->helper->url->to('CurrencyController', 'show'), true); } } diff --git a/app/Controller/CustomFilterController.php b/app/Controller/CustomFilterController.php index e5f674cd..dfe1ffc4 100644 --- a/app/Controller/CustomFilterController.php +++ b/app/Controller/CustomFilterController.php @@ -18,17 +18,13 @@ class CustomFilterController extends BaseController * Display list of filters * * @access public - * @param array $values - * @param array $errors * @throws \Kanboard\Core\Controller\PageNotFoundException */ - public function index(array $values = array(), array $errors = array()) + public function index() { $project = $this->getProject(); $this->response->html($this->helper->layout->project('custom_filter/index', array( - 'values' => $values + array('project_id' => $project['id']), - 'errors' => $errors, 'project' => $project, 'custom_filters' => $this->customFilterModel->getAll($project['id'], $this->userSession->getId()), 'title' => t('Custom filters'), @@ -36,6 +32,24 @@ class CustomFilterController extends BaseController } /** + * Show creation form for custom filters + * + * @access public + * @param array $values + * @param array $errors + */ + public function create(array $values = array(), array $errors = array()) + { + $project = $this->getProject(); + + $this->response->html($this->template->render('custom_filter/create', array( + 'values' => $values + array('project_id' => $project['id']), + 'errors' => $errors, + 'project' => $project, + ))); + } + + /** * Save a new custom filter * * @access public @@ -52,13 +66,14 @@ class CustomFilterController extends BaseController if ($valid) { if ($this->customFilterModel->create($values) !== false) { $this->flash->success(t('Your custom filter have been created successfully.')); - return $this->response->redirect($this->helper->url->to('CustomFilterController', 'index', array('project_id' => $project['id']))); + $this->response->redirect($this->helper->url->to('CustomFilterController', 'index', array('project_id' => $project['id'])), true); + return; } else { $this->flash->failure(t('Unable to create your custom filter.')); } } - return $this->index($values, $errors); + $this->create($values, $errors); } /** @@ -152,13 +167,14 @@ class CustomFilterController extends BaseController if ($valid) { if ($this->customFilterModel->update($values)) { $this->flash->success(t('Your custom filter have been updated successfully.')); - return $this->response->redirect($this->helper->url->to('CustomFilterController', 'index', array('project_id' => $project['id']))); + $this->response->redirect($this->helper->url->to('CustomFilterController', 'index', array('project_id' => $project['id'])), true); + return; } else { $this->flash->failure(t('Unable to update custom filter.')); } } - return $this->edit($values, $errors); + $this->edit($values, $errors); } private function checkPermission(array $project, array $filter) diff --git a/app/Controller/ExportController.php b/app/Controller/ExportController.php index b7ac92aa..19f73a7c 100644 --- a/app/Controller/ExportController.php +++ b/app/Controller/ExportController.php @@ -24,27 +24,29 @@ class ExportController extends BaseController private function common($model, $method, $filename, $action, $page_title) { $project = $this->getProject(); - $from = $this->request->getStringParam('from'); - $to = $this->request->getStringParam('to'); - if ($from && $to) { - $data = $this->$model->$method($project['id'], $from, $to); - $this->response->withFileDownload($filename.'.csv'); - $this->response->csv($data); - } else { + if ($this->request->isPost()) { + $values = $this->request->getValues(); + $from = empty($values['from']) ? '' : $values['from']; + $to = empty($values['to']) ? '' : $values['to']; - $this->response->html($this->helper->layout->project('export/'.$action, array( - 'values' => array( - 'controller' => 'ExportController', - 'action' => $action, + if ($from && $to) { + $data = $this->$model->$method($project['id'], $from, $to); + $this->response->withFileDownload($filename.'.csv'); + $this->response->csv($data); + return; + } + } else { + $this->response->html($this->template->render('export/'.$action, array( + 'values' => array( 'project_id' => $project['id'], - 'from' => $from, - 'to' => $to, + 'from' => '', + 'to' => '', ), - 'errors' => array(), + 'errors' => array(), 'project' => $project, - 'title' => $page_title, - ), 'export/sidebar')); + 'title' => $page_title, + ))); } } diff --git a/app/Controller/FileViewerController.php b/app/Controller/FileViewerController.php index 518f5b0b..49568912 100644 --- a/app/Controller/FileViewerController.php +++ b/app/Controller/FileViewerController.php @@ -15,11 +15,11 @@ class FileViewerController extends BaseController /** * Get file content from object storage * - * @access private + * @access protected * @param array $file * @return string */ - private function getFileContent(array $file) + protected function getFileContent(array $file) { $content = ''; @@ -35,6 +35,30 @@ class FileViewerController extends BaseController } /** + * Output file with cache + * + * @param array $file + * @param $mimetype + */ + protected function renderFileWithCache(array $file, $mimetype) + { + $etag = md5($file['path']); + + if ($this->request->getHeader('If-None-Match') === '"'.$etag.'"') { + $this->response->status(304); + } else { + try { + $this->response->withContentType($mimetype); + $this->response->withCache(5 * 86400, $etag); + $this->response->send(); + $this->objectStorage->output($file['path']); + } catch (ObjectStorageException $e) { + $this->logger->error($e->getMessage()); + } + } + } + + /** * Show file content in a popover * * @access public @@ -65,21 +89,18 @@ class FileViewerController extends BaseController public function image() { $file = $this->getFile(); - $etag = md5($file['path']); - $this->response->withContentType($this->helper->file->getImageMimeType($file['name'])); - $this->response->withCache(5 * 86400, $etag); - - if ($this->request->getHeader('If-None-Match') === '"'.$etag.'"') { - $this->response->status(304); - } else { + $this->renderFileWithCache($file, $this->helper->file->getImageMimeType($file['name'])); + } - try { - $this->response->send(); - $this->objectStorage->output($file['path']); - } catch (ObjectStorageException $e) { - $this->logger->error($e->getMessage()); - } - } + /** + * Display file in browser + * + * @access public + */ + public function browser() + { + $file = $this->getFile(); + $this->renderFileWithCache($file, $this->helper->file->getBrowserViewType($file['name'])); } /** diff --git a/app/Controller/GroupAjaxController.php b/app/Controller/GroupAjaxController.php index 496e9ef2..308bba9e 100644 --- a/app/Controller/GroupAjaxController.php +++ b/app/Controller/GroupAjaxController.php @@ -2,8 +2,6 @@ namespace Kanboard\Controller; -use Kanboard\Formatter\GroupAutoCompleteFormatter; - /** * Group Ajax Controller * @@ -20,7 +18,7 @@ class GroupAjaxController extends BaseController public function autocomplete() { $search = $this->request->getStringParam('term'); - $formatter = new GroupAutoCompleteFormatter($this->groupManager->find($search)); - $this->response->json($formatter->format()); + $groups = $this->groupManager->find($search); + $this->response->json($this->groupAutoCompleteFormatter->withGroups($groups)->format()); } } diff --git a/app/Controller/ICalendarController.php b/app/Controller/ICalendarController.php index e354c6f1..4fe8b78a 100644 --- a/app/Controller/ICalendarController.php +++ b/app/Controller/ICalendarController.php @@ -7,7 +7,6 @@ use Kanboard\Core\Filter\QueryBuilder; use Kanboard\Filter\TaskAssigneeFilter; use Kanboard\Filter\TaskProjectFilter; use Kanboard\Filter\TaskStatusFilter; -use Kanboard\Formatter\TaskICalFormatter; use Kanboard\Model\TaskModel; use Eluceo\iCal\Component\Calendar as iCalendar; @@ -94,8 +93,6 @@ class ICalendarController extends BaseController $end = $this->request->getStringParam('end', strtotime('+6 months')); $this->helper->ical->addTaskDateDueEvents($queryBuilder, $calendar, $start, $end); - - $formatter = new TaskICalFormatter($this->container); - $this->response->ical($formatter->setCalendar($calendar)->format()); + $this->response->ical($this->taskICalFormatter->setCalendar($calendar)->format()); } } diff --git a/app/Controller/LinkController.php b/app/Controller/LinkController.php index 477b25a4..2ad8a2b5 100644 --- a/app/Controller/LinkController.php +++ b/app/Controller/LinkController.php @@ -16,11 +16,11 @@ class LinkController extends BaseController /** * Get the current link * - * @access private + * @access protected * @return array * @throws PageNotFoundException */ - private function getLink() + protected function getLink() { $link = $this->linkModel->getById($this->request->getIntegerParam('link_id')); @@ -32,19 +32,31 @@ class LinkController extends BaseController } /** - * List of links + * List of labels + * + * @access public + */ + public function show() + { + $this->response->html($this->helper->layout->config('link/show', array( + 'links' => $this->linkModel->getMergedList(), + 'title' => t('Settings').' > '.t('Link labels'), + ))); + } + + /** + * Add new link label * * @access public * @param array $values * @param array $errors */ - public function index(array $values = array(), array $errors = array()) + public function create(array $values = array(), array $errors = array()) { - $this->response->html($this->helper->layout->config('link/index', array( - 'links' => $this->linkModel->getMergedList(), + $this->response->html($this->template->render('link/create', array( + 'links' => $this->linkModel->getMergedList(), 'values' => $values, 'errors' => $errors, - 'title' => t('Settings').' > '.t('Task\'s links'), ))); } @@ -61,21 +73,22 @@ class LinkController extends BaseController if ($valid) { if ($this->linkModel->create($values['label'], $values['opposite_label']) !== false) { $this->flash->success(t('Link added successfully.')); - return $this->response->redirect($this->helper->url->to('LinkController', 'index')); + $this->response->redirect($this->helper->url->to('LinkController', 'show'), true); + return; } else { $this->flash->failure(t('Unable to create your link.')); } } - return $this->index($values, $errors); + $this->create($values, $errors); } /** * Edit form * * @access public - * @param array $values - * @param array $errors + * @param array $values + * @param array $errors * @throws PageNotFoundException */ public function edit(array $values = array(), array $errors = array()) @@ -83,12 +96,11 @@ class LinkController extends BaseController $link = $this->getLink(); $link['label'] = t($link['label']); - $this->response->html($this->helper->layout->config('link/edit', array( + $this->response->html($this->template->render('link/edit', array( 'values' => $values ?: $link, 'errors' => $errors, 'labels' => $this->linkModel->getList($link['id']), - 'link' => $link, - 'title' => t('Link modification') + 'link' => $link, ))); } @@ -105,13 +117,14 @@ class LinkController extends BaseController if ($valid) { if ($this->linkModel->update($values)) { $this->flash->success(t('Link updated successfully.')); - return $this->response->redirect($this->helper->url->to('LinkController', 'index')); + $this->response->redirect($this->helper->url->to('LinkController', 'show'), true); + return; } else { $this->flash->failure(t('Unable to update your link.')); } } - return $this->edit($values, $errors); + $this->edit($values, $errors); } /** @@ -123,9 +136,8 @@ class LinkController extends BaseController { $link = $this->getLink(); - $this->response->html($this->helper->layout->config('link/remove', array( + $this->response->html($this->template->render('link/remove', array( 'link' => $link, - 'title' => t('Remove a link') ))); } @@ -145,6 +157,6 @@ class LinkController extends BaseController $this->flash->failure(t('Unable to remove this link.')); } - $this->response->redirect($this->helper->url->to('LinkController', 'index')); + $this->response->redirect($this->helper->url->to('LinkController', 'show'), true); } } diff --git a/app/Controller/PluginController.php b/app/Controller/PluginController.php index 7b9d64d9..dbb739d6 100644 --- a/app/Controller/PluginController.php +++ b/app/Controller/PluginController.php @@ -23,6 +23,7 @@ class PluginController extends BaseController { $this->response->html($this->helper->layout->plugin('plugin/show', array( 'plugins' => $this->pluginLoader->getPlugins(), + 'incompatible_plugins' => $this->pluginLoader->getIncompatiblePlugins(), 'title' => t('Installed Plugins'), 'is_configured' => Installer::isConfigured(), ))); diff --git a/app/Controller/ProjectEditController.php b/app/Controller/ProjectEditController.php index 228d681c..ae39fdf3 100644 --- a/app/Controller/ProjectEditController.php +++ b/app/Controller/ProjectEditController.php @@ -11,51 +11,23 @@ namespace Kanboard\Controller; class ProjectEditController extends BaseController { /** - * General edition (most common operations) + * Edit project * * @access public * @param array $values * @param array $errors */ - public function edit(array $values = array(), array $errors = array()) + public function show(array $values = array(), array $errors = array()) { - $this->renderView('project_edit/general', $values, $errors); - } - - /** - * Change start and end dates - * - * @access public - * @param array $values - * @param array $errors - */ - public function dates(array $values = array(), array $errors = array()) - { - $this->renderView('project_edit/dates', $values, $errors); - } - - /** - * Change project description - * - * @access public - * @param array $values - * @param array $errors - */ - public function description(array $values = array(), array $errors = array()) - { - $this->renderView('project_edit/description', $values, $errors); - } + $project = $this->getProject(); - /** - * Change task priority - * - * @access public - * @param array $values - * @param array $errors - */ - public function priority(array $values = array(), array $errors = array()) - { - $this->renderView('project_edit/task_priority', $values, $errors); + $this->response->html($this->helper->layout->project('project_edit/show', array( + 'owners' => $this->projectUserRoleModel->getAssignableUsersList($project['id'], true), + 'values' => empty($values) ? $project : $values, + 'errors' => $errors, + 'project' => $project, + 'title' => t('Edit project') + ))); } /** @@ -67,67 +39,42 @@ class ProjectEditController extends BaseController { $project = $this->getProject(); $values = $this->request->getValues(); - $redirect = $this->request->getStringParam('redirect', 'edit'); - $values = $this->prepareValues($redirect, $project, $values); + $values = $this->prepareValues($project, $values); list($valid, $errors) = $this->projectValidator->validateModification($values); if ($valid) { if ($this->projectModel->update($values)) { $this->flash->success(t('Project updated successfully.')); - return $this->response->redirect($this->helper->url->to('ProjectEditController', $redirect, array('project_id' => $project['id'])), true); + return $this->response->redirect($this->helper->url->to('ProjectEditController', 'show', array('project_id' => $project['id'])), true); } else { $this->flash->failure(t('Unable to update this project.')); } } - return $this->$redirect($values, $errors); + return $this->show($values, $errors); } /** * Prepare form values * * @access private - * @param string $redirect * @param array $project * @param array $values * @return array */ - private function prepareValues($redirect, array $project, array $values) + private function prepareValues(array $project, array $values) { - if ($redirect === 'edit') { - if (isset($values['is_private'])) { - if (! $this->helper->user->hasProjectAccess('ProjectCreationController', 'create', $project['id'])) { - unset($values['is_private']); - } - } elseif ($project['is_private'] == 1 && ! isset($values['is_private'])) { - if ($this->helper->user->hasProjectAccess('ProjectCreationController', 'create', $project['id'])) { - $values += array('is_private' => 0); - } + if (isset($values['is_private'])) { + if (! $this->helper->user->hasProjectAccess('ProjectCreationController', 'create', $project['id'])) { + unset($values['is_private']); + } + } elseif ($project['is_private'] == 1 && ! isset($values['is_private'])) { + if ($this->helper->user->hasProjectAccess('ProjectCreationController', 'create', $project['id'])) { + $values += array('is_private' => 0); } } return $values; } - - /** - * Common method to render different views - * - * @access private - * @param string $template - * @param array $values - * @param array $errors - */ - private function renderView($template, array $values, array $errors) - { - $project = $this->getProject(); - - $this->response->html($this->helper->layout->project($template, array( - 'owners' => $this->projectUserRoleModel->getAssignableUsersList($project['id'], true), - 'values' => empty($values) ? $project : $values, - 'errors' => $errors, - 'project' => $project, - 'title' => t('Edit project') - ))); - } } diff --git a/app/Controller/ProjectGanttController.php b/app/Controller/ProjectGanttController.php index a70d9eee..8239005e 100644 --- a/app/Controller/ProjectGanttController.php +++ b/app/Controller/ProjectGanttController.php @@ -5,7 +5,6 @@ namespace Kanboard\Controller; use Kanboard\Filter\ProjectIdsFilter; use Kanboard\Filter\ProjectStatusFilter; use Kanboard\Filter\ProjectTypeFilter; -use Kanboard\Formatter\ProjectGanttFormatter; use Kanboard\Model\ProjectModel; /** @@ -30,7 +29,7 @@ class ProjectGanttController extends BaseController $filter->getQuery()->asc(ProjectModel::TABLE.'.start_date'); $this->response->html($this->helper->layout->app('project_gantt/show', array( - 'projects' => $filter->format(new ProjectGanttFormatter($this->container)), + 'projects' => $filter->format($this->projectGanttFormatter), 'title' => t('Gantt chart for all projects'), ))); } diff --git a/app/Controller/TaskAjaxController.php b/app/Controller/TaskAjaxController.php index 609dd23c..6d0b3fc2 100644 --- a/app/Controller/TaskAjaxController.php +++ b/app/Controller/TaskAjaxController.php @@ -8,8 +8,6 @@ use Kanboard\Filter\TaskProjectsFilter; use Kanboard\Filter\TaskStartsWithIdFilter; use Kanboard\Filter\TaskStatusFilter; use Kanboard\Filter\TaskTitleFilter; -use Kanboard\Formatter\TaskAutoCompleteFormatter; -use Kanboard\Formatter\TaskSuggestMenuFormatter; use Kanboard\Model\TaskModel; /** @@ -46,7 +44,7 @@ class TaskAjaxController extends BaseController $filter->withFilter(new TaskTitleFilter($search)); } - $this->response->json($filter->format(new TaskAutoCompleteFormatter($this->container))); + $this->response->json($filter->format($this->taskAutoCompleteFormatter)); } } @@ -66,7 +64,7 @@ class TaskAjaxController extends BaseController ->withFilter(new TaskStatusFilter(TaskModel::STATUS_OPEN)) ->withFilter(new TaskStartsWithIdFilter($taskId)); - $this->response->json($filter->format(new TaskSuggestMenuFormatter($this->container))); + $this->response->json($filter->format($this->taskSuggestMenuFormatter)); } } } diff --git a/app/Controller/TaskCreationController.php b/app/Controller/TaskCreationController.php index ec53e211..20457568 100644 --- a/app/Controller/TaskCreationController.php +++ b/app/Controller/TaskCreationController.php @@ -24,10 +24,7 @@ class TaskCreationController extends BaseController { $project = $this->getProject(); $swimlanes_list = $this->swimlaneModel->getList($project['id'], false, true); - - if (empty($values)) { - $values = $this->prepareValues($swimlanes_list); - } + $values += $this->prepareValues($swimlanes_list); $values = $this->hook->merge('controller:task:form:default', $values, array('default_values' => $values)); $values = $this->hook->merge('controller:task-creation:form:default', $values, array('default_values' => $values)); diff --git a/app/Controller/TaskExternalLinkController.php b/app/Controller/TaskExternalLinkController.php index 9c04eb00..df23f87b 100644 --- a/app/Controller/TaskExternalLinkController.php +++ b/app/Controller/TaskExternalLinkController.php @@ -76,12 +76,23 @@ class TaskExternalLinkController extends BaseController $values = $this->request->getValues(); list($valid, $errors) = $this->externalLinkValidator->validateCreation($values); - if ($valid && $this->taskExternalLinkModel->create($values) !== false) { - $this->flash->success(t('Link added successfully.')); - return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); + if ($valid) { + if ($this->taskExternalLinkModel->create($values) !== false) { + $this->flash->success(t('Link added successfully.')); + } else { + $this->flash->success(t('Unable to create your link.')); + } + + $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); + } else { + $provider = $this->externalLinkManager->getProvider($values['link_type']); + $this->response->html($this->template->render('task_external_link/create', array( + 'values' => $values, + 'errors' => $errors, + 'dependencies' => $provider->getDependencies(), + 'task' => $task, + ))); } - - return $this->edit($values, $errors); } /** diff --git a/app/Controller/TaskGanttController.php b/app/Controller/TaskGanttController.php index 868368e1..b03b9d00 100644 --- a/app/Controller/TaskGanttController.php +++ b/app/Controller/TaskGanttController.php @@ -3,7 +3,6 @@ namespace Kanboard\Controller; use Kanboard\Filter\TaskProjectFilter; -use Kanboard\Formatter\TaskGanttFormatter; use Kanboard\Model\TaskModel; /** @@ -35,7 +34,7 @@ class TaskGanttController extends BaseController 'title' => $project['name'], 'description' => $this->helper->projectHeader->getDescription($project), 'sorting' => $sorting, - 'tasks' => $filter->format(new TaskGanttFormatter($this->container)), + 'tasks' => $filter->format($this->taskGanttFormatter), ))); } diff --git a/app/Controller/TaskGanttCreationController.php b/app/Controller/TaskGanttCreationController.php deleted file mode 100644 index c5046f60..00000000 --- a/app/Controller/TaskGanttCreationController.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php - -namespace Kanboard\Controller; - -/** - * Class TaskGanttCreationController - * - * @package Kanboard\Controller - * @author Frederic Guillot - */ -class TaskGanttCreationController extends BaseController -{ - /** - * Simplified form to create a new task - * - * @access public - * @param array $values - * @param array $errors - * @throws \Kanboard\Core\Controller\PageNotFoundException - */ - public function show(array $values = array(), array $errors = array()) - { - $project = $this->getProject(); - - $values = $values + array( - 'project_id' => $project['id'], - 'column_id' => $this->columnModel->getFirstColumnId($project['id']), - 'position' => 1 - ); - - $values = $this->hook->merge('controller:task:form:default', $values, array('default_values' => $values)); - $values = $this->hook->merge('controller:gantt:task:form:default', $values, array('default_values' => $values)); - - $this->response->html($this->template->render('task_gantt_creation/show', array( - 'project' => $project, - 'errors' => $errors, - 'values' => $values, - 'users_list' => $this->projectUserRoleModel->getAssignableUsersList($project['id'], true, false, true), - 'categories_list' => $this->categoryModel->getList($project['id']), - 'swimlanes_list' => $this->swimlaneModel->getList($project['id'], false, true), - ))); - } - - /** - * Validate and save a new task - * - * @access public - */ - public function save() - { - $project = $this->getProject(); - $values = $this->request->getValues(); - - list($valid, $errors) = $this->taskValidator->validateCreation($values); - - if ($valid && $this->taskCreationModel->create($values)) { - $this->flash->success(t('Task created successfully.')); - $this->response->redirect($this->helper->url->to('TaskGanttController', 'show', array('project_id' => $project['id']))); - } else { - $this->flash->failure(t('Unable to create your task.')); - $this->show($values, $errors); - } - } -} diff --git a/app/Controller/TaskImportController.php b/app/Controller/TaskImportController.php index 3ce275a5..2e323979 100644 --- a/app/Controller/TaskImportController.php +++ b/app/Controller/TaskImportController.php @@ -23,15 +23,14 @@ class TaskImportController extends BaseController { $project = $this->getProject(); - $this->response->html($this->helper->layout->project('task_import/show', array( + $this->response->html($this->template->render('task_import/show', array( 'project' => $project, 'values' => $values, 'errors' => $errors, 'max_size' => get_upload_max_size(), 'delimiters' => Csv::getDelimiters(), 'enclosures' => Csv::getEnclosures(), - 'title' => t('Import tasks from CSV file'), - ), 'task_import/sidebar')); + ))); } /** @@ -58,7 +57,7 @@ class TaskImportController extends BaseController $this->flash->failure(t('Nothing have been imported!')); } - $this->response->redirect($this->helper->url->to('TaskImportController', 'show', array('project_id' => $project['id']))); + $this->response->redirect($this->helper->url->to('TaskImportController', 'show', array('project_id' => $project['id'])), true); } } diff --git a/app/Controller/TaskMovePositionController.php b/app/Controller/TaskMovePositionController.php index cb4afd04..39687b79 100644 --- a/app/Controller/TaskMovePositionController.php +++ b/app/Controller/TaskMovePositionController.php @@ -3,7 +3,6 @@ namespace Kanboard\Controller; use Kanboard\Core\Controller\AccessForbiddenException; -use Kanboard\Formatter\BoardFormatter; use Kanboard\Model\TaskModel; /** @@ -20,7 +19,7 @@ class TaskMovePositionController extends BaseController $this->response->html($this->template->render('task_move_position/show', array( 'task' => $task, - 'board' => BoardFormatter::getInstance($this->container) + 'board' => $this->boardFormatter ->withProjectId($task['project_id']) ->withQuery($this->taskFinderModel->getExtendedQuery() ->eq(TaskModel::TABLE.'.is_active', TaskModel::STATUS_OPEN) @@ -39,7 +38,7 @@ class TaskMovePositionController extends BaseController throw new AccessForbiddenException(e('You are not allowed to move this task.')); } - $result = $this->taskPositionModel->movePosition( + $this->taskPositionModel->movePosition( $task['project_id'], $task['id'], $values['column_id'], @@ -47,6 +46,6 @@ class TaskMovePositionController extends BaseController $values['swimlane_id'] ); - $this->response->json(array('result' => $result)); + $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); } } diff --git a/app/Controller/TaskStatusController.php b/app/Controller/TaskStatusController.php index 82b4f9c4..56d38400 100644 --- a/app/Controller/TaskStatusController.php +++ b/app/Controller/TaskStatusController.php @@ -52,11 +52,11 @@ class TaskStatusController extends BaseController $this->flash->failure($failure_message); } - return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); + $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); + } else { + $this->response->html($this->template->render($template, array( + 'task' => $task, + ))); } - - return $this->response->html($this->template->render($template, array( - 'task' => $task, - ))); } } diff --git a/app/Controller/UserAjaxController.php b/app/Controller/UserAjaxController.php index d93bfe9a..17567a00 100644 --- a/app/Controller/UserAjaxController.php +++ b/app/Controller/UserAjaxController.php @@ -3,8 +3,6 @@ namespace Kanboard\Controller; use Kanboard\Filter\UserNameFilter; -use Kanboard\Formatter\UserAutoCompleteFormatter; -use Kanboard\Formatter\UserMentionFormatter; use Kanboard\Model\UserModel; /** @@ -25,7 +23,7 @@ class UserAjaxController extends BaseController $search = $this->request->getStringParam('term'); $filter = $this->userQuery->withFilter(new UserNameFilter($search)); $filter->getQuery()->asc(UserModel::TABLE.'.name')->asc(UserModel::TABLE.'.username'); - $this->response->json($filter->format(new UserAutoCompleteFormatter($this->container))); + $this->response->json($filter->format($this->userAutoCompleteFormatter)); } /** @@ -39,11 +37,7 @@ class UserAjaxController extends BaseController $query = $this->request->getStringParam('search'); $users = $this->projectPermissionModel->findUsernames($project_id, $query); - $this->response->json( - UserMentionFormatter::getInstance($this->container) - ->withUsers($users) - ->format() - ); + $this->response->json($this->userMentionFormatter->withUsers($users)->format()); } /** diff --git a/app/Controller/UserCreationController.php b/app/Controller/UserCreationController.php index 9c873f85..27f1687b 100644 --- a/app/Controller/UserCreationController.php +++ b/app/Controller/UserCreationController.php @@ -22,10 +22,7 @@ class UserCreationController extends BaseController */ public function show(array $values = array(), array $errors = array()) { - $isRemote = $this->request->getIntegerParam('remote') == 1 || (isset($values['is_ldap_user']) && $values['is_ldap_user'] == 1); - $template = $isRemote ? 'user_creation/remote' : 'user_creation/local'; - - $this->response->html($this->template->render($template, array( + $this->response->html($this->template->render('user_creation/show', array( 'timezones' => $this->timezoneModel->getTimezones(true), 'languages' => $this->languageModel->getLanguages(true), 'roles' => $this->role->getApplicationRoles(), @@ -57,7 +54,7 @@ class UserCreationController extends BaseController * * @param array $values */ - private function createUser(array $values) + protected function createUser(array $values) { $project_id = empty($values['project_id']) ? 0 : $values['project_id']; unset($values['project_id']); diff --git a/app/Controller/UserInviteController.php b/app/Controller/UserInviteController.php new file mode 100644 index 00000000..8c77940c --- /dev/null +++ b/app/Controller/UserInviteController.php @@ -0,0 +1,107 @@ +<?php + +namespace Kanboard\Controller; + +use Kanboard\Core\Controller\PageNotFoundException; +use Kanboard\Core\Security\Role; +use Kanboard\Notification\MailNotification; + +/** + * Class UserInviteController + * + * @package Kanboard\Controller + * @author Frederic Guillot + */ +class UserInviteController extends BaseController +{ + public function show(array $values = array(), array $errors = array()) + { + $this->response->html($this->template->render('user_invite/show', array( + 'projects' => $this->projectModel->getList(), + 'errors' => $errors, + 'values' => $values, + ))); + } + + public function save() + { + $values = $this->request->getValues(); + + if (! empty($values['emails']) && isset($values['project_id'])) { + $emails = explode("\r\n", trim($values['emails'])); + $nb = $this->inviteModel->createInvites($emails, $values['project_id']); + $this->flash->success($nb > 1 ? t('%d invitations were sent.', $nb) : t('%d invitation was sent.', $nb)); + } + + $this->response->redirect($this->helper->url->to('UserListController', 'show')); + } + + public function signup(array $values = array(), array $errors = array()) + { + $invite = $this->getInvite(); + + $this->response->html($this->helper->layout->app('user_invite/signup', array( + 'no_layout' => true, + 'not_editable' => true, + 'token' => $invite['token'], + 'errors' => $errors, + 'values' => $values + array('email' => $invite['email']), + 'timezones' => $this->timezoneModel->getTimezones(true), + 'languages' => $this->languageModel->getLanguages(true), + ))); + } + + public function register() + { + $invite = $this->getInvite(); + + $values = $this->request->getValues(); + list($valid, $errors) = $this->userValidator->validateCreation($values); + + if ($valid) { + $this->createUser($invite, $values); + } else { + $this->signup($values, $errors); + } + } + + protected function getInvite() + { + $token = $this->request->getStringParam('token'); + + if (empty($token)) { + throw PageNotFoundException::getInstance()->withoutLayout(); + } + + $invite = $this->inviteModel->getByToken($token); + + if (empty($invite)) { + throw PageNotFoundException::getInstance()->withoutLayout(); + } + + return $invite; + } + + protected function createUser(array $invite, array $values) + { + $user_id = $this->userModel->create($values); + + if ($user_id !== false) { + if ($invite['project_id'] != 0) { + $this->projectUserRoleModel->addUser($invite['project_id'], $user_id, Role::PROJECT_MEMBER); + } + + if (! empty($values['notifications_enabled'])) { + $this->userNotificationTypeModel->saveSelectedTypes($user_id, array(MailNotification::TYPE)); + } + + $this->inviteModel->remove($invite['email']); + + $this->flash->success(t('User created successfully.')); + $this->response->redirect($this->helper->url->to('AuthController', 'login')); + } else { + $this->flash->failure(t('Unable to create this user.')); + $this->response->redirect($this->helper->url->to('UserInviteController', 'signup')); + } + } +} diff --git a/app/Core/Base.php b/app/Core/Base.php index 881cccbd..17ed5b33 100644 --- a/app/Core/Base.php +++ b/app/Core/Base.php @@ -62,6 +62,21 @@ use Pimple\Container; * @property \Kanboard\Decorator\ColumnRestrictionCacheDecorator $columnRestrictionCacheDecorator * @property \Kanboard\Decorator\ColumnMoveRestrictionCacheDecorator $columnMoveRestrictionCacheDecorator * @property \Kanboard\Decorator\ProjectRoleRestrictionCacheDecorator $projectRoleRestrictionCacheDecorator + * @property \Kanboard\Formatter\BoardColumnFormatter $boardColumnFormatter + * @property \Kanboard\Formatter\BoardFormatter $boardFormatter + * @property \Kanboard\Formatter\BoardSwimlaneFormatter $boardSwimlaneFormatter + * @property \Kanboard\Formatter\BoardTaskFormatter $boardTaskFormatter + * @property \Kanboard\Formatter\GroupAutoCompleteFormatter $groupAutoCompleteFormatter + * @property \Kanboard\Formatter\ProjectActivityEventFormatter $projectActivityEventFormatter + * @property \Kanboard\Formatter\ProjectGanttFormatter $projectGanttFormatter + * @property \Kanboard\Formatter\SubtaskTimeTrackingCalendarFormatter $subtaskTimeTrackingCalendarFormatter + * @property \Kanboard\Formatter\TaskAutoCompleteFormatter $taskAutoCompleteFormatter + * @property \Kanboard\Formatter\TaskCalendarFormatter $taskCalendarFormatter + * @property \Kanboard\Formatter\TaskGanttFormatter $taskGanttFormatter + * @property \Kanboard\Formatter\TaskICalFormatter $taskICalFormatter + * @property \Kanboard\Formatter\TaskSuggestMenuFormatter $taskSuggestMenuFormatter + * @property \Kanboard\Formatter\UserAutoCompleteFormatter $userAutoCompleteFormatter + * @property \Kanboard\Formatter\UserMentionFormatter $userMentionFormatter * @property \Kanboard\Model\ActionModel $actionModel * @property \Kanboard\Model\ActionParameterModel $actionParameterModel * @property \Kanboard\Model\AvatarFileModel $avatarFileModel @@ -79,6 +94,7 @@ use Pimple\Container; * @property \Kanboard\Model\ProjectFileModel $projectFileModel * @property \Kanboard\Model\GroupModel $groupModel * @property \Kanboard\Model\GroupMemberModel $groupMemberModel + * @property \Kanboard\Model\InviteModel $inviteModel * @property \Kanboard\Model\LanguageModel $languageModel * @property \Kanboard\Model\LastLoginModel $lastLoginModel * @property \Kanboard\Model\LinkModel $linkModel diff --git a/app/Core/DateParser.php b/app/Core/DateParser.php index b9aa9230..9d012d12 100644 --- a/app/Core/DateParser.php +++ b/app/Core/DateParser.php @@ -13,7 +13,6 @@ use DateTime; class DateParser extends Base { const DATE_FORMAT = 'm/d/Y'; - const DATE_TIME_FORMAT = 'm/d/Y H:i'; const TIME_FORMAT = 'H:i'; /** @@ -35,7 +34,7 @@ class DateParser extends Base */ public function getUserDateTimeFormat() { - return $this->configModel->get('application_datetime_format', DateParser::DATE_TIME_FORMAT); + return $this->getUserDateFormat().' '.$this->getUserTimeFormat(); } /** @@ -292,11 +291,9 @@ class DateParser extends Base { foreach ($fields as $field) { if (! empty($values[$field])) { - if (! ctype_digit($values[$field])) { - $values[$field] = strtotime($values[$field]); + if (ctype_digit($values[$field])) { + $values[$field] = date($format, $values[$field]); } - - $values[$field] = date($format, $values[$field]); } else { $values[$field] = ''; } diff --git a/app/Core/ExternalTask/ExternalTaskManager.php b/app/Core/ExternalTask/ExternalTaskManager.php index 2ce6f106..102ec459 100644 --- a/app/Core/ExternalTask/ExternalTaskManager.php +++ b/app/Core/ExternalTask/ExternalTaskManager.php @@ -48,6 +48,11 @@ class ExternalTaskManager public function getProvidersList() { $providers = array_keys($this->providers); - return array_combine($providers, $providers); + + if (count($providers)) { + return array_combine($providers, $providers); + } + + return array(); } } diff --git a/app/Core/Filter/FormatterInterface.php b/app/Core/Filter/FormatterInterface.php index b7c04c51..0ff84976 100644 --- a/app/Core/Filter/FormatterInterface.php +++ b/app/Core/Filter/FormatterInterface.php @@ -17,7 +17,7 @@ interface FormatterInterface * * @access public * @param Table $query - * @return FormatterInterface + * @return $this */ public function withQuery(Table $query); diff --git a/app/Core/Helper.php b/app/Core/Helper.php index 9660c348..ab7c3b7b 100644 --- a/app/Core/Helper.php +++ b/app/Core/Helper.php @@ -20,6 +20,7 @@ use Pimple\Container; * @property \Kanboard\Helper\FormHelper $form * @property \Kanboard\Helper\HookHelper $hook * @property \Kanboard\Helper\ICalHelper $ical + * @property \Kanboard\Helper\ModalHelper $modal * @property \Kanboard\Helper\ModelHelper $model * @property \Kanboard\Helper\SubtaskHelper $subtask * @property \Kanboard\Helper\TaskHelper $task diff --git a/app/Core/Http/Request.php b/app/Core/Http/Request.php index 2e84958d..44bfdbe6 100644 --- a/app/Core/Http/Request.php +++ b/app/Core/Http/Request.php @@ -105,7 +105,7 @@ class Request extends Base { if (! empty($this->post) && ! empty($this->post['csrf_token']) && $this->token->validateCSRFToken($this->post['csrf_token'])) { unset($this->post['csrf_token']); - return $this->post; + return $this->filterValues($this->post); } return array(); @@ -344,4 +344,17 @@ class Request extends Base { return isset($this->server[$variable]) ? $this->server[$variable] : ''; } + + protected function filterValues(array $values) + { + foreach ($values as $key => $value) { + + // IE11 Workaround when submitting multipart/form-data + if (strpos($key, '-----------------------------') === 0) { + unset($values[$key]); + } + } + + return $values; + } } diff --git a/app/Core/Mail/Transport/Mail.php b/app/Core/Mail/Transport/Mail.php index d27925f0..c99cc8ba 100644 --- a/app/Core/Mail/Transport/Mail.php +++ b/app/Core/Mail/Transport/Mail.php @@ -33,8 +33,8 @@ class Mail extends Base implements ClientInterface $message = Swift_Message::newInstance() ->setSubject($subject) ->setFrom(array($this->helper->mail->getMailSenderAddress() => $author)) - ->setBody($html, 'text/html') - ->setTo(array($email => $name)); + ->setTo(array($email => $name)) + ->setBody($html, 'text/html'); Swift_Mailer::newInstance($this->getTransport())->send($message); } catch (Swift_TransportException $e) { diff --git a/app/Core/Mail/Transport/Smtp.php b/app/Core/Mail/Transport/Smtp.php index 1f4e54ce..815dde5d 100644 --- a/app/Core/Mail/Transport/Smtp.php +++ b/app/Core/Mail/Transport/Smtp.php @@ -24,6 +24,7 @@ class Smtp extends Mail $transport->setUsername(MAIL_SMTP_USERNAME); $transport->setPassword(MAIL_SMTP_PASSWORD); $transport->setEncryption(MAIL_SMTP_ENCRYPTION); + if (HTTP_VERIFY_SSL_CERTIFICATE === false) { $transport->setStreamOptions(array( 'ssl' => array( diff --git a/app/Core/Paginator.php b/app/Core/Paginator.php index cfe89938..9075a713 100644 --- a/app/Core/Paginator.php +++ b/app/Core/Paginator.php @@ -232,6 +232,17 @@ class Paginator } /** + * Get the number of current page + * + * @access public + * @return integer + */ + public function getPage() + { + return $this->page; + } + + /** * Set the default column order * * @access public @@ -271,6 +282,16 @@ class Paginator } /** + * Get the maximum number of items per page. + * + * @return int + */ + public function getMax() + { + return $this->limit; + } + + /** * Return true if the collection is empty * * @access public @@ -353,7 +374,9 @@ class Paginator '← '.t('Previous'), $this->controller, $this->action, - $this->getUrlParams($this->page - 1, $this->order, $this->direction) + $this->getUrlParams($this->page - 1, $this->order, $this->direction), + false, + 'js-modal-replace' ); } else { $html .= '← '.t('Previous'); @@ -379,7 +402,9 @@ class Paginator t('Next').' →', $this->controller, $this->action, - $this->getUrlParams($this->page + 1, $this->order, $this->direction) + $this->getUrlParams($this->page + 1, $this->order, $this->direction), + false, + 'js-modal-replace' ); } else { $html .= t('Next').' →'; @@ -391,6 +416,17 @@ class Paginator } /** + * Generate the page showing. + * + * @access public + * @return string + */ + public function generatPageShowing() + { + return '<span class="pagination-showing">'.t('Showing %d-%d of %d', (($this->getPage() - 1) * $this->getMax() + 1), min($this->getTotal(), $this->getPage() * $this->getMax()), $this->getTotal()).'</span>'; + } + + /** * Return true if there is no pagination to show * * @access public @@ -413,6 +449,7 @@ class Paginator if (! $this->hasNothingtoShow()) { $html .= '<div class="pagination">'; + $html .= $this->generatPageShowing(); $html .= $this->generatePreviousLink(); $html .= $this->generateNextLink(); $html .= '</div>'; @@ -453,7 +490,9 @@ class Paginator $label, $this->controller, $this->action, - $this->getUrlParams($this->page, $column, $direction) + $this->getUrlParams($this->page, $column, $direction), + false, + 'js-modal-replace' ); } } diff --git a/app/Core/Plugin/Base.php b/app/Core/Plugin/Base.php index 9d8167a9..e0b5954a 100644 --- a/app/Core/Plugin/Base.php +++ b/app/Core/Plugin/Base.php @@ -131,4 +131,17 @@ abstract class Base extends \Kanboard\Core\Base { return ''; } + + /** + * Get application compatibility version + * + * Examples: >=1.0.36, 1.0.37, APP_VERSION + * + * @access public + * @return string + */ + public function getCompatibleVersion() + { + return APP_VERSION; + } } diff --git a/app/Core/Plugin/Directory.php b/app/Core/Plugin/Directory.php index 27c3514e..dc32e655 100644 --- a/app/Core/Plugin/Directory.php +++ b/app/Core/Plugin/Directory.php @@ -36,18 +36,7 @@ class Directory extends BaseCore */ public function isCompatible(array $plugin, $appVersion = APP_VERSION) { - if (strpos($appVersion, 'master') !== false) { - return true; - } - - foreach (array('>=', '>') as $operator) { - if (strpos($plugin['compatible_version'], $operator) === 0) { - $pluginVersion = substr($plugin['compatible_version'], strlen($operator)); - return version_compare($appVersion, $pluginVersion, $operator); - } - } - - return $plugin['compatible_version'] === $appVersion; + return Version::isCompatible($plugin['compatible_version'], $appVersion); } /** diff --git a/app/Core/Plugin/Loader.php b/app/Core/Plugin/Loader.php index f2f6add7..38f41d39 100644 --- a/app/Core/Plugin/Loader.php +++ b/app/Core/Plugin/Loader.php @@ -4,6 +4,7 @@ namespace Kanboard\Core\Plugin; use Composer\Autoload\ClassLoader; use DirectoryIterator; +use Exception; use LogicException; use Kanboard\Core\Tool; @@ -22,6 +23,7 @@ class Loader extends \Kanboard\Core\Base * @var array */ protected $plugins = array(); + protected $incompatiblePlugins = array(); /** * Get list of loaded plugins @@ -35,6 +37,17 @@ class Loader extends \Kanboard\Core\Base } /** + * Get list of not compatible plugins + * + * @access public + * @return Base[] + */ + public function getIncompatiblePlugins() + { + return $this->incompatiblePlugins; + } + + /** * Scan plugin folder and load plugins * * @access public @@ -51,8 +64,7 @@ class Loader extends \Kanboard\Core\Base foreach ($dir as $fileInfo) { if ($fileInfo->isDir() && substr($fileInfo->getFilename(), 0, 1) !== '.') { $pluginName = $fileInfo->getFilename(); - $this->loadSchema($pluginName); - $this->initializePlugin($pluginName, $this->loadPlugin($pluginName)); + $this->initializePlugin($pluginName); } } } @@ -85,7 +97,7 @@ class Loader extends \Kanboard\Core\Base $className = '\Kanboard\Plugin\\'.$pluginName.'\\Plugin'; if (! class_exists($className)) { - throw new LogicException('Unable to load this plugin class '.$className); + throw new LogicException('Unable to load this plugin class: '.$className); } return new $className($this->container); @@ -96,18 +108,30 @@ class Loader extends \Kanboard\Core\Base * * @access public * @param string $pluginName - * @param Base $plugin */ - public function initializePlugin($pluginName, Base $plugin) + public function initializePlugin($pluginName) { - if (method_exists($plugin, 'onStartup')) { - $this->dispatcher->addListener('app.bootstrap', array($plugin, 'onStartup')); - } + try { + $plugin = $this->loadPlugin($pluginName); - Tool::buildDIC($this->container, $plugin->getClasses()); - Tool::buildDICHelpers($this->container, $plugin->getHelpers()); + if (Version::isCompatible($plugin->getCompatibleVersion(), APP_VERSION)) { + $this->loadSchema($pluginName); + + if (method_exists($plugin, 'onStartup')) { + $this->dispatcher->addListener('app.bootstrap', array($plugin, 'onStartup')); + } - $plugin->initialize(); - $this->plugins[$pluginName] = $plugin; + Tool::buildDIC($this->container, $plugin->getClasses()); + Tool::buildDICHelpers($this->container, $plugin->getHelpers()); + + $plugin->initialize(); + $this->plugins[$pluginName] = $plugin; + } else { + $this->incompatiblePlugins[$pluginName] = $plugin; + $this->logger->error($pluginName.' is not compatible with this version'); + } + } catch (Exception $e) { + $this->logger->critical($pluginName.': '.$e->getMessage()); + } } } diff --git a/app/Core/Plugin/PluginException.php b/app/Core/Plugin/PluginException.php new file mode 100644 index 00000000..fae7de35 --- /dev/null +++ b/app/Core/Plugin/PluginException.php @@ -0,0 +1,15 @@ +<?php + +namespace Kanboard\Core\Plugin; + +use Exception; + +/** + * Class PluginException + * + * @package Kanboard\Core\Plugin + * @author Frederic Guillot + */ +class PluginException extends Exception +{ +} diff --git a/app/Core/Plugin/PluginInstallerException.php b/app/Core/Plugin/PluginInstallerException.php index 7d356c9b..31745f22 100644 --- a/app/Core/Plugin/PluginInstallerException.php +++ b/app/Core/Plugin/PluginInstallerException.php @@ -2,14 +2,12 @@ namespace Kanboard\Core\Plugin; -use Exception; - /** * Class PluginInstallerException * * @package Kanboard\Core\Plugin * @author Frederic Guillot */ -class PluginInstallerException extends Exception +class PluginInstallerException extends PluginException { } diff --git a/app/Core/Plugin/Version.php b/app/Core/Plugin/Version.php new file mode 100644 index 00000000..ba5e0443 --- /dev/null +++ b/app/Core/Plugin/Version.php @@ -0,0 +1,38 @@ +<?php + +namespace Kanboard\Core\Plugin; + +/** + * Class Version + * + * @package Kanboard\Core\Plugin + * @author Frederic Guillot + */ +class Version +{ + /** + * Check plugin version compatibility with application version + * + * @param string $pluginCompatibleVersion + * @param string $appVersion + * @return bool + */ + public static function isCompatible($pluginCompatibleVersion, $appVersion = APP_VERSION) + { + if (strpos($appVersion, 'master') !== false) { + return true; + } + + $appVersion = str_replace('v', '', $appVersion); + $pluginCompatibleVersion = str_replace('v', '', $pluginCompatibleVersion); + + foreach (array('>=', '>', '<=', '<') as $operator) { + if (strpos($pluginCompatibleVersion, $operator) === 0) { + $pluginVersion = substr($pluginCompatibleVersion, strlen($operator)); + return version_compare($appVersion, $pluginVersion, $operator); + } + } + + return $pluginCompatibleVersion === $appVersion; + } +} diff --git a/app/Core/Queue/QueueManager.php b/app/Core/Queue/QueueManager.php index dcf0ebf5..1d7c2d1e 100644 --- a/app/Core/Queue/QueueManager.php +++ b/app/Core/Queue/QueueManager.php @@ -64,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 or unable to connect to broker!'); } while ($job = $this->queue->pull()) { diff --git a/app/Core/Tool.php b/app/Core/Tool.php index 9b8820eb..6e457641 100644 --- a/app/Core/Tool.php +++ b/app/Core/Tool.php @@ -41,7 +41,7 @@ class Tool } /** - * Build dependency injection container from an array + * Build dependency injection containers from an array * * @static * @access public @@ -64,6 +64,29 @@ class Tool } /** + * Build dependency injection container from an array + * + * @static + * @access public + * @param Container $container + * @param array $namespaces + * @return Container + */ + public static function buildFactories(Container $container, array $namespaces) + { + foreach ($namespaces as $namespace => $classes) { + foreach ($classes as $name) { + $class = '\\Kanboard\\'.$namespace.'\\'.$name; + $container[lcfirst($name)] = $container->factory(function ($c) use ($class) { + return new $class($c); + }); + } + } + + return $container; + } + + /** * Build dependency injection container for custom helpers from an array * * @static diff --git a/app/Formatter/BoardColumnFormatter.php b/app/Formatter/BoardColumnFormatter.php index 85d31b5c..0d59f54e 100644 --- a/app/Formatter/BoardColumnFormatter.php +++ b/app/Formatter/BoardColumnFormatter.php @@ -79,7 +79,7 @@ class BoardColumnFormatter extends BaseFormatter implements FormatterInterface { foreach ($this->columns as &$column) { $column['id'] = (int) $column['id']; - $column['tasks'] = BoardTaskFormatter::getInstance($this->container) + $column['tasks'] = $this->boardTaskFormatter ->withTasks($this->tasks) ->withTags($this->tags) ->withSwimlaneId($this->swimlaneId) diff --git a/app/Formatter/BoardFormatter.php b/app/Formatter/BoardFormatter.php index df443a52..3f47bfa9 100644 --- a/app/Formatter/BoardFormatter.php +++ b/app/Formatter/BoardFormatter.php @@ -59,7 +59,7 @@ class BoardFormatter extends BaseFormatter implements FormatterInterface $task_ids = array_column($tasks, 'id'); $tags = $this->taskTagModel->getTagsByTasks($task_ids); - return BoardSwimlaneFormatter::getInstance($this->container) + return $this->boardSwimlaneFormatter ->withSwimlanes($swimlanes) ->withColumns($columns) ->withTasks($tasks) diff --git a/app/Formatter/BoardSwimlaneFormatter.php b/app/Formatter/BoardSwimlaneFormatter.php index ce67c8a8..18db259d 100644 --- a/app/Formatter/BoardSwimlaneFormatter.php +++ b/app/Formatter/BoardSwimlaneFormatter.php @@ -82,7 +82,7 @@ class BoardSwimlaneFormatter extends BaseFormatter implements FormatterInterface foreach ($this->swimlanes as &$swimlane) { $swimlane['id'] = (int) $swimlane['id']; - $swimlane['columns'] = BoardColumnFormatter::getInstance($this->container) + $swimlane['columns'] = $this->boardColumnFormatter ->withSwimlaneId($swimlane['id']) ->withColumns($this->columns) ->withTasks($this->tasks) diff --git a/app/Formatter/GroupAutoCompleteFormatter.php b/app/Formatter/GroupAutoCompleteFormatter.php index 4d552886..d811de7f 100644 --- a/app/Formatter/GroupAutoCompleteFormatter.php +++ b/app/Formatter/GroupAutoCompleteFormatter.php @@ -12,36 +12,26 @@ use PicoDb\Table; * @package formatter * @author Frederic Guillot */ -class GroupAutoCompleteFormatter implements FormatterInterface +class GroupAutoCompleteFormatter extends BaseFormatter implements FormatterInterface { /** * Groups found * - * @access private + * @access protected * @var GroupProviderInterface[] */ - private $groups; + protected $groups; /** - * Format groups for the ajax auto-completion + * Set groups * * @access public * @param GroupProviderInterface[] $groups + * @return $this */ - public function __construct(array $groups) + public function withGroups(array $groups) { $this->groups = $groups; - } - - /** - * Set query - * - * @access public - * @param Table $query - * @return FormatterInterface - */ - public function withQuery(Table $query) - { return $this; } diff --git a/app/Formatter/UserAutoCompleteFormatter.php b/app/Formatter/UserAutoCompleteFormatter.php index cd23a2a4..c81af00a 100644 --- a/app/Formatter/UserAutoCompleteFormatter.php +++ b/app/Formatter/UserAutoCompleteFormatter.php @@ -14,7 +14,7 @@ use Kanboard\Core\Filter\FormatterInterface; class UserAutoCompleteFormatter extends BaseFormatter implements FormatterInterface { /** - * Format the tasks for the ajax autocompletion + * Format the tasks for the ajax auto-completion * * @access public * @return array @@ -24,11 +24,11 @@ class UserAutoCompleteFormatter extends BaseFormatter implements FormatterInterf $users = $this->query->columns(UserModel::TABLE.'.id', UserModel::TABLE.'.username', UserModel::TABLE.'.name')->findAll(); foreach ($users as &$user) { - $user['value'] = $user['username'].' (#'.$user['id'].')'; - if (empty($user['name'])) { + $user['value'] = $user['username'].' (#'.$user['id'].')'; $user['label'] = $user['username']; } else { + $user['value'] = $user['name'].' (#'.$user['id'].')'; $user['label'] = $user['name'].' ('.$user['username'].')'; } } diff --git a/app/Helper/AppHelper.php b/app/Helper/AppHelper.php index 62062244..3b48d7d3 100644 --- a/app/Helper/AppHelper.php +++ b/app/Helper/AppHelper.php @@ -29,12 +29,12 @@ class AppHelper extends Base * * @access public * @param string $param - * @param mixed $default_value + * @param mixed $default * @return mixed */ - public function config($param, $default_value = '') + public function config($param, $default = '') { - return $this->configModel->get($param, $default_value); + return $this->configModel->get($param, $default); } /** diff --git a/app/Helper/CalendarHelper.php b/app/Helper/CalendarHelper.php index 4f78b673..0942177d 100644 --- a/app/Helper/CalendarHelper.php +++ b/app/Helper/CalendarHelper.php @@ -5,8 +5,6 @@ namespace Kanboard\Helper; use Kanboard\Core\Base; use Kanboard\Core\Filter\QueryBuilder; use Kanboard\Filter\TaskDueDateRangeFilter; -use Kanboard\Formatter\SubtaskTimeTrackingCalendarFormatter; -use Kanboard\Formatter\TaskCalendarFormatter; /** * Calendar Helper @@ -44,7 +42,7 @@ class CalendarHelper extends Base */ public function getTaskDateDueEvents(QueryBuilder $queryBuilder, $start, $end) { - $formatter = new TaskCalendarFormatter($this->container); + $formatter = $this->taskCalendarFormatter; $formatter->setFullDay(); $formatter->setColumns('date_due'); @@ -73,7 +71,7 @@ class CalendarHelper extends Base 'date_due' )); - $formatter = new TaskCalendarFormatter($this->container); + $formatter = $this->taskCalendarFormatter; $formatter->setColumns($startColumn, 'date_due'); return $queryBuilder->format($formatter); @@ -90,8 +88,7 @@ class CalendarHelper extends Base */ public function getSubtaskTimeTrackingEvents($user_id, $start, $end) { - $formatter = new SubtaskTimeTrackingCalendarFormatter($this->container); - return $formatter + return $this->subtaskTimeTrackingCalendarFormatter ->withQuery($this->subtaskTimeTrackingModel->getUserQuery($user_id) ->addCondition($this->getCalendarCondition( $this->dateParser->getTimestampFromIsoFormat($start), diff --git a/app/Helper/DateHelper.php b/app/Helper/DateHelper.php index 7e2ec79c..3bc85b76 100644 --- a/app/Helper/DateHelper.php +++ b/app/Helper/DateHelper.php @@ -54,7 +54,7 @@ class DateHelper extends Base */ public function datetime($value) { - return date($this->configModel->get('application_datetime_format', 'm/d/Y H:i'), $value); + return date($this->dateParser->getUserDateTimeFormat(), $value); } /** diff --git a/app/Helper/FileHelper.php b/app/Helper/FileHelper.php index cabf371c..06589124 100644 --- a/app/Helper/FileHelper.php +++ b/app/Helper/FileHelper.php @@ -21,9 +21,7 @@ class FileHelper extends Base */ public function icon($filename) { - $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); - - switch ($extension) { + switch (get_file_extension($filename)) { case 'jpeg': case 'jpg': case 'png': @@ -70,9 +68,7 @@ class FileHelper extends Base */ public function getImageMimeType($filename) { - $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); - - switch ($extension) { + switch (get_file_extension($filename)) { case 'jpeg': case 'jpg': return 'image/jpeg'; @@ -94,9 +90,7 @@ class FileHelper extends Base */ public function getPreviewType($filename) { - $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); - - switch ($extension) { + switch (get_file_extension($filename)) { case 'md': case 'markdown': return 'markdown'; @@ -106,4 +100,21 @@ class FileHelper extends Base return null; } + + /** + * Return the browser view mime-type based on the file extension. + * + * @access public + * @param $filename + * @return string + */ + public function getBrowserViewType($filename) + { + switch (get_file_extension($filename)) { + case 'pdf': + return 'application/pdf'; + } + + return null; + } } diff --git a/app/Helper/ICalHelper.php b/app/Helper/ICalHelper.php index dc399bf8..95723417 100644 --- a/app/Helper/ICalHelper.php +++ b/app/Helper/ICalHelper.php @@ -5,7 +5,6 @@ namespace Kanboard\Helper; use Kanboard\Core\Base; use Kanboard\Core\Filter\QueryBuilder; use Kanboard\Filter\TaskDueDateRangeFilter; -use Kanboard\Formatter\TaskICalFormatter; use Eluceo\iCal\Component\Calendar as iCalendar; /** @@ -29,10 +28,10 @@ class ICalHelper extends Base { $queryBuilder->withFilter(new TaskDueDateRangeFilter(array($start, $end))); - $formatter = new TaskICalFormatter($this->container); - $formatter->setColumns('date_due'); - $formatter->setCalendar($calendar); - $formatter->withQuery($queryBuilder->getQuery()); - $formatter->addFullDayEvents(); + $this->taskICalFormatter + ->setColumns('date_due') + ->setCalendar($calendar) + ->withQuery($queryBuilder->getQuery()) + ->addFullDayEvents(); } } diff --git a/app/Helper/LayoutHelper.php b/app/Helper/LayoutHelper.php index 8d2e7e00..8be71757 100644 --- a/app/Helper/LayoutHelper.php +++ b/app/Helper/LayoutHelper.php @@ -22,7 +22,10 @@ class LayoutHelper extends Base */ public function app($template, array $params = array()) { - if ($this->request->isAjax()) { + $isAjax = $this->request->isAjax(); + $params['is_ajax'] = $isAjax; + + if ($isAjax) { return $this->template->render($template, $params); } @@ -160,7 +163,7 @@ class LayoutHelper extends Base $params['title'] = $params['project']['name'].' > '.$params['title']; } - return $this->subLayout('analytic/layout', 'analytic/sidebar', $template, $params); + return $this->subLayout('analytic/layout', 'analytic/sidebar', $template, $params, true); } /** @@ -188,13 +191,16 @@ class LayoutHelper extends Base * @param string $sidebar * @param string $template * @param array $params + * @param bool $ignoreAjax * @return string */ - public function subLayout($sublayout, $sidebar, $template, array $params = array()) + public function subLayout($sublayout, $sidebar, $template, array $params = array(), $ignoreAjax = false) { + $isAjax = $this->request->isAjax(); + $params['is_ajax'] = $isAjax; $content = $this->template->render($template, $params); - if ($this->request->isAjax()) { + if (!$ignoreAjax && $isAjax) { return $content; } diff --git a/app/Helper/ModalHelper.php b/app/Helper/ModalHelper.php new file mode 100644 index 00000000..efbe2c4d --- /dev/null +++ b/app/Helper/ModalHelper.php @@ -0,0 +1,83 @@ +<?php + +namespace Kanboard\Helper; + +use Kanboard\Core\Base; + +/** + * Class ModalHelper + * + * @package Kanboard\Helper + * @author Frederic Guillot + */ +class ModalHelper extends Base +{ + public function submitButtons(array $params = array()) + { + return $this->helper->app->component('submit-buttons', array( + 'submitLabel' => isset($params['submitLabel']) ? $params['submitLabel'] : t('Save'), + 'orLabel' => t('or'), + 'cancelLabel' => t('cancel'), + 'color' => isset($params['color']) ? $params['color'] : 'blue', + 'tabindex' => isset($params['tabindex']) ? $params['tabindex'] : null, + 'disabled' => isset($params['disabled']) ? true : false, + )); + } + + public function confirmButtons($controller, $action, array $params = array(), $submitLabel = '', $tabindex = null) + { + return $this->helper->app->component('confirm-buttons', array( + 'url' => $this->helper->url->href($controller, $action, $params, true), + 'submitLabel' => $submitLabel ?: t('Yes'), + 'orLabel' => t('or'), + 'cancelLabel' => t('cancel'), + 'tabindex' => $tabindex, + )); + } + + public function largeIcon($icon, $label, $controller, $action, array $params = array()) + { + $html = '<i class="fa fa-'.$icon.' fa-fw js-modal-large" aria-hidden="true"></i>'; + return $this->helper->url->link($html, $controller, $action, $params, false, 'js-modal-large', $label); + } + + public function large($icon, $label, $controller, $action, array $params = array()) + { + $html = '<i class="fa fa-'.$icon.' fa-fw js-modal-large" aria-hidden="true"></i>'.$label; + return $this->helper->url->link($html, $controller, $action, $params, false, 'js-modal-large'); + } + + public function medium($icon, $label, $controller, $action, array $params = array()) + { + $html = '<i class="fa fa-'.$icon.' fa-fw js-modal-medium" aria-hidden="true"></i>'.$label; + return $this->helper->url->link($html, $controller, $action, $params, false, 'js-modal-medium'); + } + + public function small($icon, $label, $controller, $action, array $params = array()) + { + $html = '<i class="fa fa-'.$icon.' fa-fw js-modal-small" aria-hidden="true"></i>'.$label; + return $this->helper->url->link($html, $controller, $action, $params, false, 'js-modal-small'); + } + + public function mediumButton($icon, $label, $controller, $action, array $params = array()) + { + $html = '<i class="fa fa-'.$icon.' fa-fw js-modal-medium" aria-hidden="true"></i>'.$label; + return $this->helper->url->link($html, $controller, $action, $params, false, 'js-modal-medium btn'); + } + + public function confirm($icon, $label, $controller, $action, array $params = array()) + { + $html = '<i class="fa fa-'.$icon.' fa-fw js-modal-confirm" aria-hidden="true"></i>'.$label; + return $this->helper->url->link($html, $controller, $action, $params, false, 'js-modal-confirm'); + } + + public function confirmLink($label, $controller, $action, array $params = array()) + { + return $this->helper->url->link($label, $controller, $action, $params, false, 'js-modal-confirm'); + } + + public function replaceLink($label, $controller, $action, array $params = array()) + { + return $this->helper->url->link($label, $controller, $action, $params, false, 'js-modal-replace'); + } +} diff --git a/app/Helper/ProjectActivityHelper.php b/app/Helper/ProjectActivityHelper.php index 704cd4fe..480db3d5 100644 --- a/app/Helper/ProjectActivityHelper.php +++ b/app/Helper/ProjectActivityHelper.php @@ -6,7 +6,6 @@ use Kanboard\Core\Base; use Kanboard\Filter\ProjectActivityProjectIdFilter; use Kanboard\Filter\ProjectActivityProjectIdsFilter; use Kanboard\Filter\ProjectActivityTaskIdFilter; -use Kanboard\Formatter\ProjectActivityEventFormatter; use Kanboard\Model\ProjectActivityModel; /** @@ -38,7 +37,7 @@ class ProjectActivityHelper extends Base ->limit(500) ; - $events = $queryBuilder->format(new ProjectActivityEventFormatter($this->container)); + $events = $queryBuilder->format($this->projectActivityEventFormatter); } return $events; @@ -62,7 +61,7 @@ class ProjectActivityHelper extends Base ->limit($limit) ; - return $queryBuilder->format(new ProjectActivityEventFormatter($this->container)); + return $queryBuilder->format($this->projectActivityEventFormatter); } /** @@ -83,7 +82,7 @@ class ProjectActivityHelper extends Base ->limit($limit) ; - return $queryBuilder->format(new ProjectActivityEventFormatter($this->container)); + return $queryBuilder->format($this->projectActivityEventFormatter); } /** @@ -100,6 +99,6 @@ class ProjectActivityHelper extends Base $queryBuilder->getQuery()->desc(ProjectActivityModel::TABLE.'.id'); - return $queryBuilder->format(new ProjectActivityEventFormatter($this->container)); + return $queryBuilder->format($this->projectActivityEventFormatter); } } diff --git a/app/Helper/SubtaskHelper.php b/app/Helper/SubtaskHelper.php index 833544a7..8e090f17 100644 --- a/app/Helper/SubtaskHelper.php +++ b/app/Helper/SubtaskHelper.php @@ -50,7 +50,7 @@ class SubtaskHelper extends Base return $this->helper->url->link($this->getTitle($subtask), 'SubtaskStatusController', 'change', $params, false, $class); } - public function selectTitle(array $values, array $errors = array(), array $attributes = array()) + public function renderTitleField(array $values, array $errors = array(), array $attributes = array()) { $attributes = array_merge(array('tabindex="1"', 'required', 'maxlength="255"'), $attributes); @@ -60,7 +60,7 @@ class SubtaskHelper extends Base return $html; } - public function selectAssignee(array $users, array $values, array $errors = array(), array $attributes = array()) + public function renderAssigneeField(array $users, array $values, array $errors = array(), array $attributes = array()) { $attributes = array_merge(array('tabindex="2"'), $attributes); @@ -74,7 +74,7 @@ class SubtaskHelper extends Base return $html; } - public function selectTimeEstimated(array $values, array $errors = array(), array $attributes = array()) + public function renderTimeEstimatedField(array $values, array $errors = array(), array $attributes = array()) { $attributes = array_merge(array('tabindex="3"'), $attributes); @@ -85,7 +85,7 @@ class SubtaskHelper extends Base return $html; } - public function selectTimeSpent(array $values, array $errors = array(), array $attributes = array()) + public function renderTimeSpentField(array $values, array $errors = array(), array $attributes = array()) { $attributes = array_merge(array('tabindex="4"'), $attributes); diff --git a/app/Helper/TaskHelper.php b/app/Helper/TaskHelper.php index 92a9228c..71596b60 100644 --- a/app/Helper/TaskHelper.php +++ b/app/Helper/TaskHelper.php @@ -40,21 +40,28 @@ class TaskHelper extends Base return $this->taskRecurrenceModel->getRecurrenceBasedateList(); } - public function selectTitle(array $values, array $errors) + public function renderTitleField(array $values, array $errors) { - $html = $this->helper->form->label(t('Title'), 'title'); - $html .= $this->helper->form->text('title', $values, $errors, array('autofocus', 'required', 'maxlength="200"', 'tabindex="1"'), 'form-input-large'); - return $html; + return $this->helper->form->text( + 'title', + $values, + $errors, + array( + 'autofocus', + 'required', + 'maxlength="200"', + 'tabindex="1"', + 'placeholder="'.t('Title').'"' + ) + ); } - public function selectDescription(array $values, array $errors) + public function renderDescriptionField(array $values, array $errors) { - $html = $this->helper->form->label(t('Description'), 'description'); - $html .= $this->helper->form->textEditor('description', $values, $errors, array('tabindex' => 2)); - return $html; + return $this->helper->form->textEditor('description', $values, $errors, array('tabindex' => 2)); } - public function selectTags(array $project, array $tags = array()) + public function renderTagField(array $project, array $tags = array()) { $options = $this->tagModel->getAssignableList($project['id']); @@ -76,7 +83,7 @@ class TaskHelper extends Base return $html; } - public function selectColor(array $values) + public function renderColorField(array $values) { $colors = $this->colorModel->getList(); $html = $this->helper->form->label(t('Color'), 'color_id'); @@ -84,7 +91,7 @@ class TaskHelper extends Base return $html; } - public function selectAssignee(array $users, array $values, array $errors = array(), array $attributes = array()) + public function renderAssigneeField(array $users, array $values, array $errors = array(), array $attributes = array()) { $attributes = array_merge(array('tabindex="3"'), $attributes); @@ -98,7 +105,7 @@ class TaskHelper extends Base return $html; } - public function selectCategory(array $categories, array $values, array $errors = array(), array $attributes = array(), $allow_one_item = false) + public function renderCategoryField(array $categories, array $values, array $errors = array(), array $attributes = array(), $allow_one_item = false) { $attributes = array_merge(array('tabindex="4"'), $attributes); $html = ''; @@ -111,7 +118,7 @@ class TaskHelper extends Base return $html; } - public function selectSwimlane(array $swimlanes, array $values, array $errors = array(), array $attributes = array()) + public function renderSwimlaneField(array $swimlanes, array $values, array $errors = array(), array $attributes = array()) { $attributes = array_merge(array('tabindex="5"'), $attributes); $html = ''; @@ -124,7 +131,7 @@ class TaskHelper extends Base return $html; } - public function selectColumn(array $columns, array $values, array $errors = array(), array $attributes = array()) + public function renderColumnField(array $columns, array $values, array $errors = array(), array $attributes = array()) { $attributes = array_merge(array('tabindex="6"'), $attributes); @@ -134,7 +141,7 @@ class TaskHelper extends Base return $html; } - public function selectPriority(array $project, array $values) + public function renderPriorityField(array $project, array $values) { $html = ''; @@ -150,9 +157,9 @@ class TaskHelper extends Base return $html; } - public function selectScore(array $values, array $errors = array(), array $attributes = array()) + public function renderScoreField(array $values, array $errors = array(), array $attributes = array()) { - $attributes = array_merge(array('tabindex="8"'), $attributes); + $attributes = array_merge(array('tabindex="13"'), $attributes); $html = $this->helper->form->label(t('Complexity'), 'score'); $html .= $this->helper->form->number('score', $values, $errors, $attributes); @@ -160,9 +167,9 @@ class TaskHelper extends Base return $html; } - public function selectReference(array $values, array $errors = array(), array $attributes = array()) + public function renderReferenceField(array $values, array $errors = array(), array $attributes = array()) { - $attributes = array_merge(array('tabindex="9"'), $attributes); + $attributes = array_merge(array('tabindex="14"'), $attributes); $html = $this->helper->form->label(t('Reference'), 'reference'); $html .= $this->helper->form->text('reference', $values, $errors, $attributes, 'form-input-small'); @@ -170,9 +177,9 @@ class TaskHelper extends Base return $html; } - public function selectTimeEstimated(array $values, array $errors = array(), array $attributes = array()) + public function renderTimeEstimatedField(array $values, array $errors = array(), array $attributes = array()) { - $attributes = array_merge(array('tabindex="10"'), $attributes); + $attributes = array_merge(array('tabindex="11"'), $attributes); $html = $this->helper->form->label(t('Original estimate'), 'time_estimated'); $html .= $this->helper->form->numeric('time_estimated', $values, $errors, $attributes); @@ -181,9 +188,9 @@ class TaskHelper extends Base return $html; } - public function selectTimeSpent(array $values, array $errors = array(), array $attributes = array()) + public function renderTimeSpentField(array $values, array $errors = array(), array $attributes = array()) { - $attributes = array_merge(array('tabindex="11"'), $attributes); + $attributes = array_merge(array('tabindex="12"'), $attributes); $html = $this->helper->form->label(t('Time spent'), 'time_spent'); $html .= $this->helper->form->numeric('time_spent', $values, $errors, $attributes); @@ -192,15 +199,15 @@ class TaskHelper extends Base return $html; } - public function selectStartDate(array $values, array $errors = array(), array $attributes = array()) + public function renderStartDateField(array $values, array $errors = array(), array $attributes = array()) { - $attributes = array_merge(array('tabindex="12"'), $attributes); + $attributes = array_merge(array('tabindex="10"'), $attributes); return $this->helper->form->datetime(t('Start Date'), 'date_started', $values, $errors, $attributes); } - public function selectDueDate(array $values, array $errors = array(), array $attributes = array()) + public function renderDueDateField(array $values, array $errors = array(), array $attributes = array()) { - $attributes = array_merge(array('tabindex="13"'), $attributes); + $attributes = array_merge(array('tabindex="9"'), $attributes); return $this->helper->form->date(t('Due Date'), 'date_due', $values, $errors, $attributes); } @@ -244,7 +251,7 @@ class TaskHelper extends Base 'step1', array('project_id' => $projectId, 'swimlane_id' => $swimlaneId, 'column_id' => $columnId, 'provider_name' => $providerName), false, - 'popover-link' + 'js-modal-replace' ); $html .= '<li><i class="fa fa-fw fa-plus-square" aria-hidden="true"></i> '.$link.'</li>'; diff --git a/app/Helper/UrlHelper.php b/app/Helper/UrlHelper.php index 93177ed5..94412cf5 100644 --- a/app/Helper/UrlHelper.php +++ b/app/Helper/UrlHelper.php @@ -42,9 +42,32 @@ class UrlHelper extends Base */ public function button($icon, $label, $controller, $action, array $params = array(), $class = '') { - $icon = '<i class="fa '.$icon.' fa-fw"></i> '; + $html = '<i class="fa fa-'.$icon.' fa-fw"></i> '.$label; $class = 'btn '.$class; - return $this->link($icon.$label, $controller, $action, $params, false, $class); + return $this->link($html, $controller, $action, $params, false, $class); + } + + /** + * Link element with icon + * + * @access public + * @param string $icon Icon name + * @param string $label Link label + * @param string $controller Controller name + * @param string $action Action name + * @param array $params Url parameters + * @param boolean $csrf Add a CSRF token + * @param string $class CSS class attribute + * @param string $title Link title + * @param boolean $newTab Open the link in a new tab + * @param string $anchor Link Anchor + * @param bool $absolute + * @return string + */ + public function icon($icon, $label, $controller, $action, array $params = array(), $csrf = false, $class = '', $title = '', $newTab = false, $anchor = '', $absolute = false) + { + $html = '<i class="fa fa-fw fa-'.$icon.'" aria-hidden="true"></i>'.$label; + return $this->helper->url->link($html, $controller, $action, $params, $csrf, $class, $title, $newTab, $anchor, $absolute); } /** @@ -58,14 +81,14 @@ class UrlHelper extends Base * @param boolean $csrf Add a CSRF token * @param string $class CSS class attribute * @param string $title Link title - * @param boolean $new_tab Open the link in a new tab + * @param boolean $newTab Open the link in a new tab * @param string $anchor Link Anchor * @param bool $absolute * @return string */ - public function link($label, $controller, $action, array $params = array(), $csrf = false, $class = '', $title = '', $new_tab = false, $anchor = '', $absolute = false) + public function link($label, $controller, $action, array $params = array(), $csrf = false, $class = '', $title = '', $newTab = false, $anchor = '', $absolute = false) { - return '<a href="'.$this->href($controller, $action, $params, $csrf, $anchor, $absolute).'" class="'.$class.'" title=\''.$title.'\' '.($new_tab ? 'target="_blank"' : '').'>'.$label.'</a>'; + return '<a href="'.$this->href($controller, $action, $params, $csrf, $anchor, $absolute).'" class="'.$class.'" title=\''.$title.'\' '.($newTab ? 'target="_blank"' : '').'>'.$label.'</a>'; } /** diff --git a/app/Locale/bs_BA/translations.php b/app/Locale/bs_BA/translations.php index e27a4501..e689439c 100644 --- a/app/Locale/bs_BA/translations.php +++ b/app/Locale/bs_BA/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d zadataka na tabli', '%d tasks in total' => '%d zadataka ukupno', 'Unable to update this board.' => 'Nemogu da ažuriram ovu ploču.', - 'Edit board' => 'Izmijeni ploču', 'Disable' => 'Onemogući', 'Enable' => 'Omogući', 'New project' => 'Novi projekat', @@ -72,7 +71,6 @@ return array( 'Title' => 'Naslov', 'Assigned to %s' => 'Dodijeljen korisniku %s', 'Remove a column' => 'Ukloni kolonu', - 'Remove a column from a board' => 'Ukloni kolonu sa table', 'Unable to remove this column.' => 'Nemoguće uklanjanje kolone.', 'Do you really want to remove this column: "%s"?' => 'Da li zaista želiš da ukoniš ovu kolonu: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Ova akcija BRIŠE SVE ZADATKE vezane za ovu kolonu!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Broj zadataka', 'User' => 'Korisnik', 'Comments' => 'Komentari', - 'Leave a comment' => 'Ostavi komentar', 'Comment is required' => 'Komentar je obavezan', - 'Leave a description' => 'Dodaj opis', 'Comment added successfully.' => 'Komentar uspješno dodan', 'Unable to create your comment.' => 'Nemoguće kreiranje komentara', 'Due Date' => 'Treba biti gotovo do dana', @@ -224,7 +220,6 @@ return array( 'Search' => 'Pretraga', 'Nothing found.' => 'Ništa nije pronađeno', 'Due date' => 'Treba biti gotovo do dana', - 'Others formats accepted: %s and %s' => 'Ostali podržani formati: %s i %s', 'Description' => 'Opis', '%d comments' => '%d Komentara', '%d comment' => '%d Komentar', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Kreirao %s', 'Tasks Export' => 'Izvoz zadataka', 'Start Date' => 'Početni datum', - 'End Date' => 'Datum završetka', 'Execute' => 'Izvrši', 'Task Id' => 'Identifikator zadatka', 'Creator' => 'Autor', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Udaljeno', 'Enabled' => 'Omogućeno', 'Disabled' => 'Onemogućeno', - 'Username:' => 'Korisničko ime:', - 'Name:' => 'Ime i Prezime', + 'Login:' => 'Korisničko ime:', + 'Full Name:' => 'Ime i Prezime', 'Email:' => 'Email: ', 'Notifications:' => 'Obavještenja: ', 'Notifications' => 'Obavještenja', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Veza s etiketama', 'Link modification' => 'Veza modifikacija', 'Links' => 'Veze', - 'Link settings' => 'Postavke veza', 'Opposite label' => 'Suprotna etiketa', 'Remove a link' => 'Ukloni vezu', - 'Task\'s links' => 'Veze zadatka', 'The labels must be different' => 'Etikete moraju biti različite', 'There is no link.' => 'Ovdje nema veza', 'This label must be unique' => 'Ova etiketa mora biti jedinstvena', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Kompaktan pregled', 'Horizontal scrolling' => 'Horizontalno listanje', 'Compact/wide view' => 'Skupi/raširi pregled', - 'No results match:' => 'Nema rezultata:', 'Currency' => 'Valuta', 'Private project' => 'Privatni projekat', 'AUD - Australian Dollar' => 'AUD - Australijski dolar', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Japanski jen', 'NZD - New Zealand Dollar' => 'NZD - Novozelandski dolar', 'RSD - Serbian dinar' => 'RSD - Srpski dinar', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - Američki dolar', 'Destination column' => 'Odredišna kolona', 'Move the task to another column when assigned to a user' => 'Premjesti zadatak u neku drugu kolonu kada se dodijeli izvršiocu', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Stopa valute', 'Rate' => 'Stopa', 'Change reference currency' => 'Promijeni referencu valute', - 'Add a new currency rate' => 'Dodaj novu stopu valute', 'Reference currency' => 'Referentna valuta', 'The currency rate have been added successfully.' => 'Stopa valute je uspješno dodana.', 'Unable to add this currency rate.' => 'Nemoguće dodati stopu valute.', @@ -702,7 +693,6 @@ return array( '<30m' => '<30m', 'Stop timer' => 'Zaustavi tajmer', 'Start timer' => 'Pokreni tajmer', - 'Add project member' => 'Dodaj člana projekta', 'My activity stream' => 'Tok mojih aktivnosti', 'My calendar' => 'Moj kalendar', 'Search tasks' => 'Pretraga zadataka', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Vanjski korisnik', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Vanjski korisnik ne čuva šifru u Kanboard bazi, npr: LDAP, Google i Github korisnički računi.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Ako ste označili kvadratić "Zabrani prijavnu formu", unos pristupnih podataka u prijavnoj formi će biti ignorisan.', - 'New remote user' => 'Novi vanjski korisnik', - 'New local user' => 'Novi lokalni korisnik', 'Default task color' => 'Podrazumijevana boja zadatka', 'This feature does not work with all browsers.' => 'Ovaj funkcionalnost ne radi na svim internet pretraživačima.', 'There is no destination project available.' => 'Nema definisanog odredišta za projekat.', @@ -852,7 +840,6 @@ return array( 'Owner' => 'Vlasnik', 'Unread notifications' => 'Nepročitana obavještenja', 'Notification methods:' => 'Metode obavještenja:', - 'Import tasks from CSV file' => 'Uvezi zadatke putem CSV fajla', 'Unable to read your file' => 'Nemoguće pročitati fajl', '%d task(s) have been imported successfully.' => '%d zadataka uspješno uvezeno.', 'Nothing have been imported!' => 'Ništa nije uvezeno!', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'Vlasnik projekta:', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'Identifikator projekta je opcionalan i mora biti alfanumerički, na primjer: MOJPROJEKAT.', 'Project owner' => 'Vlasnik projekta', - 'Those dates are useful for the project Gantt chart.' => 'Ovi datumi su korisni za pravljenje Gantt dijagrama za projekat.', 'Private projects do not have users and groups management.' => 'Privatni projekti ne mogu imati korisnike ili grupe korisnika.', 'There is no project member.' => 'Nema članova projekta.', 'Priority' => 'Prioritet', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'Početo:', 'Moved:' => 'Pomjereno:', 'Task #%d' => 'Zadatak #%d', - 'Date and time format' => 'Format za datum i vrijeme', 'Time format' => 'Format za vrijeme', 'Start date: ' => 'Početni datum:', 'End date: ' => 'Krajnji datum:', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Korisnik uspješno onemogućen.', 'Unable to disable this user.' => 'Nemoguće onemogućiti ovog korisnika.', 'All files have been uploaded successfully.' => 'Svi fajlovi su uspješno dodani.', - 'View uploaded files' => 'Pregled dodanih fajlova', 'The maximum allowed file size is %sB.' => 'Maksimalna dozvoljena veličina fajla je %sB.', - 'Choose files again' => 'Izaberi ponovo fajlove', 'Drag and drop your files here' => 'Povuci i spusti svoje fajlove ovdje', 'choose files' => 'izaberi fajlove', 'View profile' => 'Pregledaj profil', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/cs_CZ/translations.php b/app/Locale/cs_CZ/translations.php index 5091de00..6299f514 100644 --- a/app/Locale/cs_CZ/translations.php +++ b/app/Locale/cs_CZ/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d úkolů na nástěnce', '%d tasks in total' => '%d úkolů celkem', 'Unable to update this board.' => 'Nástěnku není možné aktualizovat', - 'Edit board' => 'Editace nástěnky', 'Disable' => 'Zakázat projekt', 'Enable' => 'Povolit projekt', 'New project' => 'Nový projekt', @@ -72,7 +71,6 @@ return array( 'Title' => 'Název', 'Assigned to %s' => 'Přiřazeno uživateli: %s', 'Remove a column' => 'Vyjmout sloupec', - 'Remove a column from a board' => 'Vyjmout sloupec z nástěnky', 'Unable to remove this column.' => 'Tento sloupec nelze odstranit', 'Do you really want to remove this column: "%s"?' => 'Opravdu chcete vyjmout tento sloupec: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Tato akce vyjme všechny úkoly přiřazený k tomuto sloupci!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Počet úkolů', 'User' => 'Uživatel', 'Comments' => 'Komentáře', - 'Leave a comment' => 'Zanechte komentář', 'Comment is required' => 'Komentář je vyžadován', - 'Leave a description' => 'Vložte popis', 'Comment added successfully.' => 'Komentář byl úspěšně přidán.', 'Unable to create your comment.' => 'Komentář nelze vytvořit.', 'Due Date' => 'Datum splnění', @@ -224,7 +220,6 @@ return array( 'Search' => 'Vyhledat', 'Nothing found.' => 'Nenalezena žádná položka.', 'Due date' => 'Plánovaný termín', - 'Others formats accepted: %s and %s' => 'Akceptovány jiné formáty: %s und %s', 'Description' => 'Podrobný popis', '%d comments' => '%d komentářů', '%d comment' => '%d komentář', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Vytvořeno uživatelem %s', 'Tasks Export' => 'Export úkolů', 'Start Date' => 'Počáteční datum', - 'End Date' => 'Konečné datum', 'Execute' => 'Spustit', 'Task Id' => 'Úkol ID', 'Creator' => 'Vlastník', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Vzdálený', 'Enabled' => 'Povoleno', 'Disabled' => 'Zakázáno', - 'Username:' => 'Uživatelské jméno:', - 'Name:' => 'Jméno:', + 'Login:' => 'Uživatelské jméno:', + 'Full Name:' => 'Jméno:', 'Email:' => 'e-mail', 'Notifications:' => 'Upozornění:', 'Notifications' => 'Upozornění', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Seznam odkazů', 'Link modification' => 'Úpravy odkazů', 'Links' => 'Odkazy', - 'Link settings' => 'Nastavení odkazů', 'Opposite label' => 'Opačný text', 'Remove a link' => 'Odstranit odkaz', - 'Task\'s links' => 'Související odkazy', 'The labels must be different' => 'názvy musí být odlišné', 'There is no link.' => 'Nejsou zde žádné odkazy', 'This label must be unique' => 'Tento název musí být jedinečný', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Kompaktní zobrazení', 'Horizontal scrolling' => 'Horizontální rolování', 'Compact/wide view' => 'Kompaktní/plné zobrazení', - 'No results match:' => 'Žádná shoda:', 'Currency' => 'Měna', 'Private project' => 'Soukromý projekt', // 'AUD - Australian Dollar' => '', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Japanischer Yen', 'NZD - New Zealand Dollar' => 'NZD - Neuseeland-Dollar', 'RSD - Serbian dinar' => 'RSD - Serbische Dinar', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - US Dollar', 'Destination column' => 'Cílový sloupec', 'Move the task to another column when assigned to a user' => 'Přesunout úkol do jiného sloupce, když je úkol přiřazen uživateli.', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Aktuální kurzy', 'Rate' => 'Kurz', 'Change reference currency' => 'Změnit referenční měnu', - 'Add a new currency rate' => 'Přidat nový směnný kurz', 'Reference currency' => 'Referenční měna', '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', @@ -702,7 +693,6 @@ return array( '<30m' => '<30min.', 'Stop timer' => 'Zastavit časovač', 'Start timer' => 'Spustit časovač', - 'Add project member' => 'Přidat člena projektu', 'My activity stream' => 'Přehled mých aktivit', 'My calendar' => 'Můj kalendář', 'Search tasks' => 'Hledání úkolů', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Vzdálený uživatel', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Hesla vzdáleným uživatelům se neukládají do databáze Kanboard. Naříklad: LDAP, Google a Github účty.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Pokud zaškrtnete políčko "Zakázat přihlašovací formulář", budou pověření zadané do přihlašovacího formuláře ignorovány.', - 'New remote user' => 'Nový vzdálený uživatel', - 'New local user' => 'Nový lokální uživatel', 'Default task color' => 'Výchozí barva úkolu', 'This feature does not work with all browsers.' => 'Tato funkcionalita nefunguje ve všech prohlížečích.', 'There is no destination project available.' => 'Není dostupný žádný cílový projekt.', @@ -852,7 +840,6 @@ return array( // 'Owner' => '', // 'Unread notifications' => '', // 'Notification methods:' => '', - // 'Import tasks from CSV file' => '', // 'Unable to read your file' => '', // '%d task(s) have been imported successfully.' => '', // 'Nothing have been imported!' => '', @@ -980,7 +967,6 @@ return array( // 'Project owner: ' => '', // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', // 'Project owner' => '', - // 'Those dates are useful for the project Gantt chart.' => '', // 'Private projects do not have users and groups management.' => '', // 'There is no project member.' => '', // 'Priority' => '', @@ -1037,7 +1023,6 @@ return array( // 'Started:' => '', // 'Moved:' => '', // 'Task #%d' => '', - // 'Date and time format' => '', // 'Time format' => '', // 'Start date: ' => '', // 'End date: ' => '', @@ -1051,9 +1036,7 @@ return array( // 'User disabled successfully.' => '', // 'Unable to disable this user.' => '', // 'All files have been uploaded successfully.' => '', - // 'View uploaded files' => '', // 'The maximum allowed file size is %sB.' => '', - // 'Choose files again' => '', // 'Drag and drop your files here' => '', // 'choose files' => '', // 'View profile' => '', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php index 2ca864e5..87d65e87 100644 --- a/app/Locale/da_DK/translations.php +++ b/app/Locale/da_DK/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d Opgaver på boardet', '%d tasks in total' => '%d Opgaver i alt', 'Unable to update this board.' => 'Ikke muligt at opdatere dette board', - 'Edit board' => 'Rediger board', 'Disable' => 'Deaktiver', 'Enable' => 'Aktiver', 'New project' => 'Nyt projekt', @@ -72,7 +71,6 @@ return array( 'Title' => 'Titel', 'Assigned to %s' => 'Ansvarlig: %s', 'Remove a column' => 'Fjern en kolonne', - 'Remove a column from a board' => 'Fjern en kolonne fra et board', 'Unable to remove this column.' => 'Ikke muligt at fjerne denne kolonne', 'Do you really want to remove this column: "%s"?' => 'Vil du virkelig fjerne denne kolonne: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Denne handling vil SLETTE ALLE OPGAVER tilknyttet denne kolonne', @@ -160,9 +158,7 @@ return array( // 'Task count' => '', 'User' => 'Bruger', 'Comments' => 'Kommentarer', - 'Leave a comment' => 'Efterlad en kommentar', 'Comment is required' => 'Kommentar er krævet', - 'Leave a description' => 'Efterlad en beskrivelse...', 'Comment added successfully.' => 'Kommentaren er tilføjet.', 'Unable to create your comment.' => 'Din kommentar kunne ikke oprettes.', 'Due Date' => 'Forfaldsdato', @@ -224,7 +220,6 @@ return array( 'Search' => 'Søg', 'Nothing found.' => 'Intet fundet.', 'Due date' => 'Forfaldsdato', - 'Others formats accepted: %s and %s' => 'Andre acceptable formater: %s und %s', 'Description' => 'Beskrivelse', '%d comments' => '%d kommentarer', '%d comment' => '%d kommentar', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Oprettet af %s', 'Tasks Export' => 'Opgave eksport', 'Start Date' => 'Start-dato', - 'End Date' => 'Slut-dato', 'Execute' => 'Udfør', 'Task Id' => 'Opgave ID', 'Creator' => 'Skaber', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Remote', 'Enabled' => 'Aktiv', 'Disabled' => 'Deaktiveret', - 'Username:' => 'Brugernavn', - 'Name:' => 'Navn:', + 'Login:' => 'Brugernavn', + 'Full Name:' => 'Navn:', 'Email:' => 'Email:', 'Notifications:' => 'Notifikationer:', 'Notifications' => 'Notifikationer', @@ -516,10 +510,8 @@ return array( // 'Link labels' => '', // 'Link modification' => '', // 'Links' => '', - // 'Link settings' => '', // 'Opposite label' => '', // 'Remove a link' => '', - // 'Task\'s links' => '', // 'The labels must be different' => '', // 'There is no link.' => '', // 'This label must be unique' => '', @@ -552,7 +544,6 @@ return array( // 'Compact view' => '', // 'Horizontal scrolling' => '', // 'Compact/wide view' => '', - // 'No results match:' => '', // 'Currency' => '', // 'Private project' => '', // 'AUD - Australian Dollar' => '', @@ -566,6 +557,7 @@ return array( // 'JPY - Japanese Yen' => '', // 'NZD - New Zealand Dollar' => '', // 'RSD - Serbian dinar' => '', + // 'CNY - Chinese Yuan' => '', // 'USD - US Dollar' => '', // 'Destination column' => '', // 'Move the task to another column when assigned to a user' => '', @@ -580,7 +572,6 @@ return array( // 'Currency rates' => '', // 'Rate' => '', // 'Change reference currency' => '', - // 'Add a new currency rate' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -702,7 +693,6 @@ return array( // '<30m' => '', // 'Stop timer' => '', // 'Start timer' => '', - // 'Add project member' => '', // 'My activity stream' => '', // 'My calendar' => '', // 'Search tasks' => '', @@ -757,8 +747,6 @@ return array( // 'Remote user' => '', // 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '', // 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '', - // 'New remote user' => '', - // 'New local user' => '', // 'Default task color' => '', // 'This feature does not work with all browsers.' => '', // 'There is no destination project available.' => '', @@ -852,7 +840,6 @@ return array( // 'Owner' => '', // 'Unread notifications' => '', // 'Notification methods:' => '', - // 'Import tasks from CSV file' => '', // 'Unable to read your file' => '', // '%d task(s) have been imported successfully.' => '', // 'Nothing have been imported!' => '', @@ -980,7 +967,6 @@ return array( // 'Project owner: ' => '', // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', // 'Project owner' => '', - // 'Those dates are useful for the project Gantt chart.' => '', // 'Private projects do not have users and groups management.' => '', // 'There is no project member.' => '', // 'Priority' => '', @@ -1037,7 +1023,6 @@ return array( // 'Started:' => '', // 'Moved:' => '', // 'Task #%d' => '', - // 'Date and time format' => '', // 'Time format' => '', // 'Start date: ' => '', // 'End date: ' => '', @@ -1051,9 +1036,7 @@ return array( // 'User disabled successfully.' => '', // 'Unable to disable this user.' => '', // 'All files have been uploaded successfully.' => '', - // 'View uploaded files' => '', // 'The maximum allowed file size is %sB.' => '', - // 'Choose files again' => '', // 'Drag and drop your files here' => '', // 'choose files' => '', // 'View profile' => '', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php index 950a3b77..adefbf13 100644 --- a/app/Locale/de_DE/translations.php +++ b/app/Locale/de_DE/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d Aufgaben auf dieser Pinnwand', '%d tasks in total' => '%d Aufgaben insgesamt', 'Unable to update this board.' => 'Ändern dieser Pinnwand nicht möglich.', - 'Edit board' => 'Pinnwand bearbeiten', 'Disable' => 'Deaktivieren', 'Enable' => 'Aktivieren', 'New project' => 'Neues Projekt', @@ -72,7 +71,6 @@ return array( 'Title' => 'Titel', 'Assigned to %s' => 'Zuständig: %s', 'Remove a column' => 'Spalte löschen', - 'Remove a column from a board' => 'Spalte einer Pinnwand löschen', 'Unable to remove this column.' => 'Löschen dieser Spalte nicht möglich.', 'Do you really want to remove this column: "%s"?' => 'Soll diese Spalte wirklich gelöscht werden: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'ALLE AUFGABEN dieser Spalte werden GELÖSCHT!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Aufgabenanzahl', 'User' => 'Benutzer', 'Comments' => 'Kommentare', - 'Leave a comment' => 'Kommentar eingeben', 'Comment is required' => 'Ein Kommentar wird benötigt', - 'Leave a description' => 'Beschreibung eingeben', 'Comment added successfully.' => 'Kommentar erfolgreich hinzugefügt.', 'Unable to create your comment.' => 'Hinzufügen eines Kommentars nicht möglich.', 'Due Date' => 'Fällig am', @@ -224,7 +220,6 @@ return array( 'Search' => 'Suchen', 'Nothing found.' => 'Nichts gefunden.', 'Due date' => 'Fälligkeitsdatum', - 'Others formats accepted: %s and %s' => 'Andere akzeptierte Formate: %s und %s', 'Description' => 'Beschreibung', '%d comments' => '%d Kommentare', '%d comment' => '%d Kommentar', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Erstellt durch %s', 'Tasks Export' => 'Aufgaben exportieren', 'Start Date' => 'Anfangsdatum', - 'End Date' => 'Enddatum', 'Execute' => 'Ausführen', 'Task Id' => 'Aufgaben ID', 'Creator' => 'Erstellt von', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Remote', 'Enabled' => 'angeschaltet', 'Disabled' => 'abgeschaltet', - 'Username:' => 'Benutzername:', - 'Name:' => 'Name:', + 'Login:' => 'Benutzername:', + 'Full Name:' => 'Vollständiger Name:', 'Email:' => 'E-Mail:', 'Notifications:' => 'Benachrichtigungen:', 'Notifications' => 'Benachrichtigungen', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Verbindungsbeschriftung', 'Link modification' => 'Verbindung ändern', 'Links' => 'Verbindungen', - 'Link settings' => 'Verbindungseinstellungen', 'Opposite label' => 'Gegenteil', 'Remove a link' => 'Verbindung entfernen', - 'Task\'s links' => 'Aufgaben-Verbindungen', 'The labels must be different' => 'Die Beschriftung muss unterschiedlich sein', 'There is no link.' => 'Es gibt keine Verbindung', 'This label must be unique' => 'Die Beschriftung muss einzigartig sein', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Kompaktansicht', 'Horizontal scrolling' => 'Horizontales Scrollen', 'Compact/wide view' => 'Kompakt/Breite-Ansicht', - 'No results match:' => 'Keine Ergebnisse:', 'Currency' => 'Währung', 'Private project' => 'privates Projekt', 'AUD - Australian Dollar' => 'AUD - Australische Dollar', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Japanische Yen', 'NZD - New Zealand Dollar' => 'NZD - Neuseeland-Dollar', 'RSD - Serbian dinar' => 'RSD - Serbische Dinar', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - US-Dollar', 'Destination column' => 'Zielspalte', 'Move the task to another column when assigned to a user' => 'Aufgabe in eine andere Spalte verschieben, wenn ein User zugeordnet wurde.', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Währungskurse', 'Rate' => 'Kurse', 'Change reference currency' => 'Referenzwährung ändern', - 'Add a new currency rate' => 'Neuen Währungskurs hinzufügen', 'Reference currency' => 'Referenzwährung', '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', @@ -702,7 +693,6 @@ return array( '<30m' => '<30min', 'Stop timer' => 'Stoppe Timer', 'Start timer' => 'Starte Timer', - 'Add project member' => 'Projektmitglied hinzufügen', 'My activity stream' => 'Aktivitätsstream', 'My calendar' => 'Mein Kalender', 'Search tasks' => 'Suche nach Aufgaben', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Remote-Benutzer', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Remote-Benutzer haben kein Passwort in der Kanboard Datenbank, Beispiel: LDAP, Google und Github Accounts', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Wenn die Box "Verbiete Login-Formular" angeschaltet ist, werden Eingaben in das Login Formular ignoriert.', - 'New remote user' => 'Neuer Remote-Benutzer', - 'New local user' => 'Neuer lokaler Benutzer', 'Default task color' => 'Voreingestellte Aufgabenfarbe', 'This feature does not work with all browsers.' => 'Diese Funktion funktioniert nicht mit allen Browsern', 'There is no destination project available.' => 'Es ist kein Zielprojekt vorhanden.', @@ -852,7 +840,6 @@ return array( 'Owner' => 'Eigentümer', 'Unread notifications' => 'Ungelesene Benachrichtigungen', 'Notification methods:' => 'Benachrichtigungs-Methoden:', - 'Import tasks from CSV file' => 'Importiere Aufgaben aus CSV Datei', 'Unable to read your file' => 'Die Datei kann nicht gelesen werden', '%d task(s) have been imported successfully.' => '%d Aufgabe(n) wurde(n) erfolgreich importiert', 'Nothing have been imported!' => 'Es wurde nichts importiert!', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'Projekt-Besitzer: ', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'Die Projekt-Kennung ist optional und muss alphanumerisch sein, beispielsweise: MYPROJECT.', 'Project owner' => 'Projekt-Besitzer', - 'Those dates are useful for the project Gantt chart.' => 'Diese Daten sind nützlich für das Gantt-Diagramm.', 'Private projects do not have users and groups management.' => 'Private Projekte haben kein Benutzer- und Gruppen-Management.', 'There is no project member.' => 'Es gibt kein Projekt-Mitglied.', 'Priority' => 'Priorität', @@ -1009,7 +995,7 @@ return array( 'Add a new external link' => 'Füge eine neue externe Verbindung hinzu', 'Edit external link' => 'Externe Verbindung bearbeiten', 'External link' => 'Externe Verbindung', - 'Copy and paste your link here...' => 'Kopieren Sie Ihren Link hier...', + 'Copy and paste your link here...' => 'Kopieren Sie Ihren Link hierher...', 'URL' => 'URL', 'Internal links' => 'Interne Verbindungen', 'Assign to me' => 'Mir zuweisen', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'Gestarted:', 'Moved:' => 'Verschoben:', 'Task #%d' => 'Aufgabe #%d', - 'Date and time format' => 'Datums- und Zeitformat', 'Time format' => 'Zeitformat', 'Start date: ' => 'Anfangsdatum: ', 'End date: ' => 'Enddatum: ', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Benutzer erfolgreich deaktiviert.', 'Unable to disable this user.' => 'Dieser Benutzer kann nicht deaktiviert werden.', 'All files have been uploaded successfully.' => 'Alle Dateien wurden erfolgreich hochgeladen.', - 'View uploaded files' => 'Hochgeladene Dateien ansehen', 'The maximum allowed file size is %sB.' => 'Die maximal erlaubte Dateigröße ist %sB.', - 'Choose files again' => 'Wählen Sie erneut Dateien aus', 'Drag and drop your files here' => 'Ziehen Sie Ihre Dateien hier hin', 'choose files' => 'Dateien auswählen', 'View profile' => 'Profil ansehen', @@ -1163,7 +1146,6 @@ return array( 'Email sender address' => 'E-Mail Absender Adresse', 'Email transport' => 'E-Mail Verkehr', 'Webhook token' => 'Webhook Token', - 'Imports' => 'Importe', 'Project tags management' => 'Projektbezogenes Schlagwort-Management', 'Tag created successfully.' => 'Schlagwort erfolgreich erstellt.', 'Unable to create this tag.' => 'Das Schlagwort kann nicht erstellt werden.', @@ -1210,8 +1192,6 @@ return array( 'Activity stream for %s' => 'Aktivitätenstrom für %s', 'Calendar for %s' => 'Kalender für %s', 'Notifications for %s' => 'Benachrichtigungen für %s', - 'Subtasks export' => 'Teilaufgaben Export', - 'Tasks exportation' => 'Aufgaben Export', 'Assign a color when the task is moved to a specific swimlane' => 'Einer Aufgabe eine Farbe zuweisen, wenn diese in eine bestimmte Swimlane verschoben wird', 'Assign a priority when the task is moved to a specific swimlane' => 'Einer Aufgabe eine Priorität zuweisen, wenn diese in eine bestimmte Swimlane verschoben wird', 'User unlocked successfully.' => 'Benutzer erfolgreich entsperrt.', @@ -1278,13 +1258,53 @@ return array( 'Moving a task is not permitted' => 'Verschieben einer Aufgabe ist nicht erlaubt', 'This value must be in the range %d to %d' => 'Dieser Wert muss im Bereich %d bis %d sein', 'You are not allowed to move this task.' => 'Sie haben nicht die Berechtigung, diese Aufgabe zu verschieben.', - // 'API User Access' => '', - // 'Preview' => '', - // 'Write' => '', - // 'Write your text in Markdown' => '', - // 'New External Task: %s' => '', - // 'No personal API access token registered.' => '', - // 'Your personal API access token is "%s"' => '', - // 'Remove your token' => '', - // 'Generate a new token' => '', + 'API User Access' => 'API Benutzerzugriff', + 'Preview' => 'Vorschau', + 'Write' => 'Schreiben', + 'Write your text in Markdown' => 'Schreiben Sie iHren Text in Markdown', + 'New External Task: %s' => 'Neue externe Aufgabe: %s', + 'No personal API access token registered.' => 'Keine persönlichen API-Zugriffsinformationen registriert', + 'Your personal API access token is "%s"' => 'Ihre persönlichen API-Zugriffsinformationen: "%s"', + 'Remove your token' => 'Ihre Zugriffsinformationen entfernen', + 'Generate a new token' => 'Neue Zugriffsinformationen generieren', + 'Showing %d-%d of %d' => 'Zeige %d-%d of %d', + 'Outgoing Emails' => 'Ausgehende E-Mails', + 'Add or change currency rate' => 'Wechselkurs hinzufügen oder ändern', + 'Reference currency: %s' => 'Referenzwährung: %s', + 'Add custom filters' => 'Benutzerdefinierten Filter hinzufügen', + 'Export' => 'Exportieren', + 'Add link label' => 'Linkbeschreibung hinzufügen', + 'Incompatible Plugins' => 'Nicht-kompatible Plugins', + 'Compatibility' => 'Kompatibilität', + 'Permissions and ownership' => 'Berechtigungen und Besitz', + 'Priorities' => 'Prioritäten', + 'Close this window' => 'Dieses Fenster schließen', + 'Unable to upload this file.' => 'Diese Datei kann nicht hochgeladen werden', + 'Import tasks' => 'Aufgaben importieren', + 'Choose a project' => 'Wählen Sie ein Projekt', + 'Profile' => 'Profil', + 'Application role' => 'Anwendungsrolle', + '%d invitations were sent.' => '%d Einladungen wurden gesendet.', + '%d invitation was sent.' => '%d Einladung wurde gesendet.', + 'Unable to create this user.' => 'Dieser Benutzer kann nicht erstellt werden.', + 'Kanboard Invitation' => 'Kanboard Einladung', + 'Visible on dashboard' => 'Sichtbar auf dem Dashboard', + 'Created at:' => 'Erstellt am:', + 'Updated at:' => 'Aktualisiert am:', + 'There is no custom filter.' => 'Es gibt keinen benutzerdefinierten Filter.', + 'New User' => 'Neuer Benutzer', + 'Authentication' => 'Authentifizierung', + 'If checked, this user will use a third-party system for authentication.' => 'Wenn aktiviert, verwendet dieser Benutzer ein Drittanbieter-System für die Authentifizierung.', + 'The password is necessary only for local users.' => 'Das Passwort ist nur für lokale Benutzer erforderlich.', + 'You have been invited to register on Kanboard.' => 'Sie wurden eingeladen, sich auf Kanboard zu registrieren.', + 'Click here to join your team' => 'Klicken Sie hier, um Ihrem Team beizutreten', + 'Invite people' => 'Leute einladen', + 'Emails' => 'E-Mail', + 'Enter one email address by line.' => 'Geben Sie eine E-Mail-Adresse pro Zeile ein.', + 'Add these people to this project' => 'Füge diese Personen diesem Projekt hinzu', + 'Add this person to this project' => 'Füge diese Persone diesem Projekt hinzu', + 'Sign-up' => 'Anmelden', + 'Credentials' => 'Anmeldeinformationen', + 'New user' => 'Neuer Benutzer', + 'This username is already taken' => 'Dieser Benutzername ist bereits vergeben', ); diff --git a/app/Locale/el_GR/translations.php b/app/Locale/el_GR/translations.php index 7b7d855e..959b32d2 100644 --- a/app/Locale/el_GR/translations.php +++ b/app/Locale/el_GR/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d εργασίες στον κεντρικό πίνακα έργου', '%d tasks in total' => '%d εργασιών στο σύνολο', 'Unable to update this board.' => 'Αδύνατη η ενημέρωση αυτού του πίνακα', - 'Edit board' => 'Ενημέρωση πίνακα', 'Disable' => 'Απενεργοποίηση', 'Enable' => 'Ενεργοποίηση', 'New project' => 'Νέο έργο', @@ -72,7 +71,6 @@ return array( 'Title' => 'Τίτλος', 'Assigned to %s' => 'Ανατιθεμένο στον %s', 'Remove a column' => 'Αφαίρεση στήλης', - 'Remove a column from a board' => 'Αφαίρεση στήλης από τον πίνακα', 'Unable to remove this column.' => 'Αδύνατη η αφαίρεση της στήλης', 'Do you really want to remove this column: "%s"?' => 'Θέλετε να αφαιρέσετε τη στήλη: « %s » ?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Αυτή η ενέργεια θα ΑΦΑΙΡΕΣΕΙ ΟΛΕΣ ΤΙΣ ΕΡΓΑΣΙΕΣ που είναι σχετικές με τη στήλη!!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Αρίθμηση εργασιών', 'User' => 'Χρήστης', 'Comments' => 'Σχόλια', - 'Leave a comment' => 'Αφήστε ένα σχόλιο', 'Comment is required' => 'Το σχόλιο απαιτείται', - 'Leave a description' => 'Αφήστε μια περιγραφή', 'Comment added successfully.' => 'Το σχόλιο σας προστέθηκε με επιτυχία.', 'Unable to create your comment.' => 'Δεν είναι δυνατή η προσθήκη του σχολίου σας.', 'Due Date' => 'Μέχρι την ημερομηνία', @@ -224,7 +220,6 @@ return array( 'Search' => 'Αναζήτηση', 'Nothing found.' => 'Δεν βρέθηκε.', 'Due date' => 'Μέχρι την ημερομηνία', - 'Others formats accepted: %s and %s' => 'Άλλες δεκτές μορφοποιήσεις: %s και %s', 'Description' => 'Περιγραφή', '%d comments' => '%d σχόλια', '%d comment' => '%d σχόλιο', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Δημιουργήθηκε από %s', 'Tasks Export' => 'Εξαγωγή εργασιών', 'Start Date' => 'Ημερομηνία έναρξης', - 'End Date' => 'ημερομηνία λήξης', 'Execute' => 'Εκτέλεση', 'Task Id' => 'Task Id', 'Creator' => 'Δημιουργός', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Απομακρυσμένη', 'Enabled' => 'Ενεργή', 'Disabled' => 'Απενεργοποιημένη', - 'Username:' => 'Username:', - 'Name:' => 'Όνομα:', + 'Login:' => 'Login:', + 'Full Name:' => 'Όνομα:', 'Email:' => 'Email:', 'Notifications:' => 'Ειδοποιήσεις:', 'Notifications' => 'Ειδοποιήσεις', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Link labels', 'Link modification' => 'Τροποποίηση Link ', 'Links' => 'Links', - 'Link settings' => 'Ρυθμίσεις συνδέσμων', 'Opposite label' => 'Αντίθετο label', 'Remove a link' => 'Αφαίρεση ενός link', - 'Task\'s links' => 'Σύνδεσμοι εργασιών', 'The labels must be different' => 'Τα label πρέπει να είναι διαφορετικά', 'There is no link.' => 'Δεν υπάρχει σύνδεσμος.', 'This label must be unique' => 'Το label πρέπει να είναι μοναδικό', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Συμπυκνωμένη προβολή', 'Horizontal scrolling' => 'Οριζόντια ολίσθηση', 'Compact/wide view' => 'Συμπυκνωμένη/Ευρεία Προβολή', - 'No results match:' => 'Δεν ταιριάζει κανένα αποτέλεσμα:', 'Currency' => 'Νόμισμα', 'Private project' => 'Ιδιωτικό έργο', 'AUD - Australian Dollar' => 'AUD - Australian Dollar', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Japanese Yen', 'NZD - New Zealand Dollar' => 'NZD - New Zealand Dollar', 'RSD - Serbian dinar' => 'RSD - Serbian dinar', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - US Dollar', 'Destination column' => 'Στήλη προορισμού', 'Move the task to another column when assigned to a user' => 'Μετακινήστε την εργασία σε άλλη στήλη όταν ανατεθεί σε ένα χρήστη', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Ισοτιμίες', 'Rate' => 'Τιμή', 'Change reference currency' => 'Αλλαγή ισοτιμίας', - 'Add a new currency rate' => 'Προσθήκη ισοτιμίας', 'Reference currency' => 'Αναφορά ισοτιμίας', 'The currency rate have been added successfully.' => 'Η ισοτιμία προστέθηκε με επιτυχία.', 'Unable to add this currency rate.' => 'Αδύνατο να προστεθεί αυτή η ισοτιμία.', @@ -702,7 +693,6 @@ return array( '<30m' => '<30m', 'Stop timer' => 'Διακοπή ρολογιού', 'Start timer' => 'Έναρξη ρολογιού', - 'Add project member' => 'Προσθήκη νέου μέλους έργου', 'My activity stream' => 'Η ροή δραστηριοτήτων μου', 'My calendar' => 'Το ημερολόγιο μου', 'Search tasks' => 'Αναζήτηση εργασιών', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Απομακρυσμένος χρήστης', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Στους απομακρυσμένους χρήστες δεν αποθηκεύονται οι κωδικοί πρόσβασης εντός της βάσης δεδομένων της τρέχουσας εφαρμογής, Παραδείγματα: LDAP, Google and Github accounts.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Αν ενεργοποιήσετε την επιλογή "Απαγόρευση φόρμας σύνδεσης", τα στοιχεία που εισάγονται στη φόρμα σύνδεσης αγνοούνται.', - 'New remote user' => 'Νέος απομακρυσμένος χρήστης', - 'New local user' => 'Νέος τοπικός χρήστης', 'Default task color' => 'Προεπιλογή χρώματος εργασίας', 'This feature does not work with all browsers.' => 'Αυτή η δυνατότητα δεν δουλεύει σε όλους τους browsers', 'There is no destination project available.' => 'Δεν υπάρχει διαθέσιμο κανένα έργο προορισμού.', @@ -852,7 +840,6 @@ return array( 'Owner' => 'Ιδιοκτήτης', 'Unread notifications' => 'Αδιάβαστες ειδοποιήσεις', 'Notification methods:' => 'Μέθοδοι ειδοποίησης:', - 'Import tasks from CSV file' => 'Εισαγωγή εργασιών μέσω αρχείου CSV', 'Unable to read your file' => 'Δεν είναι δυνατή η ανάγνωση του αρχείου', '%d task(s) have been imported successfully.' => '%d η(οι) εργασία(ες) εισήχθησαν με επιτυχία.', 'Nothing have been imported!' => 'Τίποτα δεν εισήχθη', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'Ιδιοκτήτης έργου: ', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'Το αναγνωριστικό έργου είναι προαιρετικό και πρέπει να είναι αλφαριθμητικό, για παράδειγμα: MYPROJECT', 'Project owner' => 'Ιδιοκτήτης έργου', - 'Those dates are useful for the project Gantt chart.' => 'Οι ημερομηνίες αυτές είανι χρήσιμες για το διάγραμμα Gantt του έργου', 'Private projects do not have users and groups management.' => 'Τα ιδιωτικά έργα δεν έχουν χρήστες και διαχείριση ομάδων', 'There is no project member.' => 'Δεν υπάρχει μέλος στο έργο', 'Priority' => 'Προτεραιότητα', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'Ξεκίνησε:', 'Moved:' => 'Μετακινήθηκε:', 'Task #%d' => 'Εργασία #%d', - 'Date and time format' => 'Μορφή ημερομηνίας και ώρας', 'Time format' => 'Μορφή ώρας', 'Start date: ' => 'Ημερομηνία έναρξης: ', 'End date: ' => 'Ημερομηνία λήξης: ', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Η απενεργοποίηση του χρήστη έγινε με επιτυχία', 'Unable to disable this user.' => 'Δεν είναι δυνατή η απενεργοποίηση του χρήστη', 'All files have been uploaded successfully.' => 'Όλα τα αρχεία ανέβηκαν με επιτυχία', - 'View uploaded files' => 'Προβολή ανεβασμένων αρχείων', 'The maximum allowed file size is %sB.' => 'Το μέγιστο μέγεθος αρχείου που επιτρέπεται είναι %sB.', - 'Choose files again' => 'Επιλογή κι άλλων αρχείων', 'Drag and drop your files here' => 'Σύρετε τα αρχεία σας εδώ', 'choose files' => 'Επιλογή αρχείων', 'View profile' => 'Προβολή προφίλ', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php index 984d42db..5f5d71e1 100644 --- a/app/Locale/es_ES/translations.php +++ b/app/Locale/es_ES/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d tareas en el tablero', '%d tasks in total' => '%d tareas en total', 'Unable to update this board.' => 'No se puede actualizar este tablero.', - 'Edit board' => 'Modificar este tablero', 'Disable' => 'Desactivar', 'Enable' => 'Activar', 'New project' => 'Nuevo proyecto', @@ -72,7 +71,6 @@ return array( 'Title' => 'Título', 'Assigned to %s' => 'Asignada a %s', 'Remove a column' => 'Eliminar esta columna', - 'Remove a column from a board' => 'Eliminar una columna de un tablero', 'Unable to remove this column.' => 'No se puede eliminar esta columna.', 'Do you really want to remove this column: "%s"?' => '¿De vedad que desea eliminar esta columna: «%s»?', 'This action will REMOVE ALL TASKS associated to this column!' => '¡Esta acción ELIMINARÁ TODAS LAS TAREAS asociadas a esta columna!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Contador de tareas', 'User' => 'Usuario', 'Comments' => 'Comentarios', - 'Leave a comment' => 'Dejar un comentario', 'Comment is required' => 'El comentario es obligatorio', - 'Leave a description' => 'Dejar una descripción', 'Comment added successfully.' => 'El comentario ha sido añadido correctamente.', 'Unable to create your comment.' => 'No se puede crear este comentario.', 'Due Date' => 'Fecha límite', @@ -224,7 +220,6 @@ return array( 'Search' => 'Buscar', 'Nothing found.' => 'No se ha encontrado nada.', 'Due date' => 'Fecha límite', - 'Others formats accepted: %s and %s' => 'Otros formatos aceptados: %s y %s', 'Description' => 'Descripción', '%d comments' => '%d comentarios', '%d comment' => '%d comentario', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Creado por %s', 'Tasks Export' => 'Exportar tareas', 'Start Date' => 'Fecha de inicio', - 'End Date' => 'Fecha final', 'Execute' => 'Ejecutar', 'Task Id' => 'Identificador de tarea', 'Creator' => 'Creador', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Remota', 'Enabled' => 'Activada', 'Disabled' => 'Desactivada', - 'Username:' => 'Nombre de usuario:', - 'Name:' => 'Nombre:', + 'Login:' => 'Nombre de usuario:', + 'Full Name:' => 'Nombre:', 'Email:' => 'Correo electrónico:', 'Notifications:' => 'Notificaciones:', 'Notifications' => 'Notificaciones', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Etiquetas de enlace', 'Link modification' => 'Modificación del enlace', 'Links' => 'Enlaces', - 'Link settings' => 'Preferencias de enlace', 'Opposite label' => 'Etiqueta opuesta', 'Remove a link' => 'Eliminar un enlace', - 'Task\'s links' => 'Enlaces de tareas', 'The labels must be different' => 'Las etiquetas han de ser diferentes', 'There is no link.' => 'No hay enlace.', 'This label must be unique' => 'Esta etiqueta debe ser única', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Compactar vista', 'Horizontal scrolling' => 'Desplazamiento horizontal', 'Compact/wide view' => 'Vista compacta/amplia', - 'No results match:' => 'No hay resultados coincidentes:', 'Currency' => 'Moneda', 'Private project' => 'Proyecto privado', 'AUD - Australian Dollar' => 'AUD - Dólar australiano', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Yen japonés', 'NZD - New Zealand Dollar' => 'NZD - Dóloar neocelandés', 'RSD - Serbian dinar' => 'RSD - Dinar serbio', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - Dólar estadounidense', 'Destination column' => 'Columna destino', 'Move the task to another column when assigned to a user' => 'Mover la tarea a otra columna al asignarse a un usuario', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Cambio de monedas', 'Rate' => 'Cambio', 'Change reference currency' => 'Cambiar moneda de referencia', - 'Add a new currency rate' => 'Añadir nuevo cambio de moneda', 'Reference currency' => 'Moneda de referencia', '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.', @@ -702,7 +693,6 @@ return array( '<30m' => '<30m', 'Stop timer' => 'Parar temporizador', 'Start timer' => 'Iniciar temporizador', - 'Add project member' => 'Añadir miembro al proyecto', 'My activity stream' => 'Mi flujo de actividad', 'My calendar' => 'Mi calendario', 'Search tasks' => 'Buscar tareas', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Usuario remoto', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Los usuarios remotos no almacenan sus contraseñas en la base de datos Kanboard, por ejemplo: cuentas de LDAP, Google y Github.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Si marcas la opción "Desactivar formulario de ingreso", se ignoran las credenciales introducidas en el formulario de ingreso.', - 'New remote user' => 'Nuevo usuario remoto', - 'New local user' => 'Nuevo usuario local', 'Default task color' => 'Color de la tarea por defecto', 'This feature does not work with all browsers.' => 'Esta característica no funciona en todos los navegadores.', 'There is no destination project available.' => 'No está disponible proyecto de destino.', @@ -852,7 +840,6 @@ return array( 'Owner' => 'Propietario', 'Unread notifications' => 'Notificaciones sin leer', 'Notification methods:' => 'Métodos de notificación:', - 'Import tasks from CSV file' => 'Importar tareas desde archivo CSV', 'Unable to read your file' => 'No es posible leer el archivo', '%d task(s) have been imported successfully.' => '%d tarea(s) han sido importadas correctamente.', 'Nothing have been imported!' => '¡No se ha importado nada!', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'Propietario del proyecto: ', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'El identificador del proyecto es opcional y debe ser alfanumérico. Ejemplo: MIPROYECTO', 'Project owner' => 'Propietario del proyecto', - 'Those dates are useful for the project Gantt chart.' => 'Esas fechas son útiles para el diagrama de Gantt.', 'Private projects do not have users and groups management.' => 'Los proyectos privados no cuentan con gestión de usuarios y grupos.', 'There is no project member.' => 'No existe miembro del proyecto.', 'Priority' => 'Prioridad', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'Iniciado:', 'Moved:' => 'Movido:', 'Task #%d' => 'Tarea #%d', - 'Date and time format' => 'Formato de fecha y hora', 'Time format' => 'Formato de hora', 'Start date: ' => 'Fecha de inicio: ', 'End date: ' => 'Fecha de finalización: ', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Usuario deshabilitado correctamente.', 'Unable to disable this user.' => 'No es posible deshabilitar este usuario.', 'All files have been uploaded successfully.' => 'Todos los archivos han sido cargados correctamente.', - 'View uploaded files' => 'Ver archivos cargados', 'The maximum allowed file size is %sB.' => 'El tamaño máximo de archivo es %sB.', - 'Choose files again' => 'Elegir archivos de nuevo', 'Drag and drop your files here' => 'Arrastra y suelta tus archivos aquí', 'choose files' => 'elegir archivos', 'View profile' => 'Ver perfil', @@ -1163,7 +1146,6 @@ return array( 'Email sender address' => 'Dirección del remitente del correo electrónico', 'Email transport' => 'Transporte de correo electrónico', 'Webhook token' => 'Token del disparador web (webhook)', - 'Imports' => 'Importaciones', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php index 41e51fa1..685858aa 100644 --- a/app/Locale/fi_FI/translations.php +++ b/app/Locale/fi_FI/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d tehtävää taululla', '%d tasks in total' => '%d tehtävää yhteensä', 'Unable to update this board.' => 'Taulun muuttaminen ei onnistunut.', - 'Edit board' => 'Muuta taulua', 'Disable' => 'Disabloi', 'Enable' => 'Aktivoi', 'New project' => 'Uusi projekti', @@ -72,7 +71,6 @@ return array( 'Title' => 'Nimi', 'Assigned to %s' => 'Tekijä: %s', 'Remove a column' => 'Poista sarake', - 'Remove a column from a board' => 'Poista sarake taulusta', 'Unable to remove this column.' => 'Sarakkeen poistaminen ei onnistunut.', 'Do you really want to remove this column: "%s"?' => 'Haluatko varmasti poistaa sarakkeen "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Tämä toiminto POISTAA KAIKKI TEHTÄVÄT tästä sarakkeesta!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Tehtävien määrä', 'User' => 'Käyttäjät', 'Comments' => 'Kommentit', - 'Leave a comment' => 'Lisää kommentti', 'Comment is required' => 'Kommentti vaaditaan', - 'Leave a description' => 'Lisää kuvaus', 'Comment added successfully.' => 'Kommentti lisättiin onnistuneesti.', 'Unable to create your comment.' => 'Kommentin lisäys epäonnistui.', 'Due Date' => 'Deadline', @@ -224,7 +220,6 @@ return array( 'Search' => 'Etsi', 'Nothing found.' => 'Ei löytynyt.', 'Due date' => 'Deadline', - 'Others formats accepted: %s and %s' => 'Muut hyväksytyt muodot: %s ja %s', 'Description' => 'Kuvaus', '%d comments' => '%d kommenttia', '%d comment' => '%d kommentti', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Luonut: %s', 'Tasks Export' => 'Tehtävien vienti', 'Start Date' => 'Aloituspäivä', - 'End Date' => 'Lopetuspäivä', 'Execute' => 'Suorita', 'Task Id' => 'Tehtävän ID', 'Creator' => 'Luonut', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Etä', 'Enabled' => 'Käytössä', 'Disabled' => 'Pois käytöstä', - 'Username:' => 'Käyttäjänimi:', - 'Name:' => 'Nimi:', + 'Login:' => 'Käyttäjänimi:', + 'Full Name:' => 'Nimi:', 'Email:' => 'Sähköpostiosoite:', 'Notifications:' => 'Ilmoitukset:', 'Notifications' => 'Ilmoitukset', @@ -516,10 +510,8 @@ return array( // 'Link labels' => '', // 'Link modification' => '', // 'Links' => '', - // 'Link settings' => '', // 'Opposite label' => '', // 'Remove a link' => '', - // 'Task\'s links' => '', // 'The labels must be different' => '', // 'There is no link.' => '', // 'This label must be unique' => '', @@ -552,7 +544,6 @@ return array( // 'Compact view' => '', // 'Horizontal scrolling' => '', // 'Compact/wide view' => '', - // 'No results match:' => '', // 'Currency' => '', // 'Private project' => '', // 'AUD - Australian Dollar' => '', @@ -566,6 +557,7 @@ return array( // 'JPY - Japanese Yen' => '', // 'NZD - New Zealand Dollar' => '', // 'RSD - Serbian dinar' => '', + // 'CNY - Chinese Yuan' => '', // 'USD - US Dollar' => '', // 'Destination column' => '', // 'Move the task to another column when assigned to a user' => '', @@ -580,7 +572,6 @@ return array( // 'Currency rates' => '', // 'Rate' => '', // 'Change reference currency' => '', - // 'Add a new currency rate' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -702,7 +693,6 @@ return array( // '<30m' => '', // 'Stop timer' => '', // 'Start timer' => '', - // 'Add project member' => '', // 'My activity stream' => '', // 'My calendar' => '', // 'Search tasks' => '', @@ -757,8 +747,6 @@ return array( // 'Remote user' => '', // 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '', // 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '', - // 'New remote user' => '', - // 'New local user' => '', // 'Default task color' => '', // 'This feature does not work with all browsers.' => '', // 'There is no destination project available.' => '', @@ -852,7 +840,6 @@ return array( // 'Owner' => '', // 'Unread notifications' => '', // 'Notification methods:' => '', - // 'Import tasks from CSV file' => '', // 'Unable to read your file' => '', // '%d task(s) have been imported successfully.' => '', // 'Nothing have been imported!' => '', @@ -980,7 +967,6 @@ return array( // 'Project owner: ' => '', // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', // 'Project owner' => '', - // 'Those dates are useful for the project Gantt chart.' => '', // 'Private projects do not have users and groups management.' => '', // 'There is no project member.' => '', // 'Priority' => '', @@ -1037,7 +1023,6 @@ return array( // 'Started:' => '', // 'Moved:' => '', // 'Task #%d' => '', - // 'Date and time format' => '', // 'Time format' => '', // 'Start date: ' => '', // 'End date: ' => '', @@ -1051,9 +1036,7 @@ return array( // 'User disabled successfully.' => '', // 'Unable to disable this user.' => '', // 'All files have been uploaded successfully.' => '', - // 'View uploaded files' => '', // 'The maximum allowed file size is %sB.' => '', - // 'Choose files again' => '', // 'Drag and drop your files here' => '', // 'choose files' => '', // 'View profile' => '', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/fr_FR/translations.php b/app/Locale/fr_FR/translations.php index daac98ed..824519f9 100644 --- a/app/Locale/fr_FR/translations.php +++ b/app/Locale/fr_FR/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d tâches sur le tableau', '%d tasks in total' => '%d tâches au total', 'Unable to update this board.' => 'Impossible de mettre à jour ce tableau.', - 'Edit board' => 'Modifier le tableau', 'Disable' => 'Désactiver', 'Enable' => 'Activer', 'New project' => 'Nouveau projet', @@ -72,7 +71,6 @@ return array( 'Title' => 'Titre', 'Assigned to %s' => 'Assigné à %s', 'Remove a column' => 'Supprimer une colonne', - 'Remove a column from a board' => 'Supprimer une colonne d\'un tableau', 'Unable to remove this column.' => 'Impossible de supprimer cette colonne.', 'Do you really want to remove this column: "%s"?' => 'Voulez vraiment supprimer cette colonne : « %s » ?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Cette action va supprimer toutes les tâches associées à cette colonne !', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Nombre de tâches', 'User' => 'Utilisateur', 'Comments' => 'Commentaires', - 'Leave a comment' => 'Laissez un commentaire', 'Comment is required' => 'Le commentaire est obligatoire', - 'Leave a description' => 'Laissez une description', 'Comment added successfully.' => 'Commentaire ajouté avec succès.', 'Unable to create your comment.' => 'Impossible de sauvegarder votre commentaire.', 'Due Date' => 'Date d\'échéance', @@ -224,7 +220,6 @@ return array( 'Search' => 'Rechercher', 'Nothing found.' => 'Rien trouvé.', 'Due date' => 'Date d\'échéance', - 'Others formats accepted: %s and %s' => 'Autres formats acceptés : %s et %s', 'Description' => 'Description', '%d comments' => '%d commentaires', '%d comment' => '%d commentaire', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Créé par %s', 'Tasks Export' => 'Exportation des tâches', 'Start Date' => 'Date de début', - 'End Date' => 'Date de fin', 'Execute' => 'Exécuter', 'Task Id' => 'Identifiant de la tâche', 'Creator' => 'Créateur', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Distant', 'Enabled' => 'Activé', 'Disabled' => 'Désactivé', - 'Username:' => 'Nom d\'utilisateur :', - 'Name:' => 'Nom :', + 'Login:' => 'Nom d\'utilisateur :', + 'Full Name:' => 'Nom :', 'Email:' => 'Email :', 'Notifications:' => 'Notifications :', 'Notifications' => 'Notifications', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Libellé des liens', 'Link modification' => 'Modification d\'un lien', 'Links' => 'Liens', - 'Link settings' => 'Paramètres des liens', 'Opposite label' => 'Nom du libellé opposé', 'Remove a link' => 'Supprimer un lien', - 'Task\'s links' => 'Liens des tâches', 'The labels must be different' => 'Les libellés doivent être différents', 'There is no link.' => 'Il n\'y a aucun lien.', 'This label must be unique' => 'Ce libellé doit être unique', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Vue compacte', 'Horizontal scrolling' => 'Défilement horizontal', 'Compact/wide view' => 'Basculer entre la vue compacte et étendue', - 'No results match:' => 'Aucun résultat :', 'Currency' => 'Devise', 'Private project' => 'Projet privé', 'AUD - Australian Dollar' => 'AUD - Dollar australien', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Yen', 'NZD - New Zealand Dollar' => 'NZD - Dollar néo-zélandais', 'RSD - Serbian dinar' => 'RSD - Dinar serbe', + 'CNY - Chinese Yuan' => 'CNY - Yuan (Chine)', 'USD - US Dollar' => 'USD - Dollar américain', 'Destination column' => 'Colonne de destination', 'Move the task to another column when assigned to a user' => 'Déplacer la tâche dans une autre colonne lorsque celle-ci est assignée à quelqu\'un', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Taux de change des devises', 'Rate' => 'Taux', 'Change reference currency' => 'Changer la monnaie de référence', - 'Add a new currency rate' => 'Ajouter un nouveau taux pour une devise', 'Reference currency' => 'Devise de référence', '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', @@ -675,7 +666,6 @@ return array( 'view the board on Kanboard' => 'voir le tableau sur Kanboard', 'The task have been moved to the first swimlane' => 'La tâche a été déplacée dans la première swimlane', 'The task have been moved to another swimlane:' => 'La tâche a été déplacée dans une autre swimlane :', - // 'Overdue tasks for the project(s) "%s"' => 'Tâches en retard pour le projet « %s »', 'New title: %s' => 'Nouveau titre : %s', 'The task is not assigned anymore' => 'La tâche n\'est plus assignée maintenant', 'New assignee: %s' => 'Nouvel assigné : %s', @@ -703,7 +693,6 @@ return array( '<30m' => '<30m', 'Stop timer' => 'Stopper le chrono', 'Start timer' => 'Démarrer le chrono', - 'Add project member' => 'Ajouter un membre au projet', 'My activity stream' => 'Mon flux d\'activité', 'My calendar' => 'Mon agenda', 'Search tasks' => 'Rechercher des tâches', @@ -758,8 +747,6 @@ return array( 'Remote user' => 'Utilisateur distant', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Les utilisateurs distants ne stockent pas leur mot de passe dans la base de données de Kanboard, exemples : comptes LDAP, Github ou Google.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Si vous cochez la case « Interdire le formulaire d\'authentification », les identifiants entrés dans le formulaire d\'authentification seront ignorés.', - 'New remote user' => 'Créer un utilisateur distant', - 'New local user' => 'Créer un utilisateur local', 'Default task color' => 'Couleur par défaut des tâches', 'This feature does not work with all browsers.' => 'Cette fonctionnalité n\'est pas compatible avec tous les navigateurs', 'There is no destination project available.' => 'Il n\'y a pas de projet de destination disponible.', @@ -840,7 +827,7 @@ return array( 'Swimlane changed for task #%d' => 'Changement de swimlane pour la tâche n°%d', 'Assignee changed on task #%d' => 'Changement de l\'assigné pour la tâche n°%d', '%d overdue tasks' => '%d tâches en retard', - 'Task #%d is overdue' => 'La tâche n°%d est retard', + 'Task #%d is overdue' => 'La tâche n°%d est en retard', 'No new notifications.' => 'Aucune notification.', 'Mark all as read' => 'Tout marquer comme lu', 'Mark as read' => 'Marquer comme lu', @@ -853,7 +840,6 @@ return array( 'Owner' => 'Propriétaire', 'Unread notifications' => 'Notifications non lus', 'Notification methods:' => 'Méthodes de notifications :', - 'Import tasks from CSV file' => 'Importer les tâches depuis un fichier CSV', 'Unable to read your file' => 'Impossible de lire votre fichier', '%d task(s) have been imported successfully.' => '%d tâche(s) ont été importées avec succès.', 'Nothing have been imported!' => 'Rien n\'a été importé', @@ -981,7 +967,6 @@ return array( 'Project owner: ' => 'Responsable du projet : ', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'L\'identifiant du projet est optionnel et doit être alphanumérique, example: MONPROJET.', 'Project owner' => 'Responsable du projet', - 'Those dates are useful for the project Gantt chart.' => 'Ces dates sont utiles pour le diagramme de Gantt des projets.', 'Private projects do not have users and groups management.' => 'Les projets privés n\'ont pas de gestion d\'utilisateurs et de groupes.', 'There is no project member.' => 'Il n\'y a aucun membre du projet.', 'Priority' => 'Priorité', @@ -1038,7 +1023,6 @@ return array( 'Started:' => 'Commençé le :', 'Moved:' => 'Déplacé le : ', 'Task #%d' => 'Tâche n°%d', - 'Date and time format' => 'Format de la date et de l\'heure', 'Time format' => 'Format de l\'heure', 'Start date: ' => 'Date de début : ', 'End date: ' => 'Date de fin : ', @@ -1052,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Utilisateur désactivé avec succès.', 'Unable to disable this user.' => 'Impossible de désactiver cet utilisateur.', 'All files have been uploaded successfully.' => 'Tous les fichiers ont été uploadés avec succès.', - 'View uploaded files' => 'Voir les fichiers uploadés', 'The maximum allowed file size is %sB.' => 'La taille maximale autorisée pour les fichiers est de %so.', - 'Choose files again' => 'Choisir de nouveau des fichiers', 'Drag and drop your files here' => 'Glissez-déposez vos fichiers ici', 'choose files' => 'choisissez des fichiers', 'View profile' => 'Voir le profil', @@ -1164,7 +1146,6 @@ return array( 'Email sender address' => 'Adresse email de l\'expéditeur', 'Email transport' => 'Transport des emails', 'Webhook token' => 'Jeton de sécurité des webhooks', - 'Imports' => 'Importations', 'Project tags management' => 'Gestion des libellés pour le projet', 'Tag created successfully.' => 'Libellé créé avec succès.', 'Unable to create this tag.' => 'Imposssible de créer ce libellé.', @@ -1211,8 +1192,6 @@ return array( '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', 'Assign a color when the task is moved to a specific swimlane' => 'Assigner une couleur lorsque une tâche est déplaçée dans une swimlane spécifique', 'Assign a priority when the task is moved to a specific swimlane' => 'Assigner une priorité lorsque une tâche est déplaçée dans une swimlane spécifique', 'User unlocked successfully.' => 'Utilisateur débloqué avec succès.', @@ -1288,4 +1267,44 @@ return array( 'Your personal API access token is "%s"' => 'Votre jeton d\'accès personnel à l\'API est « %s »', 'Remove your token' => 'Supprimer votre jeton', 'Generate a new token' => 'Générer un nouveau jeton', + 'Showing %d-%d of %d' => 'Éléments %d à %d sur %d', + 'Outgoing Emails' => 'Emails sortants', + 'Add or change currency rate' => 'Ajouter ou changer le taux de change', + 'Reference currency: %s' => 'Monnaie de référence : %s', + 'Add custom filters' => 'Ajouter un filtre personnalisé', + 'Export' => 'Exporter', + 'Add link label' => 'Ajouter un libellé de lien', + 'Incompatible Plugins' => 'Extensions incompatibles', + 'Compatibility' => 'Compatibilité', + 'Permissions and ownership' => 'Permissions et propriétaire', + 'Priorities' => 'Priorités', + 'Close this window' => 'Fermer cette fenêtre', + 'Unable to upload this file.' => 'Impossible de téléverser ce fichier.', + 'Import tasks' => 'Importer des tâches', + 'Choose a project' => 'Choisir un projet', + 'Profile' => 'Profil', + 'Application role' => 'Rôle dans l\'application', + '%d invitations were sent.' => '%d invitations ont été envoyées.', + '%d invitation was sent.' => '%d invitation a été envoyée.', + 'Unable to create this user.' => 'Impossible de créer cet utilisateur.', + 'Kanboard Invitation' => 'Invitation pour Kanboard', + 'Visible on dashboard' => 'Visible sur le tableau de bord', + 'Created at:' => 'Créé le :', + 'Updated at:' => 'Mis à jour le :', + 'There is no custom filter.' => 'Il n\'y a aucun filtre personnalisé.', + 'New User' => 'Nouvel utilisateur', + 'Authentication' => 'Authentification', + 'If checked, this user will use a third-party system for authentication.' => 'Si coché, cet utilisateur va utiliser un système externe pour s\'authentifier.', + 'The password is necessary only for local users.' => 'Le mot de passe est nécessaire uniquement pour les utilisateurs locaux.', + 'You have been invited to register on Kanboard.' => 'Vous avez été invité à vous inscrire sur Kanboard.', + 'Click here to join your team' => 'Cliquez ici pour rejoindre votre équipe', + 'Invite people' => 'Inviter des gens', + 'Emails' => 'Emails', + 'Enter one email address by line.' => 'Entrez une adresse électronique par ligne.', + 'Add these people to this project' => 'Ajouter ces personnes à ce projet', + 'Add this person to this project' => 'Ajouter cet utilisateur à ce projet', + 'Sign-up' => 'Inscription', + 'Credentials' => 'Informations d\'identification', + 'New user' => 'Nouvel utilisateur', + 'This username is already taken' => 'Ce nom d\'utilisateur est déjà pris', ); diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php index 784c27ba..4b8dedbe 100644 --- a/app/Locale/hu_HU/translations.php +++ b/app/Locale/hu_HU/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d feladat a táblán', '%d tasks in total' => 'Összesen %d feladat', 'Unable to update this board.' => 'Nem lehet frissíteni a táblát.', - 'Edit board' => 'Tábla szerkesztése', 'Disable' => 'Letiltás', 'Enable' => 'Engedélyezés', 'New project' => 'Új projekt', @@ -72,7 +71,6 @@ return array( 'Title' => 'Cím', 'Assigned to %s' => 'Felelős: %s', 'Remove a column' => 'Oszlop törlése', - 'Remove a column from a board' => 'Oszlop törlése a tábláról', 'Unable to remove this column.' => 'Az oszlop törlése nem lehetséges.', 'Do you really want to remove this column: "%s"?' => 'Valóban törölni akarja ezt az oszlopot: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Az oszlophoz rendelt ÖSSZES FELADAT TÖRLŐDNI FOG!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Feladatok száma', 'User' => 'Felhasználó', 'Comments' => 'Hozzászólások', - 'Leave a comment' => 'Írjon hozzászólást ...', 'Comment is required' => 'A hozzászólás mező kötelező', - 'Leave a description' => 'Írjon leírást ...', 'Comment added successfully.' => 'Hozzászólás sikeresen elküldve.', 'Unable to create your comment.' => 'Hozzászólás létrehozása nem lehetséges.', 'Due Date' => 'Határidő', @@ -224,7 +220,6 @@ return array( 'Search' => 'Keresés', 'Nothing found.' => 'Nincs találat.', 'Due date' => 'Határidő', - 'Others formats accepted: %s and %s' => 'Egyéb érvényes formátumok: "%s" és "%s"', 'Description' => 'Leírás', '%d comments' => '%d megjegyzés', '%d comment' => '%d megjegyzés', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Készítette: %s', 'Tasks Export' => 'Feladatok exportálása', 'Start Date' => 'Kezdés dátuma', - 'End Date' => 'Befejezés dátuma', 'Execute' => 'Végrehajt', 'Task Id' => 'Feladat ID', 'Creator' => 'Készítette', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Távoli', 'Enabled' => 'Engedélyezve', 'Disabled' => 'Letiltva', - 'Username:' => 'Felhasználónév:', - 'Name:' => 'Név:', + 'Login:' => 'Felhasználónév:', + 'Full Name:' => 'Név:', 'Email:' => 'E-mail:', 'Notifications:' => 'Értesítések:', 'Notifications' => 'Értesítések', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Hivatkozás címkék', 'Link modification' => 'Hivatkozás módosítás', 'Links' => 'Hivatkozások', - 'Link settings' => 'Hivatkozás beállítasok', 'Opposite label' => 'Ellenkező címke', 'Remove a link' => 'Hivatkozás törlése', - 'Task\'s links' => 'Feladat hivatkozások', 'The labels must be different' => 'A címkék nem lehetnek azonosak', 'There is no link.' => 'Nincs hivatkozás.', 'This label must be unique' => 'A címkének egyedinek kell lennie.', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Kompakt nézet', 'Horizontal scrolling' => 'Vízszintes görgetés', 'Compact/wide view' => 'Kompakt/széles nézet', - 'No results match:' => 'Nincs találat:', 'Currency' => 'Pénznem', 'Private project' => 'Privát projekt', 'AUD - Australian Dollar' => 'AUD - Ausztrál dollár', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Japán Yen', 'NZD - New Zealand Dollar' => 'NZD - Új-Zélandi dollár', 'RSD - Serbian dinar' => 'RSD - Szerb dínár', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - Amerikai dollár', 'Destination column' => 'Cél oszlop', 'Move the task to another column when assigned to a user' => 'Feladat másik oszlopba helyezése felhasználóhoz rendélés után', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Árfolyamok', 'Rate' => 'Árfolyam', 'Change reference currency' => 'A bázis pénznem megváltoztatása', - 'Add a new currency rate' => 'Új átváltási árfolyam megadása', 'Reference currency' => 'Bázis pénznem', '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', @@ -702,7 +693,6 @@ return array( '<30m' => '30p', 'Stop timer' => 'Időmérő leállítása', 'Start timer' => 'Időmérő elindítása', - 'Add project member' => 'Projekt tag hozzáadása', 'My activity stream' => 'Tevékenységem', 'My calendar' => 'Naptáram', 'Search tasks' => 'Feladatok közötti keresés', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Távoli felhasználó', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'A távoli felhasználók jelszava nem a Kanboard adatbázisban van tárolva. Példák: LDAP, Google és GitHub számlák.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Ha bekattintja a "Bejelentkezési ablak tiltása" jelölőnégyzetet, akkor a login ablakban megadott jelszó nem lesz figyelembe véve.', - 'New remote user' => 'Új távoli felhasználó', - 'New local user' => 'Új helyi felhasználó', 'Default task color' => 'A feladathoz rendelt alapszín', 'This feature does not work with all browsers.' => 'Ez a jellemző nem minden böngészőben működik.', 'There is no destination project available.' => 'Nincs ilyen cél projekt.', @@ -852,7 +840,6 @@ return array( 'Owner' => 'Tulajdonos', 'Unread notifications' => 'Olvasatlan értesítések', 'Notification methods:' => 'Értesítési módszerek:', - 'Import tasks from CSV file' => 'Feladatok beolvasása CSV fájlból', 'Unable to read your file' => 'A fájl nem olvasható', '%d task(s) have been imported successfully.' => '%d feladat sikeresen feldolgozva.', 'Nothing have been imported!' => 'Nem történt beolvasás!', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'A projekt tulajdonosa: ', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'A projekt azonosító opcionális, és kötelezően alfanumerikus karakterekből áll, pl: MYPROJECT.', 'Project owner' => 'Projekt tulajdonos', - 'Those dates are useful for the project Gantt chart.' => 'Ezek a dátumok a projekt Gantt diagramjához hasznosak.', 'Private projects do not have users and groups management.' => 'A privát projektekhez nem tartozik felhasználó kezelés és csoport kezelés.', 'There is no project member.' => 'A projektnek nincs tagja.', 'Priority' => 'Prioritás', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'Elindult:', 'Moved:' => 'Elmozgatva:', 'Task #%d' => '#%d. feladat', - 'Date and time format' => 'Dátum és idő formátum', 'Time format' => 'Idő formátum', 'Start date: ' => 'Kezdő datum: ', 'End date: ' => 'Vég dátum: ', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => 'A felhaszáló sikeresen le lett tiltva.', 'Unable to disable this user.' => 'Nem sikerült a felhasználó letiltása.', 'All files have been uploaded successfully.' => 'Az összes fájl sikeresen feltöltődött.', - 'View uploaded files' => 'A feltöltött fájlok megtekintése', 'The maximum allowed file size is %sB.' => 'A fájl max. megengedett mérete %s bájt', - 'Choose files again' => 'Válasszon újból fájlt', 'Drag and drop your files here' => 'Fogdd-és-vidd módszerrel dobja ide a fájlt', 'choose files' => 'válasszon fájlt', 'View profile' => 'Profil megtekintés', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/id_ID/translations.php b/app/Locale/id_ID/translations.php index 9398d51d..45c93b06 100644 --- a/app/Locale/id_ID/translations.php +++ b/app/Locale/id_ID/translations.php @@ -5,7 +5,7 @@ return array( 'number.thousands_separator' => ' ', 'None' => 'Tidak satupun', 'edit' => 'modifikasi', - 'Edit' => 'Modifikasi', + 'Edit' => 'Edit', 'remove' => 'hapus', 'Remove' => 'Hapus', 'Yes' => 'Ya', @@ -30,11 +30,11 @@ return array( 'Amber' => 'Amber', 'Save' => 'Simpan', 'Login' => 'Masuk', - 'Official website:' => 'Situs resmi :', + 'Official website:' => 'Situs resmi:', 'Unassigned' => 'Belum ditugaskan', 'View this task' => 'Lihat tugas ini', 'Remove user' => 'Hapus pengguna', - 'Do you really want to remove this user: "%s"?' => 'Anda yakin akan menghapus pengguna ini : « %s » ?', + 'Do you really want to remove this user: "%s"?' => 'Anda yakin mau menghapus pengguna ini: "%s"?', 'All users' => 'Semua pengguna', 'Username' => 'Nama pengguna', 'Password' => 'Kata sandi', @@ -44,10 +44,10 @@ return array( 'No user' => 'Tidak ada pengguna', 'Forbidden' => 'Terlarang', 'Access Forbidden' => 'Akses Dilarang', - 'Edit user' => 'Rubah Pengguna', + 'Edit user' => 'Edit pengguna', 'Logout' => 'Keluar', - 'Bad username or password' => 'Nama pengguna atau kata sandri buruk', - 'Edit project' => 'Rubah proyek', + 'Bad username or password' => 'Nama pengguna atau password salah', + 'Edit project' => 'Edit proyek', 'Name' => 'Nama', 'Projects' => 'Proyek', 'No project' => 'Tidak ada proyek', @@ -60,31 +60,29 @@ return array( 'Active' => 'Aktif', '%d tasks on the board' => '%d tugas di papan', '%d tasks in total' => '%d tugas di total', - 'Unable to update this board.' => 'Tidak dapat memperbaharui papan ini', - 'Edit board' => 'Rubah papan', + 'Unable to update this board.' => 'Tidak dapat memperbarui papan ini', 'Disable' => 'Nonaktifkan', 'Enable' => 'Aktifkan', - 'New project' => 'Proyek Baru', - 'Do you really want to remove this project: "%s"?' => 'Apakah anda yakin akan menghapus proyek ini : « %s » ?', + 'New project' => 'Proyek baru', + 'Do you really want to remove this project: "%s"?' => 'Apakah Anda yakin mau menghapus proyek ini: "%s"?', 'Remove project' => 'Hapus proyek', - 'Edit the board for "%s"' => 'Rubah papan untuk « %s »', + 'Edit the board for "%s"' => 'Edit papan untuk "%s"', 'Add a new column' => 'Tambah kolom baru', 'Title' => 'Judul', - 'Assigned to %s' => 'Ditugaskan ke %s', + 'Assigned to %s' => 'Ditugaskan kepada %s', 'Remove a column' => 'Hapus kolom', - 'Remove a column from a board' => 'Hapus kolom dari papan', 'Unable to remove this column.' => 'Tidak dapat menghapus kolom ini.', - 'Do you really want to remove this column: "%s"?' => 'Apakah anda yakin akan menghapus kolom ini : « %s » ?', - 'This action will REMOVE ALL TASKS associated to this column!' => 'tindakan ini akan MENGHAPUS SEMUA TUGAS yang terkait dengan kolom ini!', + 'Do you really want to remove this column: "%s"?' => 'Apakah Anda yakin mau menghapus kolom ini: "%s"?', + 'This action will REMOVE ALL TASKS associated to this column!' => 'Tindakan ini akan MENGHAPUS SEMUA TUGAS yang berkaitan dengan kolom ini!', 'Settings' => 'Pengaturan', 'Application settings' => 'Pengaturan aplikasi', 'Language' => 'Bahasa', - 'Webhook token:' => 'Token webhook :', - 'API token:' => 'Token API :', - 'Database size:' => 'Ukuran basis data :', - 'Download the database' => 'Unduh basis data', - 'Optimize the database' => 'Optimasi basis data', - '(VACUUM command)' => '(perintah VACUUM)', + 'Webhook token:' => 'Token Webhook:', + 'API token:' => 'Token API:', + 'Database size:' => 'Ukuran database:', + 'Download the database' => 'Unduh database', + 'Optimize the database' => 'Optimasi database', + '(VACUUM command)' => '(Perintah VACUUM)', '(Gzip compressed Sqlite file)' => '(File Sqlite yang terkompress Gzip)', 'Close a task' => 'Tutup tugas', 'Column' => 'Kolom', @@ -93,38 +91,38 @@ return array( 'Create another task' => 'Buat tugas lain', 'New task' => 'Tugas baru', 'Open a task' => 'Buka tugas', - 'Do you really want to open this task: "%s"?' => 'Apakah anda yakin akan membuka tugas ini : « %s » ?', + 'Do you really want to open this task: "%s"?' => 'Apakah Anda yakin mau membuka tugas ini: "%s"?', 'Back to the board' => 'Kembali ke papan', 'There is nobody assigned' => 'Tidak ada orang yand ditugaskan', - 'Column on the board:' => 'Kolom di dalam papan : ', + 'Column on the board:' => 'Kolom di dalam papan:', 'Close this task' => 'Tutup tugas ini', 'Open this task' => 'Buka tugas ini', 'There is no description.' => 'Tidak ada deskripsi.', 'Add a new task' => 'Tambah tugas baru', - 'The username is required' => 'nama pengguna diperlukan', + 'The username is required' => 'Nama pengguna dibutuhkan', 'The maximum length is %d characters' => 'Panjang maksimum adalah %d karakter', 'The minimum length is %d characters' => 'Panjang minimum adalah %d karakter', - 'The password is required' => 'Kata sandi diperlukan', + 'The password is required' => 'Password dibutuhkan', 'This value must be an integer' => 'Nilai ini harus integer', 'The username must be unique' => 'Nama pengguna harus unik', - 'The user id is required' => 'Id Pengguna diperlukan', - 'Passwords don\'t match' => 'Kata sandi tidak cocok', + 'The user id is required' => 'ID pengguna diperlukan', + 'Passwords don\'t match' => 'Password tidak cocok', 'The confirmation is required' => 'Konfirmasi diperlukan', 'The project is required' => 'Proyek diperlukan', - 'The id is required' => 'Id diperlukan', - 'The project id is required' => 'Id proyek diperlukan', + 'The id is required' => 'ID diperlukan', + 'The project id is required' => 'ID proyek diperlukan', 'The project name is required' => 'Nama proyek diperlukan', 'The title is required' => 'Judul diperlukan', 'Settings saved successfully.' => 'Pengaturan berhasil disimpan.', 'Unable to save your settings.' => 'Tidak dapat menyimpan pengaturan anda.', - 'Database optimization done.' => 'Optimasi basis data selesai.', + 'Database optimization done.' => 'Optimasi database selesai.', 'Your project have been created successfully.' => 'Proyek anda berhasil dibuat.', 'Unable to create your project.' => 'Tidak dapat membuat proyek anda.', - 'Project updated successfully.' => 'Proyek berhasil diperbaharui.', - 'Unable to update this project.' => 'Tidak dapat memperbaharui proyek ini.', + 'Project updated successfully.' => 'Proyek berhasil diperbarui.', + 'Unable to update this project.' => 'Tidak dapat memperbarui proyek ini.', 'Unable to remove this project.' => 'Tidak dapat menghapus proyek ini.', 'Project removed successfully.' => 'Proyek berhasil dihapus.', - 'Project activated successfully.' => 'Proyek berhasil diaktivasi.', + 'Project activated successfully.' => 'Proyek berhasil diaktifkan.', 'Unable to activate this project.' => 'Tidak dapat mengaktifkan proyek ini.', 'Project disabled successfully.' => 'Proyek berhasil dinonaktifkan.', 'Unable to disable this project.' => 'Tidak dapat menonaktifkan proyek ini.', @@ -132,61 +130,59 @@ return array( 'Task opened successfully.' => 'Tugas berhasil dibuka.', 'Unable to close this task.' => 'Tidak dapat menutup tugas ini.', 'Task closed successfully.' => 'Tugas berhasil ditutup.', - 'Unable to update your task.' => 'Tidak dapat memperbaharui tugas ini.', - 'Task updated successfully.' => 'Tugas berhasil diperbaharui.', + 'Unable to update your task.' => 'Tidak dapat memperbarui tugas ini.', + 'Task updated successfully.' => 'Tugas berhasil diperbarui.', 'Unable to create your task.' => 'Tidak dapat membuat tugas anda.', 'Task created successfully.' => 'Tugas berhasil dibuat.', 'User created successfully.' => 'Pengguna berhasil dibuat.', - 'Unable to create your user.' => 'Tidak dapat membuat pengguna anda.', - 'User updated successfully.' => 'Pengguna berhasil diperbaharui.', - 'Unable to update your user.' => 'Tidak dapat memperbaharui pengguna anda.', - 'User removed successfully.' => 'pengguna berhasil dihapus.', + 'Unable to create your user.' => 'Tidak dapat membuat pengguna Anda.', + 'User updated successfully.' => 'Pengguna berhasil diperbarui.', + 'Unable to update your user.' => 'Tidak dapat memperbarui pengguna anda.', + 'User removed successfully.' => 'Pengguna berhasil dihapus.', 'Unable to remove this user.' => 'Tidak dapat menghapus pengguna ini.', 'Board updated successfully.' => 'Papan berhasil diperbaharui.', 'Ready' => 'Siap', 'Backlog' => 'Tertunda', 'Work in progress' => 'Sedang dalam pengerjaan', 'Done' => 'Selesai', - 'Application version:' => 'Versi aplikasi :', - 'Id' => 'Id.', + 'Application version:' => 'Versi aplikasi:', + 'Id' => 'ID', '%d closed tasks' => '%d tugas yang ditutup', 'No task for this project' => 'Tidak ada tugas dalam proyek ini', 'Public link' => 'Tautan publik', 'Timezone' => 'Zona waktu', - 'Sorry, I didn\'t find this information in my database!' => 'Maaf, saya tidak menemukan informasi ini dalam basis data saya !', + 'Sorry, I didn\'t find this information in my database!' => 'Maaf, saya tidak dapat menemukan informasi ini dalam database saya!', 'Page not found' => 'Halaman tidak ditemukan', 'Complexity' => 'Kompleksitas', - 'Task limit' => 'Batas tugas.', + 'Task limit' => 'Batas tugas', 'Task count' => 'Jumlah tugas', 'User' => 'Pengguna', 'Comments' => 'Komentar', - 'Leave a comment' => 'Tinggalkan komentar', - 'Comment is required' => 'Komentar diperlukan', - 'Leave a description' => 'Tinggalkan deskripsi', + 'Comment is required' => 'Komentar dibutuhkan', 'Comment added successfully.' => 'Komentar berhasil ditambahkan.', - 'Unable to create your comment.' => 'Tidak dapat menambahkan komentar anda.', + 'Unable to create your comment.' => 'Tidak dapat menambahkan komentar Anda.', 'Due Date' => 'Batas Tanggal Terakhir', - 'Invalid date' => 'Tanggal tidak valid', + 'Invalid date' => 'Tanggal tidak sesuai', 'Automatic actions' => 'Tindakan otomatis', - 'Your automatic action have been created successfully.' => 'Tindakan otomatis anda berhasil dibuat.', - 'Unable to create your automatic action.' => 'Tidak dapat membuat tindakan otomatis anda.', + 'Your automatic action have been created successfully.' => 'Tindakan otomatis Anda berhasil dibuat.', + 'Unable to create your automatic action.' => 'Tidak dapat membuat tindakan otomatis Anda.', 'Remove an action' => 'Hapus tindakan', - 'Unable to remove this action.' => 'Tidak dapat menghapus tindakan ini', + 'Unable to remove this action.' => 'Tidak dapat menghapus tindakan ini.', 'Action removed successfully.' => 'Tindakan berhasil dihapus.', - 'Automatic actions for the project "%s"' => 'Tindakan otomatis untuk proyek ini « %s »', + 'Automatic actions for the project "%s"' => 'Tindakan otomatis untuk proyek ini "%s"', 'Add an action' => 'Tambah tindakan', 'Event name' => 'Nama acara', 'Action name' => 'Nama tindakan', 'Action parameters' => 'Parameter tindakan', 'Action' => 'Tindakan', 'Event' => 'Acara', - 'When the selected event occurs execute the corresponding action.' => 'Ketika acara yang dipilih terjadi, melakukan tindakan yang sesuai.', + 'When the selected event occurs execute the corresponding action.' => 'Ketika acara yang dipilih terjadi, tindakan yang berhubungan dengan acara akan dieksekusi.', 'Next step' => 'Langkah selanjutnya', 'Define action parameters' => 'Definisi parameter tindakan', - 'Do you really want to remove this action: "%s"?' => 'Apakah anda yakin akan menghapus tindakan ini « %s » ?', + 'Do you really want to remove this action: "%s"?' => 'Apakah Anda yakin mau menghapus tindakan ini: "%s"?', 'Remove an automatic action' => 'Hapus tindakan otomatis', - 'Assign the task to a specific user' => 'Menetapkan tugas untuk pengguna tertentu', - 'Assign the task to the person who does the action' => 'Memberikan tugas untuk orang yang melakukan tindakan', + 'Assign the task to a specific user' => 'Berikan tugas pada pengguna tertentu', + 'Assign the task to the person who does the action' => 'Berikan tugas pada orang yang melakukan tindakan', 'Duplicate the task to another project' => 'Duplikasi tugas ke proyek lain', 'Move a task to another column' => 'Pindahkan tugas ke kolom lain', 'Task modification' => 'Modifikasi tugas', @@ -196,65 +192,64 @@ return array( 'Column title' => 'Judul kolom', 'Position' => 'Posisi', 'Duplicate to another project' => 'Duplikasi ke proyek lain', - 'Duplicate' => 'Duplikasi', + 'Duplicate' => 'Duplikat', 'link' => 'tautan', - 'Comment updated successfully.' => 'Komentar berhasil diperbaharui.', - 'Unable to update your comment.' => 'Tidak dapat memperbaharui komentar anda.', + 'Comment updated successfully.' => 'Komentar berhasil diperbarui.', + 'Unable to update your comment.' => 'Tidak dapat memperbarui komentar Anda.', 'Remove a comment' => 'Hapus komentar', 'Comment removed successfully.' => 'Komentar berhasil dihapus.', 'Unable to remove this comment.' => 'Tidak dapat menghapus komentar ini.', - 'Do you really want to remove this comment?' => 'Apakah anda yakin akan menghapus komentar ini ?', - 'Current password for the user "%s"' => 'Kata sandi saat ini untuk pengguna « %s »', - 'The current password is required' => 'Kata sandi saat ini diperlukan', - 'Wrong password' => 'Kata sandi salah', + 'Do you really want to remove this comment?' => 'Apakah Anda yakin mau menghapus komentar ini?', + 'Current password for the user "%s"' => 'Password saat ini untuk pengguna "%s"', + 'The current password is required' => 'Password saat ini diperlukan', + 'Wrong password' => 'Password salah', 'Unknown' => 'Tidak diketahui', 'Last logins' => 'Masuk terakhir', 'Login date' => 'Tanggal masuk', 'Authentication method' => 'Metode otentifikasi', 'IP address' => 'Alamat IP', - 'User agent' => 'Agen Pengguna', - 'Persistent connections' => 'Koneksi persisten', + 'User agent' => 'Agen pengguna', + 'Persistent connections' => 'Koneksi tetap', 'No session.' => 'Tidak ada sesi.', 'Expiration date' => 'Tanggal kadaluarsa', 'Remember Me' => 'Ingat Saya', - 'Creation date' => 'Tanggal dibuat', + 'Creation date' => 'Tanggal pembuatan', 'Everybody' => 'Semua orang', 'Open' => 'Terbuka', 'Closed' => 'Ditutup', 'Search' => 'Cari', 'Nothing found.' => 'Tidak ditemukan.', 'Due date' => 'Batas tanggal terakhir', - 'Others formats accepted: %s and %s' => 'Format lain yang didukung : %s et %s', 'Description' => 'Deskripsi', '%d comments' => '%d komentar', '%d comment' => '%d komentar', - 'Email address invalid' => 'Alamat email tidak valid', - 'Your external account is not linked anymore to your profile.' => 'Akun eksternal anda tidak lagi terhubung ke profil anda.', - 'Unable to unlink your external account.' => 'Tidak dapat memutuskan akun eksternal anda.', + 'Email address invalid' => 'Alamat email tidak sesuai', + 'Your external account is not linked anymore to your profile.' => 'Akun eksternal Anda tidak lagi terhubung ke profil anda.', + 'Unable to unlink your external account.' => 'Tidak dapat memutuskan akun eksternal Anda.', 'External authentication failed' => 'Otentifikasi eksternal gagal', - 'Your external account is linked to your profile successfully.' => 'Akun eksternal anda berhasil dihubungkan ke profil anda.', + 'Your external account is linked to your profile successfully.' => 'Akun eksternal Anda berhasil dihubungkan ke profil anda.', 'Email' => 'Email', 'Task removed successfully.' => 'Tugas berhasil dihapus.', 'Unable to remove this task.' => 'Tidak dapat menghapus tugas ini.', 'Remove a task' => 'Hapus tugas', - 'Do you really want to remove this task: "%s"?' => 'Apakah anda yakin akan menghapus tugas ini « %s » ?', + 'Do you really want to remove this task: "%s"?' => 'Apakah Anda yakin mau menghapus tugas ini: "%s"?', 'Assign automatically a color based on a category' => 'Otomatis menetapkan warna berdasarkan kategori', 'Assign automatically a category based on a color' => 'Otomatis menetapkan kategori berdasarkan warna', - 'Task creation or modification' => 'Tugas dibuat atau di mofifikasi', + 'Task creation or modification' => 'Tugas dibuat atau di modifikasi', 'Category' => 'Kategori', - 'Category:' => 'Kategori :', + 'Category:' => 'Kategori:', 'Categories' => 'Kategori', - 'Your category have been created successfully.' => 'Kategori anda berhasil dibuat.', - 'Unable to create your category.' => 'Tidak dapat membuat kategori anda.', - 'Your category have been updated successfully.' => 'Kategori anda berhasil diperbaharui.', - 'Unable to update your category.' => 'Tidak dapat memperbaharui kategori anda.', + 'Your category have been created successfully.' => 'Kategori Anda berhasil dibuat.', + 'Unable to create your category.' => 'Tidak dapat membuat kategori Anda.', + 'Your category have been updated successfully.' => 'Kategori Anda berhasil diperbarui.', + 'Unable to update your category.' => 'Tidak dapat memperbarui kategori Anda.', 'Remove a category' => 'Hapus kategori', 'Category removed successfully.' => 'Kategori berhasil dihapus.', 'Unable to remove this category.' => 'Tidak dapat menghapus kategori ini.', - 'Category modification for the project "%s"' => 'Modifikasi kategori untuk proyek « %s »', + 'Category modification for the project "%s"' => 'Modifikasi kategori untuk proyek "%s"', 'Category Name' => 'Nama Kategori', 'Add a new category' => 'Tambah kategori baru', - 'Do you really want to remove this category: "%s"?' => 'Apakah anda yakin akan menghapus kategori ini « %s » ?', + 'Do you really want to remove this category: "%s"?' => 'Apakah Anda yakin mau menghapus kategori ini: "%s"?', 'All categories' => 'Semua kategori', 'No category' => 'Tidak ada kategori', 'The name is required' => 'Nama diperlukan', @@ -262,35 +257,35 @@ return array( 'Unable to remove this file.' => 'Tidak dapat menghapus berkas ini.', 'File removed successfully.' => 'Berkas berhasil dihapus.', 'Attach a document' => 'Lampirkan dokumen', - 'Do you really want to remove this file: "%s"?' => 'Apakah anda yakin akan menghapus berkas ini « %s » ?', + 'Do you really want to remove this file: "%s"?' => 'Apakah Anda yakin akan menghapus berkas ini: "%s"?', 'Attachments' => 'Lampiran', - 'Edit the task' => 'Modifikasi tugas', + 'Edit the task' => 'Edit tugas', 'Add a comment' => 'Tambahkan komentar', - 'Edit a comment' => 'Modifikasi komentar', + 'Edit a comment' => 'Edit komentar', 'Summary' => 'Ringkasan', 'Time tracking' => 'Pelacakan waktu', - 'Estimate:' => 'Estimasi :', + 'Estimate:' => 'Estimasi:', 'Spent:' => 'Menghabiskan:', - 'Do you really want to remove this sub-task?' => 'Apakah anda yakin akan menghapus sub-tugas ini ?', + 'Do you really want to remove this sub-task?' => 'Apakah Anda yakin mau menghapus sub-tugas ini?', 'Remaining:' => 'Tersisa:', 'hours' => 'jam', - 'spent' => 'menghabiskan', + 'spent' => 'dihabiskan', 'estimated' => 'perkiraan', 'Sub-Tasks' => 'Sub-tugas', 'Add a sub-task' => 'Tambahkan sub-tugas', 'Original estimate' => 'Perkiraan semula', 'Create another sub-task' => 'Tambahkan sub-tugas lainnya', 'Time spent' => 'Waktu yang dihabiskan', - 'Edit a sub-task' => 'Modifikasi sub-tugas', + 'Edit a sub-task' => 'Edit sub-tugas', 'Remove a sub-task' => 'Hapus sub-tugas', - 'The time must be a numeric value' => 'Waktu harus berisikan numerik', + 'The time must be a numeric value' => 'Waktu harus berupa angka', 'Todo' => 'Yang harus dilakukan', - 'In progress' => 'Sedang proses', + 'In progress' => 'Dalam proses', 'Sub-task removed successfully.' => 'Sub-tugas berhasil dihapus.', 'Unable to remove this sub-task.' => 'Tidak dapat menghapus sub-tugas.', - 'Sub-task updated successfully.' => 'Sub-tugas berhasil diperbaharui.', - 'Unable to update your sub-task.' => 'Tidak dapat memperbaharui sub-tugas anda.', - 'Unable to create your sub-task.' => 'Tidak dapat membuat sub-tugas anda.', + 'Sub-task updated successfully.' => 'Sub-tugas berhasil diperbarui.', + 'Unable to update your sub-task.' => 'Tidak dapat memperbarui sub-tugas Anda.', + 'Unable to create your sub-task.' => 'Tidak dapat membuat sub-tugas Anda.', 'Sub-task added successfully.' => 'Sub-tugas berhasil dibuat.', 'Maximum size: ' => 'Ukuran maksimum: ', 'Unable to upload the file.' => 'Tidak dapat mengunggah berkas.', @@ -298,9 +293,8 @@ return array( 'Created by %s' => 'Dibuat oleh %s', 'Tasks Export' => 'Ekspor Tugas', 'Start Date' => 'Tanggal Mulai', - 'End Date' => 'Tanggal Berakhir', 'Execute' => 'Eksekusi', - 'Task Id' => 'Id Tugas', + 'Task Id' => 'ID Tugas', 'Creator' => 'Pembuat', 'Modification date' => 'Tanggal modifikasi', 'Completion date' => 'Tanggal penyelesaian', @@ -308,19 +302,19 @@ return array( 'Project cloned successfully.' => 'Kloning proyek berhasil.', 'Unable to clone this project.' => 'Tidak dapat mengkloning proyek.', 'Enable email notifications' => 'Aktifkan pemberitahuan dari email', - 'Task position:' => 'Posisi tugas :', + 'Task position:' => 'Posisi tugas:', 'The task #%d have been opened.' => 'Tugas #%d telah dibuka.', 'The task #%d have been closed.' => 'Tugas #%d telah ditutup.', - 'Sub-task updated' => 'Sub-tugas diperbaharui', - 'Title:' => 'Judul :', - 'Status:' => 'Status :', - 'Assignee:' => 'Ditugaskan ke :', - 'Time tracking:' => 'Pelacakan waktu :', + 'Sub-task updated' => 'Sub-tugas diperbarui', + 'Title:' => 'Judul:', + 'Status:' => 'Status:', + 'Assignee:' => 'Ditugaskan ke:', + 'Time tracking:' => 'Pelacakan waktu:', '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 added "%s"' => 'Lampiran baru ditambahkan "%s"', + 'New comment posted by %s' => 'Komentar baru ditambahkan oleh %s', 'New comment' => 'Komentar baru', - 'Comment updated' => 'Komentar diperbaharui', + 'Comment updated' => 'Komentar diperbarui', 'New subtask' => 'Sub-tugas baru', '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', @@ -329,125 +323,125 @@ return array( 'Disable public access' => 'Nonaktifkan akses publik', 'Enable public access' => 'Aktifkan akses publik', 'Public access disabled' => 'Akses publik dinonaktifkan', - 'Do you really want to disable this project: "%s"?' => 'Apakah anda yakin akan menonaktifkan proyek ini : « %s » ?', - 'Do you really want to enable this project: "%s"?' => 'Apakah anda yakin akan mengaktifkan proyek ini : « %s » ?', + 'Do you really want to disable this project: "%s"?' => 'Apakah Anda yakin mau menonaktifkan proyek ini: "%s"?', + 'Do you really want to enable this project: "%s"?' => 'Apakah Anda yakin mau mengaktifkan proyek ini: "%s"?', 'Project activation' => 'Aktivasi proyek', 'Move the task to another project' => 'Pindahkan tugas ke proyek lain', 'Move to another project' => 'Pindahkan ke proyek lain', - 'Do you really want to duplicate this task?' => 'Apakah anda yakin akan menduplikasi tugas ini ?', + 'Do you really want to duplicate this task?' => 'Apakah Anda yakin mau menduplikasi tugas ini?', 'Duplicate a task' => 'Duplikasi tugas', 'External accounts' => 'Akun eksternal', 'Account type' => 'Tipe akun', 'Local' => 'Lokal', - 'Remote' => 'Jauh', + 'Remote' => 'Jarak Jauh', 'Enabled' => 'Aktif', 'Disabled' => 'Nonaktif', - 'Username:' => 'Nama pengguna :', - 'Name:' => 'Nama :', - 'Email:' => 'Email :', - 'Notifications:' => 'Pemberitahuan :', + // 'Login:' => '', + // 'Full Name:' => '', + 'Email:' => 'Email:', + 'Notifications:' => 'Pemberitahuan:', 'Notifications' => 'Pemberitahuan', - 'Account type:' => 'Tipe akun :', - 'Edit profile' => 'Modifikasi profil', - 'Change password' => 'Rubah kata sandri', - 'Password modification' => 'Modifikasi kata sandi', + 'Account type:' => 'Tipe akun:', + 'Edit profile' => 'Edit profil', + 'Change password' => 'Ganti password', + 'Password modification' => 'Modifikasi password', 'External authentications' => 'Otentifikasi eksternal', 'Never connected.' => 'Tidak pernah terhubung.', 'No external authentication enabled.' => 'Tidak ada otentifikasi eksternal yang aktif.', - 'Password modified successfully.' => 'Kata sandi berhasil dimodifikasi.', - 'Unable to change the password.' => 'Tidak dapat merubah kata sandir.', - 'Change category' => 'Rubah kategori', - '%s updated the task %s' => '%s memperbaharui tugas %s', + 'Password modified successfully.' => 'Password berhasil dimodifikasi.', + 'Unable to change the password.' => 'Tidak dapat mengganti kata sandi.', + 'Change category' => 'Ganti kategori', + '%s updated the task %s' => '%s memperbarui tugas %s', '%s opened the task %s' => '%s membuka tugas %s', - '%s moved the task %s to the position #%d in the column "%s"' => '%s memindahkan tugas %s ke posisi n°%d dalam kolom « %s »', - '%s moved the task %s to the column "%s"' => '%s memindahkan tugas %s ke kolom « %s »', + '%s moved the task %s to the position #%d in the column "%s"' => '%s memindahkan tugas %s ke posisi #%d dalam kolom "%s"', + '%s moved the task %s to the column "%s"' => '%s memindahkan tugas %s ke kolom "%s"', '%s created the task %s' => '%s membuat tugas %s', '%s closed the task %s' => '%s menutup tugas %s', - '%s created a subtask for the task %s' => '%s membuat subtugas untuk tugas %s', - '%s updated a subtask for the task %s' => '%s memperbaharui subtugas untuk tugas %s', - 'Assigned to %s with an estimate of %s/%sh' => 'Ditugaskan untuk %s dengan perkiraan %s/%sh', + '%s created a subtask for the task %s' => '%s membuat sub-tugas untuk tugas %s', + '%s updated a subtask for the task %s' => '%s memperbarui sub-tugas untuk tugas %s', + 'Assigned to %s with an estimate of %s/%sh' => 'Ditugaskan pada %s dengan perkiraan %s/%sh', 'Not assigned, estimate of %sh' => 'Tidak ada yang ditugaskan, perkiraan %sh', - '%s updated a comment on the task %s' => '%s memperbaharui komentar pada tugas %s', + '%s updated a comment on the task %s' => '%s memperbarui komentar pada tugas %s', '%s commented the task %s' => '%s memberikan komentar pada tugas %s', '%s\'s activity' => 'Aktifitas dari %s', - 'RSS feed' => 'RSS feed', - '%s updated a comment on the task #%d' => '%s memperbaharui komentar pada tugas n°%d', - '%s commented on the task #%d' => '%s memberikan komentar pada tugas n°%d', - '%s updated a subtask for the task #%d' => '%s memperbaharui subtugas untuk tugas n°%d', - '%s created a subtask for the task #%d' => '%s membuat subtugas untuk tugas n°%d', - '%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 opened the task #%d' => '%s membuka tugas n°%d', + 'RSS feed' => 'Umpan RSS', + '%s updated a comment on the task #%d' => '%s memperbarui komentar pada tugas #%d', + '%s commented on the task #%d' => '%s memberikan komentar pada tugas #%d', + '%s updated a subtask for the task #%d' => '%s memperbarui sub-tugas untuk tugas #%d', + '%s created a subtask for the task #%d' => '%s membuat sub-tugas untuk tugas #%d', + '%s updated the task #%d' => '%s memperbarui tugas #%d', + '%s created the task #%d' => '%s membuat tugas #%d', + '%s closed the task #%d' => '%s menutup tugas #%d', + '%s opened the task #%d' => '%s membuka tugas #%d', 'Activity' => 'Aktifitas', - 'Default values are "%s"' => 'Standar nilai adalah« %s »', + 'Default values are "%s"' => 'Nilai default 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 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 »', + 'Task assignee change' => 'Ganti orang yang ditugaskan', + '%s changed the assignee of the task #%d to %s' => '%s mengganti orang yang ditugaskan dari tugas #%d ke %s', + '%s changed the assignee of the task %s to %s' => '%s mengganti orang yang ditugaskan dari tugas %s ke %s', + 'New password for the user "%s"' => 'Password baru untuk pengguna "%s"', 'Choose an event' => 'Pilih acara', - 'Create a task from an external provider' => 'Buat tugas dari pemasok eksternal', - 'Change the assignee based on an external username' => 'Rubah penugasan berdasarkan nama pengguna eksternal', - 'Change the category based on an external label' => 'Rubah kategori berdasarkan label eksternal', + 'Create a task from an external provider' => 'Buat tugas dari penyedia eksternal', + 'Change the assignee based on an external username' => 'Ganti penugasan berdasarkan nama pengguna eksternal', + 'Change the category based on an external label' => 'Ganti kategori berdasarkan label eksternal', 'Reference' => 'Referensi', 'Label' => 'Label', - 'Database' => 'Basis data', + 'Database' => 'Database', 'About' => 'Tentang', - 'Database driver:' => 'Driver basis data :', + 'Database driver:' => 'Driver database:', 'Board settings' => 'Pengaturan papan', - 'Webhook settings' => 'Pengaturan webhook', - 'Reset token' => 'Mereset token', + 'Webhook settings' => 'Pengaturan Webhook', + 'Reset token' => 'Reset token', 'API endpoint:' => 'API endpoint :', 'Refresh interval for private board' => 'Interval pembaruan untuk papan pribadi', 'Refresh interval for public board' => 'Interval pembaruan untuk papan publik', - 'Task highlight period' => 'Periode puncak tugas', - 'Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)' => 'Periode (dalam detik) untuk mempertimbangkan tugas yang baru dimodifikasi (0 untuk menonaktifkan, standar 2 hari)', - 'Frequency in second (60 seconds by default)' => 'Frequensi dalam detik (standar 60 detik)', - 'Frequency in second (0 to disable this feature, 10 seconds by default)' => 'Frequensi dalam detik (0 untuk menonaktifkan fitur ini, standar 10 detik)', + 'Task highlight period' => 'Periode penyorotan tugas', + 'Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)' => 'Periode (dalam detik) untuk mempertimbangkan tugas yang baru dimodifikasi (0 untuk menonaktifkan, default 2 hari)', + 'Frequency in second (60 seconds by default)' => 'Frekuensi dalam detik (default 60 detik)', + 'Frequency in second (0 to disable this feature, 10 seconds by default)' => 'Frekuensi dalam detik (0 untuk menonaktifkan fitur ini, default 10 detik)', 'Application URL' => 'URL Aplikasi', 'Token regenerated.' => 'Token diregenerasi.', 'Date format' => 'Format tanggal', - 'ISO format is always accepted, example: "%s" and "%s"' => 'Format ISO selalu diterima, contoh : « %s » et « %s »', + 'ISO format is always accepted, example: "%s" and "%s"' => 'Format ISO selalu diterima, contoh: "%s" dan "%s"', 'New private project' => 'Proyek pribadi baru', - 'This project is private' => 'Proyek ini adalah pribadi', + 'This project is private' => 'Proyek ini pribadi', 'Add' => 'Tambah', 'Start date' => 'Tanggal mulai', 'Time estimated' => 'Perkiraan waktu', - 'There is nothing assigned to you.' => 'Tidak ada yang diberikan kepada anda.', + 'There is nothing assigned to you.' => 'Tidak ada tugas yang diberikan pada Anda.', 'My tasks' => 'Tugas saya', 'Activity stream' => 'Arus aktifitas', 'Dashboard' => 'Dasbor', 'Confirmation' => 'Konfirmasi', - 'Allow everybody to access to this project' => 'Memungkinkan semua orang untuk mengakses proyek ini', + 'Allow everybody to access to this project' => 'Izinkan semua orang untuk mengakses proyek ini', 'Everybody have access to this project.' => 'Semua orang mendapat akses untuk proyek ini.', 'Webhooks' => 'Webhooks', 'API' => 'API', - 'Create a comment from an external provider' => 'Buat komentar dari pemasok eksternal', + 'Create a comment from an external provider' => 'Buat komentar dari penyedia eksternal', 'Project management' => 'Manajemen proyek', 'My projects' => 'Proyek saya', 'Columns' => 'Kolom', 'Task' => 'Tugas', - 'Your are not member of any project.' => 'Anda bukan anggota dari setiap proyek.', + 'Your are not member of any project.' => 'Anda bukan anggota dari proyek apapun.', 'Percentage' => 'Persentasi', 'Number of tasks' => 'Jumlah dari tugas', 'Task distribution' => 'Pembagian tugas', - 'Analytics' => 'Analitis', - 'Subtask' => 'Subtugas', - 'My subtasks' => 'Subtugas saya', + 'Analytics' => 'Analitik', + 'Subtask' => 'Sub-tugas', + 'My subtasks' => 'Sub-tugas saya', 'User repartition' => 'Partisi ulang pengguna', - 'Clone this project' => 'Gandakan proyek ini', + 'Clone this project' => 'Klon proyek ini', 'Column removed successfully.' => 'Kolom berhasil dihapus.', 'Not enough data to show the graph.' => 'Tidak cukup data untuk menampilkan grafik.', 'Previous' => 'Sebelumnya', - 'The id must be an integer' => 'Id harus integer', - 'The project id must be an integer' => 'Id proyek harus integer', + 'The id must be an integer' => 'ID harus integer', + 'The project id must be an integer' => 'ID proyek harus integer', 'The status must be an integer' => 'Status harus integer', - 'The subtask id is required' => 'Id subtugas diperlukan', - 'The subtask id must be an integer' => 'Id subtugas harus integer', - 'The task id is required' => 'Id tugas diperlukan', - 'The task id must be an integer' => 'Id tugas harus integer', - 'The user id must be an integer' => 'Id user harus integer', + 'The subtask id is required' => 'ID sub-tugas diperlukan', + 'The subtask id must be an integer' => 'ID sub-tugas harus integer', + 'The task id is required' => 'ID tugas diperlukan', + 'The task id must be an integer' => 'ID tugas harus integer', + 'The user id must be an integer' => 'ID user harus integer', 'This value is required' => 'Nilai ini diperlukan', 'This value must be numeric' => 'Nilai ini harus angka', 'Unable to create this task.' => 'Tidak dapat membuat tugas ini', @@ -455,121 +449,119 @@ return array( 'Daily project summary' => 'Ringkasan proyek harian', 'Daily project summary export' => 'Ekspor ringkasan proyek harian', 'Exports' => 'Ekspor', - 'This export contains the number of tasks per column grouped per day.' => 'Ekspor ini berisi jumlah dari tugas per kolom dikelompokan perhari.', + 'This export contains the number of tasks per column grouped per day.' => 'Ekspor ini berisi jumlah dari tugas per kolom yang dikelompokan per hari.', 'Active swimlanes' => 'Swimlanes aktif', 'Add a new swimlane' => 'Tambah swimlane baru', - 'Change default swimlane' => 'Modifikasi standar swimlane', - 'Default swimlane' => 'Standar swimlane', - 'Do you really want to remove this swimlane: "%s"?' => 'Apakah anda yakin akan menghapus swimlane ini : « %s » ?', + 'Change default swimlane' => 'Ganti swimlane default', + 'Default swimlane' => 'Swimlane default', + 'Do you really want to remove this swimlane: "%s"?' => 'Apakah Anda yakin mau menghapus swimlane ini: "%s"?', 'Inactive swimlanes' => 'Swimlanes tidak aktif', - 'Remove a swimlane' => 'Supprimer une swimlane', - 'Show default swimlane' => 'Perlihatkan standar swimlane', - 'Swimlane modification for the project "%s"' => 'Modifikasi swimlane untuk proyek « %s »', + 'Remove a swimlane' => 'Hapus swimlane', + 'Show default swimlane' => 'Lihat swimlane default', + 'Swimlane modification for the project "%s"' => 'Modifikasi swimlane untuk proyek "%s"', 'Swimlane removed successfully.' => 'Swimlane berhasil dihapus.', 'Swimlanes' => 'Swimlanes', - 'Swimlane updated successfully.' => 'Swimlane berhasil diperbaharui.', - 'The default swimlane have been updated successfully.' => 'Standar swimlane berhasil diperbaharui.', + 'Swimlane updated successfully.' => 'Swimlane berhasil diperbarui.', + 'The default swimlane have been updated successfully.' => 'Swimlane default berhasil diperbarui.', 'Unable to remove this swimlane.' => 'Tidak dapat menghapus swimlane ini.', - 'Unable to update this swimlane.' => 'Tidak dapat memperbaharui swimlane ini.', - 'Your swimlane have been created successfully.' => 'Swimlane anda berhasil dibuat.', - 'Example: "Bug, Feature Request, Improvement"' => 'Contoh: « Insiden, Permintaan Fitur, Perbaikan »', - 'Default categories for new projects (Comma-separated)' => 'Standar kategori untuk proyek baru (dipisahkan dengan koma)', + 'Unable to update this swimlane.' => 'Tidak dapat memperbarui swimlane ini.', + 'Your swimlane have been created successfully.' => 'Swimlane Anda berhasil dibuat.', + 'Example: "Bug, Feature Request, Improvement"' => 'Contoh: "Bug, Permintaan Fitur, Peningkatan"', + 'Default categories for new projects (Comma-separated)' => 'Kategori default untuk proyek baru (dipisahkan dengan koma)', 'Integrations' => 'Integrasi', 'Integration with third-party services' => 'Integrasi dengan layanan pihak ketiga', - 'Subtask Id' => 'Id Subtugas', - 'Subtasks' => 'Subtugas', - 'Subtasks Export' => 'Ekspor Subtugas', + 'Subtask Id' => 'ID Sub-tugas', + 'Subtasks' => 'Sub-tugas', + 'Subtasks Export' => 'Ekspor Sub-tugas', 'Task Title' => 'Judul Tugas', - 'Untitled' => 'Tanpa nama', - 'Application default' => 'Aplikasi standar', - 'Language:' => 'Bahasa :', - 'Timezone:' => 'Zona waktu :', + 'Untitled' => 'Tanpa Nama', + 'Application default' => 'Default aplikasi', + 'Language:' => 'Bahasa:', + 'Timezone:' => 'Zona waktu:', 'All columns' => 'Semua kolom', 'Calendar' => 'Kalender', 'Next' => 'Selanjutnya', - '#%d' => 'n˚%d', + '#%d' => '#%d', 'All swimlanes' => 'Semua swimlane', 'All colors' => 'Semua warna', 'Moved to column %s' => 'Pindah ke kolom %s', 'User dashboard' => 'Dasbor pengguna', - 'Allow only one subtask in progress at the same time for a user' => 'Izinkan hanya satu subtugas dalam proses secara bersamaan untuk satu pengguna', - 'Edit column "%s"' => 'Modifikasi kolom « %s »', - 'Select the new status of the subtask: "%s"' => 'Pilih status baru untuk subtugas : « %s »', - 'Subtask timesheet' => 'Subtugas absen', - 'There is nothing to show.' => 'Tidak ada yang dapat diperlihatkan.', - 'Time Tracking' => 'Pelacakan waktu', - 'You already have one subtask in progress' => 'Anda sudah ada satu subtugas dalam proses', - 'Which parts of the project do you want to duplicate?' => 'Bagian dalam proyek mana yang ingin anda duplikasi?', + 'Allow only one subtask in progress at the same time for a user' => 'Izinkan hanya satu sub-tugas dalam proses secara bersamaan untuk satu pengguna', + 'Edit column "%s"' => 'Edit kolom "%s"', + 'Select the new status of the subtask: "%s"' => 'Pilih status baru untuk sub-tugas: "%s"', + 'Subtask timesheet' => 'Absen sub-tugas', + 'There is nothing to show.' => 'Tidak ada yang bisa diperlihatkan.', + 'Time Tracking' => 'Pelacakan Waktu', + 'You already have one subtask in progress' => 'Anda sudah memiliki satu sub-tugas dalam proses', + 'Which parts of the project do you want to duplicate?' => 'Bagian proyek mana yang ingin Anda duplikasi?', 'Disallow login form' => 'Larang formulir masuk', 'Start' => 'Mulai', 'End' => 'Selesai', 'Task age in days' => 'Usia tugas dalam hari', 'Days in this column' => 'Hari dalam kolom ini', - '%dd' => '%dj', + '%dd' => '%dd', 'Add a new link' => 'Tambah tautan baru', - 'Do you really want to remove this link: "%s"?' => 'Apakah anda yakin akan menghapus tautan ini : « %s » ?', - 'Do you really want to remove this link with task #%d?' => 'Apakah anda yakin akan menghapus tautan ini dengan tugas n°%d ?', - 'Field required' => 'Field diperlukan', + 'Do you really want to remove this link: "%s"?' => 'Apakah Anda yakin mau menghapus tautan ini: "%s"?', + 'Do you really want to remove this link with task #%d?' => 'Apakah Anda yakin mau menghapus tautan ini dengan tugas #%d ?', + 'Field required' => 'Bidang dibutuhkan', 'Link added successfully.' => 'Tautan berhasil ditambahkan.', - 'Link updated successfully.' => 'Tautan berhasil diperbaharui.', + 'Link updated successfully.' => 'Tautan berhasil diperbarui.', 'Link removed successfully.' => 'Tautan berhasil dihapus.', 'Link labels' => 'Label tautan', 'Link modification' => 'Modifikasi tautan', 'Links' => 'Tautan', - 'Link settings' => 'Pengaturan tautan', 'Opposite label' => 'Label berlawanan', 'Remove a link' => 'Hapus tautan', - 'Task\'s links' => 'Tautan tugas', 'The labels must be different' => 'Label harus berbeda', 'There is no link.' => 'Tidak ada tautan.', 'This label must be unique' => 'Label ini harus unik', - 'Unable to create your link.' => 'Tidak dapat membuat tautan anda.', - 'Unable to update your link.' => 'Tidak dapat memperbaharui tautan anda.', + 'Unable to create your link.' => 'Tidak dapat membuat tautan Anda.', + 'Unable to update your link.' => 'Tidak dapat memperbarui tautan Anda.', 'Unable to remove this link.' => 'Tidak dapat menghapus tautan ini.', 'relates to' => 'berhubungan dengan', - 'blocks' => 'blok', + 'blocks' => 'blokir', 'is blocked by' => 'diblokir oleh', 'duplicates' => 'duplikat', 'is duplicated by' => 'diduplikasi oleh', 'is a child of' => 'anak dari', - 'is a parent of' => 'orant tua dari', - 'targets milestone' => 'milestone target', - 'is a milestone of' => 'adalah milestone dari', + 'is a parent of' => 'induk dari', + 'targets milestone' => 'target batu pijakan', + 'is a milestone of' => 'adalah batu pijakan dari', 'fixes' => 'perbaikan', 'is fixed by' => 'diperbaiki oleh', 'This task' => 'Tugas ini', '<1h' => '<1h', '%dh' => '%dh', 'Expand tasks' => 'Perluas tugas', - 'Collapse tasks' => 'Lipat tugas', - 'Expand/collapse tasks' => 'Perluas/lipat tugas', + 'Collapse tasks' => 'Tutup tugas', + 'Expand/collapse tasks' => 'Perluas/tutup tugas', 'Close dialog box' => 'Tutup kotak dialog', - 'Submit a form' => 'Submit formulir', - 'Board view' => 'Table halaman', - 'Keyboard shortcuts' => 'pintas keyboard', - 'Open board switcher' => 'Buka table switcher', + 'Submit a form' => 'Kirim formulir', + 'Board view' => 'Tampilan papan', + 'Keyboard shortcuts' => 'Pintasan keyboard', + 'Open board switcher' => 'Buka switcher papan', 'Application' => 'Aplikasi', 'Compact view' => 'Tampilan kompak', - 'Horizontal scrolling' => 'Horisontal bergulir', - 'Compact/wide view' => 'Beralih antara tampilan kompak dan diperluas', - 'No results match:' => 'Tidak ada hasil :', + 'Horizontal scrolling' => 'Gulir horizontal', + 'Compact/wide view' => 'Tampilan kompak/lebar', 'Currency' => 'Mata uang', 'Private project' => 'Proyek pribadi', - 'AUD - Australian Dollar' => 'AUD - Dollar Australia', - 'CAD - Canadian Dollar' => 'CAD - Dollar Kanada', - 'CHF - Swiss Francs' => 'CHF - Swiss Prancis', - 'Custom Stylesheet' => 'Kustomisasi Stylesheet', + 'AUD - Australian Dollar' => 'AUD - Dolar Australia', + 'CAD - Canadian Dollar' => 'CAD - Dolar Kanada', + 'CHF - Swiss Francs' => 'CHF - Francs Swiss', + 'Custom Stylesheet' => 'Kustomisasi CSS', 'download' => 'unduh', 'EUR - Euro' => 'EUR - Euro', - 'GBP - British Pound' => 'GBP - Poundsterling inggris', + 'GBP - British Pound' => 'GBP - Poundsterling Inggris', 'INR - Indian Rupee' => 'INR - Rupe India', 'JPY - Japanese Yen' => 'JPY - Yen Jepang', - 'NZD - New Zealand Dollar' => 'NZD - Dollar Selandia baru', + 'NZD - New Zealand Dollar' => 'NZD - Dolar Selandia baru', 'RSD - Serbian dinar' => 'RSD - Dinar Serbia', - 'USD - US Dollar' => 'USD - Dollar Amerika', + // 'CNY - Chinese Yuan' => '', + 'USD - US Dollar' => 'USD - Dolar Amerika', 'Destination column' => 'Kolom tujuan', - 'Move the task to another column when assigned to a user' => 'Pindahkan tugas ke kolom lain ketika ditugaskan ke pengguna', - 'Move the task to another column when assignee is cleared' => 'Pindahkan tugas ke kolom lain ketika orang yang ditugaskan dibersihkan', + 'Move the task to another column when assigned to a user' => 'Pindahkan tugas ke kolom lain saat ditugaskan ke pengguna', + 'Move the task to another column when assignee is cleared' => 'Pindahkan tugas ke kolom lain saat orang yang ditugaskan kosong', 'Source column' => 'Sumber kolom', 'Transitions' => 'Transisi', 'Executer' => 'Eksekusi', @@ -579,77 +571,76 @@ return array( 'This report contains all column moves for each task with the date, the user and the time spent for each transition.' => 'Laporan ini berisi semua kolom yang pindah untuk setiap tugas dengan tanggal, pengguna dan waktu yang dihabiskan untuk setiap transisi.', 'Currency rates' => 'Nilai tukar mata uang', 'Rate' => 'Tarif', - 'Change reference currency' => 'Mengubah referensi mata uang', - 'Add a new currency rate' => 'Tambahkan nilai tukar mata uang baru', + 'Change reference currency' => 'Ganti referensi mata uang', 'Reference currency' => 'Referensi mata uang', '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', + 'Webhook URL' => 'URL Webhook', '%s removed the assignee of the task %s' => '%s menghapus penugasan dari tugas %s', - 'Enable Gravatar images' => 'Mengaktifkan gambar Gravatar', + 'Enable Gravatar images' => 'Aktifkan gambar Gravatar', 'Information' => 'Informasi', 'Check two factor authentication code' => 'Cek dua faktor kode otentifikasi', - 'The two factor authentication code is not valid.' => 'Kode dua faktor kode otentifikasi tidak valid.', - 'The two factor authentication code is valid.' => 'Kode dua faktor kode otentifikasi valid.', + 'The two factor authentication code is not valid.' => 'Kode dua faktor kode otentifikasi tidak sesuai.', + 'The two factor authentication code is valid.' => 'Kode dua faktor kode otentifikasi sesuai.', 'Code' => 'Kode', 'Two factor authentication' => 'Dua faktor otentifikasi', - 'This QR code contains the key URI: ' => 'kode QR ini mengandung kunci URI : ', - 'Check my code' => 'Memeriksa kode saya', - 'Secret key: ' => 'Kunci rahasia : ', - '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', + 'This QR code contains the key URI: ' => 'Kode QR ini mengandung kunci URI: ', + 'Check my code' => 'Periksa kode saya', + 'Secret key: ' => 'Kunci rahasia: ', + 'Test your device' => 'Uji perangkat Anda', + 'Assign a color when the task is moved to a specific column' => 'Tetapkan warna ketika tugas tersebut dipindahkan ke kolom tertentu', '%s via Kanboard' => '%s via Kanboard', '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', 'Add a screenshot' => 'Tambah screenshot', - 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Mengambil screenshot dan tekan CTRL + V atau ⌘ + V untuk paste di sini.', + 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Ambil screenshot dan tekan CTRL+V atau ⌘+V untuk ditempel di sini.', 'Screenshot uploaded successfully.' => 'Screenshot berhasil diunggah.', 'SEK - Swedish Krona' => 'SEK - Krona Swedia', 'Identifier' => 'Identifier', 'Disable two factor authentication' => 'Matikan dua faktor otentifikasi', - 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Apakah anda yakin akan mematikan dua faktor otentifikasi untuk pengguna ini : « %s » ?', - 'Edit link' => 'Modifikasi tautan', + 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Apakah Anda yakin mau mematikan dua faktor otentifikasi untuk pengguna ini: "%s"?', + 'Edit link' => 'Edit tautan', 'Start to type task title...' => 'Mulai mengetik judul tugas...', - 'A task cannot be linked to itself' => 'Sebuah tugas tidak dapat dikaitkan dengan dirinya sendiri', + 'A task cannot be linked to itself' => 'Tugas tidak dapat dikaitkan dengan dirinya sendiri', 'The exact same link already exists' => 'Tautan yang sama persis sudah ada', - 'Recurrent task is scheduled to be generated' => 'Tugas berulang dijadwalkan akan dihasilkan', + 'Recurrent task is scheduled to be generated' => 'Tugas berulang dijadwalkan untuk di generate', 'Score' => 'Skor', 'The identifier must be unique' => 'Identifier harus unik', - 'This linked task id doesn\'t exists' => 'Id tugas terkait tidak ada', + 'This linked task id doesn\'t exists' => 'ID tugas terkait tidak ada', 'This value must be alphanumeric' => 'Nilai harus alfanumerik', - 'Edit recurrence' => 'Modifikasi pengulangan', - 'Generate recurrent task' => 'Menghasilkan tugas berulang', - 'Trigger to generate recurrent task' => 'Memicu untuk menghasilkan tugas berulang', + 'Edit recurrence' => 'Edit pengulangan', + 'Generate recurrent task' => 'Generate tugas berulang', + 'Trigger to generate recurrent task' => 'Pemicu untuk menghasilkan tugas berulang', 'Factor to calculate new due date' => 'Faktor untuk menghitung tanggal jatuh tempo baru', 'Timeframe to calculate new due date' => 'Jangka waktu untuk menghitung tanggal jatuh tempo baru', 'Base date to calculate new due date' => 'Tanggal dasar untuk menghitung tanggal jatuh tempo baru', 'Action date' => 'Tanggal aksi', 'Base date to calculate new due date: ' => 'Tanggal dasar untuk menghitung tanggal jatuh tempo baru: ', - 'This task has created this child task: ' => 'Tugas ini telah menciptakan tugas anak ini: ', + 'This task has created this child task: ' => 'Tugas ini telah membuat tugas anak ini: ', 'Day(s)' => 'Hari', 'Existing due date' => 'Batas waktu yang ada', 'Factor to calculate new due date: ' => 'Faktor untuk menghitung tanggal jatuh tempo baru: ', 'Month(s)' => 'Bulan', 'Recurrence' => 'Pengulangan', - 'This task has been created by: ' => 'Tugas ini telah dibuat oleh:', - 'Recurrent task has been generated:' => 'Tugas berulang telah dihasilkan:', + 'This task has been created by: ' => 'Tugas ini telah dibuat oleh: ', + 'Recurrent task has been generated:' => 'Tugas berulang telah di generate:', 'Timeframe to calculate new due date: ' => 'Jangka waktu untuk menghitung tanggal jatuh tempo baru: ', 'Trigger to generate recurrent task: ' => 'Pemicu untuk menghasilkan tugas berulang: ', - 'When task is closed' => 'Ketika tugas ditutup', - 'When task is moved from first column' => 'Ketika tugas dipindahkan dari kolom pertama', - 'When task is moved to last column' => 'Ketika tugas dipindahkan ke kolom terakhir', + 'When task is closed' => 'Saat tugas ditutup', + 'When task is moved from first column' => 'Saat tugas dipindahkan dari kolom pertama', + 'When task is moved to last column' => 'Saat tugas dipindahkan ke kolom terakhir', 'Year(s)' => 'Tahun', 'Calendar settings' => 'Pengaturan kalender', 'Project calendar view' => 'Tampilan kalender proyek', 'Project settings' => 'Pengaturan proyek', - 'Show subtasks based on the time tracking' => 'Tampilkan subtugas berdasarkan pelacakan waktu', + 'Show subtasks based on the time tracking' => 'Tampilkan sub-tugas berdasarkan pelacakan waktu', 'Show tasks based on the creation date' => 'Tampilkan tugas berdasarkan tanggal pembuatan', 'Show tasks based on the start date' => 'Tampilkan tugas berdasarkan tanggal mulai', - 'Subtasks time tracking' => 'Pelacakan waktu subtgas', - 'User calendar view' => 'Pengguna tampilan kalender', - 'Automatically update the start date' => 'Memperbarui tanggal mulai otomatis', - 'iCal feed' => 'iCal feed', + 'Subtasks time tracking' => 'Pelacakan waktu sub-tugas', + 'User calendar view' => 'Tampilan kalender pengguna', + 'Automatically update the start date' => 'Otomatis memperbarui tanggal permulaan', + 'iCal feed' => 'Umpan iCal', 'Preferences' => 'Preferensi', 'Security' => 'Keamanan', 'Two factor authentication disabled' => 'Otentifikasi dua faktor dimatikan', @@ -657,40 +648,40 @@ return array( 'Unable to update this user.' => 'Tidak dapat memperbarui pengguna ini.', 'There is no user management for private projects.' => 'Tidak ada manajemen pengguna untuk proyek-proyek pribadi.', 'User that will receive the email' => 'Pengguna yang akan menerima email', - 'Email subject' => 'Subjek Email', + 'Email subject' => 'Subyek Email', 'Date' => 'Tanggal', 'Add a comment log when moving the task between columns' => 'Menambahkan log komentar ketika memindahkan tugas antara kolom', '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', + 'Reopen a task' => 'Buka kembali tugas', '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 first swimlane' => '%s memindahkan tugas #%d ke swimlane pertama', 'Swimlane' => 'Swimlane', 'Gravatar' => 'Gravatar', '%s moved the task %s to the first swimlane' => '%s memindahkan tugas %s ke swimlane pertama', - '%s moved the task %s to the swimlane "%s"' => '%s memindahkan tugas %s ke swimlane « %s »', - 'This report contains all subtasks information for the given date range.' => 'Laporan ini berisi semua informasi subtugas untuk rentang tanggal tertentu.', + '%s moved the task %s to the swimlane "%s"' => '%s memindahkan tugas %s ke swimlane "%s"', + 'This report contains all subtasks information for the given date range.' => 'Laporan ini berisi semua informasi sub-tugas untuk rentang tanggal tertentu.', 'This report contains all tasks information for the given date range.' => 'Laporan ini berisi semua informasi tugas untuk rentang tanggal tertentu.', - 'Project activities for %s' => 'Aktifitas proyek untuk « %s »', + 'Project activities for %s' => 'Aktifitas proyek untuk "%s"', 'view the board on Kanboard' => 'lihat papan di Kanboard', 'The task have been moved to the first swimlane' => 'Tugas telah dipindahkan ke swimlane pertama', 'The task have been moved to another swimlane:' => 'Tugas telah dipindahkan ke swimlane lain:', - 'New title: %s' => 'Judul baru : %s', + 'New title: %s' => 'Judul baru: %s', 'The task is not assigned anymore' => 'Tugas tidak ditugaskan lagi', - 'New assignee: %s' => 'Penerima baru : %s', - 'There is no category now' => 'Tidak ada kategori untuk sekarang', - 'New category: %s' => 'Kategori baru : %s', - 'New color: %s' => 'Warna baru : %s', - 'New complexity: %d' => 'Kompleksitas baru : %d', + 'New assignee: %s' => 'Penerima baru: %s', + 'There is no category now' => 'Tidak ada kategori untuk saat ini', + 'New category: %s' => 'Kategori baru: %s', + 'New color: %s' => 'Warna baru: %s', + 'New complexity: %d' => 'Kompleksitas baru: %d', 'The due date have been removed' => 'Tanggal jatuh tempo telah dihapus', 'There is no description anymore' => 'Tidak ada deskripsi lagi', 'Recurrence settings have been modified' => 'Pengaturan pengulangan telah dimodifikasi', - 'Time spent changed: %sh' => 'Waktu yang dihabiskan berubah : %sh', - 'Time estimated changed: %sh' => 'Perkiraan waktu berubah : %sh', - 'The field "%s" have been updated' => 'Field « %s » telah diperbaharui', + 'Time spent changed: %sh' => 'Waktu yang dihabiskan telah diganti: %sh', + 'Time estimated changed: %sh' => 'Perkiraan waktu telah diganti: %sh', + 'The field "%s" have been updated' => 'Bidang "%s" telah diperbarui', 'The description has been modified:' => 'Deskripsi telah dimodifikasi', - 'Do you really want to close the task "%s" as well as all subtasks?' => 'Apakah anda yakin akan menutup tugas « %s » beserta semua sub-tugasnya ?', - 'I want to receive notifications for:' => 'Saya ingin menerima pemberitahuan untuk :', + 'Do you really want to close the task "%s" as well as all subtasks?' => 'Apakah Anda yakin mau menutup tugas "%s" beserta semua sub-tugasnya?', + 'I want to receive notifications for:' => 'Saya ingin menerima pemberitahuan untuk:', 'All tasks' => 'Semua tugas', 'Only for tasks assigned to me' => 'Hanya untuk tugas yang ditugaskan ke saya', 'Only for tasks created by me' => 'Hanya untuk tugas yang dibuat oleh saya', @@ -702,84 +693,81 @@ return array( '<30m' => '<30m', 'Stop timer' => 'Hentikan timer', 'Start timer' => 'Mulai timer', - 'Add project member' => 'Tambahkan anggota proyek', 'My activity stream' => 'Aliran kegiatan saya', 'My calendar' => 'Kalender saya', 'Search tasks' => 'Cari tugas', - 'Reset filters' => 'Reset ulang filter', + 'Reset filters' => 'Reset saringan', 'My tasks due tomorrow' => 'Tugas saya yang berakhir besok', 'Tasks due today' => 'Tugas yang berakhir hari ini', 'Tasks due tomorrow' => 'Tugas yang berakhir besok', 'Tasks due yesterday' => 'Tugas yang berakhir kemarin', 'Closed tasks' => 'Tugas yang ditutup', - 'Open tasks' => 'Buka Tugas', + 'Open tasks' => 'Tugas terbuka', 'Not assigned' => 'Tidak ditugaskan', 'View advanced search syntax' => 'Lihat sintaks pencarian lanjutan', - 'Overview' => 'Ikhtisar', + 'Overview' => 'Ringkasan', 'Board/Calendar/List view' => 'Tampilan Papan/Kalender/Daftar', 'Switch to the board view' => 'Beralih ke tampilan papan', 'Switch to the calendar view' => 'Beralih ke tampilan kalender', 'Switch to the list view' => 'Beralih ke tampilan daftar', - 'Go to the search/filter box' => 'Pergi ke kotak pencarian/filter', - 'There is no activity yet.' => 'Tidak ada aktifitas saat ini.', + 'Go to the search/filter box' => 'Pergi ke kotak pencarian/saringan', + 'There is no activity yet.' => 'Belum ada aktifitas.', 'No tasks found.' => 'Tidak ada tugas yang ditemukan.', - 'Keyboard shortcut: "%s"' => 'Keyboard shortcut : « %s »', + 'Keyboard shortcut: "%s"' => 'Pintasan keyboard: "%s"', 'List' => 'Daftar', - 'Filter' => 'Filter', + 'Filter' => 'Saringan', 'Advanced search' => 'Pencarian lanjutan', 'Example of query: ' => 'Contoh dari query : ', - 'Search by project: ' => 'Pencarian berdasarkan proyek : ', - 'Search by column: ' => 'Pencarian berdasarkan kolom : ', - 'Search by assignee: ' => 'Pencarian berdasarkan penerima : ', - 'Search by color: ' => 'Pencarian berdasarkan warna : ', - 'Search by category: ' => 'Pencarian berdasarkan kategori : ', - 'Search by description: ' => 'Pencarian berdasarkan deskripsi : ', - 'Search by due date: ' => 'Pencarian berdasarkan tanggal jatuh tempo : ', + 'Search by project: ' => 'Cari berdasarkan proyek: ', + 'Search by column: ' => 'Cari berdasarkan kolom: ', + 'Search by assignee: ' => 'Cari berdasarkan penerima tugas: ', + 'Search by color: ' => 'Cari berdasarkan warna: ', + 'Search by category: ' => 'Cari berdasarkan kategori: ', + 'Search by description: ' => 'Cari berdasarkan deskripsi: ', + 'Search by due date: ' => 'Cari berdasarkan tanggal jatuh tempo: ', '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.', - 'Average Lead and Cycle time' => 'Rata-rata Memimpin dan Siklus waktu', - 'Average lead time: ' => 'Rata-rata waktu pimpinan : ', - 'Average cycle time: ' => 'Rata-rata siklus waktu : ', - 'Cycle Time' => 'Siklus Waktu', + '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 terakhir.', + 'Average Lead and Cycle time' => 'Rata-rata Lead dan Cycle time', + 'Average lead time: ' => 'Rata-rata lead time: ', + 'Average cycle time: ' => 'Rata-rata cycle time: ', + 'Cycle Time' => 'Cycle Time', 'Lead Time' => 'Lead Time', - 'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Grafik ini menunjukkan memimpin rata-rata dan waktu siklus untuk %d tugas terakhir dari waktu ke waktu.', + 'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Grafik ini menunjukkan rata-rata waktu lead dan cycle time untuk %d tugas terakhir dari waktu ke waktu.', 'Average time into each column' => 'Rata-rata waktu ke setiap kolom', - 'Lead and cycle time' => 'Lead dan siklus waktu', - 'Lead time: ' => 'Lead time : ', - 'Cycle time: ' => 'Siklus waktu : ', + 'Lead and cycle time' => 'Lead dan cycle time', + 'Lead time: ' => 'Lead time: ', + 'Cycle time: ' => 'Cycle time: ', 'Time spent into each column' => 'Waktu yang dihabiskan di setiap kolom', 'The lead time is the duration between the task creation and the completion.' => 'Lead time adalah durasi antara pembuatan tugas dan penyelesaian.', - 'The cycle time is the duration between the start date and the completion.' => 'Siklus waktu adalah durasi antara tanggal mulai dan tanggal penyelesaian.', - 'If the task is not closed the current time is used instead of the completion date.' => 'Jika tugas tidak ditutup waktu saat ini yang digunakan sebagai pengganti tanggal penyelesaian.', + 'The cycle time is the duration between the start date and the completion.' => 'Cycle time adalah durasi antara tanggal mulai dan tanggal penyelesaian.', + 'If the task is not closed the current time is used instead of the completion date.' => 'Jika tugas tidak ditutup, waktu saat ini akan digunakan sebagai pengganti tanggal penyelesaian.', 'Set automatically the start date' => 'Secara otomatis mengatur tanggal mulai', - 'Edit Authentication' => 'Modifikasi Otentifikasi', + 'Edit Authentication' => 'Edit Otentifikasi', 'Remote user' => 'Pengguna jauh', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Pengguna jauh tidak menyimpan kata sandi mereka dalam basis data Kanboard, contoh: akun LDAP, Google dan Github.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Jika anda mencentang kotak "Larang formulir login", kredensial masuk ke formulis login akan diabaikan.', - 'New remote user' => 'Pengguna baru jauh', - 'New local user' => 'Pengguna baru lokal', - 'Default task color' => 'Standar warna tugas', - 'This feature does not work with all browsers.' => 'Fitur ini tidak dapat digunakan di semua browsers', - 'There is no destination project available.' => 'Tidak ada destinasi proyek yang tersedia.', - 'Trigger automatically subtask time tracking' => 'Otomatis memicu pelacakan untuk subtugas', - 'Include closed tasks in the cumulative flow diagram' => 'Termasuk tugas yang ditutup pada diagram aliran kumulatif', - 'Current swimlane: %s' => 'Swimlane saat ini : %s', - 'Current column: %s' => 'Kolom saat ini : %s', - 'Current category: %s' => 'Kategori saat ini : %s', + 'Default task color' => 'Warna tugas default', + 'This feature does not work with all browsers.' => 'Fitur ini tidak dapat digunakan di semua peramban', + 'There is no destination project available.' => 'Tidak ada tujuan proyek yang tersedia.', + 'Trigger automatically subtask time tracking' => 'Otomatis memicu pelacakan waktu untuk sub-tugas', + 'Include closed tasks in the cumulative flow diagram' => 'Sertakan tugas yang ditutup dalam diagram alir kumulatif', + 'Current swimlane: %s' => 'Swimlane saat ini: %s', + 'Current column: %s' => 'Kolom saat ini: %s', + 'Current category: %s' => 'Kategori saat ini: %s', 'no category' => 'tidak ada kategori', - 'Current assignee: %s' => 'Saat ini ditugaskan : %s', - 'not assigned' => 'Belum ditugaskan', - 'Author:' => 'Penulis :', + 'Current assignee: %s' => 'Orang yang ditugaskan saat ini: %s', + 'not assigned' => 'belum ditugaskan', + 'Author:' => 'Penulis:', 'contributors' => 'kontributor', - 'License:' => 'Lisensi :', + 'License:' => 'Lisensi:', 'License' => 'Lisensi', 'Enter the text below' => 'Masukkan teks di bawah', 'Sort by position' => 'Urutkan berdasarkan posisi', 'Sort by date' => 'Urutkan berdasarkan tanggal', 'Add task' => 'Tambah tugas', - 'Start date:' => 'Tanggal mulai :', - 'Due date:' => 'Batas waktu :', + 'Start date:' => 'Tanggal mulai:', + 'Due date:' => 'Batas waktu:', 'There is no start date or due date for this task.' => 'Tidak ada tanggal mulai dan batas waktu untuk tugas ini.', 'Moving or resizing a task will change the start and due date of the task.' => 'Memindahkan atau mengubah ukuran tugas anda akan mengubah tanggal mulai dan batas waktu dari tugas ini.', 'There is no task in your project.' => 'Tidak ada tugas didalam proyek anda.', @@ -791,7 +779,7 @@ return array( 'Hide this column' => 'Sembunyikan kolom ini', 'open file' => 'buka berkas', 'End date' => 'Waktu berakhir', - 'Users overview' => 'Ikhtisar pengguna', + 'Users overview' => 'Ringkasan pengguna', 'Members' => 'Anggota', 'Shared project' => 'Proyek bersama', 'Project managers' => 'Manajer proyek', @@ -799,15 +787,15 @@ return array( 'Projects list' => 'Daftar proyek', 'Gantt chart for this project' => 'Grafik Gantt untuk proyek ini', 'Project board' => 'Papan proyek', - 'End date:' => 'Waktu berakhir :', + 'End date:' => 'Waktu berakhir:', 'There is no start date or end date for this project.' => 'Tidak ada waktu mulai atau waktu berakhir untuk proyek ini', - 'Projects Gantt chart' => 'Proyek grafik Gantt', - 'Change task color when using a specific task link' => 'Rubah warna tugas ketika menggunakan tautan tugas yang spesifik', + 'Projects Gantt chart' => 'Grafik Gantt proyek', + 'Change task color when using a specific task link' => 'Ganti warna tugas ketika menggunakan tautan tugas yang spesifik', 'Task link creation or modification' => 'Tautan pembuatan atau modifikasi tugas ', 'Milestone' => 'Milestone', - 'Documentation: %s' => 'Dokumentasi : %s', + 'Documentation: %s' => 'Dokumentasi: %s', 'Switch to the Gantt chart view' => 'Beralih ke tampilan grafik Gantt', - 'Reset the search/filter box' => 'Atur ulang pencarian/kotak filter', + 'Reset the search/filter box' => 'Reset kotak pencarian/saringan', 'Documentation' => 'Dokumentasi', 'Table of contents' => 'Daftar isi', 'Gantt' => 'Gantt', @@ -816,44 +804,43 @@ return array( 'Plugins' => 'Plugin', 'There is no plugin loaded.' => 'Tidak ada plugin yang dimuat', 'My notifications' => 'Notifikasi saya', - 'Custom filters' => 'Filter kustom', - 'Your custom filter have been created successfully.' => 'Filter kustom anda telah berhasil dibuat', - 'Unable to create your custom filter.' => 'Tidak dapat membuat filter kustom', - 'Custom filter removed successfully.' => 'Filter kustom berhail dihapus', - 'Unable to remove this custom filter.' => 'Tidak dapat menghapus filter kustom', - 'Edit custom filter' => 'Modifikasi filter kustom', - 'Your custom filter have been updated successfully.' => 'Filter kustom anda telah berhasil diperbaharui', - 'Unable to update custom filter.' => 'Tidak dapat memperbaharui filter kustom', + 'Custom filters' => 'Saringan kustom', + 'Your custom filter have been created successfully.' => 'Saringan kustom Anda berhasil dibuat', + 'Unable to create your custom filter.' => 'Tidak dapat membuat saringan kustom', + 'Custom filter removed successfully.' => 'Saringan kustom berhasil dihapus', + 'Unable to remove this custom filter.' => 'Tidak dapat menghapus saringan kustom', + 'Edit custom filter' => 'Edit saringan kustom', + 'Your custom filter have been updated successfully.' => 'Saringan kustom Anda berhasil diperbarui', + 'Unable to update custom filter.' => 'Tidak dapat memperbarui saringan kustom', 'Web' => 'Web', 'New attachment on task #%d: %s' => 'Lampiran baru pada tugas #%d: %s', 'New comment on task #%d' => 'Komentar baru pada tugas #%d', - 'Comment updated on task #%d' => 'Komentar diperbaharui pada tugas #%d', - 'New subtask on task #%d' => 'Subtask baru pada tugas #%d', - 'Subtask updated on task #%d' => 'Subtask diperbaharui pada tugas #%d', + 'Comment updated on task #%d' => 'Komentar diperbarui pada tugas #%d', + 'New subtask on task #%d' => 'Sub-tugas baru pada tugas #%d', + 'Subtask updated on task #%d' => 'Sub-tugas diperbarui pada tugas #%d', 'New task #%d: %s' => 'Tugas baru #%d: %s', - 'Task updated #%d' => 'Tugas diperbaharui #%d', + 'Task updated #%d' => 'Tugas diperbarui #%d', 'Task #%d closed' => 'Tugas #%d ditutup', 'Task #%d opened' => 'Tugas #%d dibuka', - 'Column changed for task #%d' => 'Kolom berubah untuk tugas #%d', + 'Column changed for task #%d' => 'Kolom diganti untuk tugas #%d', 'New position for task #%d' => 'Posisi baru untuk tugas #%d', - 'Swimlane changed for task #%d' => 'Swimlane berubah untuk tugas #%d', - 'Assignee changed on task #%d' => 'Orang yang ditugaskan berubah pada tugas #%d', - '%d overdue tasks' => '%d tugas terlambat', - 'Task #%d is overdue' => 'Tugas #%d terlambat', + 'Swimlane changed for task #%d' => 'Swimlane diganti untuk tugas #%d', + 'Assignee changed on task #%d' => 'Orang yang ditugaskan diganti pada tugas #%d', + '%d overdue tasks' => '%d tugas kadaluarsa', + 'Task #%d is overdue' => 'Tugas #%d sudah kadaluarsa', 'No new notifications.' => 'Tidak ada notifikasi baru', 'Mark all as read' => 'Tandai semua sebagai sudah dibaca', 'Mark as read' => 'Tandai sebagai sudah dibaca', - 'Total number of tasks in this column across all swimlanes' => 'Total jumlah tugas di kolom ini di semua swimlanes', - 'Collapse swimlane' => 'Lipat swimlane', + 'Total number of tasks in this column across all swimlanes' => 'Total tugas di kolom ini untuk semua swimlane', + 'Collapse swimlane' => 'Tutup swimlane', 'Expand swimlane' => 'Perluas swimlane', - 'Add a new filter' => 'Tambah filter baru', - 'Share with all project members' => 'Bagikan dengan semua member proyek', + 'Add a new filter' => 'Tambah saringan baru', + 'Share with all project members' => 'Bagikan dengan semua anggota proyek', 'Shared' => 'Dibagikan', 'Owner' => 'Pemilik', 'Unread notifications' => 'Notifikasi belum terbaca', 'Notification methods:' => 'Metode pemberitahuan', - 'Import tasks from CSV file' => 'Impor tugas dari berkas CSV', - 'Unable to read your file' => 'Tidak dapat membaca berkas anda', + 'Unable to read your file' => 'Tidak dapat membaca berkas Anda', '%d task(s) have been imported successfully.' => '%d tugas telah berhasil di impor', 'Nothing have been imported!' => 'Tidak ada yang dapat di impor', 'Import users from CSV file' => 'Impor pengguna dari berkas CSV', @@ -865,14 +852,14 @@ return array( 'Double Quote' => 'Kutip Ganda', 'Single Quote' => 'Kutip Satu', '%s attached a file to the task #%d' => '%s berkas dilampirkan untuk tugas #%d', - 'There is no column or swimlane activated in your project!' => 'Tidak ada kolom atau swimlane aktif untuk proyek anda', - 'Append filter (instead of replacement)' => 'Tambahkan filter (bukan pengganti)', + 'There is no column or swimlane activated in your project!' => 'Tidak ada kolom atau swimlane aktif untuk proyek Anda', + 'Append filter (instead of replacement)' => 'Tambahkan saringan (ketimbang pengganti)', 'Append/Replace' => 'Tambah/Ganti', 'Append' => 'Tambahkan', 'Replace' => 'Ganti', 'Import' => 'Impor', - 'change sorting' => 'rubah sortir', - 'Tasks Importation' => 'Tugas Impor', + 'change sorting' => 'ubah pengurutan', + 'Tasks Importation' => 'Importasi Tugas', 'Delimiter' => 'Pembatas', 'Enclosure' => 'Lampiran', 'CSV File' => 'Berkas CSV', @@ -880,33 +867,33 @@ return array( 'Your file must use the predefined CSV format' => 'Berkas Anda harus menggunakan format CSV yang telah ditetapkan', 'Your file must be encoded in UTF-8' => 'Berkas anda harus di kodekan dalam bentuk UTF-8', 'The first row must be the header' => 'Baris pertama harus header', - 'Duplicates are not verified for you' => 'Duplikasi tidak diverifikasi untuk anda', + 'Duplicates are not verified for you' => 'Duplikasi tidak diverifikasikan untuk Anda', 'The due date must use the ISO format: YYYY-MM-DD' => 'Tanggal jatuh tempo harus menggunakan format ISO: YYYY-MM-DD', 'Download CSV template' => 'Unduh template CSV', - 'No external integration registered.' => 'Tidak ada integrasi eksternal terdaftar', + 'No external integration registered.' => 'Tidak ada integrasi eksternal yang terdaftar', 'Duplicates are not imported' => 'Duplikasi tidak diimpor', - 'Usernames must be lowercase and unique' => 'Username harus huruf kecil dan unik', + 'Usernames must be lowercase and unique' => 'Nama pengguna harus huruf kecil dan unik', 'Passwords will be encrypted if present' => 'Kata sandi akan di enkripsi jika ada', - '%s attached a new file to the task %s' => '%s berkas baru dilampirkan untuk tugas %s', + '%s attached a new file to the task %s' => '%s melampirkan berkas baru untuk tugas %s', 'Link type' => 'Tipe tautan', - 'Assign automatically a category based on a link' => 'Menetapkan otomatis kategori berdasarkan tautan', + 'Assign automatically a category based on a link' => 'Otomatis menetapkan kategori berdasarkan tautan', 'BAM - Konvertible Mark' => 'BAM - Konvertible Mark', - 'Assignee Username' => 'Username yang ditugaskan', - 'Assignee Name' => 'Nama yang ditugaskan', + 'Assignee Username' => 'Nama pengguna orang yang ditugaskan', + 'Assignee Name' => 'Nama orang yang ditugaskan', 'Groups' => 'Grup', 'Members of %s' => 'Anggota dari %s', 'New group' => 'Grup baru', 'Group created successfully.' => 'Grup berhasil dibuat', - 'Unable to create your group.' => 'Tidak dapat membuat grup anda', - 'Edit group' => 'Rubah grup', - 'Group updated successfully.' => 'Grup berhasil diperbaharui', - 'Unable to update your group.' => 'Tidak dapat memperbaharui grup anda', + 'Unable to create your group.' => 'Tidak dapat membuat grup Anda', + 'Edit group' => 'Edit grup', + 'Group updated successfully.' => 'Grup berhasil diperbarui', + 'Unable to update your group.' => 'Tidak dapat memperbarui grup anda', 'Add group member to "%s"' => 'Tambahkan anggota grup ke "%s"', 'Group member added successfully.' => 'Anggota grup berhasil ditambahkan', 'Unable to add group member.' => 'Tidak dapat menambahkan anggota grup', - 'Remove user from group "%s"' => 'hapus pengguna dari grup "%s"', + 'Remove user from group "%s"' => 'Hapus pengguna dari grup "%s"', 'User removed successfully from this group.' => 'Pengguna berhasil dihapus dari grup ini', - 'Unable to remove this user from the group.' => 'Tidak dapat menghapus pengguna dari grup', + 'Unable to remove this user from the group.' => 'Tidak dapat menghapus pengguna ini dari grup', 'Remove group' => 'Hapus grup', 'Group removed successfully.' => 'Grup berhasil dihapus', 'Unable to remove this group.' => 'Tidak dapat menghapus grup ini', @@ -916,75 +903,74 @@ return array( 'Project Member' => 'Anggota Proyek', 'Project Viewer' => 'Penonton Proyek', 'Your account is locked for %d minutes' => 'Akun anda dikunci untuk %d menit', - 'Invalid captcha' => 'Captcha tidak valid', + 'Invalid captcha' => 'Captcha tidak sesuai', 'The name must be unique' => 'Nama harus unik', 'View all groups' => 'Lihat semua grup', 'There is no user available.' => 'Tidak ada pengguna yang tersedia', - 'Do you really want to remove the user "%s" from the group "%s"?' => 'Anda yakin akan menghapus pengguna "%s" dari grup "%s"?', + 'Do you really want to remove the user "%s" from the group "%s"?' => 'Anda yakin mau menghapus pengguna "%s" dari grup "%s"?', 'There is no group.' => 'Tidak ada grup', - 'External Id' => 'Id Eksternal', + 'External Id' => 'ID Eksternal', 'Add group member' => 'Tambah anggota grup', - 'Do you really want to remove this group: "%s"?' => 'Anda yakin akan menghapus grup ini: "%s"?', + 'Do you really want to remove this group: "%s"?' => 'Anda yakin mau menghapus grup ini: "%s"?', 'There is no user in this group.' => 'Tidak ada pengguna dalam grup ini', 'Remove this user' => 'Hapus pengguna ini', 'Permissions' => 'Izin', - 'Allowed Users' => 'Pengguna Yang Diperbolehkan', + 'Allowed Users' => 'Pengguna Yang Diizinkan', 'No user have been allowed specifically.' => 'Tidak ada user yang diperbolehkan secara khusus', 'Role' => 'Peran', 'Enter user name...' => 'Masukkan nama pengguna...', - 'Allowed Groups' => 'Grup Yang Diperbolehkan', + 'Allowed Groups' => 'Grup Yang Diizinkan', 'No group have been allowed specifically.' => 'Tidak ada grup yang diperbolehkan secara khusus', 'Group' => 'Grup', 'Group Name' => 'Nama Grup', 'Enter group name...' => 'Masukkan nama grup...', 'Role:' => 'Peran:', 'Project members' => 'Anggota proyek', - '%s mentioned you in the task #%d' => '%s menyebut anda dalam tugas #%d', - '%s mentioned you in a comment on the task #%d' => '%s menyebut anda dalam komentar pada tugas #%d', + '%s mentioned you in the task #%d' => '%s menyebut Anda dalam tugas #%d', + '%s mentioned you in a comment on the task #%d' => '%s menyebut Anda dalam komentar pada tugas #%d', 'You were mentioned in the task #%d' => 'Anda disebutkan dalam tugas #%d', 'You were mentioned in a comment on the task #%d' => 'Anda disebutkan dalam komentar pada tugas #%d', - 'Estimated hours: ' => 'Estimasi jam:', - 'Actual hours: ' => 'Aktual jam', + 'Estimated hours: ' => 'Estimasi jam: ', + 'Actual hours: ' => 'Jam sebenarnya: ', 'Hours Spent' => 'Jam dihabiskan', 'Hours Estimated' => 'Jam diperkirakan', 'Estimated Time' => 'Waktu Estimasi', - 'Actual Time' => 'Waktu Aktual', - 'Estimated vs actual time' => 'Estimasi vs waktu aktual', - 'RUB - Russian Ruble' => 'RUB - Rusia rubel', - 'Assign the task to the person who does the action when the column is changed' => 'Menetapkan tugas kepada orang yang melakukan tindakan ketika kolom berubah', + 'Actual Time' => 'Waktu Sebenarnya', + 'Estimated vs actual time' => 'Estimasi vs waktu sebenarnya', + 'RUB - Russian Ruble' => 'RUB - Rubel Rusia', + 'Assign the task to the person who does the action when the column is changed' => 'Berikan tugas pada orang yang melakukan tindakan saat kolom diganti', 'Close a task in a specific column' => 'Tutup tugas di kolom tertentu', - 'Time-based One-time Password Algorithm' => 'Waktu berbasis Satu-waktu Algoritma Kata sandi', - 'Two-Factor Provider: ' => 'Provider Dua-Faktor', + 'Time-based One-time Password Algorithm' => 'Algoritma Password Satu-Kali Berbasis-Waktu', + 'Two-Factor Provider: ' => 'Penyedia Dua-Faktor', 'Disable two-factor authentication' => 'Nonaktifkan otentikasi dua-faktor', 'Enable two-factor authentication' => 'Aktifkan otentikasi dua-faktor', - 'There is no integration registered at the moment.' => 'Tidak ada integrasi yang diregristasi untuk saat ini', - 'Password Reset for Kanboard' => 'Setel ulang Kata sandi untuk Kanboard', - 'Forgot password?' => 'Lupa kata sandi', - 'Enable "Forget Password"' => 'Aktifkan "Lupa Kata Sandi"', - 'Password Reset' => 'Setel ulang Kata sandi', - 'New password' => 'Kata sandi baru', - 'Change Password' => 'Rubah kata sandi', - 'To reset your password click on this link:' => 'Untuk menyetel ulang kata sandi anda klik tautan ini:', - 'Last Password Reset' => 'Terakhir Setel Ulang Kata Sandi', - 'The password has never been reinitialized.' => 'Kata sandi tidak pernah di reinisialisasi', - 'Creation' => 'Kreasi', - 'Expiration' => 'Waktu berakhir', - 'Password reset history' => 'Sejarah setel ulang kata sandi', + 'There is no integration registered at the moment.' => 'Tidak ada integrasi yang didaftarkan untuk saat ini', + 'Password Reset for Kanboard' => 'Reset Password untuk Kanboard', + 'Forgot password?' => 'Lupa password?', + 'Enable "Forget Password"' => 'Aktifkan "Lupa Password"', + 'Password Reset' => 'Reset Password', + 'New password' => 'Password baru', + 'Change Password' => 'Ganti Password', + 'To reset your password click on this link:' => 'Untuk reset password Anda klik tautan ini:', + 'Last Password Reset' => 'Reset Password Terakhir', + 'The password has never been reinitialized.' => 'Password tidak pernah di inisialisasi ulang', + 'Creation' => 'Pembuatan', + 'Expiration' => 'Kadaluarsa', + 'Password reset history' => 'Sejarah reset password', 'All tasks of the column "%s" and the swimlane "%s" have been closed successfully.' => 'Semua tugas dalam kolom "%s" dan swimlane "%s" telah berhasil ditutup', - 'Do you really want to close all tasks of this column?' => 'Apakah anda yakin akan menutup semua tugas dalam kolom ini?', + 'Do you really want to close all tasks of this column?' => 'Apakah Anda yakin mau menutup semua tugas dalam kolom ini?', '%d task(s) in the column "%s" and the swimlane "%s" will be closed.' => '%d tugas dalam kolom "%s" dan swimlane "%s" akan ditutup.', 'Close all tasks of this column' => 'Tutup semua tugas dalam kolom ini', - 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => 'Tidak ada Plugin yang mendaftar metode pemberitahuan proyek. Anda masih dapat mengkonfigurasi pemberitahuan individu dalam profil pengguna Anda.', + 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => 'Tidak ada plugin yang mendaftarkan metode pemberitahuan proyek. Anda masih bisa mengatur pemberitahuan individu di dalam profil pengguna Anda.', 'My dashboard' => 'Dasbor saya', 'My profile' => 'Profil saya', 'Project owner: ' => 'Pemilik proyek', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'Identifier proyek adalah opsional dan harus alfanumerik, contoh: MYPROJECT.', 'Project owner' => 'Pemilik proyek', - 'Those dates are useful for the project Gantt chart.' => 'Tanggal tersebut berguna untuk proyek Gantt chart', 'Private projects do not have users and groups management.' => 'Proyek pribadi tidak memiliki manajemen pengguna dan grup', 'There is no project member.' => 'Tidak ada anggota proyek', 'Priority' => 'Prioritas', - 'Task priority' => 'Tugas prioritas', + 'Task priority' => 'Prioritas tugas', 'General' => 'Umum', 'Dates' => 'Tanggal', 'Default priority' => 'Prioritas default', @@ -995,8 +981,8 @@ return array( 'Duration in days' => 'Durasi dalam hari', 'Send email when there is no activity on a task' => 'Kirim email jika tidak ada aktifitas dalam tugas', 'Unable to fetch link information.' => 'Tidak dapat mengambil informasi tautan', - 'Daily background job for tasks' => 'Pekerjaan Latar belakang untuk tugas-tugas ', - 'Auto' => 'Auto', + 'Daily background job for tasks' => 'Tugas latar belakang harian untuk tugas', + 'Auto' => 'Otomatis', 'Related' => 'Terkait', 'Attachment' => 'Lampiran', 'Title not found' => 'Judul tidak ditemukan', @@ -1014,7 +1000,7 @@ return array( 'Internal links' => 'Tautan internal', 'Assign to me' => 'Tugaskan ke saya', 'Me' => 'Saya', - 'Do not duplicate anything' => 'Jangan menduplikasi apa-apa', + 'Do not duplicate anything' => 'Jangan menduplikasi apapun', 'Projects management' => 'Manajemen proyek', 'Users management' => 'Manajemen pengguna', 'Groups management' => 'Manajemen grup', @@ -1023,268 +1009,302 @@ return array( 'closed' => 'tutup', 'Priority:' => 'Prioritas', 'Reference:' => 'Referensi', - 'Complexity:' => 'Komplesitas', + 'Complexity:' => 'Kompleksitas', 'Swimlane:' => 'Swimlane', - 'Column:' => 'Kolom', - 'Position:' => 'Posisi', - 'Creator:' => 'Pembuat', + 'Column:' => 'Kolom:', + 'Position:' => 'Posisi:', + 'Creator:' => 'Pembuat:', 'Time estimated:' => 'Estimasi waktu:', '%s hours' => '%s jam', - 'Time spent:' => 'Waktu dihabiskan', - 'Created:' => 'Dibuat', - 'Modified:' => 'Dimodifikasi', - 'Completed:' => 'Selesai', - 'Started:' => 'Dimulai', - 'Moved:' => 'Dipindahkan', + 'Time spent:' => 'Waktu yang dihabiskan', + 'Created:' => 'Dibuat:', + 'Modified:' => 'Dimodifikasi:', + 'Completed:' => 'Selesai:', + 'Started:' => 'Dimulai:', + 'Moved:' => 'Dipindahkan:', 'Task #%d' => 'Tugas #%d', - 'Date and time format' => 'Format tanggal dan waktu', 'Time format' => 'Format waktu', - 'Start date: ' => 'Tanggal mulai', - 'End date: ' => 'Tanggal berakhir', - 'New due date: ' => 'Tanggal jatuh tempo baru', - 'Start date changed: ' => 'Tanggal mulai berubah', - 'Disable private projects' => 'Nonaktifkan proyek', - 'Do you really want to remove this custom filter: "%s"?' => 'Apakah anda yakin akan menghapus kustom filter: "%s"?', - 'Remove a custom filter' => 'Hapus kustom filter', - 'User activated successfully.' => 'Pengguna berhasil diaktivasi.', + 'Start date: ' => 'Tanggal mulai: ', + 'End date: ' => 'Tanggal berakhir: ', + 'New due date: ' => 'Tanggal jatuh tempo baru: ', + 'Start date changed: ' => 'Tanggal mulai diganti: ', + 'Disable private projects' => 'Nonaktifkan proyek pribadi', + 'Do you really want to remove this custom filter: "%s"?' => 'Apakah Anda yakin mau menghapus saringan kustom: "%s"?', + 'Remove a custom filter' => 'Hapus saringan kustom', + 'User activated successfully.' => 'Pengguna berhasil diaktifkan.', 'Unable to enable this user.' => 'Tidak dapat mengaktifkan pengguna ini.', 'User disabled successfully.' => 'Pengguna berhasil dinonaktifkan.', 'Unable to disable this user.' => 'Tidak dapat menonaktifkan pengguna ini.', - 'All files have been uploaded successfully.' => 'Semua file telah berhasil di unggah.', - 'View uploaded files' => 'Lihat file yang diunggah', - 'The maximum allowed file size is %sB.' => 'Maksimum ukuran file yang diiziinkan adalah %sB.', - 'Choose files again' => 'Pilih file kembali', - 'Drag and drop your files here' => 'Drag and drop file anda di sini', - 'choose files' => 'pilih file', + 'All files have been uploaded successfully.' => 'Semua berkas berhasil di unggah.', + 'The maximum allowed file size is %sB.' => 'Maksimum ukuran berkas yang diiziinkan adalah %sB.', + 'Drag and drop your files here' => 'Drag and drop file Anda di sini', + 'choose files' => 'pilih berkas', 'View profile' => 'Lihat profil', 'Two Factor' => 'Dua Faktor', 'Disable user' => 'Nonaktifkan pengguna', - // 'Do you really want to disable this user: "%s"?' => '', - // 'Enable user' => '', - // 'Do you really want to enable this user: "%s"?' => '', - // 'Download' => '', - // 'Uploaded: %s' => '', - // 'Size: %s' => '', - // 'Uploaded by %s' => '', - // 'Filename' => '', - // 'Size' => '', - // 'Column created successfully.' => '', - // 'Another column with the same name exists in the project' => '', - // 'Default filters' => '', - // 'Your board doesn\'t have any columns!' => '', - // 'Change column position' => '', - // 'Switch to the project overview' => '', - // 'User filters' => '', - // 'Category filters' => '', - // 'Upload a file' => '', - // 'View file' => '', - // 'Last activity' => '', - // 'Change subtask position' => '', - // 'This value must be greater than %d' => '', - // 'Another swimlane with the same name exists in the project' => '', - // 'Example: http://example.kanboard.net/ (used to generate absolute URLs)' => '', - // 'Actions duplicated successfully.' => '', - // 'Unable to duplicate actions.' => '', - // 'Add a new action' => '', - // 'Import from another project' => '', - // 'There is no action at the moment.' => '', - // 'Import actions from another project' => '', - // 'There is no available project.' => '', - // 'Local File' => '', - // 'Configuration' => '', - // 'PHP version:' => '', - // 'PHP SAPI:' => '', - // 'OS version:' => '', - // 'Database version:' => '', - // 'Browser:' => '', - // 'Task view' => '', - // 'Edit task' => '', - // 'Edit description' => '', - // 'New internal link' => '', - // 'Display list of keyboard shortcuts' => '', - // 'Menu' => '', - // 'Set start date' => '', - // 'Avatar' => '', - // 'Upload my avatar image' => '', - // 'Remove my image' => '', - // 'The OAuth2 state parameter is invalid' => '', - // 'User not found.' => '', - // 'Search in activity stream' => '', - // 'My activities' => '', - // 'Activity until yesterday' => '', - // 'Activity until today' => '', - // 'Search by creator: ' => '', - // 'Search by creation date: ' => '', - // 'Search by task status: ' => '', - // 'Search by task title: ' => '', - // 'Activity stream search' => '', - // 'Projects where "%s" is manager' => '', - // 'Projects where "%s" is member' => '', - // 'Open tasks assigned to "%s"' => '', - // 'Closed tasks assigned to "%s"' => '', - // 'Assign automatically a color based on a priority' => '', - // 'Overdue tasks for the project(s) "%s"' => '', - // 'Upload files' => '', - // 'Installed Plugins' => '', - // 'Plugin Directory' => '', - // 'Plugin installed successfully.' => '', - // 'Plugin updated successfully.' => '', - // 'Plugin removed successfully.' => '', - // 'Subtask converted to task successfully.' => '', - // 'Unable to convert the subtask.' => '', - // 'Unable to extract plugin archive.' => '', - // 'Plugin not found.' => '', - // 'You don\'t have the permission to remove this plugin.' => '', - // 'Unable to download plugin archive.' => '', - // 'Unable to write temporary file for plugin.' => '', - // 'Unable to open plugin archive.' => '', - // 'There is no file in the plugin archive.' => '', - // 'Create tasks in bulk' => '', - // 'Your Kanboard instance is not configured to install plugins from the user interface.' => '', - // 'There is no plugin available.' => '', - // 'Install' => '', - // 'Update' => '', - // 'Up to date' => '', - // 'Not available' => '', - // 'Remove plugin' => '', - // 'Do you really want to remove this plugin: "%s"?' => '', - // 'Uninstall' => '', - // 'Listing' => '', - // 'Metadata' => '', - // 'Manage projects' => '', - // 'Convert to task' => '', - // 'Convert sub-task to task' => '', - // 'Do you really want to convert this sub-task to a task?' => '', - // 'My task title' => '', - // 'Enter one task by line.' => '', - // 'Number of failed login:' => '', - // 'Account locked until:' => '', - // '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' => '', - // 'Assign a color when the task is moved to a specific swimlane' => '', - // 'Assign a priority when the task is moved to a specific swimlane' => '', - // 'User unlocked successfully.' => '', - // 'Unable to unlock the user.' => '', - // 'Move a task to another swimlane' => '', - // 'Creator Name' => '', - // 'Time spent and estimated' => '', - // 'Move position' => '', - // 'Move task to another position on the board' => '', - // 'Insert before this task' => '', - // 'Insert after this task' => '', - // 'Unlock this user' => '', - // 'Custom Project Roles' => '', - // 'Add a new custom role' => '', - // 'Restrictions for the role "%s"' => '', - // 'Add a new project restriction' => '', - // 'Add a new drag and drop restriction' => '', - // 'Add a new column restriction' => '', - // 'Edit this role' => '', - // 'Remove this role' => '', - // 'There is no restriction for this role.' => '', - // 'Only moving task between those columns is permitted' => '', - // 'Close a task in a specific column when not moved during a given period' => '', - // 'Edit columns' => '', - // 'The column restriction has been created successfully.' => '', - // 'Unable to create this column restriction.' => '', - // 'Column restriction removed successfully.' => '', - // 'Unable to remove this restriction.' => '', - // 'Your custom project role has been created successfully.' => '', - // 'Unable to create custom project role.' => '', - // 'Your custom project role has been updated successfully.' => '', - // 'Unable to update custom project role.' => '', - // 'Custom project role removed successfully.' => '', - // 'Unable to remove this project role.' => '', - // 'The project restriction has been created successfully.' => '', - // 'Unable to create this project restriction.' => '', - // 'Project restriction removed successfully.' => '', - // 'You cannot create tasks in this column.' => '', - // 'Task creation is permitted for this column' => '', - // 'Closing or opening a task is permitted for this column' => '', - // 'Task creation is blocked for this column' => '', - // 'Closing or opening a task is blocked for this column' => '', - // 'Task creation is not permitted' => '', - // 'Closing or opening a task is not permitted' => '', - // 'New drag and drop restriction for the role "%s"' => '', - // 'People belonging to this role will be able to move tasks only between the source and the destination column.' => '', - // 'Remove a column restriction' => '', - // 'Do you really want to remove this column restriction: "%s" to "%s"?' => '', - // 'New column restriction for the role "%s"' => '', - // 'Rule' => '', - // 'Do you really want to remove this column restriction?' => '', - // 'Custom roles' => '', - // 'New custom project role' => '', - // 'Edit custom project role' => '', - // 'Remove a custom role' => '', - // 'Do you really want to remove this custom role: "%s"? All people assigned to this role will become project member.' => '', - // 'There is no custom role for this project.' => '', - // 'New project restriction for the role "%s"' => '', - // 'Restriction' => '', - // 'Remove a project restriction' => '', - // 'Do you really want to remove this project restriction: "%s"?' => '', - // 'Duplicate to multiple projects' => '', - // 'This field is required' => '', - // 'Moving a task is not permitted' => '', - // 'This value must be in the range %d to %d' => '', - // 'You are not allowed to move this task.' => '', - // 'API User Access' => '', - // 'Preview' => '', - // 'Write' => '', - // 'Write your text in Markdown' => '', - // 'New External Task: %s' => '', - // 'No personal API access token registered.' => '', - // 'Your personal API access token is "%s"' => '', - // 'Remove your token' => '', - // 'Generate a new token' => '', + 'Do you really want to disable this user: "%s"?' => 'Anda yakin mau menonaktifkan pengguna ini: "%s"?', + 'Enable user' => 'Aktifkan pengguna', + 'Do you really want to enable this user: "%s"?' => 'Anda yakin mau mengaktifkan pengguna ini: "%s"?', + 'Download' => 'Unduh', + 'Uploaded: %s' => 'Diunggah: %s', + 'Size: %s' => 'Ukuran: %s', + 'Uploaded by %s' => 'Diunggah oleh %s', + 'Filename' => 'Nama berkas', + 'Size' => 'Ukuran', + 'Column created successfully.' => 'Kolom berhasil dibuat.', + 'Another column with the same name exists in the project' => 'Ada kolom lain dengan nama yang sama di proyek ini', + 'Default filters' => 'Saringan default', + 'Your board doesn\'t have any columns!' => 'Papan Anda tidak memiliki kolom!', + 'Change column position' => 'Ganti posisi kolom', + 'Switch to the project overview' => 'Pindah ke ringkasan proyek', + 'User filters' => 'Saringan pengguna', + 'Category filters' => 'Saringan kategori', + 'Upload a file' => 'Unggah berkas', + 'View file' => 'Lihat berkas', + 'Last activity' => 'Aktivitas terakhir', + 'Change subtask position' => 'Ganti posisi sub-tugas', + 'This value must be greater than %d' => 'Nilai ini harus lebih besar dari %d', + 'Another swimlane with the same name exists in the project' => 'Swimlane lain dengan nama yang sama sudah ada di proyek ini', + 'Example: http://example.kanboard.net/ (used to generate absolute URLs)' => 'Contoh: http://contoh.kanboard.net/ (digunakan untuk menghasilkan URL yang absolut', + 'Actions duplicated successfully.' => 'Tindakan berhasil di duplikasi.', + 'Unable to duplicate actions.' => 'Tidak bisa menduplikasi tindakan.', + 'Add a new action' => 'Tambahkan tindakan baru', + 'Import from another project' => 'Impor dari proyek lain', + 'There is no action at the moment.' => 'Belum ada tindakan pada saat ini.', + 'Import actions from another project' => 'Impor tindakan dari proyek lain', + 'There is no available project.' => 'Tidak ada proyek yang tersedia', + 'Local File' => 'Berkas Lokal', + 'Configuration' => 'Konfigurasi', + 'PHP version:' => 'Versi PHP:', + 'PHP SAPI:' => 'PHP SAPI:', + 'OS version:' => 'Versi sistem operasi:', + 'Database version:' => 'Versi database:', + 'Browser:' => 'Peramban:', + 'Task view' => 'Tampilan Tugas', + 'Edit task' => 'Edit tugas', + 'Edit description' => 'Edit deskripsi', + 'New internal link' => 'Tautan internal baru', + 'Display list of keyboard shortcuts' => 'Tampilkan daftar pintasan keyboard', + 'Menu' => 'Menu', + 'Set start date' => 'Atur tanggal mulai', + 'Avatar' => 'Avatar', + 'Upload my avatar image' => 'Unggah foto avatar saya', + 'Remove my image' => 'Hapus foto saya', + 'The OAuth2 state parameter is invalid' => 'Status parameter OAuth2 tidak sesuai', + 'User not found.' => 'Pengguna tidak ditemukan.', + 'Search in activity stream' => 'Cari di saluran aktivitas', + 'My activities' => 'Aktivitas saya', + 'Activity until yesterday' => 'Aktivitas sampai kemarin', + 'Activity until today' => 'Aktivitas sampai hari ini', + 'Search by creator: ' => 'Cari berdasarkan pembuat: ', + 'Search by creation date: ' => 'Cari berdasarkan tanggal pembuatan: ', + 'Search by task status: ' => 'Cari berdasarkanstatus tugas: ', + 'Search by task title: ' => 'Cari berdasarkan judul tugas: ', + 'Activity stream search' => 'Pencarian saluran aktivitas', + 'Projects where "%s" is manager' => 'Proyek dimana "%s" adalah manajernya', + 'Projects where "%s" is member' => 'Proyek dimana "%s" adalah anggotanya', + 'Open tasks assigned to "%s"' => 'Tugas terbuka ditugaskan pada "%s"', + 'Closed tasks assigned to "%s"' => 'Tugas tertutup ditugaskan pada "%s"', + 'Assign automatically a color based on a priority' => 'Berikan warna otomatis berdasarkan prioritas', + 'Overdue tasks for the project(s) "%s"' => 'Tugas yang kadaluarsa untuk proyek "%s"', + 'Upload files' => 'Unggah berkas', + 'Installed Plugins' => 'Plugin terpasang', + 'Plugin Directory' => 'Direktori Plugin', + 'Plugin installed successfully.' => 'Plugin berhasil dipasang.', + 'Plugin updated successfully.' => 'Plugin berhasil diperbarui.', + 'Plugin removed successfully.' => 'Plugin berhasil dihapus.', + 'Subtask converted to task successfully.' => 'Sub-tugas berhasil diubah menjadi tugas.', + 'Unable to convert the subtask.' => 'Tidak dapat mengubah sub-tugas.', + 'Unable to extract plugin archive.' => 'Tidak bisa mengekstrak arsip plugin.', + 'Plugin not found.' => 'Plugin tidak ditemukan.', + 'You don\'t have the permission to remove this plugin.' => 'Anda tidak memiliki izin untuk menghapus plugin ini.', + 'Unable to download plugin archive.' => 'Tidak dapat mengunduh arsip plugin.', + 'Unable to write temporary file for plugin.' => 'Tidak dapat menulis berkas sementara untuk plugin.', + 'Unable to open plugin archive.' => 'Tidak dapat membuka arsip plugin.', + 'There is no file in the plugin archive.' => 'Tidak ada berkas di dalam arsip plugin.', + 'Create tasks in bulk' => 'Buat tugas sekaligus', + 'Your Kanboard instance is not configured to install plugins from the user interface.' => 'Instalasi Kanboard Anda tidak diatur untuk memasang plugin dari antar muka pengguna.', + 'There is no plugin available.' => 'Tidak ada plugin yang tersedia.', + 'Install' => 'Pasang', + 'Update' => 'Perbarui', + 'Up to date' => 'Terbaru', + 'Not available' => 'Tidak tersedia', + 'Remove plugin' => 'Hapus plugin', + 'Do you really want to remove this plugin: "%s"?' => 'Anda yakin ingin menghapus plugin ini: "%s"?', + 'Uninstall' => 'Lepaskan', + 'Listing' => 'Daftar', + 'Metadata' => 'Metadata', + 'Manage projects' => 'Atur proyek', + 'Convert to task' => 'Ubah menjadi tugas', + 'Convert sub-task to task' => 'Ubah sub-tugas menjadi tugas', + 'Do you really want to convert this sub-task to a task?' => 'Anda yakin ingin mengubah sub-tugas ini menjadi tugas?', + 'My task title' => 'Judul tugas saya', + 'Enter one task by line.' => 'Masukkan satu tugas berdasarkan baris.', + 'Number of failed login:' => 'Jumlah login yang gagal:', + 'Account locked until:' => 'Akun terkunci hingga:', + 'Email settings' => 'Pengaturan email', + 'Email sender address' => 'Alamat pengirim email', + 'Email transport' => 'Transportasi email', + 'Webhook token' => 'Token Webhook', + 'Project tags management' => 'Manajemen tag proyek', + 'Tag created successfully.' => 'Tag berhasil dibuat.', + 'Unable to create this tag.' => 'Tidak dapat membuat tag ini.', + 'Tag updated successfully.' => 'Tag berhasil diperbarui', + 'Unable to update this tag.' => 'Tidak dapat memperbarui tag ini.', + 'Tag removed successfully.' => 'Tag berhasil dihapus.', + 'Unable to remove this tag.' => 'Tidak dapat menghapus tag ini.', + 'Global tags management' => 'Manajemen tag global', + 'Tags' => 'Tag', + 'Tags management' => 'Manajemen tag', + 'Add new tag' => 'Tambah tag baru', + 'Edit a tag' => 'Edit tag', + 'Project tags' => 'Tag proyek', + 'There is no specific tag for this project at the moment.' => 'Saat ini tidak ada tag yang spesifik pada proyek ini.', + 'Tag' => 'Tag', + 'Remove a tag' => 'Hapus tag', + 'Do you really want to remove this tag: "%s"?' => 'Anda yakin ingin menghapus tag ini: "%s"?', + 'Global tags' => 'Tag global', + 'There is no global tag at the moment.' => 'Saat ini tidak ada tag global.', + 'This field cannot be empty' => 'Bidang ini tidak boleh kosong', + 'Close a task when there is no activity in an specific column' => 'Tutup tugas saat tidak ada aktivitas di kolom tertentu', + '%s removed a subtask for the task #%d' => '%s menghapus sub-tugas untuk tugas #%d', + '%s removed a comment on the task #%d' => '%s menghapus komentar pada tugas #%d', + 'Comment removed on task #%d' => 'Komentar dihapus pada tugas #%d', + 'Subtask removed on task #%d' => 'Sub-tugas dihapus pada tugas #%d', + 'Hide tasks in this column in the dashboard' => 'Sembunyikan tugas-tugas di kolom ini di dasbor', + '%s removed a comment on the task %s' => '%s menghapus komentar pada tugas %s', + '%s removed a subtask for the task %s' => '%s menghapus sub-tugas untuk tugas %s', + 'Comment removed' => 'Komentar dihapus', + 'Subtask removed' => 'Sub-tugas dihapus', + '%s set a new internal link for the task #%d' => '%s memasang tautan internal baru untuk tugas #%d', + '%s removed an internal link for the task #%d' => '%s menghapus tautan internal untuk tugas #%d', + 'A new internal link for the task #%d have been defined' => 'Tautan internal baru untuk tugas #%d telah ditentukan', + 'Internal link removed for the task #%d' => 'Tautan internal untuk tugas #%d telah dihapus', + '%s set a new internal link for the task %s' => '%s memasang tautan internal baru untuk tugas %s', + '%s removed an internal link for the task %s' => '%s menghapus tautan internal untuk tugas %s', + 'Automatically set the due date on task creation' => 'Otomatis memasang tanggal kadaluarsa saat pembuatan tugas', + 'Move the task to another column when closed' => 'Pindahkan tugas ke kolom lain saat ditutup', + 'Move the task to another column when not moved during a given period' => 'Pindahkan tugas ke kolom lain saat tidak dipindahkan selama periode yang diberikan', + 'Dashboard for %s' => 'Dasbor untuk %s', + 'Tasks overview for %s' => 'Ringkasan tugas-tugas untuk %s', + 'Subtasks overview for %s' => 'Ringkasan sub-tugas untuk %s', + 'Projects overview for %s' => 'Ringkasan proyek untuk %s', + 'Activity stream for %s' => 'Arus aktivitas untuk %s', + 'Calendar for %s' => 'Kalender untuk %s', + 'Notifications for %s' => 'Notifikasi untuk %s', + 'Assign a color when the task is moved to a specific swimlane' => 'Berikan warna saat tugas dipindahkan ke swimlane tertentu', + 'Assign a priority when the task is moved to a specific swimlane' => 'Berikan prioritas saat tugas dipindahkan ke swimlane tertentu', + 'User unlocked successfully.' => 'Berhasil membuka blokir pengguna.', + 'Unable to unlock the user.' => 'Tidak bisa membuka blokir pengguna.', + 'Move a task to another swimlane' => 'Pindahkan tugas ke swimlane lain', + 'Creator Name' => 'Nama Pembuat', + 'Time spent and estimated' => 'Waktu yang dihabiskan dan diperkirakan', + 'Move position' => 'Pindahkan posisi', + 'Move task to another position on the board' => 'Pindahkan tugas ke posisi lain di dalam papan', + 'Insert before this task' => 'Masukkan sebelum tugas ini', + 'Insert after this task' => 'Masukkan setelah tugas ini', + 'Unlock this user' => 'Buka pengguna ini', + 'Custom Project Roles' => 'Peran Proyek Kustom', + 'Add a new custom role' => 'Tambahkan peran kustom baru', + 'Restrictions for the role "%s"' => 'Batasan untuk peran "%s"', + 'Add a new project restriction' => 'Tambahkan batasan proyek baru', + 'Add a new drag and drop restriction' => 'Tambahkan batasan drag and drop baru', + 'Add a new column restriction' => 'Tambahkan batasan kolom baru', + 'Edit this role' => 'Edit peran ini', + 'Remove this role' => 'Hapus peran ini', + 'There is no restriction for this role.' => 'Tidak ada batasan untuk peran ini.', + 'Only moving task between those columns is permitted' => 'Hanya diizinkan untuk memindahkan tugas diantara kolom-kolom tersebut', + 'Close a task in a specific column when not moved during a given period' => 'Tutup tugas pada kolom tertentu saat tidak dipindahkan pada periode yang diberikan', + 'Edit columns' => 'Edit kolom', + 'The column restriction has been created successfully.' => 'Batasan kolom berhasil dibuat.', + 'Unable to create this column restriction.' => 'Tidak dapat membuat batasan kolom ini.', + 'Column restriction removed successfully.' => 'Batasan kolom berhasil dihapus.', + 'Unable to remove this restriction.' => 'Gagal menghapus batasan ini.', + 'Your custom project role has been created successfully.' => 'Peran kustom proyek Anda berhasil dibuat.', + 'Unable to create custom project role.' => 'Tidak dapat membuat peran proyek kustom.', + 'Your custom project role has been updated successfully.' => 'Peran proyek kustom Anda berhasil diperbarui.', + 'Unable to update custom project role.' => 'Tidak dapat memperbarui peran kustom proyek', + 'Custom project role removed successfully.' => 'Peran kustom proyek berhasil dihapus.', + 'Unable to remove this project role.' => 'Tidak dapat menghapus peran proyek ini.', + 'The project restriction has been created successfully.' => 'Batasan proyek ini berhasil dibuat.', + 'Unable to create this project restriction.' => 'Tidak dapat membuat batasan proyek ini.', + 'Project restriction removed successfully.' => 'Batasan proyek berhasil dihapus.', + 'You cannot create tasks in this column.' => 'Anda tidak dapat membuat tugas di kolom ini.', + 'Task creation is permitted for this column' => 'Pembuatan tugas diizinkan untuk kolom ini', + 'Closing or opening a task is permitted for this column' => 'Penutupan atau pembukaan tugas diizinkan untuk kolom ini', + 'Task creation is blocked for this column' => 'Pembuatan tugas diblokir dari kolom ini', + 'Closing or opening a task is blocked for this column' => 'Penutupan atau pembukaan tugas diblokir di kolom ini', + 'Task creation is not permitted' => 'Oembuatan tugas tidak diizinkan', + 'Closing or opening a task is not permitted' => 'Penutupan atau pembukaan tugas tidak diizinkan', + 'New drag and drop restriction for the role "%s"' => 'Larangan drag and drop baru untuk peran "%s"', + 'People belonging to this role will be able to move tasks only between the source and the destination column.' => 'Orang-orang dengan peran ini dapat memindahkan tugas diantara kolom sumber dan destinasi.', + 'Remove a column restriction' => 'Hapus pembatasan kolom', + 'Do you really want to remove this column restriction: "%s" to "%s"?' => 'Anda yakin ingin menghapus pembatasan kolom ini: "%s" ke "%s"?', + 'New column restriction for the role "%s"' => 'Kolom pembatasan baru untuk peran "%s"', + 'Rule' => 'Aturan', + 'Do you really want to remove this column restriction?' => 'Anda yakin ingin menghapus pembatasan kolom ini?', + 'Custom roles' => 'Peran kustom', + 'New custom project role' => 'Peran kustom proyek baru', + 'Edit custom project role' => 'Edit peran kustom proyek', + 'Remove a custom role' => 'Hapus peran kustom', + 'Do you really want to remove this custom role: "%s"? All people assigned to this role will become project member.' => 'Anda yakin ingin menghapus peran kustom ini: "%s"? Semua orang yang memiliki peran ini akan berubah menjadi anggota proyek.', + 'There is no custom role for this project.' => 'Tidak ada peran kustom untuk proyek ini.', + 'New project restriction for the role "%s"' => 'Batasan proyek baru untuk peran "%s"', + 'Restriction' => 'Pembatasan', + 'Remove a project restriction' => 'Hapus batasan proyek', + 'Do you really want to remove this project restriction: "%s"?' => 'Anda yakin ingin menghapus pembatasan proyek ini: "%s"?', + 'Duplicate to multiple projects' => 'Duplikasikan ke banyak proyek', + 'This field is required' => 'Bidang ini dibutuhkan', + 'Moving a task is not permitted' => 'Memindahkan tugas tidak diizinkan', + 'This value must be in the range %d to %d' => 'Nilai ini harus berkisar antara %d hingga %d', + 'You are not allowed to move this task.' => 'Anda tidak diizinkan untuk memindahkan tugas ini.', + 'API User Access' => 'API Akses Pengguna', + 'Preview' => 'Pratinjau', + 'Write' => 'Tulis', + 'Write your text in Markdown' => 'Tuliskan teks Anda di Markdown', + 'New External Task: %s' => 'Tugas Eksternal Baru: %s', + 'No personal API access token registered.' => 'Tidak ada token akses API personal yang terdaftar.', + 'Your personal API access token is "%s"' => 'Token akses API personal Anda adalah "%s"', + 'Remove your token' => 'Hapus token Anda', + 'Generate a new token' => 'Generate token baru', + 'Showing %d-%d of %d' => 'Menampilkan %d-%d of %d', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/it_IT/translations.php b/app/Locale/it_IT/translations.php index 65defe86..f7c6c5ee 100644 --- a/app/Locale/it_IT/translations.php +++ b/app/Locale/it_IT/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d task sulla bacheca', '%d tasks in total' => '%d task in totale', 'Unable to update this board.' => 'Impossibile aggiornare questa bacheca.', - 'Edit board' => 'Modifica questa bacheca', 'Disable' => 'Disattiva', 'Enable' => 'Attiva', 'New project' => 'Nuovo progetto', @@ -72,7 +71,6 @@ return array( 'Title' => 'Titolo', 'Assigned to %s' => 'Assegnato a %s', 'Remove a column' => 'Cancella questa colonna', - 'Remove a column from a board' => 'Cancella una colonna da una bacheca', 'Unable to remove this column.' => 'Impossibile cancellare questa colonna.', 'Do you really want to remove this column: "%s"?' => 'Desideri davvero cancellare questa colonna: "%s" ?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Questa azione cancellerà TUTTI I TASK legati a questa colonna!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Numero di task', 'User' => 'Utente', 'Comments' => 'Commenti', - 'Leave a comment' => 'Lascia un commento', 'Comment is required' => 'Si richiede un commento', - 'Leave a description' => 'Lascia una descrizione', 'Comment added successfully.' => 'Commenti aggiunti con successo.', 'Unable to create your comment.' => 'Impossibile creare questo commento.', 'Due Date' => 'Data di scadenza', @@ -224,7 +220,6 @@ return array( 'Search' => 'Cerca', 'Nothing found.' => 'Non si è trovato nulla.', 'Due date' => 'Data di scadenza', - 'Others formats accepted: %s and %s' => 'Altri formati accettati: %s e %s', 'Description' => 'Descrizione', '%d comments' => '%d commenti', '%d comment' => '%d commento', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Creato da %s', 'Tasks Export' => 'Export dei task', 'Start Date' => 'Data di inizio', - 'End Date' => 'Data di fine', 'Execute' => 'Esegui', 'Task Id' => 'Id del task', 'Creator' => 'Creatore', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Remoto', 'Enabled' => 'Abilitato', 'Disabled' => 'Disabilitato', - 'Username:' => 'Nome utente:', - 'Name:' => 'Nome:', + 'Login:' => 'Nome utente:', + 'Full Name:' => 'Nome:', // 'Email:' => '', 'Notifications:' => 'Notifiche:', 'Notifications' => 'Notifiche', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Etichette delle relazioni', 'Link modification' => 'Modifica relazione', 'Links' => 'Relazioni', - 'Link settings' => 'Impostazioni relazioni', 'Opposite label' => 'Etichetta contraria', 'Remove a link' => 'Rimuovi una relazione', - 'Task\'s links' => 'Relazioni del task', 'The labels must be different' => 'Le etichette devono essere diverse', 'There is no link.' => 'Nessuna relazione presente.', 'This label must be unique' => 'Questa etichetta deve essere univoca', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Vista compatta', 'Horizontal scrolling' => 'Scrolling orizzontale', 'Compact/wide view' => 'Vista compatta/estesa', - 'No results match:' => 'Nessun risultato trovato:', 'Currency' => 'Valuta', 'Private project' => 'Progetto privato', 'AUD - Australian Dollar' => 'AUD - Dollari Australiani', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Yen Giapponesi', 'NZD - New Zealand Dollar' => 'NZD - Dollari della Nuova Zelanda', 'RSD - Serbian dinar' => 'RSD - Dinar Serbi', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - Dollari Americani', 'Destination column' => 'Colonna destinazione', 'Move the task to another column when assigned to a user' => 'Sposta il task in un\'altra colonna quando viene assegnato ad un utente', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Tassi di cambio', 'Rate' => 'Cambio', 'Change reference currency' => 'Cambia la valuta di riferimento', - 'Add a new currency rate' => 'Aggiungi un nuovo tasso di cambio', 'Reference currency' => 'Valuta di riferimento', '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.', @@ -702,7 +693,6 @@ return array( // '<30m' => '', 'Stop timer' => 'Ferma il timer', 'Start timer' => 'Avvia il timer', - 'Add project member' => 'Aggiungi un membro di progetto', 'My activity stream' => 'Il mio flusso attività', 'My calendar' => 'Il mio calendario', 'Search tasks' => 'Ricerca task', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Utente remoto', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'La password degli utenti remoti (ad esempio: LDAP, account Google e Github) non è salvata nel database di Kanboard', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Se imposti l\'opzione "Disabilita il form di login", le credenzali inserite nella saranno ignorate.', - 'New remote user' => 'Nuovo utente remoto', - 'New local user' => 'Nuovo utente locale', 'Default task color' => 'Colore predefinito dei task', 'This feature does not work with all browsers.' => 'Questa feature non funziona con tutti i browser.', 'There is no destination project available.' => 'Non ci sono progetti disponbili come destinazione.', @@ -852,7 +840,6 @@ return array( 'Owner' => 'Proprietario', 'Unread notifications' => 'Notifiche non lette', 'Notification methods:' => 'Metodi di notifica', - 'Import tasks from CSV file' => 'Importa task da file CSV', 'Unable to read your file' => 'Impossibile leggere il file', '%d task(s) have been imported successfully.' => '%d task sono stati importati con successo.', 'Nothing have been imported!' => 'Non è stato importato nulla!', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'Proprietario del progetto: ', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'L\'identificativo del progetto è opzionale e deve essere alfanumerico, ad esempio: MIOPROGETTO.', 'Project owner' => 'Proprietario del progetto', - 'Those dates are useful for the project Gantt chart.' => 'Le seguenti date sono utilizzate per i grafici Gantt di progetto.', 'Private projects do not have users and groups management.' => 'Per i progetti privati non è prevista la gestione di utenti e gruppi.', 'There is no project member.' => 'Non è impostato un membro del progetto.', 'Priority' => 'Priorità', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'Iniziato:', 'Moved:' => 'Spostato:', // 'Task #%d' => '', - 'Date and time format' => 'Formato data e ora', 'Time format' => 'Formato ora', 'Start date: ' => 'Data di inizio: ', 'End date: ' => 'Data di fine: ', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Utente disabilitato con successo.', 'Unable to disable this user.' => 'Impossibile disabilitare questo utente.', 'All files have been uploaded successfully.' => 'Tutti i file sono stati caricati con successo.', - 'View uploaded files' => 'Visualizza i file caricati', 'The maximum allowed file size is %sB.' => 'La dimensione massima consentita del file è %sB.', - 'Choose files again' => 'Seleziona nuovamente i file', 'Drag and drop your files here' => 'Trascina i tuoi file qui', 'choose files' => 'seleziona i file', 'View profile' => 'Guarda il profilo', @@ -1163,7 +1146,6 @@ return array( 'Email sender address' => 'Indirizzo Email mittente', 'Email transport' => 'Trasporto Email', 'Webhook token' => 'Token Webhook', - 'Imports' => 'Importa', 'Project tags management' => 'Gestione tag di progetto', 'Tag created successfully.' => 'Tag creato con successo.', 'Unable to create this tag.' => 'Impossibile creare questo tag.', @@ -1210,8 +1192,6 @@ return array( 'Activity stream for %s' => 'Flusso attività per %s', 'Calendar for %s' => 'Calendario per %s', 'Notifications for %s' => 'Notifiche per %s', - 'Subtasks export' => 'Esporta subtasks', - 'Tasks exportation' => 'Esportazione tasks', 'Assign a color when the task is moved to a specific swimlane' => 'Assegna un colore quando il task viene spostato su una specifica swimlane', 'Assign a priority when the task is moved to a specific swimlane' => 'Assegna una priorità quando il task viene spostato su una specifica swimlane', 'User unlocked successfully.' => 'Utente sbloccato con successo.', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php index d0487fb7..e747c320 100644 --- a/app/Locale/ja_JP/translations.php +++ b/app/Locale/ja_JP/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d 個のタスク', '%d tasks in total' => '合計 %d 個のタスク', 'Unable to update this board.' => 'ボードを更新できませんでした', - 'Edit board' => 'ボードを変更する', 'Disable' => '無効にする', 'Enable' => '有効にする', 'New project' => 'プロジェクトを作る', @@ -72,7 +71,6 @@ return array( 'Title' => 'タイトル', 'Assigned to %s' => '%sが担当', 'Remove a column' => 'カラムの削除', - 'Remove a column from a board' => 'ボードからカラムの削除', 'Unable to remove this column.' => 'カラムを削除できませんでした。', 'Do you really want to remove this column: "%s"?' => 'カラム「%s」を削除しますか?', 'This action will REMOVE ALL TASKS associated to this column!' => 'この操作はこのカラムに割当てられた『全てのタスクを削除』します!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'タスク数', 'User' => 'ユーザ', 'Comments' => 'コメント', - 'Leave a comment' => 'コメントを書く', 'Comment is required' => 'コメントを入力してください', - 'Leave a description' => '説明を書く', 'Comment added successfully.' => 'コメントを追加しました。', 'Unable to create your comment.' => 'コメントの追加に失敗しました。', 'Due Date' => '期限', @@ -224,7 +220,6 @@ return array( 'Search' => '検索', 'Nothing found.' => '結果なし。', 'Due date' => '期限', - 'Others formats accepted: %s and %s' => '他の書式: %s または %s', 'Description' => '説明', '%d comments' => '%d 個のコメント', '%d comment' => '%d 個のコメント', @@ -298,7 +293,6 @@ return array( 'Created by %s' => '%s が作成', 'Tasks Export' => 'タスクの出力', 'Start Date' => '開始日', - 'End Date' => '終了日', 'Execute' => '実行', 'Task Id' => 'タスク ID', 'Creator' => '作成者', @@ -342,8 +336,8 @@ return array( 'Remote' => 'リモート', 'Enabled' => '有効', 'Disabled' => '無効', - 'Username:' => 'ユーザ名:', - 'Name:' => '名前:', + 'Login:' => 'ユーザ名:', + 'Full Name:' => '名前:', 'Email:' => 'Email:', 'Notifications:' => '通知:', 'Notifications' => '通知', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'リンクラベル', 'Link modification' => 'リンクの変更', 'Links' => 'リンク', - 'Link settings' => 'リンク設定', 'Opposite label' => '反対のラベル', 'Remove a link' => 'ラベルの削除', - 'Task\'s links' => 'タスクのラベル', 'The labels must be different' => '異なるラベルを指定してください', 'There is no link.' => 'リンクがありません', 'This label must be unique' => 'ラベルはユニークである必要があります', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'コンパクトビュー', 'Horizontal scrolling' => '縦スクロール', 'Compact/wide view' => 'コンパクト/ワイドビュー', - 'No results match:' => '結果が一致しませんでした', 'Currency' => '通貨', 'Private project' => 'プライベートプロジェクト', 'AUD - Australian Dollar' => 'AUD - 豪ドル', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - 日本円', 'NZD - New Zealand Dollar' => 'NZD - NZ ドル', 'RSD - Serbian dinar' => 'RSD - セルビアデナール', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - 米ドル', 'Destination column' => '移動先のカラム', 'Move the task to another column when assigned to a user' => 'ユーザの割り当てをしたらタスクを他のカラムに移動', @@ -580,7 +572,6 @@ return array( 'Currency rates' => '為替レート', 'Rate' => 'レート', 'Change reference currency' => '現在の基軸通貨', - 'Add a new currency rate' => '新しい通貨レートを追加', 'Reference currency' => '基軸通貨', // 'The currency rate have been added successfully.' => '', 'Unable to add this currency rate.' => 'この通貨レートを追加できません。', @@ -702,7 +693,6 @@ return array( // '<30m' => '', // 'Stop timer' => '', // 'Start timer' => '', - // 'Add project member' => '', // 'My activity stream' => '', // 'My calendar' => '', // 'Search tasks' => '', @@ -757,8 +747,6 @@ return array( // 'Remote user' => '', // 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '', // 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '', - // 'New remote user' => '', - // 'New local user' => '', // 'Default task color' => '', // 'This feature does not work with all browsers.' => '', // 'There is no destination project available.' => '', @@ -852,7 +840,6 @@ return array( // 'Owner' => '', // 'Unread notifications' => '', // 'Notification methods:' => '', - // 'Import tasks from CSV file' => '', // 'Unable to read your file' => '', // '%d task(s) have been imported successfully.' => '', // 'Nothing have been imported!' => '', @@ -980,7 +967,6 @@ return array( // 'Project owner: ' => '', // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', // 'Project owner' => '', - // 'Those dates are useful for the project Gantt chart.' => '', // 'Private projects do not have users and groups management.' => '', // 'There is no project member.' => '', // 'Priority' => '', @@ -1037,7 +1023,6 @@ return array( // 'Started:' => '', // 'Moved:' => '', // 'Task #%d' => '', - // 'Date and time format' => '', // 'Time format' => '', // 'Start date: ' => '', // 'End date: ' => '', @@ -1051,9 +1036,7 @@ return array( // 'User disabled successfully.' => '', // 'Unable to disable this user.' => '', // 'All files have been uploaded successfully.' => '', - // 'View uploaded files' => '', // 'The maximum allowed file size is %sB.' => '', - // 'Choose files again' => '', // 'Drag and drop your files here' => '', // 'choose files' => '', // 'View profile' => '', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/ko_KR/translations.php b/app/Locale/ko_KR/translations.php index a613b467..e1825ad7 100644 --- a/app/Locale/ko_KR/translations.php +++ b/app/Locale/ko_KR/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d개의 할일', '%d tasks in total' => '총 %d개의 할일', 'Unable to update this board.' => '보드를 갱신할 수 없었습니다', - 'Edit board' => '보드를 변경하는 ', 'Disable' => '비활성화', 'Enable' => '유효하게 한다', 'New project' => '새 프로젝트', @@ -72,7 +71,6 @@ return array( 'Title' => '제목', 'Assigned to %s' => '담당자 %s', 'Remove a column' => '컬럼 삭제', - 'Remove a column from a board' => '보드에서 컬럼 삭제', 'Unable to remove this column.' => '(※)컬럼을 삭제할 수 없었습니다.', 'Do you really want to remove this column: "%s"?' => '컬럼을 삭제하시겠습니까: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => '이 조작은 이 컬럼에 할당된 『 모든 할일을 삭제 』합니다!', @@ -160,9 +158,7 @@ return array( 'Task count' => '할일 수', 'User' => '사용자', 'Comments' => '댓글', - 'Leave a comment' => '댓글 남기기', 'Comment is required' => '댓글을 입력하세요', - 'Leave a description' => '설명을 입력하세요', 'Comment added successfully.' => '의견을 추가했습니다.', 'Unable to create your comment.' => '댓글의 추가에 실패했습니다.', 'Due Date' => '마감일', @@ -224,7 +220,6 @@ return array( 'Search' => '검색', 'Nothing found.' => '결과가 없습니다', 'Due date' => '마감일', - 'Others formats accepted: %s and %s' => ' 다른 서식: %s 또는 %s', 'Description' => '설명', '%d comments' => '%d개의 댓글', '%d comment' => '%d개의 댓글', @@ -298,7 +293,6 @@ return array( 'Created by %s' => '작성자 %s', 'Tasks Export' => '할일 내보내기', 'Start Date' => '시작일', - 'End Date' => '종료일', 'Execute' => '실행', 'Task Id' => '할일 ID', 'Creator' => '작성자', @@ -342,8 +336,8 @@ return array( 'Remote' => '원격', 'Enabled' => '활성화', 'Disabled' => '비활성화', - 'Username:' => '사용자명', - 'Name:' => '이름:', + 'Login:' => '사용자명', + 'Full Name:' => '이름:', 'Email:' => '이메일:', 'Notifications:' => '알림:', 'Notifications' => '알림', @@ -516,10 +510,8 @@ return array( 'Link labels' => '링크 라벨', 'Link modification' => '링크의 변경', 'Links' => '링크', - 'Link settings' => '링크 설정', 'Opposite label' => '반대의 라벨', 'Remove a link' => '라벨의 삭제', - 'Task\'s links' => '할일의 라벨', 'The labels must be different' => ' 다른 라벨을 지정하세요', 'There is no link.' => '링크가 없습니다', 'This label must be unique' => '라벨은 독특할 필요가 있습니다', @@ -552,7 +544,6 @@ return array( 'Compact view' => '컴팩트 뷰', 'Horizontal scrolling' => '세로 스크롤', 'Compact/wide view' => '컴팩트/와이드 뷰', - 'No results match:' => '결과가 일치하지 않았습니다', 'Currency' => '통화', 'Private project' => '개인 프로젝트', 'AUD - Australian Dollar' => 'AUD - 호주 달러', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - 일본 엔', 'NZD - New Zealand Dollar' => 'NZD - 뉴질랜드 달러', 'RSD - Serbian dinar' => 'RSD - 세르비아 디나르', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - 미국 달러', 'Destination column' => '이동 후 컬럼', 'Move the task to another column when assigned to a user' => '사용자의 할당을 하면 할일을 다른 컬럼에 이동', @@ -580,7 +572,6 @@ return array( 'Currency rates' => '환율', 'Rate' => '레이트', 'Change reference currency' => '현재의 기축 통화', - 'Add a new currency rate' => ' 새로운 통화 환율을 추가', 'Reference currency' => '기축 통화', 'The currency rate have been added successfully.' => '통화가 성공적으로 추가되었습니다', 'Unable to add this currency rate.' => '이 통화 환율을 추가할 수 없습니다.', @@ -702,7 +693,6 @@ return array( '<30m' => '<30분', 'Stop timer' => '타이머 정지', 'Start timer' => '타이머 시작', - 'Add project member' => '프로젝트 맴버 추가', 'My activity stream' => '내 활동기록', 'My calendar' => '내 캘린더', 'Search tasks' => '할일 찾기', @@ -757,8 +747,6 @@ return array( 'Remote user' => '원격 담당자', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '예를 들어 LDAP, Google, Github 계정같은 원격 담당자의 비밀번호는 칸반보드 데이터베이스에 저장하지 않습니다', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '만약 "로그인 폼 거절"에 체크한다면, 로그인 폼에 접근할 자격이 무시됩니다', - 'New remote user' => '새로운 원격유저', - 'New local user' => '새로운 유저', 'Default task color' => '기본 할일 색', 'This feature does not work with all browsers.' => '이 기능은 일부 브라우저에서 작동하지 않습니다', 'There is no destination project available.' => '가능한 목적 프로젝트가 없습니다', @@ -852,7 +840,6 @@ return array( 'Owner' => '소유자', 'Unread notifications' => '읽지않은 알림', 'Notification methods:' => '알림 방법', - 'Import tasks from CSV file' => 'CSV 파일에서 할일 가져오기', 'Unable to read your file' => '파일을 읽을 수 없습니다', '%d task(s) have been imported successfully.' => '%d 할일이 성공적으로 추가되었습니다', 'Nothing have been imported!' => '추가가 되지 않았습니다!', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => '프로젝트 소유자:', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '프로젝트 구분자는 선택사항이며, 숫자와 문자만 가능합니다. 예: MYPROJECT.', 'Project owner' => '프로젝트 소유자', - 'Those dates are useful for the project Gantt chart.' => '이 날짜는 프로젝트 간트 차트에 사용됩니다', 'Private projects do not have users and groups management.' => '비밀 프로젝트는 사용자나 관리 그룹이 소유하지 않습니다', 'There is no project member.' => '프로젝트 맴버가 없습니다', 'Priority' => '우선순위', @@ -1037,7 +1023,6 @@ return array( 'Started:' => '시작:', 'Moved:' => '이동:', 'Task #%d' => '할일 #%d', - 'Date and time format' => '날짜와 시간 형식', 'Time format' => '시간 형식', 'Start date: ' => '시작일: ', 'End date: ' => '종료일: ', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => '사용자가 성공적으로 비활성화되었습니다', 'Unable to disable this user.' => '이 사용자를 비활성화할 수 없습니다.', 'All files have been uploaded successfully.' => '모든 파일이 성공적으로 업로드되었습니다', - 'View uploaded files' => '업로드 파일 보기', 'The maximum allowed file size is %sB.' => '업로드 파일의 최대 크기는 %sB 입니다', - 'Choose files again' => '파일 다시 선택', 'Drag and drop your files here' => '파일을 이곳으로 끌고오기', 'choose files' => '파일 선택', 'View profile' => '프로파일 보기', @@ -1163,7 +1146,6 @@ return array( 'Email sender address' => '이메일 보낸이 주소', 'Email transport' => '이메일 전송', 'Webhook token' => 'Webhook토큰', - 'Imports' => '가져오기', 'Project tags management' => '프로젝트 태그 관리', 'Tag created successfully.' => '태그가 성공적으로 생성되었습니다.', 'Unable to create this tag.' => '태그를 생성할 수 없습니다.', @@ -1210,8 +1192,6 @@ return array( 'Activity stream for %s' => '%s의 활동기록', 'Calendar for %s' => '%s의 달력', 'Notifications for %s' => '%s의 알림', - 'Subtasks export' => '서브할일 내보내기', - 'Tasks exportation' => '할일 내보내기', 'Assign a color when the task is moved to a specific swimlane' => '할일이 특정 스웜라인으로 옮겨질 때 색상 지정', 'Assign a priority when the task is moved to a specific swimlane' => '할일이 특정 스웜라인으로 옮겨질 때 우선순위 지정', 'User unlocked successfully.' => '사용자 잠금 성공', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/my_MY/translations.php b/app/Locale/my_MY/translations.php index be335dec..641dfefa 100644 --- a/app/Locale/my_MY/translations.php +++ b/app/Locale/my_MY/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d tugasan di papan', '%d tasks in total' => 'Sejumlah %d tugasan', 'Unable to update this board.' => 'Tidak berupaya mengemaskini papan ini', - 'Edit board' => 'ubah papan', 'Disable' => 'Nyah-Upaya', 'Enable' => 'Aktifkan', 'New project' => 'Projek Baru', @@ -72,7 +71,6 @@ return array( 'Title' => 'Judul', 'Assigned to %s' => 'Ditugaskan ke %s', 'Remove a column' => 'Hapus kolom', - 'Remove a column from a board' => 'Hapus kolom dari papan', 'Unable to remove this column.' => 'Tidak dapat menghapus kolom ini.', 'Do you really want to remove this column: "%s"?' => 'Apakah anda yakin akan menghapus kolom ini : « %s » ?', 'This action will REMOVE ALL TASKS associated to this column!' => 'tindakan ini akan MENGHAPUS SEMUA TUGAS yang terkait dengan kolom ini!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Jumlah tugas', 'User' => 'Pengguna', 'Comments' => 'Komentar', - 'Leave a comment' => 'Tinggalkan komentar', 'Comment is required' => 'Komentar diperlukan', - 'Leave a description' => 'Tinggalkan deskripsi', 'Comment added successfully.' => 'Komentar berhasil ditambahkan.', 'Unable to create your comment.' => 'Tidak dapat menambahkan komentar anda.', 'Due Date' => 'Batas Tanggal Terakhir', @@ -224,7 +220,6 @@ return array( 'Search' => 'Cari', 'Nothing found.' => 'Tidak ditemukan.', 'Due date' => 'Batas tanggal terakhir', - 'Others formats accepted: %s and %s' => 'Format lain yang didukung : %s et %s', 'Description' => 'Deskripsi', '%d comments' => '%d komentar', '%d comment' => '%d komentar', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Dibuat oleh %s', 'Tasks Export' => 'Ekspor Tugas', 'Start Date' => 'Tanggal Mulai', - 'End Date' => 'Tanggal Berakhir', 'Execute' => 'Eksekusi', 'Task Id' => 'Id Tugas', 'Creator' => 'Pembuat', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Jauh', 'Enabled' => 'Aktif', 'Disabled' => 'Tidak aktif', - 'Username:' => 'Nama pengguna :', - 'Name:' => 'Nama:', + 'Login:' => 'Nama pengguna :', + 'Full Name:' => 'Nama:', 'Email:' => 'Emel:', 'Notifications:' => 'Makluman:', 'Notifications' => 'Makluman', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Label Pautan', 'Link modification' => 'Modifikasi Pautan', 'Links' => 'Pautan', - 'Link settings' => 'Pengaturan Pautan', 'Opposite label' => 'Label berlawanan', 'Remove a link' => 'Hapus Pautan', - 'Task\'s links' => 'Pautan tugas', 'The labels must be different' => 'Label harus berbeda', 'There is no link.' => 'Tidak ada Pautan.', 'This label must be unique' => 'Label ini harus unik', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Tampilan kompak', 'Horizontal scrolling' => 'Horisontal bergulir', 'Compact/wide view' => 'Beralih antara tampilan kompak dan diperluas', - 'No results match:' => 'Tidak ada hasil :', 'Currency' => 'Mata uang', 'Private project' => 'projek pribadi', 'AUD - Australian Dollar' => 'AUD - Dollar Australia', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Yen Jepang', 'NZD - New Zealand Dollar' => 'NZD - Dollar Selandia baru', 'RSD - Serbian dinar' => 'RSD - Dinar Serbia', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - Dollar Amerika', 'Destination column' => 'Kolom tujuan', 'Move the task to another column when assigned to a user' => 'Pindahkan tugas ke kolom lain ketika ditugaskan ke pengguna', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Nilai tukar mata uang', 'Rate' => 'Tarif', 'Change reference currency' => 'Mengubah referensi mata uang', - 'Add a new currency rate' => 'Tambahkan nilai tukar mata uang baru', 'Reference currency' => 'Referensi mata uang', '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', @@ -702,7 +693,6 @@ return array( '<30m' => '<30m', 'Stop timer' => 'Hentikan timer', 'Start timer' => 'Mulai timer', - 'Add project member' => 'Tambahkan anggota projek', 'My activity stream' => 'Aliran kegiatan saya', 'My calendar' => 'Kalender saya', 'Search tasks' => 'Cari tugas', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Pengguna jauh', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Pengguna jauh tidak menyimpan kata laluan mereka dalam basis data Kanboard, contoh: Akaun LDAP, Google dan Github.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Jika anda mencentang kotak "Larang formulir login", kredensial masuk ke formulis login akan diabaikan.', - 'New remote user' => 'Pengguna baru jauh', - 'New local user' => 'Pengguna baru lokal', 'Default task color' => 'Standar warna tugas', 'This feature does not work with all browsers.' => 'Ciri ini tidak dapat digunakan pada semua browsers', 'There is no destination project available.' => 'Tiada destinasi projek yang tersedia.', @@ -852,7 +840,6 @@ return array( // 'Owner' => '', // 'Unread notifications' => '', // 'Notification methods:' => '', - // 'Import tasks from CSV file' => '', // 'Unable to read your file' => '', // '%d task(s) have been imported successfully.' => '', // 'Nothing have been imported!' => '', @@ -980,7 +967,6 @@ return array( // 'Project owner: ' => '', // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', // 'Project owner' => '', - // 'Those dates are useful for the project Gantt chart.' => '', // 'Private projects do not have users and groups management.' => '', // 'There is no project member.' => '', // 'Priority' => '', @@ -1037,7 +1023,6 @@ return array( // 'Started:' => '', // 'Moved:' => '', // 'Task #%d' => '', - // 'Date and time format' => '', // 'Time format' => '', // 'Start date: ' => '', // 'End date: ' => '', @@ -1051,9 +1036,7 @@ return array( // 'User disabled successfully.' => '', // 'Unable to disable this user.' => '', // 'All files have been uploaded successfully.' => '', - // 'View uploaded files' => '', // 'The maximum allowed file size is %sB.' => '', - // 'Choose files again' => '', // 'Drag and drop your files here' => '', // 'choose files' => '', // 'View profile' => '', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/nb_NO/translations.php b/app/Locale/nb_NO/translations.php index 6b49545c..da7e6508 100644 --- a/app/Locale/nb_NO/translations.php +++ b/app/Locale/nb_NO/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d Oppgaver på hovedsiden', '%d tasks in total' => '%d Oppgaver i alt', 'Unable to update this board.' => 'Ikke mulig at oppdatere hovedsiden', - 'Edit board' => 'Endre prosjektsiden', 'Disable' => 'Deaktiver', 'Enable' => 'Aktiver', 'New project' => 'Nytt prosjekt', @@ -72,7 +71,6 @@ return array( 'Title' => 'Tittel', 'Assigned to %s' => 'Tildelt: %s', 'Remove a column' => 'Fjern en kolonne', - 'Remove a column from a board' => 'Fjern en kolonne fra et board', 'Unable to remove this column.' => 'Ikke mulig ø fjerne denne kolonnen', 'Do you really want to remove this column: "%s"?' => 'Vil du fjerne denne kolonnen: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Denne handlingen vil SLETTE ALLE OPPGAVER tilknyttet denne kolonnen', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Antall oppgaver', 'User' => 'Bruker', 'Comments' => 'Kommentarer', - 'Leave a comment' => 'Legg inn en kommentar', 'Comment is required' => 'Kommentar må legges inn', - 'Leave a description' => 'Legg inn en beskrivelse...', 'Comment added successfully.' => 'Kommentaren er lagt til.', 'Unable to create your comment.' => 'Din kommentar kunne ikke opprettes.', 'Due Date' => 'Forfallsdato', @@ -224,7 +220,6 @@ return array( 'Search' => 'Søk', 'Nothing found.' => 'Intet funnet.', 'Due date' => 'Forfallsdato', - 'Others formats accepted: %s and %s' => 'Andre formater: %s og %s', 'Description' => 'Beskrivelse', '%d comments' => '%d kommentarer', '%d comment' => '%d kommentar', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Opprettet av %s', 'Tasks Export' => 'Oppgave eksport', 'Start Date' => 'Start-dato', - 'End Date' => 'Slutt-dato', 'Execute' => 'KKjør', 'Task Id' => 'Oppgave ID', 'Creator' => 'Laget av', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Fjernstyrt', 'Enabled' => 'Aktiv', 'Disabled' => 'Deaktivert', - 'Username:' => 'Brukernavn', - 'Name:' => 'Navn:', + 'Login:' => 'Brukernavn', + 'Full Name:' => 'Navn:', 'Email:' => 'Epost:', 'Notifications:' => 'Varslinger:', 'Notifications' => 'Varslinger', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Relasjonsetiketter', 'Link modification' => 'Relasjonsmodifisering', 'Links' => 'Relasjoner', - 'Link settings' => 'Relasjonsinnstillinger', 'Opposite label' => 'Etikett for relatert motsatt oppgave', 'Remove a link' => 'Fjern relasjon', - // 'Task\'s links' => '', // 'The labels must be different' => '', // 'There is no link.' => '', // 'This label must be unique' => '', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Kompakt visning', 'Horizontal scrolling' => 'Bla horisontalt', 'Compact/wide view' => 'Kompakt/bred visning', - 'No results match:' => 'Ingen resultater', 'Currency' => 'Valuta', 'Private project' => 'Privat prosjekt', // 'AUD - Australian Dollar' => '', @@ -566,6 +557,7 @@ return array( // 'JPY - Japanese Yen' => '', // 'NZD - New Zealand Dollar' => '', // 'RSD - Serbian dinar' => '', + // 'CNY - Chinese Yuan' => '', // 'USD - US Dollar' => '', 'Destination column' => 'Ny kolonne', 'Move the task to another column when assigned to a user' => 'Flytt oppgaven til en annen kolonne når den er tildelt en bruker', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Valutakurser', // 'Rate' => '', // 'Change reference currency' => '', - // 'Add a new currency rate' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -702,7 +693,6 @@ return array( // '<30m' => '', 'Stop timer' => 'Stopp timer', 'Start timer' => 'Start timer', - 'Add project member' => 'Legg til prosjektmedlem', 'My activity stream' => 'Aktivitetslogg', 'My calendar' => 'Min kalender', 'Search tasks' => 'Søk oppgave', @@ -757,8 +747,6 @@ return array( // 'Remote user' => '', // 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '', // 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '', - 'New remote user' => 'Ny eksternbruker', - 'New local user' => 'Ny internbruker', 'Default task color' => 'Standard oppgavefarge', // 'This feature does not work with all browsers.' => '', // 'There is no destination project available.' => '', @@ -852,7 +840,6 @@ return array( // 'Owner' => '', // 'Unread notifications' => '', // 'Notification methods:' => '', - // 'Import tasks from CSV file' => '', // 'Unable to read your file' => '', // '%d task(s) have been imported successfully.' => '', // 'Nothing have been imported!' => '', @@ -980,7 +967,6 @@ return array( // 'Project owner: ' => '', // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', // 'Project owner' => '', - // 'Those dates are useful for the project Gantt chart.' => '', // 'Private projects do not have users and groups management.' => '', // 'There is no project member.' => '', // 'Priority' => '', @@ -1037,7 +1023,6 @@ return array( // 'Started:' => '', // 'Moved:' => '', // 'Task #%d' => '', - // 'Date and time format' => '', // 'Time format' => '', // 'Start date: ' => '', // 'End date: ' => '', @@ -1051,9 +1036,7 @@ return array( // 'User disabled successfully.' => '', // 'Unable to disable this user.' => '', // 'All files have been uploaded successfully.' => '', - // 'View uploaded files' => '', // 'The maximum allowed file size is %sB.' => '', - // 'Choose files again' => '', // 'Drag and drop your files here' => '', // 'choose files' => '', // 'View profile' => '', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php index 44434a4e..140c0406 100644 --- a/app/Locale/nl_NL/translations.php +++ b/app/Locale/nl_NL/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d taken op het bord', '%d tasks in total' => '%d taken in totaal', 'Unable to update this board.' => 'Update van dit bord niet mogelijk.', - 'Edit board' => 'Bord bewerken', 'Disable' => 'Deactiveren', 'Enable' => 'Activeren', 'New project' => 'Nieuw project', @@ -72,7 +71,6 @@ return array( 'Title' => 'Titel', 'Assigned to %s' => 'Toegewezen aan %s', 'Remove a column' => 'Kolom verwijderen', - 'Remove a column from a board' => 'Kolom verwijderen van het bord', 'Unable to remove this column.' => 'Verwijderen van deze kolom niet mogelijk.', 'Do you really want to remove this column: "%s"?' => 'Weet u zeker dat u deze kolom wil verwijderen : « %s » ?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Deze actie zal ALLE TAKEN VERWIJDEREN die zijn geassocieerd met deze kolom!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Aantal taken', 'User' => 'Gebruiker', 'Comments' => 'Commentaar', - 'Leave a comment' => 'Schrijf een commentaar', 'Comment is required' => 'Commentaar is verplicht', - 'Leave a description' => 'Schrijf een omschrijving', 'Comment added successfully.' => 'Commentaar succesvol toegevoegd.', 'Unable to create your comment.' => 'Commentaar toevoegen niet gelukt.', 'Due Date' => 'Vervaldag', @@ -224,7 +220,6 @@ return array( 'Search' => 'Zoek', 'Nothing found.' => 'Niets gevonden.', 'Due date' => 'Vervaldatum', - 'Others formats accepted: %s and %s' => 'Andere toegestane formaten : %s en %s', 'Description' => 'Omschrijving', '%d comments' => '%d commentaren', '%d comment' => '%d commentaar', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Aangemaakt door %s', 'Tasks Export' => 'Taken exporteren', 'Start Date' => 'Startdatum', - 'End Date' => 'Einddatum', 'Execute' => 'Uitvoeren', 'Task Id' => 'Taak Id', 'Creator' => 'Aangemaakt door', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Remote', 'Enabled' => 'Actief', 'Disabled' => 'Inactief', - 'Username:' => 'Gebruikersnaam :', - 'Name:' => 'Naam :', + 'Login:' => 'Gebruikersnaam :', + 'Full Name:' => 'Naam :', 'Email:' => 'Email :', 'Notifications:' => 'Notificaties :', 'Notifications' => 'Notificaties', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Link labels', 'Link modification' => 'Link aanpassing', 'Links' => 'Links', - 'Link settings' => 'Link instellingen', 'Opposite label' => 'Tegenovergesteld label', 'Remove a link' => 'Link verwijderen', - 'Task\'s links' => 'Links van taak', 'The labels must be different' => 'De labels moeten verschillend zijn', 'There is no link.' => 'Er is geen link.', 'This label must be unique' => 'Dit label moet uniek zijn', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Compacte weergave', // 'Horizontal scrolling' => '', 'Compact/wide view' => 'Compacte/breedbeeld-weergave', - 'No results match:' => 'Geen resultaten voor', 'Currency' => 'Valuta', 'Private project' => 'Privé project', // 'AUD - Australian Dollar' => '', @@ -566,6 +557,7 @@ return array( // 'JPY - Japanese Yen' => '', // 'NZD - New Zealand Dollar' => '', // 'RSD - Serbian dinar' => '', + // 'CNY - Chinese Yuan' => '', // 'USD - US Dollar' => '', 'Destination column' => 'Doel kolom', // 'Move the task to another column when assigned to a user' => '', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Wisselkoersen', 'Rate' => 'Koers', // 'Change reference currency' => '', - // 'Add a new currency rate' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -702,7 +693,6 @@ return array( '<30m' => '<30m', 'Stop timer' => 'Stop timer', 'Start timer' => 'Start timer', - 'Add project member' => 'Voeg projectlid toe', 'My activity stream' => 'Mijn activiteiten', 'My calendar' => 'Mijn kalender', 'Search tasks' => 'Zoek taken', @@ -757,8 +747,6 @@ return array( // 'Remote user' => '', // 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '', // 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '', - // 'New remote user' => '', - // 'New local user' => '', // 'Default task color' => '', // 'This feature does not work with all browsers.' => '', // 'There is no destination project available.' => '', @@ -852,7 +840,6 @@ return array( // 'Owner' => '', // 'Unread notifications' => '', // 'Notification methods:' => '', - // 'Import tasks from CSV file' => '', // 'Unable to read your file' => '', // '%d task(s) have been imported successfully.' => '', // 'Nothing have been imported!' => '', @@ -980,7 +967,6 @@ return array( // 'Project owner: ' => '', // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', // 'Project owner' => '', - // 'Those dates are useful for the project Gantt chart.' => '', // 'Private projects do not have users and groups management.' => '', // 'There is no project member.' => '', // 'Priority' => '', @@ -1037,7 +1023,6 @@ return array( // 'Started:' => '', // 'Moved:' => '', // 'Task #%d' => '', - // 'Date and time format' => '', // 'Time format' => '', // 'Start date: ' => '', // 'End date: ' => '', @@ -1051,9 +1036,7 @@ return array( // 'User disabled successfully.' => '', // 'Unable to disable this user.' => '', // 'All files have been uploaded successfully.' => '', - // 'View uploaded files' => '', // 'The maximum allowed file size is %sB.' => '', - // 'Choose files again' => '', // 'Drag and drop your files here' => '', // 'choose files' => '', // 'View profile' => '', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php index 51c0fef8..16988195 100644 --- a/app/Locale/pl_PL/translations.php +++ b/app/Locale/pl_PL/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d zadań na tablicy', '%d tasks in total' => '%d wszystkich zadań', 'Unable to update this board.' => 'Nie można zaktualizować tablicy.', - 'Edit board' => 'Edytuj tablicę', 'Disable' => 'Wyłącz', 'Enable' => 'Włącz', 'New project' => 'Nowy projekt', @@ -72,7 +71,6 @@ return array( 'Title' => 'Nazwa', 'Assigned to %s' => 'Przypisane do %s', 'Remove a column' => 'Usuń kolumnę', - 'Remove a column from a board' => 'Usuń kolumnę z tablicy', 'Unable to remove this column.' => 'Nie udało się usunąć kolumny.', 'Do you really want to remove this column: "%s"?' => 'Na pewno chcesz usunąć kolumnę: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Wszystkie zadania w kolumnie zostaną usunięte!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Liczba zadań', 'User' => 'Użytkownik', 'Comments' => 'Komentarze', - 'Leave a comment' => 'Wstaw komentarz', 'Comment is required' => 'Komentarz jest wymagany', - 'Leave a description' => 'Dodaj opis', 'Comment added successfully.' => 'Komentarz dodany', 'Unable to create your comment.' => 'Nie udało się dodać komentarza', 'Due Date' => 'Termin', @@ -224,7 +220,6 @@ return array( 'Search' => 'Szukaj', 'Nothing found.' => 'Nic nie znaleziono', 'Due date' => 'Termin', - 'Others formats accepted: %s and %s' => 'Inne akceptowane formaty: %s and %s', 'Description' => 'Opis', '%d comments' => '%d Komentarzy', '%d comment' => '%d Komentarz', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Utworzone przez %s', 'Tasks Export' => 'Eksport zadań', 'Start Date' => 'Data początkowa', - 'End Date' => 'Data Końcowa', 'Execute' => 'Wykonaj', 'Task Id' => 'Identyfikator Zadania', 'Creator' => 'Autor', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Zdalne', 'Enabled' => 'Odblokowane', 'Disabled' => 'Zablokowane', - 'Username:' => 'Nazwa Użytkownika (login):', - 'Name:' => 'Imię i Nazwisko', + 'Login:' => 'Nazwa Użytkownika (login):', + 'Full Name:' => 'Imię i Nazwisko', 'Email:' => 'Email: ', 'Notifications:' => 'Powiadomienia: ', 'Notifications' => 'Powiadomienia', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Etykiety linku', 'Link modification' => 'Modyfikuj link', 'Links' => 'Linki', - 'Link settings' => 'Ustawienia linku', 'Opposite label' => 'Etykieta odwrotna', 'Remove a link' => 'Usuń link', - 'Task\'s links' => 'Linki zadania', 'The labels must be different' => 'Etykiety muszą być różne', 'There is no link.' => 'Brak linku', 'This label must be unique' => 'Etykieta musi być unikatowa', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Widok kompaktowy', 'Horizontal scrolling' => 'Przewijanie poziome', 'Compact/wide view' => 'Pełny/Kompaktowy widok', - 'No results match:' => 'Brak wyników:', 'Currency' => 'Waluta', 'Private project' => 'Projekt prywatny', 'AUD - Australian Dollar' => 'AUD - Dolar australijski', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Jen japoński', 'NZD - New Zealand Dollar' => 'NZD - Dolar nowozelandzki', 'RSD - Serbian dinar' => 'RSD - Dinar serbski', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - Dolar amerykański', 'Destination column' => 'Kolumna docelowa', 'Move the task to another column when assigned to a user' => 'Przenieś zadanie do innej kolumny gdy zostanie przypisane do osoby', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Kursy walut', 'Rate' => 'Kurs', 'Change reference currency' => 'Zmień walutę referencyjną', - 'Add a new currency rate' => 'Dodaj nowy kurs waluty', 'Reference currency' => 'Waluta referencyjna', 'The currency rate have been added successfully.' => 'Dodano kurs waluty', 'Unable to add this currency rate.' => 'Nie można dodać kursu waluty', @@ -702,7 +693,6 @@ return array( // '<30m' => '', 'Stop timer' => 'Zatrzymaj pomiar czasu', 'Start timer' => 'Uruchom pomiar czasu', - 'Add project member' => 'Dodaj uczestnika projektu', 'My activity stream' => 'Moja aktywność', 'My calendar' => 'Mój kalendarz', 'Search tasks' => 'Szukaj zadań', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Zdalny użytkownik', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Zdalni użykownicy nie przechowują swojego hasła w bazie danych Kanboard, przykłady: konta LDAP, Google and Github.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Jeśli zaznaczysz "Zablokuj możliwość logowania", dane podane przy logowaniu zostaną zignorowane.', - 'New remote user' => 'Nowy użytkownik zdalny', - 'New local user' => 'Nowy użytkownik lokalny', 'Default task color' => 'Domyślny kolor zadań', 'This feature does not work with all browsers.' => 'Ta funkcja może nie działać z każdą przeglądarką.', 'There is no destination project available.' => 'Żaden docelowy projekt nie jest aktualnie dostępny.', @@ -852,7 +840,6 @@ return array( 'Owner' => 'Właściciel', 'Unread notifications' => 'Nieprzeczytane powiadomienia', 'Notification methods:' => 'Metody powiadomień:', - 'Import tasks from CSV file' => 'Importuj zadania z pliku CSV', 'Unable to read your file' => 'Nie można odczytać pliku', '%d task(s) have been imported successfully.' => '%d zadań zostało zaimportowanych.', 'Nothing have been imported!' => 'Nic nie zostało zaimportowane!', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'Właściciel projektu: ', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'Identyfikator projektu jest opcjonalny i musi być alfanumeryczny, przykład: MYPROJECT.', 'Project owner' => 'Właściciel projektu', - 'Those dates are useful for the project Gantt chart.' => 'Daty te są przydatne dla wykresu Gantta.', 'Private projects do not have users and groups management.' => 'Projekty prywatne nie wspierają obsługi użytkowników i grup.', 'There is no project member.' => 'Projekt nie ma uczestników.', 'Priority' => 'Priorytet', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'Rozpoczęte:', 'Moved:' => 'Przeniesione:', 'Task #%d' => 'Zadanie #%d', - 'Date and time format' => 'Format daty oraz czasu', 'Time format' => 'Format czasu', 'Start date: ' => 'Data rozpoczęcia: ', 'End date: ' => 'Data zakończenia: ', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Użytkownik został wyłączony.', 'Unable to disable this user.' => 'Nie można wyłączyć użytkownika.', 'All files have been uploaded successfully.' => 'Wszystkie pliki zostały pomyślnie przesłane.', - 'View uploaded files' => 'Zobacz przesłane pliki', 'The maximum allowed file size is %sB.' => 'Maksymalny rozmiar pliku to %sB.', - 'Choose files again' => 'Wybierz jeszcze raz pliki', 'Drag and drop your files here' => 'Przeciągnij i upuść pliki tutaj', 'choose files' => 'wybierz pliki', 'View profile' => 'Zobacz profil', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php index c0fa2387..ef8fc4c9 100644 --- a/app/Locale/pt_BR/translations.php +++ b/app/Locale/pt_BR/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d tarefas no board', '%d tasks in total' => '%d tarefas no total', 'Unable to update this board.' => 'Não foi possível atualizar este board.', - 'Edit board' => 'Editar board', 'Disable' => 'Desativar', 'Enable' => 'Ativar', 'New project' => 'Novo projeto', @@ -72,7 +71,6 @@ return array( 'Title' => 'Título', 'Assigned to %s' => 'Designado para %s', 'Remove a column' => 'Remover uma coluna', - 'Remove a column from a board' => 'Remover uma coluna do board', 'Unable to remove this column.' => 'Não foi possível remover esta coluna.', 'Do you really want to remove this column: "%s"?' => 'Você realmente deseja remover esta coluna: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Esta ação irá REMOVER TODAS AS TAREFAS associadas a esta coluna!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Número de tarefas', 'User' => 'Usuário', 'Comments' => 'Comentários', - 'Leave a comment' => 'Deixe um comentário', 'Comment is required' => 'Comentário é obrigatório', - 'Leave a description' => 'Deixe uma descrição', 'Comment added successfully.' => 'Comentário adicionado com sucesso.', 'Unable to create your comment.' => 'Não é possível criar o seu comentário.', 'Due Date' => 'Data fim estimada', @@ -224,7 +220,6 @@ return array( 'Search' => 'Pesquisar', 'Nothing found.' => 'Nada foi encontrado.', 'Due date' => 'Data fim estimada', - 'Others formats accepted: %s and %s' => 'Outros formatos permitidos: %s e %s', 'Description' => 'Descrição', '%d comments' => '%d comentários', '%d comment' => '%d comentário', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Criado por %s', 'Tasks Export' => 'Exportar Tarefas', 'Start Date' => 'Data inicial', - 'End Date' => 'Data final', 'Execute' => 'Executar', 'Task Id' => 'ID da Tarefa', 'Creator' => 'Criado por', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Remoto', 'Enabled' => 'Habilitado', 'Disabled' => 'Desabilitado', - 'Username:' => 'Usuário:', - 'Name:' => 'Nome:', + 'Login:' => 'Usuário:', + 'Full Name:' => 'Nome:', 'Email:' => 'E-mail:', 'Notifications:' => 'Notificações:', 'Notifications' => 'Notificações', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Etiquetas das associações', 'Link modification' => 'Modificação de uma associação', 'Links' => 'Associações', - 'Link settings' => 'Configuração das associações', 'Opposite label' => 'Nome da etiqueta oposta', 'Remove a link' => 'Remover uma associação', - 'Task\'s links' => 'Associações das tarefas', 'The labels must be different' => 'As etiquetas devem ser diferentes', 'There is no link.' => 'Não há nenhuma associação.', 'This label must be unique' => 'Esta etiqueta deve ser unica', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Vista reduzida', 'Horizontal scrolling' => 'Rolagem horizontal', 'Compact/wide view' => 'Alternar entre a vista compacta e ampliada', - 'No results match:' => 'Nenhum resultado:', 'Currency' => 'Moeda', 'Private project' => 'Projeto privado', 'AUD - Australian Dollar' => 'AUD - Dólar australiano', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Iene japonês', 'NZD - New Zealand Dollar' => 'NZD - Dólar Neozelandês', 'RSD - Serbian dinar' => 'RSD - Dinar sérvio', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - Dólar norte-americano', 'Destination column' => 'Coluna de destino', 'Move the task to another column when assigned to a user' => 'Mover a tarefa para uma outra coluna quando esta está atribuída a um usuário', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Taxas de câmbio das moedas estrangeiras', 'Rate' => 'Taxa', 'Change reference currency' => 'Mudar a moeda de referência', - 'Add a new currency rate' => 'Adicionar uma nova taxa para uma moeda', 'Reference currency' => 'Moeda de Referência', '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.', @@ -702,7 +693,6 @@ return array( '<30m' => '<30m', 'Stop timer' => 'Stop timer', 'Start timer' => 'Start timer', - 'Add project member' => 'Adicionar membro ao projeto', 'My activity stream' => 'Meu feed de atividades', 'My calendar' => 'Minha agenda', 'Search tasks' => 'Pesquisar tarefas', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Usuário remoto', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Os usuários remotos não conservam as suas senhas no banco de dados Kanboard, exemplos: contas LDAP, Github ou Google.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Se você marcar "Interdir o formulário de autenticação", os identificadores entrados no formulário de login serão ignorado.', - 'New remote user' => 'Criar um usuário remoto', - 'New local user' => 'Criar um usuário local', 'Default task color' => 'Cor padrão para as tarefas', 'This feature does not work with all browsers.' => 'Esta funcionalidade não é compatível com todos os navegadores.', 'There is no destination project available.' => 'Não há nenhum projeto de destino disponível.', @@ -852,7 +840,6 @@ return array( 'Owner' => 'Líder', 'Unread notifications' => 'Notificações não lidas', 'Notification methods:' => 'Métodos de notificação:', - 'Import tasks from CSV file' => 'Importar tarefas a partir de arquivo CSV', 'Unable to read your file' => 'Não foi possível ler seu arquivo', '%d task(s) have been imported successfully.' => '%d tarefa(s) importada(s) com sucesso.', 'Nothing have been imported!' => 'Nada foi importado!', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'Líder do projeto: ', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'O identificador do projeto é opcional e deve ser alfanumérico, por exemplo MEUPROJETO.', 'Project owner' => 'Líder do projeto', - 'Those dates are useful for the project Gantt chart.' => 'Estas datas são úteis para o gráfico de Gantt dos projetos.', 'Private projects do not have users and groups management.' => 'Projetos privados não têm gestão de usuários e grupos.', 'There is no project member.' => 'Não há nenhum membro do projeto.', 'Priority' => 'Prioridade', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'Começado:', 'Moved:' => 'Movido:', 'Task #%d' => 'Tarefa #%d', - 'Date and time format' => 'Formato da hora e da data', 'Time format' => 'Formato da hora', 'Start date: ' => 'Data de início: ', 'End date: ' => 'Data final: ', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Usuário desactivado com sucesso.', 'Unable to disable this user.' => 'Impossível de desativar esse usuário.', 'All files have been uploaded successfully.' => 'Todos os arquivos foram enviados com sucesso.', - 'View uploaded files' => 'Ver os arquivos enviados', 'The maximum allowed file size is %sB.' => 'O tamanho máximo dos arquivos é %sB.', - 'Choose files again' => 'Selecionar novamente arquivos', 'Drag and drop your files here' => 'Arraste e solte os arquivos aqui', 'choose files' => 'selecione os arquivos', 'View profile' => 'Ver o perfil', @@ -1163,7 +1146,6 @@ return array( 'Email sender address' => 'Endereço de envio de Email', 'Email transport' => 'Transportador de Email', 'Webhook token' => 'Token do Webhook', - 'Imports' => 'Importados', 'Project tags management' => 'Gestão de etiquetas do Projeto', 'Tag created successfully.' => 'Etiqueta criada com sucesso.', 'Unable to create this tag.' => 'Não foi possivel criar esta etiqueta.', @@ -1210,8 +1192,6 @@ return array( 'Activity stream for %s' => 'Fluxo de atividade 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', 'Assign a color when the task is moved to a specific swimlane' => 'Atribuir uma cor quando a tarefa é movida para uma swimlane especifica', 'Assign a priority when the task is moved to a specific swimlane' => 'Atribuir uma prioridade quando a tarefa é movida para uma swimlane especifica', 'User unlocked successfully.' => 'Usuário desbloqueado com sucesso.', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/pt_PT/translations.php b/app/Locale/pt_PT/translations.php index 3a229570..c4e14ed3 100644 --- a/app/Locale/pt_PT/translations.php +++ b/app/Locale/pt_PT/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d tarefas no quadro', '%d tasks in total' => '%d tarefas no total', 'Unable to update this board.' => 'Não foi possível actualizar este quadro.', - 'Edit board' => 'Editar quadro', 'Disable' => 'Desactivar', 'Enable' => 'Activar', 'New project' => 'Novo projeto', @@ -72,7 +71,6 @@ return array( 'Title' => 'Título', 'Assigned to %s' => 'Designado para %s', 'Remove a column' => 'Remover uma coluna', - 'Remove a column from a board' => 'Remover uma coluna do quadro', 'Unable to remove this column.' => 'Não foi possível remover esta coluna.', 'Do you really want to remove this column: "%s"?' => 'Tem a certeza que quer remover esta coluna: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Esta acção irá REMOVER TODAS AS TAREFAS associadas a esta coluna!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Número de tarefas', 'User' => 'Utilizador', 'Comments' => 'Comentários', - 'Leave a comment' => 'Deixe um comentário', 'Comment is required' => 'Comentário é obrigatório', - 'Leave a description' => 'Deixe uma descrição', 'Comment added successfully.' => 'Comentário adicionado com sucesso.', 'Unable to create your comment.' => 'Não é possível criar o seu comentário.', 'Due Date' => 'Data de vencimento', @@ -224,7 +220,6 @@ return array( 'Search' => 'Pesquisar', 'Nothing found.' => 'Nada encontrado.', 'Due date' => 'Data de vencimento', - 'Others formats accepted: %s and %s' => 'Outros formatos permitidos: %s e %s', 'Description' => 'Descrição', '%d comments' => '%d comentários', '%d comment' => '%d comentário', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Criado por %s', 'Tasks Export' => 'Exportar Tarefas', 'Start Date' => 'Data inicial', - 'End Date' => 'Data final', 'Execute' => 'Executar', 'Task Id' => 'ID da Tarefa', 'Creator' => 'Criado por', @@ -307,7 +301,7 @@ return array( 'Clone' => 'Clonar', 'Project cloned successfully.' => 'Projeto clonado com sucesso.', 'Unable to clone this project.' => 'Não foi possível clonar este projeto.', - 'Enable email notifications' => 'Activar notificações por email', + 'Enable email notifications' => 'Activar notificações por e-mail', 'Task position:' => 'Posição da tarefa:', 'The task #%d have been opened.' => 'A tarefa #%d foi aberta.', 'The task #%d have been closed.' => 'A tarefa #%d foi finalizada.', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Remoto', 'Enabled' => 'Activado', 'Disabled' => 'Desactivado', - 'Username:' => 'Utilizador:', - 'Name:' => 'Nome:', + 'Login:' => 'Utilizador:', + 'Full Name:' => 'Nome:', 'Email:' => 'E-mail:', 'Notifications:' => 'Notificações:', 'Notifications' => 'Notificações', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Etiquetas das associações', 'Link modification' => 'Modificação de uma associação', 'Links' => 'Associações', - 'Link settings' => 'Configuração das associações', 'Opposite label' => 'Nome da etiqueta oposta', 'Remove a link' => 'Remover uma associação', - 'Task\'s links' => 'Associações das tarefas', 'The labels must be different' => 'As etiquetas devem ser diferentes', 'There is no link.' => 'Não há nenhuma associação.', 'This label must be unique' => 'Esta etiqueta deve ser unica', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Vista reduzida', 'Horizontal scrolling' => 'Deslocamento horizontal', 'Compact/wide view' => 'Alternar entre a vista compacta e ampliada', - 'No results match:' => 'Nenhum resultado:', 'Currency' => 'Moeda', 'Private project' => 'Projeto privado', 'AUD - Australian Dollar' => 'AUD - Dólar australiano', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Iene japonês', 'NZD - New Zealand Dollar' => 'NZD - Dólar Neozelandês', 'RSD - Serbian dinar' => 'RSD - Dinar sérvio', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - Dólar norte-americano', 'Destination column' => 'Coluna de destino', 'Move the task to another column when assigned to a user' => 'Mover a tarefa para uma outra coluna quando esta está atribuída a um utilizador', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Taxas de câmbio das moedas estrangeiras', 'Rate' => 'Taxa', 'Change reference currency' => 'Mudar a moeda de referência', - 'Add a new currency rate' => 'Adicionar uma nova taxa para uma moeda', 'Reference currency' => 'Moeda de Referência', '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.', @@ -702,7 +693,6 @@ return array( '<30m' => '<30m', 'Stop timer' => 'Parar temporizador', 'Start timer' => 'Iniciar temporizador', - 'Add project member' => 'Adicionar um membro ao projeto', 'My activity stream' => 'O meu feed de actividade', 'My calendar' => 'A minha agenda', 'Search tasks' => 'Pesquisar tarefas', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Utilizador remoto', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Utilizadores remotos não guardam a password na base de dados do Kanboard, por exemplo: LDAP, contas do Google e Github.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Se activar a opção "Desactivar login", as credenciais digitadas no login serão ignoradas.', - 'New remote user' => 'Novo utilizador remoto', - 'New local user' => 'Novo utilizador local', 'Default task color' => 'Cor de tarefa por defeito', 'This feature does not work with all browsers.' => 'Esta funcionalidade não funciona em todos os browsers', 'There is no destination project available.' => 'Não há projeto de destino disponivel', @@ -852,7 +840,6 @@ return array( 'Owner' => 'Dono', 'Unread notifications' => 'Notificações por ler', 'Notification methods:' => 'Métodos de notificação:', - 'Import tasks from CSV file' => 'Importar tarefas de um ficheiro CSV', 'Unable to read your file' => 'Não foi possivel ler o ficheiro', '%d task(s) have been imported successfully.' => '%d tarefa(s) importada(s) com successo.', 'Nothing have been imported!' => 'Nada foi importado', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'Dono do projeto: ', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'O identificador do projeto é opcional e tem de ser alfa-numerico, exemplo: MEUPROJETO.', 'Project owner' => 'Dono do projeto', - 'Those dates are useful for the project Gantt chart.' => 'Estas datas são uteis para o gráfico de Grantt do projeto.', 'Private projects do not have users and groups management.' => 'Projetos privados não têm gestão de utilizadores nem de grupos.', 'There is no project member.' => 'Não existe membro do projeto.', 'Priority' => 'Prioridade', @@ -993,7 +979,7 @@ return array( 'If you put zero to the low and high priority, this feature will be disabled.' => 'Se colocar zero na prioridade baixa ou alta, essa funcionalidade será desactivada.', 'Close a task when there is no activity' => 'Fechar tarefa quando não há actividade', 'Duration in days' => 'Duração em dias', - 'Send email when there is no activity on a task' => 'Enviar email quando não há actividade numa tarefa', + 'Send email when there is no activity on a task' => 'Enviar e-mail quando não há actividade numa tarefa', 'Unable to fetch link information.' => 'Impossivel obter informação da ligação.', 'Daily background job for tasks' => 'Trabalho diário em segundo plano para tarefas', 'Auto' => 'Auto', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'Iniciado:', 'Moved:' => 'Movido:', 'Task #%d' => 'Tarefa #%d', - 'Date and time format' => 'Formato tempo e data', 'Time format' => 'Formato tempo', 'Start date: ' => 'Data inicio: ', 'End date: ' => 'Data final: ', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Utilizador desactivado com sucesso.', 'Unable to disable this user.' => 'Não foi possivel desactivar este utilizador.', 'All files have been uploaded successfully.' => 'Todos os ficheiros foram enviados com sucesso.', - 'View uploaded files' => 'Ver ficheiros enviados', 'The maximum allowed file size is %sB.' => 'O tamanho máximo permitido é %sB.', - 'Choose files again' => 'Escolher ficheiros novamente', 'Drag and drop your files here' => 'Arraste e deixe os ficheiros para aqui', 'choose files' => 'escolher ficheiros', 'View profile' => 'Ver perfil', @@ -1159,11 +1142,10 @@ return array( 'Enter one task by line.' => 'Escreva uma tarefa por linha.', 'Number of failed login:' => 'Número de logins falhados:', 'Account locked until:' => 'Conta bloqueada até:', - 'Email settings' => 'Definições de Email', - 'Email sender address' => 'Endereço de envido de Email', - 'Email transport' => 'Transportador de Email', + 'Email settings' => 'Definições de E-mail', + 'Email sender address' => 'Endereço de envido de E-mail', + 'Email transport' => 'Transportador de E-mail', 'Webhook token' => 'Token do Webhook', - 'Imports' => 'Importados', 'Project tags management' => 'Gestão de etiquetas do Projeto', 'Tag created successfully.' => 'Etiqueta criada com sucesso.', 'Unable to create this tag.' => 'Não foi possivel criar esta etiqueta.', @@ -1210,8 +1192,6 @@ return array( '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', 'Assign a color when the task is moved to a specific swimlane' => 'Atribuir uma cor quando a tarefa é movida para uma swimlane especifica', 'Assign a priority when the task is moved to a specific swimlane' => 'Atribuir uma prioridade quando a tarefa é movida para uma swimlane especifica', 'User unlocked successfully.' => 'Utilizador desbloqueado com sucesso.', @@ -1287,4 +1267,44 @@ return array( 'Your personal API access token is "%s"' => 'O seu token de acesso pessoal ao API é "%s"', 'Remove your token' => 'Remover o seu token', 'Generate a new token' => 'Gerar um novo token', + 'Showing %d-%d of %d' => 'A mostrar %d-%d de %d', + 'Outgoing Emails' => 'E-mails de saída', + 'Add or change currency rate' => 'Adicionar ou alterar taxa da moeda', + 'Reference currency: %s' => 'Moeda de referência: %s', + 'Add custom filters' => 'Adicionar filtros personalizados', + 'Export' => 'Exportar', + 'Add link label' => 'Adicionar etiqueta de associação', + 'Incompatible Plugins' => 'Plugins incompatíveis', + 'Compatibility' => 'Compatibilidade', + 'Permissions and ownership' => 'Permissões e propriedade', + 'Priorities' => 'Prioridades', + 'Close this window' => 'Feche esta janela', + 'Unable to upload this file.' => 'Não foi possível enviar este ficheiro.', + 'Import tasks' => 'Importar tarefas', + 'Choose a project' => 'Escolha um projeto', + 'Profile' => 'Perfil', + 'Application role' => 'Função na Aplicação', + '%d invitations were sent.' => '%d convites foram enviados.', + '%d invitation was sent.' => '%d convite foi enviado.', + 'Unable to create this user.' => 'Não foi possível criar este utilizador.', + 'Kanboard Invitation' => 'Convite de Kanboard', + 'Visible on dashboard' => 'Visível no painel', + 'Created at:' => 'Criado a:', + 'Updated at:' => 'Atualizado a:', + 'There is no custom filter.' => 'Não existe nenhum filtro personalizado.', + 'New User' => 'Novo Utilizador', + 'Authentication' => 'Autenticação', + 'If checked, this user will use a third-party system for authentication.' => 'Se selecionado, este utilizador irá utilizar um serviços de terceiros para autenticação.', + 'The password is necessary only for local users.' => 'A password só é necessária para utilizadores locais.', + 'You have been invited to register on Kanboard.' => 'Foi convidado para se registrar no Kanboard.', + 'Click here to join your team' => 'Clique aqui para se juntar à sua equipa', + 'Invite people' => 'Convidar pessoas', + 'Emails' => 'E-mails', + 'Enter one email address by line.' => 'Insira um endereço de e-mail por linha.', + 'Add these people to this project' => 'Adicione estas pessoas a este projeto', + 'Add this person to this project' => 'Adicione esta pessoa a este projeto', + 'Sign-up' => 'Registe-se', + 'Credentials' => 'Credenciais', + 'New user' => 'Novo utilizador', + 'This username is already taken' => 'Este nome de usuário já foi utilizado', ); diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php index 4d821f6a..7bf57fb2 100644 --- a/app/Locale/ru_RU/translations.php +++ b/app/Locale/ru_RU/translations.php @@ -36,7 +36,7 @@ return array( 'Remove user' => 'Удалить пользователя', 'Do you really want to remove this user: "%s"?' => 'Вы точно хотите удалить пользователя: « %s » ?', 'All users' => 'Все пользователи', - 'Username' => 'Имя пользователя', + 'Username' => 'Логин', 'Password' => 'Пароль', 'Administrator' => 'Администратор', 'Sign in' => 'Войти', @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d задач на доске', '%d tasks in total' => 'всего %d задач', 'Unable to update this board.' => 'Не удалось обновить эту доску.', - 'Edit board' => 'Изменить доску', 'Disable' => 'Выключить проект', 'Enable' => 'Включить проект', 'New project' => 'Новый проект', @@ -72,7 +71,6 @@ return array( 'Title' => 'Название', 'Assigned to %s' => 'Назначено %s', 'Remove a column' => 'Удалить колонку', - 'Remove a column from a board' => 'Удалить колонку с доски', 'Unable to remove this column.' => 'Не удалось удалить эту колонку.', 'Do you really want to remove this column: "%s"?' => 'Вы точно хотите удалить эту колонку: "%s" ?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Вы УДАЛИТЕ ВСЕ ЗАДАЧИ находящиеся в этой колонке!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Количество задач', 'User' => 'Пользователь', 'Comments' => 'Комментарии', - 'Leave a comment' => 'Оставить комментарий', 'Comment is required' => 'Нужен комментарий', - 'Leave a description' => 'Напишите описание', 'Comment added successfully.' => 'Комментарий успешно добавлен.', 'Unable to create your comment.' => 'Невозможно создать комментарий.', 'Due Date' => 'Сделать до', @@ -224,7 +220,6 @@ return array( 'Search' => 'Поиск', 'Nothing found.' => 'Ничего не найдено.', 'Due date' => 'Срок', - 'Others formats accepted: %s and %s' => 'Другой формат приемлем: %s и %s', 'Description' => 'Описание', '%d comments' => '%d комментариев', '%d comment' => '%d комментарий', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Создано %s', 'Tasks Export' => 'Экспорт задач', 'Start Date' => 'Дата начала', - 'End Date' => 'Дата завершения', 'Execute' => 'Выполнить', 'Task Id' => 'ID задачи', 'Creator' => 'Автор', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Удалённый', 'Enabled' => 'Включён', 'Disabled' => 'Выключены', - 'Username:' => 'Имя пользователя:', - 'Name:' => 'Имя:', + 'Login:' => 'Логин:', + 'Full Name:' => 'Имя:', 'Email:' => 'E-mail:', 'Notifications:' => 'Уведомления:', 'Notifications' => 'Уведомления', @@ -491,7 +485,7 @@ return array( 'All swimlanes' => 'Все дорожки', 'All colors' => 'Все цвета', 'Moved to column %s' => 'Перемещена в колонку %s', - 'User dashboard' => 'Пользователь панели мониторинга', + 'User dashboard' => 'Панель управления', 'Allow only one subtask in progress at the same time for a user' => 'Разрешена только одна подзадача в разработке одновременно для одного пользователя', 'Edit column "%s"' => 'Редактировать колонку "%s"', 'Select the new status of the subtask: "%s"' => 'Выбрать новый статус для подзадачи: "%s"', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Метки для ссылки', 'Link modification' => 'Обновление ссылки', 'Links' => 'Ссылки', - 'Link settings' => 'Настройки ссылки', 'Opposite label' => 'Ярлык напротив', 'Remove a link' => 'Удалить ссылку', - 'Task\'s links' => 'Ссылки задачи', 'The labels must be different' => 'Ярлыки должны быть разными', 'There is no link.' => 'Это не ссылка', 'This label must be unique' => 'Этот ярлык должен быть уникальным ', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Компактный вид', 'Horizontal scrolling' => 'Широкий вид', 'Compact/wide view' => 'Компактный/широкий вид', - 'No results match:' => 'Отсутствуют результаты:', 'Currency' => 'Валюта', 'Private project' => 'Приватный проект', 'AUD - Australian Dollar' => 'AUD - Австралийский доллар', @@ -563,9 +554,10 @@ return array( 'EUR - Euro' => 'EUR - Евро', 'GBP - British Pound' => 'GBP - Британский фунт', 'INR - Indian Rupee' => 'INR - Индийский рупий', - 'JPY - Japanese Yen' => 'JPY - Японскай йена', + 'JPY - Japanese Yen' => 'JPY - Японская йена', 'NZD - New Zealand Dollar' => 'NZD - Новозеландский доллар', 'RSD - Serbian dinar' => 'RSD - Сербский динар', + 'CNY - Chinese Yuan' => 'CNY - Китайский юань', 'USD - US Dollar' => 'USD - доллар США', 'Destination column' => 'Колонка назначения', 'Move the task to another column when assigned to a user' => 'Переместить задачу в другую колонку, когда она назначена пользователю', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Курсы валют', 'Rate' => 'Курс', 'Change reference currency' => 'Изменить справочник валют', - 'Add a new currency rate' => 'Добавить новый валютный курс', 'Reference currency' => 'Справочник валют', 'The currency rate have been added successfully.' => 'Курс валюты был успешно добавлен.', 'Unable to add this currency rate.' => 'Невозможно добавить этот курс валюты.', @@ -600,7 +591,7 @@ return array( 'Assign a color when the task is moved to a specific column' => 'Назначить цвет, когда задача перемещается в определенную колонку', '%s via Kanboard' => '%s через Канборд', 'Burndown chart' => 'Диаграмма сгорания', - 'This chart show the task complexity over the time (Work Remaining).' => 'Эта диаграмма показывают сложность задачи по времени (оставшейся работы).', + 'This chart show the task complexity over the time (Work Remaining).' => 'Эта диаграмма показывает сложность задачи по времени (оставшейся работы).', 'Screenshot taken %s' => 'Скриншот сделан %s', 'Add a screenshot' => 'Прикрепить картинку', 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Сделайте скриншот и нажмите CTRL+V или ⌘+V для вложения', @@ -702,7 +693,6 @@ return array( '<30m' => '<30м', 'Stop timer' => 'Остановить таймер', 'Start timer' => 'Запустить таймер', - 'Add project member' => 'Добавить номер проекта', 'My activity stream' => 'Лента моей активности', 'My calendar' => 'Мой календарь', 'Search tasks' => 'Поиск задачи', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Удаленный пользователь', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Учётные данные для входа через LDAP, Google и Github не будут сохранены в Kanboard.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Если вы установите флажок "Запретить форму входа", учётные данные, введенные в форму входа будет игнорироваться.', - 'New remote user' => 'Новый удалённый пользователь', - 'New local user' => 'Новый локальный пользователь', 'Default task color' => 'Стандартные цвета задач', 'This feature does not work with all browsers.' => 'Эта функция доступна не во всех браузерах.', 'There is no destination project available.' => 'Нет доступного для назначения проекта.', @@ -852,7 +840,6 @@ return array( 'Owner' => 'Владелец', 'Unread notifications' => 'Непрочитанные уведомления', 'Notification methods:' => 'Способы уведомления:', - 'Import tasks from CSV file' => 'Импорт задач из CSV-файла', 'Unable to read your file' => 'Невозможно прочитать файл', '%d task(s) have been imported successfully.' => '%d задач было успешно импортировано.', 'Nothing have been imported!' => 'Ничего не было импортировано!', @@ -931,7 +918,7 @@ return array( 'Allowed Users' => 'Разрешенные пользователи', 'No user have been allowed specifically.' => 'Нет заданных разрешений для пользователей.', 'Role' => 'Роль', - 'Enter user name...' => 'Введите имя пользователя...', + 'Enter user name...' => 'Введите логин пользователя...', 'Allowed Groups' => 'Разрешенные группы', 'No group have been allowed specifically.' => 'Нет заданных разрешений для групп.', 'Group' => 'Группа', @@ -950,13 +937,13 @@ return array( 'Estimated Time' => 'Запланировано времени', 'Actual Time' => 'Затрачено времени', 'Estimated vs actual time' => 'Запланировано и реально затрачено времени', - 'RUB - Russian Ruble' => 'Руб - Российский рубль', + 'RUB - Russian Ruble' => 'РУБ - Российский рубль', 'Assign the task to the person who does the action when the column is changed' => 'Назначить задачу пользователю, который произвёл изменение в колонке', 'Close a task in a specific column' => 'Закрыть задачу в выбранной колонке', 'Time-based One-time Password Algorithm' => 'Зависимый от времени, одноразовый алгоритм пароля', - 'Two-Factor Provider: ' => 'Провайдер двух-факторной авторизации: ', - 'Disable two-factor authentication' => 'Отключить двух-факторную авторизацию', - 'Enable two-factor authentication' => 'Включить двух-факторную авторизацию', + 'Two-Factor Provider: ' => 'Провайдер двухфакторной авторизации: ', + 'Disable two-factor authentication' => 'Отключить двухфакторную авторизацию', + 'Enable two-factor authentication' => 'Включить двухфакторную авторизацию', 'There is no integration registered at the moment.' => 'Интеграции в данный момент не зарегистрированы.', 'Password Reset for Kanboard' => 'Сброс пароля для Kanboard', 'Forgot password?' => 'Забыли пароль?', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'Владелец проекта:', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'Идентификатор проекта не обязателен и должен содержать буквенно-цифровые символы, пример: MYPROJECT', 'Project owner' => 'Владелец проекта', - 'Those dates are useful for the project Gantt chart.' => 'Эти даты используются для диаграммы Ганта проекта.', 'Private projects do not have users and groups management.' => 'Приватные проекты не имеют управления пользователями и группами.', 'There is no project member.' => 'Нет участников проекта.', 'Priority' => 'Приоритет', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'Начата:', 'Moved:' => 'Перемещена:', 'Task #%d' => 'Задача #%d', - 'Date and time format' => 'Формат даты и времени', 'Time format' => 'Формат времени', 'Start date: ' => 'Дата начала:', 'End date: ' => 'Дата окончания:', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Пользователь был успешно выключен.', 'Unable to disable this user.' => 'Не удалось выключить пользователя.', 'All files have been uploaded successfully.' => 'Все файлы были успешно загружены.', - 'View uploaded files' => 'Просмотр загруженных файлов', 'The maximum allowed file size is %sB.' => 'Максимально допустимый размер файла: %sB.', - 'Choose files again' => 'Выбрать файлы повторно', 'Drag and drop your files here' => 'Переместите ваши файлы сюда', 'choose files' => 'выбор файлов', 'View profile' => 'Просмотр профиля', @@ -1163,7 +1146,6 @@ return array( 'Email sender address' => 'Адрес отправителя', 'Email transport' => 'Почтовый транспорт', 'Webhook token' => 'Webhook токены', - 'Imports' => 'Импорт', 'Project tags management' => 'Управление метками проекта', 'Tag created successfully.' => 'Метка успешно создана.', 'Unable to create this tag.' => 'Невозможно создать эту метку.', @@ -1189,7 +1171,7 @@ return array( '%s removed a comment on the task #%d' => '%s удалил комментарий к задаче #%d', 'Comment removed on task #%d' => 'Комментарий удален в задаче #%d', 'Subtask removed on task #%d' => 'Подзадача удалена в задаче #%d', - 'Hide tasks in this column in the dashboard' => 'Не показывать задачи из этой колонки в кабинете', + 'Hide tasks in this column in the dashboard' => 'Не показывать задачи из этой колонки в панели управления', '%s removed a comment on the task %s' => '%s удалил комментарии к задаче %s', '%s removed a subtask for the task %s' => '%s удалил подзадачу для %s', 'Comment removed' => 'Комментарий удален', @@ -1210,8 +1192,6 @@ return array( 'Activity stream for %s' => 'Лента активности для %s', 'Calendar for %s' => 'Календарь для %s', 'Notifications for %s' => 'Уведомления для %s', - 'Subtasks export' => 'Экспорт подзадач', - 'Tasks exportation' => 'Экспортирование задач', 'Assign a color when the task is moved to a specific swimlane' => 'Назначить цвет, когда задача будет перемещена в указанную дорожку', 'Assign a priority when the task is moved to a specific swimlane' => 'Назначить приоритет, когда задача будет перемещена в указанную дорожку', 'User unlocked successfully.' => 'Пользователь успешно разблокирован.', @@ -1277,14 +1257,54 @@ return array( 'This field is required' => 'Заполните это поле', 'Moving a task is not permitted' => 'Перемещение задачи не разрешено', 'This value must be in the range %d to %d' => 'Значение должно находиться в диапазоне от %d до %d', - // 'You are not allowed to move this task.' => '', - // 'API User Access' => '', - // 'Preview' => '', - // 'Write' => '', - // 'Write your text in Markdown' => '', - // 'New External Task: %s' => '', - // 'No personal API access token registered.' => '', - // 'Your personal API access token is "%s"' => '', - // 'Remove your token' => '', - // 'Generate a new token' => '', + 'You are not allowed to move this task.' => 'Вам не разрешено перемещать эту задачу.', + 'API User Access' => 'Доступ к API', + 'Preview' => 'Предпросмотр', + 'Write' => 'Редактирование', + 'Write your text in Markdown' => 'Добавьте Ваше описание в формате Markdown', + 'New External Task: %s' => 'Новая внешняя задача: %s', + 'No personal API access token registered.' => 'Персональные токены доступа к API не созданы.', + 'Your personal API access token is "%s"' => 'Ваш персональный токен доступа к API: "%s"', + 'Remove your token' => 'Удалить токен', + 'Generate a new token' => 'Сгенерировать новый токен', + 'Showing %d-%d of %d' => 'Показывается %d-%d из %d', + 'Outgoing Emails' => 'Исходящие e-mail', + 'Add or change currency rate' => 'Добавить или изменить курс валют', + 'Reference currency: %s' => 'Базовая валюта: %s', + 'Add custom filters' => 'Добавить пользовательские фильтры', + 'Export' => 'Экспорт', + 'Add link label' => 'Добавить связь в задаче', + 'Incompatible Plugins' => 'Несовместимые плагины', + 'Compatibility' => 'Совместимость', + 'Permissions and ownership' => 'Разрешения и владение проектом', + 'Priorities' => 'Приоритеты', + 'Close this window' => 'Закрыть окно', + 'Unable to upload this file.' => 'Не удаётся загрузить файл.', + 'Import tasks' => 'Импорт задач', + 'Choose a project' => 'Выберите проект', + 'Profile' => 'Профиль', + 'Application role' => 'Роль в приложении', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + 'There is no custom filter.' => 'Пользовательские фильтры отсутствуют.', + 'New User' => 'Добавление пользователя', + 'Authentication' => 'Данные входа', + 'If checked, this user will use a third-party system for authentication.' => 'Если включено, то пользователь будет использовать стороннюю систему для авторизации.', + 'The password is necessary only for local users.' => 'Пароль необходим только для локальных пользователей', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + 'Invite people' => 'Приглашение пользователей', + 'Emails' => 'Адреса e-mail', + 'Enter one email address by line.' => 'Вводите по одному e-mail на строку.', + 'Add these people to this project' => 'Добавить приглашенных в проект', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + 'New user' => 'Добавить пользователя', + // 'This username is already taken' => '', ); diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php index 470e3390..bee83a94 100644 --- a/app/Locale/sr_Latn_RS/translations.php +++ b/app/Locale/sr_Latn_RS/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d zadataka na tabli', '%d tasks in total' => '%d zadataka ukupno', 'Unable to update this board.' => 'Nemogu da ažuriram ovu tablu.', - 'Edit board' => 'Izmeni tablu', 'Disable' => 'Onemogući', 'Enable' => 'Omogući', 'New project' => 'Novi projekat', @@ -72,7 +71,6 @@ return array( 'Title' => 'Naslov', 'Assigned to %s' => 'Dodeljen korisniku %s', 'Remove a column' => 'Ukloni kolonu', - 'Remove a column from a board' => 'Ukloni kolonu sa table', 'Unable to remove this column.' => 'Nemoguće uklanjanje kolone.', 'Do you really want to remove this column: "%s"?' => 'Da li zaista želiš da ukoniš ovu kolonu: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Ova akcija BRIŠE SVE ZADATKE vezane za ovu kolonu!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Broj zadataka', 'User' => 'Korisnik', 'Comments' => 'Komentari', - 'Leave a comment' => 'Ostavi komentar', 'Comment is required' => 'Komentar je obavezan', - 'Leave a description' => 'Dodaj opis', 'Comment added successfully.' => 'Komentar uspešno ostavljen', 'Unable to create your comment.' => 'Nemoguće kreiranje komentara', 'Due Date' => 'Termin', @@ -224,7 +220,6 @@ return array( 'Search' => 'Traži', 'Nothing found.' => 'Ništa nije pronađeno', 'Due date' => 'Termin', - 'Others formats accepted: %s and %s' => 'Ostali formati: %s i %s', 'Description' => 'Opis', '%d comments' => '%d Komentara', '%d comment' => '%d Komentar', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Kreirao %s', 'Tasks Export' => 'Izvoz zadataka', 'Start Date' => 'Početni datum', - 'End Date' => 'Krajni datum', 'Execute' => 'Izvrši', 'Task Id' => 'Identifikator Zadatka', 'Creator' => 'Autor', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Udaljno', 'Enabled' => 'Omogući', 'Disabled' => 'Onemogući', - 'Username:' => 'Korisničko ime:', - 'Name:' => 'Ime i Prezime', + 'Login:' => 'Korisničko ime:', + 'Full Name:' => 'Ime i Prezime', 'Email:' => 'Email: ', 'Notifications:' => 'Obaveštenja: ', 'Notifications' => 'Obaveštenja', @@ -516,10 +510,8 @@ return array( // 'Link labels' => '', // 'Link modification' => '', // 'Links' => '', - // 'Link settings' => '', // 'Opposite label' => '', // 'Remove a link' => '', - // 'Task\'s links' => '', // 'The labels must be different' => '', // 'There is no link.' => '', // 'This label must be unique' => '', @@ -552,7 +544,6 @@ return array( // 'Compact view' => '', // 'Horizontal scrolling' => '', // 'Compact/wide view' => '', - // 'No results match:' => '', // 'Currency' => '', // 'Private project' => '', // 'AUD - Australian Dollar' => '', @@ -566,6 +557,7 @@ return array( // 'JPY - Japanese Yen' => '', // 'NZD - New Zealand Dollar' => '', // 'RSD - Serbian dinar' => '', + // 'CNY - Chinese Yuan' => '', // 'USD - US Dollar' => '', // 'Destination column' => '', // 'Move the task to another column when assigned to a user' => '', @@ -580,7 +572,6 @@ return array( // 'Currency rates' => '', // 'Rate' => '', // 'Change reference currency' => '', - // 'Add a new currency rate' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -702,7 +693,6 @@ return array( // '<30m' => '', // 'Stop timer' => '', // 'Start timer' => '', - // 'Add project member' => '', // 'My activity stream' => '', // 'My calendar' => '', // 'Search tasks' => '', @@ -757,8 +747,6 @@ return array( // 'Remote user' => '', // 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '', // 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '', - // 'New remote user' => '', - // 'New local user' => '', // 'Default task color' => '', // 'This feature does not work with all browsers.' => '', // 'There is no destination project available.' => '', @@ -852,7 +840,6 @@ return array( // 'Owner' => '', // 'Unread notifications' => '', // 'Notification methods:' => '', - // 'Import tasks from CSV file' => '', // 'Unable to read your file' => '', // '%d task(s) have been imported successfully.' => '', // 'Nothing have been imported!' => '', @@ -980,7 +967,6 @@ return array( // 'Project owner: ' => '', // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', // 'Project owner' => '', - // 'Those dates are useful for the project Gantt chart.' => '', // 'Private projects do not have users and groups management.' => '', // 'There is no project member.' => '', // 'Priority' => '', @@ -1037,7 +1023,6 @@ return array( // 'Started:' => '', // 'Moved:' => '', // 'Task #%d' => '', - // 'Date and time format' => '', // 'Time format' => '', // 'Start date: ' => '', // 'End date: ' => '', @@ -1051,9 +1036,7 @@ return array( // 'User disabled successfully.' => '', // 'Unable to disable this user.' => '', // 'All files have been uploaded successfully.' => '', - // 'View uploaded files' => '', // 'The maximum allowed file size is %sB.' => '', - // 'Choose files again' => '', // 'Drag and drop your files here' => '', // 'choose files' => '', // 'View profile' => '', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php index 2ec4fa82..ec6f75e1 100644 --- a/app/Locale/sv_SE/translations.php +++ b/app/Locale/sv_SE/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d uppgifter på tavlan', '%d tasks in total' => '%d uppgifter totalt', 'Unable to update this board.' => 'Kunde inte uppdatera tavlan', - 'Edit board' => 'Ändra tavlan', 'Disable' => 'Inaktivera', 'Enable' => 'Aktivera', 'New project' => 'Nytt projekt', @@ -72,7 +71,6 @@ return array( 'Title' => 'Titel', 'Assigned to %s' => 'Tilldelad %s', 'Remove a column' => 'Ta bort en kolumn', - 'Remove a column from a board' => 'Ta bort en kolumn från tavlan', 'Unable to remove this column.' => 'Kunde inte ta bort kolumnen.', 'Do you really want to remove this column: "%s"?' => 'Vill du verkligen ta bort kolumnen: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Denna åtgärd kommer att TA BORT ALLA uppgifter kopplade till kolumnen!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Antal uppgifter', 'User' => 'Användare', 'Comments' => 'Kommentarer', - 'Leave a comment' => 'Lämna en kommentar', 'Comment is required' => 'En kommentar måste lämnas', - 'Leave a description' => 'Lämna en beskrivning', 'Comment added successfully.' => 'Kommentaren har lagts till.', 'Unable to create your comment.' => 'Kommentaren kunde inte laddas upp.', 'Due Date' => 'Måldatum', @@ -224,7 +220,6 @@ return array( 'Search' => 'Sök', 'Nothing found.' => 'Inget kunde hittas.', 'Due date' => 'Måldatum', - 'Others formats accepted: %s and %s' => 'Andra format som accepteras: %s and %s', 'Description' => 'Beskrivning', '%d comments' => '%d kommentarer', '%d comment' => '%d kommentar', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'Skapad av %s', 'Tasks Export' => 'Exportera uppgifter', 'Start Date' => 'Startdatum', - 'End Date' => 'Slutdatum', 'Execute' => 'Utför', 'Task Id' => 'Uppgift ID', 'Creator' => 'Skapare', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Fjärr', 'Enabled' => 'Aktiverad', 'Disabled' => 'Inaktiverad', - 'Username:' => 'Användarnam:', - 'Name:' => 'Namn:', + 'Login:' => 'Användarnam:', + 'Full Name:' => 'Namn:', 'Email:' => 'E-post:', 'Notifications:' => 'Notiser:', 'Notifications' => 'Notiser', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Länketiketter', 'Link modification' => 'Länkändring', 'Links' => 'Länkar', - 'Link settings' => 'Länkinställningar', 'Opposite label' => 'Motpartslänk', 'Remove a link' => 'Ta bort en länk', - 'Task\'s links' => 'Uppgiftslänkar', 'The labels must be different' => 'Etiketterna måste vara olika', 'There is no link.' => 'Det finns ingen länk', 'This label must be unique' => 'Länken måste vara unik', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'Kompakt vy', 'Horizontal scrolling' => 'Horisontell scroll', 'Compact/wide view' => 'Kompakt/bred vy', - 'No results match:' => 'Inga matchande resultat', 'Currency' => 'Valuta', 'Private project' => 'Privat projekt', 'AUD - Australian Dollar' => 'AUD - Australiska dollar', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - Japanska Yen', 'NZD - New Zealand Dollar' => 'NZD - Nya Zeeländska Dollar', 'RSD - Serbian dinar' => 'RSD - Serbiska Dinarer', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - Amerikanska Dollar', 'Destination column' => 'Målkolumn', 'Move the task to another column when assigned to a user' => 'Flytta uppgiften till en annan kolumn när den tilldelats en användare', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'Valutakurser', 'Rate' => 'Kurs', 'Change reference currency' => 'Ändra referenskurs', - 'Add a new currency rate' => 'Lägg till ny valutakurs', 'Reference currency' => 'Referensvaluta', 'The currency rate have been added successfully.' => 'Valutakursen har lagts till.', 'Unable to add this currency rate.' => 'Kunde inte lägga till valutakursen.', @@ -702,7 +693,6 @@ return array( '<30m' => '<30m', 'Stop timer' => 'Stoppa timer', 'Start timer' => 'Starta timer', - 'Add project member' => 'Lägg till projektmedlem', 'My activity stream' => 'Min aktivitetsström', 'My calendar' => 'Min kalender', 'Search tasks' => 'Sök uppgifter', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'Extern användare', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Externa användares lösenord lagras inte i Kanboard-databasen, exempel: LDAP, Google och Github-konton.', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Om du aktiverar boxen "Tillåt inte loginformulär" kommer inloggningsuppgifter i formuläret att ignoreras.', - 'New remote user' => 'Ny extern användare', - 'New local user' => 'Ny lokal användare', 'Default task color' => 'Standardfärg för uppgifter', 'This feature does not work with all browsers.' => 'Denna funktion fungerar inte i alla webbläsare.', 'There is no destination project available.' => 'Det finns inget destinationsprojekt tillgängligt.', @@ -852,7 +840,6 @@ return array( // 'Owner' => '', // 'Unread notifications' => '', // 'Notification methods:' => '', - // 'Import tasks from CSV file' => '', // 'Unable to read your file' => '', // '%d task(s) have been imported successfully.' => '', // 'Nothing have been imported!' => '', @@ -980,7 +967,6 @@ return array( // 'Project owner: ' => '', // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', // 'Project owner' => '', - // 'Those dates are useful for the project Gantt chart.' => '', // 'Private projects do not have users and groups management.' => '', // 'There is no project member.' => '', // 'Priority' => '', @@ -1037,7 +1023,6 @@ return array( // 'Started:' => '', // 'Moved:' => '', // 'Task #%d' => '', - // 'Date and time format' => '', // 'Time format' => '', // 'Start date: ' => '', // 'End date: ' => '', @@ -1051,9 +1036,7 @@ return array( // 'User disabled successfully.' => '', // 'Unable to disable this user.' => '', // 'All files have been uploaded successfully.' => '', - // 'View uploaded files' => '', // 'The maximum allowed file size is %sB.' => '', - // 'Choose files again' => '', // 'Drag and drop your files here' => '', // 'choose files' => '', // 'View profile' => '', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php index 5e0912fc..dcd858d0 100644 --- a/app/Locale/th_TH/translations.php +++ b/app/Locale/th_TH/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d งานบนบอร์ด', '%d tasks in total' => '%d งานทั้งหมด', 'Unable to update this board.' => 'ไม่สามารถปรับปรุงบอร์ดได้.', - 'Edit board' => 'แก้ไขบอร์ด', 'Disable' => 'ปิดการทำงาน', 'Enable' => 'เปิดการทำงาน', 'New project' => 'โปรเจคใหม่', @@ -72,7 +71,6 @@ return array( 'Title' => 'หัวเรื่อง', 'Assigned to %s' => 'กำหนดให้ %s', 'Remove a column' => 'ลบคอลัมน์', - 'Remove a column from a board' => 'ลบคอลัมน์ออกจากบอร์ด', 'Unable to remove this column.' => 'ไม่สามารถลบคอลัมน์นี้', 'Do you really want to remove this column: "%s"?' => 'คุณต้องการลบคอลัมน์ « %s » ออกใช่หรือไม่?', 'This action will REMOVE ALL TASKS associated to this column!' => 'การกระทำนี้จะลบงานที่เกี่ยวข้องกับคอลัมน์นี้', @@ -160,9 +158,7 @@ return array( 'Task count' => 'นับงาน', 'User' => 'ผู้ใช้', 'Comments' => 'ความคิดเห็น', - 'Leave a comment' => 'ออกความคิดเห็น', 'Comment is required' => 'ต้องการความคิดเห็น', - 'Leave a description' => 'แสดงคำอธิบาย', 'Comment added successfully.' => 'เพิ่มความคิดเห็นเรียบร้อยแล้ว', 'Unable to create your comment.' => 'ไม่สามารถสร้างความคิดเห็น', 'Due Date' => 'วันที่ครบกำหนด', @@ -224,7 +220,6 @@ return array( 'Search' => 'ค้นหา', 'Nothing found.' => 'ค้นหาไม่พบ.', 'Due date' => 'วันที่ครบกำหนด', - 'Others formats accepted: %s and %s' => 'รูปแบบอื่นที่ได้รับการยอมรับ: %s และ %s', 'Description' => 'คำอธิบาย', '%d comments' => '%d ความคิดเห็น', '%d comment' => '%d ความคิดเห็น', @@ -298,7 +293,6 @@ return array( 'Created by %s' => 'สร้างโดย %s', 'Tasks Export' => 'ส่งออกงาน', 'Start Date' => 'เริ่มวันที่', - 'End Date' => 'สิ้นสุดวันที่', 'Execute' => 'ประมวลผล', 'Task Id' => 'งาน ไอดี', 'Creator' => 'ผู้สร้าง', @@ -342,8 +336,8 @@ return array( 'Remote' => 'รีโมท', 'Enabled' => 'เปิดการใช้', 'Disabled' => 'ปิดการใช้', - 'Username:' => 'ชื่อผู้ใช้:', - 'Name:' => 'ชื่อ:', + 'Login:' => 'ชื่อผู้ใช้:', + 'Full Name:' => 'ชื่อ:', 'Email:' => 'อีเมล:', 'Notifications:' => 'แจ้งเตือน:', 'Notifications' => 'การแจ้งเตือน', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'ป้ายลิงค์', 'Link modification' => 'แก้ไขลิงค์', 'Links' => 'ลิงค์', - 'Link settings' => 'ตั้งค่าลิงค์', 'Opposite label' => 'ป้ายชื่อตรงข้าม', 'Remove a link' => 'ลบลิงค์', - 'Task\'s links' => 'ลิงค์', 'The labels must be different' => 'ป้ายชื่อต้องต่างกัน', 'There is no link.' => 'ไม่มีลิงค์', 'This label must be unique' => 'ป้ายชื่อต้องไม่ซ้ำกัน', @@ -552,7 +544,6 @@ return array( 'Compact view' => 'มุมมองพอดี', 'Horizontal scrolling' => 'เลื่อนตามแนวนอน', 'Compact/wide view' => 'พอดี/กว้าง มุมมอง', - 'No results match:' => 'ไม่มีผลลัพท์ที่ตรง', 'Currency' => 'สกุลเงิน', 'Private project' => 'โปรเจคส่วนตัว', 'AUD - Australian Dollar' => 'AUD - ดอลลาร์ออสเตรเลีย', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => 'JPY - เยน', 'NZD - New Zealand Dollar' => 'NZD - ดอลลาร์นิวซีแลนด์', 'RSD - Serbian dinar' => 'RSD - ดีนาร์เซอร์เบีย', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD - ดอลลาร์สหรัฐ', 'Destination column' => 'คอลัมน์เป้าหมาย', 'Move the task to another column when assigned to a user' => 'ย้ายงานไปคอลัมน์อื่นเมื่อกำหนดบุคคลรับผิดชอบ', @@ -580,7 +572,6 @@ return array( 'Currency rates' => 'อัตราค่าเงิน', 'Rate' => 'อัตรา', 'Change reference currency' => 'เปลี่ยนการอ้างถึงค่าเงิน', - 'Add a new currency rate' => 'เพิ่มอัตราค่าเงินใหม่', 'Reference currency' => 'อ้างถึงค่าเงิน', 'The currency rate have been added successfully.' => 'เพิ่มอัตราค่าเงินเรียบร้อย', 'Unable to add this currency rate.' => 'ไม่สามารถเพิ่มค่าเงินนี้', @@ -702,7 +693,6 @@ return array( '<30m' => '<30นาที', 'Stop timer' => 'หยุดจับเวลา', 'Start timer' => 'เริ่มจับเวลา', - 'Add project member' => 'เพิ่มสมาชิกโปรเจค', 'My activity stream' => 'กิจกรรมที่เกิดขึ้นของฉัน', 'My calendar' => 'ปฎิทินของฉัน', 'Search tasks' => 'ค้นหางาน', @@ -757,8 +747,6 @@ return array( 'Remote user' => 'ผู้ใช้รีโมท', // 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '', // 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '', - 'New remote user' => 'เพิ่มผู้ใช้รีโมทใหม่', - 'New local user' => 'เพิ่มผู้ใช้ท้องถิ่นใหม่', 'Default task color' => 'สีเริ่มต้นของงาน', 'This feature does not work with all browsers.' => 'คุณลักษณะนี้ไม่สามารถทำงานได้ทุกเบราเซอร์', // 'There is no destination project available.' => '', @@ -852,7 +840,6 @@ return array( 'Owner' => 'เจ้าของ', 'Unread notifications' => 'การแจ้งเตือนยังไม่ได้อ่าน', 'Notification methods:' => 'ลักษณะการแจ้งเตือน:', - 'Import tasks from CSV file' => 'นำเข้างานจากไฟล์ CSV', 'Unable to read your file' => 'ไม่สามารถอ่านไฟล์ของคุณ', '%d task(s) have been imported successfully.' => '%d งานนำเข้าเรียบร้อย', 'Nothing have been imported!' => 'ไม่มีอะไรถูกนำเข้า', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => 'เจ้าของโปรเจค: ', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'ตัวบ่งชี้โปรโจคเป็นตัวเลือกเสริมและต้องเป็นตัวอักษรหรือตัวเลข ตัวอย่าง: MYPROJECT', 'Project owner' => 'เจ้าของโปรเจค', - 'Those dates are useful for the project Gantt chart.' => 'วันที่ใช้สำหรับแผนภูมิแกรนท์ของโปรเจค', 'Private projects do not have users and groups management.' => 'โปรเจคส่วนตัวไม่มีการจัดการผู้ใช้และกลุ่ม', 'There is no project member.' => 'ไม่มีสมาชิกโปรเจค', 'Priority' => 'ความสำคัญ', @@ -1037,7 +1023,6 @@ return array( 'Started:' => 'เริ่ม:', 'Moved:' => 'ย้าย:', 'Task #%d' => 'งานที่ #%d', - 'Date and time format' => 'รูปแบบของวันเวลา', 'Time format' => 'รูปแบบของเวลา', 'Start date: ' => 'เริ่มวันที่:', 'End date: ' => 'จบวันที่:', @@ -1051,9 +1036,7 @@ return array( // 'User disabled successfully.' => '', // 'Unable to disable this user.' => '', // 'All files have been uploaded successfully.' => '', - // 'View uploaded files' => '', // 'The maximum allowed file size is %sB.' => '', - // 'Choose files again' => '', // 'Drag and drop your files here' => '', // 'choose files' => '', // 'View profile' => '', @@ -1163,7 +1146,6 @@ return array( // 'Email sender address' => '', // 'Email transport' => '', // 'Webhook token' => '', - // 'Imports' => '', // 'Project tags management' => '', // 'Tag created successfully.' => '', // 'Unable to create this tag.' => '', @@ -1210,8 +1192,6 @@ return array( // 'Activity stream for %s' => '', // 'Calendar for %s' => '', // 'Notifications for %s' => '', - // 'Subtasks export' => '', - // 'Tasks exportation' => '', // 'Assign a color when the task is moved to a specific swimlane' => '', // 'Assign a priority when the task is moved to a specific swimlane' => '', // 'User unlocked successfully.' => '', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php index 6858f4e7..85a667a6 100644 --- a/app/Locale/tr_TR/translations.php +++ b/app/Locale/tr_TR/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '%d görev bu panoda', '%d tasks in total' => '%d görev toplam', 'Unable to update this board.' => 'Bu pano güncellenemiyor.', - 'Edit board' => 'Panoyu düzenle', 'Disable' => 'Devre dışı bırak', 'Enable' => 'Etkinleştir', 'New project' => 'Yeni proje', @@ -72,7 +71,6 @@ return array( 'Title' => 'Başlık', 'Assigned to %s' => '%s kullanıcısına atanmış', 'Remove a column' => 'Bir sütunu sil', - 'Remove a column from a board' => 'Panodan bir sütunu sil', 'Unable to remove this column.' => 'Bu sütun silinemiyor.', 'Do you really want to remove this column: "%s"?' => 'Bu sütunu gerçekten silmek istiyor musunuz: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Bu komut sütun içindeki TÜM GÖREVLERİ silecek!', @@ -160,9 +158,7 @@ return array( 'Task count' => 'Görev sayısı', 'User' => 'Kullanıcı', 'Comments' => 'Yorumlar', - 'Leave a comment' => 'Bir yorum ekle', 'Comment is required' => 'Yorum gerekli', - 'Leave a description' => 'Açıklama ekleyin', 'Comment added successfully.' => 'Yorum eklendi', 'Unable to create your comment.' => 'Yorumunuz oluşturulamadı', 'Due Date' => 'Bitiş Tarihi', @@ -224,7 +220,6 @@ return array( 'Search' => 'Ara', 'Nothing found.' => 'Hiçbir şey bulunamadı.', 'Due date' => 'Bitiş tarihi', - 'Others formats accepted: %s and %s' => 'Diğer kabul edilen formatlar: %s ve %s', 'Description' => 'Açıklama', '%d comments' => '%d yorum', '%d comment' => '%d yorum', @@ -298,7 +293,6 @@ return array( 'Created by %s' => '%s tarafından oluşturuldu', 'Tasks Export' => 'Görevleri dışa aktar', 'Start Date' => 'Başlangıç tarihi', - 'End Date' => 'Bitiş tarihi', 'Execute' => 'Gerçekleştir', 'Task Id' => 'Görev Kimliği', 'Creator' => 'Oluşturan', @@ -342,8 +336,8 @@ return array( 'Remote' => 'Uzak', 'Enabled' => 'Etkinleştirildi', 'Disabled' => 'Devre dışı bırakıldı', - 'Username:' => 'Kullanıcı adı', - 'Name:' => 'Ad', + 'Login:' => 'Kullanıcı adı', + 'Full Name:' => 'Ad', 'Email:' => 'E-posta', 'Notifications:' => 'Bildirimler:', 'Notifications' => 'Bildirimler', @@ -516,10 +510,8 @@ return array( 'Link labels' => 'Link etiketleri', 'Link modification' => 'Link değiştirme', 'Links' => 'Links', - 'Link settings' => 'Link ayarları', 'Opposite label' => 'Zıt etiket', 'Remove a link' => 'Bir link silmek', - 'Task\'s links' => 'Görevin linkleri', 'The labels must be different' => 'Etiketler farklı olmalı', 'There is no link.' => 'Hiç bir bağ yok', 'This label must be unique' => 'Bu etiket tek olmalı', @@ -552,30 +544,21 @@ return array( 'Compact view' => 'Ekrana sığdır', 'Horizontal scrolling' => 'Geniş görünüm', 'Compact/wide view' => 'Ekrana sığdır / Geniş görünüm', - 'No results match:' => 'Uygun sonuç bulunamadı', 'Currency' => 'Para birimi', 'Private project' => 'Özel proje', - // 'AUD - Australian Dollar' => '', - // 'CAD - Canadian Dollar' => '', - // 'CHF - Swiss Francs' => '', 'AUD - Australian Dollar' => 'AUD - Avustralya Doları', 'CAD - Canadian Dollar' => 'CAD - Kanada Doları', 'CHF - Swiss Francs' => 'CHF - İsviçre Frangı', 'Custom Stylesheet' => 'Özel Sitil Css', 'download' => 'indir', // 'EUR - Euro' => '', - // 'GBP - British Pound' => '', 'GBP - British Pound' => 'GBP - İngiliz Paund', - // 'INR - Indian Rupee' => '', - // 'JPY - Japanese Yen' => '', - // 'NZD - New Zealand Dollar' => '', - // 'RSD - Serbian dinar' => '', - // 'USD - US Dollar' => '', 'INR - Indian Rupee' => 'INR - Hint Rupesi', 'JPY - Japanese Yen' => 'JPY - Japon Yeni', 'NZD - New Zealand Dollar' => 'NZD - Yeni Zelanda Doları', + // 'RSD - Serbian dinar' => '', + // 'CNY - Chinese Yuan' => '', 'USD - US Dollar' => 'USD$ Amerikan Doları', - 'TRL - Turkish Lira' => 'TRL - Türk Lirası', 'Destination column' => 'Hedef Sütun', 'Move the task to another column when assigned to a user' => 'Bir kullanıcıya atandığında görevi başka bir sütuna taşı', 'Move the task to another column when assignee is cleared' => 'Atanmış kullanıcı kaldırıldığında görevi başka bir sütuna taşı', @@ -589,7 +572,6 @@ return array( 'Currency rates' => 'Döviz kurları', 'Rate' => 'Kurlar', 'Change reference currency' => 'Referans kur değiştir', - 'Add a new currency rate' => 'Yeni bir kur ekle', 'Reference currency' => 'Referans kur', 'The currency rate have been added successfully.' => 'Kur başarıyla eklendi', 'Unable to add this currency rate.' => 'Bu kur eklenemedi', @@ -614,7 +596,6 @@ return array( 'Add a screenshot' => 'Bir ekran görüntüsü ekle', 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Bir ekran görüntüsü alın ve buraya yapıştırmak için CTRL+V veya ⌘+V tuşlarına basın.', 'Screenshot uploaded successfully.' => 'Ekran görüntüsü başarıyla yüklendi', - // 'SEK - Swedish Krona' => '', 'SEK - Swedish Krona' => ' SEK - İsveç Kronu', 'Identifier' => 'Kimlik', 'Disable two factor authentication' => 'Çift-Kademeli doğrulamayı iptal et', @@ -712,7 +693,6 @@ return array( '<30m' => '<30dk', 'Stop timer' => 'Zamanlayıcıyı durdur', 'Start timer' => 'Zamanlayıcıyı başlat', - 'Add project member' => 'Proje üyesi ekle', 'My activity stream' => 'Olay akışım', 'My calendar' => 'Takvimim', 'Search tasks' => 'Görevleri ara', @@ -767,8 +747,6 @@ return array( 'Remote user' => 'Uzak kullanıcı', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Uzak kullanıcıların şifreleri Kanboard veritabanında saklanmaz, örnek: LDAP, Google ve Github hesapları', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Eğer giriş formuna erişimi engelleyi seçerseniz, giriş formuna girilen bilgiler gözardı edilir.', - 'New remote user' => 'Yeni uzak kullanıcı', - 'New local user' => 'Yeni yerel kullanıcı', 'Default task color' => 'Varsayılan görev rengi', 'This feature does not work with all browsers.' => 'Bu özellik tüm tarayıcılarla çalışmaz', 'There is no destination project available.' => 'Seçilebilecek hedef proje yok.', @@ -796,7 +774,6 @@ return array( 'Gantt chart' => 'Gantt diyagramı', 'People who are project managers' => 'Proje müdürü olan kişiler', 'People who are project members' => 'Proje üyesi olan kişiler', - // 'NOK - Norwegian Krone' => '', 'NOK - Norwegian Krone' => ' NOK - Norveç Kronu', 'Show this column' => 'Bu sütunu göster', 'Hide this column' => 'Bu sütunu gizle', @@ -863,7 +840,6 @@ return array( 'Owner' => 'Sahibi', 'Unread notifications' => 'Okunmamış bildirimler', 'Notification methods:' => 'Bildirim yöntemleri:', - 'Import tasks from CSV file' => 'CSV dosyasından görevleri içeri aktar', 'Unable to read your file' => 'Dosya okunamıyor', '%d task(s) have been imported successfully.' => '%d görev başarıyla içeri aktarıldı.', 'Nothing have been imported!' => 'Hiçbir şey içeri aktarılamadı!', @@ -961,7 +937,6 @@ return array( 'Estimated Time' => 'Tahmini süre', 'Actual Time' => 'Gerçekleşen süre', 'Estimated vs actual time' => 'Tahmini vs gerçekleşen süre', - // 'RUB - Russian Ruble' => '', 'RUB - Russian Ruble' => ' RUB - Rus Rublesi', 'Assign the task to the person who does the action when the column is changed' => 'Sütun değiştirildiği zaman görevi eylemi gerçekleştiren kişiye ata', 'Close a task in a specific column' => 'Belirli bir sütundaki görevi kapat', @@ -992,7 +967,6 @@ return array( 'Project owner: ' => 'Proje sahibi', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'Proje kodu opsiyoneldir ve alfanümerik olmalıdır, örneğin: PROJE1', 'Project owner' => 'Proje sahibi', - 'Those dates are useful for the project Gantt chart.' => 'Bu tarihler proje Gantt görünümü için gereklidir.', 'Private projects do not have users and groups management.' => '(Kişiye) Özel projelerde kullanıcı ve grup yönetimi yoktur.', 'There is no project member.' => 'Proje ekibi yok.', 'Priority' => 'Öncelik', @@ -1049,7 +1023,6 @@ return array( 'Started:' => 'Başlatıldı', 'Moved:' => 'Taşındı', 'Task #%d' => 'Görev #%d', - 'Date and time format' => 'Tarih ve saat formatı', 'Time format' => 'Saat formatı', 'Start date: ' => 'Başlangıç tarihi', 'End date: ' => 'Bitiş tarihi', @@ -1063,9 +1036,7 @@ return array( 'User disabled successfully.' => 'Kullanıcı başarıyla engellendi.', 'Unable to disable this user.' => 'Bu kullanıcı engellenemez.', 'All files have been uploaded successfully.' => 'Tüm dosyalar başarıyla yüklendi.', - 'View uploaded files' => 'Yüklenen dosyaları göster', 'The maximum allowed file size is %sB.' => 'Maksimum dosya büyüklüğü %s B.', - 'Choose files again' => 'Dosyaları tekrar seç', 'Drag and drop your files here' => 'Dosyalarınızı buraya sürükleyip bırakın', 'choose files' => 'dosyaları seç', 'View profile' => 'Profili göster', @@ -1094,7 +1065,7 @@ return array( 'Change subtask position' => 'Alt görev sırasını değiştir', 'This value must be greater than %d' => 'Bu değer %d den büyük olmalı', 'Another swimlane with the same name exists in the project' => 'Projede aynı isimli başka bir kulvar var', - 'Example: http://example.dediteknoloji.com/ (used to generate absolute URLs)' => 'Örneğin: http://ornek.dediteknoloji.com/ (sabit URLler oluşturmak için)', + 'Example: http://example.kanboard.net/ (used to generate absolute URLs)' => 'Örneğin: http://ornek.dediteknoloji.com/ (sabit URLler oluşturmak için)', 'Actions duplicated successfully.' => 'İşlemler başarıyla çoklandı.', 'Unable to duplicate actions.' => 'İşlemler çoklanamıyor.', 'Add a new action' => 'Yeni bir işlem ekle', @@ -1175,7 +1146,6 @@ return array( 'Email sender address' => 'E-posta gönderen adresi', 'Email transport' => 'E-posta taşıma', 'Webhook token' => 'Webhook token', - 'Imports' => 'İçe Aktarımlar', 'Project tags management' => 'Proje etiket yönetimi', 'Tag created successfully.' => 'Etiket başarıyla oluturuldu.', 'Unable to create this tag.' => 'Etiket oluşturulamıyor.', @@ -1222,8 +1192,6 @@ return array( 'Activity stream for %s' => '%s için akış', 'Calendar for %s' => '%s için takvim', 'Notifications for %s' => '%s için bildirimler', - 'Subtasks export' => 'Alt görev dışa aktar', - 'Tasks exportation' => 'Görev dışa aktar', 'Assign a color when the task is moved to a specific swimlane' => 'Görev bir kulvara taşındığında rengini değiştir', 'Assign a priority when the task is moved to a specific swimlane' => 'Görev bir kulvara taşındığında önceliğini değiştir', 'User unlocked successfully.' => 'Kullanıcı kilidi başarıyla kaldırıldı.', @@ -1290,15 +1258,6 @@ return array( 'Moving a task is not permitted' => 'Görev taşımaya izin verilmemiş', 'This value must be in the range %d to %d' => 'Bu değer şu aralıkta olmalı: "%d" "%d"', 'You are not allowed to move this task.' => 'Bu görevi taşımaya izniniz yok.', - // 'API User Access' => '', - // 'Preview' => '', - // 'Write' => '', - // 'Write your text in Markdown' => '', - // 'New External Task: %s' => '', - // 'No personal API access token registered.' => '', - // 'Your personal API access token is "%s"' => '', - // 'Remove your token' => '', - // 'Generate a new token' => '', 'API User Access' => 'API Kullanıcı Erişimi', 'Preview' => 'Öngörünüm', 'Write' => 'Yaz', @@ -1308,45 +1267,44 @@ return array( 'Your personal API access token is "%s"' => 'Kişisel API erişim belirteç-token ınız"%s"', 'Remove your token' => 'Belirteç-token ınızı kaldır', 'Generate a new token' => 'Yeni bir belirteç-token oluştur', - 'My future tasks' => 'Gelecekteki görevlerim', - 'There is no future task.' => 'Gelecekte bir görev yok.', - 'Future tasks for %s' => '%s için gelecekteki görevler', - 'Manage timetable' => 'Zaman çizelgesini yönet', - 'Timetable' => 'Zaman çizelgesi', - 'Day timetable' => 'Günlük zaman çizelgesi', - 'Week timetable' => 'Haftalık zaman çizelgesi', - 'Time off timetable' => 'Öğle tatili zaman çizelgesi', - 'Overtime timetable' => 'Mesai zaman çizelgesi', - 'From' => 'Başlangıç', - 'To' => 'den', - 'Start time' => 'Başlangıç zamanı', - 'End time' => 'Bitiş zamanı', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Bu zaman çizelgesi, "bütün gün" onay kutusu zamanlanmış kapalı ve fazla mesai için işaretlendiğinde kullanılır.', - 'Day' => 'Gün', - 'Monday' => 'Pazartesi', - 'Tuesday' => 'Salı', - 'Wednesday' => 'Çarşamba', - 'Thursday' => 'Perşembe', - 'Friday' => 'Cuma', - 'Saturday' => 'Cumartesi', - 'Sunday' => 'Pazar', - 'All day' => 'Tüm Gün', - 'Comment' => 'Açıklama', - 'Hourly rate' => 'Saatlik ücret', - 'Effective date' => 'Yürürlük tarihi', - 'Add new rate' => 'Yeni ücret ekle', - 'Show Google Avatar' => 'Google Avatarını Göster', - 'User (Optional)' => 'Kullanıcı (İsteğe Bağlı)', - 'Help on RocketChat integration' => 'RocketChat entegrasyonu hakkında yardım', - 'SMS Two-Factor Authentication' => 'Çift-Kademeli SMS Kimlik Doğrulama', - 'Phone Number' => 'Telefon Numarası', - 'Channel/Group/User (Optional)' => 'Kanal / Grup / Kullanıcı (İsteğe Bağlı)', - 'Help on Slack integration' => 'Slack entegrasyonu hakkında yardım', - 'OAuth2 Account' => 'OAuth2 Hesabı', - 'Link OAuth2 account' => 'OAuth2 hesabını bağla', - 'Unlink OAuth2 account' => 'OAuth2 hesabmla bağı kaldır', - 'Key' => 'Anahtar', - 'Value' => 'Değer', - 'Add Metadata' => 'Yeni Metadata Ekle', + // 'Showing %d-%d of %d' => '', + // 'Outgoing Emails' => '', 'Add or change currency rate' => 'Kur Oranını ekle veya değiştir', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php index c87adbec..0f91e29f 100644 --- a/app/Locale/zh_CN/translations.php +++ b/app/Locale/zh_CN/translations.php @@ -61,7 +61,6 @@ return array( '%d tasks on the board' => '看板目前有%d个任务', '%d tasks in total' => '总共有%d个任务', 'Unable to update this board.' => '无法更新该看板。', - 'Edit board' => '修改看板', 'Disable' => '停用', 'Enable' => '启用', 'New project' => '新建项目', @@ -72,7 +71,6 @@ return array( 'Title' => '标题', 'Assigned to %s' => '指派给 %s', 'Remove a column' => '移除一个栏目', - 'Remove a column from a board' => '从看板移除一个栏目', 'Unable to remove this column.' => '无法移除该栏目。', 'Do you really want to remove this column: "%s"?' => '确定要移除栏目"%s"吗?', 'This action will REMOVE ALL TASKS associated to this column!' => '该动作将移除与该栏目相关的所有项目!', @@ -160,9 +158,7 @@ return array( 'Task count' => '任务数', 'User' => '用户', 'Comments' => '评论', - 'Leave a comment' => '留言', 'Comment is required' => '必须得有评论', - 'Leave a description' => '给一个描述', 'Comment added successfully.' => '评论成功添加。', 'Unable to create your comment.' => '无法创建评论。', 'Due Date' => '到期时间', @@ -224,7 +220,6 @@ return array( 'Search' => '查找', 'Nothing found.' => '没找到。', 'Due date' => '到期时间', - 'Others formats accepted: %s and %s' => '可以使用的其它格式:%s 和 %s', 'Description' => '描述', '%d comments' => '%d个评论', '%d comment' => '%d个评论', @@ -298,7 +293,6 @@ return array( 'Created by %s' => '创建者:%s', 'Tasks Export' => '任务导出', 'Start Date' => '开始时间', - 'End Date' => '结束时间', 'Execute' => '执行', 'Task Id' => '任务ID', 'Creator' => '创建者', @@ -342,8 +336,8 @@ return array( 'Remote' => '远程', 'Enabled' => '启用', 'Disabled' => '停用', - 'Username:' => '用户名:', - 'Name:' => '姓名:', + 'Login:' => '用户名:', + 'Full Name:' => '姓名:', 'Email:' => '电子邮件:', 'Notifications:' => '通知:', 'Notifications' => '通知', @@ -516,10 +510,8 @@ return array( 'Link labels' => '关联标签', 'Link modification' => '关联修改', 'Links' => '关联', - 'Link settings' => '关联设置', 'Opposite label' => '反向标签', 'Remove a link' => '删除关联', - 'Task\'s links' => '任务的关联', 'The labels must be different' => '标签不能一样', 'There is no link.' => '当前没有关联', 'This label must be unique' => '关联必须唯一', @@ -552,7 +544,6 @@ return array( 'Compact view' => '紧凑视图', 'Horizontal scrolling' => '水平滚动', 'Compact/wide view' => '紧凑/宽视图', - 'No results match:' => '无匹配结果:', 'Currency' => '货币', 'Private project' => '私人项目', 'AUD - Australian Dollar' => '澳元', @@ -566,6 +557,7 @@ return array( 'JPY - Japanese Yen' => '日元', 'NZD - New Zealand Dollar' => '新西兰元', 'RSD - Serbian dinar' => '第纳尔', + 'CNY - Chinese Yuan' => '人民币', 'USD - US Dollar' => '美元', 'Destination column' => '目标栏目', 'Move the task to another column when assigned to a user' => '指定负责人时移动到其它栏目', @@ -580,7 +572,6 @@ return array( 'Currency rates' => '汇率', 'Rate' => '汇率', 'Change reference currency' => '修改参考货币', - 'Add a new currency rate' => '添加新汇率', 'Reference currency' => '参考货币', 'The currency rate have been added successfully.' => '成功添加汇率。', 'Unable to add this currency rate.' => '无法添加此汇率', @@ -702,7 +693,6 @@ return array( '<30m' => '小于30分钟', 'Stop timer' => '停止计时器', 'Start timer' => '开启计时器', - 'Add project member' => '添加项目成员', 'My activity stream' => '我的活动流', 'My calendar' => '我的日程表', 'Search tasks' => '搜索任务', @@ -757,8 +747,6 @@ return array( 'Remote user' => '远程用户', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '远程用户不会在看板数据库保存密码,例如:LDAP,GOOGLE,GitHub。', 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '如果选中“禁止登陆来自”,登陆表单内的验证信息将被忽略。', - 'New remote user' => '新加远程用户', - 'New local user' => '新加本地用户', 'Default task color' => '默认任务颜色', 'This feature does not work with all browsers.' => '本功能只在部分浏览器下工作正常。', 'There is no destination project available.' => '当前没有目标项目可用', @@ -852,7 +840,6 @@ return array( 'Owner' => '所有人', 'Unread notifications' => '未读通知', 'Notification methods:' => '通知提醒方式:', - 'Import tasks from CSV file' => '从CSV文件导入任务', 'Unable to read your file' => '无法读取文件', '%d task(s) have been imported successfully.' => '成功导入%d条任务。', 'Nothing have been imported!' => '没有信息被导入!', @@ -980,7 +967,6 @@ return array( 'Project owner: ' => '项目负责人', 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '项目标识符是可选的,且只能是数字或字母组成,例如:MYPROJECT。', 'Project owner' => '项目负责人', - 'Those dates are useful for the project Gantt chart.' => '那些时间对于项目甘特图非常有用', 'Private projects do not have users and groups management.' => '私有项目下没有成员或组可管理', 'There is no project member.' => '当前没有项目成员', 'Priority' => '优先级', @@ -1037,7 +1023,6 @@ return array( 'Started:' => '已开始:', 'Moved:' => '已移走', 'Task #%d' => '任务#%d', - 'Date and time format' => '时间和日期格式', 'Time format' => '时间格式', 'Start date: ' => '开始时间:', 'End date: ' => '结束时间:', @@ -1051,9 +1036,7 @@ return array( 'User disabled successfully.' => '用户已禁用。', 'Unable to disable this user.' => '无法禁用该用户。', 'All files have been uploaded successfully.' => '所有文件已成功上传。', - 'View uploaded files' => '查看已上传文件', 'The maximum allowed file size is %sB.' => '最大上传尺寸 %sB', - 'Choose files again' => '重新选择文件', 'Drag and drop your files here' => '拖放文件到这里', 'choose files' => '选择文件', 'View profile' => '查看个人信息', @@ -1163,7 +1146,6 @@ return array( 'Email sender address' => '邮件发送地址', 'Email transport' => '邮件转发', 'Webhook token' => 'Web钩子Token', - 'Imports' => '导入', 'Project tags management' => '项目标签管理', 'Tag created successfully.' => '成功创建标签。', 'Unable to create this tag.' => '无法创建此标签。', @@ -1210,8 +1192,6 @@ return array( 'Activity stream for %s' => '%s的活动足迹', 'Calendar for %s' => '%s的日历', 'Notifications for %s' => '%s的通知', - 'Subtasks export' => '子任务导出', - 'Tasks exportation' => '任务导出', 'Assign a color when the task is moved to a specific swimlane' => '当任务移动到指定里程碑时标记颜色', 'Assign a priority when the task is moved to a specific swimlane' => '当任务移动到指定里程碑时标记优先级', 'User unlocked successfully.' => '用户解锁成功。', @@ -1287,4 +1267,44 @@ return array( // 'Your personal API access token is "%s"' => '', // 'Remove your token' => '', // 'Generate a new token' => '', + 'Showing %d-%d of %d' => '本页显示 %d-%d 条,共有: %d 条', + // 'Outgoing Emails' => '', + // 'Add or change currency rate' => '', + // 'Reference currency: %s' => '', + // 'Add custom filters' => '', + // 'Export' => '', + // 'Add link label' => '', + // 'Incompatible Plugins' => '', + // 'Compatibility' => '', + // 'Permissions and ownership' => '', + // 'Priorities' => '', + // 'Close this window' => '', + // 'Unable to upload this file.' => '', + // 'Import tasks' => '', + // 'Choose a project' => '', + // 'Profile' => '', + // 'Application role' => '', + // '%d invitations were sent.' => '', + // '%d invitation was sent.' => '', + // 'Unable to create this user.' => '', + // 'Kanboard Invitation' => '', + // 'Visible on dashboard' => '', + // 'Created at:' => '', + // 'Updated at:' => '', + // 'There is no custom filter.' => '', + // 'New User' => '', + // 'Authentication' => '', + // 'If checked, this user will use a third-party system for authentication.' => '', + // 'The password is necessary only for local users.' => '', + // 'You have been invited to register on Kanboard.' => '', + // 'Click here to join your team' => '', + // 'Invite people' => '', + // 'Emails' => '', + // 'Enter one email address by line.' => '', + // 'Add these people to this project' => '', + // 'Add this person to this project' => '', + // 'Sign-up' => '', + // 'Credentials' => '', + // 'New user' => '', + // 'This username is already taken' => '', ); diff --git a/app/Model/CommentModel.php b/app/Model/CommentModel.php index a9e48bd3..e44a5ecd 100644 --- a/app/Model/CommentModel.php +++ b/app/Model/CommentModel.php @@ -60,6 +60,7 @@ class CommentModel extends Base ->columns( self::TABLE.'.id', self::TABLE.'.date_creation', + self::TABLE.'.date_modification', self::TABLE.'.task_id', self::TABLE.'.user_id', self::TABLE.'.comment', @@ -69,7 +70,7 @@ class CommentModel extends Base UserModel::TABLE.'.avatar_path' ) ->join(UserModel::TABLE, 'id', 'user_id') - ->orderBy(self::TABLE.'.date_creation', $sorting) + ->orderBy(self::TABLE.'.date_modification', $sorting) ->eq(self::TABLE.'.task_id', $task_id) ->findAll(); } @@ -90,6 +91,7 @@ class CommentModel extends Base self::TABLE.'.task_id', self::TABLE.'.user_id', self::TABLE.'.date_creation', + self::TABLE.'.date_modification', self::TABLE.'.comment', self::TABLE.'.reference', UserModel::TABLE.'.username', @@ -127,6 +129,7 @@ class CommentModel extends Base public function create(array $values) { $values['date_creation'] = time(); + $values['date_modification'] = time(); $comment_id = $this->db->table(self::TABLE)->persist($values); if ($comment_id !== false) { @@ -148,7 +151,7 @@ class CommentModel extends Base $result = $this->db ->table(self::TABLE) ->eq('id', $values['id']) - ->update(array('comment' => $values['comment'])); + ->update(array('comment' => $values['comment'], 'date_modification' => time())); if ($result) { $this->queueManager->push($this->commentEventJob->withParams($values['id'], self::EVENT_UPDATE)); diff --git a/app/Model/CurrencyModel.php b/app/Model/CurrencyModel.php index a097cb34..55a5b2fe 100644 --- a/app/Model/CurrencyModel.php +++ b/app/Model/CurrencyModel.php @@ -42,6 +42,7 @@ class CurrencyModel extends Base 'NOK' => t('NOK - Norwegian Krone'), 'BAM' => t('BAM - Konvertible Mark'), 'RUB' => t('RUB - Russian Ruble'), + 'CNY' => t('CNY - Chinese Yuan'), 'TRL' => t('TRL - Turkish Lira'), ); } diff --git a/app/Model/FileModel.php b/app/Model/FileModel.php index 98032f9d..b5852b08 100644 --- a/app/Model/FileModel.php +++ b/app/Model/FileModel.php @@ -210,9 +210,7 @@ abstract class FileModel extends Base */ public function isImage($filename) { - $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); - - switch ($extension) { + switch (get_file_extension($filename)) { case 'jpeg': case 'jpg': case 'png': diff --git a/app/Model/InviteModel.php b/app/Model/InviteModel.php new file mode 100644 index 00000000..13d75f69 --- /dev/null +++ b/app/Model/InviteModel.php @@ -0,0 +1,73 @@ +<?php + +namespace Kanboard\Model; + +use Kanboard\Core\Base; +use Kanboard\Core\Security\Token; + +/** + * Class InviteModel + * + * @package Kanboard\Model + * @author Frederic Guillot + */ +class InviteModel extends Base +{ + const TABLE = 'invites'; + + public function createInvites(array $emails, $projectId) + { + $emails = array_unique($emails); + $nb = 0; + + foreach ($emails as $email) { + $email = trim($email); + + if (! empty($email) && $this->createInvite($email, $projectId)) { + $nb++; + } + } + + return $nb; + } + + protected function createInvite($email, $projectId) + { + $values = array( + 'email' => $email, + 'project_id' => $projectId, + 'token' => Token::getToken(), + ); + + if ($this->db->table(self::TABLE)->insert($values)) { + $this->sendInvite($values); + return true; + } + + return false; + } + + protected function sendInvite(array $values) + { + $this->emailClient->send( + $values['email'], + $values['email'], + e('Kanboard Invitation'), + $this->template->render('user_invite/email', array('token' => $values['token'])) + ); + } + + public function getByToken($token) + { + return $this->db->table(self::TABLE) + ->eq('token', $token) + ->findOne(); + } + + public function remove($email) + { + return $this->db->table(self::TABLE) + ->eq('email', $email) + ->remove(); + } +} diff --git a/app/Schema/Mysql.php b/app/Schema/Mysql.php index fac8688a..7771440e 100644 --- a/app/Schema/Mysql.php +++ b/app/Schema/Mysql.php @@ -6,7 +6,27 @@ use PDO; use Kanboard\Core\Security\Token; use Kanboard\Core\Security\Role; -const VERSION = 118; +const VERSION = 120; + +function version_120(PDO $pdo) +{ + $pdo->exec(" + CREATE TABLE invites ( + email VARCHAR(255) NOT NULL, + project_id INTEGER NOT NULL, + token VARCHAR(255) NOT NULL, + PRIMARY KEY(email, token) + ) ENGINE=InnoDB CHARSET=utf8 + "); + + $pdo->exec("DELETE FROM settings WHERE `option`='application_datetime_format'"); +} + +function version_119(PDO $pdo) +{ + $pdo->exec('ALTER TABLE `comments` ADD COLUMN `date_modification` BIGINT(20)'); + $pdo->exec('UPDATE `comments` SET `date_modification` = `date_creation` WHERE `date_modification` IS NULL'); +} function version_118(PDO $pdo) { @@ -63,9 +83,9 @@ function version_113(PDO $pdo) $pdo->exec(" CREATE TABLE project_has_roles ( role_id INT NOT NULL AUTO_INCREMENT, - role VARCHAR(255) NOT NULL, + `role` VARCHAR(255) NOT NULL, project_id INT NOT NULL, - UNIQUE(project_id, role), + UNIQUE(project_id, `role`), FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE, PRIMARY KEY(role_id) ) ENGINE=InnoDB CHARSET=utf8 diff --git a/app/Schema/Postgres.php b/app/Schema/Postgres.php index 32a7a744..8054340c 100644 --- a/app/Schema/Postgres.php +++ b/app/Schema/Postgres.php @@ -6,7 +6,27 @@ use PDO; use Kanboard\Core\Security\Token; use Kanboard\Core\Security\Role; -const VERSION = 97; +const VERSION = 99; + +function version_99(PDO $pdo) +{ + $pdo->exec(" + CREATE TABLE invites ( + email VARCHAR(255) NOT NULL, + project_id INTEGER NOT NULL, + token VARCHAR(255) NOT NULL, + PRIMARY KEY(email, token) + ) + "); + + $pdo->exec("DELETE FROM settings WHERE \"option\"='application_datetime_format'"); +} + +function version_98(PDO $pdo) +{ + $pdo->exec('ALTER TABLE "comments" ADD COLUMN date_modification BIGINT'); + $pdo->exec('UPDATE "comments" SET date_modification = date_creation WHERE date_modification IS NULL'); +} function version_97(PDO $pdo) { diff --git a/app/Schema/Sql/mysql.sql b/app/Schema/Sql/mysql.sql index 0ee88d88..487560f3 100644 --- a/app/Schema/Sql/mysql.sql +++ b/app/Schema/Sql/mysql.sql @@ -100,6 +100,7 @@ CREATE TABLE `comments` ( `date_creation` bigint(20) DEFAULT NULL, `comment` text, `reference` varchar(50) DEFAULT '', + `date_modification` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `comments_reference_idx` (`reference`), @@ -157,6 +158,16 @@ CREATE TABLE `groups` ( UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `invites`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `invites` ( + `email` varchar(255) NOT NULL, + `project_id` int(11) NOT NULL, + `token` varchar(255) NOT NULL, + PRIMARY KEY (`email`,`token`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `last_logins`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -739,7 +750,7 @@ CREATE TABLE `users` ( LOCK TABLES `settings` WRITE; /*!40000 ALTER TABLE `settings` DISABLE KEYS */; -INSERT INTO `settings` VALUES ('api_token','f149956cb60c88d01123a28964fc035b1ce4513be454f2a85fe6b4ca3758',0,0),('application_currency','USD',0,0),('application_date_format','m/d/Y',0,0),('application_language','en_US',0,0),('application_stylesheet','',0,0),('application_timezone','UTC',0,0),('application_url','',0,0),('board_columns','',0,0),('board_highlight_period','172800',0,0),('board_private_refresh_interval','10',0,0),('board_public_refresh_interval','60',0,0),('calendar_project_tasks','date_started',0,0),('calendar_user_subtasks_time_tracking','0',0,0),('calendar_user_tasks','date_started',0,0),('cfd_include_closed_tasks','1',0,0),('default_color','yellow',0,0),('integration_gravatar','0',0,0),('password_reset','1',0,0),('project_categories','',0,0),('subtask_restriction','0',0,0),('subtask_time_tracking','1',0,0),('webhook_token','47d1d896b6612234c7543eb3f3a09a0a669f77a079d13ad3d810ccb79896',0,0),('webhook_url','',0,0); +INSERT INTO `settings` VALUES ('api_token','b428b1088a5ee28730a8405774084f7a35f27f2a218cdb63582f99c008ee',0,0),('application_currency','USD',0,0),('application_date_format','m/d/Y',0,0),('application_language','en_US',0,0),('application_stylesheet','',0,0),('application_timezone','UTC',0,0),('application_url','',0,0),('board_columns','',0,0),('board_highlight_period','172800',0,0),('board_private_refresh_interval','10',0,0),('board_public_refresh_interval','60',0,0),('calendar_project_tasks','date_started',0,0),('calendar_user_subtasks_time_tracking','0',0,0),('calendar_user_tasks','date_started',0,0),('cfd_include_closed_tasks','1',0,0),('default_color','yellow',0,0),('integration_gravatar','0',0,0),('password_reset','1',0,0),('project_categories','',0,0),('subtask_restriction','0',0,0),('subtask_time_tracking','1',0,0),('webhook_token','e0d3e2613a79f1d751135f4a4d6c3e5b869348db229e57f706b5b54fc3c7',0,0),('webhook_url','',0,0); /*!40000 ALTER TABLE `settings` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -768,4 +779,4 @@ UNLOCK TABLES; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -INSERT INTO users (username, password, role) VALUES ('admin', '$2y$10$R1zYk04d96KcHRpd9.r5I.5I6mgKIgUdsaISZYmaDLPIJCUO0FFJG', 'app-admin');INSERT INTO schema_version VALUES ('118'); +INSERT INTO users (username, password, role) VALUES ('admin', '$2y$10$R3.YibAi6H0ZzzrSHFa7qeaiEqep1X2TF/bKQX5jMQ7fZ9KIfzUte', 'app-admin');INSERT INTO schema_version VALUES ('120'); diff --git a/app/Schema/Sql/postgres.sql b/app/Schema/Sql/postgres.sql index 578b0c75..8c6b0dd8 100644 --- a/app/Schema/Sql/postgres.sql +++ b/app/Schema/Sql/postgres.sql @@ -196,7 +196,8 @@ CREATE TABLE "comments" ( "user_id" integer DEFAULT 0, "date_creation" bigint NOT NULL, "comment" "text", - "reference" character varying(50) DEFAULT ''::character varying + "reference" character varying(50) DEFAULT ''::character varying, + "date_modification" bigint ); @@ -304,6 +305,17 @@ ALTER SEQUENCE "groups_id_seq" OWNED BY "groups"."id"; -- +-- Name: invites; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE "invites" ( + "email" character varying(255) NOT NULL, + "project_id" integer NOT NULL, + "token" character varying(255) NOT NULL +); + + +-- -- Name: last_logins; Type: TABLE; Schema: public; Owner: - -- @@ -1605,6 +1617,14 @@ ALTER TABLE ONLY "groups" -- +-- Name: invites invites_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY "invites" + ADD CONSTRAINT "invites_pkey" PRIMARY KEY ("email", "token"); + + +-- -- Name: last_logins last_logins_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -2543,8 +2563,8 @@ INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('board_high INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('board_public_refresh_interval', '60', 0, 0); INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('board_private_refresh_interval', '10', 0, 0); INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('board_columns', '', 0, 0); -INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('webhook_token', 'b64911d9b61ea71adada348105281e16470e268fce7cb9bf1895958d4bbc', 0, 0); -INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('api_token', 'f63bd25c2e952d78b70f178fd96b4207ef29315ca73d308af37c02d8d51f', 0, 0); +INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('webhook_token', 'a41accd9dabc3d45a3d26de5edd5c43b3b0082cabebfbc7a175b8d6b2e5a', 0, 0); +INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('api_token', 'dbbf966938e4400746ebcb2337bb4a3cdce0bab2dd053d57dbbc243ccc9d', 0, 0); INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('application_language', 'en_US', 0, 0); INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('application_timezone', 'UTC', 0, 0); INSERT INTO settings (option, value, changed_by, changed_on) VALUES ('application_url', '', 0, 0); @@ -2613,4 +2633,4 @@ SELECT pg_catalog.setval('links_id_seq', 11, true); -- PostgreSQL database dump complete -- -INSERT INTO users (username, password, role) VALUES ('admin', '$2y$10$0.8BJyhOEBHGqfwD3nIJHuxObqTlZGJ/KRNDVHfSu7RGd42rEbSa.', 'app-admin');INSERT INTO schema_version VALUES ('97'); +INSERT INTO users (username, password, role) VALUES ('admin', '$2y$10$R3.YibAi6H0ZzzrSHFa7qeaiEqep1X2TF/bKQX5jMQ7fZ9KIfzUte', 'app-admin');INSERT INTO schema_version VALUES ('99'); diff --git a/app/Schema/Sqlite.php b/app/Schema/Sqlite.php index 11dcd537..87630b1a 100644 --- a/app/Schema/Sqlite.php +++ b/app/Schema/Sqlite.php @@ -6,7 +6,27 @@ use Kanboard\Core\Security\Token; use Kanboard\Core\Security\Role; use PDO; -const VERSION = 108; +const VERSION = 110; + +function version_110(PDO $pdo) +{ + $pdo->exec(" + CREATE TABLE invites ( + email TEXT NOT NULL, + project_id INTEGER NOT NULL, + token TEXT NOT NULL, + PRIMARY KEY(email, token) + ) + "); + + $pdo->exec("DELETE FROM settings WHERE \"option\"='application_datetime_format'"); +} + +function version_109(PDO $pdo) +{ + $pdo->exec('ALTER TABLE comments ADD COLUMN date_modification INTEGER'); + $pdo->exec('UPDATE comments SET date_modification = date_creation WHERE date_modification IS NULL;'); +} function version_108(PDO $pdo) { diff --git a/app/ServiceProvider/AuthenticationProvider.php b/app/ServiceProvider/AuthenticationProvider.php index 80882456..6a9a820e 100644 --- a/app/ServiceProvider/AuthenticationProvider.php +++ b/app/ServiceProvider/AuthenticationProvider.php @@ -88,7 +88,6 @@ class AuthenticationProvider implements ServiceProviderInterface $acl->add('ExportController', '*', Role::PROJECT_MANAGER); $acl->add('TaskFileController', array('screenshot', 'create', 'save', 'remove', 'confirm'), Role::PROJECT_MEMBER); $acl->add('TaskGanttController', '*', Role::PROJECT_MANAGER); - $acl->add('TaskGanttCreationController', '*', Role::PROJECT_MANAGER); $acl->add('ProjectViewController', array('share', 'updateSharing', 'integrations', 'updateIntegrations', 'notifications', 'updateNotifications', 'duplicate', 'doDuplication'), Role::PROJECT_MANAGER); $acl->add('ProjectPermissionController', '*', Role::PROJECT_MANAGER); $acl->add('ProjectEditController', '*', Role::PROJECT_MANAGER); @@ -137,6 +136,7 @@ class AuthenticationProvider implements ServiceProviderInterface $acl->add('ICalendarController', '*', Role::APP_PUBLIC); $acl->add('FeedController', '*', Role::APP_PUBLIC); $acl->add('AvatarFileController', array('show', 'image'), Role::APP_PUBLIC); + $acl->add('UserInviteController', array('signup', 'register'), Role::APP_PUBLIC); $acl->add('ConfigController', '*', Role::APP_ADMIN); $acl->add('TagController', '*', Role::APP_ADMIN); @@ -197,19 +197,19 @@ class AuthenticationProvider implements ServiceProviderInterface $acl->setRoleHierarchy(Role::PROJECT_MEMBER, array(Role::PROJECT_VIEWER)); $acl->add('ActionProcedure', array('removeAction', 'getActions', 'createAction'), Role::PROJECT_MANAGER); - $acl->add('CategoryProcedure', '*', Role::PROJECT_MANAGER); - $acl->add('ColumnProcedure', '*', Role::PROJECT_MANAGER); + $acl->add('CategoryProcedure', array('removeCategory', 'createCategory', 'updateCategory'), Role::PROJECT_MANAGER); + $acl->add('ColumnProcedure', array('updateColumn', 'addColumn', 'removeColumn', 'changeColumnPosition'), Role::PROJECT_MANAGER); $acl->add('CommentProcedure', array('removeComment', 'createComment', 'updateComment'), Role::PROJECT_MEMBER); - $acl->add('ProjectPermissionProcedure', '*', Role::PROJECT_MANAGER); + $acl->add('ProjectPermissionProcedure', array('addProjectUser', 'addProjectGroup', 'removeProjectUser', 'removeProjectGroup', 'changeProjectUserRole', 'changeProjectGroupRole'), Role::PROJECT_MANAGER); $acl->add('ProjectProcedure', array('updateProject', 'removeProject', 'enableProject', 'disableProject', 'enableProjectPublicAccess', 'disableProjectPublicAccess'), Role::PROJECT_MANAGER); - $acl->add('SubtaskProcedure', '*', Role::PROJECT_MEMBER); - $acl->add('SubtaskTimeTrackingProcedure', '*', Role::PROJECT_MEMBER); - $acl->add('SwimlaneProcedure', '*', Role::PROJECT_MANAGER); - $acl->add('ProjectFileProcedure', '*', Role::PROJECT_MEMBER); - $acl->add('TaskFileProcedure', '*', Role::PROJECT_MEMBER); - $acl->add('TaskLinkProcedure', '*', Role::PROJECT_MEMBER); + $acl->add('SubtaskProcedure', array('removeSubtask', 'createSubtask', 'updateSubtask'), Role::PROJECT_MEMBER); + $acl->add('SubtaskTimeTrackingProcedure', array('setSubtaskStartTime', 'setSubtaskEndTime'), Role::PROJECT_MEMBER); + $acl->add('SwimlaneProcedure', array('addSwimlane', 'updateSwimlane', 'removeSwimlane', 'disableSwimlane', 'enableSwimlane', 'changeSwimlanePosition'), Role::PROJECT_MANAGER); + $acl->add('ProjectFileProcedure', array('createProjectFile', 'removeProjectFile', 'removeAllProjectFiles'), Role::PROJECT_MEMBER); + $acl->add('TaskFileProcedure', array('createTaskFile', 'removeTaskFile', 'removeAllTaskFiles'), Role::PROJECT_MEMBER); + $acl->add('TaskLinkProcedure', array('createTaskLink', 'updateTaskLink', 'removeTaskLink'), Role::PROJECT_MEMBER); $acl->add('TaskExternalLinkProcedure', array('createExternalTaskLink', 'updateExternalTaskLink', 'removeExternalTaskLink'), Role::PROJECT_MEMBER); - $acl->add('TaskProcedure', '*', Role::PROJECT_MEMBER); + $acl->add('TaskProcedure', array('openTask', 'closeTask', 'removeTask', 'moveTaskPosition', 'moveTaskToProject', 'duplicateTaskToProject', 'createTask', 'updateTask'), Role::PROJECT_MEMBER); $acl->add('TaskTagProcedure', array('setTaskTags'), Role::PROJECT_MEMBER); $acl->add('TagProcedure', array('createTag', 'updateTag', 'removeTag'), Role::PROJECT_MEMBER); diff --git a/app/ServiceProvider/ClassProvider.php b/app/ServiceProvider/ClassProvider.php index 8d471b79..50ce531f 100644 --- a/app/ServiceProvider/ClassProvider.php +++ b/app/ServiceProvider/ClassProvider.php @@ -42,6 +42,7 @@ class ClassProvider implements ServiceProviderInterface 'CustomFilterModel', 'GroupModel', 'GroupMemberModel', + 'InviteModel', 'LanguageModel', 'LastLoginModel', 'LinkModel', diff --git a/app/ServiceProvider/CommandProvider.php b/app/ServiceProvider/CommandProvider.php index c9abb294..f17ba352 100644 --- a/app/ServiceProvider/CommandProvider.php +++ b/app/ServiceProvider/CommandProvider.php @@ -5,6 +5,7 @@ namespace Kanboard\ServiceProvider; use Kanboard\Console\CronjobCommand; use Kanboard\Console\DatabaseMigrationCommand; use Kanboard\Console\DatabaseVersionCommand; +use Kanboard\Console\JobCommand; use Kanboard\Console\LocaleComparatorCommand; use Kanboard\Console\LocaleSyncCommand; use Kanboard\Console\PluginInstallCommand; @@ -52,6 +53,7 @@ class CommandProvider implements ServiceProviderInterface $application->add(new TaskTriggerCommand($container)); $application->add(new CronjobCommand($container)); $application->add(new WorkerCommand($container)); + $application->add(new JobCommand($container)); $application->add(new ResetPasswordCommand($container)); $application->add(new ResetTwoFactorCommand($container)); $application->add(new PluginUpgradeCommand($container)); diff --git a/app/ServiceProvider/FilterProvider.php b/app/ServiceProvider/FilterProvider.php index 1684592b..1cc4da8a 100644 --- a/app/ServiceProvider/FilterProvider.php +++ b/app/ServiceProvider/FilterProvider.php @@ -14,6 +14,7 @@ use Kanboard\Filter\TaskCategoryFilter; use Kanboard\Filter\TaskColorFilter; use Kanboard\Filter\TaskColumnFilter; use Kanboard\Filter\TaskCommentFilter; +use Kanboard\Filter\TaskCompletionDateFilter; use Kanboard\Filter\TaskCreationDateFilter; use Kanboard\Filter\TaskCreatorFilter; use Kanboard\Filter\TaskDescriptionFilter; @@ -156,6 +157,9 @@ class FilterProvider implements ServiceProviderInterface ->withFilter(TaskStartDateFilter::getInstance() ->setDateParser($c['dateParser']) ) + ->withFilter(TaskCompletionDateFilter::getInstance() + ->setDateparser($c['dateParser']) + ) ->withFilter(new TaskIdFilter()) ->withFilter(TaskLinkFilter::getInstance() ->setDatabase($c['db']) diff --git a/app/ServiceProvider/FormatterProvider.php b/app/ServiceProvider/FormatterProvider.php new file mode 100644 index 00000000..dbba3f3c --- /dev/null +++ b/app/ServiceProvider/FormatterProvider.php @@ -0,0 +1,48 @@ +<?php + +namespace Kanboard\ServiceProvider; + +use Kanboard\Core\Tool; +use Pimple\Container; +use Pimple\ServiceProviderInterface; + +/** + * Class FormatterProvider + * + * @package Kanboard\ServiceProvider + * @author Frederic Guillot + */ +class FormatterProvider implements ServiceProviderInterface +{ + protected $formatters = array( + 'Formatter' => array( + 'BoardColumnFormatter', + 'BoardFormatter', + 'BoardSwimlaneFormatter', + 'BoardTaskFormatter', + 'GroupAutoCompleteFormatter', + 'ProjectActivityEventFormatter', + 'ProjectGanttFormatter', + 'SubtaskTimeTrackingCalendarFormatter', + 'TaskAutoCompleteFormatter', + 'TaskCalendarFormatter', + 'TaskGanttFormatter', + 'TaskICalFormatter', + 'TaskSuggestMenuFormatter', + 'UserAutoCompleteFormatter', + 'UserMentionFormatter', + ) + ); + + /** + * Registers services on the given container. + * + * @param Container $container + * @return Container + */ + public function register(Container $container) + { + Tool::buildFactories($container, $this->formatters); + return $container; + } +} diff --git a/app/ServiceProvider/HelperProvider.php b/app/ServiceProvider/HelperProvider.php index f4c0db22..dcaf81c6 100644 --- a/app/ServiceProvider/HelperProvider.php +++ b/app/ServiceProvider/HelperProvider.php @@ -39,6 +39,7 @@ class HelperProvider implements ServiceProviderInterface $container['helper']->register('projectHeader', '\Kanboard\Helper\ProjectHeaderHelper'); $container['helper']->register('projectActivity', '\Kanboard\Helper\ProjectActivityHelper'); $container['helper']->register('mail', '\Kanboard\Helper\MailHelper'); + $container['helper']->register('modal', '\Kanboard\Helper\ModalHelper'); $container['template'] = new Template($container['helper']); diff --git a/app/ServiceProvider/RouteProvider.php b/app/ServiceProvider/RouteProvider.php index 52687647..08759b22 100644 --- a/app/ServiceProvider/RouteProvider.php +++ b/app/ServiceProvider/RouteProvider.php @@ -65,10 +65,7 @@ class RouteProvider implements ServiceProviderInterface $container['route']->addRoute('project/:project_id/overview', 'ProjectOverviewController', 'show'); // ProjectEdit routes - $container['route']->addRoute('project/:project_id/edit', 'ProjectEditController', 'edit'); - $container['route']->addRoute('project/:project_id/edit/dates', 'ProjectEditController', 'dates'); - $container['route']->addRoute('project/:project_id/edit/description', 'ProjectEditController', 'description'); - $container['route']->addRoute('project/:project_id/edit/priority', 'ProjectEditController', 'priority'); + $container['route']->addRoute('project/:project_id/edit', 'ProjectEditController', 'show'); // ProjectUser routes $container['route']->addRoute('projects/managers/:user_id', 'ProjectUserOverviewController', 'managers'); diff --git a/app/Template/action/index.php b/app/Template/action/index.php index 7768a0b6..90db0450 100644 --- a/app/Template/action/index.php +++ b/app/Template/action/index.php @@ -2,12 +2,10 @@ <h2><?= t('Automatic actions for the project "%s"', $project['name']) ?></h2> <ul> <li> - <i class="fa fa-plus fa-fw"></i> - <?= $this->url->link(t('Add a new action'), 'ActionCreationController', 'create', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add a new action'), 'ActionCreationController', 'create', array('project_id' => $project['id'])) ?> </li> <li> - <i class="fa fa-copy fa-fw"></i> - <?= $this->url->link(t('Import from another project'), 'ProjectActionDuplicationController', 'show', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->medium('copy', t('Import from another project'), 'ProjectActionDuplicationController', 'show', array('project_id' => $project['id'])) ?> </li> </ul> </div> @@ -17,8 +15,8 @@ <?php else: ?> <table class="table-scrolling"> <tr> - <th><?= t('Automatic actions') ?></th> - <th><?= t('Action parameters') ?></th> + <th class="column-60"><?= t('Automatic actions') ?></th> + <th class="column-25"><?= t('Action parameters') ?></th> <th><?= t('Action') ?></th> </tr> @@ -65,7 +63,7 @@ </ul> </td> <td> - <?= $this->url->link(t('Remove'), 'ActionController', 'confirm', array('project_id' => $project['id'], 'action_id' => $action['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'ActionController', 'confirm', array('project_id' => $project['id'], 'action_id' => $action['id'])) ?> </td> </tr> <?php endforeach ?> diff --git a/app/Template/action/remove.php b/app/Template/action/remove.php index 384bec7a..e3cdb206 100644 --- a/app/Template/action/remove.php +++ b/app/Template/action/remove.php @@ -7,9 +7,9 @@ <?= t('Do you really want to remove this action: "%s"?', $this->text->in($action['event_name'], $available_events).'/'.$this->text->in($action['action_name'], $available_actions)) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ActionController', 'remove', array('project_id' => $project['id'], 'action_id' => $action['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ActionController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ActionController', + 'remove', + array('project_id' => $project['id'], 'action_id' => $action['id']) + ) ?> </div> diff --git a/app/Template/action_creation/create.php b/app/Template/action_creation/create.php index c0d2880e..862ee474 100644 --- a/app/Template/action_creation/create.php +++ b/app/Template/action_creation/create.php @@ -1,16 +1,14 @@ <div class="page-header"> <h2><?= t('Add an action') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('ActionCreationController', 'event', array('project_id' => $project['id'])) ?>"> +<form method="post" action="<?= $this->url->href('ActionCreationController', 'event', array('project_id' => $project['id'])) ?>"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> <?= $this->form->label(t('Action'), 'action_name') ?> <?= $this->form->select('action_name', $available_actions, $values) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Next step') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ActionController', 'index', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons(array( + 'submitLabel' => t('Next step') + )) ?> </form> diff --git a/app/Template/action_creation/event.php b/app/Template/action_creation/event.php index cdf00310..e4166548 100644 --- a/app/Template/action_creation/event.php +++ b/app/Template/action_creation/event.php @@ -2,8 +2,7 @@ <h2><?= t('Choose an event') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('ActionCreationController', 'params', array('project_id' => $project['id'])) ?>"> - +<form method="post" action="<?= $this->url->href('ActionCreationController', 'params', array('project_id' => $project['id'])) ?>"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> @@ -19,9 +18,7 @@ <?= t('When the selected event occurs execute the corresponding action.') ?> </div> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Next step') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ActionController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons(array( + 'submitLabel' => t('Next step') + )) ?> </form> diff --git a/app/Template/action_creation/params.php b/app/Template/action_creation/params.php index c9608f21..0cc98f50 100644 --- a/app/Template/action_creation/params.php +++ b/app/Template/action_creation/params.php @@ -2,8 +2,7 @@ <h2><?= t('Define action parameters') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('ActionCreationController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> - +<form method="post" action="<?= $this->url->href('ActionCreationController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> @@ -50,9 +49,5 @@ <?php endif ?> <?php endforeach ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ActionController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/activity/project.php b/app/Template/activity/project.php index e8e62777..ce1f8bba 100644 --- a/app/Template/activity/project.php +++ b/app/Template/activity/project.php @@ -1,14 +1,12 @@ -<section id="main"> - <?= $this->projectHeader->render($project, 'ActivityController', $this->app->getRouterAction()) ?> +<div class="page-header"> + <h2><?= t('%s\'s activity', $project['name']) ?></h2> <?php if ($project['is_public']): ?> - <div class="menu-inline pull-right"> <ul> - <li><i class="fa fa-rss-square fa-fw"></i><?= $this->url->link(t('RSS feed'), 'FeedController', 'project', array('token' => $project['token']), false, '', '', true) ?></li> - <li><i class="fa fa-calendar fa-fw"></i><?= $this->url->link(t('iCal feed'), 'ICalendarController', 'project', array('token' => $project['token'])) ?></li> + <li><?= $this->url->icon('rss-square', t('RSS feed'), 'FeedController', 'project', array('token' => $project['token']), false, '', '', true) ?></li> + <li><?= $this->url->icon('calendar', t('iCal feed'), 'ICalendarController', 'project', array('token' => $project['token'])) ?></li> </ul> - </div> <?php endif ?> +</div> - <?= $this->render('event/events', array('events' => $events)) ?> -</section> +<?= $this->render('event/events', array('events' => $events)) ?> diff --git a/app/Template/analytic/avg_time_columns.php b/app/Template/analytic/avg_time_columns.php index 929331a9..1af69c8b 100644 --- a/app/Template/analytic/avg_time_columns.php +++ b/app/Template/analytic/avg_time_columns.php @@ -1,6 +1,8 @@ -<div class="page-header"> - <h2><?= t('Average time spent into each column') ?></h2> -</div> +<?php if (! $is_ajax): ?> + <div class="page-header"> + <h2><?= t('Average time spent into each column') ?></h2> + </div> +<?php endif ?> <?php if (empty($metrics)): ?> <p class="alert"><?= t('Not enough data to show the graph.') ?></p> @@ -11,16 +13,16 @@ )) ?> <table class="table-striped"> - <tr> - <th><?= t('Column') ?></th> - <th><?= t('Average time spent') ?></th> - </tr> - <?php foreach ($metrics as $column): ?> - <tr> - <td><?= $this->text->e($column['title']) ?></td> - <td><?= $this->dt->duration($column['average']) ?></td> - </tr> - <?php endforeach ?> + <tr> + <th><?= t('Column') ?></th> + <th><?= t('Average time spent') ?></th> + </tr> + <?php foreach ($metrics as $column): ?> + <tr> + <td><?= $this->text->e($column['title']) ?></td> + <td><?= $this->dt->duration($column['average']) ?></td> + </tr> + <?php endforeach ?> </table> <p class="alert alert-info"> diff --git a/app/Template/analytic/burndown.php b/app/Template/analytic/burndown.php index 674c76dd..d62c9ba0 100644 --- a/app/Template/analytic/burndown.php +++ b/app/Template/analytic/burndown.php @@ -1,6 +1,8 @@ -<div class="page-header"> - <h2><?= t('Burndown chart') ?></h2> -</div> +<?php if (! $is_ajax): ?> + <div class="page-header"> + <h2><?= t('Burndown chart') ?></h2> + </div> +<?php endif ?> <?php if (! $display_graph): ?> <p class="alert"><?= t('You need at least 2 days of data to show the chart.') ?></p> @@ -15,20 +17,10 @@ <hr/> <form method="post" class="form-inline" action="<?= $this->url->href('AnalyticController', 'burndown', array('project_id' => $project['id'])) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - - <div class="form-inline-group"> - <?= $this->form->date(t('Start date'), 'from', $values) ?> - </div> - - <div class="form-inline-group"> - <?= $this->form->date(t('End date'), 'to', $values) ?> - </div> - - <div class="form-inline-group"> - <button type="submit" class="btn btn-blue"><?= t('Execute') ?></button> - </div> + <?= $this->form->date(t('Start date'), 'from', $values) ?> + <?= $this->form->date(t('End date'), 'to', $values) ?> + <?= $this->modal->submitButtons(array('submitLabel' => t('Execute'))) ?> </form> <p class="alert alert-info"><?= t('This chart show the task complexity over the time (Work Remaining).') ?></p> diff --git a/app/Template/analytic/cfd.php b/app/Template/analytic/cfd.php index 5eb42e82..dcd7b58f 100644 --- a/app/Template/analytic/cfd.php +++ b/app/Template/analytic/cfd.php @@ -1,6 +1,8 @@ -<div class="page-header"> - <h2><?= t('Cumulative flow diagram') ?></h2> -</div> +<?php if (! $is_ajax): ?> + <div class="page-header"> + <h2><?= t('Cumulative flow diagram') ?></h2> + </div> +<?php endif ?> <?php if (! $display_graph): ?> <p class="alert"><?= t('You need at least 2 days of data to show the chart.') ?></p> @@ -14,18 +16,8 @@ <hr/> <form method="post" class="form-inline" action="<?= $this->url->href('AnalyticController', 'cfd', array('project_id' => $project['id'])) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - - <div class="form-inline-group"> - <?= $this->form->date(t('Start date'), 'from', $values) ?> - </div> - - <div class="form-inline-group"> - <?= $this->form->date(t('End date'), 'to', $values) ?> - </div> - - <div class="form-inline-group"> - <button type="submit" class="btn btn-blue"><?= t('Execute') ?></button> - </div> + <?= $this->form->date(t('Start date'), 'from', $values) ?> + <?= $this->form->date(t('End date'), 'to', $values) ?> + <?= $this->modal->submitButtons(array('submitLabel' => t('Execute'))) ?> </form> diff --git a/app/Template/analytic/layout.php b/app/Template/analytic/layout.php index e3c6099f..7159094c 100644 --- a/app/Template/analytic/layout.php +++ b/app/Template/analytic/layout.php @@ -1,10 +1,14 @@ -<section id="main"> +<?php if ($is_ajax): ?> + <div class="page-header"> + <h2><?= $title ?></h2> + </div> +<?php else: ?> <?= $this->projectHeader->render($project, 'TaskListController', 'show') ?> - <section class="sidebar-container"> - <?= $this->render($sidebar_template, array('project' => $project)) ?> +<?php endif ?> +<section class="sidebar-container"> + <?= $this->render($sidebar_template, array('project' => $project)) ?> - <div class="sidebar-content"> - <?= $content_for_sublayout ?> - </div> - </section> + <div class="sidebar-content"> + <?= $content_for_sublayout ?> + </div> </section> diff --git a/app/Template/analytic/lead_cycle_time.php b/app/Template/analytic/lead_cycle_time.php index d5908096..780b47b6 100644 --- a/app/Template/analytic/lead_cycle_time.php +++ b/app/Template/analytic/lead_cycle_time.php @@ -1,8 +1,10 @@ -<div class="page-header"> - <h2><?= t('Average Lead and Cycle time') ?></h2> -</div> +<?php if (! $is_ajax): ?> + <div class="page-header"> + <h2><?= t('Average Lead and Cycle time') ?></h2> + </div> +<?php endif ?> -<div class="listing"> +<div class="panel"> <ul> <li><?= t('Average lead time: ').'<strong>'.$this->dt->duration($average['avg_lead_time']) ?></strong></li> <li><?= t('Average cycle time: ').'<strong>'.$this->dt->duration($average['avg_cycle_time']) ?></strong></li> @@ -19,20 +21,10 @@ )) ?> <form method="post" class="form-inline" action="<?= $this->url->href('AnalyticController', 'leadAndCycleTime', array('project_id' => $project['id'])) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - - <div class="form-inline-group"> - <?= $this->form->date(t('Start date'), 'from', $values) ?> - </div> - - <div class="form-inline-group"> - <?= $this->form->date(t('End date'), 'to', $values) ?> - </div> - - <div class="form-inline-group"> - <button type="submit" class="btn btn-blue"><?= t('Execute') ?></button> - </div> + <?= $this->form->date(t('Start date'), 'from', $values) ?> + <?= $this->form->date(t('End date'), 'to', $values) ?> + <?= $this->modal->submitButtons(array('submitLabel' => t('Execute'))) ?> </form> <p class="alert alert-info"> diff --git a/app/Template/analytic/sidebar.php b/app/Template/analytic/sidebar.php index f768a11d..d5ce88cb 100644 --- a/app/Template/analytic/sidebar.php +++ b/app/Template/analytic/sidebar.php @@ -1,28 +1,27 @@ <div class="sidebar"> <ul> <li <?= $this->app->checkMenuSelection('AnalyticController', 'taskDistribution') ?>> - <?= $this->url->link(t('Task distribution'), 'AnalyticController', 'taskDistribution', array('project_id' => $project['id'])) ?> + <?= $this->modal->replaceLink(t('Task distribution'), 'AnalyticController', 'taskDistribution', array('project_id' => $project['id'])) ?> </li> <li <?= $this->app->checkMenuSelection('AnalyticController', 'userDistribution') ?>> - <?= $this->url->link(t('User repartition'), 'AnalyticController', 'userDistribution', array('project_id' => $project['id'])) ?> + <?= $this->modal->replaceLink(t('User repartition'), 'AnalyticController', 'userDistribution', array('project_id' => $project['id'])) ?> </li> <li <?= $this->app->checkMenuSelection('AnalyticController', 'cfd') ?>> - <?= $this->url->link(t('Cumulative flow diagram'), 'AnalyticController', 'cfd', array('project_id' => $project['id'])) ?> + <?= $this->modal->replaceLink(t('Cumulative flow diagram'), 'AnalyticController', 'cfd', array('project_id' => $project['id'])) ?> </li> <li <?= $this->app->checkMenuSelection('AnalyticController', 'burndown') ?>> - <?= $this->url->link(t('Burndown chart'), 'AnalyticController', 'burndown', array('project_id' => $project['id'])) ?> + <?= $this->modal->replaceLink(t('Burndown chart'), 'AnalyticController', 'burndown', array('project_id' => $project['id'])) ?> </li> <li <?= $this->app->checkMenuSelection('AnalyticController', 'averageTimeByColumn') ?>> - <?= $this->url->link(t('Average time into each column'), 'AnalyticController', 'averageTimeByColumn', array('project_id' => $project['id'])) ?> + <?= $this->modal->replaceLink(t('Average time into each column'), 'AnalyticController', 'averageTimeByColumn', array('project_id' => $project['id'])) ?> </li> <li <?= $this->app->checkMenuSelection('AnalyticController', 'leadAndCycleTime') ?>> - <?= $this->url->link(t('Lead and cycle time'), 'AnalyticController', 'leadAndCycleTime', array('project_id' => $project['id'])) ?> + <?= $this->modal->replaceLink(t('Lead and cycle time'), 'AnalyticController', 'leadAndCycleTime', array('project_id' => $project['id'])) ?> </li> <li <?= $this->app->checkMenuSelection('AnalyticController', 'timeComparison') ?>> - <?= $this->url->link(t('Estimated vs actual time'), 'AnalyticController', 'timeComparison', array('project_id' => $project['id'])) ?> + <?= $this->modal->replaceLink(t('Estimated vs actual time'), 'AnalyticController', 'timeComparison', array('project_id' => $project['id'])) ?> </li> <?= $this->hook->render('template:analytic:sidebar', array('project' => $project)) ?> - </ul> </div> diff --git a/app/Template/analytic/task_distribution.php b/app/Template/analytic/task_distribution.php index 1231856e..671d462f 100644 --- a/app/Template/analytic/task_distribution.php +++ b/app/Template/analytic/task_distribution.php @@ -1,6 +1,8 @@ -<div class="page-header"> - <h2><?= t('Task distribution') ?></h2> -</div> +<?php if (! $is_ajax): ?> + <div class="page-header"> + <h2><?= t('Task distribution') ?></h2> + </div> +<?php endif ?> <?php if (empty($metrics)): ?> <p class="alert"><?= t('Not enough data to show the graph.') ?></p> diff --git a/app/Template/analytic/time_comparison.php b/app/Template/analytic/time_comparison.php index 31d0f53b..754c68f2 100644 --- a/app/Template/analytic/time_comparison.php +++ b/app/Template/analytic/time_comparison.php @@ -1,8 +1,10 @@ -<div class="page-header"> - <h2><?= t('Estimated vs actual time') ?></h2> -</div> +<?php if (! $is_ajax): ?> + <div class="page-header"> + <h2><?= t('Estimated vs actual time') ?></h2> + </div> +<?php endif ?> -<div class="listing"> +<div class="panel"> <ul> <li><?= t('Estimated hours: ').'<strong>'.$this->text->e($metrics['open']['time_estimated'] + $metrics['closed']['time_estimated']) ?></strong></li> <li><?= t('Actual hours: ').'<strong>'.$this->text->e($metrics['open']['time_spent'] + $metrics['closed']['time_spent']) ?></strong></li> @@ -27,9 +29,9 @@ <tr> <th class="column-5"><?= $paginator->order(t('Id'), 'tasks.id') ?></th> <th><?= $paginator->order(t('Title'), 'tasks.title') ?></th> - <th class="column-5"><?= $paginator->order(t('Status'), 'tasks.is_active') ?></th> - <th class="column-10"><?= $paginator->order(t('Estimated Time'), 'tasks.time_estimated') ?></th> - <th class="column-10"><?= $paginator->order(t('Actual Time'), 'tasks.time_spent') ?></th> + <th class="column-10"><?= $paginator->order(t('Status'), 'tasks.is_active') ?></th> + <th class="column-12"><?= $paginator->order(t('Estimated Time'), 'tasks.time_estimated') ?></th> + <th class="column-12"><?= $paginator->order(t('Actual Time'), 'tasks.time_spent') ?></th> </tr> <?php foreach ($paginator->getCollection() as $task): ?> <tr> diff --git a/app/Template/analytic/user_distribution.php b/app/Template/analytic/user_distribution.php index 76ac945c..cae6fa57 100644 --- a/app/Template/analytic/user_distribution.php +++ b/app/Template/analytic/user_distribution.php @@ -1,6 +1,8 @@ -<div class="page-header"> - <h2><?= t('User repartition') ?></h2> -</div> +<?php if (! $is_ajax): ?> + <div class="page-header"> + <h2><?= t('User repartition') ?></h2> + </div> +<?php endif ?> <?php if (empty($metrics)): ?> <p class="alert"><?= t('Not enough data to show the graph.') ?></p> diff --git a/app/Template/board/table_column.php b/app/Template/board/table_column.php index e2976f27..df16715f 100644 --- a/app/Template/board/table_column.php +++ b/app/Template/board/table_column.php @@ -14,7 +14,7 @@ <div class="board-column-expanded"> <?php if (! $not_editable && $this->projectRole->canCreateTaskInColumn($column['project_id'], $column['id'])): ?> <div class="board-add-icon"> - <?= $this->url->link('+', 'TaskCreationController', 'show', array('project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']), false, 'popover', t('Add a new task')) ?> + <?= $this->modal->largeIcon('plus', t('Add a new task'), 'TaskCreationController', 'show', array('project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id'])) ?> </div> <?php endif ?> @@ -37,15 +37,13 @@ </li> <?php if ($this->projectRole->canCreateTaskInColumn($column['project_id'], $column['id'])): ?> <li> - <i class="fa fa-align-justify fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Create tasks in bulk'), 'TaskBulkController', 'show', array('project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']), false, 'popover') ?> + <?= $this->modal->medium('align-justify', t('Create tasks in bulk'), 'TaskBulkController', 'show', array('project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id'])) ?> </li> <?php endif ?> <?php if ($column['nb_tasks'] > 0 && $this->projectRole->canChangeTaskStatusInColumn($column['project_id'], $column['id'])): ?> <li> - <i class="fa fa-close fa-fw"></i> - <?= $this->url->link(t('Close all tasks of this column'), 'BoardPopoverController', 'confirmCloseColumnTasks', array('project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']), false, 'popover') ?> + <?= $this->modal->confirm('close', t('Close all tasks of this column'), 'BoardPopoverController', 'confirmCloseColumnTasks', array('project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id'])) ?> </li> <?php endif ?> @@ -76,6 +74,7 @@ (<span id="task-number-column-<?= $column['id'] ?>"><?= $column['nb_tasks'] ?></span>) </span> <?php endif ?> + <?= $this->hook->render('template:board:column:header', array('swimlane' => $swimlane, 'column' => $column)) ?> </div> </th> diff --git a/app/Template/board/task_footer.php b/app/Template/board/task_footer.php index 83a582c6..15f1f713 100644 --- a/app/Template/board/task_footer.php +++ b/app/Template/board/task_footer.php @@ -10,7 +10,7 @@ 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, - 'popover' . (! empty($task['category_description']) ? ' tooltip' : ''), + 'js-modal-medium' . (! empty($task['category_description']) ? ' tooltip' : ''), ! empty($task['category_description']) ? $this->text->markdownAttribute($task['category_description']) : t('Change category') ) ?> <?php endif ?> diff --git a/app/Template/board/tooltip_files.php b/app/Template/board/tooltip_files.php index 4e704dac..5cb72741 100644 --- a/app/Template/board/tooltip_files.php +++ b/app/Template/board/tooltip_files.php @@ -9,9 +9,9 @@ </tr> <tr> <td> - <i class="fa fa-download fa-fw"></i><?= $this->url->link(t('download'), 'FileViewerController', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?> + <?= $this->url->icon('download', t('download'), 'FileViewerController', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?> <?php if ($file['is_image'] == 1): ?> - <i class="fa fa-eye"></i> <?= $this->url->link(t('open file'), 'FileViewerController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?> + <?= $this->modal->large('eye', t('open file'), 'FileViewerController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?> <?php endif ?> </td> </tr> diff --git a/app/Template/board_popover/close_all_tasks_column.php b/app/Template/board_popover/close_all_tasks_column.php index 57f703e3..ab7c2d47 100644 --- a/app/Template/board_popover/close_all_tasks_column.php +++ b/app/Template/board_popover/close_all_tasks_column.php @@ -1,18 +1,15 @@ -<section id="main"> - <div class="page-header"> - <h2><?= t('Do you really want to close all tasks of this column?') ?></h2> - </div> - <form method="post" action="<?= $this->url->href('BoardPopoverController', 'closeColumnTasks', array('project_id' => $project['id'])) ?>"> - <?= $this->form->csrf() ?> - <?= $this->form->hidden('column_id', $values) ?> - <?= $this->form->hidden('swimlane_id', $values) ?> +<div class="page-header"> + <h2><?= t('Do you really want to close all tasks of this column?') ?></h2> +</div> +<form method="post" action="<?= $this->url->href('BoardPopoverController', 'closeColumnTasks', array('project_id' => $project['id'])) ?>"> + <?= $this->form->csrf() ?> + <?= $this->form->hidden('column_id', $values) ?> + <?= $this->form->hidden('swimlane_id', $values) ?> - <p class="alert"><?= t('%d task(s) in the column "%s" and the swimlane "%s" will be closed.', $nb_tasks, $column, $swimlane) ?></p> + <p class="alert"><?= t('%d task(s) in the column "%s" and the swimlane "%s" will be closed.', $nb_tasks, $column, $swimlane) ?></p> - <div class="form-actions"> - <button type="submit" class="btn btn-red"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'BoardViewController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> - </form> -</section> + <?= $this->modal->submitButtons(array( + 'submitLabel' => t('Yes'), + 'color' => 'red', + )) ?> +</form> diff --git a/app/Template/category/edit.php b/app/Template/category/edit.php index d8ca313d..108826f3 100644 --- a/app/Template/category/edit.php +++ b/app/Template/category/edit.php @@ -2,8 +2,7 @@ <h2><?= t('Category modification for the project "%s"', $project['name']) ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('CategoryController', 'update', array('project_id' => $project['id'], 'category_id' => $values['id'])) ?>" autocomplete="off"> - +<form method="post" action="<?= $this->url->href('CategoryController', 'update', array('project_id' => $project['id'], 'category_id' => $values['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> @@ -15,9 +14,5 @@ <?= $this->form->label(t('Description'), 'description') ?> <?= $this->form->textEditor('description', $values, $errors, array('tabindex' => 2)) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'CategoryController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/category/index.php b/app/Template/category/index.php index 336b79a2..e93138fd 100644 --- a/app/Template/category/index.php +++ b/app/Template/category/index.php @@ -15,12 +15,10 @@ <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Edit'), 'CategoryController', 'edit', array('project_id' => $project['id'], 'category_id' => $category_id), false, 'popover') ?> + <?= $this->modal->medium('edit', t('Edit'), 'CategoryController', 'edit', array('project_id' => $project['id'], 'category_id' => $category_id)) ?> </li> <li> - <i class="fa fa-trash-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'CategoryController', 'confirm', array('project_id' => $project['id'], 'category_id' => $category_id), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'CategoryController', 'confirm', array('project_id' => $project['id'], 'category_id' => $category_id)) ?> </li> </ul> </div> diff --git a/app/Template/category/remove.php b/app/Template/category/remove.php index e7b9c9b4..79e8a560 100644 --- a/app/Template/category/remove.php +++ b/app/Template/category/remove.php @@ -1,17 +1,15 @@ -<section id="main"> - <div class="page-header"> - <h2><?= t('Remove a category') ?></h2> - </div> +<div class="page-header"> + <h2><?= t('Remove a category') ?></h2> +</div> - <div class="confirm"> - <p class="alert alert-info"> - <?= t('Do you really want to remove this category: "%s"?', $category['name']) ?> - </p> +<div class="confirm"> + <p class="alert alert-info"> + <?= t('Do you really want to remove this category: "%s"?', $category['name']) ?> + </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'CategoryController', 'remove', array('project_id' => $project['id'], 'category_id' => $category['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'CategoryController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> - </div> -</section> + <?= $this->modal->confirmButtons( + 'CategoryController', + 'remove', + array('project_id' => $project['id'], 'category_id' => $category['id']) + ) ?> +</div> diff --git a/app/Template/column/create.php b/app/Template/column/create.php index f4cded52..aad9606b 100644 --- a/app/Template/column/create.php +++ b/app/Template/column/create.php @@ -1,8 +1,7 @@ <div class="page-header"> <h2><?= t('Add a new column') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('ColumnController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> - +<form method="post" action="<?= $this->url->href('ColumnController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> @@ -18,9 +17,5 @@ <?= $this->form->label(t('Description'), 'description') ?> <?= $this->form->textEditor('description', $values, $errors, array('tabindex' => 4)) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue" tabindex="5"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'column', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/column/edit.php b/app/Template/column/edit.php index a72a5c84..e590b5cc 100644 --- a/app/Template/column/edit.php +++ b/app/Template/column/edit.php @@ -2,8 +2,7 @@ <h2><?= t('Edit column "%s"', $column['title']) ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('ColumnController', 'update', array('project_id' => $project['id'], 'column_id' => $column['id'])) ?>" autocomplete="off"> - +<form method="post" action="<?= $this->url->href('ColumnController', 'update', array('project_id' => $project['id'], 'column_id' => $column['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> @@ -20,9 +19,5 @@ <?= $this->form->label(t('Description'), 'description') ?> <?= $this->form->textEditor('description', $values, $errors) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ColumnController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/column/index.php b/app/Template/column/index.php index 8c96a350..eaaae332 100644 --- a/app/Template/column/index.php +++ b/app/Template/column/index.php @@ -2,8 +2,7 @@ <h2><?= t('Edit the board for "%s"', $project['name']) ?></h2> <ul> <li> - <i class="fa fa-plus fa-fw"></i> - <?= $this->url->link(t('Add a new column'), 'ColumnController', 'create', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add a new column'), 'ColumnController', 'create', array('project_id' => $project['id'])) ?> </li> </ul> </div> @@ -17,7 +16,8 @@ <thead> <tr> <th class="column-70"><?= t('Column title') ?></th> - <th class="column-25"><?= t('Task limit') ?></th> + <th class="column-10"><?= t('Task limit') ?></th> + <th class="column-20"><?= t('Visible on dashboard') ?></th> <th class="column-5"><?= t('Actions') ?></th> </tr> </thead> @@ -37,16 +37,17 @@ <?= $this->text->e($column['task_limit']) ?> </td> <td> + <?= $column['hide_in_dashboard'] == 1 ? t('Yes') : t('No') ?> + </td> + <td> <div class="dropdown"> <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Edit'), 'ColumnController', 'edit', array('project_id' => $project['id'], 'column_id' => $column['id']), false, 'popover') ?> + <?= $this->modal->medium('edit', t('Edit'), 'ColumnController', 'edit', array('project_id' => $project['id'], 'column_id' => $column['id'])) ?> </li> <li> - <i class="fa fa-trash-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'ColumnController', 'confirm', array('project_id' => $project['id'], 'column_id' => $column['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'ColumnController', 'confirm', array('project_id' => $project['id'], 'column_id' => $column['id'])) ?> </li> </ul> </div> diff --git a/app/Template/column/remove.php b/app/Template/column/remove.php index dc0a4712..4134b175 100644 --- a/app/Template/column/remove.php +++ b/app/Template/column/remove.php @@ -8,8 +8,9 @@ <?= t('This action will REMOVE ALL TASKS associated to this column!') ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ColumnController', 'remove', array('project_id' => $project['id'], 'column_id' => $column['id']), true, 'btn btn-red') ?> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'ColumnController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ColumnController', + 'remove', + array('project_id' => $project['id'], 'column_id' => $column['id']) + ) ?> </div> diff --git a/app/Template/column_move_restriction/create.php b/app/Template/column_move_restriction/create.php index 1eb6d539..852df971 100644 --- a/app/Template/column_move_restriction/create.php +++ b/app/Template/column_move_restriction/create.php @@ -1,24 +1,18 @@ -<section id="main"> - <div class="page-header"> - <h2><?= t('New drag and drop restriction for the role "%s"', $role['role']) ?></h2> - </div> - <form class="popover-form" method="post" action="<?= $this->url->href('ColumnMoveRestrictionController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->hidden('project_id', $values) ?> - <?= $this->form->hidden('role_id', $values) ?> +<div class="page-header"> + <h2><?= t('New drag and drop restriction for the role "%s"', $role['role']) ?></h2> +</div> +<form method="post" action="<?= $this->url->href('ColumnMoveRestrictionController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> + <?= $this->form->csrf() ?> + <?= $this->form->hidden('project_id', $values) ?> + <?= $this->form->hidden('role_id', $values) ?> - <?= $this->form->label(t('Source column'), 'src_column_id') ?> - <?= $this->form->select('src_column_id', $columns, $values, $errors) ?> + <?= $this->form->label(t('Source column'), 'src_column_id') ?> + <?= $this->form->select('src_column_id', $columns, $values, $errors) ?> - <?= $this->form->label(t('Destination column'), 'dst_column_id') ?> - <?= $this->form->select('dst_column_id', $columns, $values, $errors) ?> + <?= $this->form->label(t('Destination column'), 'dst_column_id') ?> + <?= $this->form->select('dst_column_id', $columns, $values, $errors) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectRoleController', 'show', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> - <p class="alert alert-info"><?= t('People belonging to this role will be able to move tasks only between the source and the destination column.') ?></p> - </form> -</section> + <p class="alert alert-info"><?= t('People belonging to this role will be able to move tasks only between the source and the destination column.') ?></p> +</form> diff --git a/app/Template/column_move_restriction/remove.php b/app/Template/column_move_restriction/remove.php index 1985e167..4902cd23 100644 --- a/app/Template/column_move_restriction/remove.php +++ b/app/Template/column_move_restriction/remove.php @@ -7,8 +7,9 @@ <?= t('Do you really want to remove this column restriction: "%s" to "%s"?', $restriction['src_column_title'], $restriction['dst_column_title']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ColumnMoveRestrictionController', 'remove', array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id']), true, 'btn btn-red') ?> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'ProjectRoleController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ColumnMoveRestrictionController', + 'remove', + array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id']) + ) ?> </div> diff --git a/app/Template/column_restriction/create.php b/app/Template/column_restriction/create.php index 982733b4..be158f19 100644 --- a/app/Template/column_restriction/create.php +++ b/app/Template/column_restriction/create.php @@ -1,22 +1,16 @@ -<section id="main"> - <div class="page-header"> - <h2><?= t('New column restriction for the role "%s"', $role['role']) ?></h2> - </div> - <form class="popover-form" method="post" action="<?= $this->url->href('ColumnRestrictionController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->hidden('project_id', $values) ?> - <?= $this->form->hidden('role_id', $values) ?> +<div class="page-header"> + <h2><?= t('New column restriction for the role "%s"', $role['role']) ?></h2> +</div> +<form method="post" action="<?= $this->url->href('ColumnRestrictionController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> + <?= $this->form->csrf() ?> + <?= $this->form->hidden('project_id', $values) ?> + <?= $this->form->hidden('role_id', $values) ?> - <?= $this->form->label(t('Rule'), 'rule') ?> - <?= $this->form->select('rule', $rules, $values, $errors) ?> + <?= $this->form->label(t('Rule'), 'rule') ?> + <?= $this->form->select('rule', $rules, $values, $errors) ?> - <?= $this->form->label(t('Column'), 'column_id') ?> - <?= $this->form->select('column_id', $columns, $values, $errors) ?> + <?= $this->form->label(t('Column'), 'column_id') ?> + <?= $this->form->select('column_id', $columns, $values, $errors) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectRoleController', 'show', array(), false, 'close-popover') ?> - </div> - </form> -</section> + <?= $this->modal->submitButtons() ?> +</form> diff --git a/app/Template/column_restriction/remove.php b/app/Template/column_restriction/remove.php index 97650e2d..edbd9d6e 100644 --- a/app/Template/column_restriction/remove.php +++ b/app/Template/column_restriction/remove.php @@ -7,8 +7,9 @@ <?= t('Do you really want to remove this column restriction?') ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ColumnRestrictionController', 'remove', array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id']), true, 'btn btn-red') ?> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'ProjectRoleController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ColumnRestrictionController', + 'remove', + array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id']) + ) ?> </div> diff --git a/app/Template/comment/create.php b/app/Template/comment/create.php index 02cb48eb..8a421759 100644 --- a/app/Template/comment/create.php +++ b/app/Template/comment/create.php @@ -1,16 +1,12 @@ <div class="page-header"> <h2><?= t('Add a comment') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('CommentController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('CommentController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('task_id', $values) ?> <?= $this->form->hidden('user_id', $values) ?> <?= $this->form->textEditor('comment', $values, $errors, array('autofocus' => true, 'required' => true)) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/comment/edit.php b/app/Template/comment/edit.php index f295c8a7..04f6ffd4 100644 --- a/app/Template/comment/edit.php +++ b/app/Template/comment/edit.php @@ -2,7 +2,7 @@ <h2><?= t('Edit a comment') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('CommentController', 'update', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'comment_id' => $comment['id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('CommentController', 'update', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'comment_id' => $comment['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> <?= $this->form->hidden('task_id', $values) ?> @@ -10,9 +10,5 @@ <?= $this->form->textEditor('comment', $values, $errors, array('autofocus' => true, 'required' => true)) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/comment/remove.php b/app/Template/comment/remove.php index 55587b67..03f16e00 100644 --- a/app/Template/comment/remove.php +++ b/app/Template/comment/remove.php @@ -13,9 +13,9 @@ 'hide_actions' => true )) ?> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'CommentController', 'remove', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'comment_id' => $comment['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'CommentController', + 'remove', + array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'comment_id' => $comment['id']) + ) ?> </div> diff --git a/app/Template/comment/show.php b/app/Template/comment/show.php index 16a807bc..f8d9607e 100644 --- a/app/Template/comment/show.php +++ b/app/Template/comment/show.php @@ -7,7 +7,9 @@ <strong class="comment-username"><?= $this->text->e($comment['name'] ?: $comment['username']) ?></strong> <?php endif ?> - <small class="comment-date"><?= $this->dt->datetime($comment['date_creation']) ?></small> + <small class="comment-date"><?= t('Created at:') ?> <?= $this->dt->datetime($comment['date_creation']) ?></small> + <small class="comment-date"><?= t('Updated at:')?> <?= $this->dt->datetime($comment['date_modification']) ?></small> + </div> <div class="comment-content"> @@ -25,12 +27,10 @@ </li> <?php if ($editable && ($this->user->isAdmin() || $this->user->isCurrentUser($comment['user_id']))): ?> <li> - <i class="fa fa-remove fa-fw"></i> - <?= $this->url->link(t('remove'), 'CommentController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'comment_id' => $comment['id']), false, 'popover') ?> + <?= $this->modal->medium('edit', t('edit'), 'CommentController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'comment_id' => $comment['id'])) ?> </li> <li> - <i class="fa fa-edit fa-fw"></i> - <?= $this->url->link(t('edit'), 'CommentController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'comment_id' => $comment['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('remove'), 'CommentController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'comment_id' => $comment['id'])) ?> </li> <?php endif ?> </ul> diff --git a/app/Template/comments/show.php b/app/Template/comments/show.php index dfc13821..3edf7076 100644 --- a/app/Template/comments/show.php +++ b/app/Template/comments/show.php @@ -6,8 +6,7 @@ <?php if (!isset($is_public) || !$is_public): ?> <div class="comment-sorting"> <small> - <i class="fa fa-sort"></i> - <?= $this->url->link(t('change sorting'), 'CommentController', 'toggleSorting', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + <?= $this->url->icon('sort', t('change sorting'), 'CommentController', 'toggleSorting', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </small> </div> <?php endif ?> diff --git a/app/Template/config/about.php b/app/Template/config/about.php index 8d5a575d..3f078c3d 100644 --- a/app/Template/config/about.php +++ b/app/Template/config/about.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('About') ?></h2> </div> -<div class="listing"> +<div class="panel"> <ul> <li> <?= t('Official website:') ?> @@ -21,7 +21,7 @@ <div class="page-header"> <h2><?= t('Configuration') ?></h2> </div> -<div class="listing"> +<div class="panel"> <ul> <li> <?= t('Application version:') ?> @@ -58,7 +58,7 @@ <div class="page-header"> <h2><?= t('Database') ?></h2> </div> - <div class="listing"> + <div class="panel"> <ul> <li> <?= t('Database size:') ?> @@ -81,6 +81,6 @@ <div class="page-header"> <h2><?= t('License') ?></h2> </div> -<div class="listing"> +<div class="panel"> <?= nl2br(file_get_contents(ROOT_DIR.DIRECTORY_SEPARATOR.'LICENSE')) ?> </div> diff --git a/app/Template/config/api.php b/app/Template/config/api.php index 95f77355..9a3b06ce 100644 --- a/app/Template/config/api.php +++ b/app/Template/config/api.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('API') ?></h2> </div> -<section class="listing"> +<div class="panel"> <ul> <li> <?= t('API token:') ?> @@ -9,10 +9,10 @@ </li> <li> <?= t('API endpoint:') ?> - <input type="text" class="auto-select" readonly="readonly" value="<?= $this->url->base().'jsonrpc.php' ?>"> - </li> - <li> - <?= $this->url->link(t('Reset token'), 'ConfigController', 'token', array('type' => 'api'), true) ?> + <strong><?= $this->url->base().'jsonrpc.php' ?></strong> </li> </ul> -</section> +</div> + +<?= $this->url->link(t('Reset token'), 'ConfigController', 'token', array('type' => 'api'), true, 'btn btn-red') ?> + diff --git a/app/Template/config/application.php b/app/Template/config/application.php index 0f842f6e..d3d8c858 100644 --- a/app/Template/config/application.php +++ b/app/Template/config/application.php @@ -2,33 +2,35 @@ <h2><?= t('Application settings') ?></h2> </div> <form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'application')) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->label(t('Application URL'), 'application_url') ?> - <?= $this->form->text('application_url', $values, $errors, array('placeholder="http://example.kanboard.net/"')) ?> - <p class="form-help"><?= t('Example: http://example.kanboard.net/ (used to generate absolute URLs)') ?></p> - - <?= $this->form->label(t('Language'), 'application_language') ?> - <?= $this->form->select('application_language', $languages, $values, $errors) ?> + <fieldset> + <?= $this->form->label(t('Application URL'), 'application_url') ?> + <?= $this->form->text('application_url', $values, $errors, array('placeholder="http://example.kanboard.net/"')) ?> + <p class="form-help"><?= t('Example: http://example.kanboard.net/ (used to generate absolute URLs)') ?></p> - <?= $this->form->label(t('Timezone'), 'application_timezone') ?> - <?= $this->form->select('application_timezone', $timezones, $values, $errors) ?> + <?= $this->form->label(t('Language'), 'application_language') ?> + <?= $this->form->select('application_language', $languages, $values, $errors) ?> - <?= $this->form->label(t('Date format'), 'application_date_format') ?> - <?= $this->form->select('application_date_format', $date_formats, $values, $errors) ?> - <p class="form-help"><?= t('ISO format is always accepted, example: "%s" and "%s"', date('Y-m-d'), date('Y_m_d')) ?></p> + <?= $this->form->checkbox('password_reset', t('Enable "Forget Password"'), 1, $values['password_reset'] == 1) ?> + </fieldset> - <?= $this->form->label(t('Date and time format'), 'application_datetime_format') ?> - <?= $this->form->select('application_datetime_format', $datetime_formats, $values, $errors) ?> + <fieldset> + <?= $this->form->label(t('Timezone'), 'application_timezone') ?> + <?= $this->form->select('application_timezone', $timezones, $values, $errors) ?> - <?= $this->form->label(t('Time format'), 'application_time_format') ?> - <?= $this->form->select('application_time_format', $time_formats, $values, $errors) ?> + <?= $this->form->label(t('Date format'), 'application_date_format') ?> + <?= $this->form->select('application_date_format', $date_formats, $values, $errors) ?> + <p class="form-help"><?= t('ISO format is always accepted, example: "%s" and "%s"', date('Y-m-d'), date('Y_m_d')) ?></p> - <?= $this->form->checkbox('password_reset', t('Enable "Forget Password"'), 1, $values['password_reset'] == 1) ?> + <?= $this->form->label(t('Time format'), 'application_time_format') ?> + <?= $this->form->select('application_time_format', $time_formats, $values, $errors) ?> + </fieldset> - <?= $this->form->label(t('Custom Stylesheet'), 'application_stylesheet') ?> - <?= $this->form->textarea('application_stylesheet', $values, $errors) ?> + <fieldset> + <?= $this->form->label(t('Custom Stylesheet'), 'application_stylesheet') ?> + <?= $this->form->textarea('application_stylesheet', $values, $errors) ?> + </fieldset> <?= $this->hook->render('template:config:application', array('values' => $values, 'errors' => $errors)) ?> diff --git a/app/Template/config/board.php b/app/Template/config/board.php index 62a736e7..35058f0f 100644 --- a/app/Template/config/board.php +++ b/app/Template/config/board.php @@ -2,20 +2,21 @@ <h2><?= t('Board settings') ?></h2> </div> <form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'board')) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->label(t('Task highlight period'), 'board_highlight_period') ?> - <?= $this->form->number('board_highlight_period', $values, $errors) ?> - <p class="form-help"><?= t('Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)') ?></p> + <fieldset> + <?= $this->form->label(t('Task highlight period'), 'board_highlight_period') ?> + <?= $this->form->number('board_highlight_period', $values, $errors) ?> + <p class="form-help"><?= t('Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)') ?></p> - <?= $this->form->label(t('Refresh interval for public board'), 'board_public_refresh_interval') ?> - <?= $this->form->number('board_public_refresh_interval', $values, $errors) ?> - <p class="form-help"><?= t('Frequency in second (60 seconds by default)') ?></p> + <?= $this->form->label(t('Refresh interval for public board'), 'board_public_refresh_interval') ?> + <?= $this->form->number('board_public_refresh_interval', $values, $errors) ?> + <p class="form-help"><?= t('Frequency in second (60 seconds by default)') ?></p> - <?= $this->form->label(t('Refresh interval for private board'), 'board_private_refresh_interval') ?> - <?= $this->form->number('board_private_refresh_interval', $values, $errors) ?> - <p class="form-help"><?= t('Frequency in second (0 to disable this feature, 10 seconds by default)') ?></p> + <?= $this->form->label(t('Refresh interval for private board'), 'board_private_refresh_interval') ?> + <?= $this->form->number('board_private_refresh_interval', $values, $errors) ?> + <p class="form-help"><?= t('Frequency in second (0 to disable this feature, 10 seconds by default)') ?></p> + </fieldset> <div class="form-actions"> <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> diff --git a/app/Template/config/calendar.php b/app/Template/config/calendar.php index 90e034e9..0cc3d064 100644 --- a/app/Template/config/calendar.php +++ b/app/Template/config/calendar.php @@ -1,34 +1,36 @@ <div class="page-header"> <h2><?= t('Calendar settings') ?></h2> </div> -<section> <form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'calendar')) ?>" autocomplete="off"> <?= $this->form->csrf() ?> - <div class="listing"> - <h3><?= t('Project calendar view') ?></h3> + <fieldset> + <legend><?= t('Project calendar view') ?></legend> <?= $this->form->radios('calendar_project_tasks', array( 'date_creation' => t('Show tasks based on the creation date'), 'date_started' => t('Show tasks based on the start date'), - ), $values) ?> - </div> + ), + $values + ) ?> + </fieldset> - <div class="listing"> - <h3><?= t('User calendar view') ?></h3> + <fieldset> + <legend><?= t('User calendar view') ?></legend> <?= $this->form->radios('calendar_user_tasks', array( 'date_creation' => t('Show tasks based on the creation date'), 'date_started' => t('Show tasks based on the start date'), - ), $values) ?> - </div> + ), + $values + ) ?> + </fieldset> - <div class="listing"> - <h3><?= t('Subtasks time tracking') ?></h3> + <fieldset> + <legend><?= t('Subtasks time tracking') ?></legend> <?= $this->form->checkbox('calendar_user_subtasks_time_tracking', t('Show subtasks based on the time tracking'), 1, $values['calendar_user_subtasks_time_tracking'] == 1) ?> - </div> + </fieldset> <div class="form-actions"> <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> </div> </form> -</section> diff --git a/app/Template/config/email.php b/app/Template/config/email.php index 6ff76eca..bc2c2ae5 100644 --- a/app/Template/config/email.php +++ b/app/Template/config/email.php @@ -4,11 +4,14 @@ <form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'email')) ?>" autocomplete="off"> <?= $this->form->csrf() ?> - <?= $this->form->label(t('Email sender address'), 'mail_sender_address') ?> - <?= $this->form->text('mail_sender_address', $values, $errors, array('placeholder="'.MAIL_FROM.'"')) ?> + <fieldset> + <legend><?= t('Outgoing Emails') ?></legend> + <?= $this->form->label(t('Email sender address'), 'mail_sender_address') ?> + <?= $this->form->text('mail_sender_address', $values, $errors, array('placeholder="'.MAIL_FROM.'"')) ?> - <?= $this->form->label(t('Email transport'), 'mail_transport') ?> - <?= $this->form->select('mail_transport', $mail_transports, $values, $errors) ?> + <?= $this->form->label(t('Email transport'), 'mail_transport') ?> + <?= $this->form->select('mail_transport', $mail_transports, $values, $errors) ?> + </fieldset> <?= $this->hook->render('template:config:email', array('values' => $values, 'errors' => $errors)) ?> diff --git a/app/Template/config/integrations.php b/app/Template/config/integrations.php index 3ba4e865..07a90ce2 100644 --- a/app/Template/config/integrations.php +++ b/app/Template/config/integrations.php @@ -7,11 +7,11 @@ <?= $this->hook->render('template:config:integrations', array('values' => $values)) ?> <h3><img src="<?= $this->url->dir() ?>assets/img/gravatar-icon.png"/> <?= t('Gravatar') ?></h3> - <div class="listing"> + <div class="panel"> <?= $this->form->checkbox('integration_gravatar', t('Enable Gravatar images'), 1, $values['integration_gravatar'] == 1) ?> + <div class="form-actions"> + <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> + </div> </div> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - </div> </form> diff --git a/app/Template/config/keyboard_shortcuts.php b/app/Template/config/keyboard_shortcuts.php index 1b1a9477..6ac71ee0 100644 --- a/app/Template/config/keyboard_shortcuts.php +++ b/app/Template/config/keyboard_shortcuts.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('Keyboard shortcuts') ?></h2> </div> -<div class="listing"> +<div class="panel"> <h3><?= t('Board/Calendar/List view') ?></h3> <ul> <li><?= t('Switch to the project overview') ?> = <strong>v o</strong></li> diff --git a/app/Template/config/project.php b/app/Template/config/project.php index 6d8d131a..514a9baa 100644 --- a/app/Template/config/project.php +++ b/app/Template/config/project.php @@ -2,24 +2,27 @@ <h2><?= t('Project settings') ?></h2> </div> <form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'project')) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->label(t('Default task color'), 'default_color') ?> - <?= $this->form->select('default_color', $colors, $values, $errors) ?> + <fieldset> + <?= $this->form->label(t('Default task color'), 'default_color') ?> + <?= $this->form->select('default_color', $colors, $values, $errors) ?> - <?= $this->form->label(t('Default columns for new projects (Comma-separated)'), 'board_columns') ?> - <?= $this->form->text('board_columns', $values, $errors) ?> - <p class="form-help"><?= t('Default values are "%s"', $default_columns) ?></p> + <?= $this->form->label(t('Default columns for new projects (Comma-separated)'), 'board_columns') ?> + <?= $this->form->text('board_columns', $values, $errors) ?> + <p class="form-help"><?= t('Default values are "%s"', $default_columns) ?></p> - <?= $this->form->label(t('Default categories for new projects (Comma-separated)'), 'project_categories') ?> - <?= $this->form->text('project_categories', $values, $errors) ?> - <p class="form-help"><?= t('Example: "Bug, Feature Request, Improvement"') ?></p> + <?= $this->form->label(t('Default categories for new projects (Comma-separated)'), 'project_categories') ?> + <?= $this->form->text('project_categories', $values, $errors) ?> + <p class="form-help"><?= t('Example: "Bug, Feature Request, Improvement"') ?></p> + </fieldset> - <?= $this->form->checkbox('disable_private_project', t('Disable private projects'), 1, isset($values['disable_private_project']) && $values['disable_private_project'] == 1) ?> - <?= $this->form->checkbox('subtask_restriction', t('Allow only one subtask in progress at the same time for a user'), 1, $values['subtask_restriction'] == 1) ?> - <?= $this->form->checkbox('subtask_time_tracking', t('Trigger automatically subtask time tracking'), 1, $values['subtask_time_tracking'] == 1) ?> - <?= $this->form->checkbox('cfd_include_closed_tasks', t('Include closed tasks in the cumulative flow diagram'), 1, $values['cfd_include_closed_tasks'] == 1) ?> + <fieldset> + <?= $this->form->checkbox('disable_private_project', t('Disable private projects'), 1, isset($values['disable_private_project']) && $values['disable_private_project'] == 1) ?> + <?= $this->form->checkbox('subtask_restriction', t('Allow only one subtask in progress at the same time for a user'), 1, $values['subtask_restriction'] == 1) ?> + <?= $this->form->checkbox('subtask_time_tracking', t('Trigger automatically subtask time tracking'), 1, $values['subtask_time_tracking'] == 1) ?> + <?= $this->form->checkbox('cfd_include_closed_tasks', t('Include closed tasks in the cumulative flow diagram'), 1, $values['cfd_include_closed_tasks'] == 1) ?> + </fieldset> <div class="form-actions"> <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> diff --git a/app/Template/config/sidebar.php b/app/Template/config/sidebar.php index 239edc19..95be963b 100644 --- a/app/Template/config/sidebar.php +++ b/app/Template/config/sidebar.php @@ -22,10 +22,10 @@ <?= $this->url->link(t('Tags management'), 'TagController', 'index') ?> </li> <li <?= $this->app->checkMenuSelection('LinkController') ?>> - <?= $this->url->link(t('Link settings'), 'LinkController', 'index') ?> + <?= $this->url->link(t('Link labels'), 'LinkController', 'show') ?> </li> - <li <?= $this->app->checkMenuSelection('CurrencyController', 'index') ?>> - <?= $this->url->link(t('Currency rates'), 'CurrencyController', 'index') ?> + <li <?= $this->app->checkMenuSelection('CurrencyController') ?>> + <?= $this->url->link(t('Currency rates'), 'CurrencyController', 'show') ?> </li> <li <?= $this->app->checkMenuSelection('ConfigController', 'integrations') ?>> <?= $this->url->link(t('Integrations'), 'ConfigController', 'integrations') ?> diff --git a/app/Template/config/webhook.php b/app/Template/config/webhook.php index e3245873..bc4bbfdf 100644 --- a/app/Template/config/webhook.php +++ b/app/Template/config/webhook.php @@ -1,9 +1,7 @@ <div class="page-header"> <h2><?= t('Webhook settings') ?></h2> </div> -<section> <form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'webhook')) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> <?= $this->form->label(t('Webhook URL'), 'webhook_url') ?> @@ -13,19 +11,13 @@ <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> </div> </form> -</section> -<div class="page-header"> +<div class="page-header margin-top"> <h2><?= t('Webhook token') ?></h2> </div> -<section class="listing"> - <ul> - <li> - <?= t('Webhook token:') ?> - <strong><?= $this->text->e($values['webhook_token']) ?></strong> - </li> - <li> - <?= $this->url->link(t('Reset token'), 'ConfigController', 'token', array('type' => 'webhook'), true) ?> - </li> - </ul> -</section> +<div class="panel"> + <?= t('Webhook token:') ?> + <strong><?= $this->text->e($values['webhook_token']) ?></strong> +</div> + +<?= $this->url->link(t('Reset token'), 'ConfigController', 'token', array('type' => 'webhook'), true, 'btn btn-red') ?> diff --git a/app/Template/currency/change.php b/app/Template/currency/change.php new file mode 100644 index 00000000..59a7ce37 --- /dev/null +++ b/app/Template/currency/change.php @@ -0,0 +1,9 @@ +<div class="page-header"> + <h2><?= t('Change reference currency') ?></h2> +</div> +<form method="post" action="<?= $this->url->href('CurrencyController', 'update') ?>" autocomplete="off"> + <?= $this->form->csrf() ?> + <?= $this->form->label(t('Reference currency'), 'application_currency') ?> + <?= $this->form->select('application_currency', $currencies, $values, $errors) ?> + <?= $this->modal->submitButtons() ?> +</form> diff --git a/app/Template/currency/create.php b/app/Template/currency/create.php new file mode 100644 index 00000000..578ece81 --- /dev/null +++ b/app/Template/currency/create.php @@ -0,0 +1,11 @@ +<div class="page-header"> + <h2><?= t('Add or change currency rate') ?></h2> +</div> +<form method="post" action="<?= $this->url->href('CurrencyController', 'save') ?>" autocomplete="off"> + <?= $this->form->csrf() ?> + <?= $this->form->label(t('Currency'), 'currency') ?> + <?= $this->form->select('currency', $currencies, $values, $errors) ?> + <?= $this->form->label(t('Rate'), 'rate') ?> + <?= $this->form->text('rate', $values, $errors, array('autofocus'), 'form-numeric') ?> + <?= $this->modal->submitButtons() ?> +</form> diff --git a/app/Template/currency/index.php b/app/Template/currency/index.php deleted file mode 100644 index db9b21af..00000000 --- a/app/Template/currency/index.php +++ /dev/null @@ -1,54 +0,0 @@ -<div class="page-header"> - <h2><?= t('Currency rates') ?></h2> -</div> - -<?php if (! empty($rates)): ?> - -<table class="table-striped"> - <tr> - <th class="column-35"><?= t('Currency') ?></th> - <th><?= t('Rate') ?></th> - </tr> - <?php foreach ($rates as $rate): ?> - <tr> - <td> - <strong><?= $this->text->e($rate['currency']) ?></strong> - </td> - <td> - <?= n($rate['rate']) ?> - </td> - </tr> - <?php endforeach ?> -</table> - -<hr/> -<h3><?= t('Change reference currency') ?></h3> -<?php endif ?> -<form method="post" action="<?= $this->url->href('CurrencyController', 'reference') ?>" autocomplete="off"> - - <?= $this->form->csrf() ?> - - <?= $this->form->label(t('Reference currency'), 'application_currency') ?> - <?= $this->form->select('application_currency', $currencies, $config_values, $errors) ?> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - </div> -</form> - -<hr/> -<h3><?= t('Add a new currency rate') ?></h3> -<form method="post" action="<?= $this->url->href('CurrencyController', 'create') ?>" autocomplete="off"> - - <?= $this->form->csrf() ?> - - <?= $this->form->label(t('Currency'), 'currency') ?> - <?= $this->form->select('currency', $currencies, $values, $errors) ?> - - <?= $this->form->label(t('Rate'), 'rate') ?> - <?= $this->form->text('rate', $values, $errors, array(), 'form-numeric') ?> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - </div> -</form> diff --git a/app/Template/currency/show.php b/app/Template/currency/show.php new file mode 100644 index 00000000..4b7f34bc --- /dev/null +++ b/app/Template/currency/show.php @@ -0,0 +1,34 @@ +<div class="page-header"> + <h2><?= t('Currency rates') ?></h2> + <ul> + <li> + <?= $this->modal->medium('plus', t('Add or change currency rate'), 'CurrencyController', 'create') ?> + </li> + <li> + <?= $this->modal->medium('edit', t('Change reference currency'), 'CurrencyController', 'change') ?> + </li> + </ul> +</div> + +<div class="panel"> + <strong><?= t('Reference currency: %s', $application_currency) ?></strong> +</div> + +<?php if (! empty($rates)): ?> + <table class="table-striped"> + <tr> + <th class="column-35"><?= t('Currency') ?></th> + <th><?= t('Rate') ?></th> + </tr> + <?php foreach ($rates as $rate): ?> + <tr> + <td> + <strong><?= $this->text->e($rate['currency']) ?></strong> + </td> + <td> + <?= n($rate['rate']) ?> + </td> + </tr> + <?php endforeach ?> + </table> +<?php endif ?> diff --git a/app/Template/custom_filter/add.php b/app/Template/custom_filter/create.php index 3801cc30..24e896ee 100644 --- a/app/Template/custom_filter/add.php +++ b/app/Template/custom_filter/create.php @@ -2,23 +2,20 @@ <h2><?= t('Add a new filter') ?></h2> </div> <form method="post" action="<?= $this->url->href('CustomFilterController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> <?= $this->form->label(t('Name'), 'name') ?> - <?= $this->form->text('name', $values, $errors, array('required', 'maxlength="100"')) ?> + <?= $this->form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="100"')) ?> <?= $this->form->label(t('Filter'), 'filter') ?> <?= $this->form->text('filter', $values, $errors, array('required', 'maxlength="100"')) ?> - <?php if ($this->user->hasProjectAccess('ProjectEditController', 'edit', $project['id'])): ?> + <?php if ($this->user->hasProjectAccess('ProjectEditController', 'show', $project['id'])): ?> <?= $this->form->checkbox('is_shared', t('Share with all project members'), 1) ?> <?php endif ?> <?= $this->form->checkbox('append', t('Append filter (instead of replacement)'), 1) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/custom_filter/edit.php b/app/Template/custom_filter/edit.php index 26da8da2..b64dee53 100644 --- a/app/Template/custom_filter/edit.php +++ b/app/Template/custom_filter/edit.php @@ -2,8 +2,7 @@ <h2><?= t('Edit custom filter') ?></h2> </div> -<form class="form-popover" method="post" action="<?= $this->url->href('CustomFilterController', 'update', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id'])) ?>" autocomplete="off"> - +<form method="post" action="<?= $this->url->href('CustomFilterController', 'update', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> @@ -16,7 +15,7 @@ <?= $this->form->label(t('Filter'), 'filter') ?> <?= $this->form->text('filter', $values, $errors, array('required', 'maxlength="100"')) ?> - <?php if ($this->user->hasProjectAccess('ProjectEditController', 'edit', $project['id'])): ?> + <?php if ($this->user->hasProjectAccess('ProjectEditController', 'show', $project['id'])): ?> <?= $this->form->checkbox('is_shared', t('Share with all project members'), 1, $values['is_shared'] == 1) ?> <?php else: ?> <?= $this->form->hidden('is_shared', $values) ?> @@ -24,9 +23,5 @@ <?= $this->form->checkbox('append', t('Append filter (instead of replacement)'), 1, $values['append'] == 1) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'CustomFilterController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/custom_filter/index.php b/app/Template/custom_filter/index.php index dcab891b..9475c278 100644 --- a/app/Template/custom_filter/index.php +++ b/app/Template/custom_filter/index.php @@ -1,8 +1,12 @@ -<?php if (! empty($custom_filters)): ?> <div class="page-header"> <h2><?= t('Custom filters') ?></h2> + <ul> + <li> + <?= $this->modal->medium('filter', t('Add custom filters'), 'CustomFilterController', 'create', array('project_id' => $project['id'])) ?> + </li> + </ul> </div> -<div> +<?php if (! empty($custom_filters)): ?> <table class="table-striped table-scrolling"> <tr> <th class="column-15"><?= t('Name') ?></th> @@ -36,8 +40,8 @@ <div class="dropdown"> <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> - <li><?= $this->url->link(t('Remove'), 'CustomFilterController', 'confirm', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id']), false, 'popover') ?></li> - <li><?= $this->url->link(t('Edit'), 'CustomFilterController', 'edit', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id']), false, 'popover') ?></li> + <li><?= $this->modal->medium('edit', t('Edit'), 'CustomFilterController', 'edit', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id'])) ?></li> + <li><?= $this->modal->confirm('trash-o', t('Remove'), 'CustomFilterController', 'confirm', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id'])) ?></li> </ul> </div> <?php endif ?> @@ -45,7 +49,7 @@ </tr> <?php endforeach ?> </table> -</div> +<?php else: ?> + <p class="alert"><?= t('There is no custom filter.') ?></p> <?php endif ?> -<?= $this->render('custom_filter/add', array('project' => $project, 'values' => $values, 'errors' => $errors)) ?> diff --git a/app/Template/custom_filter/remove.php b/app/Template/custom_filter/remove.php index 609f19b2..1c576fa2 100644 --- a/app/Template/custom_filter/remove.php +++ b/app/Template/custom_filter/remove.php @@ -1,17 +1,15 @@ -<section id="main"> - <div class="page-header"> - <h2><?= t('Remove a custom filter') ?></h2> - </div> +<div class="page-header"> + <h2><?= t('Remove a custom filter') ?></h2> +</div> - <div class="confirm"> - <p class="alert alert-info"> - <?= t('Do you really want to remove this custom filter: "%s"?', $filter['name']) ?> - </p> +<div class="confirm"> + <p class="alert alert-info"> + <?= t('Do you really want to remove this custom filter: "%s"?', $filter['name']) ?> + </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'CustomFilterController', 'remove', array('project_id' => $project['id'], 'filter_id' => $filter['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'CustomFilterController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> - </div> -</section> + <?= $this->modal->confirmButtons( + 'CustomFilterController', + 'remove', + array('project_id' => $project['id'], 'filter_id' => $filter['id']) + ) ?> +</div> diff --git a/app/Template/dashboard/layout.php b/app/Template/dashboard/layout.php index 795537a6..15ab8a1a 100644 --- a/app/Template/dashboard/layout.php +++ b/app/Template/dashboard/layout.php @@ -3,23 +3,19 @@ <ul> <?php if ($this->user->hasAccess('ProjectCreationController', 'create')): ?> <li> - <i class="fa fa-plus fa-fw"></i> - <?= $this->url->link(t('New project'), 'ProjectCreationController', 'create', array(), false, 'popover') ?> + <?= $this->modal->medium('plus', t('New project'), 'ProjectCreationController', 'create') ?> </li> <?php endif ?> <?php if ($this->app->config('disable_private_project', 0) == 0): ?> <li> - <i class="fa fa-lock fa-fw"></i> - <?= $this->url->link(t('New private project'), 'ProjectCreationController', 'createPrivate', array(), false, 'popover') ?> + <?= $this->modal->medium('lock', t('New private project'), 'ProjectCreationController', 'createPrivate') ?> </li> <?php endif ?> <li> - <i class="fa fa-search fa-fw"></i> - <?= $this->url->link(t('Search'), 'SearchController', 'index') ?> + <?= $this->url->icon('search', t('Search'), 'SearchController', 'index') ?> </li> <li> - <i class="fa fa-folder fa-fw"></i> - <?= $this->url->link(t('Project management'), 'ProjectListController', 'show') ?> + <?= $this->url->icon('folder', t('Project management'), 'ProjectListController', 'show') ?> </li> </ul> </div> diff --git a/app/Template/dashboard/notifications.php b/app/Template/dashboard/notifications.php index 4fb59e24..81adb348 100644 --- a/app/Template/dashboard/notifications.php +++ b/app/Template/dashboard/notifications.php @@ -7,8 +7,7 @@ <?php else: ?> <ul> <li> - <i class="fa fa-check-square-o fa-fw"></i> - <?= $this->url->link(t('Mark all as read'), 'WebNotificationController', 'flush', array('user_id' => $user['id'])) ?> + <?= $this->url->icon('check-square-o', t('Mark all as read'), 'WebNotificationController', 'flush', array('user_id' => $user['id'])) ?> </li> </ul> </div> @@ -60,8 +59,7 @@ <?= $this->dt->datetime($notification['date_creation']) ?> </td> <td> - <i class="fa fa-check fa-fw"></i> - <?= $this->url->link(t('Mark as read'), 'WebNotificationController', 'remove', array('user_id' => $user['id'], 'notification_id' => $notification['id'])) ?> + <?= $this->url->icon('check', t('Mark as read'), 'WebNotificationController', 'remove', array('user_id' => $user['id'], 'notification_id' => $notification['id'])) ?> </td> </tr> <?php endforeach ?> diff --git a/app/Template/dashboard/show.php b/app/Template/dashboard/show.php index aec6f591..b1d877cf 100644 --- a/app/Template/dashboard/show.php +++ b/app/Template/dashboard/show.php @@ -1,4 +1,4 @@ -<div class="filter-box"> +<div class="filter-box margin-bottom"> <form method="get" action="<?= $this->url->dir() ?>" class="search"> <?= $this->form->hidden('controller', array('controller' => 'SearchController')) ?> <?= $this->form->hidden('action', array('action' => 'index')) ?> diff --git a/app/Template/doc/show.php b/app/Template/doc/show.php index a8dbd762..879e45b6 100644 --- a/app/Template/doc/show.php +++ b/app/Template/doc/show.php @@ -2,8 +2,7 @@ <div class="page-header"> <ul> <li> - <i class="fa fa-life-ring fa-fw"></i> - <?= $this->url->link(t('Table of contents'), 'DocumentationController', 'show', array('file' => 'index')) ?> + <?= $this->url->icon('life-ring', t('Table of contents'), 'DocumentationController', 'show', array('file' => 'index')) ?> </li> </ul> </div> diff --git a/app/Template/export/header.php b/app/Template/export/header.php new file mode 100644 index 00000000..35591352 --- /dev/null +++ b/app/Template/export/header.php @@ -0,0 +1,17 @@ +<div class="page-header"> + <h2><?= $this->text->e($project['name']) ?> > <?= $title ?></h2> + <ul> + <li <?= $this->app->checkMenuSelection('ExportController', 'tasks') ?>> + <?= $this->modal->replaceLink(t('Tasks'), 'ExportController', 'tasks', array('project_id' => $project['id'])) ?> + </li> + <li <?= $this->app->checkMenuSelection('ExportController', 'subtasks') ?>> + <?= $this->modal->replaceLink(t('Subtasks'), 'ExportController', 'subtasks', array('project_id' => $project['id'])) ?> + </li> + <li <?= $this->app->checkMenuSelection('ExportController', 'transitions') ?>> + <?= $this->modal->replaceLink(t('Task transitions'), 'ExportController', 'transitions', array('project_id' => $project['id'])) ?> + </li> + <li <?= $this->app->checkMenuSelection('ExportController', 'summary') ?>> + <?= $this->modal->replaceLink(t('Daily project summary'), 'ExportController', 'summary', array('project_id' => $project['id'])) ?> + </li> + </ul> +</div> diff --git a/app/Template/export/sidebar.php b/app/Template/export/sidebar.php deleted file mode 100644 index 463c0cee..00000000 --- a/app/Template/export/sidebar.php +++ /dev/null @@ -1,17 +0,0 @@ -<div class="sidebar"> - <ul> - <li <?= $this->app->checkMenuSelection('ExportController', 'tasks') ?>> - <?= $this->url->link(t('Tasks'), 'ExportController', 'tasks', array('project_id' => $project['id'])) ?> - </li> - <li <?= $this->app->checkMenuSelection('ExportController', 'subtasks') ?>> - <?= $this->url->link(t('Subtasks'), 'ExportController', 'subtasks', array('project_id' => $project['id'])) ?> - </li> - <li <?= $this->app->checkMenuSelection('ExportController', 'transitions') ?>> - <?= $this->url->link(t('Task transitions'), 'ExportController', 'transitions', array('project_id' => $project['id'])) ?> - </li> - <li <?= $this->app->checkMenuSelection('ExportController', 'summary') ?>> - <?= $this->url->link(t('Daily project summary'), 'ExportController', 'summary', array('project_id' => $project['id'])) ?> - </li> - <?= $this->hook->render('template:export:sidebar') ?> - </ul> -</div> diff --git a/app/Template/export/subtasks.php b/app/Template/export/subtasks.php index 959f0e47..0e47772b 100644 --- a/app/Template/export/subtasks.php +++ b/app/Template/export/subtasks.php @@ -1,20 +1,16 @@ -<div class="page-header"> - <h2><?= t('Subtasks export') ?></h2> -</div> +<?= $this->render('export/header', array('project' => $project, 'title' => $title)) ?> <p class="alert alert-info"><?= t('This report contains all subtasks information for the given date range.') ?></p> -<form method="get" action="?" autocomplete="off"> - - <?= $this->form->hidden('controller', $values) ?> - <?= $this->form->hidden('action', $values) ?> +<form class="js-modal-ignore-form" method="post" action="<?= $this->url->href('ExportController', 'subtasks', array('project_id' => $project['id'])) ?>" autocomplete="off"> + <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> <?= $this->form->date(t('Start date'), 'from', $values) ?> <?= $this->form->date(t('End date'), 'to', $values) ?> - <div class="form-help"><?= t('Others formats accepted: %s and %s', date('Y-m-d'), date('Y_m_d')) ?></div> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Execute') ?></button> + <button type="submit" class="btn btn-blue js-form-export"><?= t('Export') ?></button> + <?= t('or') ?> + <?= $this->url->link(t('cancel'), 'ExportController', 'subtasks', array('project_id' => $project['id']), false, 'js-modal-close') ?> </div> </form> diff --git a/app/Template/export/summary.php b/app/Template/export/summary.php index a7483fcb..7dc7482f 100644 --- a/app/Template/export/summary.php +++ b/app/Template/export/summary.php @@ -1,20 +1,16 @@ -<div class="page-header"> - <h2><?= t('Daily project summary export') ?></h2> -</div> +<?= $this->render('export/header', array('project' => $project, 'title' => $title)) ?> <p class="alert alert-info"><?= t('This export contains the number of tasks per column grouped per day.') ?></p> -<form method="get" action="?" autocomplete="off"> - <?= $this->form->hidden('controller', $values) ?> - <?= $this->form->hidden('action', $values) ?> +<form class="js-modal-ignore-form" method="post" action="<?= $this->url->href('ExportController', 'summary', array('project_id' => $project['id'])) ?>" autocomplete="off"> + <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> - <?= $this->form->date(t('Start date'), 'from', $values) ?> <?= $this->form->date(t('End date'), 'to', $values) ?> - <div class="form-help"><?= t('Others formats accepted: %s and %s', date('Y-m-d'), date('Y_m_d')) ?></div> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Execute') ?></button> + <button type="submit" class="btn btn-blue js-form-export"><?= t('Export') ?></button> + <?= t('or') ?> + <?= $this->url->link(t('cancel'), 'ExportController', 'summary', array('project_id' => $project['id']), false, 'js-modal-close') ?> </div> </form> diff --git a/app/Template/export/tasks.php b/app/Template/export/tasks.php index ce1c869e..232ff8eb 100644 --- a/app/Template/export/tasks.php +++ b/app/Template/export/tasks.php @@ -1,20 +1,16 @@ -<div class="page-header"> - <h2><?= t('Tasks exportation') ?></h2> -</div> +<?= $this->render('export/header', array('project' => $project, 'title' => $title)) ?> <p class="alert alert-info"><?= t('This report contains all tasks information for the given date range.') ?></p> -<form method="get" action="?" autocomplete="off"> - <?= $this->form->hidden('controller', $values) ?> - <?= $this->form->hidden('action', $values) ?> +<form class="js-modal-ignore-form" method="post" action="<?= $this->url->href('ExportController', 'tasks', array('project_id' => $project['id'])) ?>" autocomplete="off"> + <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> - <?= $this->form->date(t('Start date'), 'from', $values) ?> <?= $this->form->date(t('End date'), 'to', $values) ?> - <div class="form-help"><?= t('Others formats accepted: %s and %s', date('Y-m-d'), date('Y_m_d')) ?></div> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Execute') ?></button> + <button type="submit" class="btn btn-blue js-form-export"><?= t('Export') ?></button> + <?= t('or') ?> + <?= $this->url->link(t('cancel'), 'ExportController', 'tasks', array('project_id' => $project['id']), false, 'js-modal-close') ?> </div> </form> diff --git a/app/Template/export/transitions.php b/app/Template/export/transitions.php index 7cd355db..4f3749b8 100644 --- a/app/Template/export/transitions.php +++ b/app/Template/export/transitions.php @@ -1,21 +1,16 @@ -<div class="page-header"> - <h2><?= t('Task transitions export') ?></h2> -</div> +<?= $this->render('export/header', array('project' => $project, 'title' => $title)) ?> <p class="alert alert-info"><?= t('This report contains all column moves for each task with the date, the user and the time spent for each transition.') ?></p> -<form method="get" action="?" autocomplete="off"> - - <?= $this->form->hidden('controller', $values) ?> - <?= $this->form->hidden('action', $values) ?> +<form class="js-modal-ignore-form" method="post" action="<?= $this->url->href('ExportController', 'transitions', array('project_id' => $project['id'])) ?>" autocomplete="off"> + <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> - <?= $this->form->date(t('Start date'), 'from', $values) ?> <?= $this->form->date(t('End date'), 'to', $values) ?> - <div class="form-help"><?= t('Others formats accepted: %s and %s', date('Y-m-d'), date('Y_m_d')) ?></div> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Execute') ?></button> + <button type="submit" class="btn btn-blue js-form-export"><?= t('Export') ?></button> + <?= t('or') ?> + <?= $this->url->link(t('cancel'), 'ExportController', 'transitions', array('project_id' => $project['id']), false, 'js-modal-close') ?> </div> </form> diff --git a/app/Template/external_task_creation/step1.php b/app/Template/external_task_creation/step1.php index 2af9b427..2a3b0144 100644 --- a/app/Template/external_task_creation/step1.php +++ b/app/Template/external_task_creation/step1.php @@ -1,4 +1,4 @@ -<form class="popover-form" method="post" action="<?= $this->url->href('ExternalTaskCreationController', 'step2', array('project_id' => $project['id'], 'provider_name' => $provider_name)) ?>"> +<form method="post" action="<?= $this->url->href('ExternalTaskCreationController', 'step2', array('project_id' => $project['id'], 'provider_name' => $provider_name)) ?>"> <?= $this->form->csrf() ?> <?= $this->form->hidden('swimlane_id', $values) ?> <?= $this->form->hidden('column_id', $values) ?> @@ -12,8 +12,5 @@ <div class="alert alert-error"><?= $this->text->e($error_message) ?></div> <?php endif ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Next') ?></button> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'BoardViewController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons(array('submitLabel' => t('Next'))) ?> </form> diff --git a/app/Template/external_task_creation/step2.php b/app/Template/external_task_creation/step2.php index 4bc0e509..baace3ae 100644 --- a/app/Template/external_task_creation/step2.php +++ b/app/Template/external_task_creation/step2.php @@ -1,4 +1,4 @@ -<form class="popover-form" method="post" action="<?= $this->url->href('ExternalTaskCreationController', 'step3', array('project_id' => $project['id'], 'provider_name' => $provider_name)) ?>"> +<form method="post" action="<?= $this->url->href('ExternalTaskCreationController', 'step3', array('project_id' => $project['id'], 'provider_name' => $provider_name)) ?>"> <?= $this->form->csrf() ?> <?= $this->form->hidden('external_provider', $values) ?> <?= $this->form->hidden('external_uri', $values) ?> @@ -18,8 +18,5 @@ <div class="alert alert-error"><?= $this->text->e($error_message) ?></div> <?php endif ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'BoardViewController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/external_task_modification/show.php b/app/Template/external_task_modification/show.php index 79dd9556..55180b96 100644 --- a/app/Template/external_task_modification/show.php +++ b/app/Template/external_task_modification/show.php @@ -1,4 +1,4 @@ -<form class="popover-form" method="post" action="<?= $this->url->href('TaskModificationController', 'update', array('task_id' => $task['id'], 'project_id' => $project['id'])) ?>"> +<form method="post" action="<?= $this->url->href('TaskModificationController', 'update', array('task_id' => $task['id'], 'project_id' => $project['id'])) ?>"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> <?= $this->form->hidden('project_id', $values) ?> @@ -18,9 +18,5 @@ )) ?> <?php endif ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/group/associate.php b/app/Template/group/associate.php index 24edd133..cd7f2b77 100644 --- a/app/Template/group/associate.php +++ b/app/Template/group/associate.php @@ -3,8 +3,11 @@ </div> <?php if (empty($users)): ?> <p class="alert"><?= t('There is no user available.') ?></p> + <div class="form-actions"> + <?= $this->url->link(t('Close this window'), 'GroupListController', 'index', array(), false, 'btn js-modal-close') ?> + </div> <?php else: ?> - <form class="popover-form" method="post" action="<?= $this->url->href('GroupListController', 'addUser', array('group_id' => $group['id'])) ?>" autocomplete="off"> + <form method="post" action="<?= $this->url->href('GroupListController', 'addUser', array('group_id' => $group['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('group_id', $values) ?> @@ -12,13 +15,9 @@ <?= $this->app->component('select-dropdown-autocomplete', array( 'name' => 'user_id', 'items' => $users, - 'defaultValue' => isset($values['user_id']) ? $values['user_id'] : null, + 'defaultValue' => isset($values['user_id']) ? $values['user_id'] : key($users), )) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'GroupListController', 'index', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> <?php endif ?> diff --git a/app/Template/group/dissociate.php b/app/Template/group/dissociate.php index 50ef6d61..24836397 100644 --- a/app/Template/group/dissociate.php +++ b/app/Template/group/dissociate.php @@ -4,9 +4,9 @@ <div class="confirm"> <p class="alert alert-info"><?= t('Do you really want to remove the user "%s" from the group "%s"?', $user['name'] ?: $user['username'], $group['name']) ?></p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'GroupListController', 'removeUser', array('group_id' => $group['id'], 'user_id' => $user['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'GroupListController', 'users', array('group_id' => $group['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'GroupListController', + 'removeUser', + array('group_id' => $group['id'], 'user_id' => $user['id']) + ) ?> </div> diff --git a/app/Template/group/index.php b/app/Template/group/index.php index fe8a07e7..fe3f398e 100644 --- a/app/Template/group/index.php +++ b/app/Template/group/index.php @@ -1,14 +1,14 @@ <section id="main"> <div class="page-header"> <ul> - <li><i class="fa fa-user fa-fw"></i><?= $this->url->link(t('All users'), 'UserListController', 'show') ?></li> - <li><i class="fa fa-user-plus fa-fw"></i><?= $this->url->link(t('New group'), 'GroupCreationController', 'show', array(), false, 'popover') ?></li> + <li><?= $this->url->icon('user', t('All users'), 'UserListController', 'show') ?></li> + <li><?= $this->modal->medium('user-plus', t('New group'), 'GroupCreationController', 'show') ?></li> </ul> </div> <?php if ($paginator->isEmpty()): ?> <p class="alert"><?= t('There is no group.') ?></p> <?php else: ?> - <table class="table-small table-fixed table-scrolling"> + <table class="table-fixed table-scrolling"> <tr> <th class="column-5"><?= $paginator->order(t('Id'), 'id') ?></th> <th class="column-20"><?= $paginator->order(t('External Id'), 'external_id') ?></th> @@ -30,10 +30,10 @@ <div class="dropdown"> <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> - <li><?= $this->url->link(t('Add group member'), 'GroupListController', 'associate', array('group_id' => $group['id']), false, 'popover') ?></li> - <li><?= $this->url->link(t('Members'), 'GroupListController', 'users', array('group_id' => $group['id'])) ?></li> - <li><?= $this->url->link(t('Edit'), 'GroupModificationController', 'show', array('group_id' => $group['id']), false, 'popover') ?></li> - <li><?= $this->url->link(t('Remove'), 'GroupListController', 'confirm', array('group_id' => $group['id']), false, 'popover') ?></li> + <li><?= $this->modal->medium('plus', t('Add group member'), 'GroupListController', 'associate', array('group_id' => $group['id'])) ?></li> + <li><?= $this->url->icon('users', t('Members'), 'GroupListController', 'users', array('group_id' => $group['id'])) ?></li> + <li><?= $this->modal->medium('edit', t('Edit'), 'GroupModificationController', 'show', array('group_id' => $group['id'])) ?></li> + <li><?= $this->modal->confirm('trash-o', t('Remove'), 'GroupListController', 'confirm', array('group_id' => $group['id'])) ?></li> </ul> </div> </td> diff --git a/app/Template/group/remove.php b/app/Template/group/remove.php index 408b3d83..77d602f9 100644 --- a/app/Template/group/remove.php +++ b/app/Template/group/remove.php @@ -4,9 +4,9 @@ <div class="confirm"> <p class="alert alert-info"><?= t('Do you really want to remove this group: "%s"?', $group['name']) ?></p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'GroupListController', 'remove', array('group_id' => $group['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'GroupListController', 'index', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'GroupListController', + 'remove', + array('group_id' => $group['id']) + ) ?> </div> diff --git a/app/Template/group/users.php b/app/Template/group/users.php index 73597b39..ef179674 100644 --- a/app/Template/group/users.php +++ b/app/Template/group/users.php @@ -1,8 +1,8 @@ <section id="main"> <div class="page-header"> <ul> - <li><i class="fa fa-users fa-fw"></i><?= $this->url->link(t('View all groups'), 'GroupListController', 'index') ?></li> - <li><i class="fa fa-plus fa-fw"></i><?= $this->url->link(t('Add group member'), 'GroupListController', 'associate', array('group_id' => $group['id']), false, 'popover') ?></li> + <li><?= $this->url->icon('users', t('View all groups'), 'GroupListController', 'index') ?></li> + <li><?= $this->modal->medium('plus', t('Add group member'), 'GroupListController', 'associate', array('group_id' => $group['id'])) ?></li> </ul> </div> <?php if ($paginator->isEmpty()): ?> @@ -31,8 +31,7 @@ <a href="mailto:<?= $this->text->e($user['email']) ?>"><?= $this->text->e($user['email']) ?></a> </td> <td> - <i class="fa fa-times fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Remove this user'), 'GroupListController', 'dissociate', array('group_id' => $group['id'], 'user_id' => $user['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove this user'), 'GroupListController', 'dissociate', array('group_id' => $group['id'], 'user_id' => $user['id'])) ?> </td> </tr> <?php endforeach ?> diff --git a/app/Template/group_creation/show.php b/app/Template/group_creation/show.php index b219bd70..9f4f5608 100644 --- a/app/Template/group_creation/show.php +++ b/app/Template/group_creation/show.php @@ -1,15 +1,11 @@ <div class="page-header"> <h2><?= t('New group') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('GroupCreationController', 'save') ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('GroupCreationController', 'save') ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->label(t('Name'), 'name') ?> <?= $this->form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="100"')) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'GroupListController', 'index', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/group_modification/show.php b/app/Template/group_modification/show.php index ddf07369..df4ed01e 100644 --- a/app/Template/group_modification/show.php +++ b/app/Template/group_modification/show.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('Edit group') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('GroupModificationController', 'save') ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('GroupModificationController', 'save') ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> @@ -10,9 +10,5 @@ <?= $this->form->label(t('Name'), 'name') ?> <?= $this->form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="100"')) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'GroupListController', 'index', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/header/creation_dropdown.php b/app/Template/header/creation_dropdown.php index d3b9e7cb..9bdf5ad2 100644 --- a/app/Template/header/creation_dropdown.php +++ b/app/Template/header/creation_dropdown.php @@ -6,14 +6,13 @@ <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-plus fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> <?php if ($has_project_creation_access): ?> - <li><i class="fa fa-plus fa-fw"></i> - <?= $this->url->link(t('New project'), 'ProjectCreationController', 'create', array(), false, 'popover') ?> + <li> + <?= $this->modal->medium('plus', t('New project'), 'ProjectCreationController', 'create') ?> </li> <?php endif ?> <?php if ($is_private_project_enabled): ?> <li> - <i class="fa fa-lock fa-fw"></i> - <?= $this->url->link(t('New private project'), 'ProjectCreationController', 'createPrivate', array(), false, 'popover') ?> + <?= $this->modal->medium('lock', t('New private project'), 'ProjectCreationController', 'createPrivate') ?> </li> <?php endif ?> <?= $this->hook->render('template:header:creation-dropdown') ?> diff --git a/app/Template/header/user_dropdown.php b/app/Template/header/user_dropdown.php index 49d08213..a74bdd52 100644 --- a/app/Template/header/user_dropdown.php +++ b/app/Template/header/user_dropdown.php @@ -3,46 +3,37 @@ <ul> <li class="no-hover"><strong><?= $this->text->e($this->user->getFullname()) ?></strong></li> <li> - <i class="fa fa-tachometer fa-fw"></i> - <?= $this->url->link(t('My dashboard'), 'DashboardController', 'show', array('user_id' => $this->user->getId())) ?> + <?= $this->url->icon('tachometer', t('My dashboard'), 'DashboardController', 'show', array('user_id' => $this->user->getId())) ?> </li> <li> - <i class="fa fa-home fa-fw"></i> - <?= $this->url->link(t('My profile'), 'UserViewController', 'show', array('user_id' => $this->user->getId())) ?> + <?= $this->url->icon('home', t('My profile'), 'UserViewController', 'show', array('user_id' => $this->user->getId())) ?> </li> <li> - <i class="fa fa-folder fa-fw"></i> - <?= $this->url->link(t('Projects management'), 'ProjectListController', 'show') ?> + <?= $this->url->icon('folder', t('Projects management'), 'ProjectListController', 'show') ?> </li> <?php if ($this->user->hasAccess('UserListController', 'show')): ?> <li> - <i class="fa fa-user fa-fw"></i> - <?= $this->url->link(t('Users management'), 'UserListController', 'show') ?> + <?= $this->url->icon('user', t('Users management'), 'UserListController', 'show') ?> </li> <li> - <i class="fa fa-group fa-fw"></i> - <?= $this->url->link(t('Groups management'), 'GroupListController', 'index') ?> + <?= $this->url->icon('group', t('Groups management'), 'GroupListController', 'index') ?> </li> <li> - <i class="fa fa-cubes" aria-hidden="true"></i> - <?= $this->url->link(t('Plugins'), 'PluginController', 'show') ?> + <?= $this->url->icon('cubes', t('Plugins'), 'PluginController', 'show') ?> </li> <li> - <i class="fa fa-cog fa-fw"></i> - <?= $this->url->link(t('Settings'), 'ConfigController', 'index') ?> + <?= $this->url->icon('cog', t('Settings'), 'ConfigController', 'index') ?> </li> <?php endif ?> <?= $this->hook->render('template:header:dropdown') ?> <li> - <i class="fa fa-life-ring fa-fw"></i> - <?= $this->url->link(t('Documentation'), 'DocumentationController', 'show') ?> + <?= $this->url->icon('life-ring', t('Documentation'), 'DocumentationController', 'show') ?> </li> <?php if (! DISABLE_LOGOUT): ?> <li> - <i class="fa fa-sign-out fa-fw"></i> - <?= $this->url->link(t('Logout'), 'AuthController', 'logout') ?> + <?= $this->url->icon('sign-out', t('Logout'), 'AuthController', 'logout') ?> </li> <?php endif ?> </ul> diff --git a/app/Template/layout.php b/app/Template/layout.php index 8c85ffc6..241b99df 100644 --- a/app/Template/layout.php +++ b/app/Template/layout.php @@ -53,6 +53,7 @@ > <?php if (isset($no_layout) && $no_layout): ?> + <?= $this->app->flashMessage() ?> <?= $content_for_layout ?> <?php else: ?> <?= $this->hook->render('template:layout:top') ?> diff --git a/app/Template/link/create.php b/app/Template/link/create.php index 23990604..37610a3b 100644 --- a/app/Template/link/create.php +++ b/app/Template/link/create.php @@ -1,18 +1,12 @@ <div class="page-header"> - <h2><?= t('Add a new link') ?></h2> + <h2><?= t('Add link label') ?></h2> </div> <form action="<?= $this->url->href('LinkController', 'save') ?>" method="post" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->label(t('Label'), 'label') ?> - <?= $this->form->text('label', $values, $errors, array('required')) ?> - + <?= $this->form->text('label', $values, $errors, array('required', 'autofocus')) ?> <?= $this->form->label(t('Opposite label'), 'opposite_label') ?> <?= $this->form->text('opposite_label', $values, $errors) ?> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/link/edit.php b/app/Template/link/edit.php index cb4f29e2..4be56573 100644 --- a/app/Template/link/edit.php +++ b/app/Template/link/edit.php @@ -13,9 +13,5 @@ <?= $this->form->label(t('Opposite label'), 'opposite_id') ?> <?= $this->form->select('opposite_id', $labels, $values, $errors) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'LinkController', 'index') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/link/index.php b/app/Template/link/index.php deleted file mode 100644 index 70ead4a6..00000000 --- a/app/Template/link/index.php +++ /dev/null @@ -1,33 +0,0 @@ -<div class="page-header"> - <h2><?= t('Link labels') ?></h2> -</div> -<?php if (! empty($links)): ?> -<table class="table-striped table-scrolling"> - <tr> - <th class="column-70"><?= t('Link labels') ?></th> - <th><?= t('Actions') ?></th> - </tr> - <?php foreach ($links as $link): ?> - <tr> - <td> - <strong><?= t($link['label']) ?></strong> - - <?php if (! empty($link['opposite_label'])): ?> - | <?= t($link['opposite_label']) ?> - <?php endif ?> - </td> - <td> - <ul> - <?= $this->url->link(t('Edit'), 'LinkController', 'edit', array('link_id' => $link['id'])) ?> - <?= t('or') ?> - <?= $this->url->link(t('Remove'), 'LinkController', 'confirm', array('link_id' => $link['id'])) ?> - </ul> - </td> - </tr> - <?php endforeach ?> -</table> -<?php else: ?> - <?= t('There is no link.') ?> -<?php endif ?> - -<?= $this->render('link/create', array('values' => $values, 'errors' => $errors)) ?> diff --git a/app/Template/link/remove.php b/app/Template/link/remove.php index b7fbef5e..e5ea2466 100644 --- a/app/Template/link/remove.php +++ b/app/Template/link/remove.php @@ -7,9 +7,9 @@ <?= t('Do you really want to remove this link: "%s"?', $link['label']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'LinkController', 'remove', array('link_id' => $link['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'LinkController', 'index') ?> - </div> + <?= $this->modal->confirmButtons( + 'LinkController', + 'remove', + array('link_id' => $link['id']) + ) ?> </div> diff --git a/app/Template/link/show.php b/app/Template/link/show.php new file mode 100644 index 00000000..6aadd66b --- /dev/null +++ b/app/Template/link/show.php @@ -0,0 +1,36 @@ +<div class="page-header"> + <h2><?= t('Link labels') ?></h2> + <ul> + <li> + <?= $this->modal->medium('plus', t('Add link label'), 'LinkController', 'create') ?> + </li> + </ul> +</div> +<?php if (! empty($links)): ?> + <table class="table-striped table-scrolling"> + <tr> + <th class="column-70"><?= t('Link labels') ?></th> + <th><?= t('Actions') ?></th> + </tr> + <?php foreach ($links as $link): ?> + <tr> + <td> + <strong><?= t($link['label']) ?></strong> + + <?php if (! empty($link['opposite_label'])): ?> + | <?= t($link['opposite_label']) ?> + <?php endif ?> + </td> + <td> + <ul> + <?= $this->modal->medium('edit', t('Edit'), 'LinkController', 'edit', array('link_id' => $link['id'])) ?> + <?= t('or') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'LinkController', 'confirm', array('link_id' => $link['id'])) ?> + </ul> + </td> + </tr> + <?php endforeach ?> + </table> +<?php else: ?> + <?= t('There is no link.') ?> +<?php endif ?> diff --git a/app/Template/plugin/directory.php b/app/Template/plugin/directory.php index b6c6734c..b2fffcb9 100644 --- a/app/Template/plugin/directory.php +++ b/app/Template/plugin/directory.php @@ -28,11 +28,9 @@ <td> <?php if ($is_configured): ?> <?php if (! isset($installed_plugins[$plugin['title']])): ?> - <i class="fa fa-cloud-download fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Install'), 'PluginController', 'install', array('archive_url' => urlencode($plugin['download'])), true) ?> + <?= $this->url->icon('cloud-download', t('Install'), 'PluginController', 'install', array('archive_url' => urlencode($plugin['download'])), true) ?> <?php elseif ($installed_plugins[$plugin['title']] < $plugin['version']): ?> - <i class="fa fa-refresh fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Update'), 'PluginController', 'update', array('archive_url' => urlencode($plugin['download'])), true) ?> + <?= $this->url->icon('refresh', t('Update'), 'PluginController', 'update', array('archive_url' => urlencode($plugin['download'])), true) ?> <?php else: ?> <i class="fa fa-check-circle-o" aria-hidden="true"></i> <?= t('Up to date') ?> diff --git a/app/Template/plugin/remove.php b/app/Template/plugin/remove.php index bd8f4eb8..1280f8aa 100644 --- a/app/Template/plugin/remove.php +++ b/app/Template/plugin/remove.php @@ -5,9 +5,9 @@ <div class="confirm"> <p class="alert alert-info"><?= t('Do you really want to remove this plugin: "%s"?', $plugin->getPluginName()) ?></p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'PluginController', 'uninstall', array('pluginId' => $plugin_id), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'PluginController', 'show', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'PluginController', + 'uninstall', + array('pluginId' => $plugin_id) + ) ?> </div> diff --git a/app/Template/plugin/show.php b/app/Template/plugin/show.php index 9c3d6d20..266568ac 100644 --- a/app/Template/plugin/show.php +++ b/app/Template/plugin/show.php @@ -1,3 +1,43 @@ +<?php if (! empty($incompatible_plugins)): ?> + <div class="page-header"> + <h2><?= t('Incompatible Plugins') ?></h2> + </div> + <table> + <tr> + <th class="column-35"><?= t('Name') ?></th> + <th class="column-25"><?= t('Author') ?></th> + <th class="column-10"><?= t('Version') ?></th> + <th class="column-12"><?= t('Compatibility') ?></th> + <?php if ($is_configured): ?> + <th><?= t('Action') ?></th> + <?php endif ?> + </tr> + + <?php foreach ($incompatible_plugins as $pluginFolder => $plugin): ?> + <tr> + <td> + <?php if ($plugin->getPluginHomepage()): ?> + <a href="<?= $plugin->getPluginHomepage() ?>" target="_blank" rel="noreferrer"><?= $this->text->e($plugin->getPluginName()) ?></a> + <?php else: ?> + <?= $this->text->e($plugin->getPluginName()) ?> + <?php endif ?> + </td> + <td><?= $this->text->e($plugin->getPluginAuthor()) ?></td> + <td><?= $this->text->e($plugin->getPluginVersion()) ?></td> + <td><?= $this->text->e($plugin->getCompatibleVersion()) ?></td> + <?php if ($is_configured): ?> + <td> + <?= $this->modal->confirm('trash-o', t('Uninstall'), 'PluginController', 'confirm', array('pluginId' => $pluginFolder)) ?> + </td> + <?php endif ?> + </tr> + <tr> + <td colspan="<?= $is_configured ? 6 : 5 ?>"><?= $this->text->e($plugin->getPluginDescription()) ?></td> + </tr> + <?php endforeach ?> + </table> +<?php endif ?> + <div class="page-header"> <h2><?= t('Installed Plugins') ?></h2> </div> @@ -28,8 +68,7 @@ <td><?= $this->text->e($plugin->getPluginVersion()) ?></td> <?php if ($is_configured): ?> <td> - <i class="fa fa-trash-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Uninstall'), 'PluginController', 'confirm', array('pluginId' => $pluginFolder), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Uninstall'), 'PluginController', 'confirm', array('pluginId' => $pluginFolder)) ?> </td> <?php endif ?> </tr> diff --git a/app/Template/project/dropdown.php b/app/Template/project/dropdown.php index e3cf41c2..447cd0b4 100644 --- a/app/Template/project/dropdown.php +++ b/app/Template/project/dropdown.php @@ -2,42 +2,35 @@ <a href="#" class="dropdown-menu dashboard-table-link">#<?= $project['id'] ?></a> <ul> <li> - <i class="fa fa-th fa-fw"></i> - <?= $this->url->link(t('Board'), 'BoardViewController', 'show', array('project_id' => $project['id'])) ?> + <?= $this->url->icon('th', t('Board'), 'BoardViewController', 'show', array('project_id' => $project['id'])) ?> </li> <li> - <i class="fa fa-calendar fa-fw"></i> - <?= $this->url->link(t('Calendar'), 'CalendarController', 'show', array('project_id' => $project['id'])) ?> + <?= $this->url->icon('calendar', t('Calendar'), 'CalendarController', 'show', array('project_id' => $project['id'])) ?> </li> <li> - <i class="fa fa-list fa-fw"></i> - <?= $this->url->link(t('Listing'), 'TaskListController', 'show', array('project_id' => $project['id'])) ?> + <?= $this->url->icon('list', t('Listing'), 'TaskListController', 'show', array('project_id' => $project['id'])) ?> </li> <?php if ($this->user->hasProjectAccess('TaskGanttController', 'show', $project['id'])): ?> <li> - <i class="fa fa-sliders fa-fw"></i> - <?= $this->url->link(t('Gantt'), 'TaskGanttController', 'show', array('project_id' => $project['id'])) ?> + <?= $this->url->icon('sliders', t('Gantt'), 'TaskGanttController', 'show', array('project_id' => $project['id'])) ?> </li> <?php endif ?> <li> - <i class="fa fa-dashboard fa-fw"></i> - <?= $this->url->link(t('Activity'), 'ActivityController', 'project', array('project_id' => $project['id'])) ?> + <?= $this->modal->medium('dashboard', t('Activity'), 'ActivityController', 'project', array('project_id' => $project['id'])) ?> </li> <?php if ($this->user->hasProjectAccess('AnalyticController', 'taskDistribution', $project['id'])): ?> <li> - <i class="fa fa-line-chart fa-fw"></i> - <?= $this->url->link(t('Analytics'), 'AnalyticController', 'taskDistribution', array('project_id' => $project['id'])) ?> + <?= $this->modal->large('line-chart', t('Analytics'), 'AnalyticController', 'taskDistribution', array('project_id' => $project['id'])) ?> </li> <?php endif ?> <?= $this->hook->render('template:project:dropdown', array('project' => $project)) ?> - <?php if ($this->user->hasProjectAccess('ProjectEditController', 'edit', $project['id'])): ?> + <?php if ($this->user->hasProjectAccess('ProjectEditController', 'show', $project['id'])): ?> <li> - <i class="fa fa-cog fa-fw"></i> - <?= $this->url->link(t('Settings'), 'ProjectViewController', 'show', array('project_id' => $project['id'])) ?> + <?= $this->url->icon('cog', t('Settings'), 'ProjectViewController', 'show', array('project_id' => $project['id'])) ?> </li> <?php endif ?> </ul> diff --git a/app/Template/project/sidebar.php b/app/Template/project/sidebar.php index 6e7fff05..812eb351 100644 --- a/app/Template/project/sidebar.php +++ b/app/Template/project/sidebar.php @@ -9,9 +9,9 @@ </li> <?php endif ?> - <?php if ($this->user->hasProjectAccess('ProjectEditController', 'edit', $project['id'])): ?> + <?php if ($this->user->hasProjectAccess('ProjectEditController', 'show', $project['id'])): ?> <li <?= $this->app->checkMenuSelection('ProjectEditController') ?>> - <?= $this->url->link(t('Edit project'), 'ProjectEditController', 'edit', array('project_id' => $project['id'])) ?> + <?= $this->url->link(t('Edit project'), 'ProjectEditController', 'show', array('project_id' => $project['id'])) ?> </li> <li <?= $this->app->checkMenuSelection('ProjectViewController', 'share') ?>> <?= $this->url->link(t('Public access'), 'ProjectViewController', 'share', array('project_id' => $project['id'])) ?> @@ -50,15 +50,15 @@ </li> <?php if ($project['is_active']): ?> <li> - <?= $this->url->link(t('Disable'), 'ProjectStatusController', 'confirmDisable', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->confirmLink(t('Disable'), 'ProjectStatusController', 'confirmDisable', array('project_id' => $project['id'])) ?> <?php else: ?> <li> - <?= $this->url->link(t('Enable'), 'ProjectStatusController', 'confirmEnable', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->confirmLink(t('Enable'), 'ProjectStatusController', 'confirmEnable', array('project_id' => $project['id'])) ?> <?php endif ?> </li> <?php if ($this->user->hasProjectAccess('ProjectStatusController', 'remove', $project['id'])): ?> <li> - <?= $this->url->link(t('Remove'), 'ProjectStatusController', 'confirmRemove', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->confirmLink(t('Remove'), 'ProjectStatusController', 'confirmRemove', array('project_id' => $project['id'])) ?> </li> <?php endif ?> <?php endif ?> diff --git a/app/Template/project_action_duplication/show.php b/app/Template/project_action_duplication/show.php index 2eebb262..c2f52e35 100644 --- a/app/Template/project_action_duplication/show.php +++ b/app/Template/project_action_duplication/show.php @@ -4,16 +4,12 @@ <?php if (empty($projects_list)): ?> <p class="alert"><?= t('There is no available project.') ?></p> <?php else: ?> - <form class="popover-form" method="post" action="<?= $this->url->href('ProjectActionDuplicationController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> + <form method="post" action="<?= $this->url->href('ProjectActionDuplicationController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->label(t('Create from another project'), 'src_project_id') ?> <?= $this->form->select('src_project_id', $projects_list) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'Action', 'index', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> <?php endif ?> diff --git a/app/Template/project_creation/create.php b/app/Template/project_creation/create.php index 1df15d7d..171bd17a 100644 --- a/app/Template/project_creation/create.php +++ b/app/Template/project_creation/create.php @@ -2,7 +2,7 @@ <div class="page-header"> <h2><?= $title ?></h2> </div> - <form class="popover-form" id="project-creation-form" method="post" action="<?= $this->url->href('ProjectCreationController', 'save') ?>" autocomplete="off"> + <form id="project-creation-form" method="post" action="<?= $this->url->href('ProjectCreationController', 'save') ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('is_private', $values) ?> @@ -29,11 +29,7 @@ <?= $this->form->checkbox('projectTaskDuplicationModel', t('Tasks'), 1, false) ?> </div> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectListController', 'show', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> <?php if ($is_private): ?> <div class="alert alert-info"> diff --git a/app/Template/project_edit/dates.php b/app/Template/project_edit/dates.php deleted file mode 100644 index 1c2c3dd4..00000000 --- a/app/Template/project_edit/dates.php +++ /dev/null @@ -1,22 +0,0 @@ -<div class="page-header"> - <h2><?= t('Edit project') ?></h2> - <ul> - <li ><?= $this->url->link(t('General'), 'ProjectEditController', 'edit', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li class="active"><?= $this->url->link(t('Dates'), 'ProjectEditController', 'dates', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li><?= $this->url->link(t('Description'), 'ProjectEditController', 'description', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li><?= $this->url->link(t('Task priority'), 'ProjectEditController', 'priority', array('project_id' => $project['id']), false, 'popover-link') ?></li> - </ul> -</div> -<form method="post" class="popover-form" action="<?= $this->url->href('ProjectEditController', 'update', array('project_id' => $project['id'], 'redirect' => 'dates')) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->hidden('id', $values) ?> - <?= $this->form->hidden('name', $values) ?> - <?= $this->form->date(t('Start date'), 'start_date', $values, $errors) ?> - <?= $this->form->date(t('End date'), 'end_date', $values, $errors) ?> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - </div> -</form> - -<p class="alert alert-info"><?= t('Those dates are useful for the project Gantt chart.') ?></p> diff --git a/app/Template/project_edit/description.php b/app/Template/project_edit/description.php deleted file mode 100644 index 586ddfcb..00000000 --- a/app/Template/project_edit/description.php +++ /dev/null @@ -1,19 +0,0 @@ -<div class="page-header"> - <h2><?= t('Edit project') ?></h2> - <ul> - <li><?= $this->url->link(t('General'), 'ProjectEditController', 'edit', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li><?= $this->url->link(t('Dates'), 'ProjectEditController', 'dates', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li class="active"><?= $this->url->link(t('Description'), 'ProjectEditController', 'description', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li><?= $this->url->link(t('Task priority'), 'ProjectEditController', 'priority', array('project_id' => $project['id']), false, 'popover-link') ?></li> - </ul> -</div> -<form method="post" class="popover-form" action="<?= $this->url->href('ProjectEditController', 'update', array('project_id' => $project['id'], 'redirect' => 'description')) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->hidden('id', $values) ?> - <?= $this->form->hidden('name', $values) ?> - <?= $this->form->textEditor('description', $values, $errors, array('autofocus' => true)) ?> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - </div> -</form> diff --git a/app/Template/project_edit/general.php b/app/Template/project_edit/general.php deleted file mode 100644 index c7421477..00000000 --- a/app/Template/project_edit/general.php +++ /dev/null @@ -1,36 +0,0 @@ -<div class="page-header"> - <h2><?= t('Edit project') ?></h2> - <ul> - <li class="active"><?= $this->url->link(t('General'), 'ProjectEditController', 'edit', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li><?= $this->url->link(t('Dates'), 'ProjectEditController', 'dates', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li><?= $this->url->link(t('Description'), 'ProjectEditController', 'description', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li><?= $this->url->link(t('Task priority'), 'ProjectEditController', 'priority', array('project_id' => $project['id']), false, 'popover-link') ?></li> - </ul> -</div> -<form method="post" class="popover-form" action="<?= $this->url->href('ProjectEditController', 'update', array('project_id' => $project['id'], 'redirect' => 'edit')) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->hidden('id', $values) ?> - - <?= $this->form->label(t('Name'), 'name') ?> - <?= $this->form->text('name', $values, $errors, array('required', 'maxlength="50"')) ?> - - <?= $this->form->label(t('Identifier'), 'identifier') ?> - <?= $this->form->text('identifier', $values, $errors, array('maxlength="50"')) ?> - <p class="form-help"><?= t('The project identifier is optional and must be alphanumeric, example: MYPROJECT.') ?></p> - - <hr> - <div class="form-inline"> - <?= $this->form->label(t('Project owner'), 'owner_id') ?> - <?= $this->form->select('owner_id', $owners, $values, $errors) ?> - </div> - - <?php if ($this->user->hasProjectAccess('ProjectCreationController', 'create', $project['id'])): ?> - <hr> - <?= $this->form->checkbox('is_private', t('Private project'), 1, $project['is_private'] == 1) ?> - <p class="form-help"><?= t('Private projects do not have users and groups management.') ?></p> - <?php endif ?> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - </div> -</form> diff --git a/app/Template/project_edit/show.php b/app/Template/project_edit/show.php new file mode 100644 index 00000000..46cdb8fa --- /dev/null +++ b/app/Template/project_edit/show.php @@ -0,0 +1,58 @@ +<div class="page-header"> + <h2><?= $this->text->e($project['name']) ?> > <?= t('Edit project') ?></h2> +</div> +<form method="post" action="<?= $this->url->href('ProjectEditController', 'update', array('project_id' => $project['id'], 'redirect' => 'edit')) ?>" autocomplete="off"> + <?= $this->form->csrf() ?> + <?= $this->form->hidden('id', $values) ?> + + <fieldset> + <legend><?= t('General') ?></legend> + + <?= $this->form->label(t('Name'), 'name') ?> + <?= $this->form->text('name', $values, $errors, array('required', 'maxlength="50"', 'autofocus', 'tabindex="1"')) ?> + + <?= $this->form->label(t('Identifier'), 'identifier') ?> + <?= $this->form->text('identifier', $values, $errors, array('maxlength="50"', 'tabindex="2"')) ?> + <p class="form-help"><?= t('The project identifier is optional and must be alphanumeric, example: MYPROJECT.') ?></p> + + <?= $this->form->label(t('Description'), 'description') ?> + <?= $this->form->textEditor('description', $values, $errors, array('tabindex' => 3)) ?> + </fieldset> + + <fieldset> + <legend><?= t('Permissions and ownership') ?></legend> + + <?php if ($this->user->hasProjectAccess('ProjectCreationController', 'create', $project['id'])): ?> + <?= $this->form->checkbox('is_private', t('Private project'), 1, $project['is_private'] == 1) ?> + <p class="form-help"><?= t('Private projects do not have users and groups management.') ?></p> + <?php endif ?> + + <div class="form-inline"> + <?= $this->form->label(t('Project owner'), 'owner_id') ?> + <?= $this->form->select('owner_id', $owners, $values, $errors, array('tabindex="5"')) ?> + </div> + </fieldset> + + <fieldset> + <legend><?= t('Dates') ?></legend> + + <?= $this->form->date(t('Start date'), 'start_date', $values, $errors, array('tabindex="6"')) ?> + <?= $this->form->date(t('End date'), 'end_date', $values, $errors, array('tabindex="7"')) ?> + </fieldset> + + <fieldset> + <legend><?= t('Priorities') ?></legend> + + <?= $this->form->label(t('Default priority'), 'priority_default') ?> + <?= $this->form->number('priority_default', $values, $errors, array('tabindex="8"')) ?> + + <?= $this->form->label(t('Lowest priority'), 'priority_start') ?> + <?= $this->form->number('priority_start', $values, $errors, array('tabindex="9"')) ?> + + <?= $this->form->label(t('Highest priority'), 'priority_end') ?> + <?= $this->form->number('priority_end', $values, $errors, array('tabindex="10"')) ?> + <p class="form-help"><?= t('If you put zero to the low and high priority, this feature will be disabled.') ?></p> + </fieldset> + + <?= $this->modal->submitButtons(array('tabindex' => 11)) ?> +</form> diff --git a/app/Template/project_edit/task_priority.php b/app/Template/project_edit/task_priority.php deleted file mode 100644 index 3ef4b3cb..00000000 --- a/app/Template/project_edit/task_priority.php +++ /dev/null @@ -1,29 +0,0 @@ -<div class="page-header"> - <h2><?= t('Edit project') ?></h2> - <ul> - <li ><?= $this->url->link(t('General'), 'ProjectEditController', 'edit', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li><?= $this->url->link(t('Dates'), 'ProjectEditController', 'dates', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li><?= $this->url->link(t('Description'), 'ProjectEditController', 'description', array('project_id' => $project['id']), false, 'popover-link') ?></li> - <li class="active"><?= $this->url->link(t('Task priority'), 'ProjectEditController', 'priority', array('project_id' => $project['id']), false, 'popover-link') ?></li> - </ul> -</div> -<form method="post" class="popover-form" action="<?= $this->url->href('ProjectEditController', 'update', array('project_id' => $project['id'], 'redirect' => 'priority')) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->hidden('id', $values) ?> - <?= $this->form->hidden('name', $values) ?> - - <?= $this->form->label(t('Default priority'), 'priority_default') ?> - <?= $this->form->number('priority_default', $values, $errors) ?> - - <?= $this->form->label(t('Lowest priority'), 'priority_start') ?> - <?= $this->form->number('priority_start', $values, $errors) ?> - - <?= $this->form->label(t('Highest priority'), 'priority_end') ?> - <?= $this->form->number('priority_end', $values, $errors) ?> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - </div> -</form> - -<p class="alert alert-info"><?= t('If you put zero to the low and high priority, this feature will be disabled.') ?></p> diff --git a/app/Template/project_file/create.php b/app/Template/project_file/create.php index e262799b..de35f87c 100644 --- a/app/Template/project_file/create.php +++ b/app/Template/project_file/create.php @@ -1,33 +1,20 @@ <div class="page-header"> <h2><?= t('Attach a document') ?></h2> </div> -<div id="file-done" style="display:none"> - <p class="alert alert-success"> - <?= t('All files have been uploaded successfully.') ?> - <?= $this->url->link(t('View uploaded files'), 'ProjectOverviewController', 'show', array('project_id' => $project['id'])) ?> - </p> -</div> - -<div id="file-error-max-size" style="display:none"> - <p class="alert alert-error"> - <?= t('The maximum allowed file size is %sB.', $this->text->bytes($max_size)) ?> - <a href="#" id="file-browser"><?= t('Choose files again') ?></a> - </p> -</div> -<div - id="file-dropzone" - data-max-size="<?= $max_size ?>" - data-url="<?= $this->url->href('ProjectFileController', 'save', array('project_id' => $project['id'])) ?>"> - <div id="file-dropzone-inner"> - <?= t('Drag and drop your files here') ?> <?= t('or') ?> <a href="#" id="file-browser"><?= t('choose files') ?></a> - </div> -</div> - -<input type="file" name="files[]" multiple style="display:none" id="file-form-element"> +<?= $this->app->component('file-upload', array( + 'maxSize' => $max_size, + 'url' => $this->url->to('ProjectFileController', 'save', array('project_id' => $project['id'])), + 'labelDropzone' => t('Drag and drop your files here'), + 'labelOr' => t('or'), + 'labelChooseFiles' => t('choose files'), + 'labelOversize' => t('The maximum allowed file size is %sB.', $this->text->bytes($max_size)), + 'labelSuccess' => t('All files have been uploaded successfully.'), + 'labelCloseSuccess' => t('Close this window'), + 'labelUploadError' => t('Unable to upload this file.'), +)) ?> -<div class="form-actions"> - <input type="submit" value="<?= t('Upload files') ?>" class="btn btn-blue" id="file-upload-button" disabled> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectOverviewController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> -</div> +<?= $this->modal->submitButtons(array( + 'submitLabel' => t('Upload files'), + 'disabled' => true, +)) ?> diff --git a/app/Template/project_file/remove.php b/app/Template/project_file/remove.php index 0517a9e7..043b8fc8 100644 --- a/app/Template/project_file/remove.php +++ b/app/Template/project_file/remove.php @@ -7,9 +7,9 @@ <?= t('Do you really want to remove this file: "%s"?', $this->text->e($file['name'])) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ProjectFileController', 'remove', array('project_id' => $project['id'], 'file_id' => $file['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectOverviewController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ProjectFileController', + 'remove', + array('project_id' => $project['id'], 'file_id' => $file['id']) + ) ?> </div> diff --git a/app/Template/project_gantt/show.php b/app/Template/project_gantt/show.php index af22a6ed..725f348d 100644 --- a/app/Template/project_gantt/show.php +++ b/app/Template/project_gantt/show.php @@ -1,11 +1,23 @@ <section id="main"> <div class="page-header"> <ul> + <?php if ($this->user->hasAccess('ProjectCreationController', 'create')): ?> + <li> + <?= $this->modal->medium('plus', t('New project'), 'ProjectCreationController', 'create') ?> + </li> + <?php endif ?> + <?php if ($this->app->config('disable_private_project', 0) == 0): ?> + <li> + <?= $this->modal->medium('lock', t('New private project'), 'ProjectCreationController', 'createPrivate') ?> + </li> + <?php endif ?> <li> - <i class="fa fa-folder fa-fw"></i><?= $this->url->link(t('Projects list'), 'ProjectListController', 'show') ?> + <?= $this->url->icon('folder', t('Projects list'), 'ProjectListController', 'show') ?> </li> <?php if ($this->user->hasAccess('ProjectUserOverviewController', 'managers')): ?> - <li><i class="fa fa-user fa-fw"></i><?= $this->url->link(t('Users overview'), 'ProjectUserOverviewController', 'managers') ?></li> + <li> + <?= $this->url->icon('user', t('Users overview'), 'ProjectUserOverviewController', 'managers') ?> + </li> <?php endif ?> </ul> </div> diff --git a/app/Template/project_header/dropdown.php b/app/Template/project_header/dropdown.php index baf4cc16..83c2b97f 100644 --- a/app/Template/project_header/dropdown.php +++ b/app/Template/project_header/dropdown.php @@ -4,12 +4,10 @@ <?php if ($board_view): ?> <li> <span class="filter-display-mode" <?= $this->board->isCollapsed($project['id']) ? '' : 'style="display: none;"' ?>> - <i class="fa fa-expand fa-fw"></i> - <?= $this->url->link(t('Expand tasks'), 'BoardAjaxController', 'expand', array('project_id' => $project['id']), false, 'board-display-mode', t('Keyboard shortcut: "%s"', 's')) ?> + <?= $this->url->icon('expand', t('Expand tasks'), 'BoardAjaxController', 'expand', array('project_id' => $project['id']), false, 'board-display-mode', t('Keyboard shortcut: "%s"', 's')) ?> </span> <span class="filter-display-mode" <?= $this->board->isCollapsed($project['id']) ? 'style="display: none;"' : '' ?>> - <i class="fa fa-compress fa-fw"></i> - <?= $this->url->link(t('Collapse tasks'), 'BoardAjaxController', 'collapse', array('project_id' => $project['id']), false, 'board-display-mode', t('Keyboard shortcut: "%s"', 's')) ?> + <?= $this->url->icon('compress', t('Collapse tasks'), 'BoardAjaxController', 'collapse', array('project_id' => $project['id']), false, 'board-display-mode', t('Keyboard shortcut: "%s"', 's')) ?> </span> </li> <li> @@ -24,27 +22,23 @@ <?php if ($this->user->hasProjectAccess('TaskCreationController', 'show', $project['id'])): ?> <li> - <i class="fa fa-plus fa-fw"></i> - <?= $this->url->link(t('Add a new task'), 'TaskCreationController', 'show', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->large('plus', t('Add a new task'), 'TaskCreationController', 'show', array('project_id' => $project['id'])) ?> </li> <?php endif ?> <li> - <i class="fa fa-dashboard fa-fw"></i> - <?= $this->url->link(t('Activity'), 'ActivityController', 'project', array('project_id' => $project['id'])) ?> + <?= $this->modal->medium('dashboard', t('Activity'), 'ActivityController', 'project', array('project_id' => $project['id'])) ?> </li> <?php if ($this->user->hasProjectAccess('CustomFilterController', 'index', $project['id'])): ?> <li> - <i class="fa fa-filter fa-fw"></i> - <?= $this->url->link(t('Custom filters'), 'CustomFilterController', 'index', array('project_id' => $project['id'])) ?> + <?= $this->modal->medium('filter', t('Add custom filters'), 'CustomFilterController', 'create', array('project_id' => $project['id'])) ?> </li> <?php endif ?> <?php if ($project['is_public']): ?> <li> - <i class="fa fa-share-alt fa-fw"></i> - <?= $this->url->link(t('Public link'), 'BoardViewController', 'readonly', array('token' => $project['token']), false, '', '', true) ?> + <?= $this->url->icon('share-alt', t('Public link'), 'BoardViewController', 'readonly', array('token' => $project['token']), false, '', '', true) ?> </li> <?php endif ?> @@ -52,35 +46,30 @@ <?php if ($this->user->hasProjectAccess('AnalyticController', 'taskDistribution', $project['id'])): ?> <li> - <i class="fa fa-line-chart fa-fw"></i> - <?= $this->url->link(t('Analytics'), 'AnalyticController', 'taskDistribution', array('project_id' => $project['id'])) ?> + <?= $this->modal->large('line-chart', t('Analytics'), 'AnalyticController', 'taskDistribution', array('project_id' => $project['id'])) ?> </li> <?php endif ?> <?php if ($this->user->hasProjectAccess('ExportController', 'tasks', $project['id'])): ?> <li> - <i class="fa fa-upload fa-fw"></i> - <?= $this->url->link(t('Exports'), 'ExportController', 'tasks', array('project_id' => $project['id'])) ?> + <?= $this->modal->medium('upload', t('Exports'), 'ExportController', 'tasks', array('project_id' => $project['id'])) ?> </li> <?php endif ?> <?php if ($this->user->hasProjectAccess('TaskImportController', 'tasks', $project['id'])): ?> <li> - <i class="fa fa-download fa-fw"></i> - <?= $this->url->link(t('Imports'), 'TaskImportController', 'show', array('project_id' => $project['id'])) ?> + <?= $this->modal->medium('download', t('Import tasks'), 'TaskImportController', 'show', array('project_id' => $project['id'])) ?> </li> <?php endif ?> - <?php if ($this->user->hasProjectAccess('ProjectEditController', 'edit', $project['id'])): ?> + <?php if ($this->user->hasProjectAccess('ProjectEditController', 'show', $project['id'])): ?> <li> - <i class="fa fa-cog fa-fw"></i> - <?= $this->url->link(t('Settings'), 'ProjectViewController', 'show', array('project_id' => $project['id'])) ?> + <?= $this->url->icon('cog', t('Settings'), 'ProjectViewController', 'show', array('project_id' => $project['id'])) ?> </li> <?php endif ?> <li> - <i class="fa fa-folder fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Manage projects'), 'ProjectListController', 'show') ?> + <?= $this->url->icon('folder', t('Manage projects'), 'ProjectListController', 'show') ?> </li> </ul> </div> diff --git a/app/Template/project_header/views.php b/app/Template/project_header/views.php index f8a5b39b..0328a051 100644 --- a/app/Template/project_header/views.php +++ b/app/Template/project_header/views.php @@ -1,24 +1,19 @@ <ul class="views"> <li <?= $this->app->checkMenuSelection('ProjectOverviewController') ?>> - <i class="fa fa-eye fa-fw"></i> - <?= $this->url->link(t('Overview'), 'ProjectOverviewController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-overview', t('Keyboard shortcut: "%s"', 'v o')) ?> + <?= $this->url->icon('eye', t('Overview'), 'ProjectOverviewController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-overview', t('Keyboard shortcut: "%s"', 'v o')) ?> </li> <li <?= $this->app->checkMenuSelection('BoardViewController') ?>> - <i class="fa fa-th fa-fw"></i> - <?= $this->url->link(t('Board'), 'BoardViewController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-board', t('Keyboard shortcut: "%s"', 'v b')) ?> + <?= $this->url->icon('th', t('Board'), 'BoardViewController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-board', t('Keyboard shortcut: "%s"', 'v b')) ?> </li> <li <?= $this->app->checkMenuSelection('CalendarController') ?>> - <i class="fa fa-calendar fa-fw"></i> - <?= $this->url->link(t('Calendar'), 'CalendarController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-calendar', t('Keyboard shortcut: "%s"', 'v c')) ?> + <?= $this->url->icon('calendar', t('Calendar'), 'CalendarController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-calendar', t('Keyboard shortcut: "%s"', 'v c')) ?> </li> <li <?= $this->app->checkMenuSelection('TaskListController') ?>> - <i class="fa fa-list fa-fw"></i> - <?= $this->url->link(t('List'), 'TaskListController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-listing', t('Keyboard shortcut: "%s"', 'v l')) ?> + <?= $this->url->icon('list', t('List'), 'TaskListController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-listing', t('Keyboard shortcut: "%s"', 'v l')) ?> </li> <?php if ($this->user->hasProjectAccess('TaskGanttController', 'show', $project['id'])): ?> <li <?= $this->app->checkMenuSelection('TaskGanttController') ?>> - <i class="fa fa-sliders fa-fw"></i> - <?= $this->url->link(t('Gantt'), 'TaskGanttController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-gantt', t('Keyboard shortcut: "%s"', 'v g')) ?> + <?= $this->url->icon('sliders', t('Gantt'), 'TaskGanttController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-gantt', t('Keyboard shortcut: "%s"', 'v g')) ?> </li> <?php endif ?> </ul> diff --git a/app/Template/project_list/show.php b/app/Template/project_list/show.php index f8f5862c..a6364585 100644 --- a/app/Template/project_list/show.php +++ b/app/Template/project_list/show.php @@ -2,12 +2,26 @@ <div class="page-header"> <ul> <?= $this->hook->render('template:project-list:menu:before') ?> + + <?php if ($this->user->hasAccess('ProjectCreationController', 'create')): ?> + <li> + <?= $this->modal->medium('plus', t('New project'), 'ProjectCreationController', 'create') ?> + </li> + <?php endif ?> + <?php if ($this->app->config('disable_private_project', 0) == 0): ?> + <li> + <?= $this->modal->medium('lock', t('New private project'), 'ProjectCreationController', 'createPrivate') ?> + </li> + <?php endif ?> + <?php if ($this->user->hasAccess('ProjectUserOverviewController', 'managers')): ?> - <li><i class="fa fa-user fa-fw"></i><?= $this->url->link(t('Users overview'), 'ProjectUserOverviewController', 'managers') ?></li> + <li><?= $this->url->icon('user', t('Users overview'), 'ProjectUserOverviewController', 'managers') ?></li> <?php endif ?> + <?php if ($this->user->hasAccess('ProjectGanttController', 'show')): ?> - <li><i class="fa fa-sliders fa-fw"></i><?= $this->url->link(t('Projects Gantt chart'), 'ProjectGanttController', 'show') ?></li> + <li><?= $this->url->icon('sliders', t('Projects Gantt chart'), 'ProjectGanttController', 'show') ?></li> <?php endif ?> + <?= $this->hook->render('template:project-list:menu:after') ?> </ul> </div> diff --git a/app/Template/project_overview/attachments.php b/app/Template/project_overview/attachments.php index ab8cf2ad..b8baadd0 100644 --- a/app/Template/project_overview/attachments.php +++ b/app/Template/project_overview/attachments.php @@ -5,7 +5,7 @@ <div class="accordion-content"> <?php if ($this->user->hasProjectAccess('ProjectFileController', 'create', $project['id'])): ?> <div class="buttons-header"> - <?= $this->url->button('fa-plus', t('Upload a file'), 'ProjectFileController', 'create', array('project_id' => $project['id']), 'popover') ?> + <?= $this->modal->mediumButton('plus', t('Upload a file'), 'ProjectFileController', 'create', array('project_id' => $project['id'])) ?> </div> <?php endif ?> diff --git a/app/Template/project_overview/description.php b/app/Template/project_overview/description.php index 0c2027ed..80b93efe 100644 --- a/app/Template/project_overview/description.php +++ b/app/Template/project_overview/description.php @@ -3,9 +3,9 @@ <h3><a href="#" class="fa accordion-toggle"></a> <?= t('Description') ?></h3> </div> <div class="accordion-content"> - <?php if ($this->user->hasProjectAccess('ProjectEditController', 'description', $project['id'])): ?> + <?php if ($this->user->hasProjectAccess('ProjectEditController', 'show', $project['id'])): ?> <div class="buttons-header"> - <?= $this->url->button('fa-edit', t('Edit description'), 'ProjectEditController', 'description', array('project_id' => $project['id']), 'popover') ?> + <?= $this->modal->mediumButton('edit', t('Edit description'), 'ProjectEditController', 'show', array('project_id' => $project['id'])) ?> </div> <?php endif ?> <article class="markdown"> diff --git a/app/Template/project_overview/files.php b/app/Template/project_overview/files.php index 826e6325..85de52f7 100644 --- a/app/Template/project_overview/files.php +++ b/app/Template/project_overview/files.php @@ -15,18 +15,19 @@ <ul> <?php if ($this->file->getPreviewType($file['name']) !== null): ?> <li> - <i class="fa fa-eye fa-fw"></i> - <?= $this->url->link(t('View file'), 'FileViewerController', 'show', array('project_id' => $project['id'], 'file_id' => $file['id']), false, 'popover') ?> + <?= $this->modal->large('eye', t('View file'), 'FileViewerController', 'show', array('project_id' => $project['id'], 'file_id' => $file['id'])) ?> + </li> + <?php elseif ($this->file->getBrowserViewType($file['name']) !== null): ?> + <li> + <?= $this->url->icon('eye', t('View file'), 'FileViewerController', 'browser', array('project_id' => $project['id'], 'file_id' => $file['id']), false, '', '', true) ?> </li> <?php endif ?> <li> - <i class="fa fa-download fa-fw"></i> - <?= $this->url->link(t('Download'), 'FileViewerController', 'download', array('project_id' => $project['id'], 'file_id' => $file['id'])) ?> + <?= $this->url->icon('download', t('Download'), 'FileViewerController', 'download', array('project_id' => $project['id'], 'file_id' => $file['id'])) ?> </li> <?php if ($this->user->hasProjectAccess('ProjectFileController', 'remove', $project['id'])): ?> <li> - <i class="fa fa-trash fa-fw"></i> - <?= $this->url->link(t('Remove'), 'ProjectFileController', 'confirm', array('project_id' => $project['id'], 'file_id' => $file['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'ProjectFileController', 'confirm', array('project_id' => $project['id'], 'file_id' => $file['id'])) ?> </li> <?php endif ?> </ul> diff --git a/app/Template/project_overview/images.php b/app/Template/project_overview/images.php index 3b575d3f..7e7962e8 100644 --- a/app/Template/project_overview/images.php +++ b/app/Template/project_overview/images.php @@ -19,13 +19,11 @@ <a href="#" class="dropdown-menu dropdown-menu-link-text"><?= $this->text->e($file['name']) ?> <i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-download fa-fw"></i> - <?= $this->url->link(t('Download'), 'FileViewerController', 'download', array('project_id' => $project['id'], 'file_id' => $file['id'])) ?> + <?= $this->url->icon('download', t('Download'), 'FileViewerController', 'download', array('project_id' => $project['id'], 'file_id' => $file['id'])) ?> </li> <?php if ($this->user->hasProjectAccess('ProjectFileController', 'remove', $project['id'])): ?> <li> - <i class="fa fa-trash fa-fw"></i> - <?= $this->url->link(t('Remove'), 'ProjectFileController', 'confirm', array('project_id' => $project['id'], 'file_id' => $file['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'ProjectFileController', 'confirm', array('project_id' => $project['id'], 'file_id' => $file['id'])) ?> </li> <?php endif ?> </ul> diff --git a/app/Template/project_overview/information.php b/app/Template/project_overview/information.php index fdf0f753..0fe53e08 100644 --- a/app/Template/project_overview/information.php +++ b/app/Template/project_overview/information.php @@ -3,7 +3,7 @@ <h3><a href="#" class="fa accordion-toggle"></a> <?= t('Information') ?></h3> </div> <div class="accordion-content"> - <div class="listing"> + <div class="panel"> <ul> <?php if ($project['owner_id'] > 0): ?> <li><?= t('Project owner: ') ?><strong><?= $this->text->e($project['owner_name'] ?: $project['owner_username']) ?></strong></li> @@ -29,9 +29,9 @@ <?php endif ?> <?php if ($project['is_public']): ?> - <li><i class="fa fa-share-alt"></i> <?= $this->url->link(t('Public link'), 'BoardViewController', 'readonly', array('token' => $project['token']), false, '', '', true) ?></li> - <li><i class="fa fa-rss-square"></i> <?= $this->url->link(t('RSS feed'), 'FeedController', 'project', array('token' => $project['token']), false, '', '', true) ?></li> - <li><i class="fa fa-calendar"></i> <?= $this->url->link(t('iCal feed'), 'ICalendarController', 'project', array('token' => $project['token'])) ?></li> + <li><?= $this->url->icon('share-alt', t('Public link'), 'BoardViewController', 'readonly', array('token' => $project['token']), false, '', '', true) ?></li> + <li><?= $this->url->icon('rss-square', t('RSS feed'), 'FeedController', 'project', array('token' => $project['token']), false, '', '', true) ?></li> + <li><?= $this->url->icon('calendar', t('iCal feed'), 'ICalendarController', 'project', array('token' => $project['token'])) ?></li> <?php endif ?> </ul> </div> diff --git a/app/Template/project_overview/show.php b/app/Template/project_overview/show.php index 6b2bc2cf..d87b2775 100644 --- a/app/Template/project_overview/show.php +++ b/app/Template/project_overview/show.php @@ -1,6 +1,7 @@ <section id="main"> <?= $this->projectHeader->render($project, 'ProjectOverviewController', 'show') ?> <?= $this->render('project_overview/columns', array('project' => $project)) ?> + <?= $this->hook->render('template:project-overview:before-description', array('project' => $project)) ?> <?= $this->render('project_overview/description', array('project' => $project)) ?> <?= $this->render('project_overview/attachments', array('project' => $project, 'images' => $images, 'files' => $files)) ?> <?= $this->render('project_overview/information', array('project' => $project, 'users' => $users, 'roles' => $roles)) ?> diff --git a/app/Template/project_permission/groups.php b/app/Template/project_permission/groups.php index 582643a2..c9914344 100644 --- a/app/Template/project_permission/groups.php +++ b/app/Template/project_permission/groups.php @@ -25,8 +25,7 @@ )) ?> </td> <td> - <i class="fa fa-trash-o" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'ProjectPermissionController', 'removeGroup', array('project_id' => $project['id'], 'group_id' => $group['id']), true) ?> + <?= $this->url->icon('trash-o', t('Remove'), 'ProjectPermissionController', 'removeGroup', array('project_id' => $project['id'], 'group_id' => $group['id']), true) ?> </td> </tr> <?php endforeach ?> @@ -34,7 +33,7 @@ <?php endif ?> <?php if ($project['is_private'] == 0): ?> - <div class="listing"> + <div class="panel"> <form method="post" action="<?= $this->url->href('ProjectPermissionController', 'addGroup', array('project_id' => $project['id'])) ?>" autocomplete="off" class="form-inline"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', array('project_id' => $project['id'])) ?> diff --git a/app/Template/project_permission/users.php b/app/Template/project_permission/users.php index 71cf1c4a..bc92d060 100644 --- a/app/Template/project_permission/users.php +++ b/app/Template/project_permission/users.php @@ -21,8 +21,7 @@ )) ?> </td> <td> - <i class="fa fa-trash-o" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'ProjectPermissionController', 'removeUser', array('project_id' => $project['id'], 'user_id' => $user['id']), true) ?> + <?= $this->url->icon('trash-o', t('Remove'), 'ProjectPermissionController', 'removeUser', array('project_id' => $project['id'], 'user_id' => $user['id']), true) ?> </td> </tr> <?php endforeach ?> @@ -30,7 +29,7 @@ <?php endif ?> <?php if ($project['is_private'] == 0): ?> - <div class="listing"> + <div class="panel"> <form method="post" action="<?= $this->url->href('ProjectPermissionController', 'addUser', array('project_id' => $project['id'])) ?>" autocomplete="off" class="form-inline"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', array('project_id' => $project['id'])) ?> diff --git a/app/Template/project_role/create.php b/app/Template/project_role/create.php index d0092243..f554eb17 100644 --- a/app/Template/project_role/create.php +++ b/app/Template/project_role/create.php @@ -1,16 +1,12 @@ <div class="page-header"> <h2><?= t('New custom project role') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('ProjectRoleController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('ProjectRoleController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> <?= $this->form->label(t('Role'), 'role') ?> <?= $this->form->text('role', $values, $errors, array('autofocus', 'required', 'maxlength="50"')) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectRoleController', 'show', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/project_role/edit.php b/app/Template/project_role/edit.php index 3aa9e5cf..740ac0fe 100644 --- a/app/Template/project_role/edit.php +++ b/app/Template/project_role/edit.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('Edit custom project role') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('ProjectRoleController', 'update', array('project_id' => $project['id'], 'role_id' => $role['role_id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('ProjectRoleController', 'update', array('project_id' => $project['id'], 'role_id' => $role['role_id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> <?= $this->form->hidden('role_id', $values) ?> @@ -9,9 +9,5 @@ <?= $this->form->label(t('Role'), 'role') ?> <?= $this->form->text('role', $values, $errors, array('autofocus', 'required', 'maxlength="50"')) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectRoleController', 'show', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/project_role/remove.php b/app/Template/project_role/remove.php index 25875e3a..44d24eda 100644 --- a/app/Template/project_role/remove.php +++ b/app/Template/project_role/remove.php @@ -7,8 +7,9 @@ <?= t('Do you really want to remove this custom role: "%s"? All people assigned to this role will become project member.', $role['role']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ProjectRoleController', 'remove', array('project_id' => $project['id'], 'role_id' => $role['role_id']), true, 'btn btn-red') ?> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'ProjectRoleController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ProjectRoleController', + 'remove', + array('project_id' => $project['id'], 'role_id' => $role['role_id']) + ) ?> </div> diff --git a/app/Template/project_role/show.php b/app/Template/project_role/show.php index 59200fc9..5377f7bb 100644 --- a/app/Template/project_role/show.php +++ b/app/Template/project_role/show.php @@ -2,8 +2,7 @@ <h2><?= t('Custom Project Roles') ?></h2> <ul> <li> - <i class="fa fa-plus fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Add a new custom role'), 'ProjectRoleController', 'create', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add a new custom role'), 'ProjectRoleController', 'create', array('project_id' => $project['id'])) ?> </li> </ul> </div> @@ -19,24 +18,19 @@ <a href="#" class="dropdown-menu"><?= t('Restrictions for the role "%s"', $role['role']) ?> <i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-plus fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Add a new project restriction'), 'ProjectRoleRestrictionController', 'create', array('project_id' => $project['id'], 'role_id' => $role['role_id']), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add a new project restriction'), 'ProjectRoleRestrictionController', 'create', array('project_id' => $project['id'], 'role_id' => $role['role_id'])) ?> </li> <li> - <i class="fa fa-plus fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Add a new drag and drop restriction'), 'ColumnMoveRestrictionController', 'create', array('project_id' => $project['id'], 'role_id' => $role['role_id']), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add a new drag and drop restriction'), 'ColumnMoveRestrictionController', 'create', array('project_id' => $project['id'], 'role_id' => $role['role_id'])) ?> </li> <li> - <i class="fa fa-plus fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Add a new column restriction'), 'ColumnRestrictionController', 'create', array('project_id' => $project['id'], 'role_id' => $role['role_id']), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add a new column restriction'), 'ColumnRestrictionController', 'create', array('project_id' => $project['id'], 'role_id' => $role['role_id'])) ?> </li> <li> - <i class="fa fa-pencil fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Edit this role'), 'ProjectRoleController', 'edit', array('project_id' => $project['id'], 'role_id' => $role['role_id']), false, 'popover') ?> + <?= $this->modal->medium('edit', t('Edit this role'), 'ProjectRoleController', 'edit', array('project_id' => $project['id'], 'role_id' => $role['role_id'])) ?> </li> <li> - <i class="fa fa-trash-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Remove this role'), 'ProjectRoleController', 'confirm', array('project_id' => $project['id'], 'role_id' => $role['role_id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove this role'), 'ProjectRoleController', 'confirm', array('project_id' => $project['id'], 'role_id' => $role['role_id'])) ?> </li> </ul> </div> @@ -59,8 +53,7 @@ <?= $this->text->e($restriction['title']) ?> </td> <td> - <i class="fa fa-trash-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'ProjectRoleRestrictionController', 'confirm', array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'ProjectRoleRestrictionController', 'confirm', array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id'])) ?> </td> </tr> <?php endforeach ?> @@ -77,8 +70,7 @@ <?= $this->text->e($restriction['title']) ?> </td> <td> - <i class="fa fa-trash-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'ColumnRestrictionController', 'confirm', array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'ColumnRestrictionController', 'confirm', array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id'])) ?> </td> </tr> <?php endforeach ?> @@ -91,8 +83,7 @@ <?= t('Only moving task between those columns is permitted') ?> </td> <td> - <i class="fa fa-trash-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'ColumnMoveRestrictionController', 'confirm', array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'ColumnMoveRestrictionController', 'confirm', array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id'])) ?> </td> </tr> <?php endforeach ?> diff --git a/app/Template/project_role_restriction/create.php b/app/Template/project_role_restriction/create.php index f49eafb3..2b6a61dc 100644 --- a/app/Template/project_role_restriction/create.php +++ b/app/Template/project_role_restriction/create.php @@ -2,7 +2,7 @@ <div class="page-header"> <h2><?= t('New project restriction for the role "%s"', $role['role']) ?></h2> </div> - <form class="popover-form" method="post" action="<?= $this->url->href('ProjectRoleRestrictionController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> + <form method="post" action="<?= $this->url->href('ProjectRoleRestrictionController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> <?= $this->form->hidden('role_id', $values) ?> @@ -10,10 +10,6 @@ <?= $this->form->label(t('Restriction'), 'rule') ?> <?= $this->form->select('rule', $restrictions, $values, $errors) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectRoleController', 'show', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> </section> diff --git a/app/Template/project_role_restriction/remove.php b/app/Template/project_role_restriction/remove.php index db1148e1..1a994199 100644 --- a/app/Template/project_role_restriction/remove.php +++ b/app/Template/project_role_restriction/remove.php @@ -7,8 +7,9 @@ <?= t('Do you really want to remove this project restriction: "%s"?', $this->text->in($restriction['rule'], $restrictions)) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ProjectRoleRestrictionController', 'remove', array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id']), true, 'btn btn-red') ?> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'ProjectRoleController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ProjectRoleRestrictionController', + 'remove', + array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id']) + ) ?> </div> diff --git a/app/Template/project_status/disable.php b/app/Template/project_status/disable.php index d8145d3c..d607cedb 100644 --- a/app/Template/project_status/disable.php +++ b/app/Template/project_status/disable.php @@ -7,8 +7,9 @@ <?= t('Do you really want to disable this project: "%s"?', $project['name']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ProjectStatusController', 'disable', array('project_id' => $project['id']), true, 'btn btn-red') ?> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'ProjectViewController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ProjectStatusController', + 'disable', + array('project_id' => $project['id']) + ) ?> </div> diff --git a/app/Template/project_status/enable.php b/app/Template/project_status/enable.php index 1f76d093..fd8f8c72 100644 --- a/app/Template/project_status/enable.php +++ b/app/Template/project_status/enable.php @@ -7,8 +7,9 @@ <?= t('Do you really want to enable this project: "%s"?', $project['name']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ProjectStatusController', 'enable', array('project_id' => $project['id']), true, 'btn btn-red') ?> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'ProjectViewController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ProjectStatusController', + 'enable', + array('project_id' => $project['id']) + ) ?> </div> diff --git a/app/Template/project_status/remove.php b/app/Template/project_status/remove.php index 8959ef75..27ae2ae0 100644 --- a/app/Template/project_status/remove.php +++ b/app/Template/project_status/remove.php @@ -7,8 +7,9 @@ <?= t('Do you really want to remove this project: "%s"?', $project['name']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ProjectStatusController', 'remove', array('project_id' => $project['id']), true, 'btn btn-red') ?> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'ProjectViewController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ProjectStatusController', + 'remove', + array('project_id' => $project['id']) + ) ?> </div> diff --git a/app/Template/project_tag/create.php b/app/Template/project_tag/create.php index bfd1084a..a0e6243b 100644 --- a/app/Template/project_tag/create.php +++ b/app/Template/project_tag/create.php @@ -1,16 +1,12 @@ <div class="page-header"> <h2><?= t('Add new tag') ?></h2> </div> -<form method="post" class="popover-form" action="<?= $this->url->href('ProjectTagController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('ProjectTagController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> <?= $this->form->label(t('Name'), 'name') ?> <?= $this->form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="255"')) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectTagController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/project_tag/edit.php b/app/Template/project_tag/edit.php index 9bf261bd..8cb1e209 100644 --- a/app/Template/project_tag/edit.php +++ b/app/Template/project_tag/edit.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('Edit a tag') ?></h2> </div> -<form method="post" class="popover-form" action="<?= $this->url->href('ProjectTagController', 'update', array('tag_id' => $tag['id'], 'project_id' => $project['id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('ProjectTagController', 'update', array('tag_id' => $tag['id'], 'project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> <?= $this->form->hidden('project_id', $values) ?> @@ -9,9 +9,5 @@ <?= $this->form->label(t('Name'), 'name') ?> <?= $this->form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="255"')) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectTagController', 'index', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/project_tag/index.php b/app/Template/project_tag/index.php index f77e21ee..29d7082b 100644 --- a/app/Template/project_tag/index.php +++ b/app/Template/project_tag/index.php @@ -2,8 +2,7 @@ <h2><?= t('Project tags') ?></h2> <ul> <li> - <i class="fa fa-plus" aria-hidden="true"></i> - <?= $this->url->link(t('Add new tag'), 'ProjectTagController', 'create', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add new tag'), 'ProjectTagController', 'create', array('project_id' => $project['id'])) ?> </li> </ul> </div> @@ -20,10 +19,8 @@ <tr> <td><?= $this->text->e($tag['name']) ?></td> <td> - <i class="fa fa-times" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'ProjectTagController', 'confirm', array('tag_id' => $tag['id'], 'project_id' => $project['id']), false, 'popover') ?> - <i class="fa fa-pencil-square-o" aria-hidden="true"></i> - <?= $this->url->link(t('Edit'), 'ProjectTagController', 'edit', array('tag_id' => $tag['id'], 'project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->medium('edit', t('Edit'), 'ProjectTagController', 'edit', array('tag_id' => $tag['id'], 'project_id' => $project['id'])) ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'ProjectTagController', 'confirm', array('tag_id' => $tag['id'], 'project_id' => $project['id'])) ?> </td> </tr> <?php endforeach ?> diff --git a/app/Template/project_tag/remove.php b/app/Template/project_tag/remove.php index f4aadab1..9f957d10 100644 --- a/app/Template/project_tag/remove.php +++ b/app/Template/project_tag/remove.php @@ -7,9 +7,9 @@ <?= t('Do you really want to remove this tag: "%s"?', $tag['name']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'ProjectTagController', 'remove', array('tag_id' => $tag['id'], 'project_id' => $project['id']), true, 'btn btn-red popover-link') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'ProjectTagController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'ProjectTagController', + 'remove', + array('tag_id' => $tag['id'], 'project_id' => $project['id']) + ) ?> </div> diff --git a/app/Template/project_user_overview/layout.php b/app/Template/project_user_overview/layout.php index 19b83436..9115ef3c 100644 --- a/app/Template/project_user_overview/layout.php +++ b/app/Template/project_user_overview/layout.php @@ -1,20 +1,27 @@ <section id="main"> <div class="page-header"> <ul> + <?php if ($this->user->hasAccess('ProjectCreationController', 'create')): ?> + <li> + <?= $this->modal->medium('plus', t('New project'), 'ProjectCreationController', 'create') ?> + </li> + <?php endif ?> + <?php if ($this->app->config('disable_private_project', 0) == 0): ?> + <li> + <?= $this->modal->medium('lock', t('New private project'), 'ProjectCreationController', 'createPrivate') ?> + </li> + <?php endif ?> <li> - <i class="fa fa-folder fa-fw"></i> - <?= $this->url->link(t('Projects list'), 'ProjectListController', 'show') ?> + <?= $this->url->icon('folder', t('Projects list'), 'ProjectListController', 'show') ?> </li> <?php if ($this->user->hasAccess('ProjectGanttController', 'show')): ?> <li> - <i class="fa fa-sliders fa-fw"></i> - <?= $this->url->link(t('Projects Gantt chart'), 'ProjectGanttController', 'show') ?> + <?= $this->url->icon('sliders', t('Projects Gantt chart'), 'ProjectGanttController', 'show') ?> </li> <?php endif ?> </ul> </div> <section class="sidebar-container"> - <?= $this->render($sidebar_template, array('users' => $users, 'filter' => $filter)) ?> <div class="sidebar-content"> diff --git a/app/Template/project_view/share.php b/app/Template/project_view/share.php index 409f37e6..87c63916 100644 --- a/app/Template/project_view/share.php +++ b/app/Template/project_view/share.php @@ -4,11 +4,11 @@ <?php if ($project['is_public']): ?> - <div class="listing"> + <div class="panel"> <ul class="no-bullet"> - <li><strong><i class="fa fa-share-alt"></i> <?= $this->url->link(t('Public link'), 'BoardViewController', 'readonly', array('token' => $project['token']), false, '', '', true) ?></strong></li> - <li><strong><i class="fa fa-rss-square"></i> <?= $this->url->link(t('RSS feed'), 'FeedController', 'project', array('token' => $project['token']), false, '', '', true) ?></strong></li> - <li><strong><i class="fa fa-calendar"></i> <?= $this->url->link(t('iCal feed'), 'ICalendarController', 'project', array('token' => $project['token']), false, '', '', true) ?></strong></li> + <li><strong><?= $this->url->icon('share-alt', t('Public link'), 'BoardViewController', 'readonly', array('token' => $project['token']), false, '', '', true) ?></strong></li> + <li><strong><?= $this->url->icon('rss-square', t('RSS feed'), 'FeedController', 'project', array('token' => $project['token']), false, '', '', true) ?></strong></li> + <li><strong><?= $this->url->icon('calendar', t('iCal feed'), 'ICalendarController', 'project', array('token' => $project['token']), false, '', '', true) ?></strong></li> </ul> </div> diff --git a/app/Template/project_view/show.php b/app/Template/project_view/show.php index afe60384..29d558b1 100644 --- a/app/Template/project_view/show.php +++ b/app/Template/project_view/show.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('Summary') ?></h2> </div> -<ul class="listing"> +<ul class="panel"> <li><strong><?= $project['is_active'] ? t('Active') : t('Inactive') ?></strong></li> <?php if ($project['owner_id'] > 0): ?> @@ -13,9 +13,9 @@ <?php endif ?> <?php if ($project['is_public']): ?> - <li><i class="fa fa-share-alt"></i> <?= $this->url->link(t('Public link'), 'BoardViewController', 'readonly', array('token' => $project['token']), false, '', '', true) ?></li> - <li><i class="fa fa-rss-square"></i> <?= $this->url->link(t('RSS feed'), 'FeedController', 'project', array('token' => $project['token']), false, '', '', true) ?></li> - <li><i class="fa fa-calendar"></i> <?= $this->url->link(t('iCal feed'), 'ICalendarController', 'project', array('token' => $project['token'])) ?></li> + <li><?= $this->url->icon('share-alt', t('Public link'), 'BoardViewController', 'readonly', array('token' => $project['token']), false, '', '', true) ?></li> + <li><?= $this->url->icon('rss-square', t('RSS feed'), 'FeedController', 'project', array('token' => $project['token']), false, '', '', true) ?></li> + <li><?= $this->url->icon('calendar', t('iCal feed'), 'ICalendarController', 'project', array('token' => $project['token'])) ?></li> <?php else: ?> <li><?= t('Public access disabled') ?></li> <?php endif ?> diff --git a/app/Template/search/activity.php b/app/Template/search/activity.php index 1dfd9234..2582162b 100644 --- a/app/Template/search/activity.php +++ b/app/Template/search/activity.php @@ -2,8 +2,7 @@ <div class="page-header"> <ul> <li> - <i class="fa fa-search fa-fw"></i> - <?= $this->url->link(t('Search tasks'), 'SearchController', 'index') ?> + <?= $this->url->icon('search', t('Search tasks'), 'SearchController', 'index') ?> </li> </ul> </div> @@ -23,7 +22,7 @@ </div> <?php if (empty($values['search'])): ?> - <div class="listing"> + <div class="panel"> <h3><?= t('Advanced search') ?></h3> <p><?= t('Example of query: ') ?><strong>project:"My project" creator:me</strong></p> <ul> diff --git a/app/Template/search/index.php b/app/Template/search/index.php index c59a5c99..9a5f2931 100644 --- a/app/Template/search/index.php +++ b/app/Template/search/index.php @@ -2,8 +2,7 @@ <div class="page-header"> <ul> <li> - <i class="fa fa-search fa-fw"></i> - <?= $this->url->link(t('Activity stream search'), 'SearchController', 'activity') ?> + <?= $this->url->icon('search', t('Activity stream search'), 'SearchController', 'activity') ?> </li> </ul> </div> @@ -23,7 +22,7 @@ </div> <?php if (empty($values['search'])): ?> - <div class="listing"> + <div class="panel"> <h3><?= t('Advanced search') ?></h3> <p><?= t('Example of query: ') ?><strong>project:"My project" assignee:me due:tomorrow</strong></p> <ul> diff --git a/app/Template/subtask/create.php b/app/Template/subtask/create.php index cc4ccba6..96ad7a46 100644 --- a/app/Template/subtask/create.php +++ b/app/Template/subtask/create.php @@ -2,20 +2,17 @@ <h2><?= t('Add a sub-task') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('SubtaskController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('SubtaskController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('task_id', $values) ?> - <?= $this->subtask->selectTitle($values, $errors, array('autofocus')) ?> - <?= $this->subtask->selectAssignee($users_list, $values, $errors) ?> - <?= $this->subtask->selectTimeEstimated($values, $errors) ?> + <?= $this->subtask->renderTitleField($values, $errors, array('autofocus')) ?> + <?= $this->subtask->renderAssigneeField($users_list, $values, $errors) ?> + <?= $this->subtask->renderTimeEstimatedField($values, $errors) ?> + <?= $this->hook->render('template:subtask:form:create', array('values' => $values, 'errors' => $errors)) ?> <?= $this->form->checkbox('another_subtask', t('Create another sub-task'), 1, isset($values['another_subtask']) && $values['another_subtask'] == 1) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/subtask/edit.php b/app/Template/subtask/edit.php index 07419f79..7c0266a8 100644 --- a/app/Template/subtask/edit.php +++ b/app/Template/subtask/edit.php @@ -2,20 +2,17 @@ <h2><?= t('Edit a sub-task') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('SubtaskController', 'update', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?>" autocomplete="off"> - +<form method="post" action="<?= $this->url->href('SubtaskController', 'update', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> <?= $this->form->hidden('task_id', $values) ?> - <?= $this->subtask->selectTitle($values, $errors, array('autofocus')) ?> - <?= $this->subtask->selectAssignee($users_list, $values, $errors) ?> - <?= $this->subtask->selectTimeEstimated($values, $errors) ?> - <?= $this->subtask->selectTimeSpent($values, $errors) ?> + + <?= $this->subtask->renderTitleField($values, $errors, array('autofocus')) ?> + <?= $this->subtask->renderAssigneeField($users_list, $values, $errors) ?> + <?= $this->subtask->renderTimeEstimatedField($values, $errors) ?> + <?= $this->subtask->renderTimeSpentField($values, $errors) ?> + <?= $this->hook->render('template:subtask:form:edit', array('values' => $values, 'errors' => $errors)) ?> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/subtask/menu.php b/app/Template/subtask/menu.php index d5d1bf85..a0743a70 100644 --- a/app/Template/subtask/menu.php +++ b/app/Template/subtask/menu.php @@ -2,16 +2,13 @@ <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-pencil-square-o" aria-hidden="true"></i> - <?= $this->url->link(t('Edit'), 'SubtaskController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), false, 'popover') ?> + <?= $this->modal->medium('edit', t('Edit'), 'SubtaskController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?> </li> <li> - <i class="fa fa-trash-o" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'SubtaskController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'SubtaskController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?> </li> <li> - <i class="fa fa-clone" aria-hidden="true"></i> - <?= $this->url->link(t('Convert to task'), 'SubtaskConverterController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), false, 'popover') ?> + <?= $this->modal->confirm('clone', t('Convert to task'), 'SubtaskConverterController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?> </li> </ul> </div> diff --git a/app/Template/subtask/remove.php b/app/Template/subtask/remove.php index 426c1a93..cf9bbc35 100644 --- a/app/Template/subtask/remove.php +++ b/app/Template/subtask/remove.php @@ -12,9 +12,9 @@ </ul> </div> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'SubtaskController', 'remove', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'SubtaskController', + 'remove', + array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']) + ) ?> </div> diff --git a/app/Template/subtask/table.php b/app/Template/subtask/table.php index bea49aed..156e08c1 100644 --- a/app/Template/subtask/table.php +++ b/app/Template/subtask/table.php @@ -45,12 +45,10 @@ <?php if ($editable && $subtask['user_id'] == $this->user->getId()): ?> <li> <?php if ($subtask['is_timer_started']): ?> - <i class="fa fa-pause"></i> - <?= $this->url->link(t('Stop timer'), 'SubtaskStatusController', 'timer', array('timer' => 'stop', 'project_id' => $task['project_id'], 'task_id' => $subtask['task_id'], 'subtask_id' => $subtask['id']), false, 'subtask-toggle-timer') ?> + <?= $this->url->icon('pause', t('Stop timer'), 'SubtaskStatusController', 'timer', array('timer' => 'stop', 'project_id' => $task['project_id'], 'task_id' => $subtask['task_id'], 'subtask_id' => $subtask['id']), false, 'subtask-toggle-timer') ?> (<?= $this->dt->age($subtask['timer_start_date']) ?>) <?php else: ?> - <i class="fa fa-play-circle-o"></i> - <?= $this->url->link(t('Start timer'), 'SubtaskStatusController', 'timer', array('timer' => 'start', 'project_id' => $task['project_id'], 'task_id' => $subtask['task_id'], 'subtask_id' => $subtask['id']), false, 'subtask-toggle-timer') ?> + <?= $this->url->icon('play-circle-o', t('Start timer'), 'SubtaskStatusController', 'timer', array('timer' => 'start', 'project_id' => $task['project_id'], 'task_id' => $subtask['task_id'], 'subtask_id' => $subtask['id']), false, 'subtask-toggle-timer') ?> <?php endif ?> </li> <?php endif ?> diff --git a/app/Template/subtask_converter/show.php b/app/Template/subtask_converter/show.php index 63f45482..9ecc70c8 100644 --- a/app/Template/subtask_converter/show.php +++ b/app/Template/subtask_converter/show.php @@ -12,9 +12,9 @@ </ul> </div> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'SubtaskConverterController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'SubtaskConverterController', + 'save', + array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']) + ) ?> </div> diff --git a/app/Template/subtask_restriction/show.php b/app/Template/subtask_restriction/show.php index ec8b8d5b..b6c56a12 100644 --- a/app/Template/subtask_restriction/show.php +++ b/app/Template/subtask_restriction/show.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('You already have one subtask in progress') ?></h2> </div> -<form class="popover-form" action="<?= $this->url->href('SubtaskRestrictionController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?>" method="post"> +<form action="<?= $this->url->href('SubtaskRestrictionController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?>" method="post"> <?= $this->form->csrf() ?> @@ -9,9 +9,5 @@ <?= $this->form->radios('status', $status_list) ?> <?= $this->form->hidden('id', $subtask_inprogress) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-red"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/swimlane/create.php b/app/Template/swimlane/create.php index 207b526c..7d05e731 100644 --- a/app/Template/swimlane/create.php +++ b/app/Template/swimlane/create.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('Add a new swimlane') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('SwimlaneController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('SwimlaneController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> @@ -12,9 +12,5 @@ <?= $this->form->label(t('Description'), 'description') ?> <?= $this->form->textEditor('description', $values, $errors, array('tabindex' => 2)) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue" tabindex="3"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'SwimlaneController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/swimlane/edit.php b/app/Template/swimlane/edit.php index d225b345..c1c41196 100644 --- a/app/Template/swimlane/edit.php +++ b/app/Template/swimlane/edit.php @@ -2,7 +2,7 @@ <h2><?= t('Swimlane modification for the project "%s"', $project['name']) ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('SwimlaneController', 'update', array('project_id' => $project['id'], 'swimlane_id' => $values['id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('SwimlaneController', 'update', array('project_id' => $project['id'], 'swimlane_id' => $values['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> @@ -15,9 +15,5 @@ <?= $this->form->label(t('Description'), 'description') ?> <?= $this->form->textEditor('description', $values, $errors, array('tabindex' => 2)) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue" tabindex="3"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'SwimlaneController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/swimlane/edit_default.php b/app/Template/swimlane/edit_default.php index 8a0c0a15..a2c3ee73 100644 --- a/app/Template/swimlane/edit_default.php +++ b/app/Template/swimlane/edit_default.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('Change default swimlane') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('SwimlaneController', 'updateDefault', array('project_id' => $project['id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('SwimlaneController', 'updateDefault', array('project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> @@ -10,9 +10,5 @@ <?= $this->form->checkbox('show_default_swimlane', t('Show default swimlane'), 1, $values['show_default_swimlane'] == 1) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'SwimlaneController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/swimlane/index.php b/app/Template/swimlane/index.php index 4f78a405..e05b9088 100644 --- a/app/Template/swimlane/index.php +++ b/app/Template/swimlane/index.php @@ -2,8 +2,7 @@ <h2><?= t('Swimlanes') ?></h2> <ul> <li> - <i class="fa fa-plus fa-fw"></i> - <?= $this->url->link(t('Add a new swimlane'), 'SwimlaneController', 'create', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add a new swimlane'), 'SwimlaneController', 'create', array('project_id' => $project['id'])) ?> </li> </ul> </div> diff --git a/app/Template/swimlane/remove.php b/app/Template/swimlane/remove.php index f16b778c..02d1e322 100644 --- a/app/Template/swimlane/remove.php +++ b/app/Template/swimlane/remove.php @@ -1,17 +1,15 @@ -<section id="main"> - <div class="page-header"> - <h2><?= t('Remove a swimlane') ?></h2> - </div> +<div class="page-header"> + <h2><?= t('Remove a swimlane') ?></h2> +</div> - <div class="confirm"> - <p class="alert alert-info"> - <?= t('Do you really want to remove this swimlane: "%s"?', $swimlane['name']) ?> - </p> +<div class="confirm"> + <p class="alert alert-info"> + <?= t('Do you really want to remove this swimlane: "%s"?', $swimlane['name']) ?> + </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'SwimlaneController', 'remove', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'SwimlaneController', 'index', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> - </div> -</section> + <?= $this->modal->confirmButtons( + 'SwimlaneController', + 'remove', + array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id']) + ) ?> +</div> diff --git a/app/Template/swimlane/table.php b/app/Template/swimlane/table.php index 81daed01..2d783a00 100644 --- a/app/Template/swimlane/table.php +++ b/app/Template/swimlane/table.php @@ -20,16 +20,13 @@ <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Edit'), 'SwimlaneController', 'editDefault', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->medium('edit', t('Edit'), 'SwimlaneController', 'editDefault', array('project_id' => $project['id'])) ?> </li> <li> <?php if ($default_swimlane['show_default_swimlane'] == 1): ?> - <i class="fa fa-toggle-off fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Disable'), 'SwimlaneController', 'disableDefault', array('project_id' => $project['id']), true) ?> + <?= $this->url->icon('toggle-off', t('Disable'), 'SwimlaneController', 'disableDefault', array('project_id' => $project['id']), true) ?> <?php else: ?> - <i class="fa fa-toggle-on fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Enable'), 'SwimlaneController', 'enableDefault', array('project_id' => $project['id']), true) ?> + <?= $this->url->icon('toggle-on', t('Enable'), 'SwimlaneController', 'enableDefault', array('project_id' => $project['id']), true) ?> <?php endif ?> </li> </ul> @@ -58,21 +55,17 @@ <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Edit'), 'SwimlaneController', 'edit', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id']), false, 'popover') ?> + <?= $this->modal->medium('edit', t('Edit'), 'SwimlaneController', 'edit', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id'])) ?> </li> <li> <?php if ($swimlane['is_active']): ?> - <i class="fa fa-toggle-off fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Disable'), 'SwimlaneController', 'disable', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id']), true) ?> + <?= $this->url->icon('toggle-off', t('Disable'), 'SwimlaneController', 'disable', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id']), true) ?> <?php else: ?> - <i class="fa fa-toggle-on fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Enable'), 'SwimlaneController', 'enable', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id']), true) ?> + <?= $this->url->icon('toggle-on', t('Enable'), 'SwimlaneController', 'enable', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id']), true) ?> <?php endif ?> </li> <li> - <i class="fa fa-trash-o fa-fw" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'SwimlaneController', 'confirm', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'SwimlaneController', 'confirm', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id'])) ?> </li> </ul> </div> diff --git a/app/Template/tag/create.php b/app/Template/tag/create.php index 9b32bc46..752a63e5 100644 --- a/app/Template/tag/create.php +++ b/app/Template/tag/create.php @@ -1,16 +1,12 @@ <div class="page-header"> <h2><?= t('Add new tag') ?></h2> </div> -<form method="post" class="popover-form" action="<?= $this->url->href('TagController', 'save') ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('TagController', 'save') ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('project_id', $values) ?> <?= $this->form->label(t('Name'), 'name') ?> <?= $this->form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="255"')) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TagController', 'index', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/tag/edit.php b/app/Template/tag/edit.php index f751ff49..adef3568 100644 --- a/app/Template/tag/edit.php +++ b/app/Template/tag/edit.php @@ -1,7 +1,7 @@ <div class="page-header"> <h2><?= t('Edit a tag') ?></h2> </div> -<form method="post" class="popover-form" action="<?= $this->url->href('TagController', 'update', array('tag_id' => $tag['id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('TagController', 'update', array('tag_id' => $tag['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> <?= $this->form->hidden('project_id', $values) ?> @@ -9,9 +9,5 @@ <?= $this->form->label(t('Name'), 'name') ?> <?= $this->form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="255"')) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TagController', 'index', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/tag/index.php b/app/Template/tag/index.php index 8e0c9a06..834e8e7c 100644 --- a/app/Template/tag/index.php +++ b/app/Template/tag/index.php @@ -2,8 +2,7 @@ <h2><?= t('Global tags') ?></h2> <ul> <li> - <i class="fa fa-plus" aria-hidden="true"></i> - <?= $this->url->link(t('Add new tag'), 'TagController', 'create', array(), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add new tag'), 'TagController', 'create') ?> </li> </ul> </div> @@ -20,10 +19,8 @@ <tr> <td><?= $this->text->e($tag['name']) ?></td> <td> - <i class="fa fa-times" aria-hidden="true"></i> - <?= $this->url->link(t('Remove'), 'TagController', 'confirm', array('tag_id' => $tag['id']), false, 'popover') ?> - <i class="fa fa-pencil-square-o" aria-hidden="true"></i> - <?= $this->url->link(t('Edit'), 'TagController', 'edit', array('tag_id' => $tag['id']), false, 'popover') ?> + <?= $this->modal->medium('edit', t('Edit'), 'TagController', 'edit', array('tag_id' => $tag['id'])) ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'TagController', 'confirm', array('tag_id' => $tag['id'])) ?> </td> </tr> <?php endforeach ?> diff --git a/app/Template/tag/remove.php b/app/Template/tag/remove.php index 46ea3f99..47ba8d3d 100644 --- a/app/Template/tag/remove.php +++ b/app/Template/tag/remove.php @@ -7,9 +7,9 @@ <?= t('Do you really want to remove this tag: "%s"?', $tag['name']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'TagController', 'remove', array('tag_id' => $tag['id']), true, 'btn btn-red popover-link') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TagController', 'index', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'TagController', + 'remove', + array('tag_id' => $tag['id']) + ) ?> </div> diff --git a/app/Template/task/analytics.php b/app/Template/task/analytics.php index 28c0189c..2d968188 100644 --- a/app/Template/task/analytics.php +++ b/app/Template/task/analytics.php @@ -9,7 +9,7 @@ <h2><?= t('Analytics') ?></h2> </div> -<div class="listing"> +<div class="panel"> <ul> <li><?= t('Lead time: ').'<strong>'.$this->dt->duration($lead_time) ?></strong></li> <li><?= t('Cycle time: ').'<strong>'.$this->dt->duration($cycle_time) ?></strong></li> diff --git a/app/Template/task/details.php b/app/Template/task/details.php index 202991d2..24099a3c 100644 --- a/app/Template/task/details.php +++ b/app/Template/task/details.php @@ -33,16 +33,14 @@ <?php if ($project['is_public']): ?> <li> <small> - <i class="fa fa-external-link fa-fw"></i> - <?= $this->url->link(t('Public link'), 'TaskViewController', 'readonly', array('task_id' => $task['id'], 'token' => $project['token']), false, '', '', true) ?> + <?= $this->url->icon('external-link', t('Public link'), 'TaskViewController', 'readonly', array('task_id' => $task['id'], 'token' => $project['token']), false, '', '', true) ?> </small> </li> <?php endif ?> <?php if ($project['is_public'] && !$editable): ?> <li> <small> - <i class="fa fa-th fa-fw"></i> - <?= $this->url->link(t('Back to the board'), 'BoardViewController', 'readonly', array('token' => $project['token'])) ?> + <?= $this->url->icon('th', t('Back to the board'), 'BoardViewController', 'readonly', array('token' => $project['token'])) ?> </small> </li> <?php endif ?> @@ -168,7 +166,7 @@ <?php if ($editable && empty($task['date_started'])): ?> <div class="buttons-header"> - <?= $this->url->button('fa-play', t('Set start date'), 'TaskModificationController', 'start', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + <?= $this->url->button('play', t('Set start date'), 'TaskModificationController', 'start', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </div> <?php endif ?> diff --git a/app/Template/task/dropdown.php b/app/Template/task/dropdown.php index 86428059..1daf8896 100644 --- a/app/Template/task/dropdown.php +++ b/app/Template/task/dropdown.php @@ -3,60 +3,47 @@ <ul> <?php if (array_key_exists('date_started', $task) && empty($task['date_started'])): ?> <li> - <i class="fa fa-play fa-fw"></i> - <?= $this->url->link(t('Set automatically the start date'), 'TaskModificationController', 'start', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + <?= $this->url->icon('play', t('Set automatically the start date'), 'TaskModificationController', 'start', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <?php endif ?> <li> - <i class="fa fa-pencil-square-o fa-fw"></i> - <?= $this->url->link(t('Edit the task'), 'TaskModificationController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->large('edit', t('Edit the task'), 'TaskModificationController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-plus fa-fw"></i> - <?= $this->url->link(t('Add a sub-task'), 'SubtaskController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add a sub-task'), 'SubtaskController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-code-fork fa-fw"></i> - <?= $this->url->link(t('Add internal link'), 'TaskInternalLinkController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('code-fork', t('Add internal link'), 'TaskInternalLinkController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-external-link fa-fw"></i> - <?= $this->url->link(t('Add external link'), 'TaskExternalLinkController', 'find', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('external-link', t('Add external link'), 'TaskExternalLinkController', 'find', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-comment-o fa-fw"></i> - <?= $this->url->link(t('Add a comment'), 'CommentController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->small('comment-o', t('Add a comment'), 'CommentController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-camera fa-fw"></i> - <?= $this->url->link(t('Add a screenshot'), 'TaskPopoverController', 'screenshot', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('camera', t('Add a screenshot'), 'TaskPopoverController', 'screenshot', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-files-o fa-fw"></i> - <?= $this->url->link(t('Duplicate'), 'TaskDuplicationController', 'duplicate', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->small('files-o', t('Duplicate'), 'TaskDuplicationController', 'duplicate', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-clipboard fa-fw"></i> - <?= $this->url->link(t('Duplicate to another project'), 'TaskDuplicationController', 'copy', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->small('clipboard', t('Duplicate to another project'), 'TaskDuplicationController', 'copy', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-clone fa-fw"></i> - <?= $this->url->link(t('Move to another project'), 'TaskDuplicationController', 'move', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->small('clone', t('Move to another project'), 'TaskDuplicationController', 'move', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <?php if ($this->projectRole->canRemoveTask($task)): ?> <li> - <i class="fa fa-trash-o fa-fw"></i> - <?= $this->url->link(t('Remove'), 'TaskSuppressionController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'TaskSuppressionController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <?php endif ?> <?php if (isset($task['is_active']) && $this->projectRole->canChangeTaskStatusInColumn($task['project_id'], $task['column_id'])): ?> <li> <?php if ($task['is_active'] == 1): ?> - <i class="fa fa-times fa-fw"></i> - <?= $this->url->link(t('Close this task'), 'TaskStatusController', 'close', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->confirm('times', t('Close this task'), 'TaskStatusController', 'close', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> <?php else: ?> - <i class="fa fa-check-square-o fa-fw"></i> - <?= $this->url->link(t('Open this task'), 'TaskStatusController', 'open', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->confirm('check-square-o', t('Open this task'), 'TaskStatusController', 'open', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> <?php endif ?> </li> <?php endif ?> diff --git a/app/Template/task/sidebar.php b/app/Template/task/sidebar.php index 9472b6ba..f8f1ebde 100644 --- a/app/Template/task/sidebar.php +++ b/app/Template/task/sidebar.php @@ -4,25 +4,20 @@ </div> <ul> <li <?= $this->app->checkMenuSelection('TaskViewController', 'show') ?>> - <i class="fa fa-newspaper-o fa-fw"></i> - <?= $this->url->link(t('Summary'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + <?= $this->url->icon('newspaper-o', t('Summary'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li <?= $this->app->checkMenuSelection('ActivityController', 'task') ?>> - <i class="fa fa-dashboard fa-fw"></i> - <?= $this->url->link(t('Activity stream'), 'ActivityController', 'task', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + <?= $this->url->icon('dashboard', t('Activity stream'), 'ActivityController', 'task', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li <?= $this->app->checkMenuSelection('TaskViewController', 'transitions') ?>> - <i class="fa fa-arrows-h fa-fw"></i> - <?= $this->url->link(t('Transitions'), 'TaskViewController', 'transitions', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + <?= $this->url->icon('arrows-h', t('Transitions'), 'TaskViewController', 'transitions', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li <?= $this->app->checkMenuSelection('TaskViewController', 'analytics') ?>> - <i class="fa fa-bar-chart fa-fw"></i> - <?= $this->url->link(t('Analytics'), 'TaskViewController', 'analytics', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + <?= $this->url->icon('bar-chart', t('Analytics'), 'TaskViewController', 'analytics', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <?php if ($task['time_estimated'] > 0 || $task['time_spent'] > 0): ?> <li <?= $this->app->checkMenuSelection('TaskViewController', 'timetracking') ?>> - <i class="fa fa-clock-o fa-fw"></i> - <?= $this->url->link(t('Time tracking'), 'TaskViewController', 'timetracking', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + <?= $this->url->icon('clock-o', t('Time tracking'), 'TaskViewController', 'timetracking', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <?php endif ?> @@ -35,72 +30,57 @@ </div> <ul> <li> - <i class="fa fa-pencil-square-o fa-fw"></i> - <?= $this->url->link(t('Edit the task'), 'TaskModificationController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->large('edit', t('Edit the task'), 'TaskModificationController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-refresh fa-rotate-90 fa-fw"></i> - <?= $this->url->link(t('Edit recurrence'), 'TaskRecurrenceController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('refresh fa-rotate-90', t('Edit recurrence'), 'TaskRecurrenceController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-plus fa-fw"></i> - <?= $this->url->link(t('Add a sub-task'), 'SubtaskController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('plus', t('Add a sub-task'), 'SubtaskController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-code-fork fa-fw"></i> - <?= $this->url->link(t('Add internal link'), 'TaskInternalLinkController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('code-fork', t('Add internal link'), 'TaskInternalLinkController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-external-link fa-fw"></i> - <?= $this->url->link(t('Add external link'), 'TaskExternalLinkController', 'find', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('external-link', t('Add external link'), 'TaskExternalLinkController', 'find', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-comment-o fa-fw"></i> - <?= $this->url->link(t('Add a comment'), 'CommentController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->small('comment-o', t('Add a comment'), 'CommentController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-file fa-fw"></i> - <?= $this->url->link(t('Attach a document'), 'TaskFileController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('file', t('Attach a document'), 'TaskFileController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-camera fa-fw"></i> - <?= $this->url->link(t('Add a screenshot'), 'TaskFileController', 'screenshot', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('camera', t('Add a screenshot'), 'TaskFileController', 'screenshot', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-files-o fa-fw"></i> - <?= $this->url->link(t('Duplicate'), 'TaskDuplicationController', 'duplicate', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->small('files-o', t('Duplicate'), 'TaskDuplicationController', 'duplicate', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-clipboard fa-fw"></i> - <?= $this->url->link(t('Duplicate to another project'), 'TaskDuplicationController', 'copy', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->small('clipboard', t('Duplicate to another project'), 'TaskDuplicationController', 'copy', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-clone fa-fw"></i> - <?= $this->url->link(t('Move to another project'), 'TaskDuplicationController', 'move', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->small('clone', t('Move to another project'), 'TaskDuplicationController', 'move', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <?php if ($task['is_active'] == 1 && $this->projectRole->isSortableColumn($task['project_id'], $task['column_id'])): ?> <li> - <i class="fa fa-arrows fa-fw"></i> - <?= $this->url->link(t('Move position'), 'TaskMovePositionController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->small('arrows', t('Move position'), 'TaskMovePositionController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <?php endif ?> <?php if ($this->projectRole->canChangeTaskStatusInColumn($task['project_id'], $task['column_id'])): ?> <?php if ($task['is_active'] == 1): ?> <li> - <i class="fa fa-times fa-fw"></i> - <?= $this->url->link(t('Close this task'), 'TaskStatusController', 'close', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->confirm('times', t('Close this task'), 'TaskStatusController', 'close', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <?php else: ?> <li> - <i class="fa fa-check-square-o fa-fw"></i> - <?= $this->url->link(t('Open this task'), 'TaskStatusController', 'open', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->confirm('check-square-o', t('Open this task'), 'TaskStatusController', 'open', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <?php endif ?> <?php endif ?> <?php if ($this->projectRole->canRemoveTask($task)): ?> <li> - <i class="fa fa-trash-o fa-fw"></i> - <?= $this->url->link(t('Remove'), 'TaskSuppressionController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'redirect' => 'board'), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'TaskSuppressionController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'redirect' => 'board')) ?> </li> <?php endif ?> diff --git a/app/Template/task/time_tracking_summary.php b/app/Template/task/time_tracking_summary.php index 9886ccfa..63de733a 100644 --- a/app/Template/task/time_tracking_summary.php +++ b/app/Template/task/time_tracking_summary.php @@ -1,13 +1,13 @@ <?php if ($task['time_estimated'] > 0 || $task['time_spent'] > 0): ?> + <div class="page-header"> + <h2><?= t('Time tracking') ?></h2> + </div> -<div class="page-header"> - <h2><?= t('Time tracking') ?></h2> -</div> - -<ul class="listing"> - <li><?= t('Estimate:') ?> <strong><?= $this->text->e($task['time_estimated']) ?></strong> <?= t('hours') ?></li> - <li><?= t('Spent:') ?> <strong><?= $this->text->e($task['time_spent']) ?></strong> <?= t('hours') ?></li> - <li><?= t('Remaining:') ?> <strong><?= $this->text->e($task['time_estimated'] - $task['time_spent']) ?></strong> <?= t('hours') ?></li> -</ul> - + <div class="panel"> + <ul> + <li><?= t('Estimate:') ?> <strong><?= $this->text->e($task['time_estimated']) ?></strong> <?= t('hours') ?></li> + <li><?= t('Spent:') ?> <strong><?= $this->text->e($task['time_spent']) ?></strong> <?= t('hours') ?></li> + <li><?= t('Remaining:') ?> <strong><?= $this->text->e($task['time_estimated'] - $task['time_spent']) ?></strong> <?= t('hours') ?></li> + </ul> + </div> <?php endif ?>
\ No newline at end of file diff --git a/app/Template/task_bulk/show.php b/app/Template/task_bulk/show.php index 11ddea31..acf80d8c 100644 --- a/app/Template/task_bulk/show.php +++ b/app/Template/task_bulk/show.php @@ -2,23 +2,20 @@ <h2><?= $this->text->e($project['name']) ?> > <?= t('Create tasks in bulk') ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('TaskBulkController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('TaskBulkController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('column_id', $values) ?> <?= $this->form->hidden('swimlane_id', $values) ?> <?= $this->form->hidden('project_id', $values) ?> - <?= $this->task->selectColor($values) ?> - <?= $this->task->selectAssignee($users_list, $values, $errors) ?> - <?= $this->task->selectCategory($categories_list, $values, $errors) ?> + <?= $this->task->renderColorField($values) ?> + <?= $this->task->renderAssigneeField($users_list, $values, $errors) ?> + <?= $this->task->renderCategoryField($categories_list, $values, $errors) ?> <?= $this->form->label(t('Tasks'), 'tasks') ?> <?= $this->form->textarea('tasks', $values, $errors, array('placeholder="'.t('My task title').'"')) ?> <p class="form-help"><?= t('Enter one task by line.') ?></p> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'BoardViewController', 'show', array('project_id' => $project['id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/task_creation/duplicate_projects.php b/app/Template/task_creation/duplicate_projects.php index dc0fa105..202b3ffe 100644 --- a/app/Template/task_creation/duplicate_projects.php +++ b/app/Template/task_creation/duplicate_projects.php @@ -5,10 +5,10 @@ <?php if (empty($projects_list)): ?> <p class="alert"><?= t('There is no destination project available.') ?></p> <div class="form-actions"> - <?= $this->url->link(t('cancel'), 'BoardViewController', 'show', array('project_id' => $task['project_id']), false, 'close-popover btn') ?> + <?= $this->url->link(t('cancel'), 'BoardViewController', 'show', array('project_id' => $task['project_id']), false, 'js-modal-close btn') ?> </div> <?php else: ?> - <form class="popover-form" method="post" action="<?= $this->url->href('TaskCreationController', 'duplicateProjects', array('project_id' => $task['project_id'])) ?>" autocomplete="off"> + <form method="post" action="<?= $this->url->href('TaskCreationController', 'duplicateProjects', array('project_id' => $task['project_id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('task_id', $values) ?> @@ -20,9 +20,6 @@ array('multiple') ) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Duplicate') ?></button> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'BoardViewController', 'show', array('project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> <?php endif ?> diff --git a/app/Template/task_creation/show.php b/app/Template/task_creation/show.php index 840d1804..e957087f 100644 --- a/app/Template/task_creation/show.php +++ b/app/Template/task_creation/show.php @@ -1,50 +1,48 @@ <div class="page-header"> <h2><?= $this->text->e($project['name']) ?> > <?= t('New task') ?><?= $this->task->getNewTaskDropdown($project['id'], $values['swimlane_id'], $values['column_id']) ?></h2> </div> - -<form class="popover-form" method="post" action="<?= $this->url->href('TaskCreationController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('TaskCreationController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> + <?= $this->form->hidden('project_id', $values) ?> + + <div class="task-form-container"> + <div class="task-form-main-column"> + <?= $this->task->renderTitleField($values, $errors) ?> + <?= $this->task->renderDescriptionField($values, $errors) ?> + <?= $this->task->renderTagField($project) ?> - <div class="form-columns"> - <div class="form-column"> - <?= $this->task->selectTitle($values, $errors) ?> - <?= $this->task->selectDescription($values, $errors) ?> - <?= $this->task->selectTags($project) ?> - <?= $this->hook->render('template:task:form:first-column', array('values' => $values, 'errors' => $errors)) ?> - - <?php if (! isset($duplicate)): ?> - <?= $this->form->checkbox('another_task', t('Create another task'), 1, isset($values['another_task']) && $values['another_task'] == 1) ?> - <?= $this->form->checkbox('duplicate_multiple_projects', t('Duplicate to multiple projects'), 1) ?> - <?php endif ?> </div> - <div class="form-column"> - <?= $this->form->hidden('project_id', $values) ?> - <?= $this->task->selectColor($values) ?> - <?= $this->task->selectAssignee($users_list, $values, $errors) ?> - <?= $this->task->selectCategory($categories_list, $values, $errors) ?> - <?= $this->task->selectSwimlane($swimlanes_list, $values, $errors) ?> - <?= $this->task->selectColumn($columns_list, $values, $errors) ?> - <?= $this->task->selectPriority($project, $values) ?> - <?= $this->task->selectScore($values, $errors) ?> - <?= $this->task->selectReference($values, $errors) ?> + <div class="task-form-secondary-column"> + <?= $this->task->renderColorField($values) ?> + <?= $this->task->renderAssigneeField($users_list, $values, $errors) ?> + <?= $this->task->renderCategoryField($categories_list, $values, $errors) ?> + <?= $this->task->renderSwimlaneField($swimlanes_list, $values, $errors) ?> + <?= $this->task->renderColumnField($columns_list, $values, $errors) ?> + <?= $this->task->renderPriorityField($project, $values) ?> <?= $this->hook->render('template:task:form:second-column', array('values' => $values, 'errors' => $errors)) ?> </div> - <div class="form-column"> - <?= $this->task->selectTimeEstimated($values, $errors) ?> - <?= $this->task->selectTimeSpent($values, $errors) ?> - <?= $this->task->selectStartDate($values, $errors) ?> - <?= $this->task->selectDueDate($values, $errors) ?> + <div class="task-form-secondary-column"> + <?= $this->task->renderDueDateField($values, $errors) ?> + <?= $this->task->renderStartDateField($values, $errors) ?> + <?= $this->task->renderTimeEstimatedField($values, $errors) ?> + <?= $this->task->renderTimeSpentField($values, $errors) ?> + <?= $this->task->renderScoreField($values, $errors) ?> + <?= $this->task->renderReferenceField($values, $errors) ?> <?= $this->hook->render('template:task:form:third-column', array('values' => $values, 'errors' => $errors)) ?> </div> - </div> - <div class="form-actions"> - <button type="submit" class="btn btn-blue" tabindex="15"><?= t('Save') ?></button> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'BoardViewController', 'show', array('project_id' => $values['project_id']), false, 'close-popover') ?> + <div class="task-form-bottom"> + <?php if (! isset($duplicate)): ?> + <?= $this->form->checkbox('another_task', t('Create another task'), 1, isset($values['another_task']) && $values['another_task'] == 1) ?> + <?= $this->form->checkbox('duplicate_multiple_projects', t('Duplicate to multiple projects'), 1) ?> + <?php endif ?> + + <?= $this->modal->submitButtons() ?> + </div> </div> </form> diff --git a/app/Template/task_duplication/copy.php b/app/Template/task_duplication/copy.php index 65cfe4d6..d96960fc 100644 --- a/app/Template/task_duplication/copy.php +++ b/app/Template/task_duplication/copy.php @@ -5,25 +5,25 @@ <?php if (empty($projects_list)): ?> <p class="alert"><?= t('There is no destination project available.') ?></p> <div class="form-actions"> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover btn') ?> + <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'js-modal-close btn') ?> </div> <?php else: ?> - <form class="popover-form" method="post" action="<?= $this->url->href('TaskDuplicationController', 'copy', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> - + <form method="post" action="<?= $this->url->href('TaskDuplicationController', 'copy', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> <?= $this->form->label(t('Project'), 'project_id') ?> - <?= $this->form->select( - 'project_id', - $projects_list, - $values, - array(), - array('data-redirect="'.$this->url->href('TaskDuplicationController', 'copy', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'dst_project_id' => 'PROJECT_ID')).'"'), - 'task-reload-project-destination' - ) ?> - <span class="loading-icon" style="display: none"> <i class="fa fa-spinner fa-spin"></i></span> + <?= $this->app->component('select-dropdown-autocomplete', array( + 'name' => 'project_id', + 'items' => $projects_list, + 'defaultValue' => isset($values['project_id']) ? $values['project_id'] : null, + 'placeholder' => t('Choose a project'), + 'replace' => array( + 'regex' => 'PROJECT_ID', + 'url' => $this->url->href('TaskDuplicationController', 'copy', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'dst_project_id' => 'PROJECT_ID')), + ) + )) ?> <?= $this->form->label(t('Swimlane'), 'swimlane_id') ?> <?= $this->form->select('swimlane_id', $swimlanes_list, $values) ?> @@ -41,10 +41,6 @@ <?= $this->form->select('owner_id', $users_list, $values) ?> <p class="form-help"><?= t('Current assignee: %s', ($task['assignee_name'] ?: $task['assignee_username']) ?: e('not assigned')) ?></p> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> <?php endif ?> diff --git a/app/Template/task_duplication/duplicate.php b/app/Template/task_duplication/duplicate.php index c0baf94e..aa02b78c 100644 --- a/app/Template/task_duplication/duplicate.php +++ b/app/Template/task_duplication/duplicate.php @@ -7,9 +7,9 @@ <?= t('Do you really want to duplicate this task?') ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'TaskDuplicationController', 'duplicate', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'confirmation' => 'yes'), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'TaskDuplicationController', + 'duplicate', + array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'confirmation' => 'yes') + ) ?> </div> diff --git a/app/Template/task_duplication/move.php b/app/Template/task_duplication/move.php index 717d15e9..16ce2464 100644 --- a/app/Template/task_duplication/move.php +++ b/app/Template/task_duplication/move.php @@ -5,25 +5,26 @@ <?php if (empty($projects_list)): ?> <p class="alert"><?= t('There is no destination project available.') ?></p> <div class="form-actions"> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover btn') ?> + <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'js-modal-close btn') ?> </div> <?php else: ?> - <form class="popover-form" method="post" action="<?= $this->url->href('TaskDuplicationController', 'move', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> + <form method="post" action="<?= $this->url->href('TaskDuplicationController', 'move', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> <?= $this->form->label(t('Project'), 'project_id') ?> - <?= $this->form->select( - 'project_id', - $projects_list, - $values, - array(), - array('data-redirect="'.$this->url->href('TaskDuplicationController', 'move', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'dst_project_id' => 'PROJECT_ID')).'"'), - 'task-reload-project-destination' - ) ?> - <span class="loading-icon" style="display: none"> <i class="fa fa-spinner fa-spin"></i></span> + <?= $this->app->component('select-dropdown-autocomplete', array( + 'name' => 'project_id', + 'items' => $projects_list, + 'defaultValue' => isset($values['project_id']) ? $values['project_id'] : null, + 'placeholder' => t('Choose a project'), + 'replace' => array( + 'regex' => 'PROJECT_ID', + 'url' => $this->url->href('TaskDuplicationController', 'move', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'dst_project_id' => 'PROJECT_ID')), + ) + )) ?> <?= $this->form->label(t('Swimlane'), 'swimlane_id') ?> <?= $this->form->select('swimlane_id', $swimlanes_list, $values) ?> @@ -41,11 +42,7 @@ <?= $this->form->select('owner_id', $users_list, $values) ?> <p class="form-help"><?= t('Current assignee: %s', ($task['assignee_name'] ?: $task['assignee_username']) ?: e('not assigned')) ?></p> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> <?php endif ?> diff --git a/app/Template/task_external_link/create.php b/app/Template/task_external_link/create.php index beddfc90..04d9bed0 100644 --- a/app/Template/task_external_link/create.php +++ b/app/Template/task_external_link/create.php @@ -2,12 +2,7 @@ <h2><?= t('Add a new external link') ?></h2> </div> -<form class="popover-form" action="<?= $this->url->href('TaskExternalLinkController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post" autocomplete="off"> +<form action="<?= $this->url->href('TaskExternalLinkController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post" autocomplete="off"> <?= $this->render('task_external_link/form', array('task' => $task, 'dependencies' => $dependencies, 'values' => $values, 'errors' => $errors)) ?> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskExternalLinkController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/task_external_link/edit.php b/app/Template/task_external_link/edit.php index 917a28b9..df10d444 100644 --- a/app/Template/task_external_link/edit.php +++ b/app/Template/task_external_link/edit.php @@ -2,12 +2,7 @@ <h2><?= t('Edit external link') ?></h2> </div> -<form class="popover-form" action="<?= $this->url->href('TaskExternalLinkController', 'update', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post" autocomplete="off"> +<form action="<?= $this->url->href('TaskExternalLinkController', 'update', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post" autocomplete="off"> <?= $this->render('task_external_link/form', array('task' => $task, 'dependencies' => $dependencies, 'values' => $values, 'errors' => $errors)) ?> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskExternalLinkController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/task_external_link/find.php b/app/Template/task_external_link/find.php index a88b29ce..a3665c0d 100644 --- a/app/Template/task_external_link/find.php +++ b/app/Template/task_external_link/find.php @@ -2,7 +2,7 @@ <h2><?= t('Add a new external link') ?></h2> </div> -<form class="popover-form" action="<?= $this->url->href('TaskExternalLinkController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post" autocomplete="off"> +<form action="<?= $this->url->href('TaskExternalLinkController', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('task_id', array('task_id' => $task['id'])) ?> @@ -20,9 +20,5 @@ <?= $this->form->label(t('Link type'), 'type') ?> <?= $this->form->select('type', $types, $values) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Next') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/task_external_link/remove.php b/app/Template/task_external_link/remove.php index 2a888a60..ed8ad15f 100644 --- a/app/Template/task_external_link/remove.php +++ b/app/Template/task_external_link/remove.php @@ -7,9 +7,9 @@ <?= t('Do you really want to remove this link: "%s"?', $link['title']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'TaskExternalLinkController', 'remove', array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskExternalLinkController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'TaskExternalLinkController', + 'remove', + array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id']) + ) ?> </div> diff --git a/app/Template/task_external_link/table.php b/app/Template/task_external_link/table.php index a5fc7a33..aaa234bb 100644 --- a/app/Template/task_external_link/table.php +++ b/app/Template/task_external_link/table.php @@ -33,12 +33,10 @@ <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-edit fa-fw"></i> - <?= $this->url->link(t('Edit'), 'TaskExternalLinkController', 'edit', array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('edit', t('Edit'), 'TaskExternalLinkController', 'edit', array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-trash-o fa-fw"></i> - <?= $this->url->link(t('Remove'), 'TaskExternalLinkController', 'confirm', array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'TaskExternalLinkController', 'confirm', array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> </ul> </div> diff --git a/app/Template/task_file/create.php b/app/Template/task_file/create.php index e05cf829..eebb08eb 100644 --- a/app/Template/task_file/create.php +++ b/app/Template/task_file/create.php @@ -1,33 +1,20 @@ <div class="page-header"> <h2><?= t('Attach a document') ?></h2> </div> -<div id="file-done" style="display:none"> - <p class="alert alert-success"> - <?= t('All files have been uploaded successfully.') ?> - <?= $this->url->link(t('View uploaded files'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> - </p> -</div> - -<div id="file-error-max-size" style="display:none"> - <p class="alert alert-error"> - <?= t('The maximum allowed file size is %sB.', $this->text->bytes($max_size)) ?> - <a href="#" id="file-browser"><?= t('Choose files again') ?></a> - </p> -</div> -<div - id="file-dropzone" - data-max-size="<?= $max_size ?>" - data-url="<?= $this->url->href('TaskFileController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>"> - <div id="file-dropzone-inner"> - <?= t('Drag and drop your files here') ?> <?= t('or') ?> <a href="#" id="file-browser"><?= t('choose files') ?></a> - </div> -</div> - -<input type="file" name="files[]" multiple style="display:none" id="file-form-element"> +<?= $this->app->component('file-upload', array( + 'maxSize' => $max_size, + 'url' => $this->url->to('TaskFileController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), + 'labelDropzone' => t('Drag and drop your files here'), + 'labelOr' => t('or'), + 'labelChooseFiles' => t('choose files'), + 'labelOversize' => t('The maximum allowed file size is %sB.', $this->text->bytes($max_size)), + 'labelSuccess' => t('All files have been uploaded successfully.'), + 'labelCloseSuccess' => t('Close this window'), + 'labelUploadError' => t('Unable to upload this file.'), +)) ?> -<div class="form-actions"> - <input type="submit" value="<?= t('Upload files') ?>" class="btn btn-blue" id="file-upload-button" disabled> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> -</div> +<?= $this->modal->submitButtons(array( + 'submitLabel' => t('Upload files'), + 'disabled' => true, +)) ?> diff --git a/app/Template/task_file/files.php b/app/Template/task_file/files.php index 94c26f73..28633dc4 100644 --- a/app/Template/task_file/files.php +++ b/app/Template/task_file/files.php @@ -15,18 +15,20 @@ <ul> <?php if ($this->file->getPreviewType($file['name']) !== null): ?> <li> + <?= $this->modal->large('eye', t('View file'), 'FileViewerController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?> + </li> + <?php elseif ($this->file->getBrowserViewType($file['name']) !== null): ?> + <li> <i class="fa fa-eye fa-fw"></i> - <?= $this->url->link(t('View file'), 'FileViewerController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?> + <?= $this->url->link(t('View file'), 'FileViewerController', 'browser', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, '', '', true) ?> </li> <?php endif ?> <li> - <i class="fa fa-download fa-fw"></i> - <?= $this->url->link(t('Download'), 'FileViewerController', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?> + <?= $this->url->icon('download', t('Download'), 'FileViewerController', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?> </li> <?php if ($this->user->hasProjectAccess('TaskFileController', 'remove', $task['project_id'])): ?> <li> - <i class="fa fa-trash fa-fw"></i> - <?= $this->url->link(t('Remove'), 'TaskFileController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'TaskFileController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?> </li> <?php endif ?> </ul> diff --git a/app/Template/task_file/images.php b/app/Template/task_file/images.php index 8be89274..2143455d 100644 --- a/app/Template/task_file/images.php +++ b/app/Template/task_file/images.php @@ -16,16 +16,14 @@ <div class="file-thumbnail-content"> <div class="file-thumbnail-title"> <div class="dropdown"> - <a href="#" class="dropdown-menu dropdown-menu-link-text"><?= $this->text->e($file['name']) ?> <i class="fa fa-caret-down"></i></a> + <a href="#" class="dropdown-menu dropdown-menu-link-text" title="<?= $this->text->e($file['name']) ?>"><?= $this->text->e($file['name']) ?> <i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-download fa-fw"></i> - <?= $this->url->link(t('Download'), 'FileViewerController', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?> + <?= $this->url->icon('download', t('Download'), 'FileViewerController', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?> </li> <?php if ($this->user->hasProjectAccess('TaskFileController', 'remove', $task['project_id'])): ?> <li> - <i class="fa fa-trash fa-fw"></i> - <?= $this->url->link(t('Remove'), 'TaskFileController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'TaskFileController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?> </li> <?php endif ?> </ul> diff --git a/app/Template/task_file/remove.php b/app/Template/task_file/remove.php index 42894f05..e7ffe560 100644 --- a/app/Template/task_file/remove.php +++ b/app/Template/task_file/remove.php @@ -7,9 +7,9 @@ <?= t('Do you really want to remove this file: "%s"?', $this->text->e($file['name'])) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'TaskFileController', 'remove', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'TaskFileController', + 'remove', + array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']) + ) ?> </div> diff --git a/app/Template/task_file/screenshot.php b/app/Template/task_file/screenshot.php index 6300159f..dad8c233 100644 --- a/app/Template/task_file/screenshot.php +++ b/app/Template/task_file/screenshot.php @@ -6,14 +6,10 @@ <p id="screenshot-inner"><?= t('Take a screenshot and press CTRL+V or ⌘+V to paste here.') ?></p> </div> -<form class="popover-form" action="<?= $this->url->href('TaskFileController', 'screenshot', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post"> - <input type="hidden" name="screenshot"/> +<form action="<?= $this->url->href('TaskFileController', 'screenshot', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post"> <?= $this->form->csrf() ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->app->component('screenshot') ?> + <?= $this->modal->submitButtons() ?> </form> <p class="alert alert-info"><?= t('This feature does not work with all browsers.') ?></p> diff --git a/app/Template/task_gantt/show.php b/app/Template/task_gantt/show.php index c5d338fb..61a476b7 100644 --- a/app/Template/task_gantt/show.php +++ b/app/Template/task_gantt/show.php @@ -3,16 +3,13 @@ <div class="menu-inline"> <ul> <li <?= $sorting === 'board' ? 'class="active"' : '' ?>> - <i class="fa fa-sort-numeric-asc fa-fw"></i> - <?= $this->url->link(t('Sort by position'), 'TaskGanttController', 'show', array('project_id' => $project['id'], 'sorting' => 'board')) ?> + <?= $this->url->icon('sort-numeric-asc', t('Sort by position'), 'TaskGanttController', 'show', array('project_id' => $project['id'], 'sorting' => 'board')) ?> </li> <li <?= $sorting === 'date' ? 'class="active"' : '' ?>> - <i class="fa fa-sort-amount-asc fa-fw"></i> - <?= $this->url->link(t('Sort by date'), 'TaskGanttController', 'show', array('project_id' => $project['id'], 'sorting' => 'date')) ?> + <?= $this->url->icon('sort-amount-asc', t('Sort by date'), 'TaskGanttController', 'show', array('project_id' => $project['id'], 'sorting' => 'date')) ?> </li> <li> - <i class="fa fa-plus fa-fw"></i> - <?= $this->url->link(t('Add task'), 'TaskGanttCreationController', 'show', array('project_id' => $project['id']), false, 'popover') ?> + <?= $this->modal->large('plus', t('Add task'), 'TaskCreationController', 'show', array('project_id' => $project['id'])) ?> </li> </ul> </div> diff --git a/app/Template/task_gantt_creation/show.php b/app/Template/task_gantt_creation/show.php deleted file mode 100644 index 7906c39a..00000000 --- a/app/Template/task_gantt_creation/show.php +++ /dev/null @@ -1,46 +0,0 @@ -<div class="page-header"> - <h2><?= $this->text->e($project['name']) ?> > <?= t('New task') ?></h2> -</div> -<form class="popover-form" method="post" action="<?= $this->url->href('TaskGanttCreationController', 'save', array('project_id' => $values['project_id'])) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->hidden('project_id', $values) ?> - <?= $this->form->hidden('column_id', $values) ?> - <?= $this->form->hidden('position', $values) ?> - - <div class="form-columns"> - <div class="form-column"> - <?= $this->task->selectTitle($values, $errors) ?> - <?= $this->task->selectDescription($values, $errors) ?> - <?= $this->task->selectTags($project) ?> - - <?= $this->hook->render('template:task:form:first-column', array('values' => $values, 'errors' => $errors)) ?> - </div> - - <div class="form-column"> - <?= $this->task->selectColor($values) ?> - <?= $this->task->selectAssignee($users_list, $values, $errors) ?> - <?= $this->task->selectCategory($categories_list, $values, $errors) ?> - <?= $this->task->selectSwimlane($swimlanes_list, $values, $errors) ?> - <?= $this->task->selectPriority($project, $values) ?> - <?= $this->task->selectScore($values, $errors) ?> - <?= $this->task->selectReference($values, $errors) ?> - - <?= $this->hook->render('template:task:form:second-column', array('values' => $values, 'errors' => $errors)) ?> - </div> - - <div class="form-column"> - <?= $this->task->selectTimeEstimated($values, $errors) ?> - <?= $this->task->selectTimeSpent($values, $errors) ?> - <?= $this->task->selectStartDate($values, $errors) ?> - <?= $this->task->selectDueDate($values, $errors) ?> - - <?= $this->hook->render('template:task:form:third-column', array('values' => $values, 'errors' => $errors)) ?> - </div> - </div> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue" tabindex="15"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskGanttController', 'show', array('project_id' => $values['project_id']), false, 'close-popover') ?> - </div> -</form> diff --git a/app/Template/task_import/show.php b/app/Template/task_import/show.php index cc6a7b3a..20b020d3 100644 --- a/app/Template/task_import/show.php +++ b/app/Template/task_import/show.php @@ -15,14 +15,11 @@ <p class="form-help"><?= t('Maximum size: ') ?><?= is_integer($max_size) ? $this->text->bytes($max_size) : $max_size ?></p> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Import') ?></button> - </div> + <?= $this->modal->submitButtons(array('submitLabel' => t('Import'))) ?> </form> -<div class="page-header"> - <h2><?= t('Instructions') ?></h2> -</div> -<div class="alert"> + +<div class="panel"> + <h3><?= t('Instructions') ?></h3> <ul> <li><?= t('Your file must use the predefined CSV format') ?></li> <li><?= t('Your file must be encoded in UTF-8') ?></li> @@ -30,5 +27,7 @@ <li><?= t('Duplicates are not verified for you') ?></li> <li><?= t('The due date must use the ISO format: YYYY-MM-DD') ?></li> </ul> + <p class="margin-top"> + <?= $this->url->icon('download', t('Download CSV template'), 'TaskImportController', 'template', array('project_id' => $project['id'])) ?> + </p> </div> -<p><i class="fa fa-download fa-fw"></i><?= $this->url->link(t('Download CSV template'), 'TaskImportController', 'template', array('project_id' => $project['id'])) ?></p> diff --git a/app/Template/task_import/sidebar.php b/app/Template/task_import/sidebar.php deleted file mode 100644 index 04896948..00000000 --- a/app/Template/task_import/sidebar.php +++ /dev/null @@ -1,8 +0,0 @@ -<div class="sidebar"> - <ul> - <li <?= $this->app->checkMenuSelection('TaskImportController', 'show') ?>> - <?= $this->url->link(t('Tasks').' (CSV)', 'TaskImportController', 'show', array('project_id' => $project['id'])) ?> - </li> - <?= $this->hook->render('template:task-import:sidebar') ?> - </ul> -</div> diff --git a/app/Template/task_internal_link/create.php b/app/Template/task_internal_link/create.php index fed29605..3c39b87c 100644 --- a/app/Template/task_internal_link/create.php +++ b/app/Template/task_internal_link/create.php @@ -2,7 +2,7 @@ <h2><?= t('Add a new link') ?></h2> </div> -<form class="popover-form" action="<?= $this->url->href('TaskInternalLinkController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post" autocomplete="off"> +<form action="<?= $this->url->href('TaskInternalLinkController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('task_id', array('task_id' => $task['id'])) ?> @@ -25,9 +25,5 @@ ), 'autocomplete') ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/task_internal_link/edit.php b/app/Template/task_internal_link/edit.php index f4df57bd..5abf7b65 100644 --- a/app/Template/task_internal_link/edit.php +++ b/app/Template/task_internal_link/edit.php @@ -26,9 +26,5 @@ ), 'autocomplete') ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/task_internal_link/remove.php b/app/Template/task_internal_link/remove.php index 966ad116..f8d91a81 100644 --- a/app/Template/task_internal_link/remove.php +++ b/app/Template/task_internal_link/remove.php @@ -7,9 +7,9 @@ <?= t('Do you really want to remove this link with task #%d?', $link['opposite_task_id']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'TaskInternalLinkController', 'remove', array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'TaskInternalLinkController', + 'remove', + array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id']) + ) ?> </div> diff --git a/app/Template/task_internal_link/table.php b/app/Template/task_internal_link/table.php index 3a3a2b88..255ecc97 100644 --- a/app/Template/task_internal_link/table.php +++ b/app/Template/task_internal_link/table.php @@ -73,12 +73,10 @@ <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-edit fa-fw"></i> - <?= $this->url->link(t('Edit'), 'TaskInternalLinkController', 'edit', array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->medium('edit', t('Edit'), 'TaskInternalLinkController', 'edit', array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> <li> - <i class="fa fa-trash-o fa-fw"></i> - <?= $this->url->link(t('Remove'), 'TaskInternalLinkController', 'confirm', array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'TaskInternalLinkController', 'confirm', array('link_id' => $link['id'], 'task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> </li> </ul> </div> diff --git a/app/Template/task_modification/show.php b/app/Template/task_modification/show.php index 734b247a..710abedf 100644 --- a/app/Template/task_modification/show.php +++ b/app/Template/task_modification/show.php @@ -1,44 +1,42 @@ <div class="page-header"> <h2><?= $this->text->e($project['name']) ?> > <?= $this->text->e($task['title']) ?></h2> </div> -<form class="popover-form" method="post" action="<?= $this->url->href('TaskModificationController', 'update', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> +<form method="post" action="<?= $this->url->href('TaskModificationController', 'update', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> <?= $this->form->hidden('id', $values) ?> <?= $this->form->hidden('project_id', $values) ?> - <div class="form-columns"> - <div class="form-column"> - <?= $this->task->selectTitle($values, $errors) ?> - <?= $this->task->selectDescription($values, $errors) ?> - <?= $this->task->selectTags($project, $tags) ?> + <div class="task-form-container"> + <div class="task-form-main-column"> + <?= $this->task->renderTitleField($values, $errors) ?> + <?= $this->task->renderDescriptionField($values, $errors) ?> + <?= $this->task->renderTagField($project, $tags) ?> <?= $this->hook->render('template:task:form:first-column', array('values' => $values, 'errors' => $errors)) ?> </div> - <div class="form-column"> - <?= $this->task->selectColor($values) ?> - <?= $this->task->selectAssignee($users_list, $values, $errors) ?> - <?= $this->task->selectCategory($categories_list, $values, $errors) ?> - <?= $this->task->selectPriority($project, $values) ?> - <?= $this->task->selectScore($values, $errors) ?> - <?= $this->task->selectReference($values, $errors) ?> + <div class="task-form-secondary-column"> + <?= $this->task->renderColorField($values) ?> + <?= $this->task->renderAssigneeField($users_list, $values, $errors) ?> + <?= $this->task->renderCategoryField($categories_list, $values, $errors) ?> + <?= $this->task->renderPriorityField($project, $values) ?> <?= $this->hook->render('template:task:form:second-column', array('values' => $values, 'errors' => $errors)) ?> </div> - <div class="form-column"> - <?= $this->task->selectTimeEstimated($values, $errors) ?> - <?= $this->task->selectTimeSpent($values, $errors) ?> - <?= $this->task->selectStartDate($values, $errors) ?> - <?= $this->task->selectDueDate($values, $errors) ?> + <div class="task-form-secondary-column"> + <?= $this->task->renderDueDateField($values, $errors) ?> + <?= $this->task->renderStartDateField($values, $errors) ?> + <?= $this->task->renderTimeEstimatedField($values, $errors) ?> + <?= $this->task->renderTimeSpentField($values, $errors) ?> + <?= $this->task->renderScoreField($values, $errors) ?> + <?= $this->task->renderReferenceField($values, $errors) ?> <?= $this->hook->render('template:task:form:third-column', array('values' => $values, 'errors' => $errors)) ?> </div> - </div> - <div class="form-actions"> - <button type="submit" class="btn btn-blue" tabindex="15"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> + <div class="task-form-bottom"> + <?= $this->modal->submitButtons() ?> + </div> </div> </form> diff --git a/app/Template/task_move_position/show.php b/app/Template/task_move_position/show.php index 91241016..a73be785 100644 --- a/app/Template/task_move_position/show.php +++ b/app/Template/task_move_position/show.php @@ -14,10 +14,6 @@ 'afterLabel' => t('Insert after this task'), )) ?> -<?= $this->app->component('submit-cancel', array( - 'submitLabel' => t('Save'), - 'orLabel' => t('or'), - 'cancelLabel' => t('cancel'), -)) ?> +<?= $this->modal->submitButtons() ?> </form> diff --git a/app/Template/task_recurrence/edit.php b/app/Template/task_recurrence/edit.php index 09d14826..0db27d46 100644 --- a/app/Template/task_recurrence/edit.php +++ b/app/Template/task_recurrence/edit.php @@ -3,7 +3,7 @@ </div> <?php if ($task['recurrence_status'] != \Kanboard\Model\TaskModel::RECURRING_STATUS_NONE): ?> -<div class="listing"> +<div class="panel"> <?= $this->render('task_recurrence/info', array( 'task' => $task, 'recurrence_trigger_list' => $recurrence_trigger_list, @@ -15,7 +15,7 @@ <?php if ($task['recurrence_status'] != \Kanboard\Model\TaskModel::RECURRING_STATUS_PROCESSED): ?> - <form class="popover-form" method="post" action="<?= $this->url->href('TaskRecurrenceController', 'update', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> + <form method="post" action="<?= $this->url->href('TaskRecurrenceController', 'update', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> @@ -37,11 +37,7 @@ <?= $this->form->label(t('Base date to calculate new due date'), 'recurrence_basedate') ?> <?= $this->form->select('recurrence_basedate', $recurrence_basedate_list, $values, $errors) ?> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons() ?> </form> <?php endif ?> diff --git a/app/Template/task_status/close.php b/app/Template/task_status/close.php index 2d7b0ce5..0bf3c8e3 100644 --- a/app/Template/task_status/close.php +++ b/app/Template/task_status/close.php @@ -7,9 +7,9 @@ <?= t('Do you really want to close the task "%s" as well as all subtasks?', $task['title']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'TaskStatusController', 'close', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'confirmation' => 'yes'), true, 'btn btn-red popover-link') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'TaskStatusController', + 'close', + array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'confirmation' => 'yes') + ) ?> </div> diff --git a/app/Template/task_status/open.php b/app/Template/task_status/open.php index 242b5db5..42765e34 100644 --- a/app/Template/task_status/open.php +++ b/app/Template/task_status/open.php @@ -7,9 +7,9 @@ <?= t('Do you really want to open this task: "%s"?', $task['title']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'TaskStatusController', 'open', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'confirmation' => 'yes'), true, 'btn btn-red popover-link') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'TaskStatusController', + 'open', + array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'confirmation' => 'yes') + ) ?> </div> diff --git a/app/Template/task_suppression/remove.php b/app/Template/task_suppression/remove.php index 5d0f7720..4b0666d8 100644 --- a/app/Template/task_suppression/remove.php +++ b/app/Template/task_suppression/remove.php @@ -7,9 +7,9 @@ <?= t('Do you really want to remove this task: "%s"?', $this->text->e($task['title'])) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'TaskSuppressionController', 'remove', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'redirect' => $redirect), true, 'btn btn-red popover-link') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'TaskSuppressionController', + 'remove', + array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'redirect' => $redirect) + ) ?> </div> diff --git a/app/Template/twofactor/disable.php b/app/Template/twofactor/disable.php index bc419181..c44c450f 100644 --- a/app/Template/twofactor/disable.php +++ b/app/Template/twofactor/disable.php @@ -7,8 +7,9 @@ <?= t('Do you really want to disable the two factor authentication for this user: "%s"?', $user['name'] ?: $user['username']) ?> </p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'TwoFactorController', 'disable', array('user_id' => $user['id'], 'disable' => 'yes'), true, 'btn btn-red') ?> - <?= t('or') ?> <?= $this->url->link(t('cancel'), 'UserViewController', 'show', array('user_id' => $user['id'])) ?> - </div> + <?= $this->modal->confirmButtons( + 'TwoFactorController', + 'disable', + array('user_id' => $user['id'], 'disable' => 'yes') + ) ?> </div> diff --git a/app/Template/twofactor/show.php b/app/Template/twofactor/show.php index 0aeef427..a5bdeccb 100644 --- a/app/Template/twofactor/show.php +++ b/app/Template/twofactor/show.php @@ -3,7 +3,7 @@ </div> <?php if (! empty($secret) || ! empty($qrcode_url) || ! empty($key_url)): ?> -<div class="listing"> +<div class="panel"> <?php if (! empty($secret)): ?> <p><?= t('Secret key: ') ?><strong><?= $this->text->e($secret) ?></strong></p> <?php endif ?> diff --git a/app/Template/user_creation/remote.php b/app/Template/user_creation/remote.php deleted file mode 100644 index 41d0d3c7..00000000 --- a/app/Template/user_creation/remote.php +++ /dev/null @@ -1,51 +0,0 @@ -<div class="page-header"> - <h2><?= t('New remote user') ?></h2> -</div> -<form class="popover-form" method="post" action="<?= $this->url->href('UserCreationController', 'save') ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->hidden('is_ldap_user', array('is_ldap_user' => 1)) ?> - - <div class="form-columns"> - <div class="form-column"> - <?= $this->form->label(t('Username'), 'username') ?> - <?= $this->form->text('username', $values, $errors, array('autofocus', 'required', 'maxlength="50"')) ?> - - <?= $this->form->label(t('Name'), 'name') ?> - <?= $this->form->text('name', $values, $errors) ?> - - <?= $this->form->label(t('Email'), 'email') ?> - <?= $this->form->email('email', $values, $errors) ?> - - <?= $this->hook->render('template:user:create-remote:form', array('values' => $values, 'errors' => $errors)) ?> - </div> - - <div class="form-column"> - <?= $this->form->label(t('Add project member'), 'project_id') ?> - <?= $this->form->select('project_id', $projects, $values, $errors) ?> - - <?= $this->form->label(t('Timezone'), 'timezone') ?> - <?= $this->form->select('timezone', $timezones, $values, $errors) ?> - - <?= $this->form->label(t('Language'), 'language') ?> - <?= $this->form->select('language', $languages, $values, $errors) ?> - - <?= $this->form->label(t('Role'), 'role') ?> - <?= $this->form->select('role', $roles, $values, $errors) ?> - - <?= $this->form->checkbox('notifications_enabled', t('Enable email notifications'), 1, isset($values['notifications_enabled']) && $values['notifications_enabled'] == 1 ? true : false) ?> - <?= $this->form->checkbox('disable_login_form', t('Disallow login form'), 1, isset($values['disable_login_form']) && $values['disable_login_form'] == 1) ?> - </div> - </div> - - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'UserListController', 'show', array(), false, 'close-popover') ?> - </div> -</form> -<div class="alert alert-info"> - <ul> - <li><?= t('Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.') ?></li> - <li><?= t('If you check the box "Disallow login form", credentials entered in the login form will be ignored.') ?></li> - </ul> -</div> diff --git a/app/Template/user_creation/show.php b/app/Template/user_creation/show.php new file mode 100644 index 00000000..597dce55 --- /dev/null +++ b/app/Template/user_creation/show.php @@ -0,0 +1,67 @@ +<div class="page-header"> + <h2><?= t('New User') ?></h2> +</div> +<form method="post" action="<?= $this->url->href('UserCreationController', 'save') ?>" autocomplete="off"> + <?= $this->form->csrf() ?> + + <div class="form-columns"> + <div class="form-column"> + <fieldset> + <legend><?= t('Profile') ?></legend> + + <?= $this->form->label(t('Username'), 'username') ?> + <?= $this->form->text('username', $values, $errors, array('autofocus', 'required', 'maxlength="50"')) ?> + + <?= $this->form->label(t('Name'), 'name') ?> + <?= $this->form->text('name', $values, $errors) ?> + + <?= $this->form->label(t('Email'), 'email') ?> + <?= $this->form->email('email', $values, $errors) ?> + </fieldset> + + <fieldset> + <legend><?= t('Authentication') ?></legend> + <?= $this->form->checkbox('is_ldap_user', t('Remote user'), 1, isset($values['is_ldap_user']) && $values['is_ldap_user'] == 1) ?> + <p class="form-help"><?= t('If checked, this user will use a third-party system for authentication.') ?></p> + + <?= $this->form->label(t('Password'), 'password') ?> + <?= $this->form->password('password', $values, $errors) ?> + <p class="form-help"><?= t('The password is necessary only for local users.') ?></p> + + <?= $this->form->label(t('Confirmation'), 'confirmation') ?> + <?= $this->form->password('confirmation', $values, $errors) ?> + </fieldset> + </div> + + <div class="form-column"> + <fieldset> + <legend><?= t('Security') ?></legend> + + <?= $this->form->label(t('Role'), 'role') ?> + <?= $this->form->select('role', $roles, $values, $errors) ?> + + <?= $this->form->checkbox('disable_login_form', t('Disallow login form'), 1, isset($values['disable_login_form']) && $values['disable_login_form'] == 1) ?> + </fieldset> + + <fieldset> + <legend><?= t('Preferences') ?></legend> + <?= $this->form->label(t('Timezone'), 'timezone') ?> + <?= $this->form->select('timezone', $timezones, $values, $errors) ?> + + <?= $this->form->label(t('Language'), 'language') ?> + <?= $this->form->select('language', $languages, $values, $errors) ?> + + <?= $this->form->checkbox('notifications_enabled', t('Enable email notifications'), 1, isset($values['notifications_enabled']) && $values['notifications_enabled'] == 1 ? true : false) ?> + </fieldset> + + <fieldset> + <legend><?= t('Projects') ?></legend> + + <?= $this->form->label(t('Add this person to this project'), 'project_id') ?> + <?= $this->form->select('project_id', $projects, $values, $errors) ?> + </fieldset> + </div> + </div> + + <?= $this->modal->submitButtons() ?> +</form> diff --git a/app/Template/user_credential/authentication.php b/app/Template/user_credential/authentication.php index fbe2e915..98c0d758 100644 --- a/app/Template/user_credential/authentication.php +++ b/app/Template/user_credential/authentication.php @@ -4,13 +4,15 @@ <form method="post" action="<?= $this->url->href('UserCredentialController', 'saveAuthentication', array('user_id' => $user['id'])) ?>" autocomplete="off"> <?= $this->form->csrf() ?> - <?= $this->form->hidden('id', $values) ?> - <?= $this->form->hidden('username', $values) ?> + <fieldset> + <?= $this->form->hidden('id', $values) ?> + <?= $this->form->hidden('username', $values) ?> - <?= $this->hook->render('template:user:authentication:form', array('values' => $values, 'errors' => $errors, 'user' => $user)) ?> + <?= $this->hook->render('template:user:authentication:form', array('values' => $values, 'errors' => $errors, 'user' => $user)) ?> - <?= $this->form->checkbox('is_ldap_user', t('Remote user'), 1, isset($values['is_ldap_user']) && $values['is_ldap_user'] == 1) ?> - <?= $this->form->checkbox('disable_login_form', t('Disallow login form'), 1, isset($values['disable_login_form']) && $values['disable_login_form'] == 1) ?> + <?= $this->form->checkbox('is_ldap_user', t('Remote user'), 1, isset($values['is_ldap_user']) && $values['is_ldap_user'] == 1) ?> + <?= $this->form->checkbox('disable_login_form', t('Disallow login form'), 1, isset($values['disable_login_form']) && $values['disable_login_form'] == 1) ?> + </fieldset> <div class="form-actions"> <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> diff --git a/app/Template/user_credential/password.php b/app/Template/user_credential/password.php index 5a6e4403..bd7a47da 100644 --- a/app/Template/user_credential/password.php +++ b/app/Template/user_credential/password.php @@ -6,14 +6,16 @@ <?= $this->form->hidden('id', $values) ?> <?= $this->form->csrf() ?> - <?= $this->form->label(t('Current password for the user "%s"', $this->user->getFullname()), 'current_password') ?> - <?= $this->form->password('current_password', $values, $errors) ?> + <fieldset> + <?= $this->form->label(t('Current password for the user "%s"', $this->user->getFullname()), 'current_password') ?> + <?= $this->form->password('current_password', $values, $errors) ?> - <?= $this->form->label(t('New password for the user "%s"', $this->user->getFullname($user)), 'password') ?> - <?= $this->form->password('password', $values, $errors) ?> + <?= $this->form->label(t('New password for the user "%s"', $this->user->getFullname($user)), 'password') ?> + <?= $this->form->password('password', $values, $errors) ?> - <?= $this->form->label(t('Confirmation'), 'confirmation') ?> - <?= $this->form->password('confirmation', $values, $errors) ?> + <?= $this->form->label(t('Confirmation'), 'confirmation') ?> + <?= $this->form->password('confirmation', $values, $errors) ?> + </fieldset> <div class="form-actions"> <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> diff --git a/app/Template/user_import/show.php b/app/Template/user_import/show.php index 663f107e..3b0e599c 100644 --- a/app/Template/user_import/show.php +++ b/app/Template/user_import/show.php @@ -2,8 +2,7 @@ <h2><?= t('Import users from CSV file') ?></h2> <ul> <li> - <i class="fa fa-download fa-fw"></i> - <?= $this->url->link(t('Download CSV template'), 'UserImportController', 'template') ?> + <?= $this->url->icon('download', t('Download CSV template'), 'UserImportController', 'template') ?> </li> </ul> </div> @@ -33,9 +32,5 @@ <p class="form-help"><?= t('Maximum size: ') ?><?= is_integer($max_size) ? $this->text->bytes($max_size) : $max_size ?></p> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Import') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'UserListController', 'show', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->submitButtons(array('submitLabel' => t('Import'))) ?> </form> diff --git a/app/Template/user_invite/email.php b/app/Template/user_invite/email.php new file mode 100644 index 00000000..674e4a84 --- /dev/null +++ b/app/Template/user_invite/email.php @@ -0,0 +1,12 @@ +<p> + <?= t('You have been invited to register on Kanboard.') ?> +</p> + +<p> + <?= $this->url->absoluteLink(t('Click here to join your team'), 'UserInviteController', 'signup', array('token' => $token)) ?> +</p> + +<?php if ($this->app->config('application_url')): ?> + <hr> + <a href="<?= $this->app->config('application_url') ?>">Kanboard</a> +<?php endif ?> diff --git a/app/Template/user_invite/show.php b/app/Template/user_invite/show.php new file mode 100644 index 00000000..9d822248 --- /dev/null +++ b/app/Template/user_invite/show.php @@ -0,0 +1,15 @@ +<div class="page-header"> + <h2><?= t('Invite people') ?></h2> +</div> +<form method="post" action="<?= $this->url->href('UserInviteController', 'save') ?>" autocomplete="off"> + <?= $this->form->csrf() ?> + + <?= $this->form->label(t('Emails'), 'emails') ?> + <?= $this->form->textarea('emails', $values, $errors, array('required', 'autofocus')) ?> + <p class="form-help"><?= t('Enter one email address by line.') ?></p> + + <?= $this->form->label(t('Add these people to this project'), 'project_id') ?> + <?= $this->form->select('project_id', $projects, $values, $errors) ?> + + <?= $this->modal->submitButtons() ?> +</form> diff --git a/app/Template/user_creation/local.php b/app/Template/user_invite/signup.php index 059a0114..51edbab7 100644 --- a/app/Template/user_creation/local.php +++ b/app/Template/user_invite/signup.php @@ -1,11 +1,13 @@ -<div class="page-header"> - <h2><?= t('New local user') ?></h2> -</div> -<form class="popover-form" method="post" action="<?= $this->url->href('UserCreationController', 'save') ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - - <div class="form-columns"> - <div class="form-column"> +<div class="form-login"> + <div class="page-header"> + <h2><?= t('Sign-up') ?></h2> + </div> + <form method="post" action="<?= $this->url->href('UserInviteController', 'register', array('token' => $token)) ?>" autocomplete="off"> + <?= $this->form->csrf() ?> + + <fieldset> + <legend><?= t('Profile') ?></legend> + <?= $this->form->label(t('Username'), 'username') ?> <?= $this->form->text('username', $values, $errors, array('autofocus', 'required', 'maxlength="50"')) ?> @@ -13,18 +15,20 @@ <?= $this->form->text('name', $values, $errors) ?> <?= $this->form->label(t('Email'), 'email') ?> - <?= $this->form->email('email', $values, $errors) ?> + <?= $this->form->email('email', $values, $errors, array('required')) ?> + </fieldset> + <fieldset> + <legend><?= t('Credentials') ?></legend> <?= $this->form->label(t('Password'), 'password') ?> <?= $this->form->password('password', $values, $errors, array('required')) ?> <?= $this->form->label(t('Confirmation'), 'confirmation') ?> <?= $this->form->password('confirmation', $values, $errors, array('required')) ?> - </div> + </fieldset> - <div class="form-column"> - <?= $this->form->label(t('Add project member'), 'project_id') ?> - <?= $this->form->select('project_id', $projects, $values, $errors) ?> + <fieldset> + <legend><?= t('Preferences') ?></legend> <?= $this->form->label(t('Timezone'), 'timezone') ?> <?= $this->form->select('timezone', $timezones, $values, $errors) ?> @@ -32,16 +36,11 @@ <?= $this->form->label(t('Language'), 'language') ?> <?= $this->form->select('language', $languages, $values, $errors) ?> - <?= $this->form->label(t('Role'), 'role') ?> - <?= $this->form->select('role', $roles, $values, $errors) ?> - <?= $this->form->checkbox('notifications_enabled', t('Enable email notifications'), 1, isset($values['notifications_enabled']) && $values['notifications_enabled'] == 1 ? true : false) ?> - </div> - </div> + </fieldset> - <div class="form-actions"> - <button type="submit" class="btn btn-blue"><?= t('Save') ?></button> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'UserListController', 'show', array(), false, 'close-popover') ?> - </div> -</form> + <div class="form-actions"> + <button class="btn btn-blue"><?= t('Sign-up') ?></button> + </div> + </form> +</div>
\ No newline at end of file diff --git a/app/Template/user_list/dropdown.php b/app/Template/user_list/dropdown.php index 9e90c230..d18f20aa 100644 --- a/app/Template/user_list/dropdown.php +++ b/app/Template/user_list/dropdown.php @@ -2,25 +2,21 @@ <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> <ul> <li> - <i class="fa fa-user fa-fw"></i> - <?= $this->url->link(t('View profile'), 'UserViewController', 'show', array('user_id' => $user['id'])) ?> + <?= $this->url->icon('user', t('View profile'), 'UserViewController', 'show', array('user_id' => $user['id'])) ?> </li> <?php if ($user['is_active'] == 1 && $this->user->hasAccess('UserStatusController', 'disable') && ! $this->user->isCurrentUser($user['id'])): ?> <li> - <i class="fa fa-times fa-fw"></i> - <?= $this->url->link(t('Disable'), 'UserStatusController', 'confirmDisable', array('user_id' => $user['id']), false, 'popover') ?> + <?= $this->modal->confirm('times', t('Disable'), 'UserStatusController', 'confirmDisable', array('user_id' => $user['id'])) ?> </li> <?php endif ?> <?php if ($user['is_active'] == 0 && $this->user->hasAccess('UserStatusController', 'enable') && ! $this->user->isCurrentUser($user['id'])): ?> <li> - <i class="fa fa-check-square-o fa-fw"></i> - <?= $this->url->link(t('Enable'), 'UserStatusController', 'confirmEnable', array('user_id' => $user['id']), false, 'popover') ?> + <?= $this->modal->confirm('check-square-o', t('Enable'), 'UserStatusController', 'confirmEnable', array('user_id' => $user['id'])) ?> </li> <?php endif ?> <?php if ($this->user->hasAccess('UserStatusController', 'remove') && ! $this->user->isCurrentUser($user['id'])): ?> <li> - <i class="fa fa-trash-o fa-fw"></i> - <?= $this->url->link(t('Remove'), 'UserStatusController', 'confirmRemove', array('user_id' => $user['id']), false, 'popover') ?> + <?= $this->modal->confirm('trash-o', t('Remove'), 'UserStatusController', 'confirmRemove', array('user_id' => $user['id'])) ?> </li> <?php endif ?> </ul> diff --git a/app/Template/user_list/show.php b/app/Template/user_list/show.php index 5e285c89..e83895ea 100644 --- a/app/Template/user_list/show.php +++ b/app/Template/user_list/show.php @@ -2,10 +2,18 @@ <div class="page-header"> <?php if ($this->user->hasAccess('UserCreationController', 'show')): ?> <ul> - <li><i class="fa fa-plus fa-fw"></i><?= $this->url->link(t('New local user'), 'UserCreationController', 'show', array(), false, 'popover') ?></li> - <li><i class="fa fa-plus fa-fw"></i><?= $this->url->link(t('New remote user'), 'UserCreationController', 'show', array('remote' => 1), false, 'popover') ?></li> - <li><i class="fa fa-upload fa-fw"></i><?= $this->url->link(t('Import'), 'UserImportController', 'show', array(), false, 'popover') ?></li> - <li><i class="fa fa-users fa-fw"></i><?= $this->url->link(t('View all groups'), 'GroupListController', 'index') ?></li> + <li> + <?= $this->modal->medium('plus', t('New user'), 'UserCreationController', 'show') ?> + </li> + <li> + <?= $this->modal->medium('paper-plane', t('Invite people'), 'UserInviteController', 'show') ?> + </li> + <li> + <?= $this->modal->medium('upload', t('Import'), 'UserImportController', 'show') ?> + </li> + <li> + <?= $this->url->icon('users', t('View all groups'), 'GroupListController', 'index') ?> + </li> </ul> <?php endif ?> </div> diff --git a/app/Template/user_modification/show.php b/app/Template/user_modification/show.php index 506c9161..d3f3e0cc 100644 --- a/app/Template/user_modification/show.php +++ b/app/Template/user_modification/show.php @@ -2,29 +2,36 @@ <h2><?= t('Edit user') ?></h2> </div> <form method="post" action="<?= $this->url->href('UserModificationController', 'save', array('user_id' => $user['id'])) ?>" autocomplete="off"> - <?= $this->form->csrf() ?> - <?= $this->form->hidden('id', $values) ?> - <?= $this->form->label(t('Username'), 'username') ?> - <?= $this->form->text('username', $values, $errors, array('required', isset($values['is_ldap_user']) && $values['is_ldap_user'] == 1 ? 'readonly' : '', 'maxlength="50"')) ?> + <fieldset> + <legend><?= t('Profile') ?></legend> + <?= $this->form->label(t('Username'), 'username') ?> + <?= $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, array($this->user->hasAccess('UserModificationController', 'show/edit_name') ? '' : 'readonly')) ?> + <?= $this->form->label(t('Name'), 'name') ?> + <?= $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, array($this->user->hasAccess('UserModificationController', 'show/edit_email') ? '' : 'readonly')) ?> + <?= $this->form->label(t('Email'), 'email') ?> + <?= $this->form->email('email', $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_email') ? '' : 'readonly')) ?> + </fieldset> - <?= $this->form->label(t('Timezone'), 'timezone') ?> - <?= $this->form->select('timezone', $timezones, $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_timezone') ? '' : 'disabled')) ?> + <fieldset> + <legend><?= t('Preferences') ?></legend> + <?= $this->form->label(t('Timezone'), 'timezone') ?> + <?= $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, array($this->user->hasAccess('UserModificationController', 'show/edit_language') ? '' : 'disabled')) ?> + <?= $this->form->label(t('Language'), 'language') ?> + <?= $this->form->select('language', $languages, $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_language') ? '' : 'disabled')) ?> + </fieldset> <?php if ($this->user->isAdmin()): ?> - <?= $this->form->label(t('Role'), 'role') ?> + <fieldset> + <legend><?= t('Security') ?></legend> + <?= $this->form->label(t('Application role'), 'role') ?> <?= $this->form->select('role', $roles, $values, $errors) ?> + </fieldset> <?php endif ?> <div class="form-actions"> diff --git a/app/Template/user_status/disable.php b/app/Template/user_status/disable.php index d30b0c20..1309b080 100644 --- a/app/Template/user_status/disable.php +++ b/app/Template/user_status/disable.php @@ -5,9 +5,9 @@ <div class="confirm"> <p class="alert alert-info"><?= t('Do you really want to disable this user: "%s"?', $user['name'] ?: $user['username']) ?></p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'UserStatusController', 'disable', array('user_id' => $user['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'UserListController', 'show', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'UserStatusController', + 'disable', + array('user_id' => $user['id']) + ) ?> </div> diff --git a/app/Template/user_status/enable.php b/app/Template/user_status/enable.php index 29d25eee..2413739e 100644 --- a/app/Template/user_status/enable.php +++ b/app/Template/user_status/enable.php @@ -5,9 +5,9 @@ <div class="confirm"> <p class="alert alert-info"><?= t('Do you really want to enable this user: "%s"?', $user['name'] ?: $user['username']) ?></p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'UserStatusController', 'enable', array('user_id' => $user['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'UserListController', 'show', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'UserStatusController', + 'enable', + array('user_id' => $user['id']) + ) ?> </div> diff --git a/app/Template/user_status/remove.php b/app/Template/user_status/remove.php index 2b8f2df5..6cd3f63a 100644 --- a/app/Template/user_status/remove.php +++ b/app/Template/user_status/remove.php @@ -5,9 +5,9 @@ <div class="confirm"> <p class="alert alert-info"><?= t('Do you really want to remove this user: "%s"?', $user['name'] ?: $user['username']) ?></p> - <div class="form-actions"> - <?= $this->url->link(t('Yes'), 'UserStatusController', 'remove', array('user_id' => $user['id']), true, 'btn btn-red') ?> - <?= t('or') ?> - <?= $this->url->link(t('cancel'), 'UserListController', 'show', array(), false, 'close-popover') ?> - </div> + <?= $this->modal->confirmButtons( + 'UserStatusController', + 'remove', + array('user_id' => $user['id']) + ) ?> </div> diff --git a/app/Template/user_view/layout.php b/app/Template/user_view/layout.php index c3604b99..8f24adcc 100644 --- a/app/Template/user_view/layout.php +++ b/app/Template/user_view/layout.php @@ -2,11 +2,18 @@ <div class="page-header"> <?php if ($this->user->hasAccess('UserCreationController', 'show')): ?> <ul> - <li><i class="fa fa-user fa-fw"></i><?= $this->url->link(t('All users'), 'UserListController', 'show') ?></li> - <li><i class="fa fa-plus fa-fw"></i><?= $this->url->link(t('New local user'), 'UserCreationController', 'show', array(), false, 'popover') ?></li> - <li><i class="fa fa-plus fa-fw"></i><?= $this->url->link(t('New remote user'), 'UserCreationController', 'show', array('remote' => 1), false, 'popover') ?></li> - <li><i class="fa fa-upload fa-fw"></i><?= $this->url->link(t('Import'), 'UserImportController', 'show', array(), false, 'popover') ?></li> - <li><i class="fa fa-users fa-fw"></i><?= $this->url->link(t('View all groups'), 'GroupListController', 'index') ?></li> + <li> + <?= $this->url->icon('user', t('All users'), 'UserListController', 'show') ?> + </li> + <li> + <?= $this->modal->medium('plus', t('New user'), 'UserCreationController', 'show') ?> + </li> + <li> + <?= $this->modal->medium('upload', t('Import'), 'UserImportController', 'show') ?> + </li> + <li> + <?= $this->url->icon('users', t('View all groups'), 'GroupListController', 'index') ?> + </li> </ul> <?php endif ?> </div> diff --git a/app/Template/user_view/profile.php b/app/Template/user_view/profile.php index 9c9d3282..486ca428 100644 --- a/app/Template/user_view/profile.php +++ b/app/Template/user_view/profile.php @@ -1,9 +1,11 @@ <section id="main"> <br> <?= $this->avatar->render($user['id'], $user['username'], $user['name'], $user['email'], $user['avatar_path']) ?> - <ul class="listing"> - <li><?= t('Username:') ?> <strong><?= $this->text->e($user['username']) ?></strong></li> - <li><?= t('Name:') ?> <strong><?= $this->text->e($user['name']) ?: t('None') ?></strong></li> - <li><?= t('Email:') ?> <strong><?= $this->text->e($user['email']) ?: t('None') ?></strong></li> - </ul> -</section>
\ No newline at end of file + <div class="panel"> + <ul> + <li><?= t('Login:') ?> <strong><?= $this->text->e($user['username']) ?></strong></li> + <li><?= t('Full Name:') ?> <strong><?= $this->text->e($user['name']) ?: t('None') ?></strong></li> + <li><?= t('Email:') ?> <strong><?= $this->text->e($user['email']) ?: t('None') ?></strong></li> + </ul> + </div> +</section> diff --git a/app/Template/user_view/share.php b/app/Template/user_view/share.php index 570b766e..318d98ea 100644 --- a/app/Template/user_view/share.php +++ b/app/Template/user_view/share.php @@ -3,10 +3,10 @@ </div> <?php if (! empty($user['token'])): ?> - <div class="listing"> + <div class="panel"> <ul class="no-bullet"> - <li><strong><i class="fa fa-rss-square"></i> <?= $this->url->link(t('RSS feed'), 'FeedController', 'user', array('token' => $user['token']), false, '', '', true) ?></strong></li> - <li><strong><i class="fa fa-calendar"></i> <?= $this->url->link(t('iCal feed'), 'ICalendarController', 'user', array('token' => $user['token']), false, '', '', true) ?></strong></li> + <li><strong><?= $this->url->icon('rss-square', t('RSS feed'), 'FeedController', 'user', array('token' => $user['token']), false, '', '', true) ?></strong></li> + <li><strong><?= $this->url->icon('calendar', t('iCal feed'), 'ICalendarController', 'user', array('token' => $user['token']), false, '', '', true) ?></strong></li> </ul> </div> <?= $this->url->link(t('Disable public access'), 'UserViewController', 'share', array('user_id' => $user['id'], 'switch' => 'disable'), true, 'btn btn-red') ?> diff --git a/app/Template/user_view/show.php b/app/Template/user_view/show.php index 2f5a73af..e57fd4cd 100644 --- a/app/Template/user_view/show.php +++ b/app/Template/user_view/show.php @@ -1,9 +1,9 @@ <div class="page-header"> <h2><?= t('Summary') ?></h2> </div> -<ul class="listing"> - <li><?= t('Username:') ?> <strong><?= $this->text->e($user['username']) ?></strong></li> - <li><?= t('Name:') ?> <strong><?= $this->text->e($user['name']) ?: t('None') ?></strong></li> +<ul class="panel"> + <li><?= t('Login:') ?> <strong><?= $this->text->e($user['username']) ?></strong></li> + <li><?= t('Full Name:') ?> <strong><?= $this->text->e($user['name']) ?: t('None') ?></strong></li> <li><?= t('Email:') ?> <strong><?= $this->text->e($user['email']) ?: t('None') ?></strong></li> <li><?= t('Status:') ?> <strong><?= $user['is_active'] ? t('Active') : t('Inactive') ?></strong></li> </ul> @@ -11,7 +11,7 @@ <div class="page-header"> <h2><?= t('Security') ?></h2> </div> -<ul class="listing"> +<ul class="panel"> <li><?= t('Role:') ?> <strong><?= $this->user->getRoleName($user['role']) ?></strong></li> <li><?= t('Account type:') ?> <strong><?= $user['is_ldap_user'] ? t('Remote') : t('Local') ?></strong></li> <li><?= $user['twofactor_activated'] == 1 ? t('Two factor authentication enabled') : t('Two factor authentication disabled') ?></li> @@ -29,7 +29,7 @@ <div class="page-header"> <h2><?= t('Preferences') ?></h2> </div> -<ul class="listing"> +<ul class="panel"> <li><?= t('Timezone:') ?> <strong><?= $this->text->in($user['timezone'], $timezones) ?></strong></li> <li><?= t('Language:') ?> <strong><?= $this->text->in($user['language'], $languages) ?></strong></li> <li><?= t('Notifications:') ?> <strong><?= $user['notifications_enabled'] == 1 ? t('Enabled') : t('Disabled') ?></strong></li> @@ -40,10 +40,10 @@ <h2><?= t('Public access') ?></h2> </div> - <div class="listing"> + <div class="panel"> <ul class="no-bullet"> - <li><strong><i class="fa fa-rss-square"></i> <?= $this->url->link(t('RSS feed'), 'FeedController', 'user', array('token' => $user['token']), false, '', '', true) ?></strong></li> - <li><strong><i class="fa fa-calendar"></i> <?= $this->url->link(t('iCal feed'), 'ICalendarController', 'user', array('token' => $user['token']), false, '', '', true) ?></strong></li> + <li><strong><?= $this->url->icon('rss-square', t('RSS feed'), 'FeedController', 'user', array('token' => $user['token']), false, '', '', true) ?></strong></li> + <li><strong><?= $this->url->icon('calendar', t('iCal feed'), 'ICalendarController', 'user', array('token' => $user['token']), false, '', '', true) ?></strong></li> </ul> </div> <?php endif ?> diff --git a/app/Validator/ProjectValidator.php b/app/Validator/ProjectValidator.php index 8c6117a4..5b10026c 100644 --- a/app/Validator/ProjectValidator.php +++ b/app/Validator/ProjectValidator.php @@ -28,7 +28,6 @@ class ProjectValidator extends BaseValidator new Validators\Integer('priority_start', t('This value must be an integer')), new Validators\Integer('priority_end', t('This value must be an integer')), new Validators\Integer('is_active', t('This value must be an integer')), - new Validators\NotEmpty('name', t('This field cannot be empty')), new Validators\MaxLength('name', t('The maximum length is %d characters', 50), 50), new Validators\MaxLength('identifier', t('The maximum length is %d characters', 50), 50), new Validators\MaxLength('start_date', t('The maximum length is %d characters', 10), 10), @@ -47,15 +46,15 @@ class ProjectValidator extends BaseValidator */ public function validateCreation(array $values) { - $rules = array( - new Validators\Required('name', t('The project name is required')), - ); - if (! empty($values['identifier'])) { $values['identifier'] = strtoupper($values['identifier']); } - $v = new Validator($values, array_merge($this->commonValidationRules(), $rules)); + $rules = array( + new Validators\Required('name', t('The project name is required')), + ); + + $v = new Validator($values, array_merge($rules, $this->commonValidationRules())); return array( $v->execute(), @@ -77,6 +76,7 @@ class ProjectValidator extends BaseValidator } $rules = array( + new Validators\NotEmpty('name', t('This field cannot be empty')), new Validators\Required('id', t('This value is required')), ); diff --git a/app/Validator/TaskValidator.php b/app/Validator/TaskValidator.php index e3b0eded..e824dc05 100644 --- a/app/Validator/TaskValidator.php +++ b/app/Validator/TaskValidator.php @@ -42,7 +42,7 @@ class TaskValidator extends BaseValidator new Validators\MaxLength('title', t('The maximum length is %d characters', 200), 200), new Validators\MaxLength('reference', t('The maximum length is %d characters', 50), 50), new Validators\Date('date_due', t('Invalid date'), $this->dateParser->getParserFormats()), - new Validators\Date('date_started', t('Invalid date'), $this->dateParser->getParserFormats()), + new Validators\Date('date_started', t('Invalid date'), array($this->dateParser->getUserDateTimeFormat())), new Validators\Numeric('time_spent', t('This value must be numeric')), new Validators\Numeric('time_estimated', t('This value must be numeric')), ); diff --git a/app/Validator/UserValidator.php b/app/Validator/UserValidator.php index 9911de50..fe402c47 100644 --- a/app/Validator/UserValidator.php +++ b/app/Validator/UserValidator.php @@ -25,7 +25,7 @@ class UserValidator extends BaseValidator return array( new Validators\MaxLength('role', t('The maximum length is %d characters', 25), 25), new Validators\MaxLength('username', t('The maximum length is %d characters', 50), 50), - new Validators\Unique('username', t('The username must be unique'), $this->db->getConnection(), UserModel::TABLE, 'id'), + new Validators\Unique('username', t('This username is already taken'), $this->db->getConnection(), UserModel::TABLE, 'id'), new Validators\Email('email', t('Email address invalid')), new Validators\Integer('is_ldap_user', t('This value must be an integer')), ); diff --git a/app/common.php b/app/common.php index 6ebb839e..fd55c0bb 100644 --- a/app/common.php +++ b/app/common.php @@ -48,6 +48,7 @@ $container->register(new Kanboard\ServiceProvider\ExternalLinkProvider()); $container->register(new Kanboard\ServiceProvider\ExternalTaskProvider()); $container->register(new Kanboard\ServiceProvider\AvatarProvider()); $container->register(new Kanboard\ServiceProvider\FilterProvider()); +$container->register(new Kanboard\ServiceProvider\FormatterProvider()); $container->register(new Kanboard\ServiceProvider\JobProvider()); $container->register(new Kanboard\ServiceProvider\QueueProvider()); $container->register(new Kanboard\ServiceProvider\ApiProvider()); diff --git a/app/functions.php b/app/functions.php index 9dd054fb..7cd59c41 100644 --- a/app/functions.php +++ b/app/functions.php @@ -146,6 +146,17 @@ function get_upload_max_size() } /** + * Get file extension + * + * @param $filename + * @return string + */ +function get_file_extension($filename) +{ + return strtolower(pathinfo($filename, PATHINFO_EXTENSION)); +} + +/** * Translate a string * * @return string |