diff options
author | Michael Lüpkes <michael@luepkes.net> | 2015-01-13 11:42:49 +0100 |
---|---|---|
committer | Michael Lüpkes <michael@luepkes.net> | 2015-01-13 11:42:49 +0100 |
commit | 34bbdaeac8c407a97a611cb858617eff3483dbb3 (patch) | |
tree | c6b76c98f667236e8a23b009c6d4980a58707e22 | |
parent | 81f3131bbc4eaabf8f7e2d8825e0ba45a5e1b507 (diff) | |
parent | 46fd893bd6728031d5f4118f952bf6cce5017965 (diff) |
Merge remote-tracking branch 'upstream/master' into fguillot/kanboard
-rw-r--r-- | README.markdown | 4 | ||||
-rw-r--r-- | app.json | 8 | ||||
-rw-r--r-- | app/Locale/pt_BR/translations.php | 562 | ||||
-rw-r--r-- | app/Schema/Postgres.php | 2 | ||||
-rw-r--r-- | app/Subscriber/BootstrapSubscriber.php | 1 | ||||
-rw-r--r-- | app/Subscriber/ProjectModificationDateSubscriber.php | 9 | ||||
-rw-r--r-- | app/common.php | 12 | ||||
-rw-r--r-- | composer.json | 1 | ||||
-rw-r--r-- | composer.lock | 40 | ||||
-rw-r--r-- | docs/automatic-actions.markdown | 20 | ||||
-rw-r--r-- | docs/creating-projects.markdown | 6 | ||||
-rw-r--r-- | docs/creating-tasks.markdown | 4 | ||||
-rw-r--r-- | docs/email-configuration.markdown | 12 | ||||
-rw-r--r-- | docs/github-webhooks.markdown | 2 | ||||
-rw-r--r-- | docs/gitlab-webhooks.markdown | 2 | ||||
-rw-r--r-- | docs/heroku.markdown | 38 | ||||
-rw-r--r-- | docs/swimlanes.markdown | 11 | ||||
-rw-r--r-- | docs/syntax-guide.markdown | 2 | ||||
-rw-r--r-- | docs/update.markdown | 2 | ||||
-rw-r--r-- | docs/user-management.markdown | 13 | ||||
-rw-r--r-- | docs/what-is-kanban.markdown | 2 | ||||
-rwxr-xr-x | kanboard | 3 | ||||
-rwxr-xr-x | scripts/make-archive.sh | 10 | ||||
-rw-r--r-- | tests/units/ProjectTest.php | 2 |
24 files changed, 424 insertions, 344 deletions
diff --git a/README.markdown b/README.markdown index e83e8543..2402316d 100644 --- a/README.markdown +++ b/README.markdown @@ -16,6 +16,8 @@ Official website: <http://kanboard.net> [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/fguillot/kanboard/badges/quality-score.png?s=2b6490781608657cc8c43d02285bfafb4f489528)](https://scrutinizer-ci.com/g/fguillot/kanboard/) +[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy) + Features -------- @@ -97,6 +99,7 @@ Documentation - [Installation on Centos](docs/centos-installation.markdown) - [Installation on FreeBSD](docs/freebsd-installation.markdown) - [Installation on Windows Server with IIS](docs/windows-iis-installation.markdown) +- [Installation on Heroku](docs/heroku.markdown) - [Example with Nginx + HTTPS + SPDY + PHP-FPM](docs/nginx-ssl-php-fpm.markdown) #### Database @@ -150,6 +153,7 @@ Contributors: - Claudio Lobo - [Cluxter](https://github.com/cluxter) - [Cmer](https://github.com/chncsu) +- [Cynthia Pereira](https://github.com/cynthiapereira) - [David-Norris](https://github.com/David-Norris) - [Fengchao](https://github.com/fengchao) - [Floaltvater](https://github.com/floaltvater) diff --git a/app.json b/app.json new file mode 100644 index 00000000..0a45bb41 --- /dev/null +++ b/app.json @@ -0,0 +1,8 @@ +{ + "name": "Kanboard", + "description": "Kanboard is a simple visual task board", + "repository": "https://github.com/fguillot/kanboard", + "logo": "http://kanboard.net/assets/img/icon.svg", + "keywords": ["kanboard", "kanban", "php", "agile"], + "addons": ["heroku-postgresql:hobby-dev"] +}
\ No newline at end of file diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php index ce87af99..f155b045 100644 --- a/app/Locale/pt_BR/translations.php +++ b/app/Locale/pt_BR/translations.php @@ -4,8 +4,8 @@ return array( 'None' => 'Nenhum', 'edit' => 'editar', 'Edit' => 'Editar', - 'remove' => 'apagar', - 'Remove' => 'Apagar', + 'remove' => 'remover', + 'Remove' => 'Remover', 'Update' => 'Atualizar', 'Yes' => 'Sim', 'No' => 'Não', @@ -14,169 +14,169 @@ return array( 'Yellow' => 'Amarelo', 'Blue' => 'Azul', 'Green' => 'Verde', - 'Purple' => 'Violeta', + 'Purple' => 'Roxo', 'Red' => 'Vermelho', 'Orange' => 'Laranja', 'Grey' => 'Cinza', 'Save' => 'Salvar', 'Login' => 'Login', - 'Official website:' => 'Site web oficial :', + 'Official website:' => 'Site oficial:', 'Unassigned' => 'Não Atribuída', 'View this task' => 'Ver esta tarefa', 'Remove user' => 'Remover usuário', - 'Do you really want to remove this user: "%s"?' => 'Quer realmente remover este usuário: "%s"?', + 'Do you really want to remove this user: "%s"?' => 'Você realmente deseja remover este usuário: "%s"?', 'New user' => 'Novo usuário', 'All users' => 'Todos os usuários', - 'Username' => 'Nome do usuário', + 'Username' => 'Nome de usuário', 'Password' => 'Senha', - 'Default project' => 'Projeto default', + 'Default project' => 'Projeto padrão', 'Administrator' => 'Administrador', - 'Sign in' => 'Logar', + 'Sign in' => 'Entrar', 'Users' => 'Usuários', 'No user' => 'Sem usuário', 'Forbidden' => 'Proibido', 'Access Forbidden' => 'Acesso negado', 'Only administrators can access to this page.' => 'Somente administradores têm acesso a esta página.', 'Edit user' => 'Editar usuário', - 'Logout' => 'Logout', + 'Logout' => 'Sair', 'Bad username or password' => 'Usuário ou senha inválidos', 'users' => 'usuários', 'projects' => 'projetos', 'Edit project' => 'Editar projeto', 'Name' => 'Nome', - 'Activated' => 'Ativo', + 'Activated' => 'Ativado', 'Projects' => 'Projetos', 'No project' => 'Nenhum projeto', 'Project' => 'Projeto', 'Status' => 'Status', 'Tasks' => 'Tarefas', - 'Board' => 'Quadro', + 'Board' => 'Board', 'Actions' => 'Ações', 'Inactive' => 'Inativo', 'Active' => 'Ativo', 'Column %d' => 'Coluna %d', 'Add this column' => 'Adicionar esta coluna', - '%d tasks on the board' => '%d tarefas no quadro', + '%d tasks on the board' => '%d tarefas no board', '%d tasks in total' => '%d tarefas no total', - 'Unable to update this board.' => 'Impossível atualizar este quadro.', - 'Edit board' => 'Modificar quadro', + 'Unable to update this board.' => 'Não foi possível atualizar este board.', + 'Edit board' => 'Editar board', 'Disable' => 'Desativar', 'Enable' => 'Ativar', 'New project' => 'Novo projeto', - 'Do you really want to remove this project: "%s"?' => 'Quer realmente remover este projeto: "%s" ?', + 'Do you really want to remove this project: "%s"?' => 'Você realmente deseja remover este projeto: "%s" ?', 'Remove project' => 'Remover projeto', - 'Boards' => 'Quadros', - 'Edit the board for "%s"' => 'Editar o quadro para "%s"', + 'Boards' => 'Boards', + 'Edit the board for "%s"' => 'Editar o board para "%s"', 'All projects' => 'Todos os projetos', 'Change columns' => 'Modificar colunas', 'Add a new column' => 'Adicionar uma nova coluna', 'Title' => 'Título', - 'Add Column' => 'Adicionar coluna', + 'Add Column' => 'Adicionar Coluna', 'Project "%s"' => 'Projeto "%s"', 'Nobody assigned' => 'Ninguém designado', 'Assigned to %s' => 'Designado para %s', 'Remove a column' => 'Remover uma coluna', - 'Remove a column from a board' => 'Remover uma coluna do quadro', - 'Unable to remove this column.' => 'Impossível remover esta coluna.', - 'Do you really want to remove this column: "%s"?' => 'Quer realmente remover esta coluna: "%s"?', - 'This action will REMOVE ALL TASKS associated to this column!' => 'Esta ação vai REMOVER TODAS AS TAREFAS associadas a esta coluna!', - 'Settings' => 'Preferências', - 'Application settings' => 'Preferências da aplicação', + 'Remove a column from a board' => 'Remover uma coluna do board', + 'Unable to remove this column.' => 'Não foi possível remover esta coluna.', + 'Do you really want to remove this column: "%s"?' => 'Você realmente deseja remover esta coluna: "%s"?', + 'This action will REMOVE ALL TASKS associated to this column!' => 'Esta ação irá REMOVER TODAS AS TAREFAS associadas a esta coluna!', + 'Settings' => 'Configurações', + 'Application settings' => 'Configurações da aplicação', 'Language' => 'Idioma', 'Webhook token:' => 'Token de webhooks:', 'API token:' => 'API Token:', - 'More information' => 'Mais informação', + 'More information' => 'Mais informações', 'Database size:' => 'Tamanho do banco de dados:', 'Download the database' => 'Download do banco de dados', 'Optimize the database' => 'Otimizar o banco de dados', '(VACUUM command)' => '(Comando VACUUM)', '(Gzip compressed Sqlite file)' => '(Arquivo Sqlite comprimido com Gzip)', 'User settings' => 'Configurações do usuário', - 'My default project:' => 'Meu projeto default:', - 'Close a task' => 'Encerrar uma tarefa', - 'Do you really want to close this task: "%s"?' => 'Quer realmente encerrar esta tarefa: "%s"?', + 'My default project:' => 'Meu projeto padrão:', + 'Close a task' => 'Finalizar uma tarefa', + 'Do you really want to close this task: "%s"?' => 'Você realmente deseja finalizar esta tarefa: "%s"?', 'Edit a task' => 'Editar uma tarefa', 'Column' => 'Coluna', 'Color' => 'Cor', 'Assignee' => 'Designação', - 'Create another task' => 'Criar uma outra tarefa (aproveitando os dados preenchidos)', + 'Create another task' => 'Criar outra tarefa', 'New task' => 'Nova tarefa', 'Open a task' => 'Abrir uma tarefa', - 'Do you really want to open this task: "%s"?' => 'Quer realmente abrir esta tarefa: "%s"?', - 'Back to the board' => 'Voltar ao quadro', + 'Do you really want to open this task: "%s"?' => 'Você realmente deseja abrir esta tarefa: "%s"?', + 'Back to the board' => 'Voltar ao board', 'Created on %B %e, %Y at %k:%M %p' => 'Criado em %d %B %Y às %H:%M', 'There is nobody assigned' => 'Não há ninguém designado', - 'Column on the board:' => 'Coluna no quadro:', + 'Column on the board:' => 'Coluna no board:', 'Status is open' => 'Status está aberto', - 'Status is closed' => 'Status está encerrado', - 'Close this task' => 'Encerrar esta tarefa', + 'Status is closed' => 'Status está finalizado', + 'Close this task' => 'Finalizar esta tarefa', 'Open this task' => 'Abrir esta tarefa', 'There is no description.' => 'Não há descrição.', 'Add a new task' => 'Adicionar uma nova tarefa', 'The username is required' => 'O nome de usuário é obrigatório', - 'The maximum length is %d characters' => 'O tamanho máximo são %d caracteres', - 'The minimum length is %d characters' => 'O tamanho mínimo são %d caracteres', + 'The maximum length is %d characters' => 'O tamanho máximo é %d caracteres', + 'The minimum length is %d characters' => 'O tamanho mínimo é %d caracteres', 'The password is required' => 'A senha é obrigatória', - 'This value must be an integer' => 'O valor deve ser um inteiro', + 'This value must be an integer' => 'O valor deve ser um número inteiro', 'The username must be unique' => 'O nome de usuário deve ser único', - 'The username must be alphanumeric' => 'O nome de usuário deve ser alfanumérico, sem espaços ou _', - 'The user id is required' => 'O id de usuário é obrigatório', - 'Passwords don\'t match' => 'As senhas não conferem', + 'The username must be alphanumeric' => 'O nome de usuário deve ser alfanumérico', + 'The user id is required' => 'O ID de usuário é obrigatório', + 'Passwords don\'t match' => 'As senhas não coincidem', 'The confirmation is required' => 'A confirmação é obrigatória', 'The column is required' => 'A coluna é obrigatória', 'The project is required' => 'O projeto é obrigatório', 'The color is required' => 'A cor é obrigatória', - 'The id is required' => 'O id é obrigatório', - 'The project id is required' => 'O id do projeto é obrigatório', + 'The id is required' => 'O ID é obrigatório', + 'The project id is required' => 'O ID do projeto é obrigatório', 'The project name is required' => 'O nome do projeto é obrigatório', 'This project must be unique' => 'Este projeto deve ser único', 'The title is required' => 'O título é obrigatório', 'The language is required' => 'O idioma é obrigatório', 'There is no active project, the first step is to create a new project.' => 'Não há projeto ativo. O primeiro passo é criar um novo projeto.', 'Settings saved successfully.' => 'Configurações salvas com sucesso.', - 'Unable to save your settings.' => 'Impossível salvar suas configurações.', - 'Database optimization done.' => 'Otimização do banco de dados terminada.', + 'Unable to save your settings.' => 'Não é possível salvar suas configurações.', + 'Database optimization done.' => 'Otimização do banco de dados finalizada.', 'Your project have been created successfully.' => 'Seu projeto foi criado com sucesso.', - 'Unable to create your project.' => 'Impossível criar seu projeto.', + 'Unable to create your project.' => 'Não é possível criar o seu projeto.', 'Project updated successfully.' => 'Projeto atualizado com sucesso.', - 'Unable to update this project.' => 'Impossível atualizar este projeto.', - 'Unable to remove this project.' => 'Impossível remover este projeto.', + 'Unable to update this project.' => 'Não é possível atualizar este projeto.', + 'Unable to remove this project.' => 'Não é possível remover este projeto.', 'Project removed successfully.' => 'Projeto removido com sucesso.', 'Project activated successfully.' => 'Projeto ativado com sucesso.', - 'Unable to activate this project.' => 'Impossível ativar este projeto.', - 'Project disabled successfully.' => 'Projeto desabilitado com sucesso.', - 'Unable to disable this project.' => 'Impossível desabilitar este projeto.', - 'Unable to open this task.' => 'Impossível abrir esta tarefa.', + 'Unable to activate this project.' => 'Não é possível ativar este projeto.', + 'Project disabled successfully.' => 'Projeto desativado com sucesso.', + 'Unable to disable this project.' => 'Não é possível desativar este projeto.', + 'Unable to open this task.' => 'Não é possível abrir esta tarefa.', 'Task opened successfully.' => 'Tarefa aberta com sucesso.', - 'Unable to close this task.' => 'Impossível encerrar esta tarefa.', - 'Task closed successfully.' => 'Tarefa encerrada com sucesso.', - 'Unable to update your task.' => 'Impossível atualizar sua tarefa.', + 'Unable to close this task.' => 'Não é possível finalizar esta tarefa.', + 'Task closed successfully.' => 'Tarefa finalizada com sucesso.', + 'Unable to update your task.' => 'Não é possível atualizar a sua tarefa.', 'Task updated successfully.' => 'Tarefa atualizada com sucesso.', - 'Unable to create your task.' => 'Impossível criar sua tarefa.', + 'Unable to create your task.' => 'Não é possível criar a sua tarefa.', 'Task created successfully.' => 'Tarefa criada com sucesso.', 'User created successfully.' => 'Usuário criado com sucesso.', - 'Unable to create your user.' => 'Impossível criar seu usuário.', + 'Unable to create your user.' => 'Não é possível criar o seu usuário.', 'User updated successfully.' => 'Usuário atualizado com sucesso.', - 'Unable to update your user.' => 'Impossível atualizar seu usuário.', + 'Unable to update your user.' => 'Não é possível atualizar o seu usuário.', 'User removed successfully.' => 'Usuário removido com sucesso.', - 'Unable to remove this user.' => 'Impossível remover este usuário.', - 'Board updated successfully.' => 'Quadro atualizado com sucesso.', + 'Unable to remove this user.' => 'Não é possível remover este usuário.', + 'Board updated successfully.' => 'Board atualizado com sucesso.', 'Ready' => 'Pronto', 'Backlog' => 'Backlog', 'Work in progress' => 'Em andamento', - 'Done' => 'Encerrado', + 'Done' => 'Finalizado', 'Application version:' => 'Versão da aplicação:', - 'Completed on %B %e, %Y at %k:%M %p' => 'Encerrado em %d %B %Y às %H:%M', + 'Completed on %B %e, %Y at %k:%M %p' => 'Finalizado em %d %B %Y às %H:%M', '%B %e, %Y at %k:%M %p' => '%d %B %Y às %H:%M', 'Date created' => 'Data de criação', - 'Date completed' => 'Data de encerramento', + 'Date completed' => 'Data da finalização', 'Id' => 'Id', 'No task' => 'Nenhuma tarefa', - 'Completed tasks' => 'tarefas completadas', + 'Completed tasks' => 'Tarefas completadas', 'List of projects' => 'Lista de projetos', 'Completed tasks for "%s"' => 'Tarefas completadas por "%s"', - '%d closed tasks' => '%d tarefas encerradas', - 'No task for this project' => 'Nenhuma tarefa para este projeto', + '%d closed tasks' => '%d tarefas finalizadas', + 'No task for this project' => 'Não há tarefa para este projeto', 'Public link' => 'Link público', 'There is no column in your project!' => 'Não há colunas no seu projeto!', 'Change assignee' => 'Mudar a designação', @@ -191,8 +191,8 @@ return array( 'This value must be greater than %d' => 'Este valor deve ser maior que %d', 'Edit project access list' => 'Editar lista de acesso ao projeto', 'Edit users access' => 'Editar acesso de usuários', - 'Allow this user' => 'Permitir esse usuário', - 'Only those users have access to this project:' => 'Somente estes usuários têm acesso a este projeto:', + 'Allow this user' => 'Permitir este usuário', + 'Only those users have access to this project:' => 'Somente esses usuários têm acesso a este projeto:', 'Don\'t forget that administrators have access to everything.' => 'Não esqueça que administradores têm acesso a tudo.', 'Revoke' => 'Revogar', 'List of authorized users' => 'Lista de usuários autorizados', @@ -205,20 +205,20 @@ return array( 'Leave a comment' => 'Deixe um comentário', 'Comment is required' => 'Comentário é obrigatório', 'Leave a description' => 'Deixe uma descrição', - 'Comment added successfully.' => 'Cpmentário adicionado com sucesso.', - 'Unable to create your comment.' => 'Impossível criar seu comentário.', + 'Comment added successfully.' => 'Comentário adicionado com sucesso.', + 'Unable to create your comment.' => 'Não é possível criar o seu comentário.', 'The description is required' => 'A descrição é obrigatória', 'Edit this task' => 'Editar esta tarefa', 'Due Date' => 'Data de vencimento', 'Invalid date' => 'Data inválida', - 'Must be done before %B %e, %Y' => 'Deve ser feito antes de %d %B %Y', + 'Must be done before %B %e, %Y' => 'Deve ser finalizado antes de %d %B %Y', '%B %e, %Y' => '%d %B %Y', - // '%b %e, %Y' => '', + '%b %e, %Y' => '%d %B %Y', 'Automatic actions' => 'Ações automáticas', 'Your automatic action have been created successfully.' => 'Sua ação automética foi criada com sucesso.', - 'Unable to create your automatic action.' => 'Impossível criar sua ação automática.', + 'Unable to create your automatic action.' => 'Não é possível criar sua ação automática.', 'Remove an action' => 'Remover uma ação', - 'Unable to remove this action.' => 'Impossível remover esta ação.', + 'Unable to remove this action.' => 'Não é possível remover esta ação.', 'Action removed successfully.' => 'Ação removida com sucesso.', 'Automatic actions for the project "%s"' => 'Ações automáticas para o projeto "%s"', 'Defined actions' => 'Ações definidas', @@ -228,22 +228,22 @@ return array( 'Action parameters' => 'Parâmetros da ação', 'Action' => 'Ação', 'Event' => 'Evento', - 'When the selected event occurs execute the corresponding action.' => 'Quando o evento selecionado ocorrer, execute a ação correspondente.', + 'When the selected event occurs execute the corresponding action.' => 'Quando o evento selecionado ocorrer execute a ação correspondente.', 'Next step' => 'Próximo passo', 'Define action parameters' => 'Definir parêmetros da ação', 'Save this action' => 'Salvar esta ação', - 'Do you really want to remove this action: "%s"?' => 'Você quer realmente remover esta ação: "%s"?', - 'Remove an automatic action' => 'Remove uma ação automática', - 'Close the task' => 'Encerrar tarefa', + 'Do you really want to remove this action: "%s"?' => 'Você realmente deseja remover esta ação: "%s"?', + 'Remove an automatic action' => 'Remover uma ação automática', + 'Close the task' => 'Finalizar tarefa', 'Assign the task to a specific user' => 'Designar a tarefa para um usuário específico', 'Assign the task to the person who does the action' => 'Designar a tarefa para a pessoa que executa a ação', 'Duplicate the task to another project' => 'Duplicar a tarefa para um outro projeto', 'Move a task to another column' => 'Mover a tarefa para outra coluna', - 'Move a task to another position in the same column' => 'Mover a tarefa para outra posição, na mesma coluna', + 'Move a task to another position in the same column' => 'Mover a tarefa para outra posição na mesma coluna', 'Task modification' => 'Modificação de tarefa', 'Task creation' => 'Criação de tarefa', - 'Open a closed task' => 'Reabrir uma tarefa encerrada', - 'Closing a task' => 'Encerrando uma tarefa', + 'Open a closed task' => 'Reabrir uma tarefa finalizada', + 'Closing a task' => 'Finalizando uma tarefa', 'Assign a color to a specific user' => 'Designar uma cor para um usuário específico', 'Column title' => 'Título da coluna', 'Position' => 'Posição', @@ -254,26 +254,26 @@ return array( 'link' => 'link', 'Update this comment' => 'Atualizar este comentário', 'Comment updated successfully.' => 'Comentário atualizado com sucesso.', - 'Unable to update your comment.' => 'Impossível atualizar seu comentário.', + 'Unable to update your comment.' => 'Não é possível atualizar o seu comentário.', 'Remove a comment' => 'Remover um comentário', 'Comment removed successfully.' => 'Comentário removido com sucesso.', - 'Unable to remove this comment.' => 'Impossível remover este comentário.', - 'Do you really want to remove this comment?' => 'Você tem certeza de que quer remover este comentário?', - 'Only administrators or the creator of the comment can access to this page.' => 'Somente administradores ou o criator deste comentário tem acesso a esta página.', + 'Unable to remove this comment.' => 'Não é possível remover este comentário.', + 'Do you really want to remove this comment?' => 'Você realmente deseja remover este comentário?', + 'Only administrators or the creator of the comment can access to this page.' => 'Somente os administradores ou o criator deste comentário possuem acesso a esta página.', 'Details' => 'Detalhes', 'Current password for the user "%s"' => 'Senha atual para o usuário "%s"', 'The current password is required' => 'A senha atual é obrigatória', - 'Wrong password' => 'Senha errada', - 'Reset all tokens' => 'Reiniciar todos os tokens', + 'Wrong password' => 'Senha incorreta', + 'Reset all tokens' => 'Resetar todos os tokens', 'All tokens have been regenerated.' => 'Todos os tokens foram gerados novamente.', 'Unknown' => 'Desconhecido', 'Last logins' => 'Últimos logins', 'Login date' => 'Data de login', 'Authentication method' => 'Método de autenticação', 'IP address' => 'Endereço IP', - 'User agent' => 'Agente usuário', + 'User agent' => 'User Agent', 'Persistent connections' => 'Conexões persistentes', - 'No session.' => 'Sem sessão.', + 'No session.' => 'Nenhuma sessão.', 'Expiration date' => 'Data de expiração', 'Remember Me' => 'Lembre-se de mim', 'Creation date' => 'Data de criação', @@ -281,25 +281,25 @@ return array( 'Filter by due date' => 'Filtrar por data de vencimento', 'Everybody' => 'Todos', 'Open' => 'Abrir', - 'Closed' => 'Encerrado', + 'Closed' => 'Finalizado', 'Search' => 'Pesquisar', - 'Nothing found.' => 'Não encontrado.', - 'Search in the project "%s"' => 'Procure no projeto "%s"', + 'Nothing found.' => 'Nada foi encontrado.', + 'Search in the project "%s"' => 'Pesquisar no projeto "%s"', 'Due date' => 'Data de vencimento', 'Others formats accepted: %s and %s' => 'Outros formatos permitidos: %s e %s', 'Description' => 'Descrição', '%d comments' => '%d comentários', '%d comment' => '%d comentário', 'Email address invalid' => 'Endereço de e-mail inválido', - 'Your Google Account is not linked anymore to your profile.' => 'Sua conta Google não está mais associada ao seu perfil.', - 'Unable to unlink your Google Account.' => 'Impossível desassociar sua conta Google.', + 'Your Google Account is not linked anymore to your profile.' => 'Sua conta do Google não está mais associada ao seu perfil.', + 'Unable to unlink your Google Account.' => 'Não foi possível desassociar a sua Conta do Google.', 'Google authentication failed' => 'Autenticação do Google falhou.', - 'Unable to link your Google Account.' => 'Impossível associar a sua conta do Google.', - 'Your Google Account is linked to your profile successfully.' => 'Sua Conta do Google está ligada ao seu perfil com sucesso.', + 'Unable to link your Google Account.' => 'Não foi possível associar a sua Conta do Google.', + 'Your Google Account is linked to your profile successfully.' => 'Sua Conta do Google foi associada ao seu perfil com sucesso.', 'Email' => 'E-mail', - 'Link my Google Account' => 'Vincular minha conta Google', - 'Unlink my Google Account' => 'Desvincular minha conta do Google', - 'Login with my Google Account' => 'Entrar com minha conta do Google', + 'Link my Google Account' => 'Vincular minha Conta do Google', + 'Unlink my Google Account' => 'Desvincular minha Conta do Google', + 'Login with my Google Account' => 'Entrar com minha Conta do Google', 'Project not found.' => 'Projeto não encontrado.', 'Task #%d' => 'Tarefa #%d', 'Task removed successfully.' => 'Tarefa removida com sucesso.', @@ -313,8 +313,8 @@ return array( 'Category:' => 'Categoria:', 'Categories' => 'Categorias', 'Category not found.' => 'Categoria não encontrada.', - 'Your category have been created successfully.' => 'Seu categoria foi criada com sucesso.', - 'Unable to create your category.' => 'Não é possível criar sua categoria.', + 'Your category have been created successfully.' => 'Sua categoria foi criada com sucesso.', + 'Unable to create your category.' => 'Não foi possível criar a sua categoria.', 'Your category have been updated successfully.' => 'A sua categoria foi atualizada com sucesso.', 'Unable to update your category.' => 'Não foi possível atualizar a sua categoria.', 'Remove a category' => 'Remover uma categoria', @@ -327,7 +327,7 @@ return array( 'Do you really want to remove this category: "%s"?' => 'Você realmente deseja remover esta categoria: "%s"', 'Filter by category' => 'Filtrar por categoria', 'All categories' => 'Todas as categorias', - 'No category' => 'Sem categoria', + 'No category' => 'Nenhum categoria', 'The name is required' => 'O nome é obrigatório', 'Remove a file' => 'Remover um arquivo', 'Unable to remove this file.' => 'Não foi possível remover este arquivo.', @@ -344,60 +344,60 @@ return array( 'Time tracking' => 'Rastreamento de tempo', 'Estimate:' => 'Estimado:', 'Spent:' => 'Gasto:', - 'Do you really want to remove this sub-task?' => 'Você realmente deseja remover esta sub-tarefa?', + 'Do you really want to remove this sub-task?' => 'Você realmente deseja remover esta subtarefa?', 'Remaining:' => 'Restante:', 'hours' => 'horas', 'spent' => 'gasto', - 'estimated' => 'estimada', - 'Sub-Tasks' => 'Sub-tarefas', - 'Add a sub-task' => 'Adicionar uma sub-tarefa', + 'estimated' => 'estimado', + 'Sub-Tasks' => 'Subtarefas', + 'Add a sub-task' => 'Adicionar uma subtarefa', 'Original estimate' => 'Estimativa original', - 'Create another sub-task' => 'Criar uma outra sub-tarefa', + 'Create another sub-task' => 'Criar uma outra subtarefa', 'Time spent' => 'Tempo gasto', - 'Edit a sub-task' => 'Editar uma sub-tarefa', - 'Remove a sub-task' => 'Remover uma sub-tarefa', + 'Edit a sub-task' => 'Editar uma subtarefa', + 'Remove a sub-task' => 'Remover uma subtarefa', 'The time must be a numeric value' => 'O tempo deve ser um valor numérico', - 'Todo' => 'A fazer', + 'Todo' => 'À fazer', 'In progress' => 'Em andamento', - 'Sub-task removed successfully.' => 'Sub-tarefa removido com sucesso.', - 'Unable to remove this sub-task.' => 'Não foi possível remover esta sub-tarefa.', - 'Sub-task updated successfully.' => 'Sub-tarefa atualizada com sucesso.', - 'Unable to update your sub-task.' => 'Não foi possível atualizar sua sub-tarefa.', - 'Unable to create your sub-task.' => 'Não é possível criar sua sub-tarefa.', - 'Sub-task added successfully.' => 'Sub-tarefa adicionada com sucesso.', - 'Maximum size: ' => 'O tamanho máximo:', + 'Sub-task removed successfully.' => 'Subtarefa removida com sucesso.', + 'Unable to remove this sub-task.' => 'Não foi possível remover esta subtarefa.', + 'Sub-task updated successfully.' => 'Subtarefa atualizada com sucesso.', + 'Unable to update your sub-task.' => 'Não foi possível atualizar a sua subtarefa.', + 'Unable to create your sub-task.' => 'Não é possível criar a sua subtarefa.', + 'Sub-task added successfully.' => 'Subtarefa adicionada com sucesso.', + 'Maximum size: ' => 'Tamanho máximo:', 'Unable to upload the file.' => 'Não foi possível carregar o arquivo.', - 'Display another project' => 'Mostrar um outro projeto', - 'Your GitHub account was successfully linked to your profile.' => 'A sua conta GitHub foi ligada com sucesso ao seu perfil.', - 'Unable to link your GitHub Account.' => 'Não foi possível vincular sua conta GitHub.', - 'GitHub authentication failed' => 'Falhou autenticação GitHub', - 'Your GitHub account is no longer linked to your profile.' => 'A sua conta GitHub já não está ligada ao seu perfil.', - 'Unable to unlink your GitHub Account.' => 'Não foi possível desvincular sua conta GitHub.', - 'Login with my GitHub Account' => 'Entrar com minha conta do GitHub', - 'Link my GitHub Account' => 'Vincular minha conta GitHub', - 'Unlink my GitHub Account' => 'Desvincular minha conta do GitHub', + 'Display another project' => 'Exibir outro projeto', + 'Your GitHub account was successfully linked to your profile.' => 'A sua Conta do GitHub foi associada com sucesso ao seu perfil.', + 'Unable to link your GitHub Account.' => 'Não foi possível associar sua Conta do GitHub.', + 'GitHub authentication failed' => 'Autenticação do GitHub falhou', + 'Your GitHub account is no longer linked to your profile.' => 'A sua Conta do GitHub não está mais associada ao seu perfil.', + 'Unable to unlink your GitHub Account.' => 'Não foi possível desassociar a sua Conta do GitHub.', + 'Login with my GitHub Account' => 'Entrar com minha Conta do GitHub', + 'Link my GitHub Account' => 'Associar à minha Conta do GitHub', + 'Unlink my GitHub Account' => 'Desassociar a minha Conta do GitHub', 'Created by %s' => 'Criado por %s', 'Last modified on %B %e, %Y at %k:%M %p' => 'Última modificação em %B %e, %Y às %k: %M %p', - 'Tasks Export' => 'Tarefas Export', - 'Tasks exportation for "%s"' => 'Tarefas exportação para "%s"', + 'Tasks Export' => 'Exportar Tarefas', + 'Tasks exportation for "%s"' => 'As tarefas foram exportadas para "%s"', 'Start Date' => 'Data inicial', 'End Date' => 'Data final', 'Execute' => 'Executar', - 'Task Id' => 'Id da Tarefa', - 'Creator' => 'Criador', - 'Modification date' => 'Data de modificação', - 'Completion date' => 'Data de conclusão', + 'Task Id' => 'ID da Tarefa', + 'Creator' => 'Criado por', + 'Modification date' => 'Data da modificação', + 'Completion date' => 'Data da finalização', 'Webhook URL for task creation' => 'Webhook URL para criação de tarefas', - 'Webhook URL for task modification' => 'Webhook URL para modificação tarefa', - 'Clone' => 'Clone', + 'Webhook URL for task modification' => 'Webhook URL para modificação de tarefa', + 'Clone' => 'Clonar', 'Clone Project' => 'Clonar Projeto', 'Project cloned successfully.' => 'Projeto clonado com sucesso.', - 'Unable to clone this project.' => 'Impossível clonar este projeto.', + 'Unable to clone this project.' => 'Não foi possível clonar este projeto.', 'Email notifications' => 'Notificações por email', 'Enable email notifications' => 'Habilitar notificações por email', 'Task position:' => 'Posição da tarefa:', 'The task #%d have been opened.' => 'A tarefa #%d foi aberta.', - 'The task #%d have been closed.' => 'A tarefa #%d foi encerrada.', + 'The task #%d have been closed.' => 'A tarefa #%d foi finalizada.', 'Sub-task updated' => 'Subtarefa atualizada', 'Title:' => 'Título:', 'Status:' => 'Status:', @@ -408,18 +408,18 @@ return array( 'Comment updated' => 'Comentário atualizado', 'New comment posted by %s' => 'Novo comentário postado por %s', 'List of due tasks for the project "%s"' => 'Lista de tarefas pendentes para o projeto "%s"', - // '[%s][New attachment] %s (#%d)' => '', - // '[%s][New comment] %s (#%d)' => '', - // '[%s][Comment updated] %s (#%d)' => '', - // '[%s][New subtask] %s (#%d)' => '', - // '[%s][Subtask updated] %s (#%d)' => '', - // '[%s][New task] %s (#%d)' => '', - // '[%s][Task updated] %s (#%d)' => '', - // '[%s][Task closed] %s (#%d)' => '', - // '[%s][Task opened] %s (#%d)' => '', - // '[%s][Due tasks]' => '', + '[%s][New attachment] %s (#%d)' => '[%s][Novo anexo] %s (#%d)', + '[%s][New comment] %s (#%d)' => '[%s][Novo comentário] %s (#%d)', + '[%s][Comment updated] %s (#%d)' => '[%s][Comentário atualizado] %s (#%d)', + '[%s][New subtask] %s (#%d)' => '[%s][Nova subtarefa] %s (#%d)', + '[%s][Subtask updated] %s (#%d)' => '[%s][Subtarefa atualizada] %s (#%d)', + '[%s][New task] %s (#%d)' => '[%s][Nova tarefa] %s (#%d)', + '[%s][Task updated] %s (#%d)' => '[%s][Tarefa atualizada] %s (#%d)', + '[%s][Task closed] %s (#%d)' => '[%s][Tarefa finalizada] %s (#%d)', + '[%s][Task opened] %s (#%d)' => '[%s][Tarefa aberta] %s (#%d)', + '[%s][Due tasks]' => '[%s][Tarefas pendentes]', '[Kanboard] Notification' => '[Kanboard] Notificação', - 'I want to receive notifications only for those projects:' => 'Quero receber notificações somente para estes projetos:', + 'I want to receive notifications only for those projects:' => 'Quero receber notificações apenas destes projetos:', 'view the task on Kanboard' => 'ver a tarefa no Kanboard', 'Public access' => 'Acesso público', 'Category management' => 'Gerenciamento de categorias', @@ -430,17 +430,17 @@ return array( 'Active projects' => 'Projetos ativos', 'Inactive projects' => 'Projetos inativos', 'Public access disabled' => 'Acesso público desabilitado', - 'Do you really want to disable this project: "%s"?' => 'Deseja ralmente desabilitar este projeto: "%s"?', - 'Do you really want to duplicate this project: "%s"?' => 'Deseja realmente duplicar este projeto: "%s"?', - 'Do you really want to enable this project: "%s"?' => 'Deseja realmente habilitar este projeto: "%s"?', - 'Project activation' => 'Avaliação do projeto', + 'Do you really want to disable this project: "%s"?' => 'Você realmente deseja desabilitar este projeto: "%s"?', + 'Do you really want to duplicate this project: "%s"?' => 'Você realmente deseja duplicar este projeto: "%s"?', + 'Do you really want to enable this project: "%s"?' => 'Você realmente deseja habilitar este projeto: "%s"?', + 'Project activation' => 'Ativação do projeto', 'Move the task to another project' => 'Mover a tarefa para outro projeto', 'Move to another project' => 'Mover para outro projeto', - 'Do you really want to duplicate this task?' => 'Deseja realmente duplicar esta tarefa?', - 'Duplicate a task' => 'Duplicar tarefa', + 'Do you really want to duplicate this task?' => 'Você realmente deseja duplicar esta tarefa?', + 'Duplicate a task' => 'Duplicar uma tarefa', 'External accounts' => 'Contas externas', 'Account type' => 'Tipo de conta', - // 'Local' => '', + 'Local' => 'Local', 'Remote' => 'Remoto', 'Enabled' => 'Habilitado', 'Disabled' => 'Desabilitado', @@ -448,12 +448,12 @@ return array( 'Github account linked' => 'Conta do Github associada', 'Username:' => 'Usuário:', 'Name:' => 'Nome:', - // 'Email:' => '', + 'Email:' => 'E-mail:', 'Default project:' => 'Projeto padrão:', 'Notifications:' => 'Notificações:', 'Notifications' => 'Notificações', - 'Group:' => 'Groupo:', - 'Regular user' => 'Usuário habitual', + 'Group:' => 'Grupo:', + 'Regular user' => 'Usuário comum', 'Account type:' => 'Tipo de conta:', 'Edit profile' => 'Editar perfil', 'Change password' => 'Alterar senha', @@ -464,33 +464,33 @@ return array( 'Never connected.' => 'Nunca conectado.', 'No account linked.' => 'Nenhuma conta associada.', 'Account linked.' => 'Conta associada.', - 'No external authentication enabled.' => 'Nenhuma autenticação externa permitida.', + 'No external authentication enabled.' => 'Nenhuma autenticação externa habilitada.', 'Password modified successfully.' => 'Senha alterada com sucesso.', 'Unable to change the password.' => 'Não foi possível alterar a senha.', - 'Change category for the task "%s"' => 'Mudar categoria para a tarefa "%s"', + 'Change category for the task "%s"' => 'Mudar categoria da tarefa "%s"', 'Change category' => 'Mudar categoria', - // '%s updated the task %s' => '', - // '%s opened the task %s' => '', - // '%s moved the task %s to the position #%d in the column "%s"' => '', - // '%s moved the task %s to the column "%s"' => '', - // '%s created the task %s' => '', - // '%s closed the task %s' => '', - '%s created a subtask for the task %s' => '%s criou uma sub-tarefa para a tarefa %s', - '%s updated a subtask for the task %s' => '%s atualizou uma sub-tarefa da tarefa %s', + '%s updated the task %s' => '%s atualizou a tarefa %s', + '%s opened the task %s' => '%s abriu a tarefa %s', + '%s moved the task %s to the position #%d in the column "%s"' => '%s moveu a tarefa %s para a posição #%d na coluna "%s"', + '%s moved the task %s to the column "%s"' => '%s moveu a tarefa %s para a coluna "%s"', + '%s created the task %s' => '%s criou a tarefa %s', + '%s closed the task %s' => '%s finalizou a tarefa %s', + '%s created a subtask for the task %s' => '%s criou uma subtarefa para a tarefa %s', + '%s updated a subtask for the task %s' => '%s atualizou uma subtarefa da tarefa %s', 'Assigned to %s with an estimate of %s/%sh' => 'Designado para %s com tempo estimado de %s/%sh', 'Not assigned, estimate of %sh' => 'Não designado, estimado em %sh', '%s updated a comment on the task %s' => '%s atualizou o comentário na tarefa %s', '%s commented the task %s' => '%s comentou a tarefa %s', '%s\'s activity' => 'Atividades de%s', 'No activity.' => 'Sem atividade.', - // 'RSS feed' => '', - '%s updated a comment on the task #%d' => '%s atualizou um comentário na tarefa #%d', - '%s commented on the task #%d' => '%s comentou na tarefa #%d', - '%s updated a subtask for the task #%d' => '%s atualizou uma sub-tarefa para a tarefa #%d', - '%s created a subtask for the task #%d' => '%s criou uma sub-tarefa para a tarefa #%d', + 'RSS feed' => 'Feed RSS', + '%s updated a comment on the task #%d' => '%s atualizou um comentário sobre a tarefa #%d', + '%s commented on the task #%d' => '%s comentou sobre a tarefa #%d', + '%s updated a subtask for the task #%d' => '%s atualizou uma subtarefa para a tarefa #%d', + '%s created a subtask for the task #%d' => '%s criou uma subtarefa para a tarefa #%d', '%s updated the task #%d' => '%s atualizou a tarefa #%d', '%s created the task #%d' => '%s criou a tarefa #%d', - '%s closed the task #%d' => '%s encerrou a tarefa #%d', + '%s closed the task #%d' => '%s finalizou a tarefa #%d', '%s open the task #%d' => '%s abriu a tarefa #%d', '%s moved the task #%d to the column "%s"' => '%s moveu a tarefa #%d para a coluna "%s"', '%s moved the task #%d to the position %d in the column "%s"' => '%s moveu a tarefa #%d para a posição %d na coluna "%s"', @@ -500,152 +500,152 @@ return array( 'Task assignee change' => 'Mudar designação da tarefa', '%s change the assignee of the task #%d to %s' => '%s mudou a designação da tarefa #%d para %s', '%s changed the assignee of the task %s to %s' => '%s mudou a designação da tarefa %s para %s', - // '[%s][Column Change] %s (#%d)' => '', - // '[%s][Position Change] %s (#%d)' => '', - // '[%s][Assignee Change] %s (#%d)' => '', - 'New password for the user "%s"' => 'Novo password para o usuário "%s"', + '[%s][Column Change] %s (#%d)' => '[%s][Modificou Coluna] %s (#%d)', + '[%s][Position Change] %s (#%d)' => '[%s][Modificou Posição] %s (#%d)', + '[%s][Assignee Change] %s (#%d)' => '[%s][Modificou Designação] %s (#%d)', + 'New password for the user "%s"' => 'Nova senha para o usuário "%s"', 'Choose an event' => 'Escolher um evento', - // 'Github commit received' => '', - // 'Github issue opened' => '', - // 'Github issue closed' => '', - // 'Github issue reopened' => '', - // 'Github issue assignee change' => '', - // 'Github issue label change' => '', - 'Create a task from an external provider' => 'Criar uma tarefa a partir de um provedor externo', - 'Change the assignee based on an external username' => 'Alterar designação com vase em um usuário externo!', + 'Github commit received' => 'Github commit received', + 'Github issue opened' => 'Github issue opened', + 'Github issue closed' => 'Github issue closed', + 'Github issue reopened' => 'Github issue reopened', + 'Github issue assignee change' => 'Github issue assignee change', + 'Github issue label change' => 'Github issue label change', + 'Create a task from an external provider' => 'Criar uma tarefa por meio de um serviço externo', + 'Change the assignee based on an external username' => 'Alterar designação com base em um usuário externo', 'Change the category based on an external label' => 'Alterar categoria com base em um rótulo externo', - 'Reference' => 'Referencia', - 'Reference: %s' => 'Referencia: %s', + 'Reference' => 'Referência', + 'Reference: %s' => 'Referência: %s', 'Label' => 'Rótulo', 'Database' => 'Banco de dados', 'About' => 'Sobre', - // 'Database driver:' => '', - // 'Board settings' => '', - // 'URL and token' => '', - // 'Webhook settings' => '', - // 'URL for task creation:' => '', - // 'Reset token' => '', - // 'API endpoint:' => '', - // 'Refresh interval for private board' => '', - // 'Refresh interval for public board' => '', - // 'Task highlight period' => '', - // 'Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)' => '', - // 'Frequency in second (60 seconds by default)' => '', - // 'Frequency in second (0 to disable this feature, 10 seconds by default)' => '', + 'Database driver:' => 'Driver do banco de dados:', + 'Board settings' => 'Configurações do Board', + 'URL and token' => 'URL e token', + 'Webhook settings' => 'Configurações do Webhook', + 'URL for task creation:' => 'URL para a criação da tarefa:', + 'Reset token' => 'Resetar token', + 'API endpoint:' => 'API endpoint:', + 'Refresh interval for private board' => 'Intervalo de atualização para um board privado', + 'Refresh interval for public board' => 'Intervalo de atualização para um board público', + 'Task highlight period' => 'Período de Tarefa em destaque', + 'Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)' => 'Período (em segundos) para considerar que uma tarefa foi modificada recentemente (0 para desativar, 2 dias por padrão)', + 'Frequency in second (60 seconds by default)' => 'Frequência em segundos (60 segundos por padrão)', + 'Frequency in second (0 to disable this feature, 10 seconds by default)' => 'Frequência em segundos (0 para desativar este recurso, 10 segundos por padrão)', 'Application URL' => 'URL da Aplicação', - // 'Example: http://example.kanboard.net/ (used by email notifications)' => '', - // 'Token regenerated.' => '', + 'Example: http://example.kanboard.net/ (used by email notifications)' => 'Exemplo: http://example.kanboard.net/ (utilizado nas notificações por e-mail)', + 'Token regenerated.' => 'Token ', 'Date format' => 'Formato de data', 'ISO format is always accepted, example: "%s" and "%s"' => 'O formato ISO é sempre aceito, exemplo: "%s" e "%s"', 'New private project' => 'Novo projeto privado', 'This project is private' => 'Este projeto é privado', - 'Type here to create a new sub-task' => 'Digite aqui para criar uma nova sub-tarefa', + 'Type here to create a new sub-task' => 'Digite aqui para criar uma nova subtarefa', 'Add' => 'Adicionar', 'Estimated time: %s hours' => 'Tempo estimado: %s horas', 'Time spent: %s hours' => 'Tempo gasto: %s horas', 'Started on %B %e, %Y' => 'Iniciado em %B %e, %Y', 'Start date' => 'Data de início', 'Time estimated' => 'Tempo estimado', - 'There is nothing assigned to you.' => 'Não há nada designado para você.', + 'There is nothing assigned to you.' => 'Não há nada designado à você.', 'My tasks' => 'Minhas tarefas', - // 'Activity stream' => '', - // 'Dashboard' => '', + 'Activity stream' => 'Atividades Recentes', + 'Dashboard' => 'Painel de Controle', 'Confirmation' => 'Confirmação', 'Allow everybody to access to this project' => 'Permitir que todos acessem este projeto', 'Everybody have access to this project.' => 'Todos possuem acesso a este projeto.', - // 'Webhooks' => '', - // 'API' => '', + 'Webhooks' => 'Webhooks', + 'API' => 'API', 'Integration' => 'Integração', - // 'Github webhooks' => '', + 'Github webhooks' => 'Github webhooks', 'Help on Github webhooks' => 'Ajuda para o Github webhooks', - 'Create a comment from an external provider' => 'Criar um comentário de um provedor externo', - // 'Github issue comment created' => '', + 'Create a comment from an external provider' => 'Criar um comentário por meio de um serviço externo', + 'Github issue comment created' => 'Github issue comment created', 'Configure' => 'Configurar', 'Project management' => 'Gerenciamento de projetos', 'My projects' => 'Meus projetos', 'Columns' => 'Colunas', 'Task' => 'Tarefas', - 'Your are not member of any project.' => 'Você não é menmbro de nenhum projeto.', + 'Your are not member of any project.' => 'Você não é membro de nenhum projeto.', 'Percentage' => 'Porcentagem', 'Number of tasks' => 'Número de tarefas', 'Task distribution' => 'Distribuição de tarefas', 'Reportings' => 'Relatórios', - // 'Task repartition for "%s"' => '', + 'Task repartition for "%s"' => 'Redistribuição da tarefa para "%s"', 'Analytics' => 'Estatísticas', - 'Subtask' => 'Sub-tarefa', - 'My subtasks' => 'Minhas sub-tarefas', - 'User repartition' => 'Repartição de usuário', - 'User repartition for "%s"' => 'Repartição de usuário para "%s"', - 'Clone this project' => 'Clonar o projeto', + 'Subtask' => 'Subtarefa', + 'My subtasks' => 'Minhas subtarefas', + 'User repartition' => 'Redistribuição de usuário', + 'User repartition for "%s"' => 'Redistribuição de usuário para "%s"', + 'Clone this project' => 'Clonar este projeto', 'Column removed successfully.' => 'Coluna removida com sucesso.', 'Edit Project' => 'Editar projeto', - // 'Github Issue' => '', - 'Not enough data to show the graph.' => 'Dados insuficientes para exibir o gráfico.', + 'Github Issue' => 'Github Issue', + 'Not enough data to show the graph.' => 'Não há dados suficientes para mostrar o gráfico.', 'Previous' => 'Anterior', - 'The id must be an integer' => 'A ID deve ser um inteiro', - 'The project id must be an integer' => 'A ID do projeto deve ser um inteiro', - 'The status must be an integer' => 'O status deve ser um inteiro', - 'The subtask id is required' => 'A ID da sub-tarefa é requerida', - 'The subtask id must be an integer' => 'A ID da sub-tarefa deve ser um inteiro', - 'The task id is required' => 'A ID da tarefa é requerida', - 'The task id must be an integer' => 'A ID da tarefa deve ser um inteiro', - 'The user id must be an integer' => 'A ID de usuário deve ser um inteiro', - 'This value is required' => 'Este valor é requerido', + 'The id must be an integer' => 'O ID deve ser um número inteiro', + 'The project id must be an integer' => 'O ID do projeto deve ser um inteiro', + 'The status must be an integer' => 'O status deve ser um número inteiro', + 'The subtask id is required' => 'O ID da subtarefa é obrigatório', + 'The subtask id must be an integer' => 'O ID da subtarefa deve ser um número inteiro', + 'The task id is required' => 'O ID da tarefa é obrigatório', + 'The task id must be an integer' => 'O ID da tarefa deve ser um número inteiro', + 'The user id must be an integer' => 'O ID do usuário deve ser um número inteiro', + 'This value is required' => 'Este valor é obrigatório', 'This value must be numeric' => 'Este valor deve ser numérico', 'Unable to create this task.' => 'Não foi possível criar esta tarefa.', - // 'Cumulative flow diagram' => '', - // 'Cumulative flow diagram for "%s"' => '', - // 'Daily project summary' => '', - // 'Daily project summary export' => '', - // 'Daily project summary export for "%s"' => '', - // 'Exports' => '', - // 'This export contains the number of tasks per column grouped per day.' => '', + 'Cumulative flow diagram' => 'Fluxograma cumulativo', + 'Cumulative flow diagram for "%s"' => 'Fluxograma cumulativo para "%s"', + 'Daily project summary' => 'Resumo diário do projeto', + 'Daily project summary export' => 'Exportação diária do resumo do projeto', + 'Daily project summary export for "%s"' => 'Exportação diária do resumo do projeto para "%s"', + 'Exports' => 'Exportar', + 'This export contains the number of tasks per column grouped per day.' => '', 'Nothing to preview...' => 'Nada para pré-visualizar...', 'Preview' => 'Pré-visualizar', - // 'Write' => '', - // 'Active swimlanes' => '', - // 'Add a new swimlane' => '', - // 'Change default swimlane' => '', - // 'Default swimlane' => '', - // 'Do you really want to remove this swimlane: "%s"?' => '', - // 'Inactive swimlanes' => '', - // 'Set project manager' => '', - // 'Set project member' => '', - // 'Remove a swimlane' => '', - // 'Rename' => '', - // 'Show default swimlane' => '', - // 'Swimlane modification for the project "%s"' => '', - // 'Swimlane not found.' => '', - // 'Swimlane removed successfully.' => '', - // 'Swimlanes' => '', - // 'Swimlane updated successfully.' => '', - // 'The default swimlane have been updated successfully.' => '', - // 'Unable to create your swimlane.' => '', - // 'Unable to remove this swimlane.' => '', - // 'Unable to update this swimlane.' => '', - // 'Your swimlane have been created successfully.' => '', - // 'Example: "Bug, Feature Request, Improvement"' => '', - // 'Default categories for new projects (Comma-separated)' => '', - // 'Gitlab commit received' => '', - // 'Gitlab issue opened' => '', - // 'Gitlab issue closed' => '', - // 'Gitlab webhooks' => '', - // 'Help on Gitlab webhooks' => '', - // 'Integrations' => '', - // 'Integration with third-party services' => '', - // 'Role for this project' => '', - // 'Project manager' => '', - // 'Project member' => '', - // 'A project manager can change the settings of the project and have more privileges than a standard user.' => '', - // 'Gitlab Issue' => '', - // 'Subtask Id' => '', - // 'Subtasks' => '', - // 'Subtasks Export' => '', - // 'Subtasks exportation for "%s"' => '', - // 'Task Title' => '', - // 'Untitled' => '', - // 'Application default' => '', - // 'Language:' => '', - // 'Timezone:' => '', - // 'Next' => '', + 'Write' => 'Escrever', + 'Active swimlanes' => 'Ativar swimlanes', + 'Add a new swimlane' => 'Adicionar novo swimlane', + 'Change default swimlane' => 'Alterar swimlane padrão', + 'Default swimlane' => 'Swimlane padrão', + 'Do you really want to remove this swimlane: "%s"?' => 'Você realmente deseja remover este swimlane: "%s"?', + 'Inactive swimlanes' => 'Desativar swimlanes', + 'Set project manager' => 'Definir gerente do projeto', + 'Set project member' => 'Definir membro do projeto', + 'Remove a swimlane' => 'Remover um swimlane', + 'Rename' => 'Renomear', + 'Show default swimlane' => 'Exibir swimlane padrão', + 'Swimlane modification for the project "%s"' => 'Modificação de swimlane para o projeto "%s"', + 'Swimlane not found.' => 'Swimlane não encontrado.', + 'Swimlane removed successfully.' => 'Swimlane removido com sucesso.', + 'Swimlanes' => 'Swimlanes', + 'Swimlane updated successfully.' => 'Swimlane atualizado com sucesso.', + 'The default swimlane have been updated successfully.' => 'O swimlane padrão foi atualizado com sucesso.', + 'Unable to create your swimlane.' => 'Não foi possível criar o seu swimlane.', + 'Unable to remove this swimlane.' => 'Não foi possível remover este swimlane.', + 'Unable to update this swimlane.' => 'Não foi possível atualizar este swimlane.', + 'Your swimlane have been created successfully.' => 'Seu swimlane foi criado com sucesso.', + 'Example: "Bug, Feature Request, Improvement"' => 'Exemplo: "Bug, Feature Request, Improvement"', + 'Default categories for new projects (Comma-separated)' => 'Categorias padrão para novos projetos (Separadas por vírgula)', + 'Gitlab commit received' => 'Gitlab commit received', + 'Gitlab issue opened' => 'Gitlab issue opened', + 'Gitlab issue closed' => 'Gitlab issue closed', + 'Gitlab webhooks' => 'Gitlab webhooks', + 'Help on Gitlab webhooks' => 'Ajuda sobre Gitlab webhooks', + 'Integrations' => 'Integrações', + 'Integration with third-party services' => 'Integração com serviços de terceiros', + 'Role for this project' => 'Função para este projeto', + 'Project manager' => 'Gerente do projeto', + 'Project member' => 'Membro do projeto', + 'A project manager can change the settings of the project and have more privileges than a standard user.' => 'Um gerente do projeto pode alterar as configurações do projeto e ter mais privilégios que um usuário padrão.', + 'Gitlab Issue' => 'Gitlab Issue', + 'Subtask Id' => 'ID da subtarefa', + 'Subtasks' => 'Subtarefas', + 'Subtasks Export' => 'Exportar subtarefas', + 'Subtasks exportation for "%s"' => 'Subtarefas exportadas para "%s"', + 'Task Title' => 'Título da Tarefa', + 'Untitled' => 'Sem título', + 'Application default' => 'Aplicação padrão', + 'Language:' => 'Idioma', + 'Timezone:' => 'Fuso horário', + 'Next' => 'Próximo', ); diff --git a/app/Schema/Postgres.php b/app/Schema/Postgres.php index 9d5aa7a7..12aa5203 100644 --- a/app/Schema/Postgres.php +++ b/app/Schema/Postgres.php @@ -30,7 +30,7 @@ function version_21($pdo) $rq->execute(); $project_ids = $rq->fetchAll(PDO::FETCH_COLUMN, 0); - $rq = $pdo->prepare('UPDATE project_has_users SET is_owner=1 WHERE project_id=?'); + $rq = $pdo->prepare("UPDATE project_has_users SET is_owner='1' WHERE project_id=?"); foreach ($project_ids as $project_id) { $rq->execute(array($project_id)); diff --git a/app/Subscriber/BootstrapSubscriber.php b/app/Subscriber/BootstrapSubscriber.php index e256159a..35d0eff9 100644 --- a/app/Subscriber/BootstrapSubscriber.php +++ b/app/Subscriber/BootstrapSubscriber.php @@ -11,6 +11,7 @@ class BootstrapSubscriber extends Base implements EventSubscriberInterface return array( 'session.bootstrap' => array('setup', 0), 'api.bootstrap' => array('setup', 0), + 'console.bootstrap' => array('setup', 0), ); } diff --git a/app/Subscriber/ProjectModificationDateSubscriber.php b/app/Subscriber/ProjectModificationDateSubscriber.php index cd83f370..4c5380ff 100644 --- a/app/Subscriber/ProjectModificationDateSubscriber.php +++ b/app/Subscriber/ProjectModificationDateSubscriber.php @@ -4,7 +4,6 @@ namespace Subscriber; use Event\GenericEvent; use Model\Task; -use Integration\GithubWebhook; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class ProjectModificationDateSubscriber extends Base implements EventSubscriberInterface @@ -15,17 +14,11 @@ class ProjectModificationDateSubscriber extends Base implements EventSubscriberI Task::EVENT_CREATE_UPDATE => array('execute', 0), Task::EVENT_CLOSE => array('execute', 0), Task::EVENT_OPEN => array('execute', 0), + Task::EVENT_MOVE_SWIMLANE => array('execute', 0), Task::EVENT_MOVE_COLUMN => array('execute', 0), Task::EVENT_MOVE_POSITION => array('execute', 0), Task::EVENT_MOVE_PROJECT => array('execute', 0), Task::EVENT_ASSIGNEE_CHANGE => array('execute', 0), - GithubWebhook::EVENT_ISSUE_OPENED => array('execute', 0), - GithubWebhook::EVENT_ISSUE_CLOSED => array('execute', 0), - GithubWebhook::EVENT_ISSUE_REOPENED => array('execute', 0), - GithubWebhook::EVENT_ISSUE_ASSIGNEE_CHANGE => array('execute', 0), - GithubWebhook::EVENT_ISSUE_LABEL_CHANGE => array('execute', 0), - GithubWebhook::EVENT_ISSUE_COMMENT => array('execute', 0), - GithubWebhook::EVENT_COMMIT => array('execute', 0), ); } diff --git a/app/common.php b/app/common.php index bd336d92..a434a73f 100644 --- a/app/common.php +++ b/app/common.php @@ -2,6 +2,18 @@ require 'vendor/autoload.php'; +// Automatically parse environment configuration (Heroku) +if (getenv('DATABASE_URL')) { + + $dbopts = parse_url(getenv('DATABASE_URL')); + + define('DB_DRIVER', $dbopts['scheme']); + define('DB_USERNAME', $dbopts["user"]); + define('DB_PASSWORD', $dbopts["pass"]); + define('DB_HOSTNAME', $dbopts["host"]); + define('DB_NAME', ltrim($dbopts["path"],'/')); +} + // Include custom config file if (file_exists('config.php')) { require 'config.php'; diff --git a/composer.json b/composer.json index 547e0b89..f6745474 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,6 @@ { "require": { + "ext-mbstring": "*", "ircmaxell/password-compat": "1.0.3", "fguillot/simple-validator": "dev-master", "swiftmailer/swiftmailer": "@stable", diff --git a/composer.lock b/composer.lock index 5ef22913..f9dab496 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "32ca2365366d59b6b6f4fc2b5af435a7", + "hash": "fb6eb8ebc1ba83b1b3a060f67d770ad3", "packages": [ { "name": "erusev/parsedown", @@ -432,17 +432,17 @@ }, { "name": "symfony/console", - "version": "v2.6.1", + "version": "v2.6.3", "target-dir": "Symfony/Component/Console", "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "ef825fd9f809d275926547c9e57cbf14968793e8" + "reference": "6ac6491ff60c0e5a941db3ccdc75a07adbb61476" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/ef825fd9f809d275926547c9e57cbf14968793e8", - "reference": "ef825fd9f809d275926547c9e57cbf14968793e8", + "url": "https://api.github.com/repos/symfony/Console/zipball/6ac6491ff60c0e5a941db3ccdc75a07adbb61476", + "reference": "6ac6491ff60c0e5a941db3ccdc75a07adbb61476", "shasum": "" }, "require": { @@ -485,21 +485,21 @@ ], "description": "Symfony Console Component", "homepage": "http://symfony.com", - "time": "2014-12-02 20:19:20" + "time": "2015-01-06 17:50:02" }, { "name": "symfony/event-dispatcher", - "version": "v2.6.1", + "version": "v2.6.3", "target-dir": "Symfony/Component/EventDispatcher", "source": { "type": "git", "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "720fe9bca893df7ad1b4546649473b5afddf0216" + "reference": "40ff70cadea3785d83cac1c8309514b36113064e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/720fe9bca893df7ad1b4546649473b5afddf0216", - "reference": "720fe9bca893df7ad1b4546649473b5afddf0216", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/40ff70cadea3785d83cac1c8309514b36113064e", + "reference": "40ff70cadea3785d83cac1c8309514b36113064e", "shasum": "" }, "require": { @@ -507,10 +507,10 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.0", + "symfony/config": "~2.0,>=2.0.5", "symfony/dependency-injection": "~2.6", "symfony/expression-language": "~2.6", - "symfony/stopwatch": "~2.2" + "symfony/stopwatch": "~2.3" }, "suggest": { "symfony/dependency-injection": "", @@ -543,23 +543,23 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "http://symfony.com", - "time": "2014-12-02 20:19:20" + "time": "2015-01-05 14:28:40" } ], "packages-dev": [ { "name": "symfony/stopwatch", - "version": "v2.6.1", + "version": "v2.6.3", "target-dir": "Symfony/Component/Stopwatch", "source": { "type": "git", "url": "https://github.com/symfony/Stopwatch.git", - "reference": "261abd360cfb6ac65ea93ffd82073e2011d034fc" + "reference": "e8da5286132ba75ce4b4275fbf0f4cd369bfd71c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/261abd360cfb6ac65ea93ffd82073e2011d034fc", - "reference": "261abd360cfb6ac65ea93ffd82073e2011d034fc", + "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/e8da5286132ba75ce4b4275fbf0f4cd369bfd71c", + "reference": "e8da5286132ba75ce4b4275fbf0f4cd369bfd71c", "shasum": "" }, "require": { @@ -592,7 +592,7 @@ ], "description": "Symfony Stopwatch Component", "homepage": "http://symfony.com", - "time": "2014-12-02 20:19:20" + "time": "2015-01-03 08:01:59" } ], "aliases": [], @@ -606,6 +606,8 @@ "fguillot/simplelogger": 20 }, "prefer-stable": false, - "platform": [], + "platform": { + "ext-mbstring": "*" + }, "platform-dev": [] } diff --git a/docs/automatic-actions.markdown b/docs/automatic-actions.markdown index cf350a2f..e90a5e5d 100644 --- a/docs/automatic-actions.markdown +++ b/docs/automatic-actions.markdown @@ -9,17 +9,22 @@ Each automatic action is defined like that: - An action linked to this event - Eventually there is some parameters to define -Each project can have a different set of automatic actions, the configuration panel is located on the project listing page, just click on the link "Automatic actions". +Each project can have a different set of automatic actions, the configuration panel is located on the project listing page, just click on the link **Automatic actions**. -![Automatic action creation (step 1)](http://kanboard.net/screenshots/documentation/project-automatic-action-step1.png) +Add a new action +---------------- -To add a new automatic action, choose the event with an action and click on the button "Next Step", then specify action parameters and finish the process by clicking on the button "Save this action". +### Choose an action -![Automatic action creation (step 2)](http://kanboard.net/screenshots/documentation/project-automatic-action-step2.png) +![Choose an action](http://kanboard.net/screenshots/documentation/project-automatic-action-step1.png) -Each time an event occurs, the corresponding actions are executed. +### Choose an event -![Automatic actions](http://kanboard.net/screenshots/documentation/project-automatic-actions.png) +![Choose an event](http://kanboard.net/screenshots/documentation/project-automatic-action-step2.png) + +### Define action parameters + +![Define parameters](http://kanboard.net/screenshots/documentation/project-automatic-action-step3.png) List of available events ------------------------ @@ -39,6 +44,9 @@ List of available events - Github issue assignee change - Github issue label change - Github issue comment created +- Gitlab issue opened +- Gitlab issue closed +- Gitlab commit received List of available actions ------------------------- diff --git a/docs/creating-projects.markdown b/docs/creating-projects.markdown index e093e4b4..cf184e1b 100644 --- a/docs/creating-projects.markdown +++ b/docs/creating-projects.markdown @@ -9,12 +9,12 @@ Creating projects for multiple users - Only administrators can create and manage those projects - User management is available -To create a new project, click on the top menu **Projects** and click on the link **New project**. +From the dashboard, click on the link **New project**. Then the form appears: ![Project creation form](http://kanboard.net/screenshots/documentation/project-creation-form.png) -It's very easy, you just have to find a name for your project. +It's very easy, you just have to find a name for your project! Creating a private prooject --------------------------- @@ -23,6 +23,6 @@ Creating a private prooject - There is **NO** user management - Only the owner and administrators can access to the project -To create a new private project, click on the top menu **Projects** and click on the link **New private project**. +From the dashboard, click on the link **New private project**. Note: project names must be unique across the application. diff --git a/docs/creating-tasks.markdown b/docs/creating-tasks.markdown index 45a80f04..afcc5ecb 100644 --- a/docs/creating-tasks.markdown +++ b/docs/creating-tasks.markdown @@ -21,5 +21,7 @@ Field description: - **Column**: The column where the task will be created, your task will be positioned at the bottom. - **Color**: Choose the color of the card. - **Complexity**: Used in agile project management (Scrum), the complexity or story points is a number that tells the team how hard the story is. Often, people use the fibonacci series. +- **Original Estimate**: Estimation in hours to complete the tasks. - **Due Date**: Overdue tasks will have a red due date and upcoming due dates will be black on the board. Several date format are accepted in addition to the date picker. -- **Original Estimate**: Estimation in hours to complete the tasks.
\ No newline at end of file + +With the preview link, you can see the task description converted from the Markdown syntax.
\ No newline at end of file diff --git a/docs/email-configuration.markdown b/docs/email-configuration.markdown index 8e0a0a92..6dbc43f9 100644 --- a/docs/email-configuration.markdown +++ b/docs/email-configuration.markdown @@ -40,18 +40,6 @@ It's also possible to use a secure connection, TLS or SSL: define('MAIL_SMTP_ENCRYPTION', 'ssl'); // Valid values are "null", "ssl" or "tls" ``` -Here an example with Google: - -```php -define('MAIL_SMTP_HOSTNAME', 'smtp.gmail.com'); -define('MAIL_SMTP_PORT', 465); -define('MAIL_SMTP_USERNAME', 'my_account@gmail.com'); -define('MAIL_SMTP_PASSWORD', 'my google password'); -define('MAIL_SMTP_ENCRYPTION', 'ssl'); -``` - -To use Google, you might need to allow Kanboard to use your Google account, see ["Allowing less secure apps to access your account"](https://support.google.com/accounts/answer/6010255) and ["My client isn't accepting my username and password"](https://support.google.com/mail/answer/14257). - ### Sendmail configuration By default the sendmail command will be `/usr/sbin/sendmail -bs` but you can customize that in your config file. diff --git a/docs/github-webhooks.markdown b/docs/github-webhooks.markdown index e158c46b..b8e9c3f6 100644 --- a/docs/github-webhooks.markdown +++ b/docs/github-webhooks.markdown @@ -35,7 +35,7 @@ Go to your project settings page, on the left choose "Webhooks & Services", then ![Github configuration](http://kanboard.net/screenshots/documentation/github-webhooks.png) -- **Payload url**: This url is available on Kanboard, go to "projects", select your project, at the bottom of the page, you have a section Github webhooks, just copy and paste the link. +- **Payload url**: Copy and paste the link from the Kanboard project settings (section **Integrations > Github**). - Select **"Send me everything"** ![Github webhook](http://kanboard.net/screenshots/documentation/kanboard-github-webhooks.png) diff --git a/docs/gitlab-webhooks.markdown b/docs/gitlab-webhooks.markdown index ae49b914..3369b223 100644 --- a/docs/gitlab-webhooks.markdown +++ b/docs/gitlab-webhooks.markdown @@ -19,7 +19,7 @@ List of supported actions Configuration ------------- -[INSERT SCREENSHOT] +![Github configuration](http://kanboard.net/screenshots/documentation/gitlab-webhooks.png) 1. On Kanboard, go to the project settings and choose the section **Integrations** 2. Copy the Gitlab webhook url diff --git a/docs/heroku.markdown b/docs/heroku.markdown new file mode 100644 index 00000000..ea3c19f9 --- /dev/null +++ b/docs/heroku.markdown @@ -0,0 +1,38 @@ +Deploy Kanboard on Heroku +========================= + +You can try Kanboard for free on [Heroku](https://www.heroku.com/). +You can use this one click install button or follow the manual instructions below: + +[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/fguillot/kanboard) + +Requirements +------------ + +- Heroku account, you can use a free account +- Heroku command line tool installed + +Manual instructions +------------------- + +```bash +# Get the last development version +git clone https://github.com/fguillot/kanboard.git +cd kanboard + +# Push the code to Heroku (You can also use SSH if git over HTTP doesn't work) +heroku create +git push heroku master + +# Start a new dyno with a Postgresql database +heroku ps:scale web=1 +heroku addons:add heroku-postgresql:hobby-dev + +# Open your browser +heroku open +``` + +Limitations +----------- + +The storage on Heroku is ephemeral, that means uploaded files through Kanboard are not persistent after a reboot. diff --git a/docs/swimlanes.markdown b/docs/swimlanes.markdown index b899ffc4..25e8b6b9 100644 --- a/docs/swimlanes.markdown +++ b/docs/swimlanes.markdown @@ -4,6 +4,11 @@ Swimlanes Swimlanes are horizontal separations in your board. By example, it's useful to separate software releases, divide your tasks in different products, teams or what ever you want. +Board with swimlanes +-------------------- + +![Swimlanes Configuration](http://kanboard.net/screenshots/documentation/swimlanes.png) + Managing swimlanes ------------------ @@ -11,14 +16,14 @@ Managing swimlanes - If there is more than one swimlane, the board will show all swimlanes. - You can drag and drop tasks between swimlanes. -To configure swimlanes go to the **project configuration page** and choose the **section Swimlanes**. +To configure swimlanes go to the **project configuration page** and choose the section **Swimlanes**. -[INSERT SCREENSHOT] +![Swimlanes Configuration](http://kanboard.net/screenshots/documentation/swimlanes-configuration.png) From there, you can add a new swimlane or rename the default one. You can also disable and change the position of the different swimlanes. - The default swimlane is always on the top but you can hide it. - Inactive swimlanes are not shown on the board. -- Removing a swimlane doesn't remove tasks assigned to it, those tasks will be moved to the default swimlane. +- **Removing a swimlane doesn't remove tasks assigned to it**, those tasks will be moved to the default swimlane. diff --git a/docs/syntax-guide.markdown b/docs/syntax-guide.markdown index 32430bff..8b1324f0 100644 --- a/docs/syntax-guide.markdown +++ b/docs/syntax-guide.markdown @@ -1,7 +1,7 @@ Syntax Guide ============ -Kanboard use the [Markdown syntax](http://en.wikipedia.org/wiki/Markdown) to write comments or task descriptions. +Kanboard use the [Markdown syntax](http://en.wikipedia.org/wiki/Markdown) for comments or task descriptions. Here are some examples: Bold and italic diff --git a/docs/update.markdown b/docs/update.markdown index cda38bcd..f4564612 100644 --- a/docs/update.markdown +++ b/docs/update.markdown @@ -1,7 +1,7 @@ Update ====== -Important: **Always do a backup of your database before upgrading!** +**Always make a backup of your database before upgrading!** From the archive (stable version) --------------------------------- diff --git a/docs/user-management.markdown b/docs/user-management.markdown index f4809f04..f26afacc 100644 --- a/docs/user-management.markdown +++ b/docs/user-management.markdown @@ -7,19 +7,24 @@ Type of users Kanboard use a basic permission system, there is two kind of users: - Administrators -- Regular/Standard users +- Standard users Administrator have access to everything. By example, they can add or remove projects. -A standard user can't manage users and projects. +There is also permissions defined at the project level, users can be seen as: + +- Project member +- Project manager + +Project managers have more privileges than a simple user member. Add a new user -------------- To add a new user, you must be administrator. -1. Go to the top menu **users** -2. On the left, you have a link **New user** +1. From the dashboard, go to the menu **User Management** +2. On the top, you have a link **New user** 3. Fill the form and save When you create a new user, you have to specify those values: diff --git a/docs/what-is-kanban.markdown b/docs/what-is-kanban.markdown index e3c3cf53..3a37bb7a 100644 --- a/docs/what-is-kanban.markdown +++ b/docs/what-is-kanban.markdown @@ -11,7 +11,7 @@ There is only two constraints imposed by Kanban: Visualize your workflow ----------------------- -- Your work is visualized on a board, you have a clear overview of your project +- Your work is displayed on a board, you have a clear overview of your project - Each column represent a step in your workflow Bring focus and avoid multitasking @@ -4,6 +4,9 @@ require __DIR__.'/app/common.php'; use Symfony\Component\Console\Application; +use Symfony\Component\EventDispatcher\Event; + +$container['dispatcher']->dispatch('console.bootstrap', new Event); $application = new Application('Kanboard', APP_VERSION); $application->add(new Console\TaskOverdueNotification($container)); diff --git a/scripts/make-archive.sh b/scripts/make-archive.sh index 14f21c2b..ea9084f5 100755 --- a/scripts/make-archive.sh +++ b/scripts/make-archive.sh @@ -41,6 +41,16 @@ rm -rf data/*.sqlite \ Dockerfile \ composer.* +find ./vendor -name doc -type d -exec rm -rf {} +; +find ./vendor -name notes -type d -exec rm -rf {} +; +find ./vendor -name test -type d -exec rm -rf {} +; +find ./vendor -name tests -type d -exec rm -rf {} +; +find ./vendor -name composer.json -delete +find ./vendor -name phpunit.xml -delete +find ./vendor -name .travis.yml -delete +find ./vendor -name README.* -delete +find ./vendor -name .gitignore -delete + # Set the version number sed -i.bak s/master/$VERSION/g app/constants.php && rm -f app/*.bak diff --git a/tests/units/ProjectTest.php b/tests/units/ProjectTest.php index 38b742b3..4553dd3a 100644 --- a/tests/units/ProjectTest.php +++ b/tests/units/ProjectTest.php @@ -104,7 +104,7 @@ class ProjectTest extends Base $project = $p->getById(1); $this->assertNotEmpty($project); - $this->assertEquals($now + 1, $project['last_modified']); + $this->assertGreaterThan($now, $project['last_modified']); } public function testIsLastModified() |