From dc9f50a554293bd8d5a8257c241eb8e684bdaf28 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Fri, 25 Mar 2016 18:37:11 -0400 Subject: Sync locales --- app/Locale/pl_PL/translations.php | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) (limited to 'app/Locale/pl_PL/translations.php') diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php index 87201bd0..e5770339 100644 --- a/app/Locale/pl_PL/translations.php +++ b/app/Locale/pl_PL/translations.php @@ -72,7 +72,6 @@ return array( 'All projects' => 'Wszystkie projekty', 'Add a new column' => 'Dodaj nową kolumnę', 'Title' => 'Nazwa', - 'Nobody assigned' => 'Nikt nie przypisany', 'Assigned to %s' => 'Przypisane do %s', 'Remove a column' => 'Usuń kolumnę', 'Remove a column from a board' => 'Usuń kolumnę z tablicy', @@ -166,7 +165,6 @@ return array( 'Task count' => 'Liczba zadań', 'User' => 'Użytkownik', 'Comments' => 'Komentarze', - 'Write your text in Markdown' => 'Zobacz jak formatować tekst z użyciem Markdown', 'Leave a comment' => 'Wstaw komentarz', 'Comment is required' => 'Komentarz jest wymagany', 'Leave a description' => 'Dodaj opis', @@ -432,7 +430,6 @@ return array( 'ISO format is always accepted, example: "%s" and "%s"' => 'Format ISO jest zawsze akceptowany, przykłady: "%s", "%s"', 'New private project' => 'Nowy projekt prywatny', 'This project is private' => 'Ten projekt jest prywatny', - 'Type here to create a new sub-task' => 'Nazwa podzadania', 'Add' => 'Dodaj', 'Start date' => 'Data rozpoczęcia', 'Time estimated' => 'Szacowany czas', @@ -483,9 +480,6 @@ return array( 'Daily project summary export for "%s"' => 'Wygeneruj dzienny raport dla projektu: "%s"', 'Exports' => 'Eksporty', 'This export contains the number of tasks per column grouped per day.' => 'Ten eksport zawiera ilość zadań zgrupowanych w kolumnach na dzień', - 'Nothing to preview...' => 'Nic do podejrzenia...', - 'Preview' => 'Podgląd', - 'Write' => 'Edycja', 'Active swimlanes' => 'Aktywne procesy', 'Add a new swimlane' => 'Dodaj proces', 'Change default swimlane' => 'Zmień domyślny proces', @@ -539,7 +533,6 @@ return array( 'Task age in days' => 'Wiek zadania w dniach', 'Days in this column' => 'Dni w tej kolumnie', // '%dd' => '', - 'Add a link' => 'Dodaj link', 'Add a new link' => 'Dodaj nowy link', 'Do you really want to remove this link: "%s"?' => 'Czy na pewno chcesz usunąć ten link: "%s"?', 'Do you really want to remove this link with task #%d?' => 'Czy na pewno chcesz usunąć ten link razem z zadaniem nr %d?', @@ -749,8 +742,6 @@ return array( 'My activity stream' => 'Moja aktywność', 'My calendar' => 'Mój kalendarz', 'Search tasks' => 'Szukaj zadań', - 'Back to the calendar' => 'Wróć do kalendarza', - 'Filters' => 'Filtry', 'Reset filters' => 'Resetuj zastosowane filtry', 'My tasks due tomorrow' => 'Moje zadania do jutra', 'Tasks due today' => 'Zadania do dzisiaj', @@ -902,7 +893,6 @@ return array( // 'Shared' => '', 'Owner' => 'Właściciel', 'Unread notifications' => 'Nieprzeczytane powiadomienia', - 'My filters' => 'Moje filtry', 'Notification methods:' => 'Metody powiadomień:', // 'Import tasks from CSV file' => '', // 'Unable to read your file' => '', @@ -1049,7 +1039,6 @@ return array( // 'Close a task when there is no activity' => '', // 'Duration in days' => '', // 'Send email when there is no activity on a task' => '', - // 'List of external links' => '', // 'Unable to fetch link information.' => '', // 'Daily background job for tasks' => '', 'Auto' => 'Automatyczny', @@ -1067,9 +1056,7 @@ return array( 'External link' => 'Link zewnętrzny', 'Copy and paste your link here...' => 'Skopiuj i wklej link tutaj ...', // 'URL' => '', - 'There is no external link for the moment.' => 'Brak linków zewnętrznych.', 'Internal links' => 'Linki do innych zadań', - 'There is no internal link for the moment.' => 'Brak powiązań do innych zadań.', // 'Assign to me' => '', 'Me' => 'JA', 'Do not duplicate anything' => 'Nie kopiuj żadnego projektu', @@ -1077,7 +1064,6 @@ return array( 'Users management' => 'Zarządzanie użytkownikami', 'Groups management' => 'Zarządzanie grupami', 'Create from another project' => 'Utwórz na podstawie innego projektu', - 'There is no subtask at the moment.' => 'Brak podzadań.', 'open' => 'otwarty', 'closed' => 'zamknięty', 'Priority:' => 'Priorytet:', @@ -1096,7 +1082,6 @@ return array( 'Started:' => 'Rozpoczęte:', 'Moved:' => 'Przesunięcie:', 'Task #%d' => 'Zadanie #%d', - 'Sub-tasks' => 'Podzadania', // 'Date and time format' => '', // 'Time format' => '', // 'Start date: ' => '', @@ -1137,7 +1122,6 @@ return array( // 'User filters' => '', // 'Category filters' => '', 'Upload a file' => 'Prześlij plik', - 'There is no attachment at the moment.' => 'Brak załączników.', 'View file' => 'Wyświetl plik', 'Last activity' => 'Ostatnia aktywność', // 'Change subtask position' => '', @@ -1151,4 +1135,18 @@ return array( // 'There is no action at the moment.' => '', // 'Import actions from another project' => '', // 'There is no available project.' => '', + // 'Local File' => '', + // 'Configuration' => '', + // 'PHP version:' => '', + // 'PHP SAPI:' => '', + // 'OS version:' => '', + // 'Database version:' => '', + // 'Browser:' => '', + // 'Task view' => '', + // 'Edit task' => '', + // 'Edit description' => '', + // 'New internal link' => '', + // 'Display list of keyboard shortcuts' => '', + // 'Menu' => '', + // 'Set start date' => '', ); -- cgit v1.2.3 From d9dd35472667b09f16d34baec31790c5524d5956 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sat, 26 Mar 2016 20:00:22 -0400 Subject: Sync locales --- app/Locale/bs_BA/translations.php | 7 +++++-- app/Locale/cs_CZ/translations.php | 7 +++++-- app/Locale/da_DK/translations.php | 7 +++++-- app/Locale/de_DE/translations.php | 7 +++++-- app/Locale/el_GR/translations.php | 7 +++++-- app/Locale/es_ES/translations.php | 7 +++++-- app/Locale/fi_FI/translations.php | 7 +++++-- app/Locale/fr_FR/translations.php | 6 +++--- app/Locale/hu_HU/translations.php | 7 +++++-- app/Locale/id_ID/translations.php | 7 +++++-- app/Locale/it_IT/translations.php | 7 +++++-- app/Locale/ja_JP/translations.php | 7 +++++-- app/Locale/my_MY/translations.php | 7 +++++-- app/Locale/nb_NO/translations.php | 7 +++++-- app/Locale/nl_NL/translations.php | 7 +++++-- app/Locale/pl_PL/translations.php | 7 +++++-- app/Locale/pt_BR/translations.php | 7 +++++-- app/Locale/pt_PT/translations.php | 7 +++++-- app/Locale/ru_RU/translations.php | 7 +++++-- app/Locale/sr_Latn_RS/translations.php | 7 +++++-- app/Locale/sv_SE/translations.php | 7 +++++-- app/Locale/th_TH/translations.php | 7 +++++-- app/Locale/tr_TR/translations.php | 7 +++++-- app/Locale/zh_CN/translations.php | 7 +++++-- 24 files changed, 118 insertions(+), 49 deletions(-) (limited to 'app/Locale/pl_PL/translations.php') diff --git a/app/Locale/bs_BA/translations.php b/app/Locale/bs_BA/translations.php index 7499f765..8d653d4f 100644 --- a/app/Locale/bs_BA/translations.php +++ b/app/Locale/bs_BA/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Praćenje vremena:', 'New sub-task' => 'Novi pod-zadatak', 'New attachment added "%s"' => 'Ubačen novi prilog "%s"', - 'Comment updated' => 'Komentar ažuriran', 'New comment posted by %s' => '%s ostavio novi komentar', 'New attachment' => 'Novi prilog', 'New comment' => 'Novi komentar', + 'Comment updated' => 'Komentar ažuriran', 'New subtask' => 'Novi pod-zadatak', 'Subtask updated' => 'Pod-zadatak ažuriran', 'Task updated' => 'Zadatak ažuriran', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Datum završetka:', 'There is no start date or end date for this project.' => 'Nema početnog ili krajnjeg datuma za ovaj projekat.', 'Projects Gantt chart' => 'Gantogram projekata', - 'Link type' => 'Tip veze', 'Change task color when using a specific task link' => 'Promijeni boju zadatka kada se koristi određena veza na zadatku', 'Task link creation or modification' => 'Veza na zadatku je napravljena ili izmijenjena', 'Milestone' => 'Prekretnica', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => 'Korisničko ime mora biti malim slovima i jedinstveno', 'Passwords will be encrypted if present' => 'Šifra će biti kriptovana', '%s attached a new file to the task %s' => '%s je dodano novi fajl u zadatak %s', + 'Link type' => 'Tip veze', 'Assign automatically a category based on a link' => 'Automatsko pridruživanje kategorije bazirano na vezi', 'BAM - Konvertible Mark' => 'BAM - Konvertibilna marka', 'Assignee Username' => 'Pridruži korisničko ime', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/cs_CZ/translations.php b/app/Locale/cs_CZ/translations.php index 8331d055..3606eddf 100644 --- a/app/Locale/cs_CZ/translations.php +++ b/app/Locale/cs_CZ/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Sledování času:', 'New sub-task' => 'Nový dílčí úkol', 'New attachment added "%s"' => 'Byla přidána nová příloha "%s".', - 'Comment updated' => 'Komentář byl aktualizován.', 'New comment posted by %s' => 'Nový komentář publikovaný uživatelem %s', 'New attachment' => 'Nová příloha', 'New comment' => 'Nový komentář', + 'Comment updated' => 'Komentář byl aktualizován.', 'New subtask' => 'Nový dílčí úkol', 'Subtask updated' => 'Dílčí úkol byl aktualizován', 'Task updated' => 'Úkol byl aktualizován', @@ -841,7 +841,6 @@ return array( // 'End date:' => '', // 'There is no start date or end date for this project.' => '', // 'Projects Gantt chart' => '', - // 'Link type' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + // 'Link type' => '', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php index 354666a8..cf3f0191 100644 --- a/app/Locale/da_DK/translations.php +++ b/app/Locale/da_DK/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Tidsmåling:', 'New sub-task' => 'Ny under-opgave', 'New attachment added "%s"' => 'Ny vedhæftning tilføjet "%s"', - 'Comment updated' => 'Kommentar opdateret', 'New comment posted by %s' => 'Ny kommentar af %s', // 'New attachment' => '', // 'New comment' => '', + 'Comment updated' => 'Kommentar opdateret', // 'New subtask' => '', // 'Subtask updated' => '', // 'Task updated' => '', @@ -841,7 +841,6 @@ return array( // 'End date:' => '', // 'There is no start date or end date for this project.' => '', // 'Projects Gantt chart' => '', - // 'Link type' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + // 'Link type' => '', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php index 1cd8c07b..1090d6c9 100644 --- a/app/Locale/de_DE/translations.php +++ b/app/Locale/de_DE/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Zeittracking', 'New sub-task' => 'Neue Teilaufgabe', 'New attachment added "%s"' => 'Neuer Anhang "%s" wurde hinzugefügt.', - 'Comment updated' => 'Kommentar wurde aktualisiert', 'New comment posted by %s' => 'Neuer Kommentar verfasst durch %s', 'New attachment' => 'Neuer Anhang', 'New comment' => 'Neuer Kommentar', + 'Comment updated' => 'Kommentar wurde aktualisiert', 'New subtask' => 'Neue Teilaufgabe', 'Subtask updated' => 'Teilaufgabe aktualisiert', 'Task updated' => 'Aufgabe aktualisiert', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Endedatum:', 'There is no start date or end date for this project.' => 'Es gibt kein Startdatum oder Endedatum für dieses Projekt', 'Projects Gantt chart' => 'Projekt Gantt Diagramm', - 'Link type' => 'Verbindungstyp', 'Change task color when using a specific task link' => 'Aufgabefarbe ändern bei bestimmter Aufgabenverbindung', 'Task link creation or modification' => 'Aufgabenverbindung erstellen oder bearbeiten', 'Milestone' => 'Meilenstein', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => 'Benutzernamen müssen in Kleinbuschstaben und eindeutig sein', 'Passwords will be encrypted if present' => 'Passwörter werden verschlüsselt wenn vorhanden', '%s attached a new file to the task %s' => '%s hat eine neue Datei zur Aufgabe %s hinzufgefügt', + 'Link type' => 'Verbindungstyp', 'Assign automatically a category based on a link' => 'Linkbasiert eine Kategorie automatisch zuordnen', 'BAM - Konvertible Mark' => 'BAM - Konvertible Mark', 'Assignee Username' => 'Benutzername des Zuständigen', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/el_GR/translations.php b/app/Locale/el_GR/translations.php index ac0622dd..04efa7e7 100644 --- a/app/Locale/el_GR/translations.php +++ b/app/Locale/el_GR/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Παρακολούθηση του χρόνου:', 'New sub-task' => 'Νέα υπο-εργασία', 'New attachment added "%s"' => 'Νέα επικόλληση προστέθηκε « %s »', - 'Comment updated' => 'Το σχόλιο ενημερώθηκε', 'New comment posted by %s' => 'Νέο σχόλιο από τον χρήστη « %s »', 'New attachment' => 'New attachment', 'New comment' => 'Νέο σχόλιο', + 'Comment updated' => 'Το σχόλιο ενημερώθηκε', 'New subtask' => 'Νέα υπο-εργασία', 'Subtask updated' => 'Η Υπο-Εργασία ενημερώθηκε', 'Task updated' => 'Η εργασία ενημερώθηκε', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Ημερομηνία λήξης :', 'There is no start date or end date for this project.' => 'Δεν υπάρχει ημερομηνία έναρξης ή λήξης για το έργο αυτό.', 'Projects Gantt chart' => 'Διάγραμμα Gantt έργων', - 'Link type' => 'Τύπος συνδέσμου', 'Change task color when using a specific task link' => 'Αλλαγή χρώματος εργασίας χρησιμοποιώντας συγκεκριμένο σύνδεσμο εργασίας', 'Task link creation or modification' => 'Σύνδεσμος δημιουργίας ή τροποποίησης εργασίας', 'Milestone' => 'Ορόσημο', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => 'Οι ονομασίες χρηστών πρέπει να είναι σε μικρά γράμματα (lowercase) και μοναδικά', 'Passwords will be encrypted if present' => 'Οι κωδικοί πρόσβασης κρυπτογραφούνται, αν υπάρχουν', '%s attached a new file to the task %s' => '%s νέο συνημμένο αρχείο της εργασίας %s', + 'Link type' => 'Τύπος συνδέσμου', 'Assign automatically a category based on a link' => 'Ανατίθεται αυτόματα κατηγορία, βασισμένη στον σύνδεσμο', 'BAM - Konvertible Mark' => 'BAM - Konvertible Mark', 'Assignee Username' => 'Δικαιοδόχο όνομα χρήστη', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php index 79871279..477f3655 100644 --- a/app/Locale/es_ES/translations.php +++ b/app/Locale/es_ES/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Control de tiempo:', 'New sub-task' => 'Nueva subtarea', 'New attachment added "%s"' => 'Nuevo adjunto agregado "%s"', - 'Comment updated' => 'Comentario actualizado', 'New comment posted by %s' => 'Nuevo comentario agregado por %s', 'New attachment' => 'Nuevo adjunto', 'New comment' => 'Nuevo comentario', + 'Comment updated' => 'Comentario actualizado', 'New subtask' => 'Nueva subtarea', 'Subtask updated' => 'Subtarea actualizada', 'Task updated' => 'Tarea actualizada', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Fecha final', 'There is no start date or end date for this project.' => 'No existe fecha de inicio o de fin para este proyecto.', 'Projects Gantt chart' => 'Diagramas de Gantt de los proyectos', - 'Link type' => 'Tipo de enlace', 'Change task color when using a specific task link' => 'Cambiar colo de la tarea al usar un enlace específico a tarea', 'Task link creation or modification' => 'Creación o modificación de enlace a tarea', 'Milestone' => 'Hito', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => 'Los nombres de usuario deben ser únicos y contener sólo minúsculas', 'Passwords will be encrypted if present' => 'Las contraseñas serán cifradas si es que existen', '%s attached a new file to the task %s' => '%s adjuntó un nuevo archivo a la tarea %s', + 'Link type' => 'Tipo de enlace', 'Assign automatically a category based on a link' => 'Asignar una categoría automáticamente basado en un enlace', 'BAM - Konvertible Mark' => 'BAM - marco convertible', 'Assignee Username' => 'Nombre de usuario del concesionario', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php index 34ca00ac..a32082e3 100644 --- a/app/Locale/fi_FI/translations.php +++ b/app/Locale/fi_FI/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Ajan seuranta:', 'New sub-task' => 'Uusi alitehtävä', 'New attachment added "%s"' => 'Uusi liite lisätty "%s"', - 'Comment updated' => 'Kommentti päivitetty', 'New comment posted by %s' => '%s lisäsi uuden kommentin', // 'New attachment' => '', // 'New comment' => '', + 'Comment updated' => 'Kommentti päivitetty', // 'New subtask' => '', // 'Subtask updated' => '', // 'Task updated' => '', @@ -841,7 +841,6 @@ return array( // 'End date:' => '', // 'There is no start date or end date for this project.' => '', // 'Projects Gantt chart' => '', - // 'Link type' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + // 'Link type' => '', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/fr_FR/translations.php b/app/Locale/fr_FR/translations.php index b3746bd2..00e64876 100644 --- a/app/Locale/fr_FR/translations.php +++ b/app/Locale/fr_FR/translations.php @@ -327,14 +327,12 @@ return array( 'Time tracking:' => 'Gestion du temps :', 'New sub-task' => 'Nouvelle sous-tâche', 'New attachment added "%s"' => 'Nouvelle pièce-jointe ajoutée « %s »', - 'Comment updated' => 'Commentaire ajouté', 'New comment posted by %s' => 'Nouveau commentaire ajouté par « %s »', 'New attachment' => 'Nouveau document', 'New comment' => 'Nouveau commentaire', 'Comment updated' => 'Commentaire mis à jour', 'New subtask' => 'Nouvelle sous-tâche', 'Subtask updated' => 'Sous-tâche mise à jour', - 'New task' => 'Nouvelle tâche', 'Task updated' => 'Tâche mise à jour', 'Task closed' => 'Tâche fermée', 'Task opened' => 'Tâche ouverte', @@ -843,7 +841,6 @@ return array( 'End date:' => 'Date de fin :', 'There is no start date or end date for this project.' => 'Il n\'y a pas de date de début ou de date de fin pour ce projet.', 'Projects Gantt chart' => 'Diagramme de Gantt des projets', - 'Link type' => 'Type de lien', 'Change task color when using a specific task link' => 'Changer la couleur de la tâche lorsqu\'un lien spécifique est utilisé', 'Task link creation or modification' => 'Création ou modification d\'un lien sur une tâche', 'Milestone' => 'Étape importante', @@ -1152,4 +1149,7 @@ return array( 'Display list of keyboard shortcuts' => 'Afficher la liste des raccourcis claviers', 'Menu' => 'Menu', 'Set start date' => 'Définir la date de début', + 'Avatar' => 'Avatar', + 'Upload my avatar image' => 'Uploader mon image d\'avatar', + 'Remove my image' => 'Supprimer mon image', ); diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php index a0037848..f2e1cafb 100644 --- a/app/Locale/hu_HU/translations.php +++ b/app/Locale/hu_HU/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Idő követés:', 'New sub-task' => 'Új részfeladat', 'New attachment added "%s"' => 'Új melléklet "%s" hozzáadva.', - 'Comment updated' => 'Megjegyzés frissítve', 'New comment posted by %s' => 'Új megjegyzés %s', 'New attachment' => 'Új melléklet', 'New comment' => 'Új megjegyzés', + 'Comment updated' => 'Megjegyzés frissítve', 'New subtask' => 'Új részfeladat', 'Subtask updated' => 'Részfeladat frissítve', 'Task updated' => 'Feladat frissítve', @@ -841,7 +841,6 @@ return array( // 'End date:' => '', // 'There is no start date or end date for this project.' => '', // 'Projects Gantt chart' => '', - // 'Link type' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + // 'Link type' => '', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/id_ID/translations.php b/app/Locale/id_ID/translations.php index 320a5e01..8d279633 100644 --- a/app/Locale/id_ID/translations.php +++ b/app/Locale/id_ID/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Pelacakan waktu :', 'New sub-task' => 'Sub-tugas baru', 'New attachment added "%s"' => 'Lampiran baru ditambahkan « %s »', - 'Comment updated' => 'Komentar diperbaharui', 'New comment posted by %s' => 'Komentar baru ditambahkan oleh « %s »', 'New attachment' => 'Lampirkan baru', 'New comment' => 'Komentar baru', + 'Comment updated' => 'Komentar diperbaharui', 'New subtask' => 'Sub-tugas baru', 'Subtask updated' => 'Sub-tugas diperbaharui', 'Task updated' => 'Tugas diperbaharui', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Waktu berakhir :', 'There is no start date or end date for this project.' => 'Tidak ada waktu mulai atau waktu berakhir untuk proyek ini', 'Projects Gantt chart' => 'Proyek grafik Gantt', - 'Link type' => 'Tipe tautan', 'Change task color when using a specific task link' => 'Rubah warna tugas ketika menggunakan tautan tugas yang spesifik', 'Task link creation or modification' => 'Tautan pembuatan atau modifikasi tugas ', 'Milestone' => 'Milestone', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + 'Link type' => 'Tipe tautan', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/it_IT/translations.php b/app/Locale/it_IT/translations.php index e2895fd3..87327462 100644 --- a/app/Locale/it_IT/translations.php +++ b/app/Locale/it_IT/translations.php @@ -327,10 +327,10 @@ return array( // 'Time tracking:' => '', 'New sub-task' => 'Nuovo sotto-task', 'New attachment added "%s"' => 'Nuovo allegato aggiunto "%s"', - 'Comment updated' => 'Commento aggiornato', 'New comment posted by %s' => 'Nuovo commento aggiunto da "%s"', 'New attachment' => 'Nuovo allegato', 'New comment' => 'Nuovo commento', + 'Comment updated' => 'Commento aggiornato', 'New subtask' => 'Nuovo sotto-task', 'Subtask updated' => 'Sotto-task aggiornato', 'Task updated' => 'Task aggiornato', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Data di fine:', 'There is no start date or end date for this project.' => 'Non è prevista una data di inzio o fine per questo progetto.', 'Projects Gantt chart' => 'Grafico Gantt dei progetti', - 'Link type' => 'Tipo di link', 'Change task color when using a specific task link' => 'Cambia colore del task quando si un utilizza una determinata relazione di task', 'Task link creation or modification' => 'Creazione o modifica di relazione di task', // 'Milestone' => '', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => 'I nomi utente devono essere in minuscolo e univoci', 'Passwords will be encrypted if present' => 'Se presenti, le password verranno criptate', '%s attached a new file to the task %s' => '%s ha allegato un nuovo file al task %s', + 'Link type' => 'Tipo di link', 'Assign automatically a category based on a link' => 'Assegna automaticamente una categoria sulla base di una relazione', 'BAM - Konvertible Mark' => 'BAM - Marco bosniaco', 'Assignee Username' => 'Nome utente dell\'assegnatario', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php index 44ee836a..aa8cc654 100644 --- a/app/Locale/ja_JP/translations.php +++ b/app/Locale/ja_JP/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => '時間計測:', 'New sub-task' => '新しいサブタスク', 'New attachment added "%s"' => '添付ファイル「%s」が追加されました', - 'Comment updated' => 'コメントが更新されました', 'New comment posted by %s' => '「%s」の新しいコメントが追加されました', 'New attachment' => '新しい添付ファイル', 'New comment' => '新しいコメント', + 'Comment updated' => 'コメントが更新されました', 'New subtask' => '新しいサブタスク', 'Subtask updated' => 'サブタスクの更新', 'Task updated' => 'タスクの更新', @@ -841,7 +841,6 @@ return array( // 'End date:' => '', // 'There is no start date or end date for this project.' => '', // 'Projects Gantt chart' => '', - // 'Link type' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + // 'Link type' => '', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/my_MY/translations.php b/app/Locale/my_MY/translations.php index 416a9065..be41c19c 100644 --- a/app/Locale/my_MY/translations.php +++ b/app/Locale/my_MY/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Pelacakan waktu :', 'New sub-task' => 'Sub-tugas baru', 'New attachment added "%s"' => 'Lampiran baru ditambahkan « %s »', - 'Comment updated' => 'Komentar diperbaharui', 'New comment posted by %s' => 'Komentar baru ditambahkan oleh « %s »', 'New attachment' => 'Lampirkan baru', 'New comment' => 'Komentar baru', + 'Comment updated' => 'Komentar diperbaharui', 'New subtask' => 'Sub-tugas baru', 'Subtask updated' => 'Sub-tugas diperbaharui', 'Task updated' => 'Tugas diperbaharui', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Waktu berakhir :', 'There is no start date or end date for this project.' => 'Tidak ada waktu mula atau waktu berakhir pada projek ini', 'Projects Gantt chart' => 'projekkan carta Gantt', - 'Link type' => 'Jenis pautan', 'Change task color when using a specific task link' => 'Rubah warna tugas ketika menggunakan Pautan tugas yang spesifik', 'Task link creation or modification' => 'Pautan tugas pada penciptaan atau penyuntingan', 'Milestone' => 'Batu Tanda', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + 'Link type' => 'Jenis pautan', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/nb_NO/translations.php b/app/Locale/nb_NO/translations.php index 347d5264..0e214cf4 100644 --- a/app/Locale/nb_NO/translations.php +++ b/app/Locale/nb_NO/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Tidsmåling:', 'New sub-task' => 'Ny deloppgave', 'New attachment added "%s"' => 'Nytt vedlegg er lagt tilet "%s"', - 'Comment updated' => 'Kommentar oppdatert', 'New comment posted by %s' => 'Ny kommentar fra %s', 'New attachment' => 'Nytt vedlegg', 'New comment' => 'Ny kommentar', + 'Comment updated' => 'Kommentar oppdatert', 'New subtask' => 'Ny deloppgave', 'Subtask updated' => 'Deloppgave oppdatert', 'Task updated' => 'Oppgave oppdatert', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Sluttdato:', // 'There is no start date or end date for this project.' => '', 'Projects Gantt chart' => 'Gantt skjema for prosjekter', - 'Link type' => 'Relasjonstype', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', 'Milestone' => 'Milepæl', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + 'Link type' => 'Relasjonstype', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php index 5c35d960..dc68eb34 100644 --- a/app/Locale/nl_NL/translations.php +++ b/app/Locale/nl_NL/translations.php @@ -327,10 +327,10 @@ return array( '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 »', 'New attachment' => 'Nieuwe bijlage', 'New comment' => 'Nieuw commentaar', + 'Comment updated' => 'Commentaar aangepast', 'New subtask' => 'Nieuwe subtaak', 'Subtask updated' => 'Subtaak aangepast', 'Task updated' => 'Taak aangepast', @@ -841,7 +841,6 @@ return array( // 'End date:' => '', // 'There is no start date or end date for this project.' => '', // 'Projects Gantt chart' => '', - // 'Link type' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', 'Milestone' => 'Mijlpaal', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + // 'Link type' => '', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php index e5770339..0d020dcb 100644 --- a/app/Locale/pl_PL/translations.php +++ b/app/Locale/pl_PL/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Śledzenie czasu: ', 'New sub-task' => 'Nowe Pod-zadanie', 'New attachment added "%s"' => 'Nowy załącznik dodany "%s"', - 'Comment updated' => 'Komentarz zaktualizowany', 'New comment posted by %s' => 'Nowy komentarz dodany przez %s', 'New attachment' => 'Nowy załącznik', 'New comment' => 'Nowy Komentarz', + 'Comment updated' => 'Komentarz zaktualizowany', 'New subtask' => 'Nowe pod-zadanie', 'Subtask updated' => 'Zaktualizowane pod-zadanie', 'Task updated' => 'Zaktualizowane zadanie', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Data zakończenia:', 'There is no start date or end date for this project.' => 'Nie zdefiniowano czasu trwania projektu', 'Projects Gantt chart' => 'Wykres Gantta dla projektów', - 'Link type' => 'Rodzaj link\'u', 'Change task color when using a specific task link' => 'Zmień kolor zadania używając specjalnego adresu URL', 'Task link creation or modification' => 'Adres URL do utworzenia zadania lub modyfikacji', 'Milestone' => 'Kamień milowy', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + 'Link type' => 'Rodzaj link\'u', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php index b174ec2e..ebed08cd 100644 --- a/app/Locale/pt_BR/translations.php +++ b/app/Locale/pt_BR/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Controle de tempo:', 'New sub-task' => 'Nova subtarefa', 'New attachment added "%s"' => 'Novo anexo adicionado "%s"', - 'Comment updated' => 'Comentário atualizado', 'New comment posted by %s' => 'Novo comentário postado por %s', 'New attachment' => 'Novo anexo', 'New comment' => 'Novo comentário', + 'Comment updated' => 'Comentário atualizado', 'New subtask' => 'Nova subtarefa', 'Subtask updated' => 'Subtarefa alterada', 'Task updated' => 'Tarefa alterada', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Data de término:', 'There is no start date or end date for this project.' => 'Não há data de início ou data de término para este projeto.', 'Projects Gantt chart' => 'Gráfico de Gantt dos projetos', - 'Link type' => 'Tipo de link', 'Change task color when using a specific task link' => 'Mudar a cor da tarefa quando um link específico é utilizado', 'Task link creation or modification' => 'Criação ou modificação de um link em uma tarefa', 'Milestone' => 'Milestone', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => 'Nomes de usuário devem ser únicos e em letras minúsculas', 'Passwords will be encrypted if present' => 'Senhas serão encriptadas, se presentes', '%s attached a new file to the task %s' => '%s anexou um novo arquivo a tarefa %s', + 'Link type' => 'Tipo de link', 'Assign automatically a category based on a link' => 'Atribuir automaticamente uma categoria baseada num link', 'BAM - Konvertible Mark' => 'BAM - Mark conversível', 'Assignee Username' => 'Usuário designado', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/pt_PT/translations.php b/app/Locale/pt_PT/translations.php index f6991e96..4d2d20b4 100644 --- a/app/Locale/pt_PT/translations.php +++ b/app/Locale/pt_PT/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Controle de tempo:', 'New sub-task' => 'Nova subtarefa', 'New attachment added "%s"' => 'Novo anexo adicionado "%s"', - 'Comment updated' => 'Comentário actualizado', 'New comment posted by %s' => 'Novo comentário por %s', 'New attachment' => 'Novo anexo', 'New comment' => 'Novo comentário', + 'Comment updated' => 'Comentário actualizado', 'New subtask' => 'Nova subtarefa', 'Subtask updated' => 'Subtarefa alterada', 'Task updated' => 'Tarefa alterada', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Data de fim:', 'There is no start date or end date for this project.' => 'Não existe data de inicio ou fim para este projecto.', 'Projects Gantt chart' => 'Gráfico de Gantt dos projectos', - 'Link type' => 'Tipo de ligação', 'Change task color when using a specific task link' => 'Alterar cor da tarefa quando se usar um tipo especifico de ligação de tarefa', 'Task link creation or modification' => 'Criação ou modificação de ligação de tarefa', 'Milestone' => 'Objectivo', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => 'Utilizadores tem de estar em letra pequena e ser unicos', 'Passwords will be encrypted if present' => 'Senhas serão encriptadas se presentes', '%s attached a new file to the task %s' => '%s anexou um novo ficheiro à tarefa %s', + 'Link type' => 'Tipo de ligação', 'Assign automatically a category based on a link' => 'Assignar automáticamente a categoria baseada num link', 'BAM - Konvertible Mark' => 'BAM - Marca Conversível', 'Assignee Username' => 'Utilizador do Assignado', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php index 67e1a29e..1d93b3f3 100644 --- a/app/Locale/ru_RU/translations.php +++ b/app/Locale/ru_RU/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Отслеживание времени:', 'New sub-task' => 'Новая подзадача', 'New attachment added "%s"' => 'Добавлено вложение « %s »', - 'Comment updated' => 'Комментарий обновлен', 'New comment posted by %s' => 'Новый комментарий написан « %s »', 'New attachment' => 'Новое вложение', 'New comment' => 'Новый комментарий', + 'Comment updated' => 'Комментарий обновлен', 'New subtask' => 'Новая подзадача', 'Subtask updated' => 'Подзадача обновлена', 'Task updated' => 'Задача обновлена', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Дата завершения:', 'There is no start date or end date for this project.' => 'В проекте не указаны дата начала или завершения.', 'Projects Gantt chart' => 'Диаграмма Ганта проектов', - 'Link type' => 'Тип ссылки', 'Change task color when using a specific task link' => 'Изменение цвета задач при использовании ссылки на определенные задачи', 'Task link creation or modification' => 'Ссылка на создание или модификацию задачи', 'Milestone' => 'Веха', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => 'Логины пользователей должны быть строчными и уникальными', 'Passwords will be encrypted if present' => 'Пароли будут зашифрованы (если указаны)', '%s attached a new file to the task %s' => '%s добавил новый файл к задаче %s', + 'Link type' => 'Тип ссылки', 'Assign automatically a category based on a link' => 'Автоматически назначать категории на основе ссылки', 'BAM - Konvertible Mark' => 'BAM - Конвертируемая марка', 'Assignee Username' => 'Логин назначенного', @@ -1149,4 +1149,7 @@ return array( 'Display list of keyboard shortcuts' => 'Показать список клавиатурных сокращений', 'Menu' => 'Меню', 'Set start date' => 'Установить дату начала', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php index 9b7d47c6..634f6f8c 100644 --- a/app/Locale/sr_Latn_RS/translations.php +++ b/app/Locale/sr_Latn_RS/translations.php @@ -327,10 +327,10 @@ return array( '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', // 'New attachment' => '', // 'New comment' => '', + 'Comment updated' => 'Komentar izmenjen', // 'New subtask' => '', // 'Subtask updated' => '', // 'Task updated' => '', @@ -841,7 +841,6 @@ return array( // 'End date:' => '', // 'There is no start date or end date for this project.' => '', // 'Projects Gantt chart' => '', - // 'Link type' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + // 'Link type' => '', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php index 4fe9468a..4dcc63ad 100644 --- a/app/Locale/sv_SE/translations.php +++ b/app/Locale/sv_SE/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Tidsspårning', 'New sub-task' => 'Ny deluppgift', 'New attachment added "%s"' => 'Ny bifogning tillagd "%s"', - 'Comment updated' => 'Kommentaren har uppdaterats', 'New comment posted by %s' => 'Ny kommentar postad av %s', 'New attachment' => 'Ny bifogning', 'New comment' => 'Ny kommentar', + 'Comment updated' => 'Kommentaren har uppdaterats', 'New subtask' => 'Ny deluppgift', 'Subtask updated' => 'Deluppgiften har uppdaterats', 'Task updated' => 'Uppgiften har uppdaterats', @@ -841,7 +841,6 @@ return array( // 'End date:' => '', // 'There is no start date or end date for this project.' => '', // 'Projects Gantt chart' => '', - // 'Link type' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', @@ -930,6 +929,7 @@ return array( // 'Usernames must be lowercase and unique' => '', // 'Passwords will be encrypted if present' => '', // '%s attached a new file to the task %s' => '', + // 'Link type' => '', // 'Assign automatically a category based on a link' => '', // 'BAM - Konvertible Mark' => '', // 'Assignee Username' => '', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php index 28726fa1..a81bef73 100644 --- a/app/Locale/th_TH/translations.php +++ b/app/Locale/th_TH/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'การติดตามเวลา:', 'New sub-task' => 'งานย่อยใหม่', 'New attachment added "%s"' => 'เพิ่มการแนบใหม่ "%s"', - 'Comment updated' => 'ปรับปรุงความคิดเห็น', 'New comment posted by %s' => 'ความคิดเห็นใหม่จาก %s', 'New attachment' => 'การแนบใหม่', 'New comment' => 'ความคิดเห็นใหม่', + 'Comment updated' => 'ปรับปรุงความคิดเห็น', 'New subtask' => 'งานย่อยใหม่', 'Subtask updated' => 'ปรับปรุงงานย่อยแล้ว', 'Task updated' => 'ปรับปรุงงานแล้ว', @@ -841,7 +841,6 @@ return array( 'End date:' => 'วันที่จบ:', 'There is no start date or end date for this project.' => 'ไม่มีวันที่เริ่มหรือวันที่จบของโปรเจคนี้', 'Projects Gantt chart' => 'แผนภูมิแกรน์ของโปรเจค', - 'Link type' => 'ประเภทลิงค์', 'Change task color when using a specific task link' => 'เปลี่ยนสีงานเมื่อมีการใช้การเชื่อมโยงงาน', 'Task link creation or modification' => 'การสร้างการเชื่อมโยงงานหรือการปรับเปลี่ยน', 'Milestone' => 'ขั้น', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => 'ชื่อผู้ใช้ต้องเป็นตัวพิมพ์เล็กและไม่ซ้ำ', // 'Passwords will be encrypted if present' => '', '%s attached a new file to the task %s' => '%s แนบไฟล์ใหม่ในงาน %s', + 'Link type' => 'ประเภทลิงค์', 'Assign automatically a category based on a link' => 'กำหนดหมวดอัตโนมัติตามลิงค์', // 'BAM - Konvertible Mark' => '', 'Assignee Username' => 'กำหนดชื่อผู้ใช้', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php index e294ac6e..9a5380d2 100644 --- a/app/Locale/tr_TR/translations.php +++ b/app/Locale/tr_TR/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => 'Zaman takibi', 'New sub-task' => 'Yeni alt görev', 'New attachment added "%s"' => 'Yeni dosya "%s" eklendi.', - 'Comment updated' => 'Yorum güncellendi', 'New comment posted by %s' => '%s tarafından yeni yorum eklendi', 'New attachment' => 'Yeni dosya eki', 'New comment' => 'Yeni yorum', + 'Comment updated' => 'Yorum güncellendi', 'New subtask' => 'Yeni alt görev', 'Subtask updated' => 'Alt görev güncellendi', 'Task updated' => 'Görev güncellendi', @@ -841,7 +841,6 @@ return array( 'End date:' => 'Bitiş tarihi:', 'There is no start date or end date for this project.' => 'Bu proje için başlangıç veya bitiş tarihi yok.', 'Projects Gantt chart' => 'Projeler Gantt diyagramı', - 'Link type' => 'Bağlantı türü', 'Change task color when using a specific task link' => 'Belirli bir görev bağlantısı kullanıldığında görevin rengini değiştir', 'Task link creation or modification' => 'Görev bağlantısı oluşturulması veya değiştirilmesi', 'Milestone' => 'Kilometre taşı', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => 'Kullanıcı adları küçük harf ve tekil olmalı', 'Passwords will be encrypted if present' => 'Şifreler (eğer varsa) kriptolanır', '%s attached a new file to the task %s' => '%s, %s görevine yeni dosya ekledi', + 'Link type' => 'Bağlantı türü', 'Assign automatically a category based on a link' => 'Bir bağlantıya göre otomatik olarak kategori ata', 'BAM - Konvertible Mark' => 'BAM - Konvertible Mark', 'Assignee Username' => 'Atanan kullanıcı adı', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php index 6e4942c3..d7e45a89 100644 --- a/app/Locale/zh_CN/translations.php +++ b/app/Locale/zh_CN/translations.php @@ -327,10 +327,10 @@ return array( 'Time tracking:' => '时间记录', 'New sub-task' => '新建子任务', 'New attachment added "%s"' => '新附件已添加"%s"', - 'Comment updated' => '更新了评论', 'New comment posted by %s' => '%s 的新评论', 'New attachment' => '新建附件', 'New comment' => '新建评论', + 'Comment updated' => '更新了评论', 'New subtask' => '新建子任务', 'Subtask updated' => '子任务更新', 'Task updated' => '任务更新', @@ -841,7 +841,6 @@ return array( 'End date:' => '结束日期', 'There is no start date or end date for this project.' => '当前项目没有开始或结束日期', 'Projects Gantt chart' => '项目甘特图', - 'Link type' => '关联类型', 'Change task color when using a specific task link' => '当任务关联到指定任务时改变颜色', 'Task link creation or modification' => '任务链接创建或更新时间', 'Milestone' => '里程碑', @@ -930,6 +929,7 @@ return array( 'Usernames must be lowercase and unique' => '用户名必须小写且唯一', 'Passwords will be encrypted if present' => '密码将被加密', '%s attached a new file to the task %s' => '"%s"添加了附件到任务"%s"', + 'Link type' => '关联类型', 'Assign automatically a category based on a link' => '基于链接自动关联分类', 'BAM - Konvertible Mark' => '波斯尼亚马克', 'Assignee Username' => '指派用户名', @@ -1149,4 +1149,7 @@ return array( // 'Display list of keyboard shortcuts' => '', // 'Menu' => '', // 'Set start date' => '', + // 'Avatar' => '', + // 'Upload my avatar image' => '', + // 'Remove my image' => '', ); -- cgit v1.2.3 From c7cceade96d2698d2684add1970c03c8b4f32dfc Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sun, 27 Mar 2016 12:23:18 -0400 Subject: Handle state in OAuth2 client --- ChangeLog | 1 + app/Controller/Oauth.php | 106 ++++++++++++++++++++------------- app/Core/Http/OAuth2.php | 45 +++++++++++--- app/Core/Session/SessionStorage.php | 1 + app/Locale/bs_BA/translations.php | 1 + app/Locale/cs_CZ/translations.php | 1 + app/Locale/da_DK/translations.php | 1 + app/Locale/de_DE/translations.php | 1 + app/Locale/el_GR/translations.php | 1 + app/Locale/es_ES/translations.php | 1 + app/Locale/fi_FI/translations.php | 1 + app/Locale/fr_FR/translations.php | 1 + app/Locale/hu_HU/translations.php | 1 + app/Locale/id_ID/translations.php | 1 + app/Locale/it_IT/translations.php | 1 + app/Locale/ja_JP/translations.php | 1 + app/Locale/my_MY/translations.php | 1 + app/Locale/nb_NO/translations.php | 1 + app/Locale/nl_NL/translations.php | 1 + app/Locale/pl_PL/translations.php | 1 + app/Locale/pt_BR/translations.php | 1 + app/Locale/pt_PT/translations.php | 1 + app/Locale/ru_RU/translations.php | 1 + app/Locale/sr_Latn_RS/translations.php | 1 + app/Locale/sv_SE/translations.php | 1 + app/Locale/th_TH/translations.php | 1 + app/Locale/tr_TR/translations.php | 1 + app/Locale/zh_CN/translations.php | 1 + tests/units/Core/Http/OAuth2Test.php | 7 ++- 29 files changed, 133 insertions(+), 51 deletions(-) (limited to 'app/Locale/pl_PL/translations.php') diff --git a/ChangeLog b/ChangeLog index 5fdbf6e3..5fded0d4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,7 @@ New features: Improvements: +* Handle state in OAuth2 client * Allow to use the original template in overridden templates * Unification of the project header * Refactoring of Javascript code diff --git a/app/Controller/Oauth.php b/app/Controller/Oauth.php index 452faecd..12b91144 100644 --- a/app/Controller/Oauth.php +++ b/app/Controller/Oauth.php @@ -2,6 +2,8 @@ namespace Kanboard\Controller; +use Kanboard\Core\Security\OAuthAuthenticationProviderInterface; + /** * OAuth controller * @@ -10,25 +12,6 @@ namespace Kanboard\Controller; */ class Oauth extends Base { - /** - * Unlink external account - * - * @access public - */ - public function unlink() - { - $backend = $this->request->getStringParam('backend'); - $this->checkCSRFParam(); - - if ($this->authenticationManager->getProvider($backend)->unlink($this->userSession->getId())) { - $this->flash->success(t('Your external account is not linked anymore to your profile.')); - } else { - $this->flash->failure(t('Unable to unlink your external account.')); - } - - $this->response->redirect($this->helper->url->to('user', 'external', array('user_id' => $this->userSession->getId()))); - } - /** * Redirect to the provider if no code received * @@ -38,9 +21,10 @@ class Oauth extends Base protected function step1($provider) { $code = $this->request->getStringParam('code'); + $state = $this->request->getStringParam('state'); if (! empty($code)) { - $this->step2($provider, $code); + $this->step2($provider, $code, $state); } else { $this->response->redirect($this->authenticationManager->getProvider($provider)->getService()->getAuthorizationUrl()); } @@ -50,57 +34,97 @@ class Oauth extends Base * Link or authenticate the user * * @access protected - * @param string $provider + * @param string $providerName * @param string $code + * @param string $state */ - protected function step2($provider, $code) + protected function step2($providerName, $code, $state) { - $this->authenticationManager->getProvider($provider)->setCode($code); + $provider = $this->authenticationManager->getProvider($providerName); + $provider->setCode($code); + $hasValidState = $provider->getService()->isValidateState($state); if ($this->userSession->isLogged()) { - $this->link($provider); + if ($hasValidState) { + $this->link($provider); + } else { + $this->flash->failure(t('The OAuth2 state parameter is invalid')); + $this->response->redirect($this->helper->url->to('user', 'external', array('user_id' => $this->userSession->getId()))); + } + } else { + if ($hasValidState) { + $this->authenticate($providerName); + } else { + $this->authenticationFailure(t('The OAuth2 state parameter is invalid')); + } } - - $this->authenticate($provider); } /** * Link the account * * @access protected - * @param string $provider + * @param OAuthAuthenticationProviderInterface $provider */ - protected function link($provider) + protected function link(OAuthAuthenticationProviderInterface $provider) { - $authProvider = $this->authenticationManager->getProvider($provider); - - if (! $authProvider->authenticate()) { + if (! $provider->authenticate()) { $this->flash->failure(t('External authentication failed')); } else { - $this->userProfile->assign($this->userSession->getId(), $authProvider->getUser()); + $this->userProfile->assign($this->userSession->getId(), $provider->getUser()); $this->flash->success(t('Your external account is linked to your profile successfully.')); } $this->response->redirect($this->helper->url->to('user', 'external', array('user_id' => $this->userSession->getId()))); } + /** + * Unlink external account + * + * @access public + */ + public function unlink() + { + $backend = $this->request->getStringParam('backend'); + $this->checkCSRFParam(); + + if ($this->authenticationManager->getProvider($backend)->unlink($this->userSession->getId())) { + $this->flash->success(t('Your external account is not linked anymore to your profile.')); + } else { + $this->flash->failure(t('Unable to unlink your external account.')); + } + + $this->response->redirect($this->helper->url->to('user', 'external', array('user_id' => $this->userSession->getId()))); + } + /** * Authenticate the account * * @access protected - * @param string $provider + * @param string $providerName */ - protected function authenticate($provider) + protected function authenticate($providerName) { - if ($this->authenticationManager->oauthAuthentication($provider)) { + if ($this->authenticationManager->oauthAuthentication($providerName)) { $this->response->redirect($this->helper->url->to('app', 'index')); } else { - $this->response->html($this->helper->layout->app('auth/index', array( - 'errors' => array('login' => t('External authentication failed')), - 'values' => array(), - 'no_layout' => true, - 'title' => t('Login') - ))); + $this->authenticationFailure(t('External authentication failed')); } } + + /** + * Show login failure page + * + * @access protected + * @param string $message + */ + protected function authenticationFailure($message) + { + $this->response->html($this->helper->layout->app('auth/index', array( + 'errors' => array('login' => $message), + 'values' => array(), + 'no_layout' => true, + 'title' => t('Login') + ))); + } } diff --git a/app/Core/Http/OAuth2.php b/app/Core/Http/OAuth2.php index 6fa1fb0a..211ca5b4 100644 --- a/app/Core/Http/OAuth2.php +++ b/app/Core/Http/OAuth2.php @@ -12,14 +12,14 @@ use Kanboard\Core\Base; */ class OAuth2 extends Base { - private $clientId; - private $secret; - private $callbackUrl; - private $authUrl; - private $tokenUrl; - private $scopes; - private $tokenType; - private $accessToken; + protected $clientId; + protected $secret; + protected $callbackUrl; + protected $authUrl; + protected $tokenUrl; + protected $scopes; + protected $tokenType; + protected $accessToken; /** * Create OAuth2 service @@ -45,6 +45,33 @@ class OAuth2 extends Base return $this; } + /** + * Generate OAuth2 state and return the token value + * + * @access public + * @return string + */ + public function getState() + { + if (! isset($this->sessionStorage->oauthState) || empty($this->sessionStorage->oauthState)) { + $this->sessionStorage->oauthState = $this->token->getToken(); + } + + return $this->sessionStorage->oauthState; + } + + /** + * Check the validity of the state (CSRF token) + * + * @access public + * @param string $state + * @return bool + */ + public function isValidateState($state) + { + return $state === $this->getState(); + } + /** * Get authorization url * @@ -58,6 +85,7 @@ class OAuth2 extends Base 'client_id' => $this->clientId, 'redirect_uri' => $this->callbackUrl, 'scope' => implode(' ', $this->scopes), + 'state' => $this->getState(), ); return $this->authUrl.'?'.http_build_query($params); @@ -94,6 +122,7 @@ class OAuth2 extends Base 'client_secret' => $this->secret, 'redirect_uri' => $this->callbackUrl, 'grant_type' => 'authorization_code', + 'state' => $this->getState(), ); $response = json_decode($this->httpClient->postForm($this->tokenUrl, $params, array('Accept: application/json')), true); diff --git a/app/Core/Session/SessionStorage.php b/app/Core/Session/SessionStorage.php index 667d9253..6e2f9660 100644 --- a/app/Core/Session/SessionStorage.php +++ b/app/Core/Session/SessionStorage.php @@ -21,6 +21,7 @@ namespace Kanboard\Core\Session; * @property bool $boardCollapsed * @property bool $twoFactorBeforeCodeCalled * @property string $twoFactorSecret + * @property string $oauthState */ class SessionStorage { diff --git a/app/Locale/bs_BA/translations.php b/app/Locale/bs_BA/translations.php index 8d653d4f..7ca864f4 100644 --- a/app/Locale/bs_BA/translations.php +++ b/app/Locale/bs_BA/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/cs_CZ/translations.php b/app/Locale/cs_CZ/translations.php index 3606eddf..b2921de9 100644 --- a/app/Locale/cs_CZ/translations.php +++ b/app/Locale/cs_CZ/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php index cf3f0191..c4743922 100644 --- a/app/Locale/da_DK/translations.php +++ b/app/Locale/da_DK/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php index 1090d6c9..af88b374 100644 --- a/app/Locale/de_DE/translations.php +++ b/app/Locale/de_DE/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/el_GR/translations.php b/app/Locale/el_GR/translations.php index 04efa7e7..9a31e485 100644 --- a/app/Locale/el_GR/translations.php +++ b/app/Locale/el_GR/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php index 477f3655..c3623369 100644 --- a/app/Locale/es_ES/translations.php +++ b/app/Locale/es_ES/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php index a32082e3..8e5dd81f 100644 --- a/app/Locale/fi_FI/translations.php +++ b/app/Locale/fi_FI/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/fr_FR/translations.php b/app/Locale/fr_FR/translations.php index 00e64876..cedd6039 100644 --- a/app/Locale/fr_FR/translations.php +++ b/app/Locale/fr_FR/translations.php @@ -1152,4 +1152,5 @@ return array( 'Avatar' => 'Avatar', 'Upload my avatar image' => 'Uploader mon image d\'avatar', 'Remove my image' => 'Supprimer mon image', + 'The OAuth2 state parameter is invalid' => 'Le paramètre "state" de OAuth2 est invalide', ); diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php index f2e1cafb..f642a6c1 100644 --- a/app/Locale/hu_HU/translations.php +++ b/app/Locale/hu_HU/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/id_ID/translations.php b/app/Locale/id_ID/translations.php index 8d279633..3f105054 100644 --- a/app/Locale/id_ID/translations.php +++ b/app/Locale/id_ID/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/it_IT/translations.php b/app/Locale/it_IT/translations.php index 87327462..93ceb03f 100644 --- a/app/Locale/it_IT/translations.php +++ b/app/Locale/it_IT/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php index aa8cc654..b48eabd8 100644 --- a/app/Locale/ja_JP/translations.php +++ b/app/Locale/ja_JP/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/my_MY/translations.php b/app/Locale/my_MY/translations.php index be41c19c..36b3db0b 100644 --- a/app/Locale/my_MY/translations.php +++ b/app/Locale/my_MY/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/nb_NO/translations.php b/app/Locale/nb_NO/translations.php index 0e214cf4..465efb53 100644 --- a/app/Locale/nb_NO/translations.php +++ b/app/Locale/nb_NO/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php index dc68eb34..3c3fa1ee 100644 --- a/app/Locale/nl_NL/translations.php +++ b/app/Locale/nl_NL/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php index 0d020dcb..d06e347f 100644 --- a/app/Locale/pl_PL/translations.php +++ b/app/Locale/pl_PL/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php index ebed08cd..050d1a9f 100644 --- a/app/Locale/pt_BR/translations.php +++ b/app/Locale/pt_BR/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/pt_PT/translations.php b/app/Locale/pt_PT/translations.php index 4d2d20b4..1c327887 100644 --- a/app/Locale/pt_PT/translations.php +++ b/app/Locale/pt_PT/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php index 1d93b3f3..3cb3c6bb 100644 --- a/app/Locale/ru_RU/translations.php +++ b/app/Locale/ru_RU/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php index 634f6f8c..c7070a8d 100644 --- a/app/Locale/sr_Latn_RS/translations.php +++ b/app/Locale/sr_Latn_RS/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php index 4dcc63ad..e4728d2d 100644 --- a/app/Locale/sv_SE/translations.php +++ b/app/Locale/sv_SE/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php index a81bef73..1e2fb98a 100644 --- a/app/Locale/th_TH/translations.php +++ b/app/Locale/th_TH/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php index 9a5380d2..6e8fae2f 100644 --- a/app/Locale/tr_TR/translations.php +++ b/app/Locale/tr_TR/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php index d7e45a89..decd49d8 100644 --- a/app/Locale/zh_CN/translations.php +++ b/app/Locale/zh_CN/translations.php @@ -1152,4 +1152,5 @@ return array( // 'Avatar' => '', // 'Upload my avatar image' => '', // 'Remove my image' => '', + // 'The OAuth2 state parameter is invalid' => '', ); diff --git a/tests/units/Core/Http/OAuth2Test.php b/tests/units/Core/Http/OAuth2Test.php index c68ae116..5a9c0ac1 100644 --- a/tests/units/Core/Http/OAuth2Test.php +++ b/tests/units/Core/Http/OAuth2Test.php @@ -10,7 +10,8 @@ class OAuth2Test extends Base { $oauth = new OAuth2($this->container); $oauth->createService('A', 'B', 'C', 'D', 'E', array('f', 'g')); - $this->assertEquals('D?response_type=code&client_id=A&redirect_uri=C&scope=f+g', $oauth->getAuthorizationUrl()); + $state = $oauth->getState(); + $this->assertEquals('D?response_type=code&client_id=A&redirect_uri=C&scope=f+g&state='.$state, $oauth->getAuthorizationUrl()); } public function testAuthHeader() @@ -27,12 +28,15 @@ class OAuth2Test extends Base public function testAccessToken() { + $oauth = new OAuth2($this->container); + $params = array( 'code' => 'something', 'client_id' => 'A', 'client_secret' => 'B', 'redirect_uri' => 'C', 'grant_type' => 'authorization_code', + 'state' => $oauth->getState(), ); $response = json_encode(array( @@ -46,7 +50,6 @@ class OAuth2Test extends Base ->with('E', $params, array('Accept: application/json')) ->will($this->returnValue($response)); - $oauth = new OAuth2($this->container); $oauth->createService('A', 'B', 'C', 'D', 'E', array('f', 'g')); $oauth->getAccessToken('something'); } -- cgit v1.2.3 From 9f0166502b8b8886156bcb4ad0497cd9ee5a60b2 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sun, 10 Apr 2016 15:18:20 -0400 Subject: Added search in activity stream --- ChangeLog | 1 + app/Controller/Search.php | 18 ++++ app/Filter/BaseDateFilter.php | 103 ++++++++++++++++++ app/Filter/BaseFilter.php | 44 -------- app/Filter/ProjectActivityCreationDateFilter.php | 38 +++++++ app/Filter/ProjectActivityCreatorFilter.php | 65 ++++++++++++ app/Filter/ProjectActivityProjectIdsFilter.php | 2 +- app/Filter/ProjectActivityProjectNameFilter.php | 38 +++++++ app/Filter/ProjectActivityTaskStatusFilter.php | 43 ++++++++ app/Filter/ProjectActivityTaskTitleFilter.php | 15 +-- app/Filter/TaskCompletionDateFilter.php | 2 +- app/Filter/TaskCreationDateFilter.php | 2 +- app/Filter/TaskDueDateFilter.php | 2 +- app/Filter/TaskModificationDateFilter.php | 2 +- app/Filter/TaskProjectsFilter.php | 7 +- app/Filter/TaskStartDateFilter.php | 2 +- app/Helper/ProjectActivityHelper.php | 27 +++++ app/Locale/bs_BA/translations.php | 10 ++ app/Locale/cs_CZ/translations.php | 10 ++ app/Locale/da_DK/translations.php | 10 ++ app/Locale/de_DE/translations.php | 10 ++ app/Locale/el_GR/translations.php | 10 ++ app/Locale/es_ES/translations.php | 10 ++ app/Locale/fi_FI/translations.php | 10 ++ app/Locale/fr_FR/translations.php | 10 ++ app/Locale/hu_HU/translations.php | 10 ++ app/Locale/id_ID/translations.php | 10 ++ app/Locale/it_IT/translations.php | 10 ++ app/Locale/ja_JP/translations.php | 10 ++ app/Locale/ko_KR/translations.php | 10 ++ app/Locale/my_MY/translations.php | 10 ++ app/Locale/nb_NO/translations.php | 10 ++ app/Locale/nl_NL/translations.php | 10 ++ app/Locale/pl_PL/translations.php | 10 ++ app/Locale/pt_BR/translations.php | 10 ++ app/Locale/pt_PT/translations.php | 10 ++ app/Locale/ru_RU/translations.php | 12 ++- app/Locale/sr_Latn_RS/translations.php | 10 ++ app/Locale/sv_SE/translations.php | 10 ++ app/Locale/th_TH/translations.php | 10 ++ app/Locale/tr_TR/translations.php | 10 ++ app/Locale/zh_CN/translations.php | 10 ++ app/Model/ProjectActivity.php | 1 + app/ServiceProvider/FilterProvider.php | 30 +++++- app/ServiceProvider/RouteProvider.php | 3 +- app/Template/activity/filter_dropdown.php | 14 +++ app/Template/search/activity.php | 39 +++++++ app/Template/search/index.php | 4 +- doc/search.markdown | 83 +++++++++------ .../ProjectActivityCreationDateFilterTest.php | 117 +++++++++++++++++++++ .../Filter/ProjectActivityCreatorFilterTest.php | 91 ++++++++++++++++ .../ProjectActivityProjectNameFilterTest.php | 35 ++++++ .../Filter/ProjectActivityTaskStatusFilterTest.php | 49 +++++++++ .../Filter/ProjectActivityTaskTitleFilterTest.php | 47 ++++++++- 54 files changed, 1066 insertions(+), 110 deletions(-) create mode 100644 app/Filter/BaseDateFilter.php create mode 100644 app/Filter/ProjectActivityCreationDateFilter.php create mode 100644 app/Filter/ProjectActivityCreatorFilter.php create mode 100644 app/Filter/ProjectActivityProjectNameFilter.php create mode 100644 app/Filter/ProjectActivityTaskStatusFilter.php create mode 100644 app/Template/activity/filter_dropdown.php create mode 100644 app/Template/search/activity.php create mode 100644 tests/units/Filter/ProjectActivityCreationDateFilterTest.php create mode 100644 tests/units/Filter/ProjectActivityCreatorFilterTest.php create mode 100644 tests/units/Filter/ProjectActivityProjectNameFilterTest.php create mode 100644 tests/units/Filter/ProjectActivityTaskStatusFilterTest.php (limited to 'app/Locale/pl_PL/translations.php') diff --git a/ChangeLog b/ChangeLog index 1bbe8062..f4952b53 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ Version 1.0.28 (unreleased) New features: +* Search in activity stream * Search in comments * Search by task creator diff --git a/app/Controller/Search.php b/app/Controller/Search.php index 840a90c8..a42e9d3d 100644 --- a/app/Controller/Search.php +++ b/app/Controller/Search.php @@ -46,4 +46,22 @@ class Search extends Base 'title' => t('Search tasks').($nb_tasks > 0 ? ' ('.$nb_tasks.')' : '') ))); } + + public function activity() + { + $search = urldecode($this->request->getStringParam('search')); + $events = $this->helper->projectActivity->searchEvents($search); + $nb_events = count($events); + + $this->response->html($this->helper->layout->app('search/activity', array( + 'values' => array( + 'search' => $search, + 'controller' => 'search', + 'action' => 'activity', + ), + 'title' => t('Search in activity stream').($nb_events > 0 ? ' ('.$nb_events.')' : ''), + 'nb_events' => $nb_events, + 'events' => $events, + ))); + } } diff --git a/app/Filter/BaseDateFilter.php b/app/Filter/BaseDateFilter.php new file mode 100644 index 00000000..56fb2d78 --- /dev/null +++ b/app/Filter/BaseDateFilter.php @@ -0,0 +1,103 @@ +dateParser = $dateParser; + return $this; + } + + /** + * Parse operator in the input string + * + * @access protected + * @return string + */ + protected function parseOperator() + { + $operators = array( + '<=' => 'lte', + '>=' => 'gte', + '<' => 'lt', + '>' => 'gt', + ); + + foreach ($operators as $operator => $method) { + if (strpos($this->value, $operator) === 0) { + $this->value = substr($this->value, strlen($operator)); + return $method; + } + } + + return ''; + } + + /** + * Apply a date filter + * + * @access protected + * @param string $field + */ + protected function applyDateFilter($field) + { + $method = $this->parseOperator(); + $timestamp = $this->dateParser->getTimestampFromIsoFormat($this->value); + + if ($method !== '') { + $this->query->$method($field, $this->getTimestampFromOperator($method, $timestamp)); + } else { + $this->query->gte($field, $timestamp); + $this->query->lte($field, $timestamp + 86399); + } + } + + /** + * Get timestamp from the operator + * + * @access public + * @param string $method + * @param integer $timestamp + * @return integer + */ + protected function getTimestampFromOperator($method, $timestamp) + { + switch ($method) { + case 'lte': + return $timestamp + 86399; + case 'lt': + return $timestamp; + case 'gte': + return $timestamp; + case 'gt': + return $timestamp + 86400; + } + + return $timestamp; + } +} diff --git a/app/Filter/BaseFilter.php b/app/Filter/BaseFilter.php index a7e6a61a..79a664be 100644 --- a/app/Filter/BaseFilter.php +++ b/app/Filter/BaseFilter.php @@ -72,48 +72,4 @@ abstract class BaseFilter $this->value = $value; return $this; } - - /** - * Parse operator in the input string - * - * @access protected - * @return string - */ - protected function parseOperator() - { - $operators = array( - '<=' => 'lte', - '>=' => 'gte', - '<' => 'lt', - '>' => 'gt', - ); - - foreach ($operators as $operator => $method) { - if (strpos($this->value, $operator) === 0) { - $this->value = substr($this->value, strlen($operator)); - return $method; - } - } - - return ''; - } - - /** - * Apply a date filter - * - * @access protected - * @param string $field - */ - protected function applyDateFilter($field) - { - $timestamp = strtotime($this->value); - $method = $this->parseOperator(); - - if ($method !== '') { - $this->query->$method($field, $timestamp); - } else { - $this->query->gte($field, $timestamp); - $this->query->lte($field, $timestamp + 86399); - } - } } diff --git a/app/Filter/ProjectActivityCreationDateFilter.php b/app/Filter/ProjectActivityCreationDateFilter.php new file mode 100644 index 00000000..d0b7f754 --- /dev/null +++ b/app/Filter/ProjectActivityCreationDateFilter.php @@ -0,0 +1,38 @@ +applyDateFilter(ProjectActivity::TABLE.'.date_creation'); + return $this; + } +} diff --git a/app/Filter/ProjectActivityCreatorFilter.php b/app/Filter/ProjectActivityCreatorFilter.php new file mode 100644 index 00000000..c95569d6 --- /dev/null +++ b/app/Filter/ProjectActivityCreatorFilter.php @@ -0,0 +1,65 @@ +currentUserId = $userId; + return $this; + } + + /** + * Get search attribute + * + * @access public + * @return string[] + */ + public function getAttributes() + { + return array('creator'); + } + + /** + * Apply filter + * + * @access public + * @return string + */ + public function apply() + { + if ($this->value === 'me') { + $this->query->eq(ProjectActivity::TABLE . '.creator_id', $this->currentUserId); + } else { + $this->query->beginOr(); + $this->query->ilike('uc.username', '%'.$this->value.'%'); + $this->query->ilike('uc.name', '%'.$this->value.'%'); + $this->query->closeOr(); + } + } +} diff --git a/app/Filter/ProjectActivityProjectIdsFilter.php b/app/Filter/ProjectActivityProjectIdsFilter.php index 4d7c9028..47cf0c25 100644 --- a/app/Filter/ProjectActivityProjectIdsFilter.php +++ b/app/Filter/ProjectActivityProjectIdsFilter.php @@ -21,7 +21,7 @@ class ProjectActivityProjectIdsFilter extends BaseFilter implements FilterInterf */ public function getAttributes() { - return array('project_ids'); + return array('projects'); } /** diff --git a/app/Filter/ProjectActivityProjectNameFilter.php b/app/Filter/ProjectActivityProjectNameFilter.php new file mode 100644 index 00000000..0cf73657 --- /dev/null +++ b/app/Filter/ProjectActivityProjectNameFilter.php @@ -0,0 +1,38 @@ +query->ilike(Project::TABLE.'.name', '%'.$this->value.'%'); + return $this; + } +} diff --git a/app/Filter/ProjectActivityTaskStatusFilter.php b/app/Filter/ProjectActivityTaskStatusFilter.php new file mode 100644 index 00000000..69e2c52d --- /dev/null +++ b/app/Filter/ProjectActivityTaskStatusFilter.php @@ -0,0 +1,43 @@ +value === 'open') { + $this->query->eq(Task::TABLE.'.is_active', Task::STATUS_OPEN); + } elseif ($this->value === 'closed') { + $this->query->eq(Task::TABLE.'.is_active', Task::STATUS_CLOSED); + } + + return $this; + } +} diff --git a/app/Filter/ProjectActivityTaskTitleFilter.php b/app/Filter/ProjectActivityTaskTitleFilter.php index ed3f36d6..bf2afa30 100644 --- a/app/Filter/ProjectActivityTaskTitleFilter.php +++ b/app/Filter/ProjectActivityTaskTitleFilter.php @@ -3,7 +3,6 @@ namespace Kanboard\Filter; use Kanboard\Core\Filter\FilterInterface; -use Kanboard\Model\Task; /** * Filter activity events by task title @@ -11,7 +10,7 @@ use Kanboard\Model\Task; * @package filter * @author Frederic Guillot */ -class ProjectActivityTaskTitleFilter extends BaseFilter implements FilterInterface +class ProjectActivityTaskTitleFilter extends TaskTitleFilter implements FilterInterface { /** * Get search attribute @@ -23,16 +22,4 @@ class ProjectActivityTaskTitleFilter extends BaseFilter implements FilterInterfa { return array('title'); } - - /** - * Apply filter - * - * @access public - * @return FilterInterface - */ - public function apply() - { - $this->query->ilike(Task::TABLE.'.title', '%'.$this->value.'%'); - return $this; - } } diff --git a/app/Filter/TaskCompletionDateFilter.php b/app/Filter/TaskCompletionDateFilter.php index 5166bebf..f206a3e2 100644 --- a/app/Filter/TaskCompletionDateFilter.php +++ b/app/Filter/TaskCompletionDateFilter.php @@ -11,7 +11,7 @@ use Kanboard\Model\Task; * @package filter * @author Frederic Guillot */ -class TaskCompletionDateFilter extends BaseFilter implements FilterInterface +class TaskCompletionDateFilter extends BaseDateFilter implements FilterInterface { /** * Get search attribute diff --git a/app/Filter/TaskCreationDateFilter.php b/app/Filter/TaskCreationDateFilter.php index 26318b3e..bb6efad6 100644 --- a/app/Filter/TaskCreationDateFilter.php +++ b/app/Filter/TaskCreationDateFilter.php @@ -11,7 +11,7 @@ use Kanboard\Model\Task; * @package filter * @author Frederic Guillot */ -class TaskCreationDateFilter extends BaseFilter implements FilterInterface +class TaskCreationDateFilter extends BaseDateFilter implements FilterInterface { /** * Get search attribute diff --git a/app/Filter/TaskDueDateFilter.php b/app/Filter/TaskDueDateFilter.php index 6ba55eb9..e36efdd0 100644 --- a/app/Filter/TaskDueDateFilter.php +++ b/app/Filter/TaskDueDateFilter.php @@ -11,7 +11,7 @@ use Kanboard\Model\Task; * @package filter * @author Frederic Guillot */ -class TaskDueDateFilter extends BaseFilter implements FilterInterface +class TaskDueDateFilter extends BaseDateFilter implements FilterInterface { /** * Get search attribute diff --git a/app/Filter/TaskModificationDateFilter.php b/app/Filter/TaskModificationDateFilter.php index d8838bce..5036e9c1 100644 --- a/app/Filter/TaskModificationDateFilter.php +++ b/app/Filter/TaskModificationDateFilter.php @@ -11,7 +11,7 @@ use Kanboard\Model\Task; * @package filter * @author Frederic Guillot */ -class TaskModificationDateFilter extends BaseFilter implements FilterInterface +class TaskModificationDateFilter extends BaseDateFilter implements FilterInterface { /** * Get search attribute diff --git a/app/Filter/TaskProjectsFilter.php b/app/Filter/TaskProjectsFilter.php index e0fc09cf..47636b1d 100644 --- a/app/Filter/TaskProjectsFilter.php +++ b/app/Filter/TaskProjectsFilter.php @@ -32,7 +32,12 @@ class TaskProjectsFilter extends BaseFilter implements FilterInterface */ public function apply() { - $this->query->in(Task::TABLE.'.project_id', $this->value); + if (empty($this->value)) { + $this->query->eq(Task::TABLE.'.project_id', 0); + } else { + $this->query->in(Task::TABLE.'.project_id', $this->value); + } + return $this; } } diff --git a/app/Filter/TaskStartDateFilter.php b/app/Filter/TaskStartDateFilter.php index d45bc0d4..dd30762b 100644 --- a/app/Filter/TaskStartDateFilter.php +++ b/app/Filter/TaskStartDateFilter.php @@ -11,7 +11,7 @@ use Kanboard\Model\Task; * @package filter * @author Frederic Guillot */ -class TaskStartDateFilter extends BaseFilter implements FilterInterface +class TaskStartDateFilter extends BaseDateFilter implements FilterInterface { /** * Get search attribute diff --git a/app/Helper/ProjectActivityHelper.php b/app/Helper/ProjectActivityHelper.php index 738fec66..0638a978 100644 --- a/app/Helper/ProjectActivityHelper.php +++ b/app/Helper/ProjectActivityHelper.php @@ -17,6 +17,33 @@ use Kanboard\Model\ProjectActivity; */ class ProjectActivityHelper extends Base { + /** + * Search events + * + * @access public + * @param string $search + * @return array + */ + public function searchEvents($search) + { + $projects = $this->projectUserRole->getProjectsByUser($this->userSession->getId()); + $events = array(); + + if ($search !== '') { + $queryBuilder = $this->projectActivityLexer->build($search); + $queryBuilder + ->withFilter(new ProjectActivityProjectIdsFilter(array_keys($projects))) + ->getQuery() + ->desc(ProjectActivity::TABLE.'.id') + ->limit(500) + ; + + $events = $queryBuilder->format(new ProjectActivityEventFormatter($this->container)); + } + + return $events; + } + /** * Get project activity events * diff --git a/app/Locale/bs_BA/translations.php b/app/Locale/bs_BA/translations.php index 7ca864f4..e384f923 100644 --- a/app/Locale/bs_BA/translations.php +++ b/app/Locale/bs_BA/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/cs_CZ/translations.php b/app/Locale/cs_CZ/translations.php index b2921de9..3c8de1ad 100644 --- a/app/Locale/cs_CZ/translations.php +++ b/app/Locale/cs_CZ/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php index c4743922..747fa2d1 100644 --- a/app/Locale/da_DK/translations.php +++ b/app/Locale/da_DK/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php index 999bf048..fa447e62 100644 --- a/app/Locale/de_DE/translations.php +++ b/app/Locale/de_DE/translations.php @@ -1153,4 +1153,14 @@ return array( 'Upload my avatar image' => 'Mein Avatar Bild hochladen', 'Remove my image' => 'Mein Bild entfernen', 'The OAuth2 state parameter is invalid' => 'Der OAuth2 Statusparameter ist ungültig', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/el_GR/translations.php b/app/Locale/el_GR/translations.php index 9a31e485..84cf8462 100644 --- a/app/Locale/el_GR/translations.php +++ b/app/Locale/el_GR/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php index c3623369..e52c959b 100644 --- a/app/Locale/es_ES/translations.php +++ b/app/Locale/es_ES/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php index 8e5dd81f..f47852b0 100644 --- a/app/Locale/fi_FI/translations.php +++ b/app/Locale/fi_FI/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/fr_FR/translations.php b/app/Locale/fr_FR/translations.php index cedd6039..0c2e4955 100644 --- a/app/Locale/fr_FR/translations.php +++ b/app/Locale/fr_FR/translations.php @@ -1153,4 +1153,14 @@ return array( 'Upload my avatar image' => 'Uploader mon image d\'avatar', 'Remove my image' => 'Supprimer mon image', 'The OAuth2 state parameter is invalid' => 'Le paramètre "state" de OAuth2 est invalide', + 'User not found.' => 'Utilisateur introuvable.', + 'Search in activity stream' => 'Chercher dans le flux d\'activité', + 'My activities' => 'Mes activités', + 'Activity until yesterday' => 'Activités jusqu\'à hier', + 'Activity until today' => 'Activités jusqu\'à aujourd\'hui', + 'Search by creator: ' => 'Rechercher par créateur : ', + 'Search by creation date: ' => 'Rechercher par date de création : ', + 'Search by task status: ' => 'Rechercher par le statut des tâches : ', + 'Search by task title: ' => 'Rechercher par le titre des tâches : ', + 'Activity stream search' => 'Recherche dans le flux d\'activité', ); diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php index f642a6c1..9a2d666a 100644 --- a/app/Locale/hu_HU/translations.php +++ b/app/Locale/hu_HU/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/id_ID/translations.php b/app/Locale/id_ID/translations.php index 3f105054..9cbca60e 100644 --- a/app/Locale/id_ID/translations.php +++ b/app/Locale/id_ID/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/it_IT/translations.php b/app/Locale/it_IT/translations.php index 93ceb03f..d0209b3a 100644 --- a/app/Locale/it_IT/translations.php +++ b/app/Locale/it_IT/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php index b48eabd8..69ab5f17 100644 --- a/app/Locale/ja_JP/translations.php +++ b/app/Locale/ja_JP/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/ko_KR/translations.php b/app/Locale/ko_KR/translations.php index 8379761f..f4320c55 100644 --- a/app/Locale/ko_KR/translations.php +++ b/app/Locale/ko_KR/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/my_MY/translations.php b/app/Locale/my_MY/translations.php index 36b3db0b..f6f15937 100644 --- a/app/Locale/my_MY/translations.php +++ b/app/Locale/my_MY/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/nb_NO/translations.php b/app/Locale/nb_NO/translations.php index 465efb53..f3d3047a 100644 --- a/app/Locale/nb_NO/translations.php +++ b/app/Locale/nb_NO/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php index 3c3fa1ee..f08f5eff 100644 --- a/app/Locale/nl_NL/translations.php +++ b/app/Locale/nl_NL/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php index d06e347f..8222f9e1 100644 --- a/app/Locale/pl_PL/translations.php +++ b/app/Locale/pl_PL/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php index cdb06dea..60242d95 100644 --- a/app/Locale/pt_BR/translations.php +++ b/app/Locale/pt_BR/translations.php @@ -1153,4 +1153,14 @@ return array( 'Upload my avatar image' => 'Enviar a minha imagem de avatar', 'Remove my image' => 'Remover a minha imagem', 'The OAuth2 state parameter is invalid' => 'O parâmetro "state" de OAuth2 não é válido', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/pt_PT/translations.php b/app/Locale/pt_PT/translations.php index e38344f8..956d1259 100644 --- a/app/Locale/pt_PT/translations.php +++ b/app/Locale/pt_PT/translations.php @@ -1153,4 +1153,14 @@ return array( 'Upload my avatar image' => 'Enviar a minha imagem de avatar', 'Remove my image' => 'Remover a minha imagem', 'The OAuth2 state parameter is invalid' => 'O parametro de estado do OAuth2 é inválido', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php index b3503e52..1e548e0d 100644 --- a/app/Locale/ru_RU/translations.php +++ b/app/Locale/ru_RU/translations.php @@ -1152,5 +1152,15 @@ return array( 'Avatar' => 'Аватар', 'Upload my avatar image' => 'Загрузить моё изображение для аватара', 'Remove my image' => 'Удалить моё изображение', - 'The OAuth2 state parameter is invalid' => 'Параметр состояние OAuth2 неправильный' + 'The OAuth2 state parameter is invalid' => 'Параметр состояние OAuth2 неправильный', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php index c7070a8d..b69e6cf4 100644 --- a/app/Locale/sr_Latn_RS/translations.php +++ b/app/Locale/sr_Latn_RS/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php index e4728d2d..634b87d0 100644 --- a/app/Locale/sv_SE/translations.php +++ b/app/Locale/sv_SE/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php index 1e2fb98a..1e913f28 100644 --- a/app/Locale/th_TH/translations.php +++ b/app/Locale/th_TH/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php index 6e8fae2f..95bcc8a8 100644 --- a/app/Locale/tr_TR/translations.php +++ b/app/Locale/tr_TR/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php index decd49d8..7b0c3139 100644 --- a/app/Locale/zh_CN/translations.php +++ b/app/Locale/zh_CN/translations.php @@ -1153,4 +1153,14 @@ return array( // 'Upload my avatar image' => '', // 'Remove my image' => '', // 'The OAuth2 state parameter is invalid' => '', + // 'User not found.' => '', + // 'Search in activity stream' => '', + // 'My activities' => '', + // 'Activity until yesterday' => '', + // 'Activity until today' => '', + // 'Search by creator: ' => '', + // 'Search by creation date: ' => '', + // 'Search by task status: ' => '', + // 'Search by task title: ' => '', + // 'Activity stream search' => '', ); diff --git a/app/Model/ProjectActivity.php b/app/Model/ProjectActivity.php index 31cee113..d993015b 100644 --- a/app/Model/ProjectActivity.php +++ b/app/Model/ProjectActivity.php @@ -71,6 +71,7 @@ class ProjectActivity extends Base 'uc.avatar_path' ) ->join(Task::TABLE, 'id', 'task_id') + ->join(Project::TABLE, 'id', 'project_id') ->left(User::TABLE, 'uc', 'id', ProjectActivity::TABLE, 'creator_id'); } diff --git a/app/ServiceProvider/FilterProvider.php b/app/ServiceProvider/FilterProvider.php index 4b4dbd2d..f3918d77 100644 --- a/app/ServiceProvider/FilterProvider.php +++ b/app/ServiceProvider/FilterProvider.php @@ -4,6 +4,10 @@ namespace Kanboard\ServiceProvider; use Kanboard\Core\Filter\LexerBuilder; use Kanboard\Core\Filter\QueryBuilder; +use Kanboard\Filter\ProjectActivityCreationDateFilter; +use Kanboard\Filter\ProjectActivityCreatorFilter; +use Kanboard\Filter\ProjectActivityProjectNameFilter; +use Kanboard\Filter\ProjectActivityTaskStatusFilter; use Kanboard\Filter\ProjectActivityTaskTitleFilter; use Kanboard\Filter\TaskAssigneeFilter; use Kanboard\Filter\TaskCategoryFilter; @@ -86,8 +90,18 @@ class FilterProvider implements ServiceProviderInterface $container['projectActivityLexer'] = $container->factory(function ($c) { $builder = new LexerBuilder(); - $builder->withQuery($c['projectActivity']->getQuery()); - $builder->withFilter(new ProjectActivityTaskTitleFilter()); + $builder + ->withQuery($c['projectActivity']->getQuery()) + ->withFilter(new ProjectActivityTaskTitleFilter(), true) + ->withFilter(new ProjectActivityTaskStatusFilter()) + ->withFilter(new ProjectActivityProjectNameFilter()) + ->withFilter(ProjectActivityCreationDateFilter::getInstance() + ->setDateParser($c['dateParser']) + ) + ->withFilter(ProjectActivityCreatorFilter::getInstance() + ->setCurrentUserId($c['userSession']->getId()) + ) + ; return $builder; }); @@ -124,17 +138,23 @@ class FilterProvider implements ServiceProviderInterface ) ->withFilter(new TaskColumnFilter()) ->withFilter(new TaskCommentFilter()) - ->withFilter(new TaskCreationDateFilter()) + ->withFilter(TaskCreationDateFilter::getInstance() + ->setDateParser($c['dateParser']) + ) ->withFilter(TaskCreatorFilter::getInstance() ->setCurrentUserId($c['userSession']->getId()) ) ->withFilter(new TaskDescriptionFilter()) - ->withFilter(new TaskDueDateFilter()) + ->withFilter(TaskDueDateFilter::getInstance() + ->setDateParser($c['dateParser']) + ) ->withFilter(new TaskIdFilter()) ->withFilter(TaskLinkFilter::getInstance() ->setDatabase($c['db']) ) - ->withFilter(new TaskModificationDateFilter()) + ->withFilter(TaskModificationDateFilter::getInstance() + ->setDateParser($c['dateParser']) + ) ->withFilter(new TaskProjectFilter()) ->withFilter(new TaskReferenceFilter()) ->withFilter(new TaskStatusFilter()) diff --git a/app/ServiceProvider/RouteProvider.php b/app/ServiceProvider/RouteProvider.php index 0e7548d4..30d23a51 100644 --- a/app/ServiceProvider/RouteProvider.php +++ b/app/ServiceProvider/RouteProvider.php @@ -42,7 +42,7 @@ class RouteProvider implements ServiceProviderInterface // Search routes $container['route']->addRoute('search', 'search', 'index'); - $container['route']->addRoute('search/:search', 'search', 'index'); + $container['route']->addRoute('search/activity', 'search', 'activity'); // ProjectCreation routes $container['route']->addRoute('project/create', 'ProjectCreation', 'create'); @@ -62,6 +62,7 @@ class RouteProvider implements ServiceProviderInterface $container['route']->addRoute('project/:project_id/enable', 'project', 'enable'); $container['route']->addRoute('project/:project_id/permissions', 'ProjectPermission', 'index'); $container['route']->addRoute('project/:project_id/import', 'taskImport', 'step1'); + $container['route']->addRoute('project/:project_id/activity', 'activity', 'project'); // Project Overview $container['route']->addRoute('project/:project_id/overview', 'ProjectOverview', 'show'); diff --git a/app/Template/activity/filter_dropdown.php b/app/Template/activity/filter_dropdown.php new file mode 100644 index 00000000..8d7a7de3 --- /dev/null +++ b/app/Template/activity/filter_dropdown.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/app/Template/search/activity.php b/app/Template/search/activity.php new file mode 100644 index 00000000..60362215 --- /dev/null +++ b/app/Template/search/activity.php @@ -0,0 +1,39 @@ +
+ + +
+ +
+ + +
+

+

project:"My project" creator:me

+
    +
  • project:"My project"
  • +
  • creator:admin
  • +
  • created:today
  • +
  • status:open
  • +
  • title:"My task"
  • +
+

url->doc(t('View advanced search syntax'), 'search') ?>

+
+ +

+ + render('event/events', array('events' => $events)) ?> + + +
\ No newline at end of file diff --git a/app/Template/search/index.php b/app/Template/search/index.php index 9231a6f3..d5d07ed6 100644 --- a/app/Template/search/index.php +++ b/app/Template/search/index.php @@ -2,8 +2,8 @@ diff --git a/doc/search.markdown b/doc/search.markdown index f6d343e9..37bb8625 100644 --- a/doc/search.markdown +++ b/doc/search.markdown @@ -1,7 +1,8 @@ Advanced Search Syntax ====================== -Kanboard uses a simple query language for advanced search. +Kanboard uses a simple query language for advanced search. +You can search in tasks, comments, subtasks, links but also in the activity stream. Example of query ---------------- @@ -12,23 +13,23 @@ This example will return all tasks assigned to me with a due date for tomorrow a assigne:me due:tomorrow my title ``` -Search by task id or title --------------------------- +Global search +------------- + +### Search by task id or title - Search by task id: `#123` - Search by task id and task title: `123` - Search by task title: anything that doesn't match any search attributes -Search by status ----------------- +### Search by status Attribute: **status** - Query to find open tasks: `status:open` - Query to find closed tasks: `status:closed` -Search by assignee ------------------- +### Search by assignee Attribute: **assignee** @@ -38,8 +39,7 @@ Attribute: **assignee** - Query for unassigned tasks: `assignee:nobody` - Query for my assigned tasks: `assignee:me` -Search by task creator ----------------------- +### Search by task creator Attribute: **creator** @@ -47,23 +47,20 @@ Attribute: **creator** - Tasks created by John Doe: `creator:"John Doe"` - Tasks created by the user id #1: `creator:1` -Search by subtask assignee --------------------------- +### Search by subtask assignee Attribute: **subtask:assignee** - Example: `subtask:assignee:"John Doe"` -Search by color ---------------- +### Search by color Attribute: **color** - Query to search by color id: `color:blue` - Query to search by color name: `color:"Deep Orange"` -Search by the due date ----------------------- +### Search by the due date Attribute: **due** @@ -83,8 +80,7 @@ Operators supported with a date: - Greater than or equal: **due:>=2015-06-29** - Lower than or equal: **due:<=2015-06-29** -Search by modification date ---------------------------- +### Search by modification date Attribute: **modified** or **updated** @@ -94,29 +90,25 @@ There is also a filter by recently modified tasks: `modified:recently`. This query will use the same value as the board highlight period configured in settings. -Search by creation date ------------------------ +### Search by creation date Attribute: **created** Works in the same way as the modification date queries. -Search by description ---------------------- +### Search by description Attribute: **description** or **desc** Example: `description:"text search"` -Search by external reference ----------------------------- +### Search by external reference The task reference is an external id of your task, by example a ticket number from another software. - Find tasks with a reference: `ref:1234` or `reference:TICKET-1234` -Search by category ------------------- +### Search by category Attribute: **category** @@ -124,8 +116,7 @@ Attribute: **category** - Find all tasks that have those categories: `category:"Bug" category:"Improvements"` - Find tasks with no category assigned: `category:none` -Search by project ------------------ +### Search by project Attribute: **project** @@ -133,16 +124,14 @@ Attribute: **project** - Find tasks by project id: `project:23` - Find tasks for several projects: `project:"My project A" project:"My project B"` -Search by columns ------------------ +### Search by columns Attribute: **column** - Find tasks by column name: `column:"Work in progress"` - Find tasks for several columns: `column:"Backlog" column:ready` -Search by swim-lane -------------------- +### Search by swim-lane Attribute: **swimlane** @@ -150,17 +139,41 @@ Attribute: **swimlane** - Find tasks in the default swim-lane: `swimlane:default` - Find tasks into several swim-lanes: `swimlane:"Version 1.2" swimlane:"Version 1.3"` -Search by task link ------------------- +### Search by task link Attribute: **link** - Find tasks by link name: `link:"is a milestone of"` - Find tasks into several links: `link:"is a milestone of" link:"relates to"` -Search by comment ------------------ +### Search by comment Attribute: **comment** - Find comments that contains this title: `comment:"My comment message"` + +Activity stream search +---------------------- + +### Search events by task title + +Attribute: **title** or none (default) + +- Example: `title:"My task"` +- Search by task id: `#123` + +### Search events by task status + +Attribute: **status** + +### Search by event creator + +Attribute: **creator** + +### Search by event creation date + +Attribute: **created** + +### Search events by project + +Attribute: **project** diff --git a/tests/units/Filter/ProjectActivityCreationDateFilterTest.php b/tests/units/Filter/ProjectActivityCreationDateFilterTest.php new file mode 100644 index 00000000..d679f285 --- /dev/null +++ b/tests/units/Filter/ProjectActivityCreationDateFilterTest.php @@ -0,0 +1,117 @@ +container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreationDateFilter('today'); + $filter->setDateParser($this->container['dateParser']); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(1, $events); + } + + public function testWithYesterday() + { + $taskFinder = new TaskFinder($this->container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreationDateFilter('yesterday'); + $filter->setDateParser($this->container['dateParser']); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(0, $events); + } + + public function testWithIsoDate() + { + $taskFinder = new TaskFinder($this->container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreationDateFilter(date('Y-m-d')); + $filter->setDateParser($this->container['dateParser']); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(1, $events); + } + + public function testWithOperatorAndIsoDate() + { + $taskFinder = new TaskFinder($this->container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreationDateFilter('>='.date('Y-m-d')); + $filter->setDateParser($this->container['dateParser']); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(1, $events); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreationDateFilter('<'.date('Y-m-d')); + $filter->setDateParser($this->container['dateParser']); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(0, $events); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreationDateFilter('>'.date('Y-m-d')); + $filter->setDateParser($this->container['dateParser']); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(0, $events); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreationDateFilter('>='.date('Y-m-d')); + $filter->setDateParser($this->container['dateParser']); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(1, $events); + } +} diff --git a/tests/units/Filter/ProjectActivityCreatorFilterTest.php b/tests/units/Filter/ProjectActivityCreatorFilterTest.php new file mode 100644 index 00000000..99c70322 --- /dev/null +++ b/tests/units/Filter/ProjectActivityCreatorFilterTest.php @@ -0,0 +1,91 @@ +container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreatorFilter('admin'); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(1, $events); + } + + public function testWithAnotherUsername() + { + $taskFinder = new TaskFinder($this->container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreatorFilter('John Doe'); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(0, $events); + } + + public function testWithCurrentUser() + { + $taskFinder = new TaskFinder($this->container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreatorFilter('me'); + $filter->setCurrentUserId(1); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(1, $events); + } + + public function testWithAnotherCurrentUser() + { + $taskFinder = new TaskFinder($this->container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityCreatorFilter('me'); + $filter->setCurrentUserId(2); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(0, $events); + } +} diff --git a/tests/units/Filter/ProjectActivityProjectNameFilterTest.php b/tests/units/Filter/ProjectActivityProjectNameFilterTest.php new file mode 100644 index 00000000..de9d7d59 --- /dev/null +++ b/tests/units/Filter/ProjectActivityProjectNameFilterTest.php @@ -0,0 +1,35 @@ +container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + $query = $projectActivityModel->getQuery(); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + $this->assertEquals(2, $projectModel->create(array('name' => 'P2'))); + + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + $this->assertEquals(2, $taskCreation->create(array('title' => 'Test', 'project_id' => 2))); + + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + $this->assertNotFalse($projectActivityModel->createEvent(2, 2, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(2)))); + + $filter = new ProjectActivityProjectNameFilter('P1'); + $filter->withQuery($query)->apply(); + $this->assertCount(1, $query->findAll()); + } +} diff --git a/tests/units/Filter/ProjectActivityTaskStatusFilterTest.php b/tests/units/Filter/ProjectActivityTaskStatusFilterTest.php new file mode 100644 index 00000000..b8df6338 --- /dev/null +++ b/tests/units/Filter/ProjectActivityTaskStatusFilterTest.php @@ -0,0 +1,49 @@ +container); + $taskCreation = new TaskCreation($this->container); + $taskStatus = new TaskStatus($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + $this->assertEquals(2, $taskCreation->create(array('title' => 'Test', 'project_id' => 1))); + + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 2, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(2)))); + + $this->assertTrue($taskStatus->close(1)); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityTaskStatusFilter('open'); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(1, $events); + $this->assertEquals(2, $events[0]['task_id']); + + $query = $projectActivityModel->getQuery(); + $filter = new ProjectActivityTaskStatusFilter('closed'); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(1, $events); + $this->assertEquals(1, $events[0]['task_id']); + } +} diff --git a/tests/units/Filter/ProjectActivityTaskTitleFilterTest.php b/tests/units/Filter/ProjectActivityTaskTitleFilterTest.php index 6a7c23af..925a1ab2 100644 --- a/tests/units/Filter/ProjectActivityTaskTitleFilterTest.php +++ b/tests/units/Filter/ProjectActivityTaskTitleFilterTest.php @@ -11,7 +11,7 @@ require_once __DIR__.'/../Base.php'; class ProjectActivityTaskTitleFilterTest extends Base { - public function testFilterByTaskId() + public function testWithFullTitle() { $taskFinder = new TaskFinder($this->container); $taskCreation = new TaskCreation($this->container); @@ -31,4 +31,49 @@ class ProjectActivityTaskTitleFilterTest extends Base $filter->withQuery($query)->apply(); $this->assertCount(1, $query->findAll()); } + + public function testWithPartialTitle() + { + $taskFinder = new TaskFinder($this->container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + $query = $projectActivityModel->getQuery(); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test1', 'project_id' => 1))); + $this->assertEquals(2, $taskCreation->create(array('title' => 'Test2', 'project_id' => 1))); + + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 2, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(2)))); + + $filter = new ProjectActivityTaskTitleFilter('test'); + $filter->withQuery($query)->apply(); + $this->assertCount(2, $query->findAll()); + } + + public function testWithId() + { + $taskFinder = new TaskFinder($this->container); + $taskCreation = new TaskCreation($this->container); + $projectModel = new Project($this->container); + $projectActivityModel = new ProjectActivity($this->container); + $query = $projectActivityModel->getQuery(); + + $this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); + + $this->assertEquals(1, $taskCreation->create(array('title' => 'Test1', 'project_id' => 1))); + $this->assertEquals(2, $taskCreation->create(array('title' => 'Test2', 'project_id' => 1))); + + $this->assertNotFalse($projectActivityModel->createEvent(1, 1, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(1)))); + $this->assertNotFalse($projectActivityModel->createEvent(1, 2, 1, Task::EVENT_CREATE, array('task' => $taskFinder->getById(2)))); + + $filter = new ProjectActivityTaskTitleFilter('#2'); + $filter->withQuery($query)->apply(); + + $events = $query->findAll(); + $this->assertCount(1, $events); + $this->assertEquals(2, $events[0]['task_id']); + } } -- cgit v1.2.3 From d8b6e7e26e947d4d3409ac4edad90217f0a74487 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Mon, 11 Apr 2016 18:16:58 -0400 Subject: Sync locales --- app/Locale/bs_BA/translations.php | 4 ++++ app/Locale/cs_CZ/translations.php | 4 ++++ app/Locale/da_DK/translations.php | 4 ++++ app/Locale/de_DE/translations.php | 4 ++++ app/Locale/el_GR/translations.php | 4 ++++ app/Locale/es_ES/translations.php | 4 ++++ app/Locale/fi_FI/translations.php | 4 ++++ app/Locale/hu_HU/translations.php | 4 ++++ app/Locale/id_ID/translations.php | 4 ++++ app/Locale/ja_JP/translations.php | 4 ++++ app/Locale/ko_KR/translations.php | 4 ++++ app/Locale/my_MY/translations.php | 4 ++++ app/Locale/nb_NO/translations.php | 4 ++++ app/Locale/nl_NL/translations.php | 4 ++++ app/Locale/pl_PL/translations.php | 4 ++++ app/Locale/pt_BR/translations.php | 4 ++++ app/Locale/pt_PT/translations.php | 4 ++++ app/Locale/ru_RU/translations.php | 4 ++++ app/Locale/sr_Latn_RS/translations.php | 4 ++++ app/Locale/sv_SE/translations.php | 4 ++++ app/Locale/th_TH/translations.php | 4 ++++ app/Locale/tr_TR/translations.php | 4 ++++ app/Locale/zh_CN/translations.php | 4 ++++ 23 files changed, 92 insertions(+) (limited to 'app/Locale/pl_PL/translations.php') diff --git a/app/Locale/bs_BA/translations.php b/app/Locale/bs_BA/translations.php index 19a11c44..fadf0a1b 100644 --- a/app/Locale/bs_BA/translations.php +++ b/app/Locale/bs_BA/translations.php @@ -1163,4 +1163,8 @@ return array( 'Search by task status: ' => 'Pretraga po statusu zadatka: ', 'Search by task title: ' => 'Pretraga po naslovu zadatka: ', 'Activity stream search' => 'Pretraga aktivnosti', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/cs_CZ/translations.php b/app/Locale/cs_CZ/translations.php index 3c8de1ad..777e9b42 100644 --- a/app/Locale/cs_CZ/translations.php +++ b/app/Locale/cs_CZ/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php index 747fa2d1..7c255561 100644 --- a/app/Locale/da_DK/translations.php +++ b/app/Locale/da_DK/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php index fa447e62..b154e6f9 100644 --- a/app/Locale/de_DE/translations.php +++ b/app/Locale/de_DE/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/el_GR/translations.php b/app/Locale/el_GR/translations.php index 84cf8462..664bf328 100644 --- a/app/Locale/el_GR/translations.php +++ b/app/Locale/el_GR/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php index e52c959b..6b4dda42 100644 --- a/app/Locale/es_ES/translations.php +++ b/app/Locale/es_ES/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php index f47852b0..f30b7b4c 100644 --- a/app/Locale/fi_FI/translations.php +++ b/app/Locale/fi_FI/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php index 9a2d666a..394f89a0 100644 --- a/app/Locale/hu_HU/translations.php +++ b/app/Locale/hu_HU/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/id_ID/translations.php b/app/Locale/id_ID/translations.php index 9cbca60e..bd1dd684 100644 --- a/app/Locale/id_ID/translations.php +++ b/app/Locale/id_ID/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php index 69ab5f17..89769edd 100644 --- a/app/Locale/ja_JP/translations.php +++ b/app/Locale/ja_JP/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/ko_KR/translations.php b/app/Locale/ko_KR/translations.php index f4320c55..ed9e3b86 100644 --- a/app/Locale/ko_KR/translations.php +++ b/app/Locale/ko_KR/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/my_MY/translations.php b/app/Locale/my_MY/translations.php index f6f15937..4537f38c 100644 --- a/app/Locale/my_MY/translations.php +++ b/app/Locale/my_MY/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/nb_NO/translations.php b/app/Locale/nb_NO/translations.php index f3d3047a..8c6a56f2 100644 --- a/app/Locale/nb_NO/translations.php +++ b/app/Locale/nb_NO/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php index f08f5eff..18155816 100644 --- a/app/Locale/nl_NL/translations.php +++ b/app/Locale/nl_NL/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php index 8222f9e1..d9427d80 100644 --- a/app/Locale/pl_PL/translations.php +++ b/app/Locale/pl_PL/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php index 60242d95..e0cdb17d 100644 --- a/app/Locale/pt_BR/translations.php +++ b/app/Locale/pt_BR/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/pt_PT/translations.php b/app/Locale/pt_PT/translations.php index 956d1259..ea8c9a93 100644 --- a/app/Locale/pt_PT/translations.php +++ b/app/Locale/pt_PT/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php index 1e548e0d..bf2bc559 100644 --- a/app/Locale/ru_RU/translations.php +++ b/app/Locale/ru_RU/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php index b69e6cf4..0399530e 100644 --- a/app/Locale/sr_Latn_RS/translations.php +++ b/app/Locale/sr_Latn_RS/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php index 634b87d0..7e738e70 100644 --- a/app/Locale/sv_SE/translations.php +++ b/app/Locale/sv_SE/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php index 1e913f28..6765e8ea 100644 --- a/app/Locale/th_TH/translations.php +++ b/app/Locale/th_TH/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php index 95bcc8a8..f771b106 100644 --- a/app/Locale/tr_TR/translations.php +++ b/app/Locale/tr_TR/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php index 7b0c3139..baa7693a 100644 --- a/app/Locale/zh_CN/translations.php +++ b/app/Locale/zh_CN/translations.php @@ -1163,4 +1163,8 @@ return array( // 'Search by task status: ' => '', // 'Search by task title: ' => '', // 'Activity stream search' => '', + // 'Projects where "%s" is manager' => '', + // 'Projects where "%s" is member' => '', + // 'Open tasks assigned to "%s"' => '', + // 'Closed tasks assigned to "%s"' => '', ); -- cgit v1.2.3