Translation rework: extract strings done

This commit is contained in:
Adina Țeudan 2021-07-23 00:21:14 +03:00
parent 346203f8af
commit d5c55b33e2
46 changed files with 139 additions and 1407 deletions

View File

@ -1,4 +1,4 @@
<redaction-side-nav [title]="type"> <redaction-side-nav [title]="translations[type] | translate">
<ng-container *ngFor="let item of items[type]"> <ng-container *ngFor="let item of items[type]">
<div <div
*ngIf=" *ngIf="

View File

@ -3,6 +3,9 @@ import { PermissionsService } from '@services/permissions.service';
import { UserPreferenceService } from '@services/user-preference.service'; import { UserPreferenceService } from '@services/user-preference.service';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { adminSideNavTranslations } from '../translations/admin-side-nav-translations';
type Type = 'settings' | 'dossierTemplates';
@Component({ @Component({
selector: 'redaction-admin-side-nav', selector: 'redaction-admin-side-nav',
@ -10,10 +13,11 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
styleUrls: ['./admin-side-nav.component.scss'] styleUrls: ['./admin-side-nav.component.scss']
}) })
export class AdminSideNavComponent { export class AdminSideNavComponent {
@Input() type: 'settings' | 'dossier-templates'; @Input() type: Type;
translations = adminSideNavTranslations;
items: { items: {
[key: string]: { [key in Type]: {
screen: string; screen: string;
onlyDevMode?: boolean; onlyDevMode?: boolean;
onlyAdmin?: boolean; onlyAdmin?: boolean;
@ -30,7 +34,7 @@ export class AdminSideNavComponent {
{ screen: 'users', label: _('user-management'), userManagerOnly: true }, { screen: 'users', label: _('user-management'), userManagerOnly: true },
{ screen: 'smtp-config', label: _('configurations'), onlyAdmin: true } { screen: 'smtp-config', label: _('configurations'), onlyAdmin: true }
], ],
'dossier-templates': [ dossierTemplates: [
{ screen: 'dictionaries', label: _('dictionaries') }, { screen: 'dictionaries', label: _('dictionaries') },
{ screen: 'rules', onlyDevMode: true, label: _('rule-editor') }, { screen: 'rules', onlyDevMode: true, label: _('rule-editor') },
{ screen: 'default-colors', label: _('default-colors') }, { screen: 'default-colors', label: _('default-colors') },

View File

@ -6,6 +6,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { DefaultColorType } from '@models/default-color-key.model'; import { DefaultColorType } from '@models/default-color-key.model';
import { defaultColorsTranslations } from '../../translations/default-colors-translations'; import { defaultColorsTranslations } from '../../translations/default-colors-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@Component({ @Component({
selector: 'redaction-edit-color-dialog', selector: 'redaction-edit-color-dialog',
@ -52,10 +53,10 @@ export class EditColorDialogComponent {
try { try {
await this._dictionaryControllerService.setColors(colors, this._dossierTemplateId).toPromise(); await this._dictionaryControllerService.setColors(colors, this._dossierTemplateId).toPromise();
this._dialogRef.close(true); this._dialogRef.close(true);
const color = this._translateService.instant(`default-colors-screen.types.${this.colorKey}`); const color = this._translateService.instant(defaultColorsTranslations[this.colorKey]);
this._toaster.info('edit-color-dialog.success', { params: { color: color } }); this._toaster.info(_('edit-color-dialog.success'), { params: { color: color } });
} catch (e) { } catch (e) {
this._toaster.error('edit-color-dialog.error'); this._toaster.error(_('edit-color-dialog.error'));
} }
} }
} }

View File

@ -126,9 +126,7 @@
class="center" class="center"
> >
<div class="csv-part-header"> <div class="csv-part-header">
<div class="all-caps-label"> <div [translate]="'file-attributes-csv-import.csv-column'" class="all-caps-label"></div>
{{ 'file-attributes-csv-import.csv-column' + (previewExpanded ? '' : '-preview') | translate }}
</div>
<redaction-circle-button <redaction-circle-button
(click)="previewExpanded = !previewExpanded" (click)="previewExpanded = !previewExpanded"
[icon]="previewExpanded ? 'red:expand' : 'red:collapse'" [icon]="previewExpanded ? 'red:expand' : 'red:collapse'"

View File

@ -13,6 +13,7 @@ import { SearchService } from '@shared/services/search.service';
import { ScreenStateService } from '@shared/services/screen-state.service'; import { ScreenStateService } from '@shared/services/screen-state.service';
import { SortingService } from '@services/sorting.service'; import { SortingService } from '@services/sorting.service';
import { BaseListingComponent } from '@shared/base/base-listing.component'; import { BaseListingComponent } from '@shared/base/base-listing.component';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
export interface Field { export interface Field {
id?: string; id?: string;
@ -202,9 +203,9 @@ export class FileAttributesCsvImportDialogComponent extends BaseListingComponent
try { try {
await this._fileAttributesControllerService.setFileAttributesConfig(fileAttributes, this.dossierTemplateId).toPromise(); await this._fileAttributesControllerService.setFileAttributesConfig(fileAttributes, this.dossierTemplateId).toPromise();
this._toaster.success('file-attributes-csv-import.save.success', { params: { count: this.activeFields.length } }); this._toaster.success(_('file-attributes-csv-import.save.success'), { params: { count: this.activeFields.length } });
} catch (e) { } catch (e) {
this._toaster.error('file-attributes-csv-import.save.error'); this._toaster.error(_('file-attributes-csv-import.save.error'));
} }
this.dialogRef.close(true); this.dialogRef.close(true);

View File

@ -7,6 +7,7 @@ import { applyIntervalConstraints } from '@utils/date-inputs-utils';
import { LoadingService } from '@services/loading.service'; import { LoadingService } from '@services/loading.service';
import { AutoUnsubscribeComponent } from '@shared/base/auto-unsubscribe.component'; import { AutoUnsubscribeComponent } from '@shared/base/auto-unsubscribe.component';
import { auditCategoriesTranslations } from '../../translations/audit-categories-translations'; import { auditCategoriesTranslations } from '../../translations/audit-categories-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
const PAGE_SIZE = 50; const PAGE_SIZE = 50;
@ -17,7 +18,7 @@ const PAGE_SIZE = 50;
}) })
export class AuditScreenComponent extends AutoUnsubscribeComponent implements OnDestroy { export class AuditScreenComponent extends AutoUnsubscribeComponent implements OnDestroy {
readonly ALL_CATEGORIES = 'allCategories'; readonly ALL_CATEGORIES = 'allCategories';
readonly ALL_USERS = 'audit-screen.all-users'; readonly ALL_USERS = _('audit-screen.all-users');
translations = auditCategoriesTranslations; translations = auditCategoriesTranslations;
filterForm: FormGroup; filterForm: FormGroup;

View File

@ -17,7 +17,7 @@
<div class="red-content-inner"> <div class="red-content-inner">
<div class="overlay-shadow"></div> <div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossier-templates"></redaction-admin-side-nav> <redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<div class="content-container"> <div class="content-container">
<div class="header-item"> <div class="header-item">

View File

@ -17,7 +17,7 @@
<div class="red-content-inner"> <div class="red-content-inner">
<div class="overlay-shadow"></div> <div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossier-templates"></redaction-admin-side-nav> <redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<div class="content-container"> <div class="content-container">
<div class="header-item"> <div class="header-item">

View File

@ -51,7 +51,7 @@
<div class="flex red-content-inner"> <div class="flex red-content-inner">
<div class="overlay-shadow"></div> <div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossier-templates"></redaction-admin-side-nav> <redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<redaction-dictionary-manager <redaction-dictionary-manager
#dictionaryManager #dictionaryManager

View File

@ -6,6 +6,7 @@ import { PermissionsService } from '@services/permissions.service';
import { lastIndexOfEnd } from '@utils/functions'; import { lastIndexOfEnd } from '@utils/functions';
import { AutoUnsubscribeComponent } from '@shared/base/auto-unsubscribe.component'; import { AutoUnsubscribeComponent } from '@shared/base/auto-unsubscribe.component';
import { LoadingService } from '@services/loading.service'; import { LoadingService } from '@services/loading.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@Component({ @Component({
selector: 'redaction-digital-signature-screen', selector: 'redaction-digital-signature-screen',
@ -47,13 +48,13 @@ export class DigitalSignatureScreenComponent extends AutoUnsubscribeComponent im
this.addSubscription = observable.subscribe( this.addSubscription = observable.subscribe(
() => { () => {
this.loadDigitalSignatureAndInitializeForm(); this.loadDigitalSignatureAndInitializeForm();
this._toaster.success('digital-signature-screen.action.save-success'); this._toaster.success(_('digital-signature-screen.action.save-success'));
}, },
error => { error => {
if (error.status === 400) { if (error.status === 400) {
this._toaster.error('digital-signature-screen.action.certificate-not-valid-error'); this._toaster.error(_('digital-signature-screen.action.certificate-not-valid-error'));
} else { } else {
this._toaster.error('digital-signature-screen.action.save-error'); this._toaster.error(_('digital-signature-screen.action.save-error'));
} }
} }
); );
@ -63,9 +64,9 @@ export class DigitalSignatureScreenComponent extends AutoUnsubscribeComponent im
this.addSubscription = this._digitalSignatureControllerService.deleteDigitalSignature().subscribe( this.addSubscription = this._digitalSignatureControllerService.deleteDigitalSignature().subscribe(
() => { () => {
this.loadDigitalSignatureAndInitializeForm(); this.loadDigitalSignatureAndInitializeForm();
this._toaster.success('digital-signature-screen.action.delete-success'); this._toaster.success(_('digital-signature-screen.action.delete-success'));
}, },
() => this._toaster.error('digital-signature-screen.action.delete-error') () => this._toaster.error(_('digital-signature-screen.action.delete-error'))
); );
} }

View File

@ -17,7 +17,7 @@
<div class="red-content-inner"> <div class="red-content-inner">
<div class="overlay-shadow"></div> <div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossier-templates"></redaction-admin-side-nav> <redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<div class="content-container"> <div class="content-container">
<div *ngIf="(screenStateService.noData$ | async) === false" class="header-item"> <div *ngIf="(screenStateService.noData$ | async) === false" class="header-item">
@ -129,7 +129,7 @@
<redaction-circle-button <redaction-circle-button
(action)="openConfirmDeleteAttributeDialog($event, attribute)" (action)="openConfirmDeleteAttributeDialog($event, attribute)"
[tooltip]="'file-attributes-listing.action.delete' | translate" [tooltip]="'dossier-attributes-listing.action.delete' | translate"
icon="red:trash" icon="red:trash"
type="dark-bg" type="dark-bg"
></redaction-circle-button> ></redaction-circle-button>

View File

@ -17,7 +17,7 @@
<div class="red-content-inner"> <div class="red-content-inner">
<div class="overlay-shadow"></div> <div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossier-templates"></redaction-admin-side-nav> <redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<div class="content-container"> <div class="content-container">
<div class="header-item"> <div class="header-item">

View File

@ -17,7 +17,7 @@
<div class="red-content-inner"> <div class="red-content-inner">
<div class="overlay-shadow"></div> <div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossier-templates"></redaction-admin-side-nav> <redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<div class="content-container" redactionHasScrollbar> <div class="content-container" redactionHasScrollbar>
<div class="heading-xl" translate="reports-screen.title"></div> <div class="heading-xl" translate="reports-screen.title"></div>

View File

@ -17,7 +17,7 @@
<div class="red-content-inner"> <div class="red-content-inner">
<div class="overlay-shadow"></div> <div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossier-templates"></redaction-admin-side-nav> <redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<div class="editor-container"> <div class="editor-container">
<ngx-monaco-editor (init)="onCodeEditorInit($event)" [(ngModel)]="codeEditorText" [options]="editorOptions"></ngx-monaco-editor> <ngx-monaco-editor (init)="onCodeEditorInit($event)" [(ngModel)]="codeEditorText" [options]="editorOptions"></ngx-monaco-editor>

View File

@ -66,8 +66,9 @@ export class UserListingScreenComponent extends BaseListingComponent<User> imple
} }
getDisplayRoles(user: User) { getDisplayRoles(user: User) {
const separator = ', ';
return ( return (
user.roles.map(role => this._translateService.instant(this.translations[role])).join(', ') || user.roles.map(role => this._translateService.instant(this.translations[role])).join(separator) ||
this._translateService.instant(this.translations['NO_ROLE']) this._translateService.instant(this.translations['NO_ROLE'])
); );
} }

View File

@ -17,7 +17,7 @@
<div class="red-content-inner"> <div class="red-content-inner">
<div class="overlay-shadow"></div> <div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossier-templates"></redaction-admin-side-nav> <redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<div class="content-container"> <div class="content-container">
<div #viewer class="viewer"></div> <div #viewer class="viewer"></div>

View File

@ -0,0 +1,6 @@
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
export const adminSideNavTranslations = {
settings: _('admin-side-nav.settings'),
dossierTemplates: _('admin-side-nav.dossier-templates')
};

View File

@ -1,15 +1,13 @@
<ng-container *ngIf="appStateService.activeDossier"> <ng-container *ngIf="appStateService.activeDossier">
<div class="collapsed-wrapper"> <div class="collapsed-wrapper">
<ng-container <ng-container *ngTemplateOutlet="collapsible; context: { action: 'expand', tooltip: (expandTooltip | translate) }"></ng-container>
*ngTemplateOutlet="collapsible; context: { action: 'expand', tooltip: 'dossier-details.expand' | translate }"
></ng-container>
<div class="all-caps-label" translate="dossier-details.title"></div> <div class="all-caps-label" translate="dossier-details.title"></div>
</div> </div>
<div class="header-wrapper mt-8"> <div class="header-wrapper mt-8">
<div class="heading-xl flex-1">{{ appStateService.activeDossier.dossier.dossierName }}</div> <div class="heading-xl flex-1">{{ appStateService.activeDossier.dossier.dossierName }}</div>
<ng-container <ng-container
*ngTemplateOutlet="collapsible; context: { action: 'collapse', tooltip: 'dossier-details.collapse' | translate }" *ngTemplateOutlet="collapsible; context: { action: 'collapse', tooltip: (collapseTooltip | translate) }"
></ng-container> ></ng-container>
</div> </div>

View File

@ -11,6 +11,7 @@ import { Toaster } from '@services/toaster.service';
import { FilterService } from '@shared/services/filter.service'; import { FilterService } from '@shared/services/filter.service';
import { DossierAttributeWithValue } from '@models/dossier-attributes.model'; import { DossierAttributeWithValue } from '@models/dossier-attributes.model';
import { fileStatusTranslations } from '../../translations/file-status-translations'; import { fileStatusTranslations } from '../../translations/file-status-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@Component({ @Component({
selector: 'redaction-dossier-details', selector: 'redaction-dossier-details',
@ -25,6 +26,8 @@ export class DossierDetailsComponent implements OnInit {
@Output() openAssignDossierMembersDialog = new EventEmitter(); @Output() openAssignDossierMembersDialog = new EventEmitter();
@Output() openDossierDictionaryDialog = new EventEmitter(); @Output() openDossierDictionaryDialog = new EventEmitter();
@Output() toggleCollapse = new EventEmitter(); @Output() toggleCollapse = new EventEmitter();
collapseTooltip = _('dossier-details.collapse');
expandTooltip = _('dossier-details.expand');
readonly needsWorkFilters$ = this.filterService.getFilterModels$('needsWorkFilters'); readonly needsWorkFilters$ = this.filterService.getFilterModels$('needsWorkFilters');

View File

@ -48,10 +48,10 @@ export class FileActionsComponent implements OnInit {
get toggleTooltip(): string { get toggleTooltip(): string {
if (!this.permissionsService.isManager()) { if (!this.permissionsService.isManager()) {
return 'file-preview.toggle-analysis.only-managers'; return _('file-preview.toggle-analysis.only-managers');
} }
return this.fileStatus?.isExcluded ? 'file-preview.toggle-analysis.enable' : 'file-preview.toggle-analysis.disable'; return this.fileStatus?.isExcluded ? _('file-preview.toggle-analysis.enable') : _('file-preview.toggle-analysis.disable');
} }
get canAssignToSelf() { get canAssignToSelf() {

View File

@ -5,6 +5,7 @@ import { PageRange, ReanalysisControllerService } from '@redaction/red-ui-http';
import { FileDataModel } from '../../../../models/file/file-data.model'; import { FileDataModel } from '../../../../models/file/file-data.model';
import { Toaster } from '@services/toaster.service'; import { Toaster } from '@services/toaster.service';
import { LoadingService } from '@services/loading.service'; import { LoadingService } from '@services/loading.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@Component({ @Component({
selector: 'redaction-page-exclusion', selector: 'redaction-page-exclusion',
@ -78,7 +79,7 @@ export class PageExclusionComponent implements OnChanges {
this.excludePagesForm.reset(); this.excludePagesForm.reset();
this.actionPerformed.emit('exclude-pages'); this.actionPerformed.emit('exclude-pages');
} catch (e) { } catch (e) {
this._toaster.error('file-preview.tabs.exclude-pages.error'); this._toaster.error(_('file-preview.tabs.exclude-pages.error'));
this._loadingService.stop(); this._loadingService.stop();
} }
} }

View File

@ -6,8 +6,8 @@
<redaction-empty-state <redaction-empty-state
*ngIf="!customAttributes.length" *ngIf="!customAttributes.length"
[text]="'edit-dossier-dialog.attributes.no-custom-attributes' | translate"
icon="red:attribute" icon="red:attribute"
text="edit-dossier-dialog.attributes.no-custom-attributes"
></redaction-empty-state> ></redaction-empty-state>
<div *ngFor="let attr of customAttributes" [class.datepicker-wrapper]="isDate(attr)" class="red-input-group"> <div *ngFor="let attr of customAttributes" [class.datepicker-wrapper]="isDate(attr)" class="red-input-group">
@ -36,8 +36,8 @@
<redaction-empty-state <redaction-empty-state
*ngIf="!imageAttributes.length" *ngIf="!imageAttributes.length"
[text]="'edit-dossier-dialog.attributes.no-image-attributes' | translate"
icon="red:attribute" icon="red:attribute"
text="edit-dossier-dialog.attributes.no-image-attributes"
></redaction-empty-state> ></redaction-empty-state>
<div <div

View File

@ -4,7 +4,7 @@
</div> </div>
<div class="dialog-content"> <div class="dialog-content">
<redaction-side-nav title="configurations"> <redaction-side-nav [title]="'edit-dossier-dialog.side-nav-title' | translate">
<div <div
(click)="changeTab(item.key)" (click)="changeTab(item.key)"
*ngFor="let item of navItems" *ngFor="let item of navItems"

View File

@ -51,6 +51,7 @@ export class EditDossierDialogComponent {
}, },
{ {
key: 'dossierDictionary', key: 'dossierDictionary',
sideNavTitle: _('edit-dossier-dialog.nav-items.dictionary'),
title: _('edit-dossier-dialog.nav-items.dossier-dictionary') title: _('edit-dossier-dialog.nav-items.dossier-dictionary')
}, },
{ {
@ -95,7 +96,7 @@ export class EditDossierDialogComponent {
} }
updatedDossier(updatedDossier: DossierWrapper) { updatedDossier(updatedDossier: DossierWrapper) {
this._toaster.success('edit-dossier-dialog.change-successful'); this._toaster.success(_('edit-dossier-dialog.change-successful'));
if (updatedDossier) { if (updatedDossier) {
this.dossierWrapper = updatedDossier; this.dossierWrapper = updatedDossier;
@ -120,7 +121,7 @@ export class EditDossierDialogComponent {
changeTab(key: Section) { changeTab(key: Section) {
if (this.activeComponent.changed) { if (this.activeComponent.changed) {
this._toaster.error('edit-dossier-dialog.unsaved-changes'); this._toaster.error(_('edit-dossier-dialog.unsaved-changes'));
return; return;
} }
this.activeNav = key; this.activeNav = key;

View File

@ -11,6 +11,7 @@ import { Router } from '@angular/router';
import { MatDialogRef } from '@angular/material/dialog'; import { MatDialogRef } from '@angular/material/dialog';
import { EditDossierDialogComponent } from '../edit-dossier-dialog.component'; import { EditDossierDialogComponent } from '../edit-dossier-dialog.component';
import { Toaster } from '@services/toaster.service'; import { Toaster } from '@services/toaster.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@Component({ @Component({
selector: 'redaction-edit-dossier-general-info', selector: 'redaction-edit-dossier-general-info',
@ -111,7 +112,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
} }
private _notifyDossierDeleted() { private _notifyDossierDeleted() {
this._toaster.success('edit-dossier-dialog.delete-successful'); this._toaster.success(_('edit-dossier-dialog.delete-successful'));
} }
private _filterInvalidDossierTemplates() { private _filterInvalidDossierTemplates() {

View File

@ -11,7 +11,7 @@
formControlName="type" formControlName="type"
> >
<mat-option *ngFor="let option of typeOptions" [value]="option"> <mat-option *ngFor="let option of typeOptions" [value]="option">
{{ 'recategorize-image-dialog.options.' + option | translate }} {{ translations[option] | translate }}
</mat-option> </mat-option>
</mat-select> </mat-select>
</div> </div>

View File

@ -3,6 +3,8 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { imageCategoriesTranslations } from '../../translations/image-categories-translations';
import { ImageCategory } from '../../models/image-category.model';
@Component({ @Component({
selector: 'redaction-recategorize-image-dialog', selector: 'redaction-recategorize-image-dialog',
@ -12,7 +14,8 @@ import { AnnotationWrapper } from '@models/file/annotation.wrapper';
export class RecategorizeImageDialogComponent implements OnInit { export class RecategorizeImageDialogComponent implements OnInit {
recategorizeImageForm: FormGroup; recategorizeImageForm: FormGroup;
isDocumentAdmin: boolean; isDocumentAdmin: boolean;
typeOptions: string[] = ['signature', 'logo', 'formula', 'image']; typeOptions: ImageCategory[] = ['signature', 'logo', 'formula', 'image'];
translations = imageCategoriesTranslations;
constructor( constructor(
private readonly _permissionsService: PermissionsService, private readonly _permissionsService: PermissionsService,

View File

@ -0,0 +1 @@
export type ImageCategory = 'signature' | 'logo' | 'formula' | 'image';

View File

@ -8,10 +8,7 @@
<div class="red-content-inner"> <div class="red-content-inner">
<div class="content-container"> <div class="content-container">
<redaction-table-header <redaction-table-header [tableColConfigs]="tableColConfigs" [tableHeaderLabel]="tableHeaderLabel"></redaction-table-header>
[tableColConfigs]="tableColConfigs"
[tableHeaderLabel]="'dossier-listing.table-header.title'"
></redaction-table-header>
<redaction-empty-state <redaction-empty-state
(action)="openAddDossierDialog()" (action)="openAddDossierDialog()"

View File

@ -75,8 +75,8 @@ export class DossierListingScreenComponent
dossiersChartData: DoughnutChartConfig[] = []; dossiersChartData: DoughnutChartConfig[] = [];
documentsChartData: DoughnutChartConfig[] = []; documentsChartData: DoughnutChartConfig[] = [];
protected readonly _primaryKey = 'dossierName'; protected readonly _primaryKey = 'dossierName';
protected _tableHeaderLabel = _('dossier-listing.table-header.title');
private _lastScrollPosition: number; private _lastScrollPosition: number;
@ViewChild('needsWorkTemplate', { read: TemplateRef, static: true }) @ViewChild('needsWorkTemplate', { read: TemplateRef, static: true })
private readonly _needsWorkTemplate: TemplateRef<any>; private readonly _needsWorkTemplate: TemplateRef<any>;

View File

@ -34,6 +34,7 @@ import { DossierAttributeWithValue } from '@models/dossier-attributes.model';
import { UserPreferenceService } from '@services/user-preference.service'; import { UserPreferenceService } from '@services/user-preference.service';
import { workloadTranslations } from '../../translations/workload-translations'; import { workloadTranslations } from '../../translations/workload-translations';
import { fileStatusTranslations } from '../../translations/file-status-translations'; import { fileStatusTranslations } from '../../translations/file-status-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@Component({ @Component({
templateUrl: './dossier-overview-screen.component.html', templateUrl: './dossier-overview-screen.component.html',
@ -148,9 +149,9 @@ export class DossierOverviewScreenComponent
.reanalyzeDossier() .reanalyzeDossier()
.then(() => { .then(() => {
this.reloadDossiers(); this.reloadDossiers();
this._toaster.success('dossier-overview.reanalyse-dossier.success'); this._toaster.success(_('dossier-overview.reanalyse-dossier.success'));
}) })
.catch(() => this._toaster.error('dossier-overview.reanalyse-dossier.error')); .catch(() => this._toaster.error(_('dossier-overview.reanalyse-dossier.error')));
} }
reloadDossiers() { reloadDossiers() {

View File

@ -151,8 +151,8 @@
<redaction-empty-state <redaction-empty-state
*ngIf="viewReady && appStateService.activeFile.isExcluded && !viewDocumentInfo && !excludePages" *ngIf="viewReady && appStateService.activeFile.isExcluded && !viewDocumentInfo && !excludePages"
[horizontalPadding]="40" [horizontalPadding]="40"
[text]="'file-preview.tabs.is-excluded' | translate"
icon="red:needs-work" icon="red:needs-work"
text="file-preview.tabs.is-excluded"
></redaction-empty-state> ></redaction-empty-state>
<redaction-document-info <redaction-document-info

View File

@ -4,6 +4,7 @@ import { SuperTypeSorter } from '@utils/sorters/super-type-sorter';
import { FilterModel } from '@shared/components/filters/popup-filter/model/filter.model'; import { FilterModel } from '@shared/components/filters/popup-filter/model/filter.model';
import { handleCheckedValue } from '@shared/components/filters/popup-filter/utils/filter-utils'; import { handleCheckedValue } from '@shared/components/filters/popup-filter/utils/filter-utils';
import { annotationTypesTranslations } from '../../../translations/annotation-types-translations'; import { annotationTypesTranslations } from '../../../translations/annotation-types-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@Injectable() @Injectable()
export class AnnotationProcessingService { export class AnnotationProcessingService {
@ -12,7 +13,7 @@ export class AnnotationProcessingService {
{ {
key: 'with-comments', key: 'with-comments',
icon: 'red:comment', icon: 'red:comment',
label: 'filter-menu.with-comments', label: _('filter-menu.with-comments'),
checked: false, checked: false,
topLevelFilter: true, topLevelFilter: true,
filters: [], filters: [],
@ -21,7 +22,7 @@ export class AnnotationProcessingService {
{ {
key: 'with-reason-changes', key: 'with-reason-changes',
icon: 'red:reason', icon: 'red:reason',
label: 'filter-menu.with-reason-changes', label: _('filter-menu.with-reason-changes'),
checked: false, checked: false,
topLevelFilter: true, topLevelFilter: true,
filters: [], filters: [],

View File

@ -14,6 +14,7 @@ import { UserService } from '@services/user.service';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { AnnotationActionMode } from '../models/annotation-action-mode.model'; import { AnnotationActionMode } from '../models/annotation-action-mode.model';
import { annotationActionsTranslations } from '../translations/annotation-actions-translations'; import { annotationActionsTranslations } from '../translations/annotation-actions-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@Injectable() @Injectable()
export class ManualAnnotationService { export class ManualAnnotationService {
@ -196,20 +197,20 @@ export class ManualAnnotationService {
if (this._permissionsService.isApprover()) { if (this._permissionsService.isApprover()) {
switch (type) { switch (type) {
case 'DICTIONARY': case 'DICTIONARY':
return 'manual-annotation.dialog.header.dictionary'; return _('manual-annotation.dialog.header.dictionary');
case 'FALSE_POSITIVE': case 'FALSE_POSITIVE':
return 'manual-annotation.dialog.header.false-positive'; return _('manual-annotation.dialog.header.false-positive');
case 'REDACTION': case 'REDACTION':
return 'manual-annotation.dialog.header.redaction'; return _('manual-annotation.dialog.header.redaction');
} }
} else { } else {
switch (type) { switch (type) {
case 'DICTIONARY': case 'DICTIONARY':
return 'manual-annotation.dialog.header.request-dictionary'; return _('manual-annotation.dialog.header.request-dictionary');
case 'FALSE_POSITIVE': case 'FALSE_POSITIVE':
return 'manual-annotation.dialog.header.request-false-positive'; return _('manual-annotation.dialog.header.request-false-positive');
case 'REDACTION': case 'REDACTION':
return 'manual-annotation.dialog.header.request-redaction'; return _('manual-annotation.dialog.header.request-redaction');
} }
} }
} }

View File

@ -0,0 +1,9 @@
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { ImageCategory } from '../models/image-category.model';
export const imageCategoriesTranslations: { [key in ImageCategory]: string } = {
signature: _('image-category.signature'),
logo: _('image-category.logo'),
formula: _('image-category.formula'),
image: _('image-category.image')
};

View File

@ -23,6 +23,7 @@ export abstract class BaseListingComponent<T> extends AutoUnsubscribeComponent i
readonly sortedDisplayedEntities$: Observable<T[]>; readonly sortedDisplayedEntities$: Observable<T[]>;
readonly noMatch$: Observable<boolean>; readonly noMatch$: Observable<boolean>;
protected readonly _tableHeaderLabel: string;
/** /**
* Key used in the *trackBy* function with **ngFor* or **cdkVirtualFor* * Key used in the *trackBy* function with **ngFor* or **cdkVirtualFor*
* and in the default sorting and as the search field * and in the default sorting and as the search field
@ -44,6 +45,14 @@ export abstract class BaseListingComponent<T> extends AutoUnsubscribeComponent i
this.noMatch$ = this._noMatch$; this.noMatch$ = this._noMatch$;
} }
get tableHeaderLabel(): string {
if (!this._tableHeaderLabel) {
throw new Error('Not implemented');
}
return this._tableHeaderLabel;
}
get allEntities(): T[] { get allEntities(): T[] {
return this.screenStateService.allEntities; return this.screenStateService.allEntities;
} }

View File

@ -7,6 +7,7 @@ import { Toaster } from '@services/toaster.service';
import { BASE_HREF } from '../../../../../tokens'; import { BASE_HREF } from '../../../../../tokens';
import { AutoUnsubscribeComponent } from '@shared/base/auto-unsubscribe.component'; import { AutoUnsubscribeComponent } from '@shared/base/auto-unsubscribe.component';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
export type MenuState = 'OPEN' | 'CLOSED'; export type MenuState = 'OPEN' | 'CLOSED';
@ -53,7 +54,7 @@ export class FileDownloadBtnComponent extends AutoUnsubscribeComponent implement
this.addSubscription = this._fileDownloadService this.addSubscription = this._fileDownloadService
.downloadFiles(Array.isArray(this.file) ? this.file : [this.file], this.dossier) .downloadFiles(Array.isArray(this.file) ? this.file : [this.file], this.dossier)
.subscribe(() => { .subscribe(() => {
this._toaster.info('download-status.queued', { params: { baseUrl: this._baseHref } }); this._toaster.info(_('download-status.queued'), { params: { baseUrl: this._baseHref } });
}); });
} }
} }

View File

@ -5,6 +5,7 @@ import { debounce } from '@utils/debounce';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { map, take } from 'rxjs/operators'; import { map, take } from 'rxjs/operators';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { DossierWrapper } from '@state/model/dossier.wrapper';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import ICodeEditor = monaco.editor.ICodeEditor; import ICodeEditor = monaco.editor.ICodeEditor;
import IDiffEditor = monaco.editor.IDiffEditor; import IDiffEditor = monaco.editor.IDiffEditor;
import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration; import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration;
@ -37,7 +38,7 @@ export class DictionaryManagerComponent implements OnChanges, OnInit {
showDiffEditor = false; showDiffEditor = false;
searchText = ''; searchText = '';
selectDossier = { name: 'dictionary-overview.compare.select-dossier' }; selectDossier = { name: _('dictionary-overview.compare.select-dossier') };
compare: false; compare: false;
private _codeEditor: ICodeEditor; private _codeEditor: ICodeEditor;

View File

@ -1,3 +1,3 @@
<div [translate]="title" class="all-caps-label"></div> <div class="all-caps-label">{{ title }}</div>
<ng-content></ng-content> <ng-content></ng-content>

View File

@ -48,7 +48,8 @@ export class ConfirmationDialogComponent {
) { ) {
this.config = _confirmationDialogInput ?? new ConfirmationDialogInput(); this.config = _confirmationDialogInput ?? new ConfirmationDialogInput();
this.config = this.translate(this.config); this.config = this.translate(this.config);
this.inputLabel = this.translate('confirmation-dialog.delete-dossier.input-label') + ` '${this.config.confirmationText}'`; this.inputLabel =
this._translateService.instant('confirmation-dialog.delete-dossier.input-label') + ` '${this.config.confirmationText}'`;
} }
get isDeleteAction() { get isDeleteAction() {

View File

@ -3,6 +3,7 @@ import { Observable, throwError } from 'rxjs';
import { Toaster } from '@services/toaster.service'; import { Toaster } from '@services/toaster.service';
import { DictionaryControllerService } from '@redaction/red-ui-http'; import { DictionaryControllerService } from '@redaction/red-ui-http';
import { tap } from 'rxjs/operators'; import { tap } from 'rxjs/operators';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
const MIN_WORD_LENGTH = 2; const MIN_WORD_LENGTH = 2;
@ -39,13 +40,13 @@ export class DictionarySaveService {
return obs.pipe( return obs.pipe(
tap( tap(
() => { () => {
if (showToast) this._toaster.success('dictionary-overview.success.generic'); if (showToast) this._toaster.success(_('dictionary-overview.success.generic'));
}, },
() => this._toaster.error('dictionary-overview.error.generic') () => this._toaster.error(_('dictionary-overview.error.generic'))
) )
); );
} else { } else {
this._toaster.error('dictionary-overview.error.entries-too-short'); this._toaster.error(_('dictionary-overview.error.entries-too-short'));
return throwError('Entries too short'); return throwError('Entries too short');
} }

View File

@ -331,7 +331,7 @@ export class AppStateService {
const index = this.allDossiers.findIndex(p => p.dossierId === dossier.dossierId); const index = this.allDossiers.findIndex(p => p.dossierId === dossier.dossierId);
this._appState.dossiers.splice(index, 1); this._appState.dossiers.splice(index, 1);
}, },
() => this._toaster.error('dossiers.delete.delete-failed', { params: dossier }) () => this._toaster.error(_('dossier-listing.delete.delete-failed'), { params: dossier })
); );
} }

View File

@ -4,6 +4,6 @@ export class REDMissingTranslationHandler implements MissingTranslationHandler {
handle(params: MissingTranslationHandlerParams): any { handle(params: MissingTranslationHandlerParams): any {
const missingKey = params.key; const missingKey = params.key;
console.error('Missing translation: ' + missingKey); console.error('Missing translation: ' + missingKey);
return `?${missingKey}?`; return missingKey;
} }
} }

View File

@ -106,6 +106,10 @@
}, },
"title": "{type, select, edit{Edit} create{Add New} other{}} User" "title": "{type, select, edit{Edit} create{Add New} other{}} User"
}, },
"admin-side-nav": {
"dossier-templates": "Dossier Templates",
"settings": "Settings"
},
"annotation": "Annotation", "annotation": "Annotation",
"annotation-actions": { "annotation-actions": {
"accept-recommendation": { "accept-recommendation": {
@ -189,7 +193,6 @@
"error": "Failed to request image recategorization: {error}", "error": "Failed to request image recategorization: {error}",
"success": "Image recategorization requested." "success": "Image recategorization requested."
}, },
"search": "Document name...",
"suggest": { "suggest": {
"error": "Failed to save redaction suggestion: {error}", "error": "Failed to save redaction suggestion: {error}",
"success": "Redaction suggestion saved" "success": "Redaction suggestion saved"
@ -201,9 +204,7 @@
} }
}, },
"recategorize-image": "Recategorize", "recategorize-image": "Recategorize",
"reject": "Reject",
"reject-suggestion": "Reject Suggestion", "reject-suggestion": "Reject Suggestion",
"remove": "Remove",
"remove-annotation": { "remove-annotation": {
"false-positive": "False Positive", "false-positive": "False Positive",
"only-here": "Remove only here", "only-here": "Remove only here",
@ -237,15 +238,12 @@
"assign-dossier-owner": { "assign-dossier-owner": {
"dialog": { "dialog": {
"approvers": "Approvers", "approvers": "Approvers",
"cancel": "Cancel",
"make-approver": "Make Approver", "make-approver": "Make Approver",
"no-approvers": "No approvers yet.\nSelect from the list below.", "no-approvers": "No approvers yet.\nSelect from the list below.",
"no-reviewers": "No reviewers yet.\nSelect from the list below.", "no-reviewers": "No reviewers yet.\nSelect from the list below.",
"reviewers": "Reviewers", "reviewers": "Reviewers",
"save": "Save Changes",
"search": "Search...", "search": "Search...",
"single-user": "Owner", "single-user": "Owner"
"title": "Manage Dossier Team"
} }
}, },
"assign-owner": { "assign-owner": {
@ -299,7 +297,6 @@
"logout": "Logout" "logout": "Logout"
}, },
"by": "by", "by": "by",
"change-legal-basis": "Pending Change of Legal Basis",
"change-legal-basis-dialog": { "change-legal-basis-dialog": {
"actions": { "actions": {
"cancel": "Cancel", "cancel": "Cancel",
@ -313,7 +310,6 @@
}, },
"header": "Edit Redaction Reason" "header": "Edit Redaction Reason"
}, },
"comment": "Comment",
"comments": { "comments": {
"add-comment": "Enter comment", "add-comment": "Enter comment",
"comments": "{count} {count, plural, one{comment} other{comments}}", "comments": "{count} {count, plural, one{comment} other{comments}}",
@ -394,7 +390,6 @@
"updatedColor": "Updated" "updatedColor": "Updated"
} }
}, },
"delete-files-error": "Failed to delete files.",
"dev-mode": "DEV", "dev-mode": "DEV",
"dictionaries": "Dictionaries", "dictionaries": "Dictionaries",
"dictionary": "Dictionary", "dictionary": "Dictionary",
@ -552,13 +547,9 @@
"action": "Delete Dossier", "action": "Delete Dossier",
"delete-failed": "Failed to delete dossier: {dossierName}" "delete-failed": "Failed to delete dossier: {dossierName}"
}, },
"download-files": {
"action": "Download Redacted Files"
},
"edit": { "edit": {
"action": "Edit Dossier" "action": "Edit Dossier"
}, },
"header": "Dossiers",
"no-data": { "no-data": {
"action": "New Dossier", "action": "New Dossier",
"title": "You currently have no dossiers." "title": "You currently have no dossiers."
@ -591,13 +582,9 @@
"status": "Status" "status": "Status"
}, },
"table-header": { "table-header": {
"recent": "Recent", "title": "{length} active {length, plural, one{Dossier} other{Dossiers}}"
"title": "{length} active dossiers"
} }
}, },
"dossier-member-guard": {
"access-denied": "You are not allowed to access that page."
},
"dossier-overview": { "dossier-overview": {
"approve": "Approve", "approve": "Approve",
"approve-disabled": "File can only be approved once it has been analysed with the latest dictionaries and all suggestions have been processed.", "approve-disabled": "File can only be approved once it has been analysed with the latest dictionaries and all suggestions have been processed.",
@ -639,7 +626,6 @@
"file-processing": "Processing" "file-processing": "Processing"
} }
}, },
"header": "Dossier Overview",
"header-actions": { "header-actions": {
"edit": "Edit Dossier", "edit": "Edit Dossier",
"upload-document": "Upload Document" "upload-document": "Upload Document"
@ -666,13 +652,13 @@
"recent": "Recent ({hours} h)", "recent": "Recent ({hours} h)",
"unassigned": "Unassigned" "unassigned": "Unassigned"
}, },
"reanalyse": {
"action": "Analyze File"
},
"reanalyse-dossier": { "reanalyse-dossier": {
"error": "Failed to schedule files for reanalysis. Please try again.", "error": "Failed to schedule files for reanalysis. Please try again.",
"success": "Files scheduled for reanalysis." "success": "Files scheduled for reanalysis."
}, },
"reanalyse": {
"action": "Analyze File"
},
"search": "Document name...", "search": "Document name...",
"table-col-names": { "table-col-names": {
"added-on": "Added", "added-on": "Added",
@ -741,8 +727,7 @@
"date": "Date", "date": "Date",
"name": "Name", "name": "Name",
"size": "Size", "size": "Size",
"status": "Status", "status": "Status"
"type": "Type"
}, },
"table-header": { "table-header": {
"title": "{length} downloads" "title": "{length} downloads"
@ -800,12 +785,11 @@
"download-package": "Download Package", "download-package": "Download Package",
"general-info": "General Information", "general-info": "General Information",
"members": "Members", "members": "Members",
"report-attributes": "Report Attributes",
"team-members": "Team Members" "team-members": "Team Members"
}, },
"side-nav-title": "Configurations",
"unsaved-changes": "You have unsaved changes. Save or revert before changing the tab." "unsaved-changes": "You have unsaved changes. Save or revert before changing the tab."
}, },
"efsa": "EFSA Approval",
"file-attribute-types": { "file-attribute-types": {
"date": "Date", "date": "Date",
"number": "Number", "number": "Number",
@ -909,9 +893,7 @@
"exclude-pages": "Exclude pages from redaction", "exclude-pages": "Exclude pages from redaction",
"excluded-from-redaction": "excluded from redaction", "excluded-from-redaction": "excluded from redaction",
"fullscreen": "Full Screen (F)", "fullscreen": "Full Screen (F)",
"html-debug": "Open Document HTML Debug",
"last-reviewer": "Last Reviewed by:", "last-reviewer": "Last Reviewed by:",
"new-tab-ssr": "Open Document in Server Side Rendering Mode",
"no-data": { "no-data": {
"title": "There are no annotations on this page." "title": "There are no annotations on this page."
}, },
@ -919,11 +901,9 @@
"jump-first": "Jump to first page", "jump-first": "Jump to first page",
"jump-last": "Jump to last page" "jump-last": "Jump to last page"
}, },
"reanalyse-file": "File reanalysis in progress",
"reanalyse-notification": "This document was not processed with the latest rule/dictionary set. Analyze now to get updated annotations.", "reanalyse-notification": "This document was not processed with the latest rule/dictionary set. Analyze now to get updated annotations.",
"redacted": "Preview", "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", "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",
"reviewer": "Assigned to",
"standard": "Standard", "standard": "Standard",
"standard-tooltip": "Standard Workload view shows all hints, redactions, recommendations & suggestions. This view allows editing.", "standard-tooltip": "Standard Workload view shows all hints, redactions, recommendations & suggestions. This view allows editing.",
"tabs": { "tabs": {
@ -963,8 +943,7 @@
"disable": "Disable redaction", "disable": "Disable redaction",
"enable": "Enable for redaction", "enable": "Enable for redaction",
"only-managers": "Enabling / disabling is permitted only for managers" "only-managers": "Enabling / disabling is permitted only for managers"
}, }
"unassigned": "Unassigned"
}, },
"file-status": { "file-status": {
"approved": "Approved", "approved": "Approved",
@ -979,6 +958,13 @@
"under-review": "Under Review", "under-review": "Under Review",
"unprocessed": "Unprocessed" "unprocessed": "Unprocessed"
}, },
"filter-menu": {
"filter-options": "Filter options",
"filter-types": "Filter types",
"label": "Filter",
"with-comments": "Only annotations with comments",
"with-reason-changes": "Only redactions with reason changes"
},
"filter": { "filter": {
"analysis": "Analysis required", "analysis": "Analysis required",
"hint": "Hints only", "hint": "Hints only",
@ -988,30 +974,26 @@
"suggestion": "Suggested Redaction", "suggestion": "Suggested Redaction",
"updated": "Updated" "updated": "Updated"
}, },
"filter-menu": {
"filter-options": "Filter options",
"filter-types": "Filter types",
"label": "Filter",
"with-comments": "Only annotations with comments",
"with-reason-changes": "Only redactions with reason changes"
},
"filters": { "filters": {
"assigned-people": "Assignee(s)", "assigned-people": "Assignee(s)",
"dossier": "Dossier",
"dossier-templates": "Rule Sets", "dossier-templates": "Rule Sets",
"filter-by": "Filter:", "filter-by": "Filter:",
"needs-work": "Workload", "needs-work": "Workload",
"people": "Dossier Member(s)", "people": "Dossier Member(s)",
"status": "Status" "status": "Status"
}, },
"finished": "Finished",
"hint": "Hint", "hint": "Hint",
"image-category": {
"formula": "Formula",
"image": "Image",
"logo": "Logo",
"signature": "Signature"
},
"initials-avatar": { "initials-avatar": {
"unassigned": "Unassigned", "unassigned": "Unassigned",
"you": "You" "you": "You"
}, },
"license-info-screen": { "license-info-screen": {
"3rd-party-title": "Reference to 3rd Party Licenses",
"analyzed-pages": "Analyzed Pages", "analyzed-pages": "Analyzed Pages",
"backend-version": "Backend Application Version", "backend-version": "Backend Application Version",
"chart": { "chart": {
@ -1025,6 +1007,7 @@
"copyright-claim-title": "Copyright Claim", "copyright-claim-title": "Copyright Claim",
"current-analyzed": "Analyzed Pages in Current Licensing Period", "current-analyzed": "Analyzed Pages in Current Licensing Period",
"custom-app-title": "Custom Application Title", "custom-app-title": "Custom Application Title",
"email-report": "Email Report",
"email": { "email": {
"body": { "body": {
"analyzed": "Total Analyzed Pages in current license period: {pages}.", "analyzed": "Total Analyzed Pages in current license period: {pages}.",
@ -1032,7 +1015,6 @@
}, },
"title": "License Report {licenseCustomer}" "title": "License Report {licenseCustomer}"
}, },
"email-report": "Email Report",
"end-user-license-text": "The use of this product is subject to the terms of the Redaction End User Agreement, unless other specified therein.", "end-user-license-text": "The use of this product is subject to the terms of the Redaction End User Agreement, unless other specified therein.",
"end-user-license-title": "End User License Agreement", "end-user-license-title": "End User License Agreement",
"frontend-version": "Frontend Application Version", "frontend-version": "Frontend Application Version",
@ -1068,10 +1050,6 @@
"request-false-positive": "Request false positive", "request-false-positive": "Request false positive",
"request-redaction": "Request Redaction" "request-redaction": "Request Redaction"
} }
},
"undo": {
"error": "Failed to undo action.",
"success": "Action undone."
} }
}, },
"notifications": { "notifications": {
@ -1103,7 +1081,6 @@
} }
} }
}, },
"pending-analysis": "Pending Re-Analysis",
"pending-changes-guard": "WARNING: You have unsaved changes. Press Cancel to go back and save these changes, or OK to lose these changes.", "pending-changes-guard": "WARNING: You have unsaved changes. Press Cancel to go back and save these changes, or OK to lose these changes.",
"readonly": "Read only", "readonly": "Read only",
"recategorize-image-dialog": { "recategorize-image-dialog": {
@ -1116,13 +1093,7 @@
"type": "Select image type", "type": "Select image type",
"type-placeholder": "Select a type..." "type-placeholder": "Select a type..."
}, },
"header": "Edit Image Type", "header": "Edit Image Type"
"options": {
"formula": "Formula",
"image": "Image",
"logo": "Logo",
"signature": "Signature"
}
}, },
"redaction": "Redaction", "redaction": "Redaction",
"remove-annotations-dialog": { "remove-annotations-dialog": {
@ -1188,8 +1159,6 @@
"generic": "Rules updated!" "generic": "Rules updated!"
} }
}, },
"settings": "Settings",
"skipped": "Skipped",
"smtp-auth-config": { "smtp-auth-config": {
"actions": { "actions": {
"cancel": "Cancel", "cancel": "Cancel",
@ -1242,7 +1211,6 @@
}, },
"title": "Configure SMTP Account" "title": "Configure SMTP Account"
}, },
"suggestion": "Suggestion for redaction",
"time": { "time": {
"days": "{days} {days, plural, one{day} other{days}}", "days": "{days} {days, plural, one{day} other{days}}",
"hours": "{hours} {hours, plural, one{hour} other{hours}}", "hours": "{hours} {hours, plural, one{hour} other{hours}}",

File diff suppressed because it is too large Load Diff

View File

@ -21,7 +21,7 @@
"format:check": "nx format:check", "format:check": "nx format:check",
"format:write": "nx format:write", "format:write": "nx format:write",
"help": "nx help", "help": "nx help",
"i18n:extract": "ngx-translate-extract --input ./apps/red-ui/src --output apps/red-ui/src/assets/i18n/te.json --clean --sort --format namespaced-json", "i18n:extract": "ngx-translate-extract --input ./apps/red-ui/src --output apps/red-ui/src/assets/i18n/en.json --clean --sort --format namespaced-json --format-indentation ' '",
"postinstall": "ngcc --properties es2015 browser module main", "postinstall": "ngcc --properties es2015 browser module main",
"lint": "nx workspace-lint && nx lint", "lint": "nx workspace-lint && nx lint",
"lint-fix": "nx workspace-lint --fix && nx lint --fix", "lint-fix": "nx workspace-lint --fix && nx lint --fix",