feat(landing): add a live system status indicator to the footer (#641)

Adds /api/status to the landing Pages worker, HEAD-probing demo.snapotter.com and
docs.snapotter.com with a 2 second per-attempt deadline and one retry. snapotter.com is
not probed; the worker answering the request is the proof it is up.

The footer badge ships grey in the static HTML and only upgrades once the route answers.
A rejected fetch, a non-ok response, an unparseable body, and an unrecognized verdict all
leave it grey, so it never claims green on its own.

Color lives in the dot, never the label: `--color-success` scores 4.498:1 against the
footer's `--color-background-alt`, just under AA.

Four labels across 21 locales.
This commit is contained in:
SnapOtter
2026-07-25 20:52:42 +08:00
committed by GitHub
parent d9a8ae7b7e
commit d690a6e26d
48 changed files with 1142 additions and 0 deletions
+3
View File
@@ -2,6 +2,7 @@
// biome-ignore-all lint/correctness/noUnusedImports: Astro template consumes component imports.
// biome-ignore-all lint/correctness/noUnusedVariables: Astro template consumes frontmatter values.
import LanguageSwitcher from "@/components/LanguageSwitcher.astro";
import StatusIndicator from "@/components/StatusIndicator.astro";
import { t } from "@/i18n";
import { enOnlyHref, localizeHref } from "@/lib/i18n-page";
@@ -156,6 +157,8 @@ const columns = [
{t(locale, "footer.copyright", { year })}
</p>
<div class="flex items-center gap-4">
<StatusIndicator locale={locale} />
<span class="hidden h-3 w-px bg-border sm:block" aria-hidden="true"></span>
<p class="text-xs text-muted">
contact@snapotter.com
</p>
@@ -0,0 +1,87 @@
---
// biome-ignore-all lint/correctness/noUnusedVariables: Astro template consumes frontmatter values.
import { t } from "@/i18n";
// Required rather than optional-with-an-"en"-default: an omitted prop would
// typecheck, lint, render, and quietly serve English on all 20 localized page
// trees. LanguageSwitcher, three lines away in the same footer cluster,
// declares locale the same way.
interface Props {
locale: string;
}
const { locale } = Astro.props;
// Every label is resolved server-side and handed to the script, so the client
// never needs a second request or a translation table of its own.
const labels = {
checking: t(locale, "footer.status.checking"),
operational: t(locale, "footer.status.operational"),
partial: t(locale, "footer.status.partial"),
down: t(locale, "footer.status.down"),
};
---
<span
class="flex items-center gap-2 text-xs text-muted"
data-status-indicator
data-status="checking"
title="snapotter.com, demo.snapotter.com, docs.snapotter.com"
>
<span class="status-dot" data-status-dot aria-hidden="true"></span>
<span data-status-label>{labels.checking}</span>
</span>
<style>
/* The dot carries every state color and the label never does. --color-success
is 4.498:1 on --color-background-alt, the footer's background, just under
AA's 4.5. palette-contrast.test.ts does not cover that pair: it checks
success against --color-background, where it passes at 4.967. So the guard
here is the toHaveCSS assertion in tests/e2e-landing/status-indicator.spec.ts,
not the unit test. Adding the pair to the unit test would fail by design,
since success-as-text-on-alt is not a supported combination.
Every state clears WCAG 1.4.11's 3:1 floor for non-text against
--color-background-alt: muted 4.97, success 4.50, primary-ink 4.57,
danger 4.73. */
.status-dot {
width: 6px;
height: 6px;
flex: none;
border-radius: 9999px;
background: var(--color-muted);
}
[data-status="operational"] .status-dot {
background: var(--color-success);
}
[data-status="partial"] .status-dot {
background: var(--color-primary-ink);
}
[data-status="down"] .status-dot {
background: var(--color-danger);
}
</style>
<script is:inline define:vars={{ labels }}>
(() => {
const root = document.querySelector("[data-status-indicator]");
if (!root) return;
fetch("/api/status")
.then((res) => (res.ok ? res.json() : null))
// Route unreachable or body unparseable: stay grey rather than guess.
// Scoped to the fetch alone. A trailing catch would also swallow a DOM
// bug in the handler below and pin the badge on "Checking status" with
// nothing in the console.
.catch(() => null)
.then((data) => {
const status = data?.status ?? "";
// Own properties only. A payload of {"status":"toString"} would
// otherwise resolve up the prototype chain and render the function.
const label = Object.hasOwn(labels, status) ? labels[status] : null;
// An unknown or absent verdict leaves the grey default alone. The badge
// never claims a state nothing told it.
if (!label) return;
root.dataset.status = status;
root.querySelector("[data-status-label]").textContent = label;
});
})();
</script>
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "الرعاة",
"footer.link.terms": "الشروط",
"footer.link.videoTools": "أدوات الفيديو",
"footer.status.checking": "جارٍ التحقق من الحالة",
"footer.status.down": "انقطاع في الخدمة",
"footer.status.operational": "جميع الأنظمة تعمل",
"footer.status.partial": "انقطاع جزئي",
"footer.tagline": "معالجة ملفات ذاتية الاستضافة. ملفاتك، بنيتك التحتية.",
"home.categoryCards.audio.blurb": "حوّل وقُص وانسخ نصيًا",
"home.categoryCards.audio.label": "أدوات الصوت",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "256d93f3139d",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "b017d78ed0a9",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "e5e2ee0d501d",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "d20bd747d369",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "9d7b2ae83bbb",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Sponsoren",
"footer.link.terms": "AGB",
"footer.link.videoTools": "Video-Tools",
"footer.status.checking": "Status wird geprüft",
"footer.status.down": "Betriebsstörung",
"footer.status.operational": "Alle Systeme betriebsbereit",
"footer.status.partial": "Teilweise Störung",
"footer.tagline": "Selbst gehostete Dateiverarbeitung. Deine Dateien, deine Infrastruktur.",
"home.categoryCards.audio.blurb": "Konvertieren, schneiden und transkribieren",
"home.categoryCards.audio.label": "Audio-Tools",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "a502215d5613",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "88b330c6150a",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "04328d48c0a3",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "e40909e11e26",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "0113e86fcbec",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -208,6 +208,10 @@
"terms.contact.title": "Contact",
"terms.contact.pre": "If you have questions about these terms, contact us at",
"footer.tagline": "Self-hosted file processing. Your files, your infrastructure.",
"footer.status.checking": "Checking status",
"footer.status.operational": "All systems operational",
"footer.status.partial": "Partial outage",
"footer.status.down": "Service disruption",
"footer.col.product": "Product",
"footer.col.solutions": "Solutions",
"footer.col.resources": "Resources",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Patrocinadores",
"footer.link.terms": "Términos",
"footer.link.videoTools": "Herramientas de vídeo",
"footer.status.checking": "Comprobando el estado",
"footer.status.down": "Interrupción del servicio",
"footer.status.operational": "Todos los sistemas operativos",
"footer.status.partial": "Interrupción parcial",
"footer.tagline": "Procesamiento de archivos autoalojado. Tus archivos, tu infraestructura.",
"home.categoryCards.audio.blurb": "Convierte, recorta y transcribe",
"home.categoryCards.audio.label": "Herramientas de audio",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "2d072a23e553",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "d32b32586b62",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "c4a2ba37ea1c",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "f27b36cd7197",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "a4f51d3ff14a",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Sponsors",
"footer.link.terms": "Conditions",
"footer.link.videoTools": "Outils vidéo",
"footer.status.checking": "Vérification de l'état",
"footer.status.down": "Interruption de service",
"footer.status.operational": "Tous les systèmes sont opérationnels",
"footer.status.partial": "Panne partielle",
"footer.tagline": "Traitement de fichiers auto-hébergé. Vos fichiers, votre infrastructure.",
"home.categoryCards.audio.blurb": "Convertir, découper et transcrire",
"home.categoryCards.audio.label": "Outils audio",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "79b73471a4c0",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "301797ab5747",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "31fe4322d704",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "d85e9b29c782",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "e3cadcd85e3f",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "स्पॉन्सर",
"footer.link.terms": "नियम",
"footer.link.videoTools": "वीडियो टूल्स",
"footer.status.checking": "स्थिति जाँची जा रही है",
"footer.status.down": "सेवा में व्यवधान",
"footer.status.operational": "सभी सिस्टम चालू हैं",
"footer.status.partial": "आंशिक व्यवधान",
"footer.tagline": "सेल्फ-होस्टेड फ़ाइल प्रोसेसिंग। आपकी फ़ाइलें, आपका इंफ़्रास्ट्रक्चर।",
"home.categoryCards.audio.blurb": "कन्वर्ट करें, ट्रिम करें और ट्रांसक्राइब करें",
"home.categoryCards.audio.label": "ऑडियो टूल्स",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "872b9cdef397",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "cd4ab3cacf37",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "c02bb8cefe76",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "f453462e3c7c",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "7c3d9cf3fd6f",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Sponsor",
"footer.link.terms": "Ketentuan",
"footer.link.videoTools": "Alat Video",
"footer.status.checking": "Memeriksa status",
"footer.status.down": "Gangguan layanan",
"footer.status.operational": "Semua sistem beroperasi",
"footer.status.partial": "Gangguan sebagian",
"footer.tagline": "Pemrosesan file yang di-host sendiri. File Anda, infrastruktur Anda.",
"home.categoryCards.audio.blurb": "Konversi, pangkas, dan transkrip",
"home.categoryCards.audio.label": "Alat Audio",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "dec57d480cf0",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "b73b3dd1f0d2",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "5c5fd19fba20",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "cf6583627ce3",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "31de9dede8be",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Sponsor",
"footer.link.terms": "Termini",
"footer.link.videoTools": "Strumenti per video",
"footer.status.checking": "Verifica dello stato",
"footer.status.down": "Interruzione del servizio",
"footer.status.operational": "Tutti i sistemi operativi",
"footer.status.partial": "Interruzione parziale",
"footer.tagline": "Elaborazione dei file self-hosted. I tuoi file, la tua infrastruttura.",
"home.categoryCards.audio.blurb": "Converti, taglia e trascrivi",
"home.categoryCards.audio.label": "Strumenti per audio",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "33815b0d0dbc",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "2e624449a048",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "1709c7763a02",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "c621b714e7ca",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "3bbdc1feee81",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "スポンサー",
"footer.link.terms": "利用規約",
"footer.link.videoTools": "動画ツール",
"footer.status.checking": "ステータスを確認中",
"footer.status.down": "サービス障害",
"footer.status.operational": "全システム正常稼働中",
"footer.status.partial": "一部システムで障害",
"footer.tagline": "セルフホスト型のファイル処理。あなたのファイルは、あなたのインフラで。",
"home.categoryCards.audio.blurb": "変換、トリミング、文字起こし",
"home.categoryCards.audio.label": "音声ツール",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "4754b9af9b4e",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "993f0f834f79",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "413c8ab1c0d7",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "4be5062794d7",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "2d30a3f815fa",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "후원자",
"footer.link.terms": "약관",
"footer.link.videoTools": "동영상 도구",
"footer.status.checking": "상태 확인 중",
"footer.status.down": "서비스 장애",
"footer.status.operational": "모든 시스템 정상",
"footer.status.partial": "일부 서비스 장애",
"footer.tagline": "셀프 호스팅 파일 처리. 여러분의 파일, 여러분의 인프라.",
"home.categoryCards.audio.blurb": "변환, 자르기, 전사",
"home.categoryCards.audio.label": "오디오 도구",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "d53b28e2d833",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "a8bb5f84b6b3",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "16604bec3746",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "d521ab3858fe",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "8e5fe4c37a54",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Sponsors",
"footer.link.terms": "Voorwaarden",
"footer.link.videoTools": "Videotools",
"footer.status.checking": "Status wordt gecontroleerd",
"footer.status.down": "Servicestoring",
"footer.status.operational": "Alle systemen operationeel",
"footer.status.partial": "Gedeeltelijke storing",
"footer.tagline": "Zelf-gehoste bestandsverwerking. Jouw bestanden, jouw infrastructuur.",
"home.categoryCards.audio.blurb": "Converteren, inkorten en transcriberen",
"home.categoryCards.audio.label": "Audiotools",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "e30f0ffd40ec",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "52cfcddd2d4e",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "3fbde2c6f5e6",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "e3841d8bf881",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "a9a167bcbe19",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Sponsorzy",
"footer.link.terms": "Regulamin",
"footer.link.videoTools": "Narzędzia do wideo",
"footer.status.checking": "Sprawdzanie statusu",
"footer.status.down": "Awaria usługi",
"footer.status.operational": "Wszystkie systemy działają",
"footer.status.partial": "Częściowa awaria",
"footer.tagline": "Samodzielnie hostowane przetwarzanie plików. Twoje pliki, Twoja infrastruktura.",
"home.categoryCards.audio.blurb": "Konwertuj, przycinaj i transkrybuj",
"home.categoryCards.audio.label": "Narzędzia do audio",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "5ccc15b451b7",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "0e518680e1b8",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "7d5f725ae927",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "43f93b3c9ace",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "437c2ddf09be",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Patrocinadores",
"footer.link.terms": "Termos",
"footer.link.videoTools": "Ferramentas de vídeo",
"footer.status.checking": "Verificando o status",
"footer.status.down": "Interrupção do serviço",
"footer.status.operational": "Todos os sistemas operacionais",
"footer.status.partial": "Interrupção parcial",
"footer.tagline": "Processamento de arquivos auto-hospedado. Seus arquivos, sua infraestrutura.",
"home.categoryCards.audio.blurb": "Converta, corte e transcreva",
"home.categoryCards.audio.label": "Ferramentas de áudio",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "fb5f986641d1",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "2f7ec907dc67",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "97b5fe59cd19",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "e7798a36be1c",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "78106a539f55",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Спонсоры",
"footer.link.terms": "Условия",
"footer.link.videoTools": "Инструменты для видео",
"footer.status.checking": "Проверка статуса",
"footer.status.down": "Сбой в работе сервиса",
"footer.status.operational": "Все системы работают",
"footer.status.partial": "Частичный сбой",
"footer.tagline": "Самостоятельно размещаемая обработка файлов. Ваши файлы, ваша инфраструктура.",
"home.categoryCards.audio.blurb": "Конвертируйте, обрезайте и транскрибируйте",
"home.categoryCards.audio.label": "Инструменты для аудио",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "d897071989ce",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "39016fb23fb8",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "92c73257e0d4",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "450b2f632fd3",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "4a6fb635f59f",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Sponsorer",
"footer.link.terms": "Villkor",
"footer.link.videoTools": "Videoverktyg",
"footer.status.checking": "Kontrollerar status",
"footer.status.down": "Driftstörning",
"footer.status.operational": "Alla system fungerar",
"footer.status.partial": "Delvis avbrott",
"footer.tagline": "Självhostad filbearbetning. Dina filer, din infrastruktur.",
"home.categoryCards.audio.blurb": "Konvertera, klipp och transkribera",
"home.categoryCards.audio.label": "Ljudverktyg",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "b970845d98cb",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "39a833f3c2b4",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "2679f3423e08",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "3652b9d5fc4e",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "9ace411742a2",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "ผู้สนับสนุน",
"footer.link.terms": "ข้อกำหนด",
"footer.link.videoTools": "เครื่องมือวิดีโอ",
"footer.status.checking": "กำลังตรวจสอบสถานะ",
"footer.status.down": "บริการขัดข้อง",
"footer.status.operational": "ทุกระบบทำงานปกติ",
"footer.status.partial": "ขัดข้องบางส่วน",
"footer.tagline": "ประมวลผลไฟล์แบบโฮสต์เอง ไฟล์ของคุณ โครงสร้างพื้นฐานของคุณ",
"home.categoryCards.audio.blurb": "แปลง ตัด และถอดเสียง",
"home.categoryCards.audio.label": "เครื่องมือเสียง",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "63b3362278c6",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "69776a79aca8",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "a6eedaa8ff73",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "919c1026fc4b",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "dd6351678012",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Sponsorlar",
"footer.link.terms": "Şartlar",
"footer.link.videoTools": "Video Araçları",
"footer.status.checking": "Durum kontrol ediliyor",
"footer.status.down": "Hizmet kesintisi",
"footer.status.operational": "Tüm sistemler çalışıyor",
"footer.status.partial": "Kısmi kesinti",
"footer.tagline": "Kendi sunucunuzda barındırılan dosya işleme. Sizin dosyalarınız, sizin altyapınız.",
"home.categoryCards.audio.blurb": "Dönüştürün, kırpın ve metne dökün",
"home.categoryCards.audio.label": "Ses Araçları",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "8f4869afbb23",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "08554b73d2d1",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "aa7e604f9977",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "888a893e465b",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "4b7471af08d9",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Спонсори",
"footer.link.terms": "Умови",
"footer.link.videoTools": "Інструменти для відео",
"footer.status.checking": "Перевірка статусу",
"footer.status.down": "Збій у роботі сервісу",
"footer.status.operational": "Усі системи працюють",
"footer.status.partial": "Частковий збій",
"footer.tagline": "Самостійно розгортувана обробка файлів. Ваші файли, ваша інфраструктура.",
"home.categoryCards.audio.blurb": "Конвертуйте, обрізайте та транскрибуйте",
"home.categoryCards.audio.label": "Інструменти для аудіо",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "b92ec9f967d6",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "8ff7d1c7337c",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "fc37b5fabd85",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "d157982d7af2",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "1a89631e7f3b",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "Nhà tài trợ",
"footer.link.terms": "Điều khoản",
"footer.link.videoTools": "Công cụ video",
"footer.status.checking": "Đang kiểm tra trạng thái",
"footer.status.down": "Gián đoạn dịch vụ",
"footer.status.operational": "Tất cả hệ thống bình thường",
"footer.status.partial": "Gián đoạn một phần",
"footer.tagline": "Xử lý tệp tự lưu trữ. Tệp của bạn, hạ tầng của bạn.",
"home.categoryCards.audio.blurb": "Chuyển đổi, cắt và chuyển thành văn bản",
"home.categoryCards.audio.label": "Công cụ âm thanh",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "c9fe04b0df2d",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "49115ffaf18a",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "cae0666ae97d",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "6a09095a95ea",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "bfa234c711e2",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "赞助者",
"footer.link.terms": "条款",
"footer.link.videoTools": "视频工具",
"footer.status.checking": "正在检查状态",
"footer.status.down": "服务中断",
"footer.status.operational": "所有系统运行正常",
"footer.status.partial": "部分服务中断",
"footer.tagline": "自托管的文件处理。你的文件,你的基础设施。",
"home.categoryCards.audio.blurb": "转换、裁剪与转录",
"home.categoryCards.audio.label": "音频工具",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "d2442cb204fa",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "6473ac29f52a",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "45ac29e8d2dd",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "8a35458ed0e1",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "ace2633874b3",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",
+4
View File
@@ -227,6 +227,10 @@
"footer.link.sponsors": "贊助者",
"footer.link.terms": "條款",
"footer.link.videoTools": "影片工具",
"footer.status.checking": "正在檢查狀態",
"footer.status.down": "服務中斷",
"footer.status.operational": "所有系統運作正常",
"footer.status.partial": "部分服務中斷",
"footer.tagline": "自架式檔案處理。你的檔案,你的基礎設施。",
"home.categoryCards.audio.blurb": "轉檔、剪裁與轉錄",
"home.categoryCards.audio.label": "音訊工具",
+24
View File
@@ -1367,6 +1367,30 @@
"outputHash": "562594ac098f",
"stale": false
},
"footer.status.checking": {
"sourceHash": "a4a534f1f446",
"provenance": "machine",
"outputHash": "7cad251fa973",
"stale": false
},
"footer.status.down": {
"sourceHash": "653599e07324",
"provenance": "machine",
"outputHash": "20f1c4908911",
"stale": false
},
"footer.status.operational": {
"sourceHash": "39bd8d494d8d",
"provenance": "machine",
"outputHash": "00e82d2be922",
"stale": false
},
"footer.status.partial": {
"sourceHash": "5b1fb8ceb794",
"provenance": "machine",
"outputHash": "f580bff60ef9",
"stale": false
},
"footer.tagline": {
"sourceHash": "3b1e77c7b8b6",
"provenance": "machine",