Initial commit: Pireon Admin — headless admin panel and public API

Laravel 13 + Filament 5 admin panel and REST API for a non-profit developer
collective, backed by the Pireon OAuth identity server. The public site is a
separate, server-rendered application consuming /api/public/v1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 17:55:27 +02:00
commit 3897113313
534 changed files with 64050 additions and 0 deletions

119
lang/es/actions.php Normal file
View File

@@ -0,0 +1,119 @@
<?php
declare(strict_types=1);
return [
'accept' => 'Aceptar',
'action' => 'Acción',
'actions' => 'Acciones',
'add' => 'Agregar',
'admin' => 'Administrar',
'agree' => 'Aceptar',
'archive' => 'Archivar',
'assign' => 'Asignar',
'associate' => 'Asociar',
'attach' => 'Adjuntar',
'browse' => 'Navegar',
'cancel' => 'Cancelar',
'choose' => 'Elegir',
'choose_file' => 'Elegir archivo',
'choose_image' => 'Elegir Imagen',
'click_to_copy' => 'Haga clic para copiar',
'close' => 'Cerrar',
'collapse' => 'Colapsar',
'collapse_all' => 'Colapsar todo',
'comment' => 'Comentar',
'confirm' => 'Confirmar',
'connect' => 'Conectar',
'create' => 'Crear',
'delete' => 'Borrar',
'detach' => 'Desasociar',
'details' => 'Detalles',
'disable' => 'Desactivar',
'discard' => 'Descartar',
'done' => 'Hecho',
'down' => 'Abajo',
'duplicate' => 'Duplicar',
'edit' => 'Editar',
'enable' => 'Permitir',
'expand' => 'Expandir',
'expand_all' => 'Expandir todo',
'explanation' => 'Explicación',
'export' => 'Exportar',
'file' => 'Archivo',
'files' => 'Archivos',
'go_home' => 'Ir a Inicio',
'hide' => 'Ocultar',
'home' => 'Inicio',
'image' => 'Imagen',
'impersonate' => 'Personificar',
'impersonation' => 'Personificación',
'import' => 'Importar',
'introduction' => 'Introducción',
'like' => 'Me gusta',
'load' => 'Cargar',
'localize' => 'Localizar',
'log_in' => 'Acceder',
'log_out' => 'Cerrar sesión',
'named' => [
'add' => 'Agregar :name',
'choose' => 'Elegir :name',
'create' => 'Crear :name',
'delete' => 'Eliminar :name',
'duplicate' => 'Duplicar :name',
'edit' => 'Editar :name',
'export' => 'Exportar :name',
'hide' => 'Ocultar :name',
'import' => 'Importar :name',
'new' => 'Nuevo :name',
'restore' => 'Restaurar :name',
'save' => 'Guardar :name',
'search' => 'Buscar :name',
'show' => 'Mostrar :name',
'update' => 'Actualizar :name',
'view' => 'Ver :name',
],
'new' => 'Nuevo',
'no' => 'No',
'open' => 'Abrir',
'open_website' => 'Abrir en el sitio web',
'preview' => 'Previsualizar',
'price' => 'Precio',
'record' => 'Registro',
'restore' => 'Restaurar',
'save' => 'Guardar',
'save_and_close' => 'Guardar y cerrar',
'save_and_return' => 'Guardar y volver',
'search' => 'Buscar',
'select' => 'Seleccionar',
'select_all' => 'Seleccionar todo',
'send' => 'Enviar',
'settings' => 'Ajustes',
'show' => 'Mostrar',
'show_all' => 'Mostrar todo',
'sign_in' => 'Iniciar sesión',
'solve' => 'Resolver',
'start' => 'Comenzar',
'stop' => 'Detener',
'submit' => 'Enviar',
'subscribe' => 'Suscribir',
'switch' => 'Cambiar',
'switch_to_role' => 'Cambiar de rol',
'tag' => 'Etiqueta',
'tags' => 'Etiquetas',
'target_link' => [
'blank' => 'Abrir en una ventana nueva',
'parent' => 'Abrir en el marco principal',
'self' => 'Abrir en la ventana actual',
'top' => 'Abrir en el marco superior',
],
'translate' => 'Traducir',
'translate_it' => 'Traducirlo',
'unpack' => 'Desglosar',
'unsubscribe' => 'Darse de baja',
'up' => 'Arriba',
'update' => 'Actualizar',
'user' => 'Usuario',
'view' => 'Ver',
'yes' => 'Sí',
];

9
lang/es/auth.php Normal file
View File

@@ -0,0 +1,9 @@
<?php
declare(strict_types=1);
return [
'failed' => 'Estas credenciales no coinciden con nuestros registros.',
'password' => 'La contraseña es incorrecta.',
'throttle' => 'Demasiados intentos de acceso. Por favor intente nuevamente en :seconds segundos.',
];

28
lang/es/console.php Normal file
View File

@@ -0,0 +1,28 @@
<?php
declare(strict_types=1);
return [
'prune' => [
'dry_run' => 'Simulación: no se borra nada.',
'revisions' => 'Entradas de historial antiguas',
'trash' => 'Registros eliminados definitivamente',
'media' => 'Imágenes que ya no usa nadie',
'missing_urls' => 'URLs no encontradas de una sola visita',
'views' => 'Cifras de lectura antiguas',
],
'types' => [
'no_spec' => 'No hay especificación publicada en public/openapi.yaml.',
'current' => 'Los tipos están al día.',
'stale' => 'Los tipos no coinciden con la especificación. Ejecuta: php artisan api:types',
'written' => ':count esquemas escritos en :path',
],
'schedule' => [
'closed' => 'cerrada (pasó su fecha)',
'pending' => 'Esperando su fecha de publicación',
'off_site' => 'Fuera de la web por haber caducado',
'summary' => '{0}No había convocatorias que cerrar.|{1}Se cerró 1 convocatoria vencida.|[2,*]Se cerraron :count convocatorias vencidas.',
],
];

7
lang/es/docs.php Normal file
View File

@@ -0,0 +1,7 @@
<?php
declare(strict_types=1);
return [
'title' => 'Documentación de la API',
];

68
lang/es/enums.php Normal file
View File

@@ -0,0 +1,68 @@
<?php
declare(strict_types=1);
return [
'page_status' => [
'draft' => 'Borrador',
'review' => 'En revisión',
'published' => 'Publicada',
'archived' => 'Archivada',
],
'project_status' => [
'idea' => 'Idea',
'active' => 'En marcha',
'paused' => 'En pausa',
'completed' => 'Terminado',
'archived' => 'Archivado',
],
'missing_url_status' => [
'pending' => 'Sin decidir',
'resolved' => 'Resuelta',
'ignored' => 'Ignorada',
],
'review_event' => [
'requested' => 'Pedida revisión',
'returned' => 'Devuelto',
'published' => 'Publicado',
'commented' => 'Comentario',
],
'call_status' => [
'open' => 'Abierta',
'filled' => 'Cubierta',
'closed' => 'Cerrada',
],
'application_status' => [
'new' => 'Sin responder',
'contacted' => 'Contactada',
'accepted' => 'Aceptada',
'declined' => 'Descartada',
'spam' => 'Spam',
],
'application_kind' => [
'contribute' => 'Quiere ayudar',
'request' => 'Pide ayuda',
],
'radar_ring' => [
'adopt' => 'Adoptar',
'trial' => 'Probar',
'assess' => 'Evaluar',
'hold' => 'Evitar',
],
'technology_category' => [
'language' => 'Lenguaje',
'framework' => 'Framework',
'datastore' => 'Almacenamiento',
'infrastructure' => 'Infraestructura',
'tool' => 'Herramienta',
'practice' => 'Práctica',
],
];

149
lang/es/health.php Normal file
View File

@@ -0,0 +1,149 @@
<?php
declare(strict_types=1);
return [
'title' => 'Salud del sitio',
'subheading' => 'Lo que está mal en la web pública y no se ve desde aquí.',
'all_clear' => 'Todo en orden. No hay nada que arreglar.',
'problem_summary' => '{1}Hay 1 cosa que revisar|[2,*]Hay :count cosas que revisar',
'problem_hint' => 'La web está en otro sitio, así que estos fallos no se ven editando: se ven visitándola.',
'passing' => '{1}1 comprobación sin problemas|[2,*]:count comprobaciones sin problemas',
'and_more' => 'y :count más',
'refreshed' => 'Comprobaciones actualizadas',
'severity' => [
'ok' => 'Bien',
'warning' => 'Aviso',
'error' => 'Fallo',
],
'actions' => [
'refresh' => 'Volver a comprobar',
'go_fix' => 'Ir a arreglarlo',
],
'bits' => [
'description' => 'sin meta descripción',
'cover' => 'sin portada',
'gallery_image' => 'Imagen de galería sin describir',
'itself' => 'sí misma',
],
'checks' => [
'missing-slugs' => [
'title' => 'Slugs que faltan',
'ok' => 'Todo lo traducido tiene su slug.',
'problem' => '{1}1 registro está traducido a un idioma pero no tiene slug en él, así que su URL en ese idioma no existe o apunta a un 404.|[2,*]:count registros están traducidos a algún idioma sin tener slug en él, así que esas URLs no existen o apuntan a un 404.',
],
'duplicate-slugs' => [
'title' => 'Slugs repetidos',
'ok' => 'Cada URL resuelve a un solo registro.',
'problem' => '{1}1 slug está repetido dentro del mismo idioma: la API resuelve esa URL al primero que encuentra.|[2,*]:count slugs están repetidos dentro del mismo idioma: la API resuelve esas URLs al primero que encuentra.',
],
'broken-images' => [
'title' => 'Imágenes rotas',
'ok' => 'Todos los archivos de imagen están donde deben.',
'problem' => '{1}1 imagen que la web está publicando ya no existe en disco o no se pudo leer.|[2,*]:count imágenes que la web está publicando ya no existen en disco o no se pudieron leer.',
],
'missing-translations' => [
'title' => 'Contenido sin traducir',
'ok' => 'Todo lo publicado está en los tres idiomas.',
'problem' => '{1}1 registro publicado no está traducido a algún idioma, así que esa versión de la web se queda sin él.|[2,*]:count registros publicados no están traducidos a algún idioma, así que esas versiones de la web se quedan sin ellos.',
],
'images-without-alt' => [
'title' => 'Imágenes sin describir',
'ok' => 'Todas las imágenes publicadas tienen texto alternativo.',
'problem' => '{1}1 imagen publicada no tiene texto alternativo: quien no puede verla no se entera de que está.|[2,*]:count imágenes publicadas no tienen texto alternativo: quien no puede verlas no se entera de que están.',
],
'incomplete-seo' => [
'title' => 'Fichas incompletas',
'ok' => 'Todo lo publicado tiene descripción y portada.',
'problem' => '{1}1 registro publicado no tiene qué enseñar en un buscador o al pegar el enlace en un chat.|[2,*]:count registros publicados no tienen qué enseñar en un buscador o al pegar el enlace en un chat.',
],
'expired-calls' => [
'title' => 'Convocatorias vencidas',
'ok' => 'Ninguna convocatoria abierta ha pasado su fecha de cierre.',
'problem' => '{1}1 convocatoria sigue marcada como abierta con la fecha de cierre pasada. Ya no sale en la web, pero infla el contador del panel.|[2,*]:count convocatorias siguen marcadas como abiertas con la fecha de cierre pasada. Ya no salen en la web, pero inflan el contador del panel.',
],
'unanswered-submissions' => [
'title' => 'Gente esperando respuesta',
'ok' => 'No hay nadie esperando desde hace más de una semana.',
'problem' => '{1}1 persona escribió hace más de una semana y sigue sin respuesta.|[2,*]:count personas escribieron hace más de una semana y siguen sin respuesta.',
],
'stalled-media' => [
'title' => 'Imágenes sin procesar',
'ok' => 'No hay imágenes esperando a procesarse.',
'problem' => '{1}1 imagen lleva más de una hora sin procesarse: probablemente no hay ningún worker de colas ni scheduler corriendo.|[2,*]:count imágenes llevan más de una hora sin procesarse: probablemente no hay ningún worker de colas ni scheduler corriendo.',
],
'services-without-work' => [
'title' => 'Servicios sin obra detrás',
'ok' => 'Todos los servicios publicados enseñan trabajo real.',
'problem' => '{1}1 servicio publicado no enlaza ningún proyecto publicado: es una promesa, no una oferta.|[2,*]:count servicios publicados no enlazan ningún proyecto publicado: son promesas, no ofertas.',
],
'clients-without-logo' => [
'title' => 'Clientes sin logo',
'ok' => 'Todos los clientes del muro tienen logo.',
'problem' => '{1}1 cliente sale en el muro de logos sin tener logo: es un hueco que parece un fallo.|[2,*]:count clientes salen en el muro de logos sin tener logo: son huecos que parecen un fallo.',
],
'testimonials-missing-original' => [
'title' => 'Citas sin el original',
'ok' => 'Todas las citas tienen las palabras que se dijeron de verdad.',
'problem' => '{1}1 testimonio no tiene la cita en su idioma original: se está publicando una traducción de algo que nadie puede comprobar.|[2,*]:count testimonios no tienen la cita en su idioma original: se están publicando traducciones de algo que nadie puede comprobar.',
],
'talks-without-speaker' => [
'title' => 'Charlas sin ponente',
'ok' => 'Todas las charlas tienen a alguien acreditado.',
'problem' => '{1}1 charla no dice quién la dio, así que no sale en el perfil de nadie.|[2,*]:count charlas no dicen quién las dio, así que no salen en el perfil de nadie.',
],
'broken-redirects' => [
'title' => 'Redirecciones rotas',
'ok' => 'Ninguna redirección da vueltas ni encadena con otra.',
'problem' => '{1}1 redirección apunta a sí misma o a otra redirección: el navegador da vueltas o paga un salto de más.|[2,*]:count redirecciones apuntan a sí mismas o a otra redirección: el navegador da vueltas o paga saltos de más.',
],
'redirects-to-nowhere' => [
'title' => 'Redirecciones a ninguna parte',
'ok' => 'Todas las redirecciones llevan a una página que existe.',
'problem' => '{1}1 redirección lleva a una dirección que ya no responde: es peor que el 404 que venía a evitar.|[2,*]:count redirecciones llevan a direcciones que ya no responden: es peor que el 404 que venían a evitar.',
],
'missing-urls' => [
'title' => 'URLs que nadie encuentra',
'ok' => 'Ninguna dirección rota esperando redirección.',
'problem' => '{1}1 dirección da 404 y se ha pedido más de una vez: cada visita que llega por ahí se pierde.|[2,*]:count direcciones dan 404 y se han pedido más de una vez: cada visita que llega por ahí se pierde.',
],
'stale-reviews' => [
'title' => 'Revisiones sin contestar',
'ok' => 'Nadie lleva esperando una revisión.',
'problem' => '{1}1 cosa lleva más de una semana esperando revisión: quien la escribió cree que algo está pasando.|[2,*]:count cosas llevan más de una semana esperando revisión: quien las escribió cree que algo está pasando.',
],
'stale-translations' => [
'title' => 'Traducciones desactualizadas',
'ok' => 'Ninguna traducción se ha quedado atrás del original.',
'problem' => '{1}1 registro traducido dice algo que el original dejó de decir: existe la traducción, así que nada más lo avisa.|[2,*]:count registros traducidos dicen algo que el original dejó de decir: existen las traducciones, así que nada más lo avisa.',
],
'stale-repositories' => [
'title' => 'Repositorios que no sincronizan',
'ok' => 'Todos los repositorios sincronizan bien.',
'problem' => '{1}1 repositorio lleva varios intentos fallando. La web sigue enseñando sus últimos números, que ya no son ciertos.|[2,*]:count repositorios llevan varios intentos fallando. La web sigue enseñando sus últimos números, que ya no son ciertos.',
],
],
];

84
lang/es/http-statuses.php Normal file
View File

@@ -0,0 +1,84 @@
<?php
declare(strict_types=1);
return [
'0' => 'Error desconocido',
'100' => 'Continuar',
'101' => 'Protocolos de conmutación',
'102' => 'Procesando',
'200' => 'DE ACUERDO',
'201' => 'Creado',
'202' => 'Aceptado',
'203' => 'Información no autorizada',
'204' => 'Sin contenido',
'205' => 'Restablecer contenido',
'206' => 'Contenido parcial',
'207' => 'Multiestado',
'208' => 'Ya Reportado',
'226' => 'IM usado',
'300' => 'Múltiples opciones',
'301' => 'Movido permanentemente',
'302' => 'Encontrado',
'303' => 'Ver otros',
'304' => 'No modificado',
'305' => 'Usa proxy',
'307' => 'Redirección temporal',
'308' => 'Redirección permanente',
'400' => 'Solicitud incorrecta',
'401' => 'No autorizado',
'402' => 'Pago requerido',
'403' => 'Prohibido',
'404' => 'No encontrado',
'405' => 'Método no permitido',
'406' => 'Inaceptable',
'407' => 'Se requiere autenticación proxy',
'408' => 'Solicitud de tiempo de espera',
'409' => 'Conflicto',
'410' => 'Recurso no disponible',
'411' => 'Longitud requerida',
'412' => 'Error de condición previa',
'413' => 'Solicitud demasiado grande',
'414' => 'URI demasiado largo',
'415' => 'Tipo de medio no admitido',
'416' => 'Rango no satisfactorio',
'417' => 'Expectativa fallida',
'418' => 'Soy una tetera',
'419' => 'La sesión ha expirado',
'421' => 'Solicitud mal dirigida',
'422' => 'Entidad no procesable',
'423' => 'Bloqueado',
'424' => 'Dependencia fallida',
'425' => 'Demasiado temprano',
'426' => 'Se requiere actualización',
'428' => 'Precondición requerida',
'429' => 'Demasiadas solicitudes',
'431' => 'Campos de encabezado de solicitud demasiado grandes',
'444' => 'Conexión cerrada sin respuesta',
'449' => 'Reintentar con',
'451' => 'No disponible por razones legales',
'499' => 'Solicitud cerrada del cliente',
'500' => 'Error interno del servidor',
'501' => 'No se ha implementado',
'502' => 'Mala puerta de enlace',
'503' => 'Modo de mantenimiento',
'504' => 'Tiempo de espera de puerta de enlace',
'505' => 'Versión HTTP no compatible',
'506' => 'Variante También Negocia',
'507' => 'Espacio insuficiente',
'508' => 'Bucle detectado',
'509' => 'Límite de ancho de banda excedido',
'510' => 'no extendido',
'511' => 'Se requiere autenticación de red',
'520' => 'Error desconocido',
'521' => 'El servidor web está caído',
'522' => 'Tiempo de conexión agotado',
'523' => 'El origen es inalcanzable',
'524' => 'Se produjo un tiempo de espera',
'525' => 'Protocolo de enlace SSL fallido',
'526' => 'Certificado SSL no válido',
'527' => 'Error de cañón de riel',
'598' => 'Error de tiempo de espera de lectura de red',
'599' => 'Error de tiempo de espera de conexión de red',
'unknownError' => 'Error desconocido',
];

34
lang/es/maintenance.php Normal file
View File

@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
return [
'title' => 'Modo mantenimiento',
'subheading' => 'Afecta solo a la web pública. El panel y la API de administración siguen funcionando.',
'badge' => 'Web caída',
'status_up' => 'La web pública está operativa.',
'status_down' => 'La web pública está en mantenimiento.',
'since' => 'Desde :time',
'lifts_at' => 'se levanta el :time',
'panel_unaffected' => 'Podéis seguir editando: el panel no se ve afectado.',
'notice' => 'Aviso para los visitantes',
'notice_hint' => 'Lo devuelve la API pública en el 503 para que el frontend lo muestre. Si lo dejas vacío se usa el texto por defecto.',
'default_message' => 'Estamos haciendo cambios en la web. Volvemos en un rato.',
'until' => 'Se levanta automáticamente',
'until_hint' => 'Opcional. Evita que un mantenimiento olvidado deje la web caída indefinidamente.',
'enable' => 'Activar mantenimiento',
'enable_confirm' => 'Los visitantes dejarán de ver la web y recibirán el aviso. El panel seguirá disponible.',
'disable' => 'Levantar mantenimiento',
'save_message' => 'Guardar aviso',
'enabled_notice' => 'La web pública está en mantenimiento',
'disabled_notice' => 'La web pública vuelve a estar operativa',
'message_saved' => 'Aviso guardado',
'bypass_hint' => 'El equipo puede seguir viendo la web real usando el token de preview o desde una IP de confianza (SITE_TRUSTED_IPS).',
'no_permission' => 'No tienes permiso para activar o levantar el mantenimiento.',
];

8
lang/es/pagination.php Normal file
View File

@@ -0,0 +1,8 @@
<?php
declare(strict_types=1);
return [
'next' => 'Siguiente &raquo;',
'previous' => '&laquo; Anterior',
];

844
lang/es/panel.php Normal file
View File

@@ -0,0 +1,844 @@
<?php
declare(strict_types=1);
return [
'untitled' => 'Sin título',
'duplicates' => [
'title' => 'Título parecido',
'body' => 'Ya existe algo muy parecido: :titles',
'open' => 'Ver ficha existente',
],
'sessions' => [
'title' => 'Sesiones',
'this_one' => 'Esta sesión',
'unknown_device' => 'Dispositivo desconocido',
'fields' => [
'ip_address' => 'Dirección IP',
'device' => 'Dispositivo',
'last_activity' => 'Última actividad',
],
'actions' => [
'revoke' => 'Cerrar sesión',
],
'revoked' => 'Sesión cerrada. Esa conexión deja de valer en la próxima petición.',
'empty' => [
'heading' => 'Sin sesiones abiertas',
'description' => 'Nadie ha iniciado sesión con esta cuenta, o llevan tiempo sin usarla.',
],
],
'environment' => [
'production' => 'Producción — esto es real',
'other' => 'Entorno de :name',
],
'concurrency' => [
'title' => 'No se ha guardado',
'body' => 'Alguien más ha cambiado esto mientras lo editabas. Recarga la página para ver la versión actual: si guardas ahora, perderías ese cambio.',
'body_with_author' => ':name ha cambiado esto mientras lo editabas. Recarga la página para ver su versión: si guardas ahora, perderías ese cambio.',
],
'presence' => [
'title' => 'Alguien más lo tiene abierto',
'body' => 'Ahora mismo también lo está editando: :names.',
],
'groups' => [
'collective' => 'Colectivo',
'content' => 'Contenido',
'administration' => 'Administración',
],
'language' => [
'label' => 'Idioma',
'switch' => 'Cambiar idioma',
],
'pages' => [
'label' => 'Página',
'plural' => 'Páginas',
'sections' => [
'content' => 'Contenido',
'content_hint' => 'Cada pestaña es un idioma. El idioma principal es obligatorio; el resto se rellena con él si lo dejas vacío.',
'publishing' => 'Publicación',
'seo' => 'SEO',
'seo_hint' => 'Metadatos para buscadores y redes sociales.',
],
'fields' => [
'title' => 'Título',
'slug' => 'Slug',
'excerpt' => 'Extracto',
'body' => 'Contenido',
'meta_title' => 'Meta título',
'meta_description' => 'Meta descripción',
'category' => 'Categoría',
'author' => 'Autor',
'status' => 'Estado',
'featured_image' => 'Imagen destacada',
'featured_image_alt' => 'Texto alternativo',
'featured_image_alt_hint' => 'Qué se ve en la imagen, para quien no puede verla. Si es puramente decorativa, déjalo vacío.',
'is_featured' => 'Destacada',
'published_at' => 'Fecha de publicación',
'published_at_hint' => 'Con una fecha futura, la página no sale en la web hasta que llegue.',
'unpublish_at' => 'Retirar el',
'unpublish_at_hint' => 'Opcional. Al llegar, la página desaparece sola de la web. Para avisos con fecha de caducidad.',
'translations' => 'Traducciones',
],
'filters' => [
'translated_in' => 'Traducida a',
'missing_translation' => 'Sin traducir a',
],
'actions' => [
'publish' => 'Publicar',
'unpublish' => 'Despublicar',
],
],
'categories' => [
'label' => 'Categoría',
'plural' => 'Categorías',
'fields' => [
'name' => 'Nombre',
'slug' => 'Slug',
'description' => 'Descripción',
'color' => 'Color',
'position' => 'Orden',
'is_visible' => 'Visible',
'pages_count' => 'Páginas',
],
],
'users' => [
'label' => 'Usuario',
'plural' => 'Usuarios',
'sections' => [
'identity' => 'Identidad',
'identity_hint' => 'Gestionada por el servidor OAuth. Se actualiza automáticamente en cada inicio de sesión.',
'access' => 'Acceso y permisos',
'access_hint' => 'Gestionado por esta aplicación.',
],
'fields' => [
'name' => 'Nombre',
'email' => 'Correo electrónico',
'oauth_id' => 'ID en el servidor OAuth',
'roles' => 'Roles',
'locale' => 'Idioma preferido',
'is_active' => 'Activo',
'last_login_at' => 'Último acceso',
'remote_roles' => 'Roles remotos',
'never' => 'Nunca',
],
'actions' => [
'activate' => 'Activar',
'deactivate' => 'Desactivar',
],
],
'roles' => [
'label' => 'Rol',
'plural' => 'Roles',
'fields' => [
'name' => 'Nombre',
'permissions' => 'Permisos',
'users_count' => 'Usuarios',
],
'protected' => 'Rol protegido: no se puede eliminar.',
'select_all' => 'Seleccionar todos',
],
'permissions' => [
'groups' => [
'general' => 'General',
'projects' => 'Proyectos',
'members' => 'Miembros',
'services' => 'Servicios',
'clients' => 'Clientes',
'testimonials' => 'Testimonios',
'talks' => 'Charlas',
'technologies' => 'Tecnologías',
'calls' => 'Convocatorias',
'applications' => 'Buzón',
'repositories' => 'Repositorios',
'media' => 'Medios',
'redirects' => 'Redirecciones',
'pages' => 'Páginas',
'categories' => 'Categorías',
'users' => 'Usuarios',
'roles' => 'Roles',
'settings' => 'Ajustes',
],
'abilities' => [
'sync' => 'Sincronizar',
'maintenance' => 'Activar modo mantenimiento',
'panel_access' => 'Acceder al panel',
'view_any' => 'Listar',
'view' => 'Ver detalle',
'create' => 'Crear',
'update' => 'Editar',
'delete' => 'Eliminar',
'restore' => 'Restaurar',
'force_delete' => 'Eliminar definitivamente',
'publish' => 'Publicar',
],
],
'actions' => [
'duplicate' => 'Duplicar',
'duplicate_heading' => 'Duplicar este registro',
'duplicated' => 'Duplicado. Ponle un slug y una fecha antes de publicarlo.',
],
'preview' => [
'label' => 'Vista previa',
'heading' => 'Enlaces de vista previa',
'hint' => 'Se pueden compartir y caducan en :hours horas. Cada uno sirve solo para este registro.',
'open' => 'Abrir',
],
'trash' => [
'title' => 'Papelera',
'subheading' => 'Todo lo borrado, junto, con el botón de deshacer al lado.',
'empty' => 'La papelera está vacía.',
'deleted_at' => 'Borrado :when',
'restore' => 'Recuperar',
'erase' => 'Eliminar',
'erase_confirm' => 'Esto no se puede deshacer. ¿Seguro?',
'restored' => 'Recuperado',
'erased' => 'Eliminado definitivamente',
],
'today' => [
'all_clear' => 'No hay nada esperando',
'all_clear_hint' => 'Ni gente sin respuesta ni contenido a medias.',
],
'widgets' => [
'stats' => [
'pages' => 'Páginas',
'published' => 'Publicadas',
'users' => 'Usuarios activos',
'missing_translations' => 'Sin traducir',
'missing_translations_hint' => 'Páginas que faltan en algún idioma',
'projects' => 'Proyectos',
'projects_description' => 'Proyectos publicados',
'active_projects' => 'Proyectos en marcha',
'active_projects_description' => 'Buscando quien colabore',
'members' => 'Miembros',
'members_description' => 'Gente activa en el colectivo',
'open_calls' => 'Convocatorias abiertas',
'open_calls_description' => 'Buscando participantes',
'good_first_issues' => 'Tareas para empezar',
'good_first_issues_description' => 'Libres para cogerlas',
'help_wanted' => 'Se busca ayuda',
'help_wanted_description' => 'Issues abiertas',
],
'growth_chart' => 'Crecimiento en el tiempo',
'growth' => [
'projects' => 'Proyectos',
'members' => 'Miembros',
'issues' => 'Tareas para empezar',
],
'languages_chart' => 'Reparto de lenguajes',
'languages' => [
'repositories' => 'Repositorios',
],
],
'projects' => [
'label' => 'Proyecto',
'plural' => 'Proyectos',
'sections' => [
'content' => 'Contenido',
'writeup' => 'Decisiones y postmortem',
'writeup_hint' => 'Lo que una consultora no puede publicar y vosotros sí. Es el contenido que otros desarrolladores leen de verdad.',
'details' => 'Detalles',
],
'fields' => [
'title' => 'Título',
'slug' => 'Slug',
'tagline' => 'Frase resumen',
'description' => 'Descripción',
'decisions' => 'Decisiones técnicas',
'decisions_hint' => 'Por qué elegisteis lo que elegisteis, y qué descartasteis.',
'postmortem' => 'Postmortem',
'postmortem_hint' => 'Qué salió mal y qué aprendisteis. No hace falta que sea un éxito.',
'status' => 'Estado',
'published_at' => 'Publicado el',
'unpublish_at' => 'Retirar el',
'unpublish_at_hint' => 'Opcional. Al llegar, el proyecto desaparece solo de la web.',
'published_at_hint' => 'Vacío = no visible en la web pública.',
'technologies' => 'Tecnologías',
'lead' => 'Responsable',
'members' => 'Participantes',
'client' => 'Para quién',
'client_hint' => 'La ONG, asociación o entidad destinataria. Si no está en la lista, puedes crearla aquí mismo.',
'services' => 'Servicios',
'demo_url' => 'Demo',
'cover_image' => 'Imagen de portada',
'cover_image_alt' => 'Texto alternativo',
'cover_image_alt_hint' => 'Qué se ve en la portada, para quien no puede verla. Si es puramente decorativa, déjalo vacío.',
'started_at' => 'Inicio',
'ended_at' => 'Fin',
'is_featured' => 'Destacado',
'needs_help' => 'Busca gente',
'needs_help_hint' => 'Lo muestra en la sección de colaboración de la web.',
],
'filters' => ['unpublished' => 'Sin publicar'],
'actions' => ['publish' => 'Publicar'],
],
'members' => [
'label' => 'Miembro',
'plural' => 'Miembros',
'sections' => [
'profile' => 'Perfil público',
'profile_hint' => 'Es el escaparate personal de cada uno: la moneda con la que se paga el trabajo voluntario.',
'membership' => 'Pertenencia',
],
'fields' => [
'name' => 'Nombre',
'slug' => 'Slug',
'headline' => 'Titular',
'bio' => 'Biografía',
'avatar' => 'Foto',
'avatar_hint' => 'El texto alternativo es el nombre de la persona, así que no hay que escribirlo.',
'github_username' => 'Usuario de GitHub',
'user' => 'Cuenta del panel',
'user_hint' => 'Opcional. La mayoría de miembros no necesita acceso al admin.',
'technologies' => 'Tecnologías',
'projects' => 'Proyectos',
'is_public' => 'Visible en la web',
'is_founder' => 'Fundador/a',
'position' => 'Orden',
'joined_at' => 'Se unió',
'left_at' => 'Se fue',
'left_at_hint' => 'Sale del listado actual pero conserva su historial.',
],
'filters' => ['current' => 'Solo actuales'],
],
'technologies' => [
'label' => 'Tecnología',
'plural' => 'Tecnologías',
'off_radar' => 'Fuera del radar',
'sections' => ['prose' => 'Descripción y nota del radar'],
'fields' => [
'name' => 'Nombre',
'slug' => 'Slug',
'category' => 'Categoría',
'radar_ring' => 'Anillo del radar',
'radar_ring_hint' => 'Vacío = se puede usar como etiqueta pero no sale en el radar.',
'radar_note' => 'Nota del radar',
'radar_note_hint' => 'Por qué está en ese anillo. Es la parte que la gente lee.',
'description' => 'Descripción',
'color' => 'Color',
'logo' => 'Logo',
'logo_hint' => 'Preferiblemente SVG o PNG con fondo transparente. Sale en el radar y en las fichas.',
'website' => 'Web',
'position' => 'Orden',
'projects' => 'Proyectos',
'members' => 'Miembros',
],
],
'calls' => [
'label' => 'Convocatoria',
'plural' => 'Convocatorias',
'no_project' => 'General',
'sections' => [
'commitment' => 'Compromiso',
'commitment_hint' => 'Lo escaso aquí es el tiempo, no el dinero. Ser concreto es lo que hace que alguien se decida.',
],
'fields' => [
'title' => 'Título',
'slug' => 'Slug',
'description' => 'Descripción',
'what_you_get' => 'Qué te llevas',
'what_you_get_hint' => 'Aprendizaje, portfolio, referencias, mentoría. Decirlo abiertamente suma.',
'status' => 'Estado',
'project' => 'Proyecto',
'project_hint' => 'Vacío = convocatoria general del colectivo.',
'technologies' => 'Tecnologías',
'hours_per_week' => 'Horas por semana',
'duration_weeks' => 'Semanas',
'seniority' => 'Nivel',
'commitment' => 'Dedicación',
'opens_at' => 'Abre',
'closes_at' => 'Cierra',
],
'seniority' => ['any' => 'Cualquiera', 'junior' => 'Junior', 'mid' => 'Intermedio', 'senior' => 'Senior'],
'commitment_summary' => '{0}:hoursh/semana|{1}:hoursh/semana · :weeks semana|[2,*]:hoursh/semana · :weeks semanas',
],
'applications' => [
'label' => 'Solicitud',
'plural' => 'Buzón',
'general_enquiry' => 'Mensaje general',
'badge_tooltip' => 'Personas esperando respuesta',
'saved' => 'Notas guardadas',
'reply_subject' => 'Re: :subject',
'sections' => [
'message' => 'Lo que nos han escrito',
'internal' => 'Seguimiento interno',
'internal_hint' => 'Solo lo veis vosotros. Quien escribió no ve nada de esto.',
],
'fields' => [
'name' => 'Nombre',
'email' => 'Email',
'organisation' => 'Entidad',
'kind' => 'Tipo',
'subject' => 'Sobre',
'call' => 'Convocatoria',
'hours_per_week' => 'Horas/semana',
'hours_asked' => 'La convocatoria pedía :hours h/semana',
'message' => 'Mensaje',
'links' => 'Enlaces',
'link_name' => 'Nombre',
'link_url' => 'URL',
'status' => 'Estado',
'received_at' => 'Recibida',
'handled_by' => 'Atendida por',
'handled_at' => 'Atendida el',
'locale' => 'Escribió en',
'notes' => 'Notas',
'notes_empty' => 'Sin notas',
'notes_hint' => 'Para el resto del equipo: qué habéis hablado, en qué quedó.',
],
'actions' => [
'group' => 'Marcar como',
'open' => 'Abrir solicitud',
'reply' => 'Responder',
'notes' => 'Notas',
'contacted' => 'Contactada',
'accepted' => 'Aceptada',
'declined' => 'Descartada',
'spam' => 'Spam',
],
'tabs' => [
'pending' => 'Sin responder',
'contribute' => 'Quieren ayudar',
'request' => 'Piden ayuda',
'all' => 'Todas',
'spam' => 'Spam',
],
'empty' => [
'heading' => 'No hay nada que responder',
'description' => 'Aquí llega lo que la gente escribe desde la web pública.',
'call_heading' => 'Todavía no ha escrito nadie',
],
'notification' => [
'contribute' => ':name quiere echar una mano',
'request' => ':name pide ayuda para un proyecto',
],
'mail' => [
'greeting' => 'Hay alguien esperando respuesta.',
'from' => 'De :name (:email)',
],
],
'publishing' => [
'published_count' => '{0}No había nada que publicar: ya estaba en la web.|{1}Publicada 1 ficha.|[2,*]Publicadas :count fichas.',
'scheduled' => 'Programada',
'expired' => 'Caducada',
'expired_at' => 'Caducó el :time',
'expires_in' => 'Caduca :time',
'live' => 'En la web',
'unpublished' => 'Sin publicar',
],
'gallery' => [
'title' => 'Galería',
'missing_alt' => 'Sin describir',
'pending' => 'Procesando',
'fields' => [
'image' => 'Imagen',
'alt' => 'Texto alternativo',
'alt_hint' => 'Qué se ve, para quien no puede verlo.',
'caption' => 'Pie de foto',
'caption_hint' => 'Se muestra a todo el mundo. Aquí van los «antes» y «después».',
'size' => 'Tamaño',
],
'actions' => [
'add' => 'Añadir imagen',
],
'empty' => [
'heading' => 'Sin imágenes todavía',
'description' => 'Capturas, antes y después, lo que haga falta para que se entienda el proyecto. Se pueden reordenar arrastrando.',
],
],
'services' => [
'label' => 'Servicio',
'plural' => 'Servicios',
'no_projects' => 'Sin ningún proyecto detrás: es una promesa, no una oferta.',
'sections' => [
'evidence' => 'Lo que lo respalda',
'evidence_hint' => 'Un servicio que no puede señalar trabajo real es una promesa. Enlaza los proyectos que lo demuestran.',
'seo' => 'SEO',
],
'fields' => [
'title' => 'Título',
'slug' => 'Slug',
'tagline' => 'Frase resumen',
'tagline_hint' => 'Una línea. Es lo que se lee en la tarjeta de la portada.',
'description' => 'Descripción',
'projects' => 'Proyectos',
'technologies' => 'Tecnologías',
'icon' => 'Icono',
'icon_hint' => 'Nombre de un icono de Heroicons, por ejemplo heroicon-o-code-bracket.',
'position' => 'Orden',
'is_published' => 'Publicado',
'is_featured' => 'Destacado',
'is_featured_hint' => 'Para que la portada pueda elegir unos pocos.',
'published_at' => 'Publicar el',
'published_at_hint' => 'Con una fecha futura, no sale en la web hasta que llegue.',
'unpublish_at' => 'Retirar el',
'unpublish_at_hint' => 'Opcional. Al llegar, desaparece solo de la web.',
'meta_title' => 'Meta título',
'meta_description' => 'Meta descripción',
'translations' => 'Traducciones',
],
'actions' => [
'publish' => 'Publicar',
],
],
'clients' => [
'label' => 'Cliente',
'plural' => 'Clientes',
'fields' => [
'name' => 'Nombre',
'slug' => 'Slug',
'sector' => 'Sector',
'logo' => 'Logo',
'logo_hint' => 'Preferiblemente en SVG o PNG con fondo transparente.',
'url' => 'Web',
'projects' => 'Proyectos',
'is_public' => 'Se puede mostrar',
'is_public_hint' => 'Desmárcalo si la entidad prefiere no aparecer en la web.',
'position' => 'Orden',
],
'filters' => [
'without_logo' => 'Sin logo',
],
],
'testimonials' => [
'label' => 'Testimonio',
'plural' => 'Testimonios',
'sections' => [
'quote' => 'La cita',
'quote_hint' => 'Escribe en el idioma original lo que dijeron de verdad. Las otras pestañas son traducciones vuestras, y la web lo indicará.',
'author' => 'Quién lo dijo',
'about' => 'De qué habla',
'about_hint' => 'Enlázalo a un cliente, un proyecto o un servicio: así la web pide los que tocan en cada página en vez de tener una lista suelta.',
],
'fields' => [
'quote' => 'Cita',
'original_locale' => 'Idioma original',
'original_locale_hint' => 'En qué idioma lo dijeron. Traducir una cita es ponerle palabras en la boca a alguien, así que la web lo avisa.',
'author_name' => 'Nombre',
'author_role' => 'Cargo',
'avatar' => 'Foto',
'client' => 'Cliente',
'project' => 'Proyecto',
'service' => 'Servicio',
'is_public' => 'Visible',
'position' => 'Orden',
'given_at' => 'Fecha',
],
],
'talks' => [
'label' => 'Charla',
'plural' => 'Charlas',
'fields' => [
'title' => 'Título',
'title_hint' => 'No se traduce: es el nombre de una charla que se dio una vez y en un idioma.',
'language' => 'Idioma',
'summary' => 'Resumen',
'event' => 'Evento',
'city' => 'Ciudad',
'held_at' => 'Fecha',
'video_url' => 'Vídeo',
'slides_url' => 'Diapositivas',
'member' => 'Ponente',
'member_hint' => 'Aparecerá también en su perfil, sin escribirlo dos veces.',
'project' => 'Proyecto',
'is_public' => 'Visible',
],
],
'repositories' => [
'label' => 'Repositorio',
'plural' => 'Repositorios',
'never_synced' => 'Nunca',
'fields' => [
'provider' => 'Proveedor',
'full_name' => 'Repositorio',
'full_name_hint' => 'Formato «owner/repo». Todo lo demás se trae solo.',
'project' => 'Proyecto',
'is_primary' => 'Principal',
'is_primary_hint' => 'El que representa al proyecto cuando hay varios.',
'show_publicly' => 'Visible en la web',
'language' => 'Lenguaje',
'contributors' => 'Contribuidores',
'good_first_issues' => 'Tareas para empezar',
'pushed_at' => 'Último push',
'last_synced_at' => 'Sincronizado',
],
'filters' => ['failing' => 'Con errores', 'dormant' => 'Sin actividad'],
'actions' => ['sync' => 'Sincronizar', 'sync_selected' => 'Sincronizar seleccionados'],
'notifications' => [
'synced' => 'Repositorio sincronizado',
'synced_body' => ':stars★ · :issues tareas para empezar',
'sync_failed' => 'No se pudo sincronizar',
'queued' => ':count repositorios en cola',
],
],
'revisions' => [
'title' => 'Historial',
'system' => 'El sistema',
'before' => 'Antes',
'after' => 'Después',
'no_changes' => 'Esta entrada no registra cambios de campos.',
'restored' => 'Valores restaurados',
'restore_confirm' => 'Se devolverán los campos a como estaban en ese momento. La restauración queda registrada también, así que siempre se puede deshacer.',
'diff_heading' => 'Cambio de :author · :when',
'fields' => [
'event' => 'Qué pasó',
'author' => 'Quién',
'fields' => 'Campos',
'when' => 'Cuándo',
],
'events' => [
'created' => 'Creado',
'updated' => 'Editado',
'published' => 'Publicado',
'unpublished' => 'Despublicado',
'deleted' => 'Borrado',
'restored' => 'Recuperado',
'erased' => 'Eliminado del todo',
],
'actions' => [
'diff' => 'Ver cambio',
'restore' => 'Restaurar estos valores',
],
],
'media' => [
'label' => 'Archivo',
'plural' => 'Medios',
'subheading' => ':count archivos · :size MB en disco, contando las versiones derivadas.',
'pending' => 'Sin procesar',
'in_use' => 'En uso',
'orphan' => 'Sin usar',
'fields' => [
'file' => 'Archivo',
'size' => 'Medidas',
'versions' => 'Versiones',
'weight' => 'Peso',
'used' => 'Uso',
'error' => 'Error',
],
'filters' => [
'pending' => 'Sin procesar',
'failed' => 'Con error',
'orphans' => 'Que no usa nadie',
'missing' => 'Sin archivo en disco',
],
'actions' => [
'open' => 'Abrir',
'reprocess' => 'Reprocesar',
'reprocess_all' => 'Reprocesar todo',
'reprocess_all_hint' => 'Vuelve a generar medidas, versiones y placeholders de todas las imágenes. Es lo que hay que hacer tras cambiar los anchos o añadir un formato.',
'reprocess_queued' => 'Encolado. Se procesa en cuanto corra la cola.',
],
'empty' => [
'heading' => 'Todavía no hay archivos',
'description' => 'Aparecen aquí solos según se suben imágenes en proyectos, páginas, miembros o la vitrina.',
],
],
'redirects' => [
'label' => 'Redirección',
'plural' => 'Redirecciones',
'hint' => 'Rutas tal y como las ve la web, empezando por barra. Al renombrar un slug se crea una sola.',
'every_locale' => 'Todos los idiomas',
'automatic' => 'Automática',
'manual' => 'A mano',
'fields' => [
'from' => 'De',
'from_hint' => 'La dirección que dejó de funcionar.',
'to' => 'A',
'status' => 'Tipo',
'status_hint' => 'Permanente es lo normal: le dice a Google que actualice el enlace.',
'locale' => 'Idioma',
'locale_hint' => 'Déjalo vacío para que valga en los tres.',
'is_enabled' => 'Activa',
'hits' => 'Usos',
'origin' => 'Origen',
],
'statuses' => [
'301' => 'Permanente (301)',
'302' => 'Temporal (302)',
],
'filters' => [
'unused' => 'Sin usar todavía',
],
'empty' => [
'heading' => 'Todavía no hay redirecciones',
'description' => 'Se crean solas al cambiar el slug de algo publicado. Aquí puedes añadir a mano las de enlaces anteriores a esta web.',
],
],
'translations' => [
'filters' => [
'stale' => 'Traducción desactualizada',
],
],
'views' => [
'column' => 'Visitas',
'column_hint' => 'Lecturas de los últimos 30 días, sumando todos los idiomas. Vacío mientras el frontend no las reporte.',
'in_days' => 'en :days días',
'filters' => [
'unread' => 'Publicado y sin visitas',
],
],
'reviews' => [
'title' => 'Revisión',
'column' => 'Revisión',
'waiting' => 'Esperando',
'waiting_for_you' => 'Esperan tu revisión',
'waiting_for_you_hint' => 'Alguien terminó algo y no puede publicarlo.',
'anyone' => 'Cualquiera que pueda publicar',
'requested' => 'Pedida la revisión. Avisamos a quien puede publicarlo.',
'requested_count' => '{0}No había nada que pedir: ya estaba en revisión o publicado.|{1}Pedida la revisión de 1 ficha.|[2,*]Pedida la revisión de :count fichas.',
'returned' => 'Devuelto a quien lo escribió, con tu motivo.',
'fields' => [
'reviewer' => 'Se lo pides a',
'reviewer_hint' => 'Déjalo vacío y lo verá todo el que pueda publicar esto.',
'note' => 'Nota',
'note_hint' => 'Opcional. Lo que quien revise necesita saber antes de mirarlo.',
'reason' => 'Qué hay que cambiar',
'reason_hint' => 'Obligatorio: devolver algo sin decir por qué es lo que hace que nadie use la revisión.',
'event' => 'Qué pasó',
'who' => 'Quién',
'when' => 'Cuándo',
],
'filters' => [
'mine' => 'Esperando mi revisión',
],
'actions' => [
'request' => 'Pedir revisión',
'request_bulk' => 'Pedir revisión (selección)',
'request_heading' => 'Decir que esto ya está',
'request_hint' => 'Tú no puedes publicarlo, así que esto avisa a quien sí puede.',
'return' => 'Devolver',
'return_heading' => 'Devolverlo a quien lo escribió',
'comment' => 'Comentar',
'open' => 'Abrir',
],
'notification' => [
'title' => ':name pide que revises algo',
'returned' => ':name te ha devuelto algo',
],
'empty' => [
'heading' => 'Nada que comentar todavía',
'description' => 'Aquí queda lo que se pidió, lo que se devolvió y por qué. Es lo que el historial de cambios no puede guardar.',
],
],
'missing_urls' => [
'label' => 'URL no encontrada',
'plural' => 'URLs no encontradas',
'linked_from_us' => 'Enlazada desde nuestra propia web',
'no_referrer' => 'Sin procedencia',
'fields' => [
'path' => 'Dirección',
'hits' => 'Visitas',
'locale' => 'Idioma',
'status' => 'Estado',
'referrer' => 'Venían de',
'last_seen' => 'Última vez',
],
'filters' => [
'internal' => 'Enlazadas desde nuestra web',
'repeated' => 'Más de una visita',
],
'actions' => [
'redirect' => 'Crear redirección',
'redirect_heading' => 'Mandar esta dirección a otro sitio',
'redirect_hint' => 'La dirección que falla ya está puesta. Solo hace falta decir a dónde debería llevar.',
'redirected' => 'Redirección creada. Esta dirección deja de dar 404.',
'locale_hint' => 'Viene del idioma en que se pidió. Vacío para que valga en todos.',
'ignore' => 'Ignorar',
'unignore' => 'Dejar de ignorar',
],
'empty' => [
'heading' => 'Nadie se ha topado con un 404',
'description' => 'Aquí aparecen las direcciones que la web no supo resolver, para poder redirigirlas. Las reporta el frontend, así que hace falta configurar SITE_INGEST_TOKEN.',
],
],
'settings' => [
'label' => 'Configuración',
'plural' => 'Configuraciones',
'sections' => [
'general' => 'General',
],
'fields' => [
'key' => 'Clave',
'value' => 'Valor',
'value_hint' => 'El valor tal cual, en JSON. Si no es JSON válido no se guarda.',
],
'actions' => [
'add_setting' => 'Agregar configuración',
'delete_setting' => 'Eliminar configuración',
],
],
'issues' => [
'label' => 'Tarea',
'plural' => 'Tareas',
'sections' => [
'details' => 'Detalles',
'classification' => 'Clasificación',
'metadata' => 'Metadatos',
],
'fields' => [
'number' => 'Número',
'title' => 'Título',
'repository' => 'Repositorio',
'author' => 'Autor',
'assignee' => 'Asignado a',
'assignee_hint' => 'Usuario de GitHub o vacío para marcar sin asignar',
'url' => 'URL',
'is_good_first_issue' => 'Tarea para empezar',
'is_good_first_issue_hint' => 'Recomendada para nuevos colaboradores del proyecto',
'is_help_wanted' => 'Ayuda buscada',
'is_help_wanted_hint' => 'Abierta a contribuciones de la comunidad',
'comments' => 'Comentarios',
'issue_created_at' => 'Creada',
'issue_updated_at' => 'Actualizada',
'labels' => 'Etiquetas',
'unassigned' => 'Sin asignar',
],
'filters' => [
'repository' => 'Repositorio',
'good_first_issue' => 'Tareas para empezar',
'help_wanted' => 'Ayuda buscada',
'unclaimed' => 'Sin asignar',
'claimed' => 'Asignadas',
],
],
];

11
lang/es/passwords.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
return [
'reset' => 'Su contraseña ha sido restablecida.',
'sent' => 'Le hemos enviado por correo electrónico el enlace para restablecer su contraseña.',
'throttled' => 'Por favor espere antes de intentar de nuevo.',
'token' => 'El token de restablecimiento de contraseña es inválido.',
'user' => 'No encontramos ningún usuario con ese correo electrónico.',
];

27
lang/es/pireon.php Normal file
View File

@@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
return [
'sign_in' => 'Entrar',
'sign_in_intro' => 'Accede con tu email y tu contraseña.',
'signing_in' => 'Comprobando tus credenciales…',
'password_grant_disabled' => 'El acceso con contraseña está desactivado en esta instalación. Avisa a un administrador.',
'server_unavailable' => 'El servidor de identidad no está respondiendo. No es cosa de tus credenciales; avisa a un administrador.',
'sign_out' => 'Cerrar sesión',
'denied' => 'No se completó el acceso: :reason',
'inactive' => 'Tu cuenta está desactivada. Contacta con un administrador.',
'pending_approval' => 'Tu registro todavía está pendiente de aprobación por un administrador.',
'no_permission' => 'Tu cuenta no tiene permiso para acceder a este panel. Pídele a un administrador que te asigne un rol.',
'cannot_grant_super_admin' => 'Solo un super administrador puede conceder el rol de super administrador.',
'not_configured_title' => 'El cliente OAuth no está configurado',
'not_configured_body' => 'Registra esta aplicación en :server y rellena PIREON_CLIENT_ID y PIREON_CLIENT_SECRET en el fichero .env.',
'account' => [
'remote_roles' => 'Roles en el servidor de identidad',
'remote_roles_hint' => 'Informativos: los permisos de esta aplicación se gestionan aquí, no en el servidor OAuth.',
'managed_remotely' => 'Este campo se gestiona en :server y se actualiza en cada inicio de sesión.',
],
];

31
lang/es/rules.php Normal file
View File

@@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
return [
'translatable' => [
'type' => 'El campo :attribute debe ser un texto o un objeto de traducciones (idioma => texto).',
'unsupported_locale' => 'El idioma «:locale» no está soportado en :attribute. Idiomas disponibles: :supported.',
'max' => 'La traducción de :attribute en «:locale» no puede superar los :max caracteres.',
'default_required' => 'Falta la traducción de :attribute en el idioma principal («:locale»).',
],
'slug' => [
'unique' => 'El slug «:slug» ya está en uso en el idioma «:locale».',
],
'applications' => [
'attributes' => [
'name' => 'nombre',
'email' => 'email',
'message' => 'mensaje',
'organisation' => 'entidad',
'hours_per_week' => 'horas por semana',
'consent' => 'consentimiento',
],
],
'pages' => [
'cannot_publish' => 'No tienes permiso para publicar páginas.',
],
];

20
lang/es/site.php Normal file
View File

@@ -0,0 +1,20 @@
<?php
declare(strict_types=1);
/*
* Texts the public API returns to the public frontend, in the language the
* visitor is browsing in. They are rendered by the frontend as-is.
*/
return [
'telemetry' => [
'disabled' => 'El reporte de URLs no encontradas está desactivado en este servidor.',
'forbidden' => 'Token de ingesta no válido.',
],
'applications' => [
'received' => 'Hemos recibido tu mensaje. Te contestamos en cuanto podamos.',
'closed' => 'Ahora mismo no estamos aceptando mensajes. Vuelve a intentarlo en un rato.',
],
];

290
lang/es/validation.php Normal file
View File

@@ -0,0 +1,290 @@
<?php
declare(strict_types=1);
return [
'accepted' => 'El campo :attribute debe ser aceptado.',
'accepted_if' => 'El campo :attribute debe ser aceptado cuando :other sea :value.',
'active_url' => 'El campo :attribute debe ser una URL válida.',
'after' => 'El campo :attribute debe ser una fecha posterior a :date.',
'after_or_equal' => 'El campo :attribute debe ser una fecha posterior o igual a :date.',
'alpha' => 'El campo :attribute sólo debe contener letras.',
'alpha_dash' => 'El campo :attribute sólo debe contener letras, números, guiones y guiones bajos.',
'alpha_num' => 'El campo :attribute sólo debe contener letras y números.',
'any_of' => 'El campo :attribute no es válido.',
'array' => 'El campo :attribute debe ser un conjunto.',
'array_keys' => 'El campo :attribute solo debe contener las siguientes claves: :values.',
'ascii' => 'El campo :attribute solo debe contener caracteres alfanuméricos y símbolos de un solo byte.',
'base64' => 'El campo :attribute debe ser una cadena Base64 válida.',
'before' => 'El campo :attribute debe ser una fecha anterior a :date.',
'before_or_equal' => 'El campo :attribute debe ser una fecha anterior o igual a :date.',
'between' => [
'array' => 'El campo :attribute tiene que tener entre :min - :max elementos.',
'file' => 'El campo :attribute debe pesar entre :min - :max kilobytes.',
'numeric' => 'El campo :attribute tiene que estar entre :min - :max.',
'string' => 'El campo :attribute tiene que tener entre :min - :max caracteres.',
],
'boolean' => 'El campo :attribute debe tener un valor verdadero o falso.',
'can' => 'El campo :attribute contiene un valor no autorizado.',
'confirmed' => 'La confirmación de :attribute no coincide.',
'contains' => 'Al campo :attribute le falta un valor obligatorio.',
'current_password' => 'La contraseña es incorrecta.',
'date' => 'El campo :attribute debe ser una fecha válida.',
'date_equals' => 'El campo :attribute debe ser una fecha igual a :date.',
'date_format' => 'El campo :attribute debe coincidir con el formato :format.',
'decimal' => 'El campo :attribute debe tener :decimal cifras decimales.',
'declined' => 'El campo :attribute debe ser rechazado.',
'declined_if' => 'El campo :attribute debe ser rechazado cuando :other sea :value.',
'different' => 'El campo :attribute y :other deben ser diferentes.',
'digits' => 'El campo :attribute debe tener :digits dígitos.',
'digits_between' => 'El campo :attribute debe tener entre :min y :max dígitos.',
'dimensions' => 'El campo :attribute tiene dimensiones de imagen no válidas.',
'distinct' => 'El campo :attribute contiene un valor duplicado.',
'doesnt_contain' => 'El campo :attribute no debe contener ninguno de los siguientes valores: :values.',
'doesnt_end_with' => 'El campo :attribute no debe finalizar con uno de los siguientes: :values.',
'doesnt_start_with' => 'El campo :attribute no debe comenzar con uno de los siguientes: :values.',
'email' => 'El campo :attribute no es un correo válido.',
'encoding' => 'El campo :attribute debe estar codificado en :encoding.',
'ends_with' => 'El campo :attribute debe finalizar con uno de los siguientes valores: :values',
'enum' => 'El campo :attribute no está en la lista de valores permitidos.',
'exists' => 'El campo :attribute no existe.',
'extensions' => 'El campo :attribute debe tener una de las siguientes extensiones: :values.',
'file' => 'El campo :attribute debe ser un archivo.',
'filled' => 'El campo :attribute es obligatorio.',
'gt' => [
'array' => 'El campo :attribute debe tener más de :value elementos.',
'file' => 'El campo :attribute debe tener más de :value kilobytes.',
'numeric' => 'El campo :attribute debe ser mayor que :value.',
'string' => 'El campo :attribute debe tener más de :value caracteres.',
],
'gte' => [
'array' => 'El campo :attribute debe tener como mínimo :value elementos.',
'file' => 'El campo :attribute debe tener como mínimo :value kilobytes.',
'numeric' => 'El campo :attribute debe ser como mínimo :value.',
'string' => 'El campo :attribute debe tener como mínimo :value caracteres.',
],
'hex_color' => 'El campo :attribute debe tener un color hexadecimal válido.',
'image' => 'El campo :attribute debe ser una imagen.',
'in' => 'El campo :attribute no está en la lista de valores permitidos.',
'in_array' => 'El campo :attribute debe existir en :other.',
'in_array_keys' => 'El campo :attribute debe contener al menos una de las siguientes claves: :values.',
'integer' => 'El campo :attribute debe ser un número entero.',
'ip' => 'El campo :attribute debe ser una dirección IP válida.',
'ipv4' => 'El campo :attribute debe ser una dirección IPv4 válida.',
'ipv6' => 'El campo :attribute debe ser una dirección IPv6 válida.',
'json' => 'El campo :attribute debe ser una cadena JSON válida.',
'list' => 'El campo :attribute debe ser una lista.',
'lowercase' => 'El campo :attribute debe estar en minúscula.',
'lt' => [
'array' => 'El campo :attribute debe tener menos de :value elementos.',
'file' => 'El campo :attribute debe tener menos de :value kilobytes.',
'numeric' => 'El campo :attribute debe ser menor que :value.',
'string' => 'El campo :attribute debe tener menos de :value caracteres.',
],
'lte' => [
'array' => 'El campo :attribute debe tener como máximo :value elementos.',
'file' => 'El campo :attribute debe tener como máximo :value kilobytes.',
'numeric' => 'El campo :attribute debe ser como máximo :value.',
'string' => 'El campo :attribute debe tener como máximo :value caracteres.',
],
'mac_address' => 'El campo :attribute debe ser una dirección MAC válida.',
'max' => [
'array' => 'El campo :attribute no debe tener más de :max elementos.',
'file' => 'El campo :attribute no debe ser mayor que :max kilobytes.',
'numeric' => 'El campo :attribute no debe ser mayor que :max.',
'string' => 'El campo :attribute no debe ser mayor que :max caracteres.',
],
'max_digits' => 'El campo :attribute no debe tener más de :max dígitos.',
'mimes' => 'El campo :attribute debe ser un archivo con formato: :values.',
'mimetypes' => 'El campo :attribute debe ser un archivo con formato: :values.',
'min' => [
'array' => 'El campo :attribute debe tener al menos :min elementos.',
'file' => 'El tamaño de :attribute debe ser de al menos :min kilobytes.',
'numeric' => 'El tamaño de :attribute debe ser de al menos :min.',
'string' => 'El campo :attribute debe contener al menos :min caracteres.',
],
'min_digits' => 'El campo :attribute debe tener al menos :min dígitos.',
'missing' => 'El campo :attribute no debe estar presente.',
'missing_if' => 'El campo :attribute no debe estar presente cuando :other sea :value.',
'missing_unless' => 'El campo :attribute no debe estar presente a menos que :other sea :value.',
'missing_with' => 'El campo :attribute no debe estar presente si alguno de los campos :values está presente.',
'missing_with_all' => 'El campo :attribute no debe estar presente cuando los campos :values estén presentes.',
'multiple_of' => 'El campo :attribute debe ser múltiplo de :value',
'not_in' => 'El campo :attribute no debe estar en la lista.',
'not_regex' => 'El formato del campo :attribute no es válido.',
'numeric' => 'El campo :attribute debe ser numérico.',
'password' => [
'letters' => 'La :attribute debe contener al menos una letra.',
'mixed' => 'La :attribute debe contener al menos una letra mayúscula y una minúscula.',
'numbers' => 'La :attribute debe contener al menos un número.',
'symbols' => 'La :attribute debe contener al menos un símbolo.',
'uncompromised' => 'La :attribute proporcionada se ha visto comprometida en una filtración de datos (data leak). Elija una :attribute diferente.',
],
'present' => 'El campo :attribute debe estar presente.',
'present_if' => 'El campo :attribute debe estar presente cuando :other es :value.',
'present_unless' => 'El campo :attribute debe estar presente a menos que :other sea :value.',
'present_with' => 'El campo :attribute debe estar presente cuando :values esté presente.',
'present_with_all' => 'El campo :attribute debe estar presente cuando :values estén presentes.',
'prohibited' => 'El campo :attribute está prohibido.',
'prohibited_if' => 'El campo :attribute está prohibido cuando :other es :value.',
'prohibited_if_accepted' => 'El campo :attribute está prohibido cuando se acepta :other.',
'prohibited_if_declined' => 'El campo :attribute está prohibido cuando se rechaza :other.',
'prohibited_unless' => 'El campo :attribute está prohibido a menos que :other sea :values.',
'prohibits' => 'El campo :attribute prohibe que :other esté presente.',
'regex' => 'El formato del campo :attribute no es válido.',
'required' => 'El campo :attribute es obligatorio.',
'required_array_keys' => 'El campo :attribute debe contener entradas para: :values.',
'required_if' => 'El campo :attribute es obligatorio cuando :other es :value.',
'required_if_accepted' => 'El campo :attribute es obligatorio si :other es aceptado.',
'required_if_declined' => 'El campo :attribute es obligatorio si :other es rechazado.',
'required_unless' => 'El campo :attribute es obligatorio a menos que :other esté en :values.',
'required_with' => 'El campo :attribute es obligatorio cuando :values está presente.',
'required_with_all' => 'El campo :attribute es obligatorio cuando :values están presentes.',
'required_without' => 'El campo :attribute es obligatorio cuando :values no está presente.',
'required_without_all' => 'El campo :attribute es obligatorio cuando ninguno de :values está presente.',
'same' => 'Los campos :attribute y :other deben coincidir.',
'size' => [
'array' => 'El campo :attribute debe contener :size elementos.',
'file' => 'El tamaño de :attribute debe ser :size kilobytes.',
'numeric' => 'El tamaño de :attribute debe ser :size.',
'string' => 'El campo :attribute debe contener :size caracteres.',
],
'starts_with' => 'El campo :attribute debe comenzar con uno de los siguientes valores: :values',
'string' => 'El campo :attribute debe ser una cadena de caracteres.',
'timezone' => 'El campo :attribute debe ser una zona horaria válida.',
'ulid' => 'El campo :attribute debe ser un ULID válido.',
'unique' => 'El campo :attribute ya ha sido registrado.',
'uploaded' => 'Subir :attribute ha fallado.',
'uppercase' => 'El campo :attribute debe estar en mayúscula.',
'url' => 'El campo :attribute debe ser una URL válida.',
'uuid' => 'El campo :attribute debe ser un UUID válido.',
'attributes' => [
'address' => 'dirección',
'affiliate_url' => 'URL de afiliado',
'age' => 'edad',
'amount' => 'cantidad',
'announcement' => 'anuncio',
'area' => 'área',
'audience_prize' => 'premio del público',
'audience_winner' => 'ganador del público',
'available' => 'disponible',
'birthday' => 'cumpleaños',
'body' => 'contenido',
'city' => 'ciudad',
'color' => 'color',
'company' => 'compañía',
'compilation' => 'compilación',
'concept' => 'concepto',
'conditions' => 'condiciones',
'content' => 'contenido',
'contest' => 'concurso',
'country' => 'país',
'cover' => 'portada',
'created_at' => 'creado el',
'creator' => 'creador',
'currency' => 'moneda',
'current_password' => 'contraseña actual',
'customer' => 'cliente',
'date' => 'fecha',
'date_of_birth' => 'fecha de nacimiento',
'dates' => 'fechas',
'day' => 'día',
'deleted_at' => 'eliminado el',
'description' => 'descripción',
'display_type' => 'tipo de visualización',
'district' => 'distrito',
'duration' => 'duración',
'email' => 'correo electrónico',
'excerpt' => 'extracto',
'filter' => 'filtro',
'finished_at' => 'terminado el',
'first_name' => 'nombre',
'gender' => 'género',
'grand_prize' => 'gran Premio',
'group' => 'grupo',
'hour' => 'hora',
'image' => 'imagen',
'image_desktop' => 'imagen de escritorio',
'image_main' => 'imagen principal',
'image_mobile' => 'imagen móvil',
'images' => 'imágenes',
'is_audience_winner' => 'es ganador de audiencia',
'is_hidden' => 'está oculto',
'is_subscribed' => 'está suscrito',
'is_visible' => 'es visible',
'is_winner' => 'es ganador',
'items' => 'elementos',
'key' => 'clave',
'last_name' => 'apellidos',
'lesson' => 'lección',
'line_address_1' => 'línea de dirección 1',
'line_address_2' => 'línea de dirección 2',
'login' => 'acceso',
'message' => 'mensaje',
'middle_name' => 'segundo nombre',
'minute' => 'minuto',
'mobile' => 'móvil',
'month' => 'mes',
'name' => 'nombre',
'national_code' => 'código nacional',
'number' => 'número',
'password' => 'contraseña',
'password_confirmation' => 'confirmación de la contraseña',
'phone' => 'teléfono',
'photo' => 'foto',
'portfolio' => 'portafolio',
'postal_code' => 'código postal',
'preview' => 'vista preliminar',
'price' => 'precio',
'product_id' => 'ID del producto',
'product_uid' => 'UID del producto',
'product_uuid' => 'UUID del producto',
'promo_code' => 'código promocional',
'province' => 'provincia',
'quantity' => 'cantidad',
'reason' => 'razón',
'recaptcha_response_field' => 'respuesta del recaptcha',
'referee' => 'árbitro',
'referees' => 'árbitros',
'region' => 'región',
'reject_reason' => 'motivo de rechazo',
'remember' => 'recordar',
'restored_at' => 'restaurado el',
'result_text_under_image' => 'texto bajo la imagen',
'role' => 'rol',
'rule' => 'regla',
'rules' => 'reglas',
'second' => 'segundo',
'sex' => 'sexo',
'shipment' => 'envío',
'short_text' => 'texto corto',
'size' => 'tamaño',
'skills' => 'habilidades',
'slug' => 'slug',
'specialization' => 'especialización',
'started_at' => 'comenzado el',
'state' => 'estado',
'status' => 'estado',
'street' => 'calle',
'student' => 'estudiante',
'subject' => 'asunto',
'tag' => 'etiqueta',
'tags' => 'etiquetas',
'teacher' => 'profesor',
'terms' => 'términos',
'test_description' => 'descripción de prueba',
'test_locale' => 'idioma de prueba',
'test_name' => 'nombre de prueba',
'text' => 'texto',
'time' => 'hora',
'title' => 'título',
'type' => 'tipo',
'updated_at' => 'actualizado el',
'user' => 'usuario',
'username' => 'usuario',
'value' => 'valor',
'winner' => 'ganador',
'work' => 'trabajo',
'year' => 'año',
],
];