diff --git a/frontend/messages/de.json b/frontend/messages/de.json index ea68718a..9f4dc6ba 100644 --- a/frontend/messages/de.json +++ b/frontend/messages/de.json @@ -576,5 +576,33 @@ "mission_control_ready_empty_cta": "Jetzt mitmachen", "mission_control_weekly_pulse": "↑ +{count} diese Woche", "mission_control_blocks_progress": "{texted} / {total} Blöcke", - "mission_control_reviewed_pct": "{pct}% geprüft" + "mission_control_reviewed_pct": "{pct}% geprüft", + "error_tag_not_found": "Dieses Schlagwort wurde nicht gefunden.", + "error_tag_merge_self": "Ein Schlagwort kann nicht mit sich selbst zusammengeführt werden.", + "error_tag_merge_invalid_target": "Das Ziel-Schlagwort ist ein Untergeordnetes des Quell-Schlagworts.", + "admin_tag_tree_label": "Schlagwörter", + "admin_tag_collapse_node": "Einklappen", + "admin_tag_expand_node": "Ausklappen", + "admin_tag_parent_placeholder": "Übergeordnetes Schlagwort suchen …", + "admin_tag_inherited_color": "Farbe wird von {parent} vererbt", + "admin_tag_ancestry_label": "Pfad", + "admin_tag_children_label": "Untergeordnete Schlagwörter", + "admin_tag_children_more": "… und {count} weitere", + "admin_tag_merge_heading": "Zusammenführen", + "admin_tag_merge_description": "Alle Dokumente und untergeordnete Schlagwörter auf ein anderes Schlagwort übertragen und dieses danach löschen.", + "admin_tag_merge_btn": "Mit anderem Schlagwort zusammenführen …", + "admin_tag_merge_target_label": "Ziel-Schlagwort", + "admin_tag_merge_preview_docs": "{count} Dokumente", + "admin_tag_merge_preview_children": "{count} Untergeordnete", + "admin_tag_merge_deleted_after": "wird danach gelöscht", + "admin_tag_merge_confirm_btn": "Jetzt zusammenführen", + "admin_tag_merge_step1": "Schritt 1 von 2", + "admin_tag_merge_step2": "Schritt 2 von 2", + "admin_tag_delete_impact": "{docs} Dokument(e) · {descendants} Untergeordnete", + "admin_tag_delete_only_this": "Nur dieses Schlagwort löschen", + "admin_tag_delete_only_this_sub": "Untergeordnete werden zu {parent} verschoben", + "admin_tag_delete_only_this_sub_root": "Untergeordnete werden zu Root-Schlagwörtern", + "admin_tag_delete_subtree": "Gesamten Teilbaum löschen", + "admin_tag_delete_subtree_warn": "Löscht auch {count} untergeordnete Schlagwörter", + "admin_tag_delete_confirm_heading": "Gib «{name}» zur Bestätigung ein:" } diff --git a/frontend/messages/en.json b/frontend/messages/en.json index 5a91459d..633835f6 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -576,5 +576,33 @@ "mission_control_ready_empty_cta": "Start contributing", "mission_control_weekly_pulse": "↑ +{count} this week", "mission_control_blocks_progress": "{texted} / {total} blocks", - "mission_control_reviewed_pct": "{pct}% reviewed" + "mission_control_reviewed_pct": "{pct}% reviewed", + "error_tag_not_found": "This tag was not found.", + "error_tag_merge_self": "A tag cannot be merged with itself.", + "error_tag_merge_invalid_target": "The target tag is a descendant of the source tag.", + "admin_tag_tree_label": "Tags", + "admin_tag_collapse_node": "Collapse", + "admin_tag_expand_node": "Expand", + "admin_tag_parent_placeholder": "Search parent tag …", + "admin_tag_inherited_color": "Color inherited from {parent}", + "admin_tag_ancestry_label": "Path", + "admin_tag_children_label": "Child Tags", + "admin_tag_children_more": "… and {count} more", + "admin_tag_merge_heading": "Merge", + "admin_tag_merge_description": "Transfer all documents and child tags to another tag, then delete this one.", + "admin_tag_merge_btn": "Merge with another tag …", + "admin_tag_merge_target_label": "Target Tag", + "admin_tag_merge_preview_docs": "{count} documents", + "admin_tag_merge_preview_children": "{count} children", + "admin_tag_merge_deleted_after": "will be deleted after", + "admin_tag_merge_confirm_btn": "Merge now", + "admin_tag_merge_step1": "Step 1 of 2", + "admin_tag_merge_step2": "Step 2 of 2", + "admin_tag_delete_impact": "{docs} document(s) · {descendants} child tags", + "admin_tag_delete_only_this": "Delete only this tag", + "admin_tag_delete_only_this_sub": "Children will be moved to {parent}", + "admin_tag_delete_only_this_sub_root": "Children will become root tags", + "admin_tag_delete_subtree": "Delete entire subtree", + "admin_tag_delete_subtree_warn": "Also deletes {count} child tags", + "admin_tag_delete_confirm_heading": "Type «{name}» to confirm:" } diff --git a/frontend/messages/es.json b/frontend/messages/es.json index d2d09489..fbd52839 100644 --- a/frontend/messages/es.json +++ b/frontend/messages/es.json @@ -576,5 +576,33 @@ "mission_control_ready_empty_cta": "Empezar a colaborar", "mission_control_weekly_pulse": "↑ +{count} esta semana", "mission_control_blocks_progress": "{texted} / {total} bloques", - "mission_control_reviewed_pct": "{pct}% revisado" + "mission_control_reviewed_pct": "{pct}% revisado", + "error_tag_not_found": "Esta etiqueta no fue encontrada.", + "error_tag_merge_self": "Una etiqueta no puede fusionarse consigo misma.", + "error_tag_merge_invalid_target": "La etiqueta de destino es descendiente de la etiqueta de origen.", + "admin_tag_tree_label": "Etiquetas", + "admin_tag_collapse_node": "Colapsar", + "admin_tag_expand_node": "Expandir", + "admin_tag_parent_placeholder": "Buscar etiqueta superior …", + "admin_tag_inherited_color": "Color heredado de {parent}", + "admin_tag_ancestry_label": "Ruta", + "admin_tag_children_label": "Etiquetas subordinadas", + "admin_tag_children_more": "… y {count} más", + "admin_tag_merge_heading": "Fusionar", + "admin_tag_merge_description": "Transferir todos los documentos y etiquetas subordinadas a otra etiqueta y luego eliminar esta.", + "admin_tag_merge_btn": "Fusionar con otra etiqueta …", + "admin_tag_merge_target_label": "Etiqueta de destino", + "admin_tag_merge_preview_docs": "{count} documentos", + "admin_tag_merge_preview_children": "{count} subordinados", + "admin_tag_merge_deleted_after": "se eliminará después", + "admin_tag_merge_confirm_btn": "Fusionar ahora", + "admin_tag_merge_step1": "Paso 1 de 2", + "admin_tag_merge_step2": "Paso 2 de 2", + "admin_tag_delete_impact": "{docs} documento(s) · {descendants} subordinados", + "admin_tag_delete_only_this": "Eliminar solo esta etiqueta", + "admin_tag_delete_only_this_sub": "Las subordinadas se moverán a {parent}", + "admin_tag_delete_only_this_sub_root": "Las subordinadas se convertirán en etiquetas raíz", + "admin_tag_delete_subtree": "Eliminar todo el subárbol", + "admin_tag_delete_subtree_warn": "También elimina {count} etiquetas subordinadas", + "admin_tag_delete_confirm_heading": "Escribe «{name}» para confirmar:" } diff --git a/frontend/src/lib/errors.ts b/frontend/src/lib/errors.ts index f712319c..f3979170 100644 --- a/frontend/src/lib/errors.ts +++ b/frontend/src/lib/errors.ts @@ -29,6 +29,9 @@ export type ErrorCode = | 'TRAINING_ALREADY_RUNNING' | 'INVALID_TAG_COLOR' | 'TAG_CYCLE_DETECTED' + | 'TAG_NOT_FOUND' + | 'TAG_MERGE_SELF' + | 'TAG_MERGE_INVALID_TARGET' | 'UNAUTHORIZED' | 'FORBIDDEN' | 'VALIDATION_ERROR' @@ -106,6 +109,12 @@ export function getErrorMessage(code: ErrorCode | string | undefined): string { return m.error_invalid_tag_color(); case 'TAG_CYCLE_DETECTED': return m.error_tag_cycle_detected(); + case 'TAG_NOT_FOUND': + return m.error_tag_not_found(); + case 'TAG_MERGE_SELF': + return m.error_tag_merge_self(); + case 'TAG_MERGE_INVALID_TARGET': + return m.error_tag_merge_invalid_target(); case 'UNAUTHORIZED': return m.error_unauthorized(); case 'FORBIDDEN':