L12 Zeiterfassung: Mobile Uhr-Leiste, Meine Zeiten, Freigaben und Backoffice-Liste

Laufende-Uhr-Leiste auf allen /m-Seiten, Start/Pause direkt auf den Auftragskarten,
Auto-Wechsel-Dialog, Auftragsdetail mit Pause / Für heute beenden / Abschließen-Link
und Segmentwechseln, /m/time (Tagesübersicht, Nachtragen, Korrektur vorschlagen),
/m/approvals für Teamleiter, /work-orders/time-approvals mit Sammelfreigabe,
Zeiten-Tab mit Badges und Inline-Freigabe, Dashboard-Kachel, Texte de/en.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 09:29:38 +02:00
co-authored by Claude Opus 5
parent 0e94eb0d9d
commit fe3eba6e44
42 changed files with 2319 additions and 166 deletions
+148 -6
View File
@@ -5,7 +5,8 @@
"orders": "Aufträge",
"emergency": "Notdienst",
"sync": "Sync",
"profile": "Profil"
"profile": "Profil",
"approvalsBadge": "{count} Zeiten zur Freigabe"
},
"connection": {
"online": "Online",
@@ -35,7 +36,13 @@
"noDate": "Ohne Termin",
"emergency": "Notdienst",
"urgent": "Dringend",
"high": "Hoch"
"high": "Hoch",
"running": "Zeit läuft",
"paused": "Pausiert",
"enRoute": "In Anfahrt",
"startWork": "Arbeit starten",
"pause": "Pause",
"resume": "Weiter"
},
"statusGroup": {
"new": "Neu",
@@ -78,7 +85,17 @@
"saving": "Wird gespeichert …",
"blocked": "Vor dem Abschluss noch offen:",
"reportNext": "Bericht und Unterschrift folgen im nächsten Schritt.",
"nothing": "Keine Aktion erforderlich."
"nothing": "Keine Aktion erforderlich.",
"stop_day": "Für heute beenden",
"confirmStopDay": "Jetzt für heute beenden",
"stopDayHint": "Die Zeiterfassung endet, der Auftrag bleibt offen und kann morgen fortgesetzt werden.",
"completeLink": "Auftrag abschließen …",
"segment": {
"return_travel": "Rückfahrt starten",
"material_procurement": "Material holen",
"work": "Zurück zur Arbeit"
},
"currentSegment": "Aktuell: {type}"
},
"blocker": {
"checklist_item": "Checkliste: {label}",
@@ -264,7 +281,8 @@
"en_route": "In Anfahrt",
"running": "Läuft",
"paused": "Pausiert",
"ended": "Beendet"
"ended": "Beendet",
"manual": "Nachgetragen"
},
"running": "läuft",
"offlineStarted": "offline gestartet",
@@ -277,7 +295,10 @@
"save": "Korrektur speichern",
"saved": "Korrektur gespeichert.",
"empty": "Noch keine Zeiten erfasst.",
"totalWork": "Arbeitszeit gesamt: {duration}"
"totalWork": "Arbeitszeit gesamt: {duration}",
"propose": "Korrektur vorschlagen",
"totalPending": "Zur Freigabe offen: {duration}",
"ownEntryHint": "Eigene Zeiten korrigieren Sie über „Korrektur vorschlagen“."
},
"profile": {
"title": "Profil",
@@ -287,12 +308,133 @@
"roles": "Rolle",
"language": "Sprache",
"logout": "Abmelden",
"backoffice": "Zum Büro-Bereich"
"backoffice": "Zum Büro-Bereich",
"myTime": "Meine Zeiten",
"approvals": "Zeiten freigeben"
},
"sync": {
"title": "Synchronisation",
"immediate": "Änderungen werden sofort an das Büro übertragen.",
"offlineHint": "Ohne Verbindung können Eingaben noch nicht zwischengespeichert werden – die Offline-Warteschlange folgt.",
"status": "Verbindung"
},
"clock": {
"label": "Laufende Zeiterfassung",
"running": "Läuft",
"paused": "Pausiert",
"enRoute": "Anfahrt",
"openOrder": "Auftrag {number} öffnen",
"pause": "Pause",
"resume": "Weiter",
"stopDay": "Für heute beenden",
"stopDayConfirm": "Beenden?",
"myTime": "Meine Zeiten",
"offline": "offline"
},
"switch": {
"title": "Andere Zeiterfassung läuft",
"text": "{from} läuft noch. Pausieren und {to} starten?",
"textUnknown": "Auf einem anderen Auftrag läuft noch eine Zeiterfassung. Pausieren und {to} starten?",
"confirm": "Wechseln",
"cancel": "Abbrechen"
},
"myTime": {
"title": "Meine Zeiten",
"sub": "Ihre Zeiten je Tag über alle Aufträge.",
"today": "Heute",
"yesterday": "Gestern",
"days": "Tag wählen",
"empty": "An diesem Tag sind keine Zeiten erfasst.",
"approved": "Freigegeben",
"pending": "Zur Freigabe",
"dayTotal": "Tagessumme",
"totalApproved": "Freigegeben: {duration}",
"totalPending": "Offen: {duration}",
"add": "Zeit nachtragen",
"running": "läuft",
"badge": {
"manual": "Manuell",
"pending": "Zur Freigabe",
"rejected": "Abgelehnt: {reason}",
"correctionRequested": "Korrektur beantragt",
"correctionRejected": "Korrektur abgelehnt: {reason}",
"corrected": "Korrigiert"
},
"proposed": "Vorschlag: {from}–{to} · {type}",
"localPending": "Wartet auf Übertragung",
"localTitle": "Noch nicht übertragen",
"form": {
"title": "Zeit nachtragen",
"order": "Auftrag",
"orderPlaceholder": "Auftrag wählen",
"noOrders": "Keine Aufträge der letzten 7 Tage verfügbar.",
"forUser": "Für",
"me": "Mich selbst",
"type": "Art",
"date": "Datum",
"mode": "Erfassung",
"modeRange": "Von – Bis",
"modeDuration": "Dauer",
"from": "Von",
"to": "Bis",
"duration": "Dauer in Minuten",
"quick": "{minutes} min",
"reason": "Begründung",
"reasonHint": "Pflichtangabe, mindestens 3 Zeichen.",
"note": "Notiz (optional)",
"approvalHint": "Wird nach Freigabe durch Teamleiter oder Büro gezählt.",
"directHint": "Für Teammitglieder erfasste Zeiten gelten sofort als freigegeben.",
"save": "Nachtrag speichern",
"saved": "Nachtrag gespeichert – wartet auf Freigabe.",
"savedDirect": "Zeit gespeichert.",
"queued": "Offline gespeichert – wird übertragen, sobald Verbindung besteht.",
"cancel": "Abbrechen"
},
"correction": {
"title": "Korrektur vorschlagen",
"hint": "Bis zur Freigabe gilt die bisherige Zeit.",
"save": "Vorschlag senden",
"saved": "Korrektur beantragt."
},
"reasons": {
"forgotStart": "Start vergessen",
"noNetwork": "Kein Netz",
"recordedLater": "Nachträglich erfasst"
},
"errors": {
"overlap": "Der Zeitraum überschneidet sich mit einer bereits erfassten Zeit.",
"too_old": "Nachtragen ist nur für die letzten 7 Tage möglich.",
"in_future": "Die Zeit darf nicht in der Zukunft liegen.",
"too_long": "Ein Eintrag darf höchstens 16 Stunden lang sein.",
"end_before_start": "Das Ende muss nach dem Beginn liegen.",
"work_order_status": "Für diesen Auftrag können keine Zeiten mehr erfasst werden.",
"not_own_entry": "Sie können nur eigene Zeiten korrigieren.",
"own_entry": "Eigene Zeiten können Sie nicht selbst freigeben.",
"entry_running": "Die Zeit läuft noch."
}
},
"approvals": {
"title": "Zeiten freigeben",
"sub": "Nachträge und Korrekturen Ihres Teams.",
"empty": "Keine offenen Nachträge oder Korrekturen.",
"link": "Zeiten freigeben",
"count": "{count, plural, =0 {Nichts offen} one {# offen} other {# offen}}",
"manual": "Nachtrag",
"correction": "Korrektur",
"reason": "Begründung",
"note": "Notiz",
"old": "Bisher",
"new": "Neu",
"approve": "Freigeben",
"reject": "Ablehnen",
"rejectReason": "Grund der Ablehnung",
"rejectConfirm": "Ablehnung senden",
"cancel": "Abbrechen",
"approved": "Freigegeben.",
"rejected": "Abgelehnt."
},
"pendingTime": {
"report": "Hinweis: {duration} nachgetragene Zeit ist noch nicht freigegeben und fehlt im Bericht.",
"proposals": "Hinweis: {count, plural, one {# Zeitkorrektur wartet} other {# Zeitkorrekturen warten}} auf Freigabe."
}
}