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

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.',
],
],
];