Aufräumpunkt k (Spec §31): - Aufbewahrung: services/lotse/retention.ts leert input/output und createdById von AiGeneration-Einträgen älter als AI_GENERATION_RETENTION_DAYS (Default 180), Metadaten bleiben, Audit je Mandant. Queue/Processor ai-retention, täglicher BullMQ-Job-Scheduler beim Start des craftvia-worker. - Kontingent: services/lotse/budget.ts (Tokens ein+aus je Kalendermonat, TenantSettings-Wert vor Env AI_MONTHLY_TOKEN_LIMIT, 0 = unbegrenzt). Lotse-Entwurf und Sprachnotiz-Zusammenfassung → blocked budget_exceeded mit Klartext; Import-Extraktion fällt auf manuelle Erfassung zurück (Hinweis ai_budget_exceeded). /settings/lotse: Kontingent setzen, Verbrauch anzeigen. - scripts/test-betrieb-audit.ts: Audit nach Commit/Rollback/verschachtelt, Merge atomar und in äußerer Transaktion, Audit „read", Aufbewahrung (Frist, Metadaten, Idempotenz, Mandant B), Kontingent (Mandant/Env/Vormonat/unbegrenzt, Rollen, Audit). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
159 lines
6.4 KiB
JSON
159 lines
6.4 KiB
JSON
{
|
||
"name": "Lotse",
|
||
"suggestionBadge": "Suggestion from Lotse – please review",
|
||
"draft": {
|
||
"button": "Prepare report with Lotse",
|
||
"again": "Prepare again",
|
||
"running": "Lotse is preparing the report …",
|
||
"hint": "Lotse drafts a suggestion from notes, voice notes, times, material, photos and checklist. Only what is confirmed goes into the report.",
|
||
"notConfigured": "Lotse is not set up. The office can configure the AI provider.",
|
||
"done": "{count, plural, =0 {No suggestions – data is still missing.} one {# suggestion ready.} other {# suggestions ready.}}",
|
||
"draftedAt": "Prepared on {date}",
|
||
"missingTitle": "Lotse is still missing",
|
||
"unsavedHint": "Save unsaved changes in the report first.",
|
||
"allDecided": "All suggestions have been handled.",
|
||
"reviewedAt": "Suggestion reviewed and confirmed on {date}"
|
||
},
|
||
"suggestion": {
|
||
"current": "Current text",
|
||
"empty": "(empty)",
|
||
"text": "Suggestion",
|
||
"accept": "Accept",
|
||
"discard": "Discard",
|
||
"accepted": "Accepted",
|
||
"discarded": "Discarded"
|
||
},
|
||
"review": {
|
||
"label": "I have reviewed the Lotse suggestion.",
|
||
"hint": "Required before submitting: this report was prepared with Lotse."
|
||
},
|
||
"completeness": {
|
||
"title": "{count, plural, one {# item missing} other {# items missing}}",
|
||
"check": "Let Lotse check",
|
||
"fix": "Complete",
|
||
"fromLotse": "Hint from Lotse",
|
||
"item": {
|
||
"photo_requirement": "Required photo missing: {label}",
|
||
"checklist_item": "Required checklist item open: {label}",
|
||
"material_reason": "Material deviation without reason: {label}",
|
||
"material_unconfirmed": "Planned material not confirmed: {label}",
|
||
"no_work_time": "No working time recorded",
|
||
"no_description": "No description of the work",
|
||
"signature_missing": "Signature missing",
|
||
"lotse_hint": "{text}"
|
||
}
|
||
},
|
||
"voice": {
|
||
"status": {
|
||
"pending": "Transcription running",
|
||
"done": "Transcribed",
|
||
"failed": "Transcription failed",
|
||
"disabled": "No transcription"
|
||
},
|
||
"transcript": "Transcript",
|
||
"noTranscript": "No text yet. Text can be entered manually.",
|
||
"edit": "Edit transcript",
|
||
"cancel": "Cancel",
|
||
"save": "Save transcript",
|
||
"saved": "Transcript saved.",
|
||
"summarize": "Summarise voice note",
|
||
"summarizing": "Lotse is summarising …",
|
||
"summaryTitle": "Summary",
|
||
"adopt": "Save as note",
|
||
"adopted": "Saved as note.",
|
||
"dismiss": "Hide",
|
||
"fromVoice": "from voice note"
|
||
},
|
||
"errors": {
|
||
"generic": "That did not work. Please try again.",
|
||
"not_found": "Not found.",
|
||
"forbidden": "You are not allowed to do this.",
|
||
"disabled": "Lotse is switched off for this business.",
|
||
"not_configured": "Lotse is not set up.",
|
||
"provider_failed": "Lotse is currently unavailable. Please try again later.",
|
||
"not_editable": "The report has been submitted and can no longer be changed.",
|
||
"no_suggestion": "This suggestion has already been handled. Please reload the page.",
|
||
"no_transcript": "The voice note has no text yet.",
|
||
"pending": "The transcription is still running.",
|
||
"conflict": "Changed in the meantime. Please reload the page.",
|
||
"invalid": "Please check your input.",
|
||
"budget_exceeded": "This business has used up its monthly AI allowance. Please write the report yourself or ask the office."
|
||
},
|
||
"settings": {
|
||
"back": "Settings",
|
||
"crumb": "Organisation",
|
||
"title": "Lotse (AI assistant)",
|
||
"sub": "Switch on, form of address and transparency",
|
||
"saved": "Settings saved.",
|
||
"error": "Could not save.",
|
||
"use": "Usage",
|
||
"enabled": "Use Lotse in this business",
|
||
"enabledHint": "Switched off: no report drafts, no summaries, voice notes without transcription.",
|
||
"addressForm": "Lotse form of address",
|
||
"addressFormHint": "Applies consistently to all Lotse texts in this business.",
|
||
"address": {
|
||
"neutral": "Neutral, no form of address",
|
||
"sie": "Formal (Sie)",
|
||
"du": "Informal (du)"
|
||
},
|
||
"save": "Save",
|
||
"budget": "Monthly AI allowance (tokens)",
|
||
"budgetHint": "Empty = platform default ({platform}). 0 = unlimited. Once used up, Lotse prepares nothing until the end of the month.",
|
||
"budgetUnlimited": "unlimited",
|
||
"budgetUsage": "Used since {since}: {used} of {limit}",
|
||
"budgetExceeded": "Allowance used up",
|
||
"dataTitle": "Which data goes where",
|
||
"draftProvider": "Report draft and summary",
|
||
"transcriptionProvider": "Voice note transcription",
|
||
"providerLine": "{provider} · model {model}",
|
||
"transcriptionLine": "Server {host} · model {model}",
|
||
"configured": "set up",
|
||
"notConfigured": "not set up",
|
||
"sentTitle": "Sent",
|
||
"sent": {
|
||
"order": "Work order title, description and scope",
|
||
"notes": "Activity notes and voice note texts",
|
||
"work": "Checklist, material with deviation reasons, photo comments, working times",
|
||
"audio": "For transcription: the audio file of the voice note"
|
||
},
|
||
"notSentTitle": "Not sent",
|
||
"notSent": {
|
||
"contact": "Phone numbers, e-mail addresses and postal addresses (replaced by placeholders)",
|
||
"names": "Names: employees as initials only, contacts and private customers as roles",
|
||
"customer": "Customer name, customer number, photos and signatures"
|
||
},
|
||
"principle": "Lotse suggestions are marked and only applied after confirmation. A prepared report can only be submitted with the confirmation “I have reviewed the suggestion”. The original notes stay unchanged.",
|
||
"protocolLink": "View AI log"
|
||
},
|
||
"protocol": {
|
||
"back": "Lotse settings",
|
||
"crumb": "Organisation · Lotse",
|
||
"title": "AI log",
|
||
"sub": "Every use of Lotse: time, kind, model, tokens, user",
|
||
"empty": "No AI usage yet.",
|
||
"time": "Time",
|
||
"kind": "Kind",
|
||
"model": "Model",
|
||
"tokens": "Tokens (in/out)",
|
||
"user": "User",
|
||
"system": "System",
|
||
"content": "Content",
|
||
"show": "Show",
|
||
"contentTitle": "Data sent and response",
|
||
"input": "Sent to the provider",
|
||
"output": "Response",
|
||
"close": "Close",
|
||
"contentHint": "Only tenant administrators can see contents.",
|
||
"prev": "Previous",
|
||
"next": "Next",
|
||
"pageOf": "Page {page} of {pages}",
|
||
"kinds": {
|
||
"report_draft": "Report draft",
|
||
"voice_summary": "Voice note summary",
|
||
"transcription": "Transcription",
|
||
"import_extraction": "Order import",
|
||
"completeness_check": "Completeness check"
|
||
}
|
||
}
|
||
}
|