summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.markdown4
-rw-r--r--app/Controller/Board.php3
-rw-r--r--app/Controller/File.php64
-rw-r--r--app/Controller/Task.php3
-rw-r--r--app/Core/Helper.php44
-rw-r--r--app/Locale/da_DK/translations.php2
-rw-r--r--app/Locale/de_DE/translations.php2
-rw-r--r--app/Locale/es_ES/translations.php2
-rw-r--r--app/Locale/fi_FI/translations.php2
-rw-r--r--app/Locale/fr_FR/translations.php2
-rw-r--r--app/Locale/hu_HU/translations.php2
-rw-r--r--app/Locale/it_IT/translations.php2
-rw-r--r--app/Locale/ja_JP/translations.php2
-rw-r--r--app/Locale/nl_NL/translations.php739
-rw-r--r--app/Locale/pl_PL/translations.php2
-rw-r--r--app/Locale/pt_BR/translations.php2
-rw-r--r--app/Locale/ru_RU/translations.php2
-rw-r--r--app/Locale/sr_Latn_RS/translations.php737
-rw-r--r--app/Locale/sv_SE/translations.php2
-rw-r--r--app/Locale/th_TH/translations.php2
-rw-r--r--app/Locale/tr_TR/translations.php2
-rw-r--r--app/Locale/zh_CN/translations.php2
-rw-r--r--app/Model/Config.php3
-rw-r--r--app/Model/File.php46
-rw-r--r--app/Template/board/files.php41
-rw-r--r--app/Template/file/show.php55
-rw-r--r--app/Template/task/show.php2
-rw-r--r--app/Template/tasklink/create.php2
-rw-r--r--assets/css/app.css60
-rw-r--r--assets/css/src/board.css25
-rw-r--r--assets/css/src/task.css35
-rw-r--r--assets/js/app.js28
-rw-r--r--assets/js/src/base.js6
-rw-r--r--assets/js/src/board.js8
34 files changed, 1856 insertions, 79 deletions
diff --git a/README.markdown b/README.markdown
index 866ccb7d..52667d86 100644
--- a/README.markdown
+++ b/README.markdown
@@ -33,7 +33,7 @@ Features
- Host anywhere (shared hosting, VPS, Raspberry Pi or localhost)
- No external dependencies
- **Super easy setup**, copy and paste files and you are done!
-- Translated in 16 languages (Brazilian, Chinese, Danish, English, Finnish, French, German, Hungarian, Italian, Japanese, Polish, Russian, Spanish, Swedish, Thai, Turkish)
+- Translated in 18 languages (Brazilian, Chinese, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Polish, Russian, Serbian, Spanish, Swedish, Thai, Turkish)
Known bugs and feature requests
-------------------------------
@@ -175,10 +175,12 @@ Contributors:
- [Creador30](https://github.com/creador30)
- [Cynthia Pereira](https://github.com/cynthiapereira)
- [David-Norris](https://github.com/David-Norris)
+- [Draza (bdpsoft)](https://github.com/bdpsoft)
- [Esteban Monge](https://github.com/EstebanMonge)
- [Fengchao](https://github.com/fengchao)
- [Floaltvater](https://github.com/floaltvater)
- [Gavlepeter](https://github.com/gavlepeter)
+- [Hendrik Stocker](https://github.com/hendrik-stoker)
- [Iterate From 0](https://github.com/freebsd-kanboard)
- [Jan Dittrich](https://github.com/jdittrich)
- [Janne Mäntyharju](https://github.com/JanneMantyharju)
diff --git a/app/Controller/Board.php b/app/Controller/Board.php
index a6e002f2..17170317 100644
--- a/app/Controller/Board.php
+++ b/app/Controller/Board.php
@@ -441,7 +441,8 @@ class Board extends Base
$task = $this->getTask();
$this->response->html($this->template->render('board/files', array(
- 'files' => $this->file->getAll($task['id']),
+ 'files' => $this->file->getAllDocuments($task['id']),
+ 'images' => $this->file->getAllImages($task['id']),
'task' => $task,
)));
}
diff --git a/app/Controller/File.php b/app/Controller/File.php
index 3255fe84..3963e2d7 100644
--- a/app/Controller/File.php
+++ b/app/Controller/File.php
@@ -102,6 +102,70 @@ class File extends Base
}
/**
+ * Return image thumbnails
+ *
+ * @access public
+ */
+ public function thumbnail()
+ {
+ $task = $this->getTask();
+ $file = $this->file->getById($this->request->getIntegerParam('file_id'));
+ $width_param = $this->request->getIntegerParam('width');
+ $height_param = $this->request->getIntegerParam('height');
+ $filename = FILES_DIR.$file['path'];
+
+ if ($file['task_id'] == $task['id'] && file_exists($filename)) {
+
+ // Get new sizes
+ list($width, $height) = getimagesize($filename);
+
+ if ($width_param == 0 && $height_param == 0) {
+ $newwidth = 100;
+ $newheight = 100;
+ } elseif ($width_param > 0 && $height_param == 0) {
+ $newwidth = $width_param;
+ $newheight = floor($height * ($width_param / $width));
+ } elseif ($width_param == 0 && $height_param > 0) {
+ $newwidth = floor($width * ($height_param / $height));
+ $newheight = $height_param;
+ } else {
+ $newwidth = $width_param;
+ $newheight = $height_param;
+ }
+
+ // Load
+ $thumb = imagecreatetruecolor($newwidth, $newheight);
+ $extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
+
+ switch ($extension) {
+ case 'jpeg':
+ case 'jpg':
+ $source = imagecreatefromjpeg($filename);
+ break;
+ case 'png':
+ $source = imagecreatefrompng($filename);
+ break;
+ case 'gif':
+ $source = imagecreatefromgif($filename);
+ break;
+ default:
+ die('File "' . $filename . '" is not valid jpg, png or gif image.');
+ break;
+ }
+
+ // Resize
+ imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
+
+ $metadata = getimagesize($filename);
+
+ if (isset($metadata['mime'])) {
+ $this->response->contentType($metadata['mime']);
+ imagejpeg($thumb);
+ }
+ }
+ }
+
+ /**
* Remove a file
*
* @access public
diff --git a/app/Controller/Task.php b/app/Controller/Task.php
index 8e6efc63..1296204a 100644
--- a/app/Controller/Task.php
+++ b/app/Controller/Task.php
@@ -68,7 +68,8 @@ class Task extends Base
$this->response->html($this->taskLayout('task/show', array(
'project' => $this->project->getById($task['project_id']),
- 'files' => $this->file->getAll($task['id']),
+ 'files' => $this->file->getAllDocuments($task['id']),
+ 'images' => $this->file->getAllImages($task['id']),
'comments' => $this->comment->getAll($task['id']),
'subtasks' => $subtasks,
'links' => $this->taskLink->getLinks($task['id']),
diff --git a/app/Core/Helper.php b/app/Core/Helper.php
index 78267feb..34a5e6ab 100644
--- a/app/Core/Helper.php
+++ b/app/Core/Helper.php
@@ -726,4 +726,48 @@ class Helper
{
return dt('%A', strtotime('next Monday +'.($day - 1).' days'));
}
+
+ /**
+ * Get file icon
+ *
+ * @access public
+ * @param string $filename Filename
+ * @return string Font-Awesome-Icon-Name
+ */
+ public function getFileIcon($filename){
+
+ $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
+
+ switch ($extension) {
+ case 'jpeg':
+ case 'jpg':
+ case 'png':
+ case 'gif':
+ return 'fa-file-image-o';
+ case 'xls':
+ case 'xlsx':
+ return 'fa-file-excel-o';
+ case 'doc':
+ case 'docx':
+ return 'fa-file-word-o';
+ case 'ppt':
+ case 'pptx':
+ return 'fa-file-powerpoint-o';
+ case 'zip':
+ case 'rar':
+ return 'fa-archive-o';
+ case 'mp3':
+ return 'fa-audio-o';
+ case 'avi':
+ return 'fa-video-o';
+ case 'php':
+ case 'html':
+ case 'css':
+ return 'fa-code-o';
+ case 'pdf':
+ return 'fa-file-pdf-o';
+ }
+
+ return 'fa-file-o';
+ }
}
diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php
index f31bfa08..42381e27 100644
--- a/app/Locale/da_DK/translations.php
+++ b/app/Locale/da_DK/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php
index ec1d20ca..ecdeab64 100644
--- a/app/Locale/de_DE/translations.php
+++ b/app/Locale/de_DE/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php
index aaacd7f8..36f4b699 100644
--- a/app/Locale/es_ES/translations.php
+++ b/app/Locale/es_ES/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php
index bd3a7d68..b1774fe4 100644
--- a/app/Locale/fi_FI/translations.php
+++ b/app/Locale/fi_FI/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/fr_FR/translations.php b/app/Locale/fr_FR/translations.php
index df1d8428..5354970a 100644
--- a/app/Locale/fr_FR/translations.php
+++ b/app/Locale/fr_FR/translations.php
@@ -775,4 +775,6 @@ return array(
'Remove time slot' => 'Supprimer un créneau horaire',
'Add new time slot' => 'Ajouter un créneau horaire',
'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Ces horaires sont utilisés lorsque la case « Toute la journée » est cochée pour les heures d\'absences ou supplémentaires programmées.',
+ 'Files' => 'Fichiers',
+ 'Images' => 'Images',
);
diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php
index fed84522..5c2cd7d7 100644
--- a/app/Locale/hu_HU/translations.php
+++ b/app/Locale/hu_HU/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/it_IT/translations.php b/app/Locale/it_IT/translations.php
index d6c57371..c13ebdf5 100644
--- a/app/Locale/it_IT/translations.php
+++ b/app/Locale/it_IT/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php
index dd727d0e..fc0dd04e 100644
--- a/app/Locale/ja_JP/translations.php
+++ b/app/Locale/ja_JP/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php
new file mode 100644
index 00000000..3b043a6f
--- /dev/null
+++ b/app/Locale/nl_NL/translations.php
@@ -0,0 +1,739 @@
+<?php
+
+return array(
+ 'None' => 'Geen',
+ 'edit' => 'bewerken',
+ 'Edit' => 'Bewerken',
+ 'remove' => 'verwijderen',
+ 'Remove' => 'Verwijderen',
+ 'Update' => 'Update',
+ 'Yes' => 'Ja',
+ 'No' => 'Nee',
+ 'cancel' => 'annuleren',
+ 'or' => 'of',
+ 'Yellow' => 'Geel',
+ 'Blue' => 'Blauw',
+ 'Green' => 'Groen',
+ 'Purple' => 'Paars',
+ 'Red' => 'Rood',
+ 'Orange' => 'Oranje',
+ 'Grey' => 'Grijs',
+ 'Save' => 'Opslaan',
+ 'Login' => 'Inloggen',
+ 'Official website:' => 'Officiële website :',
+ 'Unassigned' => 'Niet toegewezen',
+ 'View this task' => 'Deze taak bekijken',
+ 'Remove user' => 'Gebruiker verwijderen',
+ 'Do you really want to remove this user: "%s"?' => 'Weet u zeker dat u deze gebruiker wil verwijderen : « %s » ?',
+ 'New user' => 'Nieuwe gebruiker',
+ 'All users' => 'Alle gebruikers',
+ 'Username' => 'Gebruikersnaam',
+ 'Password' => 'Wachtwoord',
+ 'Default project' => 'Standaard wachtwoord',
+ 'Administrator' => 'Administrator',
+ 'Sign in' => 'Inloggen',
+ 'Users' => 'Gebruikers',
+ 'No user' => 'Geen gebruiker',
+ 'Forbidden' => 'Geweigerd',
+ 'Access Forbidden' => 'Toegang geweigerd',
+ 'Only administrators can access to this page.' => 'Alleen administrators hebben toegang tot deze pagina.',
+ 'Edit user' => 'Gebruiker bewerken',
+ 'Logout' => 'Uitloggen',
+ 'Bad username or password' => 'Verkeerde gebruikersnaam of wachtwoord',
+ 'users' => 'gebruikers',
+ 'projects' => 'projecten',
+ 'Edit project' => 'Project bewerken',
+ 'Name' => 'Naam',
+ 'Activated' => 'Geactiveerd',
+ 'Projects' => 'Projecten',
+ 'No project' => 'Geen project',
+ 'Project' => 'Project',
+ 'Status' => 'Status',
+ 'Tasks' => 'Taken',
+ 'Board' => 'Bord',
+ 'Actions' => 'Acties',
+ 'Inactive' => 'Inactief',
+ 'Active' => 'Actief',
+ 'Column %d' => 'Kolom %d',
+ 'Add this column' => 'Deze kolom toevoegen',
+ '%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',
+ 'Do you really want to remove this project: "%s"?' => 'Weet u zeker dat u dit project wil verwijderen : « %s » ?',
+ 'Remove project' => 'Project verwijderen',
+ 'Boards' => 'Borden',
+ 'Edit the board for "%s"' => 'Bord bewerken voor « %s »',
+ 'All projects' => 'Alle projecten',
+ 'Change columns' => 'Kolommen veranderen',
+ 'Add a new column' => 'Kolom toevoegen',
+ 'Title' => 'Titel',
+ 'Add Column' => 'Kolom toevoegen',
+ 'Project "%s"' => 'Project « %s »',
+ 'Nobody assigned' => 'Niemand toegewezen',
+ '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!',
+ 'Settings' => 'Instellingen',
+ 'Application settings' => 'Applicatie instellingen',
+ 'Language' => 'Taal',
+ 'Webhook token:' => 'Webhook token :',
+ 'API token:' => 'API token :',
+ 'More information' => 'Meer informatie',
+ 'Database size:' => 'Database grootte :',
+ 'Download the database' => 'Download de database',
+ 'Optimize the database' => 'Optimaliseer de database',
+ '(VACUUM command)' => '(VACUUM commando)',
+ '(Gzip compressed Sqlite file)' => '(Gzip ingepakt Sqlite bestand)',
+ 'User settings' => 'Gebruikers instellingen',
+ 'My default project:' => 'Mijn standaard project : ',
+ 'Close a task' => 'Taak sluiten',
+ 'Do you really want to close this task: "%s"?' => 'Weet u zeker dat u deze taak wil sluiten : « %s » ?',
+ 'Edit a task' => 'Taak bewerken',
+ 'Column' => 'Kolom',
+ 'Color' => 'Kleur',
+ 'Assignee' => 'Toegewezene',
+ 'Create another task' => 'Nog een taak aanmaken',
+ 'New task' => 'Nieuwe taak',
+ 'Open a task' => 'Een taak openen',
+ 'Do you really want to open this task: "%s"?' => 'Weet u zeker dat u deze taak wil openen : « %s » ?',
+ 'Back to the board' => 'Terug naar het bord',
+ 'Created on %B %e, %Y at %k:%M %p' => 'Aangemaakt op %d/%m/%Y à %H:%M',
+ 'There is nobody assigned' => 'Er is niemand toegewezen',
+ 'Column on the board:' => 'Kolom op het bord : ',
+ 'Status is open' => 'Status is open',
+ 'Status is closed' => 'Status is gesloten',
+ 'Close this task' => 'Deze taak sluiten',
+ 'Open this task' => 'Deze taak openen',
+ 'There is no description.' => 'Er is geen omschrijving.',
+ 'Add a new task' => 'Een nieuwe taak toevoegen',
+ 'The username is required' => 'De gebruikersnaam is verplicht',
+ 'The maximum length is %d characters' => 'De maximale lengte is %d karakters',
+ 'The minimum length is %d characters' => 'De minimale lengte is %d karakters',
+ 'The password is required' => 'Het wachtwoord is verplicht',
+ 'This value must be an integer' => 'Deze waarde dient een integer te zijn',
+ 'The username must be unique' => 'De gebruikersnaam moet uniek zijn',
+ 'The username must be alphanumeric' => 'De gebruikersnaam moet alfanumeriek zijn',
+ 'The user id is required' => 'Het gebruikers id is verplicht',
+ 'Passwords don\'t match' => 'De wachtwoorden komen niet overeen',
+ 'The confirmation is required' => 'De bevestiging is verplicht',
+ 'The column is required' => 'De kolom is verplicht',
+ 'The project is required' => 'Het project is verplicht',
+ 'The color is required' => 'De kleur is verplicht',
+ 'The id is required' => 'Het id is verplicht',
+ 'The project id is required' => 'Het project id is verplicht',
+ 'The project name is required' => 'De projectnaam is verplicht',
+ 'This project must be unique' => 'Dit project moet uniek zijn',
+ 'The title is required' => 'De titel is verplicht',
+ 'The language is required' => 'De taal is verplicht',
+ 'There is no active project, the first step is to create a new project.' => 'Er is geen actief project, de eerste stap is een nieuw project aanmaken.',
+ 'Settings saved successfully.' => 'Instellingen succesvol opgeslagen.',
+ 'Unable to save your settings.' => 'Instellingen opslaan niet gelukt.',
+ 'Database optimization done.' => 'Database optimaliseren voltooid.',
+ 'Your project have been created successfully.' => 'Uw project is succesvol aangemaakt.',
+ 'Unable to create your project.' => 'Het aanmaken van het project is niet gelukt.',
+ 'Project updated successfully.' => 'Project succesvol geupdate.',
+ 'Unable to update this project.' => 'Updaten van project niet gelukt.',
+ 'Unable to remove this project.' => 'Verwijderen van project niet gelukt.',
+ 'Project removed successfully.' => 'Project succesvol verwijderd.',
+ 'Project activated successfully.' => 'Project succesvol geactiveerd.',
+ 'Unable to activate this project.' => 'Project activeren niet gelukt.',
+ 'Project disabled successfully.' => 'Project uitschakelen succesvol.',
+ 'Unable to disable this project.' => 'Project uitschakelen niet gelukt.',
+ 'Unable to open this task.' => 'Openen van deze taak niet gelukt.',
+ 'Task opened successfully.' => 'Taak succesvol geopend.',
+ 'Unable to close this task.' => 'Sluiten van deze taak niet gelukt.',
+ 'Task closed successfully.' => 'Taak succesvol gesloten.',
+ 'Unable to update your task.' => 'Updaten van uw taak mislukt.',
+ 'Task updated successfully.' => 'Taak succesvol geupdate.',
+ 'Unable to create your task.' => 'Taak aanmaken niet gelukt.',
+ 'Task created successfully.' => 'Taak succesvol aangemaakt.',
+ 'User created successfully.' => 'Gebruiker succesvol aangemaakt.',
+ 'Unable to create your user.' => 'Aanmaken van gebruiker niet gelukt.',
+ 'User updated successfully.' => 'Gebruiker succesvol geupdate',
+ 'Unable to update your user.' => 'Updaten van gebruiker niet gelukt.',
+ 'User removed successfully.' => 'Gebruiker succesvol verwijderd.',
+ 'Unable to remove this user.' => 'Verwijderen van gebruikers niet gelukt.',
+ 'Board updated successfully.' => 'Board succesvol geupdate.',
+ 'Ready' => 'Klaar',
+ 'Backlog' => 'En attente',
+ 'Work in progress' => 'In behandeling',
+ 'Done' => 'Klaar',
+ 'Application version:' => 'Applicatie versie :',
+ 'Completed on %B %e, %Y at %k:%M %p' => 'Voltooid op %d/%m/%Y à %H:%M',
+ '%B %e, %Y at %k:%M %p' => '%d/%m/%Y op %H:%M',
+ 'Date created' => 'Datum aangemaakt',
+ 'Date completed' => 'Datum voltooid',
+ 'Id' => 'Id',
+ 'No task' => 'Geen taak',
+ 'Completed tasks' => 'Voltooide taken',
+ 'List of projects' => 'Lijst van projecten',
+ 'Completed tasks for "%s"' => 'Vooltooide taken voor « %s »',
+ '%d closed tasks' => '%d gesloten taken',
+ 'No task for this project' => 'Geen taken voor dit project',
+ 'Public link' => 'Publieke link',
+ 'There is no column in your project!' => 'Er is geen kolom in uw project !',
+ 'Change assignee' => 'Toegewezene aanpassen',
+ 'Change assignee for the task "%s"' => 'Toegewezene aanpassen voor taak « %s »',
+ 'Timezone' => 'Tijdzone',
+ 'Sorry, I didn\'t find this information in my database!' => 'Sorry deze informatie kon niet worden gevonden in de database !',
+ 'Page not found' => 'Pagina niet gevonden',
+ 'Complexity' => 'Complexiteit',
+ 'limit' => 'Limiet',
+ 'Task limit' => 'Taak limiet.',
+ 'Task count' => 'Aantal taken',
+ 'This value must be greater than %d' => 'Deze waarde moet groter zijn dan %d',
+ 'Edit project access list' => 'Aanpassen toegangsrechten project',
+ 'Edit users access' => 'Gebruikerstoegang aanpassen',
+ 'Allow this user' => 'Deze gebruiker toestaan',
+ 'Only those users have access to this project:' => 'Alleen deze gebruikers hebben toegang tot dit project :',
+ 'Don\'t forget that administrators have access to everything.' => 'Vergeet niet dat administrators overal toegang hebben.',
+ 'Revoke' => 'Intrekken',
+ 'List of authorized users' => 'Lijst met geautoriseerde gebruikers',
+ 'User' => 'Gebruiker',
+ 'Nobody have access to this project.' => 'Niemand heeft toegang tot dit project',
+ 'You are not allowed to access to this project.' => 'U heeft geen toegang tot dit project.',
+ 'Comments' => 'Commentaar',
+ 'Post comment' => 'Commentaar toevoegen',
+ 'Write your text in Markdown' => 'Schrijf uw tekst in Markdown',
+ '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.',
+ 'The description is required' => 'Omschrijving is verplicht',
+ 'Edit this task' => 'Deze taak aanpassen',
+ 'Due Date' => 'Vervaldag',
+ 'Invalid date' => 'Ongeldige datum',
+ 'Must be done before %B %e, %Y' => 'Moet voltooid zijn voor %d/%m/%Y',
+ '%B %e, %Y' => '%d %B %Y',
+ '%b %e, %Y' => '%d/%m/%Y',
+ 'Automatic actions' => 'Geautomatiseerd acties',
+ 'Your automatic action have been created successfully.' => 'Geautomatiseerde actie succesvol aangemaakt.',
+ 'Unable to create your automatic action.' => 'Geautomatiseerde actie aanmaken niet gelukt.',
+ 'Remove an action' => 'Actie verwijderen',
+ 'Unable to remove this action.' => 'Actie verwijderen niet gelukt',
+ 'Action removed successfully.' => 'Actie succesvol verwijder.',
+ 'Automatic actions for the project "%s"' => 'Automatiseer acties voor project « %s »',
+ 'Defined actions' => 'Gedefinieerde acties',
+ 'Add an action' => 'Actie toevoegen',
+ 'Event name' => 'Naam gebeurtenis',
+ 'Action name' => 'Actie naam',
+ 'Action parameters' => 'Actie paramaters',
+ 'Action' => 'Actie',
+ 'Event' => 'Evenement',
+ 'When the selected event occurs execute the corresponding action.' => 'Als de geselecteerde gebeurtenis optreedt de volgende actie uitvoeren',
+ 'Next step' => 'Volgende stap',
+ 'Define action parameters' => 'Bepaal actie parameters',
+ 'Save this action' => 'Actie opslaan',
+ 'Do you really want to remove this action: "%s"?' => 'Weet u zeker dat u de volgende actie wil verwijderen : « %s » ?',
+ 'Remove an automatic action' => 'Automatische actie verwijderen',
+ 'Close the task' => 'Taak sluiten',
+ 'Assign the task to a specific user' => 'Taak toewijzen aan een gebruiker',
+ 'Assign the task to the person who does the action' => 'Taak toewijzen aan een gebruiker die de actie uitvoert',
+ 'Duplicate the task to another project' => 'Taak dupliceren in een ander project',
+ 'Move a task to another column' => 'Taak verplaatsen naar een andere kolom',
+ 'Move a task to another position in the same column' => 'Taak verplaatsen naar een andere positie in dezelfde kolom',
+ 'Task modification' => 'Taak aanpassen',
+ 'Task creation' => 'Taak aanmaken',
+ 'Open a closed task' => 'Gesloten taak openen',
+ 'Closing a task' => 'Taak sluiten',
+ 'Assign a color to a specific user' => 'Wijs een kleur toe aan een gebruiker',
+ 'Column title' => 'Kolom titel',
+ 'Position' => 'Positie',
+ 'Move Up' => 'Omhoog verplaatsen',
+ 'Move Down' => 'Omlaag verplaatsen',
+ 'Duplicate to another project' => 'Dupliceren in een ander project',
+ 'Duplicate' => 'Dupliceren',
+ 'link' => 'koppelen',
+ 'Update this comment' => 'Commentaar aanpassen',
+ 'Comment updated successfully.' => 'Commentaar succesvol aangepast.',
+ 'Unable to update your comment.' => 'Commentaar aanpassen niet gelukt.',
+ 'Remove a comment' => 'Commentaar verwijderen',
+ 'Comment removed successfully.' => 'Commentaar succesvol verwijder.',
+ 'Unable to remove this comment.' => 'Commentaar verwijderen niet gelukt.',
+ 'Do you really want to remove this comment?' => 'Weet u zeker dat u dit commentaar wil verwijderen ?',
+ 'Only administrators or the creator of the comment can access to this page.' => 'Alleen administrators of de aanmaker van het commentaar hebben toegang tot deze pagina.',
+ 'Details' => 'Details',
+ 'Current password for the user "%s"' => 'Huidig wachtwoord voor gebruiker « %s »',
+ 'The current password is required' => 'Huidig wachtwoord is verplicht',
+ 'Wrong password' => 'Onjuist wachtwoord',
+ 'Reset all tokens' => 'Alle tokens resetten',
+ 'All tokens have been regenerated.' => 'Alle tokens zijn opnieuw gegenereerd.',
+ 'Unknown' => 'Onbekend',
+ 'Last logins' => 'Laatste logins',
+ 'Login date' => 'Login datum',
+ 'Authentication method' => 'Authenticatie methode',
+ 'IP address' => 'IP adres',
+ 'User agent' => 'User agent',
+ 'Persistent connections' => 'Persistente connectie',
+ 'No session.' => 'Geen sessie.',
+ 'Expiration date' => 'Verloopdatum',
+ 'Remember Me' => 'Onthoud mij',
+ 'Creation date' => 'Aanmaakdatum',
+ 'Filter by user' => 'Filter op gebruiker',
+ 'Filter by due date' => 'Filter op vervaldatum',
+ 'Everybody' => 'Iedereen',
+ 'Open' => 'Open',
+ 'Closed' => 'Gesloten',
+ 'Search' => 'Zoek',
+ 'Nothing found.' => 'Niets gevonden.',
+ 'Search in the project "%s"' => 'Zoek in project « %s »',
+ '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',
+ 'Email address invalid' => 'Ongeldig emailadres',
+ 'Your Google Account is not linked anymore to your profile.' => 'Uw Google Account is niet meer aan uw profiel gelinkt.',
+ 'Unable to unlink your Google Account.' => 'Verwijderen link met Google Account niet gelukt.',
+ 'Google authentication failed' => 'Google authenticatie niet gelukt',
+ 'Unable to link your Google Account.' => 'Linken met Google Account niet gelukt',
+ 'Your Google Account is linked to your profile successfully.' => 'Linken met Google Account succesvol.',
+ 'Email' => 'Email',
+ 'Link my Google Account' => 'Link mijn Google Account',
+ 'Unlink my Google Account' => 'Link met Google Account verwijderen',
+ 'Login with my Google Account' => 'Inloggen met mijn Google Account',
+ 'Project not found.' => 'Project niet gevonden.',
+ 'Task #%d' => 'Taak %d',
+ 'Task removed successfully.' => 'Taak succesvol verwijderd.',
+ 'Unable to remove this task.' => 'Taak verwijderen niet gelukt.',
+ 'Remove a task' => 'Taak verwijderen',
+ 'Do you really want to remove this task: "%s"?' => 'Weet u zeker dat u deze taak wil verwijderen « %s » ?',
+ 'Assign automatically a color based on a category' => 'Automatisch een kleur toewijzen aan de hand van een categorie',
+ 'Assign automatically a category based on a color' => 'Automatisch een categorie toewijzen aan de hand van een kleur',
+ 'Task creation or modification' => 'Taak aanmaken of wijzigen',
+ 'Category' => 'Categorie',
+ 'Category:' => 'Categorie :',
+ 'Categories' => 'Categorieën',
+ 'Category not found.' => 'Categorie niet gevonden',
+ 'Your category have been created successfully.' => 'Categorie succesvol aangemaakt.',
+ 'Unable to create your category.' => 'Categorie aanmaken niet gelukt.',
+ 'Your category have been updated successfully.' => 'Categorie succesvol aangepast.',
+ 'Unable to update your category.' => 'Aanpassen van categorie niet gelukt.',
+ 'Remove a category' => 'Categorie verwijderen',
+ 'Category removed successfully.' => 'Categorie succesvol verwijderd.',
+ 'Unable to remove this category.' => 'Categorie verwijderen niet gelukt.',
+ 'Category modification for the project "%s"' => 'Categorie aanpassen voor project « %s »',
+ 'Category Name' => 'Categorie naam',
+ 'Categories for the project "%s"' => 'Categorieën voor project « %s »',
+ 'Add a new category' => 'Categorie toevoegen',
+ 'Do you really want to remove this category: "%s"?' => 'Weet u zeker dat u deze categorie wil verwijderen: « %s » ?',
+ 'Filter by category' => 'Filter op categorie',
+ 'All categories' => 'Alle categorieën',
+ 'No category' => 'Geen categorie',
+ 'The name is required' => 'De naam is verplicht',
+ 'Remove a file' => 'Bestand verwijderen',
+ 'Unable to remove this file.' => 'Bestand verwijderen niet gelukt.',
+ 'File removed successfully.' => 'Bestand succesvol verwijdered.',
+ 'Attach a document' => 'Document toevoegen',
+ 'Do you really want to remove this file: "%s"?' => 'Weet u zeker dat u dit bestand wil verwijderen: « %s » ?',
+ 'open' => 'openen',
+ 'Attachments' => 'Bijlages',
+ 'Edit the task' => 'Taak aanpassen',
+ 'Edit the description' => 'Omschrijving aanpassen',
+ 'Add a comment' => 'Commentaar toevoegen',
+ 'Edit a comment' => 'Commentaar aanpassen',
+ 'Summary' => 'Samenvatting',
+ 'Time tracking' => 'Tijdschrijven',
+ 'Estimate:' => 'Schatting :',
+ 'Spent:' => 'Besteed :',
+ 'Do you really want to remove this sub-task?' => 'Weet u zeker dat u deze subtaak wil verwijderen ?',
+ 'Remaining:' => 'Restant :',
+ 'hours' => 'uren',
+ 'spent' => 'besteed',
+ 'estimated' => 'geschat',
+ 'Sub-Tasks' => 'Subtaken',
+ 'Add a sub-task' => 'Subtaak toevoegen',
+ 'Original estimate' => 'Orginele schatting',
+ 'Create another sub-task' => 'Nog een subtaak toevoegen',
+ 'Time spent' => 'Tijd besteed',
+ 'Edit a sub-task' => 'Subtaak aanpassen',
+ 'Remove a sub-task' => 'Subtaak verwijderen',
+ 'The time must be a numeric value' => 'De tijd moet een numerieke waarde zijn',
+ 'Todo' => 'Nog te doen',
+ 'In progress' => 'In behandeling',
+ 'Sub-task removed successfully.' => 'Subtaak succesvol verwijderd.',
+ 'Unable to remove this sub-task.' => 'Subtaak verwijderen niet gelukt.',
+ 'Sub-task updated successfully.' => 'Subtaak succesvol aangepast.',
+ 'Unable to update your sub-task.' => 'Subtaak aanpassen niet gelukt.',
+ 'Unable to create your sub-task.' => 'Subtaak aanmaken niet gelukt.',
+ 'Sub-task added successfully.' => 'Subtaak succesvol aangemaakt.',
+ 'Maximum size: ' => 'Maximale grootte : ',
+ 'Unable to upload the file.' => 'Uploaden van bestand niet gelukt.',
+ 'Display another project' => 'Een ander project weergeven',
+ 'Your GitHub account was successfully linked to your profile.' => 'Uw Github Account is succesvol gelinkt aan uw profiel.',
+ 'Unable to link your GitHub Account.' => 'Linken van uw Github Account niet gelukt.',
+ 'GitHub authentication failed' => 'Github Authenticatie niet gelukt',
+ 'Your GitHub account is no longer linked to your profile.' => 'Uw Github Account is niet langer gelinkt aan uw profiel.',
+ 'Unable to unlink your GitHub Account.' => 'Verwijdern van de link met uw Github Account niet gelukt.',
+ 'Login with my GitHub Account' => 'Login met mijn Github Account',
+ 'Link my GitHub Account' => 'Link met mijn Github',
+ 'Unlink my GitHub Account' => 'Link met mijn Github verwijderen',
+ 'Created by %s' => 'Aangemaakt door %s',
+ 'Last modified on %B %e, %Y at %k:%M %p' => 'Laatst gewijzigd op %d/%m/%Y à %H:%M',
+ 'Tasks Export' => 'Taken exporteren',
+ 'Tasks exportation for "%s"' => 'Taken exporteren voor « %s »',
+ 'Start Date' => 'Startdatum',
+ 'End Date' => 'Einddatum',
+ 'Execute' => 'Uitvoeren',
+ 'Task Id' => 'Taak Id',
+ 'Creator' => 'Aangemaakt door',
+ 'Modification date' => 'Wijzigingsdatum',
+ 'Completion date' => 'Afgerond op',
+ 'Webhook URL for task creation' => 'Webhook URL voor aanmaken taak',
+ 'Webhook URL for task modification' => 'Webhook URL voor wijzigen taak',
+ 'Clone' => 'Kloon',
+ 'Clone Project' => 'Project klonen',
+ 'Project cloned successfully.' => 'Project succesvol gekloond.',
+ 'Unable to clone this project.' => 'Klonen van project niet gelukt.',
+ 'Email notifications' => 'Email notificatie',
+ 'Enable email notifications' => 'Email notificatie aanzetten',
+ 'Task position:' => 'Taak positie :',
+ 'The task #%d have been opened.' => 'Taak #%d is geopend.',
+ 'The task #%d have been closed.' => 'Taak #%d is gesloten.',
+ 'Sub-task updated' => 'Subtaak aangepast',
+ 'Title:' => 'Titel :',
+ 'Status:' => 'Status :',
+ 'Assignee:' => 'Toegewezene :',
+ 'Time tracking:' => 'Tijdschrijven :',
+ 'New sub-task' => 'Nieuwe subtaak',
+ 'New attachment added "%s"' => 'Nieuwe bijlage toegevoegd « %s »',
+ 'Comment updated' => 'Commentaar aangepast',
+ 'New comment posted by %s' => 'Nieuw commentaar geplaatst door « %s »',
+ 'List of due tasks for the project "%s"' => 'Lijst van taken die binnenkort voltooid moeten worden voor project « %s »',
+ 'New attachment' => 'Nieuwe bijlage',
+ 'New comment' => 'Nieuw commentaar',
+ 'Comment updated' => 'Commentaar aangepast',
+ 'New subtask' => 'Nieuwe subtaak',
+ 'Subtask updated' => 'Subtaak aangepast',
+ 'New task' => 'Nieuwe taak',
+ 'Task updated' => 'Taak aangepast',
+ 'Task closed' => 'Taak gesloten',
+ 'Task opened' => 'Taak geopend',
+ '[%s][Due tasks]' => '[%s][binnekort te voltooien taken]',
+ '[Kanboard] Notification' => '[Kanboard] Notificatie',
+ 'I want to receive notifications only for those projects:' => 'Ik wil notificaties ontvangen van de volgende projecten :',
+ 'view the task on Kanboard' => 'taak bekijken op Kanboard',
+ 'Public access' => 'Publieke toegang',
+ 'Category management' => 'Categorie management',
+ 'User management' => 'Gebruikers management',
+ 'Active tasks' => 'Actieve taken',
+ 'Disable public access' => 'Publieke toegang uitschakelen',
+ 'Enable public access' => 'Publieke toegang inschakelen',
+ 'Active projects' => 'Actieve projecten',
+ 'Inactive projects' => 'Inactieve projecten',
+ 'Public access disabled' => 'Publieke toegang uitgeschakeld',
+ 'Do you really want to disable this project: "%s"?' => 'Weet u zeker dat u dit project wil uitschakelen : « %s » ?',
+ 'Do you really want to duplicate this project: "%s"?' => 'Weet u zeker dat u dit project wil dupliceren : « %s » ?',
+ 'Do you really want to enable this project: "%s"?' => 'Weet u zeker dat u dit project wil activeren : « %s » ?',
+ 'Project activation' => 'Project activatie',
+ 'Move the task to another project' => 'Taak verplaatsen naar een ander project',
+ 'Move to another project' => 'Verplaats naar een ander project',
+ 'Do you really want to duplicate this task?' => 'Weet u zeker dat u deze taak wil dupliceren ?',
+ 'Duplicate a task' => 'Taak dupliceren',
+ 'External accounts' => 'Externe accounts',
+ 'Account type' => 'Account type',
+ 'Local' => 'Lokaal',
+ 'Remote' => 'Remote',
+ 'Enabled' => 'Actief',
+ 'Disabled' => 'Inactief',
+ 'Google account linked' => 'Gelinkt Google Account',
+ 'Github account linked' => 'Gelinkt Github Account',
+ 'Username:' => 'Gebruikersnaam :',
+ 'Name:' => 'Naam :',
+ 'Email:' => 'Email :',
+ 'Default project:' => 'Standaard project :',
+ 'Notifications:' => 'Notificaties :',
+ 'Notifications' => 'Notificaties',
+ 'Group:' => 'Groep :',
+ 'Regular user' => 'Normale gebruiker',
+ 'Account type:' => 'Account type:',
+ 'Edit profile' => 'Profiel aanpassen',
+ 'Change password' => 'Wachtwoord aanpassen',
+ 'Password modification' => 'Wachtwoord aanpassen',
+ 'External authentications' => 'Externe authenticatie',
+ 'Google Account' => 'Google Account',
+ 'Github Account' => 'Github Account',
+ 'Never connected.' => 'Nooit verbonden.',
+ 'No account linked.' => 'Geen account gelinkt.',
+ 'Account linked.' => 'Account gelinkt.',
+ 'No external authentication enabled.' => 'Geen externe authenticatie aangezet.',
+ 'Password modified successfully.' => 'Wachtwoord succesvol aangepast.',
+ 'Unable to change the password.' => 'Aanpassen van wachtwoord niet gelukt.',
+ 'Change category for the task "%s"' => 'Pas categorie aan voor taak « %s »',
+ 'Change category' => 'Categorie aanpassen',
+ '%s updated the task %s' => '%s heeft taak %s aangepast',
+ '%s opened the task %s' => '%s heeft taak %s geopend',
+ '%s moved the task %s to the position #%d in the column "%s"' => '%s heeft taak %s naar positie %d in de kolom « %s » verplaatst',
+ '%s moved the task %s to the column "%s"' => '%s heeft taak %s verplaatst naar kolom « %s »',
+ '%s created the task %s' => '%s heeft taak %s aangemaakt',
+ '%s closed the task %s' => '%s heeft taak %s gesloten',
+ '%s created a subtask for the task %s' => '%s heeft een subtaak aangemaakt voor taak %s',
+ '%s updated a subtask for the task %s' => '%s heeft een subtaak aangepast voor taak %s',
+ 'Assigned to %s with an estimate of %s/%sh' => 'Toegewezen aan %s met een schatting van %s/%sh',
+ 'Not assigned, estimate of %sh' => 'Niet toegewezen, schatting: %sh',
+ '%s updated a comment on the task %s' => '%s heeft een commentaar aangepast voor taak %s',
+ '%s commented the task %s' => '%s heeft een commentaar geplaatst voor taak %s',
+ '%s\'s activity' => 'Activiteiten van %s',
+ 'No activity.' => 'Geen activiteiten.',
+ 'RSS feed' => 'RSS feed',
+ '%s updated a comment on the task #%d' => '%s heeft een commentaar aangepast voor taak %d',
+ '%s commented on the task #%d' => '%s heeft commentaar geplaatst voor taak %d',
+ '%s updated a subtask for the task #%d' => '%s heeft een commentaar aangepast voor subtaak %d',
+ '%s created a subtask for the task #%d' => '%s heeft een subtaak aangemaakt voor taak %d',
+ '%s updated the task #%d' => '%s heeft taak %d aangepast',
+ '%s created the task #%d' => '%s heeft taak %d aangemaakt',
+ '%s closed the task #%d' => '%s heeft taak %d gesloten',
+ '%s open the task #%d' => '%s a heeft taak %d geopend',
+ '%s moved the task #%d to the column "%s"' => '%s heeft taak %d verplaatst naar kolom « %s »',
+ '%s moved the task #%d to the position %d in the column "%s"' => '%s heeft taak %d verplaatst naar positie %d in kolom « %s »',
+ 'Activity' => 'Activiteit',
+ 'Default values are "%s"' => 'Standaardwaarden zijn « %s »',
+ 'Default columns for new projects (Comma-separated)' => 'Standaard kolommen voor nieuw projecten (komma gescheiden)',
+ 'Task assignee change' => 'Taak toegewezene verandering',
+ '%s change the assignee of the task #%d to %s' => '%s heeft de toegewezene voor taak %d veranderd in %s',
+ '%s changed the assignee of the task %s to %s' => '%s heeft de toegewezene voor taak %d veranderd in %s',
+ 'Column Change' => 'Kolom verandering',
+ 'Position Change' => 'Positie verandering',
+ 'Assignee Change' => 'Toegewezene verandering',
+ 'New password for the user "%s"' => 'Nieuw wachtwoord voor gebruiker « %s »',
+ 'Choose an event' => 'Kies een gebeurtenis',
+ 'Github commit received' => 'Github commentaar ontvangen',
+ 'Github issue opened' => 'Github issue geopend',
+ 'Github issue closed' => 'Github issue gesloten',
+ 'Github issue reopened' => 'Github issue heropend',
+ 'Github issue assignee change' => 'Github toegewezen veranderd',
+ 'Github issue label change' => 'Github issue label verander',
+ 'Create a task from an external provider' => 'Maak een taak aan vanuit een externe provider',
+ 'Change the assignee based on an external username' => 'Verander de toegewezene aan de hand van de externe gebruikersnaam',
+ 'Change the category based on an external label' => 'Verander de categorie aan de hand van een extern label',
+ 'Reference' => 'Referentie',
+ 'Reference: %s' => 'Referentie : %s',
+ 'Label' => 'Label',
+ 'Database' => 'Database',
+ 'About' => 'Over',
+ 'Database driver:' => 'Database driver :',
+ 'Board settings' => 'Bord instellingen',
+ 'URL and token' => 'URL en token',
+ 'Webhook settings' => 'Webhook instellingen',
+ 'URL for task creation:' => 'URL voor aanmaken taken :',
+ 'Reset token' => 'Token resetten',
+ 'API endpoint:' => 'API endpoint :',
+ 'Refresh interval for private board' => 'Verversingsinterval voor private borden',
+ 'Refresh interval for public board' => 'Verversingsinterval voor publieke borden',
+ 'Task highlight period' => 'Taak highlight periode',
+ 'Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)' => 'Periode (in seconden) om aan te geven of een taak recent is aangepast (0 om uit te schakelen, standaard 2 dagen)',
+ 'Frequency in second (60 seconds by default)' => 'Frequentie in seconden (stadaard 60)',
+ 'Frequency in second (0 to disable this feature, 10 seconds by default)' => 'Frequentie in seconden (0 om uit te schakelen, standaard 10)',
+ 'Application URL' => 'Applicatie URL',
+ 'Example: http://example.kanboard.net/ (used by email notifications)' => 'Voorbeeld: http://example.kanboard.net/ (gebruikt voor email notificaties)',
+ 'Token regenerated.' => 'Token opnieuw gegenereerd.',
+ 'Date format' => 'Datum formaat',
+ 'ISO format is always accepted, example: "%s" and "%s"' => 'ISO formaat is altijd geaccepteerd, bijvoorbeeld : « %s » et « %s »',
+ 'New private project' => 'Nieuw privé project',
+ 'This project is private' => 'Dit project is privé',
+ 'Type here to create a new sub-task' => 'Typ hier om een nieuwe subtaak aan te maken',
+ 'Add' => 'Toevoegen',
+ 'Estimated time: %s hours' => 'Geschatte tijd: %s hours',
+ 'Time spent: %s hours' => 'Tijd besteed : %s heures',
+ 'Started on %B %e, %Y' => 'Gestart op %d/%m/%Y',
+ 'Start date' => 'Startdatum',
+ 'Time estimated' => 'Geschatte tijd',
+ 'There is nothing assigned to you.' => 'Er is niets aan u toegewezen.',
+ 'My tasks' => 'Mijn taken',
+ 'Activity stream' => 'Activiteiten',
+ 'Dashboard' => 'Dashboard',
+ 'Bevestiging' => 'Confirmation',
+ 'Allow everybody to access to this project' => 'Geef iedereen toegang tot dit project',
+ 'Everybody have access to this project.' => 'Iedereen heeft toegang tot dit project.',
+ 'Webhooks' => 'Webhooks',
+ 'API' => 'API',
+ 'Integration' => 'Integratue',
+ 'Github webhooks' => 'Github webhooks',
+ 'Help on Github webhooks' => 'Hulp bij Github webhooks',
+ 'Create a comment from an external provider' => 'Voeg een commentaar toe van een externe provider',
+ 'Github issue comment created' => 'Github issue commentaar aangemaakt',
+ 'Configure' => 'Configureren',
+ 'Project management' => 'Project management',
+ 'My projects' => 'Mijn projecten',
+ 'Columns' => 'Kolommen',
+ 'Task' => 'Taak',
+ 'Your are not member of any project.' => 'U bent van geen enkel project lid.',
+ 'Percentage' => 'Percentage',
+ 'Number of tasks' => 'Aantal taken',
+ 'Task distribution' => 'Distributie van taken',
+ 'Reportings' => 'Rapporten',
+ 'Task repartition for "%s"' => 'Taakverdeling voor « %s »',
+ 'Analytics' => 'Analytics',
+ 'Subtask' => 'Subtaak',
+ 'My subtasks' => 'Mijn subtaken',
+ 'User repartition' => 'Gebruikerverdeling',
+ 'User repartition for "%s"' => 'Gebruikerverdeling voor « %s »',
+ 'Clone this project' => 'Kloon dit project',
+ 'Column removed successfully.' => 'Kolom succesvol verwijderd.',
+ 'Edit Project' => 'Project aanpassen',
+ 'Github Issue' => 'Github issue',
+ 'Not enough data to show the graph.' => 'Niet genoeg data om de grafiek te laten zien.',
+ 'Vorige' => 'Précédent',
+ 'The id must be an integer' => 'Het id moet een integer zijn',
+ 'The project id must be an integer' => 'Het project id moet een integer zijn',
+ 'The status must be an integer' => 'De status moet een integer zijn',
+ 'The subtask id is required' => 'Het id van de subtaak is verplicht',
+ 'The subtask id must be an integer' => 'Het id van de subtaak moet een integer zijn',
+ 'The task id is required' => 'Het id van de taak is verplicht',
+ 'The task id must be an integer' => 'Het id van de taak moet een integer zijn',
+ 'The user id must be an integer' => 'Het id van de gebruiker moet een integer zijn',
+ 'This value is required' => 'Deze waarde is verplicht',
+ 'This value must be numeric' => 'Deze waarde moet numeriek zijn',
+ 'Unable to create this task.' => 'Aanmaken van de taak mislukt',
+ 'Cumulative flow diagram' => 'Cummulatief stroomdiagram',
+ 'Cumulative flow diagram for "%s"' => 'Cummulatief stroomdiagram voor « %s »',
+ 'Daily project summary' => 'Dagelijkse project samenvatting',
+ 'Daily project summary export' => 'Dagelijkse project samenvatting export',
+ 'Daily project summary export for "%s"' => 'Dagelijkse project samenvatting voor « %s »',
+ 'Exports' => 'Exports',
+ 'This export contains the number of tasks per column grouped per day.' => 'Dit rapport bevat het aantal taken per kolom gegroupeerd per dag.',
+ 'Nothing to preview...' => 'Niets om te previewen...',
+ 'Preview' => 'Preview',
+ 'Write' => 'Schrijf',
+ 'Active swimlanes' => 'Actieve swinlanes',
+ 'Add a new swimlane' => 'Nieuwe swimlane toevoegen',
+ 'Change default swimlane' => 'Standaard swimlane aapassen',
+ 'Default swimlane' => 'Standaard swinlane',
+ 'Do you really want to remove this swimlane: "%s"?' => 'Weet u zeker dat u deze swimlane wil verwijderen : « %s » ?',
+ 'Inactive swimlanes' => 'Inactieve swinlanes',
+ 'Set project manager' => 'Project manager instellen',
+ 'Set project member' => 'Project lid instellen',
+ 'Remove a swimlane' => 'Verwijder swinlane',
+ 'Rename' => 'Hernoemen',
+ 'Show default swimlane' => 'Standaard swimlane tonen',
+ 'Swimlane modification for the project "%s"' => 'Swinlane aanpassing voor project « %s »',
+ 'Swimlane not found.' => 'Swimlane niet gevonden.',
+ 'Swimlane removed successfully.' => 'Swimlane succesvol verwijderd.',
+ 'Swimlanes' => 'Swimlanes',
+ 'Swimlane updated successfully.' => 'Swimlane succesvol aangepast.',
+ 'The default swimlane have been updated successfully.' => 'De standaard swimlane is succesvol aangepast.',
+ 'Unable to create your swimlane.' => 'Swimlane aanmaken niet gelukt.',
+ 'Unable to remove this swimlane.' => 'Swimlane verwijderen niet gelukt.',
+ 'Unable to update this swimlane.' => 'Swimlane aanpassen niet gelukt.',
+ 'Your swimlane have been created successfully.' => 'Swimlane succesvol aangemaakt.',
+ 'Example: "Bug, Feature Request, Improvement"' => 'Voorbeeld: « Bug, Feature Request, Improvement »',
+ 'Default categories for new projects (Comma-separated)' => 'Standaard categorieën voor nieuwe projecten (komma gescheiden)',
+ 'Gitlab commit received' => 'Gitlab commir ontvangen',
+ 'Gitlab issue opened' => 'Gitlab issue geopend',
+ 'Gitlab issue closed' => 'Gitlab issue gesloten',
+ 'Gitlab webhooks' => 'Gitlab webhooks',
+ 'Help on Gitlab webhooks' => 'Hulp bij Gitlab webhooks',
+ 'Integrations' => 'Integraties',
+ 'Integration with third-party services' => 'Integratie met derde-partij-services',
+ 'Role for this project' => 'Rol voor dit project',
+ 'Project manager' => 'Project manager',
+ 'Project member' => 'Project lid',
+ 'A project manager can change the settings of the project and have more privileges than a standard user.' => 'Een project manager kan de instellingen van het project wijzigen en heeft meer rechten dan een normale gebruiker.',
+ 'Gitlab Issue' => 'Gitlab issue',
+ 'Subtask Id' => 'Subtaak id',
+ 'Subtasks' => 'Subtaken',
+ 'Subtasks Export' => 'Subtaken exporteren',
+ 'Subtasks exportation for "%s"' => 'Subtaken exporteren voor project « %s »',
+ 'Task Title' => 'Taak title',
+ 'Untitled' => 'Geen titel',
+ 'Application default' => 'Standaard taal voor applicatie',
+ 'Language:' => 'Taal :',
+ 'Timezone:' => 'Tijdzone :',
+ 'All columns' => 'Alle kolommen',
+ 'Calendar for "%s"' => 'Agenda voor « %s »',
+ 'Filter by column' => 'Filter op kolom',
+ 'Filter by status' => 'Filter op status',
+ 'Calendar' => 'Agenda',
+ 'Next' => 'Volgende',
+ '#%d' => '%d',
+ 'Filter by color' => 'Filter op kleur',
+ 'Filter by swimlane' => 'Filter op swimlane',
+ 'All swimlanes' => 'Alle swimlanes',
+ 'All colors' => 'Alle kleuren',
+ 'All status' => 'Alle statussen',
+ 'Add a comment logging moving the task between columns' => 'Voeg een commentaar toe bij het verplaatsen van een taak tussen kolommen',
+ 'Moved to column %s' => 'Verplaatst naar kolom',
+ 'Change description' => 'Verandering omschrijving',
+ 'User dashboard' => 'Gebruiker dashboard',
+ 'Allow only one subtask in progress at the same time for a user' => 'Sta maximaal één subtaak in behandeling toe per gebruiker',
+ 'Edit column "%s"' => 'Kolom « %s » aanpassen',
+ 'Enable time tracking for subtasks' => 'Activeer tijdschrijven voor subtaken',
+ 'Select the new status of the subtask: "%s"' => 'Selecteer nieuwe status voor subtaak : « %s »',
+ 'Subtask timesheet' => 'Subtaak timesheet',
+ 'There is nothing to show.' => 'Er is niets om te laten zijn.',
+ 'Time Tracking' => 'Tijdschrijven',
+ 'You already have one subtask in progress' => 'U heeft al een subtaak in behandeling',
+ 'Which parts of the project do you want to duplicate?' => 'Welke onderdelen van het project wilt u dupliceren?',
+ 'Change dashboard view' => 'Pas dashboard aan',
+ 'Show/hide activities' => 'Toon/verberg activiteiten',
+ 'Show/hide projects' => 'Toon/verberg projecten',
+ 'Show/hide subtasks' => 'Toon/verberg subtaken',
+ 'Show/hide tasks' => 'Toon/verberg taken',
+ 'Disable login form' => 'Schakel login scherm uit',
+ 'Show/hide calendar' => 'Toon/verberg agenda',
+ 'User calendar' => 'Agenda gebruiker',
+ 'Bitbucket commit received' => 'Bitbucket commit ontvangen',
+ 'Bitbucket webhooks' => 'Bitbucket webhooks',
+ 'Help on Bitbucket webhooks' => 'Help bij Bitbucket webhooks',
+ 'Start' => 'Start',
+ 'End' => 'Eind',
+ 'Task age in days' => 'Leeftijd taak in dagen',
+ 'Days in this column' => 'Dagen in deze kolom',
+ '%dd' => '%dj',
+ 'Add a link' => 'Link toevoegen',
+ 'Add a new link' => 'Nieuwe link toevoegen',
+ 'Do you really want to remove this link: "%s"?' => 'Weet u zeker dat u deze link wil verwijderen : « %s » ?',
+ 'Do you really want to remove this link with task #%d?' => 'Weet u zeker dat u deze link met taak %d wil verwijderen?',
+ 'Field required' => 'Veld verplicht',
+ 'Link added successfully.' => 'Link succesvol toegevoegd.',
+ 'Link updated successfully.' => 'Link succesvol aangepast.',
+ 'Link removed successfully.' => 'Link succesvol verwijderd.',
+ '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',
+ 'Unable to create your link.' => 'Link aanmaken niet gelukt.',
+ 'Unable to update your link.' => 'Link aanpassen niet gelukt.',
+ 'Unable to remove this link.' => 'Link verwijderen niet gelukt.',
+ 'relates to' => 'is gerelateerd aan',
+ 'blocks' => 'blokkeert',
+ 'is blocked by' => 'is geblokkeerd door',
+ 'duplicates' => 'dupliceert',
+ 'is duplicated by' => 'is gedupliceerd',
+ 'is a child of' => 'is een kind van',
+ 'is a parent of' => 'is een ouder van',
+ 'targets milestone' => 'is nodig voor milestone',
+ 'is a milestone of' => 'is een milestone voor',
+ 'fixes' => 'corrigeert',
+ 'is fixed by' => 'word gecorrigeerd door',
+ 'This task' => 'Deze taal',
+ '<1h' => '<1h',
+ '%dh' => '%dh',
+ '%b %e' => '%e %b',
+ 'Expand tasks' => 'Taken uitklappen',
+ 'Collapse tasks' => 'Taken inklappen',
+ 'Expand/collapse tasks' => 'Taken in/uiklappen',
+ 'Close dialog box' => 'Venster sluiten',
+ 'Submit a form' => 'Formulier insturen',
+ 'Board view' => 'Bord weergave',
+ 'Keyboard shortcuts' => 'Keyboard snelkoppelingen',
+ 'Open board switcher' => 'Open bord switcher',
+ 'Application' => 'Applicatie',
+ 'Filter recently updated' => 'Filter recent aangepast',
+ 'since %B %e, %Y at %k:%M %p' => 'sinds %d/%m/%Y à %H:%M',
+ 'More filters' => 'Meer filters',
+);
diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php
index deb5a280..51382137 100644
--- a/app/Locale/pl_PL/translations.php
+++ b/app/Locale/pl_PL/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php
index f81bc675..0cd63ce5 100644
--- a/app/Locale/pt_BR/translations.php
+++ b/app/Locale/pt_BR/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php
index a4caa545..e53efee0 100644
--- a/app/Locale/ru_RU/translations.php
+++ b/app/Locale/ru_RU/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php
new file mode 100644
index 00000000..cd8b4afd
--- /dev/null
+++ b/app/Locale/sr_Latn_RS/translations.php
@@ -0,0 +1,737 @@
+<?php
+
+return array(
+ 'None' => 'None',
+ 'edit' => 'izmeni',
+ 'Edit' => 'Izmeni',
+ 'remove' => 'ukloni',
+ 'Remove' => 'Ukloni',
+ 'Update' => 'Ažuriraj',
+ 'Yes' => 'Da',
+ 'No' => 'Ne',
+ 'cancel' => 'odustani',
+ 'or' => 'ili',
+ 'Yellow' => 'Žuta',
+ 'Blue' => 'Plava',
+ 'Green' => 'Zelena',
+ 'Purple' => 'Ljubičasta',
+ 'Red' => 'Crvena',
+ 'Orange' => 'Narandžasta',
+ 'Grey' => 'Siva',
+ 'Save' => 'Snimi',
+ 'Login' => 'Prijava',
+ 'Official website:' => 'Zvanična strana:',
+ 'Unassigned' => 'Nedodeljen',
+ 'View this task' => 'Pregledaj zadatak',
+ 'Remove user' => 'Ukloni korisnika',
+ 'Do you really want to remove this user: "%s"?' => 'Da li zaista želiš da ukloniš korisnika: "%s"?',
+ 'New user' => 'novi korisnik',
+ 'All users' => 'Svi korisnici',
+ 'Username' => 'Korisnik',
+ 'Password' => 'Lozinka',
+ 'Default project' => 'Podrazumevani projekat',
+ 'Administrator' => 'Administrator',
+ 'Sign in' => 'Odjava',
+ 'Users' => 'Korisnik',
+ 'No user' => 'Ne',
+ 'Forbidden' => 'Zabranjeno',
+ 'Access Forbidden' => 'Zabranjen prostup',
+ 'Only administrators can access to this page.' => 'Samo administrator može videti ovu stranu.',
+ 'Edit user' => 'Izmeni korisnika',
+ 'Logout' => 'Odjava',
+ 'Bad username or password' => 'Loše korisničko ime ili lozinka',
+ 'users' => 'korisnici',
+ 'projects' => 'projekti',
+ 'Edit project' => 'Izmeni projekat',
+ 'Name' => 'Ime',
+ 'Activated' => 'Aktiviran',
+ 'Projects' => 'Projekti',
+ 'No project' => 'Bez projekta',
+ 'Project' => 'Projekat',
+ 'Status' => 'Status',
+ 'Tasks' => 'Zadatak',
+ 'Board' => 'Tabla',
+ 'Actions' => 'Akcje',
+ 'Inactive' => 'Neaktivan',
+ 'Active' => 'Aktivan',
+ 'Column %d' => 'Kolona %d',
+ 'Add this column' => 'Dodaj kolonu',
+ '%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',
+ 'Do you really want to remove this project: "%s"?' => 'Da li želiš da ukloniš projekat: "%s"?',
+ 'Remove project' => 'Ukloni projekat',
+ 'Boards' => 'Table',
+ 'Edit the board for "%s"' => 'Izmeni tablu za "%s"',
+ 'All projects' => 'Svi projekti',
+ 'Change columns' => 'Zameni kolonu',
+ 'Add a new column' => 'Dodaj novu kolonu',
+ 'Title' => 'Naslov',
+ 'Add Column' => 'Dodaj kolunu',
+ 'Project "%s"' => 'Projekt "%s"',
+ 'Nobody assigned' => 'Niko nije dodeljen',
+ '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!',
+ 'Settings' => 'Podešavanja',
+ 'Application settings' => 'Podešavanja aplikacije',
+ 'Language' => 'Jezik',
+ 'Webhook token:' => 'Token :',
+ 'API token:' => 'Token za API',
+ 'More information' => 'Još informacja',
+ 'Database size:' => 'Veličina baze :',
+ 'Download the database' => 'Preuzmi bazu',
+ 'Optimize the database' => 'Optimizuj bazu',
+ '(VACUUM command)' => '(komanda VACUUM)',
+ '(Gzip compressed Sqlite file)' => '(Sqlite baza spakovana Gzip-om)',
+ 'User settings' => 'Korisnička podešavanja',
+ 'My default project:' => 'Moj podrazumevani projekat:',
+ 'Close a task' => 'Zatvori zadatak',
+ 'Do you really want to close this task: "%s"?' => 'Da li zaista želiš da zatvoriš ovaj zadatak: "%s"?',
+ 'Edit a task' => 'Izmeni zadatak',
+ 'Column' => 'Kolona',
+ 'Color' => 'Boja',
+ 'Assignee' => 'Dodeli',
+ 'Create another task' => 'Dodaj zadatak',
+ 'New task' => 'Novi zadatak',
+ 'Open a task' => 'Otvori zadatak',
+ 'Do you really want to open this task: "%s"?' => 'Da li zaista želiš da otvoriš zadatak: "%s"?',
+ 'Back to the board' => 'Nazad na tablu',
+ 'Created on %B %e, %Y at %k:%M %p' => 'Kreiran %e %B %Y o %k:%M',
+ 'There is nobody assigned' => 'Niko nije dodeljen!',
+ 'Column on the board:' => 'Kolona na tabli:',
+ 'Status is open' => 'Status otvoren',
+ 'Status is closed' => 'Status zatvoren',
+ 'Close this task' => 'Zatvori ovaj zadatak',
+ 'Open this task' => 'Otvori ovaj zadatak',
+ 'There is no description.' => 'Bez opisa.',
+ 'Add a new task' => 'Dodaj zadatak',
+ 'The username is required' => 'Korisničko ime je obavezno',
+ 'The maximum length is %d characters' => 'Maksimalna dužina je %d znakova',
+ 'The minimum length is %d characters' => 'Minimalna dužina je %d znakova',
+ 'The password is required' => 'Lozinka je obavezna',
+ 'This value must be an integer' => 'Mora biti ceo broj',
+ 'The username must be unique' => 'Korisničko ime mora biti jedinstveno',
+ 'The username must be alphanumeric' => 'Korisničko ime sme sadržati samo brojeve i slova',
+ 'The user id is required' => 'ID korisnika je obavezan',
+ 'Passwords don\'t match' => 'Lozinke se ne podudaraju',
+ 'The confirmation is required' => 'Potvrda je obavezna',
+ 'The column is required' => 'Kolona je obavezna',
+ 'The project is required' => 'Projekat je obavezan',
+ 'The color is required' => 'Boja je obavezna',
+ 'The id is required' => 'ID je obavezan',
+ 'The project id is required' => 'ID projekta je obavezan',
+ 'The project name is required' => 'Naziv projekta je obavezan',
+ 'This project must be unique' => 'Projekat mora biti jedinstven',
+ 'The title is required' => 'Naslov je obavezan',
+ 'The language is required' => 'Jezik je obavezan',
+ 'There is no active project, the first step is to create a new project.' => 'Nema aktivnih projekata. Potrebno je prvo napraviti novi projekat.',
+ 'Settings saved successfully.' => 'Podešavanja uspešno snimljena.',
+ 'Unable to save your settings.' => 'Nemoguće snimanje podešavanja.',
+ 'Database optimization done.' => 'Optimizacija baze je završena.',
+ 'Your project have been created successfully.' => 'Projekat je uspešno napravljen.',
+ 'Unable to create your project.' => 'Nemoguće kreiranje projekta.',
+ 'Project updated successfully.' => 'Projekt je uspešno ažuriran.',
+ 'Unable to update this project.' => 'Nemoguće ažuriranje projekta.',
+ 'Unable to remove this project.' => 'Nemoguće uklanjanje projekta.',
+ 'Project removed successfully.' => 'Projekat uspešno uklonjen.',
+ 'Project activated successfully.' => 'Projekt uspešno aktiviran.',
+ 'Unable to activate this project.' => 'Nemoguće aktiviranje projekta.',
+ 'Project disabled successfully.' => 'Projekat uspešno deaktiviran.',
+ 'Unable to disable this project.' => 'nemoguće deaktiviranje projekta.',
+ 'Unable to open this task.' => 'Nemoguće otvaranje zadatka.',
+ 'Task opened successfully.' => 'Zadatak uspešno otvoren.',
+ 'Unable to close this task.' => 'Nije moguće zatvaranje ovog zadatka.',
+ 'Task closed successfully.' => 'Zadatak uspešno zatvoren.',
+ 'Unable to update your task.' => 'Nije moguće ažuriranje zadatka.',
+ 'Task updated successfully.' => 'Zadatak uspešno ažuriran.',
+ 'Unable to create your task.' => 'Nije moguće kreiranje zadatka.',
+ 'Task created successfully.' => 'Zadatak uspešno kreiran.',
+ 'User created successfully.' => 'Korisnik uspešno kreiran',
+ 'Unable to create your user.' => 'Nije uspelo kreiranje korisnika.',
+ 'User updated successfully.' => 'Korisnik uspešno ažuriran.',
+ 'Unable to update your user.' => 'Nije moguće ažuriranje korisnika.',
+ 'User removed successfully.' => 'Korisnik uspešno uklonjen.',
+ 'Unable to remove this user.' => 'Nije moguće uklanjanje korisnika.',
+ 'Board updated successfully.' => 'Tabla uspešno ažurirana.',
+ 'Ready' => 'Spreman',
+ 'Backlog' => 'Log',
+ 'Work in progress' => 'U radu',
+ 'Done' => 'Gotovo',
+ 'Application version:' => 'Verzija aplikacije:',
+ 'Completed on %B %e, %Y at %k:%M %p' => 'Završeno u %e %B %Y o %k:%M',
+ '%B %e, %Y at %k:%M %p' => '%e %B %Y o %k:%M',
+ 'Date created' => 'Kreiran dana',
+ 'Date completed' => 'Završen dana',
+ 'Id' => 'Id',
+ 'No task' => 'bez zadataka',
+ 'Completed tasks' => 'Zatvoreni zadaci',
+ 'List of projects' => 'Spisak projekata',
+ 'Completed tasks for "%s"' => 'zatvoreni zadaci za "%s"',
+ '%d closed tasks' => '%d zatvorenih zadataka',
+ 'No task for this project' => 'Nema dodeljenih zadataka ovom projektu',
+ 'Public link' => 'Javni link',
+ 'There is no column in your project!' => 'Nema dodeljenih kolona ovom projektu',
+ 'Change assignee' => 'Izmeni dodelu',
+ 'Change assignee for the task "%s"' => 'Izmeni dodelu za ovaj zadatak "%s"',
+ 'Timezone' => 'Vremenska zona',
+ 'Sorry, I didn\'t find this information in my database!' => 'Na žalost, nije pronađena informacija u bazi',
+ 'Page not found' => 'Strana nije pronađena',
+ 'Complexity' => 'Složenost',
+ 'limit' => 'ograničenje',
+ 'Task limit' => 'Ograničenje zadatka',
+ 'Task count' => 'Broj zadataka',
+ 'This value must be greater than %d' => 'Vrednost mora biti veća od %d',
+ 'Edit project access list' => 'Izmeni prava pristupa projektu',
+ 'Edit users access' => 'Izmeni korisnička prava',
+ 'Allow this user' => 'Dozvoli ovog korisnika',
+ 'Only those users have access to this project:' => 'Samo ovi korisnici imaju pristup projektu:',
+ 'Don\'t forget that administrators have access to everything.' => 'Zapamti: Administrator može pristupiti svemu!',
+ 'Revoke' => 'Povuci',
+ 'List of authorized users' => 'Spisak odobrenih korisnika',
+ 'User' => 'Korisnik',
+ 'Nobody have access to this project.' => 'Niko nema pristup ovom projektu',
+ 'You are not allowed to access to this project.' => 'Nije ti dozvoljen pristup ovom projektu.',
+ 'Comments' => 'Komentari',
+ 'Post comment' => 'Dodaj komentar',
+ 'Write your text in Markdown' => 'Pisanje teksta pomoću Markdown',
+ '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',
+ 'The description is required' => 'Opis je obavezan',
+ 'Edit this task' => 'Izmeni ovaj zadatak',
+ 'Due Date' => 'Termin',
+ 'Invalid date' => 'Loš datum',
+ 'Must be done before %B %e, %Y' => 'Termin do %e %B %Y',
+ '%B %e, %Y' => '%e %B %Y',
+ // '%b %e, %Y' => '',
+ 'Automatic actions' => 'Automatske akcije',
+ 'Your automatic action have been created successfully.' => 'Uspešno kreirana automatska akcija',
+ 'Unable to create your automatic action.' => 'Nemoguće kreiranje automatske akcije',
+ 'Remove an action' => 'Obriši akciju',
+ 'Unable to remove this action.' => 'Nije moguće obrisati akciju',
+ 'Action removed successfully.' => 'Akcija obrisana',
+ 'Automatic actions for the project "%s"' => 'Akcje za automatizaciju projekta "%s"',
+ 'Defined actions' => 'Definisane akcje',
+ 'Add an action' => 'dodaj akcju',
+ 'Event name' => 'Naziv događaja',
+ 'Action name' => 'Naziv akcije',
+ 'Action parameters' => 'Parametri akcije',
+ 'Action' => 'Akcija',
+ 'Event' => 'Događaj',
+ 'When the selected event occurs execute the corresponding action.' => 'Kad se događaj desi izvrši odgovarajuću akciju',
+ 'Next step' => 'Sledeći korak',
+ 'Define action parameters' => 'Definiši parametre akcije',
+ 'Save this action' => 'Snimi akciju',
+ 'Do you really want to remove this action: "%s"?' => 'Da li da obrišem akciju "%s"?',
+ 'Remove an automatic action' => 'Obriši automatsku akciju',
+ 'Close the task' => 'Zatvori zadatak',
+ 'Assign the task to a specific user' => 'Dodeli zadatak određenom korisniku',
+ 'Assign the task to the person who does the action' => 'Dodeli zadatak korisniku koji je izvršio akciju',
+ 'Duplicate the task to another project' => 'Kopiraj akciju u drugi projekat',
+ 'Move a task to another column' => 'Premesti zadatak u drugu kolonu',
+ 'Move a task to another position in the same column' => 'Promeni poziciju zadatka u istoj koloni',
+ 'Task modification' => 'Izman zadatka',
+ 'Task creation' => 'Kreiranje zadatka',
+ 'Open a closed task' => 'Otvori zatvoreni zadatak',
+ 'Closing a task' => 'Zatvaranja zadatka',
+ 'Assign a color to a specific user' => 'Dodeli boju korisniku',
+ 'Column title' => 'Naslov kolone',
+ 'Position' => 'Pozicija',
+ 'Move Up' => 'Podigni',
+ 'Move Down' => 'Spusti',
+ 'Duplicate to another project' => 'Kopiraj u drugi projekat',
+ 'Duplicate' => 'Napravi kopiju',
+ 'link' => 'link',
+ 'Update this comment' => 'Ažuriraj komentar',
+ 'Comment updated successfully.' => 'Komentar uspešno ažuriran.',
+ 'Unable to update your comment.' => 'Neuspešno ažuriranje komentara.',
+ 'Remove a comment' => 'Obriši komentar',
+ 'Comment removed successfully.' => 'Komentar je uspešno obrisan.',
+ 'Unable to remove this comment.' => 'Neuspešno brisanje komentara.',
+ 'Do you really want to remove this comment?' => 'Da li da obrišem ovaj komentar?',
+ 'Only administrators or the creator of the comment can access to this page.' => 'Samo administrator i kreator komentara mogu ga obrisati.',
+ 'Details' => 'Detalji',
+ 'Current password for the user "%s"' => 'Trenutna lozinka za korisnika "%s"',
+ 'The current password is required' => 'Trenutna lozinka je obavezna',
+ 'Wrong password' => 'Pogrešna lozinka',
+ 'Reset all tokens' => 'Resetuj tokene',
+ 'All tokens have been regenerated.' => 'Svi tokeni su ponovo generisani.',
+ 'Unknown' => 'Nepoznat',
+ 'Last logins' => 'Poslednja prijava',
+ 'Login date' => 'Datum prijave',
+ 'Authentication method' => 'Metod autentikacije',
+ 'IP address' => 'IP adresa',
+ 'User agent' => 'Browser',
+ 'Persistent connections' => 'Stalna konekcija',
+ 'No session.' => 'Bez sesjie',
+ 'Expiration date' => 'Ističe',
+ 'Remember Me' => 'Zapamti me',
+ 'Creation date' => 'Datum kreiranja',
+ 'Filter by user' => 'Po korisniku',
+ 'Filter by due date' => 'Po terminu',
+ 'Everybody' => 'Svi',
+ 'Open' => 'Otvoreni',
+ 'Closed' => 'Zatvoreni',
+ 'Search' => 'Traži',
+ 'Nothing found.' => 'Ništa nije pronađeno',
+ 'Search in the project "%s"' => 'Traži u prijektu "%s"',
+ 'Due date' => 'Termin',
+ 'Others formats accepted: %s and %s' => 'Ostali formati: %s i %s',
+ 'Description' => 'Opis',
+ '%d comments' => '%d Komentara',
+ '%d comment' => '%d Komentar',
+ 'Email address invalid' => 'Pogrešan e-mail',
+ 'Your Google Account is not linked anymore to your profile.' => 'Tvoj google nalog više nije povezan sa profilom',
+ 'Unable to unlink your Google Account.' => 'Neuspešno ukidanje veze od Google naloga',
+ 'Google authentication failed' => 'Neuspešna Google autentikacija',
+ 'Unable to link your Google Account.' => 'Neuspešno povezivanje sa Google nalogom',
+ 'Your Google Account is linked to your profile successfully.' => 'Vaš Google nalog je uspešno povezan sa vašim profilom',
+ 'Email' => 'E-mail',
+ 'Link my Google Account' => 'Poveži sa Google nalogom',
+ 'Unlink my Google Account' => 'Ukini vezu sa Google nalogom',
+ 'Login with my Google Account' => 'Prijavi se preko Google naloga',
+ 'Project not found.' => 'Projekat nije pronađen.',
+ 'Task #%d' => 'Zadatak #%d',
+ 'Task removed successfully.' => 'Zadatak uspešno uklonjen.',
+ 'Unable to remove this task.' => 'Nemoguće uklanjanje zadatka.',
+ 'Remove a task' => 'Ukloni zadatak',
+ 'Do you really want to remove this task: "%s"?' => 'Da li da obrišem zadatak "%s"?',
+ 'Assign automatically a color based on a category' => 'Automatski dodeli boju po kategoriji',
+ 'Assign automatically a category based on a color' => 'Automatski dodeli kategoriju po boji',
+ 'Task creation or modification' => 'Kreiranje ili izmena zadatka',
+ 'Category' => 'Kategorija',
+ 'Category:' => 'Kategorija:',
+ 'Categories' => 'Kategorije',
+ 'Category not found.' => 'Kategorija nije pronađena',
+ 'Your category have been created successfully.' => 'Uspešno kreirana kategorija.',
+ 'Unable to create your category.' => 'Nije moguće kreirati kategoriju.',
+ 'Your category have been updated successfully.' => 'Kategorija je uspešno izmenjena',
+ 'Unable to update your category.' => 'Nemoguće izmeniti kategoriju',
+ 'Remove a category' => 'Obriši kategoriju',
+ 'Category removed successfully.' => 'Kategorija uspešno uklonjena.',
+ 'Unable to remove this category.' => 'Nije moguće ukloniti kategoriju.',
+ 'Category modification for the project "%s"' => 'Izmena kategorije za projekat "%s"',
+ 'Category Name' => 'Naziv kategorije',
+ 'Categories for the project "%s"' => 'Kategorije u projektu',
+ 'Add a new category' => 'Dodaj novu kategoriju',
+ 'Do you really want to remove this category: "%s"?' => 'Da li zaista želiš da ukloniš kategoriju: "%s"?',
+ 'Filter by category' => 'Po kategoriji',
+ 'All categories' => 'Sve kategorije',
+ 'No category' => 'Bez kategorije',
+ 'The name is required' => 'Naziv je obavezan',
+ 'Remove a file' => 'Ukloni fajl',
+ 'Unable to remove this file.' => 'Fajl nije moguće ukloniti.',
+ 'File removed successfully.' => 'Uspešno uklonjen fajl.',
+ 'Attach a document' => 'Prikači dokument',
+ 'Do you really want to remove this file: "%s"?' => 'Da li da uklonim fajl: "%s"?',
+ 'open' => 'otvori',
+ 'Attachments' => 'Prilozi',
+ 'Edit the task' => 'Izmena Zadatka',
+ 'Edit the description' => 'Izmena opisa',
+ 'Add a comment' => 'Dodaj komentar',
+ 'Edit a comment' => 'Izmeni komentar',
+ 'Summary' => 'Pregled',
+ 'Time tracking' => 'Praćenje vremena',
+ 'Estimate:' => 'Procena:',
+ 'Spent:' => 'Potrošeno:',
+ 'Do you really want to remove this sub-task?' => 'Da li da uklonim pod-zdadatak?',
+ 'Remaining:' => 'Preostalo:',
+ 'hours' => 'sati',
+ 'spent' => 'potrošeno',
+ 'estimated' => 'procenjeno',
+ 'Sub-Tasks' => 'Pod-zadaci',
+ 'Add a sub-task' => 'Dodaj pod-zadatak',
+ 'Original estimate' => 'Originalna procena',
+ 'Create another sub-task' => 'Dodaj novi pod-zadatak',
+ 'Time spent' => 'Utrošeno vreme',
+ 'Edit a sub-task' => 'Izmeni pod-zadatak',
+ 'Remove a sub-task' => 'Ukloni pod-zadatak',
+ 'The time must be a numeric value' => 'Vreme mora biti broj',
+ 'Todo' => 'Za rad',
+ 'In progress' => 'U radu',
+ 'Sub-task removed successfully.' => 'Pod-zadatak uspešno uklonjen.',
+ 'Unable to remove this sub-task.' => 'Nie można usunąć tego pod-zadania.',
+ 'Sub-task updated successfully.' => 'Pod-zadatak zaktualizowane pomyślnie.',
+ 'Unable to update your sub-task.' => 'Nie można zaktalizować tego pod-zadania.',
+ 'Unable to create your sub-task.' => 'Nie można utworzyć tego pod-zadania.',
+ 'Sub-task added successfully.' => 'Pod-zadatak utworzone pomyślnie',
+ 'Maximum size: ' => 'Maksimalna veličina: ',
+ 'Unable to upload the file.' => 'Nije moguće snimiti fajl.',
+ 'Display another project' => 'Prikaži drugi projekat',
+ 'Your GitHub account was successfully linked to your profile.' => 'Konto Github podłączone pomyślnie.',
+ 'Unable to link your GitHub Account.' => 'Nie można połączyć z kontem Github.',
+ 'GitHub authentication failed' => 'Autentykacja Github nieudana',
+ 'Your GitHub account is no longer linked to your profile.' => 'Konto Github nie jest już podłączone do twojego profilu.',
+ 'Unable to unlink your GitHub Account.' => 'Nie można odłączyć konta Github.',
+ 'Login with my GitHub Account' => 'Zaloguj przy użyciu konta Github',
+ 'Link my GitHub Account' => 'Podłącz konto Github',
+ 'Unlink my GitHub Account' => 'Odłącz konto Github',
+ 'Created by %s' => 'Kreirao %s',
+ 'Last modified on %B %e, %Y at %k:%M %p' => 'Poslednja izmena %e %B %Y o %k:%M',
+ 'Tasks Export' => 'Izvoz zadataka',
+ 'Tasks exportation for "%s"' => 'Izvoz zadataka za "%s"',
+ 'Start Date' => 'Početni datum',
+ 'End Date' => 'Krajni datum',
+ 'Execute' => 'Izvrši',
+ 'Task Id' => 'Identifikator Zadatka',
+ 'Creator' => 'Autor',
+ 'Modification date' => 'Datum izmene',
+ 'Completion date' => 'Datum kompletiranja',
+ 'Webhook URL for task creation' => 'Webhook URL zadatka za kreiranje',
+ 'Webhook URL for task modification' => 'Webhook URL zadatka za izmenu',
+ 'Clone' => 'Iskopiraj',
+ 'Clone Project' => 'Iskopiraj projekat',
+ 'Project cloned successfully.' => 'Projekat uspešno iskopiran.',
+ 'Unable to clone this project.' => 'Nije moguće iskopirati projekat.',
+ 'Email notifications' => 'Obaveštenje e-mailom',
+ 'Enable email notifications' => 'Omogući obaveštenja e-mailom',
+ 'Task position:' => 'Pozicija zadatka:',
+ 'The task #%d have been opened.' => 'Zadatak #%d je otvoren.',
+ 'The task #%d have been closed.' => 'Zadatak #$d je zatvoren.',
+ 'Sub-task updated' => 'Pod-zadatak izmenjen',
+ 'Title:' => 'Naslov:',
+ // 'Status:' => '',
+ 'Assignee:' => 'Dodeli:',
+ 'Time tracking:' => 'Praćenje vremena: ',
+ 'New sub-task' => 'Novi Pod-zadatak',
+ 'New attachment added "%s"' => 'Novi prilog ubačen "%s"',
+ 'Comment updated' => 'Komentar izmenjen',
+ 'New comment posted by %s' => 'Novi komentar ostavio %s',
+ 'List of due tasks for the project "%s"' => 'Spisak dospelih zadataka za projekat "%s"',
+ // 'New attachment' => '',
+ // 'New comment' => '',
+ // 'New subtask' => '',
+ // 'Subtask updated' => '',
+ // 'Task updated' => '',
+ 'Task closed' => 'Zadatak je zatvoren',
+ 'Task opened' => 'Zadatak je otvoren',
+ '[%s][Due tasks]' => '[%s][Dospeli zadaci]',
+ '[Kanboard] Notification' => '[Kanboard] Obaveštenja',
+ 'I want to receive notifications only for those projects:' => 'Želim obaveštenja samo za ovaj projekat:',
+ 'view the task on Kanboard' => 'Pregledaj zadatke',
+ 'Public access' => 'Javni pristup',
+ 'Category management' => 'Uređivanje kategorija',
+ 'User management' => 'Uređivanje korisnika',
+ 'Active tasks' => 'Aktivni zadaci',
+ 'Disable public access' => 'Zabrani javni pristup',
+ 'Enable public access' => 'Dozvoli javni pristup',
+ 'Active projects' => 'Aktivni projekti',
+ 'Inactive projects' => 'Neaktivni projekti',
+ 'Public access disabled' => 'Javni pristup onemogućen!',
+ 'Do you really want to disable this project: "%s"?' => 'Da li zaista želiš da deaktiviraš projekat: "%s"?',
+ 'Do you really want to duplicate this project: "%s"?' => 'Da li da napravim kopiju ovog projekta: "%s"?',
+ 'Do you really want to enable this project: "%s"?' => 'Da li zaista želiš da aktiviraš projekat: "%s"?',
+ 'Project activation' => 'Aktivacija projekta',
+ 'Move the task to another project' => 'Premesti zadatak u drugi projekat',
+ 'Move to another project' => 'Premesti u drugi projekat',
+ 'Do you really want to duplicate this task?' => 'Da li da napravim kopiju ovog projekta: "%s"?',
+ 'Duplicate a task' => 'Kopiraj zadatak',
+ 'External accounts' => 'Spoljni nalozi',
+ 'Account type' => 'Tip naloga',
+ 'Local' => 'Lokalno',
+ 'Remote' => 'Udaljno',
+ 'Enabled' => 'Omogući',
+ 'Disabled' => 'Onemogući',
+ 'Google account linked' => 'Połączone konto Google',
+ 'Github account linked' => 'Połączone konto Github',
+ 'Username:' => 'Korisničko ime:',
+ 'Name:' => 'Ime i Prezime',
+ 'Email:' => 'Email: ',
+ 'Default project:' => 'Osnovni projekat:',
+ 'Notifications:' => 'Obaveštenja: ',
+ 'Notifications' => 'Obaveštenja',
+ 'Group:' => 'Grupa:',
+ 'Regular user' => 'Standardni korisnik',
+ 'Account type:' => 'Vrsta naloga:',
+ 'Edit profile' => 'Izmeni profil',
+ 'Change password' => 'Izmeni lozinku',
+ 'Password modification' => 'Izmena lozinke',
+ 'External authentications' => 'Spoljne akcije',
+ 'Google Account' => 'Google nalog',
+ 'Github Account' => 'Github nalog',
+ 'Never connected.' => 'Bez konekcija.',
+ 'No account linked.' => 'Bez povezanih naloga.',
+ 'Account linked.' => 'Nalog povezan.',
+ 'No external authentication enabled.' => 'Bez omogućenih spoljnih autentikacija.',
+ 'Password modified successfully.' => 'Uspešna izmena lozinke.',
+ 'Unable to change the password.' => 'Nije moguće izmeniti lozinku.',
+ 'Change category for the task "%s"' => 'Izmeni kategoriju zadatka "%s"',
+ 'Change category' => 'Izmeni kategoriju',
+ '%s updated the task %s' => '%s izmeni zadatak %s',
+ '%s opened the task %s' => '%s aktivni zadaci %s',
+ '%s moved the task %s to the position #%d in the column "%s"' => '%s premešten zadatak %s na poziciju #%d u koloni "%s"',
+ '%s moved the task %s to the column "%s"' => '%s premešten zadatak %s u kolonu "%s"',
+ '%s created the task %s' => '%s kreirao zadatak %s',
+ '%s closed the task %s' => '%s zatvorio zadatak %s',
+ '%s created a subtask for the task %s' => '%s kreiran pod-zadatak zadatka %s',
+ '%s updated a subtask for the task %s' => '%s izmenjen pod-zadatak zadatka %s',
+ 'Assigned to %s with an estimate of %s/%sh' => 'Dodeljen korisniku %s uz procenu vremena %s/%sh',
+ 'Not assigned, estimate of %sh' => 'Ne dodeljen, procenjeno vreme %sh',
+ '%s updated a comment on the task %s' => '%s izmenjen komentar zadatka %s',
+ '%s commented the task %s' => '%s komentarisao zadatak %s',
+ '%s\'s activity' => 'Aktivnosti %s',
+ 'No activity.' => 'Bez aktivnosti.',
+ 'RSS feed' => 'RSS kanal',
+ '%s updated a comment on the task #%d' => '%s izmenjen komentar zadatka #%d',
+ '%s commented on the task #%d' => '%s komentarisao zadatak #%d',
+ '%s updated a subtask for the task #%d' => '%s izmenjen pod-zadatak zadatka #%d',
+ '%s created a subtask for the task #%d' => '%s kreirao pod-zadatak zadatka #%d',
+ '%s updated the task #%d' => '%s izmenjen zadatak #%d',
+ '%s created the task #%d' => '%s kreirao zadatak #%d',
+ '%s closed the task #%d' => '%s zatvorio zadatak #%d',
+ '%s open the task #%d' => '%s otvorio zadatak #%d',
+ '%s moved the task #%d to the column "%s"' => '%s premestio zadatak #%d u kolonu "%s"',
+ '%s moved the task #%d to the position %d in the column "%s"' => '%s premestio zadatak #%d na pozycję %d w kolmnie "%s"',
+ 'Activity' => 'Aktivnosti',
+ 'Default values are "%s"' => 'Osnovne vrednosti su: "%s"',
+ 'Default columns for new projects (Comma-separated)' => 'Osnovne kolone za novi projekat (Odvojeni zarezom)',
+ 'Task assignee change' => 'Zmień osobę odpowiedzialną',
+ '%s change the assignee of the task #%d to %s' => '%s zamena dodele za zadatak #%d na %s',
+ '%s changed the assignee of the task %s to %s' => '%s zamena dodele za zadatak %s na %s',
+ // 'Column Change' => '',
+ // 'Position Change' => '',
+ // 'Assignee Change' => '',
+ 'New password for the user "%s"' => 'Nova lozinka za korisnika "%s"',
+ 'Choose an event' => 'Izaberi događaj',
+ // 'Github commit received' => '',
+ // 'Github issue opened' => '',
+ // 'Github issue closed' => '',
+ // 'Github issue reopened' => '',
+ // 'Github issue assignee change' => '',
+ // 'Github issue label change' => '',
+ 'Create a task from an external provider' => 'Kreiraj zadatak preko posrednika',
+ 'Change the assignee based on an external username' => 'Zmień osobę odpowiedzialną na podstawie zewnętrznej nazwy użytkownika',
+ 'Change the category based on an external label' => 'Zmień kategorię na podstawie zewnętrzenj etykiety',
+ // 'Reference' => '',
+ // 'Reference: %s' => '',
+ 'Label' => 'Etikieta',
+ 'Database' => 'Baza',
+ 'About' => 'Informacje',
+ 'Database driver:' => 'Database driver:',
+ 'Board settings' => 'Podešavanje table',
+ 'URL and token' => 'URL i token',
+ // 'Webhook settings' => '',
+ 'URL for task creation:' => 'URL za kreiranje zadataka',
+ 'Reset token' => 'Resetuj token',
+ // 'API endpoint:' => '',
+ 'Refresh interval for private board' => 'Interval osvežavanja privatnih tabli',
+ 'Refresh interval for public board' => 'Interval osvežavanja javnih tabli',
+ 'Task highlight period' => 'Task highlight period',
+// 'Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)' => 'Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)',
+// 'Frequency in second (60 seconds by default)' => 'Częstotliwosć w sekundach (domyślnie 60 sekund)',
+// 'Frequency in second (0 to disable this feature, 10 seconds by default)' => 'Częstotliwość w sekundach (0 aby zablokować, domyślnie 10 sekund)',
+ 'Application URL' => 'Adres URL aplikacji',
+ 'Example: http://example.kanboard.net/ (used by email notifications)' => 'Primer: http://example.kanboard.net/ (koristi se u obaveštenjima putem mail-a)',
+ 'Token regenerated.' => 'Token wygenerowany ponownie.',
+ 'Date format' => 'Format daty',
+ 'ISO format is always accepted, example: "%s" and "%s"' => 'Format ISO je uvek prihvatljiv, primer: "%s", "%s"',
+ 'New private project' => 'Novi privatni projekat',
+ 'This project is private' => 'Ovaj projekat je privatan',
+ 'Type here to create a new sub-task' => 'Kucaj ovde za kreiranje novog pod-zadatka',
+ 'Add' => 'Dodaj',
+ 'Estimated time: %s hours' => 'Procenjeno vreme: %s godzin',
+ 'Time spent: %s hours' => 'Utrošeno vreme: %s godzin',
+ 'Started on %B %e, %Y' => 'Započeto dana %e %B %Y',
+ 'Start date' => 'Datum početka',
+ 'Time estimated' => 'Procenjeno vreme',
+ 'There is nothing assigned to you.' => 'Ništa vam nije dodeljeno',
+ 'My tasks' => 'Moji zadaci',
+ 'Activity stream' => 'Spisak aktinosti',
+ 'Dashboard' => 'Panel',
+ 'Confirmation' => 'Potvrda',
+ 'Allow everybody to access to this project' => 'Dozvoli svima pristup projektu',
+ 'Everybody have access to this project.' => 'Svima je dozvoljen pristup.',
+ // 'Webhooks' => '',
+ // 'API' => '',
+ 'Integration' => 'Integracja',
+ // 'Github webhooks' => '',
+ // 'Help on Github webhooks' => '',
+// 'Create a comment from an external provider' => 'Kreiraj komentarz od zewnętrznego dostawcy',
+ // 'Github issue comment created' => '',
+ 'Configure' => 'Podesi',
+ 'Project management' => 'Uređivanje projekata',
+ 'My projects' => 'Moji projekti',
+ 'Columns' => 'Kolone',
+ 'Task' => 'Zadaci',
+ 'Your are not member of any project.' => 'Nisi član ni jednog projekta',
+ 'Percentage' => 'Procenat',
+ 'Number of tasks' => 'Broj zadataka',
+ 'Task distribution' => 'Podela zadataka',
+ 'Reportings' => 'Izveštaji',
+ 'Task repartition for "%s"' => 'Zaduženja zadataka za "%s"',
+ 'Analytics' => 'Analiza',
+ 'Subtask' => 'Pod-zadatak',
+ 'My subtasks' => 'Moji pod-zadaci',
+ 'User repartition' => 'Zaduženja korisnika',
+ 'User repartition for "%s"' => 'Zaduženja korisnika za "%s"',
+ 'Clone this project' => 'Kopiraj projekat',
+ 'Column removed successfully.' => 'Kolumna usunięta pomyslnie.',
+ 'Edit Project' => 'Izmeni projekat',
+ // 'Github Issue' => '',
+ 'Not enough data to show the graph.' => 'Nedovoljno podataka za grafikon.',
+ 'Previous' => 'Prethodni',
+ 'The id must be an integer' => 'ID musi być liczbą całkowitą',
+ 'The project id must be an integer' => 'ID projektu musi być liczbą całkowitą',
+ 'The status must be an integer' => 'Status musi być liczbą całkowitą',
+ 'The subtask id is required' => 'ID pod-zadatak jest wymagane',
+ 'The subtask id must be an integer' => 'ID pod-zadania musi być liczbą całkowitą',
+ 'The task id is required' => 'ID zadania jest wymagane',
+ 'The task id must be an integer' => 'ID zadatka mora biti broj',
+ 'The user id must be an integer' => 'ID korisnika mora biti broj',
+ 'This value is required' => 'Vrednost je obavezna',
+ 'This value must be numeric' => 'Vrednost mora biti broj',
+ 'Unable to create this task.' => 'Nije moguće kreirati zadatak.',
+ 'Cumulative flow diagram' => 'Zbirni dijagram toka',
+ 'Cumulative flow diagram for "%s"' => 'Zbirni dijagram toka za "%s"',
+ 'Daily project summary' => 'Zbirni pregled po danima',
+ 'Daily project summary export' => 'Izvoz zbirnog pregleda po danima',
+ 'Daily project summary export for "%s"' => 'Izvoz zbirnig pregleda po danima za "%s"',
+ 'Exports' => 'Izvoz',
+// 'This export contains the number of tasks per column grouped per day.' => 'Ten eksport zawiera ilość zadań zgrupowanych w kolumnach na dzień',
+ 'Nothing to preview...' => 'Ništa za prikazivanje...',
+ 'Preview' => 'Pregled',
+ 'Write' => 'Piši',
+ 'Active swimlanes' => 'Aktivni razdelnik',
+ 'Add a new swimlane' => 'Dodaj razdelnik',
+ 'Change default swimlane' => 'Zameni osnovni razdelnik',
+ 'Default swimlane' => 'Osnovni razdelnik',
+ 'Do you really want to remove this swimlane: "%s"?' => 'Da li da uklonim razdelnik: "%s"?',
+ 'Inactive swimlanes' => 'Neaktivni razdelniki',
+ 'Set project manager' => 'Podesi menadžera projekta',
+ 'Set project member' => 'Podesi učesnika projekat',
+ 'Remove a swimlane' => 'Ukloni razdelnik',
+ 'Rename' => 'Preimenuj',
+ 'Show default swimlane' => 'Prikaži osnovni razdelnik',
+ 'Swimlane modification for the project "%s"' => 'Izmena razdelnika za projekat "%s"',
+ 'Swimlane not found.' => 'Razdelnik nije pronađen.',
+ 'Swimlane removed successfully.' => 'Razdelnik uspešno uklonjen.',
+ 'Swimlanes' => 'Razdelnici',
+ 'Swimlane updated successfully.' => 'Razdelnik zaktualizowany pomyślnie.',
+// 'The default swimlane have been updated successfully.' => 'Domyślny razdelnik zaktualizowany pomyślnie.',
+// 'Unable to create your swimlane.' => 'Nie można utworzyć razdelniku.',
+// 'Unable to remove this swimlane.' => 'Nie można usunąć razdelniku.',
+// 'Unable to update this swimlane.' => 'Nie można zaktualizować razdelniku.',
+ 'Your swimlane have been created successfully.' => 'Razdelnik je uspešno kreiran.',
+ 'Example: "Bug, Feature Request, Improvement"' => 'Npr: "Greška, Zahtev za izmenama, Poboljšanje"',
+ 'Default categories for new projects (Comma-separated)' => 'Osnovne kategorije za projekat',
+ // 'Gitlab commit received' => '',
+ // 'Gitlab issue opened' => '',
+ // 'Gitlab issue closed' => '',
+ // 'Gitlab webhooks' => '',
+ // 'Help on Gitlab webhooks' => '',
+ 'Integrations' => 'Integracje',
+ 'Integration with third-party services' => 'Integracja sa uslugama spoljnih servisa',
+ 'Role for this project' => 'Uloga u ovom projektu',
+ 'Project manager' => 'Manadžer projekta',
+ 'Project member' => 'Učesnik projekta',
+// 'A project manager can change the settings of the project and have more privileges than a standard user.' => 'Menadżer projektu może zmieniać ustawienia projektu i posiada większe uprawnienia od zwykłego użytkownika',
+ // 'Gitlab Issue' => '',
+ 'Subtask Id' => 'ID pod-zadania',
+ 'Subtasks' => 'Pod-zadataka',
+ 'Subtasks Export' => 'Eksport pod-zadań',
+ 'Subtasks exportation for "%s"' => 'Izvoz pod-zadań dla "%s"',
+ 'Task Title' => 'Naslov zadatka',
+ 'Untitled' => 'Bez naslova',
+ 'Application default' => 'Postavke aplikacje',
+ 'Language:' => 'Jezik:',
+ 'Timezone:' => 'Vremenska zona:',
+ 'All columns' => 'Sve kolone',
+ 'Calendar for "%s"' => 'Kalendar za "%s"',
+ 'Filter by column' => 'Po koloni',
+ 'Filter by status' => 'Po statusu',
+ 'Calendar' => 'Kalendar',
+ 'Next' => 'Sledeći',
+ // '#%d' => '',
+ 'Filter by color' => 'Po boji',
+ 'Filter by swimlane' => 'Po razdelniku',
+ 'All swimlanes' => 'Svi razdelniki',
+ 'All colors' => 'Sve boje',
+ 'All status' => 'Svi statusi',
+ 'Add a comment logging moving the task between columns' => 'Dodaj logovanje premeštanja zadataka po kolonama',
+ 'Moved to column %s' => 'Premešten u kolonu %s',
+ // 'Change description' => '',
+ 'User dashboard' => 'Korisnički panel',
+ // 'Allow only one subtask in progress at the same time for a user' => '',
+ // 'Edit column "%s"' => '',
+ // 'Enable time tracking for subtasks' => '',
+ // 'Select the new status of the subtask: "%s"' => '',
+ // 'Subtask timesheet' => '',
+ 'There is nothing to show.' => 'Nema podataka',
+ 'Time Tracking' => 'Praćenje vremena',
+ // 'You already have one subtask in progress' => '',
+ 'Which parts of the project do you want to duplicate?' => 'Koje delove projekta želite da kopirate',
+ // 'Change dashboard view' => '',
+ // 'Show/hide activities' => '',
+ // 'Show/hide projects' => '',
+ // 'Show/hide subtasks' => '',
+ // 'Show/hide tasks' => '',
+ // 'Disable login form' => '',
+ // 'Show/hide calendar' => '',
+ 'Korsički kalendar' => '',
+ // 'Bitbucket commit received' => '',
+ // 'Bitbucket webhooks' => '',
+ // 'Help on Bitbucket webhooks' => '',
+ // 'Start' => '',
+ // 'End' => '',
+ // 'Task age in days' => '',
+ // 'Days in this column' => '',
+ // '%dd' => '',
+ 'Add a link' => 'Dodaj link',
+ // 'Add a new link' => '',
+ // 'Do you really want to remove this link: "%s"?' => '',
+ // 'Do you really want to remove this link with task #%d?' => '',
+ // 'Field required' => '',
+ // 'Link added successfully.' => '',
+ // 'Link updated successfully.' => '',
+ // 'Link removed successfully.' => '',
+ // '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' => '',
+ // 'Unable to create your link.' => '',
+ // 'Unable to update your link.' => '',
+ // 'Unable to remove this link.' => '',
+ // 'relates to' => '',
+ // 'blocks' => '',
+ // 'is blocked by' => '',
+ // 'duplicates' => '',
+ // 'is duplicated by' => '',
+ // 'is a child of' => '',
+ // 'is a parent of' => '',
+ // 'targets milestone' => '',
+ // 'is a milestone of' => '',
+ // 'fixes' => '',
+ // 'is fixed by' => '',
+ // 'This task' => '',
+ // '<1h' => '',
+ // '%dh' => '',
+ // '%b %e' => '',
+ // 'Expand tasks' => '',
+ // 'Collapse tasks' => '',
+ // 'Expand/collapse tasks' => '',
+ // 'Close dialog box' => '',
+ // 'Submit a form' => '',
+ // 'Board view' => '',
+ // 'Keyboard shortcuts' => '',
+ // 'Open board switcher' => '',
+ // 'Application' => '',
+ // 'Filter recently updated' => '',
+ // 'since %B %e, %Y at %k:%M %p' => '',
+ // 'More filters' => '',
+);
diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php
index 47ac8b26..5516b90e 100644
--- a/app/Locale/sv_SE/translations.php
+++ b/app/Locale/sv_SE/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php
index 43395db5..5b127162 100644
--- a/app/Locale/th_TH/translations.php
+++ b/app/Locale/th_TH/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php
index e2d4e72c..82321bdd 100644
--- a/app/Locale/tr_TR/translations.php
+++ b/app/Locale/tr_TR/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php
index f1bbd87c..0d2d551e 100644
--- a/app/Locale/zh_CN/translations.php
+++ b/app/Locale/zh_CN/translations.php
@@ -773,4 +773,6 @@ return array(
// 'Remove time slot' => '',
// 'Add new time slot' => '',
// 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '',
+ // 'Files' => '',
+ // 'Images' => '',
);
diff --git a/app/Model/Config.php b/app/Model/Config.php
index a2db25e9..736ae08d 100644
--- a/app/Model/Config.php
+++ b/app/Model/Config.php
@@ -39,6 +39,7 @@ class Config extends Base
'NZD' => t('NZD - New Zealand Dollar'),
'INR' => t('INR - Indian Rupee'),
'JPY' => t('JPY - Japanese Yen'),
+ 'RSD' => t('RSD - Serbian dinar'),
);
}
@@ -79,9 +80,11 @@ class Config extends Base
'fr_FR' => 'Français',
'it_IT' => 'Italiano',
'hu_HU' => 'Magyar',
+ 'nl_NL' => 'Nederlands',
'pl_PL' => 'Polski',
'pt_BR' => 'Português (Brasil)',
'ru_RU' => 'Русский',
+ 'sr_Latn_RS' => 'Srpski',
'fi_FI' => 'Suomi',
'sv_SE' => 'Svenska',
'tr_TR' => 'Türkçe',
diff --git a/app/Model/File.php b/app/Model/File.php
index f069c8cf..a8cce9f4 100644
--- a/app/Model/File.php
+++ b/app/Model/File.php
@@ -113,6 +113,38 @@ class File extends Base
}
/**
+ * Get all images for a given task
+ *
+ * @access public
+ * @param integer $task_id Task id
+ * @return array
+ */
+ public function getAllImages($task_id)
+ {
+ return $this->db->table(self::TABLE)
+ ->eq('task_id', $task_id)
+ ->eq('is_image', 1)
+ ->asc('name')
+ ->findAll();
+ }
+
+ /**
+ * Get all files without images for a given task
+ *
+ * @access public
+ * @param integer $task_id Task id
+ * @return array
+ */
+ public function getAllDocuments($task_id)
+ {
+ return $this->db->table(self::TABLE)
+ ->eq('task_id', $task_id)
+ ->eq('is_image', 0)
+ ->asc('name')
+ ->findAll();
+ }
+
+ /**
* Check if a filename is an image
*
* @access public
@@ -121,7 +153,17 @@ class File extends Base
*/
public function isImage($filename)
{
- return getimagesize($filename) !== false;
+ $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
+
+ switch ($extension) {
+ case 'jpeg':
+ case 'jpg':
+ case 'png':
+ case 'gif':
+ return true;
+ }
+
+ return false;
}
/**
@@ -188,7 +230,7 @@ class File extends Base
$task_id,
$original_filename,
$destination_filename,
- $this->isImage(FILES_DIR.$destination_filename)
+ $this->isImage($original_filename)
);
}
}
diff --git a/app/Template/board/files.php b/app/Template/board/files.php
index 278b906b..851a118d 100644
--- a/app/Template/board/files.php
+++ b/app/Template/board/files.php
@@ -1,14 +1,31 @@
<section>
- <?php foreach ($files as $file): ?>
- <i class="fa fa-file-o fa-fw"></i>
-
- <?= $this->a(
- $this->e($file['name']),
- 'file',
- 'download',
- array('file_id' => $file['id'], 'task_id' => $file['task_id'], 'project_id' => $task['project_id'])
- ) ?>
-
- <br/>
- <?php endforeach ?>
+ <table>
+ <?php if (! empty($images)): ?>
+ <?php foreach ($images as $file): ?>
+ <tr>
+ <td class="column-70">
+ <i class="fa fa-file-image-o fa-fw"></i>
+ <?= $this->e($file['name']) ?>
+ </td>
+ <td>
+ <i class="fa fa-download"></i> <?= $this->a(t('download'), 'file', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
+ <i class="fa fa-eye"></i> <?= $this->a(t('open'), 'file', 'open', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?>
+ </td>
+ </tr>
+ <?php endforeach ?>
+ <?php endif ?>
+ <?php if (! empty($files)): ?>
+ <?php foreach ($files as $file): ?>
+ <tr>
+ <td>
+ <i class="fa <?= $this->getFileIcon($file['name']) ?> fa-fw"></i>
+ <?= $this->e($file['name']) ?>
+ </td>
+ <td>
+ <i class="fa fa-download"></i> <?= $this->a(t('download'), 'file', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
+ </td>
+ </tr>
+ <?php endforeach ?>
+ <?php endif ?>
+ </table>
</section>
diff --git a/app/Template/file/show.php b/app/Template/file/show.php
index 298976f6..b181ab54 100644
--- a/app/Template/file/show.php
+++ b/app/Template/file/show.php
@@ -1,23 +1,48 @@
-<?php if (! empty($files)): ?>
+<?php if (! empty($files) || ! empty($images)): ?>
<div id="attachments" class="task-show-section">
<div class="page-header">
<h2><?= t('Attachments') ?></h2>
</div>
+ <?php if (!empty($images)): ?>
+ <h3><?= t('Images') ?></h3>
+ <ul class="task-show-images">
+ <?php foreach ($images as $file): ?>
+ <li>
+ <div class="img_container">
+ <img src="<?= $this->u('file', 'thumbnail', array('width' => 250, 'file_id' => $file['id'], 'project_id' => $task['project_id'], 'task_id' => $file['task_id'])) ?>" alt="<?= $this->e($file['name']) ?>"/>
+ </div>
+ <p>
+ <?= $this->e($file['name']) ?>
+ </p>
+ <span class="task-show-file-actions task-show-image-actions">
+ <i class="fa fa-eye"></i> <?= $this->a(t('open'), 'file', 'open', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?>
+ <i class="fa fa-trash"></i> <?= $this->a(t('remove'), 'file', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
+ <i class="fa fa-download"></i> <?= $this->a(t('download'), 'file', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
+ </span>
+ </li>
+ <?php endforeach ?>
+ </ul>
+ <?php endif ?>
- <ul class="task-show-files">
- <?php foreach ($files as $file): ?>
- <li>
- <?= $this->a($this->e($file['name']), 'file', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
- <span class="task-show-file-actions">
- <?php if ($file['is_image']): ?>
- <?= $this->a(t('open'), 'file', 'open', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?>,
- <?php endif ?>
- <?= $this->a(t('remove'), 'file', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
- </span>
- </li>
- <?php endforeach ?>
- </ul>
-
+ <?php if (! empty($files)): ?>
+ <h3><?= t('Files') ?></h3>
+ <table class="task-show-file-table">
+ <?php foreach ($files as $file): ?>
+ <tr>
+ <td><i class="fa <?= $this->getFileIcon($file['name']) ?> fa-fw"></i></td>
+ <td>
+ <?= $this->e($file['name']) ?>
+ </td>
+ <td>
+ <span class="task-show-file-actions">
+ <i class="fa fa-trash"></i> <?= $this->a(t('remove'), 'file', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
+ <i class="fa fa-download"></i> <?= $this->a(t('download'), 'file', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
+ </span>
+ </td>
+ </tr>
+ <?php endforeach ?>
+ </table>
+ <?php endif ?>
</div>
<?php endif ?> \ No newline at end of file
diff --git a/app/Template/task/show.php b/app/Template/task/show.php
index 3b8f808a..50316c9f 100644
--- a/app/Template/task/show.php
+++ b/app/Template/task/show.php
@@ -4,5 +4,5 @@
<?= $this->render('tasklink/show', array('task' => $task, 'links' => $links, 'link_label_list' => $link_label_list)) ?>
<?= $this->render('subtask/show', array('task' => $task, 'subtasks' => $subtasks, 'project' => $project)) ?>
<?= $this->render('task/timesheet', array('task' => $task)) ?>
-<?= $this->render('file/show', array('task' => $task, 'files' => $files)) ?>
+<?= $this->render('file/show', array('task' => $task, 'files' => $files, 'images' => $images)) ?>
<?= $this->render('task/comments', array('task' => $task, 'comments' => $comments, 'project' => $project)) ?>
diff --git a/app/Template/tasklink/create.php b/app/Template/tasklink/create.php
index aec3b34a..acf9d6d1 100644
--- a/app/Template/tasklink/create.php
+++ b/app/Template/tasklink/create.php
@@ -23,7 +23,7 @@
<input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
<?= t('or') ?>
<?php if (isset($ajax)): ?>
- <?= $this->a(t('cancel'), 'board', 'show', array('project_id' => $task['project_id'])) ?>
+ <?= $this->a(t('cancel'), 'board', 'show', array('project_id' => $task['project_id']), false, 'close-popover') ?>
<?php else: ?>
<?= $this->a(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>
<?php endif ?>
diff --git a/assets/css/app.css b/assets/css/app.css
index 5b1ab97f..aa846737 100644
--- a/assets/css/app.css
+++ b/assets/css/app.css
@@ -762,26 +762,27 @@ nav .active a {
/* board table */
#board-container {
padding-bottom: 180px; /* Space to avoid dropdown menu truncated */
-}
-
-/* Board container classes for wide/compact view */
-.board-container-wide {
overflow-x: scroll;
}
.board-container-compact {
- overflow-x: hidden;
+ overflow-x: initial;
+}
+
+#board {
+ table-layout: fixed;
+}
+
+#board th {
+ width: 120px; /* Width of swimlane column */
}
-/* Board table column for wide/compact view */
-.board-column-wide {
- min-width: 240px;
- max-width: 240px;
+#board th.board-column {
+ width: 240px; /* Width of other columns, in default [horizontal scrolling] view mode */
}
-.board-column-compact {
- min-width: 0px;
- max-width: 0px;
+#board th.board-column.board-column-compact {
+ width: initial; /* Do not force the width of the columns in compact view mode */
}
#board th a {
@@ -1076,6 +1077,41 @@ span.task-board-date-overdue {
.task-link-closed {
text-decoration: line-through;
}
+.task-show-images {
+ list-style-type: none;
+}
+.task-show-images li img {
+ width: 100%;
+}
+.task-show-images li .img_container {
+ width: 250px;
+ height: 100px;
+ overflow: hidden;
+}
+.task-show-images li {
+ padding: 10px;
+ overflow: auto;
+ width: 250px;
+ min-height: 120px;
+ display: inline-block;
+ vertical-align: top;
+}
+.task-show-images li p{
+ padding: 5px;
+ font-weight: bold;
+}
+.task-show-images li:hover {
+ background: #eee;
+}
+.task-show-image-actions {
+ margin-left: 5px;
+}
+.task-show-images li .img_container:hover {
+ height: 100%;
+}
+.task-show-file-table {
+ width: auto;
+}
/* comments */
.comment {
margin-bottom: 20px;
diff --git a/assets/css/src/board.css b/assets/css/src/board.css
index f4aefa95..4309b178 100644
--- a/assets/css/src/board.css
+++ b/assets/css/src/board.css
@@ -21,26 +21,27 @@
/* board table */
#board-container {
padding-bottom: 180px; /* Space to avoid dropdown menu truncated */
-}
-
-/* Board container classes for wide/compact view */
-.board-container-wide {
overflow-x: scroll;
}
.board-container-compact {
- overflow-x: hidden;
+ overflow-x: initial;
+}
+
+#board {
+ table-layout: fixed;
+}
+
+#board th {
+ width: 120px; /* Width of swimlane column */
}
-/* Board table column for wide/compact view */
-.board-column-wide {
- min-width: 240px;
- max-width: 240px;
+#board th.board-column {
+ width: 240px; /* Width of other columns, in default [horizontal scrolling] view mode */
}
-.board-column-compact {
- min-width: 0px;
- max-width: 0px;
+#board th.board-column.board-column-compact {
+ width: initial; /* Do not force the width of the columns in compact view mode */
}
#board th a {
diff --git a/assets/css/src/task.css b/assets/css/src/task.css
index b7a5cb9c..946d18d4 100644
--- a/assets/css/src/task.css
+++ b/assets/css/src/task.css
@@ -245,3 +245,38 @@ span.task-board-date-overdue {
.task-link-closed {
text-decoration: line-through;
}
+.task-show-images {
+ list-style-type: none;
+}
+.task-show-images li img {
+ width: 100%;
+}
+.task-show-images li .img_container {
+ width: 250px;
+ height: 100px;
+ overflow: hidden;
+}
+.task-show-images li {
+ padding: 10px;
+ overflow: auto;
+ width: 250px;
+ min-height: 120px;
+ display: inline-block;
+ vertical-align: top;
+}
+.task-show-images li p{
+ padding: 5px;
+ font-weight: bold;
+}
+.task-show-images li:hover {
+ background: #eee;
+}
+.task-show-image-actions {
+ margin-left: 5px;
+}
+.task-show-images li .img_container:hover {
+ height: 100%;
+}
+.task-show-file-table {
+ width: auto;
+}
diff --git a/assets/js/app.js b/assets/js/app.js
index 79c366d2..d5733ed9 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -142,20 +142,20 @@ return""!=a?"visible"==document[a]:!0},SetStorageItem:function(a,c){"undefined"!
c.parent().addClass("form-tab-selected");e.find(".markdown").html(a);e.css("height",f.css("height"));e.css("width",f.css("width"));d.hide();e.show()})},MarkdownWriter:function(a){a.preventDefault();$(this).closest("ul").find("li").removeClass("form-tab-selected");$(this).parent().addClass("form-tab-selected");$(".write-area").show();$(".preview-area").hide()},CheckSession:function(){$(".form-login").length||$.ajax({cache:!1,url:$("body").data("status-url"),statusCode:{401:function(){window.location=
$("body").data("login-url")}}})},Init:function(){$("#board-selector").chosen({width:180,no_results_text:$("#board-selector").data("notfound")});$("#board-selector").change(function(){window.location=$(this).attr("data-board-url").replace(/PROJECT_ID/g,$(this).val())});window.setInterval(Kanboard.CheckSession,6E4);Mousetrap.bindGlobal("mod+enter",function(){$("form").submit()});Mousetrap.bind("b",function(a){a.preventDefault();$("#board-selector").trigger("chosen:open")});$(".column-tooltip").tooltip({content:function(){return'<div class="markdown">'+
$(this).attr("title")+"</div>"},position:{my:"left-20 top",at:"center bottom+9",using:function(a,c){$(this).css(a);var b=c.target.left+c.target.width/2-c.element.left-20;$("<div>").addClass("tooltip-arrow").addClass(c.vertical).addClass(0==b?"align-left":"align-right").appendTo(this)}}});$.datepicker.setDefaults($.datepicker.regional[$("body").data("js-lang")]);Kanboard.InitAfterAjax()},InitAfterAjax:function(){$(document).on("click",".popover",Kanboard.Popover);$(".form-date").datepicker({showOtherMonths:!0,
-selectOtherMonths:!0,dateFormat:"yy-mm-dd",constrainInput:!1});$("#markdown-preview").click(Kanboard.MarkdownPreview);$("#markdown-write").click(Kanboard.MarkdownWriter);$(".auto-select").focus(function(){$(this).select()});$(".dropit-submenu").hide();$(".dropdown").not(".dropit").dropit({triggerParentEl:"span"});$(".task-autocomplete").length&&($(".task-autocomplete").siblings().find("input[type=submit]").attr("disabled","disabled"),$(".task-autocomplete").autocomplete({source:$(".task-autocomplete").data("search-url"),
-minLength:2,select:function(a,c){var b=$(".task-autocomplete").data("dst-field");$("input[name="+b+"]").val(c.item.id);$(".task-autocomplete").siblings().find("input[type=submit]").removeAttr("disabled")}}))}}}();
-Kanboard.Board=function(){function a(a){a.preventDefault();a.stopPropagation();Kanboard.Popover(a,Kanboard.InitAfterAjax)}function c(){return"board_stacking_"+$("#board").data("project-id")}function b(){$(".filter-collapse").hide();$(".task-board-collapsed").show();$(".filter-expand").show();$(".task-board-expanded").hide()}function d(){$(".filter-collapse").show();$(".task-board-collapsed").hide();$(".filter-expand").hide();$(".task-board-expanded").show()}function e(){"expanded"===(Kanboard.GetStorageItem(c())||
-"expanded")?d():b()}function f(){$(".column").sortable({delay:300,distance:5,connectWith:".column",placeholder:"draggable-placeholder",stop:function(a,b){var c=b.item.attr("data-task-id"),d=b.item.parent().attr("data-column-id"),g=b.item.index()+1,m=b.item.parent().attr("data-swimlane-id");clearInterval(l);$.ajax({cache:!1,url:$("#board").attr("data-save-url"),contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({task_id:c,column_id:d,swimlane_id:m,position:g}),success:function(a){$("#board-container").remove();
-$("#main").append(a);Kanboard.InitAfterAjax();f();h();e();j()}})}});$("#board").on("click",".task-board-popover",a);$("#board").on("click",".task-board",function(){window.location=$(this).data("task-url")});$(".task-board-tooltip").tooltip({track:!1,position:{my:"left-20 top",at:"center bottom+9",using:function(a,b){$(this).css(a);var c=b.target.left+b.target.width/2-b.element.left-20;$("<div>").addClass("tooltip-arrow").addClass(b.vertical).addClass(0==c?"align-left":"align-right").appendTo(this)}},
-content:function(){var a=$(this).attr("data-href");if(a){var b=this;$.get(a,function n(a){$(".ui-tooltip-content:visible").html(a);a=$(".ui-tooltip:visible");a.css({top:"",left:""});a.children(".tooltip-arrow").remove();var c=$(b).tooltip("option","position");c.of=$(b);a.position(c);$("#tooltip-subtasks a").not(".popover").click(function(a){a.preventDefault();a.stopPropagation();$(this).hasClass("popover-subtask-restriction")?(Kanboard.OpenPopover($(this).attr("href")),$(b).tooltip("close")):$.get($(this).attr("href"),
-n)})});return'<i class="fa fa-refresh fa-spin fa-2x"></i>'}}}).on("mouseenter",function(){var a=this;$(this).tooltip("open");$(".ui-tooltip").on("mouseleave",function(){$(a).tooltip("close")})}).on("mouseleave focusout",function(a){a.stopImmediatePropagation();var b=this;setTimeout(function(){$(".ui-tooltip:hover").length||$(b).tooltip("close")},100)});var b=parseInt($("#board").attr("data-check-interval"));0<b&&(l=window.setInterval(g,1E3*b))}function g(){Kanboard.IsVisible()&&$.ajax({cache:!1,url:$("#board").attr("data-check-url"),
-statusCode:{200:function(a){$("#board-container").remove();$("#main").append(a);Kanboard.InitAfterAjax();clearInterval(l);f();h();e();j()}}})}function h(){var a=$("#form-user_id").val(),b=$("#form-category_id").val(),c=$("#more-filters option[value=filter-due-date]").is(":selected"),d=$("#more-filters option[value=filter-recent]").is(":selected"),e=$("#board").data("project-id");$("[data-task-id]").each(function(e,g){var h=g.getAttribute("data-owner-id"),f=g.getAttribute("data-due-date"),j=g.getAttribute("data-category-id"),
-k=$(g).hasClass("task-board-recent");g.style.display=h!=a&&-1!=a?"none":"block";if(c&&(""==f||"0"==f))g.style.display="none";j!=b&&-1!=b&&(g.style.display="none");d&&!k&&(g.style.display="none")});Kanboard.SetStorageItem("board_filter_"+e+"_form-user_id",a);Kanboard.SetStorageItem("board_filter_"+e+"_form-category_id",b);Kanboard.SetStorageItem("board_filter_"+e+"_filter-due-date",~~c);Kanboard.SetStorageItem("board_filter_"+e+"_filter-recent",~~d)}function k(){var a=Kanboard.GetStorageItem("horizontal_scroll")||
-1;Kanboard.SetStorageItem("horizontal_scroll",0==a?1:0);j()}function j(){0==Kanboard.GetStorageItem("horizontal_scroll")?($(".filter-wide").show(),$(".filter-compact").hide(),$("#board-container").removeClass("board-container-wide").addClass("board-container-compact"),$("#board th,#board td").removeClass("board-column-wide").addClass("board-column-compact")):($(".filter-wide").hide(),$(".filter-compact").show(),$("#board-container").removeClass("board-container-compact").addClass("board-container-wide"),
-$("#board th,#board td").removeClass("board-column-compact").addClass("board-column-wide"))}var l=null;jQuery(document).ready(function(){if(Kanboard.Exists("board")){f();var a=$("#board").data("project-id");$("#form-user_id").chosen({width:"180px",no_results_text:$("#form-user_id").data("notfound")});$("#form-category_id").chosen({width:"200px",no_results_text:$("#form-category_id").data("notfound")});$("#more-filters").chosen({width:"30%",no_results_text:$("#more-filters").data("notfound")});$(".apply-filters").change(function(){h()});
-$("#form-user_id").val(Kanboard.GetStorageItem("board_filter_"+a+"_form-user_id")||-1);$("#form-user_id").trigger("chosen:updated");$("#form-category_id").val(Kanboard.GetStorageItem("board_filter_"+a+"_form-category_id")||-1);$("#form-category_id").trigger("chosen:updated");+Kanboard.GetStorageItem("board_filter_"+a+"_filter-due-date")&&$("#more-filters option[value=filter-due-date]").attr("selected",!0);+Kanboard.GetStorageItem("board_filter_"+a+"_filter-recent")&&$("#more-filters option[value=filter-recent]").attr("selected",
-!0);$("#more-filters").trigger("chosen:updated");h();$(".filter-expand-link").click(function(a){a.preventDefault();d();Kanboard.SetStorageItem(c(),"expanded")});$(".filter-collapse-link").click(function(a){a.preventDefault();b();Kanboard.SetStorageItem(c(),"collapsed")});e();jQuery(document).on("click",".filter-toggle-scrolling",function(a){a.preventDefault();k()});j();Mousetrap.bind("n",function(){Kanboard.OpenPopover($("#board").data("task-creation-url"),Kanboard.InitAfterAjax)});Mousetrap.bind("s",
-function(){"expanded"===(Kanboard.GetStorageItem(c())||"expanded")?(b(),Kanboard.SetStorageItem(c(),"collapsed")):(d(),Kanboard.SetStorageItem(c(),"expanded"))});Mousetrap.bind("c",function(){k()})}})}();
+selectOtherMonths:!0,dateFormat:"yy-mm-dd",constrainInput:!1});$("#markdown-preview").click(Kanboard.MarkdownPreview);$("#markdown-write").click(Kanboard.MarkdownWriter);$(".auto-select").focus(function(){$(this).select()});$(".dropit-submenu").hide();$(".dropdown").not(".dropit").dropit({triggerParentEl:"span"});$(".task-autocomplete").length&&($(".task-autocomplete").parent().find("input[type=submit]").attr("disabled","disabled"),$(".task-autocomplete").autocomplete({source:$(".task-autocomplete").data("search-url"),
+minLength:2,select:function(a,c){var b=$(".task-autocomplete").data("dst-field");$("input[name="+b+"]").val(c.item.id);$(".task-autocomplete").parent().find("input[type=submit]").removeAttr("disabled")}}))}}}();
+Kanboard.Board=function(){function a(a){a.preventDefault();a.stopPropagation();Kanboard.Popover(a,Kanboard.InitAfterAjax)}function c(){Mousetrap.bind("n",function(){Kanboard.OpenPopover($("#board").data("task-creation-url"),Kanboard.InitAfterAjax)});Mousetrap.bind("s",function(){"expanded"===(Kanboard.GetStorageItem(d())||"expanded")?(e(),Kanboard.SetStorageItem(d(),"collapsed")):(f(),Kanboard.SetStorageItem(d(),"expanded"))});Mousetrap.bind("c",function(){p()})}function b(){$(".filter-expand-link").click(function(a){a.preventDefault();
+f();Kanboard.SetStorageItem(d(),"expanded")});$(".filter-collapse-link").click(function(a){a.preventDefault();e();Kanboard.SetStorageItem(d(),"collapsed")});g()}function d(){return"board_stacking_"+$("#board").data("project-id")}function e(){$(".filter-collapse").hide();$(".task-board-collapsed").show();$(".filter-expand").show();$(".task-board-expanded").hide()}function f(){$(".filter-collapse").show();$(".task-board-collapsed").hide();$(".filter-expand").hide();$(".task-board-expanded").show()}
+function g(){"expanded"===(Kanboard.GetStorageItem(d())||"expanded")?f():e()}function k(){$(".column").sortable({delay:300,distance:5,connectWith:".column",placeholder:"draggable-placeholder",stop:function(a,b){q(b.item.attr("data-task-id"),b.item.parent().attr("data-column-id"),b.item.index()+1,b.item.parent().attr("data-swimlane-id"))}});$("#board").on("click",".task-board-popover",a);$("#board").on("click",".task-board",function(){window.location=$(this).data("task-url")});$(".task-board-tooltip").tooltip({track:!1,
+position:{my:"left-20 top",at:"center bottom+9",using:function(a,b){$(this).css(a);var c=b.target.left+b.target.width/2-b.element.left-20;$("<div>").addClass("tooltip-arrow").addClass(b.vertical).addClass(0==c?"align-left":"align-right").appendTo(this)}},content:function(a){if(a=$(this).attr("data-href")){var b=this;$.get(a,function r(a){$(".ui-tooltip-content:visible").html(a);a=$(".ui-tooltip:visible");a.css({top:"",left:""});a.children(".tooltip-arrow").remove();var c=$(b).tooltip("option","position");
+c.of=$(b);a.position(c);$("#tooltip-subtasks a").not(".popover").click(function(a){a.preventDefault();a.stopPropagation();$(this).hasClass("popover-subtask-restriction")?(Kanboard.OpenPopover($(this).attr("href")),$(b).tooltip("close")):$.get($(this).attr("href"),r)})});return'<i class="fa fa-refresh fa-spin fa-2x"></i>'}}}).on("mouseenter",function(){var a=this;$(this).tooltip("open");$(".ui-tooltip").on("mouseleave",function(){$(a).tooltip("close")})}).on("mouseleave focusout",function(a){a.stopImmediatePropagation();
+var b=this;setTimeout(function(){$(".ui-tooltip:hover").length||$(b).tooltip("close")},100)});var b=parseInt($("#board").attr("data-check-interval"));0<b&&(m=window.setInterval(n,1E3*b))}function q(a,b,c,d){clearInterval(m);$.ajax({cache:!1,url:$("#board").attr("data-save-url"),contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({task_id:a,column_id:b,swimlane_id:d,position:c}),success:function(a){$("#board-container").remove();$("#main").append(a);Kanboard.InitAfterAjax();
+k();h();g();l()}})}function n(){Kanboard.IsVisible()&&$.ajax({cache:!1,url:$("#board").attr("data-check-url"),statusCode:{200:function(a){$("#board-container").remove();$("#main").append(a);Kanboard.InitAfterAjax();clearInterval(m);k();h();g();l()}}})}function h(){var a=$("#form-user_id").val(),b=$("#form-category_id").val(),c=$("#more-filters option[value=filter-due-date]").is(":selected"),d=$("#more-filters option[value=filter-recent]").is(":selected"),e=$("#board").data("project-id");$("[data-task-id]").each(function(e,
+g){var k=g.getAttribute("data-owner-id"),f=g.getAttribute("data-due-date"),n=g.getAttribute("data-category-id"),h=$(g).hasClass("task-board-recent");g.style.display=k!=a&&-1!=a?"none":"block";!c||""!=f&&"0"!=f||(g.style.display="none");n!=b&&-1!=b&&(g.style.display="none");d&&!h&&(g.style.display="none")});Kanboard.SetStorageItem("board_filter_"+e+"_form-user_id",a);Kanboard.SetStorageItem("board_filter_"+e+"_form-category_id",b);Kanboard.SetStorageItem("board_filter_"+e+"_filter-due-date",~~c);Kanboard.SetStorageItem("board_filter_"+
+e+"_filter-recent",~~d)}function t(){var a=$("#board").data("project-id");$("#form-user_id").chosen({width:"180px",no_results_text:$("#form-user_id").data("notfound")});$("#form-category_id").chosen({width:"200px",no_results_text:$("#form-category_id").data("notfound")});$("#more-filters").chosen({width:"30%",no_results_text:$("#more-filters").data("notfound")});$(".apply-filters").change(function(a){h()});$("#form-user_id").val(Kanboard.GetStorageItem("board_filter_"+a+"_form-user_id")||-1);$("#form-user_id").trigger("chosen:updated");
+$("#form-category_id").val(Kanboard.GetStorageItem("board_filter_"+a+"_form-category_id")||-1);$("#form-category_id").trigger("chosen:updated");+Kanboard.GetStorageItem("board_filter_"+a+"_filter-due-date")&&$("#more-filters option[value=filter-due-date]").attr("selected",!0);+Kanboard.GetStorageItem("board_filter_"+a+"_filter-recent")&&$("#more-filters option[value=filter-recent]").attr("selected",!0);$("#more-filters").trigger("chosen:updated");h()}function u(){jQuery(document).on("click",".filter-toggle-scrolling",
+function(a){a.preventDefault();p()});l()}function p(){var a=Kanboard.GetStorageItem("horizontal_scroll")||1;Kanboard.SetStorageItem("horizontal_scroll",0==a?1:0);l()}function l(){0==Kanboard.GetStorageItem("horizontal_scroll")?($(".filter-wide").show(),$(".filter-compact").hide(),$("#board-container").addClass("board-container-compact"),$("#board th").addClass("board-column-compact")):($(".filter-wide").hide(),$(".filter-compact").show(),$("#board-container").removeClass("board-container-compact"),
+$("#board th").removeClass("board-column-compact"))}var m=null;jQuery(document).ready(function(){Kanboard.Exists("board")&&(k(),t(),b(),u(),c())})}();
Kanboard.Calendar=function(){function a(a){var b=$("#calendar").data("save-url")||$("#user-calendar").data("save-url");$.ajax({cache:!1,url:b,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({task_id:a.id,date_due:a.start.format()})})}function c(){var a=$("#user-calendar"),b=a.data("check-url"),c={start:a.fullCalendar("getView").start.format(),end:a.fullCalendar("getView").end.format(),user_id:a.data("user-id")},d;for(d in c)b+="&"+d+"="+c[d];$.getJSON(b,function(b){a.fullCalendar("removeEvents");
a.fullCalendar("addEventSource",b);a.fullCalendar("rerenderEvents")})}function b(a){var b=$("#calendar"),c=b.data("check-url"),d={start:b.fullCalendar("getView").start.format(),end:b.fullCalendar("getView").end.format()};jQuery.extend(d,a);for(var e in d)c+="&"+e+"="+d[e];$.getJSON(c,function(a){b.fullCalendar("removeEvents");b.fullCalendar("addEventSource",a);b.fullCalendar("rerenderEvents")})}function d(){var a=Kanboard.GetStorageItem(f);if(""!==a){var a=JSON.parse(a),c;for(c in a)$("select[name="+
c+"]").val(a[c])}b(a||{});$(".calendar-filter").change(e)}function e(){var a={};$(".calendar-filter").each(function(){a[$(this).attr("name")]=$(this).val()});Kanboard.SetStorageItem(f,JSON.stringify(a));b(a)}var f="";jQuery(document).ready(function(){Kanboard.Exists("calendar")?(f="calendar_filters_"+$("#calendar").data("project-id"),$("#calendar").fullCalendar({lang:$("body").data("js-lang"),editable:!0,eventLimit:!0,defaultView:"month",header:{left:"prev,next today",center:"title",right:"month,agendaWeek,agendaDay"},
diff --git a/assets/js/src/base.js b/assets/js/src/base.js
index 79aa5daa..05846ab8 100644
--- a/assets/js/src/base.js
+++ b/assets/js/src/base.js
@@ -242,9 +242,9 @@ var Kanboard = (function() {
// Dropdown
$(".dropit-submenu").hide();
$('.dropdown').not(".dropit").dropit({ triggerParentEl : "span" });
-
+
if ($(".task-autocomplete").length) {
- $(".task-autocomplete").siblings().find("input[type=submit]").attr('disabled','disabled');
+ $(".task-autocomplete").parent().find("input[type=submit]").attr('disabled','disabled');
$(".task-autocomplete").autocomplete({
source: $(".task-autocomplete").data("search-url"),
@@ -253,7 +253,7 @@ var Kanboard = (function() {
var field = $(".task-autocomplete").data("dst-field");
$("input[name=" + field + "]").val(ui.item.id);
- $(".task-autocomplete").siblings().find("input[type=submit]").removeAttr('disabled');
+ $(".task-autocomplete").parent().find("input[type=submit]").removeAttr('disabled');
}
});
}
diff --git a/assets/js/src/board.js b/assets/js/src/board.js
index 878cb98e..9f93a869 100644
--- a/assets/js/src/board.js
+++ b/assets/js/src/board.js
@@ -384,16 +384,16 @@ Kanboard.Board = (function() {
$(".filter-wide").show();
$(".filter-compact").hide();
- $("#board-container").removeClass("board-container-wide").addClass("board-container-compact");
- $("#board th,#board td").removeClass("board-column-wide").addClass("board-column-compact");
+ $("#board-container").addClass("board-container-compact");
+ $("#board th").addClass("board-column-compact");
}
else {
$(".filter-wide").hide();
$(".filter-compact").show();
- $("#board-container").removeClass("board-container-compact").addClass("board-container-wide");
- $("#board th,#board td").removeClass("board-column-compact").addClass("board-column-wide");
+ $("#board-container").removeClass("board-container-compact");
+ $("#board th").removeClass("board-column-compact");
}
}