feat(frontend): add OCR UI components and translations

- ScriptTypeSelect: native select for TYPEWRITER/HANDWRITING_LATIN/KURRENT
- OcrTrigger: wraps script type select + start button + confirmation dialog
- OcrProgress: SSE-based progress display with page counter and progress bar
- Paraglide translations for OCR (de/en/es): script types, trigger labels,
  confirmation dialog, progress messages, error messages
- ErrorCode type + getErrorMessage: OCR_SERVICE_UNAVAILABLE, OCR_JOB_NOT_FOUND,
  OCR_DOCUMENT_NOT_UPLOADED, OCR_PROCESSING_FAILED

All 687 frontend tests pass.

Refs #226

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-04-12 15:36:00 +02:00
parent cf8dc3559f
commit a4651aa317
7 changed files with 239 additions and 3 deletions

View File

@@ -500,5 +500,25 @@
"person_alias_delete_title": "Alias entfernen?",
"person_alias_delete_body": "Dieser Name wird aus der Suche entfernt.",
"person_alias_btn_delete": "Entfernen",
"error_alias_not_found": "Der Namensalias wurde nicht gefunden."
"error_alias_not_found": "Der Namensalias wurde nicht gefunden.",
"error_ocr_service_unavailable": "Der OCR-Dienst ist nicht verfügbar.",
"error_ocr_job_not_found": "Der OCR-Auftrag wurde nicht gefunden.",
"error_ocr_document_not_uploaded": "Das Dokument hat keine Datei — OCR ist nicht möglich.",
"error_ocr_processing_failed": "Die OCR-Verarbeitung ist fehlgeschlagen.",
"ocr_script_type_typewriter": "Schreibmaschine",
"ocr_script_type_handwriting_latin": "Handschrift (lateinisch)",
"ocr_script_type_handwriting_kurrent": "Handschrift (Kurrent/Sütterlin)",
"ocr_trigger_label": "Schrifttyp",
"ocr_trigger_select_placeholder": "Schrifttyp wählen…",
"ocr_trigger_btn": "OCR starten",
"ocr_trigger_btn_disabled": "Bitte wählen Sie einen Schrifttyp",
"ocr_confirm_title": "Vorhandene Transkription ersetzen?",
"ocr_confirm_body": "Alle {count} vorhandenen Blöcke werden gelöscht und durch die OCR-Ergebnisse ersetzt. Diese Aktion kann nicht rückgängig gemacht werden.",
"ocr_confirm_btn": "Ersetzen",
"ocr_progress_heading": "OCR läuft",
"ocr_progress_page": "Seite {current} von {total}",
"ocr_error_heading": "OCR fehlgeschlagen",
"ocr_error_retry": "Erneut versuchen",
"ocr_batch_running": "OCR läuft · {processed} von {total} Dokumente abgeschlossen",
"ocr_batch_done": "OCR abgeschlossen · {processed} erfolgreich · {errors} fehlgeschlagen"
}

View File

@@ -500,5 +500,25 @@
"person_alias_delete_title": "Remove alias?",
"person_alias_delete_body": "This name will be removed from search results.",
"person_alias_btn_delete": "Remove",
"error_alias_not_found": "The name alias was not found."
"error_alias_not_found": "The name alias was not found.",
"error_ocr_service_unavailable": "The OCR service is not available.",
"error_ocr_job_not_found": "The OCR job was not found.",
"error_ocr_document_not_uploaded": "The document has no file — OCR is not possible.",
"error_ocr_processing_failed": "OCR processing failed.",
"ocr_script_type_typewriter": "Typewriter",
"ocr_script_type_handwriting_latin": "Handwriting (Latin)",
"ocr_script_type_handwriting_kurrent": "Handwriting (Kurrent/Sütterlin)",
"ocr_trigger_label": "Script type",
"ocr_trigger_select_placeholder": "Select script type…",
"ocr_trigger_btn": "Start OCR",
"ocr_trigger_btn_disabled": "Please select a script type",
"ocr_confirm_title": "Replace existing transcription?",
"ocr_confirm_body": "All {count} existing blocks will be deleted and replaced with OCR results. This action cannot be undone.",
"ocr_confirm_btn": "Replace",
"ocr_progress_heading": "OCR running",
"ocr_progress_page": "Page {current} of {total}",
"ocr_error_heading": "OCR failed",
"ocr_error_retry": "Try again",
"ocr_batch_running": "OCR running · {processed} of {total} documents complete",
"ocr_batch_done": "OCR complete · {processed} successful · {errors} failed"
}

View File

@@ -500,5 +500,25 @@
"person_alias_delete_title": "Eliminar alias?",
"person_alias_delete_body": "Este nombre se eliminara de los resultados de busqueda.",
"person_alias_btn_delete": "Eliminar",
"error_alias_not_found": "No se encontro el alias de nombre."
"error_alias_not_found": "No se encontro el alias de nombre.",
"error_ocr_service_unavailable": "El servicio OCR no está disponible.",
"error_ocr_job_not_found": "No se encontró el trabajo OCR.",
"error_ocr_document_not_uploaded": "El documento no tiene archivo — OCR no es posible.",
"error_ocr_processing_failed": "El procesamiento OCR ha fallado.",
"ocr_script_type_typewriter": "Máquina de escribir",
"ocr_script_type_handwriting_latin": "Escritura manuscrita (latina)",
"ocr_script_type_handwriting_kurrent": "Escritura manuscrita (Kurrent/Sütterlin)",
"ocr_trigger_label": "Tipo de escritura",
"ocr_trigger_select_placeholder": "Seleccionar tipo de escritura…",
"ocr_trigger_btn": "Iniciar OCR",
"ocr_trigger_btn_disabled": "Por favor seleccione un tipo de escritura",
"ocr_confirm_title": "¿Reemplazar transcripción existente?",
"ocr_confirm_body": "Los {count} bloques existentes serán eliminados y reemplazados con los resultados del OCR. Esta acción no se puede deshacer.",
"ocr_confirm_btn": "Reemplazar",
"ocr_progress_heading": "OCR en curso",
"ocr_progress_page": "Página {current} de {total}",
"ocr_error_heading": "OCR fallido",
"ocr_error_retry": "Intentar de nuevo",
"ocr_batch_running": "OCR en curso · {processed} de {total} documentos completados",
"ocr_batch_done": "OCR completado · {processed} exitosos · {errors} fallidos"
}