diff --git a/app/config/langs.php b/app/config/langs.php
index cd5bd7cd..155ae27e 100644
--- a/app/config/langs.php
+++ b/app/config/langs.php
@@ -5,6 +5,7 @@ return [
'en-UD' => 'CrowdIn - InContext Localization',
'de' => 'Deutsch',
'en' => 'English',
+ 'es' => 'Español',
'fr' => 'Français',
'pt-BR' => 'Portuguese, Brazilian',
];
diff --git a/app/lang/es/cachet.php b/app/lang/es/cachet.php
new file mode 100644
index 00000000..d6b2c303
--- /dev/null
+++ b/app/lang/es/cachet.php
@@ -0,0 +1,47 @@
+ [
+ 'status' => [
+ 1 => 'Operacional',
+ 2 => 'Problemas de rendimiento',
+ 3 => 'Interrupción parcial',
+ 4 => 'Interrupción mayor',
+ ],
+ ],
+
+ // Incidents
+ 'incidents' => [
+ 'none' => 'No hay ninguna incidencia reportada.',
+ 'past' => 'Incidentes anteriores',
+ 'previous_week' => 'Semana anterior',
+ 'next_week' => 'Siguiente semana',
+ 'none' => 'No hay ninguna incidencia reportada.',
+ 'status' => [
+ 1 => 'Investigando',
+ 2 => 'Identificado',
+ 3 => 'Observando',
+ 4 => 'Corregido',
+ ],
+ ],
+
+ // Service Status
+ 'service' => [
+ 'good' => 'Todos los sistemas funcionando.',
+ 'bad' => 'Algunos sistemas están experimentando problemas.',
+ ],
+
+ 'api' => [
+ 'regenerate' => 'Regenerar API Key',
+ 'revoke' => 'Revocar API Key',
+ ],
+
+ // Other
+ 'powered_by' => ':app La página de estado es alimentada por Cachet.',
+ 'about_this_site' => 'Acerca de este sitio',
+ 'rss-feed' => 'Feed RSS',
+ 'atom-feed' => 'Atom Feed',
+ 'feed' => 'Estado del Feed',
+
+];
diff --git a/app/lang/es/dashboard.php b/app/lang/es/dashboard.php
new file mode 100644
index 00000000..aba94620
--- /dev/null
+++ b/app/lang/es/dashboard.php
@@ -0,0 +1,153 @@
+ 'Panel de Control',
+
+ // Incidents
+ 'incidents' => [
+ 'incidents' => 'Incidentes',
+ 'logged' => '{0} No hay incidencias, ¡buen trabajo!|Has registrado una incidencia.|Has reportado :count incidencias.',
+ 'incident-create-template' => 'Crear plantilla',
+ 'incident-templates' => 'Plantillas de incidente',
+ 'add' => [
+ 'title' => 'Agregar un incidente',
+ 'success' => 'Incidente agregado.',
+ 'failure' => 'Algo salió mal con el incidente.',
+ ],
+ 'edit' => [
+ 'title' => 'Editar un incidente',
+ 'success' => 'Incidente actualizado.',
+ 'failure' => 'Algo salió mal con el incidente.',
+ ],
+
+ // Incident templates
+ 'templates' => [
+ 'title' => 'Plantillas de incidente',
+ 'add' => [
+ 'title' => 'Crear una plantilla de incidente',
+ 'success' => 'Plantilla creada.',
+ 'failure' => 'Algo salió mal con la plantilla de incidente.',
+ ],
+ 'edit' => [
+ 'title' => 'Editar plantilla',
+ 'success' => '¡Se ha actualizado la plantilla!',
+ 'failure' => 'Algo salió mal actualizar la plantilla de incidente',
+ ],
+ ],
+ ],
+
+ // Components
+ 'components' => [
+ 'components' => 'Componente|Componentes',
+ 'component_statuses' => 'Estatus de los componentes',
+ 'add' => [
+ 'title' => 'Agregar un componente',
+ 'message' => 'Deberías agregar un componente.',
+ 'success' => 'Componente creado.',
+ 'failure' => 'Algo salió mal con el componente.',
+ ],
+ 'edit' => [
+ 'title' => 'Editar un componente',
+ 'success' => 'Componente actualizado.',
+ 'failure' => 'Algo salió mal con el componente.',
+ ],
+
+ // Component groups
+ 'groups' => [
+ 'groups' => 'Grupo de componente|Grupos de componente',
+ 'add' => [
+ 'title' => 'Agregar un grupo',
+ 'success' => 'Grupo componente agregado.',
+ 'failure' => 'Algo salió mal con el grupo del componente.',
+ ],
+ ],
+ ],
+
+ // Metrics
+ 'metrics' => [
+ 'metrics' => 'Métricas',
+ 'add' => [
+ 'title' => 'Crear una métrica',
+ 'success' => 'Métrica creada.',
+ 'failure' => 'Algo salió mal con la métrica.',
+ ],
+ ],
+
+ // Team
+ 'team' => [
+ 'team' => 'Equipo',
+ 'member' => 'Miembro',
+ 'profile' => 'Perfil',
+ 'description' => 'Los miembros del equipo será capaces de añadir, modificar y editar componentes e incidentes.',
+ 'add' => [
+ 'title' => 'Agregar miembro de equipo',
+ 'success' => 'Miembro del equipo agregado.',
+ 'failure' => 'Algo salió mal con el componente.',
+ ],
+ 'edit' => [
+ 'title' => 'Actualizar perfil',
+ 'success' => 'Perfil actualizado.',
+ 'failure' => 'Algo salió mal al actualizar.',
+ ],
+ ],
+
+ // Settings
+ 'settings' => [
+ 'settings' => 'Ajustes',
+ 'app-setup' => [
+ 'app-setup' => 'Configuración',
+ 'images-only' => 'Sólo puedes subir imágenes.',
+ 'too-big' => 'El archivo subido es demasiado grande. Sube una imagen con tamaño menor a: tamaño',
+ ],
+ 'security' => [
+ 'security' => 'Seguridad',
+ ],
+ 'stylesheet' => [
+ 'stylesheet' => 'Hoja de estilo',
+ ],
+ 'theme' => [
+ 'theme' => 'Tema',
+ ],
+ 'edit' => [
+ 'success' => 'Configuración guardada.',
+ 'failure' => 'La configuración no ha podido ser guardada.',
+ ],
+ ],
+
+ // Login
+ 'login' => [
+ 'login' => 'Iniciar Sesión',
+ 'logged_in' => 'Estás conectado.',
+ 'welcome' => '¡Bienvenido!',
+ 'two-factor' => 'Por favor ingresa tu token.',
+ ],
+
+ // Sidebar footer
+ 'help' => 'Ayuda',
+ 'status_page' => 'Página de estado',
+ 'logout' => 'Salir',
+
+ // Notifications
+ 'notifications' => [
+ 'notifications' => 'Notificaciones',
+ 'awesome' => 'Excelente.',
+ 'whoops' => 'Whoops.',
+ ],
+
+ // Welcome modal
+ 'welcome' => [
+ 'welcome' => 'Bienvenido a Cachet',
+ 'message' => 'La página de estado está casi lista! Tal vez quieras configurar estos ajustes adicionales',
+ 'close' => 'Ir directo al Panel de Control',
+ 'steps' => [
+ 'component' => 'Crear componentes',
+ 'incident' => 'Crear incidentes',
+ 'customize' => 'Personaliza tu página de estado Cachet.',
+ 'team' => 'Agregar usuarios a tu equipo.',
+ 'api' => 'Generar token API.',
+ 'two-factor' => 'Habilitar autenticación de dos pasos.',
+ ],
+ ],
+
+];
diff --git a/app/lang/es/errors.php b/app/lang/es/errors.php
new file mode 100644
index 00000000..3892bfd5
--- /dev/null
+++ b/app/lang/es/errors.php
@@ -0,0 +1,16 @@
+ [
+ 'code' => '404',
+ 'title' => '¡Esta página se perdió!',
+ 'message' => 'Lo sentimos, no se ha encontrado la página que estás buscando. Comprueba que la dirección URL no contenga errores y vuelve a intentarlo.',
+ 'link' => 'Regresar a la página de inicio',
+ ],
+ 'unauthorized' => [
+ 'code' => '401',
+ 'title' => 'No autorizado',
+ 'message' => 'Lo sentimos, necesitas privilegios de administrador para ver esta página.',
+ 'link' => 'Regresar a la página de inicio',
+ ],
+];
diff --git a/app/lang/es/forms.php b/app/lang/es/forms.php
new file mode 100644
index 00000000..634f6379
--- /dev/null
+++ b/app/lang/es/forms.php
@@ -0,0 +1,107 @@
+ [
+ 'email' => 'Correo electrónico',
+ 'username' => 'Nombre de usario',
+ 'password' => 'Contraseña',
+ 'site_name' => 'Nombre del sitio',
+ 'site_domain' => 'Dominio de sitio',
+ 'site_timezone' => 'Selecciona tu zona horaria',
+ 'site_locale' => 'Selecciona tu idioma',
+ 'enable_google2fa' => 'Habilitar la verificación en dos pasos de Google',
+ ],
+
+ // Login form fields
+ 'login' => [
+ 'email' => 'Correo electrónico',
+ 'password' => 'Contraseña',
+ '2fauth' => 'Código de Autenticación',
+ 'invalid' => 'Dirección de correo o contraseña incorrectos',
+ 'invalid-token' => 'Token inválido',
+ ],
+
+ // Incidents form fields
+ 'incidents' => [
+ 'name' => 'Nombre',
+ 'status' => 'Estado',
+ 'component' => 'Componente',
+ 'message' => 'Mensaje',
+ 'message-help' => 'También puedes usar Markdown.',
+
+ 'templates' => [
+ 'name' => 'Nombre',
+ 'template' => 'Plantilla',
+ ],
+ ],
+
+ // Components form fields
+ 'components' => [
+ 'name' => 'Nombre',
+ 'status' => 'Estatus',
+ 'group' => 'Grupo',
+ 'description' => 'Descripción',
+ 'link' => 'Enlace',
+ 'tags' => 'Etiquetas',
+ 'tags-help' => 'Separado por comas.',
+
+ 'groups' => [
+ 'name' => 'Nombre',
+ ],
+ ],
+
+ // Settings
+ 'settings' => [
+ /// Application setup
+ 'app-setup' => [
+ 'site-name' => 'Nombre del sitio',
+ 'site-url' => 'URL del sitio',
+ 'site-timezone' => 'Zona horaria del sitio',
+ 'site-locale' => 'Idioma del sitio',
+ 'date-format' => 'Formato de la fecha',
+ 'about-this-page' => 'Sobre esta página',
+ 'days-of-incidents' => '¿Cuántos días de incidentes mostrar?',
+ 'banner' => 'Imagen de inicio',
+ 'banner-help' => "Se recomienda subir una imagen no más grande de 930px de ancho .",
+ 'google-analytics' => "Código de Google Analytics",
+ ],
+ 'security' => [
+ 'allowed-domains' => 'Dominios permitidos',
+ 'allowed-domains-help' => 'Separados por coma. El dominio establecido en la configuración del sitio formará automáticamente parte de los dominios permitidos.',
+ ],
+ 'stylesheet' => [
+ 'custom-css' => 'Hoja de estilo personalizada',
+ ],
+ 'theme' => [
+ 'background-color' => 'Color de fondo',
+ 'text-color' => 'Color de Texto',
+ ],
+ ],
+
+ 'user' => [
+ 'username' => 'Nombre de usario',
+ 'email' => 'Correo electrónico',
+ 'password' => 'Contraseña',
+ 'api-token' => 'API Token',
+ 'api-token-help' => 'Al regenerar su API key revocara todas las aplicaciones existentes.',
+ '2fa' => [
+ 'help' => 'Habilitar autenticación de dos pasos aumenta la seguridad de tu cuenta. Necesitarás descargar Google Authenticator o una aplicación similar a su dispositivo móvil. Al iniciar sesión, te pedirá proporcionar un token generado por la aplicación.',
+ ],
+ ],
+
+ // Buttons
+ 'add' => 'Agregar',
+ 'save' => 'Guardar',
+ 'update' => 'Actualizar',
+ 'create' => 'Crear',
+ 'edit' => 'Editar',
+ 'delete' => 'Eliminar',
+ 'submit' => 'Enviar',
+ 'cancel' => 'Cancelar',
+ 'remove' => 'Remover',
+
+ // Other
+ 'optional' => '* Opcional',
+];
diff --git a/app/lang/es/pagination.php b/app/lang/es/pagination.php
new file mode 100644
index 00000000..325916dc
--- /dev/null
+++ b/app/lang/es/pagination.php
@@ -0,0 +1,19 @@
+ '« Anterior',
+ 'next' => 'Siguiente »',
+
+];
diff --git a/app/lang/es/reminders.php b/app/lang/es/reminders.php
new file mode 100644
index 00000000..db970a07
--- /dev/null
+++ b/app/lang/es/reminders.php
@@ -0,0 +1,22 @@
+ 'Las contraseñas deben tener al menos seis caracteres y coincidir con la confirmación.',
+ 'user' => 'No podemos encontrar un usuario con esa dirección de correo electrónico.',
+ 'token' => 'El token para resetear el password no es válido.',
+ 'sent' => '!Recordatorio de contraseña enviado!',
+ 'reset' => '!La contraseña ha sido restablecida!',
+
+];
diff --git a/app/lang/es/setup.php b/app/lang/es/setup.php
new file mode 100644
index 00000000..2034cf2e
--- /dev/null
+++ b/app/lang/es/setup.php
@@ -0,0 +1,13 @@
+ 'Configurar',
+ 'title' => 'Configurar Cachet',
+ 'service_details' => 'Detalles del servicio',
+ 'status_page_setup' => 'Configuración de la página de estado',
+ 'show_support' => '¿Mostrar tu apoyo a Cachet? Colocara un enlace en el footer vinculando a Cachet.',
+ 'admin_account' => 'Cuenta de administrador',
+ 'complete_setup' => 'Completar configuración',
+ 'completed' => '¡Cachet se ha configurado correctamente!',
+ 'finish_setup' => 'Ir a Panel de control',
+];
diff --git a/app/lang/es/validation.php b/app/lang/es/validation.php
new file mode 100644
index 00000000..8c788bc3
--- /dev/null
+++ b/app/lang/es/validation.php
@@ -0,0 +1,106 @@
+ "El :attribute debe ser aceptado.",
+ "active_url" => "El :attribute no es un enlace válido.",
+ "after" => "El :attribute debe ser una fecha después de :date.",
+ "alpha" => "El :attribute sólo puede contener letras.",
+ "alpha_dash" => "El :attribute sólo puede contener letras, números y guiones.",
+ "alpha_num" => "El :attribute sólo puede contener letras y números.",
+ "array" => "El :attribute debe ser una matriz.",
+ "before" => "El :attribute debe ser una fecha antes de :date.",
+ "between" => [
+ "numeric" => "El :attribute debe ser entre :min y :max.",
+ "file" => "El :attribute debe ser entre :min y :max kilobytes.",
+ "string" => "El :attribute debe tener entre :min y :max caracteres.",
+ "array" => "El :attribute debe tener entre :min y :max objetos.",
+ ],
+ "boolean" => "El campo del :attribute debe ser verdadero o falso.",
+ "confirmed" => "La confirmación del :attribute no coincide.",
+ "date" => "El :attribute no es una fecha válida.",
+ "date_format" => "El :attribute no cumple el formato :format.",
+ "different" => ":attribute y :other deben ser diferentes.",
+ "digits" => "El :attribute debe tener :digits dígitos.",
+ "digits_between" => "El :attribute debe tener entre: min y :max dígitos.",
+ "email" => "El :attribute debe ser una dirección de email válida.",
+ "exists" => "El :attribute seleccionado es inválido.",
+ "image" => "El :attribute debe ser una imagen.",
+ "in" => "El :attribute seleccionado es inválido.",
+ "integer" => "El :attribute debe ser un número entero.",
+ "ip" => "El :attribute debe ser una dirección IP válida.",
+ "max" => [
+ "numeric" => "El :attribute no puede tener más de :max.",
+ "file" => "El :attribute no puede tener más de :max kilobytes.",
+ "string" => "El :attribute no puede tener más de :max caracteres.",
+ "array" => "El :attribute no puede tener más de :max objetos.",
+ ],
+ "mimes" => "El :attribute debe ser un archivo de tipo: :values.",
+ "min" => [
+ "numeric" => "El :attribute debe tener al menos :min.",
+ "file" => "El :attribute debe tener al menos :min kilobytes.",
+ "string" => "El :attribute debe tener al menos :min characters.",
+ "array" => "El :attribute debe tener al menos :min objetos.",
+ ],
+ "not_in" => "El :attribute seleccionado es inválido.",
+ "numeric" => "El :attribute sebe ser un número.",
+ "regex" => "El formato del :attribute es inválido.",
+ "required" => "El campo del :attribute es requerido.",
+ "required_if" => "El campo del :attribute se requiere cuando :other es :value.",
+ "required_with" => "El campo del :attribute se requiere cuando :values es presente.",
+ "required_with_all" => "El campo del :attribute se requiere cuando :values es presente.",
+ "required_without" => "El campo del :attribute se requiere cuando :values no es presente.",
+ "required_without_all" => "El campo del :attribute se requiere cuando ninguno de los :values son presentes.",
+ "same" => "Los :attribute y :other deben coincidir.",
+ "size" => [
+ "numeric" => "El :attribute debe ser :size.",
+ "file" => "El :attribute debe ser :size kilobytes.",
+ "string" => "El :attribute debe tener :size caracteres.",
+ "array" => "El :attribute debe contener :size objetos.",
+ ],
+ "unique" => "El :attribute ya ha sido usado.",
+ "url" => "El formato :attribute es inválido.",
+ "timezone" => "El :attribute debe ser una zona válida.",
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Language Lines
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify custom validation messages for attributes using the
+ | convention "attribute.rule" to name the lines. This makes it quick to
+ | specify a specific custom language line for a given attribute rule.
+ |
+ */
+
+ 'custom' => [
+ 'attribute-name' => [
+ 'rule-name' => 'mensaje-personalizado',
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Attributes
+ |--------------------------------------------------------------------------
+ |
+ | The following language lines are used to swap attribute place-holders
+ | with something more reader friendly such as E-Mail Address instead
+ | of "email". This simply helps us make messages a little cleaner.
+ |
+ */
+
+ 'attributes' => [],
+
+];