diff --git a/package-lock.json b/package-lock.json index fc877b6e050741c3b470b580533d6e62e447ae03..2c2a2fe0c4cd4e8e9438df8d391a3076100ebca7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17903,4 +17903,4 @@ "integrity": "sha512-UAYfiuvxLN4oyuqhJwd21Uxb4CNawrq6fPS/05Su5L4G+1TN+HVDJMUHNMobVQDFJRir2cLAODXwluaOKB7HFg==" } } -} +} \ No newline at end of file diff --git a/src/app/components/shared/_dialogs/create-comment/create-comment.component.ts b/src/app/components/shared/_dialogs/create-comment/create-comment.component.ts index 5e14d05cb5e5dce50b04a7112bfe9e43cd2e1530..87f620569ee0cdab4e0570f2d5ee594d9f5c5d21 100644 --- a/src/app/components/shared/_dialogs/create-comment/create-comment.component.ts +++ b/src/app/components/shared/_dialogs/create-comment/create-comment.component.ts @@ -1,12 +1,13 @@ import { Component, Inject, OnInit, ViewChild } from '@angular/core'; import { Comment } from '../../../../models/comment'; import { NotificationService } from '../../../../services/util/notification.service'; -import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog'; import { TranslateService } from '@ngx-translate/core'; import { FormControl, Validators } from '@angular/forms'; import { User } from '../../../../models/user'; import { CommentListComponent } from '../../comment-list/comment-list.component'; import { EventService } from '../../../../services/util/event.service'; +import { SpacyDialogComponent } from '../spacy-dialog/spacy-dialog.component'; @Component({ selector: 'app-submit-comment', @@ -66,10 +67,26 @@ export class CreateCommentComponent implements OnInit { comment.creatorId = this.user.id; comment.createdFromLecturer = this.user.role === 1; comment.tag = this.selectedTag; - this.dialogRef.close(comment); + this.openSpacyDialog(comment); } } + openSpacyDialog(comment: Comment): void { + const dialogRef = this.dialog.open(SpacyDialogComponent, { + data: { + comment + } + }); + + dialogRef.afterClosed() + .subscribe(result => { + if (result) { + this.dialogRef.close(result); + } + }); + + } + /** * Returns a lambda which closes the dialog on call. diff --git a/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.html b/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.html new file mode 100644 index 0000000000000000000000000000000000000000..b23229d31d9fa7384a8f2e934455a09e9d2c43cb --- /dev/null +++ b/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.html @@ -0,0 +1,69 @@ +<ars-row> + <div class="anchor-wrp"> + <ars-row class="content-container"> + <ars-row class="dialog-header"> + <div class="lang-selection"> + <mat-icon>more_vert</mat-icon> + <mat-select class="select-list" [(ngModel)]="selectedLang" (selectionChange)="evalInput($event.value)"> + <mat-option *ngFor="let lang of commentLang" [value]="lang.lang"> + <span *ngIf="lang.lang == 'de'">{{ 'spacy-dialog.german' | translate}}</span> + <span *ngIf="lang.lang == 'en'">{{ 'spacy-dialog.english' | translate}}</span> + <span *ngIf="lang.lang == 'fr'">{{ 'spacy-dialog.french' | translate}}</span> + </mat-option> + </mat-select> + </div> + <span *ngIf="keywords.length > 0"> + <ars-row class="select-all-section"> + <mat-icon>playlist_add_check</mat-icon> + <mat-label class="select-all-label" for="checkAll">{{ 'spacy-dialog.select-all' | translate }}</mat-label> + <mat-checkbox class="select-all-checkbox" id="checkAll" (change)="selectAll($event.checked)"></mat-checkbox> + </ars-row> + </span> + <span *ngIf="keywords.length > 0"></span> + </ars-row> + <ars-row ars-flex-box class="list-container"> + <mat-list dense class="keywords-list"> + <mat-list-item *ngFor="let keyword of keywords; let odd = odd; let even = even" + [class.keywords-alternate]="odd" + [class.keywords-even]="even" + [ngClass]="{'keyword-selected': keyword.selected}"> + <span class="keyword-span" *ngIf="!keyword.editing">{{keyword.word}}</span> + <input class="keyword-span, isEditing" *ngIf="keyword.editing" [(ngModel)]="keyword.word"/> + <div class="keywords-actions"> + <mat-checkbox [checked]="keyword.completed" + (change)="keyword.selected = $event.checked"> + </mat-checkbox> + <button *ngIf="!keyword.editing" + (click)="onEdit(keyword)" mat-icon-button + [ngClass]="{'keywords-actions-selected': keyword.selected}"> + <mat-icon>edit</mat-icon> + </button> + <button *ngIf="keyword.editing" + (click)="onEndEditing(keyword)" mat-icon-button + class = "edit-accept"> + <mat-icon>check</mat-icon> + </button> + </div> + </mat-list-item> + </mat-list> + </ars-row> + <span *ngIf="keywords.length<=0"> + <p>{{ 'spacy-dialog.empty-nouns' | translate}}</p> + </span> + </ars-row> + </div> +</ars-row> +<ars-row ars-flex-box> + <ars-fill> + </ars-fill> + <ars-col> + <app-dialog-action-buttons + buttonsLabelSection="comment-page" + confirmButtonLabel="send" + [showDivider]="false" + [spacing]="false" + [cancelButtonClickAction]="buildCloseDialogActionCallback()" + [confirmButtonClickAction]="buildCreateCommentActionCallback()"> + </app-dialog-action-buttons> + </ars-col> +</ars-row> diff --git a/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.scss b/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..34602fb836e85b5d22ef37bea3813562827a6331 --- /dev/null +++ b/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.scss @@ -0,0 +1,71 @@ +.mat-list-base[dense] .mat-list-item, .list-item { + font-size: 14px; + height: 35px !important; +} +.keywords-list { + height: 343px; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding-top: 0 !important; +} +.keywords-even { +background-color: var(--alt-dialog); +} +.keyword-span { + color: var(--on-surface) !important; + opacity: 1 !important; +} +.keyword-selected { + background: var(--primary-variant); + border-bottom: 1px solid var(--alt-surface); +} +::ng-deep .mat-checkbox-checked .mat-checkbox-background { + background: var(--cancel) !important; +} +.mat-checkbox-frame { + color: var(--secondary); +} +:focus{ + outline: none; + outline-offset: 8px; +} +.lang-selection { + display: inline-flex; + vertical-align: middle; + width:100%; +} +.keywords-actions { + margin-left: auto; + color: var(--on-surface); +} +.keywords-actions-selected { + color: var(--on-surface); +} +.isEditing{ + background: var(--primary); + height: 22px; + border-radius: 5px; + color: var(--on-primary); + border: 1px solid var( --on-primary); +} +.edit-accept { + color: var(--on-surface); +} +.select-all-section { + display: inline-flex; + vertical-align: middle; + padding-top: 20px; + padding-bottom: 30px; + padding-left: 4px; +} +.select-all-label { + padding-left: 10px; +} +.select-all-checkbox { + margin-left: auto; + padding-right: 5px; +} +.mat-select { + padding-left: 14px; +} diff --git a/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.spec.ts b/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a7a4bfe1ec0154ec12f9514103b9bf97d977ae18 --- /dev/null +++ b/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.spec.ts @@ -0,0 +1,27 @@ +/* +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SpacyDialogComponent } from './spacy-dialog.component'; + +describe('SpacyDialogComponent', () => { + let component: SpacyDialogComponent; + let fixture: ComponentFixture<SpacyDialogComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SpacyDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SpacyDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); +*/ diff --git a/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.ts b/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..5fccb64f59bfde9c9300666b5208a32e9ab2e071 --- /dev/null +++ b/src/app/components/shared/_dialogs/spacy-dialog/spacy-dialog.component.ts @@ -0,0 +1,104 @@ +import { AfterContentInit, Component, Inject, OnInit } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { CreateCommentComponent } from '../create-comment/create-comment.component'; +import { SpacyService } from '../../../../services/http/spacy.service'; +import { LanguageService } from '../../../../services/util/language.service'; +import { Comment } from '../../../../models/comment'; + +export interface Keyword { + word: string; + completed: boolean; + editing: boolean; + selected: boolean; +} +@Component({ + selector: 'app-spacy-dialog', + templateUrl: './spacy-dialog.component.html', + styleUrls: ['./spacy-dialog.component.scss'] +}) +export class SpacyDialogComponent implements OnInit, AfterContentInit { + + commentLang = [ + { lang: 'de' }, + { lang: 'en' }, + { lang: 'fr' }, + ]; + selectedLang = localStorage.getItem('currentLang'); + comment: Comment; + keywords: Keyword[] = []; + + constructor( + protected langService: LanguageService, + private spacyService: SpacyService, + public dialogRef: MatDialogRef<CreateCommentComponent>, + @Inject(MAT_DIALOG_DATA) public data) { + } + + ngOnInit(): void { + this.comment = this.data.comment; + } + + ngAfterContentInit(): void { + this.evalInput(this.selectedLang); + } + + /** + * Returns a lambda which closes the dialog on call. + */ + buildCloseDialogActionCallback(): () => void { + return () => this.dialogRef.close(); + } + + buildCreateCommentActionCallback() { + return () => { + this.comment.keywords = this.keywords.filter(kw => kw.selected).map(kw => kw.word); + this.dialogRef.close(this.comment); + }; + } + + evalInput(model: string) { + const words: Keyword[] = []; + + // N at first pos = all Nouns(NN de/en) including singular(NN, NNP en), plural (NNPS, NNS en), proper Noun(NNE, NE de) + this.spacyService.analyse(this.comment.body, model) + .subscribe(res => { + for(const word of res.words) { + if (word.tag.charAt(0) === 'N') { + words.push({ + word: word.text, + completed: false, + editing: false, + selected: false + }); + } + } + this.keywords = words; + }, () => { + this.keywords = [] + }); + } + + onEdit(keyword){ + keyword.editing = true; + } + + onEndEditing(keyword){ + keyword.editing = false; + keyword.completed = true; + keyword.selected = true; + } + + selectAll(selected: boolean): void { + if (selected) { + this.keywords.forEach(item => { + this.onEndEditing(item); + }); + } else { + this.keywords.forEach(item => { + item.editing = false; + item.completed = false; + item.selected = false; + }); + } + } +} diff --git a/src/app/components/shared/comment-list/comment-list.component.ts b/src/app/components/shared/comment-list/comment-list.component.ts index 0ba2b4cd88d899533ba19ff0c1ea56cf380e4245..2352071fa36f64656561a52d7a4a3c415baadf1f 100644 --- a/src/app/components/shared/comment-list/comment-list.component.ts +++ b/src/app/components/shared/comment-list/comment-list.component.ts @@ -413,7 +413,9 @@ export class CommentListComponent implements OnInit, OnDestroy { this.searchComments(); } } - + closeDialog() { + this.dialog.closeAll(); + } openCreateDialog(): void { const dialogRef = this.dialog.open(CreateCommentComponent, { width: '900px', @@ -439,6 +441,7 @@ export class CommentListComponent implements OnInit, OnDestroy { }); } + send(comment: Comment): void { let message; if (this.directSend) { diff --git a/src/app/components/shared/shared-routing.module.ts b/src/app/components/shared/shared-routing.module.ts index eda595540c19843a47e701ac7bb91f19ed80a6f3..1b15001b4ed5cbe84fea53fb90a22f39e4301622 100644 --- a/src/app/components/shared/shared-routing.module.ts +++ b/src/app/components/shared/shared-routing.module.ts @@ -3,7 +3,7 @@ import { NgModule } from '@angular/core'; import { QuestionWallComponent } from './questionwall/question-wall/question-wall.component'; import { AuthenticationGuard } from '../../guards/authentication.guard'; import { UserRole } from '../../models/user-roles.enum'; -import {TagCloudComponent} from "./tag-cloud/tag-cloud.component"; +import { TagCloudComponent } from './tag-cloud/tag-cloud.component'; const routes: Routes = [ { diff --git a/src/app/components/shared/shared.module.ts b/src/app/components/shared/shared.module.ts index e25728aa9c90c325cd9b595bfb88bc5f5c2850ce..fa0ef7a83999b273dc5c8d99e1a5deca95c303c6 100644 --- a/src/app/components/shared/shared.module.ts +++ b/src/app/components/shared/shared.module.ts @@ -1,86 +1,88 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { CommentListComponent } from './comment-list/comment-list.component'; -import { FooterComponent } from './footer/footer.component'; -import { HeaderComponent } from './header/header.component'; -import { PageNotFoundComponent } from './page-not-found/page-not-found.component'; -import { RoomListComponent } from './room-list/room-list.component'; -import { RoomPageComponent } from './room-page/room-page.component'; -import { CommentPageComponent } from './comment-page/comment-page.component'; -import { EssentialsModule } from '../essentials/essentials.module'; -import { SharedRoutingModule } from './shared-routing.module'; -import { RoomJoinComponent } from './room-join/room-join.component'; -import { RoomCreateComponent } from './_dialogs/room-create/room-create.component'; -import { UserBonusTokenComponent } from '../participant/_dialogs/user-bonus-token/user-bonus-token.component'; -import { RemindOfTokensComponent } from '../participant/_dialogs/remind-of-tokens/remind-of-tokens.component'; -import { LoginComponent } from './login/login.component'; -import { CommentComponent } from './comment/comment.component'; -import { CreateCommentComponent } from './_dialogs/create-comment/create-comment.component'; -import { PresentCommentComponent } from './_dialogs/present-comment/present-comment.component'; -import { DeleteAccountComponent } from './_dialogs/delete-account/delete-account.component'; -import { DialogActionButtonsComponent } from './dialog/dialog-action-buttons/dialog-action-buttons.component'; -import { QrCodeDialogComponent } from './_dialogs/qr-code-dialog/qr-code-dialog.component'; -import { ArsModule } from '../../../../projects/ars/src/lib/ars.module'; -import { RemoveFromHistoryComponent } from './_dialogs/remove-from-history/remove-from-history.component'; -import { CommentAnswerComponent } from './comment-answer/comment-answer.component'; -import { MarkdownModule } from 'ngx-markdown'; -import { MatRippleModule } from '@angular/material/core'; -import { QRCodeModule } from 'angularx-qrcode'; -import { MotdDialogComponent } from './_dialogs/motd-dialog/motd-dialog.component'; -import { MotdMessageComponent } from './_dialogs/motd-dialog/motd-message/motd-message.component'; - -import { TagCloudModule } from 'angular-tag-cloud-module'; - -@NgModule({ - imports: [ - CommonModule, - EssentialsModule, - SharedRoutingModule, - MatRippleModule, - ArsModule, - MarkdownModule, - QRCodeModule, - TagCloudModule - ], - declarations: [ - RoomJoinComponent, - PageNotFoundComponent, - RoomPageComponent, - RoomListComponent, - HeaderComponent, - FooterComponent, - CommentPageComponent, - CommentListComponent, - RoomCreateComponent, - UserBonusTokenComponent, - RemindOfTokensComponent, - LoginComponent, - CommentComponent, - CreateCommentComponent, - PresentCommentComponent, - DeleteAccountComponent, - DialogActionButtonsComponent, - QrCodeDialogComponent, - RemoveFromHistoryComponent, - CommentAnswerComponent, - MotdDialogComponent, - MotdMessageComponent - ], - exports: [ - RoomJoinComponent, - PageNotFoundComponent, - RoomPageComponent, - RoomListComponent, - HeaderComponent, - FooterComponent, - CommentPageComponent, - CommentListComponent, - CreateCommentComponent, - PresentCommentComponent, - CommentComponent, - DialogActionButtonsComponent, - UserBonusTokenComponent - ] -}) -export class SharedModule { -} +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { CommentListComponent } from './comment-list/comment-list.component'; +import { FooterComponent } from './footer/footer.component'; +import { HeaderComponent } from './header/header.component'; +import { PageNotFoundComponent } from './page-not-found/page-not-found.component'; +import { RoomListComponent } from './room-list/room-list.component'; +import { RoomPageComponent } from './room-page/room-page.component'; +import { CommentPageComponent } from './comment-page/comment-page.component'; +import { EssentialsModule } from '../essentials/essentials.module'; +import { SharedRoutingModule } from './shared-routing.module'; +import { RoomJoinComponent } from './room-join/room-join.component'; +import { RoomCreateComponent } from './_dialogs/room-create/room-create.component'; +import { UserBonusTokenComponent } from '../participant/_dialogs/user-bonus-token/user-bonus-token.component'; +import { RemindOfTokensComponent } from '../participant/_dialogs/remind-of-tokens/remind-of-tokens.component'; +import { LoginComponent } from './login/login.component'; +import { CommentComponent } from './comment/comment.component'; +import { CreateCommentComponent } from './_dialogs/create-comment/create-comment.component'; +import { PresentCommentComponent } from './_dialogs/present-comment/present-comment.component'; +import { DeleteAccountComponent } from './_dialogs/delete-account/delete-account.component'; +import { DialogActionButtonsComponent } from './dialog/dialog-action-buttons/dialog-action-buttons.component'; +import { QrCodeDialogComponent } from './_dialogs/qr-code-dialog/qr-code-dialog.component'; +import { ArsModule } from '../../../../projects/ars/src/lib/ars.module'; +import { RemoveFromHistoryComponent } from './_dialogs/remove-from-history/remove-from-history.component'; +import { CommentAnswerComponent } from './comment-answer/comment-answer.component'; +import { MarkdownModule } from 'ngx-markdown'; +import { MatRippleModule } from '@angular/material/core'; +import { QRCodeModule } from 'angularx-qrcode'; +import { MotdDialogComponent } from './_dialogs/motd-dialog/motd-dialog.component'; +import { MotdMessageComponent } from './_dialogs/motd-dialog/motd-message/motd-message.component'; + +import { TagCloudModule } from 'angular-tag-cloud-module'; +import { SpacyDialogComponent } from './_dialogs/spacy-dialog/spacy-dialog.component'; + +@NgModule({ + imports: [ + CommonModule, + EssentialsModule, + SharedRoutingModule, + MatRippleModule, + ArsModule, + MarkdownModule, + QRCodeModule, + TagCloudModule, + ], + declarations: [ + RoomJoinComponent, + PageNotFoundComponent, + RoomPageComponent, + RoomListComponent, + HeaderComponent, + FooterComponent, + CommentPageComponent, + CommentListComponent, + RoomCreateComponent, + UserBonusTokenComponent, + RemindOfTokensComponent, + LoginComponent, + CommentComponent, + CreateCommentComponent, + PresentCommentComponent, + DeleteAccountComponent, + DialogActionButtonsComponent, + QrCodeDialogComponent, + RemoveFromHistoryComponent, + CommentAnswerComponent, + MotdDialogComponent, + MotdMessageComponent, + SpacyDialogComponent + ], + exports: [ + RoomJoinComponent, + PageNotFoundComponent, + RoomPageComponent, + RoomListComponent, + HeaderComponent, + FooterComponent, + CommentPageComponent, + CommentListComponent, + CreateCommentComponent, + PresentCommentComponent, + CommentComponent, + DialogActionButtonsComponent, + UserBonusTokenComponent + ] +}) +export class SharedModule { +} diff --git a/src/app/models/comment.ts b/src/app/models/comment.ts index 0fa257cc7c6b14d4dd5605a91a68592249d3c467..1d488d077c1638391e1b98accac44441fe1eb5c0 100644 --- a/src/app/models/comment.ts +++ b/src/app/models/comment.ts @@ -20,6 +20,7 @@ export class Comment { answer: string; userNumber: number; number: number; + keywords: string[]; constructor(roomId: string = '', creatorId: string = '', @@ -35,7 +36,8 @@ export class Comment { ack: boolean = true, tag: string = '', answer: string = '', - userNumber: number = 0) { + userNumber: number = 0, + keywords: string[] = []) { this.id = ''; this.roomId = roomId; this.creatorId = creatorId; @@ -53,5 +55,6 @@ export class Comment { this.tag = tag; this.answer = answer; this.userNumber = userNumber; + this.keywords = keywords; } } diff --git a/src/app/services/http/comment.service.ts b/src/app/services/http/comment.service.ts index cb19d5f274c60bcfaa8be2a16e5598e50c8d5e59..7e2870f1080fab331c37698c1f13600e7cd6530f 100644 --- a/src/app/services/http/comment.service.ts +++ b/src/app/services/http/comment.service.ts @@ -82,7 +82,7 @@ export class CommentService extends BaseHttpService { return this.http.post<Comment>(connectionUrl, { roomId: comment.roomId, body: comment.body, - read: comment.read, creationTimestamp: comment.timestamp, tag: comment.tag + read: comment.read, creationTimestamp: comment.timestamp, tag: comment.tag, keywords: comment.keywords }, httpOptions).pipe( tap(_ => ''), catchError(this.handleError<Comment>('addComment')) diff --git a/src/app/services/http/spacy.service.ts b/src/app/services/http/spacy.service.ts index b7d61bfdf4e456091a4887b6f411b18eca0aa186..11625da1fe470bbe316e3a1f5498facf1f1cac10 100644 --- a/src/app/services/http/spacy.service.ts +++ b/src/app/services/http/spacy.service.ts @@ -1,8 +1,8 @@ -import {Injectable} from '@angular/core'; -import {HttpClient, HttpHeaders} from '@angular/common/http'; -import {Observable} from 'rxjs'; -import {BaseHttpService} from './base-http.service'; -import {catchError} from 'rxjs/operators'; +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { BaseHttpService } from './base-http.service'; +import { catchError } from 'rxjs/operators'; export class Result { arcs: Arc[]; diff --git a/src/assets/i18n/creator/de.json b/src/assets/i18n/creator/de.json index 3b293d5425b1a8a1643295278635303b458900fb..cf549824c57b978d780bf3121fb6970e1b41e713 100644 --- a/src/assets/i18n/creator/de.json +++ b/src/assets/i18n/creator/de.json @@ -81,6 +81,13 @@ "no-comments": "Es sind noch keine Fragen vorhanden.", "export-comments": "Fragen speichern" }, + "spacy-dialog":{ + "german": "Deutsch", + "english": "Englisch", + "french": "Französisch", + "empty-nouns": "Keine Nomen enthalten", + "select-all": "Alles auswählen" + }, "comment-page": { "a11y-comment_delete": "Löscht diese Frage", "a11y-comment_grade": "Markiert diese Frage als Bonus-Frage", diff --git a/src/assets/i18n/creator/en.json b/src/assets/i18n/creator/en.json index b038a98933609a23bade67de7c2a5fe11a7c3173..a484ae037827db0557da368589b936d42746de7f 100644 --- a/src/assets/i18n/creator/en.json +++ b/src/assets/i18n/creator/en.json @@ -82,6 +82,13 @@ "no-comments": "There are no questions yet.", "export-comments": "Save questions" }, + "spacy-dialog": { + "german": "German", + "english": "English", + "french": "French", + "empty-nouns": "No nouns included", + "select-all": "Select all" + }, "comment-page": { "a11y-comment_delete": "Deletes this question", "a11y-comment_grade": "Marks this question as a bonus question", diff --git a/src/assets/i18n/participant/de.json b/src/assets/i18n/participant/de.json index fdf17ae8273a4d8c0c9dc59e7f8277daa9cf629e..9eae371dc90f8fac37c490bd7bc329747d429431 100644 --- a/src/assets/i18n/participant/de.json +++ b/src/assets/i18n/participant/de.json @@ -86,6 +86,13 @@ "cancel": "Abbrechen", "delete": "Löschen" }, + "spacy-dialog":{ + "german": "Deutsch", + "english": "Englisch", + "french": "Französisch", + "empty-nouns": "Keine Nomen enthalten", + "select-all": "Alles auswählen" + }, "comment-page": { "a11y-comment_input": "Gib deine Frage ein", "a11y-comment_vote_down": "Diese Frage abwerten", diff --git a/src/assets/i18n/participant/en.json b/src/assets/i18n/participant/en.json index 0ebe2a41f640fe5e63fa4f7b7bd9601e95488217..6ffee635591b91f607c2ed456f672456bf5b9564 100644 --- a/src/assets/i18n/participant/en.json +++ b/src/assets/i18n/participant/en.json @@ -96,6 +96,13 @@ "cancel": "Cancel", "delete": "Delete" }, + "spacy-dialog": { + "german": "German", + "english": "English", + "french": "French", + "empty-nouns": "No nouns included", + "select-all": "Select all" + }, "comment-page": { "a11y-comment_input": "Enter your question", "a11y-comment_vote_down": "Votes down this question",