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>
150 lines
8.3 KiB
PHP
150 lines
8.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
return [
|
|
'title' => 'Site health',
|
|
'subheading' => 'What is wrong with the public site and cannot be seen from here.',
|
|
|
|
'all_clear' => 'All clear. Nothing to fix.',
|
|
'problem_summary' => '{1}1 thing to look at|[2,*]:count things to look at',
|
|
'problem_hint' => 'The site lives elsewhere, so these faults do not show up while editing — they show up while visiting.',
|
|
'passing' => '{1}1 check passing|[2,*]:count checks passing',
|
|
'and_more' => 'and :count more',
|
|
'refreshed' => 'Checks refreshed',
|
|
|
|
'severity' => [
|
|
'ok' => 'Fine',
|
|
'warning' => 'Warning',
|
|
'error' => 'Fault',
|
|
],
|
|
|
|
'actions' => [
|
|
'refresh' => 'Check again',
|
|
'go_fix' => 'Go and fix it',
|
|
],
|
|
|
|
'bits' => [
|
|
'description' => 'no meta description',
|
|
'cover' => 'no cover',
|
|
'gallery_image' => 'Gallery image with no description',
|
|
'itself' => 'itself',
|
|
],
|
|
|
|
'checks' => [
|
|
'missing-slugs' => [
|
|
'title' => 'Missing slugs',
|
|
'ok' => 'Everything translated has its slug.',
|
|
'problem' => '{1}1 record is translated into a language but has no slug in it, so its URL in that language either does not exist or 404s.|[2,*]:count records are translated into a language without a slug in it, so those URLs either do not exist or 404.',
|
|
],
|
|
|
|
'duplicate-slugs' => [
|
|
'title' => 'Duplicate slugs',
|
|
'ok' => 'Every URL resolves to a single record.',
|
|
'problem' => '{1}1 slug is repeated within the same language: the API resolves that URL to whichever record it reaches first.|[2,*]:count slugs are repeated within the same language: the API resolves those URLs to whichever record it reaches first.',
|
|
],
|
|
|
|
'broken-images' => [
|
|
'title' => 'Broken images',
|
|
'ok' => 'Every image file is where it should be.',
|
|
'problem' => '{1}1 image the site is publishing no longer exists on disk, or could not be read.|[2,*]:count images the site is publishing no longer exist on disk, or could not be read.',
|
|
],
|
|
|
|
'missing-translations' => [
|
|
'title' => 'Untranslated content',
|
|
'ok' => 'Everything published exists in all three languages.',
|
|
'problem' => '{1}1 published record is missing a translation, so that language of the site goes without it.|[2,*]:count published records are missing a translation, so those languages of the site go without them.',
|
|
],
|
|
|
|
'images-without-alt' => [
|
|
'title' => 'Images with no description',
|
|
'ok' => 'Every published image has alt text.',
|
|
'problem' => '{1}1 published image has no alt text: anyone who cannot see it does not know it is there.|[2,*]:count published images have no alt text: anyone who cannot see them does not know they are there.',
|
|
],
|
|
|
|
'incomplete-seo' => [
|
|
'title' => 'Incomplete entries',
|
|
'ok' => 'Everything published has a description and a cover.',
|
|
'problem' => '{1}1 published record has nothing to show in a search result or when the link is pasted into a chat.|[2,*]:count published records have nothing to show in a search result or when the link is pasted into a chat.',
|
|
],
|
|
|
|
'expired-calls' => [
|
|
'title' => 'Expired calls',
|
|
'ok' => 'No open call is past its closing date.',
|
|
'problem' => '{1}1 call is still marked open with its closing date past. It has already dropped off the site, but it pads the panel\'s counter.|[2,*]:count calls are still marked open with their closing date past. They have already dropped off the site, but they pad the panel\'s counter.',
|
|
],
|
|
|
|
'unanswered-submissions' => [
|
|
'title' => 'People waiting for an answer',
|
|
'ok' => 'Nobody has been waiting more than a week.',
|
|
'problem' => '{1}1 person wrote in over a week ago and still has no answer.|[2,*]:count people wrote in over a week ago and still have no answer.',
|
|
],
|
|
|
|
'stalled-media' => [
|
|
'title' => 'Unprocessed images',
|
|
'ok' => 'No image is waiting to be processed.',
|
|
'problem' => '{1}1 image has been waiting over an hour: most likely neither a queue worker nor the scheduler is running.|[2,*]:count images have been waiting over an hour: most likely neither a queue worker nor the scheduler is running.',
|
|
],
|
|
|
|
'services-without-work' => [
|
|
'title' => 'Services with nothing behind them',
|
|
'ok' => 'Every published service shows real work.',
|
|
'problem' => '{1}1 published service links no published project: that is a promise, not an offer.|[2,*]:count published services link no published project: those are promises, not offers.',
|
|
],
|
|
|
|
'clients-without-logo' => [
|
|
'title' => 'Clients with no logo',
|
|
'ok' => 'Every client on the wall has a logo.',
|
|
'problem' => '{1}1 client appears on the wall of logos without one: a hole that looks like a mistake.|[2,*]:count clients appear on the wall of logos without one: holes that look like mistakes.',
|
|
],
|
|
|
|
'testimonials-missing-original' => [
|
|
'title' => 'Quotes without the original',
|
|
'ok' => 'Every quote carries the words that were actually said.',
|
|
'problem' => '{1}1 testimonial has no quote in the language it was given in: the site is publishing a translation of something nobody can check.|[2,*]:count testimonials have no quote in the language they were given in: the site is publishing translations of things nobody can check.',
|
|
],
|
|
|
|
'talks-without-speaker' => [
|
|
'title' => 'Talks with no speaker',
|
|
'ok' => 'Every talk credits somebody.',
|
|
'problem' => '{1}1 talk does not say who gave it, so it appears on nobody\'s profile.|[2,*]:count talks do not say who gave them, so they appear on nobody\'s profile.',
|
|
],
|
|
|
|
'broken-redirects' => [
|
|
'title' => 'Broken redirects',
|
|
'ok' => 'No redirect loops or chains into another.',
|
|
'problem' => '{1}1 redirect points at itself or at another redirect: the browser loops, or pays an extra hop.|[2,*]:count redirects point at themselves or at another redirect: the browser loops, or pays extra hops.',
|
|
],
|
|
|
|
'redirects-to-nowhere' => [
|
|
'title' => 'Redirects to nowhere',
|
|
'ok' => 'Every redirect lands on a page that exists.',
|
|
'problem' => '{1}1 redirect lands on an address that no longer answers: worse than the 404 it was meant to prevent.|[2,*]:count redirects land on addresses that no longer answer: worse than the 404s they were meant to prevent.',
|
|
],
|
|
|
|
'missing-urls' => [
|
|
'title' => 'Addresses nobody can reach',
|
|
'ok' => 'No broken address is waiting for a redirect.',
|
|
'problem' => '{1}1 address returns 404 and has been asked for more than once: every visitor arriving that way is lost.|[2,*]:count addresses return 404 and have been asked for more than once: every visitor arriving that way is lost.',
|
|
],
|
|
|
|
'stale-reviews' => [
|
|
'title' => 'Reviews nobody answered',
|
|
'ok' => 'Nobody is waiting for a review.',
|
|
'problem' => '{1}1 thing has been waiting for review for over a week: whoever wrote it thinks something is happening.|[2,*]:count things have been waiting for review for over a week: whoever wrote them thinks something is happening.',
|
|
],
|
|
|
|
'stale-translations' => [
|
|
'title' => 'Translations left behind',
|
|
'ok' => 'No translation has fallen behind its original.',
|
|
'problem' => '{1}1 translated record says something its original stopped saying: the translation exists, so nothing else flags it.|[2,*]:count translated records say something their originals stopped saying: the translations exist, so nothing else flags them.',
|
|
],
|
|
|
|
'stale-repositories' => [
|
|
'title' => 'Repositories that will not sync',
|
|
'ok' => 'Every repository is syncing.',
|
|
'problem' => '{1}1 repository has failed several attempts. The site keeps showing its last figures, which are no longer true.|[2,*]:count repositories have failed several attempts. The site keeps showing their last figures, which are no longer true.',
|
|
],
|
|
],
|
|
];
|