diff options
Diffstat (limited to 'doc/es_ES')
71 files changed, 5824 insertions, 2 deletions
diff --git a/doc/es_ES/2fa.markdown b/doc/es_ES/2fa.markdown new file mode 100644 index 00000000..57abdc33 --- /dev/null +++ b/doc/es_ES/2fa.markdown @@ -0,0 +1,33 @@ +Autentificación Two-Factor
+===========================
+
+Cada usuario puede habilitar el [two-factor authentication](http://en.wikipedia.org/wiki/Two_factor_authentication).
+Antes de un logeo exitoso, un codigo one-time de (6 caracteres) se le pide a el usuaio para permitir el acceso a kanboard.
+
+Este codigo tiene que ser proporcionado por un software compatible generalmente instalado en tu smartphone
+
+Kanboard usa el [Time-based One-time Password Algorithm](http://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm) definido en el [RFC 6238](http://tools.ietf.org/html/rfc6238).
+
+Existen muchos softwares compatibles con el standard del sistema TOTP.
+Por ejemplo, tu puedes usar estas aplicaciones libres y de open source:
+
+- [Google Authenticator](https://github.com/google/google-authenticator/) (Android, iOS, Blackberry)
+- [FreeOTP](https://fedorahosted.org/freeotp/) (Android, iOS)
+- [OATH Toolkit](http://www.nongnu.org/oath-toolkit/) (Utilidad en linea de comandos Unix/Linux
+
+Este sistema puede trabajar offline y no es necesario tener un telefono movil
+
+Instalacion
+------------
+
+1. Ir a tu perfil de usuario
+2. Click a la izquierda en **Two factor authentication** y selecionar la caja
+3. Una key secret es geradada para ti
+
+
+
+- Tienes que salvar la key secret en tu software TOTP. Si usas un smartphone, la solución sera mas fácil ya que puedes escanear el Qr code con FreeOTP o Google Authenticator.
+- Cada vez que abras una nueva session , un nuevo código se pedirá.
+- No se olvide de verficar el dispositivo antes de cerrar la sesión
+
+Una nueva key secret es generada cada vez que actives o desactives esta función
\ No newline at end of file diff --git a/doc/es_ES/analytics-tasks.markdown b/doc/es_ES/analytics-tasks.markdown new file mode 100644 index 00000000..dff77b7c --- /dev/null +++ b/doc/es_ES/analytics-tasks.markdown @@ -0,0 +1,24 @@ +Análisis para tareas +=================== + +Cada tarea tiene una sección de análisis disponible en el menu izquierdo en la vista de tarea. + +Espera y tiempo de ciclo +------------------- + + + +- El tiempo de espera es el tiempo entre la creacion de la tarea y la fecha de finalización (Tarea cerrada). +- El tiempo de ciclo es el tiempo entre la fecha de inicio y la fecha de finalización. +- Si la tarea no esta cerrada el tiempo actual es usado en lugar de la fecha de finalización. +- Si la fecha de inicio no es especificada, el tiempo de ciclo no es calculado. + +Nota: Puede configurar una accion automatica para definir la fecha de inicio automaticamente cuando se mueve una tarea a la columna de su eleccion. + +El tiempo invertido en cada columna +--------------------------- + + + +- Esta gráfico muestra el total de tiempo invertido en cada columna para la tarea. +- El tiempo invertido es calculado hasta que la tarea es cerrada. diff --git a/doc/es_ES/analytics.markdown b/doc/es_ES/analytics.markdown new file mode 100644 index 00000000..6b9f7442 --- /dev/null +++ b/doc/es_ES/analytics.markdown @@ -0,0 +1,59 @@ +Analisis
+=========
+
+Cada proyecto tiene una sección de análisis . Dependiendo de cómo se está utilizando Kanboard, se puede ver estos informes :
+
+Repartición de usuarios
+-----------------------
+
+
+
+Esta gráfico de sectores muestra el numero de tareas abiertas asignadas por usuario.
+
+Distribución de tareas
+----------------------
+
+
+
+Este gráfico de sectores da una visión general del numero de tareas abiertas por columnas.
+
+Diagrama de flujo acumulado
+---------------------------
+
+
+
+- Este gráfico muesta el numerto de tareas acumuladas por cada columna a través del tiempo.
+- Cada dÃa , el número total de tareas se registra para cada columna.
+- Si tu quiseras excluir las tareas cerradas, deberá cambiar las configuraciones globales del proyecto
+
+Nota: Necesitas tener al menos dos dias de datos para mirar la gráfica
+
+
+Gráfico Burn down
+
+El gráfico burn down esta dispobible para cada proyecto.
+
+ Esta gráfico es un represtación grafica del trabajo This chart is a graphical representation del trabajo laborado contra el tiempo.
+ Kanboard usa la complejidad o historia de puntos para generar este diagrama.
+ Todos los dÃas, se calcula la suma de los puntos de la historia de cada columna .
+
+Average time spent into each column
+ This chart shows the average time spent into each column for the last 1000 tasks.
+
+ Kanboard uses the task transitions to calculate the data.
+ The time spent is calculated until the task is closed.
+
+
+Promedio de avances y ciclos de tiempos
+
+
+Este gráfico muestra el promedio de avances y ciclo de tiempos para las ultimas 1000 tareas fuera de tiempo.
+
+ El tiempo promedio es el tiempo entre la creación de la tarea y la fecha de finalización
+ El tiempo de ciclo se encuentra entre la fecha de inicio de la tarea especificada y fecha de la tarea finalizada
+ Si la tarea no es cerrada,
+ If the task is not closed, el momento actual se utiliza en lugar de la fecha de finalización.
+
+Esos indicadores se calculan y registran todos los dÃas durante todo el proyecto.
+
+Nota: No olvidar ejecutar todos los dias el cronjob para tener estadÃsticas precisas.
diff --git a/doc/es_ES/api-action-procedures.markdown b/doc/es_ES/api-action-procedures.markdown new file mode 100644 index 00000000..dc39fb93 --- /dev/null +++ b/doc/es_ES/api-action-procedures.markdown @@ -0,0 +1,245 @@ +API Procedimiento de acciones automaticas +================================ + +## getAvailableActions [Obtener acciones disponibles] + +- Propósito: **Obtener una lista de acciones automaticas disponibles** +- Parametros: ninguno +- Resultado satisfactorio: **list of actions** +- Resultado fallido: **falso** + +Ejemplo de solicitud: + +```json +{ + "jsonrpc": "2.0", + "method": "getAvailableActions", + "id": 1217735483 +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 1217735483, + "result": { + "\Kanboard\Action\TaskLogMoveAnotherColumn": "Agregar un comentario moviendo las tareas entre columnas", + "\Kanboard\Action\TaskAssignColorUser": "Asignar un color especifico aun usuario", + "\Kanboard\Action\TaskAssignColorColumn": "Asignar un color cuando la tarea es movida a una columna especifica", + "\Kanboard\Action\TaskAssignCategoryColor": "Asignar automaticamente una categoria basado en un color", + "\Kanboard\Action\TaskAssignColorCategory": "Asignar automaticamente un color basado en una categoria", + "\Kanboard\Action\TaskAssignSpecificUser": "Asigar tareas a un usuario especifico", + "\Kanboard\Action\TaskAssignCurrentUser": "Asignar tareas a la persona que hace la acción", + "\Kanboard\Action\TaskUpdateStartDate": "Automaticamente actualizar la fecha de inicio", + "\Kanboard\Action\TaskAssignUser": "Cambiar asigando basado en un nombre de usuario [username] externo", + "\Kanboard\Action\TaskAssignCategoryLabel": "Cambiar la categoria basado en un etiqueta externa", + "\Kanboard\Action\TaskClose": "Cerrar una tarea", + "\Kanboard\Action\CommentCreation": "Crear un comentario desde un proveedor externo", + "\Kanboard\Action\TaskCreation": "Crear una tarea desde un proveedor externo", + "\Kanboard\Action\TaskDuplicateAnotherProject": "Duplicar la tarea a otro proyecto", + "\Kanboard\Action\TaskMoveColumnAssigned": "Mover la tarea a otra columna cuando es asiganada a un usuario", + "\Kanboard\Action\TaskMoveColumnUnAssigned": "Mover la tarea a otra columna cuando la asignación es limpiada", + "\Kanboard\Action\TaskMoveAnotherProject": "Mover la tarea a otro proyecto", + "\Kanboard\Action\TaskOpen": "Abrir una Tarea" + } +} +``` + +## getAvailableActionEvents [obtener acciones de eventos disponibles] + +- Propósito: **Obtener una lista de acciones disponibles para los eventos** +- Parametros: ninguno +- Resultado satisfactorio: **lista de eventos** +- Resultado fallÃdo : **falso** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getAvailableActionEvents", + "id": 2116665643 +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 2116665643, + "result": { + "bitbucket.webhook.commit": "Bitbucket commit recibido", + "task.close": "Cerrando tarea", + "github.webhook.commit": "Github commit recibido", + "github.webhook.issue.assignee": "Github issue asignación cambiada", + "github.webhook.issue.closed": "Github issue cerrada", + "github.webhook.issue.commented": "Github issue comentario creado", + "github.webhook.issue.label": "Github issue etiqueta cambiada", + "github.webhook.issue.opened": "Github issue abierta", + "github.webhook.issue.reopened": "Github issue reabierto", + "gitlab.webhook.commit": "Gitlab commit recibido", + "gitlab.webhook.issue.closed": "Gitlab issue cerrado", + "gitlab.webhook.issue.opened": "Gitlab issue abierto", + "task.move.column": "Mover una tarea a otra columna", + "task.open": "Abrir una tarea abierta", + "task.assignee_change": "Tarea cambio de asignación", + "task.create": "Creación de tarea", + "task.create_update": "Creación de tarea o modificación", + "task.update": "Modificación de tarea" + } +} +``` + +## getCompatibleActionEvents [Obtener acciones compatibles con eventos] + +- Propósito: **Obtener una lista de eventos compatibles con una acción** +- Parametros: + - **action_name** (string, required) +- Resultado satisfactorio: **lista de eventos** +- Resultado fallido: **falso** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getCompatibleActionEvents", + "id": 899370297, + "params": [ + "\Kanboard\Action\TaskClose" + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 899370297, + "result": { + "bitbucket.webhook.commit": "Bitbucket commit recibido", + "github.webhook.commit": "Github commit recibido", + "github.webhook.issue.closed": "Github issue cerrada", + "gitlab.webhook.commit": "Gitlab commit recibido", + "gitlab.webhook.issue.closed": "Gitlab issue cerrado", + "task.move.column": "Mover una tarea a otra columna" + } +} +``` + +## getActions [Obtener acciones] + +- Propósito: **Obtener una lista de acciones para un proyecto** +- Parametros: + - **project_id** (integer, required) +- Resultado satisfactorio: **lista de propiedades de las acciones** +- Resultado fallido: **falso** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getActions", + "id": 1433237746, + "params": [ + "1" + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 1433237746, + "result": [ + { + "id" : "13", + "project_id" : "2", + "event_name" : "task.move.column", + "action_name" : "\Kanboard\Action\TaskAssignSpecificUser", + "params" : { + "column_id" : "5", + "user_id" : "1" + } + } + ] +} +``` + +## createAction [Creación de acciones] + +- Proposito: **Crear una acción** +- Parametros: + - **project_id** (integer, required) + - **event_name** (string, required) + - **action_name** (string, required) + - **params** (key/value parameters, required) +- Resultados satisfactorios: **action_id** +- Resultados fallidos: **falso** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "createAction", + "id": 1433237746, + "params": { + "project_id" : "2", + "event_name" : "task.move.column", + "action_name" : "\Kanboard\Action\TaskAssignSpecificUser", + "params" : { + "column_id" : "3", + "user_id" : "2" + } + } +} +``` + +Ejemplo de respuestas: + +```json +{ + "jsonrpc": "2.0", + "id": 1433237746, + "result": 14 +} +``` + +## removeAction [Eliminar una acción] + +- Proposito: **Eliminar una acción** +- Parametros: + - **action_id** (integer, required) +- Resultados satisfactorios: **true** +- Resultados fallidos: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "removeAction", + "id": 1510741671, + "params": [ + 1 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 1510741671, + "result": true +} +``` diff --git a/doc/es_ES/api-authentication.markdown b/doc/es_ES/api-authentication.markdown new file mode 100644 index 00000000..0612ffee --- /dev/null +++ b/doc/es_ES/api-authentication.markdown @@ -0,0 +1,60 @@ +API de autentificación +================== + +API endpoint +------------ + +URL: `https://YOUR_SERVER/jsonrpc.php` + + +Metedo por default (HTTP Basico) +--------------------------- + +### Aplicación de credenciales + +- Username: `jsonrpc` +- Password: API token para la configuración de pagina + +### Credencial de usuario + +- Usar el usuario real y su password + +La API usa la [Autentificación Basica del esquema HTTP descrita en el RFC2617](http://www.ietf.org/rfc/rfc2617.txt). + + +Modificar el header HTTP +------------------------ + +Se puede usar un header HTTP alternativo para la autentificación si tu servidor es muy especifico + +configuration. + +- El nombre del header puede ser cualquier cosa que desee, por ejemplo `X-API-Auth`. +- El valor del header `username:password` esta codificado en Base64. + +Configuración: + +1. Definir tu header personalizado en tu `config.php`: `define('API_AUTHENTICATION_HEADER', 'X-API-Auth');` +2. Codificar las credenciales en Base64, ejemplo con PHP `base64_encode('jsonrpc:19ffd9709d03ce50675c3a43d1c49c1ac207f4bc45f06c5b2701fbdf8929');` +3. Verificar con curl + +```bash +curl \ +-H 'X-API-Auth: anNvbnJwYzoxOWZmZDk3MDlkMDNjZTUwNjc1YzNhNDNkMWM0OWMxYWMyMDdmNGJjNDVmMDZjNWIyNzAxZmJkZjg5Mjk=' \ +-d '{"jsonrpc": "2.0", "method": "getAllProjects", "id": 1}' \ +http://localhost/kanboard/jsonrpc.php +``` + +Error de autentificación +------------------------- +Authentication error +-------------------- + +Si las credenciales son , recibiras un `401 Not Authorized` y el correspondiente respuesta del JSON. +If the credentials are wrong, you will receive a `401 Not Authorized` and the corresponding JSON response. + + +Error de Autorización +---------------------- + +Si el usuario conectado no tiene permiso para acceder al recurso , recibirá un `403 Forbidden`. diff --git a/doc/es_ES/api-board-procedures.markdown b/doc/es_ES/api-board-procedures.markdown new file mode 100644 index 00000000..583e6449 --- /dev/null +++ b/doc/es_ES/api-board-procedures.markdown @@ -0,0 +1,158 @@ +API Procedimientos Del Tablero +=============================== + +## getBoard [obtener tablero] + +- Propósito: **Obtener todo la información necesaria para visualizar el tablero** +- Parametros: + - **project_id** (integer, required) +- Resultado satisfactorio : **Propiedades del tablero** +- Resultado fallido: **Lista vacÃa** + +Ejemplo de solicitud: + +```json +{ + "jsonrpc": "2.0", + "method": "getBoard", + "id": 827046470, + "params": [ + 1 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 827046470, + "result": [ + { + "id": 0, + "name": "Default swimlane", + "columns": [ + { + "id": "1", + "title": "Backlog", + "position": "1", + "project_id": "1", + "task_limit": "0", + "description": "", + "tasks": [], + "nb_tasks": 0, + "score": 0 + }, + { + "id": "2", + "title": "Ready", + "position": "2", + "project_id": "1", + "task_limit": "0", + "description": "", + "tasks": [ + { + "nb_comments":"0", + "nb_files":"0", + "nb_subtasks":"0", + "nb_completed_subtasks":"0", + "nb_links":"0", + "id":"2", + "reference":"", + "title":"Test", + "description":"", + "date_creation":"1430870507", + "date_modification":"1430870507", + "date_completed":null, + "date_due":"0", + "color_id":"yellow", + "project_id":"1", + "column_id":"2", + "swimlane_id":"0", + "owner_id":"0", + "creator_id":"1", + "position":"1", + "is_active":"1", + "score":"0", + "category_id":"0", + "date_moved":"1430870507", + "recurrence_status":"0", + "recurrence_trigger":"0", + "recurrence_factor":"0", + "recurrence_timeframe":"0", + "recurrence_basedate":"0", + "recurrence_parent":null, + "recurrence_child":null, + "assignee_username":null, + "assignee_name":null + } + ], + "nb_tasks": 1, + "score": 0 + }, + { + "id": "3", + "title": "Trabajo en progreso", + "position": "3", + "project_id": "1", + "task_limit": "0", + "description": "", + "tasks": [ + { + "nb_comments":"0", + "nb_files":"0", + "nb_subtasks":"1", + "nb_completed_subtasks":"0", + "nb_links":"0", + "id":"1", + "reference":"", + "title":"Task with comment", + "description":"", + "date_creation":"1430783188", + "date_modification":"1430783188", + "date_completed":null, + "date_due":"0", + "color_id":"red", + "project_id":"1", + "column_id":"3", + "swimlane_id":"0", + "owner_id":"1", + "creator_id":"0", + "position":"1", + "is_active":"1", + "score":"0", + "category_id":"0", + "date_moved":"1430783191", + "recurrence_status":"0", + "recurrence_trigger":"0", + "recurrence_factor":"0", + "recurrence_timeframe":"0", + "recurrence_basedate":"0", + "recurrence_parent":null, + "recurrence_child":null, + "assignee_username":"admin", + "assignee_name":null + } + ], + "nb_tasks": 1, + "score": 0 + }, + { + "id": "4", + "title": "Done", + "position": "4", + "project_id": "1", + "task_limit": "0", + "description": "", + "tasks": [], + "nb_tasks": 0, + "score": 0 + } + ], + "nb_columns": 4, + "nb_tasks": 2 + } + ] +} +``` diff --git a/doc/es_ES/api-category-procedures.markdown b/doc/es_ES/api-category-procedures.markdown new file mode 100644 index 00000000..eb5dc223 --- /dev/null +++ b/doc/es_ES/api-category-procedures.markdown @@ -0,0 +1,172 @@ +API Procedimientos de CategorÃa +======================= + +## createCategory + +- Propósito: **Crea una nueva categorÃa** +- Parámetros: +- **project_id** (integer, required) + - **name** (string, required, must be unique for the given project) +- Resultado en caso exitoso: **category_id** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "createCategory", + "id": 541909890, + "params": { + "name": "Super category", + "project_id": 1 + } +} +``` + +Ejemplo de respuesta:: + +```json +{ + "jsonrpc": "2.0", + "id": 541909890, + "result": 4 +} +``` + +## getCategory + +- Propósito: **Obtiene información de la categorÃa** +- Parámetros: + - **category_id** (integer, required) +- Resultado en caso exitoso: **category properties** +- Resultado en caso fallido: **null** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getCategory", + "id": 203539163, + "params": { + "category_id": 1 + } +} +``` + +Ejemplo de respuesta:: + +```json +{ + + "jsonrpc": "2.0", + "id": 203539163, + "result": { + "id": "1", + "name": "Super category", + "project_id": "1" + } +} +``` + +## getAllCategories + +- Propósito: **Obtiene todas las categorÃas disponibles** +- Parámetros: + - **project_id** (integer, required) +- Resultado en caso exitoso: **List of categories** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getAllCategories", + "id": 1261777968, + "params": { + "project_id": 1 + } +} +``` + +Ejemplo de respuesta:: + +```json +{ + "jsonrpc": "2.0", + "id": 1261777968, + "result": [ + { + "id": "1", + "name": "Super category", + "project_id": "1" + } + ] +} +``` + +## updateCategory + +- Propósito: **Actualiza una categorÃa** +- Parámetros: + - **id** (integer, required) + - **name** (string, required) +- Resultado en caso exitoso: **true** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "updateCategory", + "id": 570195391, + "params": { + "id": 1, + "name": "Renamed category" + } +} +``` + +Ejemplo de respuesta:: + +```json +{ + "jsonrpc": "2.0", + "id": 570195391, + "result": true +} +``` + +## removeCategory + +- Propósito: **Elimina una categorÃa** +- Parámetros: + - **category_id** (integer) +- Resultado en caso exitoso: **true** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "removeCategory", + "id": 88225706, + "params": { + "category_id": 1 + } +} +``` + +Ejemplo de respuesta:: + +```json +{ + "jsonrpc": "2.0", + "id": 88225706, + "result": true +} +``` diff --git a/doc/es_ES/api-column-procedures.markdown b/doc/es_ES/api-column-procedures.markdown new file mode 100644 index 00000000..ff9b853d --- /dev/null +++ b/doc/es_ES/api-column-procedures.markdown @@ -0,0 +1,229 @@ +API Procedimientos de columna +===================== + +## getColumns + +- Propósito: **Obtiene toda la información de columnas para un proyecto dado** +- Parametros: + - **project_id** (integer, required) +- Resultados en caso exitoso: **columns properties** +- Resultados en caso fallido: **empty list** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getColumns", + "id": 887036325, + "params": [ + 1 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 887036325, + "result": [ + { + "id": "1", + "title": "Backlog", + "position": "1", + "project_id": "1", + "task_limit": "0" + }, + { + "id": "2", + "title": "Ready", + "position": "2", + "project_id": "1", + "task_limit": "0" + }, + { + "id": "3", + "title": "Work in progress", + "position": "3", + "project_id": "1", + "task_limit": "0" + } + ] +} +``` + +## getColumn + +- Propósito: **Obtiene una columna individual** +- Parametros: + - **column_id** (integer, required) +- Resultados en caso exitoso: **column properties** +- Resultados en caso fallido: **null** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getColumn", + "id": 1242049935, + "params": [ + 2 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 1242049935, + "result": { + "id": "2", + "title": "Youpi", + "position": "2", + "project_id": "1", + "task_limit": "5" + } +} +``` + +## changeColumnPosition + +- Propósito: **Cambia la posición de columna** +- Parametros: + - **project_id** (integer, required) + - **column_id** (integer, required) + - **position** (integer, required, must be >= 1) +- Resultados en caso exitoso: **true** +- Resultados en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "changeColumnPosition", + "id": 99275573, + "params": [ + 1, + 2, + 3 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 99275573, + "result": true +} +``` + +## updateColumn + +- Propósito: **Actualiza las propiedades de la columna** +- Parametros: + - **column_id** (integer, required) + - **title** (string, required) + - **task_limit** (integer, optional) + - **description** (string, optional) +- Resultados en caso exitoso: **true** +- Resultados en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "updateColumn", + "id": 480740641, + "params": [ + 2, + "Boo", + 5 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 480740641, + "result": true +} +``` + +## addColumn + +- Propósito: **Agrega una nueva columna** +- Parametros: + - **project_id** (integer, required) + - **title** (string, required) + - **task_limit** (integer, optional) + - **description** (string, optional) +- Resultados en caso exitoso: **column_id** +- Resultados en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "addColumn", + "id": 638544704, + "params": [ + 1, + "Boo" + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 638544704, + "result": 5 +} +``` + +## removeColumn + +- Propósito: **Elimina una columna** +- Parametros: + - **column_id** (integer, required) +- Resultados en caso exitoso: **true** +- Resultados en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "removeColumn", + "id": 1433237746, + "params": [ + 1 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 1433237746, + "result": true +} +``` diff --git a/doc/es_ES/api-comment-procedures.markdown b/doc/es_ES/api-comment-procedures.markdown new file mode 100644 index 00000000..81389892 --- /dev/null +++ b/doc/es_ES/api-comment-procedures.markdown @@ -0,0 +1,181 @@ +API Procedimientos de comentarios +====================== + +## createComment [Crear un comentario] + +- Propósito: **Crear un nuevo comentario** +- Parametros: + - **task_id** (integer, required) + - **user_id** (integer, required) + - **content** Reducción de contenido (string, required) +- Resultado satisfactorio: **comment_id** +- Resultado fallido : **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "createComment", + "id": 1580417921, + "params": { + "task_id": 1, + "user_id": 1, + "content": "Comment #1" + } +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 1580417921, + "result": 11 +} +``` + +## getComment [Obtener un comentario] + +- Propósito: **Obtener la información del comentario** +- Parametros: + - **comment_id** (integer, required) +- Resultado satisfactorio: **propiedades del comentario** +- Resultado fallido: **null** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getComment", + "id": 867839500, + "params": { + "comment_id": 1 + } +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 867839500, + "result": { + "id": "1", + "task_id": "1", + "user_id": "1", + "date_creation": "1410881970", + "comment": "Comment #1", + "username": "admin", + "name": null + } +} +``` + +## getAllComments [Obtener todos los comentarios] + +- Proposito: **Obtener todos los comentarios disponibles** +- Parametros: + - **task_id** (integer, required) +- Resultado satisfactorio: **Lista de comentarios** +- Resultado fallido : **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getAllComments", + "id": 148484683, + "params": { + "task_id": 1 + } +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 148484683, + "result": [ + { + "id": "1", + "date_creation": "1410882272", + "task_id": "1", + "user_id": "1", + "comment": "Comment #1", + "username": "admin", + "name": null + }, + ... + ] +} +``` + +## updateComment [Actualizar un comentario] + +- Proposito: **Actualizar un comentario** +- Parametros: + - **id** (integer, required) + - **content** Reducción de contenido (string, required) +- Resultado satisfactorio: **true** +- Resultado fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "updateComment", + "id": 496470023, + "params": { + "id": 1, + "content": "Comment #1 updated" + } +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 1493368950, + "result": true +} +``` + +## removeComment [Eliminar un comentario] + +- Proposito : **Eliminar un comentario** +- Parametros: + - **comment_id** (integer, required) +- Resultado satisfactorio: **true** +- Resultado fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "removeComment", + "id": 328836871, + "params": { + "comment_id": 1 + } +} +``` +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 328836871, + "result": true +} +``` diff --git a/doc/es_ES/api-examples.markdown b/doc/es_ES/api-examples.markdown new file mode 100644 index 00000000..cba7ffe5 --- /dev/null +++ b/doc/es_ES/api-examples.markdown @@ -0,0 +1,152 @@ +Ejemplos de API +============ + +Ejemplo con cURL +----------------- + +Desde la lÃnea de comandos: + +```bash +curl \ +-u "jsonrpc:19ffd9709d03ce50675c3a43d1c49c1ac207f4bc45f06c5b2701fbdf8929" \ +-d '{"jsonrpc": "2.0", "method": "getAllProjects", "id": 1}' \ +http://localhost/kanboard/jsonrpc.php +``` + +Respuesta desde el servidor: + +```json +{ + "jsonrpc":"2.0", + "id":1, + "result":[ + { + "id":"1", + "name":"API test", + "is_active":"1", + "token":"6bd0932fe7f4b5e6e4bc3c72800bfdef36a2c5de2f38f756dfb5bd632ebf", + "last_modified":"1403392631" + } + ] +} +``` + +Ejemplo con Python +------------------- + +Puede utilizar el [cliente oficial Python para Kanboard](https://github.com/kanboard/kanboard-api-python): + +```bash +pip install kanboard +``` + +Aquà un ejemplo para crear un proyecto y una tarea: + +```python +from kanboard import Kanboard + +kb = Kanboard("http://localhost/jsonrpc.php", "jsonrpc", "your_api_token") + +project_id = kb.create_project(name="My project") + +task_id = kb.create_task(project_id=project_id, title="My task title") +``` + +Hay mas ejemplos en el [sitio web oficial(https://github.com/kanboard/kanboard-api-python). + +Ejemplo con un cliente PHP +------------------------- + +Puede utilizar esta [librearia Json-RPC de Cliente/servidor para PHP](https://github.com/fguillot/JsonRPC), Aqui un ejemplo: + +```php +<?php + +$client = new JsonRPC\Client('http://localhost:8000/jsonrpc.php'); +$client->authentication('jsonrpc', '19ffd9709d03ce50675c3a43d1c49c1ac207f4bc45f06c5b2701fbdf8929'); + +print_r($client->getAllProjects()); + +``` + +La respuesta: + +``` +Array +( + [0] => Array + ( + [id] => 1 + [name] => API test + [is_active] => 1 + [token] => 6bd0932fe7f4b5e6e4bc3c72800bfdef36a2c5de2f38f756dfb5bd632ebf + [last_modified] => 1403392631 + ) + +) +``` + +Ejemplo con Ruby +----------------- + +Este ejmeplo puede ser usado con Kanboard configurado con autenticación de Proxy Inverso y la API configurada con una cabecerza de autenticación personalizada: + +```ruby +require 'faraday' + +conn = Faraday.new(:url => 'https://kanboard.example.com') do |faraday| + faraday.response :logger + faraday.headers['X-API-Auth'] = 'XXX' # base64_encode('jsonrpc:API_KEY') + faraday.basic_auth(ENV['user'], ENV['pw']) # user/pass to get through basic auth + faraday.adapter Faraday.default_adapter # make requests with Net::HTTP +end + +response = conn.post do |req| + req.url '/jsonrpc.php' + req.headers['Content-Type'] = 'application/json' + req.body = '{ "jsonrpc": "2.0", "id": 1, "method": "getAllProjects" }' +end + +puts response.body +``` + + +Ejemplo con Java +----------------- + +Este es un ejemplo basico usando Spring. Para su uso correcto vea [Este enlace](http://spring.io/guides/gs/consuming-rest). + +```java +import java.io.UnsupportedEncodingException; +import java.util.Base64; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.client.RestTemplate; + +public class ProjectService { + + public void getAllProjects() throws UnsupportedEncodingException { + + RestTemplate restTemplate = new RestTemplate(); + + String url = "http://localhost/kanboard/jsonrpc.php"; + String requestJson = "{\"jsonrpc\": \"2.0\", \"method\": \"getAllProjects\", \"id\": 1}"; + String user = "jsonrpc"; + String apiToken = "19ffd9709d03ce50675c3a43d1c49c1ac207f4bc45f06c5b2701fbdf8929"; + + // encode api token + byte[] xApiAuthTokenBytes = String.join(":", user, apiToken).getBytes("utf-8"); + String xApiAuthToken = Base64.getEncoder().encodeToString(xApiAuthTokenBytes); + + // consume request + HttpHeaders headers = new HttpHeaders(); + headers.add("X-API-Auth", xApiAuthToken); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers); + String answer = restTemplate.postForObject(url, entity, String.class); + System.out.println(answer); + } +} +``` diff --git a/doc/es_ES/api-external-task-link-procedures.markdown b/doc/es_ES/api-external-task-link-procedures.markdown new file mode 100644 index 00000000..d276dd7a --- /dev/null +++ b/doc/es_ES/api-external-task-link-procedures.markdown @@ -0,0 +1,221 @@ +API de Procedimientos de tarea de enlace externo
+=================================
+
+## getExternalTaskLinkTypes
+
+- Propósito: **Obtener todos los proveedores registrados de enlaces externos**
+- Parámetros: **ninguno**
+- Resultado en caso de éxito: **dict**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{"jsonrpc":"2.0","method":"getExternalTaskLinkTypes","id":477370568}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "result": {
+ "auto": "Auto",
+ "attachment": "Attachment",
+ "file": "Local File",
+ "weblink": "Web Link"
+ },
+ "id": 477370568
+}
+```
+
+## getExternalTaskLinkProviderDependencies
+
+- Propósito: **Obtener las dependencias disponibles para un determinado proveedor**
+- Parametros:
+ - **providerName** (string, required)
+- Resultado en caso de éxito: **dict**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{"jsonrpc":"2.0","method":"getExternalTaskLinkProviderDependencies","id":124790226,"params":["weblink"]}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "result": {
+ "related": "Related"
+ },
+ "id": 124790226
+}
+```
+
+## createExternalTaskLink
+
+- Propósito: **Crear una nueva tarea de enlace externo**
+- Parametros:
+ - **task_id** (integer, required)
+ - **url** (string, required)
+ - **dependency** (string, required)
+ - **type** (string, optional)
+ - **title** (string, optional)
+- Resultado en caso de éxito: **link_id**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{"jsonrpc":"2.0","method":"createExternalTaskLink","id":924217495,"params":[9,"http:\/\/localhost\/document.pdf","related","attachment"]}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "result": 1,
+ "id": 924217495
+}
+```
+
+## updateExternalTaskLink
+
+- Propósito: **Actualizar tarea de enlace externo**
+- Parametros:
+ - **task_id** (integer, required)
+ - **link_id** (integer, required)
+ - **title** (string, required)
+ - **url** (string, required)
+ - **dependency** (string, required)
+- Resultado en caso de éxito: **true**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{
+ "jsonrpc":"2.0",
+ "method":"updateExternalTaskLink",
+ "id":1123562620,
+ "params": {
+ "task_id":9,
+ "link_id":1,
+ "title":"New title"
+ }
+}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "result": true,
+ "id": 1123562620
+}
+```
+
+## getExternalTaskLinkById
+
+- Propósito: **Obtener un enlace de tarea externo**
+- Parametros:
+ - **task_id** (integer, required)
+ - **link_id** (integer, required)
+- Resultado en caso de éxito: **dict**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{"jsonrpc":"2.0","method":"getExternalTaskLinkById","id":2107066744,"params":[9,1]}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "result": {
+ "id": "1",
+ "link_type": "attachment",
+ "dependency": "related",
+ "title": "document.pdf",
+ "url": "http:\/\/localhost\/document.pdf",
+ "date_creation": "1466965256",
+ "date_modification": "1466965256",
+ "task_id": "9",
+ "creator_id": "0"
+ },
+ "id": 2107066744
+}
+```
+
+## getAllExternalTaskLinks
+
+- Propósito: **Obtener todos los enlaces externos conectados a una tarea**
+- Parametros:
+ - **task_id** (integer, required)
+- Resultado en caso de éxito: **list of external links**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{"jsonrpc":"2.0","method":"getAllExternalTaskLinks","id":2069307223,"params":[9]}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "result": [
+ {
+ "id": "1",
+ "link_type": "attachment",
+ "dependency": "related",
+ "title": "New title",
+ "url": "http:\/\/localhost\/document.pdf",
+ "date_creation": "1466965256",
+ "date_modification": "1466965256",
+ "task_id": "9",
+ "creator_id": "0",
+ "creator_name": null,
+ "creator_username": null,
+ "dependency_label": "Related",
+ "type": "Attachment"
+ }
+ ],
+ "id": 2069307223
+}
+```
+
+## removeExternalTaskLink
+
+- Propósito: **Remover una tarea de enlace externo**
+- Parametros:
+ - **task_id** (integer, required)
+ - **link_id** (integer, required)
+- Resultado en caso de éxito: **true**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{"jsonrpc":"2.0","method":"removeExternalTaskLink","id":552055660,"params":[9,1]}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "result": true,
+ "id": 552055660
+}
+```
diff --git a/doc/es_ES/api-group-member-procedures.markdown b/doc/es_ES/api-group-member-procedures.markdown new file mode 100644 index 00000000..7c7cb25c --- /dev/null +++ b/doc/es_ES/api-group-member-procedures.markdown @@ -0,0 +1,188 @@ +Group Member API Procedures
+===========================
+
+## getMemberGroups
+
+- Propósito: **Obtener todos los grupos de un usuario determinado**
+- Parámetros:
+ - **user_id** (integer, required)
+- Resultado en caso de éxito: **List of groups**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "method": "getMemberGroups",
+ "id": 1987176726,
+ "params": [
+ "1"
+ ]
+}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "id": 1987176726,
+ "result": [
+ {
+ "id": "1",
+ "name": "My Group A"
+ }
+ ]
+}
+```
+
+## getGroupMembers
+
+- Propósito: **Obtener todos los miembros de un grupo**
+- Parámetros:
+ - **group_id** (integer, required)
+- Resultado en caso de éxito: **List of users**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "method": "getGroupMembers",
+ "id": 1987176726,
+ "params": [
+ "1"
+ ]
+}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "id": 1987176726,
+ "result": [
+ {
+ "group_id": "1",
+ "user_id": "1",
+ "id": "1",
+ "username": "admin",
+ "is_ldap_user": "0",
+ "name": null,
+ "email": null,
+ "notifications_enabled": "0",
+ "timezone": null,
+ "language": null,
+ "disable_login_form": "0",
+ "notifications_filter": "4",
+ "nb_failed_login": "0",
+ "lock_expiration_date": "0",
+ "is_project_admin": "0",
+ "gitlab_id": null,
+ "role": "app-admin"
+ }
+ ]
+}
+```
+
+## addGroupMember
+
+- Propósito: **Agregar un usuario a un grupo**
+- Parámetros:
+ - **group_id** (integer, required)
+ - **user_id** (integer, required)
+- Resultado en caso de éxito: **true**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "method": "addGroupMember",
+ "id": 1589058273,
+ "params": [
+ 1,
+ 1
+ ]
+}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "id": 1589058273,
+ "result": true
+}
+```
+
+## removeGroupMember
+
+- Propósito: **Quitar un usuario de un grupo**
+- Parámetros:
+ - **group_id** (integer, required)
+ - **user_id** (integer, required)
+- Resultado en caso de éxito: **true**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "method": "removeGroupMember",
+ "id": 1730416406,
+ "params": [
+ 1,
+ 1
+ ]
+}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "id": 1730416406,
+ "result": true
+}
+```
+
+## isGroupMember
+
+- Propósito: **Comprobar si un usuario es miembro de un grupo**
+- Parámetros:
+ - **group_id** (integer, required)
+ - **user_id** (integer, required)
+- Resultado en caso de éxito: **true**
+- Resultado en caso de falla: **false**
+
+Ejemplo de solicitud:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "method": "isGroupMember",
+ "id": 1052800865,
+ "params": [
+ 1,
+ 1
+ ]
+}
+```
+
+Ejemplo de respuesta:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "id": 1052800865,
+ "result": false
+}
+```
diff --git a/doc/es_ES/api-group-procedures.markdown b/doc/es_ES/api-group-procedures.markdown new file mode 100755 index 00000000..cb11fb96 --- /dev/null +++ b/doc/es_ES/api-group-procedures.markdown @@ -0,0 +1,174 @@ +Group API Procedures +==================== + +## createGroup + +- Purpose: **Create a new group** +- Parameters: + - **name** (string, required) + - **external_id** (string, optional) +- Result on success: **link_id** +- Result on failure: **false** + +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "createGroup", + "id": 1416806551, + "params": [ + "My Group B", + "1234" + ] +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1416806551, + "result": 2 +} +``` + +## updateGroup + +- Purpose: **Update a group** +- Parameters: + - **group_id** (integer, required) + - **name** (string, optional) + - **external_id** (string, optional) +- Result on success: **true** +- Result on failure: **false** + +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "updateGroup", + "id": 866078030, + "params": { + "group_id": "1", + "name": "ABC", + "external_id": "something" + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 866078030, + "result": true +} +``` + +## removeGroup + +- Purpose: **Remove a group** +- Parameters: + - **group_id** (integer, required) +- Result on success: **true** +- Result on failure: **false** + +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "removeGroup", + "id": 566000661, + "params": [ + "1" + ] +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 566000661, + "result": true +} +``` + +## getGroup + +- Purpose: **Get one group** +- Parameters: + - **group_id** (integer, required) +- Result on success: **Group dictionary** +- Result on failure: **false** + +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "getGroup", + "id": 1968647622, + "params": [ + "1" + ] +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1968647622, + "result": { + "id": "1", + "external_id": "", + "name": "My Group A" + } +} +``` + +## getAllGroups + +- Purpose: **Get all groups** +- Parameters: none +- Result on success: **list of groups** +- Result on failure: **false** + +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "getAllGroups", + "id": 546070742 +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 546070742, + "result": [ + { + "id": "1", + "external_id": "", + "name": "My Group A" + }, + { + "id": "2", + "external_id": "1234", + "name": "My Group B" + } + ] +} +``` diff --git a/doc/es_ES/api-internal-task-link-procedures.markdown b/doc/es_ES/api-internal-task-link-procedures.markdown new file mode 100644 index 00000000..43d410d7 --- /dev/null +++ b/doc/es_ES/api-internal-task-link-procedures.markdown @@ -0,0 +1,187 @@ +API Procedimientos de Tareas Internas de Enlace +================================= + +## createTaskLink + +- Propósito: **Crea un enlace entre dos tareas** +- Parametros: + - **task_id** (integer, required) + - **opposite_task_id** (integer, required) + - **link_id** (integer, required) +- Resultado en caso exitoso: **task_link_id** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "createTaskLink", + "id": 509742912, + "params": [ + 2, + 3, + 1 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 509742912, + "result": 1 +} +``` + +## updateTaskLink + +- Propósito: **Actualiza enlace de tarea** +- Parametros: + - **task_link_id** (integer, required) + - **task_id** (integer, required) + - **opposite_task_id** (integer, required) + - **link_id** (integer, required) +- Resultado en caso exitoso: **true** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "updateTaskLink", + "id": 669037109, + "params": [ + 1, + 2, + 4, + 2 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 669037109, + "result": true +} +``` + +## getTaskLinkById + +- Propósito: **Obtiene un enlace de tarea** +- Parametros: + - **task_link_id** (integer, required) +- Resultado en caso exitoso: **task link properties** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getTaskLinkById", + "id": 809885202, + "params": [ + 1 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 809885202, + "result": { + "id": "1", + "link_id": "1", + "task_id": "2", + "opposite_task_id": "3" + } +} +``` + +## getAllTaskLinks + +- Propósito: **Obtiene todos los enlaces relacionados a una tarea** +- Parametros: + - **task_id** (integer, required) +- Resultado en caso exitoso: **list of task link** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getAllTaskLinks", + "id": 810848359, + "params": [ + 2 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 810848359, + "result": [ + { + "id": "1", + "task_id": "3", + "label": "relates to", + "title": "B", + "is_active": "1", + "project_id": "1", + "task_time_spent": "0", + "task_time_estimated": "0", + "task_assignee_id": "0", + "task_assignee_username": null, + "task_assignee_name": null, + "column_title": "Backlog" + } + ] +} +``` + +## removeTaskLink + +- Propósito: **Elimina un enlace entre dos tareas** +- Parametros: + - **task_link_id** (integer, required) +- Resultado en caso exitoso: **true** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "removeTaskLink", + "id": 473028226, + "params": [ + 1 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 473028226, + "result": true +} +``` diff --git a/doc/es_ES/api-json-rpc.markdown b/doc/es_ES/api-json-rpc.markdown new file mode 100644 index 00000000..23088890 --- /dev/null +++ b/doc/es_ES/api-json-rpc.markdown @@ -0,0 +1,69 @@ +Json-RPC API +============ + +Usuario y aplicacion API +------------------------ + +Existen dos tipos de acceso a la API: + +### API de Aplicacion + +- Acceso a la API con el usuario "jsonrpc" y el token disponible en ajustes +- Acceso a todos los procedimientos +- Sin comprobacion de permisos +- No existe sesion de usuario en el servidor +- Ejemplo de posibles clientes: Herramientas para migrar/importar datos, crear tareas desde otros sistemas, etc. + +### API de Usuario + +- Acceso a la API con las credenciales de usuario (Nombre de usuario y contraseña) +- Acceso a un conjunto restringido de procedimientos +- Los permisos del proyecto son comprobados +- Una sesion de usuario es creada en el servidor +- Ejemplo de posibles clientes: Aplicacion de escritotrio / dispositivos moviles, utilidad linea de commandos, etc. + +Seguridad +--------- + +- Siempre usa HTTPS con un certificado valido. +- Si haces una aplicacion movil, es tu trabajo almacenar de forma segura las credenciales de usuario en el dispositivo +- Despues de tres fallas de autenticación en la API de usuario, el usuario final tiene que desbloquear su cuenta utilizando el formulario de inicio de sesión +- La autenticación de dos factores aun no está disponible a través de la API + +Protocolo +--------- + +Kanboard utilizar el protocolo JSON-RPC para interactuar con programas externos. +JSON-RPC es un protocolo de llamada a procedimiento remoto codificado en JSON. Casi lo mismo que XML-RPC, pero con el formato JSON. + +Utilizamos [version 2 of the protocol](http://www.jsonrpc.org/specification). Usted debe llamar a la API con una petición HTTP POST. + +Kanboard soporta requerimientos por lotes, por lo que pueden hacer varias llamadas a la API en una sola petición HTTP. Es particularmente útil para los clientes móviles con una mayor latencia de la red. + +Uso +--- + +- [Authentication](api-authentication.markdown) +- [Examples](api-examples.markdown) +- [Application](api-application-procedures.markdown) +- [Projects](api-project-procedures.markdown) +- [Project Permissions](api-project-permission-procedures.markdown) +- [Boards](api-board-procedures.markdown) +- [Columns](api-column-procedures.markdown) +- [Swimlanes](api-swimlane-procedures.markdown) +- [Categories](api-category-procedures.markdown) +- [Automatic Actions](api-action-procedures.markdown) +- [Tasks](api-task-procedures.markdown) +- [Subtasks](api-subtask-procedures.markdown) +- [Subtask Time Tracking](api-subtask-time-tracking-procedures.markdown) +- [Task Files](api-task-file-procedures.markdown) +- [Project Files](api-project-file-procedures.markdown) +- [Links](api-link-procedures.markdown) +- [Internal Task Links](api-internal-task-link-procedures.markdown) +- [External Task Links](api-external-task-link-procedures.markdown) +- [Comments](api-comment-procedures.markdown) +- [Users](api-user-procedures.markdown) +- [Groups](api-group-procedures.markdown) +- [Group Members](api-group-member-procedures.markdown) +- [Me](api-me-procedures.markdown) + diff --git a/doc/es_ES/api-link-procedures.markdown b/doc/es_ES/api-link-procedures.markdown new file mode 100644 index 00000000..2ed08ecd --- /dev/null +++ b/doc/es_ES/api-link-procedures.markdown @@ -0,0 +1,285 @@ +API Procedimientos de enlace +=================== + +## getAllLinks + +- Propósito: **Obtiene la lista de posibles relaciones entre tareas** +- Parametros: ninguno +- Resultado en caso exitoso: **List of links** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getAllLinks", + "id": 113057196 +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 113057196, + "result": [ + { + "id": "1", + "label": "relates to", + "opposite_id": "0" + }, + { + "id": "2", + "label": "blocks", + "opposite_id": "3" + }, + { + "id": "3", + "label": "is blocked by", + "opposite_id": "2" + }, + { + "id": "4", + "label": "duplicates", + "opposite_id": "5" + }, + { + "id": "5", + "label": "is duplicated by", + "opposite_id": "4" + }, + { + "id": "6", + "label": "is a child of", + "opposite_id": "7" + }, + { + "id": "7", + "label": "is a parent of", + "opposite_id": "6" + }, + { + "id": "8", + "label": "targets milestone", + "opposite_id": "9" + }, + { + "id": "9", + "label": "is a milestone of", + "opposite_id": "8" + }, + { + "id": "10", + "label": "fixes", + "opposite_id": "11" + }, + { + "id": "11", + "label": "is fixed by", + "opposite_id": "10" + } + ] +} +``` + +## getOppositeLinkId + +- Propósito: **Obtiene el identificador de enlace opuesto de un enlace de tarea** +- Parametros: + - **link_id** (integer, required) +- Resultado en caso exitoso: **link_id** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getOppositeLinkId", + "id": 407062448, + "params": [ + 2 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 407062448, + "result": "3" +} +``` + +## getLinkByLabel + +- Propósito: **Obtiene un enlace por etiqueta** +- Parametros: + - **label** (integer, required) +- Resultado en caso exitoso: **link properties** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getLinkByLabel", + "id": 1796123316, + "params": [ + "blocks" + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 1796123316, + "result": { + "id": "2", + "label": "blocks", + "opposite_id": "3" + } +} +``` + +## getLinkById + +- Propósito: **Obtiene un enlace por identificador** +- Parametros: + - **link_id** (integer, required) +- Resultado en caso exitoso: **link properties** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "getLinkById", + "id": 1190238402, + "params": [ + 4 + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 1190238402, + "result": { + "id": "4", + "label": "duplicates", + "opposite_id": "5" + } +} +``` + +## createLink + +- Propósito: **Crea una nueva relación de tarea** +- Parametros: + - **label** (integer, required) + - **opposite_label** (integer, optional) +- Resultado en caso exitoso: **link_id** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "createLink", + "id": 1040237496, + "params": [ + "foo", + "bar" + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 1040237496, + "result": 13 +} +``` + +## updateLink + +- Propósito: **Actualiza un enlace** +- Parametros: + - **link_id** (integer, required) + - **opposite_link_id** (integer, required) + - **label** (string, required) +- Resultado en caso exitoso: **true** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "updateLink", + "id": 2110446926, + "params": [ + "14", + "12", + "boo" + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 2110446926, + "result": true +} +``` + +## removeLink + +- Propósito: **Elimina un enlace** +- Parametros: + - **link_id** (integer, required) +- Resultado en caso exitoso: **true** +- Resultado en caso fallido: **false** + +Ejemplo de petición: + +```json +{ + "jsonrpc": "2.0", + "method": "removeLink", + "id": 2136522739, + "params": [ + "14" + ] +} +``` + +Ejemplo de respuesta: + +```json +{ + "jsonrpc": "2.0", + "id": 2136522739, + "result": true +} +``` diff --git a/doc/es_ES/board-collapsed-expanded.markdown b/doc/es_ES/board-collapsed-expanded.markdown new file mode 100644 index 00000000..a8ba2beb --- /dev/null +++ b/doc/es_ES/board-collapsed-expanded.markdown @@ -0,0 +1,18 @@ +Modo colapsar y expandir +=========================== + +Las tares en el tablero pueden visualizarse en modo colapsado o en modo expandido. +El cambio entre el desplazamiento horizontal y la vista compacta se puede hacer con la combinación de teclas **"s"** o usar el menu drop-down que esta parte superior izquierda. + +Modo de colapsado +-------------- + + + +- Si la tarea es asignada a alguien, las iniciales de la persona se muestran junto al número de tareas +- Si el titulo de la tarea es demasiado largo, tu puedes poner el puntero del ratón sobre la tarea de mostrar una información sobre herramientas con el título completo + +Modo expansivo +-------------- + + diff --git a/doc/es_ES/board-configuration.markdown b/doc/es_ES/board-configuration.markdown new file mode 100644 index 00000000..58817072 --- /dev/null +++ b/doc/es_ES/board-configuration.markdown @@ -0,0 +1,25 @@ +Configuraci�n del tablero +========================== + +Ir al menu **Configuraciones **, elije **Ajustes de tablero ** a la izquierda. + + + +### Resaltado de tarea + +Esta caracterista muestra una sombra alrededor de la tarea cuando una tarea se traslad� recientemente + +Establecer el valor 0 para desactivar esta caracterista, 2 dias por default (172800 segundos). + +Todo lo traslad� desde de 2 dias tendra una sombra alrededor de la tarea. + +### Recargar el intervalo para la pizarra publica + +Cuando tu compartes un tablero, la pagina se refresca cada 60 segundos automaticamente por default. + +### Refrescar el intervalo para un tablero privado + +Cuando su navegador est� abierto un tablero, Kanboard comprueba cada 10 segundos si algo ha sido cambiado por otra persona. + +T�cnicamente este proceso se lleva a cabo por el Ajax. + diff --git a/doc/es_ES/board-horizontal-scrolling-and-compact-view.markdown b/doc/es_ES/board-horizontal-scrolling-and-compact-view.markdown new file mode 100644 index 00000000..9dab532a --- /dev/null +++ b/doc/es_ES/board-horizontal-scrolling-and-compact-view.markdown @@ -0,0 +1,12 @@ +Horizontal scrolling y modo compacto +===================================== + +Cuando el tablero no puede caber en su pantalla , una barra de scroll horizontal +When the board cannot fit on your screen, a horizontal scroll bar aparecerá en la parte inferior. + +Sin embargo, es posible cambiar a una vista de modo compacto para visualizar todas las columnas en su pantalla. + + + +Cambiar entre scrolling y vista compacta +El cambio entre el desplazamiento horizontal y la vista compacta se puede hacer con la combinación de teclas **"c"** o usar el menu drop-down que esta parte superior izquierda. diff --git a/doc/es_ES/board-show-hide-columns.markdown b/doc/es_ES/board-show-hide-columns.markdown new file mode 100644 index 00000000..6700b987 --- /dev/null +++ b/doc/es_ES/board-show-hide-columns.markdown @@ -0,0 +1,12 @@ +Mostrar y ocultar columnas en el tablero +================================== + +Se puede ocultar o visualizar columnas muy facilmente en el tablero: + + + +Para ocultar una columna, click en la columna escoge en el menu dropdown "ocultar esta columna" : + + + +Para mostar nuevamente la columna, click en el icono con el simbolo de suma "plus icon" diff --git a/doc/es_ES/bruteforce-protection.markdown b/doc/es_ES/bruteforce-protection.markdown new file mode 100644 index 00000000..2a08fc27 --- /dev/null +++ b/doc/es_ES/bruteforce-protection.markdown @@ -0,0 +1,26 @@ +Protección por fuerza bruta +=========================== + +La protección por fuerza bruta de kanboard funciona en nivel a la cuenta de usuario. + +- Después de 3 fallas de autentificación para el formulario de login muestra una imagen de captcha para evitar bots automatizado orientativos. +- Después de 6 fallas de autentificación la cuenta de usuario esta bloqueada por un periodo de 15 minutos. + +Esta caracterÃstica funciona para el método de autentificación del usuario API, la cuenta tiene que ser desbloqueado mediante el formulario de inicio de sesión. + +Sin embargo, después de la tercera falla de autenticidad a través de la API de usuario, la cuenta tiene que ser desbloqueado mediante el formulario de inicio de sesión. + +Kanboard no bloquea cualquier dirección de la IP ya que los bots puede utilizar a varios servidores proxy anónimo sin embargo puede utilizar herramientas externas como f[fail2ban](http://www.fail2ban.org) para evitar la exploración masiva. + +Los ajustes predeterminados se pueden cambiar con estas variables de configuración: + +```php +// Habilitar captcha después del fallo 3 de autentificación +define('BRUTEFORCE_CAPTCHA', 3); + +// Bloquear la cuenta después de 6 fallo de autentificación +define('BRUTEFORCE_LOCKDOWN', 6); + +//Bloqueo de la duración de la cuenta en minutos. +define('BRUTEFORCE_LOCKDOWN_DURATION', 15) +``` diff --git a/doc/es_ES/calendar-configuration.markdown b/doc/es_ES/calendar-configuration.markdown index ccd83204..16b8d806 100644 --- a/doc/es_ES/calendar-configuration.markdown +++ b/doc/es_ES/calendar-configuration.markdown @@ -3,7 +3,7 @@ Configuración de calendarios Ir al menu de configuraciones, despues elegir cofiguracion de calendarios que se encuentra al lado izquierdo - + Existe dos diferentes calendarios en kanboard : diff --git a/doc/es_ES/centos-installation.markdown b/doc/es_ES/centos-installation.markdown new file mode 100644 index 00000000..6fc7e398 --- /dev/null +++ b/doc/es_ES/centos-installation.markdown @@ -0,0 +1,80 @@ +Instalación en Centos +=================== + +Nota:Algunas funciones de Kanboard requieren que se ejecute un trabajo en segundo +plano todos los dÃas (cronjob.markdown). + +Centos 7 +-------- + +Instalar PHP y Apache: + +```bash +yum install -y php php-mbstring php-pdo php-gd unzip wget +``` + +Por default Centos 7 use PHP 5.4.16 and Apache 2.4.6. + +Reiniciar Apache: + +```bash +systemctl restart httpd.service +``` + +InstalarKanboard: + +```bash +cd /var/www/html +wget https://kanboard.net/kanboard-latest.zip +unzip kanboard-latest.zip +chown -R apache:apache kanboard/data +rm kanboard-latest.zip +``` + +Si SELinux esta activado, Asegurese de que el usuario de Apache pueda escribir en el directorio de datos: + +```bash +chcon -R -t httpd_sys_content_rw_t /var/www/html/kanboard/data +``` + +Asegurese de configurar el servidor para permitir enviar correos electrónicos y hacer conexiones externas por ejemplo con SELinux: + +```bash +setsebool -P httpd_can_network_connect=1 +``` + +Las conexiones son necesarias si se usa LDAP,SMTP, ganchos web o cualquier integracion de terceros: + +Centos 6.x +---------- + +Instalar PHP y Apache: + +```bash +yum install -y php php-mbstring php-pdo php-gd unzip wget +``` + +Por defecto para Centos 6.5 use PHP 5.3.3 y Apache 2.2.15 + +Active las etiquetas cortas: + +- Editar el archivo `/etc/php.ini` +- Cambiar la linea `short_open_tag = On` + +Reiniciar Apache: + +```bash +service httpd restart +``` + +Instalar Kanboard: + +```bash +cd /var/www/html +wget https://kanboard.net/kanboard-latest.zip +unzip kanboard-latest.zip +chown -R apache:apache kanboard/data +rm kanboard-latest.zip +``` + +Ir a `http://your_server/kanboard/`. diff --git a/doc/es_ES/cli.markdown b/doc/es_ES/cli.markdown new file mode 100755 index 00000000..ec46bdd6 --- /dev/null +++ b/doc/es_ES/cli.markdown @@ -0,0 +1,205 @@ +Interface de linea de comandos +============================= + +Kanboard provides a simple command line interface that can be used from any Unix terminal. +This tool can be used only on the local machine. + +This feature is useful to run commands outside of the web server processes. + +Uso +----- + +- Abre una terminal y ve a tu directorio de kanboard (ejemplo : `cd /var/www/kanboard`) +- Corre el comando `./cli` / `php cli` + +```bash +Kanboard version master + +Uso: + comando [opciones] [argumentos] + +Options: + -h, --help Visualizar mensaje de ayuda + -q, --quiet Sin mensajes de salida + -V, --version Visualiza la verssation version + --ansi Forzar salida ANSI + --no-ansi Deshabilitar salida ANSI + -n, --no-interaction No hacer cualquier pregunta interactiva + -v|vv|vvv, --verbose Incrementar la verbosidad de los mensajes: 1 para salida normal, 2 para mas salida verbosa y 3 para debug + +Available commands: + cronjob Ejecutar diariamente cronjob + help Visualizar ayuda para los comandos + list Lista de comandos + worker Execute queue worker + export + export:daily-project-column-stats Diariamente estad�sticas de exportaci�n de CSV (n�mero de tareas por columna y por d�a ) + export:subtasks Exportar a CSV las subtareas + export:tasks Exportar a CSV las tareas + export:transitions Exportar a CSV tareas de transici�n + locale + locale:compare Comparar aplicacion de traducciones con el locale fr_FR + locale:sync Sincronizar todas las traducciones basadas en el locale fr_FR + notification + notification:overdue-tasks Enviar notifiaciones de las tareas atrasadas + plugin + plugin:install Instalar un plugin desde un archivo ZIP remoto + plugin:uninstall Eliminar plugin + plugin:upgrade Actualizar todos los plugins instalados + projects + projects:daily-stats Calcular diariamente las estadisticas para todos los proyectos + trigger + trigger:tasks Disparadores de eventos calendarizados para todas las tareas + user + user:reset-2fa Eliminar la autenticaci�n two-factor para un usuario + user:reset-password Cambiar el passwor del usuario +``` + +Comandos disponibles +------------------ + +### Exportar las tareas en CSV + +Uso: + +```bash +./cli export:tasks <project_id> <start_date> <end_date> +``` + +Ejemplo: + +```bash +./cli export:tasks 1 2014-10-01 2014-11-30 > /tmp/my_custom_export.csv +``` + +CSV los datos son enviados a `stdout`. + +### Subtasks CSV export + +Uso: + +```bash +./cli export:subtasks <project_id> <start_date> <end_date> +``` + +Ejemplo: + +```bash +./cli export:subtasks 1 2014-10-01 2014-11-30 > /tmp/my_custom_export.csv +``` + +### Exportaci�n a CSV de tareas de transici�n + +Uso: + +```bash +./cli export:transitions <project_id> <start_date> <end_date> +``` + +Ejemplo: + +```bash +./cli export:transitions 1 2014-10-01 2014-11-30 > /tmp/my_custom_export.csv +``` + +### Exportar diariamente resumenes de datos en CSV + +Los datos exportados se pueden imprimir en la salida est�ndar: + +```bash +./cli export:daily-project-column-stats <project_id> <start_date> <end_date> +``` + +Ejemplo: + +```bash +./cli export:daily-project-column-stats 1 2014-10-01 2014-11-30 > /tmp/my_custom_export.csv +``` + +### Envio de notificaciones para tareas atrasadas + +Los Emails se enviaran a todos los usuarios con las notificaciones habilitadas. + +```bash +./cli notification:overdue-tasks +``` + +Parametros opcionales: + +- `--show`: Visualizar las notificaciones enviadas +- `--group`: Grupo tareas atrasadas todo para un usuario (desde todos los proyectos) en un email +- `--manager`: Enviar todas las tareas atrasadas a un project manager(s) en un email + +Tambi�n puede mostrar las tareas atrasadas con la bandera `--show`: + +```bash +./cli notification:overdue-tasks --show ++-----+---------+------------+------------+--------------+----------+ +| Id | Title | Due date | Project Id | Project name | Assignee | ++-----+---------+------------+------------+--------------+----------+ +| 201 | Test | 2014-10-26 | 1 | Project #0 | admin | +| 202 | My task | 2014-10-28 | 1 | Project #0 | | ++-----+---------+------------+------------+--------------+----------+ +``` + +### Correr diariamente los calculos de estadisticas de los proyectos + +Este comando calcula las estadisticas por cada proyecto: + +```bash +./cli projects:daily-stats +Run calculation for Project #0 +Run calculation for Project #1 +Run calculation for Project #10 +``` + +### Trigger [Disparadores] para tareas + +Este comando envia a "daily cronjob event" a todas las tareas abiertas de cada proyecto. + +```bash +./cli trigger:tasks +Trigger task event: project_id=2, nb_tasks=1 +``` + +### Resetear el password del usuario + +```bash +./cli user:reset-password my_user +``` + +Se le pedir� una contrase�a y la confirmaci�n. Los caracteres no se imprimen en la pantalla. + +### Eliminar la autenticaci�n two-factor para un usuario + +```bash +./cli user:reset-2fa my_user +``` + +### Instalar un plugin + +```bash +./cli plugin:install https://github.com/kanboard/plugin-github-auth/releases/download/v1.0.1/GithubAuth-1.0.1.zip +``` + +Nota: Los archivos instalados tendr�n los mismos permisos que el usuario actual + +### Eliminar un usuario + +```bash +./cli plugin:uninstall Budget +``` + +### Upgrade todos los plugins + +```bash +./cli plugin:upgrade +* Updating plugin: Budget Planning +* Plugin up to date: Github Authentication +``` + +### Run Background worker + +```bash +./cli worker +``` diff --git a/doc/es_ES/cloudron.markdown b/doc/es_ES/cloudron.markdown new file mode 100755 index 00000000..19b030b4 --- /dev/null +++ b/doc/es_ES/cloudron.markdown @@ -0,0 +1,27 @@ +Como correr Kanboard en Cloudron +================================ + +[Cloudron](https://cloudron.io) es un smartserver privado con el cual tu puedes instalar web +apps como Kanboard. Puedes instalar Kanboard en un dominio personalizado y cada +instalación está respaldada y mantenida día a día con la liberación automática de Kanboard + +[](https://cloudron.io/button.html?app=net.kanboard.cloudronapp) + +Cuentas +-------- + +La app se integra perfectamente con Cloudron en la gestión ( a través de LDAP ) del usuario . Solamente +los usuarios de Cloudron pueden acceder a Kanboard . Además , cualquier administrador Cloudron +se convierte en un administrador Kanboard automáticamente. + +Instalación de plugins +----------------------- + +Los plugins pueden ser instalados y configurados por [Cloudron CLI](https://cloudron.io/references/cli.html) +herramientas. Observar [descripción de la app](https://cloudron.io/appstore.html?app=net.kanboard.cloudronapp) for +mas información. + +Código fuente de la aplicación +------------------------------- +El código fuente de la app Cloudron esta [aqui](https://github.com/cloudron-io/kanboard-app). + diff --git a/doc/es_ES/coding-standards.markdown b/doc/es_ES/coding-standards.markdown new file mode 100755 index 00000000..b4b2deab --- /dev/null +++ b/doc/es_ES/coding-standards.markdown @@ -0,0 +1,24 @@ +Estandares de codificación +================ + +Código PHP +---------- + +- Indentacion: 4 espacios +- Linea de retorno: Unix => `\n` +- Encoding: UTF-8 +- Use unicamente las etiquetas de apertura `<?php` or `<?=` para templates , pero ** nunca usar ** `<?` +- Siempre escribe comentarios PHPdoc para metodos y propiedades de la clase +- Codificar con estilo : [PSR-1](http://www.php-fig.org/psr/psr-1/) y [PSR-2](http://www.php-fig.org/psr/psr-2/) + +Código JavaScript +--------------- + +- Indentacion: 4 espacios +- Linea de retorno: Unix => `\n` + +Código CSS +-------- + +- Indentacion: 4 espacios +- Linea de retorno: Unix => `\n` diff --git a/doc/es_ES/config.markdown b/doc/es_ES/config.markdown new file mode 100755 index 00000000..5093898b --- /dev/null +++ b/doc/es_ES/config.markdown @@ -0,0 +1,307 @@ +Archivo de configuración +======================== + +Puede personalizar la configuración predeterminada de Kanboard mediante la adición de un archivo ` config.php` en la raíz del proyecto o en la carpeta ` data` . +También puede cambiar el nombre del archivo `config.default.php` a `config.php` y cambiar los valores deseados . + +Habilitar/Deshabilitar el modo debug +-------------------------------------- + +```php +define('DEBUG', true); +define('LOG_DRIVER', 'file'); // Otros drivers son: syslog, stdout, stderr or file +``` + +El controlador de registro se debe definir si se habilita el modo de depuración . +El modo de depuración registra todas las consultas SQL y el tiempo necesario para generar páginas . + +Plugins +------- + +Folder de plugins: + +```php +define('PLUGINS_DIR', 'data/plugins'); +``` + +Enable/disable plugin de instalación para la interface de usuario: + +```php +define('PLUGIN_INSTALLER', true); // Default es true +``` + +Folder para subir archivos +------------------------- + +```php +define('FILES_DIR', 'data/files'); +``` + +Enable/disable url rewrite +-------------------------- + +```php +define('ENABLE_URL_REWRITE', false); +``` + +Configuración de Email +------------------- + +```php +// E-mail address para la cabecera "From" (notificaciones) +define('MAIL_FROM', 'notifications@kanboard.local'); + +// Mail transport para uso: "smtp", "sendmail" or "mail" (Funcion PHP mail) +define('MAIL_TRANSPORT', 'mail'); + +// Configuración SMTP para usarse para elegir el trasporte de "smtp" +define('MAIL_SMTP_HOSTNAME', ''); +define('MAIL_SMTP_PORT', 25); +define('MAIL_SMTP_USERNAME', ''); +define('MAIL_SMTP_PASSWORD', ''); +define('MAIL_SMTP_ENCRYPTION', null); // Valid values are "null", "ssl" or "tls" + +// Comando Sendmail para usarse cuando el trasporte sea "sendmail" +define('MAIL_SENDMAIL_COMMAND', '/usr/sbin/sendmail -bs'); +``` + +Configuración de base de datos +------------------------------ + +```php +// Driver base de datos: sqlite, mysql or postgres (sqlite por default) +define('DB_DRIVER', 'sqlite'); + +// Nombre de usuario Mysql/Postgres +define('DB_USERNAME', 'root'); + +// Password Mysql/Postgres +define('DB_PASSWORD', ''); + +// Mysql/Postgres hostname +define('DB_HOSTNAME', 'localhost'); + +// Mysql/Postgres Nombre de la base de datos +define('DB_NAME', 'kanboard'); + +// Mysql/Postgres Puerto personalizado (null = default port) +define('DB_PORT', null); + +// Mysql SSL key +define('DB_SSL_KEY', null); + +// Mysql SSL certificate +define('DB_SSL_CERT', null); + +// Mysql SSL CA +define('DB_SSL_CA', null); +``` + +Configuraciones LDAP +---------------------- + +```php +// Habilitar la autenticación por LDAP (false por default) +define('LDAP_AUTH', false); + +// LDAP server hostname +define('LDAP_SERVER', ''); + +// LDAP puerto del servidor (389 por defecto) +define('LDAP_PORT', 389); + +// Por default, requiere certificados para verificacion para ldaps:// estilo URL. muesta false para saltarse la verificacion +define('LDAP_SSL_VERIFY', true); + +// Enable LDAP START_TLS +define('LDAP_START_TLS', false); + +// Por defecto Kanboard tiene el nombre de usuario LDAP en minúscula para evitar usuarios duplicados ( la base de datos entre mayúsculas y minúsculas ) +// Establece en true si desea conservar el caso +define('LDAP_USERNAME_CASE_SENSITIVE', false); + +// LDAP tipo de enlace : "anonymous", "user" o "proxy" +define('LDAP_BIND_TYPE', 'anonymous'); + +// Nombre de usuario LDAP para utilizar con el modo de proxy +// Patrón de nombre de usuario LDAP para utilizar con el modo de usuario +define('LDAP_USERNAME', null); + +// password LDAP para usar en modo proxy +define('LDAP_PASSWORD', null); + +// LDAP DN para usuarios +// Ejemplo para ActiveDirectory: CN=Users,DC=kanboard,DC=local +// Ejemplo para OpenLDAP: ou=People,dc=example,dc=com +define('LDAP_USER_BASE_DN', ''); + +// LDAP pattern to use when searching for a user account +// Example for ActiveDirectory: '(&(objectClass=user)(sAMAccountName=%s))' +// Example for OpenLDAP: 'uid=%s' +define('LDAP_USER_FILTER', ''); + +// LDAP attribute for username +// Example for ActiveDirectory: 'samaccountname' +// Example for OpenLDAP: 'uid' +define('LDAP_USER_ATTRIBUTE_USERNAME', 'uid'); + +// LDAP attribute for user full name +// Example for ActiveDirectory: 'displayname' +// Example for OpenLDAP: 'cn' +define('LDAP_USER_ATTRIBUTE_FULLNAME', 'cn'); + +// LDAP attribute for user email +define('LDAP_USER_ATTRIBUTE_EMAIL', 'mail'); + +// LDAP attribute to find groups in user profile +define('LDAP_USER_ATTRIBUTE_GROUPS', 'memberof'); + +// LDAP attribute for user avatar image: thumbnailPhoto or jpegPhoto +define('LDAP_USER_ATTRIBUTE_PHOTO', ''); + +// LDAP attribute for user language, example: 'preferredlanguage' +// Put an empty string to disable language sync +define('LDAP_USER_ATTRIBUTE_LANGUAGE', ''); + +// Permitir creacion de usuario automatico LDAP +define('LDAP_USER_CREATION', true); + +// LDAP DN para administradores +// Example: CN=Kanboard-Admins,CN=Users,DC=kanboard,DC=local +define('LDAP_GROUP_ADMIN_DN', ''); + +// LDAP DN para managers +// Example: CN=Kanboard Managers,CN=Users,DC=kanboard,DC=local +define('LDAP_GROUP_MANAGER_DN', ''); + +// Habilitiar proveedor LDAP de grupo para permisos de proyecto +// El usuario final será capaz de navegar por los grupos LDAP desde la interfaz de usuario y permitir el acceso a proyectos específicos +define('LDAP_GROUP_PROVIDER', false); + +// LDAP Base DN for groups +define('LDAP_GROUP_BASE_DN', ''); + +// LDAP filtro de grupo +// Ejemplo para ActiveDirectory: (&(objectClass=group)(sAMAccountName=%s*)) +define('LDAP_GROUP_FILTER', ''); + +// LDAP filtro por grupo de usuario +// Si se configura este filtro , Kanboard buscará grupos de usuarios en LDAP_GROUP_BASE_DN +// Example for OpenLDAP: (&(objectClass=posixGroup)(memberUid=%s)) +define('LDAP_GROUP_USER_FILTER', ''); + +// LDAP atributo para los nombres de grupos +define('LDAP_GROUP_ATTRIBUTE_NAME', 'cn'); +``` + +Reverse-Proxy configuración de autenticación +------------------------------------- + +```php +// Enable/disable la autenticación reverse proxy +define('REVERSE_PROXY_AUTH', false); + +// Nombre del header a utilizar para el nombre de usuario +define('REVERSE_PROXY_USER_HEADER', 'REMOTE_USER'); + +// Nombre de usuario del administrador , por defecto en blanco +define('REVERSE_PROXY_DEFAULT_ADMIN', ''); + +// Dominio por defecto a utilizar para configurar la dirección de correo electrónico +define('REVERSE_PROXY_DEFAULT_DOMAIN', ''); +``` + +Configuración para la autenticacion RememberMe +---------------------------------------------- + +```php +// Enable/disable recuerdame autenticación +define('REMEMBER_ME_AUTH', true); +``` + +Secure HTTP configuracion de headers +------------------------------------- + +```php +// Enable o disable "Strict-Transport-Security" HTTP header +define('ENABLE_HSTS', true); + +// Enable o disable "X-Frame-Options: DENY" HTTP header +define('ENABLE_XFRAME', true); +``` + +Logging +------- + +De forma predeterminada , Kanboard no ingrese nada . +Si desea habilitar el registro , usted tiene que fijar un controlador de registro. + +```php +// log de drivers disponibles: syslog, stderr, stdout or file +define('LOG_DRIVER', ''); + +// Ingrese el nombre de archivo de registro si el driver "file" +define('LOG_FILE', __DIR__.DIRECTORY_SEPARATOR.'data'.DIRECTORY_SEPARATOR.'debug.log'); +``` + +Protección de Brute-force +--------------------- + +```php +// Habilitar captcha despues de 3 autenticaciones fallidas +define('BRUTEFORCE_CAPTCHA', 3); + +// Bloquear la cuenta después de 6 autenticaciones fallidas +define('BRUTEFORCE_LOCKDOWN', 6); + +// Bloquear la cuenta durante un minute +define('BRUTEFORCE_LOCKDOWN_DURATION', 15); +``` + +Session +------- + +```php +// Session duration in second (0 = until the browser is closed) +// See http://php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime +define('SESSION_DURATION', 0); +``` + +Clientes HTTP +-------------- + +Si las peticiones HTTP externas debe ser enviada a través de un proxy : + +```php +define('HTTP_PROXY_HOSTNAME', ''); +define('HTTP_PROXY_PORT', '3128'); +define('HTTP_PROXY_USERNAME', ''); +define('HTTP_PROXY_PASSWORD', ''); +``` + +Para permitir que los certificados de firma propia : + +```php +// Establece en false para permitir certficados self-signed +define('HTTP_VERIFY_SSL_CERTIFICATE', true); +``` + +Varias configuraciones +---------------------- + +```php +// Escapar de HTML dentro del texto de markdown +define('MARKDOWN_ESCAPE_HTML', true); + +// Cabecera de autenticación alternativo API , el valor predeterminado es la autenticación básica HTTP definido en RFC2617 +define('API_AUTHENTICATION_HEADER', ''); + +// Oculatar el formulario de login, usarlo si todos tus usuarios usan Google/Github/ReverseProxy authentication +define('HIDE_LOGIN_FORM', false); + +// Desactivación de cierre de sesión ( SSO para la autenticación externa ) +define('DISABLE_LOGOUT', false); + +// Invalidar token de la API almacenada en la base de datos , útil para pruebas automatizadas +define('API_AUTHENTICATION_TOKEN', 'My unique API Token'); +``` diff --git a/doc/es_ES/contributing.markdown b/doc/es_ES/contributing.markdown new file mode 100644 index 00000000..7f18e6eb --- /dev/null +++ b/doc/es_ES/contributing.markdown @@ -0,0 +1,67 @@ +Directrices del contribuyente +====================== + +¿Cómo puedo ayudar? +----------------- + +Kanboard no es perfecto, pero hay muchas maneras de ayudar: + +- Dar opinión +- Informar de los errores +- Añadir o actualizar traducciones +- Mejorar la documentación +- Código de Escritura +- Dile a tus amigos que Kanboard es impresionante + +Antes de hacer cualquier empresa grande, abrir un nuevo tema y explicar su propuesta. + +Quiero dar retroalimentación +----------------------- +- Usted piensa que algo debe ser mejorado (interface de usuario, peticiones de caracterÃsticas) +- Comprobar si aún no se propuso su idea +- Abrir un nuevo tema +- Describir su idea +- Puede también hacer un voto con +1 en las propuestas existentes + +Quiero informar de un error +--------------------------- + +- Compruebe si el problema no se ha comunicado anteriormente +- Abrir un nuevo ticket +- Explicar lo que está roto +- Describir la forma de reproducir el error +- Describir su entorno (versión Kanboard, sistema operativo, servidor web, Versión de PHP , la versión de la base de datos, el proveedor de alojamiento)} + +Deseo traducir Kanboard +---------------------------- +Kanboard se traduce en muchos idiomas. + +Sin embargo, las traducciones no están completas, observe la [guÃa de traducción para contribuir] (https://kanboard.net/documentation/translations). + + +Quiero mejorar la documentación +----------------------------------- +- ¿Crees que algo no está claro, existen errores gramaticales, errores tipográficos, otra cosa ? +- La documentación está escrita en Markdown y se almacena en la carpeta `docs`. +- Editar los archivos y enviar un Pull-Request +- La documentación se sincroniza con el repositorio y el sitio web oficial . + +Quiero contribuir al código +-------------------------------- +Los pulls son siempre bienvenidos , al ser aceptado se tiene que seguir estas directrices: + +- ** Antes de hacer cualquier cambio grande o propuesta de diseño, abrir un nuevo ticket en comenzar una discusión **. +- Si desea agregar una nueva función, respetar la filosofÃa detrás de Kanboard. ** Nos centramos en la simplicidad **, no queremos tener un software sobrecargado . +- Lo mismo se aplica para la interface de usuario, ** ** simplicidad y eficiencia. +- Enviar un solo pull por caracterÃstica o corrección de errores. +- Un pull más pequeño es más fácil y más rápido para revisar y fusionarlo. +- Asegurarse [ de hacer las pruebas unitarias (tests.markdown). +- Respetar los [estandares de codificación] (coding-standards.markdown). +- Escribir código mantenible, evitar la duplicación de código, usar las buenas practicas de PHP. +En cualquier caso, si no está seguro acerca de algo abierto crear un uevo ticket. + +Dile a tus amigos que Kanboard es impresionante +--------------------------------------------- + +Si utiliza Kanboard, corre la voz que le rodean. +Diles que es software libre y de código abierto esto es cool. diff --git a/doc/es_ES/creating-projects.markdown b/doc/es_ES/creating-projects.markdown new file mode 100755 index 00000000..87510d12 --- /dev/null +++ b/doc/es_ES/creating-projects.markdown @@ -0,0 +1,40 @@ +Creación de proyectos +================= + +Kanboard puede manejar múltiples proyectos. Hay dos tipos de proyectos + +- Proyectos por equipos +- Proyectos privados pra una sola persona + +Creando proyectos para multiples usuarios +------------------------------------------ + +- Solamente los administradores y los administradores de proyecto pueden crear los proyectos. +- La gestión de usuarios está disponible + +Desde el dashboard, click en el link **Nuevo proyecto**: + + + +Es muy facil , solo tienes que buscar un nombre para tu proyecto! + +Crear un proyecto privado +-------------------------- + +- Cualquiera puede crear un proyecto privado +- **No hay** gestión de usuarios +- Sólo el propietario y los administradores pueden acceder al proyecto + +Desde el dashboard, haga clic en el enlace **Nuevo proyecto privado**. + + +Crear proyectos desde otro proyecto +-------------------------------------- + +Cuando tu creas un nuevo proyecto, tu puedes escoger o duplicar las propiedades de otro proyecto : + +- Permisos +- Acciones +- Swimlanes +- Categorias +- Tareas diff --git a/doc/es_ES/creating-tasks.markdown b/doc/es_ES/creating-tasks.markdown new file mode 100755 index 00000000..970be533 --- /dev/null +++ b/doc/es_ES/creating-tasks.markdown @@ -0,0 +1,31 @@ +Creación de tarea +============== + +Desde el tablero, haga clic en el signo más **plus** al lado del nombre de la columna + + + +A continuación, aparece el formulario de creación de tareas: + + + +Descripción de campos: + +- **Titulo**: El título de su tarea, que se podrá ver en el tablero. +- **Descripción**: Descripción que usa el formato [Markdown](syntax-guide.markdown). +- **Tags**: Lista de etiquetas asociadas a las tareas +- **Crear otra tarea**:Marque esta casilla si desea crear una tarea similar (serán pre-llenados algunos campos).. +- **Color**: Escoger el color de la tarjeta. +- **Asignado**: Persona que trabajara en la tarea. +- **Categoría**: Sólo una categoría puede ser asignado a una tarea (visibles sólo si los proyectos tienen categorías). +- **Columna**: La columna en la que se creó la tarea, su tarea se coloca en la parte inferior. +- **Prioridad**: AL Prioridad de la tarea, el intervalo se puede definir en la configuración del proyecto, los valores por defecto son P0 a P3. +- **Complejidad**: Se utiliza en la gestión de proyectos ágiles (Scrum), los puntos de complejidad o de la historia es un número que le dice al equipo lo difícil es la historia. A menudo, las personas utilizan la serie de Fibonacci. +- **Referencia**: ID externo para la tarea, por ejemplo, puede ser el número de entradas que provienen de otro sistema +- **Estimación original** : Estimación de horas para completar la tarea. +- **Tiempo transcurrido** : El tiempo dedicado a trabajar en la tarea. +- **Fecha de Inicio** : Se trata de un campo de fecha y hora. +- **Fecha de vencimiento** : Las tareas vencidas se tiene una fecha de vencimiento próxima rojo y las fechas de vencimiento será de color negro en el tablero. Varios formato de fecha se aceptan además del selector de fecha. + + +Con el enlace de vista previa, se puede ver la descripción de la tarea convertiendo la sintaxis de Markdown. diff --git a/doc/es_ES/cronjob.markdown b/doc/es_ES/cronjob.markdown new file mode 100755 index 00000000..b7dc5cee --- /dev/null +++ b/doc/es_ES/cronjob.markdown @@ -0,0 +1,32 @@ +Programaci�n de Jobs en background +================================== + +Para trabajar correctamente,Kanboard requiere que se corra un job en background diariamente. +Usualmente en plataformas Unix, este proceso se hace con `cron`. + +Este job es necesario para estas caracteristicas: + +- Reportes y analisis (calcular diariamente las estadisticas de cada proyecto) +- Enviar notificaciones de tareas atrasadas. +- Ejecutar automaticamente acciones conectadas a el evento "Daily background job for tasks" + +Configuraci�n de plataformas Unix y Linux +----------------------------------------- + +Hay varias maneras de definir una tarea programada en sistemas operativos Unix/Linux , este ejemplo es para Ubuntu 14.04 . +El procedimiento es similar a otros sistemas. + +Editar el crontab del usuario de tu servidor web + +```bash +sudo crontab -u www-data -e +``` + +Ejemplo para ejecutar diariamente cronjob a las 8am: + +```bash +0 8 * * * cd /path/to/kanboard && ./cli cronjob >/dev/null 2>&1 +``` + +Nota : El proceso del cronjob debe tener acceso a escritura de la base de datos en caso de usar Sqlite. +Usualmente, el cronjob corre bajo el usuario del servidor web. ** www-data , Ejemplo ** diff --git a/doc/es_ES/debian-installation.markdown b/doc/es_ES/debian-installation.markdown new file mode 100644 index 00000000..5636744b --- /dev/null +++ b/doc/es_ES/debian-installation.markdown @@ -0,0 +1,65 @@ +Como instalar Kanboard en debian +================================ + +Nota: Algunas caracteristicas de Kanboard requieren que tu corras [un job en background diariamente](cronjob.markdown). + +Debian 8 (Jessie) +----------------- + +Instalar Apache y PHP : + +```bash +apt-get update +apt-get install -y php5 php5-sqlite php5-gd unzip +service apache2 restart +``` + +Instalar Kanboard + +```bash +cd /var/www/html +wget https://kanboard.net/kanboard-latest.zip +unzip kanboard-latest.zip +chown -R www-data:www-data kanboard/data +rm kanboard-latest.zip +``` + +Debian 7 (Wheezy) +----------------- + +Instalar Apache y PHP + +```bash +apt-get update +apt-get install -y php5 php5-sqlite php5-gd unzip +``` + +Instalar Kanboard + +```bash +cd /var/www +wget https://kanboard.net/kanboard-latest.zip +unzip kanboard-latest.zip +chown -R www-data:www-data kanboard/data +rm kanboard-latest.zip +``` + +Debian 6 (Squeeze) +------------------ + +Instalar Apache y PHP + +```bash +apt-get update +apt-get install -y libapache2-mod-php5 php5-sqlite php5-gd unzip +``` + +Instalar Kanboard: + +```bash +cd /var/www +wget https://kanboard.net/kanboard-latest.zip +unzip kanboard-latest.zip +chown -R www-data:www-data kanboard/data +rm kanboard-latest.zip +``` diff --git a/doc/es_ES/docker.markdown b/doc/es_ES/docker.markdown new file mode 100644 index 00000000..3204563f --- /dev/null +++ b/doc/es_ES/docker.markdown @@ -0,0 +1,105 @@ +Como ejecutar Kanboard con Docker? +================================ + +Kanboard puede funcionar facilmente con [Docker] (https://www.docker.com). + +El tamaño de la imagen es aproximadamente de **70MB** y contiene: + +- [Alpine Linux](http://alpinelinux.org/) +- The [process manager S6](http://skarnet.org/software/s6/) +- Nginx +- PHP 7 + +La tarea programada de Kanboard tambien esta todos los dias a la medianoche. +La reescritura de la URL esta activada e incluida en el archivo de configuracion. + +Cuando el contenedor esta funcionando, la memoria ocupa alrededor de **30MB**. + + +Utilice la versión estable +---------------------- + +Para buscar la ultima versión estable de Kanboard use la etiqueta **estable**: + +```bash---terminal +docker pull kanboard/kanboard +docker run -d --name kanboard -p 80:80 -t kanboard/kanboard:stable +``` + +Utilice la versión de desarollo (build automatico) +--------------------------------------------- + +Cada commit nuevo en el repositorio crea una nueva construccion en la [Docker Hub](https://registry.hub.docker.com/u/kanboard/kanboard/). + + +```bash---terminal +docker pull kanboard/kanboard +docker run -d --name kanboard -p 80:80 -t kanboard/kanboard:latest +``` + +La etiqueta **ultimo** es la **version de desarrollo** de Kanboard, uselo bajo su propio riesgo. + +Construya su propia imagen acoplable +--------------------------- + +Hay un `Dockerfile` en el repositorio de Kanboard para construir su imagen acoplable. +Clone el repositorio de Kanboard y ejecute el siguiente camando. + +```bash---terminal +docker build -t youruser/kanboard:master . +``` + +o + +```bash---terminal +make docker-image +``` + +Para ejecutar su contenedor en el fondo del puerto 80: + +```bash--terminal +docker run -d --name kanboard -p 80:80 -t youruser/kanboard:master +``` + +Volúmenes +------- + +Usted puede adjuntar dos volúmenes de su contenedor: + +- Carpeta de datos: `/var/www/app/data` +- Complementos de carpeta: `/var/www/app/plugins` + + +Use el indicador `-v` par montar un volumen en el ordenador central como se describe en [official Docker documentation](https://docs.docker.com/engine/userguide/containers/dockervolumes/). + + +Actualizar contenedor +---------------------- + +-Ponga la nueva imagen +-Elimine el nuevo contenedor +-Reinicie el nuevo contenedor con algunos volúmenes + +Variables de entorno +--------------------- + +La lista de las varibles de entorno esta disponible en [esta pagina](env.markdown). + +Archivos configurados +------------ + +- El contenedor ya incluye un archivo de configuracion personalizado `/var/www/app/config.php`. +- Puede almacenar su propio archivo de configuracion de volumen de datos`/var/www/app/data/config.php`. + + +Referencias +---------- + +- [Official Kanboard images](https://registry.hub.docker.com/u/kanboard/kanboard/) +- [Docker documentation](https://docs.docker.com/) +- [Dockerfile stable version](https://github.com/kanboard/docker) +- [Dockerfile dev version](https://github.com/kanboard/kanboard/blob/master/Dockerfile) +- [Imagenes oficiales de Kanboard](https://registry.hub.docker.com/u/kanboard/kanboard/) +- [Documentacionde Docker](https://docs.docker.com/) +- [Dockerfile version estable](https://github.com/kanboard/docker) +- [Dockerfile version dev](https://github.com/kanboard/kanboard/blob/master/Dockerfile) diff --git a/doc/es_ES/faq.markdown b/doc/es_ES/faq.markdown new file mode 100755 index 00000000..9ea2109e --- /dev/null +++ b/doc/es_ES/faq.markdown @@ -0,0 +1,132 @@ +Preguntas frecuentes +========================== + +Tu puedes recomendar un proveedor de web hosting para Kanboard? +--------------------------------------------------------------- + +Kanboard funciona bien con cualquier VPS proveedor de hosting como [Digital Ocean](https://www.digitalocean.com/?refcode=4b541f47aae4), +[Linode](https://www.linode.com/?r=4e381ac8a61116f40c60dc7438acc719610d8b11) o [Gandi](https://www.gandi.net/). + +Para tener el mejor performance , elegir un proveedor con el disco rápido de I/O porque Kanboard utilizar SQLite de forma predeterminada . +Evitar los proveedores de alojamiento que utilizan un punto de montaje NFS compartido. + + +Me sale una página en blanco después de instalar o actualizar Kanboard +---------------------------------------------------------------------- + +- Verificar si tienes instalados todos los requerimientos en tu servidor +- Verificar el log de errores de PHP y Apache +- Verificar si los archivos tienen los permisos correctos +- Si utiliza un agresivo OPcode caching, haz un reload a tu web-server o php-fpm + + +Si Tienes el error "No hay CSPRNG adecuado instalado en su sistema " +----------------------------------------------------------------------- + +Si tu usas PHP < 7.0, Tu necesitas tener la extensión openssl habilitada o `/dev/urandom` accesible desde la aplicación si se +restringe por un `open_basedir` + + +Página no encontrada y la URL parece mal (&amp;) +-------------------------------------------------- + +- La URL se mira como `/?controller=auth&action=login&redirect_query=` instanciada de `?controller=auth&action=login&redirect_query=` +- Kanboard regresa el error "Page not found" + +Este problema proviene de la configuración de PHP , el valor de ` arg_separator.output` no es defecto del PHP , hay diferentes maneras de solucionar que: + +Cambiar el valor directamente en su ` php.ini` si es posible : + +`` ` +arg_separator.output = "& " +`` ` + +Sustituir el valor con un ` .htaccess` : + +`` ` +arg_separator.output php_value "& " +`` ` + +De lo contrario Kanboard tratará de anular el valor directamente en PHP . + + +Error de autenticación con la API y Apache + PHP - FPM +-------------------------------------------------------- + +Php-cgi bajo Apache HTTP basico no pasa user/pass forma predeterminada . +Para que esta solución funcione , añadir estas líneas a su archivo ` .htaccess` : + +``` +RewriteCond %{HTTP:Authorization} ^(.+)$ +RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] +``` + + +Problemas conocidos con eAccelerator +------------------------------ + +Kanboard no funciona muy bien con [eAccelerator](http://eaccelerator.net). +El problema puede ser causado una página en blanco o un accidente de Apache : + +``` +[Wed Mar 05 21:36:56 2014] [notice] child pid 22630 exit signal Segmentation fault (11) +``` + +La mejor manera de evitar este problema es desactivar eAccelerator o definir manualmente los archivos que desea almacenar en caché con el parámetro de configuración ` eaccelerator.filter` . + +The project [eAccelerator parece muerto y no se actualiza desde 2012](https://github.com/eaccelerator/eaccelerator/commits/master). +Recomendamos para cambiar a la ultima versión de PHP por que el bundled viene con [OPcache](http://php.net/manual/en/intro.opcache.php). + + +Por que el requerimiento minimo es PHP 5.3.3? +----------------------------------------- + +Kanboard utiliza la funcion `password_hash()` para encriptar los passwords pero solo esta disponible ne la version PHP >= 5.5. + +Sin embargo, hay un back-port para [versiones de php anteriores](https://github.com/ircmaxell/password_compat#requirements). +Esta biblioteca requiere al menos PHP 5.3.7 para que funcione correctamente. + +Al parecer , CentOS y Debian tienen parches de seguridad en su back-port para PHP 5.3.3 y al parecer estan bien. + +Kanboard v1.0.10 y v1.0.11 requiere al menos PHP 5.3.7 , pero este cambio se ha vuelto a ser compatible con PHP 5.3.3 con Kanboard > = v1.0.12 + + +Cómo probar Kanboard con el PHP incorporado en el servidor web? +--------------------------------------------------------------- + +Si tu no quieres instalar un servidor web como Apache en tu localhost, tu puedes testearlo con el [servidor web embebido de PHP](http://www.php.net/manual/en/features.commandline.webserver.php): + +```bash +unzip kanboard-VERSION.zip +cd kanboard +php -S localhost:8000 +open http://localhost:8000/ +``` + + +Como instalar Kanboard en Yunohost? +------------------------------------ + +[YunoHost](https://yunohost.org/) es un sistema operativo de servidor con el objetivo de hacer auto-alojamiento accesible para todos. + +Existe un [paquete para instalar Kanboard en Yunohost facilmente](https://github.com/mbugeia/kanboard_ynh). + + +¿Dónde puedo encontrar una lista de proyectos relacionados? +-------------------------------------------- + +- [Kanboard API python client by @freekoder](https://github.com/freekoder/kanboard-py) +- [Kanboard Presenter by David Eberlein](https://github.com/davideberlein/kanboard-presenter) +- [CSV2Kanboard by @ashbike](https://github.com/ashbike/csv2kanboard) +- [Kanboard for Yunohost by @mbugeia](https://github.com/mbugeia/kanboard_ynh) +- [Trello import script by @matueranet](https://github.com/matueranet/kanboard-import-trello) +- [Chrome extension by Timo](https://chrome.google.com/webstore/detail/kanboard-quickmenu/akjbeplnnihghabpgcfmfhfmifjljneh?utm_source=chrome-ntp-icon), [Source code](https://github.com/BlueTeck/kanboard_chrome_extension) +- [Python client script by @dzudek](https://gist.github.com/fguillot/84c70d4928eb1e0cb374) +- [Shell script for SQLite to MySQL/MariaDB migration by @oliviermaridat](https://github.com/oliviermaridat/kanboard-sqlite2mysql) +- [Git hooks for integration with Kanboard by Gene Pavlovsky](https://github.com/gene-pavlovsky/kanboard-git-hooks) + + +¿Hay algunos tutoriales sobre Kanboard en otro idioma? +----------------------------------------------------------- + +- [Artículo serie alemana sobre Kanboard](http://demaya.de/wp/2014/07/kanboard-eine-jira-alternative-im-detail-installation/) diff --git a/doc/es_ES/freebsd-installation.markdown b/doc/es_ES/freebsd-installation.markdown new file mode 100644 index 00000000..9d8d0025 --- /dev/null +++ b/doc/es_ES/freebsd-installation.markdown @@ -0,0 +1,132 @@ +Instalacion en FreeBSD +======================= + +Instalación de paquetes +--------------------- + +```bash---terminal +$ pkg update +$ pkg upgrade +$ pkg install apache24 mod_php56 kanboard +``` + +Habilitar Apache en `/etc/rc.conf`; + +```bash---terminal +$ echo apache24_enable="YES" >> /etc/rc.conf +``` + +Preparar PHP para Apache: + +```bash---terminal +$ echo "AddType application/x-httpd-php .php" >> /usr/local/etc/apache24/Includes/php.conf +$ echo "DirectoryIndex index.php index.html" >> /usr/local/etc/apache24/Includes/php.conf +``` + +Iniciar Apache: + +```bash---terminal +$ service apache24 start +``` + +Añadir enlace a la carpeta Kanboard en su docroot Apache: + + +```bash---terminal +cd /usr/local/www/apache24/data +ln -s /usr/local/www/kanboard +``` + +Ir a http://your.server.domain.tld/kanboard and enjoy! + +*Notas*: +- Si deseas utilizar funciones adicionales como la integracion con LDAP, etc. +por favor instale el modulo PHP utilizando el paquete adecuado. +- Es posible que tenga que ejecutar los permisos de la carpeta de datos. + + +Instalacion de puertos +--------------------- + +Generalmente tres elementos tienen que instalarse: + +- Apache +- mod_php for Apache +- Kanboard + +Fetch y extraer puertos... + +```bash---terminal +$ portsnap fetch +$ portsnap extract +``` + +o actualizacion ya existente: + +```bash---terminal +$ portsnap fetch +$ portsnap update +``` + +Mas detalles con respecto a portsnap se puede encontrar en [FreeBSD Handbook](https://www.freebsd.org/doc/handbook/ports-using.html). + +Instalacion de Apache: + +```bash--terminal +$ cd /usr/ports/www/apache24 +$ make install clean +``` + +Habilitar Apache en `/etc/rc.conf`: + +```bash---terminal +$ echo apache24_enable="YES" >> /etc/rc.conf +``` + +Instalacion de mod_php para Apachec: + +```bash---terminal +$ cd /usr/ports/www/mod_php5 +$ make install clean +``` + +Instalacion de los puertos de formulario para Kanboard + +```bash---terminal +$ cd /usr/ports/www/kanboard +$ make install clean +``` + +Configuracion de PHP para Apache + + +```bash--terminal +$ echo "AddType application/x-httpd-php .php" >> /usr/local/etc/apache24/Includes/php.conf +$ echo "DirectoryIndex index.php index.html" >> /usr/local/etc/apache24/Includes/php.conf +``` + +Iniciando Apache: + +```bash---terminal +$ service apache24 start +``` + +Ir a http://your.server.domain.tld/kanboard and enjoy! + +*Nota*: +Si desea utilizar funciones adicionales como la intregacion con LDAP, etc. +Instale el modulo PHP adecuado de `lang/php5-extensions`. + + +Manual de instalacion +------------------- + +Como en la version 1.0.16 Kanboard se puede encontrar en los puertos de FreeBSD no hay necesidad de instalarlo manualmente. + + +Tome nota por favor +-------------------- + +- El puerto esta alojado en [bitbucket](https://bitbucket.org/if0/freebsd-kanboard/). Sientase libre de comentar, y sugerir cambios ! +- Algunas funciones de Kanboard requieren ejecutar[un trabajo en segundo plano todos los dias](cronjob.markdown). + diff --git a/doc/es_ES/heroku.markdown b/doc/es_ES/heroku.markdown new file mode 100644 index 00000000..8de8b4da --- /dev/null +++ b/doc/es_ES/heroku.markdown @@ -0,0 +1,38 @@ +Implementar Kanboard en Heroku +========================= + +Usted puede tratar de forma gratuita en Kanboard[Heroku](https://www.heroku.com/). +Puede utilizar este botón de un solo clic instalar o siga las instrucciones del manual abajo: + +[](https://heroku.com/deploy?template=https://github.com/kanboard/kanboard) + +Requerimientos +------------ +- Cuenta de Heroku, se puede utilizar una cuenta gratuita +- Herramientas de lÃnea de comandos instalados Heroku + +Manual de Instrucciones +------------------- + +```bash +# Obtener la ultima version de desarrollo +git clone https://github.com/kanboard/kanboard.git +cd kanboard + +# Empuje el código para Heroku (También puede utilizar SSH si Git sobre HTTP no funciona) +heroku create +git push heroku master + +# Iniciar un nuevo banco de pruebas con una base de datos PostgreSQL +heroku ps:scale web=1 +heroku addons:add heroku-postgresql:hobby-dev + +# Abra su navegador +heroku open +``` + +Limitaciones +----------- + +- El almacenamiento de Heroku es efÃmera, eso significa que los archivos cargados a través de Kanboard no son persistentes después de un reinicio. Es posible que desee instalar un plugin para almacenar sus archivos en un proveedor de almacenamiento en la nube como [Amazon S3](https://github.com/kanboard/plugin-s3). +- Algunas funciones de Kanboard requieren que ejecute [un trabajo en segundo plano todos los dÃas] (cronjob.markdown). diff --git a/doc/es_ES/installation.markdown b/doc/es_ES/installation.markdown new file mode 100644 index 00000000..f3dfc495 --- /dev/null +++ b/doc/es_ES/installation.markdown @@ -0,0 +1,72 @@ +Instalación + +En primer lugar, comprobar los [requisitos] ( requirements.markdown)antes de ir más lejos. + +Del archivo (versión estable) +--------------------------------- + + +1. Debe tener un servidor web con PHP instalado +2. Descargar el código fuente y copiar el directorio ` kanboard` en la que desea. +3. Comprobar si el directorio ` data` se puede escribir +4. Con el navegador vaya a < http://yourpersonalserver/kanboard > +5. El nombre de usuario y contraseña por defecto es **admin/admin** +6. Comience a utilizar el software +7. No se olvide de cambiar su contraseña! + + +La carpeta de datos se utiliza para almacenar: + +- Base de datos SQLite: ` db.sqlite` +- Archivo de depuración: ` debug.log` (si está activado el modo de depuración) +- Archivos cargados: ` ficheros / *` +- miniaturas de imagen: ` ficheros / miniaturas / *` + +Las personas que están utilizando una base de datos remota (MySQL / PostgreSQL) y un almacenamiento de archivos a distancia (AWS S3 o similar) no necesariamente tienen que tener una carpeta de datos local persistente o para cambiar el permiso. + +Desde el repositorio (versión de desarrollo) +----------------------------------------- + + +Debe instalar [compositora] (https://getcomposer.org/)para utilizar este método. + +1. ` git clone https: // github.com / kanboard / kanboard.git` +2. ` composer instalar --no- dev` +3. Ir a la tercera etapa justo por encima + +Nota: Este método se instalará la versión de **desarrollo actual** , utilice a su propio riesgo . + +Instalación exterior de la raÃz del documento +--------------------------------------------- + +Si desea instalar Kanboard fuera de la raÃz de documentos del servidor web, es necesario crear al menos estos enlaces simbólicos: + +```bash +. +├── assets -> ../kanboard/assets +├── cli -> ../kanboard/cli +├── doc -> ../kanboard/doc +├── favicon.ico -> ../kanboard/favicon.ico +├── index.php -> ../kanboard/index.php +├── jsonrpc.php -> ../kanboard/jsonrpc.php +└── robots.txt -> ../kanboard/robots.txt +``` + +El ` .htaccess` es opcional, ya que su contenido puede ser incluido directamente en la configuración de Apache. + +También puede definir una ubicación personalizada para los plugins y carpetas de archivos cambiando el [archivo de configuración] (config.markdown). + +La instalación opcional + +--------------------- + +- Algunas funciones de Kanboard requieren que ejecuta [un trabajo en segundo plano todos los dÃas] (cronjob.markdown) (Informes y análisis) +- [Instalar el trabajador fondo] (worker.markdown) para mejorar las prestaciones + +Seguridad +--------- + + +- No se olvide de cambiar el usuario por defecto / contraseña +- No permita a todo el mundo para acceder al directorio ` data` de la URL. +Ya existe un ` .htaccess` para Apache , pero nada para los demás servidores web. diff --git a/doc/es_ES/kanban-vs-todo-and-scrum.markdown b/doc/es_ES/kanban-vs-todo-and-scrum.markdown index 6e8d9e6c..5295a6d1 100644 --- a/doc/es_ES/kanban-vs-todo-and-scrum.markdown +++ b/doc/es_ES/kanban-vs-todo-and-scrum.markdown @@ -11,7 +11,7 @@ Kanban vs Todo lists ### Kanban: -- Multi fases, +- Multi fases, - Concentración absoluta para evitar multitareas por que se puede establecer un limite por columna para mejorar el progreso diff --git a/doc/es_ES/keyboard-shortcuts.markdown b/doc/es_ES/keyboard-shortcuts.markdown new file mode 100755 index 00000000..9e75a138 --- /dev/null +++ b/doc/es_ES/keyboard-shortcuts.markdown @@ -0,0 +1,38 @@ +Atajos de teclado ** keyboard shortcuts ** +========================================== + +La disponibilidad de los Atajos de teclado depende de la página que está actualmente . + +Vistas de proyectos (Board, Calendario, Lista, Gantt) +-------------------------------------------- + +- Cambie a la visión general del proyecto = **v o** +- Cambie ala vista del tablero = **v b** (presiona **v** y despues **b**) +- Cambie ala vista del calendario = **v c** +- Cambie a la vista de lista = **v l** +- Cambie a la vista de Gantt = **v g** + +Vista de tablero +--------------- + +- Nueva tarea = **n** +- Expandir/colapsar tarea = **s** +- Vista Compacta/Amplia = **c** + +Vista de tarea +--------- + +- Editar tarea = **e** +- Nueva subtarea = **s** +- Nuevo comentario = **c** +- Nuevo link interno = **l** + +Aplicación +----------- + +- Visualizar la lista de atajos de teclado = **?** +- Abrir tablero y cambiarlo = **b** +- Ir a la caja de busqueda = **f** +- Eliminar la caja de busqueda = **r** +- Cerrar dialog box = **ESC** +- Submit al formulario = **CTRL+ENTER** or **⌘+ENTER** diff --git a/doc/es_ES/mysql-configuration.markdown b/doc/es_ES/mysql-configuration.markdown new file mode 100755 index 00000000..9428d392 --- /dev/null +++ b/doc/es_ES/mysql-configuration.markdown @@ -0,0 +1,74 @@ +Configuración Mysql/MariaDB +=========================== + + +Por defecto Kanboard utilizar SQLite para almacenar tus datos. +Sin embargo, es posible usar MySQL o MariaDB en lugar de SQLite. + +Requirimientos +------------ + +- Mysql server +- Instalar la extensión `pdo_mysql` en PHP + +Nota: Kanboard esta testeada con **Mysql >= 5.5 y MariaDB >= 10.0** + +configuración Mysql +------------------- + +### Crear una base de datos + +El primer paso es crear una base de datos en tu servidor MySQL +Por ejemplo, se puede hacer eso con el cliente de línea de comandos mysql: + +```sql +CREATE DATABASE kanboard; +``` + +### Crear un archivo de configuración + +El archivo `config.php` debería contener estos valores: + +```php +<?php + +// Elegimos el uso de MySQL en lugar de SQLite +define('DB_DRIVER', 'mysql'); + +// Mysql parametros +define('DB_USERNAME', 'REPLACE_ME'); +define('DB_PASSWORD', 'REPLACE_ME'); +define('DB_HOSTNAME', 'REPLACE_ME'); +define('DB_NAME', 'kanboard'); +``` + +Nota: Se puede renombrar el archivo de plantilla `config.default.php` a `config.php`. + +### Importando SQL dump (metodo alternativo) + + +Por primera vez, se ejecutará Kanboard uno por uno cada migración de base de datos y este proceso puede tardar algún tiempo de acuerdo a su configuración. + +Para evitar cualquier tiempo de espera de potencial se puede inicializar la base de datos directamente importando el esquema de SQL: + +```bash +mysql -u root -p my_database < app/Schema/Sql/mysql.sql +``` + +El archivo `app/Schema/Sql/mysql.sql` es un dump SQL que representa la ultima versión de la base de datos + +SSL configuración +----------------- + +Estos parámetros tienen que ser definidas para permitir la conexión SSL Mysql: + +```php +// Mysql SSL key +define('DB_SSL_KEY', '/path/to/client-key.pem'); + +// Mysql SSL certificados +define('DB_SSL_CERT', '/path/to/client-cert.pem'); + +// Mysql SSL CA +define('DB_SSL_CA', '/path/to/ca-cert.pem'); +``` diff --git a/doc/es_ES/plugin-authentication-architecture.markdown b/doc/es_ES/plugin-authentication-architecture.markdown new file mode 100644 index 00000000..86069aa0 --- /dev/null +++ b/doc/es_ES/plugin-authentication-architecture.markdown @@ -0,0 +1,99 @@ +Arquitectura de autenticación +============================= + +Kanboard provee una flexible y conectable arquitectura de autenticación. + +Por default, el usuario puede autenticarse con multiple metodos: + +- Autenticación por usuario y password (Base de datos local y LDAP) +- Autenticación OAuth2 +- Autenticación Reverse-Proxy +- Autenticación basada en Cookie (Recuerdame) + +Además, despues de una autenticación satisfactoria un puede hacerse post de autenticación Two-Factor . +Kanboard sopoarta nativamente el standart TOTP. + +Interfaces de autenticación +---------------------------- + +Para tener un sistema conectable, los drivers de autenticación deben implementar un conjunto de interfaces + +| Interface | Rol | +|------------------------------------------|------------------------------------------------------------------| +| AuthenticationProviderInterface | Interface base para otras interfaces de autenticación | +| PreAuthenticationProviderInterface | The user is already authenticated al alcanzar la aplicación, Usualmente los servidores web definen algunas variables de entorno | +| PasswordAuthenticationProviderInterface | El metodo de autenticación que usa el username y password provienen del formulario de login | +| OAuthAuthenticationProviderInterface | Proveedores OAuth2 | +| PostAuthenticationProviderInterface | Drivers de autenticación Two-Factor ,pide el código a confirmar | +| SessionCheckProviderInterface | Los proveedores que son capaces de comprobar si la sesión de usuario es válida | + +### Ejemplos de autenticación de proveedores: + +- Database por default metodos a implementar `PasswordAuthenticationProviderInterface` y `SessionCheckProviderInterface` +- Reverse-Proxy metodos a implementar `PreAuthenticationProviderInterface` y `SessionCheckProviderInterface` +- Google metodos a implementar `OAuthAuthenticationProviderInterface` +- LDAP metodos a implementar `PasswordAuthenticationProviderInterface` +- RememberMe cookie metodos a implementar `PreAuthenticationProviderInterface` +- Two-Factor TOTP metodos a implementar `PostAuthenticationProviderInterface` + +flujo de trabajo de autenticación ** Workflow ** +------------------------------------------------ + +Para cada peticion HTTP: + +1. Si la sesión de usuario esta abierta, ejecuta el registro de proveedores que implementa`SessionCheckProviderInterface` +2. Ejecuta todos los proveedores que implementa `PreAuthenticationProviderInterface` +3. Si el usuario final hace un submit al formulario del login, Los proveedores que implementa `PasswordAuthenticationProviderInterface` are executed +4. Si el usuario final quiere usar OAuth2, el selecciona el proveedor a ejecutar +5. Despues de una autenticación satisfactoria, el ultimo registro utilizará `PostAuthenticationProviderInterface` +6. Sincronizar la información del usuario si es necesario + +Este workflow es manejado por la clase `Kanboard\Core\Security\AuthenticationManager`. + +Eventos disparados: + +- `AuthenticationManager::EVENT_SUCCESS`: autenticación satisfactoria +- `AuthenticationManager::EVENT_FAILURE`: autenticación fallida + +Cada vez que se produce un evento de fallo , el contador de intentos fallidos se incrementa. + +La cuenta de usuario se puede bloquear para el período de tiempo configurado y un captcha puede ser mostrado para evitar ataques de fuerza bruta . + +Interface de usuario del proveedor +--------------------------------- + +Cuando la autenticación es satisfactoria, la `AuthenticationManager` pedura la información del usuario para que el driver llame al metodo `getUser()`. +Este metodo debe regresar un objeto que implementa la interface `Kanboard\Core\User\UserProviderInterface`. + +Esta clase abstracta reune la información dede otro sistema. + +Ejemplos : + +- `DatabaseUserProvider` proporciona información para un usuario interno +- `LdapUserProvider` para un usuario LDAP +- `ReverseProxyUserProvider` para un usuario Reverse-Proxy +- `GoogleUserProvider` represtan un usuario de Google + +Los métodos para la interface del proveedor de Usuario: + +- `isUserCreationAllowed()`: Regresa true para permitir la creación automática de usuarios +- `getExternalIdColumn()`: Obtener Identificación del nombre de la columna externa (google_id, github_id, gitlab_id...) +- `getInternalId()`: Obtener el id interno de la base de datos +- `getExternalId()`: Obtener el id externo(Unique id) +- `getRole()`: Obtener el rol de usuario +- `getUsername()`: Obtener en nombre de usuario ** username ** +- `getName()`: Obtener nombre completo del usuario +- `getEmail()`: Obtener el correo electronico del usuario +- `getExternalGroupIds()`: Obtiene los ids externos del grupo, automáticamente sincroniza la membresia del grupo y la presenta +- `getExtraAttributes()`: Obtiene los atributos extras para ser mostrados a el usuario durante la sincronización local + +No es obligatorio que el metodo devuelva un valor. + +Sincronización de un usuario local +---------------------------------- + +La información del usuario puede ser sincronizada automáticamente con la base de datos local. + +- Si el metodo`getInternalId()` regresa un valor no realiza la sincronización +- Los metodos `getExternalIdColumn()` y `getExternalId()` debe regresar un valor para sincronizar el usuario +- Las propiedades que regresan un ** String ** vacios no se sincronizan diff --git a/doc/es_ES/plugin-authentication.markdown b/doc/es_ES/plugin-authentication.markdown new file mode 100644 index 00000000..05742156 --- /dev/null +++ b/doc/es_ES/plugin-authentication.markdown @@ -0,0 +1,42 @@ +Plugin de autenticación +===================== + +EL nuevo backend de autenticación se puede escribir con muy pocas lineas de codigo. + +Registro de proveedores +----------------------- + +En el metodo `initialize()` nuestro plugin, llama al metodo `register()` de la clase `AuthenticationManager`: + +```php +public function initialize() +{ + $this->authenticationManager->register(new ReverseProxyLdapAuth($this->container)); +} +``` + +El objeto proveniente de el metodo `register()` debe implementar one de las interfaces de autenticación predefidas. + +Esas interfaces estan definidas en los namespace `Kanboard\Core\Security`: + +- `Kanboard\Core\Security\PreAuthenticationProviderInterface` +- `Kanboard\Core\Security\PostAuthenticationProviderInterface` +- `Kanboard\Core\Security\PasswordAuthenticationProviderInterface` +- `Kanboard\Core\Security\OAuthAuthenticationProviderInterface` + + + +El único requisito es implementar las interfaces, la clase se puede escribir de la manera deseada y situado en cualquier lugar en el disco + +Usuario del proveedor +---------------------- + +Cuando la autenticación es satisfactoria, tu driver debe regresar un objato que representa al usuario. +Este objeto debe implementasr la interface `Kanboard\Core\User\UserProviderInterface`. + +Ejemplo de plugin de autenticación +---------------------------------- + +- [Autenticación de proveedores incluido en kanboard](https://github.com/kanboard/kanboard/tree/master/app/Auth) +- [Reverse-Proxy Autenticación con soporte LDAP](https://github.com/kanboard/plugin-reverse-proxy-ldap) +- [Two-Factor Autenticación SMS](https://github.com/kanboard/plugin-sms-2fa) diff --git a/doc/es_ES/plugin-authorization-architecture.markdown b/doc/es_ES/plugin-authorization-architecture.markdown new file mode 100644 index 00000000..884e90aa --- /dev/null +++ b/doc/es_ES/plugin-authorization-architecture.markdown @@ -0,0 +1,39 @@ +Arquitecuta de autorización +=========================== + +Kanboard [soporta multiples roles](roles.markdown) a nivel de aplicación y a nivel de proyecto. + +Workflow de autorización +-------------------------- + +Para cada solicitud HTTP: + +1. Autorizar o no el acceso a los recursos en base a la lista de acceso a las aplicaciones +2. Si el recurso es para un projecto (board, tarea...): + 1. Extrae los roles de usuario para este proyecto + 2. Permitir/Denegar accesos basados en el mapa de acceso del proyecto + +Extendiendo mapa de accesos +--------------------------- + +Lista de accesos (ACL) se basa en el nombre de clase del controlador y el nombre del método +La lista de acceso está a cargo de la clase `Kanboard\Core\Security\AccessMap`. + +Hay dos mapa de acceso: una para la aplicación y la otra para un proyecto. + +- Acceso al mapa de aplicación : `$this->applicationAccessMap` +- Acceso al mapa del proyecto: `$this->projectAccessMap` + +Ejemplos para definir una nueva política para tu plugin: + +```php +// Todos los metodos de la clase MyController: +$this->projectAccessMap->add('MyController', '*', Role::PROJECT_MANAGER); + +// Todos los metodos: +$this->projectAccessMap->add('MyOtherController', array('create', 'save'), Role::PROJECT_MEMBER); +``` + +Los roles estan defidos en la clase `Kanboard\Core\Security\Role`. + +Clase de autorización (`Kanboard\Core\Security\Authorization`) comprobará el acceso de cada página. diff --git a/doc/es_ES/plugin-automatic-actions.markdown b/doc/es_ES/plugin-automatic-actions.markdown new file mode 100644 index 00000000..6e0a9b65 --- /dev/null +++ b/doc/es_ES/plugin-automatic-actions.markdown @@ -0,0 +1,61 @@ +Agregando acciones automáticas +=============================== + +Agregando una nueva acccion automática es bastante simple. + +Creando una nueva accion +------------------------ + +Tus acciones automáticas deben heradarse de la clase `Kanboard\Action\Base`. + +Varios métodos abstractos deben ser implementadas por sí mismo: + +| Metodos | Descripción | +|-------------------------------------|------------------------------------------------------------------| +| `getDescription()` | Descripcion visible en la interface del usuario | +| `getCompatibleEvents()` | Obtener las listas de eventos compatibles | +| `getActionRequiredParameters()` | Obtener los parametros requeridos para la acción (definidos por el usuario)| +| `getEventRequiredParameters()` | Obtener los parametros requeridos para el evento | +| `doAction(array $data)` | Ejecutar la acción, Debe regresar true si fue satisfactorio | +| `hasRequiredCondition(array $data)` | Comprobar si los datos de eventos cumplen la condición de acción | + +Tu accion automatica es identificada en kanboard utilizando el nombre de la clase absoluta con el espacio de nombre incluido + +Agregando nuevos eventos +------------------------ + +La lista de eventos de la aplicación está disponible en la clase `Kanboard\Core\Event\EventManager::getAll()`. +Sin embargo, si tu plugin dispara nuevos eventos, tu puedes registrar estos eventos : + +```php +$this->actionManager->getAction('\Kanboard\Plugin\MyPlugin\MyActionName')->addEvent('my.event', 'My event description'); +``` + +Tu puedes extender la lista de eventos compatibles de acciones existentes para ser usada en algun metodo. + +Registra la acción +---------------------- + +Tu tienes que llamar el metodo `register()` desde la clase `Kanboard\Core\Action\ActionManager`: + +```php +<?php + +namespace Kanboard\Plugin\AutomaticAction; + +use Kanboard\Core\Plugin\Base; +use Kanboard\Plugin\AutomaticAction\Action\TaskRename; + +class Plugin extends Base +{ + public function initialize() + { + $this->actionManager->register(new TaskRename($this->container)); + } +} +``` + +Ejemplo +------- + +- [Ejemplo de acción automatica](https://github.com/kanboard/plugin-example-automatic-action) diff --git a/doc/es_ES/plugin-avatar-provider.markdown b/doc/es_ES/plugin-avatar-provider.markdown new file mode 100644 index 00000000..2cce0647 --- /dev/null +++ b/doc/es_ES/plugin-avatar-provider.markdown @@ -0,0 +1,32 @@ +Agregando un nuevo avatar del proveedor +======================================= + +Registrar +------------ + +```php +$this->avatarManager->register(new CustomAvatarProvider()); +``` + +Interface +--------- + +El proveedor debe implementar la interface `Kanboard\Core\User\Avatar\AvatarProviderInterface`: + + +| Metodo | Descripcion | +|-------------------------------|---------------------------------------------------------------| +| `render(array $user, $size)` | Renderizar HTML | +| `isActive(array $user)` | Regresa un boolean si el proveedor esta activo | + + +El argumento `$user` es un directorio que contiene estas llaves : + +```php +[ + 'id' => 123, + 'username' => 'admin', + 'name' => 'Administrator', + 'email' => 'me@localhost', +] +``` diff --git a/doc/es_ES/plugin-directory.markdown b/doc/es_ES/plugin-directory.markdown new file mode 100644 index 00000000..a7ce114c --- /dev/null +++ b/doc/es_ES/plugin-directory.markdown @@ -0,0 +1,15 @@ +Plugin de configuración del directorio +====================================== + +Para instalar, actualizar y eliminar plugins dede la interface de usuario, debes tener estos requerimientos: + +- El directorio del plugin debe ser de escritura por el usuario del servidor web +- La extensión Zip debe estar disponible en tu server. +- Los parametros de configuración `PLUGIN_INSTALLER` deben estar en `true` + +Para desactivar esta función , cambie el valor de `PLUGIN_INSTALLER` a `false` en tu archivo de configuración. +También puede cambiar los permisos de la carpeta Plugin en el filesystem. + +Sólo los administradores pueden instalar plugins desde la interfaz de usuario. + +Por defecto, sólo plug-in que aparece en la página web de Kanboard están disponibles . diff --git a/doc/es_ES/plugin-events.markdown b/doc/es_ES/plugin-events.markdown new file mode 100644 index 00000000..1f8bdc24 --- /dev/null +++ b/doc/es_ES/plugin-events.markdown @@ -0,0 +1,27 @@ +Uso de eventos +=============== + +Kanboard usar internamente el [ Componente EventDispatcher de Symfony ](https://symfony.com/doc/2.3/components/event_dispatcher/index.html) para manegar internamente los eventos. + +Eventos escucha ** Listening ** +------------------------------- + +```php +$this->on('app.bootstrap', function($container) { + // tu codigo +}); +``` + +- El primer argumento es el nombre del evento (string) +- El segundo argumento es una funcion PHP callable (finalización o metodos de la clase) + +Agregando un nuevo evento +------------------------- + +Para agregar un nuevo, tienes que llamar al metodo `register()` de la clase `Kanboard\Core\Event\EventManager`: + +```php +$this->eventManager->register('my.event.name', 'Mi descripcion del nuevo evento'); +``` + +Estos eventos pueden ser utilizados por otros componentes de Kanboard como acciones automáticas . diff --git a/doc/es_ES/plugin-external-link.markdown b/doc/es_ES/plugin-external-link.markdown new file mode 100644 index 00000000..343712a6 --- /dev/null +++ b/doc/es_ES/plugin-external-link.markdown @@ -0,0 +1,79 @@ +Vinculación externa de proveedores +================================== + +Esta funcionalidad le permite vincular una tarea a los elementos adicionales almacenados en otro sistema. + +Por ejemplo, tu puedes vincular una tarea a: +For example, you can link a task to: + +- Una pagina web tradicional +- Datos adjuntos (Documentos PDF almacenados en la web, archivos ...) +- Cualquier sitema de tickets (bug tracker, soporte personalizado de tickets...) + +Cada item tiene un tipo, u na URL, un tipo dedependencia y un titulo. + +Por default,Kanboard incluye dos tipos de proveedores + +- Vinculación Web : Copiar y pegar un enlace y Kanboard se ha podido ir a la página de título de forma automática. +- Datos adjuntos: Enlace a todo lo que no es una página web + +Flujo de trabajo ** Workflow ** +-------------------------------- + +1. El usuario final copia y pega el URL al submit del formulario. +2.- Si el tipo de link es "auto", Kanboard crea un bucle a través de todos los proveedores registrados hasta que hay una coincidencia +3. Entonces , el proveedor de enlace devuelve un objeto que implementa la interfaz de `ExternalLinkInterface` +4. El formulario se muestra al usuario con todos los datos precargados antes de guardar el enlace + +Interfaces +---------- + +Para implementar un nuevo vinculo al proveedor desde un plugin, es necesario crear 2 clases que implementarlas en las interfaces: + +- `Kanboard\Core\ExternalLink\ExternalLinkProviderInterface` +- `Kanboard\Core\ExternalLink\ExternalLinkInterface` + +### ExternalLinkProviderInterface + +| Method | Usage | +|----------------------------|---------------------------------------------------------------------------------| +| `getName()` | Obtener el nombre del proveedor(label) | +| `getType()` | Obtener el tipo de link (se guardarán en la base de datos) | +| `getDependencies()` | Obtener un diccionario de los tipos de dependencia soportados por el proveedor | +| `setUserTextInput($input)` | Texto introducido por el usuario | +| `match()` | Regresa true si el proveedor puede analizar correctamente la entrada del usuario| +| `getLink()` | Obtener el enlace que se encuentra con las propiedades | + +### ExternalLinkInterface + +| Method | Usage | +|-------------------|-----------------------------| +| `getTitle()` | Obtiene un titulo de link | +| `getUrl()` | Obtiene una link de URL | +| `setUrl($url)` | URL del enlace | + +El registro de un nuevo proveedor de enlace +------------------------------------------ + +En tu `Plugin.php`, solo puedes llamar al metodo `register()` desde el objeto `ExternalLinkManager`: + +```php +<?php + +namespace Kanboard\Plugin\MyExternalLink; + +use Kanboard\Core\Plugin\Base; + +class Plugin extends Base +{ + public function initialize() + { + $this->externalLinkManager->register(new MyLinkProvider()); + } +} +``` + +Ejemplos +-------- + +- Kanboard incluye proveedores por default "WebLink" y "Attachment" diff --git a/doc/es_ES/plugin-group-provider.markdown b/doc/es_ES/plugin-group-provider.markdown new file mode 100644 index 00000000..dd742249 --- /dev/null +++ b/doc/es_ES/plugin-group-provider.markdown @@ -0,0 +1,54 @@ +Personalizar grupos de proveedores +================================== + +Kanboard es capaz de cargar grupos de un sistema externo. +Esta caracteristica es principalmente usada para permisos de proyectos. + +Los **Projects Managers** pueden permitir el acceso a un proyecto para un grupo +El usuario final **end-user** utilizara una caja de autocomplementar y busquedas para un grupo + +Cada vez que se ejecuta una consulta de grupo , todos los proveedores de grupo registrados se ejecutan . + +Flujo de trabajo del Grupo de Proveedores **Workflow** +----------------------------------------------------- + +1. El usuario final **end-user** comienza a escribir el nombre del grupo y el campo se autocompleta +2. EL `GroupManager` la clase ejecuta la consulta para todos los proveedores de grupo registrados +3. Los resultados son fusionados y regresados a la interface de usuario +4. Antes de seleccionar un grupo, a información del grupo se sincronizan con la base de datos local si es necesario + +Interface del grupo de proveedores +---------------------------------- + +interface a implementar: `Kanboard\Core\Group\GroupProviderInterface`. + +Las clases que implementa esta interface abstracta del grupo de información, solo hay 3 metodos: + +- `getInternalId()`: Obtiene el id interno de la base de datos, de otra manera regresa 0 +- `getExternalId()`: Obtiene un id unico externo +- `getName()`: Obtiene el nombre de grupo + +Kanboard utilizará el ID externo para sincronizar con la base de datos local. + +Interface Backend del grupo de proveedores +------------------------------------------ +Interface a implementar: `Kanboard\Core\Group\GroupBackendProviderInterface`. + +Esta interface requiere solo un metodo: `find($input)`. +El argumento `$input` es el texto introducido desde la interfaz de usuario. + +Este metodo debe regresar una lista de `GroupProviderInterface`, es es el resultado de la busqueda. + +Backend de registro desde Plugins +--------------------------------- + +En el metodo `initialize()` de su plugins registrado se puede personalizar el backend : + +```php +$groupManager->register(new MyCustomLdapBackendGroupProvider($this->container)); +``` + +Ejemplos +-------- + +- [Kanboard incluye el grupo de provedores (LDAP y base de datos)](https://github.com/kanboard/kanboard/tree/master/app/Group) diff --git a/doc/es_ES/plugin-helpers.markdown b/doc/es_ES/plugin-helpers.markdown new file mode 100644 index 00000000..66591075 --- /dev/null +++ b/doc/es_ES/plugin-helpers.markdown @@ -0,0 +1,39 @@ +Registrar nuevos helpers +======================= + +Estrucura del helper: + +```php +<?php + +namespace Kanboard\Plugin\MyPlugin\Helper\MyHelper; + +use Kanboard\Core\Base; + +class MyHelper extends Base +{ + public function doSomething() + { + return 'foobar'; + } +} +``` +Registrar tu helper en la clase: + +```php +$this->helper->register('myHelper', '\Kanboard\Plugin\MyPlugin\Helper\MyHelper'); +``` + +Usar tu helper desde una plantilla **Template**: + +```php +<p> + <?= $this->myHelper->doSomething() ?> +</p> +``` + +Usar tu helper dese otra clase: + +```php +$this->helper->myHelper->doSomething(); +``` diff --git a/doc/es_ES/plugin-hooks.markdown b/doc/es_ES/plugin-hooks.markdown new file mode 100644 index 00000000..46855d27 --- /dev/null +++ b/doc/es_ES/plugin-hooks.markdown @@ -0,0 +1,249 @@ +Plugin Hooks +============ + +Hooks de aplicación +----------------- + +Los hooks pueden extender , reemplazar, filtar datos o cambiar los comportamientos por default, cad hook es identificado con unico nombre, ejemplo : `controller:calendar:user:events` + +### Escuchar en eventos hook + +En tu metodo `initialize()` tu necesitas llamar al metodo `on()` de la clase `Kanboard\Core\Plugin\Hook`: + +```php +$this->hook->on('hook_name', $callable); +``` + +El primer argumento es el nombre del hook y el segundo es un callable PHP + +### Hooks ejecutado sólo una vez + +Algunos hooks solo tienen un listener: + +#### model:subtask-time-tracking:calculate:time-spent + +- Anular el cálculo del tiempo anterior cuando se detiene el temporizador de la subtarea +- Argumentos : + - `$user_id` (integer) + - `$start` (DateTime) + - `$end` (DateTime) + +### Fusionar hooks + +"Fusionar hooks" actuar de la misma manera que la función de `array_merge`. el hook callback solo regresa un array. Este array se fusionará con la que viene por defecto. + +Ejemplo para agregar eventos en el calendario del usuario: + +```php +class Plugin extends Base +{ + public function initialize() + { + $container = $this->container; + + $this->hook->on('controller:calendar:user:events', function($user_id, $start, $end) use ($container) { + $model = new SubtaskForecast($container); + return $model->getCalendarEvents($user_id, $end); // Return new events + }); + } +} +``` + +Ejemplo para sobrescribir los valores por default de las tareas: + +```php +class Plugin extends Base +{ + public function initialize() + { + $this->hook->on('controller:task:form:default', function (array $default_values) { + return empty($default_values['score']) ? array('score' => 4) : array(); + }); + } +} +``` + +Lista de fusión de hooks: + +#### controller:task:form:default + +- sobrescribir los valores por default de las tareas +- Argumentos: + - `$default_values`: actual default values (array) + +#### controller:calendar:project:events + +- Agregar mas eventos a el calendario del projecto +- Argumentos: + - `$project_id` (integer) + - `$start` Calendar start date (string, ISO-8601 format) + - `$end` Calendar` end date (string, ISO-8601 format) + +#### controller:calendar:user:events + +- Agregar mas eventos a el calendario de usuario +- Argumentos: + - `$user_id` (integer) + - `$start` Calendar start date (string, ISO-8601 format) + - `$end` Calendar end date (string, ISO-8601 format) + +Asset Hooks +----------- + +Asset hooks pueden ser usados para agregar nuevas stylesheet facilmente o un nuevo archivo JavaScript en el layout. tu puedes usar estas caracteristicas para crear un tema y sobreescribir todo los estilos por dafault del kanboard. + +Ejemplo para agregar un stylesheet **hoja de estilo** + +```php +<?php + +namespace Kanboard\Plugin\Css; + +use Kanboard\Core\Plugin\Base; + +class Plugin extends Base +{ + public function initialize() + { + $this->hook->on('template:layout:css', array('template' => 'plugins/Css/skin.css')); + } +} +``` + +Lista de asset Hooks: + +- `template:layout:css` +- `template:layout:js` + + +Referencia de hooks +--------------- + +La reference hooks son pasados a una variable por referencia. + +Ejemplo: + +```php +$this->hook->on('formatter:board:query', function (\PicoDb\Table &query) { + $query->eq('color_id', 'red'); +}); +``` + +El código anterior mostrará sólo las tareas en rojo en el tablero. + +Lista de referencias de hooks: + +| Hook | Description | +|--------------------------------------------|---------------------------------------------------------------| +| `formatter:board:query` | Alterar consulta a la base antes de tablero de renderizado | +| `pagination:dashboard:task:query` | Alterar consulta de base de datos para las tareas de la paginación en el dashboard | +| `pagination:dashboard:subtask:query` | Alterar consulta a la base de la paginación en el subtareas del dashboard | +| `model:task:creation:prepare` | Alterar los valores del formulario antes de guardar una tarea | +| `model:task:modification:prepare` | Alterar los valores del formulario antes de editar una tarea + +Template Hooks +-------------- + +Template hooks permitirá añadir nuevos contenidos en las plantillas existentes. + +Ejemplo para agregar nuevos contenidos en el sidebar del dashboard: + +```php +$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar'); +``` + +Ejemplo para adjuntar un template con variables locales: + +```php +$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar', array( + 'variable' => 'foobar', +)); +``` + +Ejemplo para adjuntar un template con un callable: + +```php +$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar', function($hook_param1, $hook_param2) { + return array('new_template_variable' => 'foobar'); // Inyectar una nueva variable en la plantilla Plugin +}); +``` + +Este llamada es usualmente definida en el metodo `initialize()` +El primer argumento es el nombre del hook y el segundo argumento es el nombre del template. + +Los nombres de plantillas con el prefijo del nombre del plugin y los dos puntos indican la ubicación de la plantilla. + +Ejemplo con `myplugin:dashboard/sidebar`: + +- `myplugin` Es el nombre de tu plugin (minusculas) +- `dashboard/sidebar` es el nombre del template +- En el filesystem, El plugin esta localizado aqui: `plugins\Myplugin\Template\dashboard\sidebar.php` +- Templates estan escritos en puro PHP (no se olvide de escapar los datos) + +Los nombres de plantillas sin prefijo son plantillas básicas. + +Lista de templates hooks: + +| Hook | Descripción | +|--------------------------------------------|----------------------------------------------------| +| `template:analytic:sidebar` | Sidebar en paginas analiticas | +| `template:app:filters-helper:before` | Filtro helper dropdown (top) | +| `template:app:filters-helper:after` | Filtro helper dropdown (bottom) | +| `template:auth:login-form:before` | Pagina de login (top) | +| `template:auth:login-form:after` | Pagina de login (bottom) | +| `template:board:private:task:before-title` | Tarea en un tablero privado : despues del titulo | +| `template:board:private:task:after-title` | Tarea en un tablero privado : antes del titulo | +| `template:board:public:task:before-title` | Tarea en un tablero publico : despues del titulo | +| `template:board:public:task:after-title` | Tarea en un tablero publico : antes del titulo | +| `template:board:task:footer` | Tarea en el tablero : footer | +| `template:board:task:icons` | Tarea en el tablero: tooltip icon | +| `template:board:column:dropdown` | Menu Dropdown en las columnas del tablero | +| `template:config:sidebar` | Sidebar pagina de configuración | +| `template:config:application ` | Aplicación de configuración del formulario | +| `template:config:email` | Email settings page | +| `template:config:integrations` | Integration page in global settings | +| `template:dashboard:sidebar` | Sidebar en la pagina del dashboard | +| `template:dashboard:show` | Pagina principal del dashboard | +| `template:export:sidebar` | Sidebar para exportar paginas | +| `template:import:sidebar` | Sidebar para importar paginas | +| `template:header:dropdown` | Dropdown menu Pagina header (icono avatar de usuario) | +| `template:header:creation-dropdown` | Dropdown menu Pagina header (plus icon) | +| `template:layout:head` | Layout de la pagina `<head/>` tag | +| `template:layout:top` | Layout de la pagina top header | +| `template:layout:bottom` | Layout de la pagina footer | +| `template:project:dropdown` | "Actions" menu a la izquierda vista para diferentes proyectos | +| `template:project:header:before` | Filtros de Proyectos (antes) | +| `template:project:header:after` | Filtros de Proyectos (despues) | +| `template:project:integrations` | Pagina de integracion de configuración de proyectos| +| `template:project:sidebar` | Sidebar configuración de proyectos | +| `template:project-user:sidebar` | Sidebar en la página de la información de usuario del proyecto | +| `template:task:layout:top` | Task layout top (antes page header) | +| `template:task:details:top` | Resumen de tarea top | +| `template:task:details:bottom` | Resumen de tarea bottom | +| `template:task:details:first-column` | Resumen de tarea columna | +| `template:task:details:second-column` | Resumen de tarea dos columnas | +| `template:task:details:third-column` | Resumen de tarea tres columnas | +| `template:task:details:fourth-column` | Resumen de tarea cuatro columnas | +| `template:task:dropdown` | Task dropdown menu en listado de paginas | +| `template:task:sidebar:actions` | Sidebar on task page (sección de acciones) | +| `template:task:sidebar:information` | Sidebar on task page (sección de información) | +| `template:task:form:first-column` | 1st columna en forma de tarea | +| `template:task:form:second-column` | 2nd columna en forma de tarea | +| `template:task:form:third-column` | 3nd columna en forma de tarea | +| `template:task:show:top ` | Mostrar página de tareas : top | +| `template:task:show:bottom` | Mostrar página de tareas : bottom | +| `template:task:show:before-description` | Mostrar página de tareas : despues de la descripción | +| `template:task:show:before-tasklinks` | Mostrar página de tareas : despues tasklinks | +| `template:task:show:before-subtasks` | Mostrar página de tareas : despues subtareas | +| `template:task:show:before-timetracking` | Mostrar página de tareas : despues timetracking | +| `template:task:show:before-attachments` | Mostrar página de tareas : despues archivos adjuntos | +| `template:task:show:before-comments` | Mostrar página de tareas : despues comentarios | +| `template:user:authentication:form` | "Editar autenticación" formulario de perfil de usuario | +| `template:user:create-remote:form` | "Crear un usuario remoto" formulario | +| `template:user:external` | "Autenticación externa" la página de perfil de usuario | +| `template:user:integrations` | Integración en el perfil de usuario | +| `template:user:sidebar:actions` | Sidebar en el perfil de usuario (sección de acciones) | +| `template:user:sidebar:information` | Sidebar en el perfil de usuario (sección de información) | + + +Otro de los ganchos plantilla se pueden añadir en caso necesario , sólo hay que preguntar en el seguimiento de incidencias ** issue tracking **. diff --git a/doc/es_ES/plugin-ldap-client.markdown b/doc/es_ES/plugin-ldap-client.markdown new file mode 100644 index 00000000..1a34a880 --- /dev/null +++ b/doc/es_ES/plugin-ldap-client.markdown @@ -0,0 +1,99 @@ +Libreria LDAP +============ + +Para facilirar la integracion LDAP. kanboard tiene su propia libreria LDAP +Esta libreria puede ejecutar operaciones comunes. + +Cliente +------- + +Clase: `Kanboard\Core\Ldap\Client` + +Para conectar a tu servidor LDAP facilmente, usa este metodo: + +```php +use Kanboard\Core\Ldap\Client as LdapClient; +use Kanboard\Core\Ldap\ClientException as LdapException; + +try { + $client = LdapClient::connect(); + + // Get native LDAP resource + $resource = $client->getConnection(); + + // ... + +} catch (LdapException $e) { + // ... +} +``` + +Consultas LDAP +-------------- + +Classes: + +- `Kanboard\Core\Ldap\Query` +- `Kanboard\Core\Ldap\Entries` +- `Kanboard\Core\Ldap\Entry` + +Ejemplo para una consulta al directorio LDAP: + +```php + +$query = new Query($client) +$query->execute('ou=People,dc=kanboard,dc=local', 'uid=my_user', array('cn', 'mail')); + +if ($query->hasResult()) { + $entries = $query->getEntries(); // Return an instance of Entries +} +``` + +Leer una entrada: + +```php +$firstEntry = $query->getEntries()->getFirstEntry(); +$email = $firstEntry->getFirstValue('mail'); +$name = $firstEntry->getFirstValue('cn', 'Default Name'); +``` + +Leer multiples entradas: + +```php +foreach ($query->getEntries()->getAll() as $entry) { + $emails = $entry->getAll('mail'); // Fetch all emails + $dn = $entry->getDn(); // Get LDAP DN of this user + + // Check if a value is present for an attribute + if ($entry->hasValue('mail', 'user2@localhost')) { + // ... + } +} +``` + +Usuario Helper +-------------- + +Clase: `Kanboard\Core\Ldap\User` + +Obtener usuario en una sola linea + +```php +// Return an instance of LdapUserProvider +$user = User::getUser($client, 'my_username'); +``` + +Grupo Helper +------------ + +Clase: `Kanboard\Core\Ldap\Group` + +Obtener grupos en una linea: + +```php +// Define LDAP filter +$filter = '(&(objectClass=group)(sAMAccountName=My group*))'; + +// Return a list of LdapGroupProvider +$groups = Group::getGroups($client, $filter); +``` diff --git a/doc/es_ES/plugin-mail-transports.markdown b/doc/es_ES/plugin-mail-transports.markdown new file mode 100644 index 00000000..1d999c81 --- /dev/null +++ b/doc/es_ES/plugin-mail-transports.markdown @@ -0,0 +1,49 @@ +Plugin: Agregar trasporte de email +================================== + +Por default Kanboard soporta 3 estadares de trasporte de email: + +- Mail (PHP mail function) +- Smtp +- Sendmail command + +Con la API del plugin tu puedes agregar un driver para cualquier proveedor de email. +Por ejemplo, nuestro plugin puede agregar un trasporte de email para un proveedor que usa un API HTTP. + +Implementación +-------------- + +Nuestro plugin dede implementgar la interface `Kanboard\Core\Mail\ClientInterface` y extiende desde `Kanboard\Core\Base`. +El único método que necesita para implementar es `sendEmail()`: + +```php +interface ClientInterface +{ + /** + * Send a HTML email + * + * @access public + * @param string $email + * @param string $name + * @param string $subject + * @param string $html + * @param string $author + */ + public function sendEmail($email, $name, $subject, $html, $author); +} +``` + +Para registrar el nuevo trasporte de email, usa el metodo `setTransport($transport, $class)` desde la clase `Kanboard\Core\Mail\Client`: + +```php +$this->emailClient->setTransport('myprovider', '\Kanboard\Plugin\MyProvider\MyEmailHandler'); +``` + +EL segundo argumento contiene el absoluto namespace de tu clase especifica + +Ejemplos de plugins para trasporte de email +---------------------------------- + +- [Sendgrid](https://github.com/kanboard/plugin-sendgrid) +- [Mailgun](https://github.com/kanboard/plugin-mailgun) +- [Postmark](https://github.com/kanboard/plugin-postmark) diff --git a/doc/es_ES/plugin-metadata.markdown b/doc/es_ES/plugin-metadata.markdown new file mode 100644 index 00000000..da4f025f --- /dev/null +++ b/doc/es_ES/plugin-metadata.markdown @@ -0,0 +1,42 @@ +Metadatos +========= + +Tu piedes adjutnar metadatos para cada projecto,tarea , usuaio o para toda la aplicación +Los metadatos son campos personalisados, es una key/value de una tabla. + +Por ejemplo nuestro plugin puede almacenar información externa para una tarea o nuevas configuraciones para un proyecto. +Básicamente le permiten ampliar los campos predeterminados sin tener que crear nuevas tablas . + +Adjuntar y eliminar metadatos para tareas +-------------------------------------------- + +```php + +// Return a dictionary of metadata (keys/values) for the $task_id +$this->taskMetadataModel->getAll($task_id); + +// Get a value only for a task +$this->taskMetadataModel->get($task_id, 'my_plugin_variable', 'default_value'); + +// Return true if the metadata my_plugin_variable exists +$this->taskMetadataModel->exists($task_id, 'my_plugin_variable'); + +// Create or update metadata for the task +$this->taskMetadataModel->save($task_id, ['my_plugin_variable' => 'something']); + +// Remove a metadata from a project +$this->projectMetadataModel->remove($project_id, my_plugin_variable); +``` + +Tipos de metadatos +------------------ + +- TaskMetadata: `$this->taskMetadataModel` +- ProjectMetadata: `$this->projectMetadataModel` +- UserMetadata: `$this->userMetadataModel` +- Settings/Config: `$this->configModel` + +Notas +----- + +- Siempre prefijo del nombre de metadatos con el nombre del plugin diff --git a/doc/es_ES/plugin-notifications.markdown b/doc/es_ES/plugin-notifications.markdown new file mode 100644 index 00000000..9a99806d --- /dev/null +++ b/doc/es_ES/plugin-notifications.markdown @@ -0,0 +1,59 @@ +Agregar notificaciones con los tipos de plugin +============================================== + +Puede enviar notificaciones a casi cualquier sistema mediante la adición de un nuevo tipo . +There are two kinds of notifications: project and user. + +- Project: Notificaciones configuradas a nivel de proyecto +- Usuario: Notificaciones enviadas individualmente y configurada a cada perfil de usuario. + +Registra un nuevo tipo de notificación +-------------------------------------- + +En tu archivo de registro del plugin llama el metodo `setType()`: + +```php +$this->userNotificationTypeModel->setType('irc', t('IRC'), '\Kanboard\Plugin\IRC\Notification\IrcHandler'); +$this->projectNotificationTypeModel->setType('irc', t('IRC'), '\Kanboard\Plugin\IRC\Notification\IrcHandler'); +``` + +Su controlador puede ser registrado por el usuario o la notificación del proyecto. No necesariamente tienen que soportarlo . +Cuando tu handler es registrdo, el usuario final **end-user** puede elegir recibir el nuevo tipo de notificación o no + +Notificación de Handler +----------------------- + +Su controlador de notificación debe implementar la interfaz `Kanboard\Core\Notification\NotificationInterface`: + +```php +interface NotificationInterface +{ + /** + * Envia notificación a un usuario + * + * @access public + * @param array $user + * @param string $event_name + * @param array $event_data + */ + public function notifyUser(array $user, $event_name, array $event_data); + + /** + * Envia notificacion a un projecto + * + * @access public + * @param array $project + * @param string $event_name + * @param array $event_data + */ + public function notifyProject(array $project, $event_name, array $event_data); +} +``` + +Ejemplo de notificacion de plugins +--------------------------------- + +- [Slack](https://github.com/kanboard/plugin-slack) +- [Hipchat](https://github.com/kanboard/plugin-hipchat) +- [Jabber](https://github.com/kanboard/plugin-jabber) + diff --git a/doc/es_ES/plugin-overrides.markdown b/doc/es_ES/plugin-overrides.markdown new file mode 100644 index 00000000..f8b999f3 --- /dev/null +++ b/doc/es_ES/plugin-overrides.markdown @@ -0,0 +1,42 @@ +Plugin Reescritura +================ + +Reesritura HTTP Contenido Política de Seguridad +----------------------------------------------- + +Si desea reemplazar el encabezado HTTP predeterminado de la directiva de seguridad del contenido, puede utilizar el método`setContentSecurityPolicy()`: + +```php +<?php + +namespace Kanboard\Plugin\Csp; + +use Kanboard\Core\Plugin\Base; + +class Plugin extends Base +{ + public function initialize() + { + $this->setContentSecurityPolicy(array('script-src' => 'something')); + } +} +``` + +Plantillas de reescrituras +-------------------------- + +Las plantillas definidas en el núcleo se pueden anular . Por ejemplo , se puede redefinir el diseño predeterminado o cambiar notificaciones por correo electrónico. + +Ejemolo de plantilla de reescritura: + +```php +$this->template->setTemplateOverride('header', 'theme:layout/header'); +``` + +El primer argumento es el nombre de la plantilla original y el segundo argumento de la plantilla para usar como reemplazo. + +Puede seguir utilizando la plantilla original utilizando el prefijo "kanboard:" : + +```php +<?= $this->render('kanboard:header') ?> +``` diff --git a/doc/es_ES/plugin-registration.markdown b/doc/es_ES/plugin-registration.markdown new file mode 100644 index 00000000..5031427f --- /dev/null +++ b/doc/es_ES/plugin-registration.markdown @@ -0,0 +1,160 @@ +Registracion de Plugin +====================== + +Estructura del directorio +-------------------------- + +Los Plugins estan almacenados en el subdirectorio `plugins. Un ejemplo de estructura del directorio de un plugin: + +```bash +plugins +└── Budget <= Plugin name + ├── Asset <= Javascript/CSS files + ├── Controller + ├── LICENSE <= Plugin license + ├── Locale + │ ├── fr_FR + │  ├── it_IT + │  ├── ja_JP + │  └── zh_CN + ├── Model + ├── Plugin.php <= Plugin registration file + ├── README.md + ├── Schema <= Database migrations + ├── Template + └── Test <= Unit tests +``` + +Solamente el archivo de registración `Plugin.php` es requerido. Las otras carpetas son opcionales. + +La primera letra del nombre del plugin debe ser capitalizada. + +Archivo de registración del plugin +---------------------------------- + +Kanboard Kanboard escaneará el directorio `plugins` y cargara automaticamente todo en este directorio. el archivo `Plugin.php` se utiliza para cargar y registrar el plugin. + +Ejemplo del archivo `Plugin.php` (`plugins/Foobar/Plugin.php`): + +```php +<?php + +namespace Kanboard\Plugin\Foobar; + +use Kanboard\Core\Plugin\Base; + +class Plugin extends Base +{ + public function initialize() + { + $this->template->hook->attach('template:layout:head', 'theme:layout/head'); + } +} +``` + +Este archivo debera contener una clase `Plugin` se define en el namespace `Kanboard\Plugin\Yourplugin` y extiende `Kanboard\Core\Plugin\Base`. + +El único método requerido es `initialize()`. Este método se llama para cada petición cuando el plugin es cargado. + +Metodos del plugin +-------------- + +Los métodos disponibles son `Kanboard\Core\Plugin\Base`: + +- `initialize()`: ejecuta cuando el plugin es cargafo +- `getClasses()`: Regresa todas las clases que se deben almacenar en el contenedor de inyección de dependencias +- `on($event, $callback)`: Escucha eventos internos. +- `getPluginName()`: devuelve el nombre del plugin. +- `getPluginAuthor()`: Devuelve el autor del plugin. +- `getPluginVersion()`: Devuelve la versÃon del plugin. +- `getPluginDescription()`: Devuelve la descripcion del plugin. +- `getPluginHomepage()`: Devuelve la pagina inicial del plugin (link) +- `setContentSecurityPolicy(array $rules)`: Reescribe las reglas por default del HTTP CSP. +- `onStartup()`: Si está presente este método, se ejecuta automáticamente cuando el evento "app.bootstrap" se dispara. + +Su registro de plugin tambien puede heradar de la clase Kanboard\Core\Base, de esta manera se puede acceder a todas las clases y los métodos de Kanboard facilmente. + +En este ejemplo se obtendrá el usuario #123: + +```php +$this->user->getById(123); +``` + +Plugin de traducción +------------------- + +Este plugin se puede traducir en la misma forma que el resto de la aplicación . Debe cargar las traducciones a sà mismo cuando se crea la sesión : + +```php +public function onStartup() +{ + Translator::load($this->languageModel->getCurrentLanguage(), __DIR__.'/Locale'); +} +``` + +Las traducciones deben ser almacenadas en el archivo `plugins/Myplugin/Locale/xx_XX/translations.php` (remplazar xx_XX por el codigo del lenguaje fr_FR, en_US...). + +Las traducciones estan almacenadas en un diccionario, Si desea sobreescribir una cadena existente, sólo tiene que utilizar la misma clave en el archivo de traducción. + +Inyección de dependencias de contenedores +------------------------------ +Kanboard utiliza la Pimple , un simple inyección de contenedores de dependencia PHP . Sin embargo , Kanboard puede registrar cualquier clase en el contenedor fácilmente. + +Estas clases están disponibles en todas partes en la aplicación y se crea una única instancia . + +Aquà un ejemplo para registrar sus propios modelos en el contenedor: + +```php +public function getClasses() +{ + return array( + 'Plugin\Budget\Model' => array( + 'HourlyRateModel', + 'BudgetModel', + ) + ); +} +``` + +Ahora bien, si se utiliza una clase que se extiende desde `Core\Base`, tu puedes acceder directamente cualquier instancia de la clase: + +```php +$this->hourlyRateModel->remove(123); +$this->budgetModel->getDailyBudgetBreakdown(456); + +// It's the same thing as using the container: +$this->container['hourlyRateModel']->getAll(); +``` + +Llaves de los contenedores son únicos a través de la aplicación . Si reemplaza una clase existente , que va a cambiar el comportamiento por defecto . + +Agregar un metodo nuevo en la API +--------------------------------- + +Kanboard usa la libreria [JSON-RPC](https://github.com/fguillot/JsonRPC) para manejar las llamadas de la api. + +Para agregar un nuevo metodo tu puedes que puede hacer algo para llamar a tu plugin: + +```php +$this->api->getProcedureHandler()->withCallback('my_method', function() { + return 'foobar'; +}); +``` + +`$this->container['api']` or `$this->api` expose an instance of the object `JsonRPC\Server`. + +Leer la documentacion de la libreria para mas información. + +Agregar una nueva consola de comandos +-------------------------------------- + +Kanboard usa la libreria [Symfony Console](http://symfony.com/doc/current/components/console/introduction.html) para manejar las lineas de comandos. + +Kanboard genera una instancia del objeto `Symfony\Component\Console\Application` via `$this->cli`. +Tu puedes agregar nuevos comandos desde tu plugin: + +```php +$this->cli->add(new MyCommand()); +``` + +Lea la documentación de la biblioteca para obtener más información. diff --git a/doc/es_ES/plugin-routes.markdown b/doc/es_ES/plugin-routes.markdown new file mode 100644 index 00000000..eb4b9f36 --- /dev/null +++ b/doc/es_ES/plugin-routes.markdown @@ -0,0 +1,85 @@ +Personalizar Rutas +================== + +Cuando está habilitada la reescritura de URL, tu puedes definir rutas personalizadas desde tus plugins. + +Definir nuevas rutas +-------------------- + +Las rutas son manejadas por la clase `Kanboard\Core\Http\Route`. + +Las nuevas rutas se pueden agregar mediante el uso del método `addRoute($path, $controller, $action, $plugin)`, here an example: + +```php +$this->route->addRoute('/my/custom/route', 'myController', 'myAction', 'myplugin'); +``` + +Cuando el usuario final **end-user** van a la URL `/my/custom/route`, el metodo `Kanboard\Plugin\Myplugin\Controller\MyController::myAction()` será ejecutado. + +El primer caracter del contraldor y el nombre del plugin serán convertidos en mayusculas con la funcion `ucfirst()`. + +Tu puedes ademas definir rutas con variables: + +```php +$this->route->addRoute('/my/route/:my_variable', 'myController', 'myAction', 'myplugin'); +``` + +El prefijo colon `:`, define una variable. +Por ejemplo `:my_variable` declare el nombre de la nueva variable `my_variable`. + +Para extraer los valores de la variable puedes usar el metodo `getStringParam()` or `getIntegerParam()` desde la clase `Kanboard\Core\Http\Request`: + +Si tenemos la URL `/my/route/foobar`, el valor de `my_variable` es `foobar`: + +```php +$this->request->getStringParam('my_variable'); // Return foobar +``` + +Generate links based on the routing table +----------------------------------------- + +Desde las plantillas , se tiene que usar el helper `Kanboard\Helper\Url`. + +### Generar un link HTML + +```php +<?= $this->url->link('My link', 'mycontroller', 'myaction', array('plugin' => 'myplugin')) ?> +``` + +Generara este HTML: + +```html +<a href="/my/custom/route">My link</a> +``` + +### Generara solamente el atributo `href`: + +```php +<?= $this->url->href('My link', 'mycontroller', 'myaction', array('plugin' => 'myplugin')) ?> +``` + +HTML salida: + +```html +/my/custom/route +``` + +Salida HTML cuando la reescritura del URL no esta habilitada: + +```html +?controller=mycontroller&action=myaction&plugin=myplugin +``` + +### Generar enlace de redirección: + +Desde un controlador, si tu necesitas para From a controller, si tu necesitas realizar una redirección: + +```php +$this->url->to('mycontroller', 'myaction', array('plugin' => 'myplugin')); +``` + +Generar: + +``` +?controller=mycontroller&action=myaction&plugin=myplugin +``` diff --git a/doc/es_ES/plugin-schema-migrations.markdown b/doc/es_ES/plugin-schema-migrations.markdown new file mode 100644 index 00000000..b7165490 --- /dev/null +++ b/doc/es_ES/plugin-schema-migrations.markdown @@ -0,0 +1,40 @@ +Plugin Migración de esquemas +============================ + +Kanboard realiza migraciones de base de datos automaticamente para ti. +Las migraciones deben ser almacenadas en una carpeta **Schema** y el nombre de archivo debe ser el mismo que el controlador de base de datos: + +```bash +Schema +├── Mysql.php +├── Postgres.php +└── Sqlite.php +``` + +Cada archivo contiene todas las migraciones, aqui un ejemple para Sqlite: + +```php +<?php + +namespace Kanboard\Plugin\Something\Schema; + +const VERSION = 1; + +function version_1($pdo) +{ + $pdo->exec('CREATE TABLE IF NOT EXISTS something ( + "id" INTEGER PRIMARY KEY, + "project_id" INTEGER NOT NULL, + "something" TEXT, + FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE + )'); +} +``` + +- La constante `VERSION` es la ultima versión de tu esquema +- Cada funcion es una migración `version_1()`, `version_2()`, etc. +- Una instancia `PDO` es pasado como un primer argumneto +- Todo se ejecuta dentro de una transacción , si algo no funciona se realiza una operación de rollback y se muestra el error al usuario + +Kanboard siempre compara la version definida en tu esquema y la version almacenada en la base de datos. Si la versiones son diferentes, kanboard siempre ejecuta cada migración una por una hasta alcanzar la ultima version. + diff --git a/doc/es_ES/plugins.markdown b/doc/es_ES/plugins.markdown new file mode 100644 index 00000000..587377d7 --- /dev/null +++ b/doc/es_ES/plugins.markdown @@ -0,0 +1,46 @@ +Desarrollo de Plugin +==================== + +Nota : el plugin API es **considerado alpha** en estos momentos. + +Los plugins son útiles para extender las funcionalidades básicas de Kanboard , la adición de características , la creación de temas o cambiar el comportamiento por defecto . + +Los creadores de plugins deben especificar explícitamente las versiones compatibles de Kanboard . El código interno de Kanboard puede cambiar con el tiempo y su extensión debe ser probado con nuevas versiones . Compruebe siempre el [ChangeLog](https://github.com/kanboard/kanboard/blob/master/ChangeLog) para realizar los cambios. + +- [Crear tu plugin](plugin-registration.markdown) +- [Usar plugins hooks](plugin-hooks.markdown) +- [Eventos](plugin-events.markdown) +- [Rescribir compartamientos por default en la aplicación](plugin-overrides.markdown) +- [Agregar plugins para migrar esquemas](plugin-schema-migrations.markdown) +- [Personalizar rutas](plugin-routes.markdown) +- [Agregar helpers](plugin-helpers.markdown) +- [Agregar trasportes de email ](plugin-mail-transports.markdown) +- [Agregar tipos de notificaciones](plugin-notifications.markdown) +- [Agregar acciones automaticas](plugin-automatic-actions.markdown) +- [Adjuntar metados para usuarios,tareas y proyectos](plugin-metadata.markdown) +- [Arquitectura de autenticación](plugin-authentication-architecture.markdown) +- [Registración de plugins de autenticación](plugin-authentication.markdown) +- [Arquitectura de autorización](plugin-authorization-architecture.markdown) +- [Personlizar grupos de proveedores](plugin-group-provider.markdown) +- [Links externos para proveedores](plugin-external-link.markdown) +- [Agregar avatar a proveedores](plugin-avatar-provider.markdown) +- [Cliente LDAP](plugin-ldap-client.markdown) + +Ejemplos de plugins +------------------- + +- [SMS Two-Factor Authentication](https://github.com/kanboard/plugin-sms-2fa) +- [Reverse-Proxy Authentication with LDAP support](https://github.com/kanboard/plugin-reverse-proxy-ldap) +- [Slack](https://github.com/kanboard/plugin-slack) +- [Hipchat](https://github.com/kanboard/plugin-hipchat) +- [Jabber](https://github.com/kanboard/plugin-jabber) +- [Sendgrid](https://github.com/kanboard/plugin-sendgrid) +- [Mailgun](https://github.com/kanboard/plugin-mailgun) +- [Postmark](https://github.com/kanboard/plugin-postmark) +- [Amazon S3](https://github.com/kanboard/plugin-s3) +- [Budget planning](https://github.com/kanboard/plugin-budget) +- [User timetables](https://github.com/kanboard/plugin-timetable) +- [Subtask Forecast](https://github.com/kanboard/plugin-subtask-forecast) +- [Automatic Action example](https://github.com/kanboard/plugin-example-automatic-action) +- [Theme plugin example](https://github.com/kanboard/plugin-example-theme) +- [CSS plugin example](https://github.com/kanboard/plugin-example-css) diff --git a/doc/es_ES/requirements.markdown b/doc/es_ES/requirements.markdown new file mode 100755 index 00000000..57c90110 --- /dev/null +++ b/doc/es_ES/requirements.markdown @@ -0,0 +1,111 @@ +Requerimientos +=============== + +Lado del servidor +-------------------- + +### Sistemas operativos compatibles + +| Sistemas operativos | +|--------------------------------------| +| Linux Ubuntu Xenial Xerus 16.04 LTS | +| Linux Ubuntu Trusty 14.04 LTS | +| Linux Centos 6.x | +| Linux Centos 7.x | +| Linux Redhat 6.x | +| Linux Redhat 7.x | +| Linux Debian 8 | +| FreeBSD 10.x | +| Microsoft Windows 2012 R2 | +| Microsoft Windows 2008 | + +### Base de datos compatibles + +| Base de datos | +|--------------------| +| Sqlite 3.x | +| Mysql >= 5.5 | +| MariaDB >= 10 | +| Postgresql >= 9.3 | + +Qué base de datos para elegir? + +| Tipo | Uso | +|-----------------|-----------------------------------------------------| +| Sqlite | un solo usuario o equipo pequeño (casi no hay concurrencia) | +| Mysql/Postgres | Equipo grande, configuración de alta disponibilidad | + +No usar Sqlite en montajes de NFS, use Sqlite solo cuando tengas un disco con Fast I/O + +### Servidores Web Compatibles + +| Servidores Web | +|--------------------| +| Apache HTTP Server | +| Nginx | +| Microsoft IIS | + +Kanboard esta pre configurado para trabajar con Apache (URL rewriting). + +### Versiones de PHP + +| Versión de PHP | +|----------------| +| PHP >= 5.3.9 | +| PHP 5.4 | +| PHP 5.5 | +| PHP 5.6 | +| PHP 7.x | + +### PHP Extensiones Requeridas + +| PHP Extensiones Requeridas | Nota | +|----------------------------|-------------------------------| +| pdo_sqlite | Solo si usas Sqlite | +| pdo_mysql | Solo si usas Mysql/MariaDB | +| pdo_pgsql | Solo si usas Postgres | +| gd | | +| mbstring | | +| openssl | | +| json | | +| hash | | +| ctype | | +| session | | +| ldap | Solamente para autenticación LDAP | +| Zend OPcache | Recomendado | + +### Extensiones PHP opcionales + +| PHP Extensiones Requeridas | Nota | +|----------------------------|--------------------------------------------| +| zip | Usado para instalar plugins desde Kanboard | + +### Recomendaciones + +- Usar sistemas operativos modernos de Linux o Unix. +- El mejor performace se obtienen con la última versión de PHP junto con la operación de OPcode esta activado. + + +Lado del cliente +---------------- + +### Browsers [Navegadores] + +Siempre usar el navegador mas moderno o la ultima versión posible: + +| Browser | +|---------------------------------------| +| Safari | +| Google Chrome | +| Mozilla Firefox | +| Microsoft Internet Explorer >= 11 | +| Microsoft Edge | + +### Dispositivos + +| Device | Resolución de la pantalla | +|-------------------|--------------------| +| Laptop o desktop | >= 1366 x 768 | +| Tablet | >= 1024 x 768 | + +Kanboard aún no está optimizado para smartphones. Está funcionando, pero la interfaz de usuario no es muy cómoda de usar. diff --git a/doc/es_ES/reverse-proxy-authentication.markdown b/doc/es_ES/reverse-proxy-authentication.markdown new file mode 100755 index 00000000..f8a0719f --- /dev/null +++ b/doc/es_ES/reverse-proxy-authentication.markdown @@ -0,0 +1,64 @@ +Autenticación por proxy inverso +============================ + +Este metodo de autenticación a menudo es usado por [SSO](http://en.wikipedia.org/wiki/Single_sign-on) (Single Sign-On) especialmente para organizaciones mayores. + +La autenticación se realiza mediante otro sistema, Kanboard no conoce su contraseña y supongamos que ya está autenticado. + +Requerimentos +------------ + +- Un proxy inverso bien configurado + +o + +- Apache Auth en el mismo servidor + + +¿Como funciona esto? +------------------- + +1. Su proxy inverso autentica al usuario y envia el nombre de usuario a través de una cabecera HTTP. +2. Kanboard recuperar el nombre de usuario de la solicitud + - El usuario se crea automáticamente si es necesario + - Abrir una nueva sesión Kanboard sin ningún símbolo asumiendo que es válida + +Instrucciones de instalación +---------------------------- + +### Configuración de su proxy inverso + +Esto esta fuera del alcance de esta documentación. +Debería comprobar la conexión del usuario ya que es enviado por el proxy inverso utilizando una cabecera HTTP. + +### Configuración de Kanboard + +Crear un archivo `config.php` copiar el archivo` config.default.php`: + +```php +<?php + +// Activar / desactivar la autenticación del proxy inverso +define('REVERSE_PROXY_AUTH', true); // Set this value to true + +// La cabecera HTTP para recuperar. Si no se especifica, el valor por defecto es REMOTE_USER +define('REVERSE_PROXY_USER_HEADER', 'REMOTE_USER'); + +// El Kanboard predeterminado esta el administrador para su organización. +// Ya que todo debe ser filtrada por el proxy inverso, +// Debe tener un usuario administrador para el arranque. +define('REVERSE_PROXY_DEFAULT_ADMIN', 'myadmin'); + +// El dominio predeterminado para asumir la dirección de correo electrónico. +// En caso de que el nombre de usuario no es una dirección de correo electrónico, +// Se actualizará automáticamente como USER@mydomain.com +define('REVERSE_PROXY_DEFAULT_DOMAIN', 'mydomain.com'); +``` + +Notas: + +- Si el proxy esta en el mismo servidor Web que ejecuta Kanboard, según la [CGI protocol](http://www.ietf.org/rfc/rfc3875) el Header será `REMOTE_USER`. Por ejemplo, Apache añadir `REMOTE_USER` por defecto si` Require valid-usuario de la red se establece. + +- Si Apache es un proxy inverso a otro Apache corriendo Kanboard, la cabecera `REMOTE_USER` no se establece (mismo comportamiento con IIS y Nginx) + +- Si tu tienes un autentico reverse proxy, the [HTTP ICAP draft](http://tools.ietf.org/html/draft-stecher-icap-subid-00#section-3.4) proposes the header to be `X-Authenticated-User`. This de facto standard has been adopted by a number of tools. diff --git a/doc/es_ES/rss.markdown b/doc/es_ES/rss.markdown new file mode 100755 index 00000000..c1025d80 --- /dev/null +++ b/doc/es_ES/rss.markdown @@ -0,0 +1,23 @@ +Suscripciones RSS/Atom +====================== + +Kanboard Soporta feeds RSS para proyectos y usuarios. + +- Los feeds del proyecto contiene solamente las actividades del proyecto. +- Los feeds del usuario contiene el flujo de actividad de todos los proyectos que el usuario es un miembro + +Aquellas suscripciones estan solamente activadas cuando el acceso publico esta habilitado en el perfil del usuario o en la configuraci�n del proyecto. + +Habilitar/Deshabilitar Feeds RSS de proyectos +--------------------------------------------- + +Ir a **Configuraci�n de proyecto > Acceso publico**. + + + +Habilitar/Deshabilitar Feeds RSS de usuarios +-------------------------------------------- + +Ir a **Perfil de usuario > Acceso publico**. + +El enlace RSS est� protegido por un token aleatorio , s�lo las personas que conocen la URL pueden tener acceso al feed.
\ No newline at end of file diff --git a/doc/es_ES/screenshots.markdown b/doc/es_ES/screenshots.markdown new file mode 100755 index 00000000..064517f9 --- /dev/null +++ b/doc/es_ES/screenshots.markdown @@ -0,0 +1,25 @@ +Agregar screenshots +================== + +Tu puedes copiar y pegar imagenes directamente en Kanboard y salvarlo al mismo tiempo. +Estas im�genes se cargan como archivos adjuntos a la tarea . + +Esto es especialmente �til para tomar capturas de pantalla para describir un problema , por ejemplo. + +Puede a�adir im�genes directamente desde el tablero haciendo clic en el men� desplegable o en la p�gina de vista de tareas . + + + +Para a�adir una nueva imagen , coloque su captura de pantalla y pegar CTRL+V or Command+V: + + + +En Mac OS X, puede utilizar los atajos para tomar screenshots: + +- Command-Control-Shift-3: Tome una screenshot de la pantalla , y guardarlo en el portapapeles +- Command-Control-Shift-4, a continuaci�n, seleccione un �rea: Tome una captura de pantalla de la zona y la guarda en el portapapeles +- Command-Control-Shift-4, entonces el espacio , a continuaci�n, haga clic en una ventana : Tome una captura de pantalla de una ventana y guardarlo en el portapapeles + +Tambi�n hay varias aplicaciones de terceros que pueden ser utilizados para tomar capturas de pantalla con anotaciones y formas. + +** Nota: Esta funci�n no funciona con todos los navegadores ** No funciona con Safari , debido a este error . : https://bugs.webkit.org/show_bug.cgi?id=49141 diff --git a/doc/es_ES/subtasks.markdown b/doc/es_ES/subtasks.markdown new file mode 100644 index 00000000..27a9055c --- /dev/null +++ b/doc/es_ES/subtasks.markdown @@ -0,0 +1,46 @@ +Subtareas +======== + +Las subtareas son utiles por que dividen el trabajo de las tareas. + +Cada subtareas: + +- Se puede asignar a un miembro del proyecto +- Tiene 3 diferentes estado: **Todo**, **En progreso**, **Realizado** +- Tienen rastreo de información: **tiempo gastado** y **tiempo estimado** +- Ordenar por posición + +Crear subtareas +----------------- + +Desde la vista de la tarea en la barra lateral izquierda haga clic en **Agregar una subtarea**: + + + +Tambien puede agregar una subtarea rápidamente introduciendo solamente el titulo: + + + +Cambiar estado de subtarea +------------------------- + +Al hacer clic en el tÃtulo de la subtarea, se hace el cambio de estado : + + + +El icono antes de que el titulo se actualice el estatus. + + + +Nota: cuando la tarea se cierra todas las subtareas se cambian al estado **Hecho**. + +Temporizador de subtarea +------------------------- + +- Cada vez que una subtarea está en marcha, el temporizador se inicia también +El temporizador puede ser iniciado y detenido en cualquier momento. +- El contador registra el tiempo empleado en la subtarea automáticamente. +También puede cambiar manualmente el valor del campo, al editar una subtarea. +- El cálculo de tiempo se redondea al cuarto más cercano.Esta información se registra en una tabla separada. +- El tiempo de tarea y tiempo de estimados es de actualización automáticamente según la suma de todas las subtareas. + diff --git a/doc/es_ES/suse-installation.markdown b/doc/es_ES/suse-installation.markdown new file mode 100644 index 00000000..934554e1 --- /dev/null +++ b/doc/es_ES/suse-installation.markdown @@ -0,0 +1,14 @@ +Instalacion en OpenSuse +======================== + +OpenSuse Leap 42.1 +------------------ + +```bash---terminal +sudo zypper install php5 php5-sqlite php5-gd php5-json php5-mcrypt php5-mbstring php5-openssl +cd /srv/www/htdocs +sudo wgethttps://kanboard.net/kanboard-latest.zip +sudo unzip kanboard-latest.zip +sudo chmod -R 777 kanboard +sudo rm kanboard-latest.zip + diff --git a/doc/es_ES/swimlanes.markdown b/doc/es_ES/swimlanes.markdown new file mode 100755 index 00000000..21e36754 --- /dev/null +++ b/doc/es_ES/swimlanes.markdown @@ -0,0 +1,34 @@ +Swimlanes +========= + +Swimlanes son separaciones horizontales en tu tablero. +Por ejemplo, es útil para separar las versiones de software, dividir las tareas en diferentes productos, equipos o lo que quieras. + +Tablero con swimlanes +---------------------- + + + +- Tu puedes colapsar los swimlanes haciendo click en el icono de la izquierda +- El swimlane por defecto se muestra siempre en la parte superior + +La gestión de swimlanes +----------------------- + +- Todos los proyectos tienen un swimlane predeterminado. +- Si hay más de un swimlane, el tablero mostrará todos swimlanes. +- Usted puede arrastrar y soltar las tareas entre swimlanes. + +Para configurar swimlanes ir a la página de **configuración del proyecto ** y elija la sección **Swimlanes**. + + + + +A partir de ahí, se puede añadir un nuevo swimlane o cambiar el nombre por defecto. +También puede desactivar y cambiar la posición de los diferentes swimlanes. + +- El swimlane por defecto es siempre en la parte superior, pero se puede ocultarlo. +- Swimlanes inactivas no se muestran en el tablero. +- **Extracción de una swimlane no elimina tareas **, esas tareas se moverán a la swimlane predeterminada. + + diff --git a/doc/es_ES/tags.markdown b/doc/es_ES/tags.markdown new file mode 100755 index 00000000..653d3372 --- /dev/null +++ b/doc/es_ES/tags.markdown @@ -0,0 +1,28 @@ +Tags ** Etiqueta ** +==================== + +Con kanboard, tu puedes asociar una o mas tags a una tarea. +Tu puedes definir etiquetas globalmente para todos los proyectos o solo para unos proyectos en especifico + + + +Desde el formulario de tarea, tu puedes caputarar las tags deseadas: + + + +La auto-completacion se forma para mostrar ó sugerir etiquetas disponibles. + +También puede crear etiquetas directamente desde el formulario de tareas . +Por defecto , al crear etiquetas de un formulario de tarea que están asociados al proyecto actual : + + + +Todas las tags pueden ser manejadas en configuración del proyecto. + +Para definir tags globalmente para todos los proyectos, ve a la configuración de la aplicación : + + + +Para buscar tareas basadas en etiquetas, solo use el atributo "tag": + + diff --git a/doc/es_ES/translations.markdown b/doc/es_ES/translations.markdown new file mode 100644 index 00000000..66fd2a4c --- /dev/null +++ b/doc/es_ES/translations.markdown @@ -0,0 +1,68 @@ +Translations +============ + +How to translate Kanboard to a new language? +-------------------------------------------- + +- Translations are stored inside the directory `app/Locale` +- There is a subdirectory for each language, for example in French we have `fr_FR`, Italian `it_IT` etc. +- A translation is a PHP file that returns an Array with a key-value pairs +- The key is the original text in English and the value is the translation of the corresponding language +- **French translations are always up to date** +- Always use the last version (branch master) + +### Create a new translation: + +1. Make a new directory: `app/Locale/xx_XX` for example `app/Locale/fr_CA` for French Canadian +2. Create a new file for the translation: `app/Locale/xx_XX/translations.php` +3. Use the content of the French locales and replace the values +4. Update the file `app/Model/Language.php` +5. Check with your local installation of Kanboard if everything is OK +6. Send a [pull-request with Github](https://help.github.com/articles/using-pull-requests/) + +How to update an existing translation? +-------------------------------------- + +1. Open the translation file `app/Locale/xx_XX/translations.php` +2. Missing translations are commented with `//` and the values are empty, just fill blank and remove the comment +3. Check with your local installation of Kanboard and send a [pull-request](https://help.github.com/articles/using-pull-requests/) + +How to add new translated text in the application? +-------------------------------------------------- + +Translations are displayed with the following functions in the source code: + +- `t()`: display text with HTML escaping +- `e()`: display text without HTML escaping + +Always use the english version in the source code. + +Text strings use the function `sprintf()` to replace elements: + +- `%s` is used to replace a string +- `%d` is used to replace an integer + +All formats are available in the [PHP documentation](http://php.net/sprintf). + +How to find missing translations in the applications? +----------------------------------------------------- + +From a terminal, run the following command: + +```bash +./cli locale:compare +``` + +All missing and unused translations are displayed on the screen. +Put that in the French locale and sync other locales (see below). + +How to synchronize translation files? +------------------------------------- + +From a Unix shell run this command: + +```bash +./cli locale:sync +``` + +The French translation is used a reference to other locales. diff --git a/doc/es_ES/update.markdown b/doc/es_ES/update.markdown new file mode 100755 index 00000000..6dc422d0 --- /dev/null +++ b/doc/es_ES/update.markdown @@ -0,0 +1,34 @@ +Actualizar Kanboard a una nueva versión +======================================= + +La actualización de Kanboard a una nueva versión es perfecta. +El proceso se puede resumir simplemente copiar la carpeta de datos a la nueva carpeta Kanboard . +Kanboard ejecutará migraciones de bases de datos de forma automática. + +Cosas importantes que hacer antes de actualizar +-------------------------------------- + +- **Siempre crear un backup de tus datos antes de actualizarlo** +- Verificar que tu backup es valido +- Siempre leer el [change log](https://github.com/kanboard/kanboard/blob/master/ChangeLog) para verificar si hay cambios destacados +- Siempre cerrar las sesiones de todos los usuarios (eliminar todas las sesiones en el servidor) + +Desde el archivo (Versión estable ) +--------------------------------- + +1. Descomprimir el nuevo archivo +2. Copiar el contenido de la carpeta de datos en el directorio recién descomprimido +3. Copiar tu `config.php` personalizado si tienes uno +4. Copiar tus plugins sin son necesarios +5. Asegúrese de que el directorio `data` es escribible por el usuario del servidor web +6. Testearlo +7. Eliminar tu viejo directorio del Kanboard + +Desde el repositorio (development version) +----------------------------------------- + +1. `git pull` +2. `composer install --no-dev` +3. Inicia la sesión y comprobar si todo está bien + +Nota: Este método se instalará la **versión de desarrollo actual**, utilice a su propio riesgo. diff --git a/doc/es_ES/user-mentions.markdown b/doc/es_ES/user-mentions.markdown new file mode 100644 index 00000000..1d7410e3 --- /dev/null +++ b/doc/es_ES/user-mentions.markdown @@ -0,0 +1,18 @@ +Menciones de usuarios +===================== + +Kanboard ofrece la posibilidad de enviar notificaciones cuando alguien es mencionado. + +Si usted necesita obtener la atención de alguien en un comentario o una tarea, use el simbolo @ seguido por el usuario. +Kanboard automaticamente desplegara una lista de usuarios: + + + +- Por el momento, solo las descripciones de la tarea y la area de comentarios la función esta activada. +- El usuario mencionado sólo funciona durante las tareas y comentarios creados +- Para notificar, necesita mencionar a los usuarios con su membresia de proyecto +- Cuando alguien se mencionó, este usuario recibirá una notificación. +- El @username mencionado está relacionado con el perfil de usuario. + +La notificacion es enviada de acuerdo a la configuracion del usuario, se le puede enviar un email, una notificaicon via web o mensajes en Slack/Hipchat/Jabber si y cuando se tenga instalados dichos plugins. + |
