feat(i18n): full app + docs localization (de/en)
Build & Push Docker Image / build (push) Successful in 2m33s

- translate remaining pages/components (admin, analytics, redundancy,
  trash, compare, browse, watchlist, admin tools tab, category combobox,
  theme toggle, tool preview card, tool-new/edit) to t() calls
- locales: 453 keys each, parity verified
- docs: bilingual handbook + release notes via *.en.md variants,
  language-aware docs.tsx (markdown paths, nav titles, search index),
  LanguageSwitcher in docs header
- generate-docs: emit per-locale handbook/release/search output,
  localized index.json fields (fileEn/titleEn), en-aware snapshots
This commit is contained in:
opencode
2026-08-04 08:35:05 +02:00
parent a65e2eb92c
commit 3de59ccaaf
77 changed files with 3786 additions and 440 deletions
+282 -6
View File
@@ -53,7 +53,9 @@
"loading": "Wird geladen…",
"all": "Alle",
"none": "Keine",
"language": "Sprache"
"language": "Sprache",
"viewDetails": "Details ansehen",
"guideTooltip": "Anleitung in der Dokumentation"
},
"home": {
"welcome": "Willkommen bei toolr",
@@ -80,6 +82,8 @@
"category": "Kategorie",
"rating": "Bewertung",
"reviews": "Bewertungen",
"reviewCount_one": "{{count}} Bewertung",
"reviewCount_other": "{{count}} Bewertungen",
"noToolsFound": "Keine Tools gefunden",
"noToolsMatch": "Wir konnten keine Tools finden, die zu deinen Filtern passen. Versuche, die Suchkriterien anzupassen, oder füge ein neues Tool hinzu.",
"addTool": "Tool hinzufügen",
@@ -103,7 +107,9 @@
"features": "Funktionen",
"minRating": "Mindestbewertung",
"any": "Beliebig",
"clearFilters": "Filter zurücksetzen"
"clearFilters": "Filter zurücksetzen",
"removeFeature": "Funktion entfernen: {{feature}}",
"removeMinRating": "Mindestbewertung entfernen"
},
"detail": {
"ratingBreakdown": "Bewertungsaufschlüsselung",
@@ -133,7 +139,65 @@
"deleteToTrash": "Dies verschiebt {{name}} in den Papierkorb. Es kann später wiederhergestellt werden.",
"deletePermanent": "Dies entfernt {{name}} dauerhaft inklusive aller Bewertungen. Das kann nicht rückgängig gemacht werden.",
"deleting": "Löschen…",
"deleteAction": "Löschen"
"deleteAction": "Löschen",
"invalidToolId": "Ungültige Tool-ID",
"backToBrowse": "Zurück zur Übersicht",
"keyFeatures": "Wichtige Funktionen",
"toolNotFound": "Tool nicht gefunden.",
"similarTools": "Ähnliche Tools",
"noSimilarTools": "Keine ähnlichen Tools gefunden.",
"linkTool": "Tool verknüpfen",
"linkSimilarTool": "Ähnliches Tool verknüpfen",
"linkSimilarToolSub": "Verknüpfe dieses Tool manuell mit einem anderen Tool.",
"toolId": "Tool-ID",
"toolIdPlaceholder": "Ziel-Tool-ID eingeben",
"relationType": "Beziehungstyp",
"relationSimilar": "Ähnlich",
"relationReplaces": "Ersetzt",
"relationSupersededBy": "Ersetzt durch",
"notesOptional": "Notizen (optional)",
"notesPlaceholder": "Warum sind diese Tools verwandt?",
"createLink": "Verknüpfung erstellen",
"noCostInfo": "Noch keine Kosteninformationen hinzugefügt.",
"costDialogSub": "Verwalte die Lizenzkosteninformationen für dieses Tool.",
"licenseType": "Lizenztyp",
"licenseFree": "Kostenlos",
"licenseSubscription": "Abonnement",
"licenseOneTime": "Einmalig",
"licenseUsageBased": "Nutzungsbasiert",
"billingPeriod": "Abrechnungszeitraum",
"billingMonthly": "Monatlich",
"billingQuarterly": "Quartalsweise",
"billingYearly": "Jährlich",
"costLabel": "Kosten",
"currency": "Währung",
"costNotes": "Notizen",
"costNotesPlaceholder": "Abrechnungsdetails, Vertragsinformationen…",
"commentOptional": "Kommentar (optional)",
"commentLabel": "Kommentar",
"commentPlaceholder": "Was denkst du über dieses Tool?",
"nameOptional": "Name (optional)",
"nameLabel": "Name",
"anonymousPlaceholder": "Anonym",
"anonymousEngineer": "Anonymer Ingenieur",
"beFirstToReview": "Sei der Erste, der seine Gedanken zu diesem Tool teilt.",
"shareExperience": "Teile deine Erfahrung mit {{name}}",
"score": "Punktestand",
"toastRelationCreated": "Beziehung erstellt",
"toastRelationFailed": "Beziehung konnte nicht erstellt werden",
"toastRelationDeleted": "Beziehung gelöscht",
"toastRelationDeleteFailed": "Beziehung konnte nicht gelöscht werden",
"toastCostUpdated": "Kosten aktualisiert",
"toastCostAdded": "Kosten hinzugefügt",
"toastCostFailed": "Kosten konnten nicht gespeichert werden",
"toastCostDeleted": "Kosten gelöscht",
"toastCostDeleteFailed": "Kosten konnten nicht gelöscht werden",
"toastRatingSubmitted": "Bewertung abgesendet",
"toastRatingThanks": "Danke für dein Feedback!",
"toastRatingFailed": "Bewertung konnte nicht abgesendet werden",
"toastToolDeleted": "Tool gelöscht",
"toastDeleteFailed": "Löschen fehlgeschlagen",
"unexpectedError": "Ein unerwarteter Fehler ist aufgetreten."
},
"compare": {
"title": "Tools vergleichen",
@@ -176,7 +240,29 @@
"deletePermanently": "Endgültig löschen",
"emptyTrash": "Papierkorb leeren",
"deletedAt": "Gelöscht am",
"deletedBy": "Gelöscht von"
"deletedBy": "Gelöscht von",
"name": "Name",
"category": "Kategorie",
"actions": "Aktionen",
"selectAll": "Alle auswählen",
"selectName": "{{name}} auswählen",
"restoreAction": "Wiederherstellen",
"deleteAction": "Löschen",
"deleteConfirmTitle": "{{count}} Tool(s) endgültig löschen?",
"deleteConfirmSub": "Dies entfernt die ausgewählten Tools dauerhaft inklusive aller Bewertungen, Kosten und Beziehungen. Das kann nicht rückgängig gemacht werden.",
"emptyConfirmTitle": "Papierkorb leeren?",
"emptyConfirmSub": "Dies entfernt alle {{count}} Tool(s) im Papierkorb dauerhaft inklusive ihrer Bewertungen, Kosten und Beziehungen. Das kann nicht rückgängig gemacht werden.",
"toastRestored": "Tools wiederhergestellt",
"toastRestoredSub": "{{count}} Tool(s) wiederhergestellt.",
"toastRestoreFailed": "Wiederherstellen fehlgeschlagen",
"toastDeleted": "Tools gelöscht",
"toastDeletedSub": "{{count}} Tool(s) endgültig entfernt.",
"toastDeleteFailed": "Löschen fehlgeschlagen",
"toastEmptied": "Papierkorb geleert",
"toastEmptiedSub": "{{count}} Tool(s) endgültig entfernt.",
"toastEmptyFailed": "Papierkorb konnte nicht geleert werden",
"searchPlaceholder": "Tools suchen…",
"toolCount": "{{count}} Tool(s)"
},
"notFound": {
"text": "Diese Seite existiert nicht.",
@@ -209,7 +295,10 @@
"parameter": "Parameter",
"noResults": "Keine Treffer",
"fields": "Felder",
"fieldHelpHint": "Hinweis: Formular-Felder verlinken per ?-Icon direkt zu den jeweiligen Zeilen dieser Tabelle."
"fieldHelpHint": "Hinweis: Formular-Felder verlinken per ?-Icon direkt zu den jeweiligen Zeilen dieser Tabelle.",
"name": "Name",
"in": "In",
"requestBody": "Request-Body"
},
"command": {
"navigate": "Navigation",
@@ -217,5 +306,192 @@
"tools": "Tools",
"noResults": "Keine Tools für „{{query}}“ gefunden.",
"startTyping": "Beginne zu tippen, um Tools zu suchen."
},
"admin": {
"accessRequired": "Admin-Zugriff erforderlich",
"accessRequiredSub": "Du benötigst Admin-Rechte, um diese Seite anzusehen.",
"goHome": "Zur Startseite",
"panel": "Admin-Bereich",
"panelSub": "Benutzer verwalten und Systemänderungen einsehen.",
"redundancyDashboard": "Redundanz-Dashboard",
"tabUsers": "Benutzer",
"tabTools": "Tools",
"tabAudit": "Audit-Log",
"tabSystem": "System",
"localUsers": "Lokale Benutzer",
"localUsersSub": "Konten für die lokale Authentifizierung verwalten.",
"addUser": "Benutzer hinzufügen",
"noUsersYet": "Noch keine Benutzer.",
"auditLog": "Audit-Log",
"auditLogSub": "Alle vom System protokollierten Erstellungs-, Aktualisierungs- und Löschvorgänge.",
"by": "von",
"noAuditEntries": "Noch keine Audit-Einträge.",
"system": "System",
"systemSub": "Build-Informationen der aktuell laufenden Bereitstellung.",
"version": "Version",
"commit": "Commit",
"buildDate": "Build-Datum",
"trashRetention": "Papierkorb-Aufbewahrung",
"days": "Tage",
"keepForever": "Für immer behalten",
"createNewUser": "Neuen Benutzer erstellen",
"username": "Benutzername",
"password": "Passwort",
"emailOptional": "E-Mail (optional)",
"role": "Rolle",
"roleUser": "Benutzer",
"roleAdmin": "Admin",
"plan": "Plan",
"planFree": "Kostenlos",
"planPremium": "Premium",
"planEnterprise": "Enterprise",
"creating": "Erstelle…",
"createUser": "Benutzer erstellen",
"editUser": "Benutzer bearbeiten — {{username}}",
"setPassword": "Passwort festlegen",
"resetsPassword": "Setzt das Passwort des Benutzers sofort zurück.",
"idpManaged": "Das Passwort wird vom Identity-Provider (Keycloak) verwaltet. Setze es dort zurück.",
"setting": "Setze…",
"deleteUser": "Benutzer löschen",
"deleteUserConfirm": "Bist du sicher, dass du {{username}} löschen möchtest? Das kann nicht rückgängig gemacht werden.",
"minPasswordPlaceholder": "min. 6 Zeichen",
"usernamePlaceholder": "benutzername",
"emailPlaceholder": "user@example.com",
"toastUserCreated": "Benutzer erstellt",
"toastUserCreatedSub": "{{username}} wurde erstellt.",
"toastUserCreateFailed": "Benutzer konnte nicht erstellt werden",
"toastUserUpdated": "Benutzer aktualisiert",
"toastUserUpdateFailed": "Benutzer konnte nicht aktualisiert werden",
"toastPwTooShort": "Passwort zu kurz",
"toastPwTooShortSub": "Mindestens 6 Zeichen.",
"toastPwUpdated": "Passwort aktualisiert",
"toastPwUpdatedSub": "Passwort für {{username}} wurde festgelegt.",
"toastPwSetFailed": "Passwort konnte nicht festgelegt werden",
"toastUserDeleted": "Benutzer gelöscht",
"toastUserDeletedSub": "{{username}} wurde entfernt.",
"toastUserDeleteFailed": "Benutzer konnte nicht gelöscht werden"
},
"adminTools": {
"accessRequired": "Admin-Zugriff erforderlich.",
"allTools": "Alle Tools",
"toolCount": "{{count}} Tool(s)",
"selected": "{{count}} ausgewählt",
"searchPlaceholder": "Tools suchen…",
"moveToTrash": "In den Papierkorb verschieben ({{count}})",
"noMatch": "Keine Tools entsprechen deiner Suche.",
"noToolsYet": "Noch keine Tools.",
"selectAll": "Alle auswählen",
"selectName": "{{name}} auswählen",
"name": "Name",
"category": "Kategorie",
"rating": "Bewertung",
"createdBy": "Erstellt von",
"createdAt": "Erstellt am",
"actions": "Aktionen",
"confirmTitle": "{{count}} Tool(s) in den Papierkorb verschieben?",
"confirmSub": "Die ausgewählten Tools werden aus allen öffentlichen Ansichten entfernt und in den Papierkorb verschoben, wo sie wiederhergestellt oder endgültig gelöscht werden können.",
"moveToTrashAction": "In den Papierkorb verschieben",
"toastMoved": "Tools in den Papierkorb verschoben",
"toastMovedSub": "{{count}} Tool(s) in den Papierkorb verschoben.",
"toastMoveFailed": "Verschieben in den Papierkorb fehlgeschlagen"
},
"analytics": {
"title": "Plattform-Analysen",
"subtitle": "Makro-Einblicke in die Leistung der Tools und das Engagement der Community.",
"totalToolsIndexed": "Indexierte Tools gesamt",
"totalRatingsCast": "Abgegebene Bewertungen gesamt",
"activeCategories": "Aktive Kategorien",
"avgGlobalScore": "Ø Globaler Punktestand",
"top8Tools": "Top 8 Tools nach kombiniertem Punktestand",
"top8ToolsSub": "Die bestbewerteten Tools der Plattform",
"toolsByCategory": "Tools nach Kategorie",
"toolsByCategorySub": "Verteilung der Tools auf Kategorien",
"globalRatingDistribution": "Globale Bewertungsverteilung",
"globalRatingDistributionSub": "Wie Benutzer über alle Tools abstimmen",
"radarTools": "Tools"
},
"redundancy": {
"title": "Tool-Analyse & Empfehlungen",
"subtitle": "Automatische Redundanz-Erkennung mit Kosten- und Bewertungsvergleich. Admins können manuell bestätigen, welches Tool die bessere Wahl ist.",
"toolsComparisons": "{{tools}} Tools, {{pairs}} Vergleiche",
"totalMonthly": "/Monat gesamt",
"reviews": "Bewertungen",
"features": "Features",
"comparisonsTitle": "Vergleiche & Empfehlungen",
"vs": "gegen",
"noTools": "Keine Tools gefunden.",
"perMonth": "/Monat",
"toastEvalSaved": "Auswertung gespeichert",
"toastEvalFailed": "Auswertung konnte nicht gespeichert werden"
},
"toolForm": {
"backToBrowse": "Zurück zur Übersicht",
"backToTool": "Zurück zum Tool",
"addTitle": "Neues Tool hinzufügen",
"addSubtitle": "Reiche ein Tool ein, das du nutzt, damit die Community es bewerten kann.",
"editTitle": "Tool bearbeiten",
"editSubtitle": "Aktualisiere Tool-Details und Metadaten.",
"signInRequired": "Anmeldung erforderlich",
"signInRequiredSub": "Du musst angemeldet sein, um ein Tool einzureichen.",
"toolDetails": "Tool-Details",
"toolDetailsNewSub": "Gib die grundlegenden Informationen zum Tool an.",
"toolDetailsEditSub": "Ändere die Tool-Informationen unten.",
"name": "Name",
"nameMin": "Name muss mindestens 2 Zeichen haben",
"category": "Kategorie",
"categoryRequired": "Kategorie ist erforderlich",
"websiteUrl": "Website-URL",
"websiteUrlOptional": "Website-URL (optional)",
"iconUrl": "Icon-/Logo-URL",
"iconUrlOptional": "Icon-/Logo-URL (optional)",
"iconPreview": "Icon-Vorschau",
"description": "Beschreibung",
"descriptionMin": "Beschreibung muss mindestens 10 Zeichen haben",
"invalidUrl": "Muss eine gültige URL sein",
"features": "Features",
"featuresNewSub": "Liste die wichtigsten Funktionen auf. Vorhandene Features anderer Tools sind auswählbar.",
"featuresEditSub": "Wichtige Funktionen dieses Tools. Vorhandene Features anderer Tools sind auswählbar.",
"addFeature": "Feature hinzufügen",
"noFeatures": "Keine Features hinzugefügt.",
"featurePlaceholder": "z. B. Echtzeit-Zusammenarbeit",
"tags": "Tags",
"tagsNewSub": "Schlüsselwörter, um dieses Tool zu finden. Vorhandene Tags anderer Tools sind auswählbar.",
"tagsEditSub": "Schlüsselwörter für dieses Tool. Vorhandene Tags anderer Tools sind auswählbar.",
"addTag": "Tag hinzufügen",
"tag": "Tag",
"namePlaceholder": "z. B. React, Next.js, Postgres",
"urlPlaceholder": "https://…",
"logoPlaceholder": "https://example.com/logo.png",
"descriptionPlaceholderNew": "Was macht dieses Tool? Warum nutzen es Menschen?",
"descriptionPlaceholderEdit": "Was macht dieses Tool?",
"addingTool": "Füge Tool hinzu…",
"submitTool": "Tool einreichen",
"saving": "Speichere…",
"saveChanges": "Änderungen speichern",
"toastAdded": "Tool erfolgreich hinzugefügt",
"toastAddedSub": "Dein Tool ist jetzt zur Bewertung verfügbar.",
"toastAddFailed": "Tool konnte nicht hinzugefügt werden",
"toastUpdated": "Tool aktualisiert",
"toastUpdatedSub": "Änderungen erfolgreich gespeichert.",
"toastUpdateFailed": "Tool konnte nicht aktualisiert werden",
"tagsHelp": "Schlüsselwörter, die helfen, dieses Tool zu finden. Vorhandene Tags anderer Tools sind auswählbar.",
"tagPlaceholder": "Tag"
},
"category": {
"placeholder": "Kategorie auswählen oder eingeben…",
"searchPlaceholder": "Kategorie suchen oder neue eingeben…",
"noCategories": "Keine Kategorien gefunden.",
"knownCategories": "Bekannte Kategorien",
"createNew": "Neu erstellen",
"create": "+ Erstellen"
},
"theme": {
"title": "Design",
"light": "Hell",
"dark": "Dunkel",
"system": "System",
"chooseTitle": "Design auswählen",
"switchLight": "Zum hellen Design wechseln",
"switchDark": "Zum dunklen Design wechseln"
}
}
}