feat(i18n): migrate hardcoded German strings to t() across 104 components/pages — AST-based batch with re-parse gate, 423 new de.json keys; tsc clean; vitest failures byte-identical to clean-tree baseline (pre-existing)

This commit is contained in:
Agent Zero
2026-08-27 01:43:06 +02:00
parent 5680179260
commit 4cb5298768
105 changed files with 1204 additions and 459 deletions
+6 -6
View File
@@ -198,7 +198,7 @@ function FreigabenTab() {
<button
onClick={() => setConfirmDelete(row)}
className="p-1 rounded hover:bg-danger-50 text-danger-600"
aria-label="Löschen"
aria-label={t('settingsRechte.löschen')}
>
<Trash2 className="w-4 h-4" />
</button>
@@ -217,7 +217,7 @@ function FreigabenTab() {
return (
<div className="space-y-4">
<Card title="Freigaben Übersicht">
<Card title={t('settingsRechte.freigabenübersicht')}>
<div className="flex gap-4 mb-4">
<div className="w-64">
<Select
@@ -233,7 +233,7 @@ function FreigabenTab() {
<div className="w-64">
<Input
label="Nach Principal suchen"
placeholder="Name oder ID..."
placeholder={t('settingsRechte.nameoderid')}
value={filterPrincipal}
onChange={(e) => setFilterPrincipal(e.target.value)}
/>
@@ -253,7 +253,7 @@ function FreigabenTab() {
open={!!confirmDelete}
onCancel={() => setConfirmDelete(null)}
onConfirm={handleDelete}
title="Berechtigung löschen"
title={t('settingsRechte.berechtigunglöschen')}
message={`Soll die Berechtigung für ${entityTypeMap.get(confirmDelete.entity_type) || confirmDelete.entity_type} wirklich gelöscht werden?`}
confirmLabel={deleting ? 'Wird gelöscht...' : 'Löschen'}
variant="danger"
@@ -325,7 +325,7 @@ function AuditTab() {
return (
<div className="space-y-4">
<Card title="Audit-Log für Berechtigungen">
<Card title={t('settingsRechte.auditlogfürberechtigungen')}>
<Table
columns={columns}
data={data?.items || []}
@@ -384,7 +384,7 @@ export function SettingsRechtePage() {
<h1 className="text-2xl font-bold text-secondary-900">Rechteverwaltung</h1>
<div className="border-b border-secondary-200">
<nav className="flex gap-4" role="tablist" aria-label="Rechteverwaltung Tabs">
<nav className="flex gap-4" role="tablist" aria-label={t('settingsRechte.rechteverwaltungtabs')}>
{tabs.map((tab) => {
const Icon = tab.icon;
return (