summaryrefslogtreecommitdiff
path: root/doc/es_ES
diff options
context:
space:
mode:
Diffstat (limited to 'doc/es_ES')
-rw-r--r--doc/es_ES/2fa.markdown33
-rw-r--r--doc/es_ES/analytics-tasks.markdown24
-rw-r--r--doc/es_ES/analytics.markdown59
-rw-r--r--doc/es_ES/api-action-procedures.markdown245
-rw-r--r--doc/es_ES/api-authentication.markdown60
-rw-r--r--doc/es_ES/api-board-procedures.markdown158
-rw-r--r--doc/es_ES/api-category-procedures.markdown172
-rw-r--r--doc/es_ES/api-column-procedures.markdown229
-rw-r--r--doc/es_ES/api-comment-procedures.markdown181
-rw-r--r--doc/es_ES/api-examples.markdown152
-rw-r--r--doc/es_ES/api-external-task-link-procedures.markdown221
-rw-r--r--doc/es_ES/api-group-member-procedures.markdown188
-rwxr-xr-xdoc/es_ES/api-group-procedures.markdown174
-rw-r--r--doc/es_ES/api-internal-task-link-procedures.markdown187
-rw-r--r--doc/es_ES/api-json-rpc.markdown69
-rw-r--r--doc/es_ES/api-link-procedures.markdown285
-rw-r--r--doc/es_ES/board-collapsed-expanded.markdown18
-rw-r--r--doc/es_ES/board-configuration.markdown25
-rw-r--r--doc/es_ES/board-horizontal-scrolling-and-compact-view.markdown12
-rw-r--r--doc/es_ES/board-show-hide-columns.markdown12
-rw-r--r--doc/es_ES/bruteforce-protection.markdown26
-rw-r--r--doc/es_ES/calendar-configuration.markdown2
-rw-r--r--doc/es_ES/centos-installation.markdown80
-rwxr-xr-xdoc/es_ES/cli.markdown205
-rwxr-xr-xdoc/es_ES/cloudron.markdown27
-rwxr-xr-xdoc/es_ES/coding-standards.markdown24
-rwxr-xr-xdoc/es_ES/config.markdown307
-rw-r--r--doc/es_ES/contributing.markdown67
-rwxr-xr-xdoc/es_ES/creating-projects.markdown40
-rwxr-xr-xdoc/es_ES/creating-tasks.markdown31
-rwxr-xr-xdoc/es_ES/cronjob.markdown32
-rw-r--r--doc/es_ES/debian-installation.markdown65
-rw-r--r--doc/es_ES/docker.markdown105
-rwxr-xr-xdoc/es_ES/faq.markdown132
-rw-r--r--doc/es_ES/freebsd-installation.markdown132
-rw-r--r--doc/es_ES/heroku.markdown38
-rw-r--r--doc/es_ES/installation.markdown72
-rw-r--r--doc/es_ES/kanban-vs-todo-and-scrum.markdown2
-rwxr-xr-xdoc/es_ES/keyboard-shortcuts.markdown38
-rwxr-xr-xdoc/es_ES/mysql-configuration.markdown74
-rw-r--r--doc/es_ES/plugin-authentication-architecture.markdown99
-rw-r--r--doc/es_ES/plugin-authentication.markdown42
-rw-r--r--doc/es_ES/plugin-authorization-architecture.markdown39
-rw-r--r--doc/es_ES/plugin-automatic-actions.markdown61
-rw-r--r--doc/es_ES/plugin-avatar-provider.markdown32
-rw-r--r--doc/es_ES/plugin-directory.markdown15
-rw-r--r--doc/es_ES/plugin-events.markdown27
-rw-r--r--doc/es_ES/plugin-external-link.markdown79
-rw-r--r--doc/es_ES/plugin-group-provider.markdown54
-rw-r--r--doc/es_ES/plugin-helpers.markdown39
-rw-r--r--doc/es_ES/plugin-hooks.markdown249
-rw-r--r--doc/es_ES/plugin-ldap-client.markdown99
-rw-r--r--doc/es_ES/plugin-mail-transports.markdown49
-rw-r--r--doc/es_ES/plugin-metadata.markdown42
-rw-r--r--doc/es_ES/plugin-notifications.markdown59
-rw-r--r--doc/es_ES/plugin-overrides.markdown42
-rw-r--r--doc/es_ES/plugin-registration.markdown160
-rw-r--r--doc/es_ES/plugin-routes.markdown85
-rw-r--r--doc/es_ES/plugin-schema-migrations.markdown40
-rw-r--r--doc/es_ES/plugins.markdown46
-rwxr-xr-xdoc/es_ES/requirements.markdown111
-rwxr-xr-xdoc/es_ES/reverse-proxy-authentication.markdown64
-rwxr-xr-xdoc/es_ES/rss.markdown23
-rwxr-xr-xdoc/es_ES/screenshots.markdown25
-rw-r--r--doc/es_ES/subtasks.markdown46
-rw-r--r--doc/es_ES/suse-installation.markdown14
-rwxr-xr-xdoc/es_ES/swimlanes.markdown34
-rwxr-xr-xdoc/es_ES/tags.markdown28
-rw-r--r--doc/es_ES/translations.markdown68
-rwxr-xr-xdoc/es_ES/update.markdown34
-rw-r--r--doc/es_ES/user-mentions.markdown18
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
+
+![2FA](screenshots/2fa.png)
+
+- 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
+-------------------
+
+![Lead and cycle time](screenshots/task-lead-cycle-time.png)
+
+- 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
+---------------------------
+
+![Time spent into each column](screenshots/time-into-each-column.png)
+
+- 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
+-----------------------
+
+![User repartition](screenshots/user-repartition.png)
+
+Esta gráfico de sectores muestra el numero de tareas abiertas asignadas por usuario.
+
+Distribución de tareas
+----------------------
+
+![Task distribution](screenshots/task-distribution.png)
+
+Este gráfico de sectores da una visión general del numero de tareas abiertas por columnas.
+
+Diagrama de flujo acumulado
+---------------------------
+
+![Cumulative flow diagram](screenshots/cfd.png)
+
+- 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
+--------------
+
+![Tareas colapsadas](screenshots/board-collapsed-mode.png)
+
+- 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
+--------------
+
+![Tasks expanded](screenshots/board-expanded-mode.png)
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.
+
+![Board settings](screenshots/board-settings.png)
+
+### 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 a modo compacto](screenshots/board-compact-mode.png)
+
+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:
+
+![Ocultar una columna](screenshots/hide-column.png)
+
+Para ocultar una columna, click en la columna escoge en el menu dropdown "ocultar esta columna" :
+
+![Mostrar una columna](screenshots/show-column.png)
+
+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
-![Configuración de calendarios](https://kanboard.net/screenshots/documentation/calendar-settings.png)
+![Configuración de calendarios](screenshots/calendar-settings.png)
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
+
+[![Install](https://cloudron.io/img/button.svg)](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**:
+
+![Formulario para la creación de proyecto](screenshots/new-project.png)
+
+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
+
+![Creación de tarea desde el tablero](screenshots/task-creation-board.png)
+
+A continuación, aparece el formulario de creación de tareas:
+
+![Formulario de creación de tareas](screenshots/task-creation-form.png)
+
+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;amp;)
+--------------------------------------------------
+
+- La URL se mira como `/?controller=auth&amp;action=login&amp;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:
+
+[![Deploy](https://www.herokucdn.com/deploy/button.png)](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&amp;action=myaction&amp;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**.
+
+![Disable public access](screenshots/project-disable-sharing.png)
+
+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 .
+
+![Drop-down screenshot menu](screenshots/dropdown-screenshot.png)
+
+Para a�adir una nueva imagen , coloque su captura de pantalla y pegar CTRL+V or Command+V:
+
+![Screenshot page](screenshots/task-screenshot.png)
+
+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**:
+
+![Añadir una subtarea](screenshots/add-subtask.png)
+
+Tambien puede agregar una subtarea rápidamente introduciendo solamente el titulo:
+
+![Añadir una subtarea desde la vista de la subtarea](screenshots/add-subtask-shortcut.png)
+
+Cambiar estado de subtarea
+-------------------------
+
+Al hacer clic en el título de la subtarea, se hace el cambio de estado :
+
+![Subtask en progreso](screenshots/subtask-status-inprogress.png)
+
+El icono antes de que el titulo se actualice el estatus.
+
+![Subtarea realizada](screenshots/subtask-status-done.png)
+
+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
+----------------------
+
+![Swimlanes](screenshots/swimlanes.png)
+
+- 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**.
+
+
+![Configuración Swimlanes](screenshots/swimlane-configuration.png)
+
+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
+
+![Tags en el tablero](screenshots/tags-board.png)
+
+Desde el formulario de tarea, tu puedes caputarar las tags deseadas:
+
+![Tags form](screenshots/tags-task.png)
+
+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 :
+
+![Project Tags](screenshots/tags-projects.png)
+
+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 :
+
+![Global Tags](screenshots/tags-global.png)
+
+Para buscar tareas basadas en etiquetas, solo use el atributo "tag":
+
+![Search Tags](screenshots/tags-search.png)
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:
+
+![User Mention](screenshots/mention-autocomplete.png)
+
+- 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.
+