From d5ea4413b9e01c38010cc22e967229a4c0cd3a0b Mon Sep 17 00:00:00 2001 From: DavidMockler Date: Thu, 25 Jul 2024 17:32:38 +0100 Subject: [PATCH] Restructured the Story creation page to make it less temporary Also add a tab for the digital reader story library --- .../basic-dialog/basic-dialog.component.html | 5 +- .../dr-story-creation-dialog.component.html | 25 +++ .../dr-story-creation-dialog.component.scss | 73 +++++++ .../dr-story-creation-dialog.component.ts | 61 ++++++ .../dr-story-creation-dialog.spec.ts | 31 +++ .../digital-reader-library.component.html | 22 ++ .../digital-reader-library.component.scss | 191 ++++++++++++++++++ .../digital-reader-library.component.spec.ts | 29 +++ .../digital-reader-library.component.ts | 44 ++++ .../digital-reader.component.html | 37 +++- .../digital-reader.component.scss | 5 +- .../digital-reader.component.ts | 58 ++++-- .../src/app/nav-bar/nav-bar-routing.module.ts | 2 + .../nav-bar/nav-bar/nav-bar.component.html | 1 + ngapp/src/app/translation.ts | 16 +- 15 files changed, 573 insertions(+), 27 deletions(-) create mode 100644 ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.html create mode 100644 ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.scss create mode 100644 ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.ts create mode 100644 ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.spec.ts create mode 100644 ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.html create mode 100644 ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.scss create mode 100644 ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.spec.ts create mode 100644 ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.ts diff --git a/ngapp/src/app/dialogs/basic-dialog/basic-dialog.component.html b/ngapp/src/app/dialogs/basic-dialog/basic-dialog.component.html index 571805cf2..574f0a892 100644 --- a/ngapp/src/app/dialogs/basic-dialog/basic-dialog.component.html +++ b/ngapp/src/app/dialogs/basic-dialog/basic-dialog.component.html @@ -53,7 +53,10 @@

{{ data.title }}

{{ data.data[2][1] }}:
{{ opt.dialect }}
-
+
+ {{ data.data[2][2] }}: + + diff --git a/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.html b/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.html new file mode 100644 index 000000000..d168745ba --- /dev/null +++ b/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.html @@ -0,0 +1,25 @@ +
+
+

{{ data.title }}

+
+ +
+ + +
+ {{ data.data[2][0] }}: +

+ {{ data.data[2][1] }}: +
+
{{ dialect }}
+

+ {{ data.data[2][2] }}: + +
+ +
+ + +
+ +
diff --git a/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.scss b/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.scss new file mode 100644 index 000000000..4421d0476 --- /dev/null +++ b/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.scss @@ -0,0 +1,73 @@ +.dialogContainer { + padding:10px; +} + +h2 { + // overflow-wrap: break-word; + // max-width: 100%; + // padding-top: 20px; +} + +.header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.confirmBtnGreen { + background-color: var(--scealai-green); + color: white; +} + +.confirmBtnGreen:hover { + background-color: var(--scealai-dark-green); +} + +.codeView { + background-color: var(--scealai-gray); + border: 1px solid var(--scealai-light-gray); + border-radius: 4px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + margin-top: 16px; +} + +.copyBtn:hover { + cursor: pointer; +} + +.titleInput { + margin-top: 10px; + padding-left: 4px; + width: 80%; +} + +/*.dialectChoice { + margin: auto; + width: inherit; + text-align: center; +}*/ + +.dialectContainer { + display:flex; + flex-direction: column; + align-items: flex-start; + margin-right:auto; + margin-left: 0; + width:inherit; + gap: 1rem; +} + +/*.viewStory { + padding-right: 10px; +}*/ + +.viewStoryBtn { + padding: 7px; + background-color: var(--scealai-green); + color: white; + border-radius: 4px; + text-decoration:none; + text-align: center; +} \ No newline at end of file diff --git a/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.ts b/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.ts new file mode 100644 index 000000000..31c1480a4 --- /dev/null +++ b/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component.ts @@ -0,0 +1,61 @@ +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { TranslationService } from 'app/core/services/translation.service'; +import { AuthenticationService } from 'app/core/services/authentication.service'; +import { MatDialogRef } from '@angular/material/dialog'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { PdfViewerModule } from 'ng2-pdf-viewer'; + +import { MatCheckboxModule } from '@angular/material/checkbox'; + +export interface DialogData { + title: string; + message: string; + data: any; + type: string; + confirmText: string; + cancelText: string; +} + +@Component({ + standalone: true, + imports: [CommonModule, FormsModule, ClipboardModule, MatDialogModule, PdfViewerModule, MatCheckboxModule], + selector: 'app-basic-dialog', + templateUrl: './dr-story-creation-dialog.component.html', + styleUrls: ['./dr-story-creation-dialog.component.scss'] +}) +export class DigitalReaderStoryCreationDialogComponent { + public dialectMapping: Object; + public inputs: Object; + //public dialects: [] = []; + pdfSrc = "https://vadimdez.github.io/ng2-pdf-viewer/assets/pdf-test.pdf"; + copyIconClicked: boolean = false; + + constructor(@Inject(MAT_DIALOG_DATA) + public data: DialogData, + public ts: TranslationService, + public auth: AuthenticationService, + ) { + this.dialectMapping = { + Connacht: 'connemara', + Connachta: 'connemara', + Munster: 'kerry', + Mumha: 'kerry', + Ulster: 'donegal', + Ulaidh: 'donegal', + } + + this.inputs = { + title: '', + dialects: { + connemara: false, + kerry: false, + donegal: false + }, + public: false + } + } +} + diff --git a/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.spec.ts b/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.spec.ts new file mode 100644 index 000000000..0890c8598 --- /dev/null +++ b/ngapp/src/app/dialogs/dr-story-creation-dialog/dr-story-creation-dialog.spec.ts @@ -0,0 +1,31 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { DigitalReaderStoryCreationDialogComponent } from './dr-story-creation-dialog.component'; +import { MatDialog, MAT_DIALOG_DATA} from '@angular/material/dialog'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; + +describe('BasicDialogComponent', () => { + let component: DigitalReaderStoryCreationDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ DigitalReaderStoryCreationDialogComponent ], + imports: [HttpClientTestingModule], + providers: [ + { provide: MatDialog, useValue: {} }, + { provide: MAT_DIALOG_DATA, useValue: {} } + ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(DigitalReaderStoryCreationDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.html b/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.html new file mode 100644 index 000000000..c3ef83991 --- /dev/null +++ b/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.html @@ -0,0 +1,22 @@ +
+
+ Newly created tab! +
+ +
+ +
+
+ + +
+
+ +
+
+
+
\ No newline at end of file diff --git a/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.scss b/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.scss new file mode 100644 index 000000000..24863d862 --- /dev/null +++ b/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.scss @@ -0,0 +1,191 @@ +.container { + padding-bottom: 20px; + width: 100%; +} + +.headerTitle { + text-align: center; +} + +.dialectTitle { + font-size: 15pt; + font-weight: bold; + padding-bottom: 10px; + padding-top: 30px; +} + +.storyImg { + width: 300px; + height: 200px; + padding: 5px; +} + +.panelDescription { + font-size : 15pt; + font-weight: bold; + justify-content: center; +} + +.panelFlex { + display:flex; + flex-direction: column; +} + +.panelDescriptionNoPhoto { + font-size : 15pt; + font-weight: bold; +} + +.moreResources { + place-content: space-between; +} + +.dialectChoice { + margin: auto; + width: inherit; + text-align: center; +} + +.dialectContainer { + display:flex; + flex-direction: column; + align-items: flex-start; + margin-right:auto; + margin-left: 0; + width:inherit; + gap: 1rem; +} + +.storyCreationActionRow { + flex-direction: column; +} + +.viewStory { + padding-right: 10px; +} + +.viewStoryBtn { + padding: 7px; + background-color: var(--scealai-green); + color: white; + border-radius: 4px; + text-decoration:none; + text-align: center; +} + +button { + border: none +} + +button:disabled { + opacity: .5; +} + +input:disabled + label { + opacity: .5; +} + +.viewStoryBtn:hover { + cursor: pointer; +} + +.signIn { + font-weight: bold; + font-style: italic; + font-size: 16pt; + padding-top:40px; + text-align: center; +} + +/* The container
- needed to position the dropdown content */ + +.dropdown { + position: relative; + display: inline-block; + margin-top:-5px; +} + +/* Dropdown Content (Hidden by Default) */ +.dropdown-content { + display: none; + position: relative; + background-color: #f9f9f9; + /*min-width: 160px;*/ + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + /*z-index: 1;*/ +} + +/* Links inside the dropdown */ +.dropdown-content a { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; +} +/* Change color of dropdown links on hover */ +.dropdown-content a:hover {background-color: #f1f1f1} + +/* Show the dropdown menu on hover */ +.dropdown:hover .dropdown-content { + display: block; +} + +/* Change the background color of the dropdown button when the dropdown content is shown */ +.dropdown:hover .dropbtn { + background-color: #3e8e41; +} + +input[type="file"] { + display: none; +} + +/*.file-upload { + border: 1px solid #ccc; + display: inline-block; + padding: 6px 12px; + +}*/ + +.footerLARA { + display: flex; + flex-direction: column; + bottom: 0; + width: 100%; + align-items: center; + background: #F5EEDE; +} + +.footerLogos { + display: flex; + flex-wrap: wrap; +} + +.copyright { + padding-top:10px; + padding-right:5px; + height: 15px; + opacity: 0.5; +} + +.logoPadding { + padding-left:50px; + padding-right:50px; + padding-top:5px; + padding-bottom:5px; +} + +.logoImg { + height: 40px; +} + +@media only screen and (max-width: 700px) { + .container { + width: 95%; + } + .content { + font-size: 10pt; + } + .header { + font-size: 15pt; + } +} \ No newline at end of file diff --git a/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.spec.ts b/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.spec.ts new file mode 100644 index 000000000..a3a591c10 --- /dev/null +++ b/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.spec.ts @@ -0,0 +1,29 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DigitalReaderLibraryComponent } from './digital-reader-library.component'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { RouterTestingModule } from '@angular/router/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; + +describe('DigitalReaderLibraryComponent', () => { + let component: DigitalReaderLibraryComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [ NO_ERRORS_SCHEMA ], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [ DigitalReaderLibraryComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DigitalReaderLibraryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.ts b/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.ts new file mode 100644 index 000000000..2e4c12c56 --- /dev/null +++ b/ngapp/src/app/nav-bar/digital-reader-library/digital-reader-library.component.ts @@ -0,0 +1,44 @@ +import { Component, OnInit, Output, EventEmitter } from '@angular/core'; +import { TranslationService } from 'app/core/services/translation.service'; +import { AuthenticationService } from 'app/core/services/authentication.service'; + +import { firstValueFrom } from "rxjs"; +import { User } from "app/core/models/user"; +import { UserService } from "app/core/services/user.service"; +//import { createClient } from "@supabase/supabase-js" +//import { Story } from "app/core/models/story"; +import { DigitalReaderStory } from "app/core/models/drStory"; + +import { HttpClient } from "@angular/common/http"; +//import { GrammarEngine } from 'lib/grammar-engine/grammar-engine'; +//import { anGramadoir } from "lib/grammar-engine/checkers/an-gramadoir"; +//import { CHECKBOXES, ERROR_TYPES, ErrorTag, GrammarChecker } from "lib/grammar-engine/types"; +import { DigitalReaderStoryService } from "app/core/services/dr-story.service" + +import { MatDialog, MatDialogRef } from "@angular/material/dialog"; + +import { objectUtil } from 'zod'; + +@Component({ + selector: 'app-digital-reader-library', + templateUrl: './digital-reader-library.component.html', + styleUrls: ['./digital-reader-library.component.scss'] +}) +export class DigitalReaderLibraryComponent implements OnInit { + + @Output() isFirstDrStory = new EventEmitter(); + + constructor( + public ts : TranslationService, + public auth: AuthenticationService, + public userService: UserService, + public drStoryService: DigitalReaderStoryService, + public http: HttpClient, + private dialog: MatDialog) {} + + async ngOnInit() { + + + } + +} diff --git a/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.html b/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.html index 64a1ddea2..29852f703 100644 --- a/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.html +++ b/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.html @@ -20,28 +20,47 @@ -
-
+
+
+ -
-
-
+ +
File uploaded :
{{ this.docxFile.name }}
-
+
-
-
+
+
+ + +
+
+ {{ ts.l.uploaded }}

+
+ View story in story viewer [Unimplemented] +

+
+ Go to story library [Unimplemented] +

+
+
+ {{ ts.l.processing }} + +
+
diff --git a/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.scss b/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.scss index 82079854c..24863d862 100644 --- a/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.scss +++ b/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.scss @@ -73,7 +73,6 @@ text-align: center; } - button { border: none } @@ -82,6 +81,10 @@ button:disabled { opacity: .5; } +input:disabled + label { + opacity: .5; +} + .viewStoryBtn:hover { cursor: pointer; } diff --git a/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.ts b/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.ts index cd993cc7e..d5a3e5e30 100644 --- a/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.ts +++ b/ngapp/src/app/nav-bar/digital-reader/digital-reader.component.ts @@ -16,9 +16,11 @@ import { HttpClient } from "@angular/common/http"; import { DigitalReaderStoryService } from "app/core/services/dr-story.service" import { MatDialog, MatDialogRef } from "@angular/material/dialog"; -import { BasicDialogComponent } from "../../dialogs/basic-dialog/basic-dialog.component"; +//import { BasicDialogComponent } from "../../dialogs/basic-dialog/basic-dialog.component"; +import { DigitalReaderStoryCreationDialogComponent } from "../../dialogs/dr-story-creation-dialog/dr-story-creation-dialog.component"; import { constructJSON } from '@phonlab-tcd/html2json'; +import { objectUtil } from 'zod'; @Component({ selector: 'app-digital-reader', @@ -32,8 +34,12 @@ export class DigitalReaderComponent implements OnInit { tableData: Array; docxFile: File | null = null; convertedHTMLDoc: Document | null = null; - drStory: DigitalReaderStory; + //drStory: DigitalReaderStory; dialogRef: MatDialogRef; + + dialectOptions:Array + storyState:string = ''; + @Output() isFirstDrStory = new EventEmitter(); constructor( @@ -43,7 +49,7 @@ export class DigitalReaderComponent implements OnInit { public drStoryService: DigitalReaderStoryService, public http: HttpClient, private dialog: MatDialog) { - + this.dialectOptions = [this.ts.l.connacht, this.ts.l.munster, this.ts.l.ulster] } async ngOnInit() { @@ -75,17 +81,18 @@ export class DigitalReaderComponent implements OnInit { } async createNewStory() { + this.storyState = '' console.log('creating dr-story...') this.isFirstDrStory.emit(this.drStories.length == 0); - this.dialogRef = this.dialog.open(BasicDialogComponent, { + this.dialogRef = this.dialog.open(DigitalReaderStoryCreationDialogComponent, { data: { title: this.ts.l.story_details, type: "create-dr-story", data: [ this.ts.l.enter_title, - [{dialect: this.ts.l.connacht, ind: 1}, {dialect: this.ts.l.munster, ind: 2}, {dialect: this.ts.l.ulster, ind: 3}], - [this.ts.l.title, this.ts.l.dialects], + this.dialectOptions, + [this.ts.l.title, this.ts.l.dialects, this.ts.l.make_public], ], confirmText: this.ts.l.save_details, cancelText: this.ts.l.cancel, @@ -93,25 +100,44 @@ export class DigitalReaderComponent implements OnInit { width: "50vh", }); + console.log(this.dialogRef) + this.dialogRef.afterClosed().subscribe(async (res: any) => { this.dialogRef = undefined; console.log(res) if (res) { - if (res[0]) { + if (res.title) { console.log(res) - if (res.length>1) { + + let dialects:Array = []; + console.log(res.dialects) + for (const key in res.dialects) { + console.log(key) + console.log(res.dialects[key]) + if (res.dialects[key] === true) + + dialects.push(key) + } + + console.log(Array.isArray(dialects) && dialects.length!==0) + console.log(dialects) + console.log(Array.isArray(dialects)) + console.log(dialects.length) + if (Array.isArray(dialects) && dialects.length!==0) { + + this.storyState = 'processing' + console.log(this.storyState=='processing') + console.log(this.storyState==='processing') + await this.convertDocxToHTML() - let dialect = ["connemara"]; - if (!res[1]) dialect = [] - if (res[2]) dialect.push("kerry"); - if (res[3]) dialect.push("donegal"); const user = this.auth.getUserDetails(); console.log(user) if (!user) { console.log("Can't save story, current user is null"); + this.storyState = '' return; } @@ -120,22 +146,26 @@ export class DigitalReaderComponent implements OnInit { console.log(story) - this.drStoryService // maybe import RecursiveHtmlElem (?) - .saveDRStory(res[0], dialect, story, true) // [dialect] only for testing - single dialect for now + this.drStoryService + .saveDRStory(res.title, dialects, story, res.public) .subscribe({ next: () => { console.log('a response was received') + this.storyState = 'processed' }, error: () => { alert("Not able to create a new story"); + this.storyState = '' }, }); } } else { alert(this.ts.l.dialect_required) + this.storyState = '' } } else { alert(this.ts.l.title_required); + this.storyState = '' } } }); diff --git a/ngapp/src/app/nav-bar/nav-bar-routing.module.ts b/ngapp/src/app/nav-bar/nav-bar-routing.module.ts index e2789fa5a..687100506 100644 --- a/ngapp/src/app/nav-bar/nav-bar-routing.module.ts +++ b/ngapp/src/app/nav-bar/nav-bar-routing.module.ts @@ -10,6 +10,7 @@ import { TeamComponent } from './team/team.component'; import { ReportAnIssueComponent } from './report-an-issue/report-an-issue.component'; import { ResourcesComponent } from './resources/resources.component'; import { DigitalReaderComponent } from './digital-reader/digital-reader.component'; +import { DigitalReaderLibraryComponent } from './digital-reader-library/digital-reader-library.component'; import { AboutTaidhginComponent } from './about-taidhgin/about-taidhgin.component'; import { FiosComponent } from './fios/fios.component'; import { RoleGuardService } from 'app/core/services/role-guard.service'; @@ -32,6 +33,7 @@ const routes: Routes = [ canActivate: [RoleGuardService], component: DigitalReaderComponent }, + { path: 'dr-library', component: DigitalReaderLibraryComponent }, ]; @NgModule({ diff --git a/ngapp/src/app/nav-bar/nav-bar/nav-bar.component.html b/ngapp/src/app/nav-bar/nav-bar/nav-bar.component.html index 581704c3c..19b8bab84 100644 --- a/ngapp/src/app/nav-bar/nav-bar/nav-bar.component.html +++ b/ngapp/src/app/nav-bar/nav-bar/nav-bar.component.html @@ -48,6 +48,7 @@ {{ ts.l.dr_story_create }} + {{ ts.l.digital_reader_library }} diff --git a/ngapp/src/app/translation.ts b/ngapp/src/app/translation.ts index e394bf120..cb9250825 100644 --- a/ngapp/src/app/translation.ts +++ b/ngapp/src/app/translation.ts @@ -102,8 +102,8 @@ const translations = { ga: 'Scéalta', en: 'Irish Stories' }, dr_story_create: { - ga: 'Cruthaigh scéal léitheora digitigh', - en: 'Create a digital reader story' }, + ga: 'Cruthaigh Scéal don Léitheoir Digiteach', + en: 'Create a digital Reader Story' }, digital_reader: { ga: 'Léitheoir Scéalta Digiteacha', en: 'Digital Story Reader' }, @@ -209,6 +209,15 @@ const translations = { create: { ga: 'Cruthaigh', en: 'Create' }, + make_public: { + ga: 'Foilsigh an scéal i leabharlann scéalta poiblí An Scéalaí ?', + en: 'Publish this story in the public An Scéalaí story library ?' }, + uploaded: { + ga: 'Uaslódálaithe', + en: 'Uploaded' }, + processing: { + ga: 'Á phróiseáil', + en: 'Processing' }, contents: { ga: 'Clár Scéalta', en: 'Contents' }, @@ -1578,6 +1587,9 @@ const translations = { story_bank_growing: { ga: 'Tá an banc scéalta ag fás. Cruthaigh cuntas le An Scéalaí le teacht ar tuilleadh scéalta', en: 'The story bank is growing. Create an account with An Scéalaí to find out more stories' }, + digital_reader_library: { + ga: 'Leabharlann an Léitheora Digitigh', + en: 'Digital Reader Story Library' }, higher_level: { ga: 'Ardleibhéal', en: 'Higher Level' },