diff --git a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts index 252f8806d..3d4098c35 100644 --- a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts @@ -19,6 +19,7 @@ import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-scre import { PermissionsGuard } from '@guards/permissions-guard'; import { Roles } from '@users/roles'; import { IqserAuthGuard } from '@iqser/common-ui/lib/users'; +import { ComponentMappingsScreenComponent } from './screens/component-mappings/component-mappings-screen.component'; const dossierTemplateIdRoutes: IqserRoutes = [ { @@ -76,6 +77,14 @@ const dossierTemplateIdRoutes: IqserRoutes = [ }, loadChildren: () => import('./screens/rules/rules.module').then(m => m.RulesModule), }, + { + path: 'component-mappings', + component: ComponentMappingsScreenComponent, + canActivate: [CompositeRouteGuard], + data: { + routeGuards: [IqserAuthGuard, RedRoleGuard], + }, + }, { path: 'file-attributes', component: BaseDossierTemplateScreenComponent, diff --git a/apps/red-ui/src/app/modules/admin/admin.module.ts b/apps/red-ui/src/app/modules/admin/admin.module.ts index f34a45611..f41dbc11b 100644 --- a/apps/red-ui/src/app/modules/admin/admin.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin.module.ts @@ -57,6 +57,7 @@ import { IqserUsersModule } from '@iqser/common-ui/lib/users'; import { SelectComponent } from '@shared/components/select/select.component'; import { PaginationComponent } from '@common-ui/pagination/pagination.component'; import { AddCloneDossierTemplateDialogComponent } from './dialogs/add-clone-dossier-template-dialog/add-clone-dossier-template-dialog.component'; +import { ComponentMappingsScreenComponent } from './screens/component-mappings/component-mappings-screen.component'; const dialogs = [ AddCloneDossierTemplateDialogComponent, @@ -76,6 +77,7 @@ const screens = [ DigitalSignatureScreenComponent, UserListingScreenComponent, GeneralConfigScreenComponent, + ComponentMappingsScreenComponent, ]; const components = [ diff --git a/apps/red-ui/src/app/modules/admin/screens/component-mappings/add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component.html b/apps/red-ui/src/app/modules/admin/screens/component-mappings/add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component.html new file mode 100644 index 000000000..a43c42fcf --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/component-mappings/add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component.html @@ -0,0 +1,65 @@ +
+
+
+
+
+
+ + +
+ +
+ + {{ data.mapping.version }} +
+
+ +
+ + +
+ +
+
+ + +
+ +
+ + + + + {{ translations[type] | translate }} + + + +
+
+
+ +
+ +
+
+ + +
diff --git a/apps/red-ui/src/app/modules/admin/screens/component-mappings/add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component.scss b/apps/red-ui/src/app/modules/admin/screens/component-mappings/add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component.scss new file mode 100644 index 000000000..56ceac53a --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/component-mappings/add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component.scss @@ -0,0 +1,21 @@ +.row { + display: flex; + margin-top: 14px; + + > *:not(:last-child) { + margin-right: 16px; + } + + .iqser-input-group { + margin-top: 0; + } + + .version { + margin-left: 50px; + + span { + margin-top: 10px; + font-size: 15px; + } + } +} diff --git a/apps/red-ui/src/app/modules/admin/screens/component-mappings/add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component.ts b/apps/red-ui/src/app/modules/admin/screens/component-mappings/add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component.ts new file mode 100644 index 000000000..680565a72 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/component-mappings/add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component.ts @@ -0,0 +1,91 @@ +import { Component, OnInit } from '@angular/core'; +import { CircleButtonComponent, IconButtonComponent, IconButtonTypes, IqserDialogComponent, IqserUploadFileModule } from '@iqser/common-ui'; +import { FileAttributeEncodingTypes, IComponentMapping } from '@red/domain'; +import { FormBuilder, ReactiveFormsModule, UntypedFormGroup, Validators } from '@angular/forms'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgForOf, NgIf } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatDialogClose } from '@angular/material/dialog'; +import { MatOption } from '@angular/material/autocomplete'; +import { MatSelect } from '@angular/material/select'; +import { fileAttributeEncodingTypesTranslations } from '@translations/file-attribute-encoding-types-translations'; +import { firstValueFrom } from 'rxjs'; +import { ComponentMappingsService } from '@services/entity-services/component-mappings.service'; + +interface DialogData { + dossierTemplateId: string; + mapping: IComponentMapping; +} +interface DialogResult { + id: string; + name: string; + file: Blob; + encoding: string; + delimiter: string; +} + +@Component({ + templateUrl: './add-edit-component-mapping-dialog.component.html', + styleUrls: ['./add-edit-component-mapping-dialog.component.scss'], + standalone: true, + imports: [ + TranslateModule, + ReactiveFormsModule, + NgIf, + MatFormFieldModule, + NgForOf, + CircleButtonComponent, + MatDialogClose, + IqserUploadFileModule, + MatOption, + MatSelect, + IconButtonComponent, + ], +}) +export class AddEditComponentMappingDialogComponent + extends IqserDialogComponent + implements OnInit +{ + protected readonly encodingTypeOptions = Object.keys(FileAttributeEncodingTypes); + protected readonly translations = fileAttributeEncodingTypesTranslations; + protected readonly iconButtonTypes = IconButtonTypes; + activeFile: File; + form!: UntypedFormGroup; + + constructor( + private readonly _formBuilder: FormBuilder, + private readonly _componentMappingService: ComponentMappingsService, + ) { + super(); + this.form = this.#getForm(); + } + + async ngOnInit() { + if (this.data.mapping?.fileName) { + this.activeFile = { name: this.data.mapping.fileName } as File; + const fileContent = await firstValueFrom( + this._componentMappingService.getComponentMappingFile(this.data.dossierTemplateId, this.data.mapping.id), + ); + const file = new Blob([fileContent], { type: 'text/csv' }); + this.form.get('file').setValue(file); + this.initialFormValue = this.form.getRawValue(); + } + } + + fileChanged(file: Blob) { + this.form.get('file').setValue(file); + } + + save() { + this.dialogRef.close({ ...this.data.mapping, ...this.form.getRawValue() }); + } + + #getForm(): UntypedFormGroup { + return this._formBuilder.group({ + name: [this.data?.mapping?.name, Validators.required], + file: [null, Validators.required], + encoding: this.encodingTypeOptions.find(e => e === this.data?.mapping?.encoding) ?? this.encodingTypeOptions[0], + delimiter: [this.data?.mapping?.delimiter ?? ',', Validators.required], + }); + } +} diff --git a/apps/red-ui/src/app/modules/admin/screens/component-mappings/component-mappings-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/component-mappings/component-mappings-screen.component.html new file mode 100644 index 000000000..ad4765486 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/component-mappings/component-mappings-screen.component.html @@ -0,0 +1,73 @@ +
+ + +
+
+ + + +
+ + +
+
+
+ + +
+ +
+ +
+
+
+ + +
+
+ {{ entity.name }} +
+ +
+ {{ entity.version }} +
+ +
+
+ + + +
+
+
+
diff --git a/apps/red-ui/src/app/modules/admin/screens/component-mappings/component-mappings-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/component-mappings/component-mappings-screen.component.ts new file mode 100644 index 000000000..966ff36c7 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/component-mappings/component-mappings-screen.component.ts @@ -0,0 +1,92 @@ +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { + ListingComponent, + TableColumnConfig, + listingProvidersFactory, + LoadingService, + IconButtonTypes, + IqserDialog, +} from '@iqser/common-ui'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { defaultColorsTranslations } from '@translations/default-colors-translations'; +import { Roles } from '@users/roles'; +import { getCurrentUser } from '@common-ui/users'; +import { DOSSIER_TEMPLATE_ID, User } from '@red/domain'; +import { ComponentMapping } from '@red/domain'; +import { combineLatest, firstValueFrom } from 'rxjs'; +import { ComponentMappingsService } from '@services/entity-services/component-mappings.service'; +import { map, tap } from 'rxjs/operators'; +import { AddEditComponentMappingDialogComponent } from './add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component'; +import { AdminDialogService } from '../../services/admin-dialog.service'; +import { getParam } from '@common-ui/utils'; + +@Component({ + templateUrl: './component-mappings-screen.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + providers: listingProvidersFactory(ComponentMappingsScreenComponent), +}) +export class ComponentMappingsScreenComponent extends ListingComponent implements OnInit { + tableColumnConfigs: readonly TableColumnConfig[] = [ + { label: _('component-mappings-screen.table-col-names.name'), sortByKey: 'searchKey' }, + { label: _('component-mappings-screen.table-col-names.version') }, + ]; + readonly tableHeaderLabel = _('component-mappings-screen.table-header.title'); + protected readonly context$; + protected readonly currentUser = getCurrentUser(); + protected readonly translations = defaultColorsTranslations; + protected readonly roles = Roles; + protected readonly iconButtonTypes = IconButtonTypes; + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); + + constructor( + private readonly _loadingService: LoadingService, + private readonly _componentMappingService: ComponentMappingsService, + private readonly _iqserDialog: IqserDialog, + private readonly _dialogService: AdminDialogService, + ) { + super(); + this.context$ = this.loadData$(); + } + + loadData$() { + return combineLatest([this._componentMappingService.getComponentMappings(this.#dossierTemplateId)]).pipe( + map(([mappingList]) => mappingList.componentMappingList), + tap(mappings => this.entitiesService.setEntities(mappings)), + ); + } + + ngOnInit() { + this._loadingService.stop(); + } + + async openAddEditComponentMappingDialog(mapping?: ComponentMapping) { + const dialog = this._iqserDialog.openDefault(AddEditComponentMappingDialogComponent, { + data: { + dossierTemplateId: this.#dossierTemplateId, + mapping, + }, + }); + const result = await dialog.result(); + if (result) { + this._loadingService.start(); + const { id, name, encoding, delimiter } = result; + const newMapping = { id, name, encoding, delimiter }; + await firstValueFrom( + this._componentMappingService.createUpdateComponentMapping(this.#dossierTemplateId, newMapping, result.file), + ); + await firstValueFrom(this.loadData$()); + this._loadingService.stop(); + } + } + + openDeleteComponentMappingDialog(entity: ComponentMapping) { + this._dialogService.openDialog('confirm', null, async confirmation => { + if (confirmation) { + this._loadingService.start(); + await firstValueFrom(this._componentMappingService.deleteComponentMapping(this.#dossierTemplateId, entity.id)); + await firstValueFrom(this.loadData$()); + this._loadingService.stop(); + } + }); + } +} diff --git a/apps/red-ui/src/app/modules/admin/screens/general-config/smtp-form/smtp-form.component.ts b/apps/red-ui/src/app/modules/admin/screens/general-config/smtp-form/smtp-form.component.ts index 2514390c9..8cd62c76d 100644 --- a/apps/red-ui/src/app/modules/admin/screens/general-config/smtp-form/smtp-form.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/general-config/smtp-form/smtp-form.component.ts @@ -62,8 +62,12 @@ export class SmtpFormComponent extends BaseFormComponent implements OnInit { async testConnection() { this._loadingService.start(); try { - await firstValueFrom(this._smtpConfigService.testSMTPConfiguration(this.form.getRawValue())); - this._toaster.success(_('general-config-screen.test.success')); + const response = await firstValueFrom(this._smtpConfigService.testSMTPConfiguration(this.form.getRawValue())); + if (!response.adminEmail) { + this._toaster.warning(_('general-config-screen.test.warning'), { params: { recipientEmail: response.recipientEmail } }); + } else { + this._toaster.success(_('general-config-screen.test.success')); + } } catch (e) { this._toaster.error(_('general-config-screen.test.error')); } finally { diff --git a/apps/red-ui/src/app/modules/admin/services/smtp-config.service.ts b/apps/red-ui/src/app/modules/admin/services/smtp-config.service.ts index 40b949acd..fcca71a0a 100644 --- a/apps/red-ui/src/app/modules/admin/services/smtp-config.service.ts +++ b/apps/red-ui/src/app/modules/admin/services/smtp-config.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { GenericService } from '@iqser/common-ui'; -import { ISmtpConfiguration } from '@red/domain'; +import { ISmtpConfiguration, ITextConnectionResponse } from '@red/domain'; @Injectable() export class SmtpConfigService extends GenericService { @@ -12,7 +12,7 @@ export class SmtpConfigService extends GenericService { } testSMTPConfiguration(body: ISmtpConfiguration) { - return this._post(body, `${this._defaultModelPath}/smtp/test`); + return this._post(body, `${this._defaultModelPath}/smtp/test`); } getCurrentSMTPConfiguration() { diff --git a/apps/red-ui/src/app/modules/admin/shared/components/admin-side-nav/admin-side-nav.component.ts b/apps/red-ui/src/app/modules/admin/shared/components/admin-side-nav/admin-side-nav.component.ts index 1d9d63c4a..83620ad86 100644 --- a/apps/red-ui/src/app/modules/admin/shared/components/admin-side-nav/admin-side-nav.component.ts +++ b/apps/red-ui/src/app/modules/admin/shared/components/admin-side-nav/admin-side-nav.component.ts @@ -106,6 +106,11 @@ export class AdminSideNavComponent implements OnInit { (this.isIqserDevMode || this.canAccessRulesInDocumine) && this._permissionsService.has(Roles.rules.read), }, + { + screen: 'component-mappings', + label: _('admin-side-nav.component-mappings'), + show: this.isDocumine, + }, { screen: 'default-colors', label: _('admin-side-nav.default-colors'), diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html index 35e78ad5d..bbd9d8aa2 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html @@ -57,7 +57,7 @@
implements O readonly #archivedDossiersService = inject(ArchivedDossiersService); readonly #dashboardStatsService = inject(DashboardStatsService); readonly #logger = inject(NGXLogger); - readonly #dossierCache = inject(DossiersCacheService); readonly #router = inject(Router); protected readonly _defaultModelPath = 'dossier'; @@ -78,7 +76,6 @@ export class DossiersChangesService extends GenericService implements O } #load(id: string): Observable { - if (!this.#dossierCache.get(id)) return of([]); const queryParams: List = [{ key: 'includeArchived', value: true }]; return super._getOne([id], this._defaultModelPath, queryParams).pipe( map(entity => new Dossier(entity)), diff --git a/apps/red-ui/src/app/services/entity-services/component-mappings.service.ts b/apps/red-ui/src/app/services/entity-services/component-mappings.service.ts new file mode 100644 index 000000000..2aec147d7 --- /dev/null +++ b/apps/red-ui/src/app/services/entity-services/component-mappings.service.ts @@ -0,0 +1,60 @@ +import { Injectable } from '@angular/core'; +import { EntitiesService, QueryParam } from '@iqser/common-ui'; +import { ComponentMapping, IComponentMapping, IComponentMappingList } from '@red/domain'; +import { Observable } from 'rxjs'; +import { HeadersConfiguration, List } from '@common-ui/utils'; + +interface CreateMappingParams { + dossierTemplateId: string; + name: string; + encoding: string; + delimiter: string; +} + +@Injectable({ + providedIn: 'root', +}) +export class ComponentMappingsService extends EntitiesService { + getComponentMappings(dossierTemplateId: string): Observable { + return this._http.get(`/api/dossier-templates/${dossierTemplateId}/component-mappings`); + } + + createUpdateComponentMapping( + dossierTemplateId: string, + componentMapping: Partial, + file: Blob, + ): Observable { + const formParams = new FormData(); + formParams.append('file', file); + + const queryParams: List = [ + { key: 'name', value: componentMapping.name }, + { key: 'encoding', value: componentMapping.encoding }, + { key: 'delimiter', value: componentMapping.delimiter }, + ]; + + if (componentMapping.id) { + return this._http.put( + `/api/dossier-templates/${dossierTemplateId}/component-mappings/${componentMapping.id}`, + formParams, + { + params: this._queryParams(queryParams), + }, + ); + } + + return this._http.post(`/api/dossier-templates/${dossierTemplateId}/component-mappings`, formParams, { + params: this._queryParams(queryParams), + }); + } + + deleteComponentMapping(dossierTemplateId: string, componentMappingId: string) { + return this._http.delete(`/api/dossier-templates/${dossierTemplateId}/component-mappings/${componentMappingId}`); + } + + getComponentMappingFile(dossierTemplateId: string, componentMappingId: string) { + return this._http.get(`/api/dossier-templates/${dossierTemplateId}/component-mappings/${componentMappingId}`, { + responseType: 'text', + }); + } +} diff --git a/apps/red-ui/src/app/users/roles.ts b/apps/red-ui/src/app/users/roles.ts index 2ae41147f..dc7ee3b70 100644 --- a/apps/red-ui/src/app/users/roles.ts +++ b/apps/red-ui/src/app/users/roles.ts @@ -21,6 +21,10 @@ export const Roles = { read: 'red-read-rules', write: 'red-write-rules', }, + componentMappings: { + read: 'red-read-rules', + write: 'red-write-rules', + }, redactions: { write: 'red-add-redaction', readManual: 'red-read-manual-redactions', diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json index 3c5c1bece..929029a6c 100644 --- a/apps/red-ui/src/assets/i18n/redact/de.json +++ b/apps/red-ui/src/assets/i18n/redact/de.json @@ -17,42 +17,42 @@ "save": "Speichern" }, "content": { - "comment": "Comment", - "comment-placeholder": "Add remarks or notes...", + "comment": "Kommentar", + "comment-placeholder": "Bemerkungen oder Notizen hinzufügen...", "selected-text": "Ausgewählter Text:", - "type": "Type", - "type-placeholder": "Select type..." + "type": "Typ", + "type-placeholder": "Typ auswählen..." }, - "title": "Add annotation" + "title": "Annotation hinzufügen" } }, "add-clone-dossier-template": { - "save": "{type, select, clone{Clone} other{Save}}", - "save-and-edit": "{type, select, clone{Clone} other{Save}} and edit", - "title": "{type, select, clone{Clone {dossierTemplateName}} other{Create dossier template}}" + "save": "{type, select, clone{Klonen} other{Speichern}}", + "save-and-edit": "{type, select, clone{Klonen} other{Speichern}} und bearbeiten", + "title": "{type, select, clone{{dossierTemplateName} klonen} other{Dossier-Vorlage erstellen}}" }, "add-dossier-dialog": { "actions": { "save": "Speichern", - "save-and-add-members": "Speichern und Team zusammenstellen" + "save-and-add-members": "Speichern und Team bearbeiten" }, "errors": { - "dossier-already-exists": "Dieser Dossier-Name ist bereits vergeben!", + "dossier-already-exists": "Dossier-Name bereits vorhanden.\n
  • Befindet sich das gleichnamige Dossier im Papierkorb, können Sie es endgültig löschen, um den Namen erneut zu verwenden.
  • \n
  • Ist das gleichnamige Dossier aktiv oder archiviert, verwenden Sie bitte einen anderen Namen.
", "generic": "Dossier konnte nicht gespeichert werden." }, "form": { "description": { "label": "Beschreibung", - "placeholder": "Bitte geben Sie eine Beschreibung ein." + "placeholder": "Beschreibung eingeben" }, "due-date": "Termin", "name": { "label": "Dossier-Name", - "placeholder": "Geben Sie einen Namen ein." + "placeholder": "Namen eingeben" }, "template": { "label": "Dossier-Vorlage", - "placeholder": "Choose dossier template" + "placeholder": "Dossier-Vorlage auswählen" } }, "header-new": "Dossier erstellen", @@ -60,40 +60,57 @@ }, "add-edit-clone-dossier-template": { "error": { - "conflict": "Dossiervorlage konnte nicht erstellt werden: Es existiert bereits eine Dossiervorlage mit demselben Namen." + "conflict": "Es gibt bereits eine Dossier-Vorlage mit dem angegebenen Namen.

Bitte wählen Sie einen anderen Namen." }, "form": { "apply-updates-default": { - "description": "Apply dictionary updates to all dossiers by default", - "heading": "Entity configuration" + "description": "Änderungen am Wörterbuch standardmäßig auf alle Dossiers anwenden", + "heading": "Konfiguration für Entitäten" }, "description": "Beschreibung", "description-placeholder": "Beschreibung eingeben", "hidden-text": { - "description": "Hidden text is invisible to human readers but can be detected and read by software and machines. For example, the OCR output of scanned documents is stored as hidden text.", - "heading": "Hidden elements in redacted documents", - "title": "Keep hidden text" + "description": "Versteckter Text ist für menschliche Leser nicht sichtbar, kann jedoch von Software und Maschinen erkannt und gelesen werden. Der OCR-Output von gescannten Dokumenten wird beispielsweise als versteckter Text gespeichert.", + "heading": "Versteckte Elemente in geschwärzten Dokumenten", + "title": "Versteckten Text beibehalten" }, "image-metadata": { "description": "Images in documents might contain additional information as metadata. This could include the creator, the date or the location of the image.", - "title": "Keep image metadata" + "title": "Bildmetadaten beibehalten" }, "name": "Name der Dossier-Vorlage", "name-placeholder": "Namen eingeben", "overlapping-elements": { "description": "Overlapping elements in the document can potentially contain hidden sensitive information. Removing overlapping elements may result in a bigger file size and an increased processing duration.", - "title": "Keep overlapping elements" + "title": "Überlappende Elemente beibehalten" }, "upload-settings": { - "heading": "Upload settings", - "ocr-by-default": "Automatically perform OCR on document upload", - "remove-watermark": "Remove watermarks before processing OCR" + "heading": "Upload-Einstellungen", + "ocr-by-default": "OCR beim Upload von Dokumenten automatisch durchführen", + "remove-watermark": "Wasserzeichen vor OCR-Verarbeitung entfernen" }, "valid-from": "Gültig ab", "valid-to": "Gültig bis" }, "save": "Dossier-Vorlage speichern" }, + "add-edit-component-mapping": { + "actions": { + "save": "Save mapping" + }, + "dialog": { + "title": "{type, select, add{Add New} edit{Edit} other{}} Component Mapping" + }, + "form": { + "delimiter": "", + "delimiter-placeholder": "", + "encoding-type": "", + "file": "Mapping file", + "name": "Mapping name", + "name-placeholder": "Mapping name", + "version": "Version" + } + }, "add-edit-dossier-attribute": { "error": { "generic": "Attribut konnte nicht gespeichert werden!" @@ -109,47 +126,47 @@ }, "add-edit-dossier-state": { "form": { - "color": "HEX color", + "color": "HEX-Farbcode", "color-placeholder": "#", - "name": "Status name", - "name-placeholder": "Enter name", - "rank": "Rank" + "name": "Name des Status", + "name-placeholder": "Namen eingeben", + "rank": "Rang" }, - "save": "Save state", - "success": "Dossier state {type, select, edit{has been updated} create{creation successful} other{}}.", + "save": "Status speichern", + "success": "Dossier-Status {type, select, edit{wurde aktualisiert} create{wurde erstellt} other{}}.", "title": "{type, select, edit{Edit {name}} create{Create} other{}} dossier state" }, "add-edit-entity": { "form": { - "case-sensitive": "Case-sensitive", + "case-sensitive": "Groß-/Kleinschreibung berücksichtigen", "color": "{type, select, redaction{Redaction} hint{Hint} recommendation{Recommendation} skipped{Skipped redaction} ignored{Ignored hint} other{}} color", "color-placeholder": "#", - "default-reason": "Default reason", + "default-reason": "Standard-Schwärzungsgrund", "default-reason-placeholder": "No default reason", - "description": "Description", - "description-placeholder": "Enter description", - "dossier-dictionary-only": "Dossier dictionary only", + "description": "Beschreibung", + "description-placeholder": "Beschreibung eingeben", + "dossier-dictionary-only": "Nur Dossier-Wörterbuch", "has-dictionary": "Has dictionary", - "hint": "Hint", + "hint": "Hinweis", "manage-entries-in-dictionary-editor-only": "Available in add/edit dialogs", - "name": "Display name", + "name": "Anzeigename", "name-placeholder": "Enter name", "rank": "Rank", "rank-placeholder": "1000", "redaction": "Redaction", "technical-name": "Technical name", - "technical-name-hint": "{type, select, edit{Auto-generated based on the initial display name.} create{Is auto-generates based on the display name and cannot be edited after saving.} other{}}", + "technical-name-hint": "{type, select, edit{Auto-generated based on the initial display name.} create{Is auto-generated based on the display name and cannot be edited after saving.} other{}}", "template-and-dossier-dictionaries": "Template & dossier dictionaries" }, "success": { "create": "Success: Entity created.", - "edit": "Entity updated.

Please note that other users need to refresh their browsers to see your changes." + "edit": "Success: Entity updated.

Please ask the users to refresh the browser to see the changes." } }, "add-edit-file-attribute": { "form": { - "column-header": "CSV-Spaltenüberschrift", - "column-header-placeholder": "Spaltenüberschrift für CSV eingeben", + "column-header": "", + "column-header-placeholder": "", "displayed-disabled": "Die maximale Anzahl angezeigter Attribute ({maxNumber}) wurde erreicht.", "displayedInFileList": "Wird in der Dokumentenliste angezeigt", "filterable": "Filterbar", @@ -161,7 +178,7 @@ "type": "Typ" }, "save": "Attribut speichern", - "title": "{type, select, edit{Edit {name}} create{Add New} other{}} Datei-Attribut" + "title": "" }, "add-edit-justification": { "actions": { @@ -172,11 +189,11 @@ "description": "Beschreibung", "description-placeholder": "Beschreibung eingeben", "name": "Name", - "name-placeholder": "Name eingeben", - "reason": "Rechtliche Grundlage", + "name-placeholder": "Namen eingeben", + "reason": "Rechtsgrundlage", "reason-placeholder": "Rechtsgrundlage eingeben" }, - "title": "{type, select, edit{Edit {name}} create{Add New} other{}} Begründung" + "title": "" }, "add-edit-user": { "actions": { @@ -186,8 +203,8 @@ "save-changes": "Änderungen speichern" }, "error": { - "email-already-used": "Diese E-Mail-Adresse wird bereits von einem anderen Benutzer verwendet!", - "generic": "Benutzer konnte nicht gespeichert werden!" + "email-already-used": "", + "generic": "" }, "form": { "email": "E-Mail", @@ -199,21 +216,21 @@ "title": "{type, select, edit{Benutzer bearbeiten} create{Neuen Benutzer hinzufügen} other{}}" }, "add-entity": { - "save": "Wörterbuch speichern", - "title": "Wörterbuch erstellen" + "save": "Entität speichern", + "title": "Entität erstellen" }, "add-hint": { "dialog": { "actions": { - "cancel": "Cancel", - "save": "Save" + "cancel": "Abbrechen", + "save": "Speichern" }, "content": { - "comment": "Comment", - "comment-placeholder": "Add remarks or notes...", + "comment": "Kommentar", + "comment-placeholder": "Bemerkungen oder Notizen hinzufügen...", "options": { "in-dossier": { - "description": "Add hint in every document in {dossierName}.", + "description": "Hinweis zu jedem Dokument in {dossierName} hinzufügen.", "extraOptionLabel": "Apply to all active and future dossiers", "label": "Add hint in dossier" }, @@ -222,8 +239,8 @@ "label": "Add hint only here" } }, - "selected-text": "Selected text:", - "type": "Type", + "selected-text": "Ausgewählter Text:", + "type": "Typ", "type-placeholder": "Select type..." }, "title": "Add hint" @@ -231,16 +248,17 @@ }, "admin-side-nav": { "audit": "Audit", + "component-mappings": "Component mappings", "component-rule-editor": "", "configurations": "Configurations", "default-colors": "Default colors", - "dictionary": "Dictionary", + "dictionary": "Wörterbuch", "digital-signature": "Digital signature", "dossier-attributes": "Dossier attributes", "dossier-states": "Dossier states", "dossier-template-info": "Info", "dossier-templates": "Dossier-Vorlage", - "entities": "Entities", + "entities": "Entitäten", "entity-info": "Info", "entity-rule-editor": "Entity rule editor", "false-positive": "False positive", @@ -357,6 +375,7 @@ }, "annotation-engines": { "dictionary": "{isHint, select, true{Hint} other{Redaction}} basierend auf Wörterbuch", + "dossier-dictionary": "Based on dossier dictionary", "imported": "Imported", "ner": "Redaktion basierend auf KI", "rule": "Schwärzung basierend auf Regel {rule}" @@ -498,12 +517,14 @@ }, "component-management": { "actions": { - "add": "", - "cancel": "", - "delete": "", - "edit": "", - "save": "", - "undo": "" + "cancel-edit": "Abbrechen", + "close": "Close", + "display-by-default": "Display by default when opening documents", + "edit": "Edit", + "export-json": "Export JSON", + "export-xml": "Export XML", + "save": "Save", + "undo": "Undo to: {value}" }, "components": "", "table-header": { @@ -511,6 +532,24 @@ "value": "" } }, + "component-mappings-screen": { + "action": { + "delete": "Delete mapping", + "edit": "Edit mapping" + }, + "add-new": "New Mapping", + "bulk-actions": { + "delete": "Delete selected mappings" + }, + "search": "Search by name...", + "table-col-names": { + "name": "name", + "version": "version" + }, + "table-header": { + "title": "Component mapping" + } + }, "component-rules-screen": { "error": { "generic": "" @@ -527,7 +566,7 @@ "configurations": "Einstellungen", "confirm-archive-dossier": { "archive": "Archive dossier", - "cancel": "Cancel", + "cancel": "Abbrechen", "checkbox": { "documents": "All documents will be archived and cannot be returned to active status." }, @@ -540,7 +579,7 @@ "cancel": "{count, plural, one{Attribut} other{Attribute}} behalten", "delete": "{count, plural, one{Attribut} other{Attribute}} löschen", "dossier-impacted-documents": "This action will affect all dossiers that use this template.", - "dossier-lost-details": "All attribute values entered by users on document level will be lost.", + "dossier-lost-details": "The attribute values entered by users on document level will be lost.", "file-impacted-documents": "All documents that use {count, plural, one{his attribute} other{these attributes}} will be impacted.", "file-lost-details": "All information entered by users on document level will be lost.", "impacted-report": "{reportsCount}", @@ -549,7 +588,7 @@ "warning": "Achtung: Diese Aktion kann nicht rückgängig gemacht werden!" }, "confirm-delete-dossier-state": { - "cancel": "Cancel", + "cancel": "Abbrechen", "delete": "Delete", "delete-replace": "Delete and replace", "form": { @@ -577,7 +616,7 @@ }, "approve-file-without-analysis": { "confirmationText": "Approve without analysis", - "denyText": "Cancel", + "denyText": "Abbrechen", "question": "Analysis required to detect new redactions.", "title": "Warning!" }, @@ -587,7 +626,7 @@ }, "approve-multiple-files-without-analysis": { "confirmationText": "Approve without analysis", - "denyText": "Cancel", + "denyText": "Abbrechen", "question": "Analysis required to detect new redactions for at least one file.", "title": "Warning" }, @@ -709,7 +748,7 @@ }, "download": "Download current entries", "error": { - "400": "Cannot update dictionary because at least one of the newly added words where recognized as a general term that appear too often in texts.", + "400": "Dictionary update failed.

One or more of the newly added terms have been identified as frequently used general term. Please remove these terms to proceed with the upate. ", "generic": "Es ist ein Fehler aufgetreten ... Das Wörterbuch konnte nicht aktualisiert werden!" }, "revert-changes": "Rückgängig machen", @@ -724,7 +763,7 @@ "digital-signature-dialog": { "actions": { "back": "Back", - "cancel": "Cancel", + "cancel": "Abbrechen", "certificate-not-valid-error": "Uploaded certificate is invalid.", "continue": "Continue", "save": "Save configurations", @@ -751,11 +790,11 @@ }, "options": { "kms": { - "description": "Provide a corresponding PEM file containing the certificate, along with Amazon KMS credentials needed for securing the private key.", + "description": "Please upload a PEM file with the certificate and provide Amazon KMS credentials to secure the private key.", "label": "I use an Amazon KMS private key" }, "pkcs": { - "description": "A PKCS#12 file is a file that bundles the private key and the X.509 certificate. The password protection is required to secure the private key. Unprotected PKCS#12 files are not supported.", + "description": "A PKCS#12 file combines your private key with an X.509 certificate. Password protection is essential to secure the private key, as unprotected PKCS#12 files are not supported.", "label": "I want to upload a PKCS#12 file" } }, @@ -1000,13 +1039,13 @@ }, "error": { "conflict": "Dossier state with this name already exists", - "generic": "Failed to save dossier state!" + "generic": "Failed to save dossier state." }, "no-data": { "title": "There are no dossier states." }, "no-match": { - "title": "No dossier states match your current filters." + "title": "No dossier state matches the currently selected filters." }, "search": "Search...", "table-col-names": { @@ -1081,8 +1120,8 @@ }, "dossier-watermark-selector": { "heading": "Watermarks on documents", - "no-watermark": "There is no watermark defined for the dossier template.
Contact your app admin to define one.", - "preview": "Watermark application on preview documents", + "no-watermark": "No watermark available in dossier template:
Please ask your admin to configure a watermark.", + "preview": "Watermark on redacted documents", "watermark": "Watermark application on redacted documents" }, "dossiers-type-switch": { @@ -1102,7 +1141,7 @@ }, "download-includes": "Wählen Sie die Dokumente für Ihr Download-Paket aus", "download-status": { - "error": "The download preparation failed, please recheck the selected files and download option settings.", + "error": "Download generation failed

Please check the selected files and download option settings.", "queued": "Ihr Download wurde zur Warteschlange hinzugefügt. Hier finden Sie alle angeforderten Downloads: My Downloads." }, "download-type": { @@ -1168,7 +1207,7 @@ "edit-button-tooltip": "Edit dossier dictionary settings", "edit-dialog": { "add-to-dictionary-action": "Available in add/edit dialogs in this dossier", - "cancel": "Cancel", + "cancel": "Abbrechen", "error": { "generic": "Failed to update flag." }, @@ -1201,7 +1240,7 @@ } }, "header": "{dossierName} bearbeiten", - "missing-owner": "You cannot edit the dossier because the owner is missing!", + "missing-owner": "Editing the dossier not possible: No owner assigned.", "nav-items": { "choose-download": "Wählen Sie die Dokumente für Ihr Download-Paket aus:", "dictionary": "Wörterbücher", @@ -1218,12 +1257,12 @@ "edit-redaction": { "dialog": { "actions": { - "cancel": "Cancel", + "cancel": "Abbrechen", "save": "Save changes" }, "content": { "comment": "Comment", - "comment-placeholder": "Add remarks or notes...", + "comment-placeholder": "Bemerkungen oder Notizen hinzufügen...", "custom-rectangle": "Custom Rectangle", "imported": "Imported Redaction", "legal-basis": "Legal basis", @@ -1250,7 +1289,7 @@ "entities-listing": { "action": { "delete": "Wörterbuch löschen", - "edit": "Wörterbuch bearbeiten" + "edit": "Entität bearbeiten" }, "add-new": "Neues Wörterbuch", "bulk": { @@ -1280,18 +1319,18 @@ "revert": "Revert", "save": "Save changes" }, - "heading": "Edit entity" + "heading": "Entität bearbeiten" } }, "entity-rules-screen": { "error": { - "generic": "An error ocurred... Entity rules update failed!" + "generic": "Error: Entity rules update failed." }, "errors-found": "{errors, plural, one{An error} other{{errors} errors}} found in rules", "revert-changes": "Revert", "save-changes": "Save changes", "success": { - "generic": "Entity rules updated!" + "generic": "Entity rules updated." }, "title": "Entity rule editor", "warning-text": "Warning: experimental feature!", @@ -1314,12 +1353,12 @@ }, "file-preview": { "action": "Refresh", - "label": "An unknown error occurred. Please refresh the page" + "label": "Unknown error: Please refresh the page." }, "http": { "generic": "Aktion mit Code {status} fehlgeschlagen" }, - "missing-types": "The dossier template has missing types ({missingTypes}). Data might not be displayed correctly.", + "missing-types": "Dossier template incomplete: missing types ({missingTypes}) may cause data display issues.", "offline": "Du bist offline", "online": "Du bist online", "reload": "Neu laden", @@ -1329,7 +1368,7 @@ "file": "Datei", "file-attribute": { "update": { - "error": "Failed to update file attribute value!", + "error": "Update of file attribute value failed. Please try again.", "success": "File attribute value has been updated successfully!" } }, @@ -1344,7 +1383,7 @@ "text": "Freier Text" }, "file-attributes-configurations": { - "cancel": "Cancel", + "cancel": "Abbrechen", "form": { "delimiter": "Delimiter", "encoding-type": "Encoding type", @@ -1525,7 +1564,7 @@ } }, "text-highlights": "Earmarks", - "text-highlights-tooltip": "Shows all text earmarks and allows removing or importing them as redactions", + "text-highlights-tooltip": "Earmark allows removing text highlights or converting them into redactions.", "toggle-analysis": { "disable": "Schwärzen deaktivieren", "enable": "Schwärzen aktivieren", @@ -1641,7 +1680,8 @@ }, "test": { "error": "Die Test-E-Mail konnte nicht gesendet werden! Bitte überprüfen Sie die E-Mail-Adresse.", - "success": "Die Test-E-Mail wurde erfolgreich versendet!" + "success": "Die Test-E-Mail wurde erfolgreich versendet!", + "warning": "Admin mail address not set. Test email sent to {recipientEmail} instead." }, "title": "SMTP-Konto konfigurieren" }, @@ -1656,18 +1696,18 @@ }, "highlight-action-dialog": { "actions": { - "cancel": "Cancel" + "cancel": "Abbrechen" }, "convert": { "confirmation": "The {count} selected {count, plural, one{earmark} other{earmarks}} will be converted", - "details": "All earmarks from the document will be converted to imported redactions, using the color defined by the application admin.", + "details": "All earmarks in the document will be converted into imported redactions. Imported redactions are highlighted in the color configured in the 'Default colors' section of the app.", "options": { "all-pages": { "description": "The earmarks in the selected HEX color will be converted on all pages of the document.", "label": "Convert on all pages" }, "this-page": { - "description": "The earmarks in the selected HEX color will be converted only on the current page in view.", + "description": "The earmarks in the selected HEX color will be converted only on the currently viewed page.", "label": "Convert only on this page" } }, @@ -1681,14 +1721,14 @@ }, "remove": { "confirmation": "The {count} selected {count, plural, one{earmark} other{earmarks}} will be removed from the document", - "details": "Removing earmarks from the document will delete all the rectangles and leave a white background behind the highlighted text.", + "details": "Removing earmarks from the document will delete all colored rectangles and leave a white background behind the previously highlighted text.", "options": { "all-pages": { "description": "The earmarks in the selected HEX color will be removed on all pages of the document.", "label": "Remove on all pages" }, "this-page": { - "description": "The earmarks in the selected HEX color will be removed only on the current page in view.", + "description": "The earmarks in the selected HEX color will be converted only on the currently viewed page.", "label": "Remove only on this page" } }, @@ -1706,13 +1746,13 @@ }, "import-redactions-dialog": { "actions": { - "cancel": "Cancel", + "cancel": "Abbrechen", "import": "Import" }, "details": "To apply redactions from another document, you first need to upload it.", "http": { "error": "Failed to import redactions! {error}", - "success": "Redactions have been imported!" + "success": "Redactions have been imported." }, "import-only-for-pages": "Import only for pages", "range": { @@ -1796,8 +1836,8 @@ } }, "license-information": "Lizenzinformationen", - "load-all-annotations-success": "All annotations were loaded and are now visible in the document thumbnails", - "load-all-annotations-threshold-exceeded": "Caution, document contains more than {threshold} annotations. Drawing all annotations will affect the performance of the app and could even block it. Do you want to proceed?", + "load-all-annotations-success": "All annotations were loaded and are now visible in the document thumbnails.", + "load-all-annotations-threshold-exceeded": "Alert: Document contains more than {threshold} annotations. Drawing all annotations may cause the app to slow down or freeze. Do you still want to continue?", "load-all-annotations-threshold-exceeded-checkbox": "Do not show this warning again", "loading": "Loading", "manual-annotation": { @@ -1898,12 +1938,12 @@ "ocr": { "confirmation-dialog": { "cancel": "Cancel", - "question": "Manual changes could get lost if OCR makes changes at those positions. Are you sure you want to proceed?", + "question": "Manual changes may be overwritten if the OCR makes changes at the respective positions. Do you still want to proceed?", "title": "Warning: The file contains manual changes!" } }, "overwrite-files-dialog": { - "archive-question": "Dossier is not empty, so files might overlap with the contents of the archive you are uploading. Choose how to proceed in case of duplicates:", + "archive-question": "Dossier already contains files. Files might overlap with the contents of the folder you are uploading. Select how to handle duplicates:", "archive-title": "Uploading a ZIP archive", "file-question": "{filename} ist bereits vorhanden. Wie möchten Sie fortfahren?", "file-title": "Das Dokument existiert bereits!", @@ -1912,16 +1952,16 @@ "cancel": "Alle Uploads abbrechen", "current-files": "Apply to current file", "full-overwrite": { - "description": "Manual changes done to the existing file will be removed and you are able to start over with redactions.", + "description": "Remove all manual changes made to the file, and start reviewing a freshly processed file.", "label": "Overwrite and start over" }, "partial-overwrite": { - "description": "Manual changes are kept only if the affected redactions are still at the same position in the file. Some redactions could be misplaced if the content of the file changed.", + "description": "Keep manual changes if the affected redactions remain in their original positions. Some redactions could be misplaced if the content has changed.", "label": "Overwrite and keep manual changes" }, "proceed": "Proceed", "skip": { - "description": "The upload will be skipped and the existing file will not be replaced.", + "description": "Skip the file upload and do not replace the existing file.", "label": "Keep the existing file and do not overwrite" } }, @@ -1976,7 +2016,7 @@ "form": { "auto-expand-filters-on-action": "Auto-expand filters on my actions", "help-mode-dialog": "Help mode activation dialog", - "load-all-annotations-warning": "Warning regarding loading all annotations at once in file preview", + "load-all-annotations-warning": "Warning regarding simultaneous loading of all annotations in thumbnails", "open-structured-view-by-default": "Display structured component management modal by default", "table-extraction-type": "Table extraction type" }, @@ -2006,7 +2046,7 @@ }, "content": { "comment": "Comment", - "comment-placeholder": "Add remarks or notes...", + "comment-placeholder": "Bemerkungen oder Notizen hinzufügen...", "edit-text": "Edit text", "legal-basis": "Legal basis", "options": { @@ -2040,7 +2080,7 @@ }, "content": { "comment": "Comment", - "comment-placeholder": "Add remarks or notes...", + "comment-placeholder": "Bemerkungen oder Notizen hinzufügen...", "list-item": "", "list-item-false-positive": "", "options": { @@ -2074,7 +2114,7 @@ }, "content": { "comment": "Comment", - "comment-placeholder": "Add remarks or notes...", + "comment-placeholder": "Bemerkungen oder Notizen hinzufügen...", "options": { "do-not-recommend": { "description": "Do not recommend the selected term in any document of this dossier.", @@ -2129,9 +2169,10 @@ }, "redaction": { "entity": { - "display-name": "This placeholder is replaced by the name of the entity the redaction is based on." + "display-name": "This placeholder is replaced by the name of the entity on which the redaction is based." }, "excerpt": "Dieser Platzhalter wird durch einen Textausschnitt ersetzt, der die Schwärzung enthält.", + "is-skipped": "The skipped redaction placeholder indicates whether a redaction is skipped or not. It can be included in a separate column of a template that also contains the '{{redaction.value'}} placeholder. The placeholder is replaced by “true” if the respective redaction is skipped, and by “false” if it is redacted (i. e., not skipped).", "justification": "Dieser Platzhalter wird durch die Begründung der Schwärzung ersetzt. Es ist eine Kombination aus dem Rechtsverweis (justificationParagraph) und dem Begründungstext (justificationReason).", "justification-legal-basis": "This placeholder is replaced by the legal basis for the redaction.", "justification-paragraph": "Dieser Platzhalter wird durch den Rechtshinweis der Begründung der Redaktion ersetzt.", @@ -2139,6 +2180,7 @@ "justification-text": "This placeholder is replaced by the justification text.", "page": "Dieser Platzhalter wird durch die Seitenzahl der Redaktion ersetzt.", "paragraph": "Dieser Platzhalter wird durch den Absatz ersetzt, der die Schwärzung enthält.", + "paragraph-idx": "The placeholder is replaced by the number of the paragraph containing the redaction. Paragraphs are numbered on a per-page basis.", "value": "This placeholder is replaced by the value that was redacted." }, "time": { @@ -2171,11 +2213,11 @@ "resize-annotation": { "dialog": { "actions": { - "cancel": "Cancel", - "save": "Save changes" + "cancel": "Abbrechen", + "save": "Änderungen speichern" }, "content": { - "comment": "Comment", + "comment": "Kommentar", "original-text": "Original annotation:", "resized-text": "Resized annotation:" }, @@ -2185,11 +2227,11 @@ "resize-redaction": { "dialog": { "actions": { - "cancel": "Cancel", - "save": "Save changes" + "cancel": "Abbrechen", + "save": "Änderungen speichern" }, "content": { - "comment": "Comment", + "comment": "Kommentar", "options": { "in-dossier": { "description": "Resize in every document in {dossierName}.", @@ -2204,7 +2246,7 @@ }, "original-text": "Original text:", "resized-text": "Resized text:", - "type": "Type" + "type": "Typ" }, "header": "Resize {type}" } @@ -2220,7 +2262,7 @@ }, "roles": { "inactive": "Inaktiv", - "manager-admin": "Manager & admin", + "manager-admin": "Manager & Admin", "no-role": "Keine Rolle definiert", "red-admin": "Anwendungsadministrator", "red-manager": "Manager", @@ -2229,14 +2271,14 @@ "regular": "Regulär" }, "search": { - "active-dossiers": "ganze Plattform", - "all-dossiers": "all documents", - "placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen", - "this-dossier": "in diesem Dossier" + "active-dossiers": "Dokumente in aktiven Dossiers", + "all-dossiers": "Alle Dokumente", + "placeholder": "Dokumente durchsuchen...", + "this-dossier": "In diesem Dossier" }, "search-screen": { "cols": { - "assignee": "Bevollmächtigter", + "assignee": "Assignee", "document": "Dokument", "dossier": "Dossier", "pages": "Seiten", @@ -2244,21 +2286,21 @@ }, "filters": { "assignee": "Assignee", - "by-dossier": "Nach Dossier filtern", - "by-template": "Dossier template", - "only-active": "Active dossiers only", - "search-by-template-placeholder": "Dossier template name...", + "by-dossier": "Dossier", + "by-template": "Dossier-Vorlage", + "only-active": "Nur aktive Dossiers", + "search-by-template-placeholder": "Name der Dossier-Vorlage...", "search-placeholder": "Dossiername...", "status": "Status" }, "missing": "Fehlt", - "must-contain": "Muss enthalten", - "no-data": "Geben Sie einen Suchbegriff in die Suchleiste, um nach Dokumenten oder Inhalten von Dokumenten zu suchen.", - "no-match": "Keine Dokumente entsprechen Ihren aktuellen Filtern.", + "must-contain": "Must contain", + "no-data": "Geben Sie einen Suchbegriff in die Suchleiste ein,
um Dokumente oder Inhalte zu suchen.", + "no-match": "Suchbegriff wurde in keinem der Dokumente gefunden.", "table-header": "{length} {length, plural, one{Suchergebnis} other{Suchergebnisse}}" }, - "seconds": "seconds", - "size": "Size", + "seconds": "Sekunden", + "size": "Größe", "smtp-auth-config": { "actions": { "cancel": "Abbrechen", @@ -2272,7 +2314,7 @@ "title": "Authentifizierung aktivieren" }, "table-header": { - "selected-count": "{count} selected" + "selected-count": "{count} ausgewählt" }, "tenant-resolve": { "contact-administrator": "Cannot remember the workspace? Please contact your administrator.", @@ -2283,7 +2325,7 @@ "sign-in-previous-domain": "Sign in to a previously used workspace", "youre-logged-out": "You have successfully been logged out." }, - "input-placeholder": "Your workspace" + "input-placeholder": "Ihr Workspace" }, "time": { "days": "{days} {days, plural, one{Tag} other{Tage}}", @@ -2291,29 +2333,29 @@ "less-than-an-hour": "< 1 Stunde", "no-time-left": "Frist für Wiederherstellung verstrichen" }, - "today": "Today", + "today": "Heute", "toggle-auto-analysis-message": { - "error": "Something went wrong.", + "error": "Es ist ein Fehler aufgetreten.", "success": "{toggleOperation} automatic processing." }, "top-bar": { "navigation-items": { "back": "Zurück", - "back-to-dashboard": "Back to home", - "dashboard": "Home", + "back-to-dashboard": "Zurück zu Start", + "dashboard": "Start", "my-account": { "children": { "account": "Konto", "admin": "Einstellungen", "downloads": "Meine Downloads", - "join-another-tenant": "Join another workspace", + "join-another-tenant": "Anderem Workspace beitreten", "language": { "de": "Deutsch", "en": "Englisch", "label": "Sprache" }, "logout": "Abmelden", - "select-tenant": "Select Tenant", + "select-tenant": "Workspace wechseln", "trash": "Papierkorb" } } @@ -2330,16 +2372,16 @@ }, "label": "Papierkorb", "no-data": { - "title": "Es wurde noch kein Dossier angelegt." + "title": "Es gibt noch keine gelöschten Elemente." }, "no-match": { - "title": "Die ausgewählten Filter treffen auf kein Dossier zu." + "title": "Die ausgewählten Filter treffen auf kein Element zu." }, "table-col-names": { "deleted-on": "Gelöscht am", "dossier": "Dossier", "name": "Name", - "owner": "Eigentümer", + "owner": "Owner/assignee", "time-to-restore": "Verbleibende Zeit für Wiederherstellung" }, "table-header": { @@ -2350,8 +2392,8 @@ "unknown": "Unbekannt", "update-profile": { "errors": { - "bad-request": "Error: {message}.", - "generic": "An error has occurred while updating the profile." + "bad-request": "Fehler: {message}.", + "generic": "Bei der Aktualisierung des Profils ist ein Fehler aufgetreten." } }, "upload-dictionary-dialog": { @@ -2360,11 +2402,11 @@ "merge": "Einträge zusammenführen", "overwrite": "Überschreiben" }, - "question": "Wählen Sie, wie Sie fortfahren möchten:", - "title": "Das Wörterbuch hat bereits Einträge!" + "question": "Wie möchten Sie fortfahren?", + "title": "Das Wörterbuch hat bereits Einträge." }, "upload-file": { - "upload-area-text": "Click or drag & drop anywhere on this area..." + "upload-area-text": "Klicken Sie auf den Button oder ziehen Sie die Dateien in diesen Bereich..." }, "upload-status": { "dialog": { @@ -2376,7 +2418,7 @@ }, "error": { "file-size": "Datei zu groß. Die maximal zulässige Größe beträgt {size} MB.", - "file-type": "This file type is not supported.", + "file-type": "Dateityp wird nicht unterstützt.", "generic": "Fehler beim Hochladen des Dokuments. {error}" } }, @@ -2391,7 +2433,7 @@ "delete-disabled": "Sie können Ihr eigenes Konto nicht löschen." }, "no-match": { - "title": "Die ausgewählten Filter treffen auf keinen Benutzer zu." + "title": "Ausgewählte Filter treffen auf keinen Benutzer zu." }, "search": "Suche ...", "table-col-names": { @@ -2401,12 +2443,12 @@ "roles": "Rollen" }, "table-header": { - "title": "{length} {length, plural, one{user} other{users}}" + "title": "{length} {length, plural, one{Benutzer} other{Benutzer}}" } }, "user-management": "Benutzerverwaltung", "user-menu": { - "button-text": "User menu" + "button-text": "Benuterzmenü" }, "user-profile": "Mein Profil", "user-profile-screen": { @@ -2417,21 +2459,21 @@ "confirm-password": { "form": { "password": { - "label": "Password" + "label": "Passwort" } }, - "header": "Confirm your password", - "save": "Submit" + "header": "Passwort bestätigen", + "save": "Absenden" }, "form": { - "dark-theme": "Dark theme", - "email": "E-mail", + "dark-theme": "Nachtmodus", + "email": "E-Mail", "first-name": "Vorname", "last-name": "Nachname" }, "title": "Profil bearbeiten", "update": { - "success": "Successfully updated profile!" + "success": "Profil erfolgreich aktualisiert." } }, "user-stats": { @@ -2448,59 +2490,59 @@ "workflow": "Arbeitsablauf" }, "viewer-header": { - "load-all-annotations": "Load all annotations" + "load-all-annotations": "Alle Annotationen laden" }, "watermark-screen": { "action": { - "change-success": "Das Wasserzeichen wurde aktualisiert!", - "created-success": "Watermark has been created!", - "error": "Fehler beim Aktualisieren des Wasserzeichens", + "change-success": "Wasserzeichen wurde aktualisiert.", + "created-success": "Wasserzeichen wurde erstellt.", + "error": "Aktualisierung des Wasserzeichens fehlgeschlagen", "revert": "Rückgängig machen", "save": "Änderungen speichern" }, "alignment": { - "align-bottom": "Align bottom", - "align-horizontal-centers": "Align horizontal centers", - "align-left": "Align left", - "align-right": "Align right", - "align-top": "Align top", - "align-vertical-centers": "Align vertical centers" + "align-bottom": "Unten", + "align-horizontal-centers": "Horizontal mittig", + "align-left": "Linksbündig", + "align-right": "Rechtsbündig", + "align-top": "Oben", + "align-vertical-centers": "Vertikal mittig" }, "form": { - "alignment": "Alignment", + "alignment": "Ausrichtung", "color": "Farbe", "color-placeholder": "#", "font-size": "Schriftgröße", "font-type": "Schriftart", - "name-label": "Watermark name", - "name-placeholder": "Choose a name to identify the watermark", + "name-label": "Name des Wasserzeichens", + "name-placeholder": "Namen für das Wasserzeichen eingeben", "opacity": "Deckkraft", "orientation": "Ausrichtung", - "text-label": "Watermark text", + "text-label": "Text für Wasserzeichen", "text-placeholder": "Text eingeben" } }, "watermarks-listing": { "action": { - "delete": "Delete", - "delete-success": "Watermark has been deleted!", - "edit": "Edit" + "delete": "Löschen", + "delete-success": "Das Wasserzeichen wurde gelöscht.", + "edit": "Bearbeiten" }, - "add-new": "New watermark", + "add-new": "Neues Wasserzeichen", "no-data": { - "title": "There are no watermarks yet." + "title": "Es wurde noch kein Wasserzeichen erstellt." }, "table-col-names": { - "created-by": "Created by", - "created-on": "Created on", - "modified-on": "Modified on", + "created-by": "Ersteller", + "created-on": "Erstellt am", + "modified-on": "Geändert am", "name": "Name", "status": "Status" }, "table-header": { - "title": "Watermarks" + "title": "Wasserzeichen" }, - "watermark-is-used": "This watermark is already in use, are you sure you want to delete it?" + "watermark-is-used": "Dieses Wasserzeichen wird bereits verwendet. Möchten Sie es dennocht löschen?" }, "workflow": { "selection": { diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json index 6c621dce1..a9a4a43ac 100644 --- a/apps/red-ui/src/assets/i18n/redact/en.json +++ b/apps/red-ui/src/assets/i18n/redact/en.json @@ -94,6 +94,23 @@ }, "save": "Save dossier template" }, + "add-edit-component-mapping": { + "actions": { + "save": "Save mapping" + }, + "dialog": { + "title": "{type, select, add{Add New} edit{Edit} other{}} Component Mapping" + }, + "form": { + "delimiter": "", + "delimiter-placeholder": "", + "encoding-type": "", + "file": "Mapping file", + "name": "Mapping name", + "name-placeholder": "Mapping name", + "version": "Version" + } + }, "add-edit-dossier-attribute": { "error": { "generic": "Failed to save attribute" @@ -138,12 +155,12 @@ "rank-placeholder": "1000", "redaction": "Redaction", "technical-name": "Technical name", - "technical-name-hint": "{type, select, edit{Auto-generated based on the initial display name.} create{Is auto-generates based on the display name and cannot be edited after saving.} other{}}", + "technical-name-hint": "{type, select, edit{Auto-generated based on the initial display name.} create{Is auto-generated based on the display name and cannot be edited after saving.} other{}}", "template-and-dossier-dictionaries": "Template & dossier dictionaries" }, "success": { "create": "Success: Entity created.", - "edit": "Entity updated.

Please note that other users need to refresh their browsers to see your changes." + "edit": "Success: Entity updated.

Please ask the users to refresh the browser to see the changes." } }, "add-edit-file-attribute": { @@ -231,6 +248,7 @@ }, "admin-side-nav": { "audit": "Audit", + "component-mappings": "Component mappings", "component-rule-editor": "", "configurations": "Configurations", "default-colors": "Default colors", @@ -513,6 +531,24 @@ "value": "Value" } }, + "component-mappings-screen": { + "action": { + "delete": "Delete mapping", + "edit": "Edit mapping" + }, + "add-new": "New Mapping", + "bulk-actions": { + "delete": "Delete selected mappings" + }, + "search": "Search by name...", + "table-col-names": { + "name": "name", + "version": "version" + }, + "table-header": { + "title": "Component mapping" + } + }, "component-rules-screen": { "error": { "generic": "" @@ -542,10 +578,10 @@ "cancel": "Keep {count, plural, one{attribute} other{attributes}}", "delete": "Delete {count, plural, one{attribute} other{attributes}}", "dossier-impacted-documents": "This action will affect all dossiers that use this template.", - "dossier-lost-details": "All attribute values entered by users on document level will be lost.", + "dossier-lost-details": "The attribute values entered by users on document level will be lost.", "file-impacted-documents": "All documents that use {count, plural, one{his attribute} other{these attributes}} will be impacted.", "file-lost-details": "All information entered by users on document level will be lost.", - "impacted-report": "{reportsCount} reports currently use the placeholder for this attribute.

Please update them accordingly.", + "impacted-report": "{reportsCount} reports currently use the placeholder for this attribute. Please update them.", "title": "Delete {count, plural, one{{name}} other{file attributes}}", "toast-error": "Please confirm that you understand the consequences of this action.", "warning": "Warning: This action cannot be undone!" @@ -711,13 +747,13 @@ }, "download": "Download current entries", "error": { - "400": "Cannot update dictionary because at least one of the newly added words where recognized as a general term that appear too often in texts.", - "generic": "An error occurred... Dictionary update failed!" + "400": "Dictionary update failed.

One or more of the newly added terms have been identified as frequently used general term. Please remove these terms to proceed with the upate. ", + "generic": "Error: Dictionary update failed." }, "revert-changes": "Revert", "save-changes": "Save changes", "search": "Search entries...", - "select-dictionary": "Select a dictionary above to compare with the current one.", + "select-dictionary": "Select a dictionary for comparison above.", "success": { "generic": "Dictionary updated" } @@ -753,11 +789,11 @@ }, "options": { "kms": { - "description": "Provide a corresponding PEM file containing the certificate, along with Amazon KMS credentials needed for securing the private key.", + "description": "Please upload a PEM file with the certificate and provide Amazon KMS credentials to secure the private key.", "label": "I use an Amazon KMS private key" }, "pkcs": { - "description": "A PKCS#12 file is a file that bundles the private key and the X.509 certificate. The password protection is required to secure the private key. Unprotected PKCS#12 files are not supported.", + "description": "A PKCS#12 file combines your private key with an X.509 certificate. Password protection is essential to secure the private key, as unprotected PKCS#12 files are not supported.", "label": "I want to upload a PKCS#12 file" } }, @@ -779,7 +815,7 @@ }, "no-data": { "action": "Configure certificate", - "title": "No digital signature certificate.
For signing redacted documents please configure a certificate." + "title": "No digital signature certificate available.
Please configure a certificate to sign redacted documents." } }, "document-info": { @@ -888,7 +924,7 @@ }, "dossier-overview": { "approve": "Approve", - "approve-disabled": "File can only be approved once it has been analysed with the latest dictionaries.", + "approve-disabled": "File can only be approved once it has been analyzed with the latest set of business rules and terms stored in the system dictionaries.", "assign-approver": "Assign approver", "assign-me": "Assign to me", "assign-reviewer": "Assign user", @@ -923,7 +959,7 @@ } }, "download-file": "Download", - "download-file-disabled": "You need to be approver in the dossier and the {count, plural, one{file needs} other{files need}} to be initially processed in order to download.", + "download-file-disabled": "To download, ensure you are an approver in the dossier, and the {count, plural, one{file has undergone} other{files have undergone}} initial processing.", "file-listing": { "file-entry": { "file-error": "Re-processing required", @@ -1002,13 +1038,13 @@ }, "error": { "conflict": "Dossier state with this name already exists", - "generic": "Failed to save dossier state!" + "generic": "Failed to save dossier state." }, "no-data": { "title": "There are no dossier states." }, "no-match": { - "title": "No dossier states match your current filters." + "title": "No dossier state matches the currently selected filters." }, "search": "Search...", "table-col-names": { @@ -1050,8 +1086,8 @@ }, "entities": "{length} {length, plural, one{entity} other{entities}}", "error": { - "conflict": "Cannot delete this dossier template. At least one dossier uses this template.", - "generic": "Cannot delete this dossier template!" + "conflict": "Deletion denied: This dossier template is used by at least one dossier and cannot be deleted.", + "generic": "Cannot delete this dossier template." }, "no-data": { "title": "There are no dossier templates yet." @@ -1083,8 +1119,8 @@ }, "dossier-watermark-selector": { "heading": "Watermarks on documents", - "no-watermark": "There is no watermark defined for the dossier template.
Contact your app admin to define one.", - "preview": "Watermark application on preview documents", + "no-watermark": "No watermark available in dossier template:
Please ask your admin to configure a watermark.", + "preview": "Watermark on redacted documents", "watermark": "Watermark application on redacted documents" }, "dossiers-type-switch": { @@ -1102,10 +1138,10 @@ "header": "Download options", "unapproved-files-warning": "This download contains unapproved file(s)." }, - "download-includes": "Choose what is included at download:", + "download-includes": "Select the documents for your download:", "download-status": { - "error": "The download preparation failed, please recheck the selected files and download option settings.", - "queued": "Your download has been queued, you can see all your requested downloads here:
My downloads." + "error": "Download generation failed

Please check the selected files and download option settings.", + "queued": "Your download has been added to the queue.

To see your requested downloads, visit:
My downloads." }, "download-type": { "annotated": "Annotated PDF", @@ -1145,7 +1181,7 @@ "color-placeholder": "Color" }, "save": "Save", - "success": "Success: Color saved.

Please note that other users need to refresh their browsers to see your changes." + "success": "Success: Color saved.

Please ask the users to refresh the browser to see the changes." }, "edit-dossier-dialog": { "actions": { @@ -1157,7 +1193,7 @@ "custom-attributes": "Custom dossier attributes", "delete-image": "Delete image", "error": { - "generic": "Only PNG, JPG and JPEG files are allowed as image dossier attributes." + "generic": "Supported image formats: PNG, JPG, and JPEG." }, "image-attributes": "Image attributes", "no-custom-attributes": "There are no text attributes", @@ -1203,9 +1239,9 @@ } }, "header": "Edit {dossierName}", - "missing-owner": "You cannot edit the dossier because the owner is missing!", + "missing-owner": "Editing the dossier not possible: No owner assigned.", "nav-items": { - "choose-download": "Choose what is included at download:", + "choose-download": "Select the documents for your download:", "dictionary": "Dictionaries", "dossier-attributes": "Dossier attributes", "dossier-dictionary": "Dictionaries", @@ -1263,7 +1299,7 @@ "title": "There are no entities yet." }, "no-match": { - "title": "No entities match your current filters." + "title": "No entity matches your currently selected filters." }, "search": "Search...", "table-col-names": { @@ -1278,13 +1314,13 @@ }, "entity-rules-screen": { "error": { - "generic": "An error ocurred... Entity rules update failed!" + "generic": "Error: Entity rules update failed." }, "errors-found": "{errors, plural, one{An error} other{{errors} errors}} found in rules", "revert-changes": "Revert", "save-changes": "Save changes", "success": { - "generic": "Entity rules updated!" + "generic": "Entity rules updated." }, "title": "Entity rule editor", "warning-text": "Warning: experimental feature!", @@ -1316,16 +1352,16 @@ }, "file-preview": { "action": "Refresh", - "label": "An unknown error occurred. Please refresh the page" + "label": "Unknown error: Please refresh the page." }, "http": { - "generic": "Action failed with code {status}" + "generic": "Action failed. Error code: {status}" }, - "missing-types": "The dossier template has missing types ({missingTypes}). Data might not be displayed correctly.", + "missing-types": "Dossier template incomplete: missing types ({missingTypes}) may cause data display issues.", "offline": "Disconnected", "online": "Reconnected", "reload": "Reload", - "title": "Oops! Something went wrong..." + "title": "An error ocurred." }, "exact-date": "{day} {month} {year} at {hour}:{minute}", "file": "File", @@ -1341,7 +1377,7 @@ }, "file-attribute": { "update": { - "error": "Failed to update file attribute value!", + "error": "Update of file attribute value failed. Please try again.", "success": "File attribute value has been updated successfully!" } }, @@ -1377,9 +1413,9 @@ "key-column": "Key column", "key-column-placeholder": "Select column...", "no-data": { - "title": "No file attributes defined. Select a column from the left panel to start defining file attributes." + "title": "No file attributes defined. Select a CSV column from the left to start defining file attributes." }, - "no-hovered-column": "Preview CSV column by hovering the entry.", + "no-hovered-column": "Preview CSV column by hovering over the entry.", "no-sample-data-for": "No sample data for {column}.", "parse-csv": "Parse CSV with new options", "quick-activation": { @@ -1398,7 +1434,7 @@ "table-col-names": { "name": "Name", "primary": "Primary", - "primary-info-tooltip": "The value of the attribute set as primary shows up under the file name in the documents list.", + "primary-info-tooltip": "The value of the attribute set as primary is diplayed below the file name in the document list.", "read-only": "Read-only", "type": "Type" }, @@ -1426,7 +1462,7 @@ }, "configurations": "Configurations", "error": { - "conflict": "File attribute with this name already exists!", + "conflict": "File attribute name already exists. Please try another name.", "generic": "Failed to add file attribute" }, "no-data": { @@ -1443,7 +1479,7 @@ "filterable": "Filterable", "name": "Name", "primary": "Primary", - "primary-info-tooltip": "The value of the attribute set as primary shows up under the file name in the documents list.", + "primary-info-tooltip": "The value of the attribute set as primary is diplayed below the file name in the document list.", "read-only": "Read-only", "type": "Input type" }, @@ -1457,7 +1493,7 @@ "assign-reviewer": "Assign user", "change-reviewer": "Change user", "delta": "Delta", - "delta-tooltip": "The delta view shows the unseen changes since your last visit to the page. This view is only available if there is at least 1 change.", + "delta-tooltip": "Delta shows the unseen changes since your last visit to the page. It is only available if there has been at least 1 change.", "document-info": "Document info", "download-original-file": "Download original file", "exclude-pages": "Exclude pages from redaction", @@ -1480,7 +1516,7 @@ "redacted": "Preview", "redacted-tooltip": "Redaction preview shows only redactions. Consider this a preview for the final redacted version. This view is only available if the file has no pending changes & doesn't require a reanalysis", "standard": "Standard", - "standard-tooltip": "Standard workload view shows all hints, redactions & recommendations. This view allows editing.", + "standard-tooltip": "Standard shows all annotation types and allows for editing.", "tabs": { "annotations": { "hide-skipped": "Hide skipped in document", @@ -1527,7 +1563,7 @@ } }, "text-highlights": "Earmarks", - "text-highlights-tooltip": "Shows all text earmarks and allows removing or importing them as redactions", + "text-highlights-tooltip": "Earmark allows removing text highlights or converting them into redactions.", "toggle-analysis": { "disable": "Disable redaction", "enable": "Enable for redaction", @@ -1642,19 +1678,20 @@ "title": "System preferences" }, "test": { - "error": "Test e-mail could not be sent! Please revise the e-mail address.", - "success": "Test e-mail was sent successfully!" + "error": "Test e-mail could not be sent. Please double-check the email address.", + "success": "Test e-mail was sent successfully!", + "warning": "Admin mail address not set. Test email sent to {recipientEmail} instead." }, "title": "Configure SMTP account" }, "help-mode": { "bottom-text": "Help mode", - "clicking-anywhere-on": " Clicking anywhere on the screen will show you which areas are interactive. Hovering an interactive area will change the mouse cursor to let you know if the element is interactive.", + "clicking-anywhere-on": "Click anywhere on the screen to display the interactive elements. When you hover over an interactive element, the mouse cursor changes to show the element is clickable.", "instructions": "Open help mode instructions", "options": { "do-not-show-again": "Do not show again" }, - "welcome-to-help-mode": " Welcome to help mode!
Clicking on interactive elements will open info about them in new tab.
" + "welcome-to-help-mode": "Welcome to Help Mode!
Click on interactive elements to learn more about their functionality in a new tab." }, "highlight-action-dialog": { "actions": { @@ -1662,14 +1699,14 @@ }, "convert": { "confirmation": "The {count} selected {count, plural, one{earmark} other{earmarks}} will be converted", - "details": "All earmarks from the document will be converted to imported redactions, using the color defined by the application admin.", + "details": "All earmarks in the document will be converted into imported redactions. Imported redactions are highlighted in the color configured in the 'Default colors' section of the app.", "options": { "all-pages": { "description": "The earmarks in the selected HEX color will be converted on all pages of the document.", "label": "Convert on all pages" }, "this-page": { - "description": "The earmarks in the selected HEX color will be converted only on the current page in view.", + "description": "The earmarks in the selected HEX color will be converted only on the currently viewed page.", "label": "Convert only on this page" } }, @@ -1683,14 +1720,14 @@ }, "remove": { "confirmation": "The {count} selected {count, plural, one{earmark} other{earmarks}} will be removed from the document", - "details": "Removing earmarks from the document will delete all the rectangles and leave a white background behind the highlighted text.", + "details": "Removing earmarks from the document will delete all colored rectangles and leave a white background behind the previously highlighted text.", "options": { "all-pages": { "description": "The earmarks in the selected HEX color will be removed on all pages of the document.", "label": "Remove on all pages" }, "this-page": { - "description": "The earmarks in the selected HEX color will be removed only on the current page in view.", + "description": "The earmarks in the selected HEX color will be converted only on the currently viewed page.", "label": "Remove only on this page" } }, @@ -1714,7 +1751,7 @@ "details": "To apply redactions from another document, you first need to upload it.", "http": { "error": "Failed to import redactions! {error}", - "success": "Redactions have been imported!" + "success": "Redactions have been imported." }, "import-only-for-pages": "Import only for pages", "range": { @@ -1798,8 +1835,8 @@ } }, "license-information": "License Information", - "load-all-annotations-success": "All annotations were loaded and are now visible in the document thumbnails", - "load-all-annotations-threshold-exceeded": "Caution, document contains more than {threshold} annotations. Drawing all annotations will affect the performance of the app and could even block it. Do you want to proceed?", + "load-all-annotations-success": "All annotations were loaded and are now visible in the document thumbnails.", + "load-all-annotations-threshold-exceeded": "Alert: Document contains more than {threshold} annotations. Drawing all annotations may cause the app to slow down or freeze. Do you still want to continue?", "load-all-annotations-threshold-exceeded-checkbox": "Do not show this warning again", "loading": "Loading", "manual-annotation": { @@ -1837,18 +1874,18 @@ "minutes": "minutes", "no-active-license": "Invalid or corrupt license – Please contact your administrator", "notification": { - "assign-approver": "You have been assigned as approver for {fileHref, select, null{{fileName}} other{
{fileName}}} in dossier: {dossierHref, select, null{{dossierName}} other{{dossierName}}}!", - "assign-reviewer": "You have been assigned as reviewer for {fileHref, select, null{{fileName}} other{{fileName}}} in dossier: {dossierHref, select, null{{dossierName}} other{{dossierName}}}!", + "assign-approver": "You have been assigned as approver for a document.
Document: {fileHref, select, null{{fileName}} other{{fileName}}}
Dossier: {dossierHref, select, null{{dossierName}} other{{dossierHref, select, null{{dossierName}} other{{dossierName}}}}}", + "assign-reviewer": "You have been assigned as reviewer for a document.
Document: {fileHref, select, null{{fileName}} other{{fileName}}}
Dossier: {dossierHref, select, null{{dossierName}} other{{dossierHref, select, null{{dossierName}} other{{dossierName}}}}}", "document-approved": " {fileHref, select, null{{fileName}} other{{fileName}}} has been approved!", "dossier-deleted": "Dossier: {dossierName} has been deleted!", "dossier-owner-deleted": "The owner of dossier: {dossierName} has been deleted!", "dossier-owner-removed": "You have been removed as dossier owner from {dossierHref, select, null{{dossierName}} other{{dossierName}}}!", "dossier-owner-set": "You are now the dossier owner of {dossierHref, select, null{{dossierName}} other{{dossierName}}}!", "download-ready": "Your download is ready!", - "no-data": "You currently have no notifications", - "unassigned-from-file": "You have been unassigned from {fileHref, select, null{{fileName}} other{{fileName}}} in dossier: {dossierHref, select, null{{dossierName}} other{{dossierHref, select, null{{dossierName}} other{{dossierName}}}}}!", - "user-becomes-dossier-member": "You have been added to dossier: {dossierHref, select, null{{dossierName}} other{{dossierName}}}!", - "user-demoted-to-reviewer": "You have been demoted to reviewer in dossier: {dossierHref, select, null{{dossierName}} other{{dossierName}}}!", + "no-data": "You currently have no notifications.", + "unassigned-from-file": "You have been unassigned from a document.
Document: {fileHref, select, null{{fileName}} other{{fileName}}}
Dossier: {dossierHref, select, null{{dossierName}} other{{dossierHref, select, null{{dossierName}} other{{dossierName}}}}}", + "user-becomes-dossier-member": "You have been added to a dossier: {dossierHref, select, null{{dossierName}} other{{dossierName}}}", + "user-demoted-to-reviewer": "You have been demoted to reviewer in dossier: {dossierHref, select, null{{dossierName}} other{{dossierName}}}", "user-promoted-to-approver": "You have been promoted to approver in dossier: {dossierHref, select, null{{dossierName}} other{{dossierName}}}!", "user-removed-as-dossier-member": "You have been removed as a member from dossier: {dossierHref, select, null{{dossierName}} other{{dossierName}}}!" }, @@ -1858,7 +1895,7 @@ "in-app-notifications": "In-app notifications" }, "error": { - "generic": "Something went wrong... Preferences update failed!" + "generic": "Error: Preferences update failed." }, "groups": { "document": "Document related notifications", @@ -1900,30 +1937,30 @@ "ocr": { "confirmation-dialog": { "cancel": "Cancel", - "question": "Manual changes could get lost if OCR makes changes at those positions. Are you sure you want to proceed?", + "question": "Manual changes may be overwritten if the OCR makes changes at the respective positions. Do you still want to proceed?", "title": "Warning: The file contains manual changes!" } }, "overwrite-files-dialog": { - "archive-question": "Dossier is not empty, so files might overlap with the contents of the archive you are uploading. Choose how to proceed in case of duplicates:", + "archive-question": "Dossier already contains files. Files might overlap with the contents of the folder you are uploading. Select how to handle duplicates:", "archive-title": "Uploading a ZIP archive", "file-question": "{filename} already exists. Choose how to proceed:", - "file-title": "File already exists!", + "file-title": "File already exists.", "options": { "all-files": "Apply to all files of current upload", "cancel": "Cancel upload", "current-files": "Apply to current file", "full-overwrite": { - "description": "Manual changes done to the existing file will be removed and you are able to start over with redactions.", + "description": "Remove all manual changes made to the file, and start reviewing a freshly processed file.", "label": "Overwrite and start over" }, "partial-overwrite": { - "description": "Manual changes are kept only if the affected redactions are still at the same position in the file. Some redactions could be misplaced if the content of the file changed.", + "description": "Keep manual changes if the affected redactions remain in their original positions. Some redactions could be misplaced if the content has changed.", "label": "Overwrite and keep manual changes" }, "proceed": "Proceed", "skip": { - "description": "The upload will be skipped and the existing file will not be replaced.", + "description": "Skip the file upload and do not replace the existing file.", "label": "Keep the existing file and do not overwrite" } }, @@ -1978,7 +2015,7 @@ "form": { "auto-expand-filters-on-action": "Auto-expand filters on my actions", "help-mode-dialog": "Help mode activation dialog", - "load-all-annotations-warning": "Warning regarding loading all annotations at once in file preview", + "load-all-annotations-warning": "Warning regarding simultaneous loading of all annotations in thumbnails", "open-structured-view-by-default": "Display structured component management modal by default", "table-extraction-type": "Table extraction type" }, @@ -2115,7 +2152,7 @@ "reports-screen": { "description": "Below, you will find a list of placeholders for dossier- and document-specific information. You can include these placeholders in your report templates.", "descriptions": { - "dossier-attributes": "This placeholder gets replaced with the value of the dossier attribute {attribute}.", + "dossier-attributes": "This placeholder is replaced by the value of the dossier attribute {attribute}.", "file-attributes": "This placeholder is replaced with the value of the file attribute {attribute}.", "general": { "date": { @@ -2131,7 +2168,7 @@ }, "redaction": { "entity": { - "display-name": "This placeholder is replaced by the name of the entity the redaction is based on." + "display-name": "This placeholder is replaced by the name of the entity on which the redaction is based." }, "excerpt": "This placeholder is replaced by a text snippet that contains the redaction.", "is-skipped": "The skipped redaction placeholder indicates whether a redaction is skipped or not. It can be included in a separate column of a template that also contains the '{{redaction.value'}} placeholder. The placeholder is replaced by “true” if the respective redaction is skipped, and by “false” if it is redacted (i. e., not skipped).", @@ -2150,7 +2187,7 @@ } } }, - "invalid-upload": "Invalid format selected for upload! Supported formats are XLSX and DOCX", + "invalid-upload": "Invalid upload format. Supported formats: .xlsx and .docx", "multi-file-report": "(Multi-file)", "report-documents": "Report documents", "setup": "Click the upload button on the right to upload your redaction report templates.", @@ -2365,7 +2402,7 @@ "overwrite": "Overwrite" }, "question": "Choose how to proceed:", - "title": "The dictionary already has entries!" + "title": "The dictionary already has entries." }, "upload-file": { "upload-area-text": "Click or drag & drop anywhere on this area..." @@ -2435,7 +2472,7 @@ }, "title": "Edit profile", "update": { - "success": "Successfully updated profile!" + "success": "Successfully updated profile." } }, "user-stats": { @@ -2456,8 +2493,8 @@ }, "watermark-screen": { "action": { - "change-success": "Watermark has been updated!", - "created-success": "Watermark has been created!", + "change-success": "Watermark has been updated.", + "created-success": "Watermark has been created.", "error": "Failed to update watermark", "revert": "Revert", "save": "Save changes" @@ -2487,7 +2524,7 @@ "watermarks-listing": { "action": { "delete": "Delete", - "delete-success": "Watermark has been deleted!", + "delete-success": "Watermark has been deleted.", "edit": "Edit" }, "add-new": "New watermark", @@ -2504,7 +2541,7 @@ "table-header": { "title": "Watermarks" }, - "watermark-is-used": "This watermark is already in use, are you sure you want to delete it?" + "watermark-is-used": "This watermark is already in use. Do you still want to delete it?" }, "workflow": { "selection": { diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json index b780ba66f..6dc3c29a1 100644 --- a/apps/red-ui/src/assets/i18n/scm/de.json +++ b/apps/red-ui/src/assets/i18n/scm/de.json @@ -94,6 +94,23 @@ }, "save": "Dossier-Vorlage speichern" }, + "add-edit-component-mapping": { + "actions": { + "save": "Save mapping" + }, + "dialog": { + "title": "{type, select, add{Add New} edit{Edit} other{}} Component Mapping" + }, + "form": { + "delimiter": "Delimiter", + "delimiter-placeholder": "Delimiter", + "encoding-type": "Encoding type", + "file": "Mapping file", + "name": "Mapping name", + "name-placeholder": "Mapping name", + "version": "Version" + } + }, "add-edit-dossier-attribute": { "error": { "generic": "Attribut konnte nicht gespeichert werden!" @@ -231,6 +248,7 @@ }, "admin-side-nav": { "audit": "Audit", + "component-mappings": "Component mappings", "component-rule-editor": "Component rule editor", "configurations": "Configurations", "default-colors": "Default colors", @@ -357,6 +375,7 @@ }, "annotation-engines": { "dictionary": "{isHint, select, true{Hint} other{Redaction}} basierend auf Wörterbuch", + "dossier-dictionary": "Annotation based on dossier dictionary", "imported": "Annotation is imported", "ner": "Redaktion basierend auf KI", "rule": "Schwärzung basierend auf Regel {rule}" @@ -511,6 +530,24 @@ "value": "" } }, + "component-mappings-screen": { + "action": { + "delete": "Delete mapping", + "edit": "Edit mapping" + }, + "add-new": "New Mapping", + "bulk-actions": { + "delete": "Delete selected mappings" + }, + "search": "Search by name...", + "table-col-names": { + "name": "name", + "version": "version" + }, + "table-header": { + "title": "Component mapping" + } + }, "component-rules-screen": { "error": { "generic": "Something went wrong... Component rules update failed!" @@ -1641,7 +1678,8 @@ }, "test": { "error": "Die Test-E-Mail konnte nicht gesendet werden! Bitte überprüfen Sie die E-Mail-Adresse.", - "success": "Die Test-E-Mail wurde erfolgreich versendet!" + "success": "Die Test-E-Mail wurde erfolgreich versendet!", + "warning": "Admin mail address not set. Test email sent to {recipientEmail} instead." }, "title": "SMTP-Konto konfigurieren" }, @@ -2132,6 +2170,7 @@ "display-name": "This placeholder is replaced by the name of the entity the component is based on." }, "excerpt": "Dieser Platzhalter wird durch einen Textausschnitt ersetzt, der die Schwärzung enthält.", + "is-skipped": "The skipped redaction placeholder indicates whether a redaction is skipped or not. It can be included in a separate column of a template that also contains the '{{redaction.value'}} placeholder. The placeholder is replaced by “true” if the respective redaction is skipped, and by “false” if it is redacted (i. e., not skipped).", "justification": "Dieser Platzhalter wird durch die Begründung der Schwärzung ersetzt. Es ist eine Kombination aus dem Rechtsverweis (justificationParagraph) und dem Begründungstext (justificationReason).", "justification-legal-basis": "This placeholder is replaced by the legal basis for the component.", "justification-paragraph": "Dieser Platzhalter wird durch den Rechtshinweis der Begründung der Redaktion ersetzt.", @@ -2139,6 +2178,7 @@ "justification-text": "This placeholder is replaced by the justification text.", "page": "Dieser Platzhalter wird durch die Seitenzahl der Redaktion ersetzt.", "paragraph": "Dieser Platzhalter wird durch den Absatz ersetzt, der die Schwärzung enthält.", + "paragraph-idx": "The placeholder is replaced by the number of the paragraph containing the redaction. Paragraphs are numbered on a per-page basis.", "value": "This placeholder is replaced by the value that was extracted." }, "time": { diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json index b981a087c..d9066d318 100644 --- a/apps/red-ui/src/assets/i18n/scm/en.json +++ b/apps/red-ui/src/assets/i18n/scm/en.json @@ -94,6 +94,23 @@ }, "save": "Save dossier template" }, + "add-edit-component-mapping": { + "actions": { + "save": "Save mapping" + }, + "dialog": { + "title": "{type, select, add{Add New} edit{Edit} other{}} Component Mapping" + }, + "form": { + "delimiter": "Delimiter", + "delimiter-placeholder": "Delimiter", + "encoding-type": "Encoding type", + "file": "Mapping file", + "name": "Mapping name", + "name-placeholder": "Mapping name", + "version": "Version" + } + }, "add-edit-dossier-attribute": { "error": { "generic": "Failed to save attribute!" @@ -231,6 +248,7 @@ }, "admin-side-nav": { "audit": "Audit", + "component-mappings": "Component mappings", "component-rule-editor": "Component rule editor", "configurations": "Configurations", "default-colors": "Default colors", @@ -513,6 +531,24 @@ "value": "Value" } }, + "component-mappings-screen": { + "action": { + "delete": "Delete mapping", + "edit": "Edit mapping" + }, + "add-new": "New Mapping", + "bulk-actions": { + "delete": "Delete selected mappings" + }, + "search": "Search by name...", + "table-col-names": { + "name": "name", + "version": "version" + }, + "table-header": { + "title": "Component mapping" + } + }, "component-rules-screen": { "error": { "generic": "Something went wrong... Component rules update failed!" @@ -1643,7 +1679,8 @@ }, "test": { "error": "Test e-mail could not be sent! Please revise the e-mail address.", - "success": "Test e-mail was sent successfully!" + "success": "Test e-mail was sent successfully!", + "warning": "Admin mail address not set. Test email sent to {recipientEmail} instead." }, "title": "Configure SMTP Account" }, diff --git a/libs/red-domain/src/index.ts b/libs/red-domain/src/index.ts index e324c83a5..4d040b981 100644 --- a/libs/red-domain/src/index.ts +++ b/libs/red-domain/src/index.ts @@ -29,3 +29,4 @@ export * from './lib/digital-signature'; export * from './lib/watermarks'; export * from './lib/colors'; export * from './lib/component-log'; +export * from './lib/component-mappings'; diff --git a/libs/red-domain/src/lib/component-mappings/component-mapping-list.model.ts b/libs/red-domain/src/lib/component-mappings/component-mapping-list.model.ts new file mode 100644 index 000000000..24425c4a7 --- /dev/null +++ b/libs/red-domain/src/lib/component-mappings/component-mapping-list.model.ts @@ -0,0 +1,16 @@ +import { ComponentMapping, IComponentMapping } from './component-mapping'; + +export interface IComponentMappingList { + dossierTemplateId: string; + componentMappingList: IComponentMapping[]; +} + +export class ComponentMappingList implements IComponentMappingList { + readonly dossierTemplateId: string; + readonly componentMappingList: ComponentMapping[]; + + constructor(componentMappingList: IComponentMappingList) { + this.dossierTemplateId = componentMappingList.dossierTemplateId; + this.componentMappingList = componentMappingList.componentMappingList; + } +} diff --git a/libs/red-domain/src/lib/component-mappings/component-mapping.ts b/libs/red-domain/src/lib/component-mappings/component-mapping.ts new file mode 100644 index 000000000..b8e1e7745 --- /dev/null +++ b/libs/red-domain/src/lib/component-mappings/component-mapping.ts @@ -0,0 +1,38 @@ +import { IListable } from '@iqser/common-ui'; + +export interface IComponentMapping extends IListable { + id: string; + name: string; + fileName: string; + version: number; + columnLabels: string[]; + numberOfLines: number; + encoding: string; + delimiter: string; +} + +export class ComponentMapping implements IComponentMapping, IListable { + readonly id: string; + readonly name: string; + readonly fileName: string; + readonly version: number; + readonly columnLabels: string[]; + readonly numberOfLines: number; + readonly encoding: string; + readonly delimiter: string; + + constructor(componentMapping: IComponentMapping) { + this.id = componentMapping.id; + this.name = componentMapping.name; + this.fileName = componentMapping.fileName; + this.version = componentMapping.version; + this.columnLabels = componentMapping.columnLabels; + this.numberOfLines = componentMapping.numberOfLines; + this.encoding = componentMapping.encoding; + this.delimiter = componentMapping.delimiter; + } + + get searchKey(): string { + return this.name; + } +} diff --git a/libs/red-domain/src/lib/component-mappings/index.ts b/libs/red-domain/src/lib/component-mappings/index.ts new file mode 100644 index 000000000..88026faa7 --- /dev/null +++ b/libs/red-domain/src/lib/component-mappings/index.ts @@ -0,0 +1,2 @@ +export * from './component-mapping-list.model'; +export * from './component-mapping'; diff --git a/libs/red-domain/src/lib/configuration/smtp-configuration.ts b/libs/red-domain/src/lib/configuration/smtp-configuration.ts index 4095e55f5..88226f110 100644 --- a/libs/red-domain/src/lib/configuration/smtp-configuration.ts +++ b/libs/red-domain/src/lib/configuration/smtp-configuration.ts @@ -13,3 +13,10 @@ export interface ISmtpConfiguration { starttls?: boolean; user?: string; } + +export interface ITextConnectionResponse { + adminEmail: boolean; + reasonPhrase: string; + recipientEmail: string; + statusCode: number; +} diff --git a/package.json b/package.json index b232ca09f..ccf647ba5 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@messageformat/core": "^3.3.0", "@ngx-translate/core": "15.0.0", "@ngx-translate/http-loader": "8.0.0", - "@pdftron/webviewer": "10.8.0", + "@pdftron/webviewer": "10.9.0", "chart.js": "4.4.2", "dayjs": "1.11.10", "file-saver": "^2.0.5", diff --git a/yarn.lock b/yarn.lock index e7849a41c..9d471b01e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3131,10 +3131,10 @@ resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.2.4.tgz#8e7eb0f9c7bee12977f37ebddc935463d9251793" integrity sha512-Y52Afz02Ub1kRZXd6NUTwPMjKQqBKZ35e5dUEpl14na2fWvdgdMz4bYOBPUcmQrovlxBGhmFXtFzxkdW3zyRbQ== -"@pdftron/webviewer@10.8.0": - version "10.8.0" - resolved "https://registry.yarnpkg.com/@pdftron/webviewer/-/webviewer-10.8.0.tgz#d19d698cb80d011acb4a9a844141bf37d186ac1f" - integrity sha512-/VPHEDTrqVEbjLTu5YIDExARXqrG6JUKtguOjvF+hlH21V465FIVw/BfZw+A0rpxSZFoTYf0Wtly5u8ZFXofng== +"@pdftron/webviewer@10.9.0": + version "10.9.0" + resolved "https://registry.yarnpkg.com/@pdftron/webviewer/-/webviewer-10.9.0.tgz#c39105189c70cfaa0601dae02e688bb510f74e3b" + integrity sha512-na6dQE1aFVc42zeRYjk0UDWKqdsI1PcQeQdAcwpNCKyND9W3s8iG8GLkZzfvP2CZjGhj47l28LkZ0NUBrq3weQ== "@phenomnomnominal/tsquery@^4.1.1": version "4.2.0"